key subjectKey = NULL_KEY;
float subjectMass = 0.0;
vector targetPositionOffset = <8.0, 0.0, 2.0>;
float impulseViolence = 2.0;
integer plzpush;
float pushStrength = 25;

integer cylinderOn = FALSE;
float cylinderHeight = 60.0;
float gunTurnComp = 0.5;

StartSteam() {
integer flags = PSYS_PART_EMISSIVE_MASK | PSYS_PART_INTERP_COLOR_MASK | PSYS_PART_INTERP_SCALE_MASK | PSYS_PART_FOLLOW_VELOCITY_MASK | PSYS_PART_TARGET_POS_MASK;

llParticleSystem([ PSYS_PART_MAX_AGE, 0.4,
PSYS_PART_FLAGS,flags,
PSYS_PART_START_COLOR, <0.2,0.2,1>,
PSYS_PART_END_COLOR, <1.00000, 0.50196, 0.00000>,
PSYS_PART_START_SCALE, <.25,1.125,.25>,
PSYS_PART_END_SCALE, <0,3,0>,
PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_EXPLODE,
PSYS_SRC_BURST_RATE, 0.05,
PSYS_SRC_ACCEL, <0,0,0.5>,
PSYS_SRC_BURST_PART_COUNT, 16,
PSYS_SRC_BURST_RADIUS, 1.0,
PSYS_SRC_BURST_SPEED_MIN, 0.0,
PSYS_SRC_BURST_SPEED_MAX, 0.05,
PSYS_SRC_TARGET_KEY, subjectKey,
PSYS_SRC_INNERANGLE, 0.65,
PSYS_SRC_OUTERANGLE, 0.1,
PSYS_SRC_OMEGA, ZERO_VECTOR,
PSYS_SRC_MAX_AGE, 0.0,
//PSYS_SRC_TEXTURE, "Water Particle - Mist",
PSYS_PART_START_ALPHA, 1.0,
PSYS_PART_END_ALPHA, 1.0
]);

}

default
{
link_message( integer snum, integer num, string who, key id)
{
if (num == 100) {
if (subjectKey != NULL_KEY) {
plzpush = 1;
pushStrength = (float)who;
}
} else if (id != NULL_KEY) {
if (num & AGENT)
num = AGENT;
else
num = ACTIVE;

subjectKey = id;
subjectMass = llGetObjectMass(subjectKey);

llPushObject(subjectKey, <0.0, 0.0, 0.1>, ZERO_VECTOR, FALSE); // UR ACTIVE >:|

llResetTime();
llSensorRepeat("", id, num, 96, TWO_PI, .15);
StartSteam();
} else {
subjectKey = NULL_KEY;
llSensorRemove();
llParticleSystem([]);
plzpush=0;
}
}


no_sensor() {
subjectKey = NULL_KEY;
llParticleSystem([]);
llSensorRemove();
}

sensor(integer t)
{
if (subjectKey == NULL_KEY) {
llParticleSystem([]);
llSensorRemove();
return;
}

float timeSlice = llGetAndResetTime();
//llOwnerSay((string)timeSlice);
vector gunPosition = llGetPos();
vector victimPosition = llDetectedPos(0);

if (plzpush) {
llPushObject(subjectKey, llVecNorm(targetPositionOffset * llGetRot()) * pushStrength * subjectMass * llPow(llVecMag(gunPosition - victimPosition),3.0), ZERO_VECTOR, FALSE);
llParticleSystem([]);
llSensorRemove();
plzpush = 0;
return;
}


vector targetPosition = gunPosition + (targetPositionOffset * llGetRot()) * llEuler2Rot(llGetOmega() * gunTurnComp * timeSlice);

if(cylinderOn) {
vector rot = llRot2Fwd(llGetRot());
targetPosition.z = gunPosition.z + (rot.z * cylinderHeight);
}

vector targetMoves = targetPosition - victimPosition;
vector impulseMovingImpulse = targetMoves / (0.01 + timeSlice * impulseViolence); // Pay no attention to the constant behind the curtain. I AM OZ.
llPushObject(subjectKey, ((impulseMovingImpulse - llDetectedVel(0) + llGetVel()) * subjectMass) * llPow(llVecMag(gunPosition - victimPosition), 3.0), ZERO_VECTOR, FALSE); // And a miracle occurs...
}

on_rez(integer s) {
llResetScript();
}

}