Зарплата по часу(на подобие payday)
#1

Хочется зделать зарплату не каждый час, а за каждый час онлайна. Тоесть не как раньше с payday, в 11 ч, 12 ч, 13 ч. и так далее, а за каждый час игры, тоесть игрок поиграл 5 минут, вышел, оставшееся время записывается в аккаунт игрока.
Если не сложно помогите переделать.
Reply
#2

Код:
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;
}
Reply
#3

спасибо, мм, ну, а сохраненияв аккаунт с использованием dini?
Reply
#4

можешь и mxINI, yini, SII
Reply
#5

Не люблю всю эту мудрёную х... , пользуюсь проверенным дедовским методом переодического сохранения, если обновилась инфа xD
Reply
#6

Мутха,напиши нам этот "дедовский способ"
Reply
#7

Quote:
Originally Posted by DiSE
Посмотреть сообщение
можешь и mxINI, yini, SII
Прекращай флудить, знаю что могу, зачем мне это когда я уже использую dini.
Reply
#8

Quote:
Originally Posted by Mass_Deboose
Посмотреть сообщение
спасибо, мм, ну, а сохраненияв аккаунт с использованием dini?
ты спросил что можно, я тебе и сказал. Не вижу флуда
Reply
#9

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.
Reply
#10

Мм, ругается у меня:
error 032: array index out of bounds
error 032: array index out of bounds
на:
Player[MAX_PLAYERS][pMinutes] >= 60
Player[MAX_PLAYERS][pMinutes]++;
Reply
#11

pawn Code:
Player[MAX_PLAYERS-1][pMinutes] >= 60
Player[MAX_PLAYERS-1][pMinutes]++;
Создается массив от 0 до MAX_PLAYERS-1, в итоге количество ячеек равно MAX_PLAYERS
Reply
#12

Ну так зачем проверять элемент в строке с номером MAX_PLAYERS (массив-то двухмерный), если максимально возможный - MAX_PLAYERS-1. Вам нужны соответственно элементы в строке playerid:
Code:
Player[playerid][pMinutes]>=60
и так далее.
Reply
#13

Не выходит чет все равно. Либо работает для 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;
}
Reply
#14

Mass_Deboose, Alexander_Petrov, вы вообще понимаете, что вместо playerid вставляете константу? Мощно
Reply
#15

Quote:
Originally Posted by Mass_Deboose
View Post
Не выходит чет все равно. Либо работает для 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!= MAX_PLAYERSi++)
    {
        if(!
IsPlayerConnected(i)) continue;
        if(
Player[i][pMinutes] >= 60)
        {
            
Player[i][pExp]++;
            
Player[i][pMinutes] = 0;
        }
        else 
Player[i][pMinutes]++; 
    }
    return 
1;

Reply
#16

James_Braga, спасибо, проблему решил, все таки дело не в MAX_PLAYERS, а в IsPlayerConnected?
Reply
#17

Quote:
Originally Posted by Mass_Deboose
View Post
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)).
Reply
#18

Quote:
Originally Posted by James_Braga
View Post
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
Поможет?
Reply
#19

Quote:
Originally Posted by stabker
View Post
Mass_Deboose, Alexander_Petrov, вы вообще понимаете, что вместо playerid вставляете константу? Мощно
Своим вопросом человек дал ясно понять, что он намеревается присвоить значение последней ячейке, предыдущие посты я не читал.
Reply
#20

Сохраняй gettime() последнего payday в аккаунт и проверяй его в таймере, если прошло > 3600 секунд, то payday. Ничего сложного )
Reply


Forum Jump:


Users browsing this thread: 2 Guest(s)