Поднятие монеты только киллеру

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
143
Реакции
68
Помог
1 раз(а)
Здравствуйте.
Кто может подсказать вот в чем.
С примеров сделал плагин выпадения монеты с тела после убийства.
Есть проверка на регистрацию игрока на сайте.
Не могу только пока сделать проверку на киллера. То есть, чтобы монету мог подбирать только убийца.

Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <gamecms5>

#define PLUGIN "Coins"
#define VERSION "1.0"
#define AUTHOR "Fenix"

#define CLASSNAME_DEFAULT "info_null"
#define CLASSNAME_SET "info_coin"
#define COIN_MODEL "models/coin/exp2_blue.mdl"
#define COIN_SOUND "coin/coin.wav"

new Float:fMoney = 0.05;     //сумма денег за монетку (на баланс сайта)

public plugin_precache()
{
    precache_model(COIN_MODEL);
    precache_sound(COIN_SOUND);
}

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    register_dictionary("present_coins.txt");
    
    RegisterHam(Ham_Killed, "player", "fw_KilledPlayerPost", true);
    RegisterHam(Ham_Touch, CLASSNAME_DEFAULT, "fw_TouchCoinPost", true);
    RegisterHam(Ham_Think, CLASSNAME_DEFAULT, "fw_ThinkCoinPost", true);
    
    register_logevent("event_RoundEnd", 2, "1=Round_End");
}

public fw_KilledPlayerPost(iVictim, iAttacker, iCorpse)
{
    if(!is_user_connected(iVictim))
        return;

    new Float: fOrigin[3], Float: fVelocity[3];
    pev(iVictim, pev_origin, fOrigin);
        
    new iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, CLASSNAME_DEFAULT));
            
    set_pev(iEnt, pev_classname, CLASSNAME_SET);
    set_pev(iEnt, pev_origin, fOrigin);
    set_pev(iEnt, pev_solid, SOLID_TRIGGER);
    set_pev(iEnt, pev_movetype, MOVETYPE_NONE);
    set_pev(iEnt, pev_framerate, 1.0);
    engfunc(EngFunc_DropToFloor, iEnt)
        
    engfunc(EngFunc_SetSize, iEnt, Float: {-10.0, -10.0, -10.0}, Float: {10.0, 10.0, 10.0});
    engfunc(EngFunc_SetModel, iEnt, COIN_MODEL);
      
    set_pev(iEnt, pev_velocity, fVelocity);
    set_pev(iEnt, pev_nextthink, get_gametime() + 15);
}

public fw_TouchCoinPost(iEnt, id)
{
    if(!pev_valid(iEnt) || !is_user_alive(id))
        return;

    if (cmsapi_is_user_member(id))
    {
        static sClassName[32];
        pev(iEnt, pev_classname, sClassName, charsmax(sClassName));
        
        if(!equal(sClassName, CLASSNAME_SET))
            return;
            
        cmsapi_add_user_money(id, fMoney);
        client_print_color(id, print_team_default, "%L", LANG_SERVER, "CMS_COINT_TAKE", fMoney);

        emit_sound(id, CHAN_WEAPON, COIN_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    
        set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);
    }
    
    else
    {
        client_print_color(id, print_team_default, "%L", LANG_SERVER, "CMS_COINT_NO_TAKE");
    }
}

public fw_ThinkCoinPost(iEnt)
{
    if(!pev_valid(iEnt))
        return;
        
    static sClassName[32];
    pev(iEnt, pev_classname, sClassName, charsmax(sClassName));
    
    if(!equal(sClassName, CLASSNAME_SET))
        return;
        
    set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);
}

public event_RoundEnd()
{
    new iEnt = FM_NULLENT;
    
    while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", CLASSNAME_SET)))
        if(pev_valid(iEnt))
            set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);
}
Вот что получилось. Буду оч. рад за помощь.
 
Сообщения
1,304
Реакции
2,303
Помог
57 раз(а)
roten, заноси индекс киллера в какое-то pev_ поле монеты. Соотвественно при таче вынимаешь оттуда (из pev_) этот индекс, сравникаешь с индексом того кто касается. Равен - можно. Не равен - нельзя.
 
Сообщения
336
Реакции
414
Помог
7 раз(а)
Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#include <gamecms5>

#define CLASSNAME_DEFAULT    "info_null"
#define CLASSNAME_SET        "info_coin"
#define COIN_MODEL            "models/coin/exp2_blue.mdl"
#define COIN_SOUND            "coin/coin.wav"

new Float:g_fMoney = 0.05;    //сумма денег за монетку (на баланс сайта)

public plugin_precache()
{
    precache_model(COIN_MODEL);
    precache_sound(COIN_SOUND);
}

public plugin_init()
{
    register_plugin("Coins", "1.0", "Fenix");
    register_dictionary("present_coins.txt");
    
    RegisterHam(Ham_Killed, "player", "fw_KilledPlayerPost", true);
    RegisterHam(Ham_Touch, CLASSNAME_DEFAULT, "fw_TouchCoinPost", true);
    RegisterHam(Ham_Think, CLASSNAME_DEFAULT, "fw_ThinkCoinPost", true);
    
    register_logevent("event_RoundEnd", 2, "1=Round_End");
}

public fw_KilledPlayerPost(iVictim, iAttacker, iCorpse)
{
    if(!is_user_connected(iVictim))
    {
        return;
    }

    new Float:fOrigin[3], Float:fVelocity[3];
    pev(iVictim, pev_origin, fOrigin);
        
    new iEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, CLASSNAME_DEFAULT));
            
    set_pev(iEnt, pev_classname, CLASSNAME_SET);
    set_pev(iEnt, pev_origin, fOrigin);
    set_pev(iEnt, pev_solid, SOLID_TRIGGER);
    set_pev(iEnt, pev_movetype, MOVETYPE_NONE);
    set_pev(iEnt, pev_framerate, 1.0);
    engfunc(EngFunc_DropToFloor, iEnt)
        
    engfunc(EngFunc_SetSize, iEnt, Float:{-10.0, -10.0, -10.0}, Float:{10.0, 10.0, 10.0});
    engfunc(EngFunc_SetModel, iEnt, COIN_MODEL);
      
    set_pev(iEnt, pev_velocity, fVelocity);
    set_pev(iEnt, pev_nextthink, get_gametime() + 15.0);

    // Записываем убийцу во владельцы энтити
    set_pev(iEnt, pev_owner, iAttacker);
}

public fw_TouchCoinPost(iEnt, id)
{
    if(!pev_valid(iEnt) || !is_user_alive(id))
    {
        return;
    }

    // Отрицательная проверка, что владелец энтити - убийца
    if(pev(iEnt, pev_owner) != id)
    {
        return;
    }

    if(cmsapi_is_user_member(id))
    {
        static sClassName[32];
        pev(iEnt, pev_classname, sClassName, charsmax(sClassName));
        
        if(!equal(sClassName, CLASSNAME_SET))
        {
            return;
        }
            
        cmsapi_add_user_money(id, g_fMoney);
        client_print_color(id, print_team_default, "%L", LANG_SERVER, "CMS_COINT_TAKE", g_fMoney);

        emit_sound(id, CHAN_WEAPON, COIN_SOUND, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
    
        set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);
    }
    else
    {
        client_print_color(id, print_team_default, "%L", LANG_SERVER, "CMS_COINT_NO_TAKE");
    }
}

public fw_ThinkCoinPost(iEnt)
{
    if(!pev_valid(iEnt))
    {
        return;
    }
        
    static sClassName[32];
    pev(iEnt, pev_classname, sClassName, charsmax(sClassName));
    
    if(!equal(sClassName, CLASSNAME_SET))
    {
        return;
    }
        
    set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);
}

public event_RoundEnd()
{
    new iEnt = FM_NULLENT;
    
    while((iEnt = engfunc(EngFunc_FindEntityByString, iEnt, "classname", CLASSNAME_SET)) != 0)
    {
        if(pev_valid(iEnt))
        {
            set_pev(iEnt, pev_flags, pev(iEnt, pev_flags) | FL_KILLME);
        }
    }
}
 
Сообщения
143
Реакции
68
Помог
1 раз(а)
Все работает. Большое спасибо тем кто откликнулся. Решение выше. Тему можно закрывать.
 
Статус
В этой теме нельзя размещать новые ответы.

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

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