Проверенный
Пользователь
- Сообщения
- 1,032
- Реакции
- 828
- Помог
- 10 раз(а)
Тема создана для тестирования хуков и нативов, а так же для будущих заметок
На текущий момент/задачу мне было необходимо узнать порядок вызовов следующих хуков в разных условиях.
И соответствующие логические нативы к нему.
Вопросы, памятки, замечания, баги.
В
При
При
Во всех трех pre-хуках выше возвращаемое значение получить невозможно, оно еще не присвоено, поэтому будет выбивать ошибку:
Попытки выбросить гранаты или нож клиентской командой:
При броске комплекта гранат, если в инвентаре больше 1, например:
Параметр
Обратим внимание, что pre-хук
Дефуз выбросился при смерти игрока, но никакие хуки не вызвались, может так и надо?
При
Натив
Очищает предметы, но зачем запас патронов, кто его просил? Не хватает булевой:
Возвращает всегда true даже при отсутствие пушек, так надо? Может лучше false при отсутствие пушек в слоте?
Натив
При
При ремуве щита, дефуза он удалился, но никаких хуков не было вызвано, так надо?
Натив
Никаких хуков не вызывается, забыли пробросить remove_all_items, кто исправит?
Натив
Возвращает всегда true даже при отсутствие пушек, так надо? Может лучше false при отсутствие пушек в слоте?
Ножик и гранаты не выбрасывает, но хуки вызываются. Все нормально, возвращаемые энтити при этому будут не валидны.
Натив
Возвращает всегда true даже при отсутствие пушки в инвентаре, так надо? Может лучше false при отсутствие пушки в инвентаре?
Ножик и гранаты не выбрасывает, но хуки вызываются. Все нормально, возвращаемые энтити при этому будут не валидны.
При отсутствие пушки в инвентаре, хуки вызываются. Все нормально, возвращаемые энтити при этому будут не валидны.
Щит, дефуз не выбрасывается, а при
Примеры вызовов и их последовательность
Попытки выбросить гранаты клиентской командой drop, клавиша: G
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 155 | item_name: weapon_hegrenade
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: -1 | ent: -1 | item_name:
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 156 | item_name: weapon_flashbang
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: -1 | ent: -1 | item_name:
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 157 | item_name: weapon_smokegrenade
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: -1 | ent: -1 | item_name:
Гранаты не выбросились, по дефолтному поведению самостоятельно выбросить гранаты мы не можем
Тем не менее хуки дропа прилетели.
Попытки выбросить нож привели к такому же результату
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 153 | item_name: weapon_knife
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: -1 | ent: -1 | item_name:
----------------------------------------------------------------------
Моменты броска гранат: ЛКМ
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 155 | item_name: weapon_hegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 155 | item_name: weapon_hegrenade | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 156 | item_name: weapon_flashbang | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 156 | item_name: weapon_flashbang | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 157 | item_name: weapon_smokegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 157 | item_name: weapon_smokegrenade | return: 1
Если в инвентаре больше 1
----------------------------------------------------------------------
Попытка выбросить пачку клиентской командой drop, клавиша: G
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 158 | item_name: weapon_c4
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 158 | item_name: weapon_c4 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 158 | item_name: weapon_c4 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: 159 | ent: 158 | item_name: weapon_c4
Параметр
Однако
Если необходимо получить имя предмета при клиентском дропе, можно работать с
----------------------------------------------------------------------
Момент установки пачки
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 158 | item_name: weapon_c4 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 158 | item_name: weapon_c4 | return: 1
----------------------------------------------------------------------
Попытка выбросить щит клиентской командой drop, клавиша: G
RG_CBasePlayer_DropShield_Pre - this: 11 | deploy: 1 | ent: -1 | class_name:
RG_CBasePlayer_DropShield_Post - this: 11 | deploy: 1 | ent: 158 | class_name: weapon_shield
Щит выбросился, все отлично, но в pre-хуке мы не можем получить энтити щита, так-как щит не имеет его пока в руках, лишь установленный мембер о наличии щита, энтитей он становится, когда выброситься на землю. Щит так же не находится в инвентаре игрока, это не оружие, просто хрень какая то )
----------------------------------------------------------------------
Момент смерти игрока(убийство, самоубийство, clcmd_kill)
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 157 | item_name: weapon_smokegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 157 | item_name: weapon_smokegrenade | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 156 | item_name: weapon_flashbang | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 156 | item_name: weapon_flashbang | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 155 | item_name: weapon_hegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 155 | item_name: weapon_hegrenade | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 176 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 176 | item_name: weapon_m4a1 | return: 1
Гранаты выкидываются если значений
Выбрасывается только лучшие/тяжелое оружие, или же зависит от значения
Дефуз выбросился, но хук не вызывался, может так и надо?))
Заметим, что хук
Момент смерти игрока если в руках щит
RG_CBasePlayer_DropShield_Pre - this: 11 | deploy: 1 | ent: -1 | class_name:
RG_CBasePlayer_DropShield_Post - this: 11 | deploy: 1 | ent: 193 | class_name: weapon_shield
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 157 | item_name: weapon_smokegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 157 | item_name: weapon_smokegrenade | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 156 | item_name: weapon_flashbang | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 156 | item_name: weapon_flashbang | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 155 | item_name: weapon_hegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 155 | item_name: weapon_hegrenade | return: 1
Заметим, что выбросился только щит, пистолет не выбросился, по всей видимости щит имеет большей вес(лучше) чем пистолет
Зависит от значения
----------------------------------------------------------------------
Попытка выбросить любой доступный предмет клиентской командой drop, клавиша: G
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 158 | item_name: weapon_m4a1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 158 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 158 | item_name: weapon_m4a1 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: 159 | ent: 158 | item_name: weapon_m4a1
Обратим внимание, что pre-хук дропа прилетает раньше pre-хука ремува, а в post-хуках наоборот. Румуве вызывается из дропа.
Теперь проверим если в инвентаре в первом слоте две разные пушки, выбросим по очереди
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 158 | item_name: weapon_m4a1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 158 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 158 | item_name: weapon_m4a1 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: 154 | ent: 158 | item_name: weapon_m4a1
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 153 | item_name: weapon_m249
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 153 | item_name: weapon_m249 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 153 | item_name: weapon_m249 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: 161 | ent: 153 | item_name: weapon_m249
Все отлично, казусов не случилось )
----------------------------------------------------------------------
Момент sv_restart 1
Раунд начинается сначала, удаляются все предметы, затем выдается стандартный набор
Никаких хуков не было вызвано, так-как забыли пробросить remove_all_items
----------------------------------------------------------------------
Момент выхода игрока
Удаляются все предметы, выполняется remove_all_items
Никаких хуков не было вызвано, так-как забыли пробросить remove_all_items
Примеры вызовов и их последовательность с помощью нативов
Выполним rg_remove_items_by_slot(user, PRIMARY_WEAPON_SLOT);
В наличии, в первом слоте была одна пушка: weapon_m4a1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 158 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 158 | item_name: weapon_m4a1 | return: 1
Удалил weapon_m4a1 и все его запасные патроны
В наличии, в первом слоте были две пушки: weapon_m4a1, weapon_m249
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 156 | item_name: weapon_m249 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 156 | item_name: weapon_m249 | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 155 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 155 | item_name: weapon_m4a1 | return: 1
Удалил обе пушки и все запасные патроны от этих двух пушек
Если были запасные патроны от пушек которых не было в первом слоте в момент удаления, то запас не трогается
Аналогичное поведение для PISTOL_SLOT, KNIFE_SLOT, GRENADE_SLOT, C4_SLOT
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 154 | item_name: weapon_usp | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 154 | item_name: weapon_usp | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 153 | item_name: weapon_knife | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 153 | item_name: weapon_knife | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 199 | item_name: weapon_smokegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 199 | item_name: weapon_smokegrenade | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 198 | item_name: weapon_flashbang | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 198 | item_name: weapon_flashbang | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 197 | item_name: weapon_hegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 197 | item_name: weapon_hegrenade | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 158 | item_name: weapon_c4 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 158 | item_name: weapon_c4 | return: 1
Нож, гранаты удалятся, хоть и выбросить клиентской командой drop мы не можем
Напоминаю, что гранаты удалятся все, включая их запас.
При отсутствие пушек в каком либо слоте вызов хуков не произойдет, запасные патроны не удаляются
rg_remove_items_by_slot возвращает true даже при отсутствие пушек
Обратите внимание на порядок удаления слота гранат, порядок отличается от того, что мы видим в клиенте, где список, порядок?
----------------------------------------------------------------------
Выполним rg_remove_item(user, "weapon_m4a1", .removeAmmo = true);
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return: 1
rg_remove_item - result: 1
Удаляет пушку и все его запасные патроны, если removeAmmo = false, то запасные патроны не удаляются
При отсутствие предмета rg_remove_item вернет 0, запасные патроны остаются, хуки не вызываются
Выполним rg_remove_item(user, "weapon_hegrenade", .removeAmmo = false);
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 197 | item_name: weapon_hegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 197 | item_name: weapon_hegrenade | return: 1
В руках была 1 граната, она удалилась, но купить новую не могу, пишет, что у меня уже полный запас гранат, но фактически ее нету в слоте
Такой казус исправляет removeAmmo = true, который удалит весь запас гранат
Нож, гранаты удалятся, хоть и выбросить клиентской командой drop мы не можем
Выполним rg_remove_item(user, "weapon_shield", .removeAmmo = true);
rg_remove_item - result: 1
При ремуве щита он удалился, но никаких хуков не было вызвано, так надо?)
----------------------------------------------------------------------
Выполним rg_remove_all_items(user, .removeSuit = false);
rg_remove_all_items - result: 1
Никаких хуков не вызывается, забыли пробросить
Удаляется все что есть у игрока и весь его запас
rg_remove_all_items возвращает true даже при отсутствие пушек
Выполним rg_remove_all_items(user, .removeSuit = true);
rg_remove_all_items - result: 1
Делает то же самое что и выше за исключением того, что убирает еще бит WEAPON_SUIT у var_weapons, костюм H.E.V. Mark IV
Это приводит к тому, что на экране клиента пропадают худы/иконки с жизнью, броней
Клиент по var_weapons WEAPON_SUIT рисует эти иконки, так называемый костюм, который в HL, зачем это в CS не разобрался
Что бы вернуть наши иконки оно же костюм
----------------------------------------------------------------------
Выполним rg_drop_items_by_slot(user, PRIMARY_WEAPON_SLOT);
В наличии, в первом слоте была одна пушка: weapon_m4a1
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_m4a1 | weaponbox: | ent: 153 | item_name: weapon_m4a1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_m4a1 | weaponbox: 154 | ent: 153 | item_name: weapon_m4a1
rg_drop_items_by_slot - result: 1
Выбросил предмет, при этом заметим, что pszItemName у нас не пустой, а имеет имя предмета, в отличии от клиентского drop
Запасные патроны никуда не делись, фух )
При отсутствие пушек в каком либо слоте вызов хуков не произойдет
rg_drop_items_by_slot возвращает true даже при отсутствие пушек
В наличии, в первом слоте были две пушки: weapon_m4a1, weapon_m249
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_m249 | weaponbox: | ent: 156 | item_name: weapon_m249
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 156 | item_name: weapon_m249 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 156 | item_name: weapon_m249 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_m249 | weaponbox: 157 | ent: 156 | item_name: weapon_m249
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_m4a1 | weaponbox: | ent: 153 | item_name: weapon_m4a1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_m4a1 | weaponbox: 158 | ent: 153 | item_name: weapon_m4a1
Выполним rg_drop_items_by_slot(user, KNIFE_SLOT);
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_knife | weaponbox: | ent: 194 | item_name: weapon_knife
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_knife | weaponbox: -1 | ent: -1 | item_name:
Ножик не выбросился, так-как его нельзя выбросить, как и клиентским drop, тем не менее хук вызвался
Выполним rg_drop_items_by_slot(user, GRENADE_SLOT);
В запасе было по 3 шт. каждой из гранат
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_smokegrenade | weaponbox: | ent: 157 | item_name: weapon_smokegrenade
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_smokegrenade | weaponbox: -1 | ent: -1 | item_name:
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_flashbang | weaponbox: | ent: 156 | item_name: weapon_flashbang
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_flashbang | weaponbox: -1 | ent: -1 | item_name:
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_hegrenade | weaponbox: | ent: 155 | item_name: weapon_hegrenade
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_hegrenade | weaponbox: -1 | ent: -1 | item_name:
Гранаты не выбросились, так-как их нельзя выбросить, как и клиентским drop, тем не менее хуки вызвались
Выполним rg_drop_items_by_slot(user, C4_SLOT);
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_c4 | weaponbox: | ent: 159 | item_name: weapon_c4
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 159 | item_name: weapon_c4 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 159 | item_name: weapon_c4 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_c4 | weaponbox: 160 | ent: 159 | item_name: weapon_c4
----------------------------------------------------------------------
Выполним rg_drop_item(user, "weapon_m4a1");
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_m4a1 | weaponbox: | ent: 153 | item_name: weapon_m4a1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_m4a1 | weaponbox: 154 | ent: 153 | item_name: weapon_m4a1
rg_drop_item - result: 1
Выбросил предмет, при этом заметим, что pszItemName у нас не пустой, а имеет имя предмета, в отличии от клиентского drop
rg_drop_item возвращает true даже при отсутствие пушек в инвентаре
Запасные патроны никуда не делись, фух )
Выполним rg_drop_item(user, "weapon_m4a1");
При условии, что у нас нету такой пушки в инвентаре
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_m4a1 | weaponbox: | ent: -1 | item_name:
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_m4a1 | weaponbox: -1 | ent: -1 | item_name:
Выполним rg_drop_item(user, "weapon_knife");
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_knife | weaponbox: | ent: 194 | item_name: weapon_knife
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_knife | weaponbox: -1 | ent: -1 | item_name:
Ножик не выбросился, так-как его нельзя выбросить, как и клиентским drop, тем не менее хук вызвался
Выполним rg_drop_item(user, "weapon_hegrenade");
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_hegrenade | weaponbox: | ent: 155 | item_name: weapon_hegrenade
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_hegrenade | weaponbox: -1 | ent: -1 | item_name:
Граната не выбросилась, так-как ее нельзя выбросить, как и клиентским drop, тем не менее хук вызвался
Выполним rg_drop_item(user, "weapon_c4");
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_c4 | weaponbox: | ent: 153 | item_name: weapon_c4
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 153 | item_name: weapon_c4 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 153 | item_name: weapon_c4 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_c4 | weaponbox: 154 | ent: 153 | item_name: weapon_c4
Выполним rg_drop_item(user, "weapon_shield");
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_shield | weaponbox: | ent: -1 | item_name:
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_shield | weaponbox: -1 | ent: -1 | item_name:
Щит не выбросился, но хук вызвался
На текущий момент/задачу мне было необходимо узнать порядок вызовов следующих хуков в разных условиях.
RG_CBasePlayer_RemovePlayerItem
RG_CBasePlayer_DropPlayerItem
RG_CBasePlayer_DropShield
И соответствующие логические нативы к нему.
rg_remove_items_by_slot
rg_remove_item
rg_remove_all_items
rg_drop_items_by_slot
rg_drop_item
Описание: Вызывается, когда из инвентаря игрока удаляется предмет
Возвращает: BOOL
Параметры: (const this, const pItem)
Описание: Вызывается, когда из инвентаря игрока предмет падает на землю
Возвращает: WeaponBox Entity index of item
Параметры: (const this, const pszItemName[])
Описание: Вызывается, когда игрок бросает щит на землю
Возвращает: Entity index of item
Параметры: (const this, bool:deploy)
Описание: Удаляет все предметы и запас игрока в определенном слоте
Параметр: index - Индекс клиента/игрока
Параметр: slot - Слот, который будет очищен
Возвращает: 1 в случае успеха, 0 в противном случае
Описание: Удаляет указанное имя класса предмета у клиента/игрока
Параметр: index - Индекс клиента/игрока
Параметр: item_name - Имя класса элемента
Параметр: removeAmmo - Удаляет боеприпасы/запас у клиента/игрока
Возвращает: 1, если найдено и удалено, 0 в противном случае
Описание: Удаялет все предметы у клиента/игрока и его запас
Параметр: index - Индекс клиента/игрока
Параметр: removeSuit - Удаляет костюм у клиента/игрока
Возвращает: 1 в случае успеха, 0 в противном случае
Описание: Выбрасывает на пол все предметы игрока в определенном слоте
Параметр: index - Индекс клиента/игрока
Параметр: slot - Слот, для выброса каждого предмета
Возвращает: 1 в случае успеха, 0 в противном случае
Описание: Выбрасывает на пол указанное имя класса предмета у клиента/игрока
Параметр: index - Индекс клиента/игрока
Параметр: item_name - Имя класса элемента
Возвращает: 1 в случае успеха, 0 в противном случае
Возвращает: BOOL
Параметры: (const this, const pItem)
RG_CBasePlayer_RemovePlayerItem
Описание: Вызывается, когда из инвентаря игрока предмет падает на землю
Возвращает: WeaponBox Entity index of item
Параметры: (const this, const pszItemName[])
RG_CBasePlayer_DropPlayerItem
Описание: Вызывается, когда игрок бросает щит на землю
Возвращает: Entity index of item
Параметры: (const this, bool:deploy)
RG_CBasePlayer_DropShield
Описание: Удаляет все предметы и запас игрока в определенном слоте
Параметр: index - Индекс клиента/игрока
Параметр: slot - Слот, который будет очищен
Возвращает: 1 в случае успеха, 0 в противном случае
native rg_remove_items_by_slot(const index, const InventorySlotType:slot)
Описание: Удаляет указанное имя класса предмета у клиента/игрока
Параметр: index - Индекс клиента/игрока
Параметр: item_name - Имя класса элемента
Параметр: removeAmmo - Удаляет боеприпасы/запас у клиента/игрока
Возвращает: 1, если найдено и удалено, 0 в противном случае
native rg_remove_item(const index, const item_name[], const bool:removeAmmo = false)
Описание: Удаялет все предметы у клиента/игрока и его запас
Параметр: index - Индекс клиента/игрока
Параметр: removeSuit - Удаляет костюм у клиента/игрока
Возвращает: 1 в случае успеха, 0 в противном случае
native rg_remove_all_items(const index, const bool:removeSuit = false)
Описание: Выбрасывает на пол все предметы игрока в определенном слоте
Параметр: index - Индекс клиента/игрока
Параметр: slot - Слот, для выброса каждого предмета
Возвращает: 1 в случае успеха, 0 в противном случае
native rg_drop_items_by_slot(const index, const InventorySlotType:slot)
Описание: Выбрасывает на пол указанное имя класса предмета у клиента/игрока
Параметр: index - Индекс клиента/игрока
Параметр: item_name - Имя класса элемента
Возвращает: 1 в случае успеха, 0 в противном случае
native rg_drop_item(const index, const item_name[])
Вопросы, памятки, замечания, баги.
В
RG_CBasePlayer_RemovePlayerItem
документации указано, что возвращает значения типа: ATYPE_BOOL
, а на деле получить можно только через тип: ATYPE_INTEGER
При
RG_CBasePlayer_DropPlayerItem
предмет оборачивается в weaponbox
, поэтому возвращает энтити именно weaponbox'a
При
RG_CBasePlayer_DropShield
предмет не оборачивается в weaponbox
, а имеет обычную энтити класса weapon_shield
, это не пушка, щит не имеет слота в инвентаре. При падении создается энтити и выключается мебмер наличия щита, при поднятии энтити удаляется и включается мембер наличия щита.Во всех трех pre-хуках выше возвращаемое значение получить невозможно, оно еще не присвоено, поэтому будет выбивать ошибку:
return value isn't set.
Попытки выбросить гранаты или нож клиентской командой:
drop
, клавишей: G
приведет к тому, что будет вызван pre&post - хук: RG_CBasePlayer_DropPlayerItem
, но сам выброс не будет осуществлен. Все нормально, возвращаемые энтити при этому будут не валидны.При броске комплекта гранат, если в инвентаре больше 1, например:
weapon_flashbang
, то не один из хуков не вызовется, происходит это из-за того, что weapon_flashbang
- это предмет, а его кол-во это "патроны", хук RG_CBasePlayer_RemovePlayerItem
вызовется только когда целиком предмет пропадет из инвентаря. Аналогичное поведение с weapon_smokegrenade
и weapon_hegrenade
Параметр
pszItemName
у хука RG_CBasePlayer_DropPlayerItem
приходит нам всегда пустым, при клиентском drop
. Однако pszItemName
будет заполнен если удаление предметы будет осуществляться спец. нативами, которые указаны выше.Обратим внимание, что pre-хук
RG_CBasePlayer_DropPlayerItem
прилетает раньше pre-хука RG_CBasePlayer_RemovePlayerItem
, а в post-хуках наоборот. скорей всего RG_CBasePlayer_RemovePlayerItem
вызывается из RG_CBasePlayer_DropPlayerItem
Дефуз выбросился при смерти игрока, но никакие хуки не вызвались, может так и надо?
При
sv_restart 1
раунд начинается сначала, удаляются все предметы, затем выдается стандартный набор, но никаких хуков не было вызвано, так-как забыли пробросить remove_all_items
, тоже самое при выходе игрока. Кто поправит?Натив
rg_remove_items_by_slot
Очищает предметы, но зачем запас патронов, кто его просил? Не хватает булевой:
removeAmmo
Возвращает всегда true даже при отсутствие пушек, так надо? Может лучше false при отсутствие пушек в слоте?
Натив
rg_remove_item
При
removeAmmo = false
. В руках была 1 граната, она удалилась, но купить новую не могу, пишет, что у меня уже полный запас гранат, но фактически ее нету в слоте. Такой казус исправляет removeAmmo = true, который удалит весь запас гранат. Кто исправит?При ремуве щита, дефуза он удалился, но никаких хуков не было вызвано, так надо?
Натив
rg_remove_all_items
Никаких хуков не вызывается, забыли пробросить remove_all_items, кто исправит?
Натив
rg_drop_items_by_slot
Возвращает всегда true даже при отсутствие пушек, так надо? Может лучше false при отсутствие пушек в слоте?
Ножик и гранаты не выбрасывает, но хуки вызываются. Все нормально, возвращаемые энтити при этому будут не валидны.
Натив
rg_drop_item
Возвращает всегда true даже при отсутствие пушки в инвентаре, так надо? Может лучше false при отсутствие пушки в инвентаре?
Ножик и гранаты не выбрасывает, но хуки вызываются. Все нормально, возвращаемые энтити при этому будут не валидны.
При отсутствие пушки в инвентаре, хуки вызываются. Все нормально, возвращаемые энтити при этому будут не валидны.
Щит, дефуз не выбрасывается, а при
rg_remove_item
значит удалить можно, очень интересно?Описание: Вызывается когда из инвентаря игрока удаляется предмет
Возвращает: BOOL
Параметры: (const this, const pItem)
Заметки: В документации указано, что возвращает значения типа:ATYPE_BOOL
, а на деле получить можно только через тип:ATYPE_INTEGER
RG_CBasePlayer_RemovePlayerItem
Описание: Вызывается, когда из инвентаря игрока предмет падает на землю
Возвращает: WeaponBox Entity index of item
Параметры: (const this, const pszItemName[])
Заметки: При падении предмет оборачивается вweaponbox
RG_CBasePlayer_DropPlayerItem
Описание: Вызывается, когда игрок бросает щит на землю
Возвращает: Entity index of item
Параметры: (const this, bool:deploy)
Заметки: При падении предмет не оборачивается вweaponbox
, а имеет обычную энтити класса weapon_shield, не пушку, не имеет слота в инвентаре. При падении создается энтити, при поднятии энтити удаляется.
RG_CBasePlayer_DropShield
Примеры вызовов и их последовательность
Попытки выбросить гранаты клиентской командой drop, клавиша: G
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 155 | item_name: weapon_hegrenade
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: -1 | ent: -1 | item_name:
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 156 | item_name: weapon_flashbang
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: -1 | ent: -1 | item_name:
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 157 | item_name: weapon_smokegrenade
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: -1 | ent: -1 | item_name:
Гранаты не выбросились, по дефолтному поведению самостоятельно выбросить гранаты мы не можем
Тем не менее хуки дропа прилетели.
Попытки выбросить нож привели к такому же результату
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 153 | item_name: weapon_knife
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: -1 | ent: -1 | item_name:
----------------------------------------------------------------------
Моменты броска гранат: ЛКМ
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 155 | item_name: weapon_hegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 155 | item_name: weapon_hegrenade | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 156 | item_name: weapon_flashbang | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 156 | item_name: weapon_flashbang | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 157 | item_name: weapon_smokegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 157 | item_name: weapon_smokegrenade | return: 1
Если в инвентаре больше 1
weapon_flashbang
, то не один из хуков не вызовется, происходит это из-за того, что weapon_flashbang - это предмет, а его кол-во это "патроны", remove вызовется только когда целиком предмет пропадет из инвентаря. Аналогичное поведение с weapon_smokegrenade
и weapon_hegrenade
----------------------------------------------------------------------
Попытка выбросить пачку клиентской командой drop, клавиша: G
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 158 | item_name: weapon_c4
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 158 | item_name: weapon_c4 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 158 | item_name: weapon_c4 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: 159 | ent: 158 | item_name: weapon_c4
Параметр
pszItemName
пришел нам пустым, при клиентском drop
он всегда будет таковым...Однако
pszItemName
будет заполнен если удаление предметы будет осуществляться спец. нативамиЕсли необходимо получить имя предмета при клиентском дропе, можно работать с
m_pActiveItem
в pre-хуке или же в post-хуке извлекать энтити из веапонбокса и получать имя предмета с помощью rg_get_iteminfo
и ItemInfo_pszName
----------------------------------------------------------------------
Момент установки пачки
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 158 | item_name: weapon_c4 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 158 | item_name: weapon_c4 | return: 1
----------------------------------------------------------------------
Попытка выбросить щит клиентской командой drop, клавиша: G
RG_CBasePlayer_DropShield_Pre - this: 11 | deploy: 1 | ent: -1 | class_name:
RG_CBasePlayer_DropShield_Post - this: 11 | deploy: 1 | ent: 158 | class_name: weapon_shield
Щит выбросился, все отлично, но в pre-хуке мы не можем получить энтити щита, так-как щит не имеет его пока в руках, лишь установленный мембер о наличии щита, энтитей он становится, когда выброситься на землю. Щит так же не находится в инвентаре игрока, это не оружие, просто хрень какая то )
----------------------------------------------------------------------
Момент смерти игрока(убийство, самоубийство, clcmd_kill)
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 157 | item_name: weapon_smokegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 157 | item_name: weapon_smokegrenade | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 156 | item_name: weapon_flashbang | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 156 | item_name: weapon_flashbang | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 155 | item_name: weapon_hegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 155 | item_name: weapon_hegrenade | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 176 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 176 | item_name: weapon_m4a1 | return: 1
Гранаты выкидываются если значений
m[/I]p_na[I]dedrops
отличное от нуляВыбрасывается только лучшие/тяжелое оружие, или же зависит от значения
mp_weapondrop
Дефуз выбросился, но хук не вызывался, может так и надо?))
Заметим, что хук
Drop'a
не вызывается, только лишь хук Remove
Момент смерти игрока если в руках щит
RG_CBasePlayer_DropShield_Pre - this: 11 | deploy: 1 | ent: -1 | class_name:
RG_CBasePlayer_DropShield_Post - this: 11 | deploy: 1 | ent: 193 | class_name: weapon_shield
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 157 | item_name: weapon_smokegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 157 | item_name: weapon_smokegrenade | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 156 | item_name: weapon_flashbang | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 156 | item_name: weapon_flashbang | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 155 | item_name: weapon_hegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 155 | item_name: weapon_hegrenade | return: 1
Заметим, что выбросился только щит, пистолет не выбросился, по всей видимости щит имеет большей вес(лучше) чем пистолет
Зависит от значения
mp_weapondrop
если оно равное 3, то выбросится и пистолет и щит и все другое оружие, при значении равным 2 все ровно выбросит только щит, так-как оно обозначает "активное оружие"----------------------------------------------------------------------
Попытка выбросить любой доступный предмет клиентской командой drop, клавиша: G
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 158 | item_name: weapon_m4a1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 158 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 158 | item_name: weapon_m4a1 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: 159 | ent: 158 | item_name: weapon_m4a1
Обратим внимание, что pre-хук дропа прилетает раньше pre-хука ремува, а в post-хуках наоборот. Румуве вызывается из дропа.
Теперь проверим если в инвентаре в первом слоте две разные пушки, выбросим по очереди
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 158 | item_name: weapon_m4a1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 158 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 158 | item_name: weapon_m4a1 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: 154 | ent: 158 | item_name: weapon_m4a1
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: | weaponbox: | ent: 153 | item_name: weapon_m249
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 153 | item_name: weapon_m249 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 153 | item_name: weapon_m249 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: | weaponbox: 161 | ent: 153 | item_name: weapon_m249
Все отлично, казусов не случилось )
----------------------------------------------------------------------
Момент sv_restart 1
Раунд начинается сначала, удаляются все предметы, затем выдается стандартный набор
Никаких хуков не было вызвано, так-как забыли пробросить remove_all_items
----------------------------------------------------------------------
Момент выхода игрока
Удаляются все предметы, выполняется remove_all_items
Никаких хуков не было вызвано, так-как забыли пробросить remove_all_items
Примеры вызовов и их последовательность с помощью нативов
Описание: Удаляет все предметы и запас игрока в определенном слоте
Параметр: index - Индекс клиента/игрока
Параметр: slot - Слот, который будет очищен
Возвращает: 1 в случае успеха, 0 в противном случае
native rg_remove_items_by_slot(const index, const InventorySlotType:slot);
Выполним rg_remove_items_by_slot(user, PRIMARY_WEAPON_SLOT);
В наличии, в первом слоте была одна пушка: weapon_m4a1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 158 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 158 | item_name: weapon_m4a1 | return: 1
Удалил weapon_m4a1 и все его запасные патроны
В наличии, в первом слоте были две пушки: weapon_m4a1, weapon_m249
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 156 | item_name: weapon_m249 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 156 | item_name: weapon_m249 | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 155 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 155 | item_name: weapon_m4a1 | return: 1
Удалил обе пушки и все запасные патроны от этих двух пушек
Если были запасные патроны от пушек которых не было в первом слоте в момент удаления, то запас не трогается
Аналогичное поведение для PISTOL_SLOT, KNIFE_SLOT, GRENADE_SLOT, C4_SLOT
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 154 | item_name: weapon_usp | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 154 | item_name: weapon_usp | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 153 | item_name: weapon_knife | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 153 | item_name: weapon_knife | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 199 | item_name: weapon_smokegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 199 | item_name: weapon_smokegrenade | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 198 | item_name: weapon_flashbang | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 198 | item_name: weapon_flashbang | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 197 | item_name: weapon_hegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 197 | item_name: weapon_hegrenade | return: 1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 158 | item_name: weapon_c4 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 158 | item_name: weapon_c4 | return: 1
Нож, гранаты удалятся, хоть и выбросить клиентской командой drop мы не можем
Напоминаю, что гранаты удалятся все, включая их запас.
При отсутствие пушек в каком либо слоте вызов хуков не произойдет, запасные патроны не удаляются
rg_remove_items_by_slot возвращает true даже при отсутствие пушек
Обратите внимание на порядок удаления слота гранат, порядок отличается от того, что мы видим в клиенте, где список, порядок?
----------------------------------------------------------------------
Описание: Удаляет указанное имя класса предмета у клиента/игрока
Параметр: index - Индекс клиента/игрока
Параметр: item_name - Имя класса элемента
Параметр: removeAmmo - Удаляет боеприпасы/запас у клиента/игрока
Возвращает: 1, если найдено и удалено, 0 в противном случае
native rg_remove_item(const index, const item_name[], const bool:removeAmmo = false);
Выполним rg_remove_item(user, "weapon_m4a1", .removeAmmo = true);
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return: 1
rg_remove_item - result: 1
Удаляет пушку и все его запасные патроны, если removeAmmo = false, то запасные патроны не удаляются
При отсутствие предмета rg_remove_item вернет 0, запасные патроны остаются, хуки не вызываются
Выполним rg_remove_item(user, "weapon_hegrenade", .removeAmmo = false);
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 197 | item_name: weapon_hegrenade | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 197 | item_name: weapon_hegrenade | return: 1
В руках была 1 граната, она удалилась, но купить новую не могу, пишет, что у меня уже полный запас гранат, но фактически ее нету в слоте
Такой казус исправляет removeAmmo = true, который удалит весь запас гранат
Нож, гранаты удалятся, хоть и выбросить клиентской командой drop мы не можем
Выполним rg_remove_item(user, "weapon_shield", .removeAmmo = true);
rg_remove_item - result: 1
При ремуве щита он удалился, но никаких хуков не было вызвано, так надо?)
----------------------------------------------------------------------
Описание: Удаялет все предметы у клиента/игрока и его запас
Параметр: index - Индекс клиента/игрока
Параметр: removeSuit - Удаляет костюм у клиента/игрока
Возвращает: 1 в случае успеха, 0 в противном случае
native rg_remove_all_items(const index, const bool:removeSuit = false);
Выполним rg_remove_all_items(user, .removeSuit = false);
rg_remove_all_items - result: 1
Никаких хуков не вызывается, забыли пробросить
Удаляется все что есть у игрока и весь его запас
rg_remove_all_items возвращает true даже при отсутствие пушек
Выполним rg_remove_all_items(user, .removeSuit = true);
rg_remove_all_items - result: 1
Делает то же самое что и выше за исключением того, что убирает еще бит WEAPON_SUIT у var_weapons, костюм H.E.V. Mark IV
Это приводит к тому, что на экране клиента пропадают худы/иконки с жизнью, броней
Клиент по var_weapons WEAPON_SUIT рисует эти иконки, так называемый костюм, который в HL, зачем это в CS не разобрался
Что бы вернуть наши иконки оно же костюм
Код:
new bit = get_entvar(user, var_weapons);
set_entvar(user, var_weapons, bit |= BIT(31));
Описание: Выбрасывает на пол все предметы игрока в определенном слоте
Параметр: index - Индекс клиента/игрока
Параметр: slot - Слот, для выброса каждого предмета
Возвращает: 1 в случае успеха, 0 в противном случае
native rg_drop_items_by_slot(const index, const InventorySlotType:slot);
Выполним rg_drop_items_by_slot(user, PRIMARY_WEAPON_SLOT);
В наличии, в первом слоте была одна пушка: weapon_m4a1
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_m4a1 | weaponbox: | ent: 153 | item_name: weapon_m4a1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_m4a1 | weaponbox: 154 | ent: 153 | item_name: weapon_m4a1
rg_drop_items_by_slot - result: 1
Выбросил предмет, при этом заметим, что pszItemName у нас не пустой, а имеет имя предмета, в отличии от клиентского drop
Запасные патроны никуда не делись, фух )
При отсутствие пушек в каком либо слоте вызов хуков не произойдет
rg_drop_items_by_slot возвращает true даже при отсутствие пушек
В наличии, в первом слоте были две пушки: weapon_m4a1, weapon_m249
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_m249 | weaponbox: | ent: 156 | item_name: weapon_m249
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 156 | item_name: weapon_m249 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 156 | item_name: weapon_m249 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_m249 | weaponbox: 157 | ent: 156 | item_name: weapon_m249
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_m4a1 | weaponbox: | ent: 153 | item_name: weapon_m4a1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_m4a1 | weaponbox: 158 | ent: 153 | item_name: weapon_m4a1
Выполним rg_drop_items_by_slot(user, KNIFE_SLOT);
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_knife | weaponbox: | ent: 194 | item_name: weapon_knife
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_knife | weaponbox: -1 | ent: -1 | item_name:
Ножик не выбросился, так-как его нельзя выбросить, как и клиентским drop, тем не менее хук вызвался
Выполним rg_drop_items_by_slot(user, GRENADE_SLOT);
В запасе было по 3 шт. каждой из гранат
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_smokegrenade | weaponbox: | ent: 157 | item_name: weapon_smokegrenade
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_smokegrenade | weaponbox: -1 | ent: -1 | item_name:
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_flashbang | weaponbox: | ent: 156 | item_name: weapon_flashbang
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_flashbang | weaponbox: -1 | ent: -1 | item_name:
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_hegrenade | weaponbox: | ent: 155 | item_name: weapon_hegrenade
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_hegrenade | weaponbox: -1 | ent: -1 | item_name:
Гранаты не выбросились, так-как их нельзя выбросить, как и клиентским drop, тем не менее хуки вызвались
Выполним rg_drop_items_by_slot(user, C4_SLOT);
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_c4 | weaponbox: | ent: 159 | item_name: weapon_c4
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 159 | item_name: weapon_c4 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 159 | item_name: weapon_c4 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_c4 | weaponbox: 160 | ent: 159 | item_name: weapon_c4
----------------------------------------------------------------------
Описание: Выбрасывает на пол указанное имя класса предмета у клиента/игрока
Параметр: index - Индекс клиента/игрока
Параметр: item_name - Имя класса элемента
Возвращает: 1 в случае успеха, 0 в противном случае
native rg_drop_item(const index, const item_name[]);
Выполним rg_drop_item(user, "weapon_m4a1");
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_m4a1 | weaponbox: | ent: 153 | item_name: weapon_m4a1
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 153 | item_name: weapon_m4a1 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_m4a1 | weaponbox: 154 | ent: 153 | item_name: weapon_m4a1
rg_drop_item - result: 1
Выбросил предмет, при этом заметим, что pszItemName у нас не пустой, а имеет имя предмета, в отличии от клиентского drop
rg_drop_item возвращает true даже при отсутствие пушек в инвентаре
Запасные патроны никуда не делись, фух )
Выполним rg_drop_item(user, "weapon_m4a1");
При условии, что у нас нету такой пушки в инвентаре
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_m4a1 | weaponbox: | ent: -1 | item_name:
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_m4a1 | weaponbox: -1 | ent: -1 | item_name:
Выполним rg_drop_item(user, "weapon_knife");
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_knife | weaponbox: | ent: 194 | item_name: weapon_knife
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_knife | weaponbox: -1 | ent: -1 | item_name:
Ножик не выбросился, так-как его нельзя выбросить, как и клиентским drop, тем не менее хук вызвался
Выполним rg_drop_item(user, "weapon_hegrenade");
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_hegrenade | weaponbox: | ent: 155 | item_name: weapon_hegrenade
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_hegrenade | weaponbox: -1 | ent: -1 | item_name:
Граната не выбросилась, так-как ее нельзя выбросить, как и клиентским drop, тем не менее хук вызвался
Выполним rg_drop_item(user, "weapon_c4");
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_c4 | weaponbox: | ent: 153 | item_name: weapon_c4
RG_CBasePlayer_RemovePlayerItem_Pre - this: 11 | pItem: 153 | item_name: weapon_c4 | return:
RG_CBasePlayer_RemovePlayerItem_Post - this: 11 | pItem: 153 | item_name: weapon_c4 | return: 1
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_c4 | weaponbox: 154 | ent: 153 | item_name: weapon_c4
Выполним rg_drop_item(user, "weapon_shield");
RG_CBasePlayer_DropPlayerItem_Pre - this: 11 | pszItemName: weapon_shield | weaponbox: | ent: -1 | item_name:
RG_CBasePlayer_DropPlayerItem_Post - this: 11 | pszItemName: weapon_shield | weaponbox: -1 | ent: -1 | item_name:
Щит не выбросился, но хук вызвался
Последнее редактирование: