From bc6383fce4ed8dbeba6822ea10c77c0e4e826935 Mon Sep 17 00:00:00 2001 From: s1lentq Date: Wed, 15 Jun 2016 04:36:35 +0700 Subject: [PATCH] Added new natives: rh_emit_sound2, rg_set_account_rules, rg_get_account_rules, rg_is_bomb_planted, rg_join_team, rg_balance_teams, rg_swap_all_players, rg_switch_team, rg_switch_weapon Update CSSDK for regamedll Refactoring --- .../amxmodx/scripting/include/cssdk_const.inc | 28 ++ .../extra/amxmodx/scripting/include/reapi.inc | 28 ++ .../scripting/include/reapi_engine.inc | 18 ++ .../scripting/include/reapi_engine_const.inc | 13 +- .../scripting/include/reapi_gamedll.inc | 87 +++++- .../scripting/include/reapi_gamedll_const.inc | 52 ++-- reapi/include/cssdk/common/const.h | 3 + reapi/include/cssdk/dlls/gamerules.h | 10 + reapi/include/cssdk/dlls/player.h | 4 + reapi/include/cssdk/dlls/regamedll_api.h | 10 +- .../include/cssdk/dlls/regamedll_interfaces.h | 9 +- reapi/include/cssdk/dlls/training_gamerules.h | 2 + reapi/include/cssdk/engine/rehlds_api.h | 7 + reapi/include/cssdk/game_shared/bot/bot.h | 1 + reapi/msvc/reapi.vcxproj | 1 + reapi/msvc/reapi.vcxproj.filters | 3 + reapi/src/hook_callback.cpp | 8 +- reapi/src/hook_callback.h | 2 +- reapi/src/main.cpp | 3 +- reapi/src/main.h | 1 - reapi/src/member_list.cpp | 3 +- reapi/src/member_list.h | 23 +- reapi/src/mods/mod_regamedll_api.cpp | 14 +- reapi/src/mods/mod_rehlds_api.cpp | 10 +- reapi/src/mods/mod_reunion_api.cpp | 9 +- reapi/src/mods/mod_vtc_api.cpp | 9 +- reapi/src/natives/natives_helper.h | 31 ++- reapi/src/natives/natives_misc.cpp | 260 +++++++++++++++++- reapi/src/reapi_utils.cpp | 13 - reapi/src/reapi_utils.h | 1 + reapi/src/reapi_version.inc | 2 +- reapi/src/sdk_util.cpp | 12 + 32 files changed, 557 insertions(+), 120 deletions(-) diff --git a/reapi/extra/amxmodx/scripting/include/cssdk_const.inc b/reapi/extra/amxmodx/scripting/include/cssdk_const.inc index f74bebd..e0f1a3f 100644 --- a/reapi/extra/amxmodx/scripting/include/cssdk_const.inc +++ b/reapi/extra/amxmodx/scripting/include/cssdk_const.inc @@ -876,6 +876,7 @@ enum WinStatus // bypass warning: 200 on amxmodx 1.8.2 #if AMXX_VERSION_NUM < 183 #define ROUND_ESCAPING_TERRORISTS_NEUTRALIZED ROUND_ESCAPING_TERRORISTS_NEUTR + #define RR_ESCAPING_TERRORISTS_NEUTRALIZED RR_ESCAPING_TERRORISTS_NEUTR #endif // used for EndRoundMessage() logged messages @@ -1024,3 +1025,30 @@ enum Bullet BULLET_PLAYER_57MM, BULLET_PLAYER_357SIG, }; + +enum RewardRules +{ + RR_CTS_WIN, + RR_TERRORISTS_WIN, + RR_TARGET_BOMB, + RR_VIP_ESCAPED, + RR_VIP_ASSASSINATED, + RR_TERRORISTS_ESCAPED, + RR_CTS_PREVENT_ESCAPE, + RR_ESCAPING_TERRORISTS_NEUTRALIZED, + RR_BOMB_DEFUSED, + RR_BOMB_PLANTED, + RR_BOMB_EXPLODED, + RR_ALL_HOSTAGES_RESCUED, + RR_TARGET_BOMB_SAVED, + RR_HOSTAGE_NOT_RESCUED, + RR_VIP_NOT_ESCAPED, + RR_LOSER_BONUS_DEFAULT, + RR_LOSER_BONUS_MIN, + RR_LOSER_BONUS_MAX, + RR_LOSER_BONUS_ADD, + RR_RESCUED_HOSTAGE, + RR_TOOK_HOSTAGE_ACC, + RR_TOOK_HOSTAGE, + RR_END +}; diff --git a/reapi/extra/amxmodx/scripting/include/reapi.inc b/reapi/extra/amxmodx/scripting/include/reapi.inc index aa1affc..a85df6d 100644 --- a/reapi/extra/amxmodx/scripting/include/reapi.inc +++ b/reapi/extra/amxmodx/scripting/include/reapi.inc @@ -13,6 +13,34 @@ #pragma library reapi #endif +enum hooks_tables_e +{ + ht_engine, + ht_gamedll, + ht_animating, + ht_player, + ht_gamerules +}; + +enum members_tables_e +{ + mt_gamerules, + mt_base, + mt_animating, + mt_basemonster, + mt_player, + mt_entvars, + mt_playermove, + mt_movevars, + mt_usercmd, + mt_pmtrace +}; + +#define MAX_REGION_RANGE 1024 + +#define BEGIN_FUNC_REGION(%0) (any:MAX_REGION_RANGE * hooks_tables_e:ht_%0) +#define BEGIN_MEMBER_REGION(%0) (any:MAX_REGION_RANGE * members_tables_e:mt_%0) + #include #include // NOTE: only for ReHLDS diff --git a/reapi/extra/amxmodx/scripting/include/reapi_engine.inc b/reapi/extra/amxmodx/scripting/include/reapi_engine.inc index b9d4a7b..ec74bc9 100644 --- a/reapi/extra/amxmodx/scripting/include/reapi_engine.inc +++ b/reapi/extra/amxmodx/scripting/include/reapi_engine.inc @@ -60,3 +60,21 @@ native rh_get_mapname(output[], len, MapNameType:type = MNT_SET); * */ native rh_reset_mapname(); + +/* +* Emits a sound from an entity from the engine. +* +* @param entity Entity index or use 0 to emit from worldspawn at the specified position +* @param recipient Recipient index or use 0 to heard for all clients +* @param channel Channel to emit from +* @param sample Sound file to emit +* @param vol Volume in percent +* @param attn Sound attenuation +* @param flags Emit flags +* @param pitch Sound pitch +* @param emitFlags Additional Emit2 flags, look at the defines like SND_EMIT2_* + +* @return 1 if successfully sounds are emitted, 0 otherwise +* +*/ +native rh_emit_sound2(const entity, const recipient, const channel, const sample[], Float:vol = VOL_NORM, Float:attn = ATTN_NORM, const flags = 0, const pitch = PITCH_NORM, emitFlags = 0, const Float:origin[3] = {0.0,0.0,0.0}); diff --git a/reapi/extra/amxmodx/scripting/include/reapi_engine_const.inc b/reapi/extra/amxmodx/scripting/include/reapi_engine_const.inc index 752a1e8..dc4335c 100644 --- a/reapi/extra/amxmodx/scripting/include/reapi_engine_const.inc +++ b/reapi/extra/amxmodx/scripting/include/reapi_engine_const.inc @@ -7,13 +7,17 @@ // for natives rh_get_mapname enum MapNameType { MNT_TRUE, MNT_SET }; +// rh_emit_sound2 flags +#define SND_EMIT2_NOPAS (1<<0) // never to do check PAS +#define SND_EMIT2_INVOKER (1<<1) // do not send to the client invoker + enum EngineFunc { /* * Description: - * Params: (const recipients, const entity, const channel, const sample[], const volume, Float:attenuation, const fFlags, const pitch) */ - RH_SV_StartSound = 0 * 1024, + RH_SV_StartSound = BEGIN_FUNC_REGION(engine), /* * Description: - @@ -32,9 +36,6 @@ enum EngineFunc * Params: (pcvar, const value[]) */ RH_Cvar_DirectSet, - - // [...] - RH_EngineFunc_End }; enum EntVars @@ -45,7 +46,7 @@ enum EntVars * Get params: get_entvar(index, EntVars:var, dest[], const lenght); * Set params: set_entvar(index, EntVars:var, const source[]); */ - var_classname = 5 * 1024, + var_classname = BEGIN_MEMBER_REGION(entvars), /* * Description: - @@ -1032,7 +1033,7 @@ enum UCmd * Get params: get_ucmd(const ucmd, UserCmd:var); * Set params: set_ucmd(const ucmd, UserCmd:var, value); */ - ucmd_lerp_msec = 8 * 1024, + ucmd_lerp_msec = BEGIN_MEMBER_REGION(usercmd), /* * Description: - diff --git a/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc b/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc index 9f27f89..e6d2286 100644 --- a/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc +++ b/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc @@ -125,10 +125,11 @@ native rg_add_account(const index, amount, AccountSet:typeSet = AS_ADD, bool:bTr * * @param index Client index * @param pszName Classname item +* @param type Look at the enum's with name GiveType * -* @noreturn +* @return 1 if successfully, 0 otherwise */ -native rg_give_item(index, const pszName[], GiveType:type = GT_APPEND); +native rg_give_item(const index, const pszName[], GiveType:type = GT_APPEND); /* * Give the player default items @@ -318,7 +319,7 @@ native rg_set_weapon_info(const {WeaponIdType,_}:weapon_id, WpnInfo:type, any:.. * @noreturn * */ -native rg_remove_all_items(const index, bool:bRemoveSuit); +native rg_remove_all_items(const index, bool:bRemoveSuit = false); /* * Remove specifed the player's item by class name @@ -444,9 +445,87 @@ native rg_transfer_c4(const index, const receiver = 0); * Instant reload weapons * * @param index Client index -* @param weapon Entity weapons, if 0 then all the weapons +* @param weapon Weapon entity-index, if 0 then all the weapons * * @return 1 if successfully, 0 otherwise * */ native rg_instant_reload_weapons(const index, const weapon = 0); + +/* +* Sets the amount of reward in the game account for all players. +* +* @param rules_index Look at the enum's with name RewardRules +* @param amount The amount money +* +* @noreturn +* +*/ +native rg_set_account_rules(const RewardRules:rules_index, const amount); + +/* +* Get the amount of reward from account +* +* @param rules_index Look at the enum's with name RewardRules +* +* @return The amount of reward from account +* +*/ +native rg_get_account_rules(const RewardRules:rules_index); + +/* +* If the bomb is planted +* +* @return 1 if successfully, 0 otherwise +* +*/ +native bool:rg_is_bomb_planted(); + +/* +* Join team +* +* @param index Client index +* @param team Team id +* +* @return 1 if successfully joined the team, 0 otherwise +* +*/ +native rg_join_team(const index, const TeamName:team); + +/* +* Instantly balances the team. +* +* @noreturn +* +*/ +native rg_balance_teams(); + +/* +* To swap players, without reset frags/deaths and the amount wins. +* +* @noreturn +* +*/ +native rg_swap_all_players(); + +/* +* Instantly switches to the opposite team for one player. +* @note Switch from CT to TERRORIST also opposite. +* +* @param index Client index +* +* @noreturn +* +*/ +native rg_switch_team(const index); + +/* +* Switch to specific weapon +* +* @param index Client index +* @param weapon Weapon entity-index +* +* @return 1 if successfully switched, 0 otherwise +* +*/ +native rg_switch_weapon(const index, const weapon); diff --git a/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc b/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc index 4ef7ec9..a4421a9 100644 --- a/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc +++ b/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc @@ -138,7 +138,7 @@ enum GamedllFunc * Return type: int * Params: (const pObserver) */ - RG_GetForceCamera = 1 * 1024, + RG_GetForceCamera = BEGIN_FUNC_REGION(gamedll), /* * Description: - @@ -196,12 +196,9 @@ enum GamedllFunc /* * Description: - - * Params: (const index, VGUIMenu:menuType, const bitsSlots, szOldMenu[]) + * Params: (const index, VGUIMenu:menuType, const bitsSlots, szOldMenu[], bool:bForceOldMenu) */ - RG_ShowVGUIMenu, - - // [...] - RG_End + RG_ShowVGUIMenu }; enum GamedllFunc_CBaseAnimating @@ -210,10 +207,7 @@ enum GamedllFunc_CBaseAnimating * Description: - * Params: (const this) */ - RG_CBaseAnimating_ResetSequenceInfo = 2 * 1024, - - // [...] - RG_CBaseAnimating_End + RG_CBaseAnimating_ResetSequenceInfo = BEGIN_FUNC_REGION(animating) }; enum GamedllFunc_CBasePlayer @@ -222,7 +216,7 @@ enum GamedllFunc_CBasePlayer * Description: - * Params: (const this) */ - RG_CBasePlayer_Spawn = 3 * 1024, + RG_CBasePlayer_Spawn = BEGIN_FUNC_REGION(player), /* * Description: - @@ -402,10 +396,7 @@ enum GamedllFunc_CBasePlayer * Description: - * Params: (const this, bool:bDeploy) */ - RG_CBasePlayer_GiveShield, - - // [...] - RG_CBasePlayer_End + RG_CBasePlayer_GiveShield }; enum GamedllFunc_CSGameRules @@ -414,7 +405,7 @@ enum GamedllFunc_CSGameRules * Description: - * Params: (const index, const weapon) */ - RG_CSGameRules_FShouldSwitchWeapon = 4 * 1024, + RG_CSGameRules_FShouldSwitchWeapon = BEGIN_FUNC_REGION(gamerules), /* * Description: - @@ -540,10 +531,7 @@ enum GamedllFunc_CSGameRules * Description: - * Params: () */ - RG_CSGameRules_BalanceTeams, - - // [...] - RG_CSGameRules_End + RG_CSGameRules_BalanceTeams }; // CSGameRules @@ -555,7 +543,7 @@ enum CSGameRules_Members * Get params: get_member_game(member); * Set params: set_member_game(member, value); */ - m_bFreezePeriod = 0 * 1024, + m_bFreezePeriod = BEGIN_MEMBER_REGION(gamerules), /* * Description: - @@ -565,6 +553,14 @@ enum CSGameRules_Members */ m_bBombDropped, + /* + * Description: - + * Member type: char * + * Get params: get_member_game(member, dest[], const lenght); + * Set params: set_member_game(member, const source[]); + */ + m_GameDesc, + /* * Description: - * Member type: int @@ -1200,7 +1196,7 @@ enum CBaseEntity_Members * Get params: Float:get_member(index, member); * Set params: set_member(index, member, Float:value); */ - currentammo = 1 * 1024, + currentammo = BEGIN_MEMBER_REGION(base), /* * Description: - @@ -1404,7 +1400,7 @@ enum CBaseAnimating_Members * Get params: Float:get_member(index, member); * Set params: set_member(index, member, Float:value); */ - m_flFrameRate = 2 * 1024, + m_flFrameRate = BEGIN_MEMBER_REGION(animating), /* * Description: - @@ -1448,7 +1444,7 @@ enum CBaseMonster_Members * Get params: get_member(index, member); * Set params: set_member(index, member, value); */ - m_Activity = 3 * 1024, + m_Activity = BEGIN_MEMBER_REGION(basemonster), /* * Description: - @@ -1580,7 +1576,7 @@ enum CBasePlayer_Members * Get params: get_member(index, member); * Set params: set_member(index, member, value); */ - random_seed = 4 * 1024, + random_seed = BEGIN_MEMBER_REGION(player), /* * Description: - @@ -3079,7 +3075,7 @@ enum PlayerMove * Get params: get_pmove(member); * Set params: set_pmove(const PlayerMove:var, value); */ - pm_player_index = 6 * 1024, + pm_player_index = BEGIN_MEMBER_REGION(playermove), /* * Description: - @@ -3562,7 +3558,7 @@ enum MoveVars * Get params: Float:get_mvar(const MoveVars:var); * Set params: set_mvar(const MoveVars:var, Float:value); */ - mv_gravity = 7 * 1024, + mv_gravity = BEGIN_MEMBER_REGION(movevars), /* * Description: - @@ -3773,7 +3769,7 @@ enum PMTrace * Get params: get_pmtrace(const tr, const PMTrace:var); * Set params: set_pmtrace(const tr, const PMTrace:var, value); */ - pmt_allsolid = 9 * 1024, + pmt_allsolid = BEGIN_MEMBER_REGION(pmtrace), /* * Description: - diff --git a/reapi/include/cssdk/common/const.h b/reapi/include/cssdk/common/const.h index e8e3743..aa081dc 100644 --- a/reapi/include/cssdk/common/const.h +++ b/reapi/include/cssdk/common/const.h @@ -71,6 +71,9 @@ #define FL_KILLME (1<<30) // This entity is marked for death -- This allows the engine to kill ents at the appropriate time #define FL_DORMANT (1<<31) // Entity is dormant, no updates to client +// SV_EmitSound2 flags +#define SND_EMIT2_NOPAS (1<<0) // never to do check PAS +#define SND_EMIT2_INVOKER (1<<1) // do not send to the client invoker // Engine edict->spawnflags #define SF_NOTINDEATHMATCH 0x0800 // Do not spawn when deathmatch and loading entities from a file diff --git a/reapi/include/cssdk/dlls/gamerules.h b/reapi/include/cssdk/dlls/gamerules.h index a7d0d33..9e868d1 100644 --- a/reapi/include/cssdk/dlls/gamerules.h +++ b/reapi/include/cssdk/dlls/gamerules.h @@ -209,6 +209,8 @@ enum class CItem; class CGameRules { +protected: + virtual ~CGameRules() {}; public: virtual void RefreshSkillData() = 0; virtual void Think() = 0; @@ -280,9 +282,14 @@ public: public: BOOL m_bFreezePeriod; BOOL m_bBombDropped; + + // custom + char *m_GameDesc; }; class CHalfLifeRules: public CGameRules { +protected: + virtual ~CHalfLifeRules() {}; public: virtual void Think() = 0; virtual BOOL IsAllowedToSpawn(CBaseEntity *pEntity) = 0; @@ -328,6 +335,8 @@ public: }; class CHalfLifeMultiplay: public CGameRules { +protected: + virtual ~CHalfLifeMultiplay() {}; public: virtual void RefreshSkillData() = 0; virtual void Think() = 0; @@ -407,6 +416,7 @@ public: virtual void UpdateTeamScores() = 0; virtual void EndRoundMessage(const char *sentence, int event) = 0; virtual void SetAccountRules(RewardRules rules, int amount) = 0; + virtual RewardAccount GetAccountRules(RewardRules rules) const = 0; // BOMB MAP FUNCTIONS virtual BOOL IsThereABomber() = 0; diff --git a/reapi/include/cssdk/dlls/player.h b/reapi/include/cssdk/dlls/player.h index 33984f5..4e0dc24 100644 --- a/reapi/include/cssdk/dlls/player.h +++ b/reapi/include/cssdk/dlls/player.h @@ -342,6 +342,10 @@ public: virtual void Blind(float flUntilTime, float flHoldTime, float flFadeTime, int iAlpha) = 0; virtual void OnTouchingWeapon(CWeaponBox *pWeapon) = 0; public: + static CBasePlayer *Instance(edict_t *pent) { return (CBasePlayer *)GET_PRIVATE(pent ? pent : ENT(0)); } + static CBasePlayer *Instance(entvars_t *pev) { return Instance(ENT(pev)); } + static CBasePlayer *Instance(int offset) { return Instance(ENT(offset)); } + int IsObserver() { return pev->iuser1; } void SetWeaponAnimType(const char *szExtention) { strcpy(m_szAnimExtention, szExtention); } bool IsProtectedByShield() { return m_bOwnsShield && m_bShieldDrawn; } diff --git a/reapi/include/cssdk/dlls/regamedll_api.h b/reapi/include/cssdk/dlls/regamedll_api.h index 7286b76..319bb11 100644 --- a/reapi/include/cssdk/dlls/regamedll_api.h +++ b/reapi/include/cssdk/dlls/regamedll_api.h @@ -210,8 +210,8 @@ typedef IVoidHookChain IReGameHook_ typedef IVoidHookChainRegistry IReGameHookRegistry_ShowMenu; // ShowVGUIMenu hook -typedef IVoidHookChain IReGameHook_ShowVGUIMenu; -typedef IVoidHookChainRegistry IReGameHookRegistry_ShowVGUIMenu; +typedef IVoidHookChain IReGameHook_ShowVGUIMenu; +typedef IVoidHookChainRegistry IReGameHookRegistry_ShowVGUIMenu; // CHalfLifeMultiplay::FShouldSwitchWeapon hook typedef IHookChain IReGameHook_CSGameRules_FShouldSwitchWeapon; @@ -379,20 +379,17 @@ public: struct ReGameFuncs_t { class CBasePlayer *(*UTIL_PlayerByIndex)(int playerIndex); struct edict_s *(*CREATE_NAMED_ENTITY2)(string_t iClass); - void (*ChangeString)(char *&dest, const char *source); - void (*RadiusDamage)(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType); void (*ClearMultiDamage)(); void (*ApplyMultiDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker); void (*AddMultiDamage)(entvars_t *pevInflictor, CBaseEntity *pEntity, float flDamage, int bitsDamageType); - class CBaseEntity *(*UTIL_FindEntityByString)(class CBaseEntity *pStartEntity, const char *szKeyword, const char *szValue); }; class IReGameApi { public: - virtual ~IReGameApi() { } + virtual ~IReGameApi() {} virtual int GetMajorVersion() = 0; virtual int GetMinorVersion() = 0; @@ -405,7 +402,6 @@ public: virtual struct playermove_s* GetPlayerMove() = 0; virtual struct WeaponSlotInfo* GetWeaponSlot(WeaponIdType weaponID) = 0; virtual struct WeaponSlotInfo* GetWeaponSlot(const char* weaponName) = 0; - }; #define VRE_GAMEDLL_API_VERSION "VRE_GAMEDLL_API_VERSION001" diff --git a/reapi/include/cssdk/dlls/regamedll_interfaces.h b/reapi/include/cssdk/dlls/regamedll_interfaces.h index 4d7b100..63124ca 100644 --- a/reapi/include/cssdk/dlls/regamedll_interfaces.h +++ b/reapi/include/cssdk/dlls/regamedll_interfaces.h @@ -78,7 +78,14 @@ public: virtual void SetBombIcon(bool bFlash = false); virtual void SetScoreAttrib(CBasePlayer *dest); virtual void SendItemStatus(); - virtual void ReloadWeapons(CBasePlayerItem *pWeapon = nullptr); + virtual void ReloadWeapons(CBasePlayerItem *pWeapon = nullptr, bool bForceReload = false, bool bForceRefill = false); + virtual void Observer_SetMode(int iMode); + virtual bool SelectSpawnSpot(const char *pEntClassName, CBaseEntity* &pSpot); + virtual bool SwitchWeapon(CBasePlayerItem *pWeapon); + virtual void SwitchTeam(); + virtual bool JoinTeam(TeamName team); + virtual void StartObserver(Vector& vecPosition, Vector& vecViewAngle); + virtual void TeamChangeUpdate(); CBasePlayer *BasePlayer() const; public: diff --git a/reapi/include/cssdk/dlls/training_gamerules.h b/reapi/include/cssdk/dlls/training_gamerules.h index df5cbac..079e2be 100644 --- a/reapi/include/cssdk/dlls/training_gamerules.h +++ b/reapi/include/cssdk/dlls/training_gamerules.h @@ -28,6 +28,8 @@ #pragma once class CHalfLifeTraining: public CHalfLifeMultiplay { +protected: + virtual ~CHalfLifeTraining() {}; public: virtual BOOL IsMultiplayer() = 0; virtual BOOL IsDeathmatch() = 0; diff --git a/reapi/include/cssdk/engine/rehlds_api.h b/reapi/include/cssdk/engine/rehlds_api.h index 54c1ba7..0e3ada2 100644 --- a/reapi/include/cssdk/engine/rehlds_api.h +++ b/reapi/include/cssdk/engine/rehlds_api.h @@ -185,6 +185,10 @@ typedef IVoidHookChainRegistry<> IRehldsHookRegistry_SV_Spawn_f; typedef IHookChain IRehldsHook_SV_CreatePacketEntities; typedef IHookChainRegistry IRehldsHookRegistry_SV_CreatePacketEntities; +//SV_EmitSound2 hook +typedef IHookChain IRehldsHook_SV_EmitSound2; +typedef IHookChainRegistry IRehldsHookRegistry_SV_EmitSound2; + class IRehldsHookchains { public: virtual ~IRehldsHookchains() { } @@ -226,6 +230,7 @@ public: virtual IRehldsHookRegistry_SV_EstablishTimeBase* SV_EstablishTimeBase() = 0; virtual IRehldsHookRegistry_SV_Spawn_f* SV_Spawn_f() = 0; virtual IRehldsHookRegistry_SV_CreatePacketEntities* SV_CreatePacketEntities() = 0; + virtual IRehldsHookRegistry_SV_EmitSound2* SV_EmitSound2() = 0; }; struct RehldsFuncs_t { @@ -273,6 +278,8 @@ struct RehldsFuncs_t { qboolean(*SV_FileInConsistencyList)(const char *filename, struct consistency_s **ppconsist); qboolean(*Steam_NotifyClientConnect)(IGameClient *cl, const void *pvSteam2Key, unsigned int ucbSteam2Key); void(*Steam_NotifyClientDisconnect)(IGameClient* cl); + void(*SV_StartSound)(int recipients, edict_t *entity, int channel, const char *sample, int volume, float attenuation, int flags, int pitch); + bool(*SV_EmitSound2)(edict_t *entity, IGameClient *receiver, int channel, const char *sample, float volume, float attenuation, int flags, int pitch, int emitFlags, const float *pOrigin); }; class IRehldsApi { diff --git a/reapi/include/cssdk/game_shared/bot/bot.h b/reapi/include/cssdk/game_shared/bot/bot.h index a8d060c..469f224 100644 --- a/reapi/include/cssdk/game_shared/bot/bot.h +++ b/reapi/include/cssdk/game_shared/bot/bot.h @@ -39,6 +39,7 @@ public: // invoked when killed virtual void Killed(entvars_t *pevAttacker, int iGib) = 0; + virtual BOOL IsNetClient() = 0; virtual void Think() = 0; virtual BOOL IsBot() = 0; virtual Vector GetAutoaimVector(float flDelta) = 0; diff --git a/reapi/msvc/reapi.vcxproj b/reapi/msvc/reapi.vcxproj index 334ecfb..48982c6 100644 --- a/reapi/msvc/reapi.vcxproj +++ b/reapi/msvc/reapi.vcxproj @@ -263,6 +263,7 @@ + diff --git a/reapi/msvc/reapi.vcxproj.filters b/reapi/msvc/reapi.vcxproj.filters index 2dee317..d5e9c46 100644 --- a/reapi/msvc/reapi.vcxproj.filters +++ b/reapi/msvc/reapi.vcxproj.filters @@ -764,6 +764,9 @@ src + + amxmodx\scripting\include + diff --git a/reapi/src/hook_callback.cpp b/reapi/src/hook_callback.cpp index 5952f41..d688821 100644 --- a/reapi/src/hook_callback.cpp +++ b/reapi/src/hook_callback.cpp @@ -684,14 +684,14 @@ void ShowMenu(IReGameHook_ShowMenu *chain, CBasePlayer *pPlayer, int bitsValidSl callVoidForward(RG_ShowMenu, original, indexOfEdict(pPlayer->pev), bitsValidSlots, nDisplayTime, fNeedMore, pszText); } -void ShowVGUIMenu(IReGameHook_ShowVGUIMenu *chain, CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu) +void ShowVGUIMenu(IReGameHook_ShowVGUIMenu *chain, CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu, bool bForceOldMenu) { - auto original = [chain](int _pPlayer, int _MenuType, int _BitMask, char *_szOldMenu) + auto original = [chain](int _pPlayer, int _MenuType, int _BitMask, char *_szOldMenu, bool _bForceOldMenu) { - chain->callNext(getPrivate(_pPlayer), _MenuType, _BitMask, _szOldMenu); + chain->callNext(getPrivate(_pPlayer), _MenuType, _BitMask, _szOldMenu, _bForceOldMenu); }; - callVoidForward(RG_ShowVGUIMenu, original, indexOfEdict(pPlayer->pev), MenuType, BitMask, szOldMenu); + callVoidForward(RG_ShowVGUIMenu, original, indexOfEdict(pPlayer->pev), MenuType, BitMask, szOldMenu, bForceOldMenu); } int g_iClientStartSpeak, g_iClientStopSpeak; diff --git a/reapi/src/hook_callback.h b/reapi/src/hook_callback.h index 13e0f80..d3bc39b 100644 --- a/reapi/src/hook_callback.h +++ b/reapi/src/hook_callback.h @@ -306,7 +306,7 @@ void CBasePlayer_SetClientUserInfoName(IReGameHook_CBasePlayer_SetClientUserInfo void HandleMenu_ChooseAppearance(IReGameHook_HandleMenu_ChooseAppearance *chain, CBasePlayer *pPlayer, int slot); BOOL HandleMenu_ChooseTeam(IReGameHook_HandleMenu_ChooseTeam *chain, CBasePlayer *pPlayer, int slot); void ShowMenu(IReGameHook_ShowMenu *chain, CBasePlayer *pPlayer, int bitsValidSlots, int nDisplayTime, BOOL fNeedMore, char *pszText); -void ShowVGUIMenu(IReGameHook_ShowVGUIMenu *chain, CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu); +void ShowVGUIMenu(IReGameHook_ShowVGUIMenu *chain, CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu, bool bForceOldMenu); extern int g_iClientStartSpeak; extern int g_iClientStopSpeak; diff --git a/reapi/src/main.cpp b/reapi/src/main.cpp index 2eb19e8..23e06db 100644 --- a/reapi/src/main.cpp +++ b/reapi/src/main.cpp @@ -3,7 +3,7 @@ edict_t* g_pEdicts; playermove_t* g_pMove; char g_szMapName[32]; -int gmsgSendAudio, gmsgTeamScore, gmsgStatusIcon, gmsgArmorType, gmsgTeamInfo, gmsgItemStatus; +int gmsgSendAudio, gmsgStatusIcon, gmsgArmorType, gmsgTeamInfo, gmsgItemStatus; struct { @@ -11,7 +11,6 @@ struct int& id; } g_RegUserMsg[] = { { "SendAudio", gmsgSendAudio }, - { "TeamScore", gmsgTeamScore }, { "StatusIcon", gmsgStatusIcon }, { "ArmorType", gmsgArmorType }, { "TeamInfo", gmsgTeamInfo }, diff --git a/reapi/src/main.h b/reapi/src/main.h index 4a123e9..1412c81 100644 --- a/reapi/src/main.h +++ b/reapi/src/main.h @@ -4,7 +4,6 @@ extern char g_szMapName[32]; extern edict_t* g_pEdicts; extern playermove_t* g_pMove; extern int gmsgSendAudio; -extern int gmsgTeamScore; extern int gmsgStatusIcon; extern int gmsgArmorType; extern int gmsgTeamInfo; diff --git a/reapi/src/member_list.cpp b/reapi/src/member_list.cpp index 19fc3ba..a7ddb18 100644 --- a/reapi/src/member_list.cpp +++ b/reapi/src/member_list.cpp @@ -86,6 +86,7 @@ int regmember::current_cell = 1; member_t memberlist_gamerules[] = { GM_MEMBERS(m_bFreezePeriod), GM_MEMBERS(m_bBombDropped), + GM_MEMBERS(m_GameDesc), // m_VoiceGameMgr -> GM_VOICE_MEMBERS(m_msgPlayerVoiceMask), GM_VOICE_MEMBERS(m_msgRequestState), @@ -663,7 +664,7 @@ memberlist_t memberlist; member_t *memberlist_t::operator[](size_t members) const { - #define CASE(h) case ht_##h: if (index < arraysize(memberlist_##h)) return &memberlist_##h[index]; else break; + #define CASE(h) case mt_##h: if (index < arraysize(memberlist_##h)) return &memberlist_##h[index]; else break; const auto table = members_tables_e(members / MAX_REGION_RANGE); const auto index = members & (MAX_REGION_RANGE - 1); diff --git a/reapi/src/member_list.h b/reapi/src/member_list.h index 8a790f3..b1324f9 100644 --- a/reapi/src/member_list.h +++ b/reapi/src/member_list.h @@ -1,6 +1,6 @@ #pragma once -#define BEGIN_MEMBER_REGION(x) (MAX_REGION_RANGE * memberlist_t::members_tables_e::ht_##x) +#define BEGIN_MEMBER_REGION(x) (MAX_REGION_RANGE * memberlist_t::members_tables_e::mt_##x) // member types enum MType @@ -40,16 +40,16 @@ struct memberlist_t enum members_tables_e { - ht_gamerules, - ht_base, - ht_animating, - ht_basemonster, - ht_player, - ht_entvars, - ht_playermove, - ht_movevars, - ht_usercmd, - ht_pmtrace + mt_gamerules, + mt_base, + mt_animating, + mt_basemonster, + mt_player, + mt_entvars, + mt_playermove, + mt_movevars, + mt_usercmd, + mt_pmtrace }; }; @@ -60,6 +60,7 @@ enum CSGameRules_Members { m_bFreezePeriod = BEGIN_MEMBER_REGION(gamerules), m_bBombDropped, + m_GameDesc, // m_VoiceGameMgr -> CVoiceGameMgr m_msgPlayerVoiceMask, diff --git a/reapi/src/mods/mod_regamedll_api.cpp b/reapi/src/mods/mod_regamedll_api.cpp index c36b939..80f9e4e 100644 --- a/reapi/src/mods/mod_regamedll_api.cpp +++ b/reapi/src/mods/mod_regamedll_api.cpp @@ -8,24 +8,16 @@ CGameRules *g_pGameRules = nullptr; bool RegamedllApi_Init() { const char *szGameDLLModule = GET_GAME_INFO(PLID, GINFO_REALDLL_FULLPATH); - - if (szGameDLLModule == NULL) - { + if (!szGameDLLModule) return false; - } CSysModule *gameModule = Sys_LoadModule(szGameDLLModule); - if (!gameModule) - { return false; - } CreateInterfaceFn ifaceFactory = Sys_GetFactory(gameModule); if (!ifaceFactory) - { return false; - } int retCode = 0; g_ReGameApi = (IReGameApi *)ifaceFactory(VRE_GAMEDLL_API_VERSION, &retCode); @@ -40,13 +32,13 @@ bool RegamedllApi_Init() if (majorVersion != REGAMEDLL_API_VERSION_MAJOR) { - UTIL_LogPrintf("[%s]: ReGameDLL Api major version mismatch; expected %d, real %d\n", Plugin_info.logtag, REGAMEDLL_API_VERSION_MAJOR, majorVersion); + UTIL_ServerPrint("[%s]: ReGameDLL Api major version mismatch; expected %d, real %d\n", Plugin_info.logtag, REGAMEDLL_API_VERSION_MAJOR, majorVersion); return false; } if (minorVersion < REGAMEDLL_API_VERSION_MINOR) { - UTIL_LogPrintf("[%s]: ReGameDLL Api minor version mismatch; expected at least %d, real %d\n", Plugin_info.logtag, REGAMEDLL_API_VERSION_MINOR, minorVersion); + UTIL_ServerPrint("[%s]: ReGameDLL Api minor version mismatch; expected at least %d, real %d\n", Plugin_info.logtag, REGAMEDLL_API_VERSION_MINOR, minorVersion); return false; } diff --git a/reapi/src/mods/mod_rehlds_api.cpp b/reapi/src/mods/mod_rehlds_api.cpp index 83d7cc5..7bb624b 100644 --- a/reapi/src/mods/mod_rehlds_api.cpp +++ b/reapi/src/mods/mod_rehlds_api.cpp @@ -15,36 +15,30 @@ bool RehldsApi_Init() #endif if (!engineModule) - { return false; - } CreateInterfaceFn ifaceFactory = Sys_GetFactory(engineModule); if (!ifaceFactory) - { return false; - } int retCode = 0; g_RehldsApi = (IRehldsApi*)ifaceFactory(VREHLDS_HLDS_API_VERSION, &retCode); if (!g_RehldsApi) - { return false; - } int majorVersion = g_RehldsApi->GetMajorVersion(); int minorVersion = g_RehldsApi->GetMinorVersion(); if (majorVersion != REHLDS_API_VERSION_MAJOR) { - UTIL_LogPrintf("[%s]: ReHLDS Api major version mismatch; expected %d, real %d\n", Plugin_info.logtag, REHLDS_API_VERSION_MAJOR, majorVersion); + UTIL_ServerPrint("[%s]: ReHLDS Api major version mismatch; expected %d, real %d\n", Plugin_info.logtag, REHLDS_API_VERSION_MAJOR, majorVersion); return false; } if (minorVersion < REHLDS_API_VERSION_MINOR) { - UTIL_LogPrintf("[%s]: ReHLDS Api minor version mismatch; expected at least %d, real %d\n", Plugin_info.logtag, REHLDS_API_VERSION_MINOR, minorVersion); + UTIL_ServerPrint("[%s]: ReHLDS Api minor version mismatch; expected at least %d, real %d\n", Plugin_info.logtag, REHLDS_API_VERSION_MINOR, minorVersion); return false; } diff --git a/reapi/src/mods/mod_reunion_api.cpp b/reapi/src/mods/mod_reunion_api.cpp index 66451b4..17a5381 100644 --- a/reapi/src/mods/mod_reunion_api.cpp +++ b/reapi/src/mods/mod_reunion_api.cpp @@ -4,22 +4,21 @@ IReunionApi* g_ReunionApi; bool ReunionApi_Init() { - if (g_RehldsApi == nullptr) + if (!g_RehldsApi) return false; g_ReunionApi = (IReunionApi *)g_RehldsApi->GetFuncs()->GetPluginApi("reunion"); - if (g_ReunionApi == nullptr) { + if (!g_ReunionApi) return false; - } if (g_ReunionApi->version_major != REUNION_API_VERSION_MAJOR) { - UTIL_LogPrintf("[%s]: Reunion Api major version mismatch; expected %d, real %d\n", Plugin_info.logtag, REUNION_API_VERSION_MAJOR, g_ReunionApi->version_major); + UTIL_ServerPrint("[%s]: Reunion Api major version mismatch; expected %d, real %d\n", Plugin_info.logtag, REUNION_API_VERSION_MAJOR, g_ReunionApi->version_major); return false; } if (g_ReunionApi->version_minor < REUNION_API_VERSION_MINOR) { - UTIL_LogPrintf("[%s]: Reunion Api minor version mismatch; expected at least %d, real %d\n", Plugin_info.logtag, REUNION_API_VERSION_MINOR, g_ReunionApi->version_minor); + UTIL_ServerPrint("[%s]: Reunion Api minor version mismatch; expected at least %d, real %d\n", Plugin_info.logtag, REUNION_API_VERSION_MINOR, g_ReunionApi->version_minor); return false; } diff --git a/reapi/src/mods/mod_vtc_api.cpp b/reapi/src/mods/mod_vtc_api.cpp index e91cfe2..f54df41 100644 --- a/reapi/src/mods/mod_vtc_api.cpp +++ b/reapi/src/mods/mod_vtc_api.cpp @@ -4,25 +4,24 @@ IVoiceTranscoderAPI *g_pVoiceTranscoderApi; bool VTC_Api_Init() { - if (g_RehldsApi == nullptr) + if (!g_RehldsApi) return false; g_pVoiceTranscoderApi = (IVoiceTranscoderAPI *)g_RehldsApi->GetFuncs()->GetPluginApi("VoiceTranscoder"); - if (g_pVoiceTranscoderApi == nullptr) { + if (!g_pVoiceTranscoderApi) return false; - } int majorVersion = g_pVoiceTranscoderApi->GetMajorVersion(); int minorVersion = g_pVoiceTranscoderApi->GetMinorVersion(); if (majorVersion != VOICETRANSCODER_API_VERSION_MAJOR) { - UTIL_LogPrintf("[%s]: VTC Api major version mismatch; expected %d, real %d\n", Plugin_info.logtag, VOICETRANSCODER_API_VERSION_MAJOR, majorVersion); + UTIL_ServerPrint("[%s]: VTC Api major version mismatch; expected %d, real %d\n", Plugin_info.logtag, VOICETRANSCODER_API_VERSION_MAJOR, majorVersion); return false; } if (minorVersion < VOICETRANSCODER_API_VERSION_MINOR) { - UTIL_LogPrintf("[%s]: VTC Api minor version mismatch; expected at least %d, real %d\n", Plugin_info.logtag, VOICETRANSCODER_API_VERSION_MINOR, minorVersion); + UTIL_ServerPrint("[%s]: VTC Api minor version mismatch; expected at least %d, real %d\n", Plugin_info.logtag, VOICETRANSCODER_API_VERSION_MINOR, minorVersion); return false; } diff --git a/reapi/src/natives/natives_helper.h b/reapi/src/natives/natives_helper.h index f4e213c..96207db 100644 --- a/reapi/src/natives/natives_helper.h +++ b/reapi/src/natives/natives_helper.h @@ -9,7 +9,7 @@ public: CAmxArg(AMX* amx, cell value) : m_amx(amx), m_value(value) {} operator float() const { - return *(float *)m_value; + return *(float *)&m_value; } operator Vector&() const { @@ -44,9 +44,32 @@ public: return nullptr; return g_ReGameFuncs->UTIL_PlayerByIndex(m_value); } - operator TeamName() const { return static_cast(m_value); } - operator ModelName() const { return static_cast(m_value); } - operator PLAYER_ANIM() const { return static_cast(m_value); } + operator IGameClient *() const + { + if (m_value <= 0) + return nullptr; + return g_RehldsSvs->GetClient(m_value - 1); // id: 0 - 31 + } + operator edict_t *() const + { + return edictByIndexAmx(m_value); + } + operator const float *() const + { + return (float *)getAmxAddr(m_amx, m_value); + } + operator TeamName() const + { + return static_cast(m_value); + } + operator ModelName() const + { + return static_cast(m_value); + } + operator PLAYER_ANIM() const + { + return static_cast(m_value); + } Vector& vector() const { return operator Vector&(); diff --git a/reapi/src/natives/natives_misc.cpp b/reapi/src/natives/natives_misc.cpp index e6eaeeb..1d1381e 100644 --- a/reapi/src/natives/natives_misc.cpp +++ b/reapi/src/natives/natives_misc.cpp @@ -66,8 +66,9 @@ enum GiveType { GT_APPEND, GT_REPLACE, GT_DROP_AND_REPLACE }; * * @param index Client index * @param pszName Classname item +* @param type Look at the enum's with name GiveType * -* @noreturn +* @return 1 if successfully, 0 otherwise * * native rg_give_item(index, const pszName[], GiveType:type = GT_APPEND); */ @@ -443,7 +444,7 @@ cell AMX_NATIVE_CALL rg_update_teamscores(AMX *amx, cell *params) CSGameRules()->m_iNumCTWins = ((params[arg_add] != 0) ? CSGameRules()->m_iNumCTWins : 0) + params[arg_cts]; CSGameRules()->m_iNumTerroristWins = ((params[arg_add] != 0) ? CSGameRules()->m_iNumTerroristWins : 0) + params[arg_ts]; - UpdateTeamScores(); + CSGameRules()->UpdateTeamScores(); return TRUE; } @@ -1147,13 +1148,197 @@ cell AMX_NATIVE_CALL rg_transfer_c4(AMX *amx, cell *params) * Instant reload weapons * * @param index Client index -* @param weapon Entity weapons, if 0 then all the weapons +* @param weapon Weapon entity-index, if 0 then all the weapons * * @return 1 if successfully, 0 otherwise * * native rg_instant_reload_weapons(const index, const weapon = 0); */ cell AMX_NATIVE_CALL rg_instant_reload_weapons(AMX *amx, cell *params) +{ + enum args_e { arg_count, arg_index, arg_weapon, arg_force_reload, arg_force_refill }; + + CHECK_ISPLAYER(arg_index); + + CBasePlayer *pPlayer = g_ReGameFuncs->UTIL_PlayerByIndex(params[arg_index]); + if (pPlayer == nullptr || pPlayer->has_disconnected) { + MF_LogError(amx, AMX_ERR_NATIVE, "%s: player %i is not connected", __FUNCTION__, params[arg_index]); + return FALSE; + } + + CBasePlayerWeapon *pWeapon = nullptr; + if (params[arg_weapon] != 0) + { + pWeapon = getPrivate(params[arg_weapon]); + if (pWeapon == nullptr || !pWeapon->IsWeapon()) { + MF_LogError(amx, AMX_ERR_NATIVE, "%s: Invalid entity weapon", __FUNCTION__); + return FALSE; + } + } + + pPlayer->CSPlayer()->ReloadWeapons(pWeapon, true, true); + return TRUE; +} + +/* +* Sets the amount of reward in the game account for all players. +* +* @param rules_index Look at the enum's with name RewardRules +* @param amount The amount money +* +* @noreturn +* +* native rg_set_account_rules(const RewardRules:rules_index, const amount); +*/ +cell AMX_NATIVE_CALL rg_set_account_rules(AMX *amx, cell *params) +{ + enum args_e { arg_count, arg_rules_index, arg_amount }; + + if (g_pGameRules == nullptr) { + MF_LogError(amx, AMX_ERR_NATIVE, "%s: gamerules not initialized", __FUNCTION__); + return FALSE; + } + + CSGameRules()->SetAccountRules(static_cast(params[arg_rules_index]), params[arg_amount]); + return TRUE; +} + +/* +* Get the amount of reward from account +* +* @param rules_index Look at the enum's with name RewardRules +* +* @return The amount of reward from account +* +* native rg_get_account_rules(const RewardRules:rules_index); +*/ +cell AMX_NATIVE_CALL rg_get_account_rules(AMX *amx, cell *params) +{ + enum args_e { arg_count, arg_rules_index }; + + if (g_pGameRules == nullptr) { + MF_LogError(amx, AMX_ERR_NATIVE, "%s: gamerules not initialized", __FUNCTION__); + return FALSE; + } + + return (cell)CSGameRules()->GetAccountRules(static_cast(params[arg_rules_index])); +} + +/* +* If the bomb is planted +* +* @return 1 if successfully, 0 otherwise +* +* native bool:rg_is_bomb_planted(); +*/ +cell AMX_NATIVE_CALL rg_is_bomb_planted(AMX *amx, cell *params) +{ + if (g_pGameRules == nullptr) { + MF_LogError(amx, AMX_ERR_NATIVE, "%s: gamerules not initialized", __FUNCTION__); + return FALSE; + } + + return (cell)CSGameRules()->IsBombPlanted(); +} + +/* +* Join team +* +* @param index Client index +* @param team Team id +* +* @return 1 if successfully joined the team, 0 otherwise +* +* native rg_join_team(const index, const TeamName:team); +*/ +cell AMX_NATIVE_CALL rg_join_team(AMX *amx, cell *params) +{ + enum args_e { arg_count, arg_index, arg_team }; + + CHECK_ISPLAYER(arg_index); + + CBasePlayer *pPlayer = g_ReGameFuncs->UTIL_PlayerByIndex(params[arg_index]); + if (pPlayer == nullptr || pPlayer->has_disconnected) { + MF_LogError(amx, AMX_ERR_NATIVE, "%s: player %i is not connected", __FUNCTION__, params[arg_index]); + return FALSE; + } + + return (cell)pPlayer->CSPlayer()->JoinTeam(static_cast(params[arg_team])); +} + +/* +* Instantly balances the team. +* +* @noreturn +* +* native rg_balance_teams(); +*/ +cell AMX_NATIVE_CALL rg_balance_teams(AMX *amx, cell *params) +{ + if (g_pGameRules == nullptr) { + MF_LogError(amx, AMX_ERR_NATIVE, "%s: gamerules not initialized", __FUNCTION__); + return FALSE; + } + + CSGameRules()->BalanceTeams(); + return TRUE; +} + +/* +* To swap players, without reset frags/deaths and the amount wins. +* +* @noreturn +* +* native rg_swap_all_players(); +*/ +cell AMX_NATIVE_CALL rg_swap_all_players(AMX *amx, cell *params) +{ + if (g_pGameRules == nullptr) { + MF_LogError(amx, AMX_ERR_NATIVE, "%s: gamerules not initialized", __FUNCTION__); + return FALSE; + } + + CSGameRules()->SwapAllPlayers(); + return TRUE; +} + +/* +* Instantly switches to the opposite team for one player. +* @note Switch from CT to TERRORIST also opposite. +* +* @param index Client index +* +* @noreturn +* +* native rg_switch_team(const index); +*/ +cell AMX_NATIVE_CALL rg_switch_team(AMX *amx, cell *params) +{ + enum args_e { arg_count, arg_index }; + + CHECK_ISPLAYER(arg_index); + + CBasePlayer *pPlayer = g_ReGameFuncs->UTIL_PlayerByIndex(params[arg_index]); + if (pPlayer == nullptr || pPlayer->has_disconnected) { + MF_LogError(amx, AMX_ERR_NATIVE, "%s: player %i is not connected", __FUNCTION__, params[arg_index]); + return FALSE; + } + + pPlayer->CSPlayer()->SwitchTeam(); + return TRUE; +} + +/* +* Switch to specific weapon +* +* @param index Client index +* @param weapon Weapon entity-index +* +* @return 1 if successfully switched, 0 otherwise +* +* native rg_switch_weapon(const index, const weapon); +*/ +cell AMX_NATIVE_CALL rg_switch_weapon(AMX *amx, cell *params) { enum args_e { arg_count, arg_index, arg_weapon }; @@ -1166,13 +1351,12 @@ cell AMX_NATIVE_CALL rg_instant_reload_weapons(AMX *amx, cell *params) } auto pWeapon = getPrivate(params[arg_weapon]); - if (params[arg_weapon] != 0 && pWeapon == nullptr) { + if (pWeapon == nullptr || !pWeapon->IsWeapon()) { MF_LogError(amx, AMX_ERR_NATIVE, "%s: Invalid entity weapon", __FUNCTION__); return FALSE; } - pPlayer->CSPlayer()->ReloadWeapons(pWeapon); - return TRUE; + return (cell)pPlayer->CSPlayer()->SwitchWeapon(pWeapon); } AMX_NATIVE_INFO Misc_Natives_RG[] = @@ -1220,6 +1404,16 @@ AMX_NATIVE_INFO Misc_Natives_RG[] = { "rg_transfer_c4", rg_transfer_c4 }, { "rg_instant_reload_weapons", rg_instant_reload_weapons }, + { "rg_set_account_rules", rg_set_account_rules }, + { "rg_get_account_rules", rg_get_account_rules }, + + { "rg_is_bomb_planted", rg_is_bomb_planted }, + { "rg_join_team", rg_join_team }, + { "rg_balance_teams", rg_balance_teams }, + { "rg_swap_all_players", rg_swap_all_players }, + { "rg_switch_team", rg_switch_team }, + { "rg_switch_weapon", rg_switch_weapon }, + { nullptr, nullptr } }; @@ -1290,11 +1484,62 @@ cell AMX_NATIVE_CALL rh_reset_mapname(AMX *amx, cell *params) return TRUE; } +/* +* Emits a sound from an entity from the engine. +* +* @param entity Entity index or use 0 to emit from worldspawn at the specified position +* @param recipients Recipient index or use 0 to heard for all clients +* @param channel Channel to emit from +* @param sample Sound file to emit +* @param vol Volume in percent +* @param attn Sound attenuation +* @param flags Emit flags +* @param pitch Sound pitch +* @param emitFlags Additional Emit2 flags, look at the defines like SND_EMIT2_* + +* @return 1 if successfully sounds are emitted, 0 otherwise +* +* native rh_emit_sound2(const entity, const recipient, const channel, const sample[], Float:vol = VOL_NORM, Float:attn = ATTN_NORM, const flags = 0, const pitch = PITCH_NORM, emitFlags = 0, const Float:origin[3] = {0.0,0.0,0.0}); +*/ +cell AMX_NATIVE_CALL rh_emit_sound2(AMX *amx, cell *params) +{ + enum args_e { arg_count, arg_entity, arg_recipient, arg_channel, arg_sample, arg_vol, arg_attn, arg_flags, arg_pitch, arg_emitFlags, arg_origin }; + + CBasePlayer *pRecipient = getPrivate(params[arg_recipient]); + if (pRecipient != nullptr && pRecipient->has_disconnected) { + MF_LogError(amx, AMX_ERR_NATIVE, "%s: player %i is not connected", __FUNCTION__, params[arg_recipient]); + return FALSE; + } + + // ignore bots + if ((pRecipient != nullptr && pRecipient->IsBot()) || !pRecipient->IsNetClient()) { + return FALSE; + } + + CAmxArgs args(amx, params); + const char *sample = getAmxString(amx, params[arg_sample]); + + return g_RehldsFuncs->SV_EmitSound2 + ( + args[arg_entity], // entity + args[arg_recipient], // recipient + args[arg_channel], // channel + sample, // sample + args[arg_vol], // volume + args[arg_attn], // attn + args[arg_flags], // flags + args[arg_pitch], // pitch + args[arg_emitFlags], // emitFlags + args[arg_origin] // pOrigin + ); +} + AMX_NATIVE_INFO Misc_Natives_RH[] = { { "rh_set_mapname", rh_set_mapname }, { "rh_get_mapname", rh_get_mapname }, { "rh_reset_mapname", rh_reset_mapname }, + { "rh_emit_sound2", rh_emit_sound2 }, { nullptr, nullptr } }; @@ -1363,4 +1608,5 @@ void RegisterNatives_Misc() if (api_cfg.hasReHLDS()) g_amxxapi.AddNatives(Misc_Natives_RH); - g_amxxapi.AddNatives(Misc_Natives_Checks);} + g_amxxapi.AddNatives(Misc_Natives_Checks); +} diff --git a/reapi/src/reapi_utils.cpp b/reapi/src/reapi_utils.cpp index 6ff3ec7..bb2a2cd 100644 --- a/reapi/src/reapi_utils.cpp +++ b/reapi/src/reapi_utils.cpp @@ -12,19 +12,6 @@ void Broadcast(const char *sentence) g_pengfuncsTable->pfnMessageEnd(); } -void UpdateTeamScores() -{ - g_pengfuncsTable->pfnMessageBegin(MSG_ALL, gmsgTeamScore, NULL, NULL); - g_pengfuncsTable->pfnWriteString("CT"); - g_pengfuncsTable->pfnWriteShort(CSGameRules()->m_iNumCTWins); - g_pengfuncsTable->pfnMessageEnd(); - - g_pengfuncsTable->pfnMessageBegin(MSG_ALL, gmsgTeamScore, NULL, NULL); - g_pengfuncsTable->pfnWriteString("TERRORIST"); - g_pengfuncsTable->pfnWriteShort(CSGameRules()->m_iNumTerroristWins); - g_pengfuncsTable->pfnMessageEnd(); -} - struct { TeamName team; ModelName model; diff --git a/reapi/src/reapi_utils.h b/reapi/src/reapi_utils.h index e205e36..bbce1fd 100644 --- a/reapi/src/reapi_utils.h +++ b/reapi/src/reapi_utils.h @@ -120,5 +120,6 @@ inline const char *GetTeamName(TeamName team) void Broadcast(const char *sentence); void UpdateTeamScores(); ModelName GetModelAuto(TeamName team); +void UTIL_ServerPrint(const char *fmt, ...); extern void __declspec(noreturn) UTIL_SysError(const char *fmt, ...); diff --git a/reapi/src/reapi_version.inc b/reapi/src/reapi_version.inc index a7ad881..9adc920 100644 --- a/reapi/src/reapi_version.inc +++ b/reapi/src/reapi_version.inc @@ -4,5 +4,5 @@ #define _reapi_version_included // reapi version -#define REAPI_VERSION_MAJOR 2 +#define REAPI_VERSION_MAJOR 3 #define REAPI_VERSION_MINOR 0 diff --git a/reapi/src/sdk_util.cpp b/reapi/src/sdk_util.cpp index 72e9538..a5f8baa 100644 --- a/reapi/src/sdk_util.cpp +++ b/reapi/src/sdk_util.cpp @@ -40,3 +40,15 @@ void UTIL_LogPrintf(const char *fmt, ...) ALERT(at_logged, "%s", string); } + +void UTIL_ServerPrint(const char *fmt, ...) +{ + va_list argptr; + char string[1024]; + + va_start(argptr, fmt); + vsprintf(string, fmt, argptr); + va_end(argptr); + + SERVER_PRINT(string); +}