IW4M-Admin/_customcallbacks.gsc
RaidMax e77ef69ee8 Added additional properties method to allow easier extension to client properties
updated VPN plugin to use WebClient
message is sent to client trying to execute commands before they are authenticated
fixed rare issue with ToAdmins failing
record bullet distance fraction for client kills (_customcallbacks)
change client level/permissions through webfront
ability to tempban through webfront
2018-09-02 16:59:27 -05:00

157 lines
4.3 KiB
Plaintext

#include maps\mp\_utility;
#include maps\mp\gametypes\_hud_util;
#include common_scripts\utility;
init()
{
SetDvarIfUninitialized("sv_customcallbacks", true);
SetDvarIfUninitialized("sv_framewaittime", 0.05);
SetDvarIfUninitialized("sv_additionalwaittime", 0.05);
SetDvarIfUninitialized("sv_maxstoredframes", 3);
level thread onPlayerConnect();
level waittill("prematch_over");
level.callbackPlayerKilled = ::Callback_PlayerKilled;
level.callbackPlayerDamage = ::Callback_PlayerDamage;
}
onPlayerConnect(player)
{
for(;;)
{
level waittill( "connected", player );
player thread waitForFrameThread();
}
}
hitLocationToBone(hitloc)
{
switch(hitloc)
{
case "helmet":
return "j_helmet";
case "head":
return "j_head";
case "neck":
return "j_neck";
case "torso_upper":
return "j_spineupper";
case "torso_lower":
return "j_spinelower";
case "right_arm_upper":
return "j_shoulder_ri";
case "left_arm_upper":
return "j_shoulder_le";
case "right_arm_lower":
return "j_elbow_ri";
case "left_arm_lower":
return "j_elbow_le";
case "right_hand":
return "j_wrist_ri";
case "left_hand":
return "j_wrist_le";
case "right_leg_upper":
return "j_hip_ri";
case "left_leg_upper":
return "j_hip_le";
case "right_leg_lower":
return "j_knee_ri";
case "left_leg_lower":
return "j_knee_le";
case "right_foot":
return "j_ankle_ri";
case "left_foot":
return "j_ankle_le";
default:
return "tag_origin";
}
}
waitForFrameThread()
{
self endon("disconnect");
self.currentAnglePosition = 0;
self.anglePositions = [];
for(;;)
{
self.anglePositions[self.currentAnglePosition] = self getPlayerAngles();
wait(getDvarFloat("sv_framewaittime"));
self.currentAnglePosition = (self.currentAnglePosition + 1) % getDvarInt("sv_maxstoredframes");
}
}
waitForAdditionalAngles(logString)
{
wait(getDvarFloat("sv_additionalwaittime"));
self.angleSnapshot = [];
for(i = 0; i < getDvarInt("sv_maxstoredframes"); i++)
{
self.angleSnapshot[i] = self.anglePositions[i];
}
currentPos = self.currentAnglePosition;
anglesStr = "";
i = 0;
if (currentPos < getDvarInt("sv_maxstoredframes") - 1)
{
i = currentPos + 1;
}
while(i != currentPos)
{
anglesStr += self.angleSnapshot[i] + ":";
i = (i + 1) % getDvarInt("sv_maxstoredframes");
}
logPrint(logString + ";" + anglesStr + "\n");
}
vectorScale(vector, scale)
{
return (vector[0] * scale, vector[1] * scale, vector[2] * scale);
}
Process_Hit(type, attacker, sHitLoc, sMeansOfDeath, iDamage, sWeapon)
{
victim = self;
_attacker = attacker;
if (!isPlayer(attacker) && isDefined(attacker.owner))
_attacker = attacker.owner;
else if(!isPlayer(attacker) && sMeansOfDeath == "MOD_FALLING")
_attacker = victim;
location = victim GetTagOrigin(hitLocationToBone(sHitLoc));
isKillstreakKill = !isPlayer(attacker) || isKillstreakWeapon(sWeapon);
// do the tracing stuff
start = _attacker getTagOrigin("tag_eye");
end = location;
trace = bulletTrace(start, end, true, _attacker);
logLine = "Script" + type + ";" + _attacker.guid + ";" + victim.guid + ";" + _attacker GetTagOrigin("tag_eye") + ";" + location + ";" + iDamage + ";" + sWeapon + ";" + sHitLoc + ";" + sMeansOfDeath + ";" + _attacker getPlayerAngles() + ";" + gettime() + ";" + isKillstreakKill + ";" + _attacker playerADS() + ";" + trace["fraction"];
attacker thread waitForAdditionalAngles(logLine);
}
Callback_PlayerDamage( eInflictor, attacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime )
{
if (level.teamBased && isDefined( attacker ) && ( self != attacker ) && isDefined( attacker.team ) && ( self.pers[ "team" ] == attacker.team ))
return;
if (self.health - iDamage > 0)
{
self Process_Hit("Damage", attacker, sHitLoc, sMeansOfDeath, iDamage, sWeapon);
}
self maps\mp\gametypes\_damage::Callback_PlayerDamage(eInflictor, attacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, psOffsetTime );
}
Callback_PlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration )
{
Process_Hit("Kill", attacker, sHitLoc, sMeansOfDeath, iDamage, sWeapon);
self maps\mp\gametypes\_damage::Callback_PlayerKilled( eInflictor, attacker, iDamage, sMeansOfDeath, sWeapon, vDir, sHitLoc, psOffsetTime, deathAnimDuration );
}