Solo usuarios registrados pueden comentar y agradecer, Logueate o Registrate

Autor Topic: CustomMonster  (Visto 3141 veces)

0 Miembros and 1 Guest are viewing this topic.

Offline jhonhy Posteado: August 15, 2019, 01:13:03 PM | Modificado: August 15, 2019, 01:14:42 PM by jhonhy

  • 0 puntos por ventas
  • *
  • Rank: Destacado
  • Posts: 83
  • Gracias recibida: 195
  • br
I am sharing this source I could not use it, if anyone can and can post what is missing thank you.

CustomMonster.cpp
Code: [Select]
#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);
}


CustomMonster.h
Code: [Select]

#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;

CustomMonster.txt
Code: [Select]
// ----------------------------------------------------------------------------------
// Type = 0: NPC
// Type = 1: Monster
// ----------------------------------------------------------------------------------
// MonsterID | Type | Name | Dir | Folder | BMDFile | Size
// ----------------------------------------------------------------------------------
580 1 "ExBoSS" "Data\\Custom\\Monster\\" "Custom\\Monster\\" "Monster171" 0.80
585 0 "Arthur" "Data\\Custom\\Monster\\" "Custom\\Monster\\" "CustomNpc02" 1.00
620 0 "Arthur2" "Data\\Custom\\Monster\\" "Custom\\Monster\\" "CustomNpc03" 1.00
end

Gracias:


Online djagripnos #1 Posteado: August 15, 2019, 02:08:38 PM | Modificado: August 15, 2019, 04:05:52 PM by djagripnos

  • MAESTRO

  • US. DE HONOR

  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 824
  • Gracias recibida: 27494
  • gr
Main source

CustomMonster.h

Citar
#pragma once

#include "Object.h"
#define MAX_CUSTOM_MONSTER      250
#define MONSTER_MODEL   644 //794?

struct CUSTOM_MONSTER_INFO
{
   int Index;
   WORD   ID;
   BYTE   Type;
   char   Name[25];
   char   Dir[50];
   char   Folder[50];
   char   BMDFile[50];
   float   Size;
};
class CCustomMonster
{
public:
   CCustomMonster();
   virtual ~CCustomMonster();
   void Init();
   void Load(CUSTOM_MONSTER_INFO* info);
   void SetInfo(CUSTOM_MONSTER_INFO info);
   CUSTOM_MONSTER_INFO* GetInfo(int index);
   CUSTOM_MONSTER_INFO* GetInfoByID(WORD ID);
   BOOL GetCustomMonsterInfo(WORD ID,BYTE Type,char* Name,char* Dir,char* Folder,char* BMDFile,float Size);

   public:
   CUSTOM_MONSTER_INFO m_CustomMonsterInfo[MAX_CUSTOM_MONSTER];

};
extern CCustomMonster gCustomMonster;

Monster.h

Citar
#pragma once


class Monster
{
public:
   Monster();
   virtual ~Monster();

   void         Load();
   static void      LoadMonsterBMD(signed int ModelID, char* a2, char* a3, signed int a4);
   static void      LoadMonsterTexture(signed int ModelID, char* a2, int a3, int a4);
   static int      ShowMonster(int MonsterID, int a2, int a3, int a4);
   static void      SetMainAttribute(int ObjectPointer, signed int MonsterID);
   static void      NPCChat(int a1, int a2);
   static int      LoadNpcModel(int a1);

};
extern Monster gMonster;

CustomMonster.cpp

Citar
#include "stdafx.h"
#include "CustomMonster.h"


CCustomMonster gCustomMonster;

CCustomMonster::CCustomMonster()
{
   this->Init();
}
CCustomMonster::~CCustomMonster()
{

}
void CCustomMonster::Init()
{
   for(int n=0;n < MAX_CUSTOM_MONSTER;n++)
   {
      this->m_CustomMonsterInfo[n].Index = -1;
   }
}
void CCustomMonster::Load(CUSTOM_MONSTER_INFO* info)
{
   for(int n=0;n < MAX_CUSTOM_MONSTER;n++)
   {
      this->SetInfo(info[n]);
   }
}
void CCustomMonster::SetInfo(CUSTOM_MONSTER_INFO info)
{
   if(info.Index < 0 || info.Index >= MAX_CUSTOM_MONSTER)
   {
      return;
   }

   this->m_CustomMonsterInfo[info.Index] = info;
}
CUSTOM_MONSTER_INFO* CCustomMonster::GetInfo(int index)
{
   if(index < 0 || index >= MAX_CUSTOM_MONSTER)
   {
      return 0;
   }

   if(this->m_CustomMonsterInfo[index].Index != index)
   {
      return 0;
   }

   return &this->m_CustomMonsterInfo[index];
}
CUSTOM_MONSTER_INFO* CCustomMonster::GetInfoByID(WORD ID)
{
   for(int n=0;n < MAX_CUSTOM_MONSTER;n++)
   {
      CUSTOM_MONSTER_INFO* lpInfo = this->GetInfo(n);

      if(lpInfo == 0)
      {
         continue;
      }

      if(lpInfo->ID == ID)
      {
         return lpInfo;
      }
   }

   return 0;
}
BOOL CCustomMonster::GetCustomMonsterInfo(WORD ID,BYTE Type,char* Name,char* Dir,char* Folder,char* BMDFile,float Size)
{
   CUSTOM_MONSTER_INFO* lpInfo = this->GetInfoByID(ID);
   if(lpInfo == 0)
   {
      return 0;
   }
   Type = (BYTE)(lpInfo->Type);
   Name = (lpInfo->Name);
   Dir = (lpInfo->Dir);
   Folder = (lpInfo->Folder);
   BMDFile = (lpInfo->BMDFile);
   Size = (float)(lpInfo->Size);

   return 1;
}

Monster.cpp

Citar
#include "stdafx.h"
#include "Monster.h"
#include "CustomMonster.h"
#include "TMemory.h"
#include "Import.h"
#include "Defines.h"
Monster gMonster;

Monster::Monster() //ok
{

}

Monster::~Monster() //ok
{

}

#define pGetViewStruct         ((lpViewObj(__cdecl*)(int a1, signed int a2, unsigned __int8 a3, unsigned __int8 a4, float a5)) 0x57EEC0)
#define   pOpenMonsterModel      ((void(__cdecl*)(int MonsterID)) 0x61FDE0)

void Monster::Load()
{
   SetOp((LPVOID)0x0061FE3F, (LPVOID)Monster::LoadMonsterBMD, ASM::CALL);
   SetOp((LPVOID)0x0061FEEA, (LPVOID)Monster::LoadMonsterTexture, ASM::CALL);

   SetOp((LPVOID)0x004E199D, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00587049, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00587049, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00590CCC, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x005BBEE6, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x0064229D, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00642D51, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00643229, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x0065EA86, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00911A53, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00911A6D, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00911A87, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00911AA1, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00911ABB, (LPVOID)Monster::ShowMonster, ASM::CALL);

   SetOp((LPVOID)0x0058101A, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058105B, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058109C, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005810DD, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058111E, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058115F, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005811A0, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005811E1, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x00581222, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x00581263, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005812A8, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005812ED, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058132E, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058136F, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005813B4, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005813F9, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x00586859, (LPVOID)Monster::SetMainAttribute, ASM::CALL);

   SetOp((LPVOID)0x0055A2DD, (LPVOID)Monster::NPCChat, ASM::CALL);

   SetByte((PVOID)(0x00559B82 + 3), 0xFF); //Limit kill
   SetByte((PVOID)(0x00559B82 + 4), 0xFF); //Limit kill
}

void Monster::LoadMonsterBMD(signed int ModelID, char* a2, char* a3, signed int a4)
{
   int MonsterID = ModelID - MONSTER_MODEL;

   for (int n = 0; n < MAX_CUSTOM_MONSTER; n++)
   {
      if (MonsterID == gCustomMonster.m_CustomMonsterInfo[n].ID)
      {
         pLoadMonsterBMD(ModelID, gCustomMonster.m_CustomMonsterInfo[n].Dir, gCustomMonster.m_CustomMonsterInfo[n].BMDFile, -1);
         return;
      }
   }

   pLoadMonsterBMD(ModelID, a2, a3, a4);
}

void Monster::LoadMonsterTexture(signed int ModelID, char* a2, int a3, int a4)
{
   int MonsterID = ModelID - MONSTER_MODEL;

   for (int n = 0; n < MAX_CUSTOM_MONSTER; n++)
   {
      if (MonsterID == gCustomMonster.m_CustomMonsterInfo[n].ID)
      {
         pLoadMonsterTexture(ModelID, gCustomMonster.m_CustomMonsterInfo[n].Folder, a3, a4);
         return;
      }
   }

   pLoadMonsterTexture(ModelID, a2, a3, a4);
}

int Monster::LoadNpcModel(int a1)
{
   pLoadNpcModel(a1);

   int result = sub_969C50(sub_4CDA10, a1);
   if (result && *(signed __int16 *)(result + 38) <= 0)
   {
      switch (a1)
      {
      case 1162:
         pLoadModel(1162, "Data\\Npc\\", "jinn", -1);
         pLoadTexture(1162, "Npc\\", 10497, 9728, 0);
         break;
      }
   }

   return result;
}

int Monster::ShowMonster(int MonsterID, int a2, int a3, int a4)
{
   for (int n = 0; n < MAX_CUSTOM_MONSTER; n++)
   {
      if (MonsterID == gCustomMonster.m_CustomMonsterInfo[n].ID)
      {
         pLoadMonsterID(MonsterID);

         DWORD ObjectStruct = pViewObject(a4, MonsterID + MONSTER_MODEL, a2, a3, 0.0); //665?

         lpViewObj Object = &*(ObjectPreview*)ObjectStruct;

         //memcpy(Object->Name, gCustomMonster.m_CustomMonsterInfo[n].Name, sizeof(Object->Name));
         strcpy((char *)(ObjectStruct + 56), gCustomMonster.m_CustomMonsterInfo[n].Name);
         //wsprintf(Object->Name, gCustomMonster.m_CustomMonsterInfo[n].Name);

         if (gCustomMonster.m_CustomMonsterInfo[n].Type == 4)
         {
            *(BYTE*)(ObjectStruct + 800) = emNPC;
         }
         else
         {
            *(BYTE*)(ObjectStruct + 800) = emMonster;
         }

         *(float *)(ObjectStruct + 872) = gCustomMonster.m_CustomMonsterInfo[n].Size;

         //Object->ID = MonsterID;
         //*(BYTE*)(ObjectStruct + 798) = 0;
         //Object->Unknown128 = *(WORD*)0x879343C;
         //sub_580BB0(ObjectStruct, MonsterID);
         //Monster::SetMainAttribute(ObjectStruct, MonsterID);
         //return sub_580BB0(ObjectStruct, MonsterID);

         sub_580BB0(ObjectStruct, MonsterID);
         return ObjectStruct;
      }
   }

   return pShowMonster(MonsterID, a2, a3, a4);
}

void Monster::SetMainAttribute(int ObjectPointer, signed int MonsterID)
{
   lpViewObj Object = &*(ObjectPreview*)(ObjectPointer);

   if (ObjectPointer)
   {
      switch (MonsterID)
      {
      case 229:
         *(short*)(ObjectPointer + 268) = ITEM2(7, 9);
         *(BYTE*)(ObjectPointer + 270) = 0;
         *(BYTE*)(ObjectPointer + 271) = 1;
         *(short*)(ObjectPointer + 304) = ITEM2(8, 9);
         *(BYTE*)(ObjectPointer + 306) = 0;
         *(BYTE*)(ObjectPointer + 307) = 1;
         *(short*)(ObjectPointer + 340) = ITEM2(9, 9);
         *(BYTE*)(ObjectPointer + 342) = 0;
         *(BYTE*)(ObjectPointer + 343) = 1;
         *(short*)(ObjectPointer + 376) = ITEM2(10, 9);
         *(BYTE*)(ObjectPointer + 378) = 0;
         *(BYTE*)(ObjectPointer + 379) = 1;
         *(short*)(ObjectPointer + 412) = ITEM2(11, 9);
         *(BYTE*)(ObjectPointer + 414) = 0;
         *(BYTE*)(ObjectPointer + 415) = 1;
         *(short*)(ObjectPointer + 448) = ITEM2(3,7);
         *(BYTE*)(ObjectPointer + 450) = 0;
         *(BYTE*)(ObjectPointer + 451) = 1;
         *(DWORD *)(ObjectPointer + 1300) = 1;
         break;
      case 247:
      case 249:
         *(short*)(ObjectPointer + 268) = ITEM2(7, 9);
         *(BYTE*)(ObjectPointer + 270) = 0;
         *(BYTE*)(ObjectPointer + 271) = 1;
         *(short*)(ObjectPointer + 304) = ITEM2(8, 9);
         *(BYTE*)(ObjectPointer + 306) = 0;
         *(BYTE*)(ObjectPointer + 307) = 1;
         *(short*)(ObjectPointer + 340) = ITEM2(9, 9);
         *(BYTE*)(ObjectPointer + 342) = 0;
         *(BYTE*)(ObjectPointer + 343) = 1;
         *(short*)(ObjectPointer + 376) = ITEM2(10, 9);
         *(BYTE*)(ObjectPointer + 378) = 0;
         *(BYTE*)(ObjectPointer + 379) = 1;
         *(short*)(ObjectPointer + 412) = ITEM2(11, 9);
         *(BYTE*)(ObjectPointer + 414) = 0;
         *(BYTE*)(ObjectPointer + 415) = 1;
         if (MonsterID == 247)
         {
            *(short*)(ObjectPointer + 448) = ITEM2(4,11);
         }
         else if (MonsterID == 249)
         {
            *(short*)(ObjectPointer + 448) = ITEM2(3,7);
         }
         *(BYTE*)(ObjectPointer + 450) = 0;
         *(BYTE*)(ObjectPointer + 451) = 1;
         *(DWORD *)(ObjectPointer + 1300) = 1;
         break;
      case 58:
         *(short*)(ObjectPointer + 448) = ITEM2(0, 28);
         *(BYTE*)(ObjectPointer + 450) = 0;
         *(BYTE*)(ObjectPointer + 451) = 0;
         break;
      }
      //if ( MonsterID == 451 )
      //  *(BYTE*)(ObjectPointer + 800) = -128;
   }

   pMonsterAttribute(ObjectPointer, MonsterID);
}

void Monster::NPCChat(int a1, int a2)
{
   //switch (*(WORD *)(a1 + 132))
   //{
   //case 651: //651+794: //794???
   //   pSendChatSay((char *)(a1 + 56), "I Wish You !", a1, 0, -1);
   //   break;
   //}

   pNpcChat(a1, a2);
}

Main.cpp

Citar
#include "Monster.h"
#include "CustomMonster.h"

gCustomMonster.Load(gProtect.m_MainInfo.CustomMonsterInfo);

gMonster.Load();


Protect.h
Citar
#include "CustomMonster.h"

CUSTOM_MONSTER_INFO CustomMonsterInfo[MAX_CUSTOM_MONSTER];

Import.h

Citar
//-> Monster
#define pMaybeDrawPetHP            ((char(__stdcall*)(int a1, int a2)) 0x7DFDB0)
#define sub_50D100               ((size_t(__cdecl*)(char * a1, char * a2, ...)) 0x50D100)
#define   sub_7DFA60               ((int(__stdcall*)(signed int PosX, signed int PosY, int a3, signed int a4, signed int a5, char a6)) 0x7DFA60)
#define sub_501790               ((char(__cdecl*)(int a1, char a2)) 0x501790)
#define sub_540C30               ((int(__cdecl*)(float, float, float, float)) 0x540C30)
#define sub_540EA0               ((int(__cdecl*)(float, float a2, float)) 0x540EA0)
#define sub_959CE0               ((int(__cdecl*)(DWORD, DWORD)) 0x959CE0)
#define sub_95A1E0               ((int(__cdecl*)(DWORD a1, DWORD a2, float *a3)) 0x95A1E0)
#define sub_541460               ((void(__cdecl*)(int a1)) 0x541460)
#define sub_4CDA10               ((LPVOID(*)())0x4CDA10)
#define sub_969C50               ((int(__thiscall*)(LPVOID This, signed int a2)) 0x969C50)
#define sub_5D6700               ((int(__cdecl*)(unsigned __int8 a1, unsigned __int8 a2)) 0x5D6700)
#define sub_5422E0               ((bool(__cdecl*)(__int16 a1)) 0x5422E0)
#define sub_542310               ((__int16(__cdecl*)(int a1, int a2, char a3)) 0x542310)
#define sub_545030               ((int(__thiscall*)(LPVOID This, int a2, DWORD *a3, DWORD *BMD, char a5)) 0x545030)
#define sub_6D9070               ((void(__cdecl*)(int a1, int a2, int a3, float * a4, int a5, int a6, __int16 a7, __int16 a8, __int16 a9, __int16 a10, float a11, __int16 a12)) 0x6D9070)
#define sub_74CD30               ((int(__cdecl*)(int a1, int a2, int a3, vec3_t a4, int a5, float a6, int a7)) 0x74CD30)
#define sub_74CD30_               ((int(__cdecl*)(DWORD a1, vec3_t a2, int a3, vec3_t a4, int a5, float a6, int a7)) 0x74CD30)
#define sub_4DB1C0               ((bool(__cdecl*)(signed int a1))0x4DB1C0)
#define sub_4C8640               ((bool(__thiscall*)(void * This,char a2)) 0x4C8640)
#define sub_4DB250               ((int(__cdecl*)()) 0x4DB250)
#define sub_4E44A0               ((bool(__thiscall*)(int This)) 0x4E44A0)
#define sub_7293F0               ((char*(__cdecl*)(int a1, int a2, int a3, int a4, int a5, char a6, int a7)) 0x7293F0)
#define sub_5039A0               ((void(__cdecl*)(int a1, int a2)) 0x5039A0)
#define sub_72D1B0               ((void(__cdecl*)(int a1, int a2, int a3, int a4, int a5, int a6, float a7, __int16 a8, __int16 a9, char a10, int a11, int a12, __int16 a13)) 0x72D1B0)
#define sub_542280               ((bool(__cdecl*)(__int16 a1)) 0x542280)
#define sub_545180               ((char(__thiscall*)(void * This, int a2, int a3, int a4, float a5, int a6, int a7)) 0x545180)
#define sub_5CA0D0               ((void(__cdecl*)( int a1,  int a2, int a3, int a4, int a5, int a6, char a7)) 0x5CA0D0)
#define sub_9250E0               ((int(__thiscall*)(LPVOID This, int a1, int a2, int a3, int a4, int a5, int a6)) 0x9250E0)
#define sub_4DB230               ((LPVOID(*)())0x4DB230)
#define sub_501700               ((DWORD(__cdecl*)(DWORD, DWORD, DWORD, DWORD, DWORD)) 0x501700)
#define sub_57D9A0               ((DWORD(__cdecl*)(DWORD)) 0x57D9A0)
#define sub_58AA80               ((DWORD(__cdecl*)(DWORD)) 0x58AA80)
#define sub_4E6670               ((DWORD(__cdecl*)(DWORD)) 0x4E6670)
#define sub_57F020               ((DWORD(__cdecl*)(DWORD)) 0x57F020)

#define sub_4F8C30               ((DWORD(__cdecl*)(DWORD)) 0x4F8C30)
#define sub_534B40               ((DWORD(__cdecl*)(DWORD)) 0x534B40)
#define sub_5012D0               ((DWORD(__cdecl*)(DWORD)) 0x5012D0)
#define sub_9253D0               ((int(__thiscall*)(LPVOID This,int a1, short a2)) 0x9253D0)
#define sub_4F94A0               ((DWORD(__cdecl*)(DWORD)) 0x4F94A0)
#define sub_57FC30               ((int(__cdecl*)(BYTE CharSet)) 0x57FC30)
#define sub_587500               ((DWORD(__cdecl*)(char)) 0x587500)
#define sub_402BC0               ((LPVOID(*)())0x402BC0)

#define pGetTextLine         ((char*(__thiscall*)(LPVOID This, int LineNumber)) 0x402320)
#define pGetTextLineint         ((int(__thiscall*)(LPVOID This, int LineNumber)) 0x402320)
#define pGetTextLine_         ((char*(__thiscall*)(LPVOID This, int LineNumber)) 0x402320)
#define pMapName            ((char*(__cdecl*)(signed int mapNumber)) 0x5D2C10)

#define pGetPreviewStruct      ((DWORD(__thiscall*)(LPVOID This, int ViewportID)) 0x0096A4C0)
#define pPreviewCharSet         ((void(__cdecl*)(int ObjectIndex, BYTE * CharSet, lpViewObj Object, int Mode)) 0x57FD90)
#define oUserPreviewStruct      *(int*)0x7BC4F04
#define oUserObjectStruct      *(int*)0x8128AC8
#define oUserObjectStruct_      *(int*)0x8128AC4
#define oUserTextObject         *(int*)0x8128AC0 //ITEM.BMD
#define pGetMapName   ((char*(__cdecl*)(int MapNumber)) 0x5D2C10)

#define sub_405230               ((int(__cdecl*)(char a1)) 0x405230)
#define sub_4F9930               ((int(__cdecl*)(char *a1)) 0x4F9930)
#define sub_4F8B80               ((int(__cdecl*)(int a1)) 0x4F8B80)
#define sub_4E65A0               ((bool(__cdecl*)(signed int a1)) 0x4E65A0)
#define sub_4FA780               ((int(__thiscall*)(int This, int a2)) 0x4FA780)
#define sub_5013B0               ((char(__cdecl*)(int a1, int a2, int a3, int a4, int a5)) 0x5013B0)
#define sub_4EFF70               ((void(__cdecl*)(LPVOID This,int a1)) 0x4EFF70)
#define sub_96A4C0               ((int(__thiscall*)(LPVOID This, signed int a2)) 0x96A4C0)
#define sub_57FD90               ((void(__cdecl*)(int a1, BYTE * a2, int a3, int a4)) 0x57FD90)
#define sub_558630               ((void(__cdecl*)(int a1, int a2, int a3)) 0x558630)
#define SLODWORD(x)               (*((DWORD*)&(x)))
#define sub_771310               ((int(__cdecl*)(int a1, int a2, float a3, vec3_t a4, int a5, float a6, int a7)) 0x771310)
#define sub_771310_               ((int(__cdecl*)(int a1, vec3_t a2, float a3, vec3_t a4, int a5, float a6, int a7)) 0x771310)
#define sub_95A340               ((int(__cdecl*)(int a1, int a2, int a3)) 0x95A340)
#define sub_5440B0               ((int(__fastcall*)(int a1, int a2, int a3, float a4, float a5, __int16 a6, int a7, int a8, char a9, char a10)) 0x5440B0)
#define sub_922D50               ((signed int(__thiscall*)(int This, unsigned int a2)) 0x922D50);
#define sub_580BB0               ((int(__cdecl*)(DWORD, DWORD)) 0x580BB0)
#define sub_4CD7F0               ((int(__stdcall*)(DWORD,DWORD)) 0x4CD7F0)
#define pDrawMonsterEffect         ((char(__cdecl*)(int a1, int a2, int a3)) 0x8C7790)
#define sub_5D81B0               ((int(__cdecl*)(float, float)) 0x5D81B0)
#define sub_544E60               ((void(__thiscall*)(LPVOID This, vec3_t a2, int a3, signed int a4, int a5)) 0x544E60)
#define sub_9593B0               ((int(__stdcall*)(HDC This, LPCSTR lpMultiByteStr, int, LPSIZE psizl)) 0x9593B0)
#define pSetTextSize            ((int(__thiscall*)(LPVOID This, HFONT a2)) 0x420120)
#define pFontBold               *(DWORD*)0xE8C58C
#define sub_8CBA40               ((int(__cdecl*)(int, int, float, float, float, float, GLfloat *v)) 0x8CBA40) //Effect? 32141
#define sub_5DAD80               ((int(__cdecl*)(int, float, float, float, float, GLfloat *v, float, float, float, char)) 0x5DAD80) //effect ?32313
#define sub_56EFC0               ((int(__cdecl*)(int, int, float, int, float, float, float)) 0x56EFC0)
#define sub_4E65C0               ((bool(__cdecl*)(signed int MapNumber)) 0x4E65C0)
#define sub_89CB00               ((LPVOID(*)())0x89CB00)
#define sub_89CB90               ((int(__thiscall*)(LPVOID This)) 0x89CB90)
#define pPreviewPetThis            *(DWORD*)0x007BC4F04
#define LODWORD(h)                ((DWORD)(__int64(h) & __int64(0xffffffff)))
#define oNpcName            0x8119F68
#define pSendChatSay         ((int(__cdecl*)(char * Name, char * Text, int a1, int a4, int a5)) 0x5996A0)
#define pShowMonster         ((int(__cdecl*)(int MonsterID, int a2, int a3, int a4)) 0x580FC0)
#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, int a2, char a3, char a4, float a5)) 0x57EEC0)
#define pLoadMonsterID         ((int(__cdecl*)(signed int a1)) 0x61FDE0)
#define pMonsterAttribute      ((int(__cdecl*)(int ObjectPointer, signed int MonsterID)) 0x580BB0)
#define pNpcChat            ((char*(__cdecl*)(int a1, int a2)) 0x559540)
#define pLoadNpcModel         ((int(__cdecl*)(int a1)) 0x61E060)

GetmainInfo

CustomMonster.h

Citar
#pragma once
#define MAX_CUSTOM_MONSTER      250


struct CUSTOM_MONSTER_INFO
{
   int Index;
   WORD   ID;
   BYTE   Type;
   char   Name[25];
   char   Dir[50];
   char   Folder[50];
   char   BMDFile[50];
   float   Size;
};
class CCustomMonster
{
public:
   CCustomMonster();
   virtual ~CCustomMonster();
   void Init();
   void Load(char* path);
   void SetInfo(CUSTOM_MONSTER_INFO info);
public:
   CUSTOM_MONSTER_INFO m_CustomMonsterInfo[MAX_CUSTOM_MONSTER];
};
extern CCustomMonster gCustomMonster;

CustomMonster.cpp

Citar
#include "stdafx.h"
#include "CustomMonster.h"
#include "MemScript.h"

CCustomMonster gCustomMonster;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCustomMonster::CCustomMonster() // OK
{
   this->Init();
}

CCustomMonster::~CCustomMonster() // OK
{

}
void CCustomMonster::Init()
{
   for(int n=0;n < MAX_CUSTOM_MONSTER;n++)
   {
      this->m_CustomMonsterInfo[n].Index = -1;
   }
}
void CCustomMonster::Load(char* path) // OK
{
   CMemScript* lpMemScript = new CMemScript;

   if(lpMemScript == 0)
   {
      printf(MEM_SCRIPT_ALLOC_ERROR,path);
      return;
   }

   if(lpMemScript->SetBuffer(path) == 0)
   {
      printf(lpMemScript->GetLastError());
      delete lpMemScript;
      return;
   }

   this->Init();

   try
   {
      while(true)
      {
         if(lpMemScript->GetToken() == TOKEN_END)
         {
            break;
         }

         if(strcmp("end",lpMemScript->GetString()) == 0)
         {
            break;
         }

         CUSTOM_MONSTER_INFO info;

         memset(&info,0,sizeof(info));

         static int CustomMonsterIndexCount = 0;

         info.Index = CustomMonsterIndexCount++;

         info.ID = lpMemScript->GetNumber();

         info.Type = lpMemScript->GetAsNumber();

         strcpy_s(info.Name,lpMemScript->GetAsString());

         strcpy_s(info.Dir,lpMemScript->GetAsString());

         strcpy_s(info.Folder,lpMemScript->GetAsString());

         strcpy_s(info.BMDFile,lpMemScript->GetAsString());

         info.Size = lpMemScript->GetAsFloatNumber();

         this->SetInfo(info);
      }
   }
   catch(...)
   {
      printf(lpMemScript->GetLastError());
   }

   delete lpMemScript;
}
void CCustomMonster::SetInfo(CUSTOM_MONSTER_INFO info) // OK
{
   if(info.Index < 0 || info.Index >= MAX_CUSTOM_MONSTER)
   {
      return;
   }

   this->m_CustomMonsterInfo[info.Index] = info;
}

GetMainInfo.cpp

Citar
#include "CustomMonster.h"

CUSTOM_MONSTER_INFO CustomMonsterInfo[MAX_CUSTOM_MONSTER];

gCustomMonster.Load("CustomMonster.txt");

memcpy(info.CustomMonsterInfo,gCustomMonster.m_CustomMonsterInfo,sizeof(info.CustomMonsterInfo));


CustomMonster.txt

Citar
// ----------------------------------------------------------------------------------
// Type = 0: NPC
// Type = 1: Monster
// ----------------------------------------------------------------------------------
// MonsterID | Type    | Name       | Dir             | Folder       | BMDFile       | Size
// ----------------------------------------------------------------------------------
620      0   "Arthur2"   "Data\\Monster\\"           "Monster\\"            "CustomNpc03"      1.00
end

Gracias:


Offline jhonhy #2 Posteado: August 15, 2019, 02:37:58 PM

  • 0 puntos por ventas
  • *
  • Rank: Destacado
  • Posts: 83
  • Gracias recibida: 195
  • br
@djagripnos , it's missing offsets, you can share?

sub_969C50
sub_4CDA10
sub_580BB0
pLoadTexture
pLoadModel

Gracias:


Online djagripnos #3 Posteado: August 15, 2019, 04:06:13 PM

  • MAESTRO

  • US. DE HONOR

  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 824
  • Gracias recibida: 27494
  • gr
i fix post

Gracias:


Offline PhantomKr #4 Posteado: August 15, 2019, 08:21:33 PM

  • 0 puntos por ventas
  • *
  • Rank: Heroe
  • Posts: 170
  • Gracias recibida: 1218
  • pe
Main source

CustomMonster.h

Citar
#pragma once

#include "Object.h"
#define MAX_CUSTOM_MONSTER      250
#define MONSTER_MODEL   644 //794?

struct CUSTOM_MONSTER_INFO
{
   int Index;
   WORD   ID;
   BYTE   Type;
   char   Name[25];
   char   Dir[50];
   char   Folder[50];
   char   BMDFile[50];
   float   Size;
};
class CCustomMonster
{
public:
   CCustomMonster();
   virtual ~CCustomMonster();
   void Init();
   void Load(CUSTOM_MONSTER_INFO* info);
   void SetInfo(CUSTOM_MONSTER_INFO info);
   CUSTOM_MONSTER_INFO* GetInfo(int index);
   CUSTOM_MONSTER_INFO* GetInfoByID(WORD ID);
   BOOL GetCustomMonsterInfo(WORD ID,BYTE Type,char* Name,char* Dir,char* Folder,char* BMDFile,float Size);

   public:
   CUSTOM_MONSTER_INFO m_CustomMonsterInfo[MAX_CUSTOM_MONSTER];

};
extern CCustomMonster gCustomMonster;

Monster.h

Citar
#pragma once


class Monster
{
public:
   Monster();
   virtual ~Monster();

   void         Load();
   static void      LoadMonsterBMD(signed int ModelID, char* a2, char* a3, signed int a4);
   static void      LoadMonsterTexture(signed int ModelID, char* a2, int a3, int a4);
   static int      ShowMonster(int MonsterID, int a2, int a3, int a4);
   static void      SetMainAttribute(int ObjectPointer, signed int MonsterID);
   static void      NPCChat(int a1, int a2);
   static int      LoadNpcModel(int a1);

};
extern Monster gMonster;

CustomMonster.cpp

Citar
#include "stdafx.h"
#include "CustomMonster.h"


CCustomMonster gCustomMonster;

CCustomMonster::CCustomMonster()
{
   this->Init();
}
CCustomMonster::~CCustomMonster()
{

}
void CCustomMonster::Init()
{
   for(int n=0;n < MAX_CUSTOM_MONSTER;n++)
   {
      this->m_CustomMonsterInfo[n].Index = -1;
   }
}
void CCustomMonster::Load(CUSTOM_MONSTER_INFO* info)
{
   for(int n=0;n < MAX_CUSTOM_MONSTER;n++)
   {
      this->SetInfo(info[n]);
   }
}
void CCustomMonster::SetInfo(CUSTOM_MONSTER_INFO info)
{
   if(info.Index < 0 || info.Index >= MAX_CUSTOM_MONSTER)
   {
      return;
   }

   this->m_CustomMonsterInfo[info.Index] = info;
}
CUSTOM_MONSTER_INFO* CCustomMonster::GetInfo(int index)
{
   if(index < 0 || index >= MAX_CUSTOM_MONSTER)
   {
      return 0;
   }

   if(this->m_CustomMonsterInfo[index].Index != index)
   {
      return 0;
   }

   return &this->m_CustomMonsterInfo[index];
}
CUSTOM_MONSTER_INFO* CCustomMonster::GetInfoByID(WORD ID)
{
   for(int n=0;n < MAX_CUSTOM_MONSTER;n++)
   {
      CUSTOM_MONSTER_INFO* lpInfo = this->GetInfo(n);

      if(lpInfo == 0)
      {
         continue;
      }

      if(lpInfo->ID == ID)
      {
         return lpInfo;
      }
   }

   return 0;
}
BOOL CCustomMonster::GetCustomMonsterInfo(WORD ID,BYTE Type,char* Name,char* Dir,char* Folder,char* BMDFile,float Size)
{
   CUSTOM_MONSTER_INFO* lpInfo = this->GetInfoByID(ID);
   if(lpInfo == 0)
   {
      return 0;
   }
   Type = (BYTE)(lpInfo->Type);
   Name = (lpInfo->Name);
   Dir = (lpInfo->Dir);
   Folder = (lpInfo->Folder);
   BMDFile = (lpInfo->BMDFile);
   Size = (float)(lpInfo->Size);

   return 1;
}

Monster.cpp

Citar
#include "stdafx.h"
#include "Monster.h"
#include "CustomMonster.h"
#include "TMemory.h"
#include "Import.h"
#include "Defines.h"
Monster gMonster;

Monster::Monster() //ok
{

}

Monster::~Monster() //ok
{

}

#define pGetViewStruct         ((lpViewObj(__cdecl*)(int a1, signed int a2, unsigned __int8 a3, unsigned __int8 a4, float a5)) 0x57EEC0)
#define   pOpenMonsterModel      ((void(__cdecl*)(int MonsterID)) 0x61FDE0)

void Monster::Load()
{
   SetOp((LPVOID)0x0061FE3F, (LPVOID)Monster::LoadMonsterBMD, ASM::CALL);
   SetOp((LPVOID)0x0061FEEA, (LPVOID)Monster::LoadMonsterTexture, ASM::CALL);

   SetOp((LPVOID)0x004E199D, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00587049, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00587049, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00590CCC, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x005BBEE6, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x0064229D, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00642D51, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00643229, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x0065EA86, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00911A53, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00911A6D, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00911A87, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00911AA1, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00911ABB, (LPVOID)Monster::ShowMonster, ASM::CALL);

   SetOp((LPVOID)0x0058101A, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058105B, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058109C, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005810DD, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058111E, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058115F, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005811A0, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005811E1, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x00581222, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x00581263, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005812A8, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005812ED, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058132E, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058136F, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005813B4, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005813F9, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x00586859, (LPVOID)Monster::SetMainAttribute, ASM::CALL);

   SetOp((LPVOID)0x0055A2DD, (LPVOID)Monster::NPCChat, ASM::CALL);

   SetByte((PVOID)(0x00559B82 + 3), 0xFF); //Limit kill
   SetByte((PVOID)(0x00559B82 + 4), 0xFF); //Limit kill
}

void Monster::LoadMonsterBMD(signed int ModelID, char* a2, char* a3, signed int a4)
{
   int MonsterID = ModelID - MONSTER_MODEL;

   for (int n = 0; n < MAX_CUSTOM_MONSTER; n++)
   {
      if (MonsterID == gCustomMonster.m_CustomMonsterInfo[n].ID)
      {
         pLoadMonsterBMD(ModelID, gCustomMonster.m_CustomMonsterInfo[n].Dir, gCustomMonster.m_CustomMonsterInfo[n].BMDFile, -1);
         return;
      }
   }

   pLoadMonsterBMD(ModelID, a2, a3, a4);
}

void Monster::LoadMonsterTexture(signed int ModelID, char* a2, int a3, int a4)
{
   int MonsterID = ModelID - MONSTER_MODEL;

   for (int n = 0; n < MAX_CUSTOM_MONSTER; n++)
   {
      if (MonsterID == gCustomMonster.m_CustomMonsterInfo[n].ID)
      {
         pLoadMonsterTexture(ModelID, gCustomMonster.m_CustomMonsterInfo[n].Folder, a3, a4);
         return;
      }
   }

   pLoadMonsterTexture(ModelID, a2, a3, a4);
}

int Monster::LoadNpcModel(int a1)
{
   pLoadNpcModel(a1);

   int result = sub_969C50(sub_4CDA10, a1);
   if (result && *(signed __int16 *)(result + 38) <= 0)
   {
      switch (a1)
      {
      case 1162:
         pLoadModel(1162, "Data\\Npc\\", "jinn", -1);
         pLoadTexture(1162, "Npc\\", 10497, 9728, 0);
         break;
      }
   }

   return result;
}

int Monster::ShowMonster(int MonsterID, int a2, int a3, int a4)
{
   for (int n = 0; n < MAX_CUSTOM_MONSTER; n++)
   {
      if (MonsterID == gCustomMonster.m_CustomMonsterInfo[n].ID)
      {
         pLoadMonsterID(MonsterID);

         DWORD ObjectStruct = pViewObject(a4, MonsterID + MONSTER_MODEL, a2, a3, 0.0); //665?

         lpViewObj Object = &*(ObjectPreview*)ObjectStruct;

         //memcpy(Object->Name, gCustomMonster.m_CustomMonsterInfo[n].Name, sizeof(Object->Name));
         strcpy((char *)(ObjectStruct + 56), gCustomMonster.m_CustomMonsterInfo[n].Name);
         //wsprintf(Object->Name, gCustomMonster.m_CustomMonsterInfo[n].Name);

         if (gCustomMonster.m_CustomMonsterInfo[n].Type == 4)
         {
            *(BYTE*)(ObjectStruct + 800) = emNPC;
         }
         else
         {
            *(BYTE*)(ObjectStruct + 800) = emMonster;
         }

         *(float *)(ObjectStruct + 872) = gCustomMonster.m_CustomMonsterInfo[n].Size;

         //Object->ID = MonsterID;
         //*(BYTE*)(ObjectStruct + 798) = 0;
         //Object->Unknown128 = *(WORD*)0x879343C;
         //sub_580BB0(ObjectStruct, MonsterID);
         //Monster::SetMainAttribute(ObjectStruct, MonsterID);
         //return sub_580BB0(ObjectStruct, MonsterID);

         sub_580BB0(ObjectStruct, MonsterID);
         return ObjectStruct;
      }
   }

   return pShowMonster(MonsterID, a2, a3, a4);
}

void Monster::SetMainAttribute(int ObjectPointer, signed int MonsterID)
{
   lpViewObj Object = &*(ObjectPreview*)(ObjectPointer);

   if (ObjectPointer)
   {
      switch (MonsterID)
      {
      case 229:
         *(short*)(ObjectPointer + 268) = ITEM2(7, 9);
         *(BYTE*)(ObjectPointer + 270) = 0;
         *(BYTE*)(ObjectPointer + 271) = 1;
         *(short*)(ObjectPointer + 304) = ITEM2(8, 9);
         *(BYTE*)(ObjectPointer + 306) = 0;
         *(BYTE*)(ObjectPointer + 307) = 1;
         *(short*)(ObjectPointer + 340) = ITEM2(9, 9);
         *(BYTE*)(ObjectPointer + 342) = 0;
         *(BYTE*)(ObjectPointer + 343) = 1;
         *(short*)(ObjectPointer + 376) = ITEM2(10, 9);
         *(BYTE*)(ObjectPointer + 378) = 0;
         *(BYTE*)(ObjectPointer + 379) = 1;
         *(short*)(ObjectPointer + 412) = ITEM2(11, 9);
         *(BYTE*)(ObjectPointer + 414) = 0;
         *(BYTE*)(ObjectPointer + 415) = 1;
         *(short*)(ObjectPointer + 448) = ITEM2(3,7);
         *(BYTE*)(ObjectPointer + 450) = 0;
         *(BYTE*)(ObjectPointer + 451) = 1;
         *(DWORD *)(ObjectPointer + 1300) = 1;
         break;
      case 247:
      case 249:
         *(short*)(ObjectPointer + 268) = ITEM2(7, 9);
         *(BYTE*)(ObjectPointer + 270) = 0;
         *(BYTE*)(ObjectPointer + 271) = 1;
         *(short*)(ObjectPointer + 304) = ITEM2(8, 9);
         *(BYTE*)(ObjectPointer + 306) = 0;
         *(BYTE*)(ObjectPointer + 307) = 1;
         *(short*)(ObjectPointer + 340) = ITEM2(9, 9);
         *(BYTE*)(ObjectPointer + 342) = 0;
         *(BYTE*)(ObjectPointer + 343) = 1;
         *(short*)(ObjectPointer + 376) = ITEM2(10, 9);
         *(BYTE*)(ObjectPointer + 378) = 0;
         *(BYTE*)(ObjectPointer + 379) = 1;
         *(short*)(ObjectPointer + 412) = ITEM2(11, 9);
         *(BYTE*)(ObjectPointer + 414) = 0;
         *(BYTE*)(ObjectPointer + 415) = 1;
         if (MonsterID == 247)
         {
            *(short*)(ObjectPointer + 448) = ITEM2(4,11);
         }
         else if (MonsterID == 249)
         {
            *(short*)(ObjectPointer + 448) = ITEM2(3,7);
         }
         *(BYTE*)(ObjectPointer + 450) = 0;
         *(BYTE*)(ObjectPointer + 451) = 1;
         *(DWORD *)(ObjectPointer + 1300) = 1;
         break;
      case 58:
         *(short*)(ObjectPointer + 448) = ITEM2(0, 28);
         *(BYTE*)(ObjectPointer + 450) = 0;
         *(BYTE*)(ObjectPointer + 451) = 0;
         break;
      }
      //if ( MonsterID == 451 )
      //  *(BYTE*)(ObjectPointer + 800) = -128;
   }

   pMonsterAttribute(ObjectPointer, MonsterID);
}

void Monster::NPCChat(int a1, int a2)
{
   //switch (*(WORD *)(a1 + 132))
   //{
   //case 651: //651+794: //794???
   //   pSendChatSay((char *)(a1 + 56), "I Wish You !", a1, 0, -1);
   //   break;
   //}

   pNpcChat(a1, a2);
}

Main.cpp

Citar
#include "Monster.h"
#include "CustomMonster.h"

gCustomMonster.Load(gProtect.m_MainInfo.CustomMonsterInfo);

gMonster.Load();


Protect.h
Citar
#include "CustomMonster.h"

CUSTOM_MONSTER_INFO CustomMonsterInfo[MAX_CUSTOM_MONSTER];

Import.h

Citar
//-> Monster
#define pMaybeDrawPetHP            ((char(__stdcall*)(int a1, int a2)) 0x7DFDB0)
#define sub_50D100               ((size_t(__cdecl*)(char * a1, char * a2, ...)) 0x50D100)
#define   sub_7DFA60               ((int(__stdcall*)(signed int PosX, signed int PosY, int a3, signed int a4, signed int a5, char a6)) 0x7DFA60)
#define sub_501790               ((char(__cdecl*)(int a1, char a2)) 0x501790)
#define sub_540C30               ((int(__cdecl*)(float, float, float, float)) 0x540C30)
#define sub_540EA0               ((int(__cdecl*)(float, float a2, float)) 0x540EA0)
#define sub_959CE0               ((int(__cdecl*)(DWORD, DWORD)) 0x959CE0)
#define sub_95A1E0               ((int(__cdecl*)(DWORD a1, DWORD a2, float *a3)) 0x95A1E0)
#define sub_541460               ((void(__cdecl*)(int a1)) 0x541460)
#define sub_4CDA10               ((LPVOID(*)())0x4CDA10)
#define sub_969C50               ((int(__thiscall*)(LPVOID This, signed int a2)) 0x969C50)
#define sub_5D6700               ((int(__cdecl*)(unsigned __int8 a1, unsigned __int8 a2)) 0x5D6700)
#define sub_5422E0               ((bool(__cdecl*)(__int16 a1)) 0x5422E0)
#define sub_542310               ((__int16(__cdecl*)(int a1, int a2, char a3)) 0x542310)
#define sub_545030               ((int(__thiscall*)(LPVOID This, int a2, DWORD *a3, DWORD *BMD, char a5)) 0x545030)
#define sub_6D9070               ((void(__cdecl*)(int a1, int a2, int a3, float * a4, int a5, int a6, __int16 a7, __int16 a8, __int16 a9, __int16 a10, float a11, __int16 a12)) 0x6D9070)
#define sub_74CD30               ((int(__cdecl*)(int a1, int a2, int a3, vec3_t a4, int a5, float a6, int a7)) 0x74CD30)
#define sub_74CD30_               ((int(__cdecl*)(DWORD a1, vec3_t a2, int a3, vec3_t a4, int a5, float a6, int a7)) 0x74CD30)
#define sub_4DB1C0               ((bool(__cdecl*)(signed int a1))0x4DB1C0)
#define sub_4C8640               ((bool(__thiscall*)(void * This,char a2)) 0x4C8640)
#define sub_4DB250               ((int(__cdecl*)()) 0x4DB250)
#define sub_4E44A0               ((bool(__thiscall*)(int This)) 0x4E44A0)
#define sub_7293F0               ((char*(__cdecl*)(int a1, int a2, int a3, int a4, int a5, char a6, int a7)) 0x7293F0)
#define sub_5039A0               ((void(__cdecl*)(int a1, int a2)) 0x5039A0)
#define sub_72D1B0               ((void(__cdecl*)(int a1, int a2, int a3, int a4, int a5, int a6, float a7, __int16 a8, __int16 a9, char a10, int a11, int a12, __int16 a13)) 0x72D1B0)
#define sub_542280               ((bool(__cdecl*)(__int16 a1)) 0x542280)
#define sub_545180               ((char(__thiscall*)(void * This, int a2, int a3, int a4, float a5, int a6, int a7)) 0x545180)
#define sub_5CA0D0               ((void(__cdecl*)( int a1,  int a2, int a3, int a4, int a5, int a6, char a7)) 0x5CA0D0)
#define sub_9250E0               ((int(__thiscall*)(LPVOID This, int a1, int a2, int a3, int a4, int a5, int a6)) 0x9250E0)
#define sub_4DB230               ((LPVOID(*)())0x4DB230)
#define sub_501700               ((DWORD(__cdecl*)(DWORD, DWORD, DWORD, DWORD, DWORD)) 0x501700)
#define sub_57D9A0               ((DWORD(__cdecl*)(DWORD)) 0x57D9A0)
#define sub_58AA80               ((DWORD(__cdecl*)(DWORD)) 0x58AA80)
#define sub_4E6670               ((DWORD(__cdecl*)(DWORD)) 0x4E6670)
#define sub_57F020               ((DWORD(__cdecl*)(DWORD)) 0x57F020)

#define sub_4F8C30               ((DWORD(__cdecl*)(DWORD)) 0x4F8C30)
#define sub_534B40               ((DWORD(__cdecl*)(DWORD)) 0x534B40)
#define sub_5012D0               ((DWORD(__cdecl*)(DWORD)) 0x5012D0)
#define sub_9253D0               ((int(__thiscall*)(LPVOID This,int a1, short a2)) 0x9253D0)
#define sub_4F94A0               ((DWORD(__cdecl*)(DWORD)) 0x4F94A0)
#define sub_57FC30               ((int(__cdecl*)(BYTE CharSet)) 0x57FC30)
#define sub_587500               ((DWORD(__cdecl*)(char)) 0x587500)
#define sub_402BC0               ((LPVOID(*)())0x402BC0)

#define pGetTextLine         ((char*(__thiscall*)(LPVOID This, int LineNumber)) 0x402320)
#define pGetTextLineint         ((int(__thiscall*)(LPVOID This, int LineNumber)) 0x402320)
#define pGetTextLine_         ((char*(__thiscall*)(LPVOID This, int LineNumber)) 0x402320)
#define pMapName            ((char*(__cdecl*)(signed int mapNumber)) 0x5D2C10)

#define pGetPreviewStruct      ((DWORD(__thiscall*)(LPVOID This, int ViewportID)) 0x0096A4C0)
#define pPreviewCharSet         ((void(__cdecl*)(int ObjectIndex, BYTE * CharSet, lpViewObj Object, int Mode)) 0x57FD90)
#define oUserPreviewStruct      *(int*)0x7BC4F04
#define oUserObjectStruct      *(int*)0x8128AC8
#define oUserObjectStruct_      *(int*)0x8128AC4
#define oUserTextObject         *(int*)0x8128AC0 //ITEM.BMD
#define pGetMapName   ((char*(__cdecl*)(int MapNumber)) 0x5D2C10)

#define sub_405230               ((int(__cdecl*)(char a1)) 0x405230)
#define sub_4F9930               ((int(__cdecl*)(char *a1)) 0x4F9930)
#define sub_4F8B80               ((int(__cdecl*)(int a1)) 0x4F8B80)
#define sub_4E65A0               ((bool(__cdecl*)(signed int a1)) 0x4E65A0)
#define sub_4FA780               ((int(__thiscall*)(int This, int a2)) 0x4FA780)
#define sub_5013B0               ((char(__cdecl*)(int a1, int a2, int a3, int a4, int a5)) 0x5013B0)
#define sub_4EFF70               ((void(__cdecl*)(LPVOID This,int a1)) 0x4EFF70)
#define sub_96A4C0               ((int(__thiscall*)(LPVOID This, signed int a2)) 0x96A4C0)
#define sub_57FD90               ((void(__cdecl*)(int a1, BYTE * a2, int a3, int a4)) 0x57FD90)
#define sub_558630               ((void(__cdecl*)(int a1, int a2, int a3)) 0x558630)
#define SLODWORD(x)               (*((DWORD*)&(x)))
#define sub_771310               ((int(__cdecl*)(int a1, int a2, float a3, vec3_t a4, int a5, float a6, int a7)) 0x771310)
#define sub_771310_               ((int(__cdecl*)(int a1, vec3_t a2, float a3, vec3_t a4, int a5, float a6, int a7)) 0x771310)
#define sub_95A340               ((int(__cdecl*)(int a1, int a2, int a3)) 0x95A340)
#define sub_5440B0               ((int(__fastcall*)(int a1, int a2, int a3, float a4, float a5, __int16 a6, int a7, int a8, char a9, char a10)) 0x5440B0)
#define sub_922D50               ((signed int(__thiscall*)(int This, unsigned int a2)) 0x922D50);
#define sub_580BB0               ((int(__cdecl*)(DWORD, DWORD)) 0x580BB0)
#define sub_4CD7F0               ((int(__stdcall*)(DWORD,DWORD)) 0x4CD7F0)
#define pDrawMonsterEffect         ((char(__cdecl*)(int a1, int a2, int a3)) 0x8C7790)
#define sub_5D81B0               ((int(__cdecl*)(float, float)) 0x5D81B0)
#define sub_544E60               ((void(__thiscall*)(LPVOID This, vec3_t a2, int a3, signed int a4, int a5)) 0x544E60)
#define sub_9593B0               ((int(__stdcall*)(HDC This, LPCSTR lpMultiByteStr, int, LPSIZE psizl)) 0x9593B0)
#define pSetTextSize            ((int(__thiscall*)(LPVOID This, HFONT a2)) 0x420120)
#define pFontBold               *(DWORD*)0xE8C58C
#define sub_8CBA40               ((int(__cdecl*)(int, int, float, float, float, float, GLfloat *v)) 0x8CBA40) //Effect? 32141
#define sub_5DAD80               ((int(__cdecl*)(int, float, float, float, float, GLfloat *v, float, float, float, char)) 0x5DAD80) //effect ?32313
#define sub_56EFC0               ((int(__cdecl*)(int, int, float, int, float, float, float)) 0x56EFC0)
#define sub_4E65C0               ((bool(__cdecl*)(signed int MapNumber)) 0x4E65C0)
#define sub_89CB00               ((LPVOID(*)())0x89CB00)
#define sub_89CB90               ((int(__thiscall*)(LPVOID This)) 0x89CB90)
#define pPreviewPetThis            *(DWORD*)0x007BC4F04
#define LODWORD(h)                ((DWORD)(__int64(h) & __int64(0xffffffff)))
#define oNpcName            0x8119F68
#define pSendChatSay         ((int(__cdecl*)(char * Name, char * Text, int a1, int a4, int a5)) 0x5996A0)
#define pShowMonster         ((int(__cdecl*)(int MonsterID, int a2, int a3, int a4)) 0x580FC0)
#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, int a2, char a3, char a4, float a5)) 0x57EEC0)
#define pLoadMonsterID         ((int(__cdecl*)(signed int a1)) 0x61FDE0)
#define pMonsterAttribute      ((int(__cdecl*)(int ObjectPointer, signed int MonsterID)) 0x580BB0)
#define pNpcChat            ((char*(__cdecl*)(int a1, int a2)) 0x559540)
#define pLoadNpcModel         ((int(__cdecl*)(int a1)) 0x61E060)

GetmainInfo

CustomMonster.h

Citar
#pragma once
#define MAX_CUSTOM_MONSTER      250


struct CUSTOM_MONSTER_INFO
{
   int Index;
   WORD   ID;
   BYTE   Type;
   char   Name[25];
   char   Dir[50];
   char   Folder[50];
   char   BMDFile[50];
   float   Size;
};
class CCustomMonster
{
public:
   CCustomMonster();
   virtual ~CCustomMonster();
   void Init();
   void Load(char* path);
   void SetInfo(CUSTOM_MONSTER_INFO info);
public:
   CUSTOM_MONSTER_INFO m_CustomMonsterInfo[MAX_CUSTOM_MONSTER];
};
extern CCustomMonster gCustomMonster;

CustomMonster.cpp

Citar
#include "stdafx.h"
#include "CustomMonster.h"
#include "MemScript.h"

CCustomMonster gCustomMonster;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCustomMonster::CCustomMonster() // OK
{
   this->Init();
}

CCustomMonster::~CCustomMonster() // OK
{

}
void CCustomMonster::Init()
{
   for(int n=0;n < MAX_CUSTOM_MONSTER;n++)
   {
      this->m_CustomMonsterInfo[n].Index = -1;
   }
}
void CCustomMonster::Load(char* path) // OK
{
   CMemScript* lpMemScript = new CMemScript;

   if(lpMemScript == 0)
   {
      printf(MEM_SCRIPT_ALLOC_ERROR,path);
      return;
   }

   if(lpMemScript->SetBuffer(path) == 0)
   {
      printf(lpMemScript->GetLastError());
      delete lpMemScript;
      return;
   }

   this->Init();

   try
   {
      while(true)
      {
         if(lpMemScript->GetToken() == TOKEN_END)
         {
            break;
         }

         if(strcmp("end",lpMemScript->GetString()) == 0)
         {
            break;
         }

         CUSTOM_MONSTER_INFO info;

         memset(&info,0,sizeof(info));

         static int CustomMonsterIndexCount = 0;

         info.Index = CustomMonsterIndexCount++;

         info.ID = lpMemScript->GetNumber();

         info.Type = lpMemScript->GetAsNumber();

         strcpy_s(info.Name,lpMemScript->GetAsString());

         strcpy_s(info.Dir,lpMemScript->GetAsString());

         strcpy_s(info.Folder,lpMemScript->GetAsString());

         strcpy_s(info.BMDFile,lpMemScript->GetAsString());

         info.Size = lpMemScript->GetAsFloatNumber();

         this->SetInfo(info);
      }
   }
   catch(...)
   {
      printf(lpMemScript->GetLastError());
   }

   delete lpMemScript;
}
void CCustomMonster::SetInfo(CUSTOM_MONSTER_INFO info) // OK
{
   if(info.Index < 0 || info.Index >= MAX_CUSTOM_MONSTER)
   {
      return;
   }

   this->m_CustomMonsterInfo[info.Index] = info;
}

GetMainInfo.cpp

Citar
#include "CustomMonster.h"

CUSTOM_MONSTER_INFO CustomMonsterInfo[MAX_CUSTOM_MONSTER];

gCustomMonster.Load("CustomMonster.txt");

memcpy(info.CustomMonsterInfo,gCustomMonster.m_CustomMonsterInfo,sizeof(info.CustomMonsterInfo));


CustomMonster.txt

Citar
// ----------------------------------------------------------------------------------
// Type = 0: NPC
// Type = 1: Monster
// ----------------------------------------------------------------------------------
// MonsterID | Type    | Name       | Dir             | Folder       | BMDFile       | Size
// ----------------------------------------------------------------------------------
620      0   "Arthur2"   "Data\\Monster\\"           "Monster\\"            "CustomNpc03"      1.00
end
disculpen pero no se tiene que modificar también en el gameserver ?
o solo es suficiente con la modificación en parte del main?

Discord: JeanMois#3323

Offline axeman192 #5 Posteado: August 15, 2019, 09:23:20 PM

  • 3D Maker
  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 287
  • Gracias recibida: 11882
  • vn
Missing the source of GS?


Offline Lude #6 Posteado: August 15, 2019, 09:38:36 PM

  • MAESTRO

  • C++ Coder
  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 388
  • Gracias recibida: 19153
  • us
Para los que preguntan, no hace falta tocar nada en el GS.


Offline magtjr1 #7 Posteado: August 15, 2019, 10:05:37 PM | Modificado: August 15, 2019, 10:18:55 PM by magtjr1

  • 0 puntos por ventas
  • *
  • Rank: Principiante
  • Posts: 2
  • Gracias recibida: 2
  • br
Qual versão amigo?? s4, s6 ou s8?
Spoiler for Hiden:
Main source

CustomMonster.h

Citar
#pragma once

#include "Object.h"
#define MAX_CUSTOM_MONSTER      250
#define MONSTER_MODEL   644 //794?

struct CUSTOM_MONSTER_INFO
{
   int Index;
   WORD   ID;
   BYTE   Type;
   char   Name[25];
   char   Dir[50];
   char   Folder[50];
   char   BMDFile[50];
   float   Size;
};
class CCustomMonster
{
public:
   CCustomMonster();
   virtual ~CCustomMonster();
   void Init();
   void Load(CUSTOM_MONSTER_INFO* info);
   void SetInfo(CUSTOM_MONSTER_INFO info);
   CUSTOM_MONSTER_INFO* GetInfo(int index);
   CUSTOM_MONSTER_INFO* GetInfoByID(WORD ID);
   BOOL GetCustomMonsterInfo(WORD ID,BYTE Type,char* Name,char* Dir,char* Folder,char* BMDFile,float Size);

   public:
   CUSTOM_MONSTER_INFO m_CustomMonsterInfo[MAX_CUSTOM_MONSTER];

};
extern CCustomMonster gCustomMonster;

Monster.h

Citar
#pragma once


class Monster
{
public:
   Monster();
   virtual ~Monster();

   void         Load();
   static void      LoadMonsterBMD(signed int ModelID, char* a2, char* a3, signed int a4);
   static void      LoadMonsterTexture(signed int ModelID, char* a2, int a3, int a4);
   static int      ShowMonster(int MonsterID, int a2, int a3, int a4);
   static void      SetMainAttribute(int ObjectPointer, signed int MonsterID);
   static void      NPCChat(int a1, int a2);
   static int      LoadNpcModel(int a1);

};
extern Monster gMonster;

CustomMonster.cpp

Citar
#include "stdafx.h"
#include "CustomMonster.h"


CCustomMonster gCustomMonster;

CCustomMonster::CCustomMonster()
{
   this->Init();
}
CCustomMonster::~CCustomMonster()
{

}
void CCustomMonster::Init()
{
   for(int n=0;n < MAX_CUSTOM_MONSTER;n++)
   {
      this->m_CustomMonsterInfo[n].Index = -1;
   }
}
void CCustomMonster::Load(CUSTOM_MONSTER_INFO* info)
{
   for(int n=0;n < MAX_CUSTOM_MONSTER;n++)
   {
      this->SetInfo(info[n]);
   }
}
void CCustomMonster::SetInfo(CUSTOM_MONSTER_INFO info)
{
   if(info.Index < 0 || info.Index >= MAX_CUSTOM_MONSTER)
   {
      return;
   }

   this->m_CustomMonsterInfo[info.Index] = info;
}
CUSTOM_MONSTER_INFO* CCustomMonster::GetInfo(int index)
{
   if(index < 0 || index >= MAX_CUSTOM_MONSTER)
   {
      return 0;
   }

   if(this->m_CustomMonsterInfo[index].Index != index)
   {
      return 0;
   }

   return &this->m_CustomMonsterInfo[index];
}
CUSTOM_MONSTER_INFO* CCustomMonster::GetInfoByID(WORD ID)
{
   for(int n=0;n < MAX_CUSTOM_MONSTER;n++)
   {
      CUSTOM_MONSTER_INFO* lpInfo = this->GetInfo(n);

      if(lpInfo == 0)
      {
         continue;
      }

      if(lpInfo->ID == ID)
      {
         return lpInfo;
      }
   }

   return 0;
}
BOOL CCustomMonster::GetCustomMonsterInfo(WORD ID,BYTE Type,char* Name,char* Dir,char* Folder,char* BMDFile,float Size)
{
   CUSTOM_MONSTER_INFO* lpInfo = this->GetInfoByID(ID);
   if(lpInfo == 0)
   {
      return 0;
   }
   Type = (BYTE)(lpInfo->Type);
   Name = (lpInfo->Name);
   Dir = (lpInfo->Dir);
   Folder = (lpInfo->Folder);
   BMDFile = (lpInfo->BMDFile);
   Size = (float)(lpInfo->Size);

   return 1;
}

Monster.cpp

Citar
#include "stdafx.h"
#include "Monster.h"
#include "CustomMonster.h"
#include "TMemory.h"
#include "Import.h"
#include "Defines.h"
Monster gMonster;

Monster::Monster() //ok
{

}

Monster::~Monster() //ok
{

}

#define pGetViewStruct         ((lpViewObj(__cdecl*)(int a1, signed int a2, unsigned __int8 a3, unsigned __int8 a4, float a5)) 0x57EEC0)
#define   pOpenMonsterModel      ((void(__cdecl*)(int MonsterID)) 0x61FDE0)

void Monster::Load()
{
   SetOp((LPVOID)0x0061FE3F, (LPVOID)Monster::LoadMonsterBMD, ASM::CALL);
   SetOp((LPVOID)0x0061FEEA, (LPVOID)Monster::LoadMonsterTexture, ASM::CALL);

   SetOp((LPVOID)0x004E199D, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00587049, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00587049, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00590CCC, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x005BBEE6, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x0064229D, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00642D51, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00643229, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x0065EA86, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00911A53, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00911A6D, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00911A87, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00911AA1, (LPVOID)Monster::ShowMonster, ASM::CALL);
   SetOp((LPVOID)0x00911ABB, (LPVOID)Monster::ShowMonster, ASM::CALL);

   SetOp((LPVOID)0x0058101A, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058105B, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058109C, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005810DD, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058111E, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058115F, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005811A0, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005811E1, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x00581222, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x00581263, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005812A8, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005812ED, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058132E, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x0058136F, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005813B4, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x005813F9, (LPVOID)Monster::SetMainAttribute, ASM::CALL);
   SetOp((LPVOID)0x00586859, (LPVOID)Monster::SetMainAttribute, ASM::CALL);

   SetOp((LPVOID)0x0055A2DD, (LPVOID)Monster::NPCChat, ASM::CALL);

   SetByte((PVOID)(0x00559B82 + 3), 0xFF); //Limit kill
   SetByte((PVOID)(0x00559B82 + 4), 0xFF); //Limit kill
}

void Monster::LoadMonsterBMD(signed int ModelID, char* a2, char* a3, signed int a4)
{
   int MonsterID = ModelID - MONSTER_MODEL;

   for (int n = 0; n < MAX_CUSTOM_MONSTER; n++)
   {
      if (MonsterID == gCustomMonster.m_CustomMonsterInfo[n].ID)
      {
         pLoadMonsterBMD(ModelID, gCustomMonster.m_CustomMonsterInfo[n].Dir, gCustomMonster.m_CustomMonsterInfo[n].BMDFile, -1);
         return;
      }
   }

   pLoadMonsterBMD(ModelID, a2, a3, a4);
}

void Monster::LoadMonsterTexture(signed int ModelID, char* a2, int a3, int a4)
{
   int MonsterID = ModelID - MONSTER_MODEL;

   for (int n = 0; n < MAX_CUSTOM_MONSTER; n++)
   {
      if (MonsterID == gCustomMonster.m_CustomMonsterInfo[n].ID)
      {
         pLoadMonsterTexture(ModelID, gCustomMonster.m_CustomMonsterInfo[n].Folder, a3, a4);
         return;
      }
   }

   pLoadMonsterTexture(ModelID, a2, a3, a4);
}

int Monster::LoadNpcModel(int a1)
{
   pLoadNpcModel(a1);

   int result = sub_969C50(sub_4CDA10, a1);
   if (result && *(signed __int16 *)(result + 38) <= 0)
   {
      switch (a1)
      {
      case 1162:
         pLoadModel(1162, "Data\\Npc\\", "jinn", -1);
         pLoadTexture(1162, "Npc\\", 10497, 9728, 0);
         break;
      }
   }

   return result;
}

int Monster::ShowMonster(int MonsterID, int a2, int a3, int a4)
{
   for (int n = 0; n < MAX_CUSTOM_MONSTER; n++)
   {
      if (MonsterID == gCustomMonster.m_CustomMonsterInfo[n].ID)
      {
         pLoadMonsterID(MonsterID);

         DWORD ObjectStruct = pViewObject(a4, MonsterID + MONSTER_MODEL, a2, a3, 0.0); //665?

         lpViewObj Object = &*(ObjectPreview*)ObjectStruct;

         //memcpy(Object->Name, gCustomMonster.m_CustomMonsterInfo[n].Name, sizeof(Object->Name));
         strcpy((char *)(ObjectStruct + 56), gCustomMonster.m_CustomMonsterInfo[n].Name);
         //wsprintf(Object->Name, gCustomMonster.m_CustomMonsterInfo[n].Name);

         if (gCustomMonster.m_CustomMonsterInfo[n].Type == 4)
         {
            *(BYTE*)(ObjectStruct + 800) = emNPC;
         }
         else
         {
            *(BYTE*)(ObjectStruct + 800) = emMonster;
         }

         *(float *)(ObjectStruct + 872) = gCustomMonster.m_CustomMonsterInfo[n].Size;

         //Object->ID = MonsterID;
         //*(BYTE*)(ObjectStruct + 798) = 0;
         //Object->Unknown128 = *(WORD*)0x879343C;
         //sub_580BB0(ObjectStruct, MonsterID);
         //Monster::SetMainAttribute(ObjectStruct, MonsterID);
         //return sub_580BB0(ObjectStruct, MonsterID);

         sub_580BB0(ObjectStruct, MonsterID);
         return ObjectStruct;
      }
   }

   return pShowMonster(MonsterID, a2, a3, a4);
}

void Monster::SetMainAttribute(int ObjectPointer, signed int MonsterID)
{
   lpViewObj Object = &*(ObjectPreview*)(ObjectPointer);

   if (ObjectPointer)
   {
      switch (MonsterID)
      {
      case 229:
         *(short*)(ObjectPointer + 268) = ITEM2(7, 9);
         *(BYTE*)(ObjectPointer + 270) = 0;
         *(BYTE*)(ObjectPointer + 271) = 1;
         *(short*)(ObjectPointer + 304) = ITEM2(8, 9);
         *(BYTE*)(ObjectPointer + 306) = 0;
         *(BYTE*)(ObjectPointer + 307) = 1;
         *(short*)(ObjectPointer + 340) = ITEM2(9, 9);
         *(BYTE*)(ObjectPointer + 342) = 0;
         *(BYTE*)(ObjectPointer + 343) = 1;
         *(short*)(ObjectPointer + 376) = ITEM2(10, 9);
         *(BYTE*)(ObjectPointer + 378) = 0;
         *(BYTE*)(ObjectPointer + 379) = 1;
         *(short*)(ObjectPointer + 412) = ITEM2(11, 9);
         *(BYTE*)(ObjectPointer + 414) = 0;
         *(BYTE*)(ObjectPointer + 415) = 1;
         *(short*)(ObjectPointer + 448) = ITEM2(3,7);
         *(BYTE*)(ObjectPointer + 450) = 0;
         *(BYTE*)(ObjectPointer + 451) = 1;
         *(DWORD *)(ObjectPointer + 1300) = 1;
         break;
      case 247:
      case 249:
         *(short*)(ObjectPointer + 268) = ITEM2(7, 9);
         *(BYTE*)(ObjectPointer + 270) = 0;
         *(BYTE*)(ObjectPointer + 271) = 1;
         *(short*)(ObjectPointer + 304) = ITEM2(8, 9);
         *(BYTE*)(ObjectPointer + 306) = 0;
         *(BYTE*)(ObjectPointer + 307) = 1;
         *(short*)(ObjectPointer + 340) = ITEM2(9, 9);
         *(BYTE*)(ObjectPointer + 342) = 0;
         *(BYTE*)(ObjectPointer + 343) = 1;
         *(short*)(ObjectPointer + 376) = ITEM2(10, 9);
         *(BYTE*)(ObjectPointer + 378) = 0;
         *(BYTE*)(ObjectPointer + 379) = 1;
         *(short*)(ObjectPointer + 412) = ITEM2(11, 9);
         *(BYTE*)(ObjectPointer + 414) = 0;
         *(BYTE*)(ObjectPointer + 415) = 1;
         if (MonsterID == 247)
         {
            *(short*)(ObjectPointer + 448) = ITEM2(4,11);
         }
         else if (MonsterID == 249)
         {
            *(short*)(ObjectPointer + 448) = ITEM2(3,7);
         }
         *(BYTE*)(ObjectPointer + 450) = 0;
         *(BYTE*)(ObjectPointer + 451) = 1;
         *(DWORD *)(ObjectPointer + 1300) = 1;
         break;
      case 58:
         *(short*)(ObjectPointer + 448) = ITEM2(0, 28);
         *(BYTE*)(ObjectPointer + 450) = 0;
         *(BYTE*)(ObjectPointer + 451) = 0;
         break;
      }
      //if ( MonsterID == 451 )
      //  *(BYTE*)(ObjectPointer + 800) = -128;
   }

   pMonsterAttribute(ObjectPointer, MonsterID);
}

void Monster::NPCChat(int a1, int a2)
{
   //switch (*(WORD *)(a1 + 132))
   //{
   //case 651: //651+794: //794???
   //   pSendChatSay((char *)(a1 + 56), "I Wish You !", a1, 0, -1);
   //   break;
   //}

   pNpcChat(a1, a2);
}

Main.cpp

Citar
#include "Monster.h"
#include "CustomMonster.h"

gCustomMonster.Load(gProtect.m_MainInfo.CustomMonsterInfo);

gMonster.Load();


Protect.h
Citar
#include "CustomMonster.h"

CUSTOM_MONSTER_INFO CustomMonsterInfo[MAX_CUSTOM_MONSTER];

Import.h

Citar
//-> Monster
#define pMaybeDrawPetHP            ((char(__stdcall*)(int a1, int a2)) 0x7DFDB0)
#define sub_50D100               ((size_t(__cdecl*)(char * a1, char * a2, ...)) 0x50D100)
#define   sub_7DFA60               ((int(__stdcall*)(signed int PosX, signed int PosY, int a3, signed int a4, signed int a5, char a6)) 0x7DFA60)
#define sub_501790               ((char(__cdecl*)(int a1, char a2)) 0x501790)
#define sub_540C30               ((int(__cdecl*)(float, float, float, float)) 0x540C30)
#define sub_540EA0               ((int(__cdecl*)(float, float a2, float)) 0x540EA0)
#define sub_959CE0               ((int(__cdecl*)(DWORD, DWORD)) 0x959CE0)
#define sub_95A1E0               ((int(__cdecl*)(DWORD a1, DWORD a2, float *a3)) 0x95A1E0)
#define sub_541460               ((void(__cdecl*)(int a1)) 0x541460)
#define sub_4CDA10               ((LPVOID(*)())0x4CDA10)
#define sub_969C50               ((int(__thiscall*)(LPVOID This, signed int a2)) 0x969C50)
#define sub_5D6700               ((int(__cdecl*)(unsigned __int8 a1, unsigned __int8 a2)) 0x5D6700)
#define sub_5422E0               ((bool(__cdecl*)(__int16 a1)) 0x5422E0)
#define sub_542310               ((__int16(__cdecl*)(int a1, int a2, char a3)) 0x542310)
#define sub_545030               ((int(__thiscall*)(LPVOID This, int a2, DWORD *a3, DWORD *BMD, char a5)) 0x545030)
#define sub_6D9070               ((void(__cdecl*)(int a1, int a2, int a3, float * a4, int a5, int a6, __int16 a7, __int16 a8, __int16 a9, __int16 a10, float a11, __int16 a12)) 0x6D9070)
#define sub_74CD30               ((int(__cdecl*)(int a1, int a2, int a3, vec3_t a4, int a5, float a6, int a7)) 0x74CD30)
#define sub_74CD30_               ((int(__cdecl*)(DWORD a1, vec3_t a2, int a3, vec3_t a4, int a5, float a6, int a7)) 0x74CD30)
#define sub_4DB1C0               ((bool(__cdecl*)(signed int a1))0x4DB1C0)
#define sub_4C8640               ((bool(__thiscall*)(void * This,char a2)) 0x4C8640)
#define sub_4DB250               ((int(__cdecl*)()) 0x4DB250)
#define sub_4E44A0               ((bool(__thiscall*)(int This)) 0x4E44A0)
#define sub_7293F0               ((char*(__cdecl*)(int a1, int a2, int a3, int a4, int a5, char a6, int a7)) 0x7293F0)
#define sub_5039A0               ((void(__cdecl*)(int a1, int a2)) 0x5039A0)
#define sub_72D1B0               ((void(__cdecl*)(int a1, int a2, int a3, int a4, int a5, int a6, float a7, __int16 a8, __int16 a9, char a10, int a11, int a12, __int16 a13)) 0x72D1B0)
#define sub_542280               ((bool(__cdecl*)(__int16 a1)) 0x542280)
#define sub_545180               ((char(__thiscall*)(void * This, int a2, int a3, int a4, float a5, int a6, int a7)) 0x545180)
#define sub_5CA0D0               ((void(__cdecl*)( int a1,  int a2, int a3, int a4, int a5, int a6, char a7)) 0x5CA0D0)
#define sub_9250E0               ((int(__thiscall*)(LPVOID This, int a1, int a2, int a3, int a4, int a5, int a6)) 0x9250E0)
#define sub_4DB230               ((LPVOID(*)())0x4DB230)
#define sub_501700               ((DWORD(__cdecl*)(DWORD, DWORD, DWORD, DWORD, DWORD)) 0x501700)
#define sub_57D9A0               ((DWORD(__cdecl*)(DWORD)) 0x57D9A0)
#define sub_58AA80               ((DWORD(__cdecl*)(DWORD)) 0x58AA80)
#define sub_4E6670               ((DWORD(__cdecl*)(DWORD)) 0x4E6670)
#define sub_57F020               ((DWORD(__cdecl*)(DWORD)) 0x57F020)

#define sub_4F8C30               ((DWORD(__cdecl*)(DWORD)) 0x4F8C30)
#define sub_534B40               ((DWORD(__cdecl*)(DWORD)) 0x534B40)
#define sub_5012D0               ((DWORD(__cdecl*)(DWORD)) 0x5012D0)
#define sub_9253D0               ((int(__thiscall*)(LPVOID This,int a1, short a2)) 0x9253D0)
#define sub_4F94A0               ((DWORD(__cdecl*)(DWORD)) 0x4F94A0)
#define sub_57FC30               ((int(__cdecl*)(BYTE CharSet)) 0x57FC30)
#define sub_587500               ((DWORD(__cdecl*)(char)) 0x587500)
#define sub_402BC0               ((LPVOID(*)())0x402BC0)

#define pGetTextLine         ((char*(__thiscall*)(LPVOID This, int LineNumber)) 0x402320)
#define pGetTextLineint         ((int(__thiscall*)(LPVOID This, int LineNumber)) 0x402320)
#define pGetTextLine_         ((char*(__thiscall*)(LPVOID This, int LineNumber)) 0x402320)
#define pMapName            ((char*(__cdecl*)(signed int mapNumber)) 0x5D2C10)

#define pGetPreviewStruct      ((DWORD(__thiscall*)(LPVOID This, int ViewportID)) 0x0096A4C0)
#define pPreviewCharSet         ((void(__cdecl*)(int ObjectIndex, BYTE * CharSet, lpViewObj Object, int Mode)) 0x57FD90)
#define oUserPreviewStruct      *(int*)0x7BC4F04
#define oUserObjectStruct      *(int*)0x8128AC8
#define oUserObjectStruct_      *(int*)0x8128AC4
#define oUserTextObject         *(int*)0x8128AC0 //ITEM.BMD
#define pGetMapName   ((char*(__cdecl*)(int MapNumber)) 0x5D2C10)

#define sub_405230               ((int(__cdecl*)(char a1)) 0x405230)
#define sub_4F9930               ((int(__cdecl*)(char *a1)) 0x4F9930)
#define sub_4F8B80               ((int(__cdecl*)(int a1)) 0x4F8B80)
#define sub_4E65A0               ((bool(__cdecl*)(signed int a1)) 0x4E65A0)
#define sub_4FA780               ((int(__thiscall*)(int This, int a2)) 0x4FA780)
#define sub_5013B0               ((char(__cdecl*)(int a1, int a2, int a3, int a4, int a5)) 0x5013B0)
#define sub_4EFF70               ((void(__cdecl*)(LPVOID This,int a1)) 0x4EFF70)
#define sub_96A4C0               ((int(__thiscall*)(LPVOID This, signed int a2)) 0x96A4C0)
#define sub_57FD90               ((void(__cdecl*)(int a1, BYTE * a2, int a3, int a4)) 0x57FD90)
#define sub_558630               ((void(__cdecl*)(int a1, int a2, int a3)) 0x558630)
#define SLODWORD(x)               (*((DWORD*)&(x)))
#define sub_771310               ((int(__cdecl*)(int a1, int a2, float a3, vec3_t a4, int a5, float a6, int a7)) 0x771310)
#define sub_771310_               ((int(__cdecl*)(int a1, vec3_t a2, float a3, vec3_t a4, int a5, float a6, int a7)) 0x771310)
#define sub_95A340               ((int(__cdecl*)(int a1, int a2, int a3)) 0x95A340)
#define sub_5440B0               ((int(__fastcall*)(int a1, int a2, int a3, float a4, float a5, __int16 a6, int a7, int a8, char a9, char a10)) 0x5440B0)
#define sub_922D50               ((signed int(__thiscall*)(int This, unsigned int a2)) 0x922D50);
#define sub_580BB0               ((int(__cdecl*)(DWORD, DWORD)) 0x580BB0)
#define sub_4CD7F0               ((int(__stdcall*)(DWORD,DWORD)) 0x4CD7F0)
#define pDrawMonsterEffect         ((char(__cdecl*)(int a1, int a2, int a3)) 0x8C7790)
#define sub_5D81B0               ((int(__cdecl*)(float, float)) 0x5D81B0)
#define sub_544E60               ((void(__thiscall*)(LPVOID This, vec3_t a2, int a3, signed int a4, int a5)) 0x544E60)
#define sub_9593B0               ((int(__stdcall*)(HDC This, LPCSTR lpMultiByteStr, int, LPSIZE psizl)) 0x9593B0)
#define pSetTextSize            ((int(__thiscall*)(LPVOID This, HFONT a2)) 0x420120)
#define pFontBold               *(DWORD*)0xE8C58C
#define sub_8CBA40               ((int(__cdecl*)(int, int, float, float, float, float, GLfloat *v)) 0x8CBA40) //Effect? 32141
#define sub_5DAD80               ((int(__cdecl*)(int, float, float, float, float, GLfloat *v, float, float, float, char)) 0x5DAD80) //effect ?32313
#define sub_56EFC0               ((int(__cdecl*)(int, int, float, int, float, float, float)) 0x56EFC0)
#define sub_4E65C0               ((bool(__cdecl*)(signed int MapNumber)) 0x4E65C0)
#define sub_89CB00               ((LPVOID(*)())0x89CB00)
#define sub_89CB90               ((int(__thiscall*)(LPVOID This)) 0x89CB90)
#define pPreviewPetThis            *(DWORD*)0x007BC4F04
#define LODWORD(h)                ((DWORD)(__int64(h) & __int64(0xffffffff)))
#define oNpcName            0x8119F68
#define pSendChatSay         ((int(__cdecl*)(char * Name, char * Text, int a1, int a4, int a5)) 0x5996A0)
#define pShowMonster         ((int(__cdecl*)(int MonsterID, int a2, int a3, int a4)) 0x580FC0)
#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, int a2, char a3, char a4, float a5)) 0x57EEC0)
#define pLoadMonsterID         ((int(__cdecl*)(signed int a1)) 0x61FDE0)
#define pMonsterAttribute      ((int(__cdecl*)(int ObjectPointer, signed int MonsterID)) 0x580BB0)
#define pNpcChat            ((char*(__cdecl*)(int a1, int a2)) 0x559540)
#define pLoadNpcModel         ((int(__cdecl*)(int a1)) 0x61E060)

GetmainInfo

CustomMonster.h

Citar
#pragma once
#define MAX_CUSTOM_MONSTER      250


struct CUSTOM_MONSTER_INFO
{
   int Index;
   WORD   ID;
   BYTE   Type;
   char   Name[25];
   char   Dir[50];
   char   Folder[50];
   char   BMDFile[50];
   float   Size;
};
class CCustomMonster
{
public:
   CCustomMonster();
   virtual ~CCustomMonster();
   void Init();
   void Load(char* path);
   void SetInfo(CUSTOM_MONSTER_INFO info);
public:
   CUSTOM_MONSTER_INFO m_CustomMonsterInfo[MAX_CUSTOM_MONSTER];
};
extern CCustomMonster gCustomMonster;

CustomMonster.cpp

Citar
#include "stdafx.h"
#include "CustomMonster.h"
#include "MemScript.h"

CCustomMonster gCustomMonster;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CCustomMonster::CCustomMonster() // OK
{
   this->Init();
}

CCustomMonster::~CCustomMonster() // OK
{

}
void CCustomMonster::Init()
{
   for(int n=0;n < MAX_CUSTOM_MONSTER;n++)
   {
      this->m_CustomMonsterInfo[n].Index = -1;
   }
}
void CCustomMonster::Load(char* path) // OK
{
   CMemScript* lpMemScript = new CMemScript;

   if(lpMemScript == 0)
   {
      printf(MEM_SCRIPT_ALLOC_ERROR,path);
      return;
   }

   if(lpMemScript->SetBuffer(path) == 0)
   {
      printf(lpMemScript->GetLastError());
      delete lpMemScript;
      return;
   }

   this->Init();

   try
   {
      while(true)
      {
         if(lpMemScript->GetToken() == TOKEN_END)
         {
            break;
         }

         if(strcmp("end",lpMemScript->GetString()) == 0)
         {
            break;
         }

         CUSTOM_MONSTER_INFO info;

         memset(&info,0,sizeof(info));

         static int CustomMonsterIndexCount = 0;

         info.Index = CustomMonsterIndexCount++;

         info.ID = lpMemScript->GetNumber();

         info.Type = lpMemScript->GetAsNumber();

         strcpy_s(info.Name,lpMemScript->GetAsString());

         strcpy_s(info.Dir,lpMemScript->GetAsString());

         strcpy_s(info.Folder,lpMemScript->GetAsString());

         strcpy_s(info.BMDFile,lpMemScript->GetAsString());

         info.Size = lpMemScript->GetAsFloatNumber();

         this->SetInfo(info);
      }
   }
   catch(...)
   {
      printf(lpMemScript->GetLastError());
   }

   delete lpMemScript;
}
void CCustomMonster::SetInfo(CUSTOM_MONSTER_INFO info) // OK
{
   if(info.Index < 0 || info.Index >= MAX_CUSTOM_MONSTER)
   {
      return;
   }

   this->m_CustomMonsterInfo[info.Index] = info;
}

GetMainInfo.cpp

Citar
#include "CustomMonster.h"

CUSTOM_MONSTER_INFO CustomMonsterInfo[MAX_CUSTOM_MONSTER];

gCustomMonster.Load("CustomMonster.txt");

memcpy(info.CustomMonsterInfo,gCustomMonster.m_CustomMonsterInfo,sizeof(info.CustomMonsterInfo));


CustomMonster.txt

Citar
// ----------------------------------------------------------------------------------
// Type = 0: NPC
// Type = 1: Monster
// ----------------------------------------------------------------------------------
// MonsterID | Type    | Name       | Dir             | Folder       | BMDFile       | Size
// ----------------------------------------------------------------------------------
620      0   "Arthur2"   "Data\\Monster\\"           "Monster\\"            "CustomNpc03"      1.00
end

Gracias:


Offline PhantomKr #8 Posteado: August 15, 2019, 10:14:05 PM

  • 0 puntos por ventas
  • *
  • Rank: Heroe
  • Posts: 170
  • Gracias recibida: 1218
  • pe
Para los que preguntan, no hace falta tocar nada en el GS.
entonces para agregar un moustro en el server solo se agrega en el mouster.txt?

Discord: JeanMois#3323

Offline axeman192 #9 Posteado: August 15, 2019, 10:33:07 PM

  • 3D Maker
  • 0 puntos por ventas
  • *
  • Rank: Puto amo
  • Posts: 287
  • Gracias recibida: 11882
  • vn
I can't load the image monster.


Offline magtjr1 #10 Posteado: August 16, 2019, 09:21:01 AM

  • 0 puntos por ventas
  • *
  • Rank: Principiante
  • Posts: 2
  • Gracias recibida: 2
  • br
Could you pass the s8 offsets you are using? and from
sub_969C50
sub_4CDA10
sub_580BB0
pLoadTexture
pLoadModel
Spoiler for Hiden:


Solo usuarios registrados pueden comentar y agradecer, Logueate o Registrate


 

Related Topics

  Subject / Started by Replies Last post
1 Replies
1139 Views
Last post June 19, 2019, 02:31:47 AM
by kai1702
1 Replies
938 Views
Last post April 02, 2020, 04:19:57 PM
by Fragata
0 Replies
374 Views
Last post April 09, 2020, 01:16:48 PM
by zmadblack
6 Replies
1179 Views
Last post October 29, 2020, 09:38:34 AM
by LTP Team
15 Replies
2217 Views
Last post November 27, 2023, 02:03:12 PM
by KropaPL