Page 1 of 1

Flying platform!

Posted: April 11th, 2010, 5:26 pm
by ThePsycho
Hey all, im looking for some help atm, involving a flying platform or something :P

I would like to have a platform that i can fly.. So when i go up to it i press f to attach myself to it, then right click to go forward for example... So i can fly around in it, then press f to get out, or another button... This is for my mp map btw..

i have seen it on a map..so it is possible:P

http://www.xfire.com/video/279eab/

Re: Flying platform!

Posted: April 12th, 2010, 1:39 pm
by BatterY
I'm assuming you're wanting to get the UFO-like script from fm_squishydeath.
My advice is looking into the maps GSC-file first (open with PakScape) and try your luck.

Re: Flying platform!

Posted: April 12th, 2010, 5:21 pm
by waywaaaard
It's not that difficult. Just calculate from the view and player angles the direction in which you move.

Re: Flying platform!

Posted: April 21st, 2010, 8:45 pm
by ThePsycho
i tryed to find the script like for 2 weeks and when i finally did founf it it was written in a code so other pple cant read it...

Re: Flying platform!

Posted: April 21st, 2010, 8:53 pm
by Drofder2004
If you do know where to start with this code, I recommend you forget the idea exists and try something simpler. this code is on the higher end of scripting.

Re: Flying platform!

Posted: April 25th, 2010, 6:06 pm
by Stealth
this is the code, but you will have to adapt it to the map with fx n shiz:

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);
}

}

Re: Flying platform!

Posted: April 25th, 2010, 7:14 pm
by Xylozi
This is some prototype code which I was working on. It requires the flyer to be one entity (e.g. multiple brushes groups together with script_brushmodel, or a script_model) with the targetname: flying platform. It also has to be surrounded by a trigger which is TARGETED by the flyer.

Code: Select all

SetupFlyers()
{
	flyers = GetEntArray( "flying_platform", "targetname" );
	
	for( i = 0; i < flyers.size; i++ )
	{
		flyer = flyers[i];
		
		flyer thread WatchTriggerUse(); // Each flyer will now monitor its respective trigger
	}
}

WatchTriggerUse()
{
	flyer_trigger = GetEnt( self.target, "targetname" ); // The platform must target the trigger!
	
	while(1)
	{
		flyer_trigger waittill( "trigger", player );
		
		if( player UseButtonPressed() )
		{
			while( player UseButtonPressed() )
				wait 0.05;
		
			if( isPlayer( player ) )
			{
				if( isAlive( player ) )
				{
					if( player.pers["team"] != "spectator" )
					{
						player LinkTo( self );
						player SetClientDvar( "cg_thirdperson", 1 );
						flyer_trigger thread DisableTilFlyerDeath( self );
						self thread StartFlyer( player );
					}
				}
			}
		}
	}
}

StartFlyer( player )
{
	self.start_origin = self.origin;
	self.start_angles = self.angles;

	self thread MonitorPlayerStatus( player, self.start_origin );
	self thread MonitorMovement( player );
	self thread MonitorAngles( player );
	self thread MonitorCrashes( player );
	self thread MonitorFire( player );
}

MonitorAngles( player )
{
	self endon( "flyer_compromised" );
	
	while(1)
	{
		wait 0.05;
	
		angles = player GetPlayerAngles();
		self.angles = angles + ( 0, 90, 0 );
	}
}

MonitorMovement( player )
{
	self endon( "flyer_compromised" );

	while(1)
	{
		wait 0.1;

		angles = player GetPlayerAngles();
		forward = vector_scale( anglestoforward( angles ), 50 );
		forward2 = vector_scale( anglestoforward( angles ), 75 );

		if( bulletTracePassed( self.origin, self.origin + forward2, false, self ) )
		{
			self MoveTo( self.origin + forward2, 0.1 );
		}
		
		if( player ADSButtonPressed() )
		{
			angles = player GetPlayerAngles();
			forward = vector_scale( anglestoforward( angles ), 100 );
			forward2 = vector_scale( anglestoforward( angles ), 125 );

			if( bulletTracePassed( self.origin, self.origin + forward2, false, self ) )
			{
				self MoveTo( self.origin + forward2, 0.1 );
			}
		}
	}
}

MonitorFire( player )
{
	self endon( "flyer_compromised" );

	while(1)
	{
		wait 0.05;
		
		if( player AttackButtonPressed() )
		{
			while( player AttackButtonPressed() ) 
				wait 0.05;
				
			self thread FireGun( player );
		}
	}
}

MonitorCrashes( player )
{
	self endon( "flyer_compromised" );

	while(1)
	{
		origin = player.origin;
		angles = player.angles;
		forward = vector_scale( anglesToForward( angles ), 10000 );
		down = vector_scale( anglesToUp( angles ), -10000 );
		right = vector_scale( anglesToRight( angles ), 10000 );
		left = vector_scale( anglesToRight( angles ), -10000 );
		
		trace1 = bulletTrace( self.origin, self.origin + forward, false, self );
		trace2 = bulletTrace( self.origin, self.origin + down, false, self );
		trace3 = bulletTrace( self.origin, self.origin + right, false, self );
		trace4 = bulletTrace( self.origin, self.origin + left, false, self );
		
		if( Distance( origin, trace1["position"] ) < 50 || Distance( origin, trace2["position"] ) < 50 || Distance( origin, trace3["position"] ) < 50 || Distance( origin, trace4["position"] ) < 50 )
		{
			player suicide(); 
			self notify( "flyer_compromised" );
		}
		
		wait 0.05;
	}
}

FireGun( player )
{
	gun = player GetPlayerAngles();
	end = vector_scale( AnglesToForward( angles ), 100000 );
	weapon = bulletTrace( gun, end, true, self );

	eInflictor = player;
	eAttacker = player;
	iDamage = 100;
	iDFlags = 0;
	sMeansOfDeath = "MOD_RIFLE_BULLET";
	sWeapon = "rpg_mp";
	vPoint = ( 0, 0, 0 );
	vDir = ( 0, 0, 0 );
	sHitLoc = "helmet";
	sOffset = 0;
	
	//if( isPlayer( weapon["entity"] ) )
		weapon["entity"] FinishPlayerDamage( eInflictor, eAttacker, iDamage, iDFlags, sMeansOfDeath, sWeapon, vPoint, vDir, sHitLoc, sOffset );
	//else
	//	player iPrintLn( "^3Is not player " );
}

MonitorPlayerStatus( player, origin )
{
	self thread MonitorPlayerDisconnect( player );
	self thread MonitorPlayerDeath( player );
	
	self waittill( "flyer_compromised" );

	self.origin = self.start_origin;
	self.angles = self.start_angles;
}

MonitorPlayerDisconnect( player )
{
	self endon( "flyer_compromised" );
	player waittill( "disconnect" );
	self notify( "flyer_compromised" );
}

MonitorPlayerDeath( player )
{
	self endon( "flyer_compromised" );
	
	while(1)
	{
		if( !isAlive( player ) )
		{
			self notify( "flyer_compromised" );
		}
		
		wait 0.1;
	}
}
// Utils
vector_scale(vec, scale)
{
	vec = (vec[0] * scale, vec[1] * scale, vec[2] * scale);
	return vec;
}

DisableTilFlyerDeath( flyer )
{	
	origin = self.origin;
	self.origin = self.origin + ( 0, 0, -100000 );
	flyer waittill( "flyer_compromised" );	// Flyer will respawn in original spot when destroyed
	self.origin = origin;
}
This code will allow you to fly basically, will kill you if your about to glitch into geometry and will return the flyer back to the original spawn point.