I am sharing this source I could not use it, if anyone can and can post what is missing thank you.
#include "stdafx.h"
#include "MemScript.h"
#include "Util.h"
#include "Defines.h"
#include "Reconnect.h"
#include "CustomMonster.h"
#include "Import.h"
#include "Defines.h"
CMonster gMonster;
CMonster::CMonster()
{
this->InitMonster();
}
CMonster::~CMonster()
{
}
void CMonster::Load(char* path) // OK
{
CMemScript* lpMemScript = new CMemScript;
if (lpMemScript == 0)
{
return;
}
if (lpMemScript->SetBuffer(path) == 0)
{
delete lpMemScript;
return;
}
this->LoadMonster = 0;
try
{
while (true)
{
if (lpMemScript->GetToken() == TOKEN_END)
{
break;
}
if (strcmp("end", lpMemScript->GetString()) == 0)
{
break;
}
this->Monster[this->LoadMonster].Class = lpMemScript->GetNumber();
this->Monster[this->LoadMonster].Type = lpMemScript->GetAsNumber();
strcpy_s(this->Monster[this->LoadMonster].Name, lpMemScript->GetAsString());
strcpy_s(this->Monster[this->LoadMonster].Dir, lpMemScript->GetAsString());
strcpy_s(this->Monster[this->LoadMonster].Folder, lpMemScript->GetAsString());
strcpy_s(this->Monster[this->LoadMonster].BMDFile, lpMemScript->GetAsString());
this->Monster[this->LoadMonster].Size = (float)lpMemScript->GetAsNumber();
this->LoadMonster++;
}
}
catch (...)
{
}
delete lpMemScript;
}
void CMonster::InitMonster()
{
SetCompleteHook(0xE8, 0x0061FE3F, &LoadMonsterBMD);
SetCompleteHook(0xE8, 0x0061FEEA, &LoadMonsterTexture);
//SetByte(0x00559B82 + 3, 0xFF); //Limit kill
//SetByte(0x00559B82 + 4, 0xFF); //Limit kill
SetCompleteHook(0xE8, 0x00587049, &ShowMonster);
SetCompleteHook(0xE8, 0x00587049, &ShowMonster);
SetCompleteHook(0xE8, 0x00590CCC, &ShowMonster);
SetCompleteHook(0xE8, 0x005BBEE6, &ShowMonster);
SetCompleteHook(0xE8, 0x0064229D, &ShowMonster);
SetCompleteHook(0xE8, 0x00642D51, &ShowMonster);
SetCompleteHook(0xE8, 0x00643229, &ShowMonster);
SetCompleteHook(0xE8, 0x0065EA86, &ShowMonster);
SetCompleteHook(0xE8, 0x00911903, &ShowMonster);
SetCompleteHook(0xE8, 0x0091191D, &ShowMonster);
SetCompleteHook(0xE8, 0x00911937, &ShowMonster);
SetCompleteHook(0xE8, 0x00911951, &ShowMonster);
SetCompleteHook(0xE8, 0x0091196B, &ShowMonster);
}
void CMonster::LoadMonsterBMD(signed int Class, char* FileDir, char* BmdName, signed int BmdType)
{
for (int i = 0; i < gMonster.LoadMonster; i++)
{
int MonsterClass = Class - MAX_MONSTER_MODEL;
if (MonsterClass == gMonster.Monster[i].Class)
{
pLoadMonsterBMD(Class, gMonster.Monster[i].Dir, gMonster.Monster[i].BMDFile, -1);
return;
}
}
pLoadMonsterBMD(Class, FileDir, BmdName, BmdType);
}
void CMonster::LoadMonsterTexture(signed int Class, char* FolderDir, int a3, int a4)
{
for (int i = 0; i < gMonster.LoadMonster; i++)
{
int MonsterClass = Class - MAX_MONSTER_MODEL;
if (MonsterClass == gMonster.Monster[i].Class)
{
pLoadMonsterTexture(Class, gMonster.Monster[i].Folder, a3, a4);
return;
}
}
pLoadMonsterTexture(Class, FolderDir, a3, a4);
}
void CMonster::ShowMonster(int Class, int a2, int a3, int a4)
{
for (int i = 0; i < gMonster.LoadMonster; i++)
{
if (Class != gMonster.Monster[i].Class)
{
continue;
}
pLoadMonsterID(Class);
DWORD ObjectStruct = pViewObject(a4, Class + MAX_MONSTER_MODEL, a2, a3, 0.0);
ObjectPreview* Object = &*(ObjectPreview*)ObjectStruct;
memcpy(Object->Name, gMonster.Monster[i].Name, sizeof(gMonster.Monster[i].Name));
switch (gMonster.Monster[i].Type)
{
case CUSTOM_MONSTER_TYPE_NPC:
*(BYTE*)(ObjectStruct + 800) = emNPC;
break;
case CUSTOM_MONSTER_TYPE_MOB:
*(BYTE*)(ObjectStruct + 800) = emMonster;
break;
default:
*(BYTE*)(ObjectStruct + 800) = emNone;
break;
}
*(float *)(ObjectStruct + 872) = gMonster.Monster[i].Size;
Object->ID = Class;
*(BYTE*)(ObjectStruct + 798) = 0;
Object->Unknown128 = *(DWORD*)0x879343C;
return;
}
pShowMonster(Class, a2, a3, a4);
}
#pragma once
#include "Offset.h"
#include "Object.h"
#define MAX_CUSTOM_MONSTER 1024
#define MAX_MONSTER_MODEL 644
#define pLoadMonsterBMD ((void(__cdecl*)(signed int a1, char* a2, char* a3, signed int a4)) 0x614D10)
#define pLoadMonsterTexture ((void(__cdecl*)(int a1, char* a2, int a3, signed int a4)) 0x614710)
#define pShowMonster ((double(__cdecl*)(int a1, int a2, int a3, int a4)) 0x580FC0)
#define pViewObject ((int(__cdecl*)(int a1, signed int a2, unsigned __int8 a3, unsigned __int8 a4, float a5)) 0x57EEC0)
#define pLoadMonsterID ((int(__cdecl*)(signed int a1)) 0x61FDE0)
enum eMonsterType
{
CUSTOM_MONSTER_TYPE_NPC = 0,
CUSTOM_MONSTER_TYPE_MOB = 1,
};
struct CustomMonster
{
WORD Class;
BYTE Type;
char Name[25];
char Dir[50];
char Folder[50];
char BMDFile[50];
float Size;
};
class CMonster
{
public:
CMonster();
~CMonster();
void Load(char* path);
void InitMonster();
private:
static void LoadMonsterBMD(signed int Class, char* FileDir, char* BmdName, signed int BmdType);
static void LoadMonsterTexture(signed int Class, char* FolderDir, int a3, int a4);
static void ShowMonster(int Class, int a2, int a3, int a4);
int LoadMonster;
NpcNameList NpcName[MAX_CUSTOM_MONSTER];
CustomMonster Monster[MAX_CUSTOM_MONSTER];
};
extern CMonster gMonster;