Безопасное удаление оружия у игрока

Различные модификации, скрипты, плагины, модели, спрайты и прочее для SRCDS
Правила форума
В разделе запрещяется создавать посты которые явно не относятся к тематике раздела. Модераторы вправе удалять такие топики без разъяснения причин.
Ответить
Аватара пользователя
*** ROOT ***
Администратор
Администратор
Сообщения: 96
Зарегистрирован: 02 дек 2014, 12:38
Откуда: Шелехов
Возраст: 29
Контактная информация:
Статус: Не в сети

Безопасное удаление оружия у игрока

Сообщение *** ROOT *** » 12 июн 2017, 15:18

При написании плагинов, периодически, мы сталкиваемся с необходимостью удалить оружие у игрока. Мы забываем о необходимых особенностях движка используя эти стандартные методы. Зачастую просто из за незнания не проводим необходимые проверки. Данный скрипт поможет избежать множество проблем с удаление оружия на стороне клиента. Существует 2 формы использования. Прямое указание выполнения функции и через RequestFrame();

Скриншот №1


// удалить пистолет, в следующем (фрейме)тике сервера.
RequestFrame(view_as<RequestFrameCallback>(Kill_Pistol), client);

// Удалить пистолет, без указания id самого пистолета
Kill_Pistol(client);

// Удалить пистолет, с указанием его id
Kill_Pistol(client, iPistol);

  1. Kill_Pistol(int client, int wep = -1)
  2. {
  3.     #define PISTOL 1
  4.     if(IsValidPlayer(client))
  5.     {
  6.         if(!Weapon_IsValid(wep))
  7.             wep = GetPlayerWeaponSlot( client, PISTOL );
  8.        
  9.         if(Weapon_IsValid(wep))
  10.         {
  11.             if(RemovePlayerItem(client, wep))
  12.                 AcceptEntityInput( wep, "Kill" );
  13.             else
  14.             {
  15.                 SDKHooks_DropWeapon(client, wep);
  16.                
  17.                 if(IsValidEntity(wep))
  18.                     AcceptEntityInput( wep, "Kill" );
  19.         }
  20.     }
  21. }
Данный код для тех кому нужны всевозможные проверки. Является самым безопасным методом для удаления оружия у игрока. На данный момент для меня.

  1. RemoveWeaponFromPlayer(int client, char[] classname = "", int iSlot = 0)
  2. {
  3.     char wpn_name[128], classname2[128]; int curweapon = GetPlayerWeaponSlot( client, iSlot ), weapon;
  4.    
  5.     if( (StrContains(classname, "cz75a", false) != -1) || (StrContains(classname, "p250", false) != -1) )
  6.         Format(classname2, sizeof classname2, "%s", "p250");
  7.    
  8.     else if( (StrContains(classname, "usp_silencer", false) != -1) || (StrContains(classname, "hkp2000", false) != -1))
  9.         Format(classname2, sizeof classname2, "%s", "hkp2000");
  10.    
  11.     else if( (StrContains(classname, "revolver", false) != -1) || (StrContains(classname, "deagle", false) != -1))
  12.         Format(classname2, sizeof classname2, "%s", "deagle");
  13.    
  14.     else if( (StrContains(classname, "m4a1_silencer", false) != -1) || (StrContains(classname, "m4a1", false) != -1) )
  15.         Format(classname2, sizeof classname2, "%s", "m4a1");
  16.    
  17.     else
  18.         Format(classname2, sizeof classname2, "%s", classname);
  19.    
  20.     for(int i = 0; i < 128; i += 4)
  21.     {
  22.         weapon = GetEntDataEnt2(client, m_hMyWeapons + i);
  23.        
  24.         if(Weapon_IsValid(weapon))
  25.         {
  26.             Entity_GetClassName( weapon, wpn_name, sizeof( wpn_name ) );
  27.            
  28.             if( (StrContains(wpn_name, classname2, false) != -1) || StrEqual(wpn_name, classname2, false) )
  29.             {
  30.                 if(weapon == curweapon)
  31.                 {
  32.                     if(Weapon_IsValid(wep))
  33.                     {
  34.                         if(RemovePlayerItem(client, wep))
  35.                             AcceptEntityInput( wep, "Kill" );
  36.                    
  37.                         else
  38.                         {
  39.                             SDKHooks_DropWeapon(client, wep);
  40.                            
  41.                             if(IsValidEntity(wep))
  42.                                 AcceptEntityInput( wep, "Kill" );
  43.                         }
  44.                     }
  45.                 }
  46.             }
  47.         }
  48.     }
  49. }



Ответить