]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge remote-tracking branch 'origin/master' into samual/lightning_gun
authorSamual Lenks <samual@xonotic.org>
Mon, 10 Jun 2013 01:24:23 +0000 (21:24 -0400)
committerSamual Lenks <samual@xonotic.org>
Mon, 10 Jun 2013 01:24:23 +0000 (21:24 -0400)
Conflicts:
balanceLeeStricklin.cfg
balanceXonotic.cfg
qcsrc/client/hook.qc
qcsrc/client/hud.qc
qcsrc/common/constants.qh
qcsrc/server/autocvars.qh

22 files changed:
balance25.cfg
balanceFruitieX.cfg
balanceXPM.cfg
balanceXonotic.cfg
models/weapons/g_lightning.md3 [new file with mode: 0644]
models/weapons/h_lightning.iqm [new file with mode: 0644]
models/weapons/h_lightning.iqm.framegroups [new file with mode: 0644]
models/weapons/v_lightning.md3 [new file with mode: 0644]
models/weapons/w_lightning.zym [new file with mode: 0644]
qcsrc/client/Defs.qc
qcsrc/client/Main.qc
qcsrc/client/hook.qc
qcsrc/common/constants.qh
qcsrc/server/autocvars.qh
qcsrc/server/cl_client.qc
qcsrc/server/g_world.qc
qcsrc/server/progs.src
qcsrc/server/t_quake3.qc
qcsrc/server/w_all.qc
qcsrc/server/w_electro.qc
qcsrc/server/w_lightning.qc [new file with mode: 0644]
qcsrc/server/w_lightning.qh [new file with mode: 0644]

index 343891810adf6b8494361761137676bc31e831d1..f1ef007387f9760dd58111055b586f9b94d17cd6 100644 (file)
@@ -425,6 +425,36 @@ set g_balance_electro_switchdelay_raise 0.15
 set g_balance_electro_reload_ammo 0 //default: 20
 set g_balance_electro_reload_time 2
 // }}}
+// {{{ lightning
+set g_balance_lightning_primary_ammo 5
+set g_balance_lightning_primary_animtime 0.2
+set g_balance_lightning_primary_damage 100
+set g_balance_lightning_primary_edgedamage 0
+set g_balance_lightning_primary_falloff_mindist 0
+set g_balance_lightning_primary_falloff_maxdist 0
+set g_balance_lightning_primary_falloff_halflifedist 0
+set g_balance_lightning_primary_force 425
+set g_balance_lightning_primary_lifetime 0
+set g_balance_lightning_primary_radius 850
+set g_balance_lightning_primary_range 800
+set g_balance_lightning_primary_refire 0.4
+set g_balance_lightning_primary_speed 0
+set g_balance_lightning_primary_spread 0
+set g_balance_lightning_secondary_ammo 5
+set g_balance_lightning_secondary_animtime 0.5
+set g_balance_lightning_secondary_damage 100
+set g_balance_lightning_secondary_damageforcescale 4
+set g_balance_lightning_secondary_edgedamage 80
+set g_balance_lightning_secondary_flyingdamage 1
+set g_balance_lightning_secondary_flyingforce -80
+set g_balance_lightning_secondary_flyingradius 200
+set g_balance_lightning_secondary_force -200
+set g_balance_lightning_secondary_health 1
+set g_balance_lightning_secondary_lifetime 30
+set g_balance_lightning_secondary_radius 300
+set g_balance_lightning_secondary_refire 5
+set g_balance_lightning_secondary_speed 600
+// }}}
 // {{{ crylink
 set g_balance_crylink_primary_damage 18
 set g_balance_crylink_primary_edgedamage 0
index ce125421f91a64877c6e975cba3bbdfce025dbe8..5fa32c593189744c41c3c4e742856ae86a2575b8 100644 (file)
@@ -425,6 +425,36 @@ set g_balance_electro_switchdelay_raise 0.15
 set g_balance_electro_reload_ammo 0 //default: 20
 set g_balance_electro_reload_time 2
 // }}}
+// {{{ lightning
+set g_balance_lightning_primary_ammo 5
+set g_balance_lightning_primary_animtime 0.2
+set g_balance_lightning_primary_damage 100
+set g_balance_lightning_primary_edgedamage 0
+set g_balance_lightning_primary_falloff_mindist 0
+set g_balance_lightning_primary_falloff_maxdist 0
+set g_balance_lightning_primary_falloff_halflifedist 0
+set g_balance_lightning_primary_force 425
+set g_balance_lightning_primary_lifetime 0
+set g_balance_lightning_primary_radius 850
+set g_balance_lightning_primary_range 800
+set g_balance_lightning_primary_refire 0.4
+set g_balance_lightning_primary_speed 0
+set g_balance_lightning_primary_spread 0
+set g_balance_lightning_secondary_ammo 5
+set g_balance_lightning_secondary_animtime 0.5
+set g_balance_lightning_secondary_damage 100
+set g_balance_lightning_secondary_damageforcescale 4
+set g_balance_lightning_secondary_edgedamage 80
+set g_balance_lightning_secondary_flyingdamage 1
+set g_balance_lightning_secondary_flyingforce -80
+set g_balance_lightning_secondary_flyingradius 200
+set g_balance_lightning_secondary_force -200
+set g_balance_lightning_secondary_health 1
+set g_balance_lightning_secondary_lifetime 30
+set g_balance_lightning_secondary_radius 300
+set g_balance_lightning_secondary_refire 5
+set g_balance_lightning_secondary_speed 600
+// }}}
 // {{{ crylink
 set g_balance_crylink_primary_damage 7 // LOG: 10 -> 7
 set g_balance_crylink_primary_edgedamage 4 // LOG: 6 -> 4
index f8ffd03381281b57c46ffa236eb0a174956b6da0..e952b59d1ded19f61f7e96d43b1f1d9ff6ff57c9 100644 (file)
@@ -425,6 +425,36 @@ set g_balance_electro_switchdelay_raise 0.2
 set g_balance_electro_reload_ammo 0 //default: 20
 set g_balance_electro_reload_time 2
 // }}}
+// {{{ lightning
+set g_balance_lightning_primary_ammo 5
+set g_balance_lightning_primary_animtime 0.2
+set g_balance_lightning_primary_damage 100
+set g_balance_lightning_primary_edgedamage 0
+set g_balance_lightning_primary_falloff_mindist 0
+set g_balance_lightning_primary_falloff_maxdist 0
+set g_balance_lightning_primary_falloff_halflifedist 0
+set g_balance_lightning_primary_force 425
+set g_balance_lightning_primary_lifetime 0
+set g_balance_lightning_primary_radius 850
+set g_balance_lightning_primary_range 800
+set g_balance_lightning_primary_refire 0.4
+set g_balance_lightning_primary_speed 0
+set g_balance_lightning_primary_spread 0
+set g_balance_lightning_secondary_ammo 5
+set g_balance_lightning_secondary_animtime 0.5
+set g_balance_lightning_secondary_damage 100
+set g_balance_lightning_secondary_damageforcescale 4
+set g_balance_lightning_secondary_edgedamage 80
+set g_balance_lightning_secondary_flyingdamage 1
+set g_balance_lightning_secondary_flyingforce -80
+set g_balance_lightning_secondary_flyingradius 200
+set g_balance_lightning_secondary_force -200
+set g_balance_lightning_secondary_health 1
+set g_balance_lightning_secondary_lifetime 30
+set g_balance_lightning_secondary_radius 300
+set g_balance_lightning_secondary_refire 5
+set g_balance_lightning_secondary_speed 600
+// }}}
 // {{{ crylink 
 set g_balance_crylink_primary_damage 12
 set g_balance_crylink_primary_edgedamage 6
index ca9d32c1dddcce2c588bbdf4fe2ad369d13f4182..60a746c17304b9a11794aadb7d0c966bc38958b0 100644 (file)
@@ -425,6 +425,36 @@ set g_balance_electro_switchdelay_raise 0.2
 set g_balance_electro_reload_ammo 0 //default: 20
 set g_balance_electro_reload_time 2
 // }}}
+// {{{ lightning
+set g_balance_lightning_primary_ammo 5
+set g_balance_lightning_primary_animtime 0.2
+set g_balance_lightning_primary_damage 100
+set g_balance_lightning_primary_edgedamage 0
+set g_balance_lightning_primary_falloff_mindist 0
+set g_balance_lightning_primary_falloff_maxdist 0
+set g_balance_lightning_primary_falloff_halflifedist 0
+set g_balance_lightning_primary_force 425
+set g_balance_lightning_primary_lifetime 0
+set g_balance_lightning_primary_radius 850
+set g_balance_lightning_primary_range 800
+set g_balance_lightning_primary_refire 0.4
+set g_balance_lightning_primary_speed 0
+set g_balance_lightning_primary_spread 0
+set g_balance_lightning_secondary_ammo 5
+set g_balance_lightning_secondary_animtime 0.5
+set g_balance_lightning_secondary_damage 100
+set g_balance_lightning_secondary_damageforcescale 4
+set g_balance_lightning_secondary_edgedamage 80
+set g_balance_lightning_secondary_flyingdamage 1
+set g_balance_lightning_secondary_flyingforce -80
+set g_balance_lightning_secondary_flyingradius 200
+set g_balance_lightning_secondary_force -200
+set g_balance_lightning_secondary_health 1
+set g_balance_lightning_secondary_lifetime 30
+set g_balance_lightning_secondary_radius 300
+set g_balance_lightning_secondary_refire 5
+set g_balance_lightning_secondary_speed 600
+// }}}
 // {{{ crylink 
 set g_balance_crylink_primary_damage 12
 set g_balance_crylink_primary_edgedamage 6
diff --git a/models/weapons/g_lightning.md3 b/models/weapons/g_lightning.md3
new file mode 100644 (file)
index 0000000..76c2e89
Binary files /dev/null and b/models/weapons/g_lightning.md3 differ
diff --git a/models/weapons/h_lightning.iqm b/models/weapons/h_lightning.iqm
new file mode 100644 (file)
index 0000000..8ae8898
Binary files /dev/null and b/models/weapons/h_lightning.iqm differ
diff --git a/models/weapons/h_lightning.iqm.framegroups b/models/weapons/h_lightning.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/v_lightning.md3 b/models/weapons/v_lightning.md3
new file mode 100644 (file)
index 0000000..67105bc
Binary files /dev/null and b/models/weapons/v_lightning.md3 differ
diff --git a/models/weapons/w_lightning.zym b/models/weapons/w_lightning.zym
new file mode 100644 (file)
index 0000000..70cbd17
Binary files /dev/null and b/models/weapons/w_lightning.zym differ
index b89a177f043a465c99c5fc7812a8b0d1eb83f3c3..8f1317827461092f7c1ae28975f798c462151803 100644 (file)
@@ -224,6 +224,7 @@ float tempdb;
 float ClientProgsDB;
 vector hook_shotorigin[4];
 vector electro_shotorigin[4];
+vector lightning_shotorigin[4];
 vector gauntlet_shotorigin[4];
 
 #ifdef BLURTEST
index 7178cdba1abbf9c4a62aac03d833c1191fddfb03..d7130197e6e979e58843300f06a29f0b3ed79231 100644 (file)
@@ -875,7 +875,8 @@ void CSQC_Ent_Update(float bIsNewEntity)
                case ENT_CLIENT_WARPZONE_TELEPORTED: WarpZone_Teleported_Read(bIsNewEntity); break;
                case ENT_CLIENT_TRIGGER_MUSIC: Ent_ReadTriggerMusic(); break;
                case ENT_CLIENT_HOOK: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_HOOK); break;
-               case ENT_CLIENT_LGBEAM: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_LGBEAM); break;
+               case ENT_CLIENT_ELECTRO_BEAM: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_ELECTRO_BEAM); break;
+               case ENT_CLIENT_LIGHTNING_BEAM: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_LIGHTNING_BEAM); break;
                case ENT_CLIENT_GAUNTLET: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_GAUNTLET); break;
                case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break;
                case ENT_CLIENT_AUXILIARYXHAIR: Net_AuXair2(bIsNewEntity); break;
@@ -1016,6 +1017,10 @@ void Ent_Init()
        electro_shotorigin[1] = decompressShotOrigin(ReadInt24_t());
        electro_shotorigin[2] = decompressShotOrigin(ReadInt24_t());
        electro_shotorigin[3] = decompressShotOrigin(ReadInt24_t());
+       lightning_shotorigin[0] = decompressShotOrigin(ReadInt24_t());
+       lightning_shotorigin[1] = decompressShotOrigin(ReadInt24_t());
+       lightning_shotorigin[2] = decompressShotOrigin(ReadInt24_t());
+       lightning_shotorigin[3] = decompressShotOrigin(ReadInt24_t());
        gauntlet_shotorigin[0] = decompressShotOrigin(ReadInt24_t());
        gauntlet_shotorigin[1] = decompressShotOrigin(ReadInt24_t());
        gauntlet_shotorigin[2] = decompressShotOrigin(ReadInt24_t());
index 11070bae5cfe4c10500e36db2b5b3c7bb6607ffb..a228d22b82df8175f7d431425a923547c32fec69 100644 (file)
@@ -75,9 +75,12 @@ void Draw_GrapplingHook()
                case ENT_CLIENT_HOOK:
                        vs = hook_shotorigin[s];
                        break;
-               case ENT_CLIENT_LGBEAM:
+               case ENT_CLIENT_ELECTRO_BEAM:
                        vs = electro_shotorigin[s];
                        break;
+               case ENT_CLIENT_LIGHTNING_BEAM:
+                       vs = lightning_shotorigin[s];
+                       break;
                case ENT_CLIENT_GAUNTLET:
                        vs = gauntlet_shotorigin[s];
                        break;
@@ -92,7 +95,8 @@ void Draw_GrapplingHook()
                                a = view_origin + view_forward * vs_x + view_right * -vs_y + view_up * vs_z;
                                b = self.origin;
                                break;
-                       case ENT_CLIENT_LGBEAM:
+                       case ENT_CLIENT_ELECTRO_BEAM:
+                       case ENT_CLIENT_LIGHTNING_BEAM:
                        case ENT_CLIENT_GAUNTLET:
                                if(self.HookRange)
                                        b = view_origin + view_forward * self.HookRange;
@@ -113,7 +117,8 @@ void Draw_GrapplingHook()
                                a = self.velocity;
                                b = self.origin;
                                break;
-                       case ENT_CLIENT_LGBEAM:
+                       case ENT_CLIENT_ELECTRO_BEAM:
+                       case ENT_CLIENT_LIGHTNING_BEAM:
                        case ENT_CLIENT_GAUNTLET:
                                a = self.origin;
                                b = self.velocity;
@@ -155,7 +160,13 @@ void Draw_GrapplingHook()
                                rgb = '.3 1 .3';
                        }
                        break;
-               case ENT_CLIENT_LGBEAM:
+               case ENT_CLIENT_ELECTRO_BEAM:
+                       intensity = bound(0.2, 1 + Noise_Pink(self, frametime) * 1 + Noise_Burst(self, frametime, 0.03) * 0.3, 2);
+                       offset = Noise_Brown(self, frametime) * 10;
+                       tex = "particles/lgbeam";
+                       rgb = '1 1 1';
+                       break;
+               case ENT_CLIENT_LIGHTNING_BEAM: // todo
                        intensity = bound(0.2, 1 + Noise_Pink(self, frametime) * 1 + Noise_Burst(self, frametime, 0.03) * 0.3, 2);
                        offset = Noise_Brown(self, frametime) * 10;
                        tex = "particles/lgbeam";
@@ -193,7 +204,8 @@ void Draw_GrapplingHook()
                                self.drawmask = 0;
                        }
                        break;
-               case ENT_CLIENT_LGBEAM:
+               case ENT_CLIENT_ELECTRO_BEAM:
+               case ENT_CLIENT_LIGHTNING_BEAM:
                case ENT_CLIENT_GAUNTLET:
                        setorigin(self, a); // beam origin!
                        break;
@@ -204,8 +216,11 @@ void Draw_GrapplingHook()
                default:
                case ENT_CLIENT_HOOK:
                        break;
-               case ENT_CLIENT_LGBEAM:
-                       pointparticles(particleeffectnum("electro_lightning"), trace_endpos, normalize(atrans - trace_endpos), frametime * intensity);
+               case ENT_CLIENT_ELECTRO_BEAM:
+                       pointparticles(particleeffectnum("electro_lightning"), trace_endpos, normalize(atrans - trace_endpos), frametime * intensity); // todo: new effect
+                       break;
+               case ENT_CLIENT_LIGHTNING_BEAM:
+                       pointparticles(particleeffectnum("electro_lightning"), trace_endpos, normalize(atrans - trace_endpos), frametime * intensity); // todo: new effect
                        break;
                case ENT_CLIENT_GAUNTLET:
                        pointparticles(particleeffectnum("gauntlet_lightning"), b, normalize(a - b), frametime * intensity);
@@ -240,7 +255,8 @@ void Ent_ReadHook(float bIsNew, float type)
                        case ENT_CLIENT_GAUNTLET:
                                self.HookRange = 0;
                                break;
-                       case ENT_CLIENT_LGBEAM:
+                       case ENT_CLIENT_ELECTRO_BEAM:
+                       case ENT_CLIENT_LIGHTNING_BEAM:
                                self.HookRange = ReadCoord();
                                break;
                }
@@ -274,7 +290,10 @@ void Ent_ReadHook(float bIsNew, float type)
                                setmodel(self, "models/hook.md3");
                                self.drawmask = MASK_NORMAL;
                                break;
-                       case ENT_CLIENT_LGBEAM:
+                       case ENT_CLIENT_ELECTRO_BEAM:
+                               sound (self, CH_SHOTS_SINGLE, "weapons/lgbeam_fly.wav", VOL_BASE, ATTN_NORM);
+                               break;
+                       case ENT_CLIENT_LIGHTNING_BEAM:
                                sound (self, CH_SHOTS_SINGLE, "weapons/lgbeam_fly.wav", VOL_BASE, ATTN_NORM);
                                break;
                        case ENT_CLIENT_GAUNTLET:
index b399f3857c3454e3c16572d0aed19a7aea627801..6e3e8027dc33f86d01f17f1c049538fa7cd3e3c6 100644 (file)
@@ -86,17 +86,18 @@ const float ENT_CLIENT_WARPZONE = 24;
 const float ENT_CLIENT_WARPZONE_CAMERA = 25;
 const float ENT_CLIENT_TRIGGER_MUSIC = 26;
 const float ENT_CLIENT_HOOK = 27;
-const float ENT_CLIENT_LGBEAM = 28;
-const float ENT_CLIENT_GAUNTLET = 29;
-const float ENT_CLIENT_ACCURACY = 30;
-const float ENT_CLIENT_SHOWNAMES = 31;
-const float ENT_CLIENT_WARPZONE_TELEPORTED = 32;
-const float ENT_CLIENT_MODEL = 33;
-const float ENT_CLIENT_ITEM = 34;
-const float ENT_CLIENT_BUMBLE_RAYGUN = 35;
-const float ENT_CLIENT_SPAWNPOINT = 36;
-const float ENT_CLIENT_SPAWNEVENT = 37;
-const float ENT_CLIENT_NOTIFICATION = 38;
+const float ENT_CLIENT_ELECTRO_BEAM = 28;
+const float ENT_CLIENT_LIGHTNING_BEAM = 29;
+const float ENT_CLIENT_GAUNTLET = 30;
+const float ENT_CLIENT_ACCURACY = 31;
+const float ENT_CLIENT_SHOWNAMES = 32;
+const float ENT_CLIENT_WARPZONE_TELEPORTED = 33;
+const float ENT_CLIENT_MODEL = 34;
+const float ENT_CLIENT_ITEM = 35;
+const float ENT_CLIENT_BUMBLE_RAYGUN = 36;
+const float ENT_CLIENT_SPAWNPOINT = 37;
+const float ENT_CLIENT_SPAWNEVENT = 38;
+const float ENT_CLIENT_NOTIFICATION = 39;
 
 const float ENT_CLIENT_TURRET = 40;
 const float ENT_CLIENT_AUXILIARYXHAIR = 50;
index dead5a9d4b360d924a0642f4b21fe0161e734ccd..bc6a80fafae97f9d094a8af7289838b68b1e27ff 100644 (file)
@@ -441,6 +441,33 @@ float autocvar_g_balance_laser_secondary_radius;
 float autocvar_g_balance_laser_secondary_speed;
 float autocvar_g_balance_laser_reload_ammo;
 float autocvar_g_balance_laser_reload_time;
+float autocvar_g_balance_lightning_primary_ammo;
+float autocvar_g_balance_lightning_primary_animtime;
+float autocvar_g_balance_lightning_primary_damage;
+float autocvar_g_balance_lightning_primary_edgedamage;
+float autocvar_g_balance_lightning_primary_falloff_halflifedist;
+float autocvar_g_balance_lightning_primary_falloff_maxdist;
+float autocvar_g_balance_lightning_primary_falloff_mindist;
+float autocvar_g_balance_lightning_primary_force;
+float autocvar_g_balance_lightning_primary_lifetime;
+float autocvar_g_balance_lightning_primary_radius;
+float autocvar_g_balance_lightning_primary_range;
+float autocvar_g_balance_lightning_primary_refire;
+float autocvar_g_balance_lightning_primary_speed;
+float autocvar_g_balance_lightning_secondary_ammo;
+float autocvar_g_balance_lightning_secondary_animtime;
+float autocvar_g_balance_lightning_secondary_damage;
+float autocvar_g_balance_lightning_secondary_damageforcescale;
+float autocvar_g_balance_lightning_secondary_edgedamage;
+float autocvar_g_balance_lightning_secondary_flyingdamage;
+float autocvar_g_balance_lightning_secondary_flyingforce;
+float autocvar_g_balance_lightning_secondary_flyingradius;
+float autocvar_g_balance_lightning_secondary_force;
+float autocvar_g_balance_lightning_secondary_health;
+float autocvar_g_balance_lightning_secondary_lifetime;
+float autocvar_g_balance_lightning_secondary_radius;
+float autocvar_g_balance_lightning_secondary_refire;
+float autocvar_g_balance_lightning_secondary_speed;
 float autocvar_g_balance_minelayer_ammo;
 float autocvar_g_balance_minelayer_animtime;
 float autocvar_g_balance_minelayer_damage;
index 036bb45fb6dc48f029212faead961db052d00d12..2908958405e291da418a95a4e739906509171169 100644 (file)
@@ -620,6 +620,10 @@ float ClientInit_SendEntity(entity to, float sf)
        WriteInt24_t(MSG_ENTITY, compressShotOrigin(electro_shotorigin[1]));
        WriteInt24_t(MSG_ENTITY, compressShotOrigin(electro_shotorigin[2]));
        WriteInt24_t(MSG_ENTITY, compressShotOrigin(electro_shotorigin[3]));
+       WriteInt24_t(MSG_ENTITY, compressShotOrigin(lightning_shotorigin[0]));
+       WriteInt24_t(MSG_ENTITY, compressShotOrigin(lightning_shotorigin[1]));
+       WriteInt24_t(MSG_ENTITY, compressShotOrigin(lightning_shotorigin[2]));
+       WriteInt24_t(MSG_ENTITY, compressShotOrigin(lightning_shotorigin[3]));
        WriteInt24_t(MSG_ENTITY, compressShotOrigin(gauntlet_shotorigin[0]));
        WriteInt24_t(MSG_ENTITY, compressShotOrigin(gauntlet_shotorigin[1]));
        WriteInt24_t(MSG_ENTITY, compressShotOrigin(gauntlet_shotorigin[2]));
index 3043a30003a590f713fc6561074605fbf31d236f..9e7fa78a565c89c437f9811c34950f78392585b3 100644 (file)
@@ -654,6 +654,7 @@ void spawnfunc_worldspawn (void)
        InitGameplayMode();
        readlevelcvars();
        GrappleHookInit();
+       LightningInit();
        ElectroInit();
        LaserInit();
 
index df5623f0535a42bd3c5b1a4b04baa0b516aa57b8..5ebd833f8f1d8d311756762ddc60b4064aedd63f 100644 (file)
@@ -77,6 +77,7 @@ portals.qh
 
 g_hook.qh
 w_electro.qh
+w_lightning.qh
 w_laser.qh
 
 scores.qh
index 7f8cb82921ee3ae2a3b068ac331bbff891a13949..50005d9c58ab0a8893785527d94f9cf42f407e64 100644 (file)
@@ -14,8 +14,8 @@ void spawnfunc_ammo_bullets()        { spawnfunc_item_bullets();        }
 // GL -> Mortar
 void spawnfunc_ammo_grenades()       { spawnfunc_item_rockets();        }
 
-// LG -> Electro
-void spawnfunc_weapon_lightning()    { spawnfunc_weapon_electro();      }
+// LG -> Lightning
+//void spawnfunc_weapon_lightning()    { spawnfunc_weapon_electro();      }
 void spawnfunc_ammo_lightning()      { spawnfunc_item_cells();          }
 
 // Plasma -> Hagar
index ac4ef47ed3bc74c009b3b9d79e1433975102c3c7..46af3565e45f18101006185a19d0224383bdc211 100644 (file)
@@ -7,6 +7,7 @@
 #include "w_grenadelauncher.qc"
 #include "w_minelayer.qc"
 #include "w_electro.qc"
+#include "w_lightning.qc"
 #include "w_crylink.qc"
 #include "w_nex.qc"
 #include "w_hagar.qc"
index 649e72374ecc3754ffb6f29b84075854212739e2..0fb6b8898712af384d62413d419460d4a19271e9 100644 (file)
@@ -214,7 +214,7 @@ void W_Electro_Attack2()
 .vector hook_start, hook_end;
 float lgbeam_send(entity to, float sf)
 {
-       WriteByte(MSG_ENTITY, ENT_CLIENT_LGBEAM);
+       WriteByte(MSG_ENTITY, ENT_CLIENT_ELECTRO_BEAM);
        sf = sf & 0x7F;
        if(sound_allowed(MSG_BROADCAST, self.realowner))
                sf |= 0x80;
diff --git a/qcsrc/server/w_lightning.qc b/qcsrc/server/w_lightning.qc
new file mode 100644 (file)
index 0000000..02f2654
--- /dev/null
@@ -0,0 +1,298 @@
+#ifdef REGISTER_WEAPON
+REGISTER_WEAPON(LIGHTNING, w_lightning, IT_CELLS, 5, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "lightning", "lightning", _("Lightning"));
+#else
+#ifdef SVQC
+
+// Declarations ========================= 
+.vector hook_start, hook_end; // used for beam
+.entity lightning_beam; // used for beam
+.float BUTTON_ATCK_prev; // for better animation control
+.float lg_fire_prev; // for better animation control
+
+// Lightning functions ========================= 
+float W_Lightning_Beam_Send(entity to, float sf)
+{
+       WriteByte(MSG_ENTITY, ENT_CLIENT_LIGHTNING_BEAM);
+       sf = sf & 0x7F;
+       if(sound_allowed(MSG_BROADCAST, self.owner))
+               sf |= 0x80;
+       WriteByte(MSG_ENTITY, sf);
+       if(sf & 1)
+       {
+               WriteByte(MSG_ENTITY, num_for_edict(self.owner));
+               WriteCoord(MSG_ENTITY, autocvar_g_balance_lightning_primary_range);
+       }
+       if(sf & 2)
+       {
+               WriteCoord(MSG_ENTITY, self.hook_start_x);
+               WriteCoord(MSG_ENTITY, self.hook_start_y);
+               WriteCoord(MSG_ENTITY, self.hook_start_z);
+       }
+       if(sf & 4)
+       {
+               WriteCoord(MSG_ENTITY, self.hook_end_x);
+               WriteCoord(MSG_ENTITY, self.hook_end_y);
+               WriteCoord(MSG_ENTITY, self.hook_end_z);
+       }
+       return TRUE;
+}
+
+void W_Lightning_Beam_Think()
+{
+       self.owner.lg_fire_prev = time;
+       if (self != self.owner.lightning_beam)
+       {
+               remove(self);
+               return;
+       }
+       if (self.owner.weaponentity.state != WS_INUSE || (self.owner.ammo_cells <= 0 && !(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)) || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK || self.owner.freezetag_frozen)
+       {
+               if(self == self.owner.lightning_beam)
+                       self.owner.lightning_beam = world;
+               remove(self);
+               return;
+       }
+
+       self.nextthink = time;
+
+       makevectors(self.owner.v_angle);
+
+       float dt, f;
+       dt = frametime;
+       if not(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)
+       {
+               if(autocvar_g_balance_lightning_primary_ammo)
+               {
+                       dt = min(dt, self.owner.ammo_cells / autocvar_g_balance_lightning_primary_ammo);
+                       self.owner.ammo_cells = max(0, self.owner.ammo_cells - autocvar_g_balance_lightning_primary_ammo * frametime);
+               }
+       }
+
+       W_SetupShot_Range(self.owner, TRUE, 0, "", 0, autocvar_g_balance_lightning_primary_damage * dt, autocvar_g_balance_lightning_primary_range);
+       WarpZone_traceline_antilag(self.owner, w_shotorg, w_shotend, MOVE_NORMAL, self.owner, ANTILAG_LATENCY(self.owner));
+
+       // apply the damage
+       if(trace_ent)
+       {
+               vector force;
+               force = w_shotdir * autocvar_g_balance_lightning_primary_force;
+
+               f = ExponentialFalloff(autocvar_g_balance_lightning_primary_falloff_mindist, autocvar_g_balance_lightning_primary_falloff_maxdist, autocvar_g_balance_lightning_primary_falloff_halflifedist, vlen(WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos) - w_shotorg));
+
+               if(accuracy_isgooddamage(self.owner, trace_ent))
+                       accuracy_add(self.owner, WEP_LIGHTNING, 0, autocvar_g_balance_lightning_primary_damage * dt * f);
+               Damage (trace_ent, self.owner, self.owner, autocvar_g_balance_lightning_primary_damage * dt * f, WEP_LIGHTNING, trace_endpos, force * dt);
+       }
+
+       // draw effect
+       if(w_shotorg != self.hook_start)
+       {
+               self.SendFlags |= 2;
+               self.hook_start = w_shotorg;
+       }
+       if(w_shotend != self.hook_end)
+       {
+               self.SendFlags |= 4;
+               self.hook_end = w_shotend;
+       }
+}
+
+// Attack functions ========================= 
+void W_Lightning_Attack1 (void)
+{
+       // only play fire sound if 0.5 sec has passed since player let go the fire button
+       if(time - self.lg_fire_prev > 0.5)
+               sound (self, CHAN_WEAPON, "weapons/lgbeam_fire.wav", VOL_BASE, ATTN_NORM);
+
+       entity beam, oldself;
+
+       self.lightning_beam = beam = spawn();
+       beam.classname = "W_Lightning_Beam";
+       beam.solid = SOLID_NOT;
+       beam.think = W_Lightning_Beam_Think;
+       beam.owner = self;
+       beam.movetype = MOVETYPE_NONE;
+       beam.shot_spread = 1;
+       beam.bot_dodge = TRUE;
+       beam.bot_dodgerating = autocvar_g_balance_lightning_primary_damage;
+       Net_LinkEntity(beam, FALSE, 0, W_Lightning_Beam_Send);
+
+       oldself = self;
+       self = beam;
+       self.think();
+       self = oldself;
+}
+
+float w_lightning(float req)
+{
+       if (req == WR_AIM)
+       {
+               self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
+               /*
+               self.BUTTON_ATCK=FALSE;
+               self.BUTTON_ATCK2=FALSE;
+               if(vlen(self.origin-self.enemy.origin) > 1000)
+                       self.bot_aim_whichfiretype = 0;
+               if(self.bot_aim_whichfiretype == 0)
+               {
+                       float shoot;
+
+                       if(autocvar_g_balance_lightning_primary_speed)
+                               shoot = bot_aim(autocvar_g_balance_lightning_primary_speed, 0, autocvar_g_balance_lightning_primary_lifetime, FALSE);
+                       else
+                               shoot = bot_aim(1000000, 0, 0.001, FALSE);
+
+                       if(shoot)
+                       {
+                               self.BUTTON_ATCK = TRUE;
+                               if(random() < 0.01) self.bot_aim_whichfiretype = 1;
+                       }
+               }
+               else // todo
+               {
+                       //if(bot_aim(autocvar_g_balance_lightning_secondary_speed, autocvar_g_balance_grenadelauncher_secondary_speed_up, autocvar_g_balance_lightning_secondary_lifetime, TRUE))
+                       //{
+                       //      self.BUTTON_ATCK2 = TRUE;
+                       //      if(random() < 0.03) self.bot_aim_whichfiretype = 0;
+                       //}
+               }
+               */
+       }
+       else if (req == WR_THINK)
+       {
+               if (self.BUTTON_ATCK)
+               {
+                       if(self.BUTTON_ATCK_prev)
+                               if(self.animstate_startframe == self.anim_shoot_x && self.animstate_numframes == self.anim_shoot_y)
+                                       weapon_thinkf(WFRAME_DONTCHANGE, autocvar_g_balance_lightning_primary_animtime, w_ready);
+                               else
+                                       weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_lightning_primary_animtime, w_ready);
+                       
+                       if (weapon_prepareattack(0, 0))
+                       {
+                               if ((!self.lightning_beam) || wasfreed(self.lightning_beam))
+                                       W_Lightning_Attack1();
+                               
+                               if(!self.BUTTON_ATCK_prev)
+                               {
+                                       weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_lightning_primary_animtime, w_ready);
+                                       self.BUTTON_ATCK_prev = 1;
+                               }
+                       }
+               } 
+               else // todo
+               {
+                       if (self.BUTTON_ATCK_prev != 0)
+                       {
+                               weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_lightning_primary_animtime, w_ready);
+                               ATTACK_FINISHED(self) = time + autocvar_g_balance_lightning_primary_refire * W_WeaponRateFactor();
+                       }
+                       self.BUTTON_ATCK_prev = 0;
+               }
+
+               //if (self.BUTTON_ATCK2)
+                       //if (weapon_prepareattack(1, autocvar_g_balance_lightning_secondary_refire))
+                       //{
+                       //      W_Lightning_Attack2();
+                       //      self.lightning_count = autocvar_g_balance_lightning_secondary_count;
+                       //      weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_lightning_secondary_animtime, w_lightning_checkattack);
+                       //      self.lightning_secondarytime = time + autocvar_g_balance_lightning_secondary_refire2 * W_WeaponRateFactor();
+                       //}
+       }
+       else if (req == WR_PRECACHE)
+       {
+               precache_model ("models/weapons/g_lightning.md3");
+               precache_model ("models/weapons/v_lightning.md3");
+               precache_model ("models/weapons/h_lightning.iqm");
+               //precache_sound ("weapons/lightning_bounce.wav");
+               precache_sound ("weapons/lightning_fire.wav");
+               precache_sound ("weapons/lightning_fire2.wav");
+               precache_sound ("weapons/lightning_impact.wav");
+               //precache_sound ("weapons/lightning_impact_combo.wav");
+               //precache_sound ("weapons/W_Lightning_Beam_fire.wav");
+       }
+       else if (req == WR_SETUP)
+               weapon_setup(WEP_LIGHTNING);
+       else if (req == WR_CHECKAMMO1)
+       {
+               return !autocvar_g_balance_lightning_primary_ammo || (self.ammo_cells > 0);
+       }
+       else if (req == WR_CHECKAMMO2)
+               return self.ammo_cells >= autocvar_g_balance_lightning_secondary_ammo;
+       else if (req == WR_RESETPLAYER)
+       {
+               //self.lightning_secondarytime = time;
+       }
+       return TRUE;
+};
+
+void LightningInit()
+{
+       weapon_action(WEP_LIGHTNING, WR_PRECACHE);
+       lightning_shotorigin[0] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_LIGHTNING), FALSE, FALSE, 1);
+       lightning_shotorigin[1] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_LIGHTNING), FALSE, FALSE, 2);
+       lightning_shotorigin[2] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_LIGHTNING), FALSE, FALSE, 3);
+       lightning_shotorigin[3] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_LIGHTNING), FALSE, FALSE, 4);
+}
+
+void spawnfunc_weapon_lightning (void) // should this really be here?
+{
+       weapon_defaultspawnfunc(WEP_LIGHTNING);
+}
+#endif
+#ifdef CSQC
+float w_lightning(float req)
+{
+       if(req == WR_IMPACTEFFECT)
+       {
+               vector org2;
+               org2 = w_org + w_backoff * 6;
+               
+               if(w_deathtype & HITTYPE_SECONDARY)
+               {
+                       pointparticles(particleeffectnum("lightning_ballexplode"), org2, '0 0 0', 1);
+                       if(!w_issilent)
+                               sound(self, CHAN_PROJECTILE, "weapons/lightning_impact.wav", VOL_BASE, ATTN_NORM);
+               }
+               else
+               {
+                       pointparticles(particleeffectnum("lightning_impact"), org2, '0 0 0', 1);
+                       if(!w_issilent)
+                               sound(self, CHAN_PROJECTILE, "weapons/lightning_impact.wav", VOL_BASE, ATTN_NORM);
+               }
+       }
+       else if(req == WR_PRECACHE)
+       {
+               precache_sound("weapons/lightning_impact.wav");
+               precache_sound("weapons/lightning_impact_combo.wav");
+       }
+       else if (req == WR_SUICIDEMESSAGE)
+       {
+               if(w_deathtype & HITTYPE_SECONDARY)
+                       w_deathtypestring = _("%s could not remember where they put plasma");
+               else
+                       w_deathtypestring = _("%s played with plasma");
+       }
+       else if (req == WR_KILLMESSAGE)
+       {
+               if(w_deathtype & HITTYPE_SECONDARY)
+               {
+                       if(w_deathtype & HITTYPE_SPLASH) // unchecked: BOUNCE
+                               w_deathtypestring = _("%s just noticed %s's blue ball");
+                       else // unchecked: BOUNCE
+                               w_deathtypestring = _("%s got in touch with %s's blue ball");
+               }
+               else
+               {
+                       if(w_deathtype & HITTYPE_BOUNCE) // combo
+                               w_deathtypestring = _("%s felt the electrifying air of %s's combo");
+                       else if(w_deathtype & HITTYPE_SPLASH)
+                               w_deathtypestring = _("%s got too close to %s's blue beam");
+                       else
+                               w_deathtypestring = _("%s was blasted by %s's blue beam");
+               }
+       }
+       return TRUE;
+}
+#endif
+#endif
diff --git a/qcsrc/server/w_lightning.qh b/qcsrc/server/w_lightning.qh
new file mode 100644 (file)
index 0000000..57d6ceb
--- /dev/null
@@ -0,0 +1,2 @@
+void LightningInit();
+vector lightning_shotorigin[4];