This commit is contained in:
2025-08-27 08:46:45 +08:00
parent 1fddc97e20
commit 79185568a0
13 changed files with 26503 additions and 429 deletions

View File

@@ -7,6 +7,7 @@
#include <sstream>
#include <chrono>
#include "json.hpp"
#include "Register_System.hpp"
using json = nlohmann::json;
@@ -66,10 +67,9 @@ static SQInteger sq_StringBinById(HSQUIRRELVM v)
char* uncode = (char*)(StringBin[Idx]).c_str();
//char* ss = DNFTOOL::GBKTOUTF8(std::string(uncode));
wchar_t* cfg = DNFTOOL::charTowchar_t(uncode);
std::wstring cfg = DNFTOOL::charTowchar_t(uncode);
Sq_pushstring(v, cfg, -1);
delete[]cfg;
Sq_pushstring(v, cfg.c_str(), -1);
return 1;
}
@@ -129,9 +129,8 @@ static SQInteger sq_LongLongOperation(HSQUIRRELVM v)
}
wchar_t* ss = DNFTOOL::charTowchar_t((char*)RetString.c_str());
Sq_pushstring(v, ss, -1);
delete[]ss;
std::wstring ss = DNFTOOL::charTowchar_t((char*)RetString.c_str());
Sq_pushstring(v, ss.c_str(), -1);
return 1;
}
@@ -190,9 +189,8 @@ static SQInteger sq_Dezlib(HSQUIRRELVM v)
std::string StrBuf = bb.decode(RealStr);
StrBuf = gzip_decompress(StrBuf);
wchar_t* ss = DNFTOOL::charTowchar_t((char*)StrBuf.c_str());
Sq_pushstring(v, ss, -1);
delete[]ss;
std::wstring ss = DNFTOOL::charTowchar_t((char*)StrBuf.c_str());
Sq_pushstring(v, ss.c_str(), -1);
//std::cout << StrBuf << std::endl;
return 1;
@@ -509,6 +507,43 @@ static SQInteger sq_DrawButton(HSQUIRRELVM v)
Draw_Img(*(int*)0x1B45B94, 0, X + FirstWidth + FillWidth * widthCount, Y, rightFrame);
return 0;
}
static SQInteger sq_Draw3Image_Vertical(HSQUIRRELVM v)
{
int Top = Sq_gettop(v);
int X;
Sq_getinteger(v, 2, &X);
int Y;
Sq_getinteger(v, 3, &Y);
int WindowHeight;
Sq_getinteger(v, 4, &WindowHeight);
const SQChar* File;
Sq_getstring(v, 5, &File);
int StartIdx;
Sq_getinteger(v, 6, &StartIdx);
//填充高度
int FillHeight;
Sq_getinteger(v, 7, &FillHeight);
//首节高度
int FirstHeight;
Sq_getinteger(v, 8, &FirstHeight);
int heightCount = round(WindowHeight / 2);
int npkbuf = Load_Npk(*(int*)0x1B4684C, 0, 0, (wchar_t*)File);
int topFrame = Get_Img(npkbuf, 0, 0 + StartIdx);
int centerFrame = Get_Img(npkbuf, 0, 1 + StartIdx);
int bottomFrame = Get_Img(npkbuf, 0, 2 + StartIdx);
Draw_Img(*(int*)0x1B45B94, 0, X, Y, topFrame);
for (int i = 0; i < heightCount; i++) {
Draw_Img(*(int*)0x1B45B94, 0, X, Y + FirstHeight + FillHeight * i, centerFrame);
}
Draw_Img(*(int*)0x1B45B94, 0, X, Y + FirstHeight + FillHeight * heightCount, bottomFrame);
return 0;
}
//获取文字绘制长度
static std::map<std::string, int>LenheartCodeWidth;
static SQInteger Sq_getstringDrawLength(HSQUIRRELVM v) {
@@ -516,6 +551,7 @@ static SQInteger Sq_getstringDrawLength(HSQUIRRELVM v) {
const SQChar* Str;
Sq_getstring(v, 2, &Str);
if (Str == NULL)Str = L"";
char* OutPutText = DNFTOOL::SquirrelU2W(Str);
std::string RealStr = OutPutText;
delete[]OutPutText;
@@ -787,10 +823,9 @@ static SQInteger Sq_getstringDrawArray(HSQUIRRELVM v) {
{
std::string Buf = PushStrBuf[i];
char* ss = DNFTOOL::GBKTOUTF8(Buf);
wchar_t* aa = DNFTOOL::charTowchar_t(ss);
Sq_pushstring(v, aa, -1);
std::wstring aa = DNFTOOL::charTowchar_t(ss);
Sq_pushstring(v, aa.c_str(), -1);
sq_arrayappend((HSQUIRRELVM)v, -2);
delete[]aa;
}
return 1;
}
@@ -828,9 +863,8 @@ static SQInteger DecondeJson(HSQUIRRELVM v) {
str = DNFTOOL::ReplaceAll(str, ":", "=");
wchar_t* ss = DNFTOOL::charTowchar_t((char*)str.c_str());
Sq_pushstring(v, ss, -1);
delete[]ss;
std::wstring ss = DNFTOOL::charTowchar_t((char*)str.c_str());
Sq_pushstring(v, ss.c_str(), -1);
return 1;
}
//序列化Json
@@ -1016,10 +1050,11 @@ static SQInteger EncondeJson(HSQUIRRELVM v) {
std::string Jso = "";
std::string RealJso = EncodeTABLE((HSQUIRRELVM)v, Jso);
char* sbuf = DNFTOOL::GBKTOUTF8(RealJso);
wchar_t* ss = DNFTOOL::charTowchar_t(sbuf);
Sq_pushstring(v, ss, -1);
std::wstring ss = DNFTOOL::charTowchar_t(sbuf);
Sq_pushstring(v, ss.c_str(), -1);
return 1;
}
//按键是否按下
static SQInteger sq_IsKeyDown(HSQUIRRELVM v) {
@@ -1151,10 +1186,9 @@ static SQInteger sq_GetPlayerEachName(HSQUIRRELVM v)
{
int objNameAddress = *(int*)(0x1ade0e0);
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)(objNameAddress + 0x20));
wchar_t* name = DNFTOOL::charTowchar_t(str);
std::wstring name = DNFTOOL::charTowchar_t(str);
free(str);
Sq_pushstring(v, name, -1);
delete[]name;
Sq_pushstring(v, name.c_str(), -1);
return 1;
}
//获取技能地址
@@ -1258,10 +1292,9 @@ static SQInteger GetObjectName(HSQUIRRELVM v)
int objAddress = GetSqrObject(v, 2);
int objNameAddress = *(int*)(objAddress + 0x258);
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)objNameAddress);
wchar_t* name = DNFTOOL::charTowchar_t(str);
std::wstring name = DNFTOOL::charTowchar_t(str);
free(str);
Sq_pushstring(v, name, -1);
delete[]name;
Sq_pushstring(v, name.c_str(), -1);
return 1;
}
//设置对象名称
@@ -1283,10 +1316,9 @@ static SQInteger GetObjectNameByAddress(HSQUIRRELVM v)
Sq_getinteger(v, 2, &objAddress);
int objNameAddress = *(int*)(objAddress + 0x258);
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)objNameAddress);
wchar_t* name = DNFTOOL::charTowchar_t(str);
std::wstring name = DNFTOOL::charTowchar_t(str);
free(str);
Sq_pushstring(v, name, -1);
delete[]name;
Sq_pushstring(v, name.c_str(), -1);
return 1;
}
@@ -2687,10 +2719,8 @@ static SQInteger sq_GetInputBoxStr(HSQUIRRELVM v)
std::string str = WInfo->str;
char* ss = DNFTOOL::GBKTOUTF8(str);
//wchar_t* name = DNFTOOL::charTowchar_t((char*)Buf.c_str());
wchar_t* aa = DNFTOOL::charTowchar_t(ss);
Sq_pushstring(v, aa, -1);
std::wstring aa = DNFTOOL::charTowchar_t(ss);
Sq_pushstring(v, aa.c_str(), -1);
return 1;
}
@@ -2761,20 +2791,130 @@ static SQInteger sq_GetItem(HSQUIRRELVM v)
}
// 定义2D顶点结构位置+纹理坐标)
struct Vertex2D {
float x, y, z; // 位置z=0表示2D平面
float u, v; // 纹理坐标
};
// 初始化顶点缓冲区(创建一次即可,不必每次绘制都创建)
LPDIRECT3DVERTEXBUFFER9 CreateVertexBuffer(LPDIRECT3DDEVICE9 pDevice, float x, float y, float width, float height) {
LPDIRECT3DVERTEXBUFFER9 pVB = nullptr;
// 定义矩形的四个顶点(左上角、右上角、左下角、右下角)
Vertex2D vertices[] = {
{x, y, 0.0f, 0.0f, 0.0f}, // 左上角
{x + width, y, 0.0f, 1.0f, 0.0f}, // 右上角
{x, y + height, 0.0f, 0.0f, 1.0f}, // 左下角
{x + width, y + height, 0.0f, 1.0f, 1.0f} // 右下角
};
// 创建顶点缓冲区
if (FAILED(pDevice->CreateVertexBuffer(
4 * sizeof(Vertex2D), // 大小
D3DUSAGE_WRITEONLY, // 用法
D3DFVF_XYZ | D3DFVF_TEX1, // 顶点格式(位置+1套纹理坐标
D3DPOOL_MANAGED, // 内存池
&pVB,
nullptr))) {
return nullptr;
}
// 锁定并写入顶点数据
void* pData = nullptr;
if (SUCCEEDED(pVB->Lock(0, 0, &pData, 0))) {
memcpy(pData, vertices, sizeof(vertices));
pVB->Unlock();
}
else {
pVB->Release();
return nullptr;
}
return pVB;
}
void DrawMyImage(LPDIRECT3DDEVICE9 pDevice) {
// 1. 准备RGBA数据100x100红色图像
int width = 100, height = 100;
std::vector<BYTE> rgbaData(width * height * 4);
for (int i = 0; i < width * height; i++) {
rgbaData[i * 4 + 0] = 0; // R
rgbaData[i * 4 + 1] = 0; // G
rgbaData[i * 4 + 2] = 255; // B
rgbaData[i * 4 + 3] = 255; // A
}
// 2. 创建纹理
LPDIRECT3DTEXTURE9 pTexture = nullptr;
if (FAILED(pDevice->CreateTexture(width, height, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &pTexture, nullptr))) {
return;
}
// 3. 锁定纹理写入数据
D3DLOCKED_RECT lockedRect;
if (FAILED(pTexture->LockRect(0, &lockedRect, nullptr, 0))) {
pTexture->Release();
return;
}
BYTE* dst = (BYTE*)lockedRect.pBits;
const BYTE* src = rgbaData.data();
for (int y = 0; y < height; y++) {
memcpy(dst, src, width * 4);
src += width * 4;
dst += lockedRect.Pitch;
}
pTexture->UnlockRect(0);
// 4. 创建顶点缓冲区(绘制位置(0,0)大小800x600
LPDIRECT3DVERTEXBUFFER9 pVB = CreateVertexBuffer(pDevice, 0, 0, 800, 600);
if (!pVB) {
pTexture->Release();
return;
}
// --------------------------
// 关键:保存原始渲染状态
// --------------------------
DWORD originalFVF, originalZEnable;
LPDIRECT3DBASETEXTURE9 originalTexture = nullptr;
pDevice->GetFVF(&originalFVF); // 保存原始顶点格式
pDevice->GetTexture(0, &originalTexture); // 保存原始纹理
pDevice->GetRenderState(D3DRS_ZENABLE, &originalZEnable); // 保存Z缓冲状态
// --------------------------
// 设置绘制所需状态
// --------------------------
pDevice->SetFVF(D3DFVF_XYZ | D3DFVF_TEX1); // 恢复顶点格式
pDevice->SetTexture(0, pTexture); // 绑定你的纹理
pDevice->SetStreamSource(0, pVB, 0, sizeof(Vertex2D)); // 绑定顶点缓冲区
pDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); // 临时禁用Z缓冲
// 5. 绘制
pDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);
// --------------------------
// 关键:恢复原始渲染状态
// --------------------------
pDevice->SetFVF(originalFVF); // 恢复顶点格式
pDevice->SetTexture(0, originalTexture); // 恢复原始纹理
pDevice->SetRenderState(D3DRS_ZENABLE, originalZEnable); // 恢复Z缓冲
if (originalTexture) originalTexture->Release(); // 释放引用
// 6. 释放资源(必须释放,避免泄漏)
pVB->Release();
pTexture->Release();
}
typedef int(_fastcall _11A2030)(int thisc, void*, int a2, int a3, int a4, int a5);
static _11A2030* SUB_11A2030 = (_11A2030*)0x11A2030;
static SQInteger sq_Test(HSQUIRRELVM v)
{
const SQChar* Path;
sq_getstring(v, 2, &Path);
char* a = new char[1024];
//wchar_t* path = L"region/region.lst";
SUB_11A2030(0x1D17638, 0, (int)Path, (int)a, 0x100000, 0x19DAF4);
SQInteger FuncAddressbuf;
Sq_getinteger(v, 2, &FuncAddressbuf);
//std::cout << a << std::endl;
DrawMyImage((LPDIRECT3DDEVICE9)FuncAddressbuf);
return 0;
}
static SQInteger Sq_ActiveCallFunc(HSQUIRRELVM v)
@@ -2939,9 +3079,8 @@ static SQInteger Sq_ActiveCallFunc(HSQUIRRELVM v)
else if (CONTAINS_STRING(RetTypeString, "bool"))
Sq_pushbool(v, (bool)result);
else if (CONTAINS_STRING(RetTypeString, "string")) {
wchar_t* ss = DNFTOOL::charTowchar_t((char*)result);
Sq_pushstring(v, ss, -1);
delete[]ss;
std::wstring ss = DNFTOOL::charTowchar_t((char*)result);
Sq_pushstring(v, ss.c_str(), -1);
}
else if (CONTAINS_STRING(RetTypeString, "pointer"))
Sq_pushuserpointer(v, (void*)result);
@@ -3055,18 +3194,16 @@ static SQInteger Memory_ReadString(HSQUIRRELVM v)
Sq_getinteger(v, 3, &Length);
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)Address);
wchar_t* name = DNFTOOL::charTowchar_t(str);
std::wstring name = DNFTOOL::charTowchar_t(str);
free(str);
Sq_pushstring(v, name, Length);
delete[]name;
Sq_pushstring(v, name.c_str(), Length);
}
else
{
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)Address);
wchar_t* name = DNFTOOL::charTowchar_t(str);
std::wstring name = DNFTOOL::charTowchar_t(str);
free(str);
Sq_pushstring(v, name, -1);
delete[]name;
Sq_pushstring(v, name.c_str(), -1);
}
return 1;
}
@@ -3082,15 +3219,13 @@ static SQInteger Memory_ReadStringByUtf8(HSQUIRRELVM v)
SQInteger Length;
Sq_getinteger(v, 3, &Length);
wchar_t* name = DNFTOOL::charTowchar_t((char*)Address);
Sq_pushstring(v, name, Length);
delete[]name;
std::wstring name = DNFTOOL::charTowchar_t((char*)Address);
Sq_pushstring(v, name.c_str(), Length);
}
else
{
wchar_t* name = DNFTOOL::charTowchar_t((char*)Address);
Sq_pushstring(v, name, -1);
delete[]name;
std::wstring name = DNFTOOL::charTowchar_t((char*)Address);
Sq_pushstring(v, name.c_str(), -1);
}
return 1;
}
@@ -3106,21 +3241,19 @@ static SQInteger Memory_ReadStringByBig5(HSQUIRRELVM v)
SQInteger Length;
Sq_getinteger(v, 3, &Length);
wchar_t* newadd = DNFTOOL::charTowchar_t((char*)Address);
char* str = DNFTOOL::Big5ToUtf8(newadd);
wchar_t* name = DNFTOOL::charTowchar_t(str);
std::wstring newadd = DNFTOOL::charTowchar_t((char*)Address);
char* str = DNFTOOL::Big5ToUtf8(newadd.c_str());
std::wstring name = DNFTOOL::charTowchar_t(str);
free(str);
Sq_pushstring(v, name, Length);
delete[]name;
Sq_pushstring(v, name.c_str(), Length);
}
else
{
wchar_t* newadd = DNFTOOL::charTowchar_t((char*)Address);
char* str = DNFTOOL::Big5ToUtf8(newadd);
wchar_t* name = DNFTOOL::charTowchar_t(str);
std::wstring newadd = DNFTOOL::charTowchar_t((char*)Address);
char* str = DNFTOOL::Big5ToUtf8(newadd.c_str());
std::wstring name = DNFTOOL::charTowchar_t(str);
free(str);
Sq_pushstring(v, name, -1);
delete[]name;
Sq_pushstring(v, name.c_str(), -1);
}
return 1;
}
@@ -3142,20 +3275,18 @@ static SQInteger ConvertWideChar(HSQUIRRELVM v)
char* csa = DNFTOOL::wchar_tTochar((wchar_t*)Str);
wchar_t* name = DNFTOOL::BIG5ToUnicode(csa);
char* str = DNFTOOL::UnicodeToUtf8(name);
wchar_t* realname = DNFTOOL::charTowchar_t(str);
std::wstring realname = DNFTOOL::charTowchar_t(str);
free(str);
Sq_pushstring(v, realname, -1);
Sq_pushstring(v, realname.c_str(), -1);
delete[]csa;
delete[]name;
delete[]realname;
}
else if (CONTAINS_STRING(fromEncoding, "unicode")) {
char* str = DNFTOOL::UnicodeToUtf8((wchar_t*)Str);
wchar_t* name = DNFTOOL::charTowchar_t(str);
std::wstring name = DNFTOOL::charTowchar_t(str);
free(str);
Sq_pushstring(v, name, -1);
delete[]name;
Sq_pushstring(v, name.c_str(), -1);
}
return 1;
@@ -3194,6 +3325,7 @@ static SQInteger OutPutTable(HSQUIRRELVM v)
void R_Register_Nut() {
R_Register_System();
RegisterMyNutApi(L"L_sq_Test", sq_Test);//zlib解压
@@ -3225,6 +3357,7 @@ void R_Register_Nut() {
RegisterMyNutApi(L"L_sq_DrawNumber", sq_DrawNumber);//绘制数字
RegisterMyNutApi(L"L_sq_DrawWindow", sq_DrawWindow);//绘制九宫格
RegisterMyNutApi(L"L_sq_DrawButton", sq_DrawButton);//绘制三联图
RegisterMyNutApi(L"L_sq_Draw3Image_Vertical", sq_Draw3Image_Vertical);//绘制三联图
RegisterMyNutApi(L"L_sq_GetStringDrawLength", Sq_getstringDrawLength);//获取文字绘制长度
RegisterMyNutApi(L"L_sq_GetStringDrawArray", Sq_getstringDrawArray);//获取文字换行返回数组
RegisterMyNutApi(L"L_sq_DecondeJson", DecondeJson);//反序列化Json