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