вопрос по валидности и оптимизации кода

Danyas

Участник
Сообщения
2,173
Реакции
1,072
PHP:
#include <sdktools>
public Plugin:myinfo = {name    = "WeaponSpawn",author    = "Danyas"};
new g_SteamSprite;
public OnPluginStart()
{	decl String:map[16];GetCurrentMap(map,16);
	if (StrEqual(map, "35hp_2_remake"))	{HookEvent("round_start", round_start);}
	else {SetFailState("Invalid Map. Unloading."); decl String:fn[256]; GetPluginFilename(INVALID_HANDLE, fn, sizeof(fn)); ServerCommand("sm plugins unload %s", fn);}
}

public OnMapStart()
{
	g_SteamSprite = PrecacheModel("sprites/steam1.vmt");
}

public round_start(Handle:event, const String:name[], bool:dontBroadcast)
{
new weapon,randomint = GetRandomInt(0,6);
if (randomint == 0) weapon = CreateEntityByName("weapon_ak47");
else if (randomint == 1) weapon = CreateEntityByName("weapon_m4a1");
else if (randomint == 2) weapon = CreateEntityByName("weapon_deagle");
else if (randomint == 3) weapon = CreateEntityByName("weapon_awp");
else if (randomint == 4) weapon = CreateEntityByName("weapon_scout");
else if (randomint == 5) weapon = CreateEntityByName("weapon_m249");
else weapon = CreateEntityByName("weapon_m3");
new Float:pos[3]; pos[0] = -300.86; pos[1] = 545.63; pos[2] = 276.22;
TeleportEntity(weapon, pos, NULL_VECTOR, NULL_VECTOR);
DispatchSpawn(weapon);SetEntityMoveType(weapon, MOVETYPE_NONE);
SetEntityRenderColor(weapon, GetRandomInt(0,250), GetRandomInt(0,250), GetRandomInt(0,250), GetRandomInt(128,250));
SetEntityRenderFx(weapon, RENDERFX_DISTORT);
CreateTimer(GetRandomFloat(0.1, 10.0), weaponfx, _, TIMER_REPEAT);
}
public Action:weaponfx (Handle:timer)
{
new Float:pos[3]; pos[0] = -300.86; pos[1] = 545.63; pos[2] = GetRandomFloat(270.0,300.0);
TE_SetupSparks(pos, pos, GetRandomInt(10,100), GetRandomInt(100,1000))
TE_SetupSmoke(pos, g_SteamSprite, GetRandomFloat(3.0,7.0), GetRandomInt(5,15));
TE_SetupDust(pos,pos,GetRandomFloat(50.0,500.0),GetRandomFloat(1.0,50.0));
TE_SetupEnergySplash(pos, pos, true);
TE_SendToAll();
}

Интересует больше всего часть с рандомным оружием
 

Саша Шеин

Кому костылей?
Сообщения
1,697
Реакции
621
if (randomint == 0) weapon = CreateEntityByName("weapon_ak47");
else if (randomint == 1) weapon = CreateEntityByName("weapon_m4a1");
else if (randomint == 2) weapon = CreateEntityByName("weapon_deagle");
else if (randomint == 3) weapon = CreateEntityByName("weapon_awp");
else if (randomint == 4) weapon = CreateEntityByName("weapon_scout");
else if (randomint == 5) weapon = CreateEntityByName("weapon_m249");
else weapon = CreateEntityByName("weapon_m3");
Может лучше через switch?
 

artyrka94

Участник
Сообщения
181
Реакции
38
я бы вот это
PHP:
public round_start(Handle:event, const String:name[], bool:dontBroadcast) 
{ 
new weapon,randomint = GetRandomInt(0,6); 
if (randomint == 0) weapon = CreateEntityByName("weapon_ak47"); 
else if (randomint == 1) weapon = CreateEntityByName("weapon_m4a1"); 
else if (randomint == 2) weapon = CreateEntityByName("weapon_deagle"); 
else if (randomint == 3) weapon = CreateEntityByName("weapon_awp"); 
else if (randomint == 4) weapon = CreateEntityByName("weapon_scout"); 
else if (randomint == 5) weapon = CreateEntityByName("weapon_m249"); 
else weapon = CreateEntityByName("weapon_m3");

заменил на
PHP:
new String:wid[7][] = {"weapon_ak47","weapon_m4a1","weapon_deagle","weapon_awp","weapon_scout","weapon_m249", "weapon_m3"};
public round_start(Handle:event, const String:name[], bool:dontBroadcast) 
{ 
	new weapon = CreateEntityByName(wid[GetRandomInt(0,6)]);
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
SetFailState("Invalid Map. Unloading."); decl String:fn[256]; GetPluginFilename(INVALID_HANDLE, fn, sizeof(fn)); ServerCommand("sm plugins unload %s", fn);
Бесполезный код. После SetFailState плагин ставится на паузу и весь код ниже не выполняется.
new Float:pos[3]; pos[0] = -300.86; pos[1] = 545.63; pos[2] = GetRandomFloat(270.0,300.0);
Тогда бы сразу:
PHP:
new Float:pos[3] = {-300.86, 545.63, GetRandomFloat(270.0,300.0)};
Но лучше через decl.
new String:wid[7][] = {"weapon_ak47","weapon_m4a1","weapon_deagle","weapon_awp","weapon_scout","weapon_m249", "weapon_m3"};
Я бы немного не так сделал. Слишком много памяти требует. Особенно, если используются почти все виды оружия (и даже хранятся глобально).
 

gibs

Фитиль народного волненья
Сообщения
722
Реакции
407
Мошенник
Фейл стейт не ставь, если ты ставишь фейл стейт то плагин автоматом выгружается с ошибкой, и твой "sm plugins unload" все-равно не сработает. Проверку названия карты делай при старте карты, это как-то логичней. Используй свич. Если при объявлении не присваиваешь переменной значение, то используй decl. Оператор decl создает переменную в уже выделенной памяти, а не выделяет её для новой переменной в отличии от оператора new.
А так в принципе делай ударение на читаемость, чтобы всё было красивенько. Делай отступы.
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
PHP:
#include <sdktools>
public Plugin:myinfo = {name    = "WeaponSpawn",author    = "Danyas"};
new g_SteamSprite;

public OnMapStart()
{
	g_SteamSprite = PrecacheModel("sprites/steam1.vmt");
	decl String:map[16];GetCurrentMap(map,16);
	if (StrEqual(map, "35hp_2_remake"))
	{
		HookEvent("round_start", round_start);
	}
	else
	{
		decl String:fn[16];
		GetPluginFilename(INVALID_HANDLE, fn, sizeof(fn));
		ServerCommand("sm plugins unload %s", fn);
	}

}

public round_start(Handle:event, const String:name[], bool:dontBroadcast)
{
	decl Float:pos[3],weapon; 
	new randomint = GetRandomInt(0,6);
	
	switch (randomint)
	{
		case 0:{weapon = CreateEntityByName("weapon_ak47");}
		case 1:{weapon = CreateEntityByName("weapon_m4a1");}
		case 2:{weapon = CreateEntityByName("weapon_deagle");}
		case 3:{weapon = CreateEntityByName("weapon_awp");}
		case 4:{weapon = CreateEntityByName("weapon_scout");}
		case 5:{weapon = CreateEntityByName("weapon_m249");}
		case 6:{weapon = CreateEntityByName("weapon_m3");}
	}

	pos[0] = -300.86; pos[1] = 545.63; pos[2] = 276.22;

	TeleportEntity(weapon, pos, NULL_VECTOR, NULL_VECTOR);
	DispatchSpawn(weapon);
	SetEntityMoveType(weapon, MOVETYPE_NONE);
	SetEntityRenderColor(weapon, GetRandomInt(0,250), GetRandomInt(0,250), GetRandomInt(0,250), GetRandomInt(128,250));
	SetEntityRenderFx(weapon, RENDERFX_DISTORT);
	CreateTimer(GetRandomFloat(0.1, 10.0), weaponfx, _, TIMER_REPEAT);
}
public Action:weaponfx (Handle:timer)
{
	decl Float:pos[3];
	pos[0] = -300.86; pos[1] = 545.63; pos[2] = GetRandomFloat(270.0,300.0);
	TE_SetupSparks(pos, pos, GetRandomInt(10,100), GetRandomInt(100,1000))
	TE_SetupSmoke(pos, g_SteamSprite, GetRandomFloat(3.0,7.0), GetRandomInt(5,15));
	TE_SetupDust(pos,pos,GetRandomFloat(50.0,500.0),GetRandomFloat(1.0,50.0));
	TE_SetupEnergySplash(pos, pos, true);
	TE_SendToAll();
}
Тогда как-то так.

А как с 45-й строки (таймер) передать pos[3] в таймер?
Можно как-то без data-pack'a сделать?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Danyas, как полностью отключить плагин без выдачи ошибки SetFailState, использования лишь старые переменные (полная экономия памяти):
PHP:
public OnMapStart() 
{ 
	decl String:map[15];GetCurrentMap(map,15);
	if (strcmp(map, "35hp_2_remake"))
	{
		if (g_SteamSprite)
		{
			UnhookEvent("round_start", round_start, EventHookMode_PostNoCopy);
			g_SteamSprite = 0;
		}
	}
	else
	{
		if (g_SteamSprite == 0) HookEvent("round_start", round_start, EventHookMode_PostNoCopy);
		g_SteamSprite = PrecacheModel("sprites/steam1.vmt");
	}
}
CreateTimer(GetRandomFloat(0.1, 10.0), weaponfx, _, TIMER_REPEAT);
Таймер будет бесконечный в данном случае (и с каждой картой - ещё один). Нужно хотя бы добавить флаг TIMER_FLAG_NO_MAPCHANGE.
как с 45-й строки (таймер) передать pos[3] в таймер?
Можно как-то без data-pack'a сделать?
Хранить массив глобально. Для возможно столь частого таймера (0.1 сек в повторении) - это даже оптимальнее.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #10
насколько я помню юзать нужно будет так:
PHP:
Float:TIMER_POSITION
или
PHP:
#define TIMER_POSITION Float:{-300.86, 545.63, 276.22}
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
насколько я помню юзать нужно будет так:
PHP:
Float:TIMER_POSITION
или
PHP:
#define TIMER_POSITION Float:{-300.86, 545.63, 276.22}

PHP:
#define pos Float:{-300.86, 545.63, 276.22}

На данный момент код выглядит так
PHP:
#include <sdktools>
public Plugin:myinfo = {name    = "WeaponSpawn",author    = "Danyas"};
new g_SteamSprite;
#define pos Float:{-300.86, 545.63, 276.22}  
public OnMapStart()
{
	g_SteamSprite = PrecacheModel("sprites/steam1.vmt");
	decl String:map[16];GetCurrentMap(map,16);
	if (StrEqual(map, "35hp_2_remake"))
	{
		HookEvent("round_start", round_start);
	}
	else
	{
		decl String:fn[16];
		GetPluginFilename(INVALID_HANDLE, fn, sizeof(fn));
		ServerCommand("sm plugins unload %s", fn);
	}

}

public round_start(Handle:event, const String:name[], bool:dontBroadcast)
{
	decl weapon; 
	new randomint = GetRandomInt(0,6);
	
	switch (randomint)
	{
		case 0:{weapon = CreateEntityByName("weapon_ak47");}
		case 1:{weapon = CreateEntityByName("weapon_m4a1");}
		case 2:{weapon = CreateEntityByName("weapon_deagle");}
		case 3:{weapon = CreateEntityByName("weapon_awp");}
		case 4:{weapon = CreateEntityByName("weapon_scout");}
		case 5:{weapon = CreateEntityByName("weapon_m249");}
		case 6:{weapon = CreateEntityByName("weapon_m3");}
	}


	TeleportEntity(weapon, pos, NULL_VECTOR, NULL_VECTOR);
	DispatchSpawn(weapon);
	SetEntityMoveType(weapon, MOVETYPE_NONE);
	SetEntityRenderColor(weapon, GetRandomInt(0,250), GetRandomInt(0,250), GetRandomInt(0,250), GetRandomInt(128,250));
	SetEntityRenderFx(weapon, RENDERFX_DISTORT);
	CreateTimer(GetRandomFloat(0.1, 10.0), weaponfx, _, TIMER_REPEAT|TIMER_FLAG_NO_MAPCHANGE);
}
public Action:weaponfx (Handle:timer)
{
	TE_SetupSparks(pos, pos, GetRandomInt(10,100), GetRandomInt(100,1000))
	TE_SetupSmoke(pos, g_SteamSprite, GetRandomFloat(3.0,7.0), GetRandomInt(5,15));
	TE_SetupDust(pos,pos,GetRandomFloat(50.0,500.0),GetRandomFloat(1.0,50.0));
	TE_SetupEnergySplash(pos, pos, true);
	TE_SendToAll();
}

Насколько я помню, компилятор сам определяет тип константы в зависимости от написания. Ты же не ставишь String:, когда пишешь текст в #define, верно? Также и тут. Есть дробная часть - используется Float.

Неа, не определил почему-то.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #12
Ты же не ставишь String:, когда пишешь текст в #define, верно? Также и тут. Есть дробная часть - используется Float.
А ты проверь))
String: мы не ставим потому что компилятор уже подразумевает что то что в кавычках это строка:
StringToInt("145");
Тут же String: не пишем.
А у массива тип не флоат, хотя внутри него как раз так. Поэтому нужно на сам массив присваивать тип.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #13
PHP:
decl weapon;     new randomint = GetRandomInt(0,6);        switch (randomint)    {        case 0:{weapon = CreateEntityByName("weapon_ak47");}        case 1:{weapon = CreateEntityByName("weapon_m4a1");}        case 2:{weapon = CreateEntityByName("weapon_deagle");}        case 3:{weapon = CreateEntityByName("weapon_awp");}        case 4:{weapon = CreateEntityByName("weapon_scout");}        case 5:{weapon = CreateEntityByName("weapon_m249");}        case 6:{weapon = CreateEntityByName("weapon_m3");}    }

я бы вот это
PHP:
public round_start(Handle:event, const String:name[], bool:dontBroadcast) 
{ 
new weapon,randomint = GetRandomInt(0,6); 
if (randomint == 0) weapon = CreateEntityByName("weapon_ak47"); 
else if (randomint == 1) weapon = CreateEntityByName("weapon_m4a1"); 
else if (randomint == 2) weapon = CreateEntityByName("weapon_deagle"); 
else if (randomint == 3) weapon = CreateEntityByName("weapon_awp"); 
else if (randomint == 4) weapon = CreateEntityByName("weapon_scout"); 
else if (randomint == 5) weapon = CreateEntityByName("weapon_m249"); 
else weapon = CreateEntityByName("weapon_m3");

заменил на
PHP:
new String:wid[7][] = {"weapon_ak47","weapon_m4a1","weapon_deagle","weapon_awp","weapon_scout","weapon_m249", "weapon_m3"};
public round_start(Handle:event, const String:name[], bool:dontBroadcast) 
{ 
	new weapon = CreateEntityByName(wid[GetRandomInt(0,6)]);

так сделай
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #15
AlmazON, но при компиляции выдает несоответстиве тегов
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
специально в свич сделал, как посоветовали
Слишком много повторения кода, его нативов - это тоже плохо. Если жалко глобальную память, сделай хотя бы в decl:
PHP:
decl String:wid[][] = {"weapon_ak47","weapon_m4a1","weapon_deagle", "weapon_awp","weapon_scout","weapon_m249","weapon_m3"};
Оффтоп
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Слишком много повторения кода, его нативов - это тоже плохо. Если жалко глобальную память, сделай хотя бы в decl:
PHP:
decl String:wid[][] = {"weapon_ak47","weapon_m4a1","weapon_deagle", "weapon_awp","weapon_scout","weapon_m249","weapon_m3"};
Оффтоп

Сделал глобально.

Оффтоп
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
ее же сразу нельзя присвоить, не так ли?
Можно в массивах. Если значение явное, известно заранее (как бы константа):
PHP:
decl i[2] = {0, 4}; //ВЕРНО.
Присваивать переменную - нельзя:
PHP:
new a, b;
decl i[2] = {a, b}; //НЕПРАВИЛЬНО.
 
Последнее редактирование:
Сверху Снизу