]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'samual/weapons' into Mario/weapons
authorMario <mario.mario@y7mail.com>
Sun, 15 Jun 2014 04:54:31 +0000 (14:54 +1000)
committerMario <mario.mario@y7mail.com>
Sun, 15 Jun 2014 04:54:31 +0000 (14:54 +1000)
12 files changed:
bal-wep-xonotic.cfg
post-config.cfg
qcsrc/client/View.qc
qcsrc/client/csqcmodel_hooks.qc
qcsrc/client/hud.qh
qcsrc/common/weapons/w_arc.qc
qcsrc/common/weapons/w_devastator.qc
qcsrc/common/weapons/weapons.qh
qcsrc/server/t_teleporters.qc
qcsrc/server/weapons/tracing.qc
qcsrc/warpzonelib/client.qc
qcsrc/warpzonelib/client.qh

index 65783f4a091a92fa88604310f44e94cd55bfe342..562119b7e65c305ab8f0bdb2ab3b7f65cfee3525 100644 (file)
@@ -264,6 +264,7 @@ set g_balance_arc_beam_range 1000
 set g_balance_arc_beam_refire 0.5
 set g_balance_arc_beam_returnspeed 8
 set g_balance_arc_beam_tightness 0.5
+set g_balance_arc_burst_ammo 0
 set g_balance_arc_burst_damage 500
 set g_balance_arc_burst_healing_aps 100
 set g_balance_arc_burst_healing_hps 100
@@ -444,13 +445,18 @@ set g_balance_devastator_reload_time 2
 set g_balance_devastator_remote_damage 70
 set g_balance_devastator_remote_edgedamage 35
 set g_balance_devastator_remote_force 400
+set g_balance_devastator_remote_jump_damage 40
+set g_balance_devastator_remote_jump_radius 200
+set g_balance_devastator_remote_jump_velocity_z_add 500
+set g_balance_devastator_remote_jump_velocity_z_max 1500
+set g_balance_devastator_remote_jump_velocity_z_min 500
 set g_balance_devastator_remote_radius 110
 set g_balance_devastator_speed 1300
 set g_balance_devastator_speedaccel 1300
 set g_balance_devastator_speedstart 1000
 set g_balance_devastator_switchdelay_drop 0.3
 set g_balance_devastator_switchdelay_raise 0.2
-set g_balance_devastator_weaponreplace "arc"
+set g_balance_devastator_weaponreplace ""
 set g_balance_devastator_weaponstart 0
 set g_balance_devastator_weaponstartoverride -1
 set g_balance_devastator_weaponthrowable 1
index 7fb4ea4af2b44490fc3c8f646f88c5b67101c564..f74727f2e8fc819566a4e3be3cc5898838a6a06b 100644 (file)
@@ -1,6 +1,6 @@
-// Mark all cvars listed in cl_forced_saved_cvars as saved. That way they'll never disappear from config.cfg.
-alias _cl_forced_saved_cvars_next "set _forced_saved_cvar_ doit; set _forced_saved_cvar_${1 ?} done; _cl_forced_saved_cvars_chck ${* ?}"
-alias _cl_forced_saved_cvars_chck "_cl_forced_saved_cvars_$_forced_saved_cvar_ ${* ?}"
-alias _cl_forced_saved_cvars_doit "seta $1 \"${$1}\"; _cl_forced_saved_cvars_next ${2- ?}"
-alias _cl_forced_saved_cvars_done ""
-_cl_forced_saved_cvars_next $cl_forced_saved_cvars
+// Mark all cvars listed in menu_forced_saved_cvars as saved. That way they'll never disappear from config.cfg.
+alias _menu_forced_saved_cvars_next "set _forced_saved_cvar_ doit; set _forced_saved_cvar_${1 ?} done; _menu_forced_saved_cvars_chck ${* ?}"
+alias _menu_forced_saved_cvars_chck "_menu_forced_saved_cvars_$_forced_saved_cvar_ ${* ?}"
+alias _menu_forced_saved_cvars_doit "seta $1 \"${$1}\"; _menu_forced_saved_cvars_next ${2- ?}"
+alias _menu_forced_saved_cvars_done ""
+_menu_forced_saved_cvars_next ${menu_forced_saved_cvars ?}
index d1071309404cd0b78a2440cdfb2d12963dc3ddf4..ecc3fa126f05d62f1ea4df0a85f1bb1f610b62be 100644 (file)
@@ -269,7 +269,7 @@ float EnemyHitCheck()
 
 float TrueAimCheck()
 {
-       float nudge = 1; // added to traceline target and subtracted from result
+       float nudge = 1; // added to traceline target and subtracted from result TOOD(divVerent): do we still need this? Doesn't the engine do this now for us?
        vector vecs, trueaimpoint, w_shotorg;
        vector mi, ma, dv;
        float shottype;
index 120b6658df8792443433fc40d7192bc89c4e809b..077b7d9720a1501e6d9eb72e3a36dabd3c0ec54c 100644 (file)
@@ -470,8 +470,14 @@ void CSQCModel_Effects_PreUpdate(void)
        self.effects = self.csqcmodel_effects;
        self.modelflags = self.csqcmodel_modelflags;
 }
+void Reset_ArcBeam(void);
 void CSQCModel_Effects_PostUpdate(void)
 {
+       if (self == csqcplayer) {
+               if (self.csqcmodel_teleported) {
+                       Reset_ArcBeam();
+               }
+       }
        self.csqcmodel_effects = self.effects;
        self.csqcmodel_modelflags = self.modelflags;
        self.effects = 0;
index 46bc0efbf2680c04ac678ec86a9cc41c0cd02fc9..5c062c5facb3400224105766e1628651f83c8c50 100644 (file)
@@ -118,7 +118,7 @@ float current_player;
 
 #define HUD_PANEL(NAME,draw_func,name) \
        float HUD_PANEL_##NAME; \
-       void ##draw_func(void); \
+       void draw_func(void); \
        void RegisterHUD_Panel_##NAME() \
        { \
                HUD_PANEL_LAST = HUD_PANEL_##NAME = HUD_PANEL_NUM; \
@@ -127,7 +127,7 @@ float current_player;
                hud_panelent.classname = "hud_panel"; \
                hud_panelent.panel_name = #name; \
                hud_panelent.panel_id = HUD_PANEL_##NAME; \
-               hud_panelent.panel_draw = ##draw_func; \
+               hud_panelent.panel_draw = draw_func; \
                ++HUD_PANEL_NUM; \
        } \
        ACCUMULATE_FUNCTION(RegisterHUD_Panels, RegisterHUD_Panel_##NAME);
index 2d6e54189da971524fa690e596a0ed4f7bbbd4ff..976b026a102c5fcb326f57f17cd16b23b8f62388 100644 (file)
@@ -81,6 +81,7 @@ ARC_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP)
 .float beam_prev;
 .float beam_initialized;
 .float beam_bursting;
+.float beam_teleporttime;
 #endif
 #ifdef CSQC
 void Ent_ReadArcBeam(float isnew);
@@ -166,6 +167,15 @@ float W_Arc_Beam_Send(entity to, float sf)
        return TRUE;
 }
 
+void Reset_ArcBeam(entity player, vector forward)
+{
+       if (!player.arc_beam) {
+               return;
+       }
+       player.arc_beam.beam_dir = forward;
+       player.arc_beam.beam_teleporttime = time;
+}
+
 void W_Arc_Beam_Think(void)
 {
        if(self != self.owner.arc_beam)
@@ -179,7 +189,7 @@ void W_Arc_Beam_Think(void)
                ||
                self.owner.deadflag != DEAD_NO
                ||
-               (!self.owner.BUTTON_ATCK && !self.beam_bursting)
+               (!self.owner.BUTTON_ATCK /* FIXME(Samual): && !self.beam_bursting */)
                ||
                self.owner.freezetag_frozen
        )
@@ -234,6 +244,11 @@ void W_Arc_Beam_Think(void)
                WEP_CVAR(arc, beam_range)
        );
 
+       // After teleport, "lock" the beam until the teleport is confirmed.
+       if (time < self.beam_teleporttime + ANTILAG_LATENCY(self.owner)) {
+               w_shotdir = self.beam_dir;
+       }
+
        // network information: shot origin and want/aim direction
        if(self.beam_start != w_shotorg)
        {
@@ -472,6 +487,8 @@ void W_Arc_Beam_Think(void)
                }
        }
 
+       // te_explosion(trace_endpos);
+
        // if we're bursting, use burst visual effects
        new_beam_type += burst;
 
@@ -488,6 +505,12 @@ void W_Arc_Beam_Think(void)
 
 void W_Arc_Beam(float burst)
 {
+       // FIXME(Samual): remove this when overheat and burst work.
+       if (burst)
+       {
+               centerprint(self, "^4NOTE:^7 Arc burst (secondary) is not implemented yet.");
+       }
+
        // only play fire sound if 1 sec has passed since player let go the fire button
        if(time - self.beam_prev > 1)
        {
@@ -547,7 +570,7 @@ float W_Arc(float req)
                        }
                        #endif
 
-                       if(self.BUTTON_ATCK || self.BUTTON_ATCK2 || self.arc_beam.beam_bursting)
+                       if(self.BUTTON_ATCK || self.BUTTON_ATCK2 /* FIXME(Samual): || self.arc_beam.beam_bursting */)
                        {
                                if(self.BUTTON_ATCK_prev)
                                {
@@ -724,6 +747,17 @@ void Draw_ArcBeam_callback(vector start, vector hit, vector end)
        Draw_ArcBeam_callback_last_bottom = WarpZone_UnTransformOrigin(WarpZone_trace_transform, bottom);
 }
 
+void Reset_ArcBeam(void)
+{
+       entity e;
+       for (e = world; (e = findfloat(e, beam_usevieworigin, 1)); ) {
+               e.beam_initialized = FALSE;
+       }
+       for (e = world; (e = findfloat(e, beam_usevieworigin, 2)); ) {
+               e.beam_initialized = FALSE;
+       }
+}
+
 void Draw_ArcBeam(void)
 {
        if(!self.beam_usevieworigin)
@@ -749,44 +783,43 @@ void Draw_ArcBeam(void)
                // into a weapon system for client code. 
 
                // find where we are aiming
-               makevectors(view_angles);
+               makevectors(warpzone_save_view_angles);
+               vector forward = v_forward;
+               vector right = v_right;
+               vector up = v_up;
 
                // decide upon start position
                if(self.beam_usevieworigin == 2)
-                       { start_pos = view_origin; }
+                       { start_pos = warpzone_save_view_origin; }
                else
                        { start_pos = self.origin; }
 
                // trace forward with an estimation
                WarpZone_TraceLine(
                        start_pos,
-                       start_pos + view_forward * self.beam_range,
+                       start_pos + forward * self.beam_range,
                        MOVE_NOMONSTERS,
                        self
                );
 
                // untransform in case our trace went through a warpzone
-               vector vf, vr, vu;
-               vf = view_forward;
-               vr = view_right;
-               vu = view_up;
                vector end_pos = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
-               view_forward = vf;
-               view_right = vr;
-               view_up = vu;
 
                // un-adjust trueaim if shotend is too close
-               if(vlen(end_pos - view_origin) < g_trueaim_minrange)
-                       end_pos = view_origin + (view_forward * g_trueaim_minrange);
+               if(vlen(end_pos - start_pos) < g_trueaim_minrange)
+                       end_pos = start_pos + (forward * g_trueaim_minrange);
 
                // move shot origin to the actual gun muzzle origin
                vector origin_offset =
-                       view_forward * self.beam_shotorigin_x
-                       + view_right * -self.beam_shotorigin_y 
-                       + view_up * self.beam_shotorigin_z;
+                         right * -self.beam_shotorigin_y 
+                       + up * self.beam_shotorigin_z;
 
                start_pos = start_pos + origin_offset;
 
+               // Move it also forward, but only as far as possible without hitting anything. Don't poke into walls!
+               traceline(start_pos, start_pos + forward * self.beam_shotorigin_x, MOVE_NORMAL, self);
+               start_pos = trace_endpos;
+
                // calculate the aim direction now
                wantdir = normalize(end_pos - start_pos);
 
@@ -861,7 +894,7 @@ void Draw_ArcBeam(void)
                beamdir = self.beam_dir;
 
                // finally, set self.angles to the proper direction so that muzzle attachment points in proper direction
-               self.angles = fixedvectoangles2(view_forward, view_up);
+               self.angles = fixedvectoangles2(forward, up); // TODO(Samual): is this == warpzone_save_view_angles?
        }
        else
        {
@@ -907,7 +940,7 @@ void Draw_ArcBeam(void)
        }
 
        setorigin(self, start_pos);
-       //self.beam_muzzleentity.angles_z = random() * 360; // WEAPONTODO: use avelocity instead?
+       self.beam_muzzleentity.angles_z = random() * 360; // WEAPONTODO: use avelocity instead?
 
        vector beam_endpos = (start_pos + (beamdir * self.beam_range));
        vector beam_controlpoint = start_pos + wantdir * (self.beam_range * (1 - self.beam_tightness));
@@ -946,9 +979,8 @@ void Draw_ArcBeam(void)
                        Draw_ArcBeam_callback
                );
 
-               // Do all the transforms for warpzones right now, as we already
-               // "are" in the post-trace system (if we hit a player, that's
-               // always BEHIND the last passed wz).
+               // Do all the transforms for warpzones right now, as we already "are" in the post-trace
+               // system (if we hit a player, that's always BEHIND the last passed wz).
                last_origin = trace_endpos;
                start_pos = WarpZone_TransformOrigin(WarpZone_trace_transform, start_pos);
                beam_controlpoint = WarpZone_TransformOrigin(WarpZone_trace_transform, beam_controlpoint);
@@ -957,22 +989,15 @@ void Draw_ArcBeam(void)
                Draw_ArcBeam_callback_last_top = WarpZone_TransformOrigin(WarpZone_trace_transform, Draw_ArcBeam_callback_last_top);
                Draw_ArcBeam_callback_last_bottom = WarpZone_TransformOrigin(WarpZone_trace_transform, Draw_ArcBeam_callback_last_bottom);
 
-               //printf("segment: %d, warpzone transform: %d\n", i, (WarpZone_trace_transform != world));
-
-               // WEAPONTODO:
-               // Figure out some way to detect a collision with geometry with callback...
-               // That way we can know when we are done drawing the beam and skip
-               // the rest of the segments without breaking warpzone support.
-               //
-               // Not needed to do this in the callback. trace_fraction != 1 is a good abort condition.
-
-               if (trace_fraction < 1)
-                       break;
+               if(trace_fraction < 1) { break; }
        }
 
        // visual effects for startpoint and endpoint
        if(self.beam_hiteffect)
        {
+               // FIXME we really should do this on the server so it actually
+               // matches gameplay. What this client side stuff is doing is no
+               // more than guesswork.
                pointparticles(
                        self.beam_hiteffect,
                        last_origin,
index b0d7a0a1a26d8896cc08f86f6b56240c198524dd..b14d1bcd49dd6599c964c8b72d8ae06693aee04c 100644 (file)
@@ -36,6 +36,11 @@ REGISTER_WEAPON(
        w_cvar(id, sn, NONE, remote_damage) \
        w_cvar(id, sn, NONE, remote_edgedamage) \
        w_cvar(id, sn, NONE, remote_force) \
+       w_cvar(id, sn, NONE, remote_jump_damage) \
+       w_cvar(id, sn, NONE, remote_jump_radius) \
+       w_cvar(id, sn, NONE, remote_jump_velocity_z_add) \
+       w_cvar(id, sn, NONE, remote_jump_velocity_z_max) \
+       w_cvar(id, sn, NONE, remote_jump_velocity_z_min) \
        w_cvar(id, sn, NONE, remote_radius) \
        w_cvar(id, sn, NONE, speed) \
        w_cvar(id, sn, NONE, speedaccel) \
@@ -82,7 +87,18 @@ void W_Devastator_Explode(void)
        self.event_damage = func_null;
        self.takedamage = DAMAGE_NO;
 
-       RadiusDamage(self, self.realowner, WEP_CVAR(devastator, damage), WEP_CVAR(devastator, edgedamage), WEP_CVAR(devastator, radius), world, world, WEP_CVAR(devastator, force), self.projectiledeathtype, other);
+       RadiusDamage(
+               self,
+               self.realowner,
+               WEP_CVAR(devastator, damage),
+               WEP_CVAR(devastator, edgedamage),
+               WEP_CVAR(devastator, radius),
+               world,
+               world,
+               WEP_CVAR(devastator, force),
+               self.projectiledeathtype,
+               other
+       );
 
        if(self.realowner.weapon == WEP_DEVASTATOR)
        {
@@ -103,7 +119,64 @@ void W_Devastator_DoRemoteExplode(void)
        self.event_damage = func_null;
        self.takedamage = DAMAGE_NO;
 
-       RadiusDamage(self, self.realowner, WEP_CVAR(devastator, remote_damage), WEP_CVAR(devastator, remote_edgedamage), WEP_CVAR(devastator, remote_radius), world, world, WEP_CVAR(devastator, remote_force), self.projectiledeathtype | HITTYPE_BOUNCE, world);
+       float handled_as_rocketjump = FALSE;
+
+       entity head = WarpZone_FindRadius(
+               self.origin,
+               WEP_CVAR(devastator, remote_jump_radius),
+               FALSE
+       );
+       
+       while(head)
+       {
+               if(head.takedamage && (head == self.realowner))
+               {
+                       float distance_to_head = vlen(self.origin - head.WarpZone_findradius_nearest);
+                       if(distance_to_head <= WEP_CVAR(devastator, remote_jump_radius))
+                       {
+                               // we handled this as a rocketjump :)
+                               handled_as_rocketjump = TRUE;
+
+                               // modify velocity 
+                               head.velocity_x *= 0.9;
+                               head.velocity_y *= 0.9;
+                               head.velocity_z = bound(
+                                       WEP_CVAR(devastator, remote_jump_velocity_z_min),
+                                       head.velocity_z + WEP_CVAR(devastator, remote_jump_velocity_z_add),
+                                       WEP_CVAR(devastator, remote_jump_velocity_z_max)
+                               );
+
+                               // now do the damage
+                               RadiusDamage(
+                                       self,
+                                       head,
+                                       WEP_CVAR(devastator, remote_jump_damage),
+                                       WEP_CVAR(devastator, remote_jump_damage),
+                                       WEP_CVAR(devastator, remote_jump_radius),
+                                       world,
+                                       head,
+                                       0,
+                                       self.projectiledeathtype | HITTYPE_BOUNCE,
+                                       world
+                               );
+                               break;
+                       }
+               }
+               head = head.chain;
+       }
+
+       RadiusDamage(
+               self,
+               self.realowner,
+               WEP_CVAR(devastator, remote_damage),
+               WEP_CVAR(devastator, remote_edgedamage),
+               WEP_CVAR(devastator, remote_radius),
+               (handled_as_rocketjump ? head : world),
+               world,
+               WEP_CVAR(devastator, remote_force),
+               self.projectiledeathtype | HITTYPE_BOUNCE,
+               world
+       );
 
        if(self.realowner.weapon == WEP_DEVASTATOR)
        {
@@ -168,9 +241,6 @@ vector W_Devastator_SteerTo(vector thisdir, vector goaldir, float maxturn_cos)
 void W_Devastator_Think(void)
 {
        vector desireddir, olddir, newdir, desiredorigin, goal;
-#if 0
-       float cosminang, cosmaxang, cosang;
-#endif
        float velspeed, f;
        self.nextthink = time;
        if(time > self.cnt)
index 9fd986022b6c4ed5b5adf19346dd4e4dd257a91a..af031086a18a66a0377533b696318e86ed3b9b13 100644 (file)
@@ -110,7 +110,7 @@ float GetAmmoStat(.float ammotype);
 
 // create properties for weapon settings
 #define WEP_ADD_PROP(wepid,wepname,type,prop,name) \
-       .type ##prop; \
+       .type prop; \
        [[last]] type autocvar_g_balance_##wepname##_##name;
 
 // read cvars from weapon settings
index 8f15a4f820c428c976ca17d5871ce178d99b9b6e..943f01ae392a2ef0620923b1f7355e9c81c7c3eb 100644 (file)
@@ -80,6 +80,7 @@ void spawn_tdeath(vector v0, entity e, vector v)
 #define TELEPORT_NORMAL 1 // play sounds/effects etc
 #define TELEPORT_SIMPLE 2 // only do teleport, nothing special
 
+void Reset_ArcBeam(entity player, vector forward);
 void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity, vector telefragmin, vector telefragmax, float tflags)
 {
        entity telefragger;
@@ -117,6 +118,8 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle
        player.velocity = to_velocity;
        BITXOR_ASSIGN(player.effects, EF_TELEPORT_BIT);
 
+       makevectors(player.angles);
+       Reset_ArcBeam(player, v_forward);
        UpdateCSQCProjectileAfterTeleport(player);
 
        if(IS_PLAYER(player))
@@ -337,6 +340,8 @@ void spawnfunc_trigger_teleport (void)
 
 void WarpZone_PostTeleportPlayer_Callback(entity pl)
 {
+       makevectors(pl.angles);
+       Reset_ArcBeam(pl, v_forward);
        UpdateCSQCProjectileAfterTeleport(pl);
        // "disown" projectiles after teleport
        if(pl.owner)
index 467da632b0924e0e93644557a0ea0cbfd7ff7cb1..75cf5b1d4c8fa016a07c4cabc6426a6253a9b9da 100644 (file)
@@ -3,7 +3,7 @@
 // make sure you call makevectors first (FIXME?)
 void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector mi, vector ma, float antilag, float recoil, string snd, float chan, float maxdamage, float range)
 {
-       float nudge = 1; // added to traceline target and subtracted from result
+       float nudge = 1; // added to traceline target and subtracted from result  TOOD(divVerent): do we still need this? Doesn't the engine do this now for us?
        float oldsolid;
        vector vecs, dv;
        oldsolid = ent.dphitcontentsmask;
index f55cec1d52ea16ac280a04e44f3f1f496d85f9f1..c2a110b4a14dd829fdc06618e6c669653e29074f 100644 (file)
@@ -239,8 +239,8 @@ void WarpZone_FixView()
        vector org, ang, nearclip, corner0, corner1, corner2, corner3, o;
        float f;
 
-       org = getpropertyvec(VF_ORIGIN);
-       ang = getpropertyvec(VF_ANGLES);
+       warpzone_save_view_origin = org = getpropertyvec(VF_ORIGIN);
+       warpzone_save_view_angles = ang = getpropertyvec(VF_ANGLES);
 #ifdef WORKAROUND_XON010
        float dirty;
        dirty = checkextension("DP_CSQC_ROTATEMOVES");
index 446c917dbfdb86ee4c50e20e9a29660b9fba8dd0..c0a4ca0f0a70d07caebd9fa4d86aef57db98dbc9 100644 (file)
@@ -7,3 +7,6 @@ void WarpZone_FixView();
 
 void WarpZone_Init();
 void WarpZone_Shutdown();
+
+vector warpzone_save_view_origin;
+vector warpzone_save_view_angles;