From 985cbdd00506df68b175f0716c1ab4d590f50224 Mon Sep 17 00:00:00 2001 From: Jakob MG Date: Tue, 29 Mar 2011 22:18:53 +0200 Subject: [PATCH] Make things somewhat usable before venturing into ODE land --- qcsrc/server/vehicles/collision.qc | 80 ++++++++++++++++++++++++++++++ qcsrc/server/vehicles/racer.qc | 2 - qcsrc/server/vehicles/raptor.qc | 5 +- qcsrc/server/vehicles/vehicles.qc | 30 ++++++++--- qcsrc/server/vehicles/vehicles.qh | 1 + 5 files changed, 109 insertions(+), 9 deletions(-) create mode 100644 qcsrc/server/vehicles/collision.qc diff --git a/qcsrc/server/vehicles/collision.qc b/qcsrc/server/vehicles/collision.qc new file mode 100644 index 000000000..60597c017 --- /dev/null +++ b/qcsrc/server/vehicles/collision.qc @@ -0,0 +1,80 @@ +vector collision_force; +vector collision_angle; + +vector bb1[9]; +vector bb2[9]; + +float collision_run() +{ + vector vtmp, vmin, vmax, vrot, vforce; + float i, fvel, bcol; + + + // Extract the 8 bbox corners from mins/maxs for self + vmax = self.maxs; + vmin = self.mins; + bb1[0] = vmax; + vtmp = vmax; vtmp_x = vmin_x; bb1[1] = vtmp; + vtmp = vmax; vtmp_y = vmin_y; bb1[2] = vtmp; + vtmp = vmin; vtmp_z = vmax_z; bb1[3] = vtmp; + bb1[4] = vmin; + vtmp = vmin; vtmp_x = vmax_x; bb1[5] = vtmp; + vtmp = vmin; vtmp_y = vmax_y; bb1[6] = vtmp; + vtmp = vmax; vtmp_z = vmin_z; bb1[7] = vtmp; + + makevectors(self.angles + '-2 0 0' * self.angles_x); + bcol = FALSE; + // Pass1: Transform by rotation, ajust points by impact/s + for(i = 8; i >= 0; --i) + { + vtmp = bb1[i]; + vtmp = self.origin + vtmp_x * v_forward - vtmp_y * v_right + vtmp_z * v_up; + traceline(self.origin, vtmp, MOVE_WORLDONLY, self); + te_lightning1(world,self.origin,vtmp); + if(trace_fraction != 1.0) + { + //bb2[i] = trace_endpos; + vforce += (trace_endpos - vtmp); + bcol = TRUE; + } + else + bb2[i] = bb1[i]; + } + + if(bcol) + { + //self.angles += vectoangles(vrot) * frametime; + //self.angles -= (self.velocity - vectoangles(normalize(vforce))) * frametime; + + vtmp = self.origin + self.velocity * frametime; + vrot = self.origin + vforce * frametime; + //self.angles += vectoangles(normalize(vtmp - vrot)) * frametime; + self.velocity += vforce * frametime; + + } + + +// Extract the 8 bbox corners from mins/maxs for self +/* + bb1[0] = self.absmax; + vtmp = self.absmax; vtmp_x = self.absmin_x; bb1[1] = vtmp; + vtmp = self.absmax; vtmp_y = self.absmin_y; bb1[2] = vtmp; + vtmp = self.absmin; vtmp_z = self.absmax_z; bb1[3] = vtmp; + bb1[4] = self.absmin; + vtmp = self.absmin; vtmp_x = self.absmax_x; bb1[5] = vtmp; + vtmp = self.absmin; vtmp_y = self.absmax_y; bb1[6] = vtmp; + vtmp = self.absmax; vtmp_z = self.absmin_z; bb1[7] = vtmp; + + +// Extract the 8 bbox corners from mins/maxs for other + bb1[0] = other.absmax; + vtmp = other.absmax; vtmp_x = other.absmin_x; bb2[1] = vtmp; + vtmp = other.absmax; vtmp_y = other.absmin_y; bb2[2] = vtmp; + vtmp = other.absmin; vtmp_z = other.absmax_z; bb2[3] = vtmp; + bb2[4] = other.absmin; + vtmp = other.absmin; vtmp_x = other.absmax_x; bb2[5] = vtmp; + vtmp = other.absmin; vtmp_y = other.absmax_y; bb2[6] = vtmp; + vtmp = other.absmax; vtmp_z = other.absmin_z; bb2[7] = vtmp; +*/ +} + diff --git a/qcsrc/server/vehicles/racer.qc b/qcsrc/server/vehicles/racer.qc index 827485468..410490c09 100644 --- a/qcsrc/server/vehicles/racer.qc +++ b/qcsrc/server/vehicles/racer.qc @@ -561,8 +561,6 @@ void racer_touch() vehicles_touch(); if(self.owner) { - //self.velocity = 0.999 * self.velocity; - // TO-DO Impact reaction (crush players, damage self on high speed impact etc) return; } diff --git a/qcsrc/server/vehicles/raptor.qc b/qcsrc/server/vehicles/raptor.qc index 2a07c5505..9ea9bcf04 100644 --- a/qcsrc/server/vehicles/raptor.qc +++ b/qcsrc/server/vehicles/raptor.qc @@ -313,6 +313,9 @@ float raptor_frame() self = player; return 1; } + + //collision_run(); + crosshair_trace(player); #if VEHICLES_VIEWROTATE_CROSSHAIR @@ -633,7 +636,7 @@ void raptor_spawn() self.touch = raptor_touch; self.iscreature = TRUE; self.movetype = MOVETYPE_FLY; - self.solid = SOLID_SLIDEBOX; + self.solid = SOLID_BBOX; self.takedamage = DAMAGE_AIM; self.deadflag = DEAD_NO; self.bot_attack = TRUE; diff --git a/qcsrc/server/vehicles/vehicles.qc b/qcsrc/server/vehicles/vehicles.qc index 6caf7462e..1cd45691c 100644 --- a/qcsrc/server/vehicles/vehicles.qc +++ b/qcsrc/server/vehicles/vehicles.qc @@ -82,13 +82,28 @@ void CSQCVehicleSetup(entity own, float vehicle_id) .float lock_time; void vehicles_locktarget2(float incr, float decr, float _lock_time) { + if(self.lock_target && self.lock_target.deadflag != DEAD_NO) + self.lock_target = world; + + if(trace_ent != world) + { + if(teams_matter && trace_ent.team == self.team) + trace_ent = world; + + if(trace_ent.deadflag != DEAD_NO) + trace_ent = world; + + if not (trace_ent.vehicle_flags & VHF_ISVEHICLE || trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET) + trace_ent = world; + } + if(self.lock_time > time) return; - if not (trace_ent.vehicle_flags & VHF_ISVEHICLE || trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET) + /*if not (trace_ent.vehicle_flags & VHF_ISVEHICLE || trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET) self.lock_strength = min(self.lock_strength - decr, 1); else if(trace_ent.deadflag != DEAD_NO) - self.lock_strength = min(self.lock_strength - decr, 1); + self.lock_strength = min(self.lock_strength - decr, 1);*/ if(self.lock_target == world && trace_ent != world) self.lock_target = trace_ent; @@ -153,7 +168,7 @@ vector vehicles_force_fromtag_maglev(string tag_name, float spring_length, float return v_forward * force_fromtag_power; } - +void vehicles_enter(); void vehicles_touch() { // Vehicle currently @@ -168,7 +183,7 @@ void vehicles_touch() { if(other.vehicle_flags & VHF_ISVEHICLE) { - other.velocity += self.velocity * (self.mass / other.mass); + //other.velocity += self.velocity * (self.mass / other.mass); } } } @@ -186,7 +201,7 @@ void vehicles_touch() if (clienttype(other) != CLIENTTYPE_REAL) return; - self.vehicle_enter(); + vehicles_enter(); } void vehicles_enter() @@ -426,7 +441,10 @@ void vehicles_setreturn(float retime, void() respawn_proc) float vehicles_customizeentityforclient() { - return self.deadflag == DEAD_DEAD ? FALSE : TRUE; + if(self.deadflag == DEAD_DEAD) + return FALSE; + else + return TRUE; } void vehicles_configcheck(string configname, float check_cvar) diff --git a/qcsrc/server/vehicles/vehicles.qh b/qcsrc/server/vehicles/vehicles.qh index a932f48e1..6d64a3d29 100644 --- a/qcsrc/server/vehicles/vehicles.qh +++ b/qcsrc/server/vehicles/vehicles.qh @@ -1,4 +1,5 @@ #ifdef VEHICLES_ENABLED +//#include "collision.qc" #include "vehicles.qc" #include "racer.qc" #include "spiderbot.qc" -- 2.39.2