#include <amxmodx>
#include <fakemeta_util>
#include <hamsandwich>
#define PLUGIN "SPLESHING ON THE WATER"
#define AUTHOR "MayroN | ConnorMcLeod | fl0wer | Flymic"
#define VERSION "1.0"
#define WATER_SPLESHING "sprites/splashing_on_the_water/water_splashing.spr"
#define FOOTSTEPS_WATER_DELAY 0.5 // Через сколько показывать брызги на воде при ходьбе
new Float:g_nextFootstepsTime[MAX_PLAYERS + 1];
new g_water_splashing;
const DONT_CHECK_WEAPONS_BITSUM = (1<<CSW_KNIFE)
public plugin_init()
{
register_plugin(PLUGIN, VERSION, AUTHOR);
RegisterHam(Ham_Think, "grenade", "Grenade_Water");
RegisterHam(Ham_Player_PostThink, "player", "Player_Water", .Post = false, .specialbot = true);
RegisterHam(Ham_TraceAttack, "worldspawn", "TraceAttack_Water", .Post = false, .specialbot = true);
}
public plugin_precache()
{
g_water_splashing = precache_model(WATER_SPLESHING);
}
public TraceAttack_Water(iEnt, iAttacker, Float:flDamage, Float:fDir[3], ptr, iDamageType)
{
if(!is_user_alive(iAttacker) || DONT_CHECK_WEAPONS_BITSUM & (1<<get_user_weapon(iAttacker)))
return;
new Float:vecOrigin[3], Float:vecEnd[3]
pev(iAttacker, pev_origin, vecOrigin)
vecOrigin[2] += ((pev(iAttacker, pev_flags) & FL_DUCKING) ? 12.0 : 18.0)
get_tr2(ptr, TR_vecEndPos, vecEnd)
new Float:vecTemp[3]
vecTemp[0] = vecEnd[0] - vecOrigin[0]
vecTemp[1] = vecEnd[1] - vecOrigin[1]
vecTemp[2] = vecEnd[2] - vecOrigin[2]
UTIL_Sprite_Water(vecOrigin, vecEnd, floatround(vector_length(vecTemp) / 64.0) )
}
public Grenade_Water(iEntity)
{
if(!pev_valid(iEntity))
return HAM_IGNORED;
static szBombModel[32];
pev(iEntity, pev_model, szBombModel, charsmax(szBombModel));
if(containi(szBombModel, "w_hegrenade") == -1)
return HAM_IGNORED;
static Float:dmgtime, Float:current_time;
pev(iEntity, pev_dmgtime, dmgtime)
current_time = get_gametime()
if(dmgtime > current_time)
return HAM_IGNORED;
new Float:vecOrigin[3];
pev(iEntity, pev_origin, vecOrigin)
if(engfunc(EngFunc_PointContents, vecOrigin) == CONTENTS_WATER)
{
TE_SPRITE_MESSAGE(vecOrigin, 120.0, 10, 255);
}
return HAM_IGNORED;
}
public Player_Water(id)
{
if(!is_user_alive(id))
return HAM_IGNORED;
static Float:start[3];
pev(id, pev_origin, start)
if(pev(id, pev_flags) & FL_INWATER)
{
static Float:time
time = get_gametime()
if(g_nextFootstepsTime[id] > time)
return HAM_IGNORED;
static Float:maxSpeed
static Float:velocity[3]
pev(id, pev_maxspeed, maxSpeed)
pev(id, pev_velocity, velocity)
if(vector_length(velocity) < maxSpeed - 2.0)
return HAM_IGNORED;
g_nextFootstepsTime[id] = time + FOOTSTEPS_WATER_DELAY
static Float:fraction
static Float:end[3]
end = start
end[2] -= 72.0
engfunc(EngFunc_TraceLine, start, end, IGNORE_MONSTERS, id, 0)
get_tr2(0, TR_flFraction, fraction)
if (fraction < 1.0)
TE_SPRITE_MESSAGE(start, -15.0, 2, 255);
}
if(pev(id, pev_watertype) == CONTENTS_WATER && (pev(id, pev_flags) & FL_ONGROUND))
{
TE_SPRITE_MESSAGE(start, -15.0, 2, 255);
}
return HAM_IGNORED;
}
UTIL_Sprite_Water(Float:vecSource[3], Float:vecTo[3], iCount )
{
new Float:flHeight = UTIL_WaterLevel(vecSource, vecSource[2], vecSource[2] + 256.0 )
flHeight = flHeight - vecSource[2]
if(flHeight < 8.0)
{
flHeight = UTIL_WaterLevel( vecTo, vecTo[2], vecTo[2] + 256.0 )
flHeight = flHeight - vecTo[2]
if(flHeight < 8.0)
return
flHeight = flHeight + vecTo[2] - vecSource[2]
}
if(iCount > 255)
{
iCount = 255
}
TE_SPRITE_MESSAGE(vecTo, 15.0, 2, 255);
}
Float:UTIL_WaterLevel( Float:position[3], Float:minz, Float:maxz )
{
new Float:midUp[3]
midUp[0] = position[0]
midUp[1] = position[1]
midUp[2] = minz
if (engfunc(EngFunc_PointContents, midUp) != CONTENTS_WATER)
return minz
midUp[2] = maxz
if (engfunc(EngFunc_PointContents, midUp) == CONTENTS_WATER)
return maxz
new Float:diff = maxz - minz
while(diff > 1.0)
{
midUp[2] = minz + diff/2.0
if (engfunc(EngFunc_PointContents, midUp) == CONTENTS_WATER)
{
minz = midUp[2]
}
else
{
maxz = midUp[2]
}
diff = maxz - minz
}
return midUp[2]
}
TE_SPRITE_MESSAGE(Float:fCoord[3], Float:fZ = 0.0, scale = 2, brightness = 255)
{
message_begin(MSG_BROADCAST,SVC_TEMPENTITY);
write_byte(TE_SPRITE);
write_coord_f(fCoord[0]);
write_coord_f(fCoord[1]);
write_coord_f(fCoord[2] += fZ);
write_short(g_water_splashing);
write_byte(scale);
write_byte(brightness);
message_end();
}