Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

Начисление XP по таймеру и сохранение

Статус пользователя lambda
сообщение 15.9.2017, 15:51
Сообщение #1
Стаж: 8 лет 8 месяцев

Сообщений: 8
Благодарностей: 1
Полезность: 0

Добрый вечер, вновь обращаюсь за помощью. Имеется плагин, что-то наподобии RPG. Суть его такая: через каждые n секунд игрокам начисляется XP, сохранение идет по стим ид в файл, далее человек тратит эти XP в магазине.
Проблема в том что плагин начисляет ХП не проверяя на сервере ли игрок или нет, хотя все проверки имеются. Т.е. есть проверка на то сколько человек на сервере и живой ли он, но не работают. В чем делом может быть?
И второй момент, после покупки к примеру ХП, все сбрасывается с новой картой или при рестарте, т.е. не записывает то что человек прокачал определенный навык.

Cкрытый текст
Код:
#include < amxmodx >
#include < amxmisc >
#include < nvault >
#include < hamsandwich >
#include < fakemeta_util >

#define PLUGIN "player_boost"
#define VERSION "2.0"
#define AUTHOR "RoCk-MaN"

new szModel[32], szBuy[32], szKach[32][4], szCach[32], Float: szTime[32], szVault, informerSyncObj;
new iKey = MENU_KEY_1|MENU_KEY_2|MENU_KEY_3|MENU_KEY_4|MENU_KEY_5|MENU_KEY_6|MENU_KEY_7|MEN
U_KEY_8|MENU_KEY_9|MENU_KEY_0;

#define TIMERG 86444

native cs_reset_user_model(index);
native cs_set_user_model(index, const model[]);
native cs_get_user_money(index);
native cs_set_user_money(index, money, flash = 1);

public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);

register_event("ResetHUD", "set_players_models", "be");
RegisterHam( Ham_Spawn , "player" , "HamSpawnPlayer" , 1 );

szVault = nvault_open("model_ka4");
informerSyncObj = CreateHudSyncObj();

register_clcmd("say /models", "menu_player");
register_clcmd("say /test", "test");
register_menu("Models", iKey, "func_menu");
}

public test(id) {
szCach[id] += 400;
}

public HamSpawnPlayer(id) {
if( !is_user_alive(id) )
return;
switch(szKach[id][0]) {
case 1: {
fm_set_user_health(id, get_user_health(id) + 5);
}
case 2: {
fm_set_user_health(id, get_user_health(id) + 10);
}
case 3: {
fm_set_user_health(id, get_user_health(id) + 15);
}
}
switch(szKach[id][1]) {
case 1: {
fm_set_user_armor(id, get_user_armor(id) + 10);
}
case 2: {
fm_set_user_armor(id, get_user_armor(id) + 20);
}
case 3: {
fm_set_user_armor(id, get_user_armor(id) + 30);
}
}
switch(szKach[id][2]) {
case 1: {
cs_set_user_money(id, cs_get_user_money(id) + 500);
client_print(id, print_center, "Доход + 500$");
}
case 2: {
cs_set_user_money(id, cs_get_user_money(id) + 1000);
client_print(id, print_center, "Доход + 1000$");
}
case 3: {
cs_set_user_money(id, cs_get_user_money(id) + 1500);
client_print(id, print_center, "Доход + 1500$");
}
}
switch(szKach[id][3]) {
case 1: {
set_pev(id, pev_gravity, 0.5);
}
case 2: {
set_pev(id, pev_gravity, 0.4);
}
case 3: {
set_pev(id, pev_gravity, 0.3);
}
}
return;
}

public plugin_precache() {
precache_model("models/player/henry/henry.mdl");
}

public menu_player(id) {
static menu[ 512 ] , iLen;
iLen = 0;
static const _info[ 4 ][ ] = { "Нету", "Генри", "Доминик", "Зим" };
iLen = formatex( menu[ iLen ] , charsmax( menu ) - iLen , "\r[\yМеню прокачки\r]^n\wБонус деньги: \y%d^nВаша модель: %s^n^n", szCach[id], _info[szModel[id]]);

iLen += formatex( menu[ iLen ] , charsmax( menu ) - iLen , "\r1. %sКупить модель \r[\y200\r]^n", szCach[id] >= 200 && szBuy[id] < 3 ? "\w" : "\d" );
iLen += formatex( menu[ iLen ] , charsmax( menu ) - iLen , "\r2. %sМодель: %s %s^n", szBuy[id] >= 1 ? "\w" : "\d", _info[1], szModel[id] == 1 ? "\d[\yВКЛ\d]" : "\d[\rВыкл\d]");

iLen += formatex( menu[ iLen ] , charsmax( menu ) - iLen , "\r3. %sПрокачать хп \r[\w50\r] \r[\y%d\r]^n", szCach[id] >= 50 && szKach[id][0] < 3 ? "\w" : "\d", szKach[id][0] );
iLen += formatex( menu[ iLen ] , charsmax( menu ) - iLen , "\r4. %sПрокачать бронь \r[\w50\r] \r[\y%d\r]^n", szCach[id] >= 50 && szKach[id][1] < 3 ? "\w" : "\d", szKach[id][1] );
iLen += formatex( menu[ iLen ] , charsmax( menu ) - iLen , "\r5. %sПрокачать доход \r[\w70\r] \r[\y%d\r]^n", szCach[id] >= 80 && szKach[id][2] < 3 ? "\w" : "\d", szKach[id][2] );
iLen += formatex( menu[ iLen ] , charsmax( menu ) - iLen , "\r6. %sПрокачать гравитацию \r[\w80\r] \r[\y%d\r]^n", szCach[id] >= 80 && szKach[id][3] < 3 ? "\w" : "\d", szKach[id][3] );

iLen += formatex( menu[ iLen ] , charsmax( menu ) - iLen , "^n\r0. \wВыход" );

szCach[id] >= 200 && szBuy[id] < 3 ? ( iKey |= MENU_KEY_1 ) : ( iKey &= ~MENU_KEY_1 );
szBuy[id] >= 1 ? ( iKey |= MENU_KEY_2 ) : ( iKey &= ~MENU_KEY_2 );
szCach[id] >= 50 && szKach[id][0] < 3 ? ( iKey |= MENU_KEY_3 ) : ( iKey &= ~MENU_KEY_3 );
szCach[id] >= 50 && szKach[id][1] < 3 ? ( iKey |= MENU_KEY_4) : ( iKey &= ~MENU_KEY_4 );
szCach[id] >= 70 && szKach[id][2] < 3 ? ( iKey |= MENU_KEY_5 ) : ( iKey &= ~MENU_KEY_5 );
szCach[id] >= 80 && szKach[id][3] < 3 ? ( iKey |= MENU_KEY_6 ) : ( iKey &= ~MENU_KEY_6 );
( iKey &= ~MENU_KEY_8 );( iKey &= ~MENU_KEY_9 );

show_menu( id , iKey , menu , -1 , "Models" );
return PLUGIN_CONTINUE;
}

public func_menu(id, key)
{
switch(key) {
case 0: {
szCach[id] -= 200;
szBuy[id]++;
menu_player(id);
}
case 1: {
szModel[id] = szModel[id] ? 0 : 1;
set_players_models(id);
menu_player(id);
}
case 2: {
szCach[id] -= 50;
szKach[id][0]++;
menu_player(id);
}
case 3: {
szCach[id] -= 50;
szKach[id][1]++;
menu_player(id);
}
case 4: {
szCach[id] -= 70;
szKach[id][2]++;
menu_player(id);
}
case 5: {
szCach[id] -= 80;
szKach[id][3]++;
menu_player(id);
}
}
}

public set_players_models(id) {

if(!is_user_connected(id))
return PLUGIN_CONTINUE;

switch( szModel[id] ) {
case 0: cs_reset_user_model(id);
case 1: cs_set_user_model(id, "henry");
}
return PLUGIN_CONTINUE;
}

public client_putinserver(id) {
szModel[id] = 0;
szBuy[id] = 0;
szKach[id][0] = 0;
szKach[id][1] = 0;
szKach[id][2] = 0;
szKach[id][3] = 0;
LoadData(id);
if( !is_user_hltv(id) && !is_user_bot(id) ) {
set_task(1.0, "timer", TIMERG + id, _, _, "b");
szTime[id] = get_gametime();
}
}
public client_disconnect(id) {
SaveData(id)
szTime[id] = 0.0;
szModel[id] = 0;
szBuy[id] = 0;
szKach[id][0] = 0;
szKach[id][1] = 0;
szKach[id][2] = 0;
szKach[id][3] = 0;
remove_task(TIMERG+id);
}

public give_cach(id) {
szTime[id] = get_gametime();
new kach = random_num( 1, 10 );
szCach[id] += kach;
client_print(id, print_center, "Бонус деньги: %d", kach);
}

public timer( taskid ) {
new id = taskid - TIMERG;
new watchId = id;
new isAlive = is_user_alive(id);
new hudMessage[128];

if(!is_user_connected(id)){
remove_task(taskid);
return;
}
new players
players = get_playersnum
if (players() >=3)
{

if( ( get_gametime() - szTime[id]) >= 3.0 ) {
give_cach(id);
}
}

if(!isAlive) {
watchId = pev(id,pev_iuser2);
if(!watchId)
return;
}
if(watchId != id) {
new watchName[32];
get_user_name(watchId,watchName,31);

formatex(hudMessage,charsmax(hudMessage),"[ Имя: %s ]^n[ Бонус деньги: %d ]^n",watchName, szCach[watchId]);
}
else {
formatex(hudMessage,charsmax(hudMessage),"[ Бонус деньги: %d ]^n", szCach[id]);
}

set_hudmessage(170, 170, 170, -1.0, 0.80, 0, 0.0, 1.5, 0.1, 0.2, 2)
ShowSyncHudMsg( id, informerSyncObj, hudMessage);
}
public plugin_end() {
for(new i = 0; i < get_maxplayers(); i++) {
SaveData(i);
}
nvault_close(szVault);
}
public SaveData(id) {
if(is_user_bot(id))
return PLUGIN_HANDLED;

new AuthID[35];

get_user_authid(id,AuthID,35);

new vaultkey[64],vaultdata[256];
format(vaultkey,63,"%s-Mod",AuthID);
format(vaultdata,255,"%i#%i#%i#%i#%i#", szCach[id], szBuy[id], szKach[id][0], szKach[id][1], szKach[id][2], szKach[id][3]);
nvault_set(szVault,vaultkey,vaultdata);
return PLUGIN_CONTINUE;
}

public LoadData(id) {
new AuthID[35];

get_user_authid(id,AuthID,35);

new vaultkey[64],vaultdata[256];
format(vaultkey,63,"%s-Mod",AuthID);
format(vaultdata,255,"%i#%i#%i#%i#%i#", szCach[id], szBuy[id], szKach[id][0], szKach[id][1], szKach[id][2], szKach[id][3]);
nvault_get(szVault,vaultkey,vaultdata,255);

replace_all(vaultdata, 255, "#", " ");

new playercach[32], playerbuy[32], playerkach[32], playerkach1[32], playerkach2[32], playerkach3[32];

parse(vaultdata, playercach, 31, playerbuy, 31, playerkach, 31, playerkach1, 31, playerkach2, 31, playerkach3, 31);
szCach[id] = str_to_num(playercach);
szBuy[id] = str_to_num(playerbuy);
szKach[id][0] = str_to_num(playerkach);
szKach[id][1] = str_to_num(playerkach1);
szKach[id][2] = str_to_num(playerkach2);
szKach[id][3] = str_to_num(playerkach3);
return PLUGIN_CONTINUE;
}


Причина: Код под спойлер.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя Vasiok007
сообщение 16.9.2017, 12:13
Сообщение #2


Стаж: 15 лет
Город: Кишинев

Сообщений: 157
Благодарностей: 56
Полезность: 258

Прикрепленный файл  player_boost.sma ( 8,35 килобайт ) Кол-во скачиваний: 6


Мир всем местным
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя lambda
сообщение 16.9.2017, 14:11
Сообщение #3
Стаж: 8 лет 8 месяцев

Сообщений: 8
Благодарностей: 1
Полезность: 0

Вопрос с начислением, пытаюсь решить по другому уже, не по времени, а в начале раунда, но все равно не выходит.
В public plugin_init() добавляю следующее:

Код:
register_logevent("Startround", 2, "1=Round_Start")

Далее пытаюсь сделать так:
Cкрытый текст
Код:
public give_cach(id) {
szTime[id] = get_gametime();
new kach = random_num( 1, 10 );
szCach[id] += kach;
client_print(id, print_center, "Бонус деньги: %d", kach);
}


public StartRound(){
give_cache(id);
}


Но все равно беда, удалять szTime[id] = get_gametime(); думаю не стоит, как сделать тогда?
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fullserver
сообщение 16.9.2017, 14:45
Сообщение #4


Иконка группы

Стаж: 11 лет

Сообщений: 5122
Благодарностей: 2100
Полезность: 1394

Чтобы использовать такой код в начале раунда, сначала надо пробежаться по циклу игроков. Иначе, каким образом, функция узнает, кому выдавать $?

Но, так как уже имеется Ham_Spawn, то достаточно добавить give_cache(id) в него.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя lambda
сообщение 16.9.2017, 14:58
Сообщение #5
Стаж: 8 лет 8 месяцев

Сообщений: 8
Благодарностей: 1
Полезность: 0

Цитата(Fullserver @ 16.9.2017, 14:45) *
Чтобы использовать такой код в начале раунда, сначала надо пробежаться по циклу игроков. Иначе, каким образом, функция узнает, кому выдавать $?

Но, так как уже имеется Ham_Spawn, то достаточно добавить give_cache(id) в него.

Не понял если честно. Мне нужно чтобы в начале раунда начислялись XP ( give_cache(id) )

Код
public HamSpawnPlayer(id) {
    if( !is_user_alive(id) )
        {
             give_cache(id)
         }
        return;
    }
}


это имеете ввиду ? но в таком случае, те кто возродился повторно получат XP, нужно один раз за раунд, т.е. после старта раунда или после фриза.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fullserver
сообщение 16.9.2017, 15:02
Сообщение #6


Иконка группы

Стаж: 11 лет

Сообщений: 5122
Благодарностей: 2100
Полезность: 1394

lambda, в таком случае
Код:
public StartRound(){
new players[32], player, pnum;
get_players(players, pnum, "a");
for(new i = 0; i < pnum; i++)
{
player = players[i];
if(is_user_alive(player))
give_cache(player)
}
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя lambda
сообщение 16.9.2017, 15:12
Сообщение #7
Стаж: 8 лет 8 месяцев

Сообщений: 8
Благодарностей: 1
Полезность: 0

Fullserver, Fullserver,

Ошибка при компиляции.
give_cache(id) пробовал так еще подставить, не вышло.
Прикрепленные файлы:
Прикрепленное изображение
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fullserver
сообщение 16.9.2017, 15:18
Сообщение #8


Иконка группы

Стаж: 11 лет

Сообщений: 5122
Благодарностей: 2100
Полезность: 1394

lambda, так попробуйте.
Cкрытый текст
Код:
public StartRound(){
new players[32], player, pnum;
get_players(players, pnum, "a");
for(new i = 0; i < pnum; i++)
{
player = players[i];
if(is_user_alive(player))
give_cache(player);
}
}
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя lambda
сообщение 16.9.2017, 15:24
Сообщение #9
Стаж: 8 лет 8 месяцев

Сообщений: 8
Благодарностей: 1
Полезность: 0

Fullserver, Ошибка та же.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Fullserver
сообщение 16.9.2017, 15:26
Сообщение #10


Иконка группы

Стаж: 11 лет

Сообщений: 5122
Благодарностей: 2100
Полезность: 1394

lambda, так у вас функция называется give_cach(id) а не give_cache
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя lambda
сообщение 16.9.2017, 17:04
Сообщение #11
Стаж: 8 лет 8 месяцев

Сообщений: 8
Благодарностей: 1
Полезность: 0

Цитата(Fullserver @ 16.9.2017, 15:26) *
lambda, так у вас функция называется give_cach(id) а не give_cache

Вы правы, туплю, целый день с этим вожусь (
Но проблема все равно остается, в начале раунда ХП не выдается.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: