Compare commits

...

5 Commits

Author SHA1 Message Date
fallenoak
184d3b041f
feat(ui): implement Script_UnitIsPlayer
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-01 13:05:52 -06:00
fallenoak
bc3b469266
feat(ui): add Script_GetGUIDFromToken 2026-02-01 13:05:32 -06:00
fallenoak
f5171c0c6c
feat(ui): add CGGameUI::IsRaidMember 2026-02-01 13:04:37 -06:00
fallenoak
1891bdc5ea
feat(object): add player class to object client header 2026-02-01 13:04:16 -06:00
fallenoak
e7abae1102
feat(object): add CGObject::GetGUID 2026-02-01 13:03:52 -06:00
8 changed files with 198 additions and 1 deletions

View File

@ -1,6 +1,7 @@
#ifndef OBJECT_CLIENT_HPP
#define OBJECT_CLIENT_HPP
#include "client/CGPlayer_C.hpp"
#include "client/ObjMgr.hpp"
#include "object/Types.hpp"

View File

@ -23,3 +23,7 @@ uint32_t CGObject::TotalFields() {
uint32_t CGObject::TotalFieldsSaved() {
return CGObject::GetBaseOffsetSaved() + 3;
}
WOWGUID CGObject::GetGUID() const {
return this->m_obj->m_guid;
}

View File

@ -29,6 +29,9 @@ class CGObject {
uint32_t* m_objSaved;
uint32_t m_memHandle;
OBJECT_TYPE_ID m_typeID;
// Public member functions
WOWGUID GetGUID() const;
};
#endif

View File

@ -149,6 +149,12 @@ void CGGameUI::InitializeGame() {
// TODO
}
int32_t CGGameUI::IsRaidMember(const WOWGUID& guid) {
// TODO
return false;
}
void CGGameUI::RegisterFrameFactories() {
FrameXML_RegisterFactory("WorldFrame", &CGWorldFrame::Create, true);
FrameXML_RegisterFactory("GameTooltip", &CGTooltip::Create, false);

View File

@ -16,6 +16,7 @@ class CGGameUI {
static WOWGUID& GetLockedTarget();
static void Initialize();
static void InitializeGame();
static int32_t IsRaidMember(const WOWGUID& guid);
static void RegisterFrameFactories();
private:

View File

@ -1,6 +1,11 @@
#include "ui/game/ScriptEvents.hpp"
#include "object/client/ObjMgr.hpp"
#include "ui/FrameScript.hpp"
#include "ui/ScriptFunctionsSystem.hpp"
#include "ui/game/CGGameUI.hpp"
#include "ui/game/ScriptUtil.hpp"
#include "util/GUID.hpp"
#include "util/Lua.hpp"
#include "util/Unimplemented.hpp"
namespace {
@ -18,7 +23,19 @@ int32_t Script_UnitIsUnit(lua_State* L) {
}
int32_t Script_UnitIsPlayer(lua_State* L) {
WHOA_UNIMPLEMENTED(0);
auto token = lua_tostring(L, 1);
WOWGUID guid = 0;
Script_GetGUIDFromToken(token, guid, false);
auto object = ClntObjMgrObjectPtr(guid, TYPE_PLAYER, __FILE__, __LINE__);
if (object || CGGameUI::IsRaidMember(guid)) {
lua_pushnumber(L, 1.0);
} else {
lua_pushnil(L);
}
return 1;
}
int32_t Script_UnitIsInMyGuild(lua_State* L) {

157
src/ui/game/ScriptUtil.cpp Normal file
View File

@ -0,0 +1,157 @@
#include "ui/game/ScriptUtil.hpp"
#include "object/Client.hpp"
#include "ui/game/CGGameUI.hpp"
#include <storm/String.hpp>
bool Script_GetGUIDFromToken(const char* token, WOWGUID& guid, bool defaultToTarget) {
auto activePlayer = static_cast<CGPlayer_C*>(ClntObjMgrObjectPtr(ClntObjMgrGetActivePlayer(), TYPE_PLAYER, __FILE__, __LINE__));
// Null or empty token
if (token == nullptr || *token == '\0') {
if (defaultToTarget) {
guid = CGGameUI::GetLockedTarget();
return true;
}
return false;
}
guid = 0;
auto parseToken = token;
// player - active player
if (!SStrCmpI(parseToken, "player", 6)) {
parseToken += 6;
if (activePlayer) {
guid = activePlayer->GetGUID();
}
}
// vehicle - active player's vehicle
else if (!SStrCmpI(parseToken, "vehicle", 7)) {
parseToken += 7;
// TODO
}
// pet - active player's pet
else if (!SStrCmpI(parseToken, "pet", 3)) {
parseToken += 3;
// TODO
}
// target - current locked target
else if (!SStrCmpI(parseToken, "target", 6)) {
parseToken += 6;
guid = CGGameUI::GetLockedTarget();
}
// partypet1-4 - party member's pet
else if (!SStrCmpI(parseToken, "partypet", 8)) {
parseToken += 8;
auto index = SStrToUnsigned(parseToken);
// TODO
}
// party1-4 - party member
else if (!SStrCmpI(parseToken, "party", 5)) {
parseToken += 5;
auto index = SStrToUnsigned(parseToken);
// TODO
}
// raidpet1-40 - raid member's pet
else if (!SStrCmpI(parseToken, "raidpet", 7)) {
parseToken += 7;
auto index = SStrToUnsigned(parseToken);
// TODO
}
// raid1-40 - raid member
else if (!SStrCmpI(parseToken, "raid", 4)) {
parseToken += 4;
auto index = SStrToUnsigned(parseToken);
// TODO
}
// boss1-5 - boss unit
else if (!SStrCmpI(parseToken, "boss", 4)) {
parseToken += 4;
auto index = SStrToUnsigned(parseToken);
// TODO
}
// arenapet1-5 - arena opponent's pet
else if (!SStrCmpI(parseToken, "arenapet", 8)) {
parseToken += 8;
auto index = SStrToUnsigned(parseToken);
// TODO
}
// arena1-5 - arena opponent
else if (!SStrCmpI(parseToken, "arena", 5)) {
parseToken += 5;
auto index = SStrToUnsigned(parseToken);
// TODO
}
// commentator1-N - commentator arena member
else if (!SStrCmpI(parseToken, "commentator", 11)) {
parseToken += 11;
auto index = SStrToUnsigned(parseToken);
// TODO
}
// mouseover - object under cursor
else if (!SStrCmpI(parseToken, "mouseover", 9)) {
parseToken += 9;
// TODO
}
// focus - focus target
else if (!SStrCmpI(parseToken, "focus", 5)) {
parseToken += 5;
// TODO
}
// npc - NPC interaction target
else if (!SStrCmpI(parseToken, "npc")) {
parseToken += 3;
// TODO
}
// questnpc - quest giver NPC
else if (!SStrCmpI(parseToken, "questnpc")) {
parseToken += 8;
// TODO
}
// none
else if (!SStrCmpI(parseToken, "none")) {
parseToken += 4;
guid = -1;
}
// TODO ParseTrailingTokens
// TODO Script_GetGUIDFromString
// TODO guid -2
return false;
}

View File

@ -0,0 +1,8 @@
#ifndef UI_GAME_SCRIPT_UTIL_HPP
#define UI_GAME_SCRIPT_UTIL_HPP
#include "util/GUID.hpp"
bool Script_GetGUIDFromToken(const char* token, WOWGUID& guid, bool defaultToTarget);
#endif