mirror of
https://github.com/rehlds/reapi.git
synced 2024-12-29 08:05:36 +03:00
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
This commit is contained in:
parent
28dcc802d4
commit
bc6383fce4
@ -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
|
||||
};
|
||||
|
@ -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 <cssdk_const>
|
||||
|
||||
#include <reapi_engine> // NOTE: only for ReHLDS
|
||||
|
@ -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});
|
||||
|
@ -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: -
|
||||
|
@ -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);
|
||||
|
@ -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: -
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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; }
|
||||
|
@ -210,8 +210,8 @@ typedef IVoidHookChain<class CBasePlayer *, int, int, BOOL, char *> IReGameHook_
|
||||
typedef IVoidHookChainRegistry<class CBasePlayer *, int, int, BOOL, char *> IReGameHookRegistry_ShowMenu;
|
||||
|
||||
// ShowVGUIMenu hook
|
||||
typedef IVoidHookChain<class CBasePlayer *, int, int, char *> IReGameHook_ShowVGUIMenu;
|
||||
typedef IVoidHookChainRegistry<class CBasePlayer *, int, int, char *> IReGameHookRegistry_ShowVGUIMenu;
|
||||
typedef IVoidHookChain<class CBasePlayer *, int, int, char *, bool> IReGameHook_ShowVGUIMenu;
|
||||
typedef IVoidHookChainRegistry<class CBasePlayer *, int, int, char *, bool> IReGameHookRegistry_ShowVGUIMenu;
|
||||
|
||||
// CHalfLifeMultiplay::FShouldSwitchWeapon hook
|
||||
typedef IHookChain<BOOL, class CBasePlayer *, class CBasePlayerItem *> 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"
|
||||
|
@ -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:
|
||||
|
@ -28,6 +28,8 @@
|
||||
#pragma once
|
||||
|
||||
class CHalfLifeTraining: public CHalfLifeMultiplay {
|
||||
protected:
|
||||
virtual ~CHalfLifeTraining() {};
|
||||
public:
|
||||
virtual BOOL IsMultiplayer() = 0;
|
||||
virtual BOOL IsDeathmatch() = 0;
|
||||
|
@ -185,6 +185,10 @@ typedef IVoidHookChainRegistry<> IRehldsHookRegistry_SV_Spawn_f;
|
||||
typedef IHookChain<int, enum sv_delta_s, IGameClient *, struct packet_entities_s *, struct sizebuf_s *> IRehldsHook_SV_CreatePacketEntities;
|
||||
typedef IHookChainRegistry<int, enum sv_delta_s, IGameClient *, struct packet_entities_s *, struct sizebuf_s *> IRehldsHookRegistry_SV_CreatePacketEntities;
|
||||
|
||||
//SV_EmitSound2 hook
|
||||
typedef IHookChain<bool, edict_t *, IGameClient *, int, const char*, float, float, int, int, int, const float*> IRehldsHook_SV_EmitSound2;
|
||||
typedef IHookChainRegistry<bool, edict_t *, IGameClient *, int, const char*, float, float, int, int, int, const float*> 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 {
|
||||
|
@ -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;
|
||||
|
@ -263,6 +263,7 @@
|
||||
<ResourceCompile Include="reapi.rc" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\extra\amxmodx\scripting\include\cssdk_const.inc" />
|
||||
<None Include="..\extra\amxmodx\scripting\include\reapi.inc" />
|
||||
<None Include="..\extra\amxmodx\scripting\include\reapi_engine.inc" />
|
||||
<None Include="..\extra\amxmodx\scripting\include\reapi_engine_const.inc" />
|
||||
|
@ -764,6 +764,9 @@
|
||||
<None Include="..\src\reapi_version.inc">
|
||||
<Filter>src</Filter>
|
||||
</None>
|
||||
<None Include="..\extra\amxmodx\scripting\include\cssdk_const.inc">
|
||||
<Filter>amxmodx\scripting\include</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="reapi.rc" />
|
||||
|
@ -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<CBasePlayer>(_pPlayer), _MenuType, _BitMask, _szOldMenu);
|
||||
chain->callNext(getPrivate<CBasePlayer>(_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;
|
||||
|
@ -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;
|
||||
|
@ -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 },
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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<TeamName>(m_value); }
|
||||
operator ModelName() const { return static_cast<ModelName>(m_value); }
|
||||
operator PLAYER_ANIM() const { return static_cast<PLAYER_ANIM>(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<TeamName>(m_value);
|
||||
}
|
||||
operator ModelName() const
|
||||
{
|
||||
return static_cast<ModelName>(m_value);
|
||||
}
|
||||
operator PLAYER_ANIM() const
|
||||
{
|
||||
return static_cast<PLAYER_ANIM>(m_value);
|
||||
}
|
||||
Vector& vector() const
|
||||
{
|
||||
return operator Vector&();
|
||||
|
@ -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<CBasePlayerWeapon>(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<RewardRules>(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<RewardRules>(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<TeamName>(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<CBasePlayerWeapon>(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<CBasePlayer>(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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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, ...);
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user