2
0
mirror of https://github.com/rehlds/rehlds.git synced 2024-12-27 07:05:43 +03:00

Fixed GCC compilation warnings/errors

Fixes #1032
This commit is contained in:
s1lentq 2024-05-30 19:15:39 +07:00
parent c1ccc5009a
commit 9c1e84328e
4 changed files with 283 additions and 282 deletions

View File

@ -375,7 +375,8 @@ void EXT_FUNC SV_ClientPrintf_internal(const char *Dest)
{
char string[1024];
Q_strlcpy(string, Dest, min(strlen(Dest) + 1, sizeof(string)));
Q_strlcpy(string, Dest);
MSG_WriteByte(&host_client->netchan.message, svc_print);
MSG_WriteString(&host_client->netchan.message, string);
}

View File

@ -69,7 +69,7 @@ public:
/**
* @brief Data types for message data
*/
enum class DataType : uint8_t
enum class DataType : uint8
{
Any, // Any part of the message
Dest, // Destination of the message

View File

@ -18,6 +18,284 @@
#include "precompiled.h"
/**
* @brief Implementation interface for defining message parameters and behavior for a game message object
*/
class MessageImpl: public IMessage
{
public:
MessageImpl();
~MessageImpl() = default;
/**
* @brief Returns the number of parameters in the message
* @return The number of parameters
*/
int getParamCount() const { return m_paramCount; }
/**
* @brief Returns the type of the parameter at the given index
* @param index The index of the parameter
* @return The type of the parameter
*/
ParamType getParamType(size_t index) const { return m_params[index].type; }
/**
* @brief Returns the integer value of the parameter at the given index
* @param index The index of the parameter
* @return The integer value of the parameter
*/
int getParamInt(size_t index) const;
/**
* @brief Returns the float value of the parameter at the given index
* @param index The index of the parameter
* @return The float value of the parameter
*/
float getParamFloat(size_t index) const;
/**
* @brief Returns the string value of the parameter at the given index
* @param index The index of the parameter
* @return The string value of the parameter
*/
const char *getParamString(size_t index) const;
/**
* @brief Sets the integer value of the parameter at the given index
* @param index The index of the parameter
* @param value The integer value to set
*/
void setParamInt(size_t index, int value);
/**
* @brief Returns the original integer value of the parameter at the given index before any modifications
* @param index The index of the parameter
* @return The original integer value of the parameter
*/
int getOriginalParamInt(size_t index) const;
/**
* @brief Returns the original float value of the parameter at the given index before any modifications
* @param index The index of the parameter
* @return The original float value of the parameter
*/
float getOriginalParamFloat(size_t index) const;
/**
* @brief Returns the original string value of the parameter at the given index before any modifications
* @param index The index of the parameter
* @return The original string value of the parameter
*/
const char* getOriginalParamString(size_t index) const;
/**
* @brief Sets the float value of the parameter at the given index
* @param index The index of the parameter
* @param value The float value to set
*/
void setParamFloat(size_t index, float value);
/**
* @brief Sets the vector value of the parameter at the given index
* @param index The index of the parameter
* @param pos The vector value to set
*/
void setParamVec(size_t index, const float *pos);
/**
* @brief Sets the string value of the parameter at the given index
* @param index The index of the parameter
* @param string The string value to set
*/
void setParamString(size_t index, const char *string);
/**
* @brief Sets the destination of the message
*/
void setDest(Dest dest);
/**
* @brief Returns the destination of the message
* @return The destination of the message
*/
Dest getDest() const { return m_Storage[BACK].dest; }
Dest getOriginalDest() const { return m_Storage[FRONT].dest; }
/**
* @brief Sets the index of the message
*/
void setId(int msg_id);
/**
* @brief Returns the index of the message
* @return The index of the message
*/
int getId() const { return m_Storage[BACK].msgid; }
int getOriginalId() const { return m_Storage[FRONT].msgid; }
/**
* @brief Sets the origin of the message
*/
void setOrigin(const float *origin);
/**
* @brief Returns the origin of the message
* @return The origin of the message
*/
const float *getOrigin() const { return m_Storage[BACK].origin; }
const float *getOriginalOrigin() const { return m_Storage[FRONT].origin; }
/**
* @brief Sets the edict associated with the message
*/
void setEdict(edict_t *pEdict);
/**
* @brief Returns the edict associated with the message
* @return The edict associated with the message
*/
edict_t *getEdict() const { return m_Storage[BACK].edict; }
edict_t *getOriginalEdict() const { return m_Storage[FRONT].edict; }
/**
* @brief Checks if the specified type of message data has been modified
*
* This function allows you to check if any part of the message data, such as its
* destination, type, origin, edict, or any specific parameter, has been modified
*
* @param type The type of the data to check for modification
* This can be one of the following:
* - DataType::Any: Check if any part of the message has been modified
* - DataType::Dest: Check if the destination has been modified
* - DataType::Index: Check if the message ID has been modified
* - DataType::Origin: Check if the origin has been modified
* - DataType::Edict: Check if the edict pointer has been modified
* - DataType::Param: Check if a specific parameter has been modified
*
* @param index The index of the parameter to check for modification (used only when type is DataType::Param)
* Default value is -1, which means the parameter index is not applicable
*
* @return True if the specified data type has been modified, false otherwise
*/
bool isDataModified(DataType type, size_t index) const;
/**
* @brief Resets a specific type of message data to its original value
*
* @param type The type of data to reset to its original value
* This can be one of the following:
* - DataType::Any: Reset all modified message data to its original values
* - DataType::Dest: Reset the destination to its original value
* - DataType::Index: Reset the message ID to its original value
* - DataType::Origin: Reset the origin to its original value
* - DataType::Edict: Reset the edict pointer of the recipient client to its original value
* - DataType::Param: Reset a specific parameter to its original value
*
* @param index The index of the parameter to reset (used only when type is DataType::Param)
* Default value is -1, which means the parameter index is not applicable
*
* @return True if the modified data type was reset, false otherwise
*/
bool resetModifiedData(DataType type, size_t index = -1);
private:
friend class MessageManagerImpl;
// Sets the active state of the message with the given parameters
void setActive(int dest, int id, const float *origin, edict_t *edict);
// Sets the buffer for the message
void setBuffer(sizebuf_t *pbuf);
// Set the copyback buffer for the message
void setCopybackBuffer(sizebuf_t *pbuf);
// Adds a parameter to the message
void addParam(IMessage::ParamType type, size_t length);
// Clears the message after execution
void clear();
template <typename T>
void setParamPrimitive(size_t index, T value);
// Transforms buffer after sets string for a parameter at the given index
void setTxformBuffer(size_t index, size_t startPos, size_t oldLength, size_t newLength);
enum
{
FRONT, // Original buffer storage data
BACK, // Current modifiable buffer storage data
MAX_STORAGE
};
struct Storage_t
{
// The buffer storage data for the message 'm_buffer' (variable-length message limited to one byte is 256)
uint8 bufData[256]{};
// The buffer for the message
sizebuf_t buf = { "MsgMngr/Begin/End", SIZEBUF_ALLOW_OVERFLOW, bufData, sizeof(bufData), 0 };
// The destination of the message
Dest dest{};
// The index of the message
int msgid{0};
// The origin of the message
float origin[3]{0,0,0};
// The edict associated with the message
edict_t *edict{nullptr};
};
Storage_t m_Storage[MAX_STORAGE];
#pragma pack(push, 1)
struct Param_t
{
bool modified : 1; // Flag indicating whether the message param has been modified
ParamType type : 3; // The type of the parameter
size_t posBack : 9; // The current position of the parameter in the buffer
size_t posFront : 9; // The stock position of the parameter in the buffer
size_t oldlen : 9; // The length of the parameter in the buffer
size_t newlen : 9; // The length of the parameter in the buffer
};
#pragma pack(pop)
static const size_t MAX_PARAMS = 16; // The maximum number of parameters allowed in the message
Param_t m_params[MAX_PARAMS]{}; // The array of parameters in the message
size_t m_paramCount : 4; // The number of parameters in the message
void resetParam(size_t index);
void setModifiedDataBit(DataType type);
void unsetModifiedDataBit(DataType type);
bool isDataTypeModified(DataType type) const;
uint8 m_modifiedDataBits : static_cast<uint8>(DataType::Max);
};
/**
* Inline methods
*/
inline void MessageImpl::setModifiedDataBit(DataType type)
{
m_modifiedDataBits |= ((1 << static_cast<int>(DataType::Any)) | (1 << static_cast<int>(type)));
}
inline void MessageImpl::unsetModifiedDataBit(DataType type)
{
m_modifiedDataBits &= ~((1 << static_cast<int>(DataType::Any)) | (1 << static_cast<int>(type)));
}
inline bool MessageImpl::isDataTypeModified(DataType type) const
{
return (m_modifiedDataBits & (1 << static_cast<int>(type))) != 0;
}
// Constructs a Message object
MessageImpl::MessageImpl()
{

View File

@ -24,284 +24,6 @@
#include <memory> // std::unique_ptr
#include <algorithm> // std::move
/**
* @brief Implementation interface for defining message parameters and behavior for a game message object
*/
class MessageImpl: public IMessage
{
public:
MessageImpl();
~MessageImpl() = default;
/**
* @brief Returns the number of parameters in the message
* @return The number of parameters
*/
int getParamCount() const { return m_paramCount; }
/**
* @brief Returns the type of the parameter at the given index
* @param index The index of the parameter
* @return The type of the parameter
*/
ParamType getParamType(size_t index) const { return m_params[index].type; }
/**
* @brief Returns the integer value of the parameter at the given index
* @param index The index of the parameter
* @return The integer value of the parameter
*/
int getParamInt(size_t index) const;
/**
* @brief Returns the float value of the parameter at the given index
* @param index The index of the parameter
* @return The float value of the parameter
*/
float getParamFloat(size_t index) const;
/**
* @brief Returns the string value of the parameter at the given index
* @param index The index of the parameter
* @return The string value of the parameter
*/
const char *getParamString(size_t index) const;
/**
* @brief Sets the integer value of the parameter at the given index
* @param index The index of the parameter
* @param value The integer value to set
*/
void setParamInt(size_t index, int value);
/**
* @brief Returns the original integer value of the parameter at the given index before any modifications
* @param index The index of the parameter
* @return The original integer value of the parameter
*/
int getOriginalParamInt(size_t index) const;
/**
* @brief Returns the original float value of the parameter at the given index before any modifications
* @param index The index of the parameter
* @return The original float value of the parameter
*/
float getOriginalParamFloat(size_t index) const;
/**
* @brief Returns the original string value of the parameter at the given index before any modifications
* @param index The index of the parameter
* @return The original string value of the parameter
*/
const char* getOriginalParamString(size_t index) const;
/**
* @brief Sets the float value of the parameter at the given index
* @param index The index of the parameter
* @param value The float value to set
*/
void setParamFloat(size_t index, float value);
/**
* @brief Sets the vector value of the parameter at the given index
* @param index The index of the parameter
* @param pos The vector value to set
*/
void setParamVec(size_t index, const float *pos);
/**
* @brief Sets the string value of the parameter at the given index
* @param index The index of the parameter
* @param string The string value to set
*/
void setParamString(size_t index, const char *string);
/**
* @brief Sets the destination of the message
*/
void setDest(Dest dest);
/**
* @brief Returns the destination of the message
* @return The destination of the message
*/
Dest getDest() const { return m_Storage[BACK].dest; }
Dest getOriginalDest() const { return m_Storage[FRONT].dest; }
/**
* @brief Sets the index of the message
*/
void setId(int msg_id);
/**
* @brief Returns the index of the message
* @return The index of the message
*/
int getId() const { return m_Storage[BACK].msgid; }
int getOriginalId() const { return m_Storage[FRONT].msgid; }
/**
* @brief Sets the origin of the message
*/
void setOrigin(const float *origin);
/**
* @brief Returns the origin of the message
* @return The origin of the message
*/
const float *getOrigin() const { return m_Storage[BACK].origin; }
const float *getOriginalOrigin() const { return m_Storage[FRONT].origin; }
/**
* @brief Sets the edict associated with the message
*/
void setEdict(edict_t *pEdict);
/**
* @brief Returns the edict associated with the message
* @return The edict associated with the message
*/
edict_t *getEdict() const { return m_Storage[BACK].edict; }
edict_t *getOriginalEdict() const { return m_Storage[FRONT].edict; }
/**
* @brief Checks if the specified type of message data has been modified
*
* This function allows you to check if any part of the message data, such as its
* destination, type, origin, edict, or any specific parameter, has been modified
*
* @param type The type of the data to check for modification
* This can be one of the following:
* - DataType::Any: Check if any part of the message has been modified
* - DataType::Dest: Check if the destination has been modified
* - DataType::Index: Check if the message ID has been modified
* - DataType::Origin: Check if the origin has been modified
* - DataType::Edict: Check if the edict pointer has been modified
* - DataType::Param: Check if a specific parameter has been modified
*
* @param index The index of the parameter to check for modification (used only when type is DataType::Param)
* Default value is -1, which means the parameter index is not applicable
*
* @return True if the specified data type has been modified, false otherwise
*/
bool isDataModified(DataType type, size_t index) const;
/**
* @brief Resets a specific type of message data to its original value
*
* @param type The type of data to reset to its original value
* This can be one of the following:
* - DataType::Any: Reset all modified message data to its original values
* - DataType::Dest: Reset the destination to its original value
* - DataType::Index: Reset the message ID to its original value
* - DataType::Origin: Reset the origin to its original value
* - DataType::Edict: Reset the edict pointer of the recipient client to its original value
* - DataType::Param: Reset a specific parameter to its original value
*
* @param index The index of the parameter to reset (used only when type is DataType::Param)
* Default value is -1, which means the parameter index is not applicable
*
* @return True if the modified data type was reset, false otherwise
*/
bool resetModifiedData(DataType type, size_t index = -1);
private:
friend class MessageManagerImpl;
// Sets the active state of the message with the given parameters
void setActive(int dest, int id, const float *origin, edict_t *edict);
// Sets the buffer for the message
void setBuffer(sizebuf_t *pbuf);
// Set the copyback buffer for the message
void setCopybackBuffer(sizebuf_t *pbuf);
// Adds a parameter to the message
void addParam(IMessage::ParamType type, size_t length);
// Clears the message after execution
void clear();
template <typename T>
void setParamPrimitive(size_t index, T value);
// Transforms buffer after sets string for a parameter at the given index
void setTxformBuffer(size_t index, size_t startPos, size_t oldLength, size_t newLength);
enum
{
FRONT, // Original buffer storage data
BACK, // Current modifiable buffer storage data
MAX_STORAGE
};
struct Storage_t
{
// The buffer storage data for the message 'm_buffer' (variable-length message limited to one byte is 256)
uint8_t bufData[256]{};
// The buffer for the message
sizebuf_t buf = { "MsgMngr/Begin/End", SIZEBUF_ALLOW_OVERFLOW, bufData, sizeof(bufData), 0 };
// The destination of the message
Dest dest{};
// The index of the message
int msgid{0};
// The origin of the message
float origin[3]{0,0,0};
// The edict associated with the message
edict_t *edict{nullptr};
};
Storage_t m_Storage[MAX_STORAGE];
#pragma pack(push, 1)
struct Param_t
{
bool modified : 1; // Flag indicating whether the message param has been modified
ParamType type : 3; // The type of the parameter
size_t posBack : 9; // The current position of the parameter in the buffer
size_t posFront : 9; // The stock position of the parameter in the buffer
size_t oldlen : 9; // The length of the parameter in the buffer
size_t newlen : 9; // The length of the parameter in the buffer
};
#pragma pack(pop)
static const size_t MAX_PARAMS = 16; // The maximum number of parameters allowed in the message
Param_t m_params[MAX_PARAMS]{}; // The array of parameters in the message
size_t m_paramCount : 4; // The number of parameters in the message
void resetParam(size_t index);
void setModifiedDataBit(DataType type);
void unsetModifiedDataBit(DataType type);
bool isDataTypeModified(DataType type) const;
uint8 m_modifiedDataBits : DataType::Max;
};
/**
* Inline methods
*/
inline void MessageImpl::setModifiedDataBit(DataType type)
{
m_modifiedDataBits |= ((1 << static_cast<int>(DataType::Any)) | (1 << static_cast<int>(type)));
}
inline void MessageImpl::unsetModifiedDataBit(DataType type)
{
m_modifiedDataBits &= ~((1 << static_cast<int>(DataType::Any)) | (1 << static_cast<int>(type)));
}
inline bool MessageImpl::isDataTypeModified(DataType type) const
{
return (m_modifiedDataBits & (1 << static_cast<int>(type))) != 0;
}
/**
* @brief Implementation interface manages hooks and blocking behavior game messages
*/
@ -446,8 +168,8 @@ private:
};
static const size_t MAX_MSGSTACK = 16; // The maximum size of the message stack, 16 it should be enough
MessagePool<MessageImpl, MAX_MSGSTACK> m_pool; // A fixed-size memory pool stack for reusable
MessageStack<MessageImpl, MAX_MSGSTACK> m_stack;
MessagePool<class MessageImpl, MAX_MSGSTACK> m_pool; // A fixed-size memory pool stack for reusable
MessageStack<class MessageImpl, MAX_MSGSTACK> m_stack;
using HookRegistry_t = IVoidHookChainRegistryImpl<IMessage *>;
HookRegistry_t *m_hooks[MAX_USERMESSAGES]{};