mirror of
https://github.com/Ragora/T2-ACCM.git
synced 2026-03-08 06:50:32 +00:00
Lots of changes
This commit is contained in:
parent
fc510c3de7
commit
182661dd82
191 changed files with 69 additions and 11656 deletions
722
scripts/modscripts/ai/drone.cs
Normal file
722
scripts/modscripts/ai/drone.cs
Normal file
|
|
@ -0,0 +1,722 @@
|
|||
//------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
// Drone AI by Dondelium_X
|
||||
// CCM v3.4
|
||||
//------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
$Drone::DetectDist = 500;
|
||||
$Drone::TurnImpulse = 123;
|
||||
$Drone::FrdImpulse = 525;
|
||||
//$Drone::TurnImpulse = 675 / 3;
|
||||
//$Drone::FrdImpulse = 525 * 3;
|
||||
$Drone::newTargetChance = "1 100";
|
||||
|
||||
$Drone::paths = 4;
|
||||
$Drone::path[1,1] = "0 1500 1000";
|
||||
$Drone::path[1,2] = "1500 0 1000";
|
||||
$Drone::path[1,3] = "0 -1500 1000";
|
||||
$Drone::path[1,4] = "-1500 0 1000";
|
||||
|
||||
$Drone::path[2,1] = "0 -1500 1000";
|
||||
$Drone::path[2,2] = "-1500 0 1000";
|
||||
$Drone::path[2,3] = "0 1500 1000";
|
||||
$Drone::path[2,4] = "1500 0 1000";
|
||||
|
||||
$Drone::path[3,1] = "0 2500 750";
|
||||
$Drone::path[3,2] = "0 2500 1250";
|
||||
$Drone::path[3,3] = "0 -2500 1250";
|
||||
$Drone::path[3,4] = "0 -2500 750";
|
||||
|
||||
$Drone::path[4,1] = "2500 0 750";
|
||||
$Drone::path[4,2] = "2500 0 1250";
|
||||
$Drone::path[4,3] = "-2500 0 1250";
|
||||
$Drone::path[4,4] = "-2500 0 750";
|
||||
|
||||
//-----Manuver Index-----
|
||||
|
||||
$flightManuvers::Behind[0] = Immelman;
|
||||
$flightManuvers::Behind[1] = HalfFlip;
|
||||
$flightManuvers::Behind[2] = BreakRight;
|
||||
$flightManuvers::Behind[3] = BreakLeft;
|
||||
$flightManuvers::Behind[4] = BarrelRoll;
|
||||
$flightManuvers::Behind[5] = WingWaggle;
|
||||
$flightManuvers::Behind[6] = Reversal;
|
||||
|
||||
|
||||
//-----Manuvers-----
|
||||
|
||||
//Immelman
|
||||
$flightManuver::Points[Immelman] = 5; //This signifies how many points are in the manuver
|
||||
$flightManuver::Point[Immelman,0] = "0 1 0 0 0 1"; //each point represents the 3 numbers of the vector of the desired forward vector,
|
||||
$flightManuver::Point[Immelman,1] = "0 0 1 0 -1 0"; //and then the 3 numbers of the vector for the desired Up vector
|
||||
$flightManuver::Point[Immelman,2] = "0 -1 0 0 0 -1";
|
||||
$flightManuver::Point[Immelman,3] = "0 -1 0 1 0 0";
|
||||
$flightManuver::Point[Immelman,4] = "0 -1 0 0 0 1";
|
||||
|
||||
//halfFlip
|
||||
$flightManuver::Points[HalfFlip] = 3;
|
||||
$flightManuver::Point[HalfFlip,0] = "0 1 0 0 0 1";
|
||||
$flightManuver::Point[HalfFlip,1] = "0 0 1 0 -1 0";
|
||||
$flightManuver::Point[HalfFlip,2] = "0 -1 0 0 0 -1";
|
||||
|
||||
//breakRight
|
||||
$flightManuver::Points[BreakRight] = 3;
|
||||
$flightManuver::Point[BreakRight,0] = "0 1 0 0 0 1";
|
||||
$flightManuver::Point[BreakRight,1] = "0 1 0 1 0 0";
|
||||
$flightManuver::Point[BreakRight,2] = "1 0 0 0 -1 0";
|
||||
|
||||
//BreakLeft
|
||||
$flightManuver::Points[BreakLeft] = 3;
|
||||
$flightManuver::Point[BreakLeft,0] = "0 1 0 0 0 1";
|
||||
$flightManuver::Point[BreakLeft,1] = "0 1 0 -1 0 0";
|
||||
$flightManuver::Point[BreakLeft,2] = "-1 0 0 0 -1 0";
|
||||
|
||||
//BarrelRoll
|
||||
$flightManuver::Points[BarrelRoll] = 5;
|
||||
$flightManuver::Point[BarrelRoll,0] = "0 1 0 0 0 1";
|
||||
$flightManuver::Point[BarrelRoll,1] = "0 1 0 1 0 0";
|
||||
$flightManuver::Point[BarrelRoll,2] = "0 1 0 0 0 -1";
|
||||
$flightManuver::Point[BarrelRoll,3] = "0 1 0 -1 0 0";
|
||||
$flightManuver::Point[BarrelRoll,4] = "0 1 0 0 0 1";
|
||||
|
||||
//WingWaggle
|
||||
$flightManuver::Points[WingWaggle] = 4;
|
||||
$flightManuver::Point[WingWaggle,0] = "0 1 0 0 0 1";
|
||||
$flightManuver::Point[WingWaggle,1] = "-1 1 0 0 0 1";
|
||||
$flightManuver::Point[WingWaggle,2] = "1 1 0 0 0 1";
|
||||
$flightManuver::Point[WingWaggle,3] = "0 1 0 0 0 1";
|
||||
|
||||
//Reversal
|
||||
$flightManuver::Points[Reversal] = 7;
|
||||
$flightManuver::Point[Reversal,0] = "0 1 0 0 0 1";
|
||||
$flightManuver::Point[Reversal,1] = "0 0 1 0 -1 0";
|
||||
$flightManuver::Point[Reversal,2] = "0 0 1 1 0 0";
|
||||
$flightManuver::Point[Reversal,3] = "1 0 0 0 0 -1";
|
||||
$flightManuver::Point[Reversal,4] = "0 0 -1 -1 0 0";
|
||||
$flightManuver::Point[Reversal,5] = "0 0 -1 0 1 0";
|
||||
$flightManuver::Point[Reversal,6] = "0 1 0 0 0 1";
|
||||
|
||||
//This is a function for mass spawning
|
||||
function DroneBattle(%pos, %radius, %number, %teamlow, %teamhigh, %maxskill){
|
||||
for(%i = 0; %i < %number; %i++){
|
||||
%startpos = vectorAdd(%pos,(getRandom(0, %radius) - (%radius / 2))@" "@(getRandom(0, %radius) - (%radius / 2))@" 0");
|
||||
%rotation = "0 0 1 "@getRandom(1,360);
|
||||
if(%teamlow != %teamhigh)
|
||||
%team = getRandom(%teamlow,%teamhigh);
|
||||
else
|
||||
%team = %teamlow;
|
||||
StartDrone(%startpos,%rotation,%team,getRandom(1,%maxskill));
|
||||
}
|
||||
}
|
||||
|
||||
//This sets up the drone and the functions needed to start the drone.
|
||||
function StartDrone(%pos, %rotation, %team, %skill){
|
||||
if(%team $= "")
|
||||
%team = 0;
|
||||
if(%pos $= "")
|
||||
%pos = "0 0 300";
|
||||
if(%rotation $= "")
|
||||
%rotation = "1 0 0 0";
|
||||
if(%skill !$= "ace"){
|
||||
if(%skill $= "" || %skill < 1)
|
||||
%skill = 1;
|
||||
else if(%skill > 10)
|
||||
%skill = 10;
|
||||
}
|
||||
%Drone = new FlyingVehicle()
|
||||
{
|
||||
dataBlock = ScoutFlyer;
|
||||
position = %pos;
|
||||
rotation = %rotation;
|
||||
team = %team;
|
||||
};
|
||||
MissionCleanUp.add(%Drone);
|
||||
|
||||
setTargetSensorGroup(%Drone.getTarget(), %team);
|
||||
|
||||
%drone.isdrone = 1;
|
||||
%drone.dodgeGround = 0;
|
||||
|
||||
if(%skill $= "ace"){
|
||||
%skill = 10;
|
||||
%drone.isace = 1;
|
||||
}
|
||||
|
||||
%drone.skill = 0.2 + (%skill / 12.5);
|
||||
|
||||
schedule(100, 0, "DroneForwardImpulse", %drone);
|
||||
schedule(101, 0, "DronefindTarget", %drone);
|
||||
schedule(102, 0, "DroneScanGround", %drone);
|
||||
|
||||
return %drone;
|
||||
}
|
||||
|
||||
//This makes the drone move forward until it dies
|
||||
function DroneForwardImpulse(%obj){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(!%obj.isace){
|
||||
if(vectorLen(%obj.getVelocity()) < 165)
|
||||
%obj.applyImpulse(%obj.getPosition(),vectorScale(%obj.getForwardVector(),$Drone::FrdImpulse));
|
||||
}
|
||||
else{
|
||||
if(vectorLen(%obj.getVelocity()) < 225)
|
||||
%obj.applyImpulse(%obj.getPosition(),vectorScale(%obj.getForwardVector(),$Drone::FrdImpulse * 3));
|
||||
}
|
||||
schedule(100, 0, "DroneForwardImpulse", %obj);
|
||||
}
|
||||
|
||||
function DroneScanGround(%obj){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
%vec = %obj.getForwardVector();
|
||||
%vector = vectorAdd(%obj.getPosition(),"0 0 -500");
|
||||
%searchResult = containerRayCast(%obj.getWorldBoxCenter(), %vector, $TypeMasks::TerrainObjectType, %obj);
|
||||
if(%searchResult){
|
||||
%z = getWord(%vec,2);
|
||||
%height = vectorDist(%obj.getPosition(),posFromRaycast(%searchresult));
|
||||
if(%z < 0){
|
||||
if(%height <= (200 + ((%z * -1) * 300))){
|
||||
%obj.dodgeground = 1;
|
||||
schedule(100, 0, "DroneDodgeGround", %obj);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
schedule(100, 0, "DroneScanGround", %obj);
|
||||
}
|
||||
|
||||
function DroneDodgeGround(%obj){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
%vec = %obj.getForwardVector();
|
||||
%z = getWord(%vec,2);
|
||||
if(%z > 0){
|
||||
%obj.dodgeground = 0;
|
||||
schedule(100, 0, "DronefindTarget", %obj);
|
||||
schedule(101, 0, "DroneScanGround", %obj);
|
||||
return;
|
||||
}
|
||||
%pos = vectorAdd(%obj.getPosition(),%vec);
|
||||
%obj.applyImpulse(%pos,vectorScale("0 0 1",$Drone::TurnImpulse * %obj.skill));
|
||||
schedule(100, 0, "DroneDodgeGround", %obj);
|
||||
}
|
||||
|
||||
//This function checks the area around it for any targets.
|
||||
function DronefindTarget(%obj){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
%pos = %obj.getposition();
|
||||
InitContainerRadiusSearch(%pos, $drone::detectdist + (800 + (600 * %obj.skill)), $TypeMasks::VehicleObjectType);
|
||||
while ((%searchResult = containerSearchNext()) != 0){
|
||||
%objtarget = firstWord(%searchResult);
|
||||
if(isObject(%objtarget) && %objTarget !$= %obj){
|
||||
%trgtype = %objtarget.getClassName();
|
||||
if(%trgtype $= "FlyingVehicle" && %objtarget.team != %obj.team){
|
||||
%testPos = %objtarget.getWorldBoxCenter();
|
||||
%distance = vectorDist(%objtarget.getPosition(),%pos);
|
||||
if (%distance > 0){
|
||||
%target = %objtarget;
|
||||
DroneDetermineManuver(%obj, %target);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
schedule(100, 0, "DronePatrol", %obj);
|
||||
}
|
||||
|
||||
function DronePatrol(%obj){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if($Drone::paths > 0){
|
||||
if(%obj.path $= ""){
|
||||
%obj.path = getRandom(1,$Drone::paths);
|
||||
%obj.point = 0;
|
||||
}
|
||||
%obj.point++;
|
||||
if($Drone::path[%obj.path,%obj.point] $= ""){
|
||||
schedule(100, 0, "DronefindTarget", %obj);
|
||||
%obj.path = "";
|
||||
%obj.point = "";
|
||||
}
|
||||
else
|
||||
schedule(100,0,"dronemovetopoint",%obj,$Drone::path[%obj.path,%obj.point]);
|
||||
}
|
||||
else
|
||||
schedule(500, 0, "DronefindTarget", %obj);
|
||||
}
|
||||
|
||||
function DroneMoveToPoint(%obj,%Tpos){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(%obj.dodgeground == 1)
|
||||
return;
|
||||
%pos = %obj.getPosition();
|
||||
%objfrd = %obj.getForwardVector();
|
||||
%objup = %obj.getUpVector();
|
||||
|
||||
%dist = vectorDist(%pos,%Tpos);
|
||||
%aimvec = vectorNormalize(vectorSub(%Tpos,%pos));
|
||||
|
||||
%vec = vectorSub(%aimvec , %objfrd);
|
||||
%vec = vectorCross(%vec, %objfrd);
|
||||
%vec = vectorNormalize(vectorCross(%objfrd, %vec));
|
||||
if(vectorDist(%objfrd,vectorNormalize(%aimvec)) < 0.1)
|
||||
%obj.applyImpulse(vectorAdd(%obj.getPosition(),vectorScale(%objfrd,($Drone::TurnImpulse / 2))),%vec);
|
||||
else if(vectorDist(%objup, %vec) > 0.1){
|
||||
%vec = vectorSub(%vec, %objup);
|
||||
%vec = vectorCross(%vec, %objup);
|
||||
%vec = vectorNormalize(vectorCross(%objup, %vec));
|
||||
%pos = vectorAdd(%obj.getPosition(),vectorScale(%objup,$Drone::TurnImpulse * 3 * %obj.skill));
|
||||
%obj.applyImpulse(%pos,%vec);
|
||||
}
|
||||
else
|
||||
%obj.applyImpulse(vectorAdd(%obj.getPosition(),%objfrd),vectorScale(%vec,$Drone::TurnImpulse * %obj.skill));
|
||||
if(getRandom(0,getWord($Drone::newTargetChance,1)) <= (getWord($Drone::newTargetChance,0) * 10))
|
||||
schedule(100, 0, "DronefindTarget", %obj, %target);
|
||||
else if(%dist < 25)
|
||||
schedule(100, 0, "DronePatrol", %obj);
|
||||
else
|
||||
schedule(100, 0, "DroneMoveToPoint", %obj, %tpos);
|
||||
}
|
||||
|
||||
//This function figures out what the drone should do from where the target is.
|
||||
function DroneDetermineManuver(%obj, %target){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(!isObject(%target)){
|
||||
DronefindTarget(%obj);
|
||||
return;
|
||||
}
|
||||
%pos = %obj.getPosition();
|
||||
%Tpos = %Target.getPosition();
|
||||
%objfrd = %obj.getForwardVector();
|
||||
%trgfrd = %target.getForwardVector();
|
||||
%vec = vectorSub(%Tpos,%pos);
|
||||
%dirdist = vectorDist(%objfrd,vectorNormalize(%vec));
|
||||
%vecdist = vectorDist(%objfrd,%trgfrd);
|
||||
if(%dirdist > 1.41){
|
||||
if(%vecdist < 1.41 && vectorDist(%pos,%Tpos) < 2000){
|
||||
UnderFireManuver(%obj, $flightManuvers::Behind[getRandom(0,6)], "");
|
||||
}
|
||||
else
|
||||
TurnToFire(%obj, %target);
|
||||
}
|
||||
else
|
||||
TurnToFire(%obj, %target);
|
||||
%obj.target = %target;
|
||||
}
|
||||
|
||||
function TurnToFire(%obj, %target){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(!isObject(%target)){
|
||||
DronefindTarget(%obj);
|
||||
return;
|
||||
}
|
||||
if(%obj.dodgeground == 1)
|
||||
return;
|
||||
|
||||
%pos = %obj.getPosition();
|
||||
%Tpos = %target.getPosition();
|
||||
%objfrd = %obj.getForwardVector();
|
||||
%trgfrd = %target.getForwardVector();
|
||||
%objup = %obj.getUpVector();
|
||||
%Tvel = %target.getVelocity();
|
||||
|
||||
%dist = vectorDist(%pos,%Tpos);
|
||||
%aimPos = vectorAdd(%Tpos, vectorScale(%Tvel,(%dist / 1750)));
|
||||
%aimvec = vectorNormalize(vectorSub(%aimPos,%pos));
|
||||
|
||||
if(vectorDist(%objfrd,%aimvec) < 0.1 && %dist <= 1000){
|
||||
if((vectorDist(%objfrd,%trgfrd) < 0.2 || vectorDist(%objfrd,%trgfrd) > 1.8) && %obj.missiling != 1){
|
||||
%obj.setImageTrigger(4, true);
|
||||
%obj.missiling = 1;
|
||||
}
|
||||
else if(%obj.missiling == 1){
|
||||
%obj.setImageTrigger(4, false);
|
||||
%obj.missiling = 0;
|
||||
}
|
||||
// if (%obj.firing != 1){
|
||||
%obj.setImageTrigger(2, true);
|
||||
%obj.setImageTrigger(3, true);
|
||||
%obj.firing = 1;
|
||||
// }
|
||||
}
|
||||
else{
|
||||
if(%obj.firing == 1){
|
||||
%obj.setImageTrigger(2, false);
|
||||
%obj.setImageTrigger(3, false);
|
||||
%obj.firing = 0;
|
||||
}
|
||||
if(%obj.missiling == 1){
|
||||
%obj.setImageTrigger(4, false);
|
||||
%obj.missiling = 0;
|
||||
}
|
||||
}
|
||||
%vec = vectorSub(%aimvec , %objfrd);
|
||||
%vec = vectorCross(%vec, %objfrd);
|
||||
%vec = vectorNormalize(vectorCross(%objfrd, %vec));
|
||||
if(vectorDist(%objfrd,%trgfrd) > 1.8 && %dist <= 120){
|
||||
%vec = vectorScale(%vec, -1);
|
||||
if(vectorDist(%objfrd,vectorNormalize(%aimvec)) > 1.8)
|
||||
%obj.applyImpulse(vectorAdd(%obj.getPosition(),vectorScale(%objfrd,($Drone::TurnImpulse / 2))),%vec);
|
||||
else if(vectorDist(%objup, %vec) > 0.1){
|
||||
%vec = vectorSub(%vec, %objup);
|
||||
%vec = vectorCross(%vec, %objup);
|
||||
%vec = vectorNormalize(vectorCross(%objup, %vec));
|
||||
%pos = vectorAdd(%obj.getPosition(),vectorScale(%objup,$Drone::TurnImpulse * 3 * %obj.skill));
|
||||
%obj.applyImpulse(%pos,%vec);
|
||||
}
|
||||
else
|
||||
%obj.applyImpulse(vectorAdd(%obj.getPosition(),%objfrd),vectorScale(%vec,$Drone::TurnImpulse * %obj.skill));
|
||||
}
|
||||
else if(vectorDist(%objfrd,vectorNormalize(%aimvec)) < 0.1)
|
||||
%obj.applyImpulse(vectorAdd(%obj.getPosition(),vectorScale(%objfrd,($Drone::TurnImpulse / 2))),%vec);
|
||||
else if(vectorDist(%objup, %vec) > 0.1){
|
||||
%vec = vectorSub(%vec, %objup);
|
||||
%vec = vectorCross(%vec, %objup);
|
||||
%vec = vectorNormalize(vectorCross(%objup, %vec));
|
||||
%pos = vectorAdd(%obj.getPosition(),vectorScale(%objup,$Drone::TurnImpulse * 3 * %obj.skill));
|
||||
%obj.applyImpulse(%pos,%vec);
|
||||
}
|
||||
else
|
||||
%obj.applyImpulse(vectorAdd(%obj.getPosition(),%objfrd),vectorScale(%vec,$Drone::TurnImpulse * %obj.skill));
|
||||
if(getRandom(0,getWord($Drone::newTargetChance,1)) <= getWord($Drone::newTargetChance,0))
|
||||
schedule(100, 0, "DronefindTarget", %obj, %target);
|
||||
else
|
||||
schedule(100, 0, "TurnToFire", %obj, %target);
|
||||
}
|
||||
|
||||
//This function preforms the manuver choosen in Determine Maunver function.
|
||||
function UnderFireManuver(%obj, %manuver, %point, %count){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(%obj.dodgeground == 1)
|
||||
return;
|
||||
if(%count $= "")
|
||||
%count = 0;
|
||||
if(%point $= ""){
|
||||
%point = 0;
|
||||
SetPointVectors(%obj, %manuver);
|
||||
}
|
||||
if(%count >= 30){
|
||||
schedule(100, 0, "DroneDetermineManuver", %obj, %obj.target);
|
||||
return;
|
||||
}
|
||||
%frdvec = %obj.getForwardVector();
|
||||
%upvec = %obj.getUpVector();
|
||||
if(vectorDist(%frdvec, %obj.pointvecfront[%point]) < 0.15 && vectorDist(%upvec, %obj.pointvectop[%point]) < 0.15){
|
||||
%point++;
|
||||
if(%point < $flightManuver::Points[%manuver])
|
||||
schedule(100, 0, "UnderFireManuver", %obj, %manuver, %point, 0);
|
||||
else
|
||||
schedule(100, 0, "DroneDetermineManuver", %obj, %obj.target);
|
||||
return;
|
||||
}
|
||||
if(vectorDist(%frdvec, %obj.pointvecfront[%point]) > 0.1){
|
||||
%vec = vectorSub(%obj.pointvecfront[%point], %frdvec);
|
||||
%vec = vectorCross(%vec, %frdvec);
|
||||
%vec = vectorCross(%frdvec, %vec);
|
||||
%obj.applyImpulse(vectorAdd(%obj.getPosition(),vectorScale(%frdvec,$Drone::TurnImpulse * %obj.skill)),%vec);
|
||||
}
|
||||
if(vectorDist(%upvec, %obj.pointvectop[%point]) > 0.1){
|
||||
%vec = vectorSub(%obj.pointvectop[%point], %upvec);
|
||||
%vec = vectorCross(%vec, %upvec);
|
||||
%vec = vectorCross(%upvec, %vec);
|
||||
%pos = vectorAdd(%obj.getPosition(),vectorScale(%upvec,$Drone::TurnImpulse * 3 * %obj.skill));
|
||||
%obj.applyImpulse(%pos,%vec);
|
||||
}
|
||||
%count++;
|
||||
schedule(100, 0, "UnderFireManuver", %obj, %manuver, %point, %count);
|
||||
}
|
||||
|
||||
//This function finds what vectors each point in the manuver is compaired to the drone.
|
||||
function SetPointVectors(%obj, %manuver){
|
||||
%up = %obj.getUpVector();
|
||||
%forward = %obj.getForwardVector();
|
||||
%right = vectorNormalize(vectorSub(%obj.getEdge("1 0 0"),%obj.getEdge("-1 0 0")));
|
||||
for(%i = 0; %i < $flightManuver::Points[%manuver]; %i++){
|
||||
%pointdir = $flightManuver::Point[%manuver, %i];
|
||||
%topvec = "0 0 0";
|
||||
%frontvec = "0 0 0";
|
||||
if(getWord(%pointdir, 0) > 0)
|
||||
%frontvec = vectorAdd(%frontvec, %right);
|
||||
else if(getWord(%pointdir, 0) < 0)
|
||||
%frontvec = vectorAdd(%frontvec, vectorScale(%right, -1));
|
||||
if(getWord(%pointdir, 1) > 0)
|
||||
%frontvec = vectorAdd(%frontvec, %forward);
|
||||
else if(getWord(%pointdir, 1) < 0)
|
||||
%frontvec = vectorAdd(%frontvec, vectorScale(%forward, -1));
|
||||
if(getWord(%pointdir, 2) > 0)
|
||||
%frontvec = vectorAdd(%frontvec, %up);
|
||||
else if(getWord(%pointdir, 2) < 0)
|
||||
%frontvec = vectorAdd(%frontvec, vectorScale(%up, -1));
|
||||
|
||||
if(getWord(%pointdir, 3) > 0)
|
||||
%topvec = vectorAdd(%topvec, %right);
|
||||
else if(getWord(%pointdir, 3) < 0)
|
||||
%topvec = vectorAdd(%topvec, vectorScale(%right, -1));
|
||||
if(getWord(%pointdir, 4) > 0)
|
||||
%topvec = vectorAdd(%topvec, %forward);
|
||||
else if(getWord(%pointdir, 4) < 0)
|
||||
%topvec = vectorAdd(%topvec, vectorScale(%forward, -1));
|
||||
if(getWord(%pointdir, 5) > 0)
|
||||
%topvec = vectorAdd(%topvec, %up);
|
||||
else if(getWord(%pointdir, 5) < 0)
|
||||
%topvec = vectorAdd(%topvec, vectorScale(%up, -1));
|
||||
|
||||
%obj.pointvecfront[%i] = vectorNormalize(%frontvec);
|
||||
%obj.pointvectop[%i] = vectorNormalize(%topvec);
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
// Tank AI by Dondelium_X
|
||||
// CCM v3.4
|
||||
//------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
$DTank::ForwardForce = 7000;
|
||||
$DTank::BackForce = 3000;
|
||||
$DTank::TurnForce = 2500;
|
||||
|
||||
function StartDTank(%pos,%team,%skill){
|
||||
if(%team $= "")
|
||||
%team = 0;
|
||||
if(%pos $= "")
|
||||
%pos = "0 0 300";
|
||||
if(%skill $= "" || %skill < 1)
|
||||
%skill = 1;
|
||||
else if(%skill > 10)
|
||||
%skill = 10;
|
||||
|
||||
%Drone = new HoverVehicle()
|
||||
{
|
||||
dataBlock = HeavyTank;
|
||||
position = %pos;
|
||||
rotation = "0 0 1 0";
|
||||
team = %team;
|
||||
};
|
||||
MissionCleanUp.add(%Drone);
|
||||
|
||||
setTargetSensorGroup(%Drone.getTarget(), %team);
|
||||
|
||||
%drone.skill = 0.6 + (%skill / 25);
|
||||
|
||||
schedule(100, 0, "DTankScanTargets",%drone);
|
||||
}
|
||||
|
||||
function DTankScanTargets(%obj){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
%pos = %obj.getposition();
|
||||
%closestClient = -1;
|
||||
%closestDistance = 32767;
|
||||
%scandist = 2000 * %obj.skill;
|
||||
%airtrgs = "";
|
||||
%groundtrgs = "";
|
||||
%inftrgs = "";
|
||||
InitContainerRadiusSearch(%pos, %scanDist, $TypeMasks::VehicleObjectType | $TypeMasks::PlayerObjectType);
|
||||
while ((%searchResult = containerSearchNext()) != 0){
|
||||
%objtarget = firstWord(%searchResult);
|
||||
if(isObject(%objtarget) && %objTarget !$= %obj && %objtarget.team != %obj.team){
|
||||
%trgtype = %objtarget.getClassName();
|
||||
if(%trgtype $= "FlyingVehicle")
|
||||
%airtrgs = %airtrgs SPC %objtarget;
|
||||
else if(%trgtype $= "HoverVehicle")
|
||||
%groundtrgs = %groundtrgs SPC %objtarget;
|
||||
else if(%trgtype $= "Player")
|
||||
%inftrgs = %inftrgs SPC %objtarget;
|
||||
}
|
||||
}
|
||||
if(%groundtrgs){
|
||||
%target = firstWord(%groundtrgs);
|
||||
%groundtrgs = getWords(%groundtrgs,1,4);
|
||||
DTankGroundCombat(%obj, %target,%groundtrgs);
|
||||
}
|
||||
else if(%inftrgs){
|
||||
%target = firstWord(%inftrgs);
|
||||
%inftrgs = getWords(%inftrgs,1,4);
|
||||
DTankInfCombat(%obj, %target,%inftrgs);
|
||||
}
|
||||
else if(%airtrgs){
|
||||
%target = firstWord(%airtrgs);
|
||||
%airtrgs = getWords(%airtrgs,1,4);
|
||||
DTankAACombat(%obj, %target,%airtrgs);
|
||||
}
|
||||
else{
|
||||
schedule(3000, 0, "DTankScanTargets", %obj);
|
||||
}
|
||||
}
|
||||
|
||||
function DTankGroundCombat(%obj, %target, %Trglist){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(!isObject(%target)){
|
||||
%obj.turretobject.setImageTrigger(4,false);
|
||||
%obj.firing = "";
|
||||
if(%TrgList){
|
||||
%target = firstWord(%Trglist);
|
||||
%trglist = getWords(%trglist,1,4);
|
||||
}
|
||||
else{
|
||||
DTankScanTargets(%obj);
|
||||
return;
|
||||
}
|
||||
}
|
||||
%pos = %obj.getPosition();
|
||||
%tpos = %target.getPosition();
|
||||
%frdvec = vectorNormalize(getWords(%obj.getForwardVector(),0,1) SPC "0");
|
||||
%chkvec = vectorSub(%tpos,%pos);
|
||||
%chkvec = vectorNormalize(getWords(%chkvec,0,1) SPC "0");
|
||||
%turnvec = vectorsub(%chkvec,%frdvec);
|
||||
%vecdif = vectorlen(%turnvec);
|
||||
if(vectorDist(%pos,%tpos) > 2000){
|
||||
if(%obj.firing){
|
||||
%obj.firing = "";
|
||||
%obj.turret.setImageTrigger(4,false);
|
||||
}
|
||||
%target = "";
|
||||
}
|
||||
else if(vectorDist(%pos,%tpos) > 500){
|
||||
if(%vecdif >= "0.1"){
|
||||
%vec = vectorCross(%turnvec, %frdvec);
|
||||
%vec = vectorNormalize(vectorCross(%obj.getForwardVector(), %vec));
|
||||
%Imppos = vectorAdd(%pos,%obj.getForwardVector());
|
||||
%obj.applyImpulse(%Imppos,vectorScale(%vec,$DTank::TurnForce * %obj.skill));
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(!%obj.firing){
|
||||
%obj.firing = 1;
|
||||
%obj.turretobject.firetype = 3;
|
||||
%obj.turretobject.setTargetObject(%Target);
|
||||
%obj.turretobject.aquireTime = getSimTime();
|
||||
%obj.turretobject.setImageTrigger(4,true);
|
||||
}
|
||||
if(%vecdif < "1.2" || %vecdif >= "1.6"){
|
||||
%Tvec1 = vectorNormalize(vectorcross(%chkvec,"0 0 1"));
|
||||
%Tvec2 = vectorScale(%Tvec1,-1);
|
||||
if(vectordist(%frdvec,%Tvec1) < vectorDist(%frdvec,%Tvec2))
|
||||
%tovec = vectorSub(%Tvec1,%frdvec);
|
||||
else
|
||||
%tovec = vectorSub(%Tvec2,%frdvec);
|
||||
%vec = vectorCross(%Tvec2, %frdvec);
|
||||
%vec = vectorNormalize(vectorCross(%obj.getForwardVector(), %vec));
|
||||
%Imppos = vectorAdd(%pos,%obj.getForwardVector());
|
||||
%obj.applyImpulse(%Imppos,vectorScale(%vec,$DTank::TurnForce * %obj.skill));
|
||||
}
|
||||
}
|
||||
%obj.applyImpulse(%pos,vectorScale(%obj.getForwardVector(),$DTank::ForwardForce));
|
||||
schedule(100, 0, "DTankGroundCombat",%obj,%target,%Trglist);
|
||||
}
|
||||
|
||||
function DTankAACombat(%obj, %target, %Trglist){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(!isObject(%target)){
|
||||
%obj.turretobject.setImageTrigger(2,false);
|
||||
%obj.firing = "";
|
||||
if(%TrgList){
|
||||
%target = firstWord(%Trglist);
|
||||
%trglist = getWords(%trglist,1,4);
|
||||
}
|
||||
else{
|
||||
DTankScanTargets(%obj);
|
||||
return;
|
||||
}
|
||||
}
|
||||
%pos = %obj.getPosition();
|
||||
%tpos = %target.getPosition();
|
||||
if(vectorDist(%pos,%tpos) < 750){
|
||||
if(!%obj.firing){
|
||||
%obj.firing = 1;
|
||||
%obj.turretobject.setTargetObject(%Target);
|
||||
%obj.turretobject.aquireTime = getSimTime();
|
||||
%obj.turretobject.setImageTrigger(2,true);
|
||||
}
|
||||
}
|
||||
else if(vectorDist(%pos,%tpos) > 2000){
|
||||
if(%obj.firing){
|
||||
%obj.firing = "";
|
||||
%obj.turretobject.setImageTrigger(2,false);
|
||||
}
|
||||
%target = "";
|
||||
}
|
||||
schedule(100, 0, "DTankAACombat",%obj,%target,%Trglist);
|
||||
}
|
||||
|
||||
function DTankInfCombat(%obj, %target, %Trglist){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(!isObject(%target) || %target.getState() $= "dead"){
|
||||
%obj.turretobject.setImageTrigger(3,false);
|
||||
%obj.firing = "";
|
||||
if(%TrgList){
|
||||
%target = firstWord(%Trglist);
|
||||
%trglist = getWords(%trglist,1,4);
|
||||
}
|
||||
else{
|
||||
DTankScanTargets(%obj);
|
||||
return;
|
||||
}
|
||||
}
|
||||
%pos = %obj.getPosition();
|
||||
%tpos = %target.getPosition();
|
||||
%frdvec = vectorNormalize(getWords(%obj.getForwardVector(),0,1) SPC "0");
|
||||
%chkvec = vectorSub(%tpos,%pos);
|
||||
%chkvec = vectorNormalize(getWords(%chkvec,0,1) SPC "0");
|
||||
%turnvec = vectorsub(%chkvec,%frdvec);
|
||||
%vecdif = vectorlen(%turnvec);
|
||||
if(vectorDist(%pos,%tpos) > 2000){
|
||||
if(%obj.firing){
|
||||
%obj.firing = "";
|
||||
%obj.turret.setImageTrigger(3,false);
|
||||
}
|
||||
%target = "";
|
||||
}
|
||||
else if(vectorDist(%pos,%tpos) > 300){
|
||||
if(%vecdif >= "0.1"){
|
||||
%vec = vectorCross(%turnvec, %frdvec);
|
||||
%vec = vectorNormalize(vectorCross(%obj.getForwardVector(), %vec));
|
||||
%Imppos = vectorAdd(%pos,%obj.getForwardVector());
|
||||
%obj.applyImpulse(%Imppos,vectorScale(%vec,$DTank::TurnForce * %obj.skill));
|
||||
}
|
||||
}
|
||||
else{
|
||||
if(!%obj.firing){
|
||||
%obj.firing = 1;
|
||||
%obj.turretobject.firetype = 1;
|
||||
%obj.turretobject.setTargetObject(%Target);
|
||||
%obj.turretobject.aquireTime = getSimTime();
|
||||
%obj.turretobject.setImageTrigger(3,true);
|
||||
}
|
||||
if(vectorDist(%pos,%tpos) < 100){
|
||||
if(%vecdif <= "1.6"){
|
||||
%vec = vectorCross(%turnvec, %frdvec);
|
||||
%vec = vectorNormalize(vectorCross(%obj.getForwardVector(), %vec));
|
||||
%Imppos = vectorAdd(%pos,%obj.getForwardVector());
|
||||
%obj.applyImpulse(%Imppos,vectorScale(%vec,$DTank::TurnForce * %obj.skill * "-1"));
|
||||
}
|
||||
}
|
||||
else {
|
||||
if(%vecdif < "1.2" || %vecdif >= "1.6"){
|
||||
%Tvec1 = vectorNormalize(vectorcross(%chkvec,"0 0 1"));
|
||||
%Tvec2 = vectorScale(%Tvec1,-1);
|
||||
if(vectordist(%frdvec,%Tvec1) < vectorDist(%frdvec,%Tvec2))
|
||||
%tovec = vectorSub(%Tvec1,%frdvec);
|
||||
else
|
||||
%tovec = vectorSub(%Tvec2,%frdvec);
|
||||
%vec = vectorCross(%Tvec2, %frdvec);
|
||||
%vec = vectorNormalize(vectorCross(%obj.getForwardVector(), %vec));
|
||||
%Imppos = vectorAdd(%pos,%obj.getForwardVector());
|
||||
%obj.applyImpulse(%Imppos,vectorScale(%vec,$DTank::TurnForce * %obj.skill));
|
||||
}
|
||||
}
|
||||
}
|
||||
%obj.applyImpulse(%pos,vectorScale(%obj.getForwardVector(),$DTank::ForwardForce));
|
||||
schedule(100, 0, "DTankInfCombat",%obj,%target,%Trglist);
|
||||
}
|
||||
283
scripts/modscripts/ai/s11.cs
Normal file
283
scripts/modscripts/ai/s11.cs
Normal file
|
|
@ -0,0 +1,283 @@
|
|||
$S11manuverforce = 75;
|
||||
$S11flyforce = 350;
|
||||
$S11forwardspeed = 120;
|
||||
$S11hoverheight = 3;
|
||||
$S11hoverforce = 100;
|
||||
$S11reconheight = "450 550";
|
||||
$S11reconradius = 700;
|
||||
|
||||
$S11[move] = "TAKEOFF MOVE LAND IDLE";
|
||||
$S11[guard] = "TAKEOFF RECON";
|
||||
$S11[attack] = "TAKEOFF MOE FIRE MOVE LAND IDLE";
|
||||
$S11[rearm] = "TAKEOFF MOVE LAND REARM TAKEOFF MOVE LAND IDLE";
|
||||
|
||||
function S11Think(%obj){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(%obj.tasks !$= ""){
|
||||
%task = getWord(%obj.tasks,0);
|
||||
%fun = "S11"@%task;
|
||||
%obj.mode = %task;
|
||||
if(%obj.specvar[%task] !$= "")
|
||||
schedule(10, 0, %fun, %obj, %obj.specvar[%task]);
|
||||
else
|
||||
schedule(10, 0, %fun, %obj);
|
||||
}
|
||||
else{
|
||||
%obj.mode = "IDLE";
|
||||
S11IDLE(%obj);
|
||||
}
|
||||
}
|
||||
|
||||
function S11IDLE(%obj){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(%obj.mode !$= "IDLE")
|
||||
return;
|
||||
|
||||
%pos = %obj.getPosition();
|
||||
%mask = $TypeMasks::InteriorObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType;
|
||||
%vector = vectorAdd(%pos,vectorScale("0 0 -1",$S11hoverheight));
|
||||
%searchResult = containerRayCast(%pos, %vector, %mask, %obj);
|
||||
if(%searchresult){
|
||||
%obj.applyImpulse(%pos,vectorScale("0 0 1",$S11hoverforce));
|
||||
}
|
||||
|
||||
schedule(100, 0, "S11IDLE", %obj);
|
||||
}
|
||||
|
||||
function S11TAKEOFF(%obj){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(%obj.mode !$= "TAKEOFF")
|
||||
return;
|
||||
%pos = %obj.getPosition();
|
||||
%mask = $TypeMasks::InteriorObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType;
|
||||
%vector = vectorAdd(%pos,"0 0 -20");
|
||||
%searchResult = containerRayCast(%pos, %vector, %mask, %obj);
|
||||
if(%searchresult)
|
||||
%obj.applyImpulse(%pos,"0 0 200");
|
||||
else{
|
||||
%obj.tasks = getWords(%obj.tasks,1,(getNumberOfWords(%obj.tasks) - 1));
|
||||
S11Think(%obj);
|
||||
return;
|
||||
}
|
||||
schedule(100, 0, "S11TAKEOFF", %obj);
|
||||
}
|
||||
|
||||
function S11LAND(%obj){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(%obj.mode !$= "LAND")
|
||||
return;
|
||||
|
||||
%pos = %obj.getPosition();
|
||||
%mask = $TypeMasks::InteriorObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType;
|
||||
%vector = vectorAdd(%pos,"0 0" SPC (-10 - $S11hoverheight));
|
||||
%searchResult = containerRayCast(%pos, %vector, %mask, %obj);
|
||||
if(%searchresult){
|
||||
%dist = vectorDist(%pos,posfromraycast(%searchresult));
|
||||
if(%dist <= $S11hoverheight){
|
||||
%obj.tasks = getWords(%obj.tasks,1,(getNumberOfWords(%obj.tasks) - 1));
|
||||
S11Think(%obj);
|
||||
return;
|
||||
}
|
||||
%speed = vectorScale("0 0 -1",%dist);
|
||||
%obj.setVelocity(%speed);
|
||||
}
|
||||
else{
|
||||
%vel = %obj.getVelocity();
|
||||
%reqvel = "0 0 -15";
|
||||
%impvec = vectorScale(vectorSub(%reqvel,%vel),%obj.getDatablock().mass);
|
||||
%obj.applyImpulse(%pos,%impvec);
|
||||
}
|
||||
schedule(100, 0, "S11LAND", %obj);
|
||||
}
|
||||
|
||||
function S11MOVE(%obj, %movepos){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(%obj.mode !$= "MOVE")
|
||||
return;
|
||||
|
||||
%pos = %obj.getPosition();
|
||||
%mask = $TypeMasks::InteriorObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType;
|
||||
%vector = vectorAdd(%pos,"0 0 -150");
|
||||
%searchResult = containerRayCast(%pos, %vector, %mask, %obj);
|
||||
%vec = "0 0 0";
|
||||
%frd = %obj.getForwardVector();
|
||||
if(vectorlen(%obj.getVelocity()) <= $S11forwardspeed)
|
||||
%vec = vectorScale(%frd,$S11flyforce);
|
||||
if(%searchresult)
|
||||
%vec = vectorAdd(%vec,"0 0 150");
|
||||
%tstpos = getWords(%movepos,0,1) SPC getWord(%pos,2);
|
||||
%dist = vectorDist(%tstpos,%pos);
|
||||
if(%dist > 10){
|
||||
%aimvec = vectorSub(%tstpos,%pos);
|
||||
%tvec = vectorNormalize(vectorCross(%aimvec, %frd));
|
||||
%tvec = vectorNormalize(vectorCross(%frd, %tvec));
|
||||
%obj.applyImpulse(vectorAdd(%pos,%frd),vectorScale(%tvec,$S11manuverforce));
|
||||
}
|
||||
else{
|
||||
if(%obj.specvar["MOVE",2] !$= ""){
|
||||
%obj.specvar["MOVE"] = %obj.specvar["MOVE",2];
|
||||
%obj.specvar["MOVE",2] = "";
|
||||
}
|
||||
%obj.tasks = getWords(%obj.tasks,1,(getNumberOfWords(%obj.tasks) - 1));
|
||||
S11Think(%obj);
|
||||
return;
|
||||
}
|
||||
%obj.applyImpulse(%pos,%vec);
|
||||
schedule(100, 0, "S11MOVE",%obj,%movepos);
|
||||
}
|
||||
|
||||
function S11RECON(%obj,%reconPos){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(%obj.mode !$= "RECON")
|
||||
return;
|
||||
|
||||
%pos = %obj.getPosition();
|
||||
%mask = $TypeMasks::InteriorObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType;
|
||||
%vector = vectorAdd(%pos,"0 0 -1000");
|
||||
%searchResult = containerRayCast(%pos, %vector, %mask, %obj);
|
||||
if(%searchresult){
|
||||
%frd = %obj.getForwardVector();
|
||||
%vec = "0 0 0";
|
||||
if(vectorlen(%obj.getVelocity()) <= $S11forwardspeed)
|
||||
%vec = vectorScale(%frd,$S11flyforce);
|
||||
%dist = vectorDist(%pos,posfromraycast(%searchresult));
|
||||
if(%dist < getWord($S11reconheight,0))
|
||||
%vec = vectorAdd(%vec,"0 0 450");
|
||||
if(%dist > getWord($S11reconheight,1))
|
||||
%vec = vectorAdd(%vec,"0 0 -450");
|
||||
|
||||
%tstpos = getWords(%reconPos,0,1) SPC getWord(%pos,2);
|
||||
%dist = vectorDist(%tstpos,%pos);
|
||||
if(%dist > $S11reconradius){
|
||||
%aimvec = vectorSub(%tstpos,%pos);
|
||||
%tvec = vectorNormalize(vectorCross(%aimvec, %frd));
|
||||
%tvec = vectorNormalize(vectorCross(%frd, %tvec));
|
||||
%obj.applyImpulse(vectorAdd(%pos,%frd),vectorScale(%tvec,$S11manuverforce));
|
||||
}
|
||||
%obj.applyImpulse(%pos,%vec);
|
||||
}
|
||||
else{
|
||||
%vel = %obj.getVelocity();
|
||||
%reqvel = "0 0 -50";
|
||||
%impvec = vectorScale(vectorSub(%reqvel,%vel),%obj.getDatablock().mass);
|
||||
%obj.applyImpulse(%pos,%impvec);
|
||||
}
|
||||
schedule(100, 0, "S11RECON",%obj,%reconpos);
|
||||
}
|
||||
|
||||
function S11MOE(%obj,%target){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(%obj.mode !$= "MOE")
|
||||
return;
|
||||
if(!isObject(%target)){
|
||||
%obj.tasks = getWords(%obj.tasks,1,(getNumberOfWords(%obj.tasks) - 1));
|
||||
S11Think(%obj);
|
||||
return;
|
||||
}
|
||||
|
||||
%pos = %obj.getPosition();
|
||||
%frd = %obj.getForwardVector();
|
||||
%mask = $TypeMasks::InteriorObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::TerrainObjectType;
|
||||
%vector = vectorAdd(%pos,vectorScale(%frd,100));
|
||||
%searchResult = containerRayCast(%pos, %vector, %mask, %obj);
|
||||
if(!%searchResult){
|
||||
%tstvec = vectorAdd(%vector,"0 0 -50");
|
||||
%searchResult2 = containerRayCast(%vector, %tstvec, %mask, %obj);
|
||||
if(%searchResult2)
|
||||
%dir = "1";
|
||||
else
|
||||
%dir = "-1";
|
||||
}
|
||||
else
|
||||
%dir = "2";
|
||||
|
||||
%impvec = vectorScale(%obj.getUpVector(),$S11manuverforce * %dir);
|
||||
|
||||
%Tpos = %target.getPosition();
|
||||
%tstpos = getWords(%TPos,0,1) SPC getWord(%pos,2);
|
||||
%aimvec = VectorNormalize(vectorSub(%tstpos,%pos));
|
||||
%dist = vectorDist(%frd,%aimvec);
|
||||
if(%dist > 0.1){
|
||||
%aimvec = vectorSub(%tstpos,%pos);
|
||||
%tvec = vectorNormalize(vectorCross(%aimvec, %frd));
|
||||
%tvec = vectorNormalize(vectorCross(%frd, %tvec));
|
||||
%impvec = vectorAdd(%impvec,vectorScale(%tvec,$S11manuverforce));
|
||||
}
|
||||
if(vectorDist(%pos, %Tpos) < 500){
|
||||
%obj.tasks = getWords(%obj.tasks,1,(getNumberOfWords(%obj.tasks) - 1));
|
||||
S11Think(%obj);
|
||||
return;
|
||||
}
|
||||
|
||||
%obj.applyImpulse(vectorAdd(%pos,%frd),%impvec);
|
||||
if(vectorlen(%obj.getVelocity()) <= $S11forwardspeed)
|
||||
%obj.applyImpulse(%pos,vectorScale(%obj.getForwardVector(),$S11flyforce));
|
||||
|
||||
schedule(100, 0, "S11MOE", %obj,%target);
|
||||
}
|
||||
|
||||
function S11REARM(%obj){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(%obj.mode !$= "REARM")
|
||||
return;
|
||||
|
||||
%obj.setVelocity("0 0 0");
|
||||
|
||||
if (%obj.turret.inv[AALauncherAmmo] < 1)
|
||||
%obj.turret.setInventory(AALauncherAmmo, 1);
|
||||
else if(%DamageLevel > 0)
|
||||
%obj.setRepairRate(0.01);
|
||||
else {
|
||||
%obj.setRepairRate(0);
|
||||
S11Think(%obj);
|
||||
return;
|
||||
}
|
||||
|
||||
schedule(100, 0, "S11REARM", %obj, %target);
|
||||
}
|
||||
|
||||
function S11FIRE(%obj,%target){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(%obj.mode !$= "FIRE")
|
||||
return;
|
||||
if(!isObject(%target)){
|
||||
%obj.tasks = getWords(%obj.tasks,1,(getNumberOfWords(%obj.tasks) - 1));
|
||||
S11Think(%obj);
|
||||
return;
|
||||
}
|
||||
%turret = %obj.turret;
|
||||
if(%turret.inv[AALauncherAmmo] >= 1){
|
||||
%turret.target = %target;
|
||||
if(%obj.aiming != 1){
|
||||
%obj.aiming = 1;
|
||||
%turret.setTargetObject(%target);
|
||||
%turret.aquireTime = getSimTime();
|
||||
%turret.setImageTrigger(2,true);
|
||||
}
|
||||
else if(isObject(%turret.TLB)){
|
||||
%turret.setImageTrigger(3,true);
|
||||
}
|
||||
}
|
||||
else{
|
||||
%obj.aiming = 0;
|
||||
%turret.setImageTrigger(2,false);
|
||||
%turret.setImageTrigger(3,false);
|
||||
%obj.tasks = getWords(%obj.tasks,1,(getNumberOfWords(%obj.tasks) - 1));
|
||||
S11Think(%obj);
|
||||
return;
|
||||
}
|
||||
%frd = %obj.getForwardVector();
|
||||
%impvec = vectorAdd(vectorScale(%frd,$S11flyforce),"0 0 150");
|
||||
if(vectorlen(%obj.getVelocity()) <= $S11forwardspeed)
|
||||
%obj.applyImpulse(%obj.getPosition(),%impvec);
|
||||
schedule(100, 0, "S11FIRE", %obj, %target);
|
||||
}
|
||||
107
scripts/modscripts/ai/s17.cs
Normal file
107
scripts/modscripts/ai/s17.cs
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
$S17moveforce = 500;
|
||||
|
||||
function S17Think(%obj){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(%obj.task !$= ""){
|
||||
%task = %obj.task;
|
||||
%fun = "S17"@%task;
|
||||
%obj.mode = %task;
|
||||
cancel(%obj.loop);cancel(%obj.loop);cancel(%obj.loop);
|
||||
if(%obj.specvar[%task] !$= "")
|
||||
%obj.loop = schedule(10, 0, %fun, %obj, %obj.specvar[%task]);
|
||||
else
|
||||
%obj.loop = schedule(10, 0, %fun, %obj);
|
||||
}
|
||||
}
|
||||
|
||||
function S17GUARD(%obj,%pos){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
%obj.mode = "MOVE";
|
||||
S17MOVE(%obj,%pos);
|
||||
}
|
||||
|
||||
function S17MOVE(%obj,%pos){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(%obj.mode !$= "MOVE")
|
||||
return;
|
||||
|
||||
%objpos = %obj.getPosition();
|
||||
%dist = vectorDist(%pos,%objpos);
|
||||
if(%dist > 10){
|
||||
%vec = vectorNormalize(vectorSub(%pos,%objpos));
|
||||
%vec = vectorScale(%vec,$S17moveforce);
|
||||
%obj.applyImpulse(%objpos,%vec);
|
||||
}
|
||||
else
|
||||
return;
|
||||
%obj.loop = schedule(100, 0, "S17MOVE",%obj,%pos);
|
||||
}
|
||||
|
||||
function S17ATTACK(%obj,%target){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(!isObject(%target)){
|
||||
%obj.val = "";
|
||||
return;
|
||||
}
|
||||
if(%obj.mode !$= "ATTACK"){
|
||||
%obj.val = "";
|
||||
return;
|
||||
}
|
||||
|
||||
%objpos = %obj.getPosition();
|
||||
%trgpos = %target.getPosition();
|
||||
%dist = vectorDist(%trgpos,%objpos);
|
||||
if(%dist > 100){
|
||||
%vec = vectorNormalize(vectorSub(%pos,%objpos));
|
||||
%vec = vectorScale(%vec,$S17moveforce);
|
||||
%obj.applyImpulse(%objpos,%vec);
|
||||
}
|
||||
else {
|
||||
%vec = vectorSub(%trgpos,%objpos);
|
||||
%random = getRandom(1,2);
|
||||
if(%obj.val $= ""){
|
||||
if(%random == 1)
|
||||
%obj.val = "0 0 -1";
|
||||
else
|
||||
%obj.val = "0 0 1";
|
||||
}
|
||||
%vec = vectorNormalize(vectorCross(%vec,%val));
|
||||
%vec = vectorScale(%vec,$S17moveforce);
|
||||
%obj.applyImpulse(%objpos,%vec);
|
||||
}
|
||||
%obj.loop = schedule(100, 0, "S17ATTACK",%obj,%target);
|
||||
}
|
||||
|
||||
function S17REARM(%obj,%target){
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(!isObject(%target)){
|
||||
%target.setRepairRate(0);
|
||||
return;
|
||||
}
|
||||
if(%obj.mode !$= "REARM"){
|
||||
%target.setRepairRate(0);
|
||||
return;
|
||||
}
|
||||
|
||||
%objpos = %obj.getPosition();
|
||||
%trgpos = %target.getPosition();
|
||||
%dist = vectorDist(%trgpos,%objpos);
|
||||
%DamageLevel = %targetObject.getDamageLevel();
|
||||
if(%dist > 6){
|
||||
%vec = vectorNormalize(vectorCross(%vec,%val));
|
||||
%vec = vectorScale(%vec,$S17moveforce);
|
||||
%obj.applyImpulse(%objpos,%vec);
|
||||
}
|
||||
else if(%DamageLevel > 0)
|
||||
%obj.setRepairRate(0.01);
|
||||
else {
|
||||
%obj.setRepairRate(0);
|
||||
return;
|
||||
}
|
||||
%obj.loop = schedule(100, 0, "S17ATTACK",%obj,%target);
|
||||
}
|
||||
947
scripts/modscripts/chatcommands/admin.cs
Normal file
947
scripts/modscripts/chatcommands/admin.cs
Normal file
|
|
@ -0,0 +1,947 @@
|
|||
//==============================================================================
|
||||
// Admin Commands
|
||||
//==============================================================================
|
||||
|
||||
// Command by Eolk. Modified by Blnukem.
|
||||
function ccset(%sender, %args)
|
||||
{
|
||||
%base = strlwr(getword(%args, 0));
|
||||
%param = getword(%args, 1);
|
||||
switch$(%base)
|
||||
{
|
||||
case "canzombie":
|
||||
if(%sender.isAdmin)
|
||||
{
|
||||
if(%param != 1 && %param != 0)
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2Invalid parameters. Use 1 for canZombie to be on, use 0 for canZombie to be off.");
|
||||
return;
|
||||
}
|
||||
|
||||
$Host::canZombie = %param;
|
||||
messageAll('MsgAdminForce', "\c1"@%sender.nameBase@" \c2changed \c5HUMAN ZOMBIES \c2to \c5"@%param@"\c2.");
|
||||
export( "$Host::*", "prefs/ServerPrefs.cs", false );
|
||||
echo("$Host::canZombie (human zombies) changed by "@%sender.nameBase@" ("@%sender@") to "@$Host::canZombie@" via ccSet");
|
||||
}
|
||||
case "joinpw":
|
||||
if(%sender.isSuperAdmin)
|
||||
{
|
||||
if(%param $= "")
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2No Changes. You did not supply a value. Use \"remove\" to remove join pw.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(strlwr(%param) $= "remove")
|
||||
$Host::Password = "";
|
||||
else
|
||||
$Host::Password = %param;
|
||||
|
||||
messageAll('MsgAdminForce', "\c1"@%sender.nameBase@" \c2changed \c5JOIN PASSWORD\c2.");
|
||||
messageClient(%sender, "MsgYes", "\c2Join password changed to "@$Host::Password);
|
||||
export( "$Host::*", "prefs/ServerPrefs.cs", false );
|
||||
echo("$Host::Password (server password) changed by "@%sender.nameBase@" ("@%sender@") to "@$Host::Password@" via ccSet");
|
||||
}
|
||||
case "maxplyrs":
|
||||
if(!%sender.isSuperAdmin)
|
||||
return;
|
||||
|
||||
%failed = false;
|
||||
for(%i = 0; %i < strlen(%param); %i++)
|
||||
{
|
||||
%temp = getsubstr(%param, %i, 1);
|
||||
if(%temp !$= "1" && %temp !$= "2" && %temp !$= "3" && %temp !$= "4" && %temp !$= "5" && %temp !$= "6" && %temp !$= "7" && %temp !$= "8" && %temp !$= "9" && %temp !$= "0")
|
||||
{
|
||||
%failed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(%param < 0)
|
||||
%failed = true;
|
||||
|
||||
if(%failed == true)
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2No changes. You supplied an invalid number. Must be over 0.");
|
||||
return;
|
||||
}
|
||||
|
||||
$Host::MaxPlayers = %param;
|
||||
messageAll('MsgAdminForce', "\c1"@%sender.nameBase@" \c2changed \c5MAX PLAYERS\c2 to \c5"@$Host::MaxPlayers@"\c2.");
|
||||
export( "$Host::*", "prefs/ServerPrefs.cs", false );
|
||||
echo("$Host::MaxPlayers (maximum players allowed by the server) changed by "@%sender.nameBase@" ("@%sender@") to "@$Host::MaxPlayers@" via ccSet");
|
||||
case "restrict":
|
||||
if(%sender.isAdmin)
|
||||
{
|
||||
%target = plnametocid(%param);
|
||||
if(!isObject(%target))
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2Unable to find target.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%target.isAdmin)
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2Cannot do this to admins.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!%target.CannotDeploy)
|
||||
{
|
||||
%target.CannotDeploy = 1;
|
||||
messageClient(%sender, "MsgYes", "\c2"@%target.nameBase@"'s ability to deploy things has been revoked.~wfx/misc/diagnostic_on.wav");
|
||||
echo(%sender.namebase@" ("@%sender@") disabled "@%target.nameBase@"'s ("@%target@") ability to deploy objects");
|
||||
}
|
||||
else
|
||||
{
|
||||
%target.CannotDeploy = 0;
|
||||
messageClient(%sender, "MsgYes", "\c2"@%target.nameBase@" is free to deploy things again.~wfx/misc/diagnostic_on.wav");
|
||||
echo(%sender.namebase@" ("@%sender@") enabled "@%target.nameBase@"'s ("@%target@") ability to deploy objects");
|
||||
}
|
||||
}
|
||||
case "noinfection":
|
||||
if(%sender.isAdmin)
|
||||
{
|
||||
if(%param != 0 && %param != 1)
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2No changes. You supplied an invalid type. Use 1 for on, use 0 for off.");
|
||||
return;
|
||||
}
|
||||
|
||||
$Host::NoInfection = %param;
|
||||
messageAll('MsgAdminForce', "\c1"@%sender.nameBase@" \c2changed \c5NO INFECTION \c2to \c5"@%param@"\c2.");
|
||||
export( "$Host::*", "prefs/ServerPrefs.cs", false );
|
||||
echo("$Host::NoInfection (no infection) changed by "@%sender.nameBase@" ("@%sender@") to "@$Host::NoInfection@" via ccSet");
|
||||
}
|
||||
case "autosave":
|
||||
if(%sender.isSuperAdmin) // SA
|
||||
{
|
||||
if(%param != 1 && %param != 0)
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2Invalid parameters. Input 1 for start, input 0 for end.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%param == 1)
|
||||
if($SaveBuilding::TimerEnabled)
|
||||
{
|
||||
saveBuildingTimerOn(); // This resets.
|
||||
messageAll('MsgAdminForce', "\c2"@%sender.nameBase@" has reset the autosave timer.");
|
||||
echo(%sender.nameBase@" ("@%sender@") has reset the autosave timer via ccSet");
|
||||
}
|
||||
else
|
||||
{
|
||||
saveBuildingTimer(0, 1, 0, 0);
|
||||
messageAll('MsgAdminForce', "\c2"@%sender.nameBase@" has enabled the autosave timer.");
|
||||
echo(%sender.nameBase@" ("@%sender@") has enabled the autosave timer via ccSet");
|
||||
}
|
||||
else
|
||||
if($SaveBuilding::TimerEnabled)
|
||||
{
|
||||
saveBuildingTimerOff();
|
||||
messageAll('MsgAdminForce', "\c2"@%sender.nameBase@" has disabled the autosave timer.");
|
||||
echo(%sender.nameBase@" ("@%sender@") has disabled the autosave timer via ccSet");
|
||||
}
|
||||
else
|
||||
messageClient(%sender, "", "\c2Cannot disable the autosave timer if it is already disabled!");
|
||||
}
|
||||
case "lockedteams":
|
||||
if(%sender.isAdmin)
|
||||
{
|
||||
if(%param != 1 && %param != 0)
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2Invalid parameters. Input 1 for lock, input 0 for unlock.");
|
||||
return;
|
||||
}
|
||||
|
||||
$Host::LockedTeams = %param;
|
||||
messageAll('MsgAdminForce', "\c2"@%sender.nameBase@" has changed locked teams to "@%param@".");
|
||||
export( "$Host::*", "prefs/ServerPrefs.cs", false );
|
||||
echo("$Host::LockedTeams (locked, unchangeable teams) has been changed by "@%sender.nameBase@" ("@%sender@") to "@$Host::LockedTeams@" via ccSet");
|
||||
}
|
||||
case "sapass":
|
||||
if(%sender.isSuperAdmin)
|
||||
{
|
||||
$Host::SuperAdminPassword = %param;
|
||||
messageClient(%sender, "", "\c2Super admin password changed to "@%param);
|
||||
export( "$Host::*", "prefs/ServerPrefs.cs", false );
|
||||
echo("$Host::SuperAdminPassword (super admin password or SAD) has been changed by "@%sender.nameBase@" ("@%sender@") to "@$Host::SuperAdminPassword@" via ccSet");
|
||||
}
|
||||
case "apass":
|
||||
if(%sender.isSuperAdmin)
|
||||
{
|
||||
$Host::AdminPassword = %param;
|
||||
messageClient(%sender, "", "\c2Admin password changed to "@%param);
|
||||
export( "$Host::*", "prefs/ServerPrefs.cs", false );
|
||||
echo("$Host::AdminPassword (admin password or AD) has been changed by "@%sender.nameBase@" ("@%sender@") to "@$Host::AdminPassword@" via ccSet");
|
||||
}
|
||||
case "fairteams":
|
||||
if(%sender.isAdmin)
|
||||
{
|
||||
if(%param != 1 && %param != 0)
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2Invalid parameters. Input 1 for enabled, input 0 for disable.");
|
||||
return;
|
||||
}
|
||||
|
||||
$Host::FairTeams = %param;
|
||||
messageAll("", "\c2"@%sender.nameBase@" has changed Fair Teams to "@%param@".");
|
||||
export( "$Host::*", "prefs/ServerPrefs.cs", false );
|
||||
echo("$Host::FairTeams (unbalanced team preventer) has been changed by "@%sender.nameBase@" ("@%sender@") to "@$Host::FairTeams@" via ccSet");
|
||||
}
|
||||
default:
|
||||
messageClient(%sender, "MsgNo", "\c2Invalid command. Valid commands are canzombie, zombieteam, joinpw, maxplyrs, restrict, zturrets");
|
||||
messageClient(%sender, "MsgNo", "\c2noinfection, dir, lockedteams, sapass, apass, fairteams, and autosave");
|
||||
}
|
||||
}
|
||||
|
||||
// Command by Eolk.
|
||||
function ccA(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
for(%i = 0; %i < ClientGroup.getCount(); %i++)
|
||||
{
|
||||
%cl = ClientGroup.getObject(%i);
|
||||
if(%cl.isAdmin)
|
||||
messageClient(%cl, 'MsgYes', "\c3[A]\c2"@%sender.nameBase@": "@%args);
|
||||
}
|
||||
logEcho("[ADMIN CHAT]: "@%sender.nameBase@": "@%args);
|
||||
}
|
||||
|
||||
// Command by Eolk (honestly, even though it looks like someone else's code).
|
||||
function ccCancelVote(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
if(Game.ScheduleVote $= "")
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2There is no vote to cancel!");
|
||||
return;
|
||||
}
|
||||
|
||||
cancel(Game.scheduleVote);
|
||||
|
||||
Game.votingArgs = "";
|
||||
Game.scheduleVote = "";
|
||||
Game.kickClient = "";
|
||||
clearVotes();
|
||||
|
||||
messageAll('closeVoteHud', "");
|
||||
if(%client.team != 0)
|
||||
clearBottomPrint(%client);
|
||||
|
||||
messageAll('MsgAdminForce', "\c3"@%sender.nameBase@" \c2has cancelled the vote.");
|
||||
messageAll('MsgVoteFailed', "");
|
||||
logEcho(%sender.nameBase@" ("@%sender@") has cancelled the vote");
|
||||
}
|
||||
|
||||
// Command by Eolk.
|
||||
function ccBottomPrint(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
if(%args $= "")
|
||||
{
|
||||
messageClient(%sender, 'MsgNo', "\c2Must supply text to display!");
|
||||
return;
|
||||
}
|
||||
|
||||
%print = %args;
|
||||
%wave = strstr(%args, "~w");
|
||||
|
||||
if(%wave != -1)
|
||||
%print = getsubstr(%args, 0, %wave);
|
||||
|
||||
BottomprintAll(%sender.nameBase@": "@%print, 10, 3);
|
||||
messageAll("MsgAll", "\c2"@ %sender.namebase@": \c4"@%print@"~wgui/objective_Notification.wav");
|
||||
logEcho("[BOTTOMPRINT]"@%sender.nameBase@" ("@%sender@"): "@%args);
|
||||
}
|
||||
|
||||
// Command by Eolk. Modified by Blnukem
|
||||
function ccCenterPrint(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
if(%args $= "")
|
||||
{
|
||||
messageClient(%sender, 'MsgNo', "\c2Must supply text to display!");
|
||||
return;
|
||||
}
|
||||
|
||||
%print = %args;
|
||||
%wave = strstr(%args, "~w");
|
||||
|
||||
if(%wave != -1)
|
||||
%print = getsubstr(%args, 0, %wave);
|
||||
|
||||
CenterprintAll(%sender.nameBase@": "@%print, 10, 3);
|
||||
messageAll("MsgAll", "\c2"@ %sender.namebase@": \c4"@%print@"~wgui/objective_Notification.wav");
|
||||
logEcho("[BOTTOMPRINT]"@%sender.nameBase@" ("@%sender@"): "@%args);
|
||||
}
|
||||
|
||||
// Eolk
|
||||
function ccJailPlayer(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
if(!$Host::Prison::Enabled)
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2Prison is not enabled.");
|
||||
return;
|
||||
}
|
||||
|
||||
%target = plnametocid(getword(%args, 0));
|
||||
%time = getword(%args, 1);
|
||||
if(!isObject(%target))
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2Target does not exist.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!isObject(%target.player))
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2Target's player does not exist.");
|
||||
return;
|
||||
}
|
||||
|
||||
if((%target.isAdmin && !%sender.isAdmin) || %target.isSuperAdmin)
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2You must outrank the target to jail them.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%target == %sender && %target.isJailed && !%sender.isSuperAdmin)
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2Can only unjail yourself if you are of super admin status.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%time > 600)
|
||||
%time = 600;
|
||||
|
||||
%test = %target.isJailed;
|
||||
JailPlayer(%target, %target.isJailed, %time);
|
||||
if(!%test)
|
||||
{
|
||||
messageClient(%target, "MsgAdminForce", "\c2You have been sentenced to jail.");
|
||||
messageAllExcept(%target, -1, "MsgAdminForce", "\c3"@%target.nameBase@" \c2has been sentenced to jail.");
|
||||
logEcho(%target.nameBase@" ("@%target@") was sentenced to jail by "@%sender.nameBase@" ("@%sender@") for "@%time@" seconds");
|
||||
}
|
||||
else
|
||||
{
|
||||
messageClient(%target, "MsgAdminForce", "\c2You have had your jail sentence cut short.", %sender.nameBase);
|
||||
messageAllExcept(%target, -1, "MsgAdminForce", "\c3"@%target.nameBase@" \c2has had their jail sentence cut short.");
|
||||
logEcho(%target.nameBase@" ("@%target@") was released from jail by "@%sender.nameBase@" ("@%sender@")");
|
||||
}
|
||||
}
|
||||
|
||||
// Command by Eolk.
|
||||
function ccMute(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
%target = plnametocid(%args);
|
||||
if(!isObject(%target))
|
||||
{
|
||||
messageClient(%sender, "", "\c2No such person.");
|
||||
return;
|
||||
}
|
||||
|
||||
if((%target.isAdmin && !%sender.isSuperAdmin) || %target.isSuperAdmin)
|
||||
{
|
||||
messageClient(%sender, "", "\c2Can't mute someone you don't outrank!");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!%target.isSilenced)
|
||||
{
|
||||
messageClient(%target, "", "\c2You have been muted.");
|
||||
%target.isSilenced = 1;
|
||||
messageClient(%sender, "", "\c3"@%target.nameBase@"\c2 has been muted.");
|
||||
logEcho(%sender.nameBase@" ("@%sender@") globally muted "@%target.nameBase@" ("@%target@")");
|
||||
}
|
||||
else
|
||||
{
|
||||
%target.isSilenced = 0;
|
||||
messageClient(%sender, "", "\c3"@%target.nameBase@"\c2 has been unmuted.");
|
||||
logEcho(%sender.nameBase@" ("@%sender@") globally unmuted "@%target.nameBase@" ("@%target@")");
|
||||
}
|
||||
}
|
||||
|
||||
// Chat command by Eolk (special thanks to Krash for bug fixes!)
|
||||
// <3
|
||||
function ccaddteam(%sender)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
if(Game.numTeams >= 2 && $AddedMoreTeams != 1)
|
||||
{
|
||||
messageClient(%sender, 'MsgNo', "\c2There are already enough teams.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!$AddedMoreTeams)
|
||||
{
|
||||
Game.numTeams++;
|
||||
setSensorGroupCount(Game.numTeams);
|
||||
// clearVehicleCount(Game.numTeams + 1); // Not sure about this...
|
||||
$AddedMoreTeams = 1;
|
||||
$NewTeam = Game.numTeams;
|
||||
messageAll('MsgAdminForce', "\c3"@%sender.nameBase@" \c2has added another team.");
|
||||
warn(%sender.nameBase@" ("@%sender@") has added another team");
|
||||
}
|
||||
else
|
||||
{
|
||||
for(%i = 0; %i < ClientGroup.getCount(); %i++)
|
||||
{
|
||||
%obj = ClientGroup.getObject(%i);
|
||||
if(%obj.team == $NewTeam)
|
||||
{
|
||||
Game.forceObserver(%obj, "AdminForce");
|
||||
messageClient(%obj, 'MsgYes', "\c2You have been forced into observer due to being on the deleted team.");
|
||||
}
|
||||
}
|
||||
|
||||
Game.numTeams--;
|
||||
setSensorGroupCount(Game.numTeams);
|
||||
$AddedMoreTeams = 0;
|
||||
$NewTeam = "";
|
||||
messageAll('MsgAdminForce', "\c3"@%sender.nameBase@" \c2has deleted the new team. All people have been forced into observer.");
|
||||
warn(%sender.nameBase@" ("@%sender@") has deleted the new team");
|
||||
}
|
||||
}
|
||||
|
||||
// Eolk
|
||||
function ccSummon(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
if(%sender.isJailed)
|
||||
{
|
||||
messageclient(%sender, "MsgNo", "\c2You cannot do this command while in jail!");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!isObject(%sender.player))
|
||||
{
|
||||
messageclient(%sender, "MsgNo", "\c2You must have a player object in order to do this.");
|
||||
return;
|
||||
}
|
||||
|
||||
%target = plnametocid(%args);
|
||||
if(!isObject(%target))
|
||||
{
|
||||
messageclient(%sender, "MsgNo", "\c2Target does not exist.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%target.isJailed)
|
||||
{
|
||||
messageclient(%sender, "MsgNo", "\c2Target is jailed.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!isObject(%target.player))
|
||||
{
|
||||
messageclient(%sender, "MsgNo", "\c2Your target has to have a player object in order to do this.");
|
||||
return;
|
||||
}
|
||||
|
||||
%x = getword(%sender.player.position, 0);
|
||||
%y = getword(%sender.player.position, 1);
|
||||
%z = getword(%sender.player.position, 2) + 2.5;
|
||||
%newpos = %x SPC %y SPC %z;
|
||||
|
||||
%target.player.setPosition(%newpos);
|
||||
%target.player.setVelocity("0 0 0");
|
||||
|
||||
messageClient(%target, "MsgYes", "\c2You have been summoned by\c3 "@%sender.namebase@"\c2.");
|
||||
messageClient(%sender, "MsgYes", "\c2You have summoned \c3"@%target.namebase@"\c2.");
|
||||
}
|
||||
|
||||
// Blnukem/Eolk
|
||||
function ccDesmurf(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
%target = plnametocid(%args);
|
||||
if(!isObject(%target))
|
||||
{
|
||||
messageClient(%sender, "", "\c2Cannot find target.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!%target.isSmurf)
|
||||
messageClient(%sender, "", "\c2No smurf name detected.");
|
||||
else
|
||||
getRealName(%target, %sender);
|
||||
logEcho(%sender.nameBase@" ("@%sender@") requested non-smurf name of "@%target.nameBase@" ("@%target@")");
|
||||
}
|
||||
|
||||
// Eolk
|
||||
function ccGoto(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
if(%sender.isJailed)
|
||||
{
|
||||
messageclient(%sender, "MsgNo", "\c2You cannot do this command while in jail!");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!isObject(%sender.player))
|
||||
{
|
||||
messageclient(%sender, "MsgNo", "\c2You must have a player object in order to do this.");
|
||||
return;
|
||||
}
|
||||
|
||||
%target = plnametocid(%args);
|
||||
if(!isObject(%target))
|
||||
{
|
||||
messageclient(%sender, "MsgNo", "\c2Target does not exist.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%target.isJailed)
|
||||
{
|
||||
messageclient(%sender, "MsgNo", "\c2Target is jailed.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!isObject(%target.player))
|
||||
{
|
||||
messageclient(%sender, "MsgNo", "\c2Your target has to have a player object in order to do this.");
|
||||
return;
|
||||
}
|
||||
|
||||
%x = getword(%target.player.position, 0);
|
||||
%y = getword(%target.player.position, 1);
|
||||
%z = getword(%target.player.position, 2) + 2.5;
|
||||
%newpos = %x SPC %y SPC %z;
|
||||
|
||||
%sender.player.setPosition(%newpos);
|
||||
%sender.player.setVelocity("0 0 0");
|
||||
|
||||
messageClient(%sender, "MsgYes", "\c2You have gone to\c3 "@%target.namebase@"'s \c2location.");
|
||||
if(%sender.isAdmin)
|
||||
messageClient(%target, "MsgYes", "\c3"@%sender.nameBase@" \c2has come to you.");
|
||||
}
|
||||
|
||||
// Eolk
|
||||
function ccMoveme(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
if(getwordcount(%args) != 3)
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2Your movement was not specified in X Y Z format.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%sender.isJailed)
|
||||
{
|
||||
messageclient(%sender, "MsgNo", "\c2You cannot do this command while in jail!");
|
||||
return;
|
||||
}
|
||||
|
||||
%newpos = VectorAdd(%sender.player.position, %args);
|
||||
%sender.player.setPosition(%newpos);
|
||||
}
|
||||
|
||||
// Eolk
|
||||
function ccmoveto(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
if(getwordcount(%args) != 3)
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2Your movement was not specified in X Y Z format.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%sender.isJailed)
|
||||
{
|
||||
messageclient(%sender, "MsgNo", "\c2You cannot do this command while in jail!");
|
||||
return;
|
||||
}
|
||||
|
||||
%sender.player.setPosition(%args);
|
||||
}
|
||||
|
||||
// Blnukem/Eolk
|
||||
function ccKill(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
%target = plnametocid(%args);
|
||||
if(%target == %sender)
|
||||
{
|
||||
messageClient(%sender, "", "\c2You cannot kill yourself.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%target.isSuperAdmin)
|
||||
{
|
||||
messageClient(%sender, "", "\c2You cannot kill Super Admins.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!isObject(%target))
|
||||
{
|
||||
messageClient(%sender, "", "\c2Cannot find target.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!isObject(%target.player))
|
||||
{
|
||||
messageClient(%sender, "", "\c2Cannot find target.");
|
||||
return;
|
||||
}
|
||||
|
||||
%target.player.scriptkill($DamageType::Idiocy);
|
||||
messageAll("", "~wfx/misc/bounty_completed.wav");
|
||||
warn(%sender.nameBase@" ("@%sender@") killed "@%target.nameBase@" ("@%target@") using admin force");
|
||||
}
|
||||
|
||||
// Eolk
|
||||
function ccForceTeamSpawn(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
%team = getword(%args, 0);
|
||||
%sp = getword(%args, 1);
|
||||
if(%sp !$= "")
|
||||
%sp = %sp - 1; // Subtract one to have things make a little more sense.
|
||||
|
||||
if(%team $= "")
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2A team must be specified.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%sp $= "")
|
||||
{
|
||||
$UseForcedTeamSpawn[%team] = 0;
|
||||
$ForcedSpawn[%team] = "";
|
||||
messageAll('MsgAdminForce', "\c3"@%sender.nameBase@"\c2 has released the forced spawn for team \c3"@%team@"\c2. If you wish to not spawn at the point anymore, use /choosespawn to reset.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!isObject($teamSP[%team, %sp]))
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2The spawnpoint specified doesn't exist.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!$teamSP[%team, %sp].active)
|
||||
{
|
||||
messageClient(%sender, "MsgNo", "\c2The spawnpoint specified is not powered.");
|
||||
return;
|
||||
}
|
||||
|
||||
$UseForcedTeamSpawn[%team] = 1;
|
||||
$ForcedSpawn[%team] = $teamSP[%team, %sp];
|
||||
|
||||
messageAll('MsgAdminForce', "\c3"@%sender.nameBase@"\c2 has forced team\c3 "@%team@"\c2 to spawn at spawnpoint \c3"@%sp+1@"\c2.");
|
||||
warn(%sender.nameBase@" ("@%sender@") forced team"@%team@" to spawn at spawn"@%sp);
|
||||
}
|
||||
|
||||
// By Eolk
|
||||
function ccSaveBuilding(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
%rad = getword(%args, 0);
|
||||
%file = getword(%args, 1);
|
||||
SaveBuilding(%sender, %rad, %file, 1, 0);
|
||||
messageAll('MsgAdminForce', "\c3"@%sender.nameBase@"\c2 is saving the buildings with a radius of \c3"@%rad@"\c2.");
|
||||
messageClient(%sender, "", "\c2Building saved to\c3 "@$SaveBuilding::LastFile@"\c2.");
|
||||
warn(%sender.nameBase@" ("@%sender@", GUID: "@%sender.guid@") attempted save buildings within a radius of "@%radius@" to file "@%file);
|
||||
}
|
||||
|
||||
// Eolk
|
||||
function ccLoadBuilding(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
LoadBuilding(%args);
|
||||
messageAll('MsgAdminForce', "\c3"@%sender.nameBase@" \c2has loaded a building.");
|
||||
warn(%sender.nameBase@" ("@%sender@", GUID: "@%sender.guid@") loaded file "@%args);
|
||||
}
|
||||
|
||||
// Blnukem
|
||||
function ccTurrets(%sender) {
|
||||
if (!%sender.isAdmin)
|
||||
return;
|
||||
if ($TurretEnableOverride) {
|
||||
$TurretEnableOverride = 0;
|
||||
messageAll('MsgAdminForce', "\c3"@%sender.nameBase@"\c2 has disabled turrets.");
|
||||
}
|
||||
else {
|
||||
$TurretEnableOverride = 1;
|
||||
messageAll('MsgAdminForce', "\c3"@%sender.nameBase@"\c2 has enabled turrets.");
|
||||
}
|
||||
logEcho("$TurretEnableOverride (turrets work in purebuild) changed to "@$TurretEnableOverride@" by "@%sender.nameBase@" ("@%sender@") using ccTurrets");
|
||||
}
|
||||
|
||||
// Blnukem
|
||||
function ccBuySCG(%sender) {
|
||||
if (!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
if(!isObject(%sender.player))
|
||||
{
|
||||
messageClient(%sender, "", "\c2You must be playing in order to get a Super Chaingun.");
|
||||
return;
|
||||
}
|
||||
|
||||
messageClient(%sender, "", "\c2A Super Chaingun has been added to your inventory.");
|
||||
%sender.player.setInventory(SuperChaingun, 1, true);
|
||||
}
|
||||
|
||||
// Eolk
|
||||
function ccChangeName(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
%target = plnametocid(getword(%args, 0));
|
||||
if(!isObject(%target))
|
||||
{
|
||||
messageClient(%sender, "", "\c2Invalid Target.");
|
||||
return;
|
||||
}
|
||||
|
||||
%name = getwords(%args, 1, getWordCount(%args) - 1);
|
||||
if(%name $= "")
|
||||
{
|
||||
messageClient(%sender, 'MsgNo', "\c2Need to supply a name!");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%name $= "reset")
|
||||
{
|
||||
ChangeName(%target, "reset");
|
||||
messageClient(%target, "", "\c2Your name has been reset.");
|
||||
warn(%sender.nameBase@" ("@%sender@") has reset "@%target.nameBase@"'s ("@%target@") name");
|
||||
return;
|
||||
}
|
||||
|
||||
ChangeName(%target, %name);
|
||||
messageClient(%target, "", "\c2Your new name is \c3"@%name@"\c2.");
|
||||
warn(%sender.nameBase@" ("@%sender@") changed "@%target.nameBase@"'s ("@%target@") name to "@%name);
|
||||
}
|
||||
|
||||
// Eolk
|
||||
function ccSavePlayer(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
%target = plnametocid(getword(%args, 0));
|
||||
if(!isObject(%target))
|
||||
{
|
||||
messageClient(%sender, "", "\c2Invalid target.");
|
||||
return;
|
||||
}
|
||||
|
||||
%name = getword(%args, 1);
|
||||
if(%name $= "")
|
||||
{
|
||||
messageClient(%sender, "", "\c2Invalid name.");
|
||||
return;
|
||||
}
|
||||
|
||||
%folder = $SaveBuilding::SaveFolder @ %name; // I really don't know if we should check for invalid characters
|
||||
new FileObject("Building"); // or not. I think Tribes 2 does that automatically.
|
||||
|
||||
Building.openforwrite(%folder);
|
||||
Building.writeLine("// Saved by \"" @ getField(%sender.nameBase,0) @ "\"");
|
||||
Building.writeLine("// Created in mission \"" @ $MissionName @ "\"");
|
||||
Building.writeLine("// Construction " @ $ModVersion);
|
||||
Building.writeLine("");
|
||||
|
||||
%group = nameToID("MissionCleanup/Deployables"); // We should really check isObject here... and we will!
|
||||
if(!isObject(%group))
|
||||
{
|
||||
messageClient(%sender, "", "\c2There are no deployables!");
|
||||
return;
|
||||
}
|
||||
|
||||
for(%i = 0; %i < %group.getCount(); %i++)
|
||||
{
|
||||
%depl = %group.getObject(%i);
|
||||
if(isObject(%depl) && %depl.getOwner() == %target)
|
||||
{
|
||||
%towrite = writeBuildingComponent(%depl); // This will return null if invalid.
|
||||
if(%towrite !$= "")
|
||||
Building.writeline(%towrite);
|
||||
}
|
||||
}
|
||||
|
||||
Building.close();
|
||||
Building.delete();
|
||||
|
||||
messageAll('MsgAdminForce', "\c2"@%sender.nameBase@" is saving "@%target.nameBase@"'s buildings.");
|
||||
messageClient(%sender, "", "\c2Building saved to "@%folder@".");
|
||||
logEcho(%sender.nameBase@" ("@%sender@") saved "@%target.nameBase@"'s pieces to file "@%name);
|
||||
}
|
||||
|
||||
// Command made by Eolk.
|
||||
function ccForceGivePieces(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
{
|
||||
messageClient(%sender, "", "\c2This is the admin give pieces. Regular clients have to use /givepieces target.");
|
||||
return;
|
||||
}
|
||||
|
||||
%from = (getWord(%args, 0) !$= "orphan" ? plnametocid(getWord(%args, 0)) : "orphan");
|
||||
%to = plnametocid(getWord(%args, 1));
|
||||
|
||||
if(%from !$= "orphan" && !isObject(%from))
|
||||
{
|
||||
messageClient(%sender, "", "\c2First argument - player doesn't exist.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(!isObject(%to))
|
||||
{
|
||||
messageClient(%sender, "", "\c2Second argument - player doesn't exist.");
|
||||
return;
|
||||
}
|
||||
|
||||
GivePieces(%from, %to);
|
||||
if(%from !$= "orphan")
|
||||
messageAll('MsgAdminForce', "\c3"@%sender.nameBase@"\c2 has forced \c3"@%from.nameBase@"\c2 to transfer "@(%from.sex $= "Male" ? "his" : "her")@" pieces to \c3"@%to.nameBase@"\c2.");
|
||||
else
|
||||
messageAll('MsgAdminForce', "\c3"@%sender.nameBase@"\c2 has given all orphans to \c3"@%to.nameBase@"\c2.");
|
||||
logEcho(%sender.nameBase@" ("@%sender@") gave "@(%from == "orphan" ? "all orphaned" : %from.nameBase@"'s ("@%from@")")@" pieces to "@%to.nameBase@" ("@%to@")");
|
||||
}
|
||||
|
||||
// Eolk
|
||||
function ccGiveClientPieces(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
{
|
||||
messageClient(%sender, "", "\c2This command is for admins only.");
|
||||
return;
|
||||
}
|
||||
|
||||
%from = getword(%args, 0);
|
||||
%to = plnametocid(getWord(%args, 1));
|
||||
|
||||
if(!isObject(%to))
|
||||
{
|
||||
messageClient(%sender, "", "\c2The receiving client doesn't exist.");
|
||||
return;
|
||||
}
|
||||
|
||||
GivePieces(%from, %to);
|
||||
messageAll('MsgAdminForce', "\c3"@%sender.nameBase@"\c2 has given all the pieces of client \c3"@%from@"\c2 to \c3"@%to.nameBase@".");
|
||||
logEcho(%sender.nameBase@" ("@%sender@") gave all pieces owned by client "@%from@" to "@%to.nameBase@" ("@%to@")");
|
||||
}
|
||||
|
||||
// Blnukem
|
||||
function ccTest (%sender,%args)
|
||||
{
|
||||
if(!%sender.isAdmin){
|
||||
return;
|
||||
}
|
||||
|
||||
%x = getword(%sender.player.position, 0);
|
||||
%y = getword(%sender.player.position, 1);
|
||||
%z = getTerrainHeight(%x SPC %y) + 5;
|
||||
%rot = "0 0 1 "@getRandom(1,360);
|
||||
%newpos = %x SPC %y SPC %z;
|
||||
if(%args $= "Raptor")
|
||||
{
|
||||
%type = ScoutFlyer;
|
||||
} else if(%args $= "Airwing")
|
||||
{
|
||||
%type = StrikeFlyer;
|
||||
} else if(%args $= "Superior")
|
||||
{
|
||||
%type = SuperiorityFighter;
|
||||
}
|
||||
|
||||
if(%args $= "")
|
||||
{
|
||||
MessageClient(%sender, "Msg", "\c2Please specifiy the vehicle type.");
|
||||
} else if(%args !$= "Raptor" && %args !$= "Airwing" && %args !$= "Superior")
|
||||
{
|
||||
MessageClient(%sender, "Msg", "\c3"@%args@"\c2 is not a valid vehicle.");
|
||||
}
|
||||
|
||||
%veh = new FlyingVehicle()
|
||||
{
|
||||
dataBlock = ""@%type@"";
|
||||
position = ""@%newpos@"";
|
||||
rotation = ""@%rot@"";
|
||||
team = %sender.team;
|
||||
};
|
||||
|
||||
MissionCleanUp.add(%veh);
|
||||
setTargetSensorGroup(%veh.getTarget(), %sender.team);
|
||||
commandToClient(%sender,'SetDefaultVehicleKeys', true);
|
||||
commandToClient(%sender,'SetPilotVehicleKeys', true);
|
||||
%veh.mountObject(%sender.player,0);
|
||||
%veh.playAudio(0, MountVehicleSound);
|
||||
%sender.player.mVehicle = %col;
|
||||
%datablock = %type;
|
||||
%datablock.playerMounted(%veh,%sender.player, 0);
|
||||
}
|
||||
|
||||
// Eolk
|
||||
function ccNoVote(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
%target = plnametocid(%args);
|
||||
if(!isObject(%target))
|
||||
{
|
||||
messageClient(%sender, "", "\c2Target does not exist.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%target.isAdmin)
|
||||
{
|
||||
messageClient(%sender, "", "\c2This command does not affect admins.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(Game.scheduleVote !$= "")
|
||||
{
|
||||
messageClient(%sender, "", "\c2Cannot do this while a vote is in progress.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%target.canVote)
|
||||
{
|
||||
messageClient(%sender, "", "\c3"@%target.nameBase@"'s \c2ability to vote has been taken away.");
|
||||
%target.canVote = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
messageClient(%sender, "", "\c3"@%target.nameBase@"'s \c2ability to vote has been given back.");
|
||||
%target.canVote = true;
|
||||
}
|
||||
}
|
||||
54
scripts/modscripts/chatcommands/ai.cs
Normal file
54
scripts/modscripts/chatcommands/ai.cs
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// ACCM AI Commands
|
||||
//------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
// Drone Commands:
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Blnukem (edited by Eolk)
|
||||
function ccDroneBattle(%sender, %args)
|
||||
{
|
||||
if(!%sender.isAdmin)
|
||||
return;
|
||||
|
||||
%x = getword(%sender.player.position, 0);
|
||||
%y = getword(%sender.player.position, 1);
|
||||
%z = getword(%sender.player.position, 2) + 1200;
|
||||
%newpos = %x SPC %y SPC %z;
|
||||
%base = strlwr(getword(%args, 0));
|
||||
%difficulty = getword(%args, 1);
|
||||
if(%base $= "Battle")
|
||||
%base = 1;
|
||||
else if(%base $= "Single")
|
||||
%base = 2;
|
||||
else
|
||||
{
|
||||
messageClient(%sender, "", "\c2Invalid variable. Valid variables are:\c3 battle\c2 and \c3single\c2.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%difficulty $= "Easy")
|
||||
%d = 1;
|
||||
else if(%difficulty $= "Medium")
|
||||
%d = 5;
|
||||
else if(%difficulty $= "Hard")
|
||||
%d = 10;
|
||||
else if(%difficulty $= "Ace")
|
||||
%d = "ace";
|
||||
else
|
||||
{
|
||||
messageClient(%sender, "", "\c2Invalid difficulty. Difficulties are:\c3 Light\c2,\c3 Medium\c2,\c3 Hard\c2, and\c3 Ace\c2.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%base == 1)
|
||||
DroneBattle(%newpos, 1000, 10, 10, 15, %d);
|
||||
else if(%base == 2)
|
||||
StartDrone(%newpos, "0 0 1 0", 5, %d);
|
||||
|
||||
messageAll("", "\c3"@%sender.nameBase@" \c2spawned a "@%difficulty@" "@(%base == 1 ? "drone battle" : "drone")@".~wgui/objective_Notification.wav");
|
||||
}
|
||||
|
||||
function ccCreateSentinel(%sender, %args)
|
||||
{
|
||||
CreateSentinel("0 0 310", 1, 1);
|
||||
}
|
||||
234
scripts/modscripts/chatcommands/help.cs
Normal file
234
scripts/modscripts/chatcommands/help.cs
Normal file
|
|
@ -0,0 +1,234 @@
|
|||
//------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
// Help Commands, by Blnukem.
|
||||
// Note to other ACCM Devs, this method is best for telling clients each command
|
||||
// and it is pretty clean. Although it can be a pain when adding new commands,
|
||||
// but I'll be doing that, not you guys. (Since Eolk will fuck it up [Again])
|
||||
//------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
function ccSquadHelp(%sender, %args){
|
||||
messageClient(%sender, "", "\c3/CreateSquad [Name] \c2- Create your own squad. (Sergeant Rank Required)");
|
||||
messageClient(%sender, "", "\c3/S [Text] \c2- Privatly Chat with your squad.");
|
||||
messageClient(%sender, "", "\c3/LeaveSquad \c2- Leave the squad you are in.");
|
||||
messageClient(%sender, "", "\c3/Invite [PlayerName] \c2- Invite a person to your Squad.");
|
||||
messageClient(%sender, "", "\c3/RequestInvite [SquadName] \c2- Request an Invite to a Squad.");
|
||||
messageClient(%sender, "", "\c3/Join \c2- Use this to accept an invite to a squad.");
|
||||
messageClient(%sender, "", "\c3/SOL \c2- Spawn around your squad's leader.");
|
||||
messageClient(%sender, "", "\c3/ListSquads \c2- Lists all squads in the server.");
|
||||
messageClient(%sender, "", "\c3/Force [Join/Leave] [SquadName] [PlayerName] \c2- Force a person to leave/join a squad. (General Rank Required)");
|
||||
}
|
||||
|
||||
function ccRankHelp(%sender, %args){
|
||||
messageClient(%sender, "", "\c3/ItemRestrictions \c2- Gives a list of the weapons/packs that are restricted to ranks.");
|
||||
messageClient(%sender, "", "\c3/Top5 \c2- Gives a list of players with the highest ranks.");
|
||||
messageClient(%sender, "", "\c3/ListRanks \c2- Lists all the ranks and the points required to get that rank.");
|
||||
messageClient(%sender, "", "\c3/CheckStats \c2- Check your current rank and score.");
|
||||
messageClient(%sender, "", "\c3/CheckStats [PlayerName] \c2- Check the current rank and score of another person.");
|
||||
}
|
||||
|
||||
function ccItemRestrictions(%sender, %args){
|
||||
messageClient(%sender, "", "\c3M79 Grenade Launcher \c2- Points Required:\c3 1250\c2 Rank Required:\c3 Specialist\c2.");
|
||||
messageClient(%sender, "", "\c3Gauss Cannon \c2- Points Required:\c3 4800\c2 Rank Required:\c3 Master Sergeant\c2.");
|
||||
messageClient(%sender, "", "\c3Napalm Mortar \c2- Points Required:\c3 6000\c2 Rank Required:\c3 Second Lieutenant\c2.");
|
||||
messageClient(%sender, "", "\c3Jet Booster Pack \c2- Points Required:\c3 2550\c2 Rank Required:\c3 Staff Sergeant\c2.");
|
||||
messageClient(%sender, "", "\c3Flame Turret Barrel \c2- Points Required:\c3 1800\c2 Rank Required:\c3 Sergeant\c2.");
|
||||
}
|
||||
|
||||
function ccListRanks(%sender, %args){
|
||||
messageClient(%sender, "", "\c3Private\c2 - Points Required:\c3 250\c2.");
|
||||
messageClient(%sender, "", "\c3Private First Class\c2 - Points Required:\c3 500\c2.");
|
||||
messageClient(%sender, "", "\c3Corporal\c2 - Points Required:\c3 1250\c2.");
|
||||
messageClient(%sender, "", "\c3Specialist\c2 - Points Required:\c3 1800\c2.");
|
||||
messageClient(%sender, "", "\c3Sergeant\c2 - Points Required:\c3 2550\c2.");
|
||||
messageClient(%sender, "", "\c3Staff Sergeant\c2 - Points Required:\c3 3600\c2.");
|
||||
messageClient(%sender, "", "\c3Sergeant First Class\c2 - Points Required:\c3 4800\c2.");
|
||||
messageClient(%sender, "", "\c3Master Sergeant\c2 - Points Required:\c3 6000\c2.");
|
||||
messageClient(%sender, "", "\c3Second Lieutenant\c2 - Points Required:\c3 8500\c2.");
|
||||
messageClient(%sender, "", "\c3First Lieutenant\c2 - Points Required:\c3 9750\c2.");
|
||||
messageClient(%sender, "", "\c3Captian\c2 - Points Required:\c3 9750\c2.");
|
||||
messageClient(%sender, "", "\c3Major\c2 - Points Required:\c3 11000\c2.");
|
||||
messageClient(%sender, "", "\c3Lieutenant Colonel\c2 - Points Required:\c3 15500\c2.");
|
||||
messageClient(%sender, "", "\c3Colonel\c2 - Points Required:\c3 18500\c2.");
|
||||
messageClient(%sender, "", "\c3Brigadier General\c2 - Points Required:\c3 22500\c2.");
|
||||
messageClient(%sender, "", "\c3Major General\c2 - Points Required:\c3 30000\c2.");
|
||||
messageClient(%sender, "", "\c3Lieutenant General\c2 - Points Required:\c3 50000\c2.");
|
||||
messageClient(%sender, "", "\c3General\c2 - Points Required:\c3 75000\c2.");
|
||||
messageClient(%sender, "", "\c3General Of The Army\c2 - Points Required:\c3 90000\c2.");
|
||||
}
|
||||
|
||||
function ccZombiePointHelp(%sender, %args){
|
||||
return;
|
||||
if(!%sender.isAdmin && !%sender.isZombieKeeper)
|
||||
return;
|
||||
|
||||
messageClient(%sender, "", "\c3/PlaceZombiePoint [SpawnName] [ZType] [Time] [MaxZombies] [ZombieLimit] \c2- Places an advanced zombie point.");
|
||||
messageClient(%sender, "", "\c3/ListZombieSpawns \c2- Lists all the advanced zombie points.");
|
||||
messageClient(%sender, "", "\c3/DisableSpawn [SpawnName] \c2- Disables an advanced zombie point by label.");
|
||||
messageClient(%sender, "", "\c3/DisableAllSpawns \c2- Disables all advanced zombie points.");
|
||||
messageClient(%sender, "", "\c3/EnableSpawn [SpawnName] \c2- Enables an advanced zombie point by label.");
|
||||
messageClient(%sender, "", "\c3/EnableAllSpawns \c2- Enables all advanced zombie points.");
|
||||
messageClient(%sender, "", "\c3/RemoveSpawn [SpawnName] \c2- Removes an advanced zombie spawn.");
|
||||
messageClient(%sender, "", "\c3/RemoveAllSpawns \c2- Removes all advanced zombie spawns.");
|
||||
messageClient(%sender, "", "\c3/GetStatus [SpawnName] \c2- Get the status of a an advanced zombie spawn by label.");
|
||||
messageClient(%sender, "", "\c3/MarkZombieSpawns \c2- Mark all zombie spawns.");
|
||||
messageClient(%sender, "", "\c3/SaveSpawns [Radius] [FileName.cs] \c2- Save all of the advanced zombie spawns whithin said radius to said filename.");
|
||||
messageClient(%sender, "", "\c3/LoadSpawns [Radius] [FileName.cs] \c2- Load zombie spawns whithin said filename.");
|
||||
messageClient(%sender, "", "\c3/ReplaceSpawn Type[Single/Radius/All] [Arg2] \c2- Replaces advanced spawns with regular spawns. Which ones get replaced depends solely on your input.");
|
||||
}
|
||||
|
||||
function ccHelp(%sender, %args)
|
||||
{
|
||||
%base = strlwr(getword(%args, 0));
|
||||
switch$(%base){
|
||||
case "":
|
||||
messageClient(%sender, "", "\c2Help command options:");
|
||||
messageClient(%sender, "", "\c3BasicCommands \c2- \c3BuildingOptions \c2- \c3AdminCommands \c2- \c3SACommands");
|
||||
messageClient(%sender, "", "\c3SentinelCommands \c2- \c3ZombieCommands \c2- \c3DroneCommands \c2- \c3QuickCommands");
|
||||
messageClient(%sender, "", "\c2Don't understand this command? Type:\c3 /Help Usage \c2to learn how it works.");
|
||||
}
|
||||
|
||||
switch$(%base){
|
||||
case "Usage":
|
||||
messageClient(%sender, "", "\c0----------------------------------------------------------------------------------------------------------------------------------");
|
||||
messageClient(%sender, "", "\c2To use the help command simply type:\c3 /Help \c2then the option you wish to use.");
|
||||
messageClient(%sender, "", "\c2For Example, type this in global chat:\c3 /Help Test");
|
||||
}
|
||||
|
||||
switch$(%base){
|
||||
case "Test":
|
||||
messageClient(%sender, "", "\c0----------------------------------------------------------------------------------------------------------------------------------");
|
||||
messageClient(%sender, "", "\c2Good, you succesfully used the\c3 /Help \c2command.");
|
||||
messageClient(%sender, "", "\c2You can also use Quick Commands if you don't feel like typing\c3 /Help \c2before each option.");
|
||||
messageClient(%sender, "", "\c2To see the list of Quick Commands, type:\c3 /Help QuickCommands");
|
||||
}
|
||||
|
||||
switch$(%base){
|
||||
case "QuickCommands":
|
||||
messageClient(%sender, "", "\c3/BasicCMDS \c2- Basic Commands.");
|
||||
messageClient(%sender, "", "\c3/BuildOptions \c2- Building Options.");
|
||||
messageClient(%sender, "", "\c3/ZCMDS \c2- Zombie Commands.");
|
||||
messageClient(%sender, "", "\c3/SCMDS \c2- Sentinel Commands.");
|
||||
messageClient(%sender, "", "\c3/DCMDS \c2- Drone Commands.");
|
||||
messageClient(%sender, "", "\c3/AdminCMDS \c2- Admin Commands.");
|
||||
messageClient(%sender, "", "\c3/SACMDS \c2- Super Admin Commands.");
|
||||
}
|
||||
|
||||
switch$(%base){
|
||||
case "BuildingOptions":
|
||||
messageClient(%sender, "", "\c2Use the building manager in the Lobby to save your pieces.");
|
||||
messageClient(%sender, "", "\c3/Delmypieces \c2- Delete all of your pieces.");
|
||||
messageClient(%sender, "", "\c3/Objectscale [X Y Z] \c2- Basic scaling function.");
|
||||
messageClient(%sender, "", "\c3/Getscale \c2- Get the scale of an object.");
|
||||
messageClient(%sender, "", "\c3/Pos [X Y Z] \c2- This will move an object in X Y Z format.");
|
||||
messageClient(%sender, "", "\c3/GetPos \c2- This gets the postition of an object.");
|
||||
messageClient(%sender, "", "\c3/RankHelp \c2- Tells you basic information on ranks.");
|
||||
messageClient(%sender, "", "\c3/SetFreq [#] \c2- Set your power frequency.");
|
||||
messageClient(%sender, "", "\c3/ObjectName [Name] \c2- Sets a name to a deployable.");
|
||||
messageClient(%sender, "", "\c3/Radius [Radius] \c2- Sets the radius for Switches/Tripwires.");
|
||||
messageClient(%sender, "", "\c3/Cloak \c2- Makes your pieces invisible.");
|
||||
}
|
||||
|
||||
switch$(%base){
|
||||
case "BasicCommands":
|
||||
messageClient(%sender, "", "\c3![PlayerName] [Message] \c2- Private messaging.");
|
||||
messageClient(%sender, "", "\c3/Opendoor \c2- Point at a door and use this command to open it. (You can also use /Open)");
|
||||
messageClient(%sender, "", "\c3/Opendoor [Password] \c2- Point at a door and use this command to open it if it\'s passworded.");
|
||||
messageClient(%sender, "", "\c3/Setdoorpass [Password] \c2- Point at a door and use this to set it\'s password.");
|
||||
messageClient(%sender, "", "\c3/ChooseSpawn [#] \c2- Choose a selected spawnpoint to spawn there.");
|
||||
messageClient(%sender, "", "\c3/ListSpawns \c2- Displays all spawnpoints on your team.");
|
||||
messageClient(%sender, "", "\c3/Hack Help \c2- Tells you how to Hack enemy teleporters.");
|
||||
messageClient(%sender, "", "\c3/SquadHelp \c2- Tells you how to use squad commands.");
|
||||
messageClient(%sender, "", "\c3/RankHelp \c2- Tells you basic information on ranks.");
|
||||
messageClient(%sender, "", "\c3/Tips \c2- This will give you a random tip.");
|
||||
}
|
||||
|
||||
switch$(%base){
|
||||
case "SentinelCommands":
|
||||
if (!%sender.isAdmin){
|
||||
messageClient(%sender, "", "\c2Only Admins can use this command. ~wfx/misc/misc.error.wav");
|
||||
%sender.player.scriptkill($DamageType::Idiocy);
|
||||
return;
|
||||
}
|
||||
messageClient(%sender, "", "\c2Command\'s Temporarily Disabled.");
|
||||
return;
|
||||
}
|
||||
|
||||
switch$(%base){
|
||||
case "ZombieCommands":
|
||||
if ((!%sender.isAdmin) && (!%sender.isZombieKeeper)){
|
||||
messageClient(%sender, "", "\c2Only Admins or Zombie Keepers can use this command. ~wfx/misc/misc.error.wav");
|
||||
%sender.player.scriptkill($DamageType::Idiocy);
|
||||
return;
|
||||
}
|
||||
messageClient(%sender, "", "\c3/BuyZpack \c2- Buy a zombie pack.");
|
||||
messageClient(%sender, "", "\c3/MakeZLord [PlayerName] \c2- Make the person a lord zombie.");
|
||||
messageClient(%sender, "", "\c3/MakeRapier [PlayerName] \c2- Make the person a regular zombie.");
|
||||
messageClient(%sender, "", "\c3/Stalk [PlayerName] [ZType] Difficulty[Cool/Light/Medium/Heavy] \c2- Spawn zombies around a target.");
|
||||
messageClient(%sender, "", "\c3/Cure [PlayerName] \c2- Cures a person.");
|
||||
messageClient(%sender, "", "\c3/Infect [PlayerName] \c2- Infect the target with the zombie virus.");
|
||||
messageClient(%sender, "", "\c3/KillZombies \c2- Kills all zombies and infected.");
|
||||
messageClient(%sender, "", "\c3/ZDetectDist [Radius] \c2- Set how large the zombie detection distance is.");
|
||||
messageClient(%sender, "", "\c3/SemiInfect [PlayerName] \c2- Infect that person with the altrenative virus.");
|
||||
// messageClient(%sender, "", "\c3/ZombiePointHelp \c2- Displays commands fo advanced zombie spawn points.");
|
||||
return;
|
||||
}
|
||||
|
||||
switch$(%base){
|
||||
case "DroneCommands":
|
||||
if (!%sender.isAdmin){
|
||||
messageClient(%sender, "", "\c2Only Admins can use this command. ~wfx/misc/misc.error.wav");
|
||||
%sender.player.scriptkill($DamageType::Idiocy);
|
||||
return;
|
||||
}
|
||||
messageClient(%sender, "", "\c3/DroneBattle [Single/Battle/Custom] \c2- Basic Command where you can spawn either single drones, full battles, or even customize battles.");
|
||||
return;
|
||||
}
|
||||
|
||||
switch$(%base){
|
||||
case "AdminCommands":
|
||||
if (!%sender.isAdmin){
|
||||
messageClient(%sender, "", "\c2Only Admins can use this command. ~wfx/misc/misc.error.wav");
|
||||
%sender.player.scriptkill($DamageType::Idiocy);
|
||||
return;
|
||||
}
|
||||
messageClient(%sender, "", "\c3/JailPlayer [PlayerName] [Time] \c2- Sends a specified player to jail for a set amount of time.");
|
||||
messageClient(%sender, "", "\c3/AddTeam \c2- Add/Removes a second team.");
|
||||
messageClient(%sender, "", "\c3/Gag [PlayerName] [Time] \c2- Silences an annoying player.");
|
||||
messageClient(%sender, "", "\c3/CancelVote \c2- Cancels a vote.");
|
||||
messageClient(%sender, "", "\c3/DelPieces [PlayerName] \c2- Deletes a specified player\'s pieces.");
|
||||
messageClient(%sender, "", "\c3/Kill [PlayerName] \c2- Kill someone.");
|
||||
messageClient(%sender, "", "\c3/ChangeName [PlayerName] [NewName] \c2- Changes the target\'s name.");
|
||||
messageClient(%sender, "", "\c3/Goto [PlayerName] \c2- Go directly to a specified person.");
|
||||
messageClient(%sender, "", "\c3/Summon [PlayerName] \c2- Summon a specified person.");
|
||||
messageClient(%sender, "", "\c3/Moveto [X Y Z] \c2- Go directly to a desired location.");
|
||||
messageClient(%sender, "", "\c3/Moveme [X Y Z] \c2- Move on your X, Y or Z axis.");
|
||||
messageClient(%sender, "", "\c3/BottomPrint [Text] \c2- Send a message on the bottom of the screen.");
|
||||
messageClient(%sender, "", "\c3/CenterPrint [Text] \c2- Send a message in the center of the screen.");
|
||||
messageClient(%sender, "", "\c3/ForceTeamSpawn [TeamName] [SpawnNumber] \c2- Forces an entire team to spawn at one spawnpoint.");
|
||||
messageClient(%sender, "", "\c3/SaveBuilding [Radius] [FileName.cs] \c2- Save buildings in the server.");
|
||||
messageClient(%sender, "", "\c3/LoadBuilding [FileName.cs] \c2- Load a building file.");
|
||||
messageClient(%sender, "", "\c3/A [Message] \c2- Admin private messaging.");
|
||||
messageClient(%sender, "", "\c3/BuySCG \c2- Force a SCG into your inventory.");
|
||||
messageClient(%sender, "", "\c3/DeSmurf \c2- Remove a client\'s smurf name. And reset to their normal name.");
|
||||
messageClient(%sender, "", "\c3/Turrets \c2- Enables/disables turrets.");
|
||||
return;
|
||||
}
|
||||
|
||||
switch$(%base){
|
||||
case "SACommands":
|
||||
if (!%sender.isSuperAdmin){
|
||||
messageClient(%sender, "", "\c2Only Super Admins can use this command. ~wfx/misc/misc.error.wav");
|
||||
%sender.player.scriptkill($DamageType::Idiocy);
|
||||
return;
|
||||
}
|
||||
messageClient(%sender, "", "\c3/Admin [PlayerName] \c2- Force someone to become Admin.");
|
||||
messageClient(%sender, "", "\c3/SuperAdmin [PlayerName] \c2- Force someone to become Super Admin.");
|
||||
messageClient(%sender, "", "\c3/Info [PlayerName] \c2- Get basic info on a specified player.");
|
||||
messageClient(%sender, "", "\c3/Echo [PlayerName] \c2- Silently mute someone without them knowing.");
|
||||
messageClient(%sender, "", "\c3/Shred [PlayerName] \c2- Put someone in the ACCM paper shredder.");
|
||||
messageClient(%sender, "", "\c3/SA [Message] \c2- Super Admin private messaging.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
98
scripts/modscripts/chatcommands/sa.cs
Normal file
98
scripts/modscripts/chatcommands/sa.cs
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
//------------------------------------------------------------------------------
|
||||
// ACCM Super Admin Commands
|
||||
//------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
// Command by Eolk
|
||||
function ccSA(%sender, %args)
|
||||
{
|
||||
if(!%sender.isSuperAdmin)
|
||||
return;
|
||||
|
||||
for(%i = 0; %i < ClientGroup.getCount(); %i++)
|
||||
{
|
||||
%cl = ClientGroup.getObject(%i);
|
||||
if(%cl.isSuperAdmin)
|
||||
messageClient(%cl, 'MsgYes', "\c3[SA]\c2"@%sender.nameBase@": "@%args);
|
||||
}
|
||||
logEcho("[SUPERADMIN CHAT]: "@%sender.nameBase@": "@%args);
|
||||
}
|
||||
|
||||
// Command by Blnukem
|
||||
function ccDeadmin(%sender, %args)
|
||||
{
|
||||
if(!%sender.isSuperAdmin)
|
||||
return;
|
||||
|
||||
%target = plnametocid(%args);
|
||||
if(!isObject(%target))
|
||||
{
|
||||
messageClient(%sender, "", "\c2Unable to find target.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%target.isSuperAdmin || !%target.isAdmin)
|
||||
{
|
||||
messageClient(%sender, "", "\c2Target has incorrect status of adminship.");
|
||||
return;
|
||||
}
|
||||
|
||||
%target.isAdmin = false;
|
||||
%target.isSuperAdmin = false;
|
||||
messageAll( 'MsgStripAdminPlayer', '\c3%1 \c2has de-admined\c3 %2\c2.', %sender.name, %target.name, %target );
|
||||
%target.player.setInventory("SuperChaingun", 0);
|
||||
%target.player.setInventory("SuperChaingunAmmo", 0);
|
||||
logEcho(%sender.nameBase@" ("@%sender@") de-admin'd "@%target.nameBase@" ("@%target@")");
|
||||
}
|
||||
|
||||
// Command by Blnukem
|
||||
function ccAdmin(%sender, %args)
|
||||
{
|
||||
if(!%sender.isSuperAdmin)
|
||||
return;
|
||||
|
||||
%target = plnametocid(%args);
|
||||
if(!isObject(%target))
|
||||
{
|
||||
messageClient(%sender, "", "\c2Unable to find target.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%target.isAdmin)
|
||||
{
|
||||
messageClient(%sender, "", "\c2Target has incorrect status of adminship.");
|
||||
return;
|
||||
}
|
||||
|
||||
Game.voteAdminPlayer(%sender, %target);
|
||||
%target.player.setInventory("SuperChaingun", 1);
|
||||
%target.player.setInventory("SuperChaingunAmmo", 999);
|
||||
logEcho(%sender.nameBase@" ("@%sender@") gave admin to "@%target.nameBase@" ("@%target@")");
|
||||
}
|
||||
|
||||
// Command by Blnukem
|
||||
function ccSuperAdmin(%sender, %args)
|
||||
{
|
||||
if(!%sender.isSuperAdmin)
|
||||
return;
|
||||
|
||||
%target = plnametocid(%args);
|
||||
if(!isObject(%target))
|
||||
{
|
||||
messageClient(%sender, "", "\c2Unable to find target.");
|
||||
return;
|
||||
}
|
||||
|
||||
if(%target.isSuperAdmin)
|
||||
{
|
||||
messageClient(%sender, "", "\c2Target has incorrect status of adminship.");
|
||||
return;
|
||||
}
|
||||
|
||||
%target.isAdmin = true;
|
||||
%target.isSuperAdmin = true;
|
||||
%name = getTaggedString(%target.name);
|
||||
messageAll( 'MsgSuperAdminPlayer', '\c3%3 \c2has made\c3 %2 \c2a super admin.', %target, %name, %sender.nameBase );
|
||||
%target.player.setInventory("SuperChaingun", 1);
|
||||
%target.player.setInventory("SuperChaingunAmmo", 999);
|
||||
logEcho(%sender.nameBase@" ("@%sender@") gave super admin to "@%target.nameBase@" ("@%target@")");
|
||||
}
|
||||
1239
scripts/modscripts/chatcommands/zombie.cs
Normal file
1239
scripts/modscripts/chatcommands/zombie.cs
Normal file
File diff suppressed because it is too large
Load diff
763
scripts/modscripts/modfunctions.cs
Normal file
763
scripts/modscripts/modfunctions.cs
Normal file
|
|
@ -0,0 +1,763 @@
|
|||
//==============================================================================
|
||||
// Mod Functions
|
||||
//==============================================================================
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Blnukem.
|
||||
|
||||
function AutoBan(%client)
|
||||
{
|
||||
MessageAll('MsgAdminForce', '\c3%1 \c2was automatically banned by the server.', %client.name);
|
||||
%client.player.scriptKill(0);
|
||||
%client.setDisconnectReason( "You have been automatically banned by the server." );
|
||||
%client.schedule(0, "delete");
|
||||
BanList::add(%client.guid, %client.getAddress(), $Host::BanTime);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Blnukem and Dark Dragon DX.
|
||||
|
||||
function applyskin(%obj,%skin,%name)
|
||||
{
|
||||
%obj.target = createTarget(%obj, %name, %skin, "Male1", '', 0, PlayerSensor);
|
||||
setTargetDataBlock(%obj.target, %obj.getDatablock());
|
||||
setTargetSensorData(%obj.target, PlayerSensor);
|
||||
setTargetSensorGroup(%obj.target, 6);
|
||||
setTargetSkin(%obj.target, %skin);
|
||||
setTargetName(%obj.target, addtaggedstring(%name));
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Blnukem.
|
||||
|
||||
function LoadDefaultSettings() {
|
||||
$Host::Cascade = 0;
|
||||
Call("EnableVehicles");
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Blnukem.
|
||||
|
||||
function ClearBasicTimer(%obj)
|
||||
{
|
||||
if(isObject(%obj))
|
||||
{
|
||||
if(%obj.BasicTimer > 0)
|
||||
{
|
||||
%obj.BasicTimer -= 1;
|
||||
%obj.BasicTimerSchedule = Schedule(1000, 0, "ClearBasicTimer", %obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Originally by Eolk, revised by Blnukem.
|
||||
|
||||
function Cure(%args)
|
||||
{
|
||||
%args.player.infected = 0;
|
||||
cancel(%args.player.infectedDamage);
|
||||
%args.player.infectedDamage = "";
|
||||
%args.player.beats = 0;
|
||||
%args.player.canZkill = 0;
|
||||
%args.player.hit = 0;
|
||||
cancel(%args.player.zombieAttackImpulse);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Unknown Author
|
||||
|
||||
function plnametocid(%name)
|
||||
{
|
||||
%count = ClientGroup.getCount();
|
||||
for(%i = 0; %i < %count; %i++)
|
||||
{
|
||||
%obj = ClientGroup.getObject(%i);
|
||||
%nametest = strlwr(%obj.namebase);
|
||||
%name = strlwr(%name);
|
||||
if(strstr(%nametest, %name) != -1)
|
||||
return %obj;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function addToZombiePointGroup(%obj)
|
||||
{
|
||||
%grp = nameToId("MissionCleanup/ZombiePoints");
|
||||
if(!isObject(%grp))
|
||||
{
|
||||
%grp = new SimGroup("ZombiePoints");
|
||||
MissionCleanup.add(%grp);
|
||||
}
|
||||
|
||||
%grp.add(%obj);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk... Just supposed to make things pretty
|
||||
|
||||
function ZombiePoint::setStatus(%this, %status)
|
||||
{
|
||||
%this.status = %status;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk... Long, isn't it?
|
||||
|
||||
function ZombiePoint::StartSpawnLoop(%this)
|
||||
{
|
||||
if(%this.disabled)
|
||||
return;
|
||||
|
||||
if(%this.maximumZombies != -1)
|
||||
%this.spawnedZombies++;
|
||||
|
||||
if(%this.maximumZombies != -1 && (%this.spawnedZombies >= %this.maximumZombies))
|
||||
{
|
||||
%this.disabled = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
if(%this.zombieLimit != -1 && (getwordcount(%this.zombieList) >= %this.zombieLimit))
|
||||
{
|
||||
%this.zombieLoop = %this.schedule(%this.timeout * 1000, "StartSpawnLoop");
|
||||
return;
|
||||
}
|
||||
|
||||
if(ZombieGroup.getCount() >= $Host::MaxZombies && $Host::MaxZombies != -1)
|
||||
{
|
||||
%this.zombieLoop = %this.schedule(%this.timeout * 1000, "StartSpawnLoop");
|
||||
return;
|
||||
}
|
||||
|
||||
%test = %this.type;
|
||||
if(%this.type $= "random")
|
||||
{
|
||||
%num = getRandom(1, 5);
|
||||
if(%num == 2)
|
||||
%test = "ravenger";
|
||||
else if(%num == 3)
|
||||
%test = "lord";
|
||||
else if(%num == 4)
|
||||
%test = "demon";
|
||||
else if(%num == 5)
|
||||
%test = "rapier";
|
||||
else
|
||||
%test = "regular";
|
||||
}
|
||||
|
||||
switch$(%test)
|
||||
{
|
||||
case "regular":
|
||||
%zombie = new Player() {
|
||||
datablock = "ZombieArmor";
|
||||
};
|
||||
applyskin(%zombie,'Zombie',"Zombie");
|
||||
|
||||
%type = 1;
|
||||
case "ravenger":
|
||||
%zombie = new Player() {
|
||||
datablock = "FZombieArmor";
|
||||
};
|
||||
applyskin(%zombie,'Zombie',"Ravenger Zombie");
|
||||
|
||||
%type = 2;
|
||||
case "lord":
|
||||
%zombie = new player(){
|
||||
datablock = "LordZombieArmor";
|
||||
};
|
||||
applyskin(%zombie,'ZLord',"Zombie Lord");
|
||||
|
||||
%zombie.client = $zombie::Lclient;
|
||||
%zombie.mountImage(ZHead, 3);
|
||||
%zombie.mountImage(ZBack, 4);
|
||||
%zombie.mountImage(ZDummyslotImg, 5);
|
||||
%zombie.mountImage(ZDummyslotImg2, 6);
|
||||
%zombie.firstFired = 0;
|
||||
%zombie.canmove = 1;
|
||||
%type = 3;
|
||||
|
||||
case "demon":
|
||||
%zombie = new player(){
|
||||
datablock = "DemonZombieArmor";
|
||||
};
|
||||
applyskin(%zombie,'Zombie',"Demon Zombie");
|
||||
|
||||
%zombie.mountImage(ZdummyslotImg, 4);
|
||||
%type = 4;
|
||||
|
||||
case "rapier":
|
||||
%zombie = new player(){
|
||||
datablock = "RapierZombieArmor";
|
||||
};
|
||||
applyskin(%zombie,'Zombie',"Rapier Zombie");
|
||||
|
||||
%zombie.mountImage(ZWingImage, 3);
|
||||
%zombie.mountImage(ZWingImage2, 4);
|
||||
%zombie.setActionThread("scoutRoot",true);
|
||||
%type = 5;
|
||||
}
|
||||
|
||||
%zombie.type = %type;
|
||||
%zombie.setTransform(%this.spawnTransform);
|
||||
%zombie.team = 0;
|
||||
%zombie.canJump = 1;
|
||||
%zombie.hasTarget = 0;
|
||||
%zombie.isCompZomb = 1;
|
||||
if(%this.zombieLimit != -1)
|
||||
{
|
||||
%zombie.overwatcher = %this;
|
||||
%this.zombieList = listAdd(%this.zombieList, %zombie, -1);
|
||||
}
|
||||
|
||||
AddToZombieGroup(%zombie);
|
||||
schedule(1000, %zombie, "ZSetRandomMove", %zombie);
|
||||
schedule(1000, %zombie, "ZombieLookforTarget", %zombie);
|
||||
|
||||
%this.zombieLoop = %this.schedule(%this.timeout * 1000, "StartSpawnLoop");
|
||||
%this.setStatus("Spawning zombies.");
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function zombieSpawnByName(%name)
|
||||
{
|
||||
%name = strlwr(%name);
|
||||
%grp = nameToId("MissionCleanup/ZombiePoints");
|
||||
if(!isObject(%grp))
|
||||
return 0;
|
||||
for(%i = 0; %i < %grp.getCount(); %i++)
|
||||
{
|
||||
%obj = %grp.getObject(%i);
|
||||
%objname = strlwr(%obj.label);
|
||||
if(%name $= %objname)
|
||||
return %obj;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function AssignStalkMonitor(%target, %ztype, %stype)
|
||||
{
|
||||
if(isObject(%target.stalkMonitor))
|
||||
return;
|
||||
|
||||
%s = new ScriptObject()
|
||||
{
|
||||
class = StalkMonitor;
|
||||
};
|
||||
|
||||
MissionCleanup.add(%s); // this kills any lingering ones at the mission end.
|
||||
|
||||
// assign the necessary flags.
|
||||
%s.target = %target;
|
||||
// note: these are already strlwr()ed.
|
||||
%s.ztype = %ztype;
|
||||
%s.stype = %stype;
|
||||
|
||||
// this is here mainly for a reminder...
|
||||
// %s.lastztype = "";
|
||||
// %s.laststype = "";
|
||||
%s.coolvar = "light";
|
||||
%s.coolcount = 0;
|
||||
%s.coolup = 1;
|
||||
|
||||
// tag 'em.
|
||||
%target.stalkMonitor = %s;
|
||||
}
|
||||
|
||||
// This is for easy time adjusting.
|
||||
$SwarmLoopTime["heavy"] = 1000; // 1 second.
|
||||
$SwarmLoopTime["medium"] = 5000; // 5 seconds.
|
||||
$SwarmLoopTime["light"] = 10000; // 10 seconds.
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function StalkMonitor::StalkLoop(%this)
|
||||
{
|
||||
if(!%this)
|
||||
return;
|
||||
|
||||
%target = %this.target;
|
||||
if(!isObject(%target))
|
||||
{
|
||||
// Let's pack our bags and go. Our work is done here.
|
||||
%this.doneStalking();
|
||||
return;
|
||||
}
|
||||
|
||||
if(!isObject(%target.player))
|
||||
{
|
||||
if(%this.stype !$= "cool")
|
||||
%this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.stype], "StalkLoop");
|
||||
else // don't update. They were in observer.
|
||||
%this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.coolvar], "StalkLoop");
|
||||
return;
|
||||
}
|
||||
|
||||
if(ZombieGroup.getCount() >= $Host::MaxZombies && $Host::MaxZombies != -1)
|
||||
{
|
||||
if(%this.stype !$= "cool")
|
||||
%this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.stype], "StalkLoop");
|
||||
else // don't update. There isn't an available zombie spot.
|
||||
%this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.coolvar], "StalkLoop");
|
||||
return;
|
||||
}
|
||||
|
||||
%monitor = %target.stalkMonitor;
|
||||
%test = %monitor.ztype;
|
||||
if(%test $= "random")
|
||||
{
|
||||
%num = getRandom(1, 5);
|
||||
if(%num == 2)
|
||||
%test = "ravenger";
|
||||
else if(%num == 3)
|
||||
%test = "lord";
|
||||
else if(%num == 4)
|
||||
%test = "demon";
|
||||
else if(%num == 5)
|
||||
%test = "rapier";
|
||||
else
|
||||
%test = "regular";
|
||||
}
|
||||
|
||||
switch$(%test)
|
||||
{
|
||||
case "regular":
|
||||
%zombie = new Player() {
|
||||
datablock = "ZombieArmor";
|
||||
};
|
||||
applyskin(%zombie,'Zombie',"Zombie");
|
||||
|
||||
%type = 1;
|
||||
case "ravenger":
|
||||
%zombie = new Player() {
|
||||
datablock = "FZombieArmor";
|
||||
};
|
||||
applyskin(%zombie,'Zombie',"Ravenger Zombie");
|
||||
|
||||
%type = 2;
|
||||
case "lord":
|
||||
%zombie = new player(){
|
||||
datablock = "LordZombieArmor";
|
||||
};
|
||||
applyskin(%zombie,'ZLord',"Zombie Lord");
|
||||
|
||||
%zombie.client = $zombie::Lclient;
|
||||
%zombie.mountImage(ZHead, 3);
|
||||
%zombie.mountImage(ZBack, 4);
|
||||
%zombie.mountImage(ZDummyslotImg, 5);
|
||||
%zombie.mountImage(ZDummyslotImg2, 6);
|
||||
%zombie.firstFired = 0;
|
||||
%zombie.canmove = 1;
|
||||
%type = 3;
|
||||
|
||||
case "demon":
|
||||
%zombie = new player(){
|
||||
datablock = "DemonZombieArmor";
|
||||
};
|
||||
applyskin(%zombie,'Zombie',"Demon Zombie");
|
||||
|
||||
%zombie.mountImage(ZdummyslotImg, 4);
|
||||
%type = 4;
|
||||
|
||||
case "rapier":
|
||||
%zombie = new player(){
|
||||
datablock = "RapierZombieArmor";
|
||||
};
|
||||
applyskin(%zombie,'Zombie',"Rapier Zombie");
|
||||
|
||||
%zombie.mountImage(ZWingImage, 3);
|
||||
%zombie.mountImage(ZWingImage2, 4);
|
||||
%zombie.setActionThread("scoutRoot",true);
|
||||
%type = 5;
|
||||
}
|
||||
|
||||
%zombie.type = %type;
|
||||
%pos = %target.player.position;
|
||||
// cheezy randomness. Should work.
|
||||
// TODO: Add a check for interior, etc. Look at alternateSpawn.
|
||||
%rand = getRandomB();
|
||||
if(%rand)
|
||||
%x = getword(%pos, 0) + getRandom(25, 100);
|
||||
else
|
||||
%x = getword(%pos, 0) - getRandom(25, 100);
|
||||
|
||||
%rand = getRandomB();
|
||||
if(%rand)
|
||||
%y = getword(%pos, 1) + getRandom(25, 100);
|
||||
else
|
||||
%y = getword(%pos, 1) - getRandom(25, 100);
|
||||
%z = getTerrainHeight(%x SPC %y);
|
||||
|
||||
%dapos = %x SPC %y SPC %z;
|
||||
%typeMasks = $TypeMasks::VehicleObjectType | $TypeMasks::MoveableObjectType | $TypeMasks::PlayerObjectType | $TypeMasks::TurretObjectType;
|
||||
InitContainerRadiusSearch(%dapos, 2, %typeMasks);
|
||||
if(ContainerSearchNext != 0)
|
||||
{
|
||||
// This position isn't valid, let's not spawn this round.
|
||||
if(%this.stype !$= "cool")
|
||||
%this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.stype], "StalkLoop");
|
||||
else // don't update. They were in observer.
|
||||
%this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.coolvar], "StalkLoop");
|
||||
return;
|
||||
}
|
||||
|
||||
%zombie.setTransform(%dapos SPC "1 0 0 0");
|
||||
%zombie.team = 0;
|
||||
%zombie.canJump = 1;
|
||||
%zombie.hasTarget = 0;
|
||||
%zombie.isCompZomb = 1;
|
||||
|
||||
AddToZombieGroup(%zombie);
|
||||
schedule(1000, %zombie, "ZSetRandomMove", %zombie);
|
||||
schedule(1000, %zombie, "ZombieLookforTarget", %zombie);
|
||||
|
||||
if(%this.stype !$= "cool")
|
||||
%this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.stype], "StalkLoop");
|
||||
else
|
||||
{
|
||||
%this.UpdateCoolVariables();
|
||||
%this.stalkSchedule = %this.schedule($SwarmLoopTime[%this.coolvar], "StalkLoop");
|
||||
}
|
||||
}
|
||||
|
||||
$StalkCoolTime["light"] = 10; // 100 seconds of boredom. :P
|
||||
$StalkCoolTime["medium"] = 15; // 75 seconds of balanced zombie invasions.
|
||||
$StalkCoolTime["heavy"] = 30; // 30 seconds of pure heck. :)
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function StalkMonitor::UpdateCoolVariables(%this)
|
||||
{
|
||||
%this.coolcount++;
|
||||
if(%this.coolcount >= ($StalkCoolTime[%this.coolvar] + 1)) // Add an extra to it so that the amount of times actually gets done.
|
||||
{
|
||||
%this.coolcount = 0;
|
||||
if(%this.coolvar $= "light")
|
||||
{
|
||||
%this.coolvar = "medium";
|
||||
%this.coolup = 1;
|
||||
}
|
||||
else if(%this.coolvar $= "medium")
|
||||
{
|
||||
if(%this.coolup == 1)
|
||||
%this.coolvar = "heavy";
|
||||
else
|
||||
%this.coolvar = "light";
|
||||
}
|
||||
else if(%this.coolvar $= "heavy")
|
||||
{
|
||||
%this.coolvar = "medium";
|
||||
%this.coolup = 0;
|
||||
}
|
||||
else
|
||||
error(%this @": Cannot update cooldown count. Unknown coolvar.");
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function StalkMonitor::doneStalking(%this)
|
||||
{
|
||||
// echo(%this @": Done stalking. Terminating...");
|
||||
cancel(%this.stalkSchedule);
|
||||
%this.stalkSchedule = "";
|
||||
%this.target.stalkMonitor = "";
|
||||
|
||||
%this.schedule(500, "delete");
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function opposite(%num)
|
||||
{
|
||||
return %num * -1;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function SimObject::isTSStaticObject(%obj)
|
||||
{
|
||||
// If it doesn't have a shape name, then it definately ain't.
|
||||
if(%obj.shapeName $= "")
|
||||
return 0;
|
||||
|
||||
for(%i = 0; %i < $NumStaticTSObjects; %i++)
|
||||
{
|
||||
if(getword($StaticTSObjects[%i], 2) $= %obj.shapeName)
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function ZombieGetRandom()
|
||||
{
|
||||
%rand = getRandom();
|
||||
if(%rand > 0.9)
|
||||
return 1; // Lord Zombie
|
||||
else if(%rand <= 0.8 && %rand >= 0.7)
|
||||
return 2; // Rapier
|
||||
else
|
||||
return 0; // Regular
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function ClearSaveTimeout(%cl)
|
||||
{
|
||||
if(isObject(%cl))
|
||||
{
|
||||
if(%cl.saveTimeout > 0)
|
||||
{
|
||||
%cl.saveTimeout -= 1;
|
||||
%cl.saveTimeoutSchedule = schedule(1000, 0, "ClearSaveTimeout", %cl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function ClearLoadTimeout(%cl)
|
||||
{
|
||||
if(isObject(%cl))
|
||||
{
|
||||
if(%cl.loadTimeout > 0)
|
||||
{
|
||||
%cl.loadTimeout -= 1;
|
||||
%cl.loadTimeoutSchedule = schedule(1000, 0, "ClearLoadTimeout", %cl);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function ReverseGetRot(%rot, %mult)
|
||||
{
|
||||
%x = getword(%rot, 0) / %mult;
|
||||
%y = getword(%rot, 1) / %mult;
|
||||
%z = getword(%rot, 2) / %mult;
|
||||
return %x SPC %y SPC %z SPC %mult;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function ACCMChatLog(%client, %msg, %type, %target)
|
||||
{
|
||||
if($Host::ACCMChatLogging != 1 && $Host::ACCMEchoChat != 1)
|
||||
return;
|
||||
|
||||
%msg = stripChars(%msg, "\c0\c1\c2\c3\c4\c5\c6\c7\c8\c9\x10\x11");
|
||||
switch$(%type)
|
||||
{
|
||||
case 0:
|
||||
%t = "[GLOBAL]";
|
||||
case 1:
|
||||
%t = "[TEAM]";
|
||||
case 2:
|
||||
%t = "[PRIVATE]";
|
||||
}
|
||||
|
||||
%logdate = formattimestring("m-d-y");
|
||||
%dir = "ServerLogs/Chat/Log of "@%logdate@".log";
|
||||
if($Host::ACCMChatLogging == 1)
|
||||
{
|
||||
%temp = new FileObject();
|
||||
%temp.openforappend(%dir);
|
||||
%temp.writeline(%t @" ("@formattimestring("D m/d/y hh:nn a")@") "@%client.nameBase @""@ (%t $= "[PRIVATE]" ? " (to "@%target.nameBase@")" : "")@": "@%msg);
|
||||
%temp.close();
|
||||
%temp.delete();
|
||||
}
|
||||
|
||||
if($Host::ACCMEchoChat == 1)
|
||||
echo(%t @" ("@formattimestring("D m/d/y hh:nn a")@") "@%client.nameBase @""@ (%t $= "[PRIVATE]" ? " (to "@%target.nameBase@")" : "")@": "@%msg);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function ACCMConnectionLog(%client, %type, %reason)
|
||||
{
|
||||
if($Host::ACCMConnectionLogging != 1)
|
||||
return;
|
||||
|
||||
if(%client.nameBase $= "Sentinel" || %client.nameBase $= "Monitor")
|
||||
return;
|
||||
|
||||
if(%reason $= "")
|
||||
%reason = "Successful manual disconnect.";
|
||||
|
||||
switch$(%type)
|
||||
{
|
||||
case "connect":
|
||||
%t = "joined the server";
|
||||
case "disconnect":
|
||||
%t = "disconnected from the server (reason: "@%reason@")";
|
||||
default:
|
||||
error("ACCMConnectionLog: %type turned up unknown value. Report this!");
|
||||
return;
|
||||
}
|
||||
|
||||
%logdate = formattimestring("m-d-y");
|
||||
%dir = "ServerLogs/Connections/Log of "@%logdate@".log";
|
||||
%authInfo = %client.getAuthInfo();
|
||||
if($playingonline)
|
||||
%str = "[ONLINE] "@formattimestring("D m/d/y hh:nn a")@" (GUID: "@%client.guid@", REAL NAME: "@getField(%authInfo, 0)@", SMURF: "@%client.isSmurf@", "@%client.getAddress()@") "@%client.nameBase@" "@%t@".";
|
||||
else
|
||||
%str = "[OFFLINE] "@formattimestring("D m/d/y hh:nn a")@" ("@%client.getAddress()@") "@%client.nameBase@" "@%t@".";
|
||||
%temp = new FileObject();
|
||||
%temp.openforappend(%dir);
|
||||
%temp.writeline(%str);
|
||||
%temp.close();
|
||||
%temp.delete();
|
||||
logEcho(%str);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function VectorCheck(%vec)
|
||||
{
|
||||
if(getword(%vec, 0) > 0)
|
||||
%x = 1;
|
||||
else if(getword(%vec, 0) < 0)
|
||||
%x = -1;
|
||||
else
|
||||
%x = 0;
|
||||
if(getword(%vec, 1) > 0)
|
||||
%y = 1;
|
||||
else if(getword(%vec, 1) < 0)
|
||||
%y = -1;
|
||||
else
|
||||
%y = 0;
|
||||
if(getword(%vec, 2) > 0)
|
||||
%z = 1;
|
||||
else if(getword(%vec, 2) < 0)
|
||||
%z = -1;
|
||||
else
|
||||
%z = 0;
|
||||
return %x SPC %y SPC %z;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function VectorPositive(%vec)
|
||||
{
|
||||
if(getword(%vec, 0) < 0)
|
||||
%x = opposite(getword(%vec, 0));
|
||||
else
|
||||
%x = getword(%vec, 0);
|
||||
if(getword(%vec, 1) < 0)
|
||||
%y = opposite(getword(%vec, 1));
|
||||
else
|
||||
%y = getword(%vec, 1);
|
||||
if(getword(%vec, 2) < 0)
|
||||
%z = opposite(getword(%vec, 2));
|
||||
else
|
||||
%z = getword(%vec, 2);
|
||||
return %x SPC %y SPC %z;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function VectorAdd2(%vec, %adder)
|
||||
{
|
||||
if(getword(%vec, 0) != 0)
|
||||
%new1 = getword(%vec, 0) + %adder;
|
||||
else
|
||||
%new1 = 0;
|
||||
if(getword(%vec, 1) != 0)
|
||||
%new2 = getword(%vec, 1) + %adder;
|
||||
else
|
||||
%new2 = 0;
|
||||
if(getword(%vec, 2) != 0)
|
||||
%new3 = getword(%vec, 2) + %adder;
|
||||
else
|
||||
%new3 = 0;
|
||||
return %new1 SPC %new2 SPC %new3;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function CheckGUID(%client)
|
||||
{
|
||||
if(!$playingonline)
|
||||
{
|
||||
error("CheckGUID: This does not work offline!");
|
||||
return;
|
||||
}
|
||||
|
||||
%authinfo = %client.getAuthInfo();
|
||||
%guid = getField(%authinfo, 3);
|
||||
return %guid;
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function CreateWaypoint(%pos, %name)
|
||||
{
|
||||
%w = new WayPoint() {
|
||||
datablock = WayPointMarker;
|
||||
name = %name;
|
||||
};
|
||||
|
||||
%w.setTransform(%pos SPC "0 0 1 0");
|
||||
%w.team = 0;
|
||||
|
||||
MissionCleanup.add(%w);
|
||||
%w.schedule(10000, "delete");
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
// Made by Eolk.
|
||||
|
||||
function ChangeName(%client, %name)
|
||||
{
|
||||
if(%name $= "reset")
|
||||
{
|
||||
if(%client.oldName !$= "")
|
||||
{
|
||||
removeTaggedString(%client.name);
|
||||
%client.name = "";
|
||||
%client.name = addTaggedString(%client.oldname);
|
||||
|
||||
setTargetName(%client.target, addTaggedString(%client.oldName));
|
||||
messageAll('MsgClientNameChanged', "", "", %client.name, %client);
|
||||
%client.oldname = "";
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(%client.oldName $= "")
|
||||
%client.oldName = getTaggedString(%client.name);
|
||||
|
||||
removeTaggedString(%client.name);
|
||||
%client.name = "";
|
||||
%realname = "\x10\c6"@%name@"\x11";
|
||||
%client.name = addTaggedString(%realname);
|
||||
|
||||
setTargetName(%client.target, addTaggedString(%realname));
|
||||
messageAll('MsgClientNameChanged', "", %client.oldname, %client.name, %client);
|
||||
}
|
||||
58
scripts/modscripts/player.cs
Normal file
58
scripts/modscripts/player.cs
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
// -------------------------------------------
|
||||
// player.cs
|
||||
// ACCM Player-bound commands
|
||||
// ===========================================
|
||||
|
||||
function Player::setSkin(%self, %skin)
|
||||
{
|
||||
freeTarget(%self.getTarget());
|
||||
|
||||
%self.skin = %skin;
|
||||
// Zombitch
|
||||
if (!isObject(%self.client))
|
||||
{
|
||||
%self.target = createTarget(%self, %self.name, %skin, "Derm3", '', 6, PlayerSensor);
|
||||
setTargetSensorGroup(%self.target, 6);
|
||||
}
|
||||
else
|
||||
{
|
||||
%self.target = createTarget(%self, %self.client.name, %skin, %self.client.voice, '', 0, PlayerSensor);
|
||||
setTargetSensorGroup(%self.target, %self.client.team);
|
||||
setTargetName(%obj.target, %self.client.name);
|
||||
%self.client.skin = addTaggedString(%skin);
|
||||
%self.client.target = %self.target;
|
||||
}
|
||||
setTargetSkin(%self.target, addTaggedString(%skin));
|
||||
setTargetDataBlock(%self.target, %self.getDatablock());
|
||||
setTargetSensorData(%self.target, PlayerSensor);
|
||||
%self.setTarget(%self.target);
|
||||
return true;
|
||||
}
|
||||
|
||||
function Player::setName(%self, %name)
|
||||
{
|
||||
|
||||
%self.name = %name;
|
||||
if (!isObject(%self.client))
|
||||
{
|
||||
freeTarget(%self.getTarget());
|
||||
%self.target = createTarget(%self, %self.name, %skin, "Derm3", '', 6, PlayerSensor);
|
||||
setTargetSensorGroup(%self.target, 6);
|
||||
}
|
||||
else
|
||||
{
|
||||
%ptarget = %self.target;
|
||||
%skin = getTaggedString(getTargetSkin(%self.getTarget()));
|
||||
%self.target = createTarget(%self, %name, %skin, %self.client.voice, '', 0, PlayerSensor);
|
||||
freeTarget(%ptarget);
|
||||
setTargetSensorGroup(%self.target, %self.client.team);
|
||||
setTargetName(%self.target, %name);
|
||||
%self.client.target = %self.target;
|
||||
}
|
||||
setTargetSkin(%self.target, addTaggedString(%self.skin));
|
||||
setTargetDataBlock(%self.target, %self.getDatablock());
|
||||
setTargetSensorData(%self.target, PlayerSensor);
|
||||
%self.setTarget(%self.target);
|
||||
return true;
|
||||
}
|
||||
|
||||
842
scripts/modscripts/ranking.cs
Normal file
842
scripts/modscripts/ranking.cs
Normal file
|
|
@ -0,0 +1,842 @@
|
|||
//--------------------------------------------------
|
||||
//RANKS
|
||||
//--------------------------------------------------
|
||||
|
||||
$Ranks::MinPoints[0] = 0;
|
||||
$Ranks::NewRank[0] = "Private";
|
||||
$Ranks::MinPoints[1] = 250;
|
||||
$Ranks::NewRank[1] = "Private First Class";
|
||||
$Ranks::MinPoints[2] = 500;
|
||||
$Ranks::NewRank[2] = "Corporal";
|
||||
$Ranks::MinPoints[3] = 1250;
|
||||
$Ranks::NewRank[3] = "Specialist";
|
||||
$Ranks::MinPoints[4] = 1800;
|
||||
$Ranks::NewRank[4] = "Sergeant";
|
||||
$Ranks::MinPoints[5] = 2550;
|
||||
$Ranks::NewRank[5] = "Staff Sergeant";
|
||||
$Ranks::MinPoints[6] = 3600;
|
||||
$Ranks::NewRank[6] = "Sergeant First Class";
|
||||
$Ranks::MinPoints[7] = 4800;
|
||||
$Ranks::NewRank[7] = "Master Sergeant";
|
||||
$Ranks::MinPoints[8] = 6000;
|
||||
$Ranks::NewRank[8] = "Second Lieutenant";
|
||||
$Ranks::MinPoints[9] = 8500;
|
||||
$Ranks::NewRank[9] = "First Lieutenant";
|
||||
$Ranks::MinPoints[10] = 9750;
|
||||
$Ranks::NewRank[10] = "Captain";
|
||||
$Ranks::MinPoints[11] = 11000;
|
||||
$Ranks::NewRank[11] = "Major";
|
||||
$Ranks::MinPoints[12] = 15500;
|
||||
$Ranks::NewRank[12] = "Lieutenant Colonel";
|
||||
$Ranks::MinPoints[13] = 18500;
|
||||
$Ranks::NewRank[13] = "Colonel";
|
||||
$Ranks::MinPoints[14] = 22500;
|
||||
$Ranks::NewRank[14] = "Brigadier General";
|
||||
$Ranks::MinPoints[15] = 30000;
|
||||
$Ranks::NewRank[15] = "Major General";
|
||||
$Ranks::MinPoints[16] = 50000;
|
||||
$Ranks::NewRank[16] = "Lieutenant General";
|
||||
$Ranks::MinPoints[17] = 75000;
|
||||
$Ranks::NewRank[17] = "General";
|
||||
$Ranks::MinPoints[18] = 90000;
|
||||
$Ranks::NewRank[18] = "General Of The Army";
|
||||
exec( "prefs/Ranks.cs" );
|
||||
exec( "prefs/Squads.cs" );
|
||||
$canRecalcTop5 = 1;
|
||||
|
||||
function updateRankScores(%shouldloop,%clearLS){
|
||||
%count = ClientGroup.getCount();
|
||||
for(%i = 0; %i < %count; %i++){
|
||||
if($Rank::numplayers $= "")
|
||||
$Rank::numplayers=0;
|
||||
%cl = ClientGroup.getObject(%i);
|
||||
%name = %cl.NameBase;
|
||||
if(%cl.lastscore $= "")
|
||||
%cl.lastscore = 0;
|
||||
if(%cl.ranknum $= ""){
|
||||
for(%k = 0; %k < $Rank::numplayers; %k++){
|
||||
if(%name $= $Rank::Name[%k]){
|
||||
%cl.ranknum = %k;
|
||||
%k = $Rank::numplayers - 1;
|
||||
}
|
||||
else if(%k >= ($Rank::numplayers - 1)){
|
||||
$Rank::Name[$Rank::numplayers] = %name;
|
||||
$Rank::Rank[$Rank::numplayers] = "Private";
|
||||
$Rank::Score[$Rank::numplayers] = 0;
|
||||
$Rank::numplayers++;
|
||||
}
|
||||
}
|
||||
if(%k == 0 && %k == $Rank::numplayers){
|
||||
$Rank::Name[$Rank::numplayers] = %name;
|
||||
$Rank::Rank[$Rank::numplayers] = "Private";
|
||||
$Rank::Score[$Rank::numplayers] = 0;
|
||||
$Rank::numplayers++;
|
||||
}
|
||||
}
|
||||
if($Rank::Squad[%cl.ranknum] !$= ""){
|
||||
%squad = getWord($Rank::Squad[%cl.ranknum],1);
|
||||
$squad::Score[%squad] = $squad::Score[%squad] + (%cl.score - %cl.lastscore);
|
||||
%mem = 0;
|
||||
%num = getWord($Rank::squad[%cl.ranknum],1)@%mem;
|
||||
while($squad::member[%num] !$= ""){
|
||||
%player = $squad::member[%num];
|
||||
for(%l = 0; %l < %count; %l++){
|
||||
%clt = ClientGroup.getObject(%l);
|
||||
if(%clt.ranknum == %player){
|
||||
$Rank::Squadscore[%player] = $Rank::Squadscore[%player] + ((%cl.score - %cl.lastscore) / 2);
|
||||
$Rank::Score[%player] = $Rank::Score[%player] + ((%cl.score - %cl.lastscore) / 2);
|
||||
%l = %count;
|
||||
}
|
||||
}
|
||||
%mem++;
|
||||
%num = %squad@%mem;
|
||||
}
|
||||
}
|
||||
$Rank::Score[%cl.ranknum] = $Rank::Score[%cl.ranknum] + (%cl.score - %cl.lastscore);
|
||||
%stat = $Rank::Score[%cl.ranknum];
|
||||
%cl.lastscore = %cl.score;
|
||||
for(%j = 18; %j > 0; %j--){
|
||||
if($Rank::Score[%cl.ranknum] >= $Ranks::MinPoints[%j]){
|
||||
if($Rank::Rank[%cl.ranknum] !$= $Ranks::NewRank[%j]){
|
||||
$Rank::Rank[%cl.ranknum] = $Ranks::NewRank[%j];
|
||||
messageAll('msgClient',"\c3"@%name@" \c2has become a\c3 "@$Ranks::NewRank[%j]@" \c2with a score of\c3 "@$Rank::Score[%cl.ranknum]@"\c2!");
|
||||
bottomPrint(%cl, "Congratulations "@%name@" you have been promoted to the rank of: "@$Ranks::NewRank[%j]@"!", 5, 2 );
|
||||
}
|
||||
%j = 1;
|
||||
}
|
||||
}
|
||||
if(%clearLS == 1){
|
||||
%cl.lastscore = 0;
|
||||
%cl.Zkills = 0;
|
||||
}
|
||||
}
|
||||
export( "$squad::*", "prefs/Squads.cs", false );
|
||||
export( "$Rank::*", "prefs/Ranks.cs", false );
|
||||
if(%shouldloop == 1)
|
||||
$RankUpdate = schedule(60000,0,"updateRankScores",1);
|
||||
}
|
||||
|
||||
function ccCheckStats(%client, %args){
|
||||
if(%args $= ""){
|
||||
if(%client.ranknum $= ""){
|
||||
messageClient(%client, 'MsgClient', "\c2Please wait a minute for your stats to load");
|
||||
return;
|
||||
}
|
||||
%name = %client.NameBase;
|
||||
%Rank = $Rank::Rank[%client.ranknum];
|
||||
%Stats = $Rank::Score[%client.ranknum];
|
||||
for(%i = 18; %i >= 0; %i--){
|
||||
if($Rank::Score[%client.ranknum] >= $Ranks::MinPoints[%i]){
|
||||
%nextrank = $Ranks::NewRank[(%i + 1)];
|
||||
%nextrankscore = $Ranks::MinPoints[(%i + 1)];
|
||||
%i = 0;
|
||||
}
|
||||
}
|
||||
messageClient(%client, 'MsgClient', "\c2Your current rank is a\c3 "@%Rank@" \c2and you have a total of\c3 "@%stats@" \c2points. Your next rank is a\c3 "@%nextrank@" \c2and you need\c3 "@(%nextrankscore - %stats)@" \c2points.");
|
||||
}
|
||||
else{
|
||||
%count = ClientGroup.getCount();
|
||||
for(%i = 0; %i < %count; %i++){
|
||||
%cl = ClientGroup.getObject(%i);
|
||||
if(%cl.nameBase $= %args){
|
||||
if(%cl.ranknum $= ""){
|
||||
messageClient(%client, 'MsgClient', "\c2Please wait a minute for this persons stats to load");
|
||||
return;
|
||||
}
|
||||
%Rank = $Rank::Rank[%cl.ranknum];
|
||||
%Stats = $Rank::Score[%cl.ranknum];
|
||||
messageClient(%client, 'MsgClient', "\c3"@%args@"\'s \c2rank is a\c3 "@%Rank@"\c2 and his total score is: \c3"@%stats@"\c2 points.");
|
||||
%i = %count;
|
||||
}
|
||||
else if(%i == (%count - 1))
|
||||
messageClient(%client, 'MsgClient', "\c3"@%args@" \c2is not a valid player.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function FindTopRanks()
|
||||
{
|
||||
%noabove = 1000000;
|
||||
for (%i = 1; %i <= 5; %i++)
|
||||
{
|
||||
for (%j = 0; %j < $Rank::numplayers; %j++)
|
||||
{
|
||||
if (($Rank::Score[%j] >= %highest || %highest $= "") && $Rank::Score[%j] < %noabove)
|
||||
{
|
||||
%highest = $Rank::Score[%j];
|
||||
%player = %j;
|
||||
}
|
||||
}
|
||||
|
||||
$Rank::Top[%i] = $Rank::Name[%player];
|
||||
$Rank::TopScore[%i] = %highest;
|
||||
%noabove = %highest;
|
||||
%highest = "";
|
||||
}
|
||||
}
|
||||
|
||||
function ccTop5(%client,%args)
|
||||
{
|
||||
if($canrecalcTop5 == 1)
|
||||
{
|
||||
FindTopRanks();
|
||||
$canrecalcTop5 = 0;
|
||||
schedule(30000, 0, "restorerecalc");
|
||||
}
|
||||
messageClient(%client, 'MsgClient', "\c2Top five players are:");
|
||||
|
||||
if ($Rank::numplayers > 5)
|
||||
{
|
||||
%num = 5;
|
||||
} else if ($Rank::numplayers <= 5)
|
||||
%num = $Rank::numplayers;
|
||||
|
||||
for(%i = 1; %i <= %num; %i++)
|
||||
{
|
||||
messageClient(%client, 'MsgClient', "\c2"@%i@". "@$Rank::Top[%i]@" - Score: "@$Rank::TopScore[%i]@"");
|
||||
}
|
||||
}
|
||||
|
||||
function restorerecalc(){
|
||||
$canreclacTop5 = 1;
|
||||
}
|
||||
|
||||
//--------------------------------------------------
|
||||
//SQUADS
|
||||
//--------------------------------------------------
|
||||
|
||||
function cccreatesquad(%sender, %args){
|
||||
if(%sender.ranknum $= ""){
|
||||
messageclient(%sender, 'MsgClient', '\c2Please wait a minute for your stats to load.');
|
||||
return;
|
||||
}
|
||||
if($Rank::Score[%sender.ranknum] < $Rank::MinPoints[4]){
|
||||
messageclient(%sender, 'MsgClient', '\c2You must have a Sergeant rank or higher to make a squad.');
|
||||
return;
|
||||
}
|
||||
if(%args $= ""){
|
||||
messageclient(%sender, 'MsgClient', '\c2Please specify the name of new squad.');
|
||||
return;
|
||||
}
|
||||
for(%i = 0; %i < $squad::numsquads; %i++){
|
||||
if(getWord(%args,0) $= $squad::Name[%i]){
|
||||
messageclient(%sender, 'MsgClient', '\c2This squad already exists.');
|
||||
return;
|
||||
}
|
||||
}
|
||||
for(%i = 0; %i < $squad::numsquads; %i++){
|
||||
if(%sender.namebase $= $squad::Leader[%i]){
|
||||
messageclient(%sender, 'MsgClient', '\c2You already have a squad, you may not create a new one.');
|
||||
return;
|
||||
}
|
||||
if($squad::Leader[%i] $= "")
|
||||
%replacable = %i;
|
||||
}
|
||||
if($squad::numsquads $= "")
|
||||
$squad::numsquads = 0;
|
||||
if(%replacable !$= ""){
|
||||
$squad::Name[%replacable] = getWord(%args,0);
|
||||
$squad::Leader[%replacable] = %sender.namebase;
|
||||
$squad::Score[%replacable] = 0;
|
||||
} else{
|
||||
$squad::Name[$squad::numsquads] = getWord(%args,0);
|
||||
$squad::Leader[$squad::numsquads] = %sender.namebase;
|
||||
$squad::Score[$squad::numsquads] = 0;
|
||||
$squad::numsquads++;
|
||||
}
|
||||
messageclient(%sender, 'MsgClient', "\c2Squad\c3 "@getWord(%args,0)@" \c2has been created.");
|
||||
ccJoin(%sender,getWord(%args,0));
|
||||
}
|
||||
|
||||
function ccJoin(%sender,%name){
|
||||
if(%sender.ranknum $= ""){
|
||||
messageclient(%sender, 'MsgClient', '\c2Please wait a minute for your stats to load.');
|
||||
return;
|
||||
}
|
||||
if($Rank::Squad[%sender.ranknum] !$= ""){
|
||||
messageClient(%client, 'MsgClient', "\c2You are already in a squad.");
|
||||
return;
|
||||
}
|
||||
if(%name $= ""){
|
||||
messageclient(%sender, 'MsgClient', '\c2You have not been invited to a squad yet.');
|
||||
return;
|
||||
}
|
||||
for(%i = 0; %i < $squad::numsquads; %i++){
|
||||
if(%name $= $squad::Name[%i]){
|
||||
%mem = 0;
|
||||
%num = %i@%mem;
|
||||
while($squad::member[%num] !$= ""){
|
||||
%mem++;
|
||||
%num = %i@%mem;
|
||||
}
|
||||
$squad::member[%num] = %sender.ranknum;
|
||||
$Rank::Squad[%sender.ranknum] = %name@" "@%i;
|
||||
$Rank::SquadScore[%sender.ranknum] = 0;
|
||||
messageclient(%sender, 'MsgClient', "\c2You are now a part of squad\c3 "@%name@"\c2.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
messageclient(%sender, 'MsgClient', "\c2Squad\c3 "@%name@" \c2dosent exist.");
|
||||
}
|
||||
|
||||
function ccLeaveSquad(%sender,%args){
|
||||
if(%sender.ranknum $= ""){
|
||||
messageclient(%sender, 'MsgClient', '\c2Please wait a minute for your stats to load.');
|
||||
return;
|
||||
}
|
||||
if($Rank::Squad[%sender.ranknum] $= ""){
|
||||
messageClient(%sender, 'MsgClient', "\c2You are not currently in a squad.");
|
||||
return;
|
||||
}
|
||||
%squad = getWord($Rank::Squad[%sender.ranknum],1);
|
||||
if($squad::Leader[%squad] $= %sender.namebase){
|
||||
$squad::Leader[%squad] = "";
|
||||
$squad::Name[%squad] = "";
|
||||
$squad::Score[%squad] = "";
|
||||
%mem = 1;
|
||||
%num = %squad@%mem;
|
||||
while($squad::member[%num] !$= ""){
|
||||
$Rank::Squad[$squad::member[%num]] = "";
|
||||
$Rank::SquadScore[$squad::member[%num]] = "";
|
||||
|
||||
%count = ClientGroup.getCount();
|
||||
for(%i = 0; %i < %count; %i++){
|
||||
%cl = ClientGroup.getObject(%i);
|
||||
if(%cl.ranknum == $squad::member[%num])
|
||||
%i = %count;
|
||||
}
|
||||
|
||||
messageClient(%cl, 'MsgClient', "\c2Your squad has disbanned.");
|
||||
$squad::member[%num] = "";
|
||||
|
||||
%mem++;
|
||||
%num = %squad@%mem;
|
||||
}
|
||||
$Rank::Squad[%sender.ranknum] = "";
|
||||
$Rank::SquadScore[%sender.ranknum] = "";
|
||||
$squad::member[%squad@"0"] = "";
|
||||
messageClient(%sender, 'MsgClient', "\c2You have disbanned your squad.");
|
||||
} else {
|
||||
%mem = 0;
|
||||
%num = %squad@%mem;
|
||||
while($squad::member[%num] !$= ""){
|
||||
if(%sender.ranknum == $squad::member[%num])
|
||||
%plrnum = %num;
|
||||
%mem++;
|
||||
%num = %squad@%mem;
|
||||
}
|
||||
%last = %squad@(%mem - 1);
|
||||
$Rank::Squad[%sender.ranknum] = "";
|
||||
$Rank::SquadScore[%sender.ranknum] = "";
|
||||
if(%plrnum != %last){
|
||||
$squad::member[%plrnum] = $squad::member[%last];
|
||||
$squad::member[%last] = "";
|
||||
}
|
||||
messageClient(%sender, 'MsgClient', "\c2You have left the Squad.");
|
||||
}
|
||||
}
|
||||
|
||||
function ccInvite(%sender, %args){
|
||||
if(%args $= ""){
|
||||
messageclient(%sender, 'MsgClient', '\c2You must specify a player.');
|
||||
return;
|
||||
}
|
||||
%count = ClientGroup.getCount();
|
||||
for(%i = 0; %i < %count; %i++){
|
||||
%cl = ClientGroup.getObject(%i);
|
||||
if(%cl.nameBase $= %args)
|
||||
%i = %count;
|
||||
else if(%i == (%count - 1)){
|
||||
messageClient(%sender, 'MsgClient', "\c3"@%args@" \c2is not a valid player.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
if($Rank::Squad[%cl.ranknum] !$= ""){
|
||||
messageClient(%sender, 'MsgClient', "\c3"@%args@" \c2is already in a squad.");
|
||||
return;
|
||||
}
|
||||
for(%i = 0; %i < $squad::numsquads; %i++){
|
||||
if(%sender.namebase $= $squad::Leader[%i]){
|
||||
%cl.sqinv = $squad::Name[%i];
|
||||
messageclient(%sender, 'MsgClient', "\c3"@%args@" \c2as been invited to your squad.");
|
||||
messageclient(%cl, 'MsgClient', "\c2You have been invited to squad\c3 "@$squad::Name[%i]@" \c2to join, type:\c3 /Join\c2.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
messageclient(%sender, 'MsgClient', "\c2You are not a squad leader and cannot invite.");
|
||||
}
|
||||
|
||||
function ccS(%sender, %args){
|
||||
if($squad::Name[getWord($Rank::Squad[%sender.ranknum],1)] $= ""){
|
||||
messageclient(%sender, 'MsgClient', "\c2You are not in a squad.");
|
||||
return;
|
||||
}
|
||||
%count = ClientGroup.getCount();
|
||||
for(%i = 0; %i < %count; %i++){
|
||||
%cl = ClientGroup.getObject(%i);
|
||||
%mem = 0;
|
||||
%num = getWord($Rank::Squad[%sender.ranknum],1)@%mem;
|
||||
while($squad::member[%num] !$= ""){
|
||||
if(%cl.ranknum == $squad::member[%num] && %cl.team == %sender.team)
|
||||
messageclient(%cl, 'MsgClient', "\c0[Squad Chat] \c2"@%sender.namebase@": \c3"@%args);
|
||||
%mem++;
|
||||
%num = getWord($Rank::Squad[%sender.ranknum],1)@%mem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function ccListSquads(%client, %args){
|
||||
for(%i = 0; %i < $Squad::numsquads; %i++){
|
||||
messageClient(%client, 'MsgClient', "\c2SQUAD "@(%i + 1)@": \c3"@$squad::Name[%i]@" \c2SCORE: \c3"@$squad::score[%i]@"");
|
||||
%temp = 0;
|
||||
%num = %i@%temp;
|
||||
while($squad::member[%num] !$= ""){
|
||||
if(%temp == 0)
|
||||
%prefix = "Leader:";
|
||||
else
|
||||
%prefix = "member"@(%temp + 1)@":";
|
||||
messageClient(%client, 'MsgClient', "\c2"@%prefix@" \c3"@$rank::Name[$squad::member[%num]]@" \c2teamscore: \c3"@$rank::squadscore[$squad::member[%num]]@"");
|
||||
%temp++;
|
||||
%num = %i@%temp;
|
||||
}
|
||||
if((%i + 1) < $squad::numsquads)
|
||||
messageClient(%client, 'MsgClient', "\c2 ");
|
||||
}
|
||||
}
|
||||
|
||||
function ccRequestInvite(%client, %args){
|
||||
if(%client.ranknum $= ""){
|
||||
messageClient(%client, 'MsgClient', "\c2Please wait a minute for your stats to load");
|
||||
return;
|
||||
}
|
||||
if($rank::squad[%client.ranknum] !$= ""){
|
||||
messageClient(%client, 'MsgClient', "\c2You are already in a squad.");
|
||||
return;
|
||||
}
|
||||
for(%i = 0; %i < $squad::numsquads; %i++){
|
||||
if(%args $= $squad::Name[%i]){
|
||||
messageclient(%sender, 'MsgClient', "\c2Request was sent to squa\c3 "@%args@"\c2.");
|
||||
for(%j = 0; %j < %count; %j++){
|
||||
%cl = ClientGroup.getObject(%j);
|
||||
if(%cl.namebase $= $squad::Leader[%i])
|
||||
messageclient(%cl, 'MsgClient', "\c3"@%client.namebase@"\c2 has requested to join your squad.");
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
messageclient(%sender, 'MsgClient', "\c2Squad\c3 "@%args@" \c2dosent exist.");
|
||||
}
|
||||
|
||||
//--------------------------------------------------
|
||||
//COMMANDS
|
||||
//--------------------------------------------------
|
||||
|
||||
function ccO(%sender,%args){
|
||||
if(%sender.ranknum $= ""){
|
||||
messageclient(%sender, 'MsgClient', '\c2Please wait a minute for your stats to load.');
|
||||
return;
|
||||
}
|
||||
if($Rank::Score[%sender.ranknum] < $Ranks::MinPoints[12]){
|
||||
messageclient(%sender, 'MsgClient', '\c2You must have a General or Commander rank to give orders.');
|
||||
return;
|
||||
}
|
||||
if(%args $= "" || getWord(%args,1) $= ""){
|
||||
messageclient(%sender, 'MsgClient', '\c2You must specify the order and then the target squad.');
|
||||
return;
|
||||
}
|
||||
if(getWord(%args,0) !$= "attack" && getWord(%args,0) !$= "defend"){
|
||||
messageclient(%sender, 'MsgClient', '\c2Order must be either "attack" or "defend".');
|
||||
return;
|
||||
}
|
||||
%order = getWord(%args,0);
|
||||
%name = getWord(%args,1);
|
||||
for(%i = 0; %i < $squad::numsquads; %i++){
|
||||
if(%name $= $squad::Name[%i]){
|
||||
%check = 1;
|
||||
%j = %i;
|
||||
}
|
||||
}
|
||||
if(%check != 1){
|
||||
messageclient(%sender, 'MsgClient', "\c2Squad\c3 "@%name@" \c2dosent exist.");
|
||||
return;
|
||||
}
|
||||
%obj = %sender.getControlObject();
|
||||
%eyeTrans = %obj.getEyeTransform();
|
||||
%eyePos = posFromTransform(%eyeTrans);
|
||||
%eyeVec = vectorScale(%obj.getEyeVector(),1000);
|
||||
%searchResult = containerRayCast(%eyePos, vectorAdd(%eyeVec,%eyePos), $TypeMasks::TerrainObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::ForceFieldObjectType | $TypeMasks::VehicleObjectType, %obj);
|
||||
if(%searchResult){
|
||||
%mem = 0;
|
||||
%num = %j@%mem;
|
||||
while($squad::member[%num] !$= ""){
|
||||
%count = ClientGroup.getCount();
|
||||
for(%i = 0; %i < %count; %i++){
|
||||
%cl = ClientGroup.getObject(%i);
|
||||
if(%cl.ranknum == $squad::member[%num] && %cl.team == %sender.team)
|
||||
messageclient(%cl, 'MsgClient', "\c2A general has ordered your squad to\c3 "@%order@" \c2this location.");
|
||||
}
|
||||
%mem++;
|
||||
%num = %j@%mem;
|
||||
}
|
||||
|
||||
%pos = posFromRaycast(%searchResult);
|
||||
%wa=new Waypoint() {
|
||||
position = %pos;
|
||||
rotation = "1 0 0 0";
|
||||
dataBlock = "WayPointMarker";
|
||||
team = %sender.team;
|
||||
name = %name@" "@%order@" this position";
|
||||
};
|
||||
MissionCleanup.add(%wa);
|
||||
|
||||
%nveh = 0;
|
||||
%nplr = 0;
|
||||
%nTrt = 0;
|
||||
%ndep = 0;
|
||||
InitContainerRadiusSearch(%pos, 100, $TypeMasks::PlayerObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::TurretObjectType | $TypeMasks::VehicleObjectType);
|
||||
while ((%targetObject = containerSearchNext()) != 0){
|
||||
%target = getWord(%targetObject,0);
|
||||
if(%order $= "attack" && %target.team != %sender.team){
|
||||
if(%target.getType() & $TypeMasks::PlayerObjectType)
|
||||
%nplr++;
|
||||
if(%target.getType() & $TypeMasks::StaticShapeObjectType){
|
||||
%Ttype = %target.getDataBlock().className ;
|
||||
if(!(%Ttype $= "wall" || %Ttype $= "wWall" || %Ttype $= "spine" || %Ttype $= "mSpine" || %Ttype $= "floor" || %Ttype$= "forcefield"))
|
||||
%ndep++;
|
||||
}
|
||||
if(%target.getType() & $TypeMasks::TurretObjectType)
|
||||
%ntrt++;
|
||||
if(%target.getType() & $TypeMasks::VehicleObjectType)
|
||||
%nveh++;
|
||||
}
|
||||
else if(%order $= "defend" && %target.team == %sender.team){
|
||||
if(%target.getType() & $TypeMasks::PlayerObjectType)
|
||||
%nplr++;
|
||||
if(%target.getType() & $TypeMasks::StaticShapeObjectType){
|
||||
%Ttype = %target.getDataBlock().className ;
|
||||
if(!(%Ttype $= "wall" || %Ttype $= "wWall" || %Ttype $= "spine" || %Ttype $= "mSpine" || %Ttype $= "floor" || %Ttype$= "forcefield"))
|
||||
%ndep++;
|
||||
}
|
||||
if(%target.getType() & $TypeMasks::TurretObjectType)
|
||||
%ntrt++;
|
||||
if(%target.getType() & $TypeMasks::VehicleObjectType)
|
||||
%nveh++;
|
||||
}
|
||||
}
|
||||
%numtrg = %ntrt@" "@%nplr@" "@%nveh@" "@%ndep;
|
||||
%numtrgs = %ntrt + %nplr + %nveh + %ndep;
|
||||
if(%numtrgs >= 3){
|
||||
schedule(%numtrgs * 20000, 0, "completeCommand", %order, %name, %numtrg, %pos, %sender);
|
||||
schedule(10000, 0, "commandCheckupLoop", %name, %pos, %sender, (%numtrgs * 2) - 1);
|
||||
%wa.schedule(%numtrgs * 20000, "delete");
|
||||
}
|
||||
else{
|
||||
messageclient(%sender, 'MsgClient', "\c2Please specify a location with more targets.");
|
||||
%wa.schedule(100, "delete");
|
||||
}
|
||||
}
|
||||
else
|
||||
messageclient(%sender, 'MsgClient', "\c2Please specify a valid target position.");
|
||||
}
|
||||
|
||||
function commandCheckupLoop(%name, %pos, %issuer, %LCount){
|
||||
if(%LCount < 1)
|
||||
return;
|
||||
for(%i = 0; %i < $squad::numsquads; %i++){
|
||||
if(%name $= $squad::Name[%i]){
|
||||
%j = %i;
|
||||
}
|
||||
}
|
||||
%mem = 0;
|
||||
%num = %j@%mem;
|
||||
while($squad::member[%num] !$= ""){
|
||||
%count = ClientGroup.getCount();
|
||||
%player = $squad::member[%num];
|
||||
for(%i = 0; %i < %count; %i++){
|
||||
%cl = ClientGroup.getObject(%i);
|
||||
if(%cl.ranknum == %player && %cl.team == %issuer.team){
|
||||
%clpos = %cl.player.getPosition();
|
||||
if(vectorDist(%clpos,%pos) <= 100){
|
||||
bottomPrint(%cl, "\c2"@(%LCount * 10)@" seconds remain until objective is complete.", 5);
|
||||
if(%cl.objectivecount $= "")
|
||||
%cl.objectivecount = 0;
|
||||
%cl.objectivecount++;
|
||||
}
|
||||
else
|
||||
bottomPrint(%cl, "\c2You are to far away from the objective zone, you have "@(%LCount * 10)@" seconds left.", 5);
|
||||
}
|
||||
}
|
||||
%mem++;
|
||||
%num = %j@%mem;
|
||||
}
|
||||
%LCount--;
|
||||
schedule(10000, 0, "commandCheckupLoop", %name, %pos, %issuer, %LCount);
|
||||
}
|
||||
|
||||
function completeCommand(%order, %name, %numtrg, %pos, %issuer){
|
||||
%oTrt = getWord(%numtrg,0);
|
||||
%oplr = getWord(%numtrg,1);
|
||||
%oveh = getWord(%numtrg,2);
|
||||
%odep = getWord(%numtrg,3);
|
||||
%nTrt = 0;
|
||||
%nplr = 0;
|
||||
%nveh = 0;
|
||||
%ndep = 0;
|
||||
InitContainerRadiusSearch(%pos, 100, $TypeMasks::PlayerObjectType | $TypeMasks::StaticShapeObjectType | $TypeMasks::TurretObjectType | $TypeMasks::VehicleObjectType);
|
||||
while ((%targetObject = containerSearchNext()) != 0){
|
||||
%target = getWord(%targetObject,0);
|
||||
if(%order $= "attack" && %target.team != %issuer.team){
|
||||
if(%target.getType() & $TypeMasks::PlayerObjectType)
|
||||
%nplr++;
|
||||
if(%target.getType() & $TypeMasks::StaticShapeObjectType){
|
||||
%Ttype = %target.getDataBlock().className ;
|
||||
if(!(%Ttype $= "wall" || %Ttype $= "wWall" || %Ttype $= "spine" || %Ttype $= "mSpine" || %Ttype $= "floor" || %Ttype$= "forcefield"))
|
||||
%ndep++;
|
||||
}
|
||||
if(%target.getType() & $TypeMasks::TurretObjectType)
|
||||
%ntrt++;
|
||||
if(%target.getType() & $TypeMasks::VehicleObjectType)
|
||||
%nveh++;
|
||||
}
|
||||
else if(%order $= "defend" && %target.team == %issuer.team){
|
||||
if(%target.getType() & $TypeMasks::PlayerObjectType)
|
||||
%nplr++;
|
||||
if(%target.getType() & $TypeMasks::StaticShapeObjectType){
|
||||
%Ttype = %target.getDataBlock().className ;
|
||||
if(!(%Ttype $= "wall" || %Ttype $= "wWall" || %Ttype $= "spine" || %Ttype $= "mSpine" || %Ttype $= "floor" || %Ttype$= "forcefield"))
|
||||
%ndep++;
|
||||
}
|
||||
if(%target.getType() & $TypeMasks::TurretObjectType)
|
||||
%ntrt++;
|
||||
if(%target.getType() & $TypeMasks::VehicleObjectType)
|
||||
%nveh++;
|
||||
}
|
||||
}
|
||||
%numtrg = %ntrt@" "@%nplr@" "@%nveh@" "@%ndep;
|
||||
%numtrgs = %otrt + %oplr + %oveh + %odep;
|
||||
%points = ((%otrt - %ntrt) * 4) +
|
||||
((%oplr - %nplr) * 3) +
|
||||
((%oveh - %nveh) * 2) +
|
||||
((%odep - %ndep) * 2);
|
||||
if(%order $= "defend"){
|
||||
%startpoints = (%otrt * 8) + (%oplr * 6) + (%oveh * 4) + (%odep * 4);
|
||||
%points = %startpoints - %points;
|
||||
%percentRemaining = ((%ntrt + %nplr + %nveh + %ndep) / (%otrt + %oplr + %oveh + %odep)) * 100;
|
||||
if(%percentRemaining >= 75){
|
||||
%status = "success";
|
||||
%points = %points + (15 * (%percentRemaining / 100) * %numtrgs);
|
||||
%recomend = "keep up the good work!";
|
||||
}
|
||||
else{
|
||||
%status = "failure";
|
||||
%points = %points - (7.5 * ((100 - %percentRemaining) / 100) * %numtrgs);
|
||||
%recomend = "try harder next time.";
|
||||
}
|
||||
}
|
||||
else{
|
||||
%percentRemaining = ((%ntrt + %nplr + %nveh + %ndep) / (%otrt + %oplr + %oveh + %odep)) * 100;
|
||||
if(%percentRemaining <= 50){
|
||||
%status = "success";
|
||||
%points = %points + (20 * ((100 - %percentRemaining) / 100) * %numtrgs);
|
||||
%recomend = "keep up the good work!";
|
||||
}
|
||||
else{
|
||||
%status = "failure";
|
||||
%points = %points - (10 * (%percentRemaining / 100) * %numtrgs);
|
||||
%recomend = "try harder next time.";
|
||||
}
|
||||
}
|
||||
for(%i = 0; %i < $squad::numsquads; %i++){
|
||||
if(%name $= $squad::Name[%i]){
|
||||
%j = %i;
|
||||
}
|
||||
}
|
||||
%mem = 0;
|
||||
%num = %j@%mem;
|
||||
while($squad::member[%num] !$= ""){
|
||||
%count = ClientGroup.getCount();
|
||||
%player = $squad::member[%num];
|
||||
for(%i = 0; %i < %count; %i++){
|
||||
%cl = ClientGroup.getObject(%i);
|
||||
if(%cl.ranknum == %player && %cl.team == %issuer.team){
|
||||
%clpos = %cl.player.getPosition();
|
||||
if((vectorDist(%clpos,%pos) <= 50 && %order $= "attack") || %cl.objectivecount >= (%numtrgs - 1) * 1.5){
|
||||
messageclient(%cl, 'MsgClient', "\c2Your Objective was deemed a "@%status@" and you were given "@%points@" for this objective. You should "@%recomend);
|
||||
$Rank::Squadscore[%player] = $Rank::Squadscore[%player] + %points;
|
||||
$Rank::Score[%player] = $Rank::Score[%player] + %points;
|
||||
}
|
||||
else{
|
||||
messageclient(%cl, 'MsgClient', "\c2You were to far away from the objective marker. "@(3 * %numtrgs)@" points were deducted from your score.");
|
||||
$Rank::Squadscore[%player] = $Rank::Squadscore[%player] - (4 * %numtrgs);
|
||||
$Rank::Score[%player] = $Rank::Score[%player] - (3 * %numtrgs);
|
||||
}
|
||||
%cl.objectivecount = 0;
|
||||
}
|
||||
}
|
||||
%mem++;
|
||||
%num = %j@%mem;
|
||||
}
|
||||
}
|
||||
|
||||
//--------------------------------------
|
||||
//Force Capabilitys
|
||||
//--------------------------------------
|
||||
|
||||
function ccforce(%sender, %args){
|
||||
if(%sender.ranknum $= ""){
|
||||
messageclient(%sender, 'MsgClient', '\c2Please wait a minute for your stats to load.');
|
||||
return;
|
||||
}
|
||||
if($Rank::Score[%sender.ranknum] < $Ranks::MinPoints[8]){
|
||||
messageclient(%sender, 'MsgClient', '\c2You are not high enough rank to force players.');
|
||||
return;
|
||||
}
|
||||
if(%args $= ""){
|
||||
messageclient(%sender, 'MsgClient', '\c2You must specify what you are forcing, "join" or "leave".');
|
||||
return;
|
||||
}
|
||||
%cmd = getWord(%args, 0);
|
||||
if(%cmd $= "join"){
|
||||
%squad = getWord(%args, 1);
|
||||
%target = getWords(%args, 2, 1 + getNumberOfWords(%args));
|
||||
if(%squad $= "" || %target $= ""){
|
||||
messageclient(%sender, 'MsgClient', '\c2You must specify the squad name and then player name for this to work.');
|
||||
return;
|
||||
}
|
||||
%count = ClientGroup.getCount();
|
||||
for(%i = 0; %i < %count; %i++){
|
||||
%cl = ClientGroup.getObject(%i);
|
||||
if(%cl.namebase $= %target)
|
||||
%i = %count;
|
||||
else if(%i == (%count - 1)){
|
||||
messageClient(%sender, 'MsgClient', "\c2"@%target@" is not a valid player.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
if($Rank::Score[%cl.ranknum] >= $Ranks::MinPoints[8] && !($Rank::Score[%cl.ranknum] < $Ranks::MinPoints[14] && $Rank::Score[%sender.ranknum] >= $Ranks::MinPoints[14])){
|
||||
messageclient(%sender, 'MsgClient', '\c2You may not force this player, he has too high of a rank.');
|
||||
return;
|
||||
}
|
||||
for(%i = 0; %i < $squad::numsquads; %i++){
|
||||
if(%squad $= $squad::Name[%i]){
|
||||
if($Rank::Squad[%cl.ranknum] !$= ""){
|
||||
messageclient(%cl, 'MsgClient', '\c2Higher Rank forced:');
|
||||
ccLeaveSquad(%cl,"");
|
||||
messageclient(%cl, 'MsgClient', '\c2 ');
|
||||
}
|
||||
messageclient(%sender, 'MsgClient', "\c3"@%target@" \c2has joined squad\c3 "@%squad@"\c2.");
|
||||
messageclient(%cl, 'MsgClient', '\c2Higher Rank forced:');
|
||||
ccJoin(%cl, %squad);
|
||||
return;
|
||||
}
|
||||
if($squad::Leader[%i] $= "")
|
||||
%replacable = %i;
|
||||
}
|
||||
|
||||
if($squad::numsquads $= "")
|
||||
$squad::numsquads = 0;
|
||||
if(%replacable !$= ""){
|
||||
$squad::Name[%replacable] = %squad;
|
||||
$squad::Leader[%replacable] = %cl.namebase;
|
||||
$squad::Score[%replacable] = 0;
|
||||
} else{
|
||||
$squad::Name[$squad::numsquads] = %squad;
|
||||
$squad::Leader[$squad::numsquads] = %cl.namebase;
|
||||
$squad::Score[$squad::numsquads] = 0;
|
||||
$squad::numsquads++;
|
||||
}
|
||||
messageclient(%sender, 'MsgClient', "\c2Squad\c3 "@%squad@" \c2has been created with\c3 "@%target@" \c2as leader.");
|
||||
if($Rank::Squad[%cl.ranknum] !$= ""){
|
||||
messageclient(%cl, 'MsgClient', '\c2Higher Rank forced:');
|
||||
ccLeaveSquad(%cl,"");
|
||||
messageclient(%cl, 'MsgClient', '\c2 ');
|
||||
}
|
||||
messageclient(%cl, 'MsgClient', '\c2Higher Rank forced:');
|
||||
ccJoin(%cl, %squad);
|
||||
|
||||
}
|
||||
else if(%cmd $= "leave"){
|
||||
%target = getWords(%args, 1, getNumberOfWords(%args) - 1);
|
||||
echo(getNumberOfWords(%args));
|
||||
echo(%target);
|
||||
if(%target $= ""){
|
||||
messageclient(%sender, 'MsgClient', '\c2You must specify the person you are forcing.');
|
||||
return;
|
||||
}
|
||||
%count = ClientGroup.getCount();
|
||||
for(%i = 0; %i < %count; %i++){
|
||||
%cl = ClientGroup.getObject(%i);
|
||||
if(%cl.namebase $= %target)
|
||||
%i = %count;
|
||||
else if(%i == (%count - 1)){
|
||||
messageClient(%client, 'MsgClient', "\c3"@%target@" \c2is not a valid player.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
if($Rank::Score[%cl.ranknum] >= $Ranks::MinPoints[8] && !($Rank::Score[%cl.ranknum] < $Ranks::MinPoints[14] && $Rank::Score[%sender.ranknum] >= $Ranks::MinPoints[14])){
|
||||
messageclient(%sender, 'MsgClient', '\c2You may not force this player, he has too high of a rank.');
|
||||
return;
|
||||
}
|
||||
if($Rank::Squad[%cl.ranknum] !$= ""){
|
||||
messageclient(%cl, 'MsgClient', '\c2Higher Rank forced:');
|
||||
ccLeaveSquad(%cl,"");
|
||||
messageclient(%sender, 'MsgClient', '\c3'@%target@' \c2has been forced out of his squad.');
|
||||
}
|
||||
else
|
||||
messageclient(%sender, 'MsgClient', '\c2This person does not have a squad to leave.');
|
||||
}
|
||||
else
|
||||
messageclient(%sender, 'MsgClient', '\c2Please use "Join" or "leave" as command.');
|
||||
}
|
||||
|
||||
//--------------------------------------
|
||||
//Misc
|
||||
//--------------------------------------
|
||||
|
||||
function cleanRanks(){
|
||||
for(%i = 0; %i < $Rank::numplayers; %i++){
|
||||
if($Rank::Score[%i] <= 10){
|
||||
$Rank::Score[%i] = "";
|
||||
$Rank::Name[%i] = "";
|
||||
$Rank::Rank[%i] = "";
|
||||
}
|
||||
}
|
||||
for(%i = 0; %i < $Rank::numplayers; %i++){
|
||||
if($Rank::Score[%i] $= ""){
|
||||
%replacenum = $Rank::numplayers;
|
||||
while($Rank::Score[%replacenum] $= ""){
|
||||
%replacenum--;
|
||||
}
|
||||
if(%i > %replacenum){
|
||||
$Rank::numplayers = %i;
|
||||
return;
|
||||
}
|
||||
$Rank::Score[%i] = $Rank::Score[%replacenum];
|
||||
$Rank::Name[%i] = $Rank::Name[%replacenum];
|
||||
$Rank::Rank[%i] = $Rank::Rank[%replacenum];
|
||||
$Rank::Score[%replacenum] = "";
|
||||
$Rank::Name[%replacenum] = "";
|
||||
$Rank::Rank[%replacenum] = "";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function ccSOL(%sender, %args){
|
||||
if(%sender.spawnOnLead $= "" || %sender.spawnOnLead == 0){
|
||||
%sender.spawnOnLead = 1;
|
||||
messageclient(%sender, 'MsgClient', '\c2You will now spawn on your squad leader.');
|
||||
} else {
|
||||
%sender.spawnOnLead = 0;
|
||||
messageclient(%sender, 'MsgClient', '\c2You will no longer spawn on your squad leader.');
|
||||
}
|
||||
}
|
||||
|
||||
function getNumberOfWords(%path){
|
||||
%number = 0;
|
||||
for(%i = 0; %i < 1000; %i++){
|
||||
if(getWord(%path,%i) !$= "")
|
||||
%number++;
|
||||
else
|
||||
return %number;
|
||||
}
|
||||
}
|
||||
77
scripts/modscripts/specops.cs
Normal file
77
scripts/modscripts/specops.cs
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
$NightVisionValue = 0.2;
|
||||
|
||||
function NightVisionLoop(%client){
|
||||
if(!isObject(%client.player))
|
||||
return;
|
||||
%client.player.setWhiteOut($NightVisionValue);
|
||||
%client.player.nightvision = schedule(50, 0, "NightVisionLoop", %client);
|
||||
}
|
||||
|
||||
function serverCmdDoGrab(%client){
|
||||
%obj = %client.player;
|
||||
if(!isObject(%obj))
|
||||
return;
|
||||
if(%obj.grabbing != 1){
|
||||
%pos = %obj.getMuzzlePoint($WeaponSlot);
|
||||
%vec = %obj.getMuzzleVector($WeaponSlot);
|
||||
%targetpos = vectoradd(%pos,vectorscale(%vec,5));
|
||||
%Tobj = containerraycast(%pos, %targetpos, $typemasks::PlayerObjectType | $typemasks::CorpseObjectType, %obj);
|
||||
%Tobj = getword(%Tobj,0);
|
||||
if(%Tobj.client.team == %client.team && !$TeamDamage)
|
||||
return; // Can't pickup teammates now.
|
||||
if(isObject(%Tobj)){
|
||||
if(vectorDist(%obj.getForwardVector(),%Tobj.getForwardVector()) > 1.6)
|
||||
return;
|
||||
%armortype = %obj.getdatablock().getname();
|
||||
if(!(%armortype $= "SpecOpsMaleHumanArmor" || %armortype $= "SpecOpsFemaleHumanArmor" || %armortype $= "SpecOpsMaleBiodermArmor"))
|
||||
return;
|
||||
if(%Tobj.grabbing == 1)
|
||||
%Tobj.grabbing = 0;
|
||||
if(%Tobj.grabbed == 1)
|
||||
return;
|
||||
%dataBlock = %Tobj.getDataBlock();
|
||||
%mass = %dataBlock.mass;
|
||||
if(%mass >= 150){
|
||||
return;
|
||||
}
|
||||
%Tobj.grabbed = 1;
|
||||
%Tobj.setMoveState(true);
|
||||
%obj.grabbing = 1;
|
||||
schedule(100, 0, "GrabLoop", %obj, %Tobj);
|
||||
}
|
||||
}
|
||||
else
|
||||
%obj.grabbing = 0;
|
||||
}
|
||||
|
||||
function GrabLoop(%obj, %Tobj){
|
||||
if(!(isObject(%obj) && isObject(%Tobj)))
|
||||
return;
|
||||
if(%obj.getstate() $= "dead"){
|
||||
%Tobj.setMoveState(false);
|
||||
%Tobj.grabbed = 0;
|
||||
return;
|
||||
}
|
||||
if(%obj.grabbing != 1){
|
||||
%Tobj.setMoveState(false);
|
||||
%Tobj.grabbed = 1;
|
||||
if(%Tobj.getState() !$= "Dead")
|
||||
%Tobj.getDataBlock().damageObject(%Tobj, %obj, %Tobj.getPosition(), 10, $DamageType::blah, "0 0 1", %obj.getControllingClient(), %obj);
|
||||
return;
|
||||
}
|
||||
if(%Tobj.getMountedImage($weaponslot) !$= "")
|
||||
%Tobj.throwWeapon();
|
||||
if(%Tobj.getMountedImage($Backpackslot) !$= "")
|
||||
%Tobj.throwPack();
|
||||
if(%obj.getMountedImage($weaponslot) !$= "")
|
||||
%obj.unmountImage($weaponslot);
|
||||
|
||||
%pos = %obj.getPosition();
|
||||
%rot = %obj.getRotation();
|
||||
%vel = vectoradd(%obj.getvelocity(), "0 0 1");
|
||||
%vec = vectorScale(%obj.getForwardVector(),3);
|
||||
%vec = vectorAdd(%vec, "0 0 0.5");
|
||||
%Tobj.setTransform(vectorAdd(%pos, %vec)@" "@%rot);
|
||||
%Tobj.setvelocity(%vel);
|
||||
schedule(100, 0, "GrabLoop", %obj, %Tobj);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue