Add project files.
This commit is contained in:
21
L2BotDll/Versions/Interlude/GameStructs/FName.cpp
Normal file
21
L2BotDll/Versions/Interlude/GameStructs/FName.cpp
Normal file
@ -0,0 +1,21 @@
|
||||
#include "pch.h"
|
||||
#include "FName.h"
|
||||
|
||||
namespace Interlude
|
||||
{
|
||||
FNameEntry* (__cdecl* FName::__GetEntry)(int) = 0;
|
||||
|
||||
//todo exception(?)
|
||||
FNameEntry* FName::GetEntry(int index) const
|
||||
{
|
||||
if (__GetEntry) {
|
||||
return(*__GetEntry)(index);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void FName::Init(HMODULE hModule)
|
||||
{
|
||||
(FARPROC&)__GetEntry = GetProcAddress(hModule, "?GetEntry@FName@@SAPAUFNameEntry@@H@Z");
|
||||
}
|
||||
}
|
21
L2BotDll/Versions/Interlude/GameStructs/FName.h
Normal file
21
L2BotDll/Versions/Interlude/GameStructs/FName.h
Normal file
@ -0,0 +1,21 @@
|
||||
#pragma once
|
||||
|
||||
#include "pch.h"
|
||||
#include "GameStructs.h"
|
||||
#include "../../GameStructs/FNameInterface.h"
|
||||
|
||||
namespace Interlude
|
||||
{
|
||||
class FName : public FNameInterface
|
||||
{
|
||||
public:
|
||||
FName() = default;
|
||||
virtual ~FName() = default;
|
||||
|
||||
FNameEntry* GetEntry(int index) const;
|
||||
void Init(HMODULE hModule) override;
|
||||
private:
|
||||
static FNameEntry* (__cdecl* __GetEntry)(int);
|
||||
};
|
||||
|
||||
}
|
@ -0,0 +1,88 @@
|
||||
#include "pch.h"
|
||||
#include "../../../Common/apihook.h"
|
||||
#include "GameEngineWrapper.h"
|
||||
#include "ProcessManipulation.h"
|
||||
#include "../../../Events/SkillCreatedEvent.h"
|
||||
#include "../../../Events/SkillUsedEvent.h"
|
||||
#include "../../../Events/SkillCancelledEvent.h"
|
||||
#include "../../../Events/AbnormalEffectChangedEvent.h"
|
||||
#include "../../../Events/EventDispatcher.h"
|
||||
|
||||
namespace Interlude
|
||||
{
|
||||
void* GameEngineWrapper::originalInitAddress = 0;
|
||||
GameEngineWrapper::GameEngine* GameEngineWrapper::_target = 0;
|
||||
|
||||
void(__thiscall* GameEngineWrapper::__Init)(GameEngine*, float_t) = 0;
|
||||
void(__thiscall* GameEngineWrapper::__OnSkillListPacket)(GameEngine*, L2ParamStack&) = 0;
|
||||
int(__thiscall* GameEngineWrapper::__OnReceiveMagicSkillUse)(GameEngine*, User*, User*, L2ParamStack&) = 0;
|
||||
void(__thiscall* GameEngineWrapper::__OnReceiveMagicSkillCanceled)(GameEngine*, User*) = 0;
|
||||
void(__thiscall* GameEngineWrapper::__AddAbnormalStatus)(GameEngine*, L2ParamStack&) = 0;
|
||||
|
||||
|
||||
void GameEngineWrapper::Init(HMODULE hModule)
|
||||
{
|
||||
void* initAddress = GetProcAddress(hModule, "?Tick@UGameEngine@@UAEXM@Z");
|
||||
originalInitAddress = splice(initAddress, __Init_hook);
|
||||
(FARPROC&)__Init = (FARPROC)initAddress;
|
||||
|
||||
(FARPROC&)__OnSkillListPacket = (FARPROC)splice(
|
||||
GetProcAddress(hModule, "?OnSkillListPacket@UGameEngine@@UAEXAAVL2ParamStack@@@Z"), __OnSkillListPacket_hook
|
||||
);
|
||||
(FARPROC&)__OnReceiveMagicSkillUse = (FARPROC)splice(
|
||||
GetProcAddress(hModule, "?OnReceiveMagicSkillUse@UGameEngine@@UAEXPAUUser@@0AAVL2ParamStack@@@Z"), __OnReceiveMagicSkillUse_hook
|
||||
);
|
||||
(FARPROC&)__OnReceiveMagicSkillCanceled = (FARPROC)splice(
|
||||
GetProcAddress(hModule, "?OnReceiveMagicSkillCanceled@UGameEngine@@UAEXPAUUser@@@Z"), __OnReceiveMagicSkillCanceled_hook
|
||||
);
|
||||
(FARPROC&)__AddAbnormalStatus = (FARPROC)splice(
|
||||
GetProcAddress(hModule, "?AddAbnormalStatus@UGameEngine@@UAEXAAVL2ParamStack@@@Z"), __AddAbnormalStatus_hook
|
||||
);
|
||||
}
|
||||
|
||||
void GameEngineWrapper::Restore()
|
||||
{
|
||||
restore(originalInitAddress);
|
||||
restore((void*&)__OnSkillListPacket);
|
||||
restore((void*&)__OnReceiveMagicSkillUse);
|
||||
restore((void*&)__OnReceiveMagicSkillCanceled);
|
||||
restore((void*&)__AddAbnormalStatus);
|
||||
}
|
||||
|
||||
void __fastcall GameEngineWrapper::__Init_hook(GameEngine* This, uint32_t /*edx*/, float_t unk)
|
||||
{
|
||||
if (_target == 0) {
|
||||
_target = This;
|
||||
|
||||
InjectLibrary::StopCurrentProcess();
|
||||
restore(originalInitAddress);
|
||||
InjectLibrary::StartCurrentProcess();
|
||||
|
||||
(*__Init)(This, unk);
|
||||
}
|
||||
}
|
||||
|
||||
void __fastcall GameEngineWrapper::__OnSkillListPacket_hook(GameEngine* This, uint32_t, L2ParamStack& stack)
|
||||
{
|
||||
EventDispatcher::GetInstance().Dispatch(SkillCreatedEvent{stack.GetBufferAsVector<int32_t>()});
|
||||
(*__OnSkillListPacket)(This, stack);
|
||||
}
|
||||
|
||||
int __fastcall GameEngineWrapper::__OnReceiveMagicSkillUse_hook(GameEngine* This, uint32_t, User* u1, User* u2, L2ParamStack& stack)
|
||||
{
|
||||
EventDispatcher::GetInstance().Dispatch(SkillUsedEvent{ stack.GetBufferAsVector<int32_t>() });
|
||||
return (*__OnReceiveMagicSkillUse)(This, u1, u2, stack);
|
||||
}
|
||||
|
||||
void __fastcall GameEngineWrapper::__OnReceiveMagicSkillCanceled_hook(GameEngine* This, uint32_t, User* user)
|
||||
{
|
||||
EventDispatcher::GetInstance().Dispatch(SkillCancelledEvent{ user->objectId });
|
||||
(*__OnReceiveMagicSkillCanceled)(This, user);
|
||||
}
|
||||
|
||||
void __fastcall GameEngineWrapper::__AddAbnormalStatus_hook(GameEngine* This, uint32_t, L2ParamStack& stack)
|
||||
{
|
||||
EventDispatcher::GetInstance().Dispatch(AbnormalEffectChangedEvent{ stack.GetBufferAsVector<int32_t>(3) });
|
||||
(*__AddAbnormalStatus)(This, stack);
|
||||
}
|
||||
}
|
37
L2BotDll/Versions/Interlude/GameStructs/GameEngineWrapper.h
Normal file
37
L2BotDll/Versions/Interlude/GameStructs/GameEngineWrapper.h
Normal file
@ -0,0 +1,37 @@
|
||||
#pragma once
|
||||
|
||||
#include <math.h>
|
||||
#include <cstdint>
|
||||
#include "../../GameStructs/GameEngineInterface.h"
|
||||
#include "GameStructs.h"
|
||||
#include "L2ParamStack.h"
|
||||
|
||||
namespace Interlude
|
||||
{
|
||||
class GameEngineWrapper : public GameEngineInterface
|
||||
{
|
||||
public:
|
||||
class GameEngine {};
|
||||
GameEngineWrapper() = default;
|
||||
virtual ~GameEngineWrapper() = default;
|
||||
|
||||
void Init(HMODULE hModule) override;
|
||||
void Restore() override;
|
||||
|
||||
private:
|
||||
static void(__thiscall* __Init)(GameEngine*, float_t);
|
||||
static void(__thiscall* __OnSkillListPacket)(GameEngine*, L2ParamStack& stack);
|
||||
static int(__thiscall* __OnReceiveMagicSkillUse)(GameEngine*, User*, User*, L2ParamStack&);
|
||||
static void(__thiscall* __OnReceiveMagicSkillCanceled)(GameEngine*, User*);
|
||||
static void(__thiscall* __AddAbnormalStatus)(GameEngine*, L2ParamStack&);
|
||||
|
||||
static void __fastcall __Init_hook(GameEngine* This, uint32_t /*edx*/, float_t unk);
|
||||
static void __fastcall __OnSkillListPacket_hook(GameEngine* This, uint32_t /*edx*/, L2ParamStack& stack);
|
||||
static int __fastcall __OnReceiveMagicSkillUse_hook(GameEngine* This, uint32_t /*edx*/, User* u1, User* u2, L2ParamStack& stack);
|
||||
static void __fastcall __OnReceiveMagicSkillCanceled_hook(GameEngine* This, uint32_t /*edx*/, User* user);
|
||||
static void __fastcall __AddAbnormalStatus_hook(GameEngine* This, uint32_t /*edx*/, L2ParamStack& stack);
|
||||
private:
|
||||
static void* originalInitAddress;
|
||||
static GameEngine* _target;
|
||||
};
|
||||
}
|
258
L2BotDll/Versions/Interlude/GameStructs/GameStructs.h
Normal file
258
L2BotDll/Versions/Interlude/GameStructs/GameStructs.h
Normal file
@ -0,0 +1,258 @@
|
||||
#pragma once
|
||||
|
||||
#include "../../GameStructs/GameStructs.h"
|
||||
|
||||
namespace Interlude
|
||||
{
|
||||
class User
|
||||
{
|
||||
public:
|
||||
char pad_0000[8]; //0x0000
|
||||
L2::UserType userType; //0x0008
|
||||
char pad_000C[4]; //0x000C
|
||||
int32_t isMob; //0x0010
|
||||
uint32_t npcId; //0x0014
|
||||
uint32_t objectId; //0x0018
|
||||
wchar_t nickname[24]; //0x001C
|
||||
L2::Race raceId; //0x004C
|
||||
L2::Gender gender; //0x0050
|
||||
int32_t classId; //0x0054
|
||||
uint32_t lvl; //0x0058
|
||||
int32_t exp; //0x005C
|
||||
char pad_0060[4]; //0x0060
|
||||
int32_t str; //0x0064
|
||||
int32_t dex; //0x0068
|
||||
int32_t con; //0x006C
|
||||
int32_t int_; //0x0070
|
||||
int32_t wit; //0x0074
|
||||
int32_t men; //0x0078
|
||||
int32_t maxHp; //0x007C
|
||||
int32_t hp; //0x0080
|
||||
int32_t maxMp; //0x0084
|
||||
int32_t mp; //0x0088
|
||||
int32_t maxWeight; //0x008C
|
||||
char pad_0090[8]; //0x0090
|
||||
class L2::UserWear wear; //0x0098
|
||||
char pad_010C[132]; //0x010C
|
||||
class L2::FColor titleColor; //0x0190
|
||||
int32_t pad_0194; //0x0194 pvp state: 0 - normal, 1 - pvp, 2 - blinking
|
||||
int32_t karma; //0x0198
|
||||
char pad_019C[104]; //0x019C
|
||||
class APawn* pawn; //0x0204
|
||||
char pad_0208[12]; //0x0208
|
||||
int32_t weight; //0x0214
|
||||
int32_t sp; //0x0218
|
||||
int32_t accuracy; //0x021C
|
||||
int32_t critRate; //0x0220
|
||||
int32_t pAttack; //0x0224
|
||||
int32_t attackSpeed; //0x0228
|
||||
int32_t pDefense; //0x022C
|
||||
int32_t evasion; //0x0230
|
||||
int32_t mAttack; //0x0234
|
||||
int32_t mDefense; //0x0238
|
||||
int32_t castingSpeed; //0x023C
|
||||
char pad_0240[20]; //0x0240
|
||||
wchar_t title[16]; //0x0254
|
||||
char pad_0274[32]; //0x0274
|
||||
int32_t pad_0294; //0x0294
|
||||
char pad_0298[16]; //0x0298
|
||||
int32_t hasDwarvenCraft; //0x02A8
|
||||
int32_t attackSpeed2; //0x02AC
|
||||
char pad_02B0[4]; //0x02B0
|
||||
int32_t pkKills; //0x02B4
|
||||
int32_t pvpKills; //0x02B8
|
||||
char pad_02BC[4]; //0x02BC
|
||||
int32_t activeClassId; //0x02C0
|
||||
int32_t maxCp; //0x02C4
|
||||
int32_t cp; //0x02C8
|
||||
char pad_02CC[20]; //0x02CC
|
||||
int16_t recRemaining; //0x02E0
|
||||
int16_t evalScore; //0x02E2
|
||||
int32_t invSlotCount; //0x02E4
|
||||
char pad_02E8[32]; //0x02E8
|
||||
class L2::FColor nicknameColor; //0x0308
|
||||
char pad_030C[164]; //0x030C
|
||||
}; //Size: 0x03B0
|
||||
|
||||
class APawn
|
||||
{
|
||||
public:
|
||||
char pad_0000[8]; //0x0000
|
||||
void* uStaticMeshInstance; //0x0008
|
||||
void* fStateFrame; //0x000C
|
||||
char pad_0010[8]; //0x0010
|
||||
void* uPackage; //0x0018
|
||||
char pad_001C[32]; //0x001C
|
||||
class ALineagePlayerController* lineagePlayerController; //0x003C
|
||||
void* terrainInfo; //0x0040
|
||||
char pad_0044[28]; //0x0044
|
||||
int32_t ownerObjectId; //0x0060
|
||||
char pad_0064[344]; //0x0064
|
||||
class L2::FVector Location; //0x01BC
|
||||
class L2::FRotator Rotation; //0x01C8
|
||||
class L2::FVector Velocity; //0x01D4
|
||||
class L2::FVector Acceleration; //0x01E0
|
||||
char pad_01EC[336]; //0x01EC
|
||||
class L2::FVector Location2; //0x033C
|
||||
char pad_0348[1244]; //0x0348
|
||||
}; //Size: 0x0824
|
||||
|
||||
class ALineagePlayerController
|
||||
{
|
||||
public:
|
||||
char pad_0000[444]; //0x0000
|
||||
class L2::FVector cameraPosition; //0x01BC
|
||||
class L2::FRotator cameraRotation; //0x01C8
|
||||
char pad_01D4[544]; //0x01D4
|
||||
class L2::FVector moveLocation; //0x03F4
|
||||
char pad_0400[16]; //0x0400
|
||||
int32_t isIdle; //0x0410
|
||||
uint32_t targetObjectId; //0x0414
|
||||
char pad_0418[28]; //0x0418
|
||||
int8_t isRunning; //0x0434
|
||||
int8_t isStanding; //0x0435
|
||||
char pad_0436[26]; //0x0436
|
||||
}; //Size: 0x0450
|
||||
|
||||
struct Item
|
||||
{
|
||||
uint32_t objectId;
|
||||
unsigned int itemId;
|
||||
unsigned int isStackable; // ??
|
||||
unsigned int amount;
|
||||
APawn* pawn;
|
||||
};
|
||||
|
||||
class ItemInfo
|
||||
{
|
||||
public:
|
||||
L2::ItemType2 type2; //0x0000
|
||||
char pad_0002[2]; //0x0002
|
||||
uint32_t objectId; //0x0004
|
||||
uint32_t itemId; //0x0008
|
||||
uint32_t amount; //0x000C
|
||||
char pad_0010[8]; //0x0010
|
||||
L2::ItemSlot itemSlot; //0x0018
|
||||
uint16_t customType1; //0x001C
|
||||
uint16_t isEquipped; //0x001E
|
||||
uint16_t enchantLevel; //0x0020
|
||||
char pad_0022[2]; //0x0022
|
||||
uint16_t customType2; //0x0024
|
||||
char pad_0026[10]; //0x0026
|
||||
uint32_t augmentation1; //0x0030
|
||||
uint32_t augmentation2; //0x0034
|
||||
int32_t mana; //0x0038
|
||||
}; //Size: 0x003C
|
||||
|
||||
class FL2ItemDataBase
|
||||
{
|
||||
public:
|
||||
char pad_0000[4]; //0x0000
|
||||
L2::ItemDataType dataType; //0x0004
|
||||
char pad_0008[4]; //0x0008
|
||||
int32_t itemId; //0x000C
|
||||
char pad_0010[20]; //0x0010
|
||||
int32_t dropItemsNameIndex; //0x0024
|
||||
char pad_0028[8]; //0x0028
|
||||
int32_t dropItemsTexNameIndex; //0x0030
|
||||
char pad_0034[8]; //0x0034
|
||||
int32_t iconNameIndex; //0x003C
|
||||
char pad_0040[16]; //0x0040
|
||||
int32_t nameIndex; //0x0050
|
||||
char pad_0054[4]; //0x0054
|
||||
wchar_t* description; //0x0058
|
||||
char pad_005C[12]; //0x005C
|
||||
wchar_t* setItem; //0x0068
|
||||
char pad_006C[8]; //0x006C
|
||||
wchar_t* setEffect; //0x0074
|
||||
char pad_0078[8]; //0x0078
|
||||
wchar_t* addSetItem; //0x0080
|
||||
char pad_0084[8]; //0x0084
|
||||
wchar_t* addSetEffect; //0x008C
|
||||
char pad_0090[36]; //0x0090
|
||||
wchar_t* enchantEffect; //0x00B4
|
||||
char pad_00B8[12]; //0x00B8
|
||||
int32_t weight; //0x00C4
|
||||
}; //Size: 0x0140
|
||||
|
||||
class FL2EtcItemData : public FL2ItemDataBase
|
||||
{
|
||||
};
|
||||
|
||||
class FL2ArmorItemData : public FL2ItemDataBase
|
||||
{
|
||||
public:
|
||||
char pad_00C8[1308]; //0x00C8
|
||||
L2::ArmorType armorType; //0x05E4
|
||||
L2::CrystalType crystalType; //0x05E8
|
||||
char pad_05EC[4]; //0x05EC
|
||||
int32_t pDef; //0x05F0
|
||||
int32_t mDef; //0x05F4
|
||||
char pad_05F8[8]; //0x05F8
|
||||
};
|
||||
|
||||
class FL2WeaponItemData : public FL2ItemDataBase
|
||||
{
|
||||
public:
|
||||
char pad_00C8[24]; //0x00C8
|
||||
int32_t wtfNameIndex1; //0x00E0
|
||||
char pad_00E4[16]; //0x00E4
|
||||
int32_t wtfNameIndex2; //0x00F4
|
||||
int32_t wtfNameIndex3; //0x00F8
|
||||
char pad_00FC[12]; //0x00FC
|
||||
int32_t wtfNameIndex4; //0x0108
|
||||
int32_t wtfNameIndex5; //0x010C
|
||||
int32_t wtfNameIndex6; //0x0110
|
||||
int32_t wtfNameIndex7; //0x0114
|
||||
int32_t wtfNameIndex8; //0x0118
|
||||
int32_t wtfNameIndex9; //0x011C
|
||||
char pad_0120[4]; //0x0120
|
||||
int32_t rndDamage; //0x0124
|
||||
int32_t pAtk; //0x0128
|
||||
int32_t mAtk; //0x012C
|
||||
L2::WeaponType weaponType; //0x0130
|
||||
L2::CrystalType crystalType; //0x0134
|
||||
int32_t critical; //0x0138
|
||||
int32_t hitModify; //0x013C
|
||||
int32_t shieldEvasion; //0x0140
|
||||
int32_t shieldPdef; //0x0144
|
||||
int32_t shieldDefRate; //0x0148
|
||||
int32_t atkSpd; //0x014C
|
||||
int32_t mpConsume; //0x0150
|
||||
int32_t soulshotCount; //0x0154
|
||||
int32_t spiritshotCount; //0x0158
|
||||
char pad_015C[16]; //0x015C
|
||||
int32_t wtfNameIndex10; //0x016C
|
||||
char pad_0170[220]; //0x0170
|
||||
int32_t wtfNameIndex11; //0x024C
|
||||
char pad_0250[48]; //0x0250
|
||||
}; //Size: 0x0280
|
||||
|
||||
class FNameEntry
|
||||
{
|
||||
public:
|
||||
char pad_0000[12]; //0x0000
|
||||
wchar_t value[36]; //0x000C
|
||||
};
|
||||
|
||||
class FL2MagicSkillData
|
||||
{
|
||||
public:
|
||||
wchar_t* name; //0x0000
|
||||
char pad_0004[8]; //0x0004
|
||||
wchar_t* description; //0x000C
|
||||
char pad_0010[8]; //0x0010
|
||||
int32_t skillId; //0x0018
|
||||
int32_t lvl; //0x001C
|
||||
char pad_0020[4]; //0x0020
|
||||
int32_t mpCost; //0x0024
|
||||
char pad_0028[4]; //0x0028
|
||||
int32_t range; //0x002C
|
||||
char pad_0030[4]; //0x0030
|
||||
float hitTime; //0x0034
|
||||
char pad_0038[12]; //0x0038
|
||||
int32_t wtfNameIndex; //0x0044
|
||||
int32_t iconNameIndex; //0x0048
|
||||
char pad_004C[52]; //0x004C
|
||||
}; //Size: 0x0080
|
||||
};
|
@ -0,0 +1,61 @@
|
||||
#include "pch.h"
|
||||
#include "../../../Common/apihook.h"
|
||||
#include "L2GameDataWrapper.h"
|
||||
#include "ProcessManipulation.h"
|
||||
|
||||
namespace Interlude
|
||||
{
|
||||
void* L2GameDataWrapper::originalInitAddress = 0;
|
||||
L2GameDataWrapper::L2GameData* L2GameDataWrapper::_target = 0;
|
||||
|
||||
int(__thiscall* L2GameDataWrapper::__Init)(L2GameData*, int, int) = 0;
|
||||
FL2ItemDataBase* (__thiscall* L2GameDataWrapper::__GetItemData)(L2GameData*, int) = 0;
|
||||
FL2MagicSkillData* (__thiscall* L2GameDataWrapper::__GetMSData)(L2GameData*, int, int) = 0;
|
||||
|
||||
void L2GameDataWrapper::Init(HMODULE hModule)
|
||||
{
|
||||
void* initAddress = GetProcAddress(hModule, "?GetMSData@FL2GameData@@QAEPAUFL2MagicSkillData@@HH@Z");
|
||||
originalInitAddress = splice(initAddress, __Init_hook);
|
||||
(FARPROC&)__Init = (FARPROC)initAddress;
|
||||
|
||||
(FARPROC&)__GetItemData = GetProcAddress(hModule, "?GetItemData@FL2GameData@@QAEPAVFL2ItemDataBase@@H@Z");
|
||||
(FARPROC&)__GetMSData = GetProcAddress(hModule, "?GetMSData@FL2GameData@@QAEPAUFL2MagicSkillData@@HH@Z");
|
||||
}
|
||||
|
||||
void L2GameDataWrapper::Restore()
|
||||
{
|
||||
restore(originalInitAddress);
|
||||
}
|
||||
|
||||
//todo exception(?)
|
||||
FL2ItemDataBase* L2GameDataWrapper::GetItemData(int itemId) const
|
||||
{
|
||||
if (__GetItemData && _target) {
|
||||
return (*__GetItemData)(_target, itemId);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
FL2MagicSkillData* L2GameDataWrapper::GetMSData(int skillId, int level) const
|
||||
{
|
||||
if (__GetMSData && _target) {
|
||||
return (*__GetMSData)(_target, skillId, level);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __fastcall L2GameDataWrapper::__Init_hook(L2GameData* This, int, int unk, int unk1)
|
||||
{
|
||||
if (_target == 0) {
|
||||
_target = This;
|
||||
|
||||
InjectLibrary::StopCurrentProcess();
|
||||
restore(originalInitAddress);
|
||||
InjectLibrary::StartCurrentProcess();
|
||||
|
||||
return (*__Init)(This, unk, unk1);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
};
|
30
L2BotDll/Versions/Interlude/GameStructs/L2GameDataWrapper.h
Normal file
30
L2BotDll/Versions/Interlude/GameStructs/L2GameDataWrapper.h
Normal file
@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
#include "pch.h"
|
||||
#include "GameStructs.h"
|
||||
#include "../../GameStructs/L2GameDataInterface.h"
|
||||
|
||||
namespace Interlude
|
||||
{
|
||||
class L2GameDataWrapper : public L2GameDataInterface
|
||||
{
|
||||
public:
|
||||
class L2GameData {};
|
||||
L2GameDataWrapper() = default;
|
||||
virtual ~L2GameDataWrapper() = default;
|
||||
|
||||
FL2ItemDataBase* GetItemData(int itemId) const;
|
||||
FL2MagicSkillData* GetMSData(int skillId, int level) const;
|
||||
void Init(HMODULE hModule) override;
|
||||
void Restore() override;
|
||||
private:
|
||||
static int(__thiscall* __Init)(L2GameData*, int, int);
|
||||
static FL2ItemDataBase* (__thiscall* __GetItemData)(L2GameData*, int);
|
||||
static FL2MagicSkillData* (__thiscall* __GetMSData)(L2GameData*, int, int);
|
||||
|
||||
static int __fastcall __Init_hook(L2GameData* This, int /*edx*/, int unk, int unk1);
|
||||
private:
|
||||
static void* originalInitAddress;
|
||||
static L2GameData* _target;
|
||||
};
|
||||
};
|
71
L2BotDll/Versions/Interlude/GameStructs/L2ParamStack.cpp
Normal file
71
L2BotDll/Versions/Interlude/GameStructs/L2ParamStack.cpp
Normal file
@ -0,0 +1,71 @@
|
||||
#include "pch.h"
|
||||
#include "L2ParamStack.h"
|
||||
|
||||
namespace Interlude
|
||||
{
|
||||
void(__thiscall* L2ParamStack::__Ctor)(L2ParamStack* This, int) = 0;
|
||||
void(__thiscall* L2ParamStack::__Dtor)(L2ParamStack* This) = 0;
|
||||
int(__thiscall* L2ParamStack::__PushBack)(L2ParamStack* This, void*) = 0;
|
||||
void* (__thiscall* L2ParamStack::__Top)(L2ParamStack* This) = 0;
|
||||
void** (__thiscall* L2ParamStack::__GetBuffer)(L2ParamStack* This) = 0;
|
||||
int (__thiscall* L2ParamStack::__GetBufferSize)(L2ParamStack* This) = 0;
|
||||
int (__thiscall* L2ParamStack::__GetTotalBufferSize)(L2ParamStack* This) = 0;
|
||||
HMODULE L2ParamStack::_hModule = 0;
|
||||
|
||||
L2ParamStack::L2ParamStack(int size)
|
||||
{
|
||||
Init();
|
||||
(*__Ctor)(this, size);
|
||||
}
|
||||
|
||||
L2ParamStack::~L2ParamStack()
|
||||
{
|
||||
Init();
|
||||
(*__Dtor)(this);
|
||||
}
|
||||
|
||||
int L2ParamStack::PushBack(void* val)
|
||||
{
|
||||
Init();
|
||||
return (*__PushBack)(this, val);
|
||||
}
|
||||
|
||||
void* L2ParamStack::Top()
|
||||
{
|
||||
Init();
|
||||
return (*__Top)(this);
|
||||
}
|
||||
|
||||
void** L2ParamStack::GetBuffer()
|
||||
{
|
||||
Init();
|
||||
return (__GetBuffer)(this);
|
||||
}
|
||||
|
||||
int L2ParamStack::GetBufferSize()
|
||||
{
|
||||
Init();
|
||||
return (__GetBufferSize)(this);
|
||||
}
|
||||
|
||||
int L2ParamStack::GetTotalBufferSize()
|
||||
{
|
||||
Init();
|
||||
return (__GetTotalBufferSize)(this);
|
||||
}
|
||||
|
||||
void L2ParamStack::Init()
|
||||
{
|
||||
// todo exceptions
|
||||
if (_hModule == 0) {
|
||||
_hModule = GetModuleHandleA("Core.dll");
|
||||
(FARPROC&)__Ctor = GetProcAddress(_hModule, "??0L2ParamStack@@QAE@H@Z");
|
||||
(FARPROC&)__Dtor = GetProcAddress(_hModule, "??1L2ParamStack@@QAE@XZ");
|
||||
(FARPROC&)__PushBack = GetProcAddress(_hModule, "?PushBack@L2ParamStack@@QAEHPAX@Z");
|
||||
(FARPROC&)__Top = GetProcAddress(_hModule, "?Top@L2ParamStack@@QAEPAXXZ");
|
||||
(FARPROC&)__GetBuffer = GetProcAddress(_hModule, "?GetBuffer@L2ParamStack@@QAEPAPAXXZ");
|
||||
(FARPROC&)__GetBufferSize = GetProcAddress(_hModule, "?GetBufferSize@L2ParamStack@@QAEHXZ");
|
||||
(FARPROC&)__GetTotalBufferSize = GetProcAddress(_hModule, "?GetTotalBufferSize@L2ParamStack@@QAEHXZ");
|
||||
}
|
||||
}
|
||||
}
|
63
L2BotDll/Versions/Interlude/GameStructs/L2ParamStack.h
Normal file
63
L2BotDll/Versions/Interlude/GameStructs/L2ParamStack.h
Normal file
@ -0,0 +1,63 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
|
||||
namespace Interlude
|
||||
{
|
||||
class L2ParamStack
|
||||
{
|
||||
char padding[16] = "";
|
||||
public:
|
||||
L2ParamStack(int size);
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
~L2ParamStack();
|
||||
int PushBack(void* val);
|
||||
void* Top();
|
||||
void** GetBuffer();
|
||||
int GetBufferSize();
|
||||
int GetTotalBufferSize();
|
||||
|
||||
template <typename T>
|
||||
std::vector<T> GetBufferAsVector()
|
||||
{
|
||||
std::vector<T> result;
|
||||
|
||||
auto buffer = GetBuffer();
|
||||
for (int i = 0; i < GetBufferSize(); i++) {
|
||||
result.push_back((T) buffer[i]);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
std::vector<T> GetBufferAsVector(uint16_t objectSize)
|
||||
{
|
||||
std::vector<T> result;
|
||||
|
||||
uint32_t* tmpBuffer = (uint32_t*)GetBuffer();
|
||||
uint32_t objectsCount = tmpBuffer[0];
|
||||
|
||||
auto buffer = GetBuffer();
|
||||
|
||||
for (size_t i = 0; i < objectsCount; i++) {
|
||||
for (size_t j = 0; j < objectSize; j++) {
|
||||
result.push_back((T)buffer[i * objectSize + j + 1]);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
private:
|
||||
void Init();
|
||||
private:
|
||||
static void(__thiscall* __Ctor)(L2ParamStack* This, int);
|
||||
static void(__thiscall* __Dtor)(L2ParamStack* This);
|
||||
static int(__thiscall* __PushBack)(L2ParamStack* This, void*);
|
||||
static void*(__thiscall* __Top)(L2ParamStack* This);
|
||||
static void**(__thiscall* __GetBuffer)(L2ParamStack* This);
|
||||
static int(__thiscall* __GetBufferSize)(L2ParamStack* This);
|
||||
static int(__thiscall* __GetTotalBufferSize)(L2ParamStack* This);
|
||||
static HMODULE _hModule;
|
||||
};
|
||||
}
|
@ -0,0 +1,126 @@
|
||||
#include "pch.h"
|
||||
#include "../../../Common/apihook.h"
|
||||
#include "NetworkHandlerWrapper.h"
|
||||
#include "../../../Events/SpoiledEvent.h"
|
||||
#include "../../../Events/CreatureDiedEvent.h"
|
||||
#include "../../../Events/EventDispatcher.h"
|
||||
#include "ProcessManipulation.h"
|
||||
|
||||
namespace Interlude
|
||||
{
|
||||
void* NetworkHandlerWrapper::originalInitAddress = 0;
|
||||
NetworkHandlerWrapper::NetworkHandler* NetworkHandlerWrapper::_target = 0;
|
||||
|
||||
void(__thiscall* NetworkHandlerWrapper::__Init)(NetworkHandler*, float) = 0;
|
||||
Item* (__thiscall* NetworkHandlerWrapper::__GetNextItem)(NetworkHandler*, float, int) = 0;
|
||||
User* (__thiscall* NetworkHandlerWrapper::__GetNextCreature)(NetworkHandler*, float, int) = 0;
|
||||
float(__thiscall* NetworkHandlerWrapper::__GetMaxTickRate)(NetworkHandler*) = 0;
|
||||
int(__thiscall* NetworkHandlerWrapper::__AddNetworkQueue)(NetworkHandler*, L2::NetworkPacket*) = 0;
|
||||
int(__thiscall* NetworkHandlerWrapper::__OnDie)(NetworkHandler*, User*, L2ParamStack&) = 0;
|
||||
|
||||
//todo exception
|
||||
Item* NetworkHandlerWrapper::GetNextItem(float_t radius, int prevId) const
|
||||
{
|
||||
if (__GetNextItem && _target) {
|
||||
return (*__GetNextItem)(_target, radius, prevId);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//todo exception
|
||||
User* NetworkHandlerWrapper::GetNextCreature(float_t radius, int prevId) const
|
||||
{
|
||||
if (__GetNextCreature && _target) {
|
||||
return (*__GetNextCreature)(_target, radius, prevId);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
User* NetworkHandlerWrapper::GetHero() const
|
||||
{
|
||||
const auto creatures = GetAllObjects<User*>(0.1f, [this](float_t radius, int32_t prevId) {
|
||||
return GetNextCreature(radius, prevId);
|
||||
});
|
||||
|
||||
for (const auto& kvp : creatures)
|
||||
{
|
||||
const auto& creature = static_cast<User*>(kvp.second);
|
||||
if (creature->userType == L2::UserType::USER && creature->lvl > 0)
|
||||
{
|
||||
return creature;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void NetworkHandlerWrapper::Init(HMODULE hModule)
|
||||
{
|
||||
void* initAddress = GetProcAddress(hModule, "?Tick@UNetworkHandler@@UAEXM@Z");
|
||||
originalInitAddress = splice(initAddress, __Init_hook);
|
||||
(FARPROC&)__Init = (FARPROC)initAddress;
|
||||
|
||||
(FARPROC&)__GetNextItem = GetProcAddress(hModule, "?GetNextItem@UNetworkHandler@@UAEPAUItem@@MH@Z");
|
||||
(FARPROC&)__GetNextCreature = GetProcAddress(hModule, "?GetNextCreature@UNetworkHandler@@UAEPAUUser@@MH@Z");
|
||||
|
||||
(FARPROC&)__GetMaxTickRate = (FARPROC)splice(
|
||||
GetProcAddress(hModule, "?GetMaxTickRate@UGameEngine@@UAEMXZ"), __GetMaxTickRate_hook
|
||||
);
|
||||
(FARPROC&)__AddNetworkQueue = (FARPROC)splice(
|
||||
GetProcAddress(hModule, "?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPacket@@@Z"), __AddNetworkQueue_hook
|
||||
);
|
||||
(FARPROC&)__OnDie = (FARPROC)splice(
|
||||
GetProcAddress(hModule, "?OnDie@UGameEngine@@UAEHPAUUser@@AAVL2ParamStack@@@Z"), __OnDie_hook
|
||||
);
|
||||
}
|
||||
|
||||
void NetworkHandlerWrapper::Restore()
|
||||
{
|
||||
restore(originalInitAddress);
|
||||
restore((void*&)__GetMaxTickRate);
|
||||
restore((void*&)__AddNetworkQueue);
|
||||
restore((void*&)__OnDie);
|
||||
}
|
||||
|
||||
void __fastcall NetworkHandlerWrapper::__Init_hook(NetworkHandler* This, int /*edx*/, float unk)
|
||||
{
|
||||
if (_target == 0) {
|
||||
_target = This;
|
||||
|
||||
InjectLibrary::StopCurrentProcess();
|
||||
restore(originalInitAddress);
|
||||
InjectLibrary::StartCurrentProcess();
|
||||
|
||||
(*__Init)(This, unk);
|
||||
}
|
||||
}
|
||||
|
||||
// TODO ini
|
||||
// 0 - <20><><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
float __fastcall NetworkHandlerWrapper::__GetMaxTickRate_hook(NetworkHandler* This, int)
|
||||
{
|
||||
float fps = (*__GetMaxTickRate)(This);
|
||||
return 0.0f;
|
||||
}
|
||||
|
||||
int __fastcall NetworkHandlerWrapper::__AddNetworkQueue_hook(NetworkHandler* This, int, L2::NetworkPacket* packet)
|
||||
{
|
||||
if (packet->id == static_cast<int>(L2::NetworkPacketId::SYSTEM_MESSAGE)) {
|
||||
L2::SystemMessagePacket* p = static_cast<L2::SystemMessagePacket*>(packet);
|
||||
if (
|
||||
p->GetMessageId() == static_cast<int>(L2::SystemMessagePacket::Type::SPOIL_SUCCESS) ||
|
||||
p->GetMessageId() == static_cast<int>(L2::SystemMessagePacket::Type::ALREADY_SPOILED)
|
||||
) {
|
||||
EventDispatcher::GetInstance().Dispatch(SpoiledEvent{});
|
||||
}
|
||||
}
|
||||
|
||||
return (*__AddNetworkQueue)(This, packet);
|
||||
}
|
||||
|
||||
int __fastcall NetworkHandlerWrapper::__OnDie_hook(NetworkHandler* This, int, User* creature, L2ParamStack& stack)
|
||||
{
|
||||
EventDispatcher::GetInstance().Dispatch(CreatureDiedEvent{ creature->objectId });
|
||||
|
||||
return (*__OnDie)(This, creature, stack);
|
||||
}
|
||||
}
|
@ -0,0 +1,42 @@
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <map>
|
||||
#include "../../GameStructs/NetworkHandlerInterface.h"
|
||||
#include "GameStructs.h"
|
||||
#include "../../GameStructs/FindObjectsTrait.h"
|
||||
#include "L2ParamStack.h"
|
||||
|
||||
namespace Interlude
|
||||
{
|
||||
class NetworkHandlerWrapper : public NetworkHandlerInterface, public FindObjectsTrait
|
||||
{
|
||||
public:
|
||||
class NetworkHandler {};
|
||||
NetworkHandlerWrapper() = default;
|
||||
virtual ~NetworkHandlerWrapper() = default;
|
||||
|
||||
void Init(HMODULE hModule) override;
|
||||
void Restore() override;
|
||||
|
||||
Item* GetNextItem(float_t radius, int prevId) const;
|
||||
User* GetNextCreature(float_t radius, int prevId) const;
|
||||
User* GetHero() const;
|
||||
private:
|
||||
|
||||
static void __fastcall __Init_hook(NetworkHandler* This, int /*edx*/, float unk);
|
||||
static int __fastcall __AddNetworkQueue_hook(NetworkHandler* This, int /*edx*/, L2::NetworkPacket* packet);
|
||||
static int __fastcall __OnDie_hook(NetworkHandler* This, int /*edx*/, User* creature, L2ParamStack& stack);
|
||||
static float __fastcall __GetMaxTickRate_hook(NetworkHandler* This, int /*edx*/);
|
||||
|
||||
static void(__thiscall* __Init)(NetworkHandler*, float);
|
||||
static Item* (__thiscall* __GetNextItem)(NetworkHandler*, float, int);
|
||||
static User* (__thiscall* __GetNextCreature)(NetworkHandler*, float, int);
|
||||
static float(__thiscall* __GetMaxTickRate)(NetworkHandler*);
|
||||
static int(__thiscall* __AddNetworkQueue)(NetworkHandler*, L2::NetworkPacket*);
|
||||
static int(__thiscall* __OnDie)(NetworkHandler*, User*, L2ParamStack&);
|
||||
private:
|
||||
static void* originalInitAddress;
|
||||
static NetworkHandler* _target;
|
||||
};
|
||||
}
|
Reference in New Issue
Block a user