Помощь в улучшении плагина

Сообщения
6
Реакции
0
Неверный раздел. Перенесено
Здравствуйте дорогие форумчане
Можете ли вы помочь в усовершенствовании плагина?
C++:
#include <amxmodx>
#include <engine>
#include <hamsandwich>
#include <reapi>
#include <zp50_items>

#define KOPTER_MODEL_P "models/zpe/weapon/pistol/kopter/p_kopter.mdl" // P модель
#define KOPTER_MODEL_V "models/zpe/weapon/pistol/kopter/v_kopter.mdl" // V модель
#define KOPTER_MODEL_W "models/zpe/weapon/pistol/kopter/w_kopter.mdl" // W модель

#define KOPTER_WEAPON_KEY 800 // Ключ для оружия
#define GetCostumWeapon(%1) (get_entvar(%1, var_impulse) == KOPTER_WEAPON_KEY) // Получаем ключ объект (оружия)
#define SetCostumWeapon(%1) set_entvar(%1, var_impulse, KOPTER_WEAPON_KEY) // Устанавливаем ключ для объекта (оружия)

// Анимации смотреть в HLMV
enum {
    IDLE = 0,
    SHOOT1,
    SHOOT2,
    SHOOT_EMPTY,
    RELOAD,
    DRAW
}

new g_weapon_kopter[33];
new g_ItemID;

public plugin_init()
{
    register_plugin("[ZPE] Weapon: Kopter", "0.1", "ProSTo Zombie");
    RegisterHam(Ham_Item_Deploy, "weapon_deagle", "HS_Item_Deploy", 1);
    RegisterHookChain(RG_CWeaponBox_SetModel, "RC_SetWorldModel", 0);
    
    g_ItemID = zp_items_register("ITEM_PISTOL_KOPTER", 0, 1);
}

public plugin_precache()
{
    precache_model(KOPTER_MODEL_P);
    precache_model(KOPTER_MODEL_V);
    precache_model(KOPTER_MODEL_W);
}

public client_disconnected(id)
{
    g_weapon_kopter[id] = false;
}

public zp_fw_items_select_pre(id, itemid, ignorecost)
{
    if(itemid != g_ItemID)
    {
        return ZP_ITEM_AVAILABLE;
    }
    
    if(zp_core_is_zombie(id))
    {
        return ZP_ITEM_DONT_SHOW;
    }
    
    return ZP_ITEM_AVAILABLE;
}

public zp_fw_items_select_post(id, itemid, ignorecost)
{
    if(itemid != g_ItemID)
    {
        return;
    }
    
    give_kopter(id);
}

public give_kopter(id)
{
    new weapon_kopter = rg_give_custom_item(id, "weapon_deagle", GT_DROP_AND_REPLACE, KOPTER_WEAPON_KEY);
    if(weapon_kopter > 0)
    {
        SetCostumWeapon(weapon_kopter);
        UTIL_PlayWeaponAnimation(id, DRAW);
    }
    g_weapon_kopter[id] = true;
}

public HS_Item_Deploy(weapon_ent)
{
    new id = get_member(weapon_ent, m_pPlayer);
    if (!is_user_connected(id) || !GetCostumWeapon(weapon_ent))
    {
        return HAM_IGNORED;
    }
    
    if(!g_weapon_kopter[id])
    {
        return HAM_IGNORED;
    }
    
    set_entvar(id, var_viewmodel, KOPTER_MODEL_V);
    set_entvar(id, var_weaponmodel, KOPTER_MODEL_P);
    UTIL_PlayWeaponAnimation(id, DRAW);
    
    return HAM_IGNORED;
}

public RC_SetWorldModel(const weaponbox, const model[])
{
    new weapon = getWeaponBox(weaponbox);
    if (weapon != NULLENT && GetCostumWeapon(weapon))
    {
        SetHookChainArg(2, ATYPE_STRING, KOPTER_MODEL_W);
    }
    return HC_CONTINUE;
}

stock UTIL_PlayWeaponAnimation(const id, const sequence)
{
      set_entvar(id, var_weaponanim, sequence)
    
      message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = id);
      write_byte(sequence);
      write_byte(get_entvar(id, var_body));
      message_end();
}

stock get_player(weapon)
{
      return get_pdata_cbase(weapon, 41, 4)
}

stock getWeaponBox(const weaponbox)
{
    for (new i = 0, weapon; i < MAX_ITEM_TYPES; i++)
    {
        weapon = get_member(weaponbox, m_WeaponBox_rgpPlayerItems, i);
        if (!is_nullent(weapon))
        {
            return weapon;
        }
    }
    return NULLENT;
}

Обязательно ли использовать?
FM_UpdateClientData
Т.к опыт в скриптинге невелик...
Прошу вашей помощи в разборе этой темы
 
Сообщения
1,419
Реакции
2,508
Помог
59 раз(а)
Для установки кастомного звука выстрела.

P.S. В некоторых местах абсолютно ненужные вещи, как g_weapon_kopter, SetCostumWeapon. Смотрите пример реализации кастомного оружия - https://dev-cs.ru/threads/1983/page-3#post-51426
Так же, лучше константы вместо дефайнов для строк.
Пример:
Код:
-#define KOPTER_MODEL_P "models/zpe/weapon/pistol/kopter/p_kopter.mdl" // P модель
+new const KOPTER_MODEL_P[] = "models/zpe/weapon/pistol/kopter/p_kopter.mdl";
P.S.S. Такие темы думаю надо создавать в соответствующем разделе - https://dev-cs.ru/forums/amxx_development/
 
Последнее редактирование:
Сообщения
6
Реакции
0
Для установки кастомного звука выстрела.

P.S. В некоторых местах абсолютно ненужные вещи, как g_weapon_kopter, SetCostumWeapon. Смотрите пример реализации кастомного оружия - https://dev-cs.ru/threads/1983/page-3#post-51426
Так же, лучше константы вместо дефайнов для строк.
Пример:
Код:
-#define KOPTER_MODEL_P "models/zpe/weapon/pistol/kopter/p_kopter.mdl" // P модель
+new const KOPTER_MODEL_P[] = "models/zpe/weapon/pistol/kopter/p_kopter.mdl";
P.S.S. Такие темы думаю надо создавать в соответствующем разделе - https://dev-cs.ru/forums/amxx_development/
Извините, не сразу заметил этот раздел
Посмотрел пример реализации кастюмного оружия и подправил свой код, но кажется стало хуже (но не уверен)
C++:
#include <amxmodx>
#include <engine>
#include <hamsandwich>
#include <reapi>
#include <zp50_items>

new const KOPTER_MODEL_P[] = "models/zpe/weapon/pistol/kopter/p_kopter.mdl" // P модель
new const KOPTER_MODEL_V[] = "models/zpe/weapon/pistol/kopter/v_kopter.mdl" // V модель
new const KOPTER_MODEL_W[] = "models/zpe/weapon/pistol/kopter/w_kopter.mdl" // W модель

#define KOPTER_WEAPON_KEY 800 // Ключ для оружия
#define CostumWeapon(%1) bool:(get_entvar(%1, var_impulse) == KOPTER_WEAPON_KEY) // Получаем ключ объект (оружия)

// Анимации смотреть в HLMV
enum {
    IDLE = 0,
    SHOOT1,
    SHOOT2,
    SHOOT_EMPTY,
    RELOAD,
    DRAW
}

new g_ItemID;

public plugin_init()
{
    register_plugin("[ZPE] Weapon: Kopter", "0.1", "ProSTo Zombie");
    RegisterHam(Ham_Item_Deploy, "weapon_deagle", "HS_Item_Deploy", 1);
    RegisterHookChain(RG_CWeaponBox_SetModel, "RC_SetWorldModel", 0);
    
    g_ItemID = zp_items_register("ITEM_PISTOL_KOPTER", 0, 1);
}

public plugin_precache()
{
    precache_model(KOPTER_MODEL_P);
    precache_model(KOPTER_MODEL_V);
    precache_model(KOPTER_MODEL_W);
}

public zp_fw_items_select_pre(id, itemid, ignorecost)
{
    if(itemid != g_ItemID)
    {
        return ZP_ITEM_AVAILABLE;
    }
    
    if(zp_core_is_zombie(id))
    {
        return ZP_ITEM_DONT_SHOW;
    }
    
    return ZP_ITEM_AVAILABLE;
}

public zp_fw_items_select_post(id, itemid, ignorecost)
{
    if(itemid != g_ItemID)
    {
        return;
    }
    
    give_kopter(id);
}

public give_kopter(id)
{
    new weapon_kopter = rg_give_custom_item(id, "weapon_deagle", GT_DROP_AND_REPLACE, KOPTER_WEAPON_KEY);
    if (is_nullent(weapon_kopter))
    {
        return PLUGIN_HANDLED;
    }
    
    UTIL_PlayWeaponAnimation(id, DRAW);
    
    return PLUGIN_HANDLED;
}

public HS_Item_Deploy(weapon_ent)
{
    new id = get_member(weapon_ent, m_pPlayer);
    if (!is_user_connected(id) || !CostumWeapon(weapon_ent))
    {
        return HAM_IGNORED;
    }
    
    set_entvar(id, var_viewmodel, KOPTER_MODEL_V);
    set_entvar(id, var_weaponmodel, KOPTER_MODEL_P);
    UTIL_PlayWeaponAnimation(id, DRAW);
    
    return HAM_IGNORED;
}

public RC_SetWorldModel(const weaponbox, const model[])
{
    new weapon = getWeaponBoxWeapon(weaponbox);
    if (weapon != NULLENT && CostumWeapon(weapon))
    {
        SetHookChainArg(2, ATYPE_STRING, KOPTER_MODEL_W);
    }
    return HC_CONTINUE;
}

stock UTIL_PlayWeaponAnimation(const id, const sequence)
{
      set_entvar(id, var_weaponanim, sequence)
    
      message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = id);
      write_byte(sequence);
      write_byte(get_entvar(id, var_body));
      message_end();
}

stock getWeaponBoxWeapon(const weaponbox)
{
    for (new i = 0, weapon; i < MAX_ITEM_TYPES; i++)
    {
        weapon = get_member(weaponbox, m_WeaponBox_rgpPlayerItems, i);
        if (!is_nullent(weapon))
        {
            return weapon;
        }
    }
    return NULLENT;
}
 
Сообщения
1,419
Реакции
2,508
Помог
59 раз(а)
ProSToZombie, во-первых, "weapon_deagle" лучше вынести в константу чтобы в будущем легко можно было изменить тип оружия. В give_kopter(id) я бы добавил ещё проверку на то, жив ли игрок. И если делается с расчётом что дальше будет просто копироваться "готовый вариант" то я бы заменил new weapon_kopter просто на new iWeapon. Не думаю что нужна проверка is_user_connected(id) на 83 строке.
И просто чтобы глаза не резало: Costum -> Custom.
 
Сообщения
6
Реакции
0
ProSToZombie, во-первых, "weapon_deagle" лучше вынести в константу чтобы в будущем легко можно было изменить тип оружия. В give_kopter(id) я бы добавил ещё проверку на то, жив ли игрок. И если делается с расчётом что дальше будет просто копироваться "готовый вариант" то я бы заменил new weapon_kopter просто на new iWeapon. Не думаю что нужна проверка is_user_connected(id) на 83 строке.
И просто чтобы глаза не резало: Costum -> Custom.
Конечный результат
А если использовать FM_UpdateClientData
Пропадут искры от попадания в стену и т.д или я ошибаюсь ?
Если это так , то придется присваивать все это снова и эта будет + нагрузка или все же нет ?
C++:
#include <amxmodx>
#include <hamsandwich>
#include <reapi>
#include <zp50_items>

new const MODEL_P[] = "models/zpe/weapon/pistol/kopter/p_kopter.mdl" // P модель
new const MODEL_V[] = "models/zpe/weapon/pistol/kopter/v_kopter.mdl" // V модель
new const MODEL_W[] = "models/zpe/weapon/pistol/kopter/w_kopter.mdl" // W модель

#define WEAPON_KEY 800 // Ключ для оружия
#define WEAPON_NAME "weapon_deagle"
#define CostumWeapon(%1) bool:(get_entvar(%1, var_impulse) == WEAPON_KEY) // Получаем ключ объект (оружия)

// Анимации смотреть в HLMV
enum {
    IDLE = 0,
    SHOOT1,
    SHOOT2,
    SHOOT_EMPTY,
    RELOAD,
    DRAW
}

new g_ItemID;

public plugin_init()
{
    register_plugin("[ZPE] Weapon: Kopter", "0.1", "ProSTo Zombie");
    RegisterHam(Ham_Item_Deploy, WEAPON_NAME, "HS_Item_Deploy", 1);
    RegisterHookChain(RG_CWeaponBox_SetModel, "RC_SetWorldModel", 0);
    
    g_ItemID = zp_items_register("ITEM_PISTOL_KOPTER", 0, 1);
}

public plugin_precache()
{
    precache_model(MODEL_P);
    precache_model(MODEL_V);
    precache_model(MODEL_W);
}

public zp_fw_items_select_pre(id, itemid, ignorecost)
{
    if(itemid != g_ItemID)
    {
        return ZP_ITEM_AVAILABLE;
    }
    
    if(zp_core_is_zombie(id))
    {
        return ZP_ITEM_DONT_SHOW;
    }
    
    return ZP_ITEM_AVAILABLE;
}

public zp_fw_items_select_post(id, itemid, ignorecost)
{
    if(itemid != g_ItemID)
    {
        return;
    }
    
    give_weapon(id);
}

public give_weapon(id)
{
    if(!is_user_alive(id))
    {
        return PLUGIN_HANDLED;
    }

    new iWeapon = rg_give_custom_item(id, WEAPON_NAME, GT_DROP_AND_REPLACE, WEAPON_KEY);
    if (is_nullent(iWeapon))
    {
        return PLUGIN_HANDLED;
    }
    
    UTIL_PlayWeaponAnimation(id, DRAW);
    
    return PLUGIN_HANDLED;
}

public HS_Item_Deploy(weapon_ent)
{
    new id = get_member(weapon_ent, m_pPlayer);
    if (!CostumWeapon(weapon_ent))
    {
        return HAM_IGNORED;
    }
    
    set_entvar(id, var_viewmodel, MODEL_V);
    set_entvar(id, var_weaponmodel, MODEL_P);
    UTIL_PlayWeaponAnimation(id, DRAW);
    
    return HAM_IGNORED;
}

public RC_SetWorldModel(const weaponbox, const model[])
{
    new weapon = getWeaponBox(weaponbox);
    if (weapon != NULLENT && CostumWeapon(weapon))
    {
        SetHookChainArg(2, ATYPE_STRING, MODEL_W);
    }
    return HC_CONTINUE;
}

stock UTIL_PlayWeaponAnimation(const id, const sequence)
{
      set_entvar(id, var_weaponanim, sequence)
    
      message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = id);
      write_byte(sequence);
      write_byte(get_entvar(id, var_body));
      message_end();
}

stock getWeaponBox(const weaponbox)
{
    for (new i = 0, weapon; i < MAX_ITEM_TYPES; i++)
    {
        weapon = get_member(weaponbox, m_WeaponBox_rgpPlayerItems, i);
        if (!is_nullent(weapon))
        {
            return weapon;
        }
    }
    return NULLENT;
}
 
Сообщения
1,419
Реакции
2,508
Помог
59 раз(а)
Конечный результат
Дефайн со строкой лучше в константу, как и сказал ранее.


А если использовать FM_UpdateClientData
Пропадут искры от попадания в стену и т.д или я ошибаюсь ?
Если это так , то придется присваивать все это снова и эта будет + нагрузка или все же нет ?
Пропадут. В любом случае придётся использовать, если нужно делать свой звук выстрела, соответственно и самому потом надо отображать.
 
Сообщения
6
Реакции
0
Дефайн со строкой лучше в константу, как и сказал ранее.



Пропадут. В любом случае придётся использовать, если нужно делать свой звук выстрела, соответственно и самому потом надо отображать.
И последний вопрос
FM_PrecacheEvent Для чего эта вещь?
Если правильно понимаю - эта загрузка эвентов из папки events
А конкретно не понимаю для чего именно она
 
Сообщения
1,419
Реакции
2,508
Помог
59 раз(а)
И последний вопрос
FM_PrecacheEvent Для чего эта вещь?
Если правильно понимаю - эта загрузка эвентов из папки events
А конкретно не понимаю для чего именно она
Получить ID ивента. По сути можно зарегистрировать хук, получить ID и отключить его, больше он не нужен будет. Использовать в FM_PlaybackEvent
 
Последнее редактирование:
Сообщения
6
Реакции
0
w0w, Можно еще один вопрос
Пытаюсь сделать задержку перед выстрелом после анимации DRAW
set_member(id, m_flNextAttack, WEAPON_TIME_DRAW)
Но, что-то не работает
Может я делаю не правильно...
 
Сообщения
1,419
Реакции
2,508
Помог
59 раз(а)
ProSToZombie, где полный код? Пробуйте устанавливать оружию m_Weapon_flNextPrimaryAttack.
 
Сообщения
6
Реакции
0
w0w,
C++:
#include <amxmodx>
#include <hamsandwich>
#include <reapi>
#include <zp50_items>

new const MODEL_P[] = "models/zpe/weapon/pistol/kopter/p_kopter.mdl" // P модель
new const MODEL_V[] = "models/zpe/weapon/pistol/kopter/v_kopter.mdl" // V модель
new const MODEL_W[] = "models/zpe/weapon/pistol/kopter/w_kopter.mdl" // W модель
new const WEAPON_NAME[] = "weapon_deagle"

#define WEAPON_KEY 800 // Ключ для оружия
#define WEAPON_TIME_DRAW 2.5
#define CostumWeapon(%1) bool:(get_entvar(%1, var_impulse) == WEAPON_KEY) // Получаем ключ объект (оружия)

// Анимации смотреть в HLMV
enum {
    IDLE = 0,
    SHOOT1,
    SHOOT2,
    SHOOT_EMPTY,
    RELOAD,
    DRAW
}

new g_ItemID;

public plugin_init()
{
    register_plugin("[ZPE] Weapon: Kopter", "0.1", "ProSTo Zombie");
    RegisterHam(Ham_Item_Deploy, WEAPON_NAME, "HS_Item_Deploy", 1);
    RegisterHookChain(RG_CWeaponBox_SetModel, "RC_SetWorldModel", 0);
  
    g_ItemID = zp_items_register("ITEM_PISTOL_KOPTER", 0, 1);
}

public plugin_precache()
{
    precache_model(MODEL_P);
    precache_model(MODEL_V);
    precache_model(MODEL_W);
}

public zp_fw_items_select_pre(id, itemid, ignorecost)
{
    if(itemid != g_ItemID)
    {
        return ZP_ITEM_AVAILABLE;
    }
  
    if(zp_core_is_zombie(id))
    {
        return ZP_ITEM_DONT_SHOW;
    }
  
    return ZP_ITEM_AVAILABLE;
}

public zp_fw_items_select_post(id, itemid, ignorecost)
{
    if(itemid != g_ItemID)
    {
        return;
    }
  
    give_weapon(id);
}

public give_weapon(id)
{
    if(!is_user_alive(id))
    {
        return PLUGIN_HANDLED;
    }

    new iWeapon = rg_give_custom_item(id, WEAPON_NAME, GT_DROP_AND_REPLACE, WEAPON_KEY);
    if (is_nullent(iWeapon))
    {
        return PLUGIN_HANDLED;
    }
  
    UTIL_PlayWeaponAnimation(id, DRAW);
  
    return PLUGIN_HANDLED;
}

public HS_Item_Deploy(weapon_ent)
{
    new id = get_member(weapon_ent, m_pPlayer);
    if (!CostumWeapon(weapon_ent))
    {
        return HAM_IGNORED;
    }
  
    set_entvar(id, var_viewmodel, MODEL_V);
    set_entvar(id, var_weaponmodel, MODEL_P);
    UTIL_PlayWeaponAnimation(id, DRAW);
    set_member(id, m_flNextAttack, WEAPON_TIME_DRAW)
  
    return HAM_IGNORED;
}

public RC_SetWorldModel(const weaponbox, const model[])
{
    new weapon = getWeaponBox(weaponbox);
    if (weapon != NULLENT && CostumWeapon(weapon))
    {
        SetHookChainArg(2, ATYPE_STRING, MODEL_W);
    }
    return HC_CONTINUE;
}

stock UTIL_PlayWeaponAnimation(const id, const sequence)
{
      set_entvar(id, var_weaponanim, sequence)
  
      message_begin(MSG_ONE_UNRELIABLE, SVC_WEAPONANIM, .player = id);
      write_byte(sequence);
      write_byte(get_entvar(id, var_body));
      message_end();
}

stock getWeaponBox(const weaponbox)
{
    for (new i = 0, weapon; i < MAX_ITEM_TYPES; i++)
    {
        weapon = get_member(weaponbox, m_WeaponBox_rgpPlayerItems, i);
        if (!is_nullent(weapon))
        {
            return weapon;
        }
    }
    return NULLENT;
}
14 Фев 2019
w0w, Все разобрался, писал set_member в выдачу оружия, а надо было в проверку задействования оружия HS_Item_Deploy
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу