#include <amxmodx> 
#if !defined NO_CS_CZ
#include <fun>
#endif
#include <engine>
 
#define AUTHOR "KRoTaL"
 
 
new piss_model
new piss_sprite
new water_splash
new count_piss[33]
new count_puddle[33]
new bool:PissFlag[33]
new bool:aim[33]
new Float:aim_origin[33][3]
#if !defined NO_CS_CZ
new player_origins[33][3]
new mod_name[32]
#endif
 
public piss_on_player(id) 
{
 
if (get_cvar_num("amx_maxpees")==0) 
    return PLUGIN_HANDLED 
if (!is_user_alive(id)) 
    return PLUGIN_HANDLED 
if ( (get_cvar_num("amx_piss_admin")==1) && !(get_user_flags(id) & ADMIN_LEVEL_A) )
{
    console_print(id, "[AMXX] Szamodra nem elerheto ez a parancs!")
    return PLUGIN_HANDLED
}
if(PissFlag[id])
    return PLUGIN_HANDLED
 
#if !defined NO_CS_CZ
new player_origin[3], players[32], inum=0, dist, last_dist=99999, last_id 
 
get_user_origin(id,player_origin,0) 
get_players(players,inum,"b") 
if (inum>0) { 
    for (new i=0;i<inum;i++) { 
        if (players[i]!=id) { 
            dist = get_distance(player_origin,player_origins[players[i]]) 
            if (dist<last_dist) { 
                last_id = players[i] 
                last_dist = dist 
            } 
        } 
    } 
    if (last_dist<80) { 
#endif
        if (count_piss[id] > get_cvar_num("amx_maxpees")) { 
            client_print(id,print_chat,"Egy korben csak %d pisilhetsz!", get_cvar_num("amx_maxpees"), (get_cvar_num("amx_maxpees")>1) ? "s" : "") 
            return PLUGIN_CONTINUE 
        }
        new player_name[32] 
        get_user_name(id, player_name, 31)
        #if !defined NO_CS_CZ
        new dead_name[32]
        get_user_name(last_id, dead_name, 31)
        client_print(0,print_chat,"%s lepisilte %s halott testet!! HaHaHaHa!!", player_name, dead_name)
        #else
        client_print(0,print_chat,"%s pisil!!", player_name)
        #endif
        count_piss[id]+=1
        count_puddle[id]=1
        new ids[1]
        ids[0]=id
        PissFlag[id]=true
        aim[id]=false
        #if !defined NO_CS_CZ
        if( (equali(mod_name,"cstrike")) || (equali(mod_name,"czero")) )
        {
            client_cmd(id, "weapon_knife")
            set_user_maxspeed(id, -1.0)
        }
        #endif
        emit_sound(id,CHAN_VOICE,"piss/pissing.wav", 1.0, ATTN_NORM, 0, PITCH_NORM) 
        switch(get_cvar_num("amx_piss_effect"))
        {
            case 0:  set_task(0.2,"make_pee",1481+id,ids,1,"a",48)
            case 1:  set_task(0.1,"make_pee",1481+id,ids,1,"a",102)
            default: set_task(0.2,"make_pee",1481+id,ids,1,"a",48)
        }
        set_task(2.2,"place_puddle",3424+id,ids,1,"a",4)
        #if !defined NO_CS_CZ
        set_task(12.0,"weapons_back",6794+id,ids,1)
    }
    else
    {
        client_print(id,print_chat,"Nincs holttest korulotted.")
        return PLUGIN_HANDLED
    }
}
#endif
return PLUGIN_HANDLED
}
 
public sqrt(num) 
{ 
    new div = num 
    new result = 1 
    while (div > result) { 
        div = (div + result) / 2 
        result = num / div 
    } 
    return div 
} 
 
public make_pee(ids[]) 
{ 
    new id=ids[0]
    new vec[3] 
    new aimvec[3] 
    new velocityvec[3] 
    new length 
    get_user_origin(id,vec) 
    get_user_origin(id,aimvec,3) 
    new distance = get_distance(vec,aimvec) 
    new speed = floatround(distance*1.9)
 
    velocityvec[0]=aimvec[0]-vec[0] 
    velocityvec[1]=aimvec[1]-vec[1] 
    velocityvec[2]=aimvec[2]-vec[2] 
 
    length=sqrt(velocityvec[0]*velocityvec[0]+velocityvec[1]*velocityvec[1]+velocityvec[2]*velocityvec[2]) 
 
    velocityvec[0]=velocityvec[0]*speed/length 
    velocityvec[1]=velocityvec[1]*speed/length 
    velocityvec[2]=velocityvec[2]*speed/length 
 
    switch(get_cvar_num("amx_piss_effect"))
    {
        case 0:
        {
            message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
            write_byte(101)
            write_coord(vec[0])
            write_coord(vec[1])
            write_coord(vec[2])
            write_coord(velocityvec[0]) 
            write_coord(velocityvec[1]) 
            write_coord(velocityvec[2]) 
            write_byte(102) 
            write_byte(160) 
            message_end()
        }
        case 1:
        {
            message_begin(MSG_BROADCAST,SVC_TEMPENTITY) 
            write_byte(106) 
            write_coord(vec[0]) 
            write_coord(vec[1]) 
            write_coord(vec[2]) 
            write_coord(velocityvec[0]) 
            write_coord(velocityvec[1]) 
            write_coord(velocityvec[2]+100) 
            write_angle (0) 
            write_short (piss_model) 
            write_byte (0) 
            write_byte (255) 
            message_end()  
 
            message_begin(MSG_BROADCAST,SVC_TEMPENTITY) 
            write_byte (1)    
            write_short (id) 
            write_coord(aimvec[0]) 
            write_coord(aimvec[1]) 
            write_coord(aimvec[2]) 
            write_short(piss_sprite) 
            write_byte( 1 ) 
            write_byte( 6 ) 
            write_byte( 1 ) 
            write_byte( 8 ) 
            write_byte( 0 ) 
            write_byte( 255 ) 
            write_byte( 255 ) 
            write_byte( 0 ) 
            write_byte( 200 ) 
            write_byte( 10 )  
            message_end()
 
            message_begin( MSG_BROADCAST,SVC_TEMPENTITY)
            write_byte(17)
            write_coord(aimvec[0]) 
            write_coord(aimvec[1]) 
            write_coord(aimvec[2]) 
            write_short(water_splash)
            write_byte(16)
            write_byte(18)
            message_end()
 
        }
        default:
        {
            message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
            write_byte(101)
            write_coord(vec[0])
            write_coord(vec[1])
            write_coord(vec[2])
            write_coord(velocityvec[0]) 
            write_coord(velocityvec[1]) 
            write_coord(velocityvec[2]) 
            write_byte(102) 
            write_byte(160) 
            message_end()
        }
    }
} 
 
public place_puddle(ids[]) 
{
    new id=ids[0]
    if(!aim[id])
    {
        new origin[3]
        get_user_origin(id,origin,3) 
        aim_origin[id][0]=float(origin[0])
        aim_origin[id][1]=float(origin[1])
        aim_origin[id][2]=float(origin[2])
    }
 
    new puddle_entity
    puddle_entity = create_entity("info_target")
 
    if(puddle_entity == 0) {
        return PLUGIN_HANDLED_MAIN
    }
 
    new Float:MinBox[3]
    new Float:MaxBox[3]
 
    MinBox[0] = -1.0
    MinBox[1] = -1.0
    MinBox[2] = -1.0
    MaxBox[0] = 1.0
    MaxBox[1] = 1.0
    MaxBox[2] = 1.0
 
    entity_set_vector(puddle_entity, EV_VEC_mins, MinBox)
    entity_set_vector(puddle_entity, EV_VEC_maxs, MaxBox)
 
    switch(count_puddle[id])
    {
        case 1:
        {          
            entity_set_string(puddle_entity, EV_SZ_classname, "piss_puddle1")
            entity_set_model(puddle_entity, "models/piss/piss_puddle1.mdl")
        }
        case 2:
        {          
            entity_set_string(puddle_entity, EV_SZ_classname, "piss_puddle2")
            entity_set_model(puddle_entity, "models/piss/piss_puddle2.mdl")
        }
        case 3:
        {          
            entity_set_string(puddle_entity, EV_SZ_classname, "piss_puddle3")
            entity_set_model(puddle_entity, "models/piss/piss_puddle3.mdl")
        }
        case 4:
        {          
            entity_set_string(puddle_entity, EV_SZ_classname, "piss_puddle4")
            entity_set_model(puddle_entity, "models/piss/piss_puddle4.mdl")
        }
        case 5:
        {          
            entity_set_string(puddle_entity, EV_SZ_classname, "piss_puddle5")
            entity_set_model(puddle_entity, "models/piss/piss_puddle5.mdl")
            #if defined NO_CS_CZ
            PissFlag[id]=false
            #endif
        }
        default: {}
    }
 
    entity_set_origin(puddle_entity, aim_origin[id])
    entity_set_int(puddle_entity, EV_INT_solid, 3)   
    entity_set_int(puddle_entity, EV_INT_movetype, 6) 
    entity_set_edict(puddle_entity, EV_ENT_owner, id)
 
    count_puddle[id]+=1
    aim[id]=true 
 
    return PLUGIN_CONTINUE
}
 
public death_event() 
{ 
    new victim = read_data(2)
    #if !defined NO_CS_CZ   
    get_user_origin(victim,player_origins[victim],0) 
    #endif
 
    if(PissFlag[victim]) 
        reset_piss(victim)
 
    return PLUGIN_CONTINUE 
}
 
#if !defined NO_CS_CZ
public weapons_back(ids[]) 
{ 
    PissFlag[ids[0]]=false 
    if( (equali(mod_name,"cstrike")) || (equali(mod_name,"czero")) )
    {
        set_user_maxspeed(ids[0], 250.0)
    }
}
 
public cur_weapon(id) 
{ 
    if(PissFlag[id]) 
    { 
        if( (equali(mod_name,"cstrike")) || (equali(mod_name,"czero")) )
        {
            client_cmd(id, "weapon_knife")
            set_user_maxspeed(id, -1.0)
        }
    }
 
    return PLUGIN_CONTINUE
} 
#endif
 
public reset_piss(id) 
{
    if(task_exists(1481+id))
        remove_task(1481+id)
    if(task_exists(3424+id))
        remove_task(3424+id)
    #if !defined NO_CS_CZ
    if(task_exists(6794+id))
        remove_task(6794+id)
    #endif
    emit_sound(id,CHAN_VOICE,"piss/pissing.wav", 0.0, ATTN_NORM, 0, PITCH_NORM) 
    PissFlag[id]=false
 
    return PLUGIN_CONTINUE 
}
 
public reset_hud(id)
{
    if(task_exists(1481+id))
        remove_task(1481+id)
    if(task_exists(3424+id))
        remove_task(3424+id)
    #if !defined NO_CS_CZ
    if(task_exists(6794+id))
        remove_task(6794+id)
    #endif
    emit_sound(id,CHAN_VOICE,"piss/pissing.wav", 0.0, ATTN_NORM, 0, PITCH_NORM) 
    PissFlag[id]=false
 
    new iCurrent
 
    for (new i=1 ; i<count_piss[id] ; i++)
    {                
        iCurrent = find_ent_by_class(-1, "piss_puddle1")
        if(iCurrent != -1)
            remove_entity(iCurrent)
        iCurrent = find_ent_by_class(-1, "piss_puddle2")
        if(iCurrent != -1)
            remove_entity(iCurrent)
        iCurrent = find_ent_by_class(-1, "piss_puddle3")
        if(iCurrent != -1)
            remove_entity(iCurrent)
        iCurrent = find_ent_by_class(-1, "piss_puddle4")
        if(iCurrent != -1)
            remove_entity(iCurrent)
        iCurrent = find_ent_by_class(-1, "piss_puddle5")
        if(iCurrent != -1)
            remove_entity(iCurrent)
      }
    count_piss[id]=1
 
    return PLUGIN_CONTINUE 
} 
 
public piss_help(id) 
{
    client_print(id, print_chat, "Ha le akarsz pisilni valakit hasznald a betut amire bindelted!")
    client_print(id, print_chat, "Ha pisilni akkarsz akkor konzolba bind ^"x^" ^"piss^"")
    client_print(id, print_chat, "Ha ez kesz akkor az x-el tudsz pisilni.")
 
    return PLUGIN_CONTINUE
}
 
public handle_say(id) 
{
    new said[192]
    read_args(said,192)
    remove_quotes(said)
 
    if( (containi(said, "piss") != -1) && !(containi(said, "/piss") != -1) ) {
        client_print(id, print_chat, "[AMXX] Ird be /piss tovabbi informaciokert.")
    }
 
    return PLUGIN_CONTINUE
}
 
public plugin_precache() 
{ 
    if (file_exists("sound/piss/pissing.wav"))
        precache_sound( "piss/pissing.wav")   
    if (file_exists("models/piss/piss_puddle1.mdl"))    
        precache_model("models/piss/piss_puddle1.mdl")  
    if (file_exists("models/piss/piss_puddle2.mdl"))    
        precache_model("models/piss/piss_puddle2.mdl") 
    if (file_exists("models/piss/piss_puddle3.mdl"))    
        precache_model("models/piss/piss_puddle3.mdl") 
    if (file_exists("models/piss/piss_puddle4.mdl"))    
        precache_model("models/piss/piss_puddle4.mdl") 
    if (file_exists("models/piss/piss_puddle5.mdl"))    
        precache_model("models/piss/piss_puddle5.mdl") 
    if (file_exists("models/piss/piss.mdl"))    
        piss_model = precache_model("models/piss/piss.mdl")  
    piss_sprite = precache_model("sprites/plasma.spr")
    water_splash = precache_model("sprites/wsplash3.spr")
 
    return PLUGIN_CONTINUE 
}
 
public client_connect(id)
{
    PissFlag[id]=false
    count_piss[id]=1
 
    return PLUGIN_CONTINUE
}
 
public client_disconnect(id)
{
    reset_hud(id)
 
    return PLUGIN_CONTINUE
}
 
public plugin_init() 
{ 
    register_plugin("AMXX Piss","2.0","KRoTaL") 
    register_clcmd("piss","piss_on_player",0,"- Pisilj a halott testere") 
    register_clcmd("say /piss","piss_help",0,"- Hogyan pisilj | segitseg") 
    register_clcmd("say","handle_say")
    register_cvar("amx_maxpees","6")
    register_cvar("amx_piss_admin","0")
    register_cvar("amx_piss_effect","1")
    register_event("DeathMsg","death_event","a") 
    register_event("ResetHUD", "reset_hud", "be")
    #if !defined NO_CS_CZ
    register_event("CurWeapon","cur_weapon","be","1=1")
    get_modname(mod_name,31)
    #endif
 
    return PLUGIN_CONTINUE
}