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

Danyas

Участник
Сообщения
2,173
Реакции
1,072
else if! И ниже то же. Элементарные ошибки, а так достаточно хорошо написано. Оффтоп
Оффтоп

от wS'a тут последние 15 строк + описание ефектов.

PHP:
	if (strcmp(weapon, "m3", false) == 0)
это я решил так, ибо адекватнее ничего не нашел

Добавлено через 2 минуты
ладно, пойду ка я.
AlmazON, спокойной ночи, всегда приятно с знающим человеком пообщаться :D
 
Последнее редактирование:

Monroe

Участник
Сообщения
25
Реакции
35
PHP:
	if(StrEqual(weapon, "awp"))
	{
		...
	}	
	else if(StrEqual(weapon, "m3"))
	{
		...
	}	
	else if(StrEqual(weapon, "scout"))
	{
		...
	}

Добавлено через 7 минут
PHP:
    new Float:startpos[3];
        >>
    decl Float:startpos[3];
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #23
В случае KickCilentEx и HookEventEx всё так же?

KickClient
Notes:
Disconnects a client from the server as soon as the next frame starts. Note: Originally, KickClient() was immediate. The delay was introduced because despite warnings, plugins were using it in ways that would crash. The new safe version can break cases that rely on immediate disconnects, but ensures that plugins do not accidentally cause crashes. If you need immediate disconnects, use KickClientEx(). Note: IsClientInKickQueue() will return true before the kick occurs.
Выкидывает игрока с севера в следующем фрейме и гарантирует что все события выхода игрока произойдут.

KickClientEx
Notes:
Immediately disconnects a client from the server. Kicking clients from certain events or callbacks may cause crashes. If in doubt, create a short (0.1 second) timer to kick the client in the next available frame.

Выкидывает игрока сразу же, не дожидаясь начала след. фрейма.


HookEventEx не будет выдавать ошибку если эвент не сущевствует, а HookEvent будет.


Наконец-то. :-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);

....

Где нарыл?
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
HookEventEx не будет выдавать ошибку если эвент не сущевствует, а HookEvent будет.
Если не собираетесь делать Unhook событий, то обычно проверять эвент нет смысла - сама проверка + возврат значения делает его медленнее. А ошибку итак выдаст, если эвента не существует (с обычным HookEvent) и весь код ниже не будет прочтён.
Короче говоря, больше для "профита" и заморочек с Unhook'ами)
Отовсюду, где находил. Большинство нашёл на одном сайте. Сами же ошибки (буквальный перевод) - переводил на русский.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #25
Если не собираетесь делать Unhook событий, то обычно проверять эвент нет смысла - сама проверка + возврат значения делает его медленнее. А ошибку итак выдаст, если эвента не существует (с обычным HookEvent) и весь код ниже не будет прочтён.
Короче говоря, больше для "профита" и заморочек с Unhook'ами)
Просто читай описание:
https://sm.alliedmods.net/api/index.php?fastload=show&id=732&
https://sm.alliedmods.net/api/index.php?fastload=show&id=733&
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Просто читай описание
У них одинаковое описание, я в курсе. Разница лишь в возврате значения. Тут даже указывал на некоторые заблуждения. И вообще, использую более широко, чем ты думаешь, что и называю "профитом".
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #27
AlmazON, и там у тебя в коде не верно.
EventHookMode
Такого значения нет, это класс.
enum EventHookMode
{
EventHookMode_Pre, /**< Hook callback fired before event is fired */
EventHookMode_Post, /**< Hook callback fired after event is fired */
EventHookMode_PostNoCopy /**< Hook callback fired after event is fired, but event data won't be copied */
};

PHP:
HookEvent("round_start", DR_Action_RoundStartEventHookMode, EventHookMode); 
    HookEvent("round_start", DR_RoundStartEventHookMode, EventHookMode); 
    HookEvent("round_start", DR_Action_RoundStartEventHookMode_Post, EventHookMode_Post);
Это всё один и тот же хук только в разной последовательности.

Вот так должно быть:
PHP:
HookEvent("round_start", DR_Action_RoundStartEventHookMode, EventHookMode:тип хука);
или по дефолту будет EventHookMode_Post
 
Последнее редактирование:

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
там у тебя в коде не верно
А ты выше прочти. Это не мои придумы, Оффтоп я как раз против такого... странного. Но, оно работает, по факту.
Это всё один и тот же хук только в разно последовательности
Автору Дедрана лучше подскажи, а то он такого понаписывал, что даже события у него выдают INVALID_HANDLE. Первый раз такое вижу, чтобы выходило. :)
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #29
AlmazON, я читал. Не помню где, но я читал про HookEventEx. И с анхуками это не связано.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Оффтоп
И с анхуками это не связано
Напрямую, нет. Но косвенно - да. Если ты Unhook'нешь несработавший HookEvent, то получишь ушибку. Через HookEventEx ты можешь создать код, который может автоматически переключаться между теми хуками, что удалось задействовать. Он будет работать, возможно, также идеально, как если ты сделал, что все события заведомо существуют. В этом соль (без ошибок и багов - универсально).
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #31

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
Это и так было ясно
Ты говоришь о теории, а я говорю о практике, как это можно использовать. Толку то, что ошибки не выдаст - хука нет и скрипт просто не задействуется. Обычно, в таком случае, также выводят ошибку, но через SetFailState. Но всё можно "навернуть" с точностью наоборот.
 

Danyas

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

PHP:
new attacker = GetClientOfUserId(GetEventInt(event, "attacker")); 
	if (attacker && !IsFakeClient(attacker))
PHP:
L 01/24/2015 - 13:50:20: [SM] Native "IsFakeClient" reported: Client index 0 is invalid
L 01/24/2015 - 13:50:20: [SM] Displaying call stack trace for plugin "aio.smx":
L 01/24/2015 - 13:50:20: [SM]   [0]  Line 125, aio.sp::Event_player_hurt()

Помнишь ты мне писал про то что можно написать просто if (attacker) ?
Вроде как-то не получилось:-D
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
как-то не получилось
Скажи честно: в твоём коде больше копипаста или ты сам его сознательно пишешь?
Подумай, ну как может
т.е, в данном случае, attacker быть нулевым, если:
if (attacker && !IsFakeClient(attacker))
ты с самого начала делаешь проверку, что attacker допускается отрицательным или положительным, но никак не 0?!
Что-то ты неверно сделал, это фантастика)
 
N

NiGaByte

Ребята, раз тут такие разговоры осмелюсь спросить, или даже попросить помощи в исправлении кода, есть такой код:
PHP:
#include <sourcemod> 

// Получение события смерти 
public OnPluginStart() 
{ 
 HookEvent("player_death", Event_PlayerDeath); 
} 
// Функция затемнения 
PerformFade(client, duration, const color[4]) {     
    new flags = 0x0001; 
  
    new Handle:message = StartMessageOne("Fade", client); 
  
    PbSetInt(message, "duration", duration); 
    PbSetInt(message, "hold_time", 0); 
    PbSetInt(message, "flags", flags); 
    PbSetColor(message, "clr", color); 
  
    EndMessage(); 
} 
// Получение игрока-убийцы, применение к нему функции затемнения 
public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast) 
{ 
 new attacker_id = GetEventInt(event, "attacker"); 
 new attacker = GetClientOfUserId(attacker_id); 
 PerformFade(attacker, 900, {0, 0, 200, 51});  
}

Так вот если new attacker_id = GetEventInt(event, "attacker"); будет сам игрок которого атаковали, то
PHP:
L 01/24/2015 - 22:30:01: [SM] Native "StartMessage" reported: Client index 0 is invalid
L 01/24/2015 - 22:30:01: [SM] Displaying call stack trace for plugin "fade_shots.smx":
L 01/24/2015 - 22:30:01: [SM]   [0]  Line 217, D:\cs_go\csgo\addons\sourcemod\scripting\include\usermessages.inc::StartMessageOne()
L 01/24/2015 - 22:30:01: [SM]   [1]  Line 12, D:\cs_go\csgo\addons\sourcemod\scripting\fade_shots.sp::PerformFade()
L 01/24/2015 - 22:30:01: [SM]   [2]  Line 26, D:\cs_go\csgo\addons\sourcemod\scripting\fade_shots.sp::Event_PlayerDeath()[/PHP[/SPOILER]

Если простым языком, то когда игрок убивает сам себя, то получается ошибка помогите исправить.
 

AlmazON

Не путать с самим yand3xmail
Сообщения
5,099
Реакции
2,755
раз тут такие разговоры осмелюсь спросить
Этот переправлять не хочу, но есть твой давно готовый:
PHP:
public OnPluginStart() HookEvent("player_death", PD);

public PD(Handle:E, String:N[], bool:B)
{
	new a = GetEventInt(E, "attacker"), c = GetEventInt(E, "userid");
	if (a != c) PFD(a, 900, {0, 0, 200, 51});
	PFD(c, 1100, {200, 0, 0, 51});
}

PFD(u, d, const f[])
{
	new c = GetClientOfUserId(u);
	if (c)
	{
		new Handle:m = StartMessageOne("Fade", c);
		PbSetInt(m, "duration", d);
		PbSetInt(m, "hold_time", 0);
		PbSetInt(m, "flags", 0x0001|0x0010);
		PbSetColor(m, "clr", f);
		EndMessage();
	}
}
Правда, новый баг с двумя цветами сразу остаётся нерешённый.
 

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #37
NiGaByte,
PHP:
// Получение игрока-убийцы, применение к нему функции затемнения  
public Event_PlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)  
{  
 new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));  
 if(attacker > 0 && attacker != GetClientOfUserId(GetEventInt(event, "userid")))
 PerformFade(attacker, 900, {0, 0, 200, 51});
}
 

Danyas

Участник
Сообщения
2,173
Реакции
1,072
Скажи честно: в твоём коде больше копипаста или ты сам его сознательно пишешь?
Подумай, ну как может

т.е, в данном случае, attacker быть нулевым, если:

ты с самого начала делаешь проверку, что attacker допускается отрицательным или положительным, но никак не 0?!
Что-то ты неверно сделал, это фантастика)

На самом деле я так и не понял что делает
PHP:
if (attacker)
Я где-то в кодах видел такую вещь, но так в ней и не разобрался.

Добавлено через 1 минуту
Могу ли я написать
PHP:
if (attacker > 0)
?
Это ведь по сути решит проблему
 
Последнее редактирование:

R1KO

fuck society
Сообщения
9,457
Реакции
7,786
  • Команда форума
  • #40
if(client)
Это
if(client != 0)
 
Сверху Снизу