X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fserver%2Fvehicles%2Fraptor.qc;h=33b5e7d5a2632673b461c651cf7de3467dd432b7;hb=dbdc35464a18f62bf550a20eddac9ec16b0eacee;hp=38ebad04275078262cfc5d9bbdf3c6613ad50557;hpb=f209ef256e1c8cc09fcfb1cf3b3f30f34345e88b;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/server/vehicles/raptor.qc b/qcsrc/server/vehicles/raptor.qc index 38ebad042..ab0d38815 100644 --- a/qcsrc/server/vehicles/raptor.qc +++ b/qcsrc/server/vehicles/raptor.qc @@ -1,815 +1,711 @@ -#define RAPTOR_MIN '-40 -40 0' -#define RAPTOR_MAX '40 40 40' - -float raptor_movestyle; -float raptor_turnspeed; -float raptor_turnroll; -float raptor_pitchspeed; -float raptor_speed_forward; -float raptor_speed_strafe; -float raptor_speed_up; -float raptor_speed_down; - -float raptor_bomblet_waves; -float raptor_bomblet_wavefirst; -float raptor_bomblet_wavenext; -float raptor_bomblet_wawespread; -float raptor_bomblets; -float raptor_bomblet_damage; -float raptor_bomblet_edgedamage; -float raptor_bomblet_radius; -float raptor_bomblet_force; -float raptor_bombs_refire; - -float raptor_beam_dps; -float raptor_beam_fops; -float raptor_beam_aps; -float raptor_beam_size; -float raptor_beam_leangth; -float raptor_beam_refire; - -float raptor_shield_max; -float raptor_shield_regen; - -float raptor_health_max; -float raptor_health_regen; - -float raptor_energy_max; -float raptor_energy_regen; +#ifdef SVQC +#define RAPTOR_MIN '-80 -80 0' +#define RAPTOR_MAX '80 80 70' + +float autocvar_g_vehicle_raptor_respawntime; + +float autocvar_g_vehicle_raptor_movestyle; +float autocvar_g_vehicle_raptor_turnspeed; +float autocvar_g_vehicle_raptor_pitchspeed; +float autocvar_g_vehicle_raptor_pitchlimit; + +float autocvar_g_vehicle_raptor_speed_forward; +float autocvar_g_vehicle_raptor_speed_strafe; +float autocvar_g_vehicle_raptor_speed_up; +float autocvar_g_vehicle_raptor_speed_down; +float autocvar_g_vehicle_raptor_friction; + +float autocvar_g_vehicle_raptor_bomblets; +float autocvar_g_vehicle_raptor_bomblet_alt; +float autocvar_g_vehicle_raptor_bomblet_time; +float autocvar_g_vehicle_raptor_bomblet_damage; +float autocvar_g_vehicle_raptor_bomblet_spread; +float autocvar_g_vehicle_raptor_bomblet_edgedamage; +float autocvar_g_vehicle_raptor_bomblet_radius; +float autocvar_g_vehicle_raptor_bomblet_force; +float autocvar_g_vehicle_raptor_bomblet_explode_delay; +float autocvar_g_vehicle_raptor_bombs_refire; + +float autocvar_g_vehicle_raptor_cannon_turnspeed; +float autocvar_g_vehicle_raptor_cannon_turnlimit; +float autocvar_g_vehicle_raptor_cannon_pitchlimit_up; +float autocvar_g_vehicle_raptor_cannon_pitchlimit_down; + +float autocvar_g_vehicle_raptor_cannon_locktarget; +float autocvar_g_vehicle_raptor_cannon_locking_time; +float autocvar_g_vehicle_raptor_cannon_locking_releasetime; +float autocvar_g_vehicle_raptor_cannon_locked_time; +float autocvar_g_vehicle_raptor_cannon_predicttarget; + +float autocvar_g_vehicle_raptor_cannon_cost; +float autocvar_g_vehicle_raptor_cannon_damage; +float autocvar_g_vehicle_raptor_cannon_radius; +float autocvar_g_vehicle_raptor_cannon_refire; +float autocvar_g_vehicle_raptor_cannon_speed; +float autocvar_g_vehicle_raptor_cannon_spread; +float autocvar_g_vehicle_raptor_cannon_force; + +float autocvar_g_vehicle_raptor_energy; +float autocvar_g_vehicle_raptor_energy_regen; +float autocvar_g_vehicle_raptor_energy_regen_pause; + +float autocvar_g_vehicle_raptor_health; +float autocvar_g_vehicle_raptor_health_regen; +float autocvar_g_vehicle_raptor_health_regen_pause; + +float autocvar_g_vehicle_raptor_shield; +float autocvar_g_vehicle_raptor_shield_regen; +float autocvar_g_vehicle_raptor_shield_regen_pause; + +float autocvar_g_vehicle_raptor_bouncefactor; +float autocvar_g_vehicle_raptor_bouncestop; +vector autocvar_g_vehicle_raptor_bouncepain; void raptor_spawn(); -void raptor_return(); -float raptor_pplug(); +float raptor_frame(); float raptor_takeoff(); -float raptor_land(); .entity bomb1; .entity bomb2; float raptor_altitude(float amax) { - tracebox(self.origin, self.mins, self.maxs, '0 0 -1' * amax, TRUE, self); - if(trace_fraction == 1) - return amax+1; - else - return vlen(self.origin - trace_endpos); + tracebox(self.origin, self.mins, self.maxs, self.origin - ('0 0 1' * amax), MOVE_WORLDONLY, self); + return vlen(self.origin - trace_endpos); } -void raptor_loadsettings() -{ - raptor_movestyle = CCVAR("_movestyle"); - raptor_turnspeed = CCVAR("_turnspeed"); - raptor_turnroll = CCVAR("_turnroll"); - raptor_pitchspeed = CCVAR("_pitchspeed"); - raptor_speed_forward = CCVAR("_speed_forward"); - raptor_speed_strafe = CCVAR("_speed_strafe"); - raptor_speed_up = CCVAR("_speed_up"); - raptor_speed_down = CCVAR("_speed_down"); - - raptor_bomblet_waves = CCVAR("_bomblet_waves "); - raptor_bomblet_wavefirst = CCVAR("_bomblet_wavefirst"); - raptor_bomblet_wavenext = CCVAR("_bomblet_wavenext"); - raptor_bomblet_wawespread = CCVAR("_bomblet_wawespread"); - raptor_bomblets = CCVAR("_bomblets"); - raptor_bomblet_damage = CCVAR("_bomblet_damage"); - raptor_bomblet_edgedamage = CCVAR("_bomblet_edgedamage"); - raptor_bomblet_radius = CCVAR("_bomblet_radius"); - raptor_bomblet_force = CCVAR("_bomblet_force "); - raptor_bombs_refire = CCVAR("_bombs_refire"); - - raptor_beam_dps = CCVAR("_beam_dps"); - raptor_beam_fops = CCVAR("_beam_fops"); - raptor_beam_aps = CCVAR("_beam_aps"); - raptor_beam_size = CCVAR("_beam_size"); - raptor_beam_leangth = CCVAR("_beam_length"); - raptor_beam_refire = CCVAR("_beam_refire"); - - raptor_shield_max = CCVAR("_shield"); - raptor_shield_regen = CCVAR("_shield_regen"); - - raptor_health_max = CCVAR("_health"); - raptor_health_regen = CCVAR("_health_regen"); - - raptor_energy_max = CCVAR("_energy"); - raptor_energy_regen = CCVAR("_energy_regen"); -} -void raptor_bombs_return() +void raptor_bomblet_boom() { - self.owner.bomb1.alpha = 1; - self.owner.bomb2.alpha = 1; + RadiusDamage (self, self.realowner, autocvar_g_vehicle_raptor_bomblet_damage, + autocvar_g_vehicle_raptor_bomblet_edgedamage, + autocvar_g_vehicle_raptor_bomblet_radius, world, + autocvar_g_vehicle_raptor_bomblet_force, DEATH_RAPTOR_BOMB, world); remove(self); } -void raptor_bomblet_boom() +void raptor_bomblet_touch() { - if(other.enemy == self.enemy) + if(other == self.owner) return; - pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1); - RadiusDamage (self, self.enemy, raptor_bomblet_damage, raptor_bomblet_edgedamage, raptor_bomblet_radius, world, raptor_bomblet_force, DEATH_SBROCKET, world); - remove(self); + PROJECTILE_TOUCH; + self.think = raptor_bomblet_boom; + self.nextthink = time + random() * autocvar_g_vehicle_raptor_bomblet_explode_delay; } void raptor_bomb_burst() { - self.angles = vectoangles(self.velocity); - - if(self.cnt < time) + if(self.cnt > time) + if(autocvar_g_vehicle_raptor_bomblet_alt) { - entity bomblet; - float i,v; - vector d; - - makevectors(self.angles); - v = vlen(self.velocity) + random(); - d = normalize(self.velocity); - pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1); - - for(i = 0; i < raptor_bomblets; ++i) - { - - bomblet = spawn(); - setorigin(bomblet,self.origin); - - setmodel(bomblet,"models/vehicles/raptor_bomb.dpm"); - bomblet.scale = 0.5; - - bomblet.owner = self.owner; - bomblet.enemy = self.enemy; - - bomblet.solid = SOLID_TRIGGER; - bomblet.movetype = MOVETYPE_BOUNCE; - bomblet.touch = raptor_bomblet_boom; - - bomblet.think = raptor_bomblet_boom; - bomblet.nextthink = time + 5; - - //bomblet.modelflags = MF_ROCKET; - bomblet.modelflags = MF_GRENADE; - - bomblet.velocity = normalize(d + randomvec() * raptor_bomblet_wawespread) * v; - - bomblet.angles = vectoangles(bomblet.velocity); - } - - self.wait -= 1; - if(self.wait <= 0) + self.nextthink = time; + traceline(self.origin, self.origin + (normalize(self.velocity) * autocvar_g_vehicle_raptor_bomblet_alt), MOVE_NORMAL, self); + if((trace_fraction == 1.0) || (vlen(self.origin - self.owner.origin) < autocvar_g_vehicle_raptor_bomblet_radius)) { - remove(self); + UpdateCSQCProjectile(self); return; } - - self.cnt = time + raptor_bomblet_wavenext; } - self.nextthink = time; -} + entity bomblet; + float i; -void raptor_bomb_touch() -{ - raptor_bomb_burst(); + Damage_DamageInfo(self.origin, 0, 0, 0, '0 0 0', DEATH_RAPTOR_BOMB_SPLIT, 0, self); + + for(i = 0; i < autocvar_g_vehicle_raptor_bomblets; ++i) + { + bomblet = spawn(); + setorigin(bomblet, self.origin); + + bomblet.movetype = MOVETYPE_TOSS; + bomblet.touch = raptor_bomblet_touch; + bomblet.think = raptor_bomblet_boom; + bomblet.nextthink = time + 5; + bomblet.owner = self.owner; + bomblet.realowner = self.realowner; + bomblet.velocity = normalize(normalize(self.velocity) + (randomvec() * autocvar_g_vehicle_raptor_bomblet_spread)) * vlen(self.velocity); + + PROJECTILE_MAKETRIGGER(bomblet); + CSQCProjectile(bomblet, TRUE, PROJECTILE_RAPTORBOMBLET, TRUE); + } + + remove(self); } void raptor_bombdrop() { entity bomb_1, bomb_2; - self.bomb1.alpha = 0.25; - self.bomb2.alpha = 0.25; - bomb_1 = spawn(); bomb_2 = spawn(); - setmodel(bomb_1,"models/vehicles/raptor_bomb.dpm"); - setmodel(bomb_2,"models/vehicles/raptor_bomb.dpm"); - setorigin(bomb_1, gettaginfo(self, gettagindex(self, "bombmount_left"))); setorigin(bomb_2, gettaginfo(self, gettagindex(self, "bombmount_right"))); - bomb_1.movetype = bomb_2.movetype = MOVETYPE_TOSS; - bomb_1.velocity = bomb_2.velocity = self.velocity; - bomb_1.touch = bomb_2.touch = raptor_bomb_touch; - bomb_1.think = bomb_2.think = raptor_bomb_burst; - bomb_1.nextthink = bomb_2.nextthink = time; - bomb_1.cnt = bomb_2.cnt = time + raptor_bomblet_wavefirst; - bomb_1.wait = bomb_2.wait = raptor_bomblet_waves; - - bomb_1.avelocity = bomb_2.avelocity = '0 0 180'; - bomb_1.owner = bomb_2.owner = self; - bomb_1.enemy = bomb_2.enemy = self.owner; - bomb_1.angles = bomb_2.angles = self.angles; + bomb_1.movetype = bomb_2.movetype = MOVETYPE_BOUNCE; + bomb_1.velocity = bomb_2.velocity = self.velocity; + bomb_1.touch = bomb_2.touch = raptor_bomb_burst; + bomb_1.think = bomb_2.think = raptor_bomb_burst; + bomb_1.cnt = bomb_2.cnt = time + 10; + + if(autocvar_g_vehicle_raptor_bomblet_alt) + bomb_1.nextthink = bomb_2.nextthink = time; + else + bomb_1.nextthink = bomb_2.nextthink = time + autocvar_g_vehicle_raptor_bomblet_time; + + bomb_1.owner = bomb_2.owner = self; + bomb_1.realowner = bomb_2.realowner = self.owner; bomb_1.solid = bomb_2.solid = SOLID_BBOX; + bomb_1.gravity = bomb_2.gravity = 1; - bomb_1 = spawn(); - bomb_1.owner = self; - bomb_1.think = raptor_bombs_return; - bomb_1.nextthink = time + raptor_bombs_refire; + PROJECTILE_MAKETRIGGER(bomb_1); + PROJECTILE_MAKETRIGGER(bomb_2); + + CSQCProjectile(bomb_1, TRUE, PROJECTILE_RAPTORBOMB, TRUE); + CSQCProjectile(bomb_2, TRUE, PROJECTILE_RAPTORBOMB, TRUE); } -void raptor_animator_think() + +void raptor_fire_cannon(entity gun, string tagname) { - self.owner.frame += 1; - if(self.owner.frame == self.cnt) - remove(self); - else - self.nextthink = time + self.wait; + vehicles_projectile("raptor_cannon_muzzleflash", "weapons/lasergun_fire.wav", + gettaginfo(gun, gettagindex(gun, tagname)), normalize(v_forward + randomvec() * autocvar_g_vehicle_raptor_cannon_spread) * autocvar_g_vehicle_raptor_cannon_speed, + autocvar_g_vehicle_raptor_cannon_damage, autocvar_g_vehicle_raptor_cannon_radius, autocvar_g_vehicle_raptor_cannon_force, 0, + DEATH_RAPTOR_CANNON, PROJECTILE_RAPTORCANNON, 0, TRUE, TRUE); } -void raptor_setanim(float start, float end, float length) +void raptor_think() { - entity ani; - if(self.tur_head.enemy) - ani = self.tur_head.enemy; - else - ani = spawn(); - - self.tur_head.enemy = ani; - ani.owner = self; - self.frame = start; - ani.cnt = end; - ani.wait = sys_frametime / length; - ani.think = raptor_animator_think; - ani.nextthink = time + ani.wait; } -void raptor_beam (vector start, vector end, vector smin, vector smax, float bforce, float f_dmg, float deathtype) +void raptor_enter() { - vector hitloc, force, endpoint, dir; - entity ent; + self.owner.PlayerPhysplug = raptor_takeoff; + self.movetype = MOVETYPE_BOUNCEMISSILE; + self.solid = SOLID_SLIDEBOX; + self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_raptor_health) * 100; + self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_raptor_shield) * 100; + self.velocity_z = 1; // Nudge upwards to takeoff sequense can work. + self.tur_head.exteriormodeltoclient = self.owner; - dir = normalize(end - start); - force = dir * bforce; + self.delay = time + autocvar_g_vehicle_raptor_bombs_refire; + self.lip = time; - // go a little bit into the wall because we need to hit this wall later - end = end + dir; + if(self.owner.flagcarried) + setorigin(self.owner.flagcarried, '-20 0 96'); - // trace multiple times until we hit a wall, each obstacle will be made unsolid. - // note down which entities were hit so we can damage them later - while (1) - { - tracebox(start, smin, smax, end, FALSE, world); - - // if it is world we can't hurt it so stop now - if (trace_ent == world || trace_fraction == 1) - break; - - if (trace_ent.solid == SOLID_BSP) - break; +} - // make the entity non-solid so we can hit the next one - trace_ent.railgunhit = TRUE; - trace_ent.railgunhitloc = end; - trace_ent.railgunhitsolidbackup = trace_ent.solid; +void raptor_land() +{ + float hgt; + + hgt = raptor_altitude(512); + self.velocity = (self.velocity * 0.9) + ('0 0 -1800' * (hgt / 256) * sys_frametime); + self.angles_x *= 0.95; + self.angles_z *= 0.95; - // make the entity non-solid - trace_ent.solid = SOLID_NOT; - } + if(hgt < 128) + if(hgt > 0) + self.frame = (hgt / 128) * 25; - endpoint = trace_endpos; + self.bomb1.gun1.avelocity_y = 90 + ((self.frame / 25) * 2000); + self.bomb1.gun2.avelocity_y = -self.bomb1.gun1.avelocity_y; - // find all the entities the railgun hit and hurt them - ent = findchainfloat(railgunhit, TRUE); - while (ent) + if(hgt < 16) { - // get the details we need to call the damage function - ent.solid = ent.railgunhitsolidbackup; - hitloc = ent.railgunhitloc; - ent.railgunhitloc = '0 0 0'; - ent.railgunhitsolidbackup = SOLID_NOT; - ent.railgunhit = FALSE; - - // apply the damage - if (ent.takedamage) - Damage (ent, self, self, f_dmg, deathtype, hitloc, force); - - ent = ent.chain; + self.movetype = MOVETYPE_TOSS; + self.think = raptor_think; + self.frame = 0; } - trace_endpos = endpoint; -} - - -void raptor_enter() -{ - // Remove this when bots know how to use vehicles - if (clienttype(other) != CLIENTTYPE_REAL) - return; - - if(teams_matter) - if(self.team) - if(self.team != other.team) - return; - - self.owner = other; - self.switchweapon = other.switchweapon; - - self.event_damage = vehicle_stdproc_damage; - self.colormap = self.owner.colormap; - self.vehicle_hudmodel.viewmodelforclient = self.owner; - self.nextthink = 0; - self.owner.angles = self.angles; - self.owner.takedamage = DAMAGE_NO; - self.owner.solid = SOLID_NOT; - self.owner.movetype = MOVETYPE_NOCLIP; - self.owner.alpha = -1; - self.owner.PlayerPhysplug = raptor_takeoff; - self.owner.vehicle = self; - self.owner.event_damage = SUB_Null; - self.owner.hud = HUD_RAPTOR; - self.owner.vehicle_health = self.vehicle_health / raptor_health_max; - self.owner.vehicle_shield = self.vehicle_shield / raptor_shield_max; - self.owner.view_ofs = '0 0 1'; - self.owner.vehicle_ammo1 = self.vehicle_ammo1; - self.owner.vehicle_ammo2 = self.vehicle_ammo2; - self.owner.vehicle_reload1 = self.vehicle_reload1; - self.owner.vehicle_reload2 = self.vehicle_reload2; - - other.flags &~= FL_ONGROUND; - self.flags &~= FL_ONGROUND; - - self.frame = 0; - raptor_setanim(0, 25, 1); - - self.team = self.owner.team; - self.flags -= FL_NOTARGET; - self.velocity = '0 0 1'; - - setorigin(other,self.origin + '0 0 32'); - other.velocity = self.velocity; - - other.flags &~= FL_ONGROUND; - msg_entity = other; - WriteByte (MSG_ONE, SVC_SETVIEWPORT); - WriteEntity( MSG_ONE, self.vehicle_viewport); - - WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES - WriteAngle(MSG_ONE, self.angles_x * -1); // tilt - WriteAngle(MSG_ONE, self.angles_y); // yaw - WriteAngle(MSG_ONE, 0); // roll + self.nextthink = time; } void raptor_exit(float eject) { - self.colormap = 1024; - self.flags = FL_NOTARGET; - - if not (self.owner) - return; - - msg_entity = self.owner; - WriteByte (MSG_ONE, SVC_SETVIEWPORT); - WriteEntity( MSG_ONE, self.owner); - - WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES - WriteAngle(MSG_ONE, 0); // tilt - WriteAngle(MSG_ONE, self.angles_y); // yaw - WriteAngle(MSG_ONE, 0); // roll + vector spot; + self.tur_head.exteriormodeltoclient = world; - if (self.deadflag == DEAD_NO) + if(self.deadflag == DEAD_NO) { - //self.think = racer_exitthink; - self.nextthink = time; + self.think = raptor_land; + self.nextthink = time; } - self.owner.takedamage = DAMAGE_AIM; - self.owner.solid = SOLID_SLIDEBOX; - self.owner.movetype = MOVETYPE_WALK; - - setsize(self.owner,PL_MIN,PL_MAX); - - self.owner.effects &~= EF_NODRAW; - self.owner.alpha = 1; - self.owner.PlayerPhysplug = SUB_Null; - self.owner.vehicle = world; - self.owner.view_ofs = PL_VIEW_OFS; - self.owner.event_damage = PlayerDamage; - self.owner.hud = HUD_NORMAL; - //self.exteriormodeltoclient = self; - - self.vehicle_hudmodel.viewmodelforclient = self; + if not (self.owner) + return; + makevectors(self.angles); if(eject) { - makevectors(self.angles); - setorigin(self.owner,self.origin + v_forward * 100); + spot = self.origin + v_forward * 100 + '0 0 64'; + spot = vehicles_findgoodexit(spot); + setorigin(self.owner , spot); self.owner.velocity = (v_up + v_forward * 0.25) * 750; + self.owner.oldvelocity = self.owner.velocity; } else { - self.owner.velocity = (v_forward) * -150; - setorigin(self.owner,self.origin - v_forward * 128); + self.owner.velocity = normalize(self.velocity) * autocvar_sv_maxairspeed; + self.owner.oldvelocity = self.owner.velocity; + spot = self.origin - v_forward * 200 + '0 0 64'; + spot = vehicles_findgoodexit(spot); + setorigin(self.owner , spot); } - + antilag_clear(self.owner); self.owner = world; - - if (self.deadflag != DEAD_NO) - { - entity ret; - ret = spawn(); - ret.enemy = self; - ret.think = raptor_return; - ret.nextthink = time + autocvar_g_vehicle_racer_respawntime; - } } - -float raptor_pplug() +float raptor_takeoff() { - entity player, vhic; - float ftmp, ftmp2, energy_used; - vector df; - - - if(autocvar_g_vehicle_raptor_reload) - { - raptor_loadsettings(); - cvar_set("g_vehicle_raptor_reload","0"); - } - + entity player, raptor; + player = self; - vhic = self.vehicle; - self = vhic; - - if(player.BUTTON_USE) + raptor = self.vehicle; + self = raptor; + if(self.sound_nexttime < time) + { + self.sound_nexttime = time + 7.955812; //soundlength("vehicles/raptor_fly.wav"); + sound (self, CH_TRIGGER_SINGLE, "vehicles/raptor_speed.wav", VOL_VEHICLEENGINE, ATTN_NORM); + } + + // Takeoff sequense + if(raptor.frame < 25) { - self = vhic; - raptor_exit(0); - self = player; - return 0; - } + raptor.frame += 0.25; + raptor.velocity_z = min(raptor.velocity_z * 1.5, 256); + self.bomb1.gun1.avelocity_y = 90 + ((raptor.frame / 25) * 25000); + self.bomb1.gun2.avelocity_y = -self.bomb1.gun1.avelocity_y; + player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0; - if(vhic.deadflag != DEAD_NO) - { - self = player; - player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0; - return 1; + setorigin(player, raptor.origin + '0 0 32'); } + else + player.PlayerPhysplug = raptor_frame; + + if(self.vehicle_flags & VHF_SHIELDREGEN) + vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_raptor_shield, autocvar_g_vehicle_raptor_shield_regen_pause, autocvar_g_vehicle_raptor_shield_regen, frametime); - vhic.angles_x *= -1; - // Rotate Body - ftmp = raptor_turnspeed * sys_frametime; + if(self.vehicle_flags & VHF_HEALTHREGEN) + vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_raptor_health, autocvar_g_vehicle_raptor_health_regen_pause, autocvar_g_vehicle_raptor_health_regen, frametime); - ftmp = bound(-ftmp, shortangle_f(player.v_angle_y - vhic.angles_y, vhic.angles_y), ftmp); + if(self.vehicle_flags & VHF_ENERGYREGEN) + vehicles_regen(cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, frametime); - // Roll - //ftmp = bound(-90,shortangle_f(player.v_angle_z + ((vhic.angles_y - ftmp2) * raptor_turnroll), vhic.angles_z),90); - //ftmp = safeangle(vhic.angles_z + ftmp); - //vhic.angles_z = ftmp; - // Turn - vhic.angles_y = anglemods(vhic.angles_y + ftmp); + raptor.bomb1.alpha = raptor.bomb2.alpha = (time - raptor.lip) / (raptor.delay - raptor.lip); + player.vehicle_reload2 = bound(0, raptor.bomb1.alpha * 100, 100); - // Pitch Body - ftmp = raptor_pitchspeed * sys_frametime; + VEHICLE_UPDATE_PLAYER(health, raptor); + VEHICLE_UPDATE_PLAYER(energy, raptor); + if(self.vehicle_flags & VHF_HASSHIELD) + VEHICLE_UPDATE_PLAYER(shield, raptor); - ftmp = bound(-ftmp, shortangle_f(player.v_angle_x - vhic.angles_x,vhic.angles_x), ftmp); + player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0; + self = player; + return 1; +} - vhic.angles_x = bound(-60,anglemods(vhic.angles_x + ftmp),60); - vhic.angles_x *= -1; +float raptor_frame() +{ + entity player, raptor; + float ftmp, ftmp2; + vector df; + + if(intermission_running) + return 1; - if(raptor_movestyle == 1) + player = self; + raptor = self.vehicle; + self = raptor; + vehicles_painframe(); + /* + ftmp = vlen(self.velocity); + if(ftmp > autocvar_g_vehicle_raptor_speed_forward) + ftmp = 1; + else + ftmp = ftmp / autocvar_g_vehicle_raptor_speed_forward; + */ + + if(self.sound_nexttime < time) + { + self.sound_nexttime = time + 7.955812; + //sound (self.tur_head, CH_TRIGGER_SINGLE, "vehicles/raptor_fly.wav", 1 - ftmp, ATTN_NORM ); + sound (self, CH_TRIGGER_SINGLE, "vehicles/raptor_speed.wav", 1, ATTN_NORM); + self.wait = ftmp; + } + /* + else if(fabs(ftmp - self.wait) > 0.2) { - ftmp = vhic.angles_z; - vhic.angles_z = 0; - ftmp2 = vhic.angles_x; - vhic.angles_x = 0; - fixedmakevectors(vhic.angles); - vhic.angles_z = ftmp; - vhic.angles_x = ftmp2; + sound (self.tur_head, CH_TRIGGER_SINGLE, "", 1 - ftmp, ATTN_NORM ); + sound (self, CH_TRIGGER_SINGLE, "", ftmp, ATTN_NORM); + self.wait = ftmp; + } + */ + + if(raptor.deadflag != DEAD_NO) + { + self = player; + player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0; + return 1; } + crosshair_trace(player); + + vector vang; + vang = raptor.angles; + df = vectoangles(normalize(trace_endpos - self.origin + '0 0 32')); + vang_x *= -1; + df_x *= -1; + if(df_x > 180) df_x -= 360; + if(df_x < -180) df_x += 360; + if(df_y > 180) df_y -= 360; + if(df_y < -180) df_y += 360; + + ftmp = shortangle_f(player.v_angle_y - vang_y, vang_y); + if(ftmp > 180) ftmp -= 360; if(ftmp < -180) ftmp += 360; + raptor.avelocity_y = bound(-autocvar_g_vehicle_raptor_turnspeed, ftmp + raptor.avelocity_y * 0.9, autocvar_g_vehicle_raptor_turnspeed); + + // Pitch + ftmp = 0; + if(player.movement_x > 0 && vang_x < autocvar_g_vehicle_raptor_pitchlimit) ftmp = 5; + else if(player.movement_x < 0 && vang_x > -autocvar_g_vehicle_raptor_pitchlimit) ftmp = -20; + + df_x = bound(-autocvar_g_vehicle_raptor_pitchlimit, df_x , autocvar_g_vehicle_raptor_pitchlimit); + ftmp = vang_x - bound(-autocvar_g_vehicle_raptor_pitchlimit, df_x + ftmp, autocvar_g_vehicle_raptor_pitchlimit); + raptor.avelocity_x = bound(-autocvar_g_vehicle_raptor_pitchspeed, ftmp + raptor.avelocity_x * 0.9, autocvar_g_vehicle_raptor_pitchspeed); + + raptor.angles_x = anglemods(raptor.angles_x); + raptor.angles_y = anglemods(raptor.angles_y); + raptor.angles_z = anglemods(raptor.angles_z); + + if(autocvar_g_vehicle_raptor_movestyle == 1) + makevectors('0 1 0' * raptor.angles_y); else - fixedmakevectors(vhic.angles); + makevectors(player.v_angle); - df = vhic.velocity * -1; + df = raptor.velocity * -autocvar_g_vehicle_raptor_friction; if(player.movement_x != 0) { if(player.movement_x > 0) - df += v_forward * raptor_speed_forward; + df += v_forward * autocvar_g_vehicle_raptor_speed_forward; else if(player.movement_x < 0) - df -= v_forward * raptor_speed_forward; + df -= v_forward * autocvar_g_vehicle_raptor_speed_forward; } if(player.movement_y != 0) { if(player.movement_y < 0) - df -= v_right * raptor_speed_strafe; + df -= v_right * autocvar_g_vehicle_raptor_speed_strafe; else if(player.movement_y > 0) - df += v_right * raptor_speed_strafe; + df += v_right * autocvar_g_vehicle_raptor_speed_strafe; - vhic.angles_z = bound(-30,vhic.angles_z + (player.movement_y / raptor_speed_strafe),30); + raptor.angles_z = bound(-30,raptor.angles_z + (player.movement_y / autocvar_g_vehicle_raptor_speed_strafe),30); } else { - vhic.angles_z *= 0.95; - if(vhic.angles_z >= -1 && vhic.angles_z <= -1) - vhic.angles_z = 0; + raptor.angles_z *= 0.95; + if(raptor.angles_z >= -1 && raptor.angles_z <= -1) + raptor.angles_z = 0; } if(player.BUTTON_CROUCH) - df -= v_up * raptor_speed_down; + df -= v_up * autocvar_g_vehicle_raptor_speed_down; else if (player.BUTTON_JUMP) - df += v_up * raptor_speed_up; - //else - //df_z = vhic.velocity_z * -1; - - vhic.velocity += df * frametime; - player.velocity = player.movement = vhic.velocity; - setorigin(player,vhic.origin + '0 0 32'); + df += v_up * autocvar_g_vehicle_raptor_speed_up; - // Aim the gunz - /* - vector target_angle, move_angle, org1, org2, targ; + raptor.velocity += df * frametime; + player.velocity = player.movement = raptor.velocity; + setorigin(player, raptor.origin + '0 0 32'); - makevectors(player.v_angle); - - //targ = (vhic.origin + player.view_ofs) + v_forward * MAX_SHOT_DISTANCE; - targ = player.cursor_trace_endpos; - - org1 = gettaginfo(vhic.gun1,gettagindex(vhic.gun1, "fire1")); - org2 = gettaginfo(vhic.gun2,gettagindex(vhic.gun2, "fire1")); + vector vf, ad; + // Target lock & predict + if(autocvar_g_vehicle_raptor_cannon_locktarget) + { - traceline(vhic.origin + player.view_ofs, targ, FALSE, vhic); - targ = trace_endpos; + vehicles_locktarget((1 / autocvar_g_vehicle_raptor_cannon_locking_time) * frametime, + (1 / autocvar_g_vehicle_raptor_cannon_locking_releasetime) * frametime, + autocvar_g_vehicle_raptor_cannon_locked_time); - // Find the direction - target_angle = vectoangles(normalize(targ - org1)); // And make a angle + if(self.lock_target != world) + if(autocvar_g_vehicle_raptor_cannon_predicttarget) + if(self.lock_strength == 1) + { + float i, distance, impact_time; + + vf = real_origin(raptor.lock_target); + ad = vf; + for(i = 0; i < 4; ++i) + { + distance = vlen(ad - raptor.origin); + impact_time = distance / autocvar_g_vehicle_raptor_cannon_speed; + ad = vf + raptor.lock_target.velocity * impact_time; + } + trace_endpos = ad; + } - // Find the diffrence between where we currently aim and where we want to aim - move_angle = target_angle - (vhic.angles + vhic.gun1.angles); - move_angle = shortangle_vxy(move_angle,(vhic.angles + vhic.gun1.angles)); - vhic.gun1.angles_x = bound(-10, move_angle_x + vhic.gun1.angles_x, 10); - vhic.gun1.angles_y = bound(-15, move_angle_y + vhic.gun1.angles_y, 15); + if(self.lock_target) + { + if(raptor.lock_strength == 1) + UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '1 0 0', 1); + else if(self.lock_strength > 0.5) + UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '0 1 0', 1); + else if(self.lock_strength < 0.5) + UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '0 0 1', 1); + } + } - // Find the direction - target_angle = vectoangles(normalize(targ - org2)); // And make a angle + // Aim the gunz + ftmp2 = autocvar_g_vehicle_raptor_cannon_turnspeed * frametime; + ftmp = -ftmp2; + + // Gun1 + df = gettaginfo(raptor.gun1, gettagindex(raptor.gun1, "fire1")); + //ad = df; + //vf = v_forward; + df = vectoangles(normalize(trace_endpos - df)); // Find the direction & angle + df = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(raptor.angles), AnglesTransform_FromAngles(df))) - raptor.gun1.angles; + df = shortangle_vxy(df, raptor.gun1.angles); + + // Bind to aimspeed + df_x = bound(ftmp, df_x, ftmp2); + df_y = bound(ftmp, df_y, ftmp2); + // Bind to limts + raptor.gun1.angles_x = bound(-autocvar_g_vehicle_raptor_cannon_pitchlimit_down, df_x + raptor.gun1.angles_x, autocvar_g_vehicle_raptor_cannon_pitchlimit_up); + raptor.gun1.angles_y = bound(-autocvar_g_vehicle_raptor_cannon_turnlimit, df_y + raptor.gun1.angles_y, autocvar_g_vehicle_raptor_cannon_turnlimit); + + // Gun2 + df = gettaginfo(raptor.gun2, gettagindex(raptor.gun2, "fire1")); + //ad += df; + //vf += v_forward; + df = vectoangles(normalize(trace_endpos - df)); // Find the direction & angle + df = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(raptor.angles), AnglesTransform_FromAngles(df))) - raptor.gun2.angles; + df = shortangle_vxy(df, raptor.gun2.angles); + + // Bind to aimspeed + df_x = bound(ftmp, df_x, ftmp2); + df_y = bound(ftmp, df_y, ftmp2); + // Bind to limts + raptor.gun2.angles_x = bound(-autocvar_g_vehicle_raptor_cannon_pitchlimit_down, df_x + raptor.gun2.angles_x, autocvar_g_vehicle_raptor_cannon_pitchlimit_up); + raptor.gun2.angles_y = bound(-autocvar_g_vehicle_raptor_cannon_turnlimit, df_y + raptor.gun2.angles_y, autocvar_g_vehicle_raptor_cannon_turnlimit); - move_angle = target_angle - (vhic.angles + vhic.gun2.angles); - move_angle = shortangle_vxy(move_angle,(vhic.angles + vhic.gun2.angles)); - vhic.gun2.angles_x = bound(-15,move_angle_x + vhic.gun2.angles_x,15); - vhic.gun2.angles_y = bound(-20,move_angle_y + vhic.gun2.angles_y,20); - */ + /* + ad = ad * 0.5; + v_forward = vf * 0.5; + traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, raptor); + UpdateAuxiliaryXhair(player, trace_endpos, '0 1 0', 0); + */ + if(player.BUTTON_ATCK) - if(vhic.vehicle_energy > (raptor_beam_aps * sys_frametime)) + if(raptor.attack_finished_single <= time) + if(raptor.vehicle_energy > autocvar_g_vehicle_raptor_cannon_cost) { - vector start; - self = player; - - start = gettaginfo(vhic.gun1, gettagindex(vhic.gun1, "fire1")); - traceline(start, start + v_forward * MAX_SHOT_DISTANCE, TRUE, player); - te_lightning1(vhic.gun1, start, trace_endpos); - raptor_beam(start, trace_endpos, '-1 -1 -1' * raptor_beam_size, '1 1 1' * raptor_beam_size, raptor_beam_fops * sys_frametime, raptor_beam_dps * sys_frametime, DEATH_SBROCKET); - - - start = gettaginfo(vhic.gun2, gettagindex(vhic.gun2, "fire1")); - traceline(start, start + v_forward * MAX_SHOT_DISTANCE, TRUE, player); - te_lightning1(vhic.gun2, start, trace_endpos); - raptor_beam(start, trace_endpos, '-1 -1 -1' * raptor_beam_size, '1 1 1' * raptor_beam_size, raptor_beam_fops * sys_frametime, raptor_beam_dps * sys_frametime, DEATH_SBROCKET); - - self = vhic; - - vhic.vehicle_energy -= raptor_beam_aps * sys_frametime; - vhic.cnt = time + 1; + raptor.misc_bulletcounter += 1; + raptor.attack_finished_single = time + autocvar_g_vehicle_raptor_cannon_refire; + if(raptor.misc_bulletcounter <= 2) + raptor_fire_cannon(self.gun1, "fire1"); + else if(raptor.misc_bulletcounter == 3) + raptor_fire_cannon(self.gun2, "fire1"); + else + { + raptor.attack_finished_single = time + autocvar_g_vehicle_raptor_cannon_refire * 2; + raptor_fire_cannon(self.gun2, "fire1"); + raptor.misc_bulletcounter = 0; + } + raptor.vehicle_energy -= autocvar_g_vehicle_raptor_cannon_cost; + self.cnt = time; } - if(vhic.cnt < time) - vhic.vehicle_energy = min(vhic.vehicle_energy += raptor_energy_regen * frametime, raptor_energy_max); + if(self.vehicle_flags & VHF_SHIELDREGEN) + vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_raptor_shield, autocvar_g_vehicle_raptor_shield_regen_pause, autocvar_g_vehicle_raptor_shield_regen, frametime); + + if(self.vehicle_flags & VHF_HEALTHREGEN) + vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_raptor_health, autocvar_g_vehicle_raptor_health_regen_pause, autocvar_g_vehicle_raptor_health_regen, frametime); - player.vehicle_energy = vhic.vehicle_energy / raptor_energy_max; + if(self.vehicle_flags & VHF_ENERGYREGEN) + vehicles_regen(cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, frametime); + if(time > raptor.delay) if(player.BUTTON_ATCK2) - if(time > vhic.delay) { raptor_bombdrop(); - vhic.delay = time + raptor_bombs_refire; + raptor.delay = time + autocvar_g_vehicle_raptor_bombs_refire; + raptor.lip = time; } - player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0; - vehicle_stdproc_shiledregen(raptor_shield_max, frametime); - vehicle_stdproc_healthregen(raptor_health_max, frametime); - - self = player; - - return 1; -} - -float raptor_takeoff() -{ - entity player, vhic; + raptor.bomb1.alpha = raptor.bomb2.alpha = (time - raptor.lip) / (raptor.delay - raptor.lip); + player.vehicle_reload2 = bound(0, raptor.bomb1.alpha * 100, 100); - if(self.vehicle.frame < 25) - return 1; - - player = self; - vhic = self.vehicle; - self = vhic; + VEHICLE_UPDATE_PLAYER(health, raptor); + VEHICLE_UPDATE_PLAYER(energy, raptor); + if(self.vehicle_flags & VHF_HASSHIELD) + VEHICLE_UPDATE_PLAYER(shield, raptor); - if(raptor_altitude(512) <= 256) - { - vhic.velocity_z = min(vhic.velocity_z * 1.5, 256); - } - else - { - player.PlayerPhysplug = raptor_pplug; - } - - player.BUTTON_CROUCH = player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0; + player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0; + self = player; - return 1; } -float raptor_land() +void raptor_blowup() { - return 0; -} + self.deadflag = DEAD_DEAD; + self.vehicle_exit(VHEF_NORMAL); + RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_WAKIBLOWUP, world); -void raptor_return() -{ - pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1); - self.enemy.think = raptor_spawn; - self.enemy.nextthink = time; - remove(self); -} + self.alpha = -1; + self.movetype = MOVETYPE_NONE; + self.effects = EF_NODRAW; + self.colormod = '0 0 0'; + self.avelocity = '0 0 0'; + self.velocity = '0 0 0'; -void raptor_think() -{ + setorigin(self, self.pos1); + self.touch = SUB_Null; + self.nextthink = 0; } -void raptor_touch() +void raptor_diethink() { - if(self.owner) + if(random() < 0.1) { - if(vlen(self.velocity) == 0) - return; - - if(other.classname != "player") - return; - - return; + sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM); + pointparticles(particleeffectnum("explosion_small"), randomvec() * 80 + (self.origin + '0 0 100'), '0 0 0', 1); } - - if(other.classname != "player") - return; - - if(other.deadflag != DEAD_NO) - return; - - if(other.vehicle != world) - return; - - raptor_enter(); + self.nextthink = time + 0.1; } void raptor_die() { self.health = 0; self.event_damage = SUB_Null; - self.iscreature = FALSE; - self.solid = SOLID_NOT; + self.solid = SOLID_CORPSE; self.takedamage = DAMAGE_NO; - //self.touch = racer_dietouch; self.deadflag = DEAD_DYING; self.movetype = MOVETYPE_BOUNCE; - self.wait = time; - - pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1); + self.think = raptor_diethink; + self.nextthink = time; + + pointparticles(particleeffectnum("explosion_medium"), findbetterlocation (self.origin, 16), '0 0 0', 1); - self.velocity += '0 0 128'; + self.velocity_z += 600; - if(random() < 0.5) - self.avelocity_z = 45; - else - self.avelocity_z = -45; + self.avelocity = '0 0.5 1' * (random() * 400); + self.avelocity -= '0 0.5 1' * (random() * 400); self.colormod = '-0.5 -0.5 -0.5'; + self.touch = raptor_blowup; +} - self.think = raptor_spawn; - self.nextthink = time + 5; +void raptor_impact() +{ + if(autocvar_g_vehicle_raptor_bouncepain_x) + vehilces_impact(autocvar_g_vehicle_raptor_bouncepain_x, autocvar_g_vehicle_raptor_bouncepain_y, autocvar_g_vehicle_raptor_bouncepain_z); } void raptor_spawn() { - self.flags = FL_NOTARGET; - self.effects = 0; - - self.vehicle_health = raptor_health_max; - self.vehicle_shield = raptor_shield_max; - - self.event_damage = vehicle_stdproc_damage; - self.touch = raptor_touch; - - self.iscreature = TRUE; - self.movetype = MOVETYPE_FLY; - self.solid = SOLID_SLIDEBOX; - self.takedamage = DAMAGE_AIM; - - self.alpha = 1; - self.colormap = 1024; - self.deadflag = DEAD_NO; - self.bot_attack = TRUE; - - self.colormod = '1 1 1'; - self.avelocity = '0 0 0'; - self.velocity = '0 0 0'; - + self.frame = 0; + self.vehicle_health = autocvar_g_vehicle_raptor_health; + self.vehicle_shield = autocvar_g_vehicle_raptor_shield; + self.movetype = MOVETYPE_TOSS; + self.solid = SOLID_SLIDEBOX; self.vehicle_energy = 1; - self.vehicle_hudmodel.viewmodelforclient = self; - setorigin(self, self.pos1); - self.angles = self.pos2; + self.bomb1.gun1.avelocity_y = 90; + self.bomb1.gun2.avelocity_y = -90; - setsize(self,RAPTOR_MIN ,RAPTOR_MAX ); - pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1); + setsize(self, RAPTOR_MIN, RAPTOR_MAX ); self.delay = time; + + self.bouncefactor = autocvar_g_vehicle_raptor_bouncefactor; + self.bouncestop = autocvar_g_vehicle_raptor_bouncestop; + self.vehicle_impact = raptor_impact; } -float raptor_customizeentityforclient() +// If we dont do this ever now and then, the raptors rotors +// stop working, presumably due to angle overflow. cute. +void raptor_rotor_anglefix() { - if(self.deadflag == DEAD_DEAD) - return FALSE; - - /* - if(other == self.owner) - self.alpha = -1; - else - self.alpha = 1; - */ - - return TRUE; + self.gun1.angles_y = anglemods(self.gun1.angles_y); + self.gun2.angles_y = anglemods(self.gun2.angles_y); + self.nextthink = time + 15; } void raptor_dinit() { + entity spinner; + vector ofs; + + if not (vehicle_initialize( + "Raptor", + "models/vehicles/raptor.dpm", + "", + "models/vehicles/raptor_cockpit.dpm", + "", "tag_hud", "tag_camera", + HUD_RAPTOR, + RAPTOR_MIN, RAPTOR_MAX, + FALSE, + raptor_spawn, autocvar_g_vehicle_raptor_respawntime, + raptor_frame, + raptor_enter, raptor_exit, + raptor_die, raptor_think, + FALSE)) + { + remove(self); + return; + } - if (self.netname == "") - self.netname = "Raptor"; - - setorigin(self, self.origin); + //FIXME: Camera is in a bad place in HUD model. + //setorigin(self.vehicle_viewport, '25 0 5'); self.frame = 0; - setmodel(self,"models/vehicles/raptor.dpm"); - self.bomb1 = spawn(); self.bomb2 = spawn(); + self.gun1 = spawn(); + self.gun2 = spawn(); - setmodel(self.bomb1,"models/vehicles/raptor_bomb.dpm"); - setmodel(self.bomb2,"models/vehicles/raptor_bomb.dpm"); + setmodel(self.bomb1,"models/vehicles/clusterbomb_folded.md3"); + setmodel(self.bomb2,"models/vehicles/clusterbomb_folded.md3"); + setmodel(self.gun1, "models/vehicles/raptor_gun.dpm"); + setmodel(self.gun2, "models/vehicles/raptor_gun.dpm"); + setmodel(self.tur_head, "models/vehicles/raptor_body.dpm"); setattachment(self.bomb1, self,"bombmount_left"); setattachment(self.bomb2, self,"bombmount_right"); + setattachment(self.tur_head, self,"root"); - if not (self.vehicle_hudmodel) - { - self.vehicle_hudmodel = spawn(); - setmodel(self.vehicle_hudmodel, "models/vehicles/raptor_cockpit.dpm"); - //setattachment(self.vehicle_hudmodel, self, "tag_viewport"); - setattachment(self.vehicle_hudmodel, self, "tag_hud"); - } + // FIXME Guns mounts to angled bones + self.bomb1.angles = self.angles; + self.angles = '0 0 0'; + // This messes up gun-aim, so work arround it. + //setattachment(self.gun1, self, "gunmount_left"); + ofs = gettaginfo(self, gettagindex(self, "gunmount_left")); + ofs -= self.origin; + setattachment(self.gun1, self, ""); + setorigin(self.gun1, ofs); - if not (self.vehicle_viewport) - { - self.vehicle_viewport = spawn(); - setmodel (self.vehicle_viewport, "null"); - setattachment(self.vehicle_viewport, self.vehicle_hudmodel, "tag_camera"); - } + //setattachment(self.gun2, self, "gunmount_right"); + ofs = gettaginfo(self, gettagindex(self, "gunmount_right")); + ofs -= self.origin; + setattachment(self.gun2, self, ""); + setorigin(self.gun2, ofs); - if not (self.gun1) - { - self.gun1 = spawn(); - setmodel(self.gun1, "models/vehicles/raptor_gun.dpm"); - setattachment(self.gun1, self, "gunmount_left"); - } + self.angles = self.bomb1.angles; + self.bomb1.angles = '0 0 0'; - if not (self.gun2) - { - self.gun2 = spawn(); - setmodel(self.gun2, "models/vehicles/raptor_gun.dpm"); - setattachment(self.gun2, self, "gunmount_right"); - } - - self.tur_head = spawn(); - self.pos1 = self.origin; - self.pos2 = self.angles; - - self.vehicle_hudmodel.viewmodelforclient = self; - self.customizeentityforclient = raptor_customizeentityforclient; - - self.vehicle_die = raptor_die; - self.vehicle_exit = raptor_exit; - - - entity spinner; spinner = spawn(); spinner.owner = self; setmodel(spinner,"models/vehicles/spinner.dpm"); setattachment(spinner, self, "engine_left"); spinner.movetype = MOVETYPE_NOCLIP; spinner.avelocity = '0 90 0'; + self.bomb1.gun1 = spinner; spinner = spawn(); spinner.owner = self; @@ -817,76 +713,50 @@ void raptor_dinit() setattachment(spinner, self, "engine_right"); spinner.movetype = MOVETYPE_NOCLIP; spinner.avelocity = '0 -90 0'; + self.bomb1.gun2 = spinner; - addstat(STAT_HUD, AS_INT, hud); - addstat(STAT_VEHICLESTAT_HEALTH, AS_FLOAT, vehicle_health); - addstat(STAT_VEHICLESTAT_SHIELD, AS_FLOAT, vehicle_shield); - addstat(STAT_VEHICLESTAT_ENERGY, AS_FLOAT, vehicle_energy); - - addstat(STAT_VEHICLESTAT_AMMO1, AS_INT, vehicle_ammo1); - addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1); + // Sigh. + self.bomb1.think = raptor_rotor_anglefix; + self.bomb1.nextthink = time; - addstat(STAT_VEHICLESTAT_AMMO2, AS_INT, vehicle_ammo2); - addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2); - - raptor_spawn(); + self.mass = 1 ; } void spawnfunc_vehicle_raptor() { - self.cvar_basename = "g_vehicle_raptor"; - raptor_loadsettings(); + vehicles_configcheck("vehicle_raptor.cfg", autocvar_g_vehicle_raptor_health); - self.vehicle_flags = VHF_HASSHIELD | VHF_SHIELDREGEN; + self.vehicle_flags |= VHF_DMGSHAKE; + self.vehicle_flags |= VHF_DMGROLL; + + if(autocvar_g_vehicle_raptor_shield) + self.vehicle_flags |= VHF_HASSHIELD; - traceline(self.origin, self.origin - '0 0 2048', MOVE_WORLDONLY, self); - if(trace_startsolid) - { - dprint("WARNING: vehicle_raptor placed in solid\n"); - traceline(self.origin + '0 0 512' ,self.origin - '0 0 2048',MOVE_WORLDONLY,self); - if(trace_startsolid || trace_fraction == 1.0) - { - dprint("ERROR: vehicle_raptor placed in more then 512 units into solid\n"); - remove(self); - return; - } - } + if(autocvar_g_vehicle_raptor_shield_regen) + self.vehicle_flags |= VHF_SHIELDREGEN; - if(trace_fraction != 1.0) - setorigin(self,trace_endpos + '0 0 8'); - else - dprint("WARNING: vehicle_racer placed more then 2048 units above ground.\n"); + if(autocvar_g_vehicle_raptor_health_regen) + self.vehicle_flags |= VHF_HEALTHREGEN; + + if(autocvar_g_vehicle_raptor_energy_regen) + self.vehicle_flags |= VHF_ENERGYREGEN; precache_model ("models/vehicles/raptor.dpm"); precache_model ("models/vehicles/raptor_gun.dpm"); precache_model ("models/vehicles/spinner.dpm"); precache_model ("models/vehicles/raptor_cockpit.dpm"); - precache_model ("models/vehicles/raptor_bomb.dpm"); - - + //precache_model ("models/vehicles/clusterbomb.md3"); + precache_model ("models/vehicles/clusterbomb_folded.md3"); + precache_model ("models/vehicles/raptor_body.dpm"); + + precache_sound ("vehicles/raptor_fly.wav"); + precache_sound ("vehicles/raptor_speed.wav"); + self.think = raptor_dinit; - self.nextthink = time + 1; -} - - -void spawnfunc_vehicle_raptor2() -{ - entity iqm,dpm,md3; - - precache_model ("models/vehicles/test.iqm"); - precache_model ("models/vehicles/test.dpm"); - precache_model ("models/vehicles/test.md3"); - - iqm = spawn(); - dpm = spawn(); - md3 = spawn(); - iqm.scale = md3.scale = dpm.scale = 10; - - //setmodel(iqm,"models/vehicles/test.iqm"); - //setmodel(dpm,"models/vehicles/test.dpm"); - setmodel(md3,"models/vehicles/test.md3"); - - setorigin(iqm, self.origin + '0 0 16'); - setorigin(dpm, self.origin + '0 20 32'); - setorigin(iqm, self.origin + '0 40 48'); + + if(g_assault) + self.nextthink = time + 0.5; + else + self.nextthink = time + (autocvar_g_vehicles_delayspawn ? autocvar_g_vehicle_raptor_respawntime + (random() * autocvar_g_vehicles_delayspawn_jitter) : 0.5); } +#endif // SVQC