X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Fvehicles%2Fsv_vehicles.qc;h=1fbd80210475debd33e63fc5823ca4dd114214bb;hp=4e4bfd584b499f3de4d9011d16cc0e54de7a7208;hb=0071121b663dc3d841a2c28d27c1015899f0f402;hpb=b9b7114ea4f553130e727a77029eece79a041cee diff --git a/qcsrc/common/vehicles/sv_vehicles.qc b/qcsrc/common/vehicles/sv_vehicles.qc index 4e4bfd584b..1fbd802104 100644 --- a/qcsrc/common/vehicles/sv_vehicles.qc +++ b/qcsrc/common/vehicles/sv_vehicles.qc @@ -24,6 +24,13 @@ bool SendAuxiliaryXhair(entity this, entity to, int sf) return true; } +bool AuxiliaryXhair_customize(entity this, entity client) +{ + //entity e = WaypointSprite_getviewentity(client); + entity axh = client.(AuxiliaryXhair[this.cnt]); + return axh.owner == this.owner; // cheaply check if the client's axh owner is the same as our real owner +} + .vector axh_prevorigin; .vector axh_prevcolors; @@ -39,7 +46,8 @@ void UpdateAuxiliaryXhair(entity own, vector loc, vector clr, int axh_id) { axh = new(auxiliary_xhair); axh.cnt = axh_id; - axh.drawonlytoclient = own; + //axh.drawonlytoclient = own; // not spectatable + setcefc(axh, AuxiliaryXhair_customize); axh.owner = own; Net_LinkEntity(axh, false, 0, SendAuxiliaryXhair); } @@ -68,6 +76,18 @@ void CSQCVehicleSetup(entity own, int vehicle_id) WriteHeader(MSG_ONE, TE_CSQC_VEHICLESETUP); WriteByte(MSG_ONE, vehicle_id); + + if(vehicle_id == 0 || vehicle_id == HUD_NORMAL) + { + for(int i = 0; i < MAX_AXH; ++i) + { + entity axh = own.(AuxiliaryXhair[i]); + own.(AuxiliaryXhair[i]) = NULL; + + if(axh.owner == own && axh != NULL && !wasfreed(axh)) + delete(axh); + } + } } void vehicles_locktarget(entity this, float incr, float decr, float _lock_time) @@ -214,7 +234,7 @@ void vehicles_projectile_explode(entity this, entity toucher) this.event_damage = func_null; RadiusDamage (this, this.realowner, this.shot_dmg, 0, this.shot_radius, this, NULL, this.shot_force, this.totalfrags, toucher); - delete (this); + delete(this); } void vehicles_projectile_explode_think(entity this) @@ -383,12 +403,14 @@ vector vehicle_aimturret(entity _vehic, vector _target, entity _turrret, string return vtag; } -void vehicles_reset_colors(entity this) +void vehicles_reset_colors(entity this, entity player) { int eff = 0, cmap; const vector cmod = '0 0 0'; if(this.team && teamplay) cmap = 1024 + (this.team - 1) * 17; + else if(player) + cmap = player.colormap; else cmap = 1024; if(autocvar_g_nodepthtestplayers) @@ -399,25 +421,25 @@ void vehicles_reset_colors(entity this) // Find all ents attacked to main model and setup effects, colormod etc. FOREACH_ENTITY_ENT(tag_entity, this, { - if(it != this.vehicle_shieldent) - { - it.effects = eff; - it.colormod = cmod; - it.colormap = cmap; - it.alpha = 1; - } + if(it == this.vehicle_shieldent) + continue; + + it.effects = eff; + it.colormod = cmod; + it.colormap = cmap; + it.alpha = 1; }); // Also check head tags FOREACH_ENTITY_ENT(tag_entity, this.tur_head, { - if(it != this.vehicle_shieldent) - { - it.effects = eff; - it.colormod = cmod; - it.colormap = cmap; - it.alpha = 1; - } + if(it == this.vehicle_shieldent) + continue; + + it.effects = eff; + it.colormod = cmod; + it.colormap = cmap; + it.alpha = 1; }); this.vehicle_hudmodel.effects = this.effects = eff; // | EF_LOWPRECISION; @@ -429,6 +451,9 @@ void vehicles_reset_colors(entity this) this.avelocity = '0 0 0'; this.velocity = '0 0 0'; this.effects = eff; + + Vehicle info = Vehicles_from(this.vehicleid); + info.vr_setcolors(info, this); } void vehicles_clearreturn(entity veh) @@ -552,7 +577,7 @@ void vehicle_use(entity this, entity actor, entity trigger) else { vehicles_setreturn(this); - vehicles_reset_colors(this); + vehicles_reset_colors(this, actor); } } } @@ -666,11 +691,11 @@ void vehicles_damage(entity this, entity inflictor, entity attacker, float damag this.vehicle_shieldent.alpha = 0.75; if(sound_allowed(MSG_BROADCAST, attacker)) - spamsound (this, CH_PAIN, "onslaught/ons_hit2.wav", VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER + spamsound (this, CH_PAIN, SND_ONS_HIT2, VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER } else if(sound_allowed(MSG_BROADCAST, attacker)) - spamsound (this, CH_PAIN, "onslaught/electricity_explode.wav", VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER + spamsound (this, CH_PAIN, SND_ONS_ELECTRICITY_EXPLODE, VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER } else @@ -678,7 +703,7 @@ void vehicles_damage(entity this, entity inflictor, entity attacker, float damag this.vehicle_health -= damage; if(sound_allowed(MSG_BROADCAST, attacker)) - spamsound (this, CH_PAIN, "onslaught/ons_hit2.wav", VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER + spamsound (this, CH_PAIN, SND_ONS_HIT2, VOL_BASE, ATTEN_NORM); // FIXME: PLACEHOLDER } if(this.damageforcescale < 1 && this.damageforcescale > 0) @@ -737,10 +762,10 @@ void vehicles_impact(entity this, float _minspeed, float _speedfac, float _maxpa } // vehicle enter/exit handling -vector vehicles_findgoodexit(entity this, vector prefer_spot) +vector vehicles_findgoodexit(entity this, entity player, vector prefer_spot) { // TODO: we actually want the player's size here - tracebox(this.origin + '0 0 32', PL_MIN_CONST, PL_MAX_CONST, prefer_spot, MOVE_NORMAL, this.owner); + tracebox(this.origin + '0 0 32', PL_MIN_CONST, PL_MAX_CONST, prefer_spot, MOVE_NORMAL, player); if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) return prefer_spot; @@ -752,7 +777,7 @@ vector vehicles_findgoodexit(entity this, vector prefer_spot) v = randomvec(); v_z = 0; v = v2 + normalize(v) * mysize; - tracebox(v2, PL_MIN_CONST, PL_MAX_CONST, v, MOVE_NORMAL, this.owner); + tracebox(v2, PL_MIN_CONST, PL_MAX_CONST, v, MOVE_NORMAL, player); if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid) return v; } @@ -760,6 +785,7 @@ vector vehicles_findgoodexit(entity this, vector prefer_spot) return this.origin; } +.int old_vehicle_flags; void vehicles_exit(entity vehic, bool eject) { entity player = vehic.owner; @@ -794,7 +820,7 @@ void vehicles_exit(entity vehic, bool eject) WriteAngle(MSG_ONE, 0); } - setsize(player, STAT(PL_MIN,player), STAT(PL_MAX, player)); + setsize(player, STAT(PL_MIN, player), STAT(PL_MAX, player)); player.takedamage = DAMAGE_AIM; player.solid = SOLID_SLIDEBOX; @@ -838,6 +864,10 @@ void vehicles_exit(entity vehic, bool eject) vehic.team = vehic.tur_head.team; + if(vehic.old_vehicle_flags & VHF_SHIELDREGEN) + vehic.vehicle_flags |= VHF_SHIELDREGEN; + vehic.old_vehicle_flags = 0; + sound (vehic, CH_TRIGGER_SINGLE, SND_Null, 1, ATTEN_NORM); vehic.vehicle_hudmodel.viewmodelforclient = vehic; vehic.phase = time + 1; @@ -845,11 +875,14 @@ void vehicles_exit(entity vehic, bool eject) vehic.vehicle_exit(vehic, eject); vehicles_setreturn(vehic); - vehicles_reset_colors(vehic); + vehicles_reset_colors(vehic, NULL); vehic.owner = NULL; CSQCMODEL_AUTOINIT(vehic); + if(player) + player.oldorigin = player.origin; // player's location is set by the exit functions, so we need to do this after everything + vehicles_exit_running = false; } @@ -941,6 +974,10 @@ void vehicles_enter(entity pl, entity veh) Send_Notification(NOTIF_ONE, pl, MSG_CENTER, CENTER_VEHICLE_STEAL_SELF); + veh.vehicle_shield = 0; + veh.old_vehicle_flags = veh.vehicle_flags; // make a backup just so we're not permanently crippling this vehicle + veh.vehicle_flags &= ~VHF_SHIELDREGEN; + if (autocvar_g_vehicles_steal_show_waypoint) { entity wp = WaypointSprite_Spawn(WP_VehicleIntruder, 0, 0, pl, '0 0 68', NULL, veh.team, veh, wps_intruder, true, RADARICON_DANGER); wp.colormod = Team_ColorRGB(pl.team); @@ -966,10 +1003,11 @@ void vehicles_enter(entity pl, entity veh) pl.crouch = false; pl.view_ofs = STAT(PL_VIEW_OFS, pl); - setsize (pl, STAT(PL_MIN, pl), STAT(PL_MAX, pl)); + setsize(pl, STAT(PL_MIN, pl), STAT(PL_MAX, pl)); veh.event_damage = vehicles_damage; veh.nextthink = 0; + pl.items &= ~IT_USING_JETPACK; pl.angles = veh.angles; pl.takedamage = DAMAGE_NO; pl.solid = SOLID_NOT; @@ -1007,6 +1045,8 @@ void vehicles_enter(entity pl, entity veh) veh.team = pl.team; veh.flags -= FL_NOTARGET; + vehicles_reset_colors(veh, pl); + if (IS_REAL_CLIENT(pl)) { Send_Notification(NOTIF_ONE, pl, MSG_CENTER, CENTER_VEHICLE_ENTER); @@ -1120,11 +1160,12 @@ void vehicles_spawn(entity this) } }); - vehicles_reset_colors(this); Vehicle info = Vehicles_from(this.vehicleid); info.vr_spawn(info, this); + vehicles_reset_colors(this, NULL); + CSQCMODEL_AUTOINIT(this); } @@ -1222,14 +1263,14 @@ bool vehicle_initialize(entity this, Vehicle info, bool nodrop) setattachment(this.vehicle_viewport, this.vehicle_hudmodel, info.tag_view); } - setsize(this, info.mins, info.maxs); + setsize(this, info.m_mins, info.m_maxs); info.vr_setup(info, this); if(!nodrop) { setorigin(this, this.origin); - tracebox(this.origin + '0 0 100', info.mins, info.maxs, this.origin - '0 0 10000', MOVE_WORLDONLY, this); + tracebox(this.origin + '0 0 100', info.m_mins, info.m_maxs, this.origin - '0 0 10000', MOVE_WORLDONLY, this); setorigin(this, trace_endpos); }