#include #include #include bool piss_on_only_client = true; bool piss_disable_move = false; int piss_tick_counter = 1; //default 4 float piss_time = 9.0; float piss_distance = 100.0; int piss_check_count = 4; int piss_check_need_count = 2; int g_TickCounter = 0; bool g_bPiss[MAXPLAYERS + 1] = { false, ... }; bool g_bCanPiss[MAXPLAYERS + 1] = { true, ... }; int g_PissTarget[MAXPLAYERS + 1] = {0, ...}; int g_PissCount[MAXPLAYERS + 1] = {0, ...}; int g_PissStart[MAXPLAYERS + 1] = {0, ...}; int BeamSprite; int HaloSprite; Handle g_PEnabled = INVALID_HANDLE; //int gVelocityOffset; public Plugin:myinfo = { name = "Piss Mod", author = "gsd", description = "Original code https://forums.alliedmods.net/showthread.php?t=295055", version = "1.1", url = "" } public OnPluginStart(){ RegConsoleCmd("piss", Piss_In); g_PEnabled = CreateConVar("sm_piss_enabled", "1"); AddFileToDownloadsTable("materials/sprites/xbeam2.vmt"); AddFileToDownloadsTable("materials/sprites/halo01.vmt"); HookEvent("player_death", Event_PlayerDeath); //gVelocityOffset = FindSendPropInfo("CBasePlayer", "m_vecVelocity[0]"); } public OnPluginEnd(){ for(int client = 1; client <= MaxClients; client++){ Piss_Out_Handler(client, true); } } public OnMapStart(){ BeamSprite = PrecacheModel("materials/sprites/xbeam2.vmt"); HaloSprite = PrecacheModel("materials/sprites/halo01.vmt"); } public OnClientConnected(int client){ g_bCanPiss[client] = true; g_bPiss[client] = false; g_PissTarget[client] = 0; g_PissCount[client] = 0; g_PissStart[client] = 0; } public OnClientDisconnect(int client){ Piss_Out_Handler(client, true); } public OnGameFrame() { if(g_TickCounter == piss_tick_counter) { for(int client = 1; client <=MaxClients; ++client) { if(IsClientInGame(client) && IsPlayerAlive(client)) { if(g_bPiss[client]) { PissBeam(client); } } } g_TickCounter=0; } else { g_TickCounter++; } } public Action Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast){ int client = GetClientOfUserId(GetEventInt(event, "userid")); if(g_bPiss[client]) Piss_Out_Handler(client, true); } stock bool CheckPissDistance(int client, int target){ new Float:rposition[3]; new Float:cposition[3]; GetEntPropVector(target, Prop_Send, "m_vecOrigin", rposition); GetClientAbsOrigin(client, cposition); decl Float:DistanceG; DistanceG = GetVectorDistance(rposition,cposition); if(DistanceG <= piss_distance) return true; else return false; } public Action:Piss_In(client, args) { //PrintToServer("%N:%i", client, g_bCanPiss[client]); if(!GetConVarBool(g_PEnabled)){ PrintCenterText(client, "У тебя простатит..."); return Plugin_Continue; } if(!g_bCanPiss[client]){ return Plugin_Continue; } /* if ((g_AdmFlag > 0) && !CheckCommandAccess(client, "sm_piss", g_AdmFlag, true)) { PrintToChat(client, "\x04You do not have access"); return Plugin_Handled; } */ /* if(veces[client] > GetConVarInt(g_veces)) { PrintToChat(client, "\x04Times for round excedded"); return Plugin_Handled; } */ //for(new i=1;i<=MaxClients;++i) if(true) { //if(g_PKiller[i] == client) if(true) { int ent = GetClientAimTarget(client, piss_on_only_client); //PrintToServer("%N|%i|%i", client, ent, IsValidEdict(ent)); if(IsValidEdict(ent)) { g_PissTarget[client] = ent; /*if ((g_AdmFlag2 > 0) && !CheckCommandAccess(client, "sm_piss2", g_AdmFlag2, true)) { PrintToChat(client, "\x04You do not have access"); return Plugin_Handled; }*/ //if(DistanceG <= piss_distance) if(CheckPissDistance(client, GetClientAimTarget(client, piss_on_only_client))) { /* if(rposition[0] > cposition[0]-50 && rposition[0] < cposition[0]+50) { if(rposition[1] > cposition[1]-50 && rposition[1] < cposition[1]+50) { if(rposition[2] > cposition[2]-5 && rposition[2] < cposition[2]+5) { */ PissBeam(client); g_bPiss[client] = true; g_PissStart[client] = GetTime(); if(piss_disable_move) SetEntityMoveType(client, MOVETYPE_NONE); /* DISABLE SOUND new String:sound[64]; GetConVarString(g_PeeSound, sound, sizeof(sound)); EmitAmbientSound(sound, pos); */ //CreateTimer(0.8, EmitSoundPee, client, TIMER_REPEAT); float append = piss_time / piss_check_count; for(float start = 0.0; start < piss_time; start++){ start--; start = start + append; CreateTimer(start, Piss_Effect, client); //PrintToServer("Create Timer: %i", start); } if(ent >= 1 && ent <= MaxClients) PrintCenterText(client, "Ты начал ссать на %N...", ent); CreateTimer(piss_time, Piss_Out, client); //veces[client]++; g_bCanPiss[client] = false; //Quitararmas(client); //break; /* } } */ } } else { PrintCenterText(client, "Нет цели для окатывания мочёй!\nЗабиндь кнопку через консоль чтоб удобнее ловить цели!\nbind R piss") } } } return Plugin_Handled; } stock PissBeam(int client, int entity = -1, bool logging = false, bool magnet_piss = false){ float pos[3], end[3], ang[3], ppos[3], aang[3]; GetClientEyePosition(client, pos); GetClientEyeAngles(client, ang); pos[2] -= 23.0; ang[0] = 40.0; TR_TraceRayFilter(pos, ang, MASK_PLAYERSOLID, RayType_Infinite, DontHitSelf, client); if(magnet_piss){ float tpos[3]; GetEntPropVector(g_PissTarget[client], Prop_Send, "m_vecOrigin", tpos); GetClientAbsOrigin(client, ppos); if(GetVectorDistance(ppos, tpos) <= piss_distance) end = tpos; else TR_GetEndPosition(end); } else { TR_GetEndPosition(end); } //if(entity == -1) TR_GetEndPosition(end); //else GetEntPropVector(entity, Prop_Send, "m_vecOrigin", end); TE_SetupBeamRingPoint(end, 5.0, 10.0, BeamSprite, HaloSprite, 0, 15, 0.5, 5.0, 1.0, {255, 255, 0, 255}, 10, 0); TE_SendToAll(); GetClientEyePosition(client, ppos); //ppos[0]+=10.0; ppos[2]-=30.0; GetClientAbsAngles(client, aang); if(aang[1] > 0) { ppos[0]+=FloatSub(10.0, FloatMul(FloatDiv(10.0, 90.0), aang[1])); ppos[1]+=FloatSub(10.0, FloatMul(FloatDiv(10.0, 90.0), FloatAbs(FloatSub(aang[1], 90.0)))); } else { ppos[0]+=FloatSub(10.0, FloatMul(FloatDiv(10.0, 90.0), FloatAbs(aang[1]))); ppos[1]-=FloatSub(10.0, FloatMul(FloatDiv(10.0, 90.0), FloatAbs(FloatSub(FloatAbs(aang[1]), 90.0)))); } aang[0]=0.0; aang[1]+=180.0; aang[2]=0.0; TE_SetupBeamPoints(end, ppos, BeamSprite, HaloSprite, 0, 30, 0.1, 1.0, 1.0, 0, 10.0, {255, 255, 0, 255}, 10); TE_SendToAll(); if(logging) PrintCenterText(client, "%f %f %f | %f %f %f\n%f %f %f | %f %f %f", pos[0], pos[1], pos[2], end[0], end[1], end[2], ppos[0], ppos[1], ppos[2], aang[0], aang[1], aang[2]); } public Action:Piss_Effect(Handle:timer, any:client){ if(g_PissTarget[client] >= 1 && g_PissTarget[client] <= MaxClients){ if(g_PissTarget[client] == GetClientAimTarget(client, piss_on_only_client)){ if(CheckPissDistance(client, g_PissTarget[client])){ g_PissCount[client]++; PrintCenterText(client, "%N хлебнул твоей урины...", g_PissTarget[client]); PrintCenterText(g_PissTarget[client], "Ты хлебнул урины от %N...", client); } } } //PrintToServer("%N count: %i", client, g_PissCount[client]); } stock Piss_Out_Handler(int client, bool force = false){ if (!force) if(!IsClientInGame(client) || !IsPlayerAlive(client)) return; g_bPiss[client] = false; g_bCanPiss[client] = false; //PrintToServer("%N %i>=%i", client, g_PissCount[client], piss_check_need_count); if(!force && g_PissCount[client] > piss_check_need_count){ g_PissCount[client] = 0; if(g_PissTarget[client] >= 1 && g_PissTarget[client] <= MaxClients){ if(IsClientInGame(g_PissTarget[client]) && IsPlayerAlive(g_PissTarget[client])){ TF2_AddCondition(g_PissTarget[client], TFCond_Jarated, 5.0); PrintCenterText(g_PissTarget[client], "Тебя обоссал %N", client); } } g_PissTarget[client] = -1; } if(!force) if(piss_disable_move) SetEntityMoveType(client, MOVETYPE_ISOMETRIC); CreateTimer(1.0, CanPiss, client); } public Action:Piss_Out(Handle:timer, any:client) { Piss_Out_Handler(client); return; } public bool:DontHitSelf(entity, mask, any:data) { if(entity == data) return false; return true; } public Action:CanPiss(Handle:timer, any:client) { g_bCanPiss[client] = true; return Plugin_Continue; }