Keyvalues

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);		
}
 
Последнее редактирование:

Exle

Участник
Сообщения
190
Реакции
216
Должно работать
C-подобный:
#pragma semicolon 1
#include <sdktools>

new String:g_cfg_file[PLATFORM_MAX_PATH];
new Handle:g_boxArr;
new num;

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");

    g_boxArr = CreateArray(3);

    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()
{
    ClearArray(g_boxArr);
    num = 0;
    new Handle:h_kv_cfg = CreateKeyValues("Crates");
    decl String:map[64];
    GetCurrentMap(map, sizeof(map));
    if (FileToKeyValues(h_kv_cfg, g_cfg_file) && KvJumpToKey(h_kv_cfg, map) && KvGotoFirstSubKey(h_kv_cfg, false))
    {
        decl String:name[15], Float:fPos[3];
        do
        {
            if (KvGetSectionName(h_kv_cfg, name, sizeof(name)) && StrContains(name, "crate") != -1)
            {
                KvGetVector(h_kv_cfg, "", fPos);
                PushArrayArray(g_boxArr, fPos, 3);
                num++;
            }
        }
        while (KvGotoNextKey(h_kv_cfg, false));
    }
    else
    {
        CloseHandle(h_kv_cfg);
        ThrowError("Could not parse %s", g_cfg_file);
    }
    CloseHandle(h_kv_cfg);
}

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;
    }

    new Handle:h_kv_cfg = CreateKeyValues("Crates");

    FileToKeyValues(h_kv_cfg, g_cfg_file);
   
    decl String:g_cMap[256];
    GetCurrentMap(g_cMap, sizeof(g_cMap));
    if (KvJumpToKey(h_kv_cfg, g_cMap, true))
    {
        decl Float:fPos[3], String:sBuffer[32];
        GetPlayerEye(client, fPos);
        fPos[2] += 30.0;
        FormatEx(sBuffer, sizeof(sBuffer), "crate %i", ++num);
        KvSetVector(h_kv_cfg, sBuffer, fPos);// Заносим позицию ящика в файл.
        KvRewind(h_kv_cfg);// Восстановить позицию. 
        KeyValuesToFile(h_kv_cfg, g_cfg_file);// Сохраняем файл
        PrintToChat(client, "Ящик установлен: %.2f:%.2f:%.2f", fPos[0], fPos[1], fPos[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)
{
    func_box();
}

public bool:TraceEntityFilterPlayers(entity, contentsMask)
{
    return (!(0 < entity <= MaxClients));
}

public Action:cmd_Reload(client, argc)
{
    LoadCfg();
    ReplyToCommand(client, "Настройки перезагружены!");
    return Plugin_Handled;
}

func_box()
{
    for (new i = 0; i < GetArraySize(g_boxArr); i++)
    {
        new ent;
        if ((ent = CreateEntityByName("prop_physics_override")) != -1)
        {
            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);

            decl Float:vec[3];
            GetArrayArray(g_boxArr, i, vec, 3);
            TeleportEntity(ent, vec, NULL_VECTOR, NULL_VECTOR);
        }
    }
}
 
Последнее редактирование:

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Должно работать
C-подобный:
#pragma semicolon 1
#include <sdktools> 

new String:g_cfg_file[PLATFORM_MAX_PATH];
new Handle:g_boxArr;
new num;

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");

	g_boxArr = CreateArray(ByteCountToCells(10));

	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()
{
	ClearArray(g_boxArr);
	num = 0;
	new Handle:h_kv_cfg = CreateKeyValues("Crates");
	decl String:map[64];
	GetCurrentMap(map, sizeof(map));
	if (FileToKeyValues(h_kv_cfg, g_cfg_file) && KvJumpToKey(h_kv_cfg, map) && KvGotoFirstSubKey(h_kv_cfg, false))
	{
		decl String:name[15], Float:fPos[3];
		do
		{
			if (KvGetSectionName(h_kv_cfg, name, sizeof(name)) && StrContains(name, "crate") != -1)
			{
				KvGetVector(h_kv_cfg, "", fPos);
				PushArrayArray(g_boxArr, fPos, 3);
				num++;
			}
		}
		while (KvGotoNextKey(h_kv_cfg, false));
	}
	else
	{
		CloseHandle(h_kv_cfg);
		ThrowError("Could not parse %s", g_cfg_file);
	}
	CloseHandle(h_kv_cfg);
}

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;
	}

	new Handle:h_kv_cfg = CreateKeyValues("Crates");

	FileToKeyValues(h_kv_cfg, g_cfg_file);
	
	decl String:g_cMap[256];
	GetCurrentMap(g_cMap, sizeof(g_cMap));
	if (KvJumpToKey(h_kv_cfg, g_cMap, true))
	{
		decl Float:fPos[3], String:sBuffer[32];
		GetPlayerEye(client, fPos);
		fPos[2] += 30.0;
		FormatEx(sBuffer, sizeof(sBuffer), "crate %i", ++num);
		KvSetVector(h_kv_cfg, sBuffer, fPos);// Заносим позицию ящика в файл.
		KvRewind(h_kv_cfg);// Восстановить позицию.  
		KeyValuesToFile(h_kv_cfg, g_cfg_file);// Сохраняем файл
		PrintToChat(client, "Ящик установлен: %.2f:%.2f:%.2f", fPos[0], fPos[1], fPos[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)
{
    func_box();
}

public bool:TraceEntityFilterPlayers(entity, contentsMask)
{
    return (!(0 < entity <= MaxClients));
}

public Action:cmd_Reload(client, argc)
{
	LoadCfg();
	ReplyToCommand(client, "Настройки перезагружены!");
	return Plugin_Handled;
}

func_box()
{
	for (new i = 0; i < GetArraySize(g_boxArr); i++)
	{
		new ent;
		if ((ent = CreateEntityByName("prop_physics_override")) != -1)
		{
			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);

			decl Float:vec[3];
			GetArrayArray(g_boxArr, i, vec, 3);
			TeleportEntity(ent, vec, NULL_VECTOR, NULL_VECTOR);
		}
	}
}

Огромное спасибо. Оффтоп
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #24
CreateArray(3);

Сток не нужен

И num в принципе тоже не нужен т.к. Можно просто получать размер массива
 

Exle

Участник
Сообщения
190
Реакции
216
CreateArray(3);

Сток не нужен

И num в принципе тоже не нужен т.к. Можно просто получать размер массива

Насчет num, у него есть команда перезагрузки конфига, а если с помощью размера массива, то команда эта не нужна будет
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Шаманил, шаманил, не получается респавнить ящики каждый раунд из файла
Понадеялся на верный цикл загрузки по коду R1KO, но, как и думал - зря.
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) && !KeyValuesToFile(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];
		sBuffer = "crate 1";
		while(KvJumpToKey(h_kv_cfg, sBuffer))
        {
			KvGoBack(h_kv_cfg);
            KvGetVector(h_kv_cfg, sBuffer, g_MoneyPoint);   
            if(IsVectorEmpty(g_MoneyPoint))   
            {   
                break;   
            }   
            ++g_iNum;
			
			FormatEx(sBuffer, sizeof(sBuffer), "crate %i", g_iNum+1);
        }   
    }   
} 

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]; 
		sBuffer = "crate 1";
        new i = 1;
		while(KvJumpToKey(h_kv_cfg, sBuffer))
        {
			KvGoBack(h_kv_cfg);
            KvGetVector(h_kv_cfg, sBuffer, g_MoneyPoint);
            if(IsVectorEmpty(g_MoneyPoint))   
            {   
                return;  
            } 
            func_box();

			FormatEx(sBuffer, sizeof(sBuffer), "crate %i", ++i); 
        }   
    }   
} 

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);         
}
Понасоздавал ящиков около респауна команды Террористов, получил:
C-подобный:
"Crates"
{
	"de_dust2"
	{
		"crate 1"		"-1472.425415 -524.880798 158.862167"
		"crate 2"		"-1925.629272 -799.351501 161.142593"
		"crate 3"		"-1375.726318 -805.257019 158.705444"
		"crate 4"		"-929.497314 -821.664795 159.184387"
		"crate 5"		"-800.598022 -739.370850 160.704056"
		"crate 6"		"-932.644470 -885.827576 160.423981"
	}
}
Исправно добавляются новые (по порядку) и ставятся сами в каждом раунде.
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Понадеялся на верный цикл загрузки по коду R1KO, но, как и думал - зря.
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) && !KeyValuesToFile(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];
		sBuffer = "crate 1";
		while(KvJumpToKey(h_kv_cfg, sBuffer))
        {
			KvGoBack(h_kv_cfg);
            KvGetVector(h_kv_cfg, sBuffer, g_MoneyPoint);   
            if(IsVectorEmpty(g_MoneyPoint))   
            {   
                break;   
            }   
            ++g_iNum;
			
			FormatEx(sBuffer, sizeof(sBuffer), "crate %i", g_iNum+1);
        }   
    }   
} 

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]; 
		sBuffer = "crate 1";
        new i = 1;
		while(KvJumpToKey(h_kv_cfg, sBuffer))
        {
			KvGoBack(h_kv_cfg);
            KvGetVector(h_kv_cfg, sBuffer, g_MoneyPoint);
            if(IsVectorEmpty(g_MoneyPoint))   
            {   
                return;  
            } 
            func_box();

			FormatEx(sBuffer, sizeof(sBuffer), "crate %i", ++i); 
        }   
    }   
} 

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);         
}
Понасоздавал ящиков около респауна команды Террористов, получил:
C-подобный:
"Crates"
{
	"de_dust2"
	{
		"crate 1"		"-1472.425415 -524.880798 158.862167"
		"crate 2"		"-1925.629272 -799.351501 161.142593"
		"crate 3"		"-1375.726318 -805.257019 158.705444"
		"crate 4"		"-929.497314 -821.664795 159.184387"
		"crate 5"		"-800.598022 -739.370850 160.704056"
		"crate 6"		"-932.644470 -885.827576 160.423981"
	}
}
Исправно добавляются новые (по порядку) и ставятся сами в каждом раунде.

Мастер оптимизации.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #28
Зачем вам глобальный new Float:g_MoneyPoint[3]; ?
Передавайте координаты в func_box()

Понадеялся на верный цикл загрузки по коду R1KO, но, как и думал - зря.
Не могу понять это намек на то что у меня не верно или у них?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Мастер оптимизации.
Оффтоп
R1KO, Оффтоп
 

Hejter

xor ebx, ebx
Сообщения
1,759
Реакции
393
Сверху Снизу