Получение индекса оружия в 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_", а потом объединять. Спасибо, теперь буду знать :)
|
|
| |
|