mirror of
https://github.com/Ragora/T2-ACCM.git
synced 2026-01-20 11:24:45 +00:00
283 lines
8.5 KiB
C#
283 lines
8.5 KiB
C#
$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);
|
|
} |