Quote:
#include "StdAfx.h"
#include "Items.h"
#include "ItemDir.h"
#include "Utils.h"
int UseMaxWeapons = GetPrivateProfileIntA("Items","UseMaxWeapons",0,"./Items.ini");
int UseMaxSets = GetPrivateProfileIntA("Items","UseMaxSets",0,"./Items.ini");
int GlowMod = GetPrivateProfileIntA("Items","UseGlowMod",0,"./Items.ini");
extern "C" _declspec(dllexport) void Items()
{
DWORD OldProtect;
if (VirtualProtect(LPVOID(0x401000), 0x0087751F, PAGE_EXECUTE_READWRITE, &OldProtect))
{
InitItems();
}
else
{
MessageBoxA(NULL, "Cannot load Items.dll", "Error", MB_OK);
ExitProcess(0);
}
}
void InitModel(int ItemID, char* ModelName, char* Folder, char* Form)
{
_asm
{
PUSH -1
PUSH ModelName
PUSH Form
PUSH ItemID
mov eax,BMDModelLoad
CALL eax
PUSH 1
PUSH 0x2600
PUSH 0x2901
PUSH Folder
PUSH ItemID
mov eax,OpenTexture
CALL eax
}
}
void InitSets(int ItemID, char* ModelName, char* Folder, char* Form)
{
_asm
{
PUSH -1
PUSH ModelName
PUSH Form
PUSH ItemID
mov eax,BMDModelLoad
CALL eax
PUSH 1
PUSH 0x2600
PUSH 0x2901
PUSH Folder
PUSH ItemID
mov eax,OpenTexture
CALL eax
}
}
__declspec(naked) void PatchNewModel()
{
if(UseMaxWeapons == 1)
{
for (i = 5; i < 512; i++)
{
if(i > 35)//swords
{
sprintf_s(Item, "Sword%d", i+1);
InitModel(LOAD_ITEM(0, i), Item, ItemFolder, ItemDir);
}
if(i > 8)//axes
{
sprintf_s(Item, "Axe%d", i+1);
InitModel(LOAD_ITEM(1, i), Item, ItemFolder, ItemDir);
}
if(i > 18)//maces
{
sprintf_s(Item, "Mace%d", i+1);
InitModel(LOAD_ITEM(2, i), Item, ItemFolder, ItemDir);
}
if(i > 11)//spears
{
sprintf_s(Item, "Spear%d", i+1);
InitModel(LOAD_ITEM(3, i), Item, ItemFolder, ItemDir);
}
if(i > 24 && i < 210)//bow
{
sprintf_s(Item, "Bow%d", i+1);
InitModel(LOAD_ITEM(4, i), Item, ItemFolder, ItemDir);
}
if(i > 209 && i < 511)//crossbow
{
sprintf_s(Item, "Crossbow%d", i+1);
InitModel(LOAD_ITEM(4, i), Item, ItemFolder, ItemDir);
}
if(i > 36)//staff
{
sprintf_s(Item, "Staff%d", i+1);
InitModel(LOAD_ITEM(5, i), Item, ItemFolder, ItemDir);
}
if(i > 21)//shield
{
sprintf_s(Item, "Shield%d", i+1);
InitModel(LOAD_ITEM(6, i), Item, ItemFolder, ItemDir);
}
}
_asm
{
PUSH -1
PUSH 0x00D2F7C4
PUSH 0x00D2F7CC
PUSH 0x20B2
mov eax,BMDModelLoad
CALL eax
ADD ESP,0x10
mov eax,ReturnOffset
JMP eax
}
}
}
__declspec(naked) void PatchNewSets()
{
if(UseMaxSets == 1)
{
for (i = 5; i < 512; i++)
{
if(i > 74)//helms
{
sprintf_s(Sets, "HelmMale%d", i+1);
InitSets(LOAD_ITEM(7, i), Sets, PlayerFolder, PlayerDir);
}
if(i > 74)//armors
{
sprintf_s(Sets, "ArmorMale%d", i+1);
InitSets(LOAD_ITEM(8, i), Sets, PlayerFolder, PlayerDir);
}
if(i > 74)//pants
{
sprintf_s(Sets, "PantMale%d", i+1);
InitSets(LOAD_ITEM(9, i), Sets, PlayerFolder, PlayerDir);
}
if(i > 74)//gloves
{
sprintf_s(Sets, "GloveMale%d", i+1);
InitSets(LOAD_ITEM(10, i), Sets, PlayerFolder, PlayerDir);
}
if(i > 74)//boots
{
sprintf_s(Sets, "BootMale%d", i+1);
InitSets(LOAD_ITEM(11, i), Sets, PlayerFolder, PlayerDir);
}
}
_asm
{
PUSH -1
PUSH 0x00D2D790
PUSH 0x00D2D79C
PUSH 0x14DC
mov eax,BMDModelLoad
CALL eax
ADD ESP,0x10
mov eax,ReturnSetOffset
JMP eax
}
}
}
void InitItems()
{
if(GlowMod == 1)
{
LoadLibraryA(".\\Glow.dll");
}
//Patch new model in game
PatchJMP g_ModelPatch;
SetNop(LoadModel, 25);
g_ModelPatch.Command = 0xE9;
g_ModelPatch.Pointer = (DWORD)&PatchNewModel;
memcpy((int*)LoadModel, &g_ModelPatch, sizeof(g_ModelPatch));
HookThis((DWORD)&PatchNewModel, LoadModel);
//Patch new sets in game
PatchJMP g_SetsPatch;
SetNop(LoadSetModel, 25);
g_SetsPatch.Command = 0xE9;
g_SetsPatch.Pointer = (DWORD)&PatchNewSets;
memcpy((int*)LoadSetModel, &g_SetsPatch, sizeof(g_SetsPatch));
HookThis((DWORD)&PatchNewSets, LoadSetModel);
}
Items.h