Увеличение урона от ножа.

Сообщения
95
Реакции
6
Помог
2 раз(а)
Добрый день, подскажите что я делаю не так,
Код:
RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage", true);
public CBasePlayer_TakeDamage(victim, inflictor, attacker, Float:damage, damagebits){
    if (!is_user_connected(attacker) || victim == attacker) {
          return HC_CONTINUE;
    }
    if(GetWeponID(attacker) == WEAPON_ID && IsCustomWeapon(attacker))
        SetHookChainArg(4, ATYPE_FLOAT, damage*WEAPON_DAMAGE)
    return HC_CONTINUE;
}
При нанесении урона игроку, урон не умножается
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
Потому что хук Post а не Pre + глупая какая-то проверка IsCustomWeapon(attacker), тут явно должно быть указано ID оружия а не ID игрока наносящего урона.
 
Последнее редактирование:
Сообщения
95
Реакции
6
Помог
2 раз(а)
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
#define IsCustomWeapon(%1) bool:(get_entvar(%1, var_impulse) == WEAPON_UID)
И почему тогда указывается attacker если это ID игрока наносящего урон а не ID оружия?

правильно ли я тебя понял?RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage", .post = true);
Сейчас так и есть. А нужно Pre, в Post уже нельзя ничего поменять.
 
Сообщения
95
Реакции
6
Помог
2 раз(а)
И почему тогда указывается attacker если это ID игрока наносящего урон а не ID оружия?
Думал, что так правильно, а можешь дать часть когда как узнать id урона, я запомню и не буду допускать такие ошибки
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
Skiptik, можно получить через get_member(id, m_pActiveItem)
 
Сообщения
95
Реакции
6
Помог
2 раз(а)
w0w,
Код:
new weapon = get_member(attacker, m_pActiveItem)
IsCustomWeapon(weapon)
Правильно? И еще такой вопрос объясни как выдавать pre, пожалуйста
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
w0w,
Код:
new weapon = get_member(attacker, m_pActiveItem)
IsCustomWeapon(weapon)
Правильно? И еще такой вопрос объясни как выдавать pre, пожалуйста
Правильно. Что значит выдавать Pre? Я говорю что хук должен быть Pre а не Post как сейчас.
 
Сообщения
95
Реакции
6
Помог
2 раз(а)
w0w, Что то додумать не могу как отловить хук До RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage", false) Так?
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
Skiptik, да, также можно просто не указывать.
 
Сообщения
95
Реакции
6
Помог
2 раз(а)
w0w, Сделал но урон не увеличивается
Код:
#include <amxmodx>
#include <customweapon>
#include <hamsandwich>
#include <reapi>

#define WEAPON_ID WEAPON_KNIFE // ID оружия
#define WEAPON_NAME "weapon_knife" // Название оружия
#define WEAPON_DAMAGE 3.0 // Скорость бега. Закоментировать если количество по умолчанию
#define MODEL_V "models/t/Knife/Gold/v_dagger.mdl" // Модель V оружия.
#define MODEL_P "models/t/Knife/Gold/p_dagger.mdl" // Модель P оружия.

#define WEAPON_UID 1
#define GetWeponID(%1) WeaponIdType:get_member(%1, m_iId)
#define IsCustomWeapon(%1) bool:(get_entvar(%1, var_impulse) == WEAPON_UID)
#define IsUserValid(%0) (1 <= %0 <= MaxClients)
new bool:g_HasKnife[MAX_CLIENTS] = false

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

public plugin_init() {
    RegisterHam(Ham_Item_Deploy, WEAPON_NAME, "Item_Deploy_Post", true);
    RegisterHookChain(RG_CBasePlayer_Spawn, "PlayerSpawn", true);
    RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage", false);
}

public Check_CmdGive(id){
    new iActiveItem = get_member(id, m_pActiveItem)
    new WeaponIdType:iId = get_member(iActiveItem, m_iId)
    if(iId != WEAPON_ID){
        g_HasKnife[id] = true
        CmdGive(id)
    }else{
        client_print_color(id, print_team_default, "Уберите нож из рук")
    }
}

public CmdGive(id) {
    new iActiveItem = get_member(id, m_pActiveItem)
    new WeaponIdType:iId = get_member(iActiveItem, m_iId)
    if(iId != WEAPON_ID && g_HasKnife[id]){
        CustomWeaponKnifeSpeed(id, false)
        CustomWeaponKnifeGravity(id, false)
        CustomWeaponKnifeUltra(id, false)
        new weapon = rg_give_custom_item(id, WEAPON_NAME, GT_REPLACE, WEAPON_UID);
        if (is_nullent(weapon)) {
            return PLUGIN_HANDLED;
        }
    }else{
        client_print_color(id, print_team_default, "Уберите нож из рук")
    }
       return PLUGIN_HANDLED;
}

public Item_Deploy_Post(weapon) {
        if (!IsCustomWeapon(weapon)) {
           return HAM_IGNORED;
        }

       new id = get_member(weapon, m_pPlayer);
    if(id > 0 && g_HasKnife[id]){
        set_entvar(id, var_viewmodel, MODEL_V);
        set_entvar(id, var_weaponmodel, MODEL_P);
    }
    return HAM_IGNORED;
}

public CBasePlayer_TakeDamage(victim, inflictor, attacker, Float:damage, damagebits){
    new weapon = get_member(attacker, m_pActiveItem)
    if (!is_user_connected(attacker) || victim == attacker) {
          return HC_CONTINUE;
    }
    if(GetWeponID(attacker) == WEAPON_ID && IsCustomWeapon(weapon))
        SetHookChainArg(4, ATYPE_FLOAT, damage*WEAPON_DAMAGE)
    return HC_CONTINUE;
}

public PlayerSpawn(id){
    if(g_HasKnife[id] == true){
        rg_give_custom_item(id, WEAPON_NAME, GT_REPLACE, WEAPON_UID)
    }
}

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

public plugin_natives()
{
    register_library("customweapon");
        register_native("CustomWeaponKnifeGold",    "__CustomWeaponKnifeGold");
}

public __CustomWeaponKnifeGold(iPlugin, iParams)
{
    enum { player = 1, bType};

    new id = get_param(player);
    g_HasKnife[id] = bool:get_param(bType)
    if(!IsUserValid(id))
        abort(AMX_ERR_NATIVE, "Player out of range (%i)", id);
    if(g_HasKnife[id])
        CmdGive(id);
}
 
Сообщения
1,419
Реакции
2,509
Помог
59 раз(а)
Skiptik, раз не работает значит проверка не проходит. Делаем дебаг ну и смотрим что не так по условиям, потому что всё так же есть проверки не имеющие никакого смысла. Ну не говоря о том что всё плохо по остальному коду. Стоит посмотреть пример реализации кастомного оружия.
 
Сообщения
95
Реакции
6
Помог
2 раз(а)
w0w, Да я согласен что там много костылей, писать к сожалению без костылей не знаю как.
29 Мар 2019
w0w, А можешь рассказать какие проверки не нужны и их можно убрать, для улучшения кода?
 
Сообщения
95
Реакции
6
Помог
2 раз(а)
fantom, я уже понял) вот код что у меня получился
Код:
#include <amxmodx>
#include <customweapon>
#include <hamsandwich>
#include <reapi>

#define WEAPON_ID WEAPON_KNIFE // ID оружия
#define WEAPON_NAME "weapon_knife" // Название оружия
#define WEAPON_DAMAGE 3.0 // Скорость бега. Закоментировать если количество по умолчанию
#define MODEL_V "models/k/Knife/Gold/v_dagger.mdl" // Модель V оружия.
#define MODEL_P "models/k/Knife/Gold/p_dagger.mdl" // Модель P оружия.

#define WEAPON_UID 1
#define GetWeponID(%1) WeaponIdType:get_member(%1, m_iId)
#define IsCustomWeapon(%1) bool:(get_entvar(%1, var_impulse) == WEAPON_UID)
#define IsUserValid(%0) (1 <= %0 <= MaxClients)
new bool:g_HasKnife[MAX_CLIENTS] = false

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

public plugin_init() {
    RegisterHam(Ham_Item_Deploy, WEAPON_NAME, "Item_Deploy_Post", true);
    RegisterHookChain(RG_CBasePlayer_Spawn, "PlayerSpawn", true);
    RegisterHookChain(RG_CBasePlayer_TakeDamage, "CBasePlayer_TakeDamage", false);
}

public Check_CmdGive(id){
    new iActiveItem = get_member(id, m_pActiveItem)
    if(GetWeponID(iActiveItem) != WEAPON_ID){
        g_HasKnife[id] = true
        CmdGive(id)
    }else{
        client_print_color(id, print_team_default, "Уберите нож из рук")
    }
}

public CmdGive(id) {
    new iActiveItem = get_member(id, m_pActiveItem)
    if(GetWeponID(iActiveItem) != WEAPON_ID && g_HasKnife[id]){
        CustomWeaponKnifeSpeed(id, false)
        CustomWeaponKnifeGravity(id, false)
        CustomWeaponKnifeUltra(id, false)
        new weapon = rg_give_custom_item(id, WEAPON_NAME, GT_REPLACE, WEAPON_UID);
        if (is_nullent(weapon)) {
            return PLUGIN_HANDLED;
        }
    }else{
        client_print_color(id, print_team_default, "Уберите нож из рук")
    }
       return PLUGIN_HANDLED;
}

public Item_Deploy_Post(weapon) {
        if (!IsCustomWeapon(weapon)) {
           return HAM_IGNORED;
        }

       new id = get_member(weapon, m_pPlayer);
    if(id > 0 && g_HasKnife[id]){
        set_entvar(id, var_viewmodel, MODEL_V);
        set_entvar(id, var_weaponmodel, MODEL_P);
    }
    return HAM_IGNORED;
}

public CBasePlayer_TakeDamage(victim, inflictor, attacker, Float:damage, damagebits){
    new weapon = get_member(attacker, m_pActiveItem)
    if (!is_user_connected(attacker) || victim == attacker || !IsCustomWeapon(weapon)) {
          return HC_CONTINUE;
    }
    SetHookChainArg(4, ATYPE_FLOAT, damage*WEAPON_DAMAGE)
    return HC_CONTINUE;
}

public PlayerSpawn(id){
    if(g_HasKnife[id] == true){
        rg_give_custom_item(id, WEAPON_NAME, GT_REPLACE, WEAPON_UID)
    }
}

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

public plugin_natives()
{
    register_library("customweapon");
        register_native("CustomWeaponKnifeGold",    "__CustomWeaponKnifeGold");
}

public __CustomWeaponKnifeGold(iPlugin, iParams)
{
    enum { player = 1, bType};

    new id = get_param(player);
    g_HasKnife[id] = bool:get_param(bType)
    if(!IsUserValid(id))
        abort(AMX_ERR_NATIVE, "Player out of range (%i)", id);
    if(g_HasKnife[id])
        CmdGive(id);
}
 
Сообщения
2,491
Реакции
2,791
Помог
61 раз(а)
Skiptik,
  1. new bool:g_HasKnife[MAX_CLIENTS] = false - Mistrick верно подметил что вылетит 32-ой игрок
  2. А теперь бросьте гранату и пока она летит переключитесь на нож. Вы будете приятно удивлены
 
Сообщения
95
Реакции
6
Помог
2 раз(а)
fantom,
new bool:g_HasKnife[MAX_CLIENTS] = false - @Mistrick верно подметил что вылетит 32-ой игрок
Исправил
А теперь бросьте гранату и пока она летит переключитесь на нож. Вы будете приятно удивлены
хм, а как можно поправить?
 
Сообщения
2,491
Реакции
2,791
Помог
61 раз(а)
Skiptik, проверять inflictor
29 Мар 2019
Он должен быть равен id атакуещого игрока
29 Мар 2019
Еще одна бага в получении активного айтема у атакуещого ДО проверки на его коннект
 
Сообщения
95
Реакции
6
Помог
2 раз(а)
fantom,
Еще одна бага в получении активного айтема у атакуещого ДО проверки на его коннект
я так понимаю ошибка появилась изза этого?
Код:
[ReAPI] get_entvar: invalid entity index -1 [arg_index]
[AMXX] Displaying debug trace (plugin "CustomKnifeGold.amxx", version "unknown")
[AMXX] Run time error 10: native error (native "get_entvar")
[AMXX]    [0] CustomKnifeGold.sma::CBasePlayer_TakeDamage (line 70)
Он должен быть равен id атакуещого игрока
inflictor == attacker
 
Сообщения
160
Реакции
170
Помог
1 раз(а)
Skiptik, Объясните ка мне пожалуйста логическую цепочку названия вашей темы.Написано русским шрифтом а вот на каком языке?
Может все таки стоит исправить?, а то ну честное слово глаза режет да и за язык обидно.
 

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

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