Зарплата по часу(на подобие payday) -
Mass_Deboose - 17.10.2011
Хочется зделать зарплату не каждый час, а за каждый час онлайна. Тоесть не как раньше с payday, в 11 ч, 12 ч, 13 ч. и так далее, а за каждый час игры, тоесть игрок поиграл 5 минут, вышел, оставшееся время записывается в аккаунт игрока.
Если не сложно помогите переделать.
Re: Зарплата по часу(на подобие payday) -
Mutha_X - 17.10.2011
Код:
enum playerinfo{pMinutes};
new PlayerInfo[MAX_PLAYERS][playerinfo];
// можно и на ПВарах, если хотите, переделать нетрудно.
//PayDay()// переделываешь на...
stock PayDay(playerid)// вызываешь из цикла в любом минутном таймере.
{
if(PlayerInfo[MAX_PLAYERS][pMinutes]>=60)//...
{
//в старом убираешь циклы на игроков и ставишь тут всё, что касается конкретно зарплаты для игрока.
}
else
{// есть предложение проверять на факт афк игроком(прибавлять минуту или нет, очень неплохо для тюряги-отсиживаешь не долго, но мучительно)
PlayerInfo[MAX_PLAYERS][pMinutes]++;
return 0;
}
return 1;
}
Re: Зарплата по часу(на подобие payday) -
Mass_Deboose - 17.10.2011
спасибо, мм, ну, а сохраненияв аккаунт с использованием dini?
Re: Зарплата по часу(на подобие payday) -
DiSE - 18.10.2011
можешь и mxINI, yini, SII
Re: Зарплата по часу(на подобие payday) -
Mutha_X - 18.10.2011
Не люблю всю эту мудрёную х... , пользуюсь проверенным дедовским методом переодического сохранения, если обновилась инфа xD
Re: Зарплата по часу(на подобие payday) -
Dima_Tkach - 18.10.2011
Мутха,напиши нам этот "дедовский способ"
Re: Зарплата по часу(на подобие payday) -
Mass_Deboose - 18.10.2011
Quote:
Originally Posted by DiSE
можешь и mxINI, yini, SII
|
Прекращай флудить, знаю что могу, зачем мне это когда я уже использую dini.
Re: Зарплата по часу(на подобие payday) -
DiSE - 18.10.2011
Quote:
Originally Posted by Mass_Deboose
спасибо, мм, ну, а сохраненияв аккаунт с использованием dini?
|
ты спросил что можно, я тебе и сказал. Не вижу флуда
Re: Зарплата по часу(на подобие payday) -
Mutha_X - 18.10.2011
Quote:
Originally Posted by Dima_Tkach
Мутха,напиши нам этот "дедовский способ" 
|
// примерно так...
Код:
SafePlayerInfo(playerid)
{//sSTR-небольшая глобальная переменная, для единовременного её объявления и уничтожения в озу
new File:f=fopen(playername);
format(sSTR,16,"PPMin=%d\n",PlayerInfo[playerid][pMinutes]);fwrite(sSTR);//название жестко ограничено в длине(5 у меня).
//пихать комп особыми файлообработчиками - садомазохизм... надо проще - по-дедовски пихать xD
fclose(f);
}
// Знаю - примитивно, меня устраивает для моей масштабности, исключение для имён - динамические переменные сохраняются с полным именем и значением, если это необходимо, но кроме этого в сохранялке есть блоки типа ini.
Re: Зарплата по часу(на подобие payday) -
Mass_Deboose - 11.04.2013
Мм, ругается у меня:
error 032: array index out of bounds
error 032: array index out of bounds
на:
Player[
MAX_PLAYERS][pMinutes] >= 60
Player[
MAX_PLAYERS][pMinutes]++;
Re: Зарплата по часу(на подобие payday) -
Alexander_Petrov - 11.04.2013
pawn Code:
Player[MAX_PLAYERS-1][pMinutes] >= 60
Player[MAX_PLAYERS-1][pMinutes]++;
Создается массив от 0 до MAX_PLAYERS-1, в итоге количество ячеек равно MAX_PLAYERS
Re: Зарплата по часу(на подобие payday) -
SHOROOP - 11.04.2013
Ну так зачем проверять элемент в строке с номером MAX_PLAYERS (массив-то двухмерный), если максимально возможный - MAX_PLAYERS-1. Вам нужны соответственно элементы в строке playerid:
Code:
Player[playerid][pMinutes]>=60
и так далее.
Re: Зарплата по часу(на подобие payday) -
Mass_Deboose - 11.04.2013
Не выходит чет все равно. Либо работает для 1ого игрока с идом 0, либо вообще не работает.
Code:
payday = SetTimer("PayDayTimer",60000,1); // ongamemodeinit
public PayDayTimer(playerid)
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(Player[MAX_PLAYERS-1][pMinutes] >= 60)
{
Player[MAX_PLAYERS-1][pExp]++;
Player[MAX_PLAYERS-1][pMinutes] = 0;
}
else
{
Player[MAX_PLAYERS-1][pMinutes]++;
return 0;
}
}
return 1;
}
Re: Зарплата по часу(на подобие payday) -
stabker - 11.04.2013
Mass_Deboose, Alexander_Petrov, вы вообще понимаете, что вместо playerid вставляете константу?

Мощно
Re: Зарплата по часу(на подобие payday) -
James_Braga - 11.04.2013
Quote:
Originally Posted by Mass_Deboose
Не выходит чет все равно. Либо работает для 1ого игрока с идом 0, либо вообще не работает.
Code:
payday = SetTimer("PayDayTimer",60000,1); // ongamemodeinit
public PayDayTimer(playerid)
{
for(new i = 0; i < MAX_PLAYERS; i++)
{
if(Player[MAX_PLAYERS-1][pMinutes] >= 60)
{
Player[MAX_PLAYERS-1][pExp]++;
Player[MAX_PLAYERS-1][pMinutes] = 0;
}
else
{
Player[MAX_PLAYERS-1][pMinutes]++;
return 0;
}
}
return 1;
}
|
PHP Code:
payday = SetTimer("PayDayTimer",60000,1); // ongamemodeinit
public PayDayTimer()
{
for(new i; i != MAX_PLAYERS; i++)
{
if(!IsPlayerConnected(i)) continue;
if(Player[i][pMinutes] >= 60)
{
Player[i][pExp]++;
Player[i][pMinutes] = 0;
}
else Player[i][pMinutes]++;
}
return 1;
}
Re: Зарплата по часу(на подобие payday) -
Mass_Deboose - 11.04.2013
James_Braga, спасибо, проблему решил, все таки дело не в MAX_PLAYERS, а в IsPlayerConnected?
Re: Зарплата по часу(на подобие payday) -
James_Braga - 11.04.2013
Quote:
Originally Posted by Mass_Deboose
James_Braga, спасибо, проблему решил, все таки дело не в MAX_PLAYERS, а в IsPlayerConnected?
|
for(new i; i != MAX_PLAYERS; i++)
new i; - переменная внутри цикла, i = 0 по стандарту.
i != MAX_PLAYERS; - если i(0) не равно MAX_PLAYERS(500), если 0 не равно 500 то
i++ - повышаем переменную, тоесть i+1 = 1
далее действие в скобках
if(!IsPlayerConnected(i)) continue;
дело в i, ты вместо одного ид с цикла использовал MAX_PLAYERS которая по стандарту = 500, если бы у тебя на сервере был бы человек с 500 ид то для него может быть всё и сработало.
if(!IsPlayerConnected(i)) - проверяем подключён ли этот id с цикла к серверу.
если i = 42 а 42 ид нет на сервере(тоесть не подключён) то пропускаем 42 ид, и переходим уже к 43 ид (так как i != MAX_PLAYERS; i++)
если 43 ид подключён к серверу и бегает где то по штату, то continue; не выполняется так как он IsPlayerConnected(i) - подключён к серверу.
Далее идёт действие после if(!IsPlayerConnected(i)).
ps: Обновил пост выше if(!IsPlayerConnected(i)) а не if(!IsPlayerConnected(playerid)).
Re: Зарплата по часу(на подобие payday) -
Mass_Deboose - 11.04.2013
Quote:
Originally Posted by James_Braga
for(new i; i != MAX_PLAYERS; i++)
new i; - переменная внутри цикла, i = 0 по стандарту.
i != MAX_PLAYERS; - если i(0) не равно MAX_PLAYERS(500), если 0 не равно 500 то
i++ - повышаем переменную, тоесть i+1 = 1
далее действие в скобках
if(!IsPlayerConnected(i)) continue;
дело в i, ты вместо одного ид с цикла использовал MAX_PLAYERS которая по стандарту = 500, если бы у тебя на сервере был бы человек с 500 ид то для него может быть всё и сработало.
if(!IsPlayerConnected(i)) - проверяем подключён ли этот id с цикла к серверу.
если i = 42 а 42 ид нет на сервере(тоесть не подключён) то пропускаем 42 ид, и переходим уже к 43 ид (так как i != MAX_PLAYERS; i++)
если 43 ид подключён к серверу и бегает где то по штату, то continue; не выполняется так как он IsPlayerConnected(i) - подключён к серверу.
Далее идёт действие после if(!IsPlayerConnected(i)).
ps: Обновил пост выше if(!IsPlayerConnected(i)) а не if(!IsPlayerConnected(playerid)).
|
Спасибо, что все расписал. У меня еще вопрос, цикл будет работать до 500(MAX_PLAYERS), допустим мой сервер расчитан на 100 человек, можно ли как то сократить, что бы до 500 не проверял?
Code:
#undef MAX_PLAYERS
#define MAX_PLAYERS 100
Поможет?
Re: Зарплата по часу(на подобие payday) -
Alexander_Petrov - 11.04.2013
Quote:
Originally Posted by stabker
Mass_Deboose, Alexander_Petrov, вы вообще понимаете, что вместо playerid вставляете константу?  Мощно
|
Своим вопросом человек дал ясно понять, что он намеревается присвоить значение последней ячейке, предыдущие посты я не читал.
Re: Зарплата по часу(на подобие payday) -
Richard_Gere - 12.04.2013
Сохраняй gettime() последнего payday в аккаунт и проверяй его в таймере, если прошло > 3600 секунд, то payday. Ничего сложного )