Cstrike: cs_set_user_zoom - Use a more event-based approach when mode is 0

This commit is contained in:
Arkshine 2015-07-05 18:10:57 +02:00
parent 63a0910f5b
commit aedde87f42
10 changed files with 209 additions and 90 deletions

View File

@ -14,6 +14,7 @@ binary.sources = [
'CstrikeNatives.cpp', 'CstrikeNatives.cpp',
'CstrikeHacks.cpp', 'CstrikeHacks.cpp',
'CstrikeUtils.cpp', 'CstrikeUtils.cpp',
'CstrikeUserMessages.cpp',
'CstrikeHLTypeConversion.cpp', 'CstrikeHLTypeConversion.cpp',
'../../../public/memtools/MemoryUtils.cpp', '../../../public/memtools/MemoryUtils.cpp',
'../../../public/memtools/CDetour/detours.cpp', '../../../public/memtools/CDetour/detours.cpp',

View File

@ -23,15 +23,6 @@ void ShutdownHacks();
void ToggleDetour_ClientCommands(bool enable); void ToggleDetour_ClientCommands(bool enable);
void ToggleDetour_BuyCommands(bool enable); void ToggleDetour_BuyCommands(bool enable);
extern int MessageIdArmorType;
extern int MessageIdMoney;
extern int MessageIdResetHUD;
extern int MessageIdScoreAttrib;
extern int MessageIdScoreInfo;
extern int MessageIdStatusIcon;
extern int MessageIdTeamInfo;
extern int MessageIdTextMsg;
extern AMX_NATIVE_INFO CstrikeNatives[]; extern AMX_NATIVE_INFO CstrikeNatives[];
extern IGameConfig *MainConfig; extern IGameConfig *MainConfig;

View File

@ -15,23 +15,15 @@
#include "CstrikePlayer.h" #include "CstrikePlayer.h"
#include "CstrikeUtils.h" #include "CstrikeUtils.h"
#include "CstrikeHacks.h" #include "CstrikeHacks.h"
#include "CstrikeUserMessages.h"
#include "CstrikeHLTypeConversion.h" #include "CstrikeHLTypeConversion.h"
#include <CDetour/detours.h> #include <CDetour/detours.h>
CCstrikePlayer g_players[33]; CCstrikePlayer g_players[33];
int g_zooming[33] = {0}; int Zooming[33];
bool NoKifesMode = false; bool NoKifesMode = false;
int MessageIdArmorType;
int MessageIdMoney;
int MessageIdResetHUD;
int MessageIdScoreAttrib;
int MessageIdScoreInfo;
int MessageIdStatusIcon;
int MessageIdTeamInfo;
int MessageIdTextMsg;
// native cs_set_user_money(index, money, flash = 1); // native cs_set_user_money(index, money, flash = 1);
static cell AMX_NATIVE_CALL cs_set_user_money(AMX *amx, cell *params) static cell AMX_NATIVE_CALL cs_set_user_money(AMX *amx, cell *params)
{ {
@ -879,6 +871,8 @@ static cell AMX_NATIVE_CALL cs_set_user_model(AMX *amx, cell *params)
g_players[index].SetModel(modelName); g_players[index].SetModel(modelName);
g_players[index].SetModelled(true); g_players[index].SetModelled(true);
EnableMessageHooks();
SETCLIENTKEYVALUE(index, GETINFOKEYBUFFER(pPlayer), "model", const_cast<char*>(g_players[index].GetModel())); SETCLIENTKEYVALUE(index, GETINFOKEYBUFFER(pPlayer), "model", const_cast<char*>(g_players[index].GetModel()));
return 1; return 1;
@ -1323,7 +1317,7 @@ static cell AMX_NATIVE_CALL cs_set_user_zoom(AMX *amx, cell *params)
int mode = params[3]; int mode = params[3];
int weapon = *static_cast<int *>(MF_PlayerPropAddr(index, Player_CurrentWeapon)); int weapon = *static_cast<int *>(MF_PlayerPropAddr(index, Player_CurrentWeapon));
g_zooming[index] = 0; Zooming[index] = 0;
if (type == CS_RESET_ZOOM) if (type == CS_RESET_ZOOM)
{ {
@ -1371,7 +1365,8 @@ static cell AMX_NATIVE_CALL cs_set_user_zoom(AMX *amx, cell *params)
if (!mode) if (!mode)
{ {
g_zooming[index] = value; Zooming[index] = value;
EnableMessageHooks();
} }
set_pdata<int>(pPlayer, m_iFOV, value); set_pdata<int>(pPlayer, m_iFOV, value);
@ -1772,31 +1767,11 @@ AMX_NATIVE_INFO CstrikeNatives[] =
{nullptr, nullptr} {nullptr, nullptr}
}; };
void MessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *ed)
{
// Reset player model a short while (MODELRESETTIME) after this if they are using an edited model.
if(msg_type == MessageIdResetHUD)
{
int entityIndex = ENTINDEX(ed);
if (g_zooming[entityIndex])
g_zooming[entityIndex] = 0;
if(g_players[entityIndex].GetModelled())
g_players[entityIndex].SetInspectModel(true);
//g_players[ENTINDEX(ed)].SetTime(gpGlobals->time + MODELRESETTIME);
}
RETURN_META(MRES_IGNORED);
}
/***GetEntityAPI2******************/
void ClientDisconnect(edict_t *pEntity) void ClientDisconnect(edict_t *pEntity)
{ {
int index = ENTINDEX(pEntity); int index = ENTINDEX(pEntity);
g_players[index].SetModelled(false); g_players[index].SetModelled(false);
g_zooming[index] = 0; Zooming[index] = 0;
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
@ -1830,16 +1805,3 @@ void PlayerPostThink(edict_t* pPlayer)
} }
RETURN_META(MRES_IGNORED); RETURN_META(MRES_IGNORED);
} }
void PlayerPreThink(edict_t *pPlayer)
{
GET_OFFSET_NO_ERROR("CBasePlayer", m_iFOV);
int entityIndex = ENTINDEX(pPlayer);
if (g_zooming[entityIndex])
{
set_pdata<int>(pPlayer, m_iFOV, g_zooming[entityIndex]);
}
RETURN_META(MRES_IGNORED);
}

View File

@ -34,4 +34,7 @@ private:
char model[32]; char model[32];
}; };
extern CCstrikePlayer g_players[33];
extern int Zooming[33];
#endif // !defined(INCLUDED_CCSTRIKEPLAYER) #endif // !defined(INCLUDED_CCSTRIKEPLAYER)

View File

@ -0,0 +1,157 @@
// 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
//
#include <amxxmodule.h>
#include "CstrikeUserMessages.h"
#include "CstrikeUtils.h"
#include "CstrikeHacks.h"
#include "CstrikePlayer.h"
bool ShouldBlock;
bool ShouldBlockHLTV;
int MessageIdArmorType;
int MessageIdHLTV;
int MessageIdMoney;
int MessageIdResetHUD;
int MessageIdScoreAttrib;
int MessageIdScoreInfo;
int MessageIdSetFOV;
int MessageIdStatusIcon;
int MessageIdTeamInfo;
int MessageIdTextMsg;
struct UserMsg
{
const char* name;
int* id;
};
UserMsg MessagesList[] =
{
{ "ArmorType" , &MessageIdArmorType },
{ "HLTV" , &MessageIdHLTV },
{ "CurWeapon" , &MessageIdMoney },
{ "ResetHUD" , &MessageIdResetHUD },
{ "ScoreAttrib", &MessageIdScoreAttrib },
{ "ScoreInfo" , &MessageIdScoreInfo },
{ "SetFOV" , &MessageIdSetFOV },
{ "StatusIcon" , &MessageIdStatusIcon },
{ "TeamInfo" , &MessageIdTeamInfo },
{ "TextMsg" , &MessageIdTextMsg },
{ nullptr , nullptr }
};
int OnRegUserMsg_Post(const char *pszName, int iSize)
{
for (size_t i = 0; MessagesList[i].name; ++i)
{
if (!*MessagesList[i].id && strcmp(MessagesList[i].name, pszName) == 0)
{
*MessagesList[i].id = META_RESULT_ORIG_RET(int);
break;
}
}
RETURN_META_VALUE(MRES_IGNORED, 0);
}
void OnMessageBegin(int msg_dest, int msg_type, const float *pOrigin, edict_t *pEntity)
{
switch (msg_dest)
{
case MSG_ONE:
case MSG_ONE_UNRELIABLE:
{
if (msg_type == MessageIdSetFOV)
{
int index = ENTINDEX(pEntity);
if (Zooming[index])
{
GET_OFFSET_NO_ERROR("CBasePlayer", m_iFOV);
if (get_pdata<int>(pEntity, m_iFOV) != Zooming[index])
{
set_pdata<int>(pEntity, m_iFOV, Zooming[index]);
ShouldBlock = true;
ShouldBlockHLTV = true;
RETURN_META(MRES_SUPERCEDE);
}
}
}
else if (msg_type == MessageIdResetHUD)
{
int index = ENTINDEX(pEntity);
if (Zooming[index])
Zooming[index] = 0;
if (g_players[index].GetModelled())
g_players[index].SetInspectModel(true);
}
break;
}
case MSG_SPEC:
{
if (msg_type == MessageIdHLTV && ShouldBlockHLTV)
{
ShouldBlock = true;
ShouldBlockHLTV = false;
RETURN_META(MRES_SUPERCEDE);
}
break;
}
}
if (ShouldBlockHLTV)
{
ShouldBlockHLTV = false;
}
RETURN_META(MRES_IGNORED);
}
void OnWriteByte(int iValue)
{
if (ShouldBlock)
{
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
}
void OnMessageEnd(void)
{
if (ShouldBlock)
{
ShouldBlock = false;
RETURN_META(MRES_SUPERCEDE);
}
RETURN_META(MRES_IGNORED);
}
void EnableMessageHooks()
{
if (!g_pengfuncsTable->pfnMessageBegin)
{
g_pengfuncsTable->pfnMessageBegin = OnMessageBegin;
g_pengfuncsTable->pfnWriteByte = OnWriteByte;
g_pengfuncsTable->pfnMessageEnd = OnMessageEnd;
}
}

View File

@ -0,0 +1,30 @@
// 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_USER_MESSAGES_H
#define CSTRIKE_USER_MESSAGES_H
extern int MessageIdArmorType;
extern int MessageIdHLTV;
extern int MessageIdMoney;
extern int MessageIdResetHUD;
extern int MessageIdScoreAttrib;
extern int MessageIdScoreInfo;
extern int MessageIdSetFOV;
extern int MessageIdStatusIcon;
extern int MessageIdTeamInfo;
extern int MessageIdTextMsg;
void EnableMessageHooks();
#endif // CSTRIKE_USER_MESSAGES_H

View File

@ -22,25 +22,6 @@ IGameConfig *MainConfig;
IGameConfig *OffsetConfig; IGameConfig *OffsetConfig;
IGameConfigManager *ConfigManager; IGameConfigManager *ConfigManager;
struct UserMsg
{
const char* name;
int* id;
};
UserMsg MessagesList[] =
{
{ "ArmorType" , &MessageIdArmorType },
{ "CurWeapon" , &MessageIdMoney },
{ "ResetHUD" , &MessageIdResetHUD },
{ "ScoreAttrib", &MessageIdScoreAttrib },
{ "ScoreInfo" , &MessageIdScoreInfo },
{ "StatusIcon" , &MessageIdStatusIcon },
{ "TeamInfo" , &MessageIdTeamInfo },
{ "TextMsg" , &MessageIdTextMsg },
{ nullptr , nullptr }
};
int AmxxCheckGame(const char *game) int AmxxCheckGame(const char *game)
{ {
if (strcasecmp(game, "cstrike") == 0 || if (strcasecmp(game, "cstrike") == 0 ||
@ -100,20 +81,6 @@ void OnPluginsLoaded()
} }
} }
int OnRegUserMsg_Post(const char *pszName, int iSize)
{
for (size_t i = 0; MessagesList[i].name; ++i)
{
if (!*MessagesList[i].id && strcmp(MessagesList[i].name, pszName) == 0)
{
*MessagesList[i].id = META_RESULT_ORIG_RET(int);
break;
}
}
RETURN_META_VALUE(MRES_IGNORED, 0);
}
void OnAmxxDetach() void OnAmxxDetach()
{ {
ConfigManager->CloseGameConfigFile(MainConfig); ConfigManager->CloseGameConfigFile(MainConfig);

View File

@ -125,7 +125,7 @@
#define FN_ClientUserInfoChanged ClientUserInfoChanged /* pfnClientUserInfoChanged() (wd) Client has updated their setinfo structure */ #define FN_ClientUserInfoChanged ClientUserInfoChanged /* pfnClientUserInfoChanged() (wd) Client has updated their setinfo structure */
// #define FN_ServerActivate ServerActivate /* pfnServerActivate() (wd) Server is starting a new map */ // #define FN_ServerActivate ServerActivate /* pfnServerActivate() (wd) Server is starting a new map */
// #define FN_ServerDeactivate ServerDeactivate /* pfnServerDeactivate() (wd) Server is leaving the map (shutdown or changelevel); SDK2 */ // #define FN_ServerDeactivate ServerDeactivate /* pfnServerDeactivate() (wd) Server is leaving the map (shutdown or changelevel); SDK2 */
#define FN_PlayerPreThink PlayerPreThink /* pfnPlayerPreThink() */ // #define FN_PlayerPreThink PlayerPreThink /* pfnPlayerPreThink() */
#define FN_PlayerPostThink PlayerPostThink /* pfnPlayerPostThink() */ #define FN_PlayerPostThink PlayerPostThink /* pfnPlayerPostThink() */
// #define FN_StartFrame StartFrame /* pfnStartFrame() */ // #define FN_StartFrame StartFrame /* pfnStartFrame() */
// #define FN_ParmsNewLevel ParmsNewLevel /* pfnParmsNewLevel() */ // #define FN_ParmsNewLevel ParmsNewLevel /* pfnParmsNewLevel() */
@ -252,7 +252,7 @@
// #define FN_LightStyle LightStyle // #define FN_LightStyle LightStyle
// #define FN_DecalIndex DecalIndex // #define FN_DecalIndex DecalIndex
// #define FN_PointContents PointContents // #define FN_PointContents PointContents
#define FN_MessageBegin MessageBegin // #define FN_MessageBegin MessageBegin
// #define FN_MessageEnd MessageEnd // #define FN_MessageEnd MessageEnd
// #define FN_WriteByte WriteByte // #define FN_WriteByte WriteByte
// #define FN_WriteChar WriteChar // #define FN_WriteChar WriteChar

View File

@ -149,6 +149,7 @@
<ClCompile Include="..\CstrikeHLTypeConversion.cpp" /> <ClCompile Include="..\CstrikeHLTypeConversion.cpp" />
<ClCompile Include="..\CstrikeNatives.cpp" /> <ClCompile Include="..\CstrikeNatives.cpp" />
<ClCompile Include="..\CstrikePlayer.cpp" /> <ClCompile Include="..\CstrikePlayer.cpp" />
<ClCompile Include="..\CstrikeUserMessages.cpp" />
<ClCompile Include="..\CstrikeUtils.cpp" /> <ClCompile Include="..\CstrikeUtils.cpp" />
<ClCompile Include="..\..\..\..\public\sdk\amxxmodule.cpp" /> <ClCompile Include="..\..\..\..\public\sdk\amxxmodule.cpp" />
</ItemGroup> </ItemGroup>
@ -160,6 +161,7 @@
<ClInclude Include="..\CstrikeDatas.h" /> <ClInclude Include="..\CstrikeDatas.h" />
<ClInclude Include="..\CstrikeHacks.h" /> <ClInclude Include="..\CstrikeHacks.h" />
<ClInclude Include="..\CstrikePlayer.h" /> <ClInclude Include="..\CstrikePlayer.h" />
<ClInclude Include="..\CstrikeUserMessages.h" />
<ClInclude Include="..\moduleconfig.h" /> <ClInclude Include="..\moduleconfig.h" />
<ClInclude Include="..\..\..\..\public\sdk\amxxmodule.h" /> <ClInclude Include="..\..\..\..\public\sdk\amxxmodule.h" />
<ClInclude Include="..\CstrikeUtils.h" /> <ClInclude Include="..\CstrikeUtils.h" />

View File

@ -59,6 +59,9 @@
<ClCompile Include="..\CstrikeHLTypeConversion.cpp"> <ClCompile Include="..\CstrikeHLTypeConversion.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\CstrikeUserMessages.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\CstrikePlayer.h"> <ClInclude Include="..\CstrikePlayer.h">
@ -91,6 +94,9 @@
<ClInclude Include="..\CstrikeHacks.h"> <ClInclude Include="..\CstrikeHacks.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\CstrikeUserMessages.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="..\..\..\..\plugins\include\cstrike.inc"> <None Include="..\..\..\..\plugins\include\cstrike.inc">