Заказать игровой сервер Контакты (заказать плагин/исправить ошибки/другое) Пожертвовать Поиск

[ вход ]
[ последние сообщения ]

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