From: Jakob MG Date: Sat, 23 Jun 2012 16:19:26 +0000 (+0200) Subject: Vehicle impulse system. Spiderbot now have 3 diffrent diffrent firemodes for ist... X-Git-Tag: xonotic-v0.7.0~312^2~19 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=b6808551dedc2d64ebba62a9f4cde8c4ee97e4e8;p=xonotic%2Fxonotic-data.pk3dir.git Vehicle impulse system. Spiderbot now have 3 diffrent diffrent firemodes for ist MLRS --- diff --git a/qcsrc/client/vehicles/vehicles.qc b/qcsrc/client/vehicles/vehicles.qc index b7eabced2..339de73fa 100644 --- a/qcsrc/client/vehicles/vehicles.qc +++ b/qcsrc/client/vehicles/vehicles.qc @@ -11,6 +11,12 @@ #define hud_ammo2_bar "gfx/vehicles/bar_dwn_right.tga" #define hud_ammo2_ico "gfx/vehicles/rocket.tga" +#define SBRM_FIRST 1 +#define SBRM_VOLLY 1 +#define SBRM_GUIDE 2 +#define SBRM_ARTILLERY 3 +#define SBRM_LAST 3 + entity dropmark; float autocvar_cl_vehicles_hudscale; float autocvar_cl_vehicles_hudalpha; @@ -33,7 +39,7 @@ const var void Draw_Not(); #define spider_ico "gfx/vehicles/sbot.tga" #define spider_rkt "gfx/vehicles/sbot_rpods.tga" #define spider_mgun "gfx/vehicles/sbot_mguns.tga" -#define spider_xhair "gfx/vehicles/axh-special1.tga" +string spider_xhair; // = "gfx/vehicles/axh-special1.tga"; #define waki_ico "gfx/vehicles/waki.tga" #define waki_eng "gfx/vehicles/waki_e.tga" @@ -94,6 +100,7 @@ void Net_AuXair2(float bIsNew) axh.cnt = time; } +float weapon2mode; void Net_VehicleSetup() { @@ -101,6 +108,13 @@ void Net_VehicleSetup() hud_id = ReadByte(); + // Weapon update? + if(hud_id > HUD_VEHICLE_LAST) + { + weapon2mode = hud_id - HUD_VEHICLE_LAST; + return; + } + // hud_id == 0 means we exited a vehicle, so stop alarm sound/s if(hud_id == 0) { @@ -406,7 +420,6 @@ void CSQC_SPIDER_HUD() alarm2time = 0; } } - // Minigun bar picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale; @@ -461,6 +474,21 @@ void CSQC_SPIDER_HUD() HUD_DrawScoreboard(); else { + switch(weapon2mode) + { + case SBRM_VOLLY: + spider_xhair = "gfx/vehicles/axh-bracket.tga"; + break; + case SBRM_GUIDE: + spider_xhair = "gfx/vehicles/axh-cross.tga"; + break; + case SBRM_ARTILLERY: + spider_xhair = "gfx/vehicles/axh-tag.tga"; + break; + default: + spider_xhair= "gfx/vehicles/axh-tag.tga"; + } + picsize = draw_getimagesize(spider_xhair); picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size; picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size; diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index 076de115e..062b87a22 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -46,6 +46,8 @@ const float TE_CSQC_NEX_SCOPE = 116; const float TE_CSQC_MINELAYER_MAXMINES = 117; const float TE_CSQC_HAGAR_MAXROCKETS = 118; const float TE_CSQC_VEHICLESETUP = 119; +const float VEHICLESETUP_ENTER = 0; +const float VEHICLESETUP_UPDATE = 1; const float TE_CSQC_SVNOTICE = 120; const float RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder diff --git a/qcsrc/server/cl_impulse.qc b/qcsrc/server/cl_impulse.qc index 524e796af..987e07c46 100644 --- a/qcsrc/server/cl_impulse.qc +++ b/qcsrc/server/cl_impulse.qc @@ -48,7 +48,13 @@ void ImpulseCommands (void) if (timeout_status == TIMEOUT_ACTIVE) //don't allow any impulses while the game is paused return; - + + if(self.vehicle) + if(self.vehicle.deadflag == DEAD_NO) + if(self.vehicle.vehicles_impusle) + if(self.vehicle.vehicles_impusle(imp)) + return; + if(CheatImpulse(imp)) { } diff --git a/qcsrc/server/vehicles/spiderbot.qc b/qcsrc/server/vehicles/spiderbot.qc index 0c4bd21f1..0c733beb8 100644 --- a/qcsrc/server/vehicles/spiderbot.qc +++ b/qcsrc/server/vehicles/spiderbot.qc @@ -48,7 +48,9 @@ float autocvar_g_vehicle_spiderbot_rocket_damage; float autocvar_g_vehicle_spiderbot_rocket_force; float autocvar_g_vehicle_spiderbot_rocket_radius; float autocvar_g_vehicle_spiderbot_rocket_speed; +float autocvar_g_vehicle_spiderbot_rocket_spread; float autocvar_g_vehicle_spiderbot_rocket_refire; +float autocvar_g_vehicle_spiderbot_rocket_refire2; float autocvar_g_vehicle_spiderbot_rocket_reload; float autocvar_g_vehicle_spiderbot_rocket_health; float autocvar_g_vehicle_spiderbot_rocket_noise; @@ -61,6 +63,17 @@ vector autocvar_g_vehicle_spiderbot_bouncepain; void spiderbot_exit(float eject); void spiderbot_enter(); void spiderbot_spawn(); +#define SBRM_FIRST 0 +#define SBRM_VOLLY 0 +#define SBRM_GUIDE 1 +#define SBRM_ARTILLERY 2 +#define SBRM_LAST 2 + +void spiderbot_rocket_artillery() +{ + self.nextthink = time; + UpdateCSQCProjectile(self); +} void spiderbot_rocket_unguided() { @@ -117,61 +130,178 @@ void spiderbot_guide_release() } } +float spiberbot_calcartillery_flighttime; +vector spiberbot_calcartillery(vector org, vector tgt, float ht) +{ + float grav, sdist, zdist, vs, vz, jumpheight; + vector sdir; + + grav = autocvar_sv_gravity; + zdist = tgt_z - org_z; + sdist = vlen(tgt - org - zdist * '0 0 1'); + sdir = normalize(tgt - org - zdist * '0 0 1'); + + // how high do we need to go? + jumpheight = fabs(ht); + if(zdist > 0) + jumpheight = jumpheight + zdist; + + // push so high... + vz = sqrt(2 * grav * jumpheight); // NOTE: sqrt(positive)! + + // we start with downwards velocity only if it's a downjump and the jump apex should be outside the jump! + if(ht < 0) + if(zdist < 0) + vz = -vz; + + vector solution; + solution = solve_quadratic(0.5 * grav, -vz, zdist); // equation "z(ti) = zdist" + // ALWAYS solvable because jumpheight >= zdist + if(!solution_z) + solution_y = solution_x; // just in case it is not solvable due to roundoff errors, assume two equal solutions at their center (this is mainly for the usual case with ht == 0) + if(zdist == 0) + solution_x = solution_y; // solution_x is 0 in this case, so don't use it, but rather use solution_y (which will be sqrt(0.5 * jumpheight / grav), actually) + + if(zdist < 0) + { + // down-jump + if(ht < 0) + { + // almost straight line type + // jump apex is before the jump + // we must take the larger one + spiberbot_calcartillery_flighttime = solution_y; + } + else + { + // regular jump + // jump apex is during the jump + // we must take the larger one too + spiberbot_calcartillery_flighttime = solution_y; + } + } + else + { + // up-jump + if(ht < 0) + { + // almost straight line type + // jump apex is after the jump + // we must take the smaller one + spiberbot_calcartillery_flighttime = solution_x; + } + else + { + // regular jump + // jump apex is during the jump + // we must take the larger one + spiberbot_calcartillery_flighttime = solution_y; + } + } + vs = sdist / spiberbot_calcartillery_flighttime; + + // finally calculate the velocity + return sdir * vs + '0 0 1' * vz; +} + void spiderbot_rocket_do() { vector v; entity rocket; - if (self.owner.BUTTON_ATCK2) - { - if (self.wait == 1) - if (self.tur_head.frame == 9 || self.tur_head.frame == 1) + if (self.wait != -10) + { + if (self.owner.BUTTON_ATCK2 && self.vehicle_weapon2mode == SBRM_GUIDE) { - if(self.gun2.cnt < time && self.tur_head.frame == 9) - self.tur_head.frame = 1; + if (self.wait == 1) + if (self.tur_head.frame == 9 || self.tur_head.frame == 1) + { + if(self.gun2.cnt < time && self.tur_head.frame == 9) + self.tur_head.frame = 1; - return; + return; + } + self.wait = 1; } - self.wait = 1; - } - else - { - if(self.wait) - spiderbot_guide_release(); + else + { + if(self.wait) + spiderbot_guide_release(); - self.wait = 0; + self.wait = 0; + } } - + if(self.gun2.cnt > time) return; if (self.tur_head.frame >= 9) + { self.tur_head.frame = 1; + self.wait = 0; + } + + if (self.wait != -10) + if not (self.owner.BUTTON_ATCK2) + return; - if not (self.owner.BUTTON_ATCK2) - return; - - crosshair_trace(self.owner); v = gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire")); - rocket = vehicles_projectile("spiderbot_rocket_launch", "weapons/rocket_fire.wav", - v, normalize(v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed, - autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1, - DEATH_SBROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, FALSE); + + switch(self.vehicle_weapon2mode) + { + case SBRM_VOLLY: + rocket = vehicles_projectile("spiderbot_rocket_launch", "weapons/rocket_fire.wav", + v, normalize(randomvec() * autocvar_g_vehicle_spiderbot_rocket_spread + v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed, + autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1, + DEATH_SBROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, TRUE); + crosshair_trace(self.owner); + float _dist = (random() * autocvar_g_vehicle_spiderbot_rocket_radius) + vlen(v - trace_endpos); + _dist -= (random() * autocvar_g_vehicle_spiderbot_rocket_radius) ; + rocket.nextthink = time + (_dist / autocvar_g_vehicle_spiderbot_rocket_speed); + rocket.think = vehicles_projectile_explode; + + if(self.owner.BUTTON_ATCK2 && self.tur_head.frame == 1) + self.wait = -10; + break; + case SBRM_GUIDE: + rocket = vehicles_projectile("spiderbot_rocket_launch", "weapons/rocket_fire.wav", + v, normalize(v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed, + autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1, + DEATH_SBROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, FALSE); + crosshair_trace(self.owner); + rocket.pos1 = trace_endpos; + rocket.nextthink = time; + rocket.think = spiderbot_rocket_guided; - rocket.cnt = time + 15; + + break; + case SBRM_ARTILLERY: + rocket = vehicles_projectile("spiderbot_rocket_launch", "weapons/rocket_fire.wav", + v, normalize(v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed, + autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1, + DEATH_SBROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, TRUE); + + crosshair_trace(self.owner); + rocket.pos1 = trace_endpos; + traceline(v, v + '0 0 1' * MAX_SHOT_DISTANCE, MOVE_WORLDONLY, self); + + rocket.velocity = spiberbot_calcartillery(v, rocket.pos1, (0.75 * vlen(v - trace_endpos))); + rocket.movetype = MOVETYPE_TOSS; + rocket.gravity = 1; + //rocket.think = spiderbot_rocket_artillery; + break; + } rocket.classname = "spiderbot_rocket"; - rocket.pos1 = trace_endpos; - rocket.think = spiderbot_rocket_guided; - rocket.nextthink = time; - rocket.cnt = time + autocvar_g_vehicle_spiderbot_rocket_lifetime; - + + rocket.cnt = time + autocvar_g_vehicle_spiderbot_rocket_lifetime; + self.tur_head.frame += 1; if (self.tur_head.frame == 9) self.attack_finished_single = autocvar_g_vehicle_spiderbot_rocket_reload; else - self.attack_finished_single = autocvar_g_vehicle_spiderbot_rocket_refire; + self.attack_finished_single = ((self.vehicle_weapon2mode == SBRM_VOLLY) ? autocvar_g_vehicle_spiderbot_rocket_refire2 : autocvar_g_vehicle_spiderbot_rocket_refire); self.gun2.cnt = time + self.attack_finished_single; } @@ -426,7 +556,7 @@ void spiderbot_think() void spiderbot_enter() { self.movetype = MOVETYPE_WALK; - + CSQCVehicleSetup(self.owner, 0); self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_spiderbot_health) * 100; self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_spiderbot_shield) * 100; @@ -612,6 +742,41 @@ void spiderbot_die() self.movetype = MOVETYPE_TOSS; } +float spiderbot_impulse(float _imp) +{ + switch(_imp) + { + case 10: + case 15: + case 18: + self.vehicle.vehicle_weapon2mode += 1; + if(self.vehicle.vehicle_weapon2mode > SBRM_LAST) + self.vehicle.vehicle_weapon2mode = SBRM_FIRST; + + //centerprint(self, strcat("Rocket mode is ", ftos(self.vehicle.vehicle_weapon2mode))); + CSQCVehicleSetup(self, 0); + return TRUE; + case 12: + case 16: + case 19: + self.vehicle.vehicle_weapon2mode -= 1; + if(self.vehicle.vehicle_weapon2mode < SBRM_FIRST) + self.vehicle.vehicle_weapon2mode = SBRM_LAST; + + //centerprint(self, strcat("Rocket mode is ", ftos(self.vehicle.vehicle_weapon2mode))); + CSQCVehicleSetup(self, 0); + return TRUE; + + /* + case 17: // toss gun, could be used to exit? + break; + case 20: // Manual minigun reload? + break; + */ + } + return FALSE; +} + void vewhicle_spiderbot_dinit() { if not (vehicle_initialize( @@ -636,7 +801,9 @@ void vewhicle_spiderbot_dinit() self.gun1 = spawn(); self.gun2 = spawn(); - + + self.vehicles_impusle = spiderbot_impulse; + setmodel(self.gun1, "models/vehicles/spiderbot_barrels.dpm"); setmodel(self.gun2, "models/vehicles/spiderbot_barrels.dpm"); diff --git a/qcsrc/server/vehicles/vehicles.qc b/qcsrc/server/vehicles/vehicles.qc index 675d1cf4a..ec860a0b6 100644 --- a/qcsrc/server/vehicles/vehicles.qc +++ b/qcsrc/server/vehicles/vehicles.qc @@ -101,7 +101,10 @@ void CSQCVehicleSetup(entity own, float vehicle_id) WriteByte(MSG_ONE, SVC_TEMPENTITY); WriteByte(MSG_ONE, TE_CSQC_VEHICLESETUP); - WriteByte(MSG_ONE, vehicle_id); + if(vehicle_id != 0) + WriteByte(MSG_ONE, vehicle_id); + else + WriteByte(MSG_ONE, 1 + own.vehicle.vehicle_weapon2mode + HUD_VEHICLE_LAST); } /** vehicles_locktarget @@ -1203,10 +1206,6 @@ void vehicle_aimturret(entity _vehic, vector _target, entity _turrret, string _t _turrret.angles_x = bound(_pichlimit_min, _turrret.angles_x + vtmp_x, _pichlimit_max); } -void vehicles_impusle(float _imp) -{ - -} void bugmenot() { diff --git a/qcsrc/server/vehicles/vehicles_def.qh b/qcsrc/server/vehicles/vehicles_def.qh index 0706a82fc..b9d9fb4a6 100644 --- a/qcsrc/server/vehicles/vehicles_def.qh +++ b/qcsrc/server/vehicles/vehicles_def.qh @@ -55,7 +55,9 @@ float SVC_UPDATEENTITY = 128; // Net.Protocol 0x80 var .void() vehicle_enter; /// Vehicles custom funciton to be executed when owner exit it var .void() vehicle_die; /// Vehicles custom function to be executed when vehile die var .void() vehicle_spawn; /// Vehicles custom fucntion to be efecuted when vehicle (re)spawns -void vehicles_impusle(float _imp); +const var .float(float _imp) vehicles_impusle_null; +var .float(float _imp) vehicles_impusle; +.float vehicle_weapon2mode = volly_counter; #ifdef VEHICLES_USE_ODE void(entity e, float physics_enabled) physics_enable = #540; // enable or disable physics on object diff --git a/vehicle_spiderbot.cfg b/vehicle_spiderbot.cfg index 01ce15f74..7cb8e4a0f 100644 --- a/vehicle_spiderbot.cfg +++ b/vehicle_spiderbot.cfg @@ -46,12 +46,14 @@ set g_vehicle_spiderbot_rocket_damage 70 set g_vehicle_spiderbot_rocket_edgedamage 25 set g_vehicle_spiderbot_rocket_force 150 set g_vehicle_spiderbot_rocket_radius 175 -set g_vehicle_spiderbot_rocket_reload 5 +set g_vehicle_spiderbot_rocket_reload 4 set g_vehicle_spiderbot_rocket_refire 0.1 -set g_vehicle_spiderbot_rocket_speed 2500 +set g_vehicle_spiderbot_rocket_refire2 0.025 // volly +set g_vehicle_spiderbot_rocket_speed 3500 set g_vehicle_spiderbot_rocket_turnrate 0.25 -set g_vehicle_spiderbot_rocket_noise 0.35 +set g_vehicle_spiderbot_rocket_noise 0.2 set g_vehicle_spiderbot_rocket_lifetime 20 +set g_vehicle_spiderbot_rocket_spread 0.05 set g_vehicle_spiderbot_crush_dmg 75 set g_vehicle_spiderbot_crush_force 50