Compare commits

..

9 Commits

Author SHA1 Message Date
fallenoak
315ea05ba0
feat(ui): implement Script_UnitXPMax
Some checks are pending
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:cl compiler_name:MSVC cxx:cl os:windows-latest system_name:Windows test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:clang compiler_name:Clang cxx:clang++ os:macos-latest system_name:macOS test_path:WhoaTest]) (push) Waiting to run
Push / ${{ matrix.build.system_name }} / ${{ matrix.build.build_type }} / ${{ matrix.build.compiler_name }} (map[build_type:Release cc:gcc compiler_name:GCC cxx:g++ os:ubuntu-latest system_name:Linux test_path:WhoaTest]) (push) Waiting to run
2026-02-05 16:56:44 -06:00
fallenoak
a53e1360a4
feat(ui): implement Script_UnitXP 2026-02-05 16:12:04 -06:00
fallenoak
cfb8f2bae1
feat(ui): add Script_GetUnitFromName 2026-02-05 16:05:19 -06:00
fallenoak
ed9c683602
feat(object): add CGPlayer_C::GetActiveNextLevelXP 2026-02-05 16:01:46 -06:00
fallenoak
ee48e47992
feat(object): add CGPlayer_C::GetActiveXP 2026-02-05 15:58:48 -06:00
fallenoak
5d81022c74
feat(object): add CGPlayer::GetNextLevelXP 2026-02-05 15:00:32 -06:00
fallenoak
c9f26b6666
feat(object): add CGObject::IsExactlyA 2026-02-05 14:53:58 -06:00
fallenoak
f567a3a7c8
feat(object): add CGPlayer::GetXP 2026-02-05 14:51:17 -06:00
fallenoak
aac8cf0855
feat(object): add CGObject::IsA 2026-02-05 13:26:59 -06:00
9 changed files with 89 additions and 2 deletions

View File

@ -36,6 +36,14 @@ OBJECT_TYPE_ID CGObject::GetTypeID() const {
return this->m_typeID;
}
int32_t CGObject::IsA(OBJECT_TYPE type) const {
return (this->GetType() & type) != 0;
}
int32_t CGObject::IsExactlyA(OBJECT_TYPE_ID typeID) const {
return this->m_typeID == typeID;
}
CGObjectData* CGObject::Obj() const {
return this->m_obj;
}

View File

@ -31,6 +31,8 @@ class CGObject {
WOWGUID GetGUID() const;
OBJECT_TYPE GetType() const;
OBJECT_TYPE_ID GetTypeID() const;
int32_t IsA(OBJECT_TYPE type) const;
int32_t IsExactlyA(OBJECT_TYPE_ID typeID) const;
protected:
// Protected member variables

View File

@ -41,6 +41,14 @@ uint32_t CGPlayer::TotalRemoteFieldsSaved() {
return CGPlayer::GetBaseOffsetSaved() + 173;
}
uint32_t CGPlayer::GetNextLevelXP() const {
return this->Player()->nextLevelXP;
}
uint32_t CGPlayer::GetXP() const {
return this->Player()->xp;
}
CGPlayerData* CGPlayer::Player() const {
return this->m_player;
}

View File

@ -148,6 +148,10 @@ class CGPlayer {
static uint32_t TotalFieldsSaved();
static uint32_t TotalRemoteFieldsSaved();
// Public member functions
uint32_t GetNextLevelXP() const;
uint32_t GetXP() const;
protected:
// Protected member variables
CGPlayerData* m_player;

View File

@ -1,5 +1,6 @@
#include "object/client/CGPlayer_C.hpp"
#include "db/Db.hpp"
#include "object/client/ObjMgr.hpp"
#include "object/Types.hpp"
#include <storm/Error.hpp>
@ -11,6 +12,22 @@ CGPlayer_C::~CGPlayer_C() {
// TODO
}
uint32_t CGPlayer_C::GetActiveNextLevelXP() const {
if (this->GetGUID() != ClntObjMgrGetActivePlayer()) {
return 0;
}
return this->GetNextLevelXP();
}
uint32_t CGPlayer_C::GetActiveXP() const {
if (this->GetGUID() != ClntObjMgrGetActivePlayer()) {
return 0;
}
return this->GetXP();
}
void CGPlayer_C::PostInit(uint32_t time, const CClientObjCreate& init, bool a4) {
// TODO

View File

@ -15,6 +15,8 @@ class CGPlayer_C : public CGUnit_C, public CGPlayer {
// Public member functions
CGPlayer_C(uint32_t time, CClientObjCreate& objCreate);
uint32_t GetActiveNextLevelXP() const;
uint32_t GetActiveXP() const;
void PostInit(uint32_t time, const CClientObjCreate& init, bool a4);
void SetStorage(uint32_t* storage, uint32_t* saved);
};

View File

@ -173,11 +173,43 @@ int32_t Script_UnitPVPName(lua_State* L) {
}
int32_t Script_UnitXP(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
if (!lua_isstring(L, 1)) {
luaL_error(L, "Usage: UnitXP(\"unit\")");
return 0;
}
auto name = lua_tostring(L, 1);
auto unit = Script_GetUnitFromName(name);
float xp = 0.0f;
if (unit && unit->IsA(TYPE_PLAYER)) {
xp = static_cast<CGPlayer_C*>(unit)->GetActiveXP();
}
lua_pushnumber(L, xp);
return 1;
}
int32_t Script_UnitXPMax(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
if (!lua_isstring(L, 1)) {
luaL_error(L, "Usage: UnitXPMax(\"unit\")");
return 0;
}
auto name = lua_tostring(L, 1);
auto unit = Script_GetUnitFromName(name);
float xpMax = 0.0f;
if (unit && unit->IsA(TYPE_PLAYER)) {
xpMax = static_cast<CGPlayer_C*>(unit)->GetActiveNextLevelXP();
}
lua_pushnumber(L, xpMax);
return 1;
}
int32_t Script_UnitHealth(lua_State* L) {

View File

@ -12,6 +12,16 @@ bool ParseTrailingTokens(const char* token, WOWGUID& guid, CGPlayer_C* player) {
}
CGUnit_C* Script_GetUnitFromName(const char* name) {
WOWGUID guid;
if (!Script_GetGUIDFromToken(name, guid, false)) {
return nullptr;
}
return static_cast<CGUnit_C*>(ClntObjMgrObjectPtr(guid, TYPE_UNIT, __FILE__, __LINE__));
}
bool Script_GetGUIDFromString(const char*& token, WOWGUID& guid) {
// TODO
return true;

View File

@ -3,6 +3,10 @@
#include "util/GUID.hpp"
class CGUnit_C;
CGUnit_C* Script_GetUnitFromName(const char* name);
bool Script_GetGUIDFromString(const char*& token, WOWGUID& guid);
bool Script_GetGUIDFromToken(const char* token, WOWGUID& guid, bool defaultToTarget);