С++ gdk samp plugins

lyricshvh

Новичок
Автор темы
6
0
Добрый день всем, пишу мод с нуля на плюсах с другом, я дурак в плюсах, пока его нету, пытаюсь сделать систему пейдея
Тут был пример использование settimer
Пример функции для каллбекка внутри сеттаймера:
void SAMPGDK_CALL PrintTickCountTimer(int timerid, void *params)
{
  sampgdk::logprintf("Tick count: %d", GetTickCount());
}
как используется settimer:
PLUGIN_EXPORT bool PLUGIN_CALL OnGameModeInit()
{
  SetTimer(1000, true, PrintTickCountTimer, 0);
  return true;
}
Проблема в том что, в сеттаймере не указываются аргументы функции "PrintTickCountTimer"

Payday на основе примера:
void GiveHours(int playerid)
{
    Player[playerid].pHours++;
}

void SAMPGDK_CALL PayDay(int playerid,int timerid, void* params)
{
    char string[144];
    GiveHours(playerid);
    sprintf(string, "Вы уже отыграли: %d часов", Player[playerid].pHours);
    SendClientMessage(playerid, -1, string);
}
PLUGIN_EXPORT bool PLUGIN_CALL OnPlayerUpdate(int playerid)
{
    SetTimer(1000, true, PayDay(playerid), 0);
// на этой строчке у пейдея выводит ошибку, пытался с идом и без все так же о том что слишком мало аргументов, без скобок ошибка так же есть
    return true;
}
 

legendabrn

Известный
Проверенный
120
170
C++:
void GiveHours(int playerid)
{
    Player[playerid].pHours++;
}

void SAMPGDK_CALL PayDay(int timerid, void* params)
{
    int playerid = *reinterpret_cast<int*>(params);
    char string[144];
    GiveHours(playerid);
    sprintf(string, "Вы уже отыграли: %d часов", Player[playerid].pHours);
    SendClientMessage(playerid, -1, string);
}

PLUGIN_EXPORT bool PLUGIN_CALL OnPlayerUpdate(int playerid)
{
    SetTimer(1000, true, PayDay, &playerid);
    return true;
}
 
  • Нравится
Реакции: lyricshvh

lyricshvh

Новичок
Автор темы
6
0
C++:
void GiveHours(int playerid)
{
    Player[playerid].pHours++;
}

void SAMPGDK_CALL PayDay(int timerid, void* params)
{
    int playerid = *reinterpret_cast<int*>(params);
    char string[144];
    GiveHours(playerid);
    sprintf(string, "Вы уже отыграли: %d часов", Player[playerid].pHours);
    SendClientMessage(playerid, -1, string);
}

PLUGIN_EXPORT bool PLUGIN_CALL OnPlayerUpdate(int playerid)
{
    SetTimer(1000, true, PayDay, &playerid);
    return true;
}
Не увидел ваш ответ, но вроде сделал и работает без вас щас

C++:
void SAMPGDK_CALL PayDay(int timerid, void* params)
{
    char string[144];
    int playerid = reinterpret_cast<int>(params);

    GiveHours(playerid);
    sprintf(string, "Вы уже отыграли: %d часов", Player[playerid].pHours);
    SendClientMessage(playerid, -1, string);
}
PLUGIN_EXPORT bool PLUGIN_CALL OnPlayerUpdate(int playerid)
{


   SetTimer(1000*60, true, PayDay, (void*)playerid);

 
    return true;
}
а так спасибо большое!
 

lyricshvh

Новичок
Автор темы
6
0
1636465006526.png

ну работает уже хорошо
 

legendabrn

Известный
Проверенный
120
170
только я не понял, зачем каждый раз при обновление игрока создавать таймер, лучше в коннект всунь при успешной авторизации, или создай один глобальный таймер, где будешь перебирать через цикл игроков на сервере
ну а если решишь передавать более двух параметров, то как пример:
C++:
struct sPayDay
{
    int playerid;
    const char* text;
};
std::vector<sPayDay> vPayPay;

void PayDay(void* params)
{
    size_t pos = *reinterpret_cast<size_t*>(params) - 1;
    
    if(vPayPay.at(pos).text)
    {
        char string[144];
        sprintf(string, "Переданный текст: %s", vPayPay.at(pos).text);
        SendClientMessage(playerid, -1, string);
    }
    
    vPayPay.erase(vPayPay.begin() + pos);
}

PLUGIN_EXPORT bool PLUGIN_CALL OnPlayerUpdate(int playerid)
{
    if(playerid == 1)
        vPayPay.push_back({ playerid, "you id: 1!" });
    else
        vPayPay.push_back({ playerid, 0 });
        
    size_t size = vPayPay.size();
    PayDay(&size);
}
 
  • Нравится
Реакции: lyricshvh

lyricshvh

Новичок
Автор темы
6
0
только я не понял, зачем каждый раз при обновление игрока создавать таймер, лучше в коннект всунь при успешной авторизации, или создай один глобальный таймер, где будешь перебирать через цикл игроков на сервере
ну а если решишь передавать более двух параметров, то как пример:
C++:
struct sPayDay
{
    int playerid;
    const char* text;
};
std::vector<sPayDay> vPayPay;

void PayDay(void* params)
{
    size_t pos = *reinterpret_cast<size_t*>(params) - 1;
   
    if(vPayPay.at(pos).text)
    {
        char string[144];
        sprintf(string, "Переданный текст: %s", vPayPay.at(pos).text);
        SendClientMessage(playerid, -1, string);
    }
   
    vPayPay.erase(vPayPay.begin() + pos);
}

PLUGIN_EXPORT bool PLUGIN_CALL OnPlayerUpdate(int playerid)
{
    if(playerid == 1)
        vPayPay.push_back({ playerid, "you id: 1!" });
    else
        vPayPay.push_back({ playerid, 0 });
       
    size_t size = vPayPay.size();
    PayDay(&size);
}
Да моя ошибка что я там создаю в onPlayerUpdate и там уже каждый раз создается таймер и у меня каждую секунду выдается уровень, я решил поставить по твоему совету на onplayerconnect работает все, но нужно теперь как то понимать чтоб начинать отсчет ровно в 00:00 каждого часа я находил инклуд dos но он для просто C, и не работает внутри плюсов
 

kivija3070

Участник
14
10
Да моя ошибка что я там создаю в onPlayerUpdate и там уже каждый раз создается таймер и у меня каждую секунду выдается уровень, я решил поставить по твоему совету на onplayerconnect работает все, но нужно теперь как то понимать чтоб начинать отсчет ровно в 00:00 каждого часа я находил инклуд dos но он для просто C, и не работает внутри плюсов

Ой по сути все хуйня и говнокод. Тут 2 пути. 1) Сделай нормальныю систему для эвентов. 2) Сделай костыль. Первое ищи на гите, т.к думаю просто так только там кто то выложить может. Ну а второе:

- При старте сервера, посчитай сколько времени осталось до следующего часа
- Поставь таймер на это время, который вызовет функцию InitPaydayTimer
- В этой функции в самом начале, отмени текущий таймер, вызови функцию onPayday, и создай таймер на 1 час, который вызывать будет onPayday

Главное, все это (коме функии onPayday), вынести в отдельный файл, и никогда туда больше не заходи (чтоб не растраиваться).
В самой onPayday просто пройдись по списку игроков, и выдай бонусы
 
  • Нравится
Реакции: lyricshvh

Похожие темы