WIP playerlist
This commit is contained in:
parent
ecaa0505e5
commit
86c23c0f9e
@ -128,6 +128,7 @@ public:
|
||||
offset_t m_Collision;
|
||||
offset_t res_iTeam;
|
||||
offset_t res_iScore;
|
||||
offset_t res_bAlive;
|
||||
offset_t m_nChargeResistType;
|
||||
offset_t m_flChargeLevel;
|
||||
|
||||
|
@ -19,6 +19,10 @@ public:
|
||||
int GetTeam(int idx);
|
||||
int GetScore(int idx);
|
||||
|
||||
int getClass(int idx);
|
||||
int getTeam(int idx);
|
||||
bool isAlive(int idx);
|
||||
|
||||
int entity;
|
||||
};
|
||||
|
||||
|
@ -13,4 +13,6 @@ void init();
|
||||
void draw();
|
||||
bool handleSdlEvent(SDL_Event *event);
|
||||
|
||||
void onLevelLoad();
|
||||
|
||||
}
|
@ -39,7 +39,9 @@ public:
|
||||
*/
|
||||
void updatePlayerName(int id, const char *name);
|
||||
|
||||
void updatePlayerTeamClass(int id, int team, int classId);
|
||||
void updatePlayerTeam(int id, int team);
|
||||
|
||||
void updatePlayerClass(int id, int classId);
|
||||
|
||||
void updatePlayerLifeState(int id, bool dead);
|
||||
|
||||
|
@ -43,6 +43,8 @@ void NetVars::Init()
|
||||
{
|
||||
res_iTeam =
|
||||
gNetvars.get_offset("DT_TFPlayerResource", "baseclass", "m_iTeam");
|
||||
res_bAlive =
|
||||
gNetvars.get_offset("DT_TFPlayerResource", "baseclass", "m_bAlive");
|
||||
this->res_iMaxBuffedHealth =
|
||||
gNetvars.get_offset("DT_TFPlayerResource", "m_iMaxBuffedHealth");
|
||||
m_angEyeAngles = gNetvars.get_offset("DT_TFPlayer", "tfnonlocaldata",
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
#include <hacks/hacklist.hpp>
|
||||
#include <settings/Bool.hpp>
|
||||
#include <menu/GuiInterface.hpp>
|
||||
#include "HookedMethods.hpp"
|
||||
#include "MiscTemporary.hpp"
|
||||
#if !LAGBOT_MODE
|
||||
@ -61,6 +62,10 @@ DEFINE_HOOKED_METHOD(LevelInit, void, void *this_, const char *name)
|
||||
playerlist::Save();
|
||||
#endif
|
||||
#if ENABLE_VISUALS
|
||||
#if ENABLE_GUI
|
||||
gui::onLevelLoad();
|
||||
#endif
|
||||
|
||||
typedef bool (*LoadNamedSkys_Fn)(const char *);
|
||||
uintptr_t addr = gSignatures.GetEngineSignature(
|
||||
"55 89 E5 57 31 FF 56 8D B5 ? ? ? ? 53 81 EC 6C 01 00 00");
|
||||
|
@ -5,6 +5,8 @@
|
||||
* Author: nullifiedcat
|
||||
*/
|
||||
|
||||
#include <playerresource.h>
|
||||
|
||||
#include "common.hpp"
|
||||
|
||||
void TFPlayerResource::Update()
|
||||
@ -91,4 +93,34 @@ int TFPlayerResource::GetClass(CachedEntity *player)
|
||||
return *(int *) ((unsigned) ent + netvar.res_iPlayerClass + 4 * idx);
|
||||
}
|
||||
|
||||
TFPlayerResource *g_pPlayerResource = 0;
|
||||
bool TFPlayerResource::isAlive(int idx)
|
||||
{
|
||||
IClientEntity *ent = g_IEntityList->GetClientEntity(entity);
|
||||
if (!ent || ent->GetClientClass()->m_ClassID != RCC_PLAYERRESOURCE)
|
||||
return 0;
|
||||
if (idx >= 64 || idx < 0)
|
||||
return false;
|
||||
return *(bool *) ((unsigned) ent + netvar.res_bAlive + idx);
|
||||
}
|
||||
|
||||
int TFPlayerResource::getClass(int idx)
|
||||
{
|
||||
IClientEntity *ent = g_IEntityList->GetClientEntity(entity);
|
||||
if (!ent || ent->GetClientClass()->m_ClassID != RCC_PLAYERRESOURCE)
|
||||
return 0;
|
||||
if (idx >= 64 || idx < 0)
|
||||
return 0;
|
||||
return *(int *) ((unsigned) ent + netvar.res_iPlayerClass + 4 * idx);
|
||||
}
|
||||
|
||||
int TFPlayerResource::getTeam(int idx)
|
||||
{
|
||||
IClientEntity *ent = g_IEntityList->GetClientEntity(entity);
|
||||
if (!ent || ent->GetClientClass()->m_ClassID != RCC_PLAYERRESOURCE)
|
||||
return 0;
|
||||
if (idx >= 64 || idx < 0)
|
||||
return 0;
|
||||
return *(int *) ((unsigned) ent + netvar.res_iTeam + 4 * idx);
|
||||
}
|
||||
|
||||
TFPlayerResource *g_pPlayerResource{ nullptr };
|
||||
|
@ -6,11 +6,91 @@
|
||||
#include <menu/menu/Menu.hpp>
|
||||
#include <drawing.hpp>
|
||||
#include <menu/menu/special/SettingsManagerList.hpp>
|
||||
#include <menu/menu/special/PlayerListController.hpp>
|
||||
|
||||
static settings::Button open_gui_button{ "visual.open-gui-button", "Insert" };
|
||||
|
||||
static bool init_done{ false };
|
||||
|
||||
static std::unique_ptr<zerokernel::special::PlayerListController> controller{ nullptr };
|
||||
|
||||
static zerokernel::special::PlayerListData createPlayerListData(int userid)
|
||||
{
|
||||
zerokernel::special::PlayerListData data{};
|
||||
auto idx = g_IEngine->GetPlayerForUserID(userid);
|
||||
player_info_s info{};
|
||||
g_IEngine->GetPlayerInfo(idx, &info);
|
||||
data.classId = g_pPlayerResource->getClass(idx);
|
||||
data.teamId = g_pPlayerResource->getTeam(idx);
|
||||
data.dead = !g_pPlayerResource->isAlive(idx);
|
||||
data.steam = info.friendsID;
|
||||
strncpy(data.name, info.name, 31);
|
||||
return data;
|
||||
}
|
||||
|
||||
class PlayerListEventListener: public IGameEventListener
|
||||
{
|
||||
public:
|
||||
void FireGameEvent(KeyValues *event) override
|
||||
{
|
||||
if (!controller)
|
||||
return;
|
||||
|
||||
auto userid = event->GetInt("userid");
|
||||
if (!userid)
|
||||
return;
|
||||
|
||||
std::string name = event->GetName();
|
||||
if (name == "player_connect_client")
|
||||
{
|
||||
controller->addPlayer(userid, createPlayerListData(userid));
|
||||
}
|
||||
else if (name == "player_disconnect")
|
||||
{
|
||||
controller->removePlayer(userid);
|
||||
}
|
||||
else if (name == "player_team")
|
||||
{
|
||||
controller->updatePlayerTeam(userid, event->GetInt("team"));
|
||||
}
|
||||
else if (name == "player_changeclass")
|
||||
{
|
||||
controller->updatePlayerClass(userid, event->GetInt("class"));
|
||||
}
|
||||
else if (name == "player_changename")
|
||||
{
|
||||
controller->updatePlayerName(userid, event->GetString("newname"));
|
||||
}
|
||||
else if (name == "player_death")
|
||||
{
|
||||
controller->updatePlayerLifeState(userid, false);
|
||||
}
|
||||
else if (name == "player_spawn")
|
||||
{
|
||||
controller->updatePlayerLifeState(userid, true);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
static PlayerListEventListener listener{};
|
||||
|
||||
static void initPlayerlist()
|
||||
{
|
||||
auto pl = dynamic_cast<zerokernel::Table *>(zerokernel::Menu::instance->wm->getElementById("special-player-list"));
|
||||
if (pl)
|
||||
{
|
||||
controller = std::make_unique<zerokernel::special::PlayerListController>(*pl);
|
||||
controller->setKickButtonCallback([](int uid) {
|
||||
// TODO
|
||||
});
|
||||
controller->setOpenSteamCallback([](unsigned steam) {
|
||||
CSteamID id{};
|
||||
id.SetFromUint64((0b1000100000000000000000001 << 32) | steam);
|
||||
g_ISteamFriends->ActivateGameOverlayToUser("steamid", id);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
static void load()
|
||||
{
|
||||
zerokernel::Menu::instance->loadFromFile(DATA_PATH "/menu", "menu.xml");
|
||||
@ -22,7 +102,7 @@ static void load()
|
||||
list.construct();
|
||||
printf("SV found\n");
|
||||
}
|
||||
// FIXME add playerlist
|
||||
initPlayerlist();
|
||||
|
||||
zerokernel::Menu::instance->update();
|
||||
zerokernel::Menu::instance->setInGame(true);
|
||||
@ -32,9 +112,12 @@ static CatCommand reload("gui_reload", "Reload", []() {
|
||||
load();
|
||||
});
|
||||
|
||||
|
||||
|
||||
void gui::init()
|
||||
{
|
||||
zerokernel::Menu::init(draw::width, draw::height);
|
||||
g_IGameEventManager->AddListener(&listener, false);
|
||||
|
||||
load();
|
||||
|
||||
@ -66,3 +149,11 @@ bool gui::handleSdlEvent(SDL_Event *event)
|
||||
return zerokernel::Menu::instance->handleSdlEvent(event) && !zerokernel::Menu::instance->isInGame();
|
||||
}
|
||||
|
||||
void gui::onLevelLoad()
|
||||
{
|
||||
if (controller)
|
||||
{
|
||||
controller->removeAll();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -6,6 +6,8 @@
|
||||
#include <settings/Registered.hpp>
|
||||
#include <menu/object/container/TData.hpp>
|
||||
#include <menu/Message.hpp>
|
||||
#include <menu/menu/special/PlayerListController.hpp>
|
||||
|
||||
|
||||
/*
|
||||
Created on 26.07.18.
|
||||
@ -120,11 +122,11 @@ void zerokernel::special::PlayerListController::updatePlayerLifeState(int id,
|
||||
});
|
||||
}
|
||||
|
||||
void zerokernel::special::PlayerListController::updatePlayerTeamClass(int id,
|
||||
int team,
|
||||
int classId)
|
||||
|
||||
void
|
||||
zerokernel::special::PlayerListController::updatePlayerTeam(int id, int team)
|
||||
{
|
||||
table.iterateObjects([this, id, team, classId](BaseMenuObject *a) {
|
||||
table.iterateObjects([this, id, team](BaseMenuObject *a) {
|
||||
auto row = dynamic_cast<TRow *>(a);
|
||||
// Shouldn't happen
|
||||
if (row == nullptr)
|
||||
@ -132,6 +134,21 @@ void zerokernel::special::PlayerListController::updatePlayerTeamClass(int id,
|
||||
if ((int)row->kv["player_id"] == id)
|
||||
{
|
||||
row->kv["player_team"] = team;
|
||||
updateRow(row);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
void zerokernel::special::PlayerListController::updatePlayerClass(int id, int classId)
|
||||
{
|
||||
table.iterateObjects([this, id, classId](BaseMenuObject *a) {
|
||||
auto row = dynamic_cast<TRow *>(a);
|
||||
// Shouldn't happen
|
||||
if (row == nullptr)
|
||||
return;
|
||||
if ((int)row->kv["player_id"] == id)
|
||||
{
|
||||
row->kv["player_class"] = classId;
|
||||
updateRow(row);
|
||||
}
|
||||
@ -227,4 +244,4 @@ void zerokernel::special::PlayerListController::updateRow(zerokernel::TRow *row)
|
||||
{
|
||||
el->set(class_names[classId]);
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user