Code: Select all
main()
{
level.rh_allow_fighter = rat_house\rat_house::createdvar("rat_house_allow_fighter",1,0,1,"int");
level.rh_fighter_speed = rat_house\rat_house::createdvar("rat_house_fighter_speed",700,1,999999,"int");
level.rh_fighter_boost_speed = rat_house\rat_house::createdvar("rat_house_fighter_boost_speed",1700,1,999999,"int");
level.rh_fighter_boost_blur = rat_house\rat_house::createdvar("rat_house_fighter_boost_blur",1,0,1,"int");
level.rh_fighter_crash_speed = rat_house\rat_house::createdvar("rat_house_fighter_crash_speed",1000,1,999999,"int");
level.rh_fighter_mg_dmg = rat_house\rat_house::createdvar("rat_house_fighter_mg_dmg",20,1,999999,"int");
level.rh_fighter_mg_acc = rat_house\rat_house::createdvar("rat_house_fighter_mg_acc",1,0,20,"float");
level.rh_fighter_missile_speed = rat_house\rat_house::createdvar("rat_house_fighter_missile_speed",1000,1,999999,"int");
level.rh_fighter_missile_radius = rat_house\rat_house::createdvar("rat_house_fighter_missile_dmg_radius",200,1,999999,"int");
level.rh_fighter_missile_max_dmg = rat_house\rat_house::createdvar("rat_house_fighter_missile_max_dmg",200,2,999999,"int");
level.rh_fighter_missile_min_dmg = rat_house\rat_house::createdvar("rat_house_fighter_missile_min_dmg",70,1,999999,"int");
level.rh_fighter_missile_acc = rat_house\rat_house::createdvar("rat_house_fighter_missile_acc",0.5,0,20,"float");
level.rh_fighter_missile_reload = rat_house\rat_house::createdvar("rat_house_fighter_reload",3,0.05,999999,"float");
level.rh_fighter_missile_fire = rat_house\rat_house::createdvar("rat_house_fighter_fire",0.3,0,999999,"float");
level.rh_fighter_missiles = rat_house\rat_house::createdvar("rat_house_fighter_missiles",3,1,20,"int");
if(level.rh_fighter_missile_min_dmg >= level.rh_fighter_missile_max_dmg)
level.rh_fighter_missile_min_dmg = level.rh_fighter_missile_max_dmg - 1;
precacheModel("projectile_at4");
level.fx_fighter_mg_muzz = loadFx("rat_house/fighter/fighter_flash");
level.fx_fighter_missile_muzz = loadFx("rat_house/fighter/fighter_flash_rl");
level.fx_fighter_missile_trail = loadFx("rat_house/fighter/fighter_missile_trail");
level.fx_fighter_trail = loadFx("rat_house/fighter/fighter_engine_trail");
level.fx_fighter_death_trail = loadFx("rat_house/fighter/fighter_death_trail");
level.fx_fighter_exp = loadFx("explosions/vehicle_explosion_bmp");
if(level.rh_fighter_boost_blur)precacheShellshock("rh_fighter_boost");
dustfighters = getentarray("fighter","targetname");
for(i=0;i<dustfighters.size;i++)dustfighters[i] thread init();
}
init()
{
self.targetname = undefined;self.link = [];
stuff = getentarray(self.target, "targetname");
for(i=0;i<stuff.size;i++){if(!isDefined(stuff[i].script_noteworthy))continue;
else if(stuff[i].script_noteworthy == "trig")self.trigger = stuff[i];
else if(stuff[i].script_noteworthy == "link")self.link[self.link.size] = stuff[i];
else if(stuff[i].script_noteworthy == "fx")self.tag_fx = stuff[i];else if(stuff[i].script_noteworthy == "tag_player")self.tag_player = stuff[i];else if(stuff[i].script_noteworthy == "tag_passenger")self.tag_passenger = stuff[i];}self.target = undefined;
if(!level.rh_allow_fighter){self.tag_fx delete();self.tag_player delete();self.tag_passenger delete();self.trigger thread disallowfighter();
return;}oldangles = self.angles;self.angles = (0,0,0);
for(i=0;i<self.link.size;i++)self.link[i] linkto(self);
self.tag_fx notsolid();self.tag_fx setcontents(0);
self.tag_fx linkto(self);self.angles = oldangles;
temp = self.tag_passenger.origin;
self.tag_passenger delete();
self.tag_passenger = temp;temp = self.tag_player.origin;
self.tag_player delete();self.tag_player = temp;self.maxup = -50;self.maxdown = 50;
self.restorigin = self.origin;
self.restangles = self.angles;
self.atrest = true;self.speed = level.rh_fighter_speed;
self.crashed = false;
self.wallnormal = (0,0,1);
self.getoff = false;self.destroyed = false;
self.attacker = undefined;self.owner = undefined;
self.passenger = undefined;
while(1){self.trigger waittill("trigger", player);
if(isDefined(self.owner))continue;
if(player.sessionstate != "playing")continue;
if(isDefined(player.infighter))continue;
if(isDefined(player.insam))continue;
if(isDefined(player.inturret))continue;
if(isDefined(player.islaunching))continue
;if(isDefined(player.ispara))continue;
if(player getStance() == "prone")continue;
player.infighter = true;
self.owner = player;
self thread init_fighter();
self thread waitforpassenger();
self waittill("fighter_done");
self.trigger rat_house\rat_house::entityOn();
}
}
waitforpassenger()
{
self endon("fighter_dead");
self endon("fighter_started");
while(1){self.trigger waittill("trigger",player);
if(player.sessionstate != "playing")continue;
if(isDefined(player.infighter))continue;
if(isDefined(player.insam))continue;
if(isDefined(player.inturret))continue;
if(isDefined(player.islaunching))continue;
if(isDefined(player.ispara))continue;
if(player getStance() == "prone")continue;
player.infighter = true;
self.trigger rat_house\rat_house::entityOff();
self.passenger = player;
self thread init_passenger();
break;
}
}
disallowfighter()
{
while(1){self waittill("trigger", player);
if(player.sessionstate != "playing")continue;
player iPrintlnBold("^2Sorry, Dust Fighters are not allowed on this server");
}}init_passenger(){self endon("passenger_out");
self.passenger.origin = self.tag_passenger;
self.passenger linkto(self);self.passenger iPrintlnBold("^2Press [^1[{+activate}]^2] to get out");
self.owner iPrintlnBold(self.passenger.name + " ^7is your passenger");
self.passenger iPrintlnBold(self.owner.name + " ^7is your driver");
self.passenger common_scripts\utility::waittill_any("death","disconnect","joined_spectators","spawned");
if(isPlayer(self.passenger)){self.passenger unlink();
self.passenger.infighter = undefined;
}self.passenger = undefined;
}init_fighter(){self endon("fighter_dead");
self.bombing = false;
self.crashed = false;
self.wallnormal = (0,0,1);
self.getoff = false;
self.destroyed = false;
self.attacker = undefined;
self thread drawhud();
self thread monitordriver();
self thread monitorstuff();
self.owner.origin = self.tag_player;self.owner linkto(self);
wait 1;self.owner disableweapons();
self.owner iPrintlnBold("^2Press [^1[{+melee}]^2] to fire missiles");
self.owner iPrintlnBold("^2Press [^1[{+attack}]^2] to fire machine gun");
self.owner iPrintlnBold("^2Press [^1[{+activate}]^2] to get out");
self.owner iPrintlnBold("^2Hold [^1[{+frag}]^2] for speed boost");
wait 1;self setcontents(0);self playLoopSound("fighter_engine");
playfxontag(level.fx_fighter_trail,self.tag_fx, "tag_origin");
self.trigger rat_house\rat_house::entityOff();
self.atrest = false;self notify("fighter_started");
}
drawhud()
{
self.owner endon("disconnect");
yadd = 15;xadd = 15;
fighterhud = [];
fighterhud[0] = newClientHudElem(self.owner);
fighterhud[0].alignX = "center";
fighterhud[0].alignY = "middle";
fighterhud[0].x = 320;
fighterhud[0].y = 240 + yadd;
fighterhud[0].alpha = 1;
fighterhud[0].sort = 2;
fighterhud[0].color = (1,1,1);
fighterhud[0] setShader("white",1,10);
fighterhud[1] = newClientHudElem(self.owner);
fighterhud[1].alignX = "center";
fighterhud[1].alignY = "middle";
fighterhud[1].x = 320;
fighterhud[1].y = 240 - yadd;
fighterhud[1].alpha = 1;
fighterhud[1].sort = 2;
fighterhud[1].color = (1,1,1);
fighterhud[1] setShader("white",1,10);
fighterhud[2] = newClientHudElem(self.owner);
fighterhud[2].alignX = "center";
fighterhud[2].alignY = "middle";
fighterhud[2].x = 320 + xadd;
fighterhud[2].y = 240;
fighterhud[2].alpha = 1;
fighterhud[2].sort = 2;
fighterhud[2].color = (1,1,1);fighterhud[2] setShader("white",10,1);
fighterhud[3] = newClientHudElem(self.owner);
fighterhud[3].alignX = "center";
fighterhud[3].alignY = "middle";
fighterhud[3].x = 320 - xadd;
fighterhud[3].y = 240;
fighterhud[3].alpha = 1;
fighterhud[3].sort = 2;
fighterhud[3].color = (1,1,1);
fighterhud[3] setShader("white",10,1);
self waittill("fighter_dead");
for(i=0;i<fighterhud.size;i++){if(isDefined(fighterhud[i]))fighterhud[i] destroy();
}
}
monitordriver()
{self endon("fighter_dead");
self.owner common_scripts\utility::waittill_any("death","disconnect","joined_spectators","spawned");
self thread deactivate_fighter();
}monitorstuff(){self endon("fighter_dead");
self waittill("fighter_started");
boosting = false;oldboosting = false;oldorigin = (0,0,0);
loop = 0;
while(1)
{
wait 0.05;
self.owner disableweapons();
traces = [];
traces[traces.size] = bulletTrace(self.origin + (0,0,0),self.origin + (0,0,50), false, self);
traces[traces.size] = bulletTrace(self.origin + (0,0,-28),self.origin + (0,0,-52), false, self);
tracestart = self.origin;traceend = self.origin + rat_house\rat_house::vectorScale(anglestoup(self.angles),50);
traces[traces.size] = bulletTrace(tracestart,traceend, false, self);
tracestart = self.origin + rat_house\rat_house::vectorScale(anglestoup(self.angles),-28);
traceend = self.origin + rat_house\rat_house::vectorScale(anglestoup(self.angles),-52);
traces[traces.size] = bulletTrace(tracestart,traceend, false, self); tracestart = self.origin + rat_house\rat_house::vectorScale(anglestoright(self.angles),-32);traceend = self.origin + rat_house\rat_house::vectorScale(anglestoright(self.angles),32);
traces[traces.size] = bulletTrace(tracestart,traceend, false, self);
tracestart = self.origin + rat_house\rat_house::vectorScale(anglestoforward(self.angles),-32);
traceend = self.origin + rat_house\rat_house::vectorScale(anglestoforward(self.angles),32);
traces[traces.size] = bulletTrace(tracestart,traceend, false, self);
for(i=0;i<traces.size;i++){if(traces[i]["fraction"] == 1)continue;
else if(isDefined(traces[i]["entity"]) && traces[i]["entity"].classname == "noclass")continue;
self.crashed = true;
self.wallnormal = traces[i]["normal"];
self thread deactivate_fighter();
}
angles = self.owner getPlayerAngles();
if(angles[0] < self.maxup)angles = (self.maxup,angles[1],0);
if(angles[0] > self.maxdown)angles = (self.maxdown,angles[1],0);
if(angles != self.angles)self.angles = angles;
if(isPlayer(self.passenger) && self.passenger usebuttonpressed())
{
self.passenger unlink();
self.passenger.infighter = undefined;
self.passenger = undefined;
self notify("passenger_out");
}if(self.owner usebuttonpressed()){self.getoff = true;
self thread deactivate_fighter();}if(self.owner fragbuttonpressed()){self.speed = level.rh_fighter_boost_speed;boosting = true;
if(level.rh_fighter_boost_blur && !(loop % 2)){loop = 0;
self.owner shellshock("rh_fighter_boost",0.2);
}
loop++;}else {self.speed = level.rh_fighter_speed;
boosting = false;
}
origin = self.origin + rat_house\rat_house::vectorScale(anglestoforward(self.angles),15000);
trace = bulletTrace(self.origin, origin, false, self);
trace["position"] = trace["position"] - rat_house\rat_house::vectorScale(anglestoforward(self.angles),10);if(oldboosting != boosting || distance(oldorigin,trace["position"]) > 10){oldorigin = trace["position"];
oldboosting = boosting;
time = rat_house\rat_house::calcspeed(self.speed, self.origin, trace["position"]);
if(time <= 0)time = 1;self moveto(trace["position"],time,0,0);
}
if(!boosting){if(self.owner attackbuttonpressed())self thread fire_mg();
if(!self.bombing && self.owner meleebuttonpressed())self thread fire_rl();
}
}
}
deactivate_fighter()
{
if(self.crashed)
{
self.owner suicide();
if(isPlayer(self.passenger))self.passenger suicide();
}
self setCanDamage(0);
if(!self.destroyed)self.attacker = undefined;
if(isPlayer(self.owner)){self.owner enableweapons();
self.owner unlink();self.owner.infighter = undefined;
if(self.destroyed && isPlayer(self.attacker))self.owner thread [[level.callbackPlayerDamage]](self.attacker,self.attacker,200,0,"MOD_RIFLE_BULLET","",self.owner.origin,VectorNormalize(self.owner.origin - self.attacker.origin),"none",0);}if(isPlayer(self.passenger))
{
self notify("passenger_out");
self.passenger unlink();
self.passenger.infighter = undefined;
if(self.destroyed && isPlayer(self.attacker))self.passenger thread [[level.callbackPlayerDamage]](self.attacker,self.attacker,200,0,"MOD_RIFLE_BULLET","",self.passenger.origin,VectorNormalize(self.passenger.origin - self.attacker.origin),"none",0);
}
self.owner = undefined;
self.passenger = undefined;
self notify("fighter_dead");
if(self.atrest)
{
self notify("fighter_done");
return;
}
trace = [];
if(!isDefined(self.wallnormal))trace["normal"] = (0,0,1);else trace["normal"] = self.wallnormal;
if(!self.crashed){origin = self.origin + rat_house\rat_house::vectorScale(anglestoforward(self.angles),15000);trace = bulletTrace(self.origin, origin, false, self);if(isDefined(trace["entity"]) && trace["entity"].classname == "noclass")
trace = bulletTrace(self.origin, origin, false, trace["entity"]);
self rotateroll(7200,20,0,0);time = rat_house\rat_house::calcspeed(level.rh_fighter_crash_speed, self.origin, trace["position"]);
if(time > 0){self moveto(trace["position"],time,0,0);playfxontag(level.fx_fighter_death_trail,self.tag_fx,"tag_origin");
self waittill("movedone");}}if(trace["normal"] == (0,0,0))trace["normal"] = (0,0,1);
playfx(level.fx_fighter_exp, self.origin, trace["normal"]);
self playsound("explo_metal_rand");
earthquake(0.2,1,self.origin,500);
self stopLoopSound();self hide();
for(i=0;i<self.link.size;i++)self.link[i] hide();
self.tag_fx hide();wait 5; for(i=0;i<self.link.size;i++)self.link[i] show();self.tag_fx show();self show();self setcontents(1);self.origin = self.restorigin;self.angles = self.restangles;self.atrest = true;self notify("fighter_done");
}
fire_rl()
{
self endon("fighter_dead");
self.bombing = true;
for(i=0;i<level.rh_fighter_missiles;i++){self playsound("fighter_rl_fire");
earthquake(0.2,1,self.origin,100);
playfxontag(level.fx_fighter_missile_muzz,self.tag_fx,"tag_origin");
missile = spawn("script_model", self.origin);missile setModel("projectile_at4");
missile.angles = self.angles;
missile setcontents(0);
missile notSolid();wait 0.05;
missile.killCamEnt = missile;
missile.killcamstart = getTime() - 1000;
missile.owner = self.owner;missile.speed = level.rh_fighter_missile_speed;
add = (0,0,0);
if(level.rh_fighter_missile_acc)add = ((randomFloat(level.rh_fighter_missile_acc * 2) - level.rh_fighter_missile_acc),(randomFloat(level.rh_fighter_missile_acc * 2) - level.rh_fighter_missile_acc),0);
missile.goto = self.origin + rat_house\rat_house::vectorScale(anglestoforward(self.angles + add),15000); missile.origin = self.origin;missile.angles = vectortoangles(missile.goto - missile.origin);missile playLoopSound("weap_rpg_loop");playfxontag(level.fx_fighter_missile_trail, missile, "tag_fx");time = rat_house\rat_house::calcspeed(missile.speed, missile.origin, missile.goto);
if(time <= 0)time = 1;
missile moveto(missile.goto,time,0,0);
missile thread missile_exp();
wait level.rh_fighter_missile_fire;
}
wait level.rh_fighter_missile_reload;
self.bombing = false;
}
missile_exp()
{
trace = self rat_house\rat_house::rocketcollision(false,self,20);
if(!isDefined(trace)){trace = [];
trace["normal"] = (0,0,1);trace["position"] = self.origin;}if(trace["normal"] == (0,0,0))trace["normal"] = (0,0,1);
playfx(level.fx_rh_exp,trace["position"],trace["normal"]);origin = trace["position"] - rat_house\rat_house::vectorScale(anglestoforward(self.angles),5);if(isPlayer(self.owner)) self.owner radiusDamage(origin, level.rh_fighter_missile_radius, level.rh_fighter_missile_max_dmg, level.rh_fighter_missile_min_dmg, self.owner, "MOD_PROJECTILE_SPLASH", "");
earthquake(0.25,2,origin,300);
self playSound("rocket_explode_default");
wait 0.05;self delete();
}
fire_mg()
{
self playsound("weap_m197_cannon_fire");
playfxontag(level.fx_fighter_mg_muzz,self.tag_fx,"tag_origin");
if(self.owner getStance() == "stand")start = self.owner.origin + (0,0,60);else start = self.owner.origin + (0,0,40);add = (0,0,0);if(level.rh_fighter_mg_acc)
add = ((randomFloat(level.rh_fighter_mg_acc * 2) - level.rh_fighter_mg_acc),(randomFloat(level.rh_fighter_mg_acc * 2) - level.rh_fighter_mg_acc),0);origin = start + rat_house\rat_house::vectorScale(anglestoforward(self.angles + add),999999);
trace = bulletTrace(start,origin, true, self.owner);
surface = trace["surfacetype"];
if(surface == "none")surface = "default";
if(surface == "brick" || surface == "ceramic" || surface == "concrete" || surface == "dirt" || surface == "flesh" || surface == "glass" || surface == "metal" || surface == "water" || surface == "wood")playfx(level.fx_rh_impact[surface],trace["position"],trace["normal"]);else if(surface == "paintedmetal")playfx(level.fx_rh_impact["metal"],trace["position"],trace["normal"]);else {if(isDefined(trace["entity"]) && trace["entity"].classname == "player")
playfx(level.fx_rh_impact["flesh"],trace["position"],vectorNormalize(trace["position"] - self.owner.origin));else playfx(level.fx_rh_impact["concrete"],trace["position"],trace["normal"]);}if(level.rh_impact_sounds)thread rat_house\rat_house::playsoundatlocation("bullet_large_" + surface,trace["position"],0.05);
if(!isDefined(trace["entity"]))return;
ent = trace["entity"];player = isPlayer(ent);
if(player && ent.sessionstate == "playing")trace["entity"] thread [[level.callbackPlayerDamage]](self.owner,self.owner,level.rh_fighter_mg_dmg,0,"MOD_RIFLE_BULLET","",trace["position"],VectorNormalize(trace["position"] - self.owner.origin),"none",0);else if(!player){ent.health -= level.rh_fighter_mg_dmg;
ent notify("damage", level.rh_fighter_mg_dmg, self.owner, VectorNormalize(trace["position"] - self.owner.origin), trace["position"], "MOD_RIFLE_BULLET", ent.model);
}
}