#pragma once #include "fl_math.h" #include "vftable.h" #define WIN32_LEAN_AND_MEAN #include #include #include "st6.h" #define IMPORT __declspec(dllimport) #define ENGINE_TYPE 0x20000 IMPORT UINT CreateID(LPCSTR str); class INI_Reader { public: IMPORT INI_Reader(); IMPORT ~INI_Reader(); IMPORT bool open(LPCSTR path, bool throwExceptionOnFail = false); IMPORT bool read_header(); IMPORT bool is_header(LPCSTR name); IMPORT LPCSTR get_header_ptr(); IMPORT bool read_value(); IMPORT bool is_value(LPCSTR name); IMPORT LPCSTR get_value_string(UINT index = 0); IMPORT bool get_value_bool(UINT index = 0); IMPORT float get_value_float(UINT index = 0); IMPORT int get_value_int(UINT index = 0); IMPORT LPCSTR get_name_ptr(); IMPORT LPCSTR get_file_name() const; IMPORT void close(); // inline UINT get_value_uint(UINT index = 0) // { // return static_cast(get_value_float(index)); // } inline UINT get_value_id(UINT index = 0) { return CreateID(get_value_string(index)); } private: BYTE data[0x1565]; }; class IMPORT CEquip { public: FILL_VFTABLE(0); FILL_VFTABLE(1); FILL_VFTABLE(2); virtual bool Activate(bool value); }; class IMPORT CELightEquip : public CEquip { public: static CELightEquip * cast(CEquip * equip); }; class CELauncher { public: IMPORT UINT GetProjectilesPerFire() const; UINT GetProjectilesPerFire_Hook() const; }; class IMPORT CEquipTraverser { public: CEquipTraverser(int equipClass); private: BYTE data[0x10]; }; class IMPORT CEquipManager { public: CEquip const * FindFirst(UINT type) const; CEquip * Traverse(CEquipTraverser& equipTraverser); private: BYTE x00[0x20]; }; struct CollisionGroupDesc {}; namespace Archetype { struct Root { BYTE data[0x44]; int scriptIndex; // 0x44 IMPORT int get_script_index() const; }; struct EqObj { BYTE x00[0x14]; UINT idsName; // 0x14 UINT idsInfo; // 0x18 // st6::list IMPORT bool get_undamaged_collision_group_list(std::list& colGroupList) const; bool get_undamaged_collision_group_list_Hook(std::list& colGroupList) const; }; struct Ship : public EqObj { BYTE x1C[0xEC]; Vector angularDrag; // 0x108 Vector steeringTorque; // 0x114 }; IMPORT Ship* GetShip(UINT shipId); struct Solar : public EqObj { }; struct ShieldGenerator { BYTE x00[0x94]; float maxCapacity; // 0x94 BYTE x98[0x8]; float offlineThreshold; // 0xA0 }; } class IMPORT EngineObject { public: float const get_radius() const; Matrix const & get_orientation() const; long engineInstance; // 0x04 BYTE x08[0x44]; private: FILL_VFTABLE(0); FILL_VFTABLE(1); FILL_VFTABLE(2); FILL_VFTABLE(3); }; struct IMPORT CObject : public EngineObject { Archetype::Root* get_archetype() const; DWORD classType; // 0x4C }; struct IMPORT CSimple : CObject { BYTE x50[0x60]; UINT nickname; // or simpleId, 0xB0 }; class CAttachedEquip { FILL_VFTABLE(0); FILL_VFTABLE(1); FILL_VFTABLE(2); FILL_VFTABLE(3); FILL_VFTABLE(4); FILL_VFTABLE(5); FILL_VFTABLE(6); FILL_VFTABLE(7); virtual void Vftable_x80(); public: virtual long GetRootIndex() const; CObject* parent; // x04 }; struct IMPORT CEqObj : public CSimple { private: FILL_VFTABLE(4); FILL_VFTABLE(5); FILL_VFTABLE(6); FILL_VFTABLE(7); virtual void Vftable_x80(); virtual void Vftable_x84(); BYTE xB4[0x30]; public: CEquipManager equipManager; // 0xE4 BYTE x104[0x5C]; UINT baseId; // 0x160 virtual UINT get_name() const; // 0x88 bool is_base() const; }; struct IObjInspect; #define CSHIP_CLASS_TYPE 0x503 struct CShip : public CEqObj { BYTE x164[0x50]; DWORD groupId; // 0x1B4 IMPORT float get_throttle() const; IMPORT Archetype::Ship const * shiparch() const; IMPORT bool is_using_tradelane() const; IMPORT UINT get_group_name() const; IMPORT bool is_enemy(IObjInspect *obj); UINT get_group_name_Hook() const; bool is_enemy_Hook(IObjInspect *obj); }; #define CSOLAR_CLASS_TYPE 0x303 struct CSolar : public CEqObj { IMPORT bool is_dynamic() const; IMPORT bool is_waypoint() const; IMPORT Archetype::Solar const * solararch() const; static inline const CSolar* cast(const CObject& obj) { if ((obj.classType & CSOLAR_CLASS_TYPE) == CSOLAR_CLASS_TYPE) return (const CSolar*) &obj; return nullptr; } }; inline bool IsObjectAWaypoint(const CObject& cobject) { const CSolar* solar = CSolar::cast(cobject); if (!solar) return false; return solar->is_waypoint(); } class IMPORT FuseAction { public: virtual void Dealloc(bool unk); virtual bool IsTriggered() const; }; class IMPORT CEEngine : public FuseAction { public: static CEEngine const * cast(CEquip const * equip); }; class CRemotePhysicsSimulation { public: IMPORT bool CheckForSync(Vector const &shipPos, Vector const &shipPos2, Quaternion const &unk); bool CheckForSync_Hook(const CShip& ship, Vector const &shipPos, Quaternion const &unk); }; struct IObjRW // : public IObjInspectImpl { BYTE x04[0xC]; CObject* cobject; // 0x10 BYTE x14[0x8]; int unk_x1C; // 0x1C BYTE x20[0x16C]; DWORD flags; // 0x18C FILL_VFTABLE(0) FILL_VFTABLE(1) virtual UINT get_simple_id() const; // 0x20 virtual void Vftable_x24(); virtual void Vftable_x28(); virtual void Vftable_x2C(); FILL_VFTABLE(3) FILL_VFTABLE(4) FILL_VFTABLE(5) virtual void Vftable_x60(); virtual void Vftable_x64(); virtual int get_attitude_towards(float &attitude, IObjRW const *other) const; // 0x68 virtual void Vftable_x6C(); virtual void Vftable_x70(); virtual int get_target(const IObjRW *&target) const; // 0x74 virtual void Vftable_x78(); virtual void Vftable_x7C(); FILL_VFTABLE(8) FILL_VFTABLE(9) FILL_VFTABLE(A) virtual void Vftable_xB0(); virtual void Vftable_xB4(); virtual void Vftable_xB8(); virtual bool is_player() const; // 0xBC inline bool SentTradeRequest() const { #define TRADE_REQUEST_FLAGS 0x4 return (flags & TRADE_REQUEST_FLAGS) != 0; } }; struct IObjInspect : public IObjRW { }; struct PhysicsInfo { BYTE x00[0x2F]; bool autoLevel; // 0x2F }; class IBehaviorManager { public: BYTE x00[0x08]; PhysicsInfo* physicsInfo; // 0x08 BYTE x0C[0xED]; bool rotationLock; // 0xF9 }; IMPORT IBehaviorManager* GetBehaviorManager(IObjRW *iObjRw); struct ID_String { UINT ids; }; IMPORT bool SinglePlayer(); IMPORT bool IsMPServer(); namespace Reputation { namespace Vibe { IMPORT int GetInfocard(int const& id, unsigned int& idsInfo); } } struct EquipDesc { DWORD x00; UINT archId; // 0x4 }; class EquipDescList { public: #ifdef USE_ST6 st6 #else std #endif ::list list; // 0x0 }; enum GoodType : DWORD { Commodity = 0, Hull = 2, Ship = 3 }; struct GoodInfo { BYTE x00[0x4C]; GoodType type; // 0x4C BYTE x50[0x4]; UINT shipId; // only if type = Hull, 0x54 BYTE x58[0x38]; UINT shipHullId; // only if type = Ship, 0x90 EquipDescList equipDescLists[3]; // 0x94 }; namespace GoodList { IMPORT GoodInfo const * find_by_id(UINT id); };