diff --git a/reapi/extra/amxmodx/scripting/include/cssdk_const.inc b/reapi/extra/amxmodx/scripting/include/cssdk_const.inc index 01afb258..e0ed46aa 100644 --- a/reapi/extra/amxmodx/scripting/include/cssdk_const.inc +++ b/reapi/extra/amxmodx/scripting/include/cssdk_const.inc @@ -1585,3 +1585,20 @@ enum KillRarity KILLRARITY_REVENGE = 0x100, // Revenge by the killer KILLRARITY_INAIR = 0x200 // Killer was in the air (skill to deal with high inaccuracy) }; + +/** +* Texture types +*/ +#define CHAR_TEX_CONCRETE 'C' +#define CHAR_TEX_METAL 'M' +#define CHAR_TEX_DIRT 'D' +#define CHAR_TEX_VENT 'V' +#define CHAR_TEX_GRATE 'G' +#define CHAR_TEX_TILE 'T' +#define CHAR_TEX_SLOSH 'S' +#define CHAR_TEX_WOOD 'W' +#define CHAR_TEX_COMPUTER 'P' +#define CHAR_TEX_GRASS 'X' +#define CHAR_TEX_GLASS 'Y' +#define CHAR_TEX_FLESH 'F' +#define CHAR_TEX_SNOW 'N' diff --git a/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc b/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc index 4a891573..c9daae0e 100644 --- a/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc +++ b/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc @@ -1245,3 +1245,154 @@ native rg_send_death_message(const pKiller, const pVictim, const pAssister, cons * @noreturn */ native rg_player_takedamage_impulse(const player, const attacker, const Float:flKnockbackForce, const Float:flVelModifier); + +/* +* Restarts entities with the specified classname. +* +* @param classname Classname to search for +* +* @noreturn +*/ +native rg_restart_other(const classname[]); + +/* +* Resets all entities to their original state. +* +* @noreturn +*/ +native rg_reset_entities(); + +/* +* Removes entities matching the given classname, optionally limited to a specified number of entities. +* +* @param classname Classname to search for +* @param removeCount Remove count +* +* @noreturn +*/ +native rg_remove_other(const classname[], const removeCount = 0); + +/* +* Generates a random long integer within a specified range. +* +* @param seed Seed +* @param low Low +* @param high High +* +* @return A random long integer between "low" and "high" (inclusive) +*/ +native rg_shared_random_long(const seed, const low, const high); + +/* +* Generates a random float within a specified range. +* +* @param seed Seed +* @param low Low +* @param high High +* +* @return A random float between "low" and "high" (inclusive) +*/ +native Float:rg_shared_random_float(const seed, const Float:low, const Float:high); + +/* +* Sets the group trace mask and operation. +* +* @param groupmask Group Mask +* @param op Operation +* +* @noreturn +*/ +native rg_set_group_trace(const groupmask, const op); + +/* +* Resets the group trace mask to its default state. +* +* @noreturn +*/ +native rg_unset_group_trace(); + +/* +* Creates a screen shake effect for players within a specified radius. +* +* @param vecCenter Center +* @param amplitude Amplitude +* @param frequency Frequency +* @param duration Duration +* @param radius Radius +* +* @noreturn +*/ +native rg_screen_shake(Float:vecCenter[3], const Float:amplitude, const Float:frequency, const Float:duration, const Float:radius); + +/* +* Fades the screen for all players. +* +* @param vecColor Color +* @param fadeTime Fade Time +* @param fadeHold Fade Hold +* @param alpha Alpha +* @param flags Flags +* +* @noreturn +*/ +native rg_screen_fade_all(Float:vecColor[3], const Float:fadeTime, const Float:fadeHold, const alpha, const flags); + +/* +* Fades the screen for a specific player. +* +* @param index Client index +* @param vecColor Color +* @param fadeTime Fade Time +* @param fadeHold Fade Hold +* @param alpha Alpha +* @param flags Flags +* +* @noreturn +*/ +native rg_screen_fade(const index, Float:vecColor[3], const Float:fadeTime, const Float:fadeHold = 0.0, const alpha = 0, const flags = 0); + +/* +* Gets the water level at a specific position. +* +* @param position Entity index +* @param minz Min Z +* @param maxz Max Z +* +* @return The Z coordinate of the water surface +*/ +native Float:rg_water_level(Float:position[3], const Float:minz, const Float:maxz); + +/* +* Creates bubbles within a specified area. +* +* @param vecMins Mins +* @param vecMaxs Maxs +* @param bubbleCount Bubble Count +* +* @noreturn +*/ +native rg_bubbles(Float:vecMins[3], Float:vecMaxs[3], const bubbleCount); + +/* +* Creates a trail of bubbles between two points. +* +* @param from Start position +* @param to End position +* @param bubbleCount Bubble Count +* +* @noreturn +*/ +native rg_bubble_trail(Float:from[3], Float:to[3], const bubbleCount); + +/* +* Retrieves the texture type hit by a traceresult, based on start and end positions. +* +* @param ptr Traceresult pointer, use Fakemeta's create_tr2 to instantiate one +* @param vecSrc Start position +* @param vecEnd End position +* @param output Buffer to copy the texture type +* @param len Maximum buffer size +* +* @noreturn +*/ +native rg_texture_hit(const ptr, Float:vecSrc[3], Float:vecEnd[3], output[], len); diff --git a/reapi/include/cssdk/dlls/regamedll_api.h b/reapi/include/cssdk/dlls/regamedll_api.h index 62273fe6..cd973339 100644 --- a/reapi/include/cssdk/dlls/regamedll_api.h +++ b/reapi/include/cssdk/dlls/regamedll_api.h @@ -40,7 +40,7 @@ #include #define REGAMEDLL_API_VERSION_MAJOR 5 -#define REGAMEDLL_API_VERSION_MINOR 30 +#define REGAMEDLL_API_VERSION_MINOR 31 // CBasePlayer::Spawn hook typedef IHookChainClass IReGameHook_CBasePlayer_Spawn; @@ -828,6 +828,18 @@ struct ReGameFuncs_t { void (*TextureTypePlaySound)(TraceResult *ptr, Vector vecSrc, Vector vecEnd, int iBulletType); class CWeaponBox *(*CreateWeaponBox)(CBasePlayerItem *pItem, CBasePlayer *pPlayerOwner, const char *modelName, Vector &origin, Vector &angles, Vector &velocity, float lifeTime, bool packAmmo); class CGrenade *(*SpawnGrenade)(WeaponIdType weaponId, entvars_t *pevOwner, Vector &vecSrc, Vector &vecThrow, float time, int iTeam, unsigned short usEvent); + int (*UTIL_SharedRandomLong)(unsigned int seed, int low, int high); + float (*UTIL_SharedRandomFloat)(unsigned int seed, float low, float high); + void (*UTIL_SetGroupTrace)(int groupmask, int op); + void (*UTIL_UnsetGroupTrace)(); + int (*UTIL_EntitiesInBox)(CBaseEntity **pList, int listMax, const Vector &mins, const Vector &maxs, int flagMask); + void (*UTIL_ScreenShake)(const Vector ¢er, float amplitude, float frequency, float duration, float radius); + void (*UTIL_ScreenFadeAll)(const Vector &color, float fadeTime, float fadeHold, int alpha, int flags); + void (*UTIL_ScreenFade)(CBaseEntity *pEntity, const Vector &color, float fadeTime, float fadeHold, int alpha, int flags); + float (*UTIL_WaterLevel)(const Vector &position, float minz, float maxz); + void (*UTIL_Bubbles)(Vector mins, Vector maxs, int count); + void (*UTIL_BubbleTrail)(Vector from, Vector to, int count); + char (*UTIL_TextureHit)(TraceResult *ptr, Vector vecSrc, Vector vecEnd); }; class IReGameApi { diff --git a/reapi/src/natives/natives_misc.cpp b/reapi/src/natives/natives_misc.cpp index de49e9e0..2cb31222 100644 --- a/reapi/src/natives/natives_misc.cpp +++ b/reapi/src/natives/natives_misc.cpp @@ -3416,6 +3416,267 @@ cell AMX_NATIVE_CALL rg_player_takedamage_impulse(AMX *amx, cell *params) return TRUE; } +/* +* Restarts entities with the specified classname. +* +* @param classname Classname to search for +* +* @noreturn +*/ +cell AMX_NATIVE_CALL rg_restart_other(AMX* amx, cell* params) +{ + enum args_e { arg_count, arg_classname }; + + char classname[256]; + const char* value = getAmxString(amx, params[arg_classname], classname); + + g_ReGameFuncs->UTIL_RestartOther(value); + return TRUE; +} + +/* +* Resets all entities to their original state. +* +* @noreturn +*/ +cell AMX_NATIVE_CALL rg_reset_entities(AMX* amx, cell* params) +{ + g_ReGameFuncs->UTIL_ResetEntities(); + return TRUE; +} + +/* +* Removes entities matching the given classname, optionally limited to a specified number of entities. +* +* @param classname Classname to search for +* @param removeCount Remove count +* +* @noreturn +*/ +cell AMX_NATIVE_CALL rg_remove_other(AMX* amx, cell* params) +{ + enum args_e { arg_count, arg_classname, arg_removeCount }; + + char classname[256]; + const char* value = getAmxString(amx, params[arg_classname], classname); + + CAmxArgs args(amx, params); + g_ReGameFuncs->UTIL_RemoveOther(value, args[arg_removeCount]); + return TRUE; +} + +/* +* Generates a random long integer within a specified range. +* +* @param seed Seed +* @param low Low +* @param high High +* +* @return A random long integer between "low" and "high" (inclusive) +*/ +cell AMX_NATIVE_CALL rg_shared_random_long(AMX* amx, cell* params) +{ + enum args_e { arg_count, arg_seed, arg_low, arg_high }; + + CAmxArgs args(amx, params); + return g_ReGameFuncs->UTIL_SharedRandomLong(args[arg_seed], args[arg_low], args[arg_high]); +} + +/* +* Generates a random float within a specified range. +* +* @param seed Seed +* @param low Low +* @param high High +* +* @return A random float between "low" and "high" (inclusive) +*/ +cell AMX_NATIVE_CALL rg_shared_random_float(AMX* amx, cell* params) +{ + enum args_e { arg_count, arg_seed, arg_low, arg_high }; + + CAmxArgs args(amx, params); + return g_ReGameFuncs->UTIL_SharedRandomFloat(args[arg_seed], args[arg_low], args[arg_high]); +} + +/* +* Sets the group trace mask and operation. +* +* @param groupmask Group Mask +* @param op Operation +* +* @noreturn +*/ +cell AMX_NATIVE_CALL rg_set_group_trace(AMX* amx, cell* params) +{ + enum args_e { arg_count, arg_groupmask, arg_op }; + + CAmxArgs args(amx, params); + g_ReGameFuncs->UTIL_SetGroupTrace(args[arg_groupmask], args[arg_op]); + return TRUE; +} + +/* +* Resets the group trace mask to its default state. +* +* @noreturn +*/ +cell AMX_NATIVE_CALL rg_unset_group_trace(AMX* amx, cell* params) +{ + g_ReGameFuncs->UTIL_UnsetGroupTrace(); + return TRUE; +} + +/* +* Creates a screen shake effect for players within a specified radius. +* +* @param vecCenter Center +* @param amplitude Amplitude +* @param frequency Frequency +* @param duration Duration +* @param radius Radius +* +* @noreturn +*/ +cell AMX_NATIVE_CALL rg_screen_shake(AMX* amx, cell* params) +{ + enum args_e { arg_count, arg_center, arg_amplitude, arg_frequency, arg_duration, arg_radius }; + + CAmxArgs args(amx, params); + g_ReGameFuncs->UTIL_ScreenShake(args[arg_center], args[arg_amplitude], args[arg_frequency], args[arg_duration], args[arg_radius]); + return TRUE; +} + +/* +* Fades the screen for all players. +* +* @param vecColor Color +* @param fadeTime Fade Time +* @param fadeHold Fade Hold +* @param alpha Alpha +* @param flags Flags +* +* @noreturn +*/ +cell AMX_NATIVE_CALL rg_screen_fade_all(AMX* amx, cell* params) +{ + enum args_e { arg_count, arg_color, arg_fadeTime, arg_fadeHold, arg_alpha, arg_flags }; + + CAmxArgs args(amx, params); + g_ReGameFuncs->UTIL_ScreenFadeAll(args[arg_color], args[arg_fadeTime], args[arg_fadeHold], args[arg_alpha], args[arg_flags]); + return TRUE; +} + +/* +* Fades the screen for a specific player. +* +* @param index Client index +* @param vecColor Color +* @param fadeTime Fade Time +* @param fadeHold Fade Hold +* @param alpha Alpha +* @param flags Flags +* +* @noreturn +*/ +cell AMX_NATIVE_CALL rg_screen_fade(AMX* amx, cell* params) +{ + enum args_e { arg_count, arg_entity, arg_color, arg_fadeTime, arg_fadeHold, arg_alpha, arg_flags }; + + CBaseEntity* pEntity = getPrivate(params[arg_entity]); + CHECK_CONNECTED(pEntity, arg_entity); + + CAmxArgs args(amx, params); + g_ReGameFuncs->UTIL_ScreenFade(args[arg_entity], args[arg_color], args[arg_fadeTime], args[arg_fadeHold], args[arg_alpha], args[arg_flags]); + return TRUE; +} + +/* +* Gets the water level at a specific position. +* +* @param position Entity index +* @param minz Min Z +* @param maxz Max Z +* +* @return The Z coordinate of the water surface +*/ +cell AMX_NATIVE_CALL rg_water_level(AMX* amx, cell* params) +{ + enum args_e { arg_count, arg_position, arg_minz, arg_maxz }; + + CAmxArgs args(amx, params); + return g_ReGameFuncs->UTIL_WaterLevel(args[arg_position], args[arg_minz], args[arg_maxz]); +} + +/* +* Creates bubbles within a specified area. +* +* @param vecMins Mins +* @param vecMaxs Maxs +* @param bubbleCount Bubble Count +* +* @noreturn +*/ +cell AMX_NATIVE_CALL rg_bubbles(AMX* amx, cell* params) +{ + enum args_e { arg_count, arg_mins, arg_maxs, arg_bubbleCount }; + + CAmxArgs args(amx, params); + g_ReGameFuncs->UTIL_Bubbles(args[arg_mins], args[arg_maxs], args[arg_bubbleCount]); + return TRUE; +} + +/* +* Creates a trail of bubbles between two points. +* +* @param from Start position +* @param to End position +* @param bubbleCount Bubble Count +* +* @noreturn +*/ +cell AMX_NATIVE_CALL rg_bubble_trail(AMX* amx, cell* params) +{ + enum args_e { arg_count, arg_from, arg_to, arg_bubbleCount }; + + CAmxArgs args(amx, params); + g_ReGameFuncs->UTIL_BubbleTrail(args[arg_from], args[arg_to], args[arg_bubbleCount]); + return TRUE; +} + +/* +* Retrieves the texture type hit by a traceresult, based on start and end positions. +* +* @param ptr Traceresult pointer, use Fakemeta's create_tr2 to instantiate one +* @param vecSrc Start position +* @param vecEnd End position +* @param output Buffer to copy the texture type +* @param len Maximum buffer size +* +* @noreturn +*/ +cell AMX_NATIVE_CALL rg_texture_hit(AMX* amx, cell* params) +{ + enum args_e { arg_count, arg_trace, arg_src, arg_end, arg_output, arg_maxlen }; + + CAmxArgs args(amx, params); + + cell* dest = getAmxAddr(amx, params[arg_output]); + size_t length = *getAmxAddr(amx, params[arg_maxlen]); + const char textureType = g_ReGameFuncs->UTIL_TextureHit(args[arg_trace], args[arg_src], args[arg_end]); + + if (textureType == '\0') + { + setAmxString(dest, "", 1); + return TRUE; + } + + const char buffer[2] = { textureType, '\0' }; + setAmxString(dest, buffer, length); + + return TRUE; +} + AMX_NATIVE_INFO Misc_Natives_RG[] = { { "rg_set_animation", rg_set_animation }, @@ -3533,6 +3794,21 @@ AMX_NATIVE_INFO Misc_Natives_RG[] = { "rg_send_death_message", rg_send_death_message }, { "rg_player_takedamage_impulse", rg_player_takedamage_impulse }, + { "rg_restart_other", rg_restart_other }, + { "rg_reset_entities", rg_reset_entities }, + { "rg_remove_other", rg_remove_other }, + { "rg_shared_random_long", rg_shared_random_long }, + { "rg_shared_random_float", rg_shared_random_float }, + { "rg_set_group_trace", rg_set_group_trace }, + { "rg_unset_group_trace", rg_unset_group_trace }, + { "rg_screen_shake", rg_screen_shake }, + { "rg_screen_fade_all", rg_screen_fade_all }, + { "rg_screen_fade", rg_screen_fade }, + { "rg_water_level", rg_water_level }, + { "rg_bubbles", rg_bubbles }, + { "rg_bubble_trail", rg_bubble_trail }, + { "rg_texture_hit", rg_texture_hit }, + { nullptr, nullptr } }; diff --git a/reapi/version/version.h b/reapi/version/version.h index d3e8b9db..3838a2f8 100644 --- a/reapi/version/version.h +++ b/reapi/version/version.h @@ -6,5 +6,5 @@ #pragma once #define VERSION_MAJOR 5 -#define VERSION_MINOR 29 +#define VERSION_MINOR 30 #define VERSION_MAINTENANCE 0