Удаление всего оружия, кроме гранат
| |
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 [ +/- ]
|
|
Спасибо большое, теперь все встало на свои места.
|
|
| |
|