0.1 (18.09.2019) by mx?!:
0.2 (24.09.2019) by mx?!:
* Added support for non-water entities, using their content type (thx ChakkiSkrip)
new const PLUGIN_VERSION[] = "0.2"
/* -------------------- */
new const VAULT_NAME[] = "toggle_water"
/* -------------------- */
new const SOUND__BLIP1[] = "sound/buttons/blip1.wav"
new g_iWaterBitSumArray[64]
new g_iPlayerFlags[MAX_PLAYERS + 1]
new g_hVault = INVALID_HANDLE
/* -------------------- */
register_plugin("Toggle Water", PLUGIN_VERSION, "mx?!")
register_dictionary("toggle_water.txt")
new iMaxEnts = global_get(glb_maxEntities)
for(new pEnt = MaxClients; pEnt <= iMaxEnts; pEnt++) {
if(FClassnameIs(pEnt, "func_water") || get_entvar(pEnt, var_skin) <= CONTENT_WATER) {
/*while((pEnt = rg_find_ent_by_class(pEnt, "func_water", .useHashTable = true))) {
register_forward(FM_AddToFullPack, "OnAddToFullPack_Post", true)
RegisterHookChain(RG_CBasePlayer_PreThink, "OnPreThink_Post", true)
RegisterHookChain(RG_CBasePlayer_Spawn, "OnPlayerSpawn_Post", true)
RegisterHookChain(RG_CBasePlayer_Killed, "OnPlayerKilled_Post", true)
register_clcmd("say /water", "clcmd_ToggleWater")
/* -------------------- */
g_hVault = nvault_open(VAULT_NAME)
if(g_hVault != INVALID_HANDLE) {
nvault_prune(g_hVault, 0, get_systime() - PRUNE_TIME_IN_SECONDS)
/* -------------------- */
public OnAddToFullPack_Post(es, e, ent, host, flags, player, pSet) {
if(IsWater(ent) && CheckFlag(host, NEED_TO_HIDE)) {
set_es(es, ES_Effects, EF_NODRAW)
/* -------------------- */
public OnPreThink_Post(pPlayer) {
if(!CheckFlag(pPlayer, HIDE_WATER)) {
if(!CheckFlag(pPlayer, IS_ALIVE) || (get_entvar(pPlayer, var_flags) & FL_INWATER)) {
ClearFlag(pPlayer, NEED_TO_HIDE)
SetFlag(pPlayer, NEED_TO_HIDE)
/* -------------------- */
public OnPlayerSpawn_Post(pPlayer) {
if(is_user_alive(pPlayer)) {
SetFlag(pPlayer, IS_ALIVE)
/* -------------------- */
public OnPlayerKilled_Post(pVictim, pKiller, iGib) {
ClearFlag(pVictim, IS_ALIVE)
/* -------------------- */
public client_disconnected(pPlayer) {
g_iPlayerFlags[pPlayer] = 0
/* -------------------- */
public clcmd_ToggleWater(pPlayer) {
new szAuthID[MAX_AUTHID_LENGTH]
get_user_authid(pPlayer, szAuthID, chx(szAuthID))
if(CheckFlag(pPlayer, HIDE_WATER)) {
ClearFlag(pPlayer, HIDE_WATER);
ClearFlag(pPlayer, NEED_TO_HIDE)
if(g_hVault != INVALID_HANDLE) {
nvault_remove(g_hVault, szAuthID)
SetFlag(pPlayer, HIDE_WATER)
if(g_hVault != INVALID_HANDLE) {
nvault_set(g_hVault, szAuthID, "1")
rg_send_audio(pPlayer, SOUND__BLIP1)
client_print_color( pPlayer, print_team_red, "%l", "TOGGLE_WATER__PATTERN",
CheckFlag(pPlayer, HIDE_WATER) ? "TOGGLE_WATER__OFF" : "TOGGLE_WATER__ON" );
/* -------------------- */
if(g_hVault != INVALID_HANDLE) {
/* -------------------- */
public client_authorized(pPlayer, const szAuthID[]) {
if(g_hVault == INVALID_HANDLE) {
if(nvault_get(g_hVault, szAuthID)) {
SetFlag(pPlayer, HIDE_WATER)
nvault_touch(g_hVault, szAuthID)
/* -------------------- */
public plugin_natives() {
register_native("ToggleWater_GetStatus", "_ToggleWater_GetStatus")
register_native("ToggleWater_ToggleStatus", "_ToggleWater_ToggleStatus")
/* -------------------- */
public bool:_ToggleWater_GetStatus(iPluginID, iParamCount) {
return (CheckFlag(get_param(player), HIDE_WATER)) ? false : true;
/* -------------------- */
public _ToggleWater_ToggleStatus(iPluginID, iParamCount) {
clcmd_ToggleWater(get_param(player))