Hejter
xor ebx, ebx
- Сообщения
- 1,759
- Реакции
- 393
Hejter, тебе в начале каждого раунда нужно опять идти по кв (или при подсчете ящиков запиливать их в массив и потом брать из него) и в начале каждого раунде выставлять ящики.
Он спавнит. Просто посмотри куда ты его спавнишь
TeleportEntity(ent, g_MoneyPoint, NULL_VECTOR, NULL_VECTOR);
а g_MoneyPoint создается {0.0, 0.0, 0.0} и туда телепортится ящик.
Передавай координаты в func_box()
Точно, только что заметил.
Добавлено через 1 минуту
Проверю.Так ты ничего и не спавнишь, в принципе.При старте раунда аналогично, но циклом по ключам файла, вроде такого:PHP:public Action:cmd_Crate(client, argc) { if (!client || !IsClientInGame(client)) { ReplyToCommand(client, "ERROR: You can't use that command while not in game!"); return Plugin_Handled; } KvRewind(h_kv_cfg); if(KvJumpToKey(h_kv_cfg, g_cMap, true)) { decl String:sBuffer[32]; GetPlayerEye(client, g_MoneyPoint); g_MoneyPoint[2] += 30.0; ++g_iNum; FormatEx(sBuffer, sizeof(sBuffer), "crate %i", g_iNum); KvSetVector(h_kv_cfg, sBuffer, g_MoneyPoint); // Заносим позицию ящика в файл. KvRewind(h_kv_cfg); // Восстановить позицию. KeyValuesToFile(h_kv_cfg, g_cfg_file); // Сохраняем файл func_box(); PrintToChat(client, "Ящик установлен: %.2f:%.2f:%.2f", g_MoneyPoint[0], g_MoneyPoint[1], g_MoneyPoint[2]); } else { PrintToChat(client, "Произошла ошибка. Ящик не установлена"); }
PHP:public RoundStart(Handle:event, const String:name[], bool:dontBroadcast) { KvRewind(h_kv_cfg); if(KvJumpToKey(h_kv_cfg, g_cMap)) { decl String:sBuffer[32]; new i; while(KvGotoNextKey(h_kv_cfg)) { FormatEx(sBuffer, sizeof(sBuffer), "crate %i", ++i); KvGetVector(h_kv_cfg, sBuffer, g_MoneyPoint); if(IsVectorEmpty(g_MoneyPoint)) { return; } func_box(); } } }
Добавлено через 2 часа 13 минут
Шаманил, шаманил, не получается респавнить ящики каждый раунд из файла, но координаты записываются в файл..
PHP:
#pragma semicolon 1
#include <sdktools>
new String:g_cfg_file[PLATFORM_MAX_PATH];
new g_iNum;
new String:g_cMap[256];
new Handle:h_kv_cfg;
new Float:g_MoneyPoint[3];
public OnPluginStart()
{
HookEvent("round_start", RoundStart);
RegAdminCmd("sm_box_reload", cmd_Reload, ADMFLAG_ROOT, "Reload cfgs");
RegAdminCmd("sm_box", cmd_Crate, ADMFLAG_ROOT, "Set crate position");
BuildPath(Path_SM, g_cfg_file, sizeof(g_cfg_file), "configs/crates/crates.txt");
}
public OnMapStart()
{
LoadCfg();
PrecacheModel("models/props/cs_militia/footlocker01_closed.mdl", true);
}
LoadCfg()
{
g_iNum = 0;
GetCurrentMap(g_cMap, sizeof(g_cMap));
if (h_kv_cfg == INVALID_HANDLE)
{
h_kv_cfg = CreateKeyValues("Crates");
if (!FileToKeyValues(h_kv_cfg, g_cfg_file))
{
CloseHandle(h_kv_cfg);
h_kv_cfg = INVALID_HANDLE;
ThrowError("Could not parse %s", g_cfg_file);
}
}
KvRewind(h_kv_cfg);
if(KvJumpToKey(h_kv_cfg, g_cMap))
{
decl String:sBuffer[32];
while(KvGotoNextKey(h_kv_cfg))
{
FormatEx(sBuffer, sizeof(sBuffer), "crate %i", g_iNum+1);
KvGetVector(h_kv_cfg, sBuffer, g_MoneyPoint);
if(IsVectorEmpty(g_MoneyPoint))
{
break;
}
++g_iNum;
}
}
}
bool:IsVectorEmpty(const Float:fPos[3])
{
for (new i = 0; i < 3; ++i)
{
if(fPos[i])
{
return false;
}
}
return true;
}
public Action:cmd_Crate(client, argc)
{
if (!client || !IsClientInGame(client))
{
ReplyToCommand(client, "ERROR: You can't use that command while not in game!");
return Plugin_Handled;
}
KvRewind(h_kv_cfg);
if(KvJumpToKey(h_kv_cfg, g_cMap, true))
{
decl String:sBuffer[32];
GetPlayerEye(client, g_MoneyPoint);
g_MoneyPoint[2] += 30.0;
++g_iNum;
FormatEx(sBuffer, sizeof(sBuffer), "crate %i", g_iNum);
KvSetVector(h_kv_cfg, sBuffer, g_MoneyPoint); // Заносим позицию ящика в файл.
KvRewind(h_kv_cfg); // Восстановить позицию.
KeyValuesToFile(h_kv_cfg, g_cfg_file); // Сохраняем файл
func_box();
PrintToChat(client, "Ящик установлен: %.2f:%.2f:%.2f", g_MoneyPoint[0], g_MoneyPoint[1], g_MoneyPoint[2]);
}
else
{
PrintToChat(client, "Произошла ошибка. Ящик не установлена");
}
return Plugin_Handled;
}
stock bool:GetPlayerEye(client, Float:fPos[3])
{
decl Float:vAngles[3], Float:vOrigin[3];
GetClientEyePosition(client, vOrigin);
GetClientEyeAngles(client, vAngles);
new Handle:trace = TR_TraceRayFilterEx(vOrigin, vAngles, MASK_SOLID, RayType_Infinite, TraceEntityFilterPlayers);
if (TR_DidHit(trace))
{
TR_GetEndPosition(fPos, trace);
CloseHandle(trace);
return true;
}
CloseHandle(trace);
return false;
}
public RoundStart(Handle:event, const String:name[], bool:dontBroadcast)
{
GetCurrentMap(g_cMap, sizeof(g_cMap));
KvRewind(h_kv_cfg);
if(KvJumpToKey(h_kv_cfg, g_cMap))
{
decl String:sBuffer[32];
new i;
while(KvGotoNextKey(h_kv_cfg))
{
FormatEx(sBuffer, sizeof(sBuffer), "crate %i", ++i);
KvGetVector(h_kv_cfg, sBuffer, g_MoneyPoint);
if(IsVectorEmpty(g_MoneyPoint))
{
return;
}
func_box();
}
}
}
public bool:TraceEntityFilterPlayers(entity, contentsMask)
{
return (!(0 < entity <= MaxClients));
}
public Action:cmd_Reload(client, argc)
{
if (h_kv_cfg != INVALID_HANDLE)
{
CloseHandle(h_kv_cfg);
h_kv_cfg = INVALID_HANDLE;
}
LoadCfg();
ReplyToCommand(client, "Настройки перезагружены!");
}
func_box()
{
new ent = CreateEntityByName("prop_physics_override");
decl String:targetname[64];
FormatEx(targetname, sizeof(targetname), "crate_%i", ent);
DispatchKeyValue(ent, "model", "models/props/cs_militia/footlocker01_closed.mdl");
DispatchKeyValue(ent, "physicsmode", "2");
DispatchKeyValue(ent, "massScale", "1.0");
DispatchKeyValue(ent, "targetname", targetname);
DispatchKeyValue(ent, "spawnflags", "0");
DispatchSpawn(ent);
SetEntProp(ent, Prop_Send, "m_usSolidFlags", 152);
SetEntProp(ent, Prop_Send, "m_CollisionGroup", 8);
TeleportEntity(ent, g_MoneyPoint, NULL_VECTOR, NULL_VECTOR);
}
Последнее редактирование: