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

Dark_Knight

Me, me and me.
Друг
4,062
2,077
C++:
pFont = SF->getRender()->CreateNewFont("Tahoma", 12, FCR_BORDER );
C++:
pFont->Print( "текст", D3DCOLOR_ARGB( 255, 255, 255, 0 ), 500, 500, false );
27Lw6qg.png
В чём может быть проблема?
Кодировку в проекте поставь многобайтовую, а не юникод.
 

Perojek)0

Известный
205
3
C++:
bool CALLBACK incomingRPC(stRakNetHookParams *PARAMS) 
{
    if(PARAMS->packetId == ScriptRPCEnumeration::RPC_ScrClientMessage)
    {
        DWORD sizeMSG, Color;
        PARAMS->bitStream->ResetReadPointer(); 
        PARAMS->bitStream->Read(Color);
        PARAMS->bitStream->Read(sizeMSG);
        char *MSG = new char[sizeMSG + 1];
        PARAMS->bitStream->Read(MSG, sizeMSG);
        MSG[sizeMSG] = '\0';
        PARAMS->bitStream->ResetReadPointer(); 
        std::string str(MSG);
        SF->Log("%s", str);
        delete[] MSG;
    };
    return true; 
};
Как из char* преобразовать в string, если после преобразовании крашит?(При выводе в консоль)
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Чёт чушь какая-то.
Почему бы тебе сразу не вывести MSG?
Log просто напросто не принимает std::string. У класса std::string есть замечательный метод, а называется он c_str. Он возвращает const char*.
 
  • Нравится
Реакции: Perojek)0

Perojek)0

Известный
205
3
C++:
D3DCOLOR Color = 0xFFFFFFFF;
std::string Msg = "test";
BitStream Test;
Test.Write(Color);
Test.Write(DWORD(Msg.size()));
Test.Write(Msg.c_str());
SF->getRakNet()->emulateRecvRPC(ScriptRPCEnumeration::RPC_ScrClientMessage, &Test);
Почему в чат выводится некорректно? (Знаю, что есть уже готовая функция)
 

BlackKnigga

Известный
BH Team
922
444
C++:
D3DCOLOR Color = 0xFFFFFFFF;
std::string Msg = "test";
BitStream Test;
Test.Write(Color);
Test.Write(DWORD(Msg.size()));
SF->getRakNet()->emulateRecvRPC(ScriptRPCEnumeration::RPC_ScrClientMessage, &Test);
Почему в чат выводится некорректно? (Знаю, что есть уже готовая функция)
Когда строку записываешь вторым параметром вроде надо ее длину указывать.
C++:
Test.Write(Msg.c_str(), Msg.size());
Но эт не точно
 
  • Нравится
Реакции: Perojek)0

Dark_Knight

Me, me and me.
Друг
4,062
2,077
C:
D3DCOLOR Color = 0xFFFFFFFF;
std::string Msg = "test";
BitStream Test;
Test.Write(Color);
Test.Write(DWORD(Msg.length()));
Test.Write((PCHAR)Msg.c_str(), Msg.length());
SF->getRakNet()->emulateRecvRPC(RPC_ScrClientMessage, &Test);
Если память не изменяет, то так.
 
  • Нравится
Реакции: Perojek)0

Perojek)0

Известный
205
3
Возникла следующая проблема. При добавлении в условия на рендер переменной типа bool, первая секунда загрузки выглядит примерно так:
Wn0fmyB.jpg
Если его убрать, то всё нормально.
C++:
//main.h
#pragma once
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>

#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"

#include "Render.h"

extern SAMPFUNCS *SF;
extern bool test;

//main.cpp
#include "main.h"

SAMPFUNCS *SF = new SAMPFUNCS();
bool test = false;

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->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present);
        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;
}

//Render.h
#pragma once
bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride,
    CONST RGNDATA *pDirtyRegion);

//Render.cpp
#include "main.h"

bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride,
    CONST RGNDATA *pDirtyRegion)
{
    if (SUCCEEDED(SF->getRender()->BeginRender()) && test)
    {
        SF->getRender()->DrawBox(500, 500, 25, 25, D3DCOLOR_ARGB(255, 0, 255, 0));
        SF->getRender()->EndRender();
    };

    return true;
};
Как это можно исправить?
 
Последнее редактирование:

BlackKnigga

Известный
BH Team
922
444
Возникла следующая проблема. При добавлении в условия на рендер переменной типа bool, первая секунда загрузки выглядит примерно так:
Wn0fmyB.jpg
Если его убрать, то всё нормально.
C++:
//main.h
#pragma once
#include <windows.h>
#include <string>
#include <assert.h>
#include <process.h>

#include "SAMPFUNCS_API.h"
#include "game_api\game_api.h"

#include "Render.h"

extern SAMPFUNCS *SF;
extern bool test;

//main.cpp
#include "main.h"

SAMPFUNCS *SF = new SAMPFUNCS();
bool test = false;

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->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present);
        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;
}

//Render.h
#pragma once
bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride,
    CONST RGNDATA *pDirtyRegion);

//Render.cpp
#include "main.h"

bool CALLBACK Present(CONST RECT *pSourceRect, CONST RECT *pDestRect, HWND hDestWindowOverride,
    CONST RGNDATA *pDirtyRegion)
{
    if (SUCCEEDED(SF->getRender()->BeginRender()) && test)
    {
        SF->getRender()->DrawBox(500, 500, 25, 25, D3DCOLOR_ARGB(255, 0, 255, 0));
        SF->getRender()->EndRender();
    };

    return true;
};
Как это можно исправить?
В этом проблема:
C++:
 if (SUCCEEDED(SF->getRender()->BeginRender()) && test)
BeginRender вызывается, но EndRender'ом не завершается(test == false).
Поставь проверку test'а до вызова beginrender
 
  • Нравится
Реакции: Perojek)0

iAmerican

Известный
Друг
615
257
Как можно изменить размер шрифта, который уже создан?

Но в этом способе я точно не уверен , правильный ли он. Может как то по другому это делается вообще. Но это работает.

C++:
bool bGoResize = false;
int iSize = 12;
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->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present);
        pFont = SF->getRender()->CreateNewFont("Consolas", 12, FCR_BORDER);
          init = true;
    }

if(SF->GetGame()->IsKeyPressed(0x5))
bGoResize = true;

if(bGoResize) {
pFont = SF->getRender()->CreateNewFont("Consolas", iSize, FCR_BORDER);
bGoRezise = false;
}

}
 
Последнее редактирование:
  • Нравится
Реакции: Perojek)0

BlackKnigga

Известный
BH Team
922
444
Но в этом способе я точно не уверен , правильный ли он. Может как то по другому это делается вообще. Но это работает.

C++:
bool bGoResize = false;
int iSize = 12;
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->getRender()->registerD3DCallback(eDirect3DDeviceMethods::D3DMETHOD_PRESENT, Present);
        pFont = SF->getRender()->CreateNewFont("Consolas", 12, FCR_BORDER);
          init = true;
    }

if(SF->GetGame()->IsKeyPressed(0x5))
bGoResize = true;

if(bGoResize) {
pFont = SF->getRender()->CreateNewFont("Consolas", iSize, FCR_BORDER);
bGoRezise = false;
}

}
Надо сначала удалить старый, там есть что то вроде ReleaseFont
 
  • Нравится
Реакции: Perojek)0