Другое SAMPFUNCS | API C++

Harryss

Участник
233
26
Условие не срабатывает при дохождении таймера до 2500 мс. Каким образом это исправить?
C++:
static DWORD rp_counter = 0;

SF->getSAMP()->getPlayers()->pLocalPlayer->Say("Action-1");
rp_counter = GetTickCount();

if (GetTickCount() - rp_counter > 2050)
{
   SF->getSAMP()->getPlayers()->pLocalPlayer->Say("Action-2");
   rp_counter = 0; rp_counter = GetTickCount();
}
 

Stiopko

Известный
Проверенный
307
218
Условие не срабатывает при дохождении таймера до 2500 мс. Каким образом это исправить?
C++:
static DWORD rp_counter = 0;

SF->getSAMP()->getPlayers()->pLocalPlayer->Say("Action-1");
rp_counter = GetTickCount();

if (GetTickCount() - rp_counter > 2050)
{
   SF->getSAMP()->getPlayers()->pLocalPlayer->Say("Action-2");
   rp_counter = 0; rp_counter = GetTickCount();
}
C++:
static DWORD rp_counter = 0;

SF->getSAMP()->getPlayers()->pLocalPlayer->Say("Action-1");

if (GetTickCount() - rp_counter > 2050)
{
   SF->getSAMP()->getPlayers()->pLocalPlayer->Say("Action-2");
   rp_counter = GetTickCount();
}
 

Harryss

Участник
233
26
C++:
static DWORD rp_counter = 0;

SF->getSAMP()->getPlayers()->pLocalPlayer->Say("Action-1");

if (GetTickCount() - rp_counter > 2050)
{
   SF->getSAMP()->getPlayers()->pLocalPlayer->Say("Action-2");
   rp_counter = GetTickCount();
}
К сожалению, не помогло. Таймер то не запущен, оба сообщения сразу отправляются.
Пробовал его там поставить - вернулся к старому, второе сообщение не выводится, условие не проходит.
 

Stiopko

Известный
Проверенный
307
218
К сожалению, не помогло. Таймер то не запущен, оба сообщения сразу отправляются.
Пробовал его там поставить - вернулся к старому, второе сообщение не выводится, условие не проходит.
Что нужно чтобы код делал?
 

Stiopko

Известный
Проверенный
307
218
Банальная задержка между RP отыгровками.
Задержка - отправка сообщения, задержка - отправка сообщения. Буду благодарен за помощь.
У тебя не выйдет как ты хочешь, прямую задержку нельзя юзать в mainloop, ща попробую написать по другому
 

Harryss

Участник
233
26
У тебя не выйдет как ты хочешь, прямую задержку нельзя юзать в mainloop, ща попробую написать по другому
Дак да, Sleep же в mainloop'е усыпляет плагин целиком, поэтому я и хотел сделать это через таймер. И я это вынес в отдельную функцию, она вне mainloop'а, хотя это не столь важно.
 

Stiopko

Известный
Проверенный
307
218
Дак да, Sleep же в mainloop'е усыпляет плагин целиком, поэтому я и хотел сделать это через таймер. И я это вынес в отдельную функцию, она вне mainloop'а, хотя это не столь важно.
тебе только два сообщения или много?
 

Stiopko

Известный
Проверенный
307
218
Около 5-ти сообщений. Если способ там не очень мудреный, то мне б только показать вариант, а там я думаю сам смогу разобраться.
C++:
struct RPLine {
    char * line;
    unsigned int timeout;

    RPLine(const char * line, const unsigned int &timeout) {
        this->line = new char[strlen(line) + 1];
        strcpy(this->line, line);
        this->timeout = timeout;
    }

    ~RPLine() {
        delete[] line;
    }
};

struct RP {
private:
    bool state;
    unsigned long long timer;
public:
    std::vector<RPLine> lines;
    unsigned int line;
    RP() {
        state = false;
        line = 0;
    }

    void SetState(const bool &state) {
        if (this->state != state) {
            this->state = state;
            if (!state) line = 0;
            else timer = GetTickCount();
        }
    }

    bool Do() {
        if (state) {
            if (lines.size > line) {
                if (timer + lines[line].timeout < GetTickCount()) {
                    line++;
                    timer = GetTickCount();
                    return true;
                }
            }
            else SetState(false);
        }
        return false;
    }

C++:
static RP rpOtg;

    // 1 раз гдето
        // всякие проверки

        // инициализаци строк 1 раз

        rpOtg.lines.push_back(RPLine("Action 1", 300));
        rpOtg.lines.push_back(RPLine("Action 2", 5000));
        rpOtg.lines.push_back(RPLine("Action 3", 3000));
        rpOtg.lines.push_back(RPLine("Action 4", 1000));

        // очистка строк

        rpOtg.lines.clear();

        // стартуем
        rpOtg.SetState(true);

        // не стартуем
        rpOtg.SetState(false);

    // Пихуй в маин луп

    if (rpOtg.Do()) SF->getSAMP()->getPlayers()->pLocalPlayer->Say(rpOtg.lines[rpOtg.line - 1].line);

я не проверял но вроде должно работать
 
  • Нравится
Реакции: Harryss

tlwsn

Известный
537
85
Как сделать кмд с двумя параметрами?
 
Последнее редактирование: