Lost Ark SDK  1.148.153.0
Lost Ark SDK Documentation

Lost Ark SDK Build Status


FindPattern Signatures

v1.148.153.0 (Codename: Assasin)

{C++}
BYTE* __GObjects = (BYTE*)PatternScan("EFEngine.dll", "48 8B ? ? ? ? ? 48 8B 34 C8 49 8B D6 48 8B CE");
if (__GObjects == nullptr)
return;
_GObjects = (BYTE*)*(DWORD*)(__GObjects + 0x03);
_GObjects += (unsigned __int64)__GObjects + 0x03 + sizeof(DWORD);
UObject::GObjects = reinterpret_cast<decltype(UObject::GObjects)>(_GObjects);
BYTE* __GNames = (BYTE*)PatternScan("EFEngine.dll", "48 89 ? ? ? ? ? 48 89 ? ? ? ? ? 48 8B ? ? ? ? ? 48 2B C1 48 83 F8 19");
if (__GNames == nullptr)
return;
_GNames = (BYTE*)*(DWORD*)(__GNames + 0x03);
_GNames += (unsigned __int64)__GNames + 0x03 + sizeof(DWORD);
FName::GNames = reinterpret_cast<decltype(FName::GNames)>(_GNames);

ULocalPlayer, APlayerController and APawn from LocalPlayer

ULocalPlayer

{C++}
ULocalPlayer* GetLocalPlayer()
{
return UObject::FindObject<ULocalPlayer>("LocalPlayer Transient.EFGameEngine_1.LocalPlayer_1");
}

APlayerController

{C++}
auto m_pPC = static_cast<SDK::APlayerController*>(GetLocalPlayer()->Actor);
if (m_pPC == nullptr)
return;

APawn

{C++}
auto m_pLocalPlayerPawn = static_cast<SDK::APawn*>(m_pPC->AcknowledgedPawn);
if (m_pLocalPlayerPawn == nullptr)
return false;

Actor Array location

ULevelBase Class with Actor Array

{C++}
class ULevelBase : public UObject
{
public:
TArray<AActor*> Actors;
unsigned char UnknownData00[0x64];
static UClass* StaticClass()
{
static UClass* ptr = nullptr;
if (!ptr)
ptr = UObject::FindClass("Class Engine.LevelBase");
return ptr;
}
};

UWorld class with PersistentLevel:

{C++}
class UWorld : public UObject
{
public:
unsigned char UnknownData00[0x20]; // 0x0058
class ULevel* PersistentLevel; // 0x0060(0x0008)
unsigned char UnknownData01[0x384]; // 0x0058(0x0354) MISSED OFFSET
static UClass* StaticClass()
{
static UClass* ptr = nullptr;
if (!ptr)
ptr = UObject::FindClass("Class Engine.World");
return ptr;
}
};

Snippets

Functions names and ID's for ProcessEvent Hook:

{C++}
enum eFuncId
{
EFGame_EFGFxHUDWrapper_PostRender = 41542, /// EFGame.EFGFxHUDWrapper.PostRender
EFGame_EFGameViewportClient_PostRender = 41463, /// EFGame.EFGameViewportClient.PostRender
EFGame_EFGameViewportClient_Tick = 41465, /// EFGame.EFGameViewportClient.Tick
Engine_GameViewportClient_LayoutPlayers = 19948, /// Engine.GameViewportClient.LayoutPlayers
EFGame_EFGFxHUDWrapper_Destroyed = 41430, /// EFGame.EFGFxHUDWrapper.Destroyed
Engine_PlayerController_Destroyed = 44344, /// Engine.PlayerController.Destroyed
Engine_PlayerController_GetFOVAngle = 4416, /// Engine.PlayerController.GetFOVAngle
EFGame_EFPlayerController_PlayerTick = 44490, /// EFGame.EFPlayerController.PlayerTick
Engine_GameViewportClient_GetViewportSize = 19850, /// Engine.GameViewportClient.GetViewportSize
Engine_GameViewportClient_GetMousePosition = 19865, /// Engine.GameViewportClient.GetMousePosition
EFGame_EFPlayerController_GetPlayerViewPoint = 44505 /// EFGame.EFPlayerController.GetPlayerViewPoint
};

Example usage of eFuncId:

{C++}
auto iIndex = pUFunc->ObjectInternalInteger;
if (iIndex == SDK::eFuncId::EFGame_EFGFxHUDWrapper_PostRender)
{
PostRender();
}

Actor Tag ID's:

{C++}
enum eTagId
{
Player = 15163,
Monster = 15157,
NPC = 15159,
SummonNPC = 15165,
Pet = 15161,
Vehicle = 15171
};

Example usage of eTagId:

{C++}
bool IsPlayer(AEFPawn* pEntity)
{
return (pEntity->Tag.Index == eTagId::Player);
}

Visible check:

{C++}
bool IsVisible(AEFPawn* pEntity)
{
if (g_pLocalPlayer == nullptr)
return false;
if (g_pPC == nullptr)
return false;
if (g_pLocalPlayerPawn == nullptr)
return false;
if (g_pLocalPlayerPawn->LineOfSightTo(pEntity))
return true;
return false;
}

Modify FOV of Camera:

{C++}
/// CustomFOV
if (SDK::g_pPC->GetFOVAngle() != 100.0f)
{
#ifdef __DebugPrint__
std::printf("Set Custom FOV\n");
#endif
SDK::g_pPC->FOV(100.0f);
}

Skeleton ESP:

{C++}
void DrawPlayerSkeleton(SDK::UCanvas* pCanvas, SDK::AEFPawn* pEntity, SDK::FColor Color)
{
std::vector<std::vector<std::string>> BonesVector =
{
{ "Bip001-Head", "Bip001-Neck", "Bip001-Pelvis" },
{ "Bip001-L-UpperArm", "Bip001-L-Clavicle", "Bip001-L-Forearm", "Bip001-L-Hand" },
{ "bip001-l-thigh", "bip001-l-calf", "bip001-l-foot", "Bip001-R-UpperArm" },
{ "Bip001-R-Clavicle", "Bip001-R-Forearm", "Bip001-R-Hand", "bip001-r-thigh" },
{ "bip001-r-calf", "bip001-r-foot" }
};
for (auto pBoneVector : BonesVector)
{
SDK::FVector FVPrev, FVCur;
FVPrev = pCanvas->Project(pEntity->Mesh->GetBoneLocation(pBoneVector.at(0).c_str(), 0));
for (size_t bone = 1; bone < pBoneVector.size(); bone++)
{
FVCur = pCanvas->Project(pEntity->Mesh->GetBoneLocation(pBoneVector.at(bone).c_str(), 0));
if (!FVCur.X || !FVCur.Y || !FVCur.Z)
break;
pCanvas->Draw2DLine(FVPrev.X, FVPrev.Y, FVCur.X, FVCur.Y, Color);
FVPrev = FVCur;
}
}
}

Credits

Name Reason
realrespecter Korea SDK Dump
iCollin\qmp Original Skeleton ESP Function
Revenge282 Inspired by sot.exiled.dev

Special thanks to the OSH Community

Name Reason
KN4CK3R SDK Generator and ReClass.NET
Dr.Pepper Help with SDK Generator, Unreal Engine, C++ and ASM
SilverDeath C++, ASM, Math and some UE SDK stuff
Jeon C++ and ASM