ограничение на покупку hp работает неправильно

Сообщения
61
Реакции
9
Помог
1 раз(а)
Находил плагин на покупку хп, немного отредактировал его сделав ограничение за раунд и чтобы нельзя было покупать зомби-классу - вороне
Из исходника вороны добавил в этот плагин добавил
new g_zclass_crow
Получился такой код

Код:
#include <amxmodx>
#include <fun>
#include <fakemeta>
#include <zombieplague>
#include <reapi>


new const g_item_nameZm[] = { "1000hp" }
//new const g_item_discription[] = { "2 раза" }
const g_item_costZm = 15
new g_itemid_buyhpZm
new hpamountZm
new g_zclass_crow
new g_iHPBuyZm[33]

public plugin_init()
{
    register_plugin("[ZP] Buy Health Points", "1.0", "T[h]E Dis[as]teR")
    hpamountZm = register_cvar("zp_buyhp_amountZm", "1000")
    
    RegisterHookChain(RG_CSGameRules_RestartRound, "CSGameRules_RestartRound_Post", true);
    
    g_itemid_buyhpZm = zp_register_extra_item(g_item_nameZm, g_item_costZm, ZP_TEAM_ZOMBIE)
}

public CSGameRules_RestartRound_Post()
{
    new iPlayers[32], iPlayerCount, i, player
    get_players(iPlayers, iPlayerCount, "a")
    for(i = 0; i < iPlayerCount; i++)
    {
        player = iPlayers[i]
        g_iHPBuyZm[player] = 0
    }
}

public zp_extra_item_selected(id,itemid)
{
    if(is_user_alive(id) && itemid == g_itemid_buyhpZm)
    {
        if(g_iHPBuyZm[id] >= 2)
        {
            client_print(id, print_chat,"Можно купить только 2 раза!");
            zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + 15);
        }
        else
        {
            if(zp_get_user_ammo_packs(id) < 15)
            {
                client_print(id, print_chat,"Недостаточно аммо!");
            }
            else
            {
            if(zp_get_user_zombie_class(id) || g_zclass_crow)
            {
                client_print(id, print_chat,"Недоступно для этого класса зомби!");
                zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + 15);
            }
            else
            {
                set_user_health(id,get_user_health(id)+get_pcvar_num(hpamountZm));
                zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) - 15);
                client_print(id, print_chat,"Куплено 1000hp");
                
                g_iHPBuyZm[id]++
            }
        }
    }
}
}
Собственно вот тут

Код:
if(zp_get_user_zombie_class(id) || g_zclass_crow)

            {

                client_print(id, print_chat,"Недоступно для этого класса зомби!");

                zp_set_user_ammo_packs(id, zp_get_user_ammo_packs(id) + 15);

            }
он по идее должен определять ворона это или нет, если ворона - не дать купить хп, если не ворона - покупка хп возможна, плагин от части работает, но не правильно. Если у меня, допустим, зомбикласс1 - покупка не работает, если зомбикласс2 - работает, то есть на каких-то классах работает, на каких-то нет
Может || заменить на что-то другое нужно? Я просто новичок в этом, не особо понимаю
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
g_zclass_crow это и есть ворона?)
 
Сообщения
61
Реакции
9
Помог
1 раз(а)
Code_0xABC, понял, сейчас попробую!
8 Фев 2024
Code_0xABC, теперь покупается у всех зомби, включая ворону :(
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
zmuser, а что хранит у тебя g_zclass_crow ? Не 0 случайно?
 
Сообщения
61
Реакции
9
Помог
1 раз(а)
Code_0xABC, целый класс зомби-вороны из ссылки которую я выше скинул
Или не получится использовать данные из других плагинов, нужно все в один делать? И класс зомби, и покупку хп?


Код:
new g_zclass_crow

public plugin_precache()
{
    g_zclass_crow = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)
}

public client_PreThink(id)
{
    if(!is_user_alive(id) || !zp_get_user_zombie(id) || zp_class_assassin_get(id) || zp_get_user_nemesis(id))
        return PLUGIN_CONTINUE

    if(zp_get_user_zombie_class(id) != g_zclass_crow)
        return PLUGIN_CONTINUE
 
    new Float:fAim[3] , Float:fVelocity[3];
    VelocityByAim(id , get_cvar_num(CVAR_JP_SPEED) , fAim);

    if(!(get_user_button(id) & IN_JUMP))
    {
        fVelocity[0] = fAim[0];
        fVelocity[1] = fAim[1];
        fVelocity[2] = fAim[2];

        set_user_velocity(id , fVelocity);
    }
    return PLUGIN_CONTINUE;
}

// User Infected forward
public zp_user_infected_post(id, infector)
{     
    if (zp_get_user_zombie_class(id) == g_zclass_crow && !zp_class_assassin_get(id) && !zp_get_user_nemesis(id))
    {
        client_print(id,print_chat,"Для полета нажми один раз пробел")
    }
}
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
Ну наверное нужно сам натив использовать, а не пустую переменную
 
Сообщения
61
Реакции
9
Помог
1 раз(а)
Code_0xABC, а это как, можешь подсказать? А то не понимаю)
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
@zmuser,ну наверное передать в другой плагин id класса зомби
 
Сообщения
75
Реакции
82
Помог
6 раз(а)
Код:
#include <amxmodx>
#include <fun>
#include <zombieplague>
#include <reapi>

const g_item_costZm = 15
new g_itemid_buyhpZm
new hpamountZm
new g_iHPBuyZm[33]

native CrowClassID();

public plugin_init()
{
    register_plugin("[ZP] Buy Health Points", "1.0", "T[h]E Dis[as]teR")
    hpamountZm = register_cvar("zp_buyhp_amountZm", "1000")
    
    RegisterHookChain(RG_CSGameRules_RestartRound, "CSGameRules_RestartRound_Post", true);
    
    g_itemid_buyhpZm = zp_register_extra_item(fmt("%i hp", get_pcvar_num(hpamountZm)), g_item_costZm, ZP_TEAM_ZOMBIE)
}

public CSGameRules_RestartRound_Post()
{
    arrayset(g_iHPBuyZm, 0, sizeof(g_iHPBuyZm));
}

public zp_extra_item_selected(id,itemid)
{
    if(is_user_alive(id) && itemid == g_itemid_buyhpZm)
    {
        if(g_iHPBuyZm[id] >= 2)
        {
            client_print(id, print_chat,"Можно купить только 2 раза!");
            return ZP_PLUGIN_HANDLED;
        }
        
        if(zp_get_user_ammo_packs(id) < g_item_costZm)
        {
            client_print(id, print_chat, "Недостаточно аммо!");
            return ZP_PLUGIN_HANDLED;
        }
        
        if(zp_get_user_zombie_class(id) == CrowClassID())
        {
            client_print(id, print_chat,"Недоступно для этого класса зомби!");
            return ZP_PLUGIN_HANDLED;
        }
        
        new iHealth = get_pcvar_num(hpamountZm);
        set_user_health(id, get_user_health(id) + iHealth);
        client_print(id, print_chat, fmt("Куплено %i hp", iHealth));
        
        g_iHPBuyZm[id]++
    }
    return PLUGIN_HANDLED;
}
Код:
#include <amxmodx>
#include <engine>
#include <fakemeta>
#include <zombieplague>

new const PLUGIN[]  = "[ZP] CROW ZOMBIE";
new const VERSION[] = "1.0";
new const AUTHOR[]  = "v3x+Roadrage";

new g_zclass_crow

new const CVAR_JP_SPEED[]  = "jp_speed";

// Crow Zombie Atributes
new const zclass_name[] = { "Crow Zombie" } // name
new const zclass_info[] = { "Can Fly" } // description
new const zclass_model[] = { "crow" } // model
new const zclass_clawmodel[] = { "v_knife_zombie.mdl" } // claw model
const zclass_health = 100 // health
const zclass_speed = 250 // speed
const Float:zclass_gravity = 0.6 // gravity
const Float:zclass_knockback = 2.0 // knockback

public plugin_init()
{
    register_plugin(PLUGIN , VERSION , AUTHOR);
    register_cvar(CVAR_JP_SPEED    , "250");
}

public plugin_natives()    {
    register_native("CrowClassID", "_CrowClassID", 1);
}

public _CrowClassID()    {
    return g_zclass_crow;
}

public plugin_precache()
{
    g_zclass_crow = zp_register_zombie_class(zclass_name, zclass_info, zclass_model, zclass_clawmodel, zclass_health, zclass_speed, zclass_gravity, zclass_knockback)
}

public client_PreThink(id)
{
    if(!is_user_alive(id) || !zp_get_user_zombie(id) || zp_get_user_nemesis(id))
        return PLUGIN_CONTINUE

    if(zp_get_user_zombie_class(id) != g_zclass_crow)
        return PLUGIN_CONTINUE

    new Float:fAim[3] , Float:fVelocity[3];
    VelocityByAim(id , get_cvar_num(CVAR_JP_SPEED) , fAim);

    if(!(get_user_button(id) & IN_JUMP))
    {
        fVelocity[0] = fAim[0];
        fVelocity[1] = fAim[1];
        fVelocity[2] = fAim[2];

        set_user_velocity(id , fVelocity);
        fm_set_rendering(id, kRenderFxGlowShell, 255, 0, 0, kRenderNormal, 16);
    }
    return PLUGIN_CONTINUE;
}

// User Infected forward
public zp_user_infected_post(id, infector)
{   
    if (zp_get_user_zombie_class(id) == g_zclass_crow && !zp_get_user_nemesis(id))
    {
        client_print(id,print_chat,"[ZP] You are using crow zombie hold jump to fly")
    }
}

// Set entity's rendering type (from fakemeta_util)
stock fm_set_rendering(entity, fx = kRenderFxNone, r = 255, g = 255, b = 255, render = kRenderNormal, amount = 16)
{
    static Float:color[3]
    color[0] = float(r)
    color[1] = float(g)
    color[2] = float(b)

    set_pev(entity, pev_renderfx, fx)
    set_pev(entity, pev_rendercolor, color)
    set_pev(entity, pev_rendermode, render)
    set_pev(entity, pev_renderamt, float(amount))
}
 
Последнее редактирование:
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
zmuser, что там изучать, через натив передан id класса твоего ворона, ну и плюс reapi конечно же)) только не пойму, зачем инклуид fun остался
 
Сообщения
61
Реакции
9
Помог
1 раз(а)
Code_0xABC, ну я в этих делах совсем не понимаю, так что для меня есть что изучить) И по примеру работать можно будет
set_user_health не через fun работает?
Кстати, для чего после неудачной попытки покупки пишется
return ZP_PLUGIN_HANDLED; ? У меня аналогичный плагин для людей еще есть, нужно ли это там тоже дописывать? А то вроде и так работает
PS проверил работу плагина - все работает как нужно, еще раз спасибо!
 
Последнее редактирование:
Сообщения
1,041
Реакции
206
Предупреждения
1
Помог
6 раз(а)
zmuser, чтобы прервать функцию
 
Сообщения
1,082
Реакции
58
Помог
11 раз(а)
zmuser,
return ZP_PLUGIN_HANDLED; ?
Код:
/*zombieplague.inc*/
/* Custom forward return values */
#define ZP_PLUGIN_HANDLED 97

/*Zombie Plague.sma*/
ExecuteForward(g_fwExtraItemSelected, g_fwDummyResult, id, itemid);

// Item purchase blocked, restore buyer's ammo packs
if (g_fwDummyResult >= ZP_PLUGIN_HANDLED && !ignorecost)
    g_ammopacks[id] += ArrayGetCell(g_extraitem_cost, itemid)
ну я в этих делах совсем не понимаю, так что для меня есть что изучить) И по примеру работать можно будет set_user_health не через fun работает?
из reapi_engine_const.inc
Код:
/*
* Description:      -
* Member type:      float
* Get params:       Float:get_entvar(index, EntVars:var);
* Set params:       set_entvar(index, EntVars:var, Float:value);
*/
var_health,
 
Последнее редактирование:

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

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