Иконка ресурса

Save score & money 1.3.7

Нет прав для скачивания
Сообщения
16
Реакции
2
Minni, Попробовал , но при рестарт раунде сбрасывается счет на 0 , хотел сделать как на фк , чтоб счет после смены сторон и рестарт раунда не сбрасывался у игроков.
 
Сообщения
2,143
Реакции
1,223
Помог
44 раз(а)
Так рестарте раунда или рестарте карты?
 
Сообщения
16
Реакции
2
Minni, Ну как бы , чтоб счет игроков сбрасывался тока при смене карты , а при рестарт раунде оставался неизменным
 
Сообщения
2,143
Реакции
1,223
Помог
44 раз(а)
Ronyk, понятия не имею, будет ли это работать так, как ты хочешь. Извини, мне было лень проверять.
Код:
#include <amxmodx>
#include <reapi>

enum _:DATA { Float:KILLS, DEATH };

new g_szTempData[MAX_CLIENTS + 1][DATA];
new g_szAuthID[MAX_CLIENTS + 1][32];

new Trie:g_tPlayerScore;

new HookChain:hRestartRoundPost;

public plugin_end() {
    TrieDestroy(g_tPlayerScore);
}

public plugin_init() {
    register_plugin("Save score", "1.1.0", "Minni Mouse");

    RegisterHookChain(RG_RoundEnd, "refwd_RoundEnd_Post", .post = true);

    DisableHookChain((hRestartRoundPost =
        RegisterHookChain(RG_CSGameRules_RestartRound, "refwd_RestartRound_Post", .post = true))
    );

    g_tPlayerScore = TrieCreate();
}

public client_disconnected(pPlayer) {
    if(is_user_hltv(pPlayer) || is_user_bot(pPlayer)) {
        return;
    }

    func_GetData(pPlayer);
}

public client_putinserver(pPlayer) {
    if(is_user_hltv(pPlayer) || is_user_bot(pPlayer)) {
        return;
    }

    get_user_authid(pPlayer, g_szAuthID[pPlayer], charsmax(g_szAuthID[]));

    func_SetData(pPlayer);
}

public refwd_RestartRound_Post() {
    DisableHookChain(hRestartRoundPost);

    new iPlayers[MAX_CLIENTS], iNum;
    get_players(iPlayers, iNum, "ch");

    for(new i = 0; i < iNum; i++) {
        func_SetData(iPlayers[i]);
    }
}

public refwd_RoundEnd_Post(WinStatus:status, ScenarioEventEndRound:event, Float:tmDelay) {
    if(event == ROUND_GAME_COMMENCE || event == ROUND_GAME_RESTART) {
        EnableHookChain(hRestartRoundPost);
    }
}

func_GetData(pPlayer) {
    if(g_szAuthID[pPlayer][0]) {
        g_szTempData[pPlayer][KILLS] = Float:get_entvar(pPlayer, var_frags);
        g_szTempData[pPlayer][DEATH] = get_member(pPlayer, m_iDeaths);

        TrieSetArray(g_tPlayerScore, g_szAuthID[pPlayer], g_szTempData[pPlayer], DATA);
    }
}

func_SetData(pPlayer) {
    if(TrieGetArray(g_tPlayerScore, g_szAuthID[pPlayer], g_szTempData[pPlayer], DATA)) {
        set_entvar(pPlayer, var_frags, g_szTempData[pPlayer][KILLS]);
        set_member(pPlayer, m_iDeaths, g_szTempData[pPlayer][DEATH]);
    }
    else {
        arrayset(_:g_szTempData[pPlayer], _:0.0, sizeof(g_szTempData[]));
    }
}
 
Сообщения
16
Реакции
2
Minni, К сожалению не сработало , но все равно большое спасибо за попытку.
 
Сообщения
2,143
Реакции
1,223
Помог
44 раз(а)
Ronyk, если не забуду, то как дома буду - сделаю.
 
Сообщения
2,491
Реакции
2,790
Помог
61 раз(а)
Minni попросили кое-что изменить. В общем посмотрел, решил немного пересмотреть плагин. Вот немножко улучшил. Правда я в своем кодстайле сделал. Основной принцип остался прежним.
Код:
#include <amxmodx>
#include <reapi>

enum _:player_s {
    PLAYER_KILLS,
    PLAYER_DEATH,
    PLAYER_MONEY,
};

new PlayerData[player_s];
new PlayersAuthId[MAX_PLAYERS + 1][32];

new Trie:PlayersScore;

public plugin_init() {
    RegisterHookChain(RG_CSGameRules_RestartRound, "CSGameRules_RestartRound_Pre", false);
    PlayersScore = TrieCreate();
}

public plugin_end() {
    TrieDestroy(PlayersScore);
}

public client_putinserver(id) {
    if(is_user_hltv(id) || is_user_bot(id)) {
        PlayersAuthId[id][0] = EOS;
        return;
    }

    get_user_authid(id, PlayersAuthId[id], charsmax(PlayersAuthId[]));
    if (!TrieGetArray(PlayersScore, PlayersAuthId[id], PlayerData, sizeof PlayerData)) {
        return;
    }
    
    set_entvar(id, var_frags, float(PlayerData[PLAYER_KILLS]));
    set_member(id, m_iDeaths, PlayerData[PLAYER_DEATH]);
    rg_add_account(id, PlayerData[PLAYER_MONEY], AS_SET, false);
}

public client_disconnected(id) {
    if(PlayersAuthId[id][0] == EOS) {
        return;
    }


    PlayerData[PLAYER_KILLS] = floatround(Float:get_entvar(id, var_frags));
    PlayerData[PLAYER_DEATH] = get_member(id, m_iDeaths);
    PlayerData[PLAYER_MONEY] = get_member(id, m_iAccount);

    TrieSetArray(PlayersScore, PlayersAuthId[id], PlayerData, sizeof PlayerData);
}

public CSGameRules_RestartRound_Pre() {
    if (get_member_game(m_bCompleteReset)) {
        TrieClear(PlayersScore);
    }
}
 
Сообщения
2,143
Реакции
1,223
Помог
44 раз(а)
Блин... Я за парня забыл. Упс.

Ronyk, еще актуально?
 
Сообщения
190
Реакции
16
Помог
1 раз(а)
Minni, да, если можно, чтобы при рестарте счет команд и убийства и смерти не обнуляло, а сделать специальный квар - при 1 не обнулять после рестарта, 0 оьнулять. Именно так можно будет что-то подобное реализовать как на ФК, тогда я и сам позаимствую.
 
Сообщения
287
Реакции
223
Помог
6 раз(а)
Можно было бы и без RG_RoundEnd обойтись, просто проверяя m_bCompleteReset на true и в хуке RestartRound его же и отключать
 
Сообщения
2,143
Реакции
1,223
Помог
44 раз(а)
shadow, да я писал это чёрт знает когда. Просто выложил, как ненужный хлам, который может кому пригодится. Если хочешь, можешь доработать. Обновлю ресурс.
 
Сообщения
322
Реакции
6
Помог
1 раз(а)
Player retry adds money + 800
 

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

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