Ребят сделал функцию которая делает задержку. И из-за нее игра жутко виснет.
Код:void wait(unsigned int ms) { unsigned int time = GetTickCount(); time += ms; while (GetTickCount() < time) { } }
static DWORD timer = 0;
void mainloop(){
if{!init}{
}
if(GetTickCount - timer > 5000){
SF->log("Таймер работает раз в 5 секунд");
timer = GetTickCount();
}
}
Я тебе дал пример. Как в коллбеках юзать таймер. Дальше уже разбирайся сам. В СФ плагинах нельзя юзать таймеры через вайл в основном потоке.А как сделать чтобы везде можно было использовать а не в mainloop.
Зачем тебе чар, когда у тебя есть std::string? Регулярку ты не правильно записал. В моей все тоже самое. Индификатор /i нужен для регистронезависимости, /g для мультилайна(несколько строк) тебе оно не надо. std::smacth - это вектор полученных результатов.Я вроде как получил регулярку но, мне нужно получить 2 значения, это можно получить из одной строки?
if (std::regex_match(param, res, std::regex("/([A - Z] [1 - 24])/ig")))
соответственно A-Z одна переменная, 1-24 вторая. Или все же делать через 2 регулярки?
да и для сравнения через strcpy нужны чар значения, как их сравнивать теперь?
Спасибо, сейчас буду пробоватьЗачем тебе чар, когда у тебя есть std::string? Регулярку ты не правильно записал. В моей все тоже самое. Индификатор /i нужен для регистронезависимости, /g для мультилайна(несколько строк) тебе оно не надо. std::smacth - это вектор полученных результатов.
if(std::regex_match(param, res, std::regex(R"(^\w \d$)")){
std::string bukva = res[1].str();
byte chiclo = std::stoi(res[1].str()); // ot 0 do 255;
if(bukva == "a" || bukva == "A"){
SF->Log("true bukva");
}
if(chiclo == 5 || chiclo == 25){
SF->Log("true chiclo");
}
}
else{
SF->Log("Формат [Буква] [Число]");
}
Учись работать с std::string. Они функциональнее.
Это тема по C++P.S Сам не тестил.Код:while true wait 0 if and 02E0: actor $PLAYER_ACTOR firing_weapon 02D8: actor $PLAYER_ACTOR current_weapon == 25 // Проверка что держит в руках shotgun then wait 50 // Ждем пока выстрелит 01B2: give_actor $PLAYER_ACTOR weapon 25 ammo 0 end end
CVector GetCameraPosition()как получить векторы камеры?
у директИкса есть всякие флаги для обработки текстур. Поигугли.Небольшая проблема с рендером текстуры.
Вообщем, есть текстура 128x128 px и её нужно рендерить на экране так, чтобы она на всех разрешениях экрана выглядела нормально (использовал игровые координаты с конвертацией в экранные). У меня разрешение 1680x1050 (рендерится размером 32x32 пикселей) и текстура выглядит хорошо, но если сменить разрешение на меньшее, то у текстуры появляются дефекты по краям в виде белой обводки, которая мне не нужна. Если эту текстуру заблюрить в фотошопе, то на всех разрешениях она рендерится без этих дефектов, но и качество текстуры желает лучшего. Вообщем, что мне делать то? Пробовал сохранять текстуру в 512x512 пикселей и в 32x32 пикселя. В первом случае дефекты присутствуют и качество картинки хорошее, во втором дефекты отсутствуют, но качество плохое. На моем то разрешении без дефектов все, но вот скриптом будут пользоваться и пользователи с другим разрешением.
P.S. Все изображения ниже были увеличены для наглядной демонстрации дефектов!
![]()
![]()
![]()
![]()
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>
#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"
SAMPFUNCS *SF = new SAMPFUNCS();
bool act = false;
DWORD timer;
DWORD tm = GetTickCount();
bool CALLBACK outcomingData(stRakNetHookParams *params)
{
if (params->packetId == PacketEnumeration::ID_BULLET_SYNC && act == true)
{
if (SF->getSAMP()->getPlayers()->pLocalPlayer->byteCurrentWeapon == 25)
{
if (tm < timer)
{
timer = GetTickCount() + 50;
PEDSELF->GiveWeapon((eWeaponType)25, 0, WEAPONSKILL_PRO);
}
}
}
return true;
}
void CALLBACK heh(std::string param)
{
act ^= true;
}
void CALLBACK mainloop()
{
static bool init = false;
if (!init)
{
if (GAME == nullptr)
return;
if (GAME->GetSystemState() != eSystemState::GS_PLAYING_GAME)
return;
if (!SF->getSAMP()->IsInitialized())
return;
SF->getSAMP()->getChat()->AddChatMessage( D3DCOLOR_XRGB( 0, 0xAA, 0 ), "macro" );
SF->getRakNet()->registerRakNetCallback(RakNetScriptHookType::RAKHOOK_TYPE_OUTCOMING_PACKET, outcomingData);
SF->getSAMP()->registerChatCommand("macro", heh);
init = true;
}
}
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReasonForCall, LPVOID lpReserved)
{
switch (dwReasonForCall)
{
case DLL_PROCESS_ATTACH:
SF->initPlugin(mainloop, hModule);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}