[SourePawn] Вопросы

Пыхарь

Участник
Сообщения
145
Реакции
18
Вот я свекла однако...
не поставил "#" перед include =/
Главное присматривался на присутствие ошибок...и в таком легком месте не заметить :D
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Сейчас эксперементирую с плагином GrenadeTrails, луч "прилепляется" к гранате в функции SDKHooks OnEntityCreated(Entity, const String:Classname[]).
Во время экспериментов появилась необходимость знать игрока, который кинул гранату, нашел в этой версии плагина - https://forums.alliedmods.net/showthread.php?p=1798347 такой обрезок кода:
(проверки на то что это гранаты в примере убрал, в коде понятное дело они есть)
PHP:
public OnEntityCreated(entity, const String:classname[])
{
new Handle:datapack = INVALID_HANDLE;
CreateDataTimer(0.0, projectile, datapack, TIMER_FLAG_NO_MAPCHANGE);
WritePackCell(datapack, entity);
WritePackString(datapack, classname);
ResetPack(datapack);
}

public Action:projectile(Handle:timer, Handle:datapack)
{
new entity = ReadPackCell(datapack);
new m_hThrower = GetEntPropEnt(entity, Prop_Send, "m_hThrower");
.............
}
Тут номер клиента - m_hThrower, и все нормально
Я не пойму, почему нельзя уже в функции OnEntityCreated узнать GetEntPropEnt(entity, Prop_Send, "m_hThrower") - в таком случае возвращается -1.
Итого вопрос - можно ли как-то в данном случае узнать игрока более оптимизированно, не создавая лишней функции и не создавая таймера, может есть какое-то другое свойство энтити, которое уже в основной функции позволяет узнать игрока?
 

GoDtm666

Участник
Сообщения
580
Реакции
589
Надеюсь вопросов не будет.
 

Вложения

  • grenade_trail.sp
    934 байт · Просмотры: 31

legend1998

Участник
Сообщения
286
Реакции
187
ilga80, StrEqual может возвращать только true или false. Оно не может быть равно 0, -1 или 1.
http://docs.sourcemod.net/api/index.php?fastload=show&id=618&

Пример:

PHP:
public Action:CommandSay(client, const String:command[], argc)   
{   
    decl String:commands[26]; 
    GetCmdArgString(commands, sizeof(commands)); 
    StripQuotes(commands); 
    TrimString(commands); 
     
    if ((StrEqual(commands, "kill", false))    ||  
        (StrEqual(commands, "!kill", false))    ||  
        (StrEqual(commands, "!килл", false))    || 
        (StrEqual(commands, "килл", false))) 
    {
 

legend1998

Участник
Сообщения
286
Реакции
187
legend1998, не работает регистр
Скорее всего нужно будет работать с Regex.
http://forums.alliedmods.net/showthread.php?t=55012
Т.к. ни разу не обращался с regex на sourcemod, ни чем помочь не могу.
Знаю только то, что нужно будет указать флаг PCRE_UTF8
 

dmitrij57

Участник
Сообщения
39
Реакции
2
Вот решил сделать плагин , чтоб после написание команды тебе показало Ip (Клиента). Что не так ? (Я новичок в этом деле))


PHP:
public Action:CommandSay(client, args) 
{ 
    decl String:ip[ 17 ];
    GetClientIP( id, ip, 16, 1 );
    PrintToChatAll( "ip = %s", ip );
    return Plugin_Handled; 
}
 

Impulse72

Участник
Сообщения
244
Реакции
163
Вот решил сделать плагин , чтоб после написание команды тебе показало Ip (Клиента). Что не так ? (Я новичок в этом деле))


PHP:
public Action:CommandSay(client, args) 
{ 
    decl String:ip[ 17 ];
    GetClientIP( id, ip, 16, 1 );
    PrintToChatAll( "ip = %s", ip );
    return Plugin_Handled; 
}

Прежде чем копировать куски кода из API надо в них разбираться.

Вот смотри. Ты используешь функцию GetClientIP. Смотрим список формальных аргументов функции.

client, String:ip[], maxlen, bool:remport=true
1. Клиент, ип которого надо получить. - целое число - int;
2. Куда мы будет записывать его. - строка - String;
3. Максимальная длина строки. - целое число не превышающее размер массива или наче будет выход за пределы.
4. Нужен ли нам удаленный порт клиента. - true если надо, false если не надо.

Рассмотрим фактические параметры. Всё верно кроме 1го. Посмотри ип какого клиента ты пытаешься получить - id. У тебя разве где-то объявлена такая переменная, которая содержит индекс? Нет, но зато у тебя есть client который мы получаем вместе с функцией CommandSay. Замени id на client. И еще у тебя ип этого человека будет писаться всему серверу. Если хочешь чтобы показывалось только человеку который ввел команду, вместо PrintToChatAll( "ip = %s", ip ); используй PrintToChat(client, "ip = %s", ip );
 

dmitrij57

Участник
Сообщения
39
Реакции
2
Что означает эта строка ? Всегда ли она нужна ? Что означает 17 ?
PHP:
 decl String:ip[ 17 ];
 

The End Is Near...

Russian Roulette
Сообщения
874
Реакции
691
dmitrij57
PHP:
#include <sourcemod>

public OnPluginStart() RegConsoleCmd("ip", Ip);

public Action:Ip(client, args)
{
	// Строка, для хранения ип адреса
	// [РАЗМЕР]
	decl String:ip[20];
	
	// Получаем IP Адрес
	GetClientIP(client, ip, sizeof(ip), true);
	PrintToChat(client, "Ваш IP адрес = %s", ip);
	return Plugin_Handled; 
}
 

Impulse72

Участник
Сообщения
244
Реакции
163
Что означает эта строка ? Всегда ли она нужна ? Что означает 17 ?
PHP:
 decl String:ip[ 17 ];

В функции GetClientIP нам нужно полученый ип куда-то разместить. А вот куда именно мы пишем во втором фактическом аргументе. Вот как раз "куда именно" мы должны создать. decl - программист решает, инициализировать переменную или нет. String - тип переменной. В данном случае нам нужна строка. ip - идентификатор массива. Заключенное в квадратные скобки число - размер массива. Иными словами кол-во ячеек и в конкретном случае кол-во символов, которые вместятся в этот массив.

Например.
decl String:my[3];
my[0] = "1";
my[1] = "2";
my[2] = 0;
0 - признак конца строки. В итоге строка которая у нас получится - "12".
 

dmitrij57

Участник
Сообщения
39
Реакции
2
Все спс. А вот если вместо ip на фраги
Вместо
PHP:
 GetClientIP(client, ip, sizeof(ip), true);
Вставлять эту ?
PHP:
 GetClientFrags(client);
Что-то я не понимаю (
 

KorDen

Atra esterní ono thelduin!
Сообщения
2,142
Реакции
1,424
Все спс. А вот если вместо ip на фраги
Вместо
PHP:
 GetClientIP(client, ip, sizeof(ip), true);
Вставлять эту ?
PHP:
 GetClientFrags(client);
Что-то я не понимаю (

Ну да, только тут не надо передавать переменную и ее размер, это требется только для строк (ну и для массивов), здесь нужно просто присваивать, то есть где-то так:
PHP:
new fr;
fr=GetClientFrags(client);
PrintToChat(client,"У вас %d убийств",fr);
В принципе на самом деле можно все уместить в одну строчку без создания новой переменной:
PHP:
PrintToChat(client,"У вас %d убийств", GetClientFrags(client));
Но лучше пока нет полного понимания, исползовать переменные.
 

Maelik

Участник
Сообщения
3
Реакции
0
Какая функция отвечает за размер в меню ?
 
Сообщения
2,587
Реакции
1,344
Maelik, Скажем условно - один символ кириллицы заменяет два символа на латинице, соответственно примерно в два раза короче получится текст вместить на русском.
 
Сверху Снизу