X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fserver%2Fvehicles%2Fvehicles.qc;h=69c0f87e51f23528c0fd5caeffb32f3844dc2f29;hp=e98e1276131a6d291b3bd620d4d5172d905ed131;hb=4033ba8e6df482923b67fb90476a9c56438b2c32;hpb=18f2a272b9afb8364dcd7f98e382bfe7eafa94e2 diff --git a/qcsrc/server/vehicles/vehicles.qc b/qcsrc/server/vehicles/vehicles.qc index e98e12761..69c0f87e5 100644 --- a/qcsrc/server/vehicles/vehicles.qc +++ b/qcsrc/server/vehicles/vehicles.qc @@ -1,5 +1,7 @@ float autocvar_g_vehicles_crush_dmg; float autocvar_g_vehicles_crush_force; +float autocvar_g_vehicles_delayspawn; +float autocvar_g_vehicles_delayspawn_jitter; void vehicles_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force); void vehicles_return(); @@ -10,8 +12,8 @@ void vehicles_clearrturn(); void vehicles_setreturn(); -/** AuxiliaryXhair* - Send addictional points of interest to be drawn, to vehicle owner +/** AuxiliaryXhair* + Send additional points of interest to be drawn, to vehicle owner **/ float MAX_AXH = 4; .entity AuxiliaryXhair[MAX_AXH]; @@ -80,6 +82,12 @@ void SendAuxiliaryXhair2(entity own, vector loc, vector clr, float axh_id) */ // End AuxiliaryXhair +/** + Notifies the client that he enterd a vehicle, and sends + realavent data. + + only sends vehicle_id atm (wich is a HUD_* constant, ex. HUD_SPIDERBOT) +**/ void CSQCVehicleSetup(entity own, float vehicle_id) { msg_entity = own; @@ -90,21 +98,22 @@ void CSQCVehicleSetup(entity own, float vehicle_id) } /** vehicles_locktarget - + Generic target locking. - + Figure out if what target is "locked" (if any), for missile tracking as such. - + after calling, "if(self.lock_target != world && self.lock_strength == 1)" mean you have a locked in target. - + Exspects a crosshair_trace() or equivalent to be dont before calling. - + **/ .entity lock_target; .float lock_strength; .float lock_time; +.float lock_soundtime; void vehicles_locktarget(float incr, float decr, float _lock_time) { if(self.lock_target && self.lock_target.deadflag != DEAD_NO) @@ -115,7 +124,16 @@ void vehicles_locktarget(float incr, float decr, float _lock_time) } if(self.lock_time > time) + { + if(self.lock_target) + if(self.lock_soundtime < time) + { + self.lock_soundtime = time + 0.5; + play2(self.owner, "vehicles/locked.wav"); + } + return; + } if(trace_ent != world) { @@ -131,7 +149,22 @@ void vehicles_locktarget(float incr, float decr, float _lock_time) if(self.lock_target == world && trace_ent != world) self.lock_target = trace_ent; - + + if(self.lock_target && trace_ent == self.lock_target) + { + if(self.lock_strength != 1 && self.lock_strength + incr >= 1) + { + play2(self.owner, "vehicles/lock.wav"); + self.lock_soundtime = time + 0.8; + } + else if (self.lock_strength != 1 && self.lock_soundtime < time) + { + play2(self.owner, "vehicles/locking.wav"); + self.lock_soundtime = time + 0.3; + } + + } + // Have a locking target // Trace hit current target if(trace_ent == self.lock_target && trace_ent != world) @@ -201,6 +234,10 @@ vector vehicles_force_fromtag_maglev(string tag_name, float spring_length, float // Generic vehile projectile system void vehicles_projectile_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) { + // Ignore damage from oterh projectiles from my owner (dont mess up volly's) + if(inflictor.owner == self.owner) + return; + self.health -= damage; self.velocity += force; if(self.health < 1) @@ -235,7 +272,7 @@ void vehicles_projectile_explode() entity vehicles_projectile(string _mzlfx, string _mzlsound, vector _org, vector _vel, float _dmg, float _radi, float _force, float _size, - float _deahtype, float _projtype, float _health, + float _deahtype, float _projtype, float _health, float _cull, float _clianim) { entity proj; @@ -287,7 +324,7 @@ entity vehicles_projectile(string _mzlfx, string _mzlsound, // End generic vehile projectile system /** vehicles_spawn - Exetuted for all vehiles on (re)spawn. + Exetuted for all vehicles on (re)spawn. Sets defaults for newly spawned units. **/ void vehicles_spawn() @@ -296,7 +333,7 @@ void vehicles_spawn() // De-own & reset self.vehicle_hudmodel.viewmodelforclient = self; - + self.owner = world; self.touch = vehicles_touch; self.event_damage = vehicles_damage; @@ -309,7 +346,7 @@ void vehicles_spawn() self.flags = FL_NOTARGET; self.avelocity = '0 0 0'; self.velocity = '0 0 0'; - + // Reset locking self.lock_strength = 0; self.lock_target = world; @@ -400,12 +437,12 @@ void vehicles_enter() self.owner = other; self.switchweapon = other.switchweapon; - + // .viewmodelforclient works better. //self.vehicle_hudmodel.drawonlytoclient = self.owner; - self.vehicle_hudmodel.viewmodelforclient = self.owner; - + self.vehicle_hudmodel.viewmodelforclient = self.owner; + self.event_damage = vehicles_damage; self.nextthink = 0; self.owner.angles = self.angles; @@ -438,9 +475,6 @@ void vehicles_enter() self.team = self.owner.team; self.flags -= FL_NOTARGET; -#if 0 - other.clientcamera = self.vehicle_viewport; -#else msg_entity = other; WriteByte (MSG_ONE, SVC_SETVIEWPORT); WriteEntity(MSG_ONE, self.vehicle_viewport); @@ -459,7 +493,6 @@ void vehicles_enter() WriteAngle(MSG_ONE, self.angles_y); // yaw WriteAngle(MSG_ONE, 0); // roll } -#endif vehicles_clearrturn(); @@ -468,8 +501,65 @@ void vehicles_enter() self.vehicle_enter(); } -void vehicles_exit(float eject) +/** vehicles_findgoodexit + Locates a valid location for the player to exit the vehicle. + Will first try prefer_spot, then up 100 random spots arround the vehicle + wich are in direct line of sight and empty enougth to hold a players bbox +**/ +vector vehicles_findgoodexit(vector prefer_spot) { + vector exitspot; + float mysize; + + tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, prefer_spot, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return prefer_spot; + + mysize = vlen(self.maxs - self.mins); + float i; + vector v, v2; + v2 = 0.5 * (self.absmin + self.absmax); + for(i = 0; i < 100; ++i) + { + v = randomvec(); + v_z = 0; + v = v2 + normalize(v) * mysize; + tracebox(v2, PL_MIN, PL_MAX, v, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return v; + } + + /* + exitspot = (self.origin + '0 0 48') + v_forward * mysize; + tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return exitspot; + + exitspot = (self.origin + '0 0 48') - v_forward * mysize; + tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return exitspot; + + exitspot = (self.origin + '0 0 48') + v_right * mysize; + tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return exitspot; + + exitspot = (self.origin + '0 0 48') - v_right * mysize; + tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner); + if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) + return exitspot; + */ + + return self.origin; +} + +/** vehicles_exit + Standarrd vehicle release fucntion. + custom code goes in self.vehicle_exit +**/ +void vehicles_exit(float eject) +{ self.flags |= FL_NOTARGET; if (self.owner) @@ -618,7 +708,6 @@ void vehicles_clearrturn() ret.nextthink = time + 0.1; return; } - ret = ret.chain; } } @@ -634,15 +723,7 @@ void vehicles_setreturn() ret.enemy = self; ret.think = vehicles_return; ret.nextthink = time + self.vehicle_respawntime; -} - -float vehicles_customizeentityforclient() -{ - if(self.deadflag == DEAD_DEAD) - return FALSE; - else - return TRUE; -} +} void vehicles_configcheck(string configname, float check_cvar) { @@ -661,7 +742,7 @@ void vehicles_reset_colors() if(autocvar_g_fullbrightplayers) _effects |= EF_FULLBRIGHT; - + if(self.team) _colormap = 1024 + (self.team - 1) * 17; else @@ -683,7 +764,7 @@ void vehicles_reset_colors() } e = e.chain; } - + self.vehicle_hudmodel.effects = self.effects = _effects | EF_LOWPRECISION; self.vehicle_hudmodel.colormod = self.colormod = _colormod; self.vehicle_hudmodel.colormap = self.colormap = _colormap; @@ -753,15 +834,14 @@ float vehicle_initialize(string net_name, self.iscreature = TRUE; self.hud = vhud; - //self.customizeentityforclient = vehicles_customizeentityforclient; self.vehicle_die = dieproc; self.vehicle_exit = exitfunc; self.vehicle_enter = enterproc; self.PlayerPhysplug = physproc; self.event_damage = vehicles_damage; self.touch = vehicles_touch; - self.think = vehicles_spawn; - self.nextthink = time; + self.think = vehicles_spawn; + self.nextthink = time; self.vehicle_respawntime = _respawntime; self.vehicle_spawn = spawnproc; @@ -796,17 +876,13 @@ float vehicle_initialize(string net_name, tracebox(self.origin + '0 0 100', min_s, max_s, self.origin - '0 0 10000', MOVE_WORLDONLY, self); setorigin(self, trace_endpos); } - + self.pos1 = self.origin; self.pos2 = self.angles; -#ifdef VEHICLES_CSQC - if(use_csqc) - net_link_vehile(); -#endif + return TRUE; } - void bugmenot() { self.vehicle_exit = self.vehicle_exit; @@ -814,4 +890,4 @@ void bugmenot() self.vehicle_die = self.vehicle_exit; self.vehicle_spawn = self.vehicle_exit; self.AuxiliaryXhair = self.AuxiliaryXhair; -} \ No newline at end of file +}