| 
				
				Удаление всего оружия, кроме гранат
				 |   |  
| 
OXIZ
 | 
Дата: Среда, 22.02.2012, 23:04:29 | Сообщение # 1 |  
  
  |  
Сообщений: 13
 
Репутация: 2 [ +/- ]
 |   
 | 
 как удалить у игроков из рук всё оружие включая нож (кроме гранат) ? 
 
 Сообщение отредактировал OXIZ - Среда, 22.02.2012, 23:04:51  | 
 
|   | 
 |    |  
| 
_wS_
 | 
Дата: Четверг, 23.02.2012, 03:56:56 | Сообщение # 2 |  
  
 | 
Код decl item;   for (new slot = 0; slot < 5; slot++)   {       if (slot != 3 && (item = GetPlayerWeaponSlot(client, slot)) > 0 && RemovePlayerItem(client, item))       {           AcceptEntityInput(item, "Kill");       }   }  
 | 
 
|   | 
 |    |  
| 
daniil
 | 
Дата: Суббота, 30.03.2013, 16:42:33 | Сообщение # 3 |  
  
  |  
Сообщений: 100
 
Репутация: 0 [ +/- ]
 |   
 | 
_wS_, правильно так?   Код    #include <sourcemod>   #include <sdktools_functions> 
   public OnPluginStart()   {    HookEvent("player_spawn", EventSpawn);   } 
   public Action:EventSpawn(Handle:event, const String:name[], bool:dontBroadcast)   {    new client = GetClientOfUserId(GetEventInt(event, "userid"));    decl index;     for (new slot = 0; slot < 5; slot++)     {       if (slot != 3 && (index = GetPlayerWeaponSlot(client, slot)) > 0)       {        RemovePlayerItem(client, index);       }     }   }     
 | 
 
|   | 
 |    |  
| 
TEIN
 | 
Дата: Суббота, 30.03.2013, 17:00:25 | Сообщение # 4 |  
  
  |  
Сообщений: 563
 
Репутация: 78 [ +/- ]
 |   
 | 
 Action не обязательна, а так, конечно 
 | 
 
|   | 
 |    |  
| 
_wS_
 | 
Дата: Суббота, 30.03.2013, 18:21:00 | Сообщение # 5 |  
  
 | 
Я подправил свой пост, только недавно узнал, что оказывается RemovePlayerItem на самом деле не удаляет оружие, а просто как-бы очищает слот, поэтому нужно еще сделать AcceptEntityInput(item, "Kill"), чтобы убить его (оружие). Странно вообще, судя по названию (RemovePlayerItem) оно должно и оружие удалять + никакой инфы об этом в API, на форуме SM где-то наткнулся, щас еще тестану чтобы убедиться. 
   -------   Тестанул, все так и есть.   А если сделать "Kill" без RemovePlayerItem, то игрок не сможет поднять оружие. 
 | 
 
|   | 
 |    |  
| 
MrGreen
 | 
Дата: Воскресенье, 22.08.2021, 10:53:18 | Сообщение # 6 |  
  
  |  
Сообщений: 21
 
Репутация: 0 [ +/- ]
 |   
 | 
 Здравствуйте! Подскажите, пожалуйста, если я хочу получить список гранат в 3-м слоте, как это правильно сделать? Если у меня скажем будет только граната и флешка, чтобы в чате вывело что граната и флешка. По слотам я понял как проходить, но не понял как проходить внутри слота если в нем не одно оружие. 
 
 Сообщение отредактировал MrGreen - Воскресенье, 22.08.2021, 11:04:18  | 
 
|   | 
 |    |  
| 
_wS_
 | 
Дата: Воскресенье, 22.08.2021, 11:19:43 | Сообщение # 7 |  
  
 | 
Можно получить список индексов оружия игрока. Получаешь название и сравниваешь.
 
 Код char className[32]; int entityMax = GetEntPropArraySize(client, Prop_Send, "m_hMyWeapons"); for (int i = 0, entity; i < entityMax; i++) {     // Возвращает -1, если оружия нет.     // То, которое есть - всегда вверху, так что если встретили -1, можно прервать цикл.     // m_hMyWeapons выдаёт только оружие, здесь нет набора сапера, брони и тд.          if ((entity = GetEntPropEnt(client, Prop_Send, "m_hMyWeapons", i)) <= MaxClients) {         break;     }          if (GetEntityClassname(entity, className, sizeof(className))) {         if (!strcmp(className, "weapon_flashbang")) {             // Есть флешка         }     } }  
 | 
 
|   | 
 |    |  
| 
MrGreen
 | 
Дата: Воскресенье, 22.08.2021, 13:12:14 | Сообщение # 8 |  
  
  |  
Сообщений: 21
 
Репутация: 0 [ +/- ]
 |   
 | 
Цитата _wS_ (  )   char className[32]; int entityMax = GetEntPropArraySize(client, Prop_Send, "m_hMyWeapons"); for (int i = 0, entity; i < entityMax; i++) { // Возвращает -1, если оружия нет. // То, которое есть - всегда вверху, так что если встретили -1, можно прервать цикл. // m_hMyWeapons выдаёт только оружие, здесь нет набора сапера, брони и тд.
  if ((entity = GetEntPropEnt(client, Prop_Send, "m_hMyWeapons", i)) <= MaxClients) { break; }
  if (GetEntityClassname(entity, className, sizeof(className))) { if (!strcmp(className, "weapon_flashbang")) { // Есть флешка } } } 
  Спасибо большое, разобрался. Появилось еще пар вопросов: 1. int entityMax = GetEntPropArraySize(client, Prop_Send, "m_hMyWeapons"); Что мы записываем в данную переменную, максимальное количество оружия, которое может взять игрок? 2. Попутный вопрос: (entity = GetEntPropEnt(client, Prop_Send, "m_hMyWeapons", i)) <= MaxClients; Почему мы здесь сравниваем именно с MaxClients, а не с MAXPLAYERS или любым другим числом? 
 
 Сообщение отредактировал MrGreen - Воскресенье, 22.08.2021, 13:13:27  | 
 
|   | 
 |    |  
| 
_wS_
 | 
Дата: Воскресенье, 22.08.2021, 13:58:45 | Сообщение # 9 |  
  
 | 
Цитата MrGreen (  )   1. int entityMax = GetEntPropArraySize(client, Prop_Send, "m_hMyWeapons"); Что мы записываем в данную переменную, максимальное количество оружия, которое может взять игрок? 
  m_hMyWeapons это таблица. В ней данные, вида:
 
 Цитата  Table: m_hMyWeapons (offset 1828) (type m_hMyWeapons) Member: 000 (offset 0) (type integer) (bits 21) (Unsigned) Member: 001 (offset 4) (type integer) (bits 21) (Unsigned) Member: 002 (offset 8) (type integer) (bits 21) (Unsigned) и тд  GetEntPropArraySize получает размер/кол-во таких данных. По логике это скорее всего как ты сказал, максимум оружия у игрока. Можно прописать в rcon консоль sm_dump_netprops netprops.txt Появится netprops.txt в папке cstrike или csgo и там вся эта m_hMyWeapons инфа.
 
 Цитата MrGreen (  )   2. Попутный вопрос: (entity = GetEntPropEnt(client, Prop_Send, "m_hMyWeapons", i)) <= MaxClients; Почему мы здесь сравниваем именно с MaxClients, а не с MAXPLAYERS или любым другим числом?  У меня отложилось, что индексы оружий/предметов и тд начинаются с 'x', где 'x' = кол-во слотов на сервере + 1. MAXPLAYERS это не фактическое кол-во слотов, а просто максимально возможное кол-во слотов (константа). Я здесь пишу MaxClients, т.к. не уверен что индексы предметов начинаются с "MAXPLAYERS + 1". Такое сравнение кнеш необязательно, зависит от стиля. Можно узнать что возвращается в случае неудачи (-1) и делать "!= -1" или "< 0" или "< 1" и тд. 
 | 
 
|   | 
 |    |  
| 
MrGreen
 | 
Дата: Понедельник, 23.08.2021, 13:41:57 | Сообщение # 10 |  
  
  |  
Сообщений: 21
 
Репутация: 0 [ +/- ]
 |   
 | 
 Спасибо большое, теперь все встало на свои места. 
 | 
 
|   | 
 |    |     
		
		
 
 |