Map.h:
Código:
#pragma once
namespace Network
{
struct PMSG_ATTACK
{
PBMSG_HEAD h;
BYTE NumberH;
BYTE NumberL;
BYTE AttackAction;
BYTE DirDis;
};
struct AttackStruct
{
unsigned char Map;
};
struct LevelUpStruct
{
unsigned char Map;
};
struct MapStruct
{
AttackStruct Attack;
LevelUpStruct LevelUp;
};
class Map
{
public:
static bool Init();
static void Attack(PMSG_ATTACK* lpMsg, DWORD dwIndex);
static bool LevelUp(OBJECTSTRUCT* lpObject, int AddExp, int MonsterType, int EventType);
static int MonsterExp(OBJECTSTRUCT* lpObject, OBJECTSTRUCT* lpTarget, int Damage, int TotalDamage, bool& SendExp);
public:
static MapStruct Struct[17];
};
}
Map.cpp:
Código:
#include "Map.h"
namespace Network
{
MapStruct Map::Struct[17];
bool Map::Init()
{
Tokenizer _map(".\\Network\\Map.ut");
if(_map.Loaded)
{
if(!_map.SectionExists(0) || !_map.SectionExists(1))
{
return false;
}
else
{
for(BYTE i = 0; i < 17; i++)
{
if(i > 10)
{
Struct[i].Attack.Map = (BYTE)_map[0][0][11].ToInteger();
Struct[i].LevelUp.Map = (BYTE)_map[1][0][11].ToInteger();
}
else
{
Struct[i].Attack.Map = (BYTE)_map[0][0][i].ToInteger();
Struct[i].LevelUp.Map = (BYTE)_map[1][0][i].ToInteger();
}
}
return true;
}
}
return false;
}
void Map::Attack(PMSG_ATTACK* lpMsg, DWORD dwIndex)
{
BYTE szMap = (BYTE)Object[dwIndex].Map;
if(Struct[szMap].Attack.Map == 0)
{
return;
}
ServerObjAttack(lpMsg, dwIndex);
}
bool Map::LevelUp(OBJECTSTRUCT* lpObject, int AddExp, int MonsterType, int EventType)
{
BYTE szMap = (BYTE)lpObject->Map;
if(Struct[szMap].LevelUp.Map == 0)
{
return false;
}
return ServerLevelUp(lpObject, AddExp, MonsterType, EventType);
}
int Map::MonsterExp(OBJECTSTRUCT* lpObject, OBJECTSTRUCT* lpTarget, int Damage, int TotalDamage, bool& SendExp)
{
BYTE szMap = (BYTE)lpObject->Map;
if(Struct[szMap].LevelUp.Map == 0)
{
return 0;
}
return ServerMonsterExp(lpObject, lpTarget, Damage, TotalDamage, SendExp);
}
}
Hook:
Código:
Hook((DWORD)&Network::Map::Attack, 0x4014E2);
Hook((DWORD)&Network::Map::LevelUp, 0x401771);
Hook((DWORD)&Network::Map::MonsterExp, 0x402022);
Defines:
Código:
#define ServerObjAttack ((void(*)(Network::PMSG_ATTACK*, DWORD)) 0x4254D0)
#define ServerLevelUp ((bool(*)(Network::OBJECTSTRUCT*, int, int, int)) 0x462A20)
#define ServerMonsterExp ((int(*)(Network::OBJECTSTRUCT*, Network::OBJECTSTRUCT*, int, int, bool&)) 0x467970)
Feito para 97d.
Créditos:
Network.