Написание плагинов. Жизненно ли?

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Сидишь такой, глаза слипаются, пытаешься понять то что сам и написал.
Жмешь F9 а тебе - " error 029: invalid expression, assumed zero"
P8Pm6o5.png

Смотришь в код, минуту, пять минут, двадцать минут.
И ПОНИМАЕШЬ ЧТО ТЫ ПРОСТО ЗАБЫЛ ПОСТАВИТЬ СКОБКУ :angry2:
:sad:
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
ПРОСТО ЗАБЫЛ ПОСТАВИТЬ СКОБКУ
Может убрать? Спереди то явно лишняя из 2.
А ты Notepad++ пробовал? Там "подсветка" для скобок есть.
Оффтоп
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Может убрать? Спереди то явно лишняя из 2.

То есть можно писать так?
PHP:
if IsClientValid(client) && !IsFakeClient(cleint)
{
     //some trash
}
А ты Notepad++ пробовал? Там "подсветка" для скобок есть.
Без него бы наверное час проблему искал :-D

Бывает такое. Невнимательность + незнание точного перевода каждой ошибки, что она означает.
Все ошибки которые я знаю можно пересчитать на пальцах двух рук :(
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Наконец-то. :-D
Все ошибки которые я знаю можно пересчитать на пальцах двух рук
Добавляй уже пальцы на ногах:
/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/
Список ошибок компиляции:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 200: symbol "%s" is truncated to 31 characters"

"Предупреждение 200: переменная "%s" ограничивается 31 символами"; при создании переменной введено больше 31 символа.

new sssssssssssssssssssssssssssssss;

Решение - сменить название или укоротить.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 201: redefinition of constant/macro"

"Предупреждение 201: переопределение константы/макро"; двойное определение одинаковой константы define.

#define OnPlayerEnterRaceCheckpoint
#define OnPlayerEnterRaceCheckpoint

Решение - удалить одну любую строчку.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 202: number of arguments does not match definition"

"Предупреждение 202: количество аргументов не соответствует определению"; не совпадают аргументы.

Create3DTextLabel("Текст.",0xFFA500FF,.0120,456.2717,35.1719,20.0);

Решение:
-2041.0120,456.2717,35.1719,20.0
-2041.0120,456.2717,35.1719 <- это наша координата (она нас не интересует);
20.0 <- вот наша ошибка (20 - это расстояние, с которого наш текст будет виден);
А вот 0 <- это у нас testLOS - линия видимости.

Нам 0 нужно заменить на 1:

Create3DTextLabel("Текст.",0xFFA500FF,1111.1111,111.1111,11.1111,20.1);

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 203: symbol is never used: %s"

"Предупреждение 203: данный символ нигде не используется: %s".

new respon;

(2378) warning 203: symbol is never used: "respon"
Решение - найти эту переменную и удалить.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 204: symbol is assigned a value that is never used %s"

"Предупреждение 204: символу %s присваивается значение, которое нигде не использовалось"; создана переменная и массив, а она нигде не используется.

new babai[15];

Решение - просто удалить.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 209: function "%s" should return a value"

"Предупреждение 209: функция "%s" должна возвращать значение"; функция не возвращается (простыми словами: нет return 1; или return 0;).

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if (newkeys == 1024)
{
OnPlayerCommandText(playerid,"/Blablabal");
return 1; <--- вот наш return ДО.
}
}

Решение:

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if (newkeys == 1024)
{
OnPlayerCommandText(playerid,"/Blablabal");
}
return 1; <--- вот наш return ПОСЛЕ.
}

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 213: tag mismatch"

"Предупреждение 213: несоответствие тегов"; несовпадение аргументов.

#define CreateObject CreateDynamicObject
#define MoveObject MoveDynamicObject

Решение:

#define CreateObject, CreateDynamicObject
#define MoveObject, MoveDynamicObject

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 216: nested comment"

"Предупреждение 216: вложенные комментарии"; неправильная запись комментария.

/*case 58: //Fire&lvl

Решение:

case 58: //Fire&lvl

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 217: loose indentation"

"Предупреждение 217: свободный (неправильный) отступ"; невыровненная строка - код не табулирован (не построен лесенкой).

Решение - выровнять всё вручную или поставить:

#pragma tabsize 0

pragma tabsize - просто маскирует warning и не более.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 219: local variable "%s" shadows a variable at a preceding level"

"Предупреждение 219: локальная переменная "%s" уже использована переменной на предыдущем уровне"; переменная дважды объявлена.

new fast;
new fast;

Решение: одну из них удалить или изменить.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 235: public function lacks forward declaration %s"

"Предупреждение 235: public function не хватает forward декларации %s"; у функции нет forward.

public lois()

Решение - изменить на forward:

forward lois()

Если не хотите каждый раз писать forward, то можно сделать так:

#define public:%1(%2) forward %1(%2);
public %1(%2)

Тогда новые паблики делать так:

public:lois()

-----------------------------------------------------------------------------------------------------------------------------------------------------------------
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Наконец-то. :-D
Добавляй уже пальцы на ногах:
/+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/
Список ошибок компиляции:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 200: symbol "%s" is truncated to 31 characters"

"Предупреждение 200: переменная "%s" ограничивается 31 символами"; при создании переменной введено больше 31 символа.

new sssssssssssssssssssssssssssssss;

Решение - сменить название или укоротить.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 201: redefinition of constant/macro"

"Предупреждение 201: переопределение константы/макро"; двойное определение одинаковой константы define.

#define OnPlayerEnterRaceCheckpoint
#define OnPlayerEnterRaceCheckpoint

Решение - удалить одну любую строчку.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 202: number of arguments does not match definition"

"Предупреждение 202: количество аргументов не соответствует определению"; не совпадают аргументы.

Create3DTextLabel("Текст.",0xFFA500FF,.0120,456.2717,35.1719,20.0);

Решение:
-2041.0120,456.2717,35.1719,20.0
-2041.0120,456.2717,35.1719 <- это наша координата (она нас не интересует);
20.0 <- вот наша ошибка (20 - это расстояние, с которого наш текст будет виден);
А вот 0 <- это у нас testLOS - линия видимости.

Нам 0 нужно заменить на 1:

Create3DTextLabel("Текст.",0xFFA500FF,1111.1111,111.1111,11.1111,20.1);

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 203: symbol is never used: %s"

"Предупреждение 203: данный символ нигде не используется: %s".

new respon;

(2378) warning 203: symbol is never used: "respon"
Решение - найти эту переменную и удалить.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 204: symbol is assigned a value that is never used %s"

"Предупреждение 204: символу %s присваивается значение, которое нигде не использовалось"; создана переменная и массив, а она нигде не используется.

new babai[15];

Решение - просто удалить.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 209: function "%s" should return a value"

"Предупреждение 209: функция "%s" должна возвращать значение"; функция не возвращается (простыми словами: нет return 1; или return 0;).

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if (newkeys == 1024)
{
OnPlayerCommandText(playerid,"/Blablabal");
return 1; <--- вот наш return ДО.
}
}

Решение:

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if (newkeys == 1024)
{
OnPlayerCommandText(playerid,"/Blablabal");
}
return 1; <--- вот наш return ПОСЛЕ.
}

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 213: tag mismatch"

"Предупреждение 213: несоответствие тегов"; несовпадение аргументов.

#define CreateObject CreateDynamicObject
#define MoveObject MoveDynamicObject

Решение:

#define CreateObject, CreateDynamicObject
#define MoveObject, MoveDynamicObject

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 216: nested comment"

"Предупреждение 216: вложенные комментарии"; неправильная запись комментария.

/*case 58: //Fire&lvl

Решение:

case 58: //Fire&lvl

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 217: loose indentation"

"Предупреждение 217: свободный (неправильный) отступ"; невыровненная строка - код не табулирован (не построен лесенкой).

Решение - выровнять всё вручную или поставить:

#pragma tabsize 0

pragma tabsize - просто маскирует warning и не более.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 219: local variable "%s" shadows a variable at a preceding level"

"Предупреждение 219: локальная переменная "%s" уже использована переменной на предыдущем уровне"; переменная дважды объявлена.

new fast;
new fast;

Решение: одну из них удалить или изменить.

-----------------------------------------------------------------------------------------------------------------------------------------------------------------

"warning 235: public function lacks forward declaration %s"

"Предупреждение 235: public function не хватает forward декларации %s"; у функции нет forward.

public lois()

Решение - изменить на forward:

forward lois()

Если не хотите каждый раз писать forward, то можно сделать так:

#define public:%1(%2) forward %1(%2);
public %1(%2)

Тогда новые паблики делать так:

public:lois()

-----------------------------------------------------------------------------------------------------------------------------------------------------------------
"warning 213: tag mismatch" - это вроде исправить можно изменением типа данных.
Изменить с String на Int например.

"warning 217: loose indentation" - любимое занятие :-D

"warning 209: function "%s" should return a value" - за эту отдельное спасибо, ибо недавно об нее споткнулся

Добавлено через 1 минуту
AlmazON, а какой ивент выполняется после каждой смены карты?
только OnMapStart?
а OnConfigsExecuted?

Добавлено через 3 минуты
туда же

PHP:
decl String:ip[16],String:name[96],String:country[96],String:from[128];
Я по поводу выделенных байт не перебрал?)
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
любимое занятие
С чего вдруг? Некоторые чужие скрипты или копирование с этого форума - это да... Одни пробелы. А в своём то вручную расставляешь.
Кстати, это тоже бред. Похоже, ты ещё не достиг хорошего уровня скриптинга в мелочах.
какой ивент выполняется после каждой смены карты?
OnMapStart(), потом OnAutoConfigsBuffered() и после всех OnConfigsExecuted(). Первый применять, по-моему мнению, надо реже. Он и не нужен везде подряд.
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
С чего вдруг? Некоторые чужие скрипты или копирование с этого форума - это да... Одни пробелы. А в своём то вручную расставляешь.

Не без этого конечно.
Но чаще всего это
PHP:
#pragma tabsize 0
Кстати, это тоже бред. Похоже, ты ещё не достиг хорошего уровня скриптинга в мелочах.

PHP:
stock bool:IsClientValid(client)
{
    return ((client > 0 && client <= MaxClients) && IsClientInGame(client)) ? true : false;
}

Без этой проверки сервер еррорит
PHP:
[SM] Native "IsFakeClient" reported: Client index 0 is invalid
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Без этой проверки сервер еррорит
new client = GetClientOfUserId(userid) - ставь после такого просто if(client) и удивишься. И никаких ошибок после.
decl String:ip[16],String:name[96]
Первое - прямо таки вровень! А вот второе, если это никнейм игрока - сильный перебор, ровно в 3 раза.
String:country[96],String:from[128]
Тут уже на "твой вкус", ибо предела как бы нет - страны даже появляются новые, лучше переборщить уж. А последнее... это что, сообщение чата?
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
new client = GetClientOfUserId(userid) - ставь после такого просто if(client) и удивишься. И никаких ошибок после
Точно, это ж по сути и есть проверка на наличие клиента на сервере. :)

Первое - прямо таки вровень! А вот второе, если это никнейм игрока - сильный перебор, ровно в 3 раза.
Значит в никнейме может быть не более 32х символов латиницы или 16 кириллицы?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
в никнейме может быть не более 32х символов латиницы или 16 кириллицы?
Правильнее писать константой include. Это у нас MAX_NAME_LENGTH.
#define MAX_NAME_LENGTH 32 /**< Maximum buffer required to store a client name */
Сдаётся мне, это сделано специально, чтобы ты потом не правил свой скрипт - у него всегда будет подставляться актуальная для данного времени/версии SM/игры величина.
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
А последнее... это что, сообщение чата?

PHP:
		Format(from,sizeof(from)," [\x03%s]",country); //Adds [] and color
Нужно было всю ф-ю постить)
По сути это
PHP:
decl String:form [country+2]

Добавлено через 2 минуты
Правильнее писать константой include. Это у нас MAX_NAME_LENGTH.
#define MAX_NAME_LENGTH 32 /**< Maximum buffer required to store a client name */
Сдаётся мне, это сделано специально, чтобы ты потом не правил свой скрипт - у него всегда будет подставляться актуальная для данного времени/версии SM/игры величина.

А где их всех взять?
https://forums.alliedmods.net/showthread.php?t=57142 - тут нашел несколько
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
в Format используеться буффер а в FormatEx нет
Format для сохранения в буффер, когда этот же буффер используется в нём для форматирования (для %s), а FormatEx - почти для всех прочих случаев, т.к. быстрее.
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Format для сохранения в буффер, когда этот же буффер используется в нём для форматирования (для %s), а FormatEx - почти для всех прочих случаев, т.к. быстрее.
Смысл понял.
В случае KickCilentEx и HookEventEx всё так же?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
HookEventEx всё так же
Нет. Можешь спокойно хукать, как обычно - скорее, так даже будет быстрее, ибо Ex для "профита" с хуками... ("универсальных скриптов", так сказать).
А первый просто переведи.
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Нет. Можешь спокойно хукать, как обычно - скорее, так даже будем быстрее, ибо Ex для "профита" с хуками... ("универсальных скриптов", так сказать).
А первый просто переведи.

Хм, спасибо, попробую.



Погляди на код, может будет какая-либо заметка по поводу оптимизации или еще что-то...
PHP:
#include <sourcemod>
#include <sdktools>
#include <sdkhooks>
#include <cstrike>

new tracer_fx,explode_fx,light_fx;
public OnPluginStart()
{
	HookEvent("weapon_fire", Event_OnWeaponFire);
}

public OnMapStart()
{ 
	tracer_fx = PrecacheModel("effects/gunshiptracer.vmt"); 
	explode_fx = PrecacheModel("materials/sprites/sprite_fire01.vmt");
	light_fx = PrecacheModel("sprites/lgtning.vmt");
}

public Action:Event_OnWeaponFire(Handle:event, const String:name[], bool:silent)
{
	new client = GetClientOfUserId(GetEventInt(event, "userid"));
	decl String:weapon[25], Float:pos[3], Float:clientpos[3];
	GetEventString(event, "weapon", weapon, sizeof(weapon));
 	if (strcmp(weapon, "awp", false) == 0)
	{
		wS_GetLookPos(client, pos);
		GetClientEyePosition(client, clientpos);
		TE_SetupBeamPoints(clientpos, pos, tracer_fx,0,0,0,3.0,2.0,4.0,2,1.2,{125, 125, 125, 190},1);
		TE_SendToAll();
		TE_SetupBeamPoints(pos, clientpos, tracer_fx,0,0,0,4.0,3.0,5.0,4,0.1,{255, 255, 255, 190},6);
		TE_SendToAll();
	}
  
	if (strcmp(weapon, "m3", false) == 0)
	{
		wS_GetLookPos(client, pos);
		new tesla = CreateEntityByName("point_tesla");
		DispatchKeyValue(tesla, "m_flRadius", "66.0");
		DispatchKeyValue(tesla, "m_SoundName", "DoSpark");
		DispatchKeyValue(tesla, "beamcount_min", "30");
		DispatchKeyValue(tesla, "beamcount_max", "60");
		DispatchKeyValue(tesla, "texture", "sprites/physbeam.vmt");
		DispatchKeyValue(tesla, "m_Color", "255 255 255");
		DispatchKeyValue(tesla, "thick_min", "10.0");  
		DispatchKeyValue(tesla, "thick_max", "11.0"); 
		DispatchKeyValue(tesla, "lifetime_min", "0.2");
		DispatchKeyValue(tesla, "lifetime_max", "0.6");
		DispatchKeyValue(tesla, "interval_min", "0.1"); 
		DispatchKeyValue(tesla, "interval_max", "0.5");        
		DispatchSpawn(tesla);
		TeleportEntity(tesla, pos, NULL_VECTOR, NULL_VECTOR);
		AcceptEntityInput(tesla, "TurnOn"); 
		AcceptEntityInput(tesla, "DoSpark");
		TE_SetupExplosion(pos, explode_fx, 10.0, 1, 0, 75, 5000);
		TE_SendToAll();  
	}
	
	if (strcmp(weapon, "scout", false) == 0)
	{
	wS_GetLookPos(client, pos);
	new randomx = GetRandomInt(-500, 500); 
	new randomy = GetRandomInt(-500, 500); 
	new Float:startpos[3]; 
	startpos[0] = pos[0] + randomx; 
	startpos[1] = pos[1] + randomy; 
	startpos[2] = pos[2] + 800; 
	new color[4] = {0, 30, 240, 255}; 
	new Float:dir[3] = {0.0, 0.0, 0.0}; 
	TE_SetupBeamPoints(startpos, pos, light_fx, 0, 0, 0, 0.2, 20.0, 10.0, 0, 2.0, color, 3); //Делаем лазер с амплитудой в 2 единицы
	TE_SendToAll();
	TE_SetupBeamPoints(startpos, pos, light_fx, 0, 0, 0, 0.2, 10.0, 5.0, 0, 1.0, {255, 255, 255, 255}, 3);
	TE_SendToAll();
	TE_SetupSparks(pos, dir, 5000, 1000);
	TE_SendToAll();
	TE_SetupEnergySplash(pos, dir, false);
	TE_SendToAll();
	}
	return Plugin_Handled;
}





//Ty wS for that
public bool:wS_GetLookPos_Filter(ent, mask, any:client)
{ 
	return client != ent; 
}

wS_GetLookPos(client, Float:wS_Pos[3])
{
decl Float:EyePosition[3], Float:EyeAngles[3], Handle:h_trace; 
GetClientEyePosition(client, EyePosition); 
GetClientEyeAngles(client, EyeAngles); 
h_trace = TR_TraceRayFilterEx(EyePosition, EyeAngles, MASK_SOLID, RayType_Infinite, wS_GetLookPos_Filter, client); 
TR_GetEndPosition(wS_Pos, h_trace); 
CloseHandle(h_trace); 
}
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Сверху Снизу