[Помощь] Перевод плагин на ReAPI

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
94
Реакции
13
Помог
2 раз(а)
Доброго времени суток. Наткнулся на один плагин, понравился. Решил его переделать под ReAPI. Но как оказалось у меня не достаточно знаний для этого...
Плагин "Система коинсов (Coins System) | Автор: Бизон (По крайне мере так в исходнике написано...) "
Самое простейшее я сделал... А вот с самой монеткой, которая должна выпадать из игрока, возникли трудности...

Я подписал то, что я добавил и что добавленным я заменил... (Чтоб вы не подумали что я просто попрошайничаю сделать за меня...)
C++:
#include <amxmodx>

// New
#include <reapi>

// Old
//#include <fakemeta>
//#include <hamsandwich>


#define PLUGIN "Coins System"
#define VERSION "1.1"
#define AUTHOR "6u3oH"

#define CLASSNAME_DEFAULT "info_null"
#define CLASSNAME_SET "info_coin"
#define PATH_DATABASE "addons/amxmodx/data/coins_system.dat"
#define COIN_MODEL "models/anti_coin/bitcoins.mdl"
#define COIN_SOUND "coin/coin.wav"

// Удаляю..............
//#define PDATA_KILLHEAD_OFFSET 75
//#define PDATA_PLAYER_OFFSET 5
// ========================


/*----------------------------------------------------------
 ------------------------ Настройки ------------------------
 ---------------------------------------------------------*/

#define COIN_GIVE_KILL 1 // Сколько монет давать за простое убийство
#define COIN_GIVE_KILL_HEAD 1 // Сколько монет давать за убийство в голову
#define COIN_GIVE_KILL_KNIFE 3 // Сколько монет давать за убийство ножом

#define COIN_DROP_COINS // Закоментируйте строку, чтобы монеты с игрока не выпадали
#define COIN_NUM_DROPKILL_MIN 1 // Минимальное кол-во монет, выпадающих при смерти игрока
#define COIN_NUM_DROPKILL_MAX 1 // Максимальное кол-во монет, выпадающих при смерти игрока

#define COIN_TIME_REMOVE 30 // Через сколько секунд удаляются выпавшие монеты (закоментриуйте, чтобы удалялись только в конце раунда)

/*----------------------------------------------------------
 ------------------------ Настройки ------------------------
 ---------------------------------------------------------*/

new g_iMaxPlayers;
new g_iCoin[33];

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

public plugin_cfg() write_file(PATH_DATABASE, "[База данных] [Coins System]", 0);
public client_connect(id) load_coins(id);
public client_disconnected(id) save_coins(id);

// Native's
public plugin_natives()
{
    register_native("get_user_coins", "get_user_coins", true)
    register_native("set_user_coins", "set_user_coins", true)
}

public get_user_coins(id) { return g_iCoin[id]; }
public set_user_coins(id, iNum) { g_iCoin[id] = iNum; }
// ========

public plugin_init()
{
    register_plugin(PLUGIN, VERSION, AUTHOR);
    
    // Old
    //RegisterHam(Ham_Killed, "player", "fw_KilledPlayerPost", true);
    // New
    RegisterHookChain(RG_CBasePlayer_Killed, "CBasePlayer_Killed_Post", 1);
    // =====
    
    #if defined COIN_DROP_COINS
        RegisterHam(Ham_Touch, CLASSNAME_DEFAULT, "fw_TouchCoinPost", true);
        register_event("HLTV", "Event_RoundStart", "a", "1=0", "2=0");
        #if defined COIN_TIME_REMOVE
            RegisterHam(Ham_Think, CLASSNAME_DEFAULT, "fw_ThinkCoinPost", true);
        #endif
    #endif

    g_iMaxPlayers = get_maxplayers();
    set_task(2.0, "Task_HudMsg", .flags = "b");
}

public CBasePlayer_Killed_Post(victimId, killerId, iGib)
{
    if(killerId == victimId || !is_user_connected(killerId) || !is_user_connected(victimId)) return;

// Old
    #if defined COIN_DROP_COINS
    if(g_iCoin[victimId] > 0)
    {
        new Float: fOrigin[3], Float: fVelocity[3];
        pev(victimId, pev_origin, fOrigin);
        
        new iRandom = random_num(COIN_NUM_DROPKILL_MIN, COIN_NUM_DROPKILL_MAX);
        
        for(new i; i <= iRandom; i++)
        {
            if(!g_iCoin[victimId])
                break;
            
            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_BOUNCE);
            
            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);
            
            #if defined COIN_TIME_REMOVE
            set_pev(iEnt, pev_nextthink, get_gametime() + COIN_TIME_REMOVE);
            #endif
        }
    }
    #endif
// =====
    new iGiveCoin = g_iCoin[killerId];

// New
    if(get_user_weapon(killerId) == CSW_KNIFE){
        iGiveCoin = COIN_GIVE_KILL_KNIFE;
    } else if(get_member(victimId, m_bHeadshotKilled)) {
        iGiveCoin = COIN_GIVE_KILL_HEAD;
    } else {
        iGiveCoin = COIN_GIVE_KILL;
    }
// ===========   
    g_iCoin[killerId] += iGiveCoin;
        
    set_hudmessage(0, 255, 0, -1.0, 0.26, 0, 0.1, 2.0, 0.1, 0.1, -1);
    show_hudmessage(killerId, "+%i монет", iGiveCoin);
}

#if defined COIN_DROP_COINS
public fw_TouchCoinPost(iEnt, id)
{
    if(!pev_valid(iEnt) || !is_user_alive(id))
        return;
            
    static sClassName[32];
    pev(iEnt, pev_classname, sClassName, charsmax(sClassName));
        
    if(!equal(sClassName, CLASSNAME_SET))
        return;
        
    g_iCoin[id]++;
    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);
}

public Event_RoundStart()
{
    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);
}
#endif

#if defined COIN_TIME_REMOVE
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);
}
#endif

public Task_HudMsg()
{
    set_hudmessage(200, 200, 200, 0.01, 0.90, 0, 0.1, 2.0, 0.1, 0.1, 4);
    
    for(new id = 1; id < g_iMaxPlayers; id++)
    {
        if(!is_user_alive(id))
            continue;
        
    }
}

public load_coins(id)
{
    new iLine = 1, iLen, sData[64], sKey[38], sAuthID[38];
    get_user_authid(id, sAuthID, charsmax(sAuthID));
    
    while((iLine = read_file(PATH_DATABASE, iLine, sData, charsmax(sData), iLen)))
    {
        parse(sData, sKey, 37);
        
        if(equal(sKey, sAuthID))
        {
            parse(sData, sKey, 37, sKey, 37);
            g_iCoin[id] = str_to_num(sKey);
            
            return;
        }
    }
    
    g_iCoin[id] = 0;
}

public save_coins(id)
{
    new iLine = 1, iLen, sData[64], sKey[38], sAuthID[38];
    get_user_authid(id, sAuthID, charsmax(sAuthID));
    
    while((iLine = read_file(PATH_DATABASE, iLine, sData, charsmax(sData), iLen)))
    {
        parse(sData, sKey, 37);
        
        if(equal(sKey, sAuthID))
        {
            format(sData, charsmax(sData), "%s %i", sAuthID, g_iCoin[id]);
            write_file(PATH_DATABASE, sData, iLine-1);
            
            return;
        }
    }
    
    format(sData, charsmax(sData), "%s %i", sAuthID, g_iCoin[id]);
    write_file(PATH_DATABASE, sData, -1);
}

Буду благодарен за любую помощь и подсказки :blush2:
 

RockTheStreet

Саппорт года
Сообщения
1,743
Реакции
346
Помог
40 раз(а)
Обратите внимание, если вы хотите заключить сделку с этим пользователем, он заблокирован
RegisterHam(Ham_Touch, CLASSNAME_DEFAULT, "fw_TouchCoinPost", true);
Используется Хам, но инклюд закоментирован. Как это понимать?
 
Сообщения
94
Реакции
13
Помог
2 раз(а)
melfyk, я же написал, это попытки... Данная строка RegisterHam(Ham_Touch, CLASSNAME_DEFAULT, "fw_TouchCoinPost", true); из оригинального плагина...
 
Сообщения
2,143
Реакции
1,223
Помог
44 раз(а)
Ну, Ham_Touch и Ham_Think можно заменить на SetTouch и SetThink. Различные pev_valid(ent) заменить на is_nullent(ent), да и по мелочи там.
Подсмотреть можешь тут:
 
Сообщения
94
Реакции
13
Помог
2 раз(а)
Можете пожалуйста закрыть тему? Я ее перенесу в раздел заказов. Извините за лишнюю тему...
 
Статус
В этой теме нельзя размещать новые ответы.

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

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