amxmodx/modules/cstrike/cstrike/CstrikePlayer.h
Vincent Herbet 115916d753 Add basic ReHLDS and ReGameDLL support (#417)
* Add ReHLDS API files and its dependencies

Note: This has been stolen from ReAPI AMXX module and modified/adjusted to match AMXX existing includes and to provide as less dependencies as possible as well

* Add the necessary files to get ReHLDS interface

* Split SV_DropClient into pre/post code

* Init ReHLDS API and add SV_DropClient hook

* Add Cvar_DirectSet hook and adjust code with helpers

Note: we don't need to split code here. This is pretty much the naive and straight way, but fairly enough for our case. If it happens we got a lot more hooks, we may consider to use some class to manage better the things.

* Move platform and interface stuff in their own files in public directory

* Make sure to init cvar stuff after ReHLDS

* Add ReGameDLL API files and its dependencies in cstrike module

* Init ReHLDS in cstrike module and adjust code

Note: About cs_uset_set_model(). ReHLDS API doesn't offer a way to know directly the precached models, so instead of looping through all the ressources, the models list is saved one time at map change into a hashmap.

* Init ReGameDLL and adjust code

* Fix linux compilation

* Init ReGameDLL in fakemeta module and adjust code

* Rename /reapi directory to /resdk to avoid confusion

* Retrieve gamerules pointer through InstallGameRules in fakemeta module

* Retrieve gamerules pointer through InstallGameRules in cstrike module

Note: actually gamerules is not used if regamedll is enabled, but it could be used in future natives.

* Fix a typo when ReGameDLL is not enabled

* Fix missing interface check for ReHLDS.

I'm pretty sure I was checking at the very first since I worked first on vanilla version of engine, looks like change has been lost.
2017-03-09 19:59:38 +01:00

148 lines
2.6 KiB
C++

// vim: set ts=4 sw=4 tw=99 noet:
//
// AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO").
// Copyright (C) The AMX Mod X Development Team.
//
// This software is licensed under the GNU General Public License, version 3 or higher.
// Additional exceptions apply. For full license details, see LICENSE.txt or visit:
// https://alliedmods.net/amxmodx-license
//
// Counter-Strike Module
//
#ifndef _CSTRIKE_PLAYER_H_
#define _CSTRIKE_PLAYER_H_
#include <amxxmodule.h>
#include "CstrikeUtils.h"
#include "CstrikeHacks.h"
#include <amtl/am-vector.h>
#include <resdk/mod_rehlds_api.h>
extern ke::Vector<int> ModelsUpdateQueue;
void StartFrame();
void ClientUserInfoChanged(edict_t *pEntity, char *infobuffer);
void SetClientKeyValue(int clientIndex, char *infobuffer, const char *key, const char *value);
class CPlayer
{
public:
CPlayer()
{
ResetModel();
ResetZoom();
}
bool HasModel(const char *model = nullptr)
{
if (*m_Model != '\0')
{
if (model && *model)
{
return strcmp(m_Model, model) != 0;
}
return true;
}
return false;
}
void SetModel(const char* modelIn)
{
if (modelIn && *modelIn)
{
strncopy(m_Model, modelIn, sizeof(m_Model));
}
else
{
ResetModel();
}
}
void ResetModel(edict_t *pPlayer = nullptr)
{
*m_Model = '\0';
if (pPlayer)
{
MDLL_ClientUserInfoChanged(pPlayer, GETINFOKEYBUFFER(pPlayer));
PostponeModelUpdate(TypeConversion.edict_to_id(pPlayer) - 1);
}
}
void UpdateModel(edict_t *pPlayer)
{
if (!HasModel())
{
return;
}
char *infobuffer = GETINFOKEYBUFFER(pPlayer);
if (strcmp(GETCLIENTKEYVALUE(infobuffer, "model"), m_Model) != 0)
{
int index = TypeConversion.edict_to_id(pPlayer);
SETCLIENTKEYVALUE(index, infobuffer, "model", m_Model);
PostponeModelUpdate(index - 1);
}
}
int GetZoom()
{
return m_Zooming;
}
void SetZoom(int value)
{
m_Zooming = value;
}
void ResetZoom()
{
m_Zooming = 0;
}
private:
void PostponeModelUpdate(int index)
{
if (!g_pFunctionTable->pfnStartFrame)
{
g_pFunctionTable->pfnStartFrame = StartFrame;
g_pFunctionTable->pfnClientUserInfoChanged = ClientUserInfoChanged;
g_pengfuncsTable->pfnSetClientKeyValue = SetClientKeyValue;
}
if (HasReHlds)
{
return;
}
if (!ServerStatic)
{
MF_Log("Postponing of model update disabled, check your gamedata files");
return;
}
ServerStatic->clients[index].sendinfo = false;
ModelsUpdateQueue.append(index);
}
private:
char m_Model[32];
int m_Zooming;
};
extern CPlayer Players[33];
#endif // _CSTRIKE_PLAYER_H_