Рекомендованные сообщения



8 posts in this topic

Проблемы две:

[1] При ПейДее, не появляется надпись "Вы уже отыграли: %d часов"

Вот сток

stock PayDay(playerid)
{
        for(new i=0; i<MAX_PLAYERS; i++) // Цикл проверяющий всех игроков
        {
                new string[144];
                GiveHours(playerid);
				format(string, sizeof(string), "Вы уже отыграли: %d часов", pHours);
        }
}     

Вот паблик в котором вызывается сток

forward UpdateTime(playerid);
public UpdateTime(playerid)
{
        new hour, minute, second;
        gettime(hour, minute, second);
        if(minute == 0) // Зарплата выдается каждый час в 0 минут.
        {
                PayDay(playerid); // Вызываем паблик с зарплатой.
        }
        return 1;
}

[2] После каждого payday в статистике персонажа добавляется по 1000 отыгранных часов, а нужно чтобы по 1 часу.

Вот сток

stock GiveHours(playerid)
{
	    PlayerInfo[playerid][pHours]++;
}

На всякий случай кинул сток ShowStats.

stock ShowStats(playerid, checkadm)
{
	new dialog[400];
	format(dialog, sizeof(dialog),
		"{FFFFFF}Ник:\t\t{0089ff}%s\n\
		{FFFFFF}Пол:\t\t{0089ff}%s\n\
		{FFFFFF}Раса:\t\t{0089ff}%s\n\
		{FFFFFF}Возраст:\t{0089ff}%d лет/год\n\
		{FFFFFF}Организация:\t{0089ff}%s\n\
		{FFFFFF}Отыгранных часов:\t\t{0089ff}%d\n",
	pName(playerid),
	(PlayerInfo[playerid][pSex] == 1) ? ("Мужской") : ("Женский"),
	PlayerRaces[PlayerInfo[playerid][pRace]-1],
	PlayerInfo[playerid][pAge],
	PlayerInfo[playerid][pMember],
	PlayerInfo[playerid][pHours]
	);
	if(checkadm == 0) SPD(playerid, DLG_STATS, DIALOG_STYLE_MSGBOX, !"{ff9300}Статистика персонажа", dialog, !"Назад", !"Закрыть");
	else SPD(playerid, DLG_NONE, DIALOG_STYLE_MSGBOX, !"{ff9300}Статистика персонажа", dialog, !"Закрыть", "");
}

+rep, за одну проблему

Edited by daltwb

Share this post


Link to post
Share on other sites

@daltwb, UpdateTime с какой частотой вызывается? Покажите функцию создания этого таймера.

 

И функцию PayDay замените этой:

stock PayDay(playerid)
{
	new string[144];
	GiveHours(playerid);
	format(string, sizeof(string), "Вы уже отыграли: %d часов", pHours);
	SendClientMessage(playerid, -1, string);
}

 

Share this post


Link to post
Share on other sites

@odosenokВот

SetTimer("UpdateTime", 1000*60, 1); 

 

Share this post


Link to post
Share on other sites

@daltwb, замените этой строкой:

SetTimerEx("UpdateTime", 1000*60, true, "i", playerid); 

И переместите ее в авторизацию (в конец авторизации).

 

p.s. за репутацией тут никто не гонится. И без "+rep за одну проблема" вам помогут.

Все остальное вроде как нормально. Проверьте еще раз в игре.

Share this post


Link to post
Share on other sites

@odosenok В авторизацию? Т.е. в public OnGameModeInit()?

@odosenok Появились ошибки.

Цитата

C:\Users\Администратор\Desktop\SERVER\gamemodes\droid.pwn(152) : warning 202: number of arguments does not match definition
C:\Users\Администратор\Desktop\SERVER\gamemodes\droid.pwn(152) : error 017: undefined symbol "playerid"

 

Share this post


Link to post
Share on other sites

@daltwb, OnGameModeInit - public-функция, вызывающаяся при загрузке игрового мода. А я прошу в авторизацию игрока. Вот он ввел пароль успешно, начинается загрузка данных его аккаунта. Вот туда и нужно добавить этот таймер.


Ах, да, его еще удалить нужно при отключении игрока. В начало мода добавьте:

new gPlayerTimer[MAX_PLAYERS] = {-1, ...}; // создадим переменную, куда будем записывать ID таймера конкретного игрока

Строку с созданием таймера еще раз замените этой:

gPlayerTimer[playerid] = SetTimerEx("UpdateTime", 1000*60, true, "i", playerid); // запишем в переменную ID таймера номер созданного для игрока таймера

И в OnPlayerDisconnect:

if(gPlayerTimer[playerid] != -1) { // если таймер для этого игрока был создан (в переменной присутствует валидное значение ID таймера)
	KillTimer(gPlayerTimer[playerid]); // удалим таймер по его ID
	gPlayerTimer[playerid] = -1; // сделаем значение переменной пустым
}

 

Share this post


Link to post
Share on other sites

@odosenok Сделал все как сказали

Ошибка: error 017: undefined symbol "playerid"

@odosenok Добавил это в паблик OnPlayerConnect, ошибка исчезла

gPlayerTimer[playerid] = SetTimerEx("UpdateTime", 1000*60, true, "i", playerid); // запишем в переменную ID таймера номер созданного для игрока таймера

 

Share this post


Link to post
Share on other sites

@odosenok Спасибо, щас все работает более менее стабильно.

Но появилась другая ошибка, зашел в игру. Вызвал payday с помощью команды.

А там появилось: "Вы уже отыграли: 206 часов", число не меняеться. Но в статистике персонажа все работает хорошо.

@daltwb Исправил последующую ошибку самостоятельно, Спасибо.

Закрываю тему.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • .037
      By .037
      в чём может быть проблема? Передаю строку через PR_String, и получаю с клиента бред
      CMD:TestData(playerid, params[]){ new msg[] = "Code_Test"; new BitStream:bs = BS_New(); BS_WriteInt8(bs,30); BS_WriteFloat(bs,0.9); BS_WriteFloat(bs,23.4); BS_WriteString(bs, msg, sizeof msg); PR_SendRPC(bs, playerid, 179); BS_Delete(bs); return 1; } [05:57:27] RPC - Длина  30 | 0.900000 | 23.400000 | I*(!@dp
      И всегда текст разный 

      Хотя принимаю всё нормально:

       
      bool CALLBACK Hok_RPC_BYTE(stRakNetHookParams *params) { if (params->packetId == 179) { SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "Кастомный RPC работает!!!"); byte nameLen; float test; float test1; char szPlayerName[100]; params->bitStream->ResetReadPointer(); params->bitStream->Read(nameLen); params->bitStream->Read(test); params->bitStream->Read(test1); params->bitStream->Read(szPlayerName, 100); params->bitStream->ResetReadPointer(); SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(0, 0xAA, 0), "RPC - Длина %d | %f | %f | %s", nameLen, test , test1, szPlayerName); } return true; };