Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

  • Страница 1 из 2
  • 1
  • 2
  • »
Получение индекса оружия в EventPlayerHurt
Loco Дата: Понедельник, 03.11.2014, 23:22:35 | Сообщение # 1
Сообщений: 42
Репутация: 0 [ +/- ]
Здравствуйте!

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

Заранее спасибо!
 
BarD Дата: Вторник, 04.11.2014, 05:22:31 | Сообщение # 2
Сообщений: 943
Репутация: 137 [ +/- ]
Я думаю, что так:
Код

#include <sdktools>

public Action:EventPlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)
{
new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));// Получаем индекс атакующего
new String:eventweap[40], index, String:weap[40];
GetEventString(event, "weapon", eventweap, sizeof(eventweap));// и название его ствола
Format(eventweap, sizeof(eventweap), "weapon_%s", eventweap);// немного корректируем, т.к. выдаёт название без
// "weapon_". Например, ранили с usp. Выдаст "usp", а нам надо "weaрon_usp". Вроде бы так. Если что, уберешь эту
// строчку.     
for (new i=0;i<=2;i++) // Далее делаем цикл по всем оружиям игрока.
{
index = GetPlayerWeaponSlot(attacker, i);// получаем каждый индекс оружия во всех слотах атакующего
if (index > 0 && (GetEntityClassname(index, weap, sizeof(weap))) && StrEqual(eventweap, weap)) break;
}// Если оружие есть в слоте (не -1), то берем его classname (weapon_имя), и если оно совпадает с нашим
PrintToChatAll("Индекс оружия: %d", index);// выводим его. Твой индекс в переменной index. Пользуйся на здоровье.
}


Удачи в обучении!
P.S. Если работать не будет, попробуй убрать строчку с Format. Я просто не помню, что он выдаёт)


Сообщение отредактировал BarD - Вторник, 04.11.2014, 10:34:41
 
king(rus) Дата: Вторник, 04.11.2014, 06:24:27 | Сообщение # 3
Сообщений: 109
Репутация: 2 [ +/- ]
Ужасный код.
 
BarD Дата: Вторник, 04.11.2014, 07:38:50 | Сообщение # 4
Сообщений: 943
Репутация: 137 [ +/- ]
Чем он тебе не нравится? Убери комментарии и норм будет. С телефона пишу, тут немного криво, поэтому и так.

Добавлено (04.11.2014, 07:38:50)
---------------------------------------------
Специально для тебя убрал комментарии.

Код
#include <sdktools>    

public Action:EventPlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)    
{    
new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
new String:eventweap[40], index, String:weap[40];    
GetEventString(event, "weapon", eventweap, sizeof(eventweap));
Format(eventweap, sizeof(eventweap), "weapon_%s", eventweap);
for (new i=0;i<=2;i++)
{    
index = GetPlayerWeaponSlot(attacker, i);
if (index > 0 && (GetEntityClassname(index, weap, sizeof(weap))) && StrEqual(eventweap, weap)) break;    
}
PrintToChatAll("Индекс оружия: %d", index);
}


Сообщение отредактировал BarD - Вторник, 04.11.2014, 10:34:20
 
king(rus) Дата: Вторник, 04.11.2014, 09:56:06 | Сообщение # 5
Сообщений: 109
Репутация: 2 [ +/- ]
Цитата BarD ()
Чем он тебе не нравится? Убери комментарии и норм будет. С телефона пишу, тут немного криво, поэтому и так.

Добавлено (04.11.2014, 07:38:50)
---------------------------------------------
Специально для тебя убрал комментарии.

Код
#include <sdktools>   

public Action:EventPlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)   
{   
new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
new String:eventweap[40], index, String:weap[40];   
GetEventString(event, "weapon", eventweap, sizeof(eventweap));
Format(eventweap, sizeof(eventweap), "weapon_%s", eventweap);
for (new i=0;i<=3;i++)
{   
index = GetPlayerWeaponSlot(attacker, i);
if (index > 0 && (GetEntityClassname(index, weap, sizeof(weap))) && StrEqual(eventweap, weap)) break;   
}
PrintToChatAll("Индекс оружия: %d", index);
}



Дело не в этом. Код сам по себе ужасен по оптимизации. Не хорошо делать через Fromat, для этого есть специальный сток StrCat();
И лучше делать не new, а decl, а вот index new. И цикл бредовый.
 
BarD Дата: Вторник, 04.11.2014, 10:33:59 | Сообщение # 6
Сообщений: 943
Репутация: 137 [ +/- ]
Цитата king(rus) ()
Не хорошо делать через Fromat, для этого есть специальный сток StrCat();

StrCat() никогда не использовал, да и не слышал о таком. В Format никаких лагов , багов и прочего не замечал.

Цитата king(rus) ()
И лучше делать не new, а decl

Чем же? decl лучше делать в событиях, которые ОЧЕНЬ часто случаются. Например, OnGameFrame или OnPlayerRunCmd. Да и строки, объявляемые с помощью decl надо "зачищать". А player_hurt вызывается не настолько часто, чтобы это имело какое-то великое значение.

Цитата king(rus) ()
И цикл бредовый.

Чем же он бредовый? Проверяется каждое оружие от основного до гранаты. Бомбой же ты не ударишь! Но, с гранатами отдельный случай. Пожалуй, их можно вычеркнуть.

Чем чужие вариации решений обсуждать, лучше бы свой вариант предложил. Заодно бы показал, как "правильно".


Сообщение отредактировал BarD - Вторник, 04.11.2014, 10:37:32
 
king(rus) Дата: Вторник, 04.11.2014, 12:37:34 | Сообщение # 7
Сообщений: 109
Репутация: 2 [ +/- ]
Вот так:
Код
#include <sdktools_functions>
public OnPluginStart() HookEvent("player_hurt", Ev_PlayerHurt);

public Ev_PlayerHurt(Handle:event, const String:name[], bool:dontBroadcast) {
  new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
  if (attacker > 0 && attacker <= MaxClients && attacker != GetClientOfUserId(GetEventInt(event, "userid")))
  {
   decl String:Weapon[32];
   GetEventString(event, "weapon", Weapon, sizeof(Weapon));
   SearchWeapon(Weapon, attacker);
  }
}

stock SearchWeapon(String:Weapon[], attacker) {
  new String:WeaponAttack[32] = "weapon_";
  StrCat(WeaponAttack, sizeof(WeaponAttack), Weapon);
  decl String:WeaponAttacker[32];
  for (new i = 0; i <= 3; i++) {
   new SearchWeaponIndex = GetPlayerWeaponSlot(attacker, i);
   if (SearchWeaponIndex != -1) {
    GetEntityClassname(SearchWeaponIndex, WeaponAttacker, sizeof(WeaponAttacker));
    if (StrEqual(WeaponAttacker, WeaponAttack)) {
     PrintToChatAll("\x04[Проверка] \x01Индекс оружия: %d, его название %s", SearchWeaponIndex, WeaponAttacker);
     break;
    }
   }
  }
}
 
BarD Дата: Вторник, 04.11.2014, 13:05:43 | Сообщение # 8
Сообщений: 943
Репутация: 137 [ +/- ]
Ну, то же самое, только StrCat. Не так уж и оптимизировал. Проверок я не делал, т.к. писал с телефона (это тяжело). Думаю, он сам догадался бы.

P.S. Про функцию StrCat прежде не слышал. Спасибо.


Сообщение отредактировал BarD - Вторник, 04.11.2014, 13:07:39
 
king(rus) Дата: Вторник, 04.11.2014, 13:06:43 | Сообщение # 9
Сообщений: 109
Репутация: 2 [ +/- ]
Цитата BarD ()
Ну, то же самое, только StrCat. Не так уж и оптимизировал.

Ахах, шутка? У тебя даже проверок не было, при пистолете, сразу бы получил еррор. умник. И это не всё.
 
BarD Дата: Вторник, 04.11.2014, 13:08:59 | Сообщение # 10
Сообщений: 943
Репутация: 137 [ +/- ]
Цитата king(rus) ()
при пистолете, сразу бы получил еррор

Почему же? Он бы нашел пистолет во 2 слоте. Про проверки я выше написал. Будь добр, прочитай, пожалуйста.
 
king(rus) Дата: Вторник, 04.11.2014, 13:29:01 | Сообщение # 11
Сообщений: 109
Репутация: 2 [ +/- ]
Цитата BarD ()
Почему же? Он бы нашел пистолет во 2 слоте. Про проверки я выше написал. Будь добр, прочитай, пожалуйста.


Нет, ты начинаешь цикл с 0, 0 = автомат, если у меня нету автомата, мне выдаст -1, а ты не проверяешь оружие на -1 и получаешь еррор)
 
BarD Дата: Вторник, 04.11.2014, 13:50:24 | Сообщение # 12
Сообщений: 943
Репутация: 137 [ +/- ]
Цитата BarD ()
if (index > 0

Эта проверка тебе о чем-нибудь говорит?
 
king(rus) Дата: Вторник, 04.11.2014, 13:57:15 | Сообщение # 13
Сообщений: 109
Репутация: 2 [ +/- ]
Цитата BarD ()
Эта проверка тебе о чем-нибудь говорит?

Ахах, извини, не увидел, но всё же, ошибки есть.

Добавлено (04.11.2014, 13:57:15)
---------------------------------------------

Цитата Loco ()
Здравствуйте!

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

Заранее спасибо!


Тебе нужен именно выстрел?
 
Sallcom Дата: Вторник, 04.11.2014, 14:22:22 | Сообщение # 14
Сообщений: 205
Репутация: 31 [ +/- ]
Цитата king(rus) ()
Тебе нужен именно выстрел?

Нет, ему нужно попадание именно в другого игрока.

Цитата king(rus) ()
Код сам по себе ужасен по оптимизации.

То есть по-твоему деление одного действия на 2 блока, это оптимизация? Ну да, этот только эстетический красиво, а на деле, ты используешь еще 2 лишние переменные.

strcat(...) - Объединяет одну строку в другую, без возможности форматирования.
Format(...) - Форматирует строку, по правилам SM.

strcat(sNew, 32, sOld) = Format(sNew, 32, sOld)

И по-этому выгодней использовать Format, так как не нужно создавать новую строку, в которой уже написано "weapon_", а потом объединять.

В итоге:
Код

#include <sourcemod>
#include <sdktools>       

public OnPluginStart(){
     HookEvent("player_hurt", Event_PlayerHurt);
}

public Event_PlayerHurt(Handle:event, String:name[], bool:dontBroadcast){  
     new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));  
     if(0 < attacker <= MaxClients && attacker != GetClientOfUserId(GetEventInt(event, "userid"))) {  
         decl String:sWeaponName[32], String:sClassName[32], index;  
         GetEventString(event, "weapon", sWeaponName, 32);
         Format(sWeaponName, 32, "weapon_%s", sWeaponName);

         for(new i = 0; i < 4; i++){
             if((index = GetPlayerWeaponSlot(attacker, i)) != -1){
                 GetEntityClassname(index, sClassName, 32);
                 if(StrEqual(sWeaponName, sClassName)){
                     PrintToChatAll("sWeaponName(%i) = '%s'", index, sWeaponName);
                     break;
                 }
             }
         }
     }
}  


Сообщение отредактировал Sallcom - Вторник, 04.11.2014, 14:28:26
 
BarD Дата: Вторник, 04.11.2014, 14:43:29 | Сообщение # 15
Сообщений: 943
Репутация: 137 [ +/- ]
Цитата king(rus) ()
ошибки есть.

Ошибок нет.

Цитата Sallcom ()
В итоге:
Код

#include <sourcemod>
#include <sdktools>       

public OnPluginStart(){
     HookEvent("player_hurt", Event_PlayerHurt);
}

public Event_PlayerHurt(Handle:event, String:name[], bool:dontBroadcast){  
     new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));  
     if(0 < attacker <= MaxClients && attacker != GetClientOfUserId(GetEventInt(event, "userid"))) {  
         decl String:sWeaponName[32], String:sClassName[32], index;  
         GetEventString(event, "weapon", sWeaponName, 32);
         Format(sWeaponName, 32, "weapon_%s", sWeaponName);

         for(new i = 0; i < 4; i++){
             if((index = GetPlayerWeaponSlot(attacker, i)) != -1){
                 GetEntityClassname(index, sClassName, 32);
                 if(StrEqual(sWeaponName, sClassName)){
                     PrintToChatAll("sWeaponName(%i) = '%s'", index, sWeaponName);
                     break;
                 }
             }
         }
     }
}


Такой же, практически, код, как и мой) Я с тобой согласен.

Цитата Sallcom ()
И по-этому выгодней использовать Format, так как не нужно создавать новую строку, в которой уже написано "weapon_", а потом объединять.

Спасибо, теперь буду знать :)
 
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск: