the Ai also made a nice pee and poop script. rename the text file in the scripts folder to pee.cs and add this code if someone want to test it. Works with improvements in gore. 4.0 and ragdoll euphoria. I loi9ke that AI. It also made a poop script...
using System;
using System.Windows.Forms;
using GTA;
using GTA.Native;
using GTA.Math;
public class PeeScript : Script
{
private bool isPeeing = false;
private int peeStartTime = 0;
private const int PEE_DURATION = 5000; // Exakt 5 Sekunden Laufzeit
private int streamFx = 0;
private static readonly Random rnd = new Random();
// Aktuell aktive Variablen
private float activeSplashY = 1.65f;
private float activeScale = 0.13f;
private float activeSpeedBoost = 2.5f;
// Feste, unmodifizierte Core-Assets
private const string ANIM_DICT = "misscarsteal2peeing";
private const string ANIM_NAME = "peeing_loop";
private const string PTFX_DICT = "core";
private const string PTFX_NAME_STREAM = "water_cannon_jet"; // Hauptstrahl
private const string PTFX_NAME_SPLASH = "ent_sht_water"; // Die Wasserpfütze
public PeeScript()
{
KeyDown += OnKeyDown;
Tick += OnTick;
}
private void OnKeyDown(object sender, KeyEventArgs e)
{
// P = Pinkeln sofort starten (Reiner Antipp-Pool)
if (e.KeyCode == Keys.P && !isPeeing)
{
isPeeing = true;
StartPeeingProcess();
}
// O = Sofort manuell abbrechen
if (e.KeyCode == Keys.O && isPeeing)
{
StopPeeingProcess();
}
}
private void OnTick(object sender, EventArgs e)
{
if (!isPeeing) return;
Ped player = Game.Player.Character;
// ECHTZEIT SHADER-ÜBERSTEUERUNG FÜR INTENSIVES URIN-GELB
if (streamFx != 0)
{
// 1. Extreme Multiplikator-Farbwerte brechen die Texturen des Gore-Mods auf
Function.Call(Hash.SET_PARTICLE_FX_LOOPED_COLOUR, streamFx, 12.0f, 9.5f, 0.1f, false);
Function.Call(Hash.SET_PARTICLE_FX_LOOPED_ALPHA, streamFx, 1.0f);
// 2. ULTIMATIVER OVERRIDE: Wir injizieren "tint" direkt in die Partikel-Evolution.
// Das zwingt das water_cannon-Asset, seine Farbfilter komplett auf Gelb umzustellen!
Function.Call(Hash.SET_PARTICLE_FX_LOOPED_EVOLUTION, streamFx, "tint", 1.0f, false);
Function.Call(Hash.SET_PARTICLE_FX_LOOPED_EVOLUTION, streamFx, "speed", activeSpeedBoost, false);
Function.Call(Hash.SET_PARTICLE_FX_LOOPED_EVOLUTION, streamFx, "force", activeSpeedBoost * 0.8f, false);
}
// Dynamische, flache Pfütze passend zum gewürfelten Stil spawnen
if (Game.GameTime % 4 == 0)
{
Vector3 forwardPos = player.GetOffsetPosition(new Vector3(0.0f, activeSplashY, -0.95f));
Function.Call(Hash.USE_PARTICLE_FX_ASSET, PTFX_DICT);
// Shader-Kompensation für den Bodeneffekt
Function.Call(Hash.SET_PARTICLE_FX_NON_LOOPED_COLOUR, 10.0f, 7.5f, 0.1f);
// 90 Grad auf X legt die Gischt flach auf die Straße
float splashRotX = 90.0f;
float splashRotY = 0.0f;
float splashRotZ = 0.0f;
Function.Call(Hash.START_PARTICLE_FX_NON_LOOPED_AT_COORD,
PTFX_NAME_SPLASH,
forwardPos.X, forwardPos.Y, forwardPos.Z,
splashRotX, splashRotY, splashRotZ,
activeScale * 1.8f,
false, false, false);
}
// Automatischer Abbruch nach Ablauf der 5 Sekunden
if (Game.GameTime - peeStartTime >= PEE_DURATION)
{
StopPeeingProcess();
}
}
private void StartPeeingProcess()
{
Ped player = Game.Player.Character;
// 1. Sicheres Laden der Animation
Function.Call(Hash.REQUEST_ANIM_DICT, ANIM_DICT);
while (!Function.Call<bool>(Hash.HAS_ANIM_DICT_LOADED, ANIM_DICT))
{
Script.Wait(10);
}
// 2. Animation starten
Function.Call(Hash.TASK_PLAY_ANIM,
player.Handle,
ANIM_DICT,
ANIM_NAME,
8.0f, -8.0f, 5000, 1, 0, false, false, false);
// 3. Partikel-Asset laden
Function.Call(Hash.REQUEST_NAMED_PTFX_ASSET, PTFX_DICT);
while (!Function.Call<bool>(Hash.HAS_NAMED_PTFX_ASSET_LOADED, PTFX_DICT))
{
Script.Wait(10);
}
Function.Call(Hash.USE_PARTICLE_FX_ASSET, PTFX_DICT);
// 4. Das Zufallssystem auswerten (Reiner, perfekt angepasster Antipp-Pool)
int style = rnd.Next(1, 4); // Würfelt 1, 2 oder 3
float rotX = 46.0f;
float rotY = 2.0f;
float rotZ = 0.0f;
if (style == 1)
{
// STYLE 1: Der perfekte, dünne Standardbogen
rotX = 46.0f;
rotY = 2.0f;
activeScale = 0.13f;
activeSpeedBoost = 2.5f;
activeSplashY = 1.65f;
}
else if (style == 2)
{
// STYLE 2: Die Mund-Erfrischung (CHIRURGISCHES FINETUNING)
rotX = 66.0f; // PERFEKTIONIERT: Von 72.0f auf 66.0f gesenkt (kippt den Strahl millimetergenau vor das Gesicht)
rotY = 0.0f;
activeScale = 0.14f; // Wunderbar dünner, feiner Strahl
activeSpeedBoost = 1.4f; // Realistische, sanfte Wucht
activeSplashY = 1.15f; // PERFEKTIONIERT: Pfütze rückt passend zum neuen Bogen vor (von 0.85f auf 1.15f)
}
else
{
// STYLE 3: Der schüchterne, kurze Strahl
rotX = 35.0f;
rotY = 0.0f;
activeScale = 0.09f;
activeSpeedBoost = 1.2f;
activeSplashY = 0.95f;
}
// Feste absolute Positionierung am Hosenschlitz (validierte Millimeterarbeit)
float offsetX = 0.0f;
float offsetY = 0.24f;
float offsetZ = -0.06f;
// 5. Partikeleffekt starten
streamFx = Function.Call<int>(
Hash.START_PARTICLE_FX_LOOPED_ON_ENTITY,
PTFX_NAME_STREAM,
player.Handle,
offsetX, offsetY, offsetZ,
rotX, rotY, rotZ,
activeScale,
false, false, false
);
peeStartTime = Game.GameTime;
}
private void StopPeeingProcess()
{
Ped player = Game.Player.Character;
if (streamFx != 0)
{
Function.Call(Hash.STOP_PARTICLE_FX_LOOPED, streamFx, false);
streamFx = 0;
}
player.Task.ClearAll();
isPeeing = false;
}
}