Splashing On The Water

Splashing On The Water 1.0

Нет прав для скачивания
Код:
#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();
}
Назад
Верх