]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into Mario/rifle_arena
authorMario <mario.mario@y7mail.com>
Wed, 5 Jun 2013 00:31:52 +0000 (10:31 +1000)
committerMario <mario.mario@y7mail.com>
Wed, 5 Jun 2013 00:31:52 +0000 (10:31 +1000)
37 files changed:
defaultXonotic.cfg
effectinfo.txt
models/ok_nade_counter/ok_nade_counter.md3 [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter.md3_0.skin [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter.md3_1.skin [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter.md3_2.skin [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter.md3_3.skin [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter.md3_4.skin [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter.md3_5.skin [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter.md3_6.skin [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter.md3_7.skin [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter.md3_8.skin [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter.md3_9.skin [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter_01.tga [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter_02.tga [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter_03.tga [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter_04.tga [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter_05.tga [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter_06.tga [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter_07.tga [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter_08.tga [new file with mode: 0644]
models/ok_nade_counter/ok_nade_counter_09.tga [new file with mode: 0644]
qcsrc/client/projectile.qc
qcsrc/common/constants.qh
qcsrc/common/deathtypes.qh
qcsrc/common/notifications.qh
qcsrc/server/autocvars.qh
qcsrc/server/cl_physics.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mutators/gamemode_freezetag.qc
qcsrc/server/mutators/mutator_dodging.qc
qcsrc/server/mutators/mutator_dodging.qh
qcsrc/server/mutators/mutator_riflearena.qc [new file with mode: 0644]
qcsrc/server/mutators/mutators.qh
qcsrc/server/progs.src
scripts/ok_nade_counter.shader [new file with mode: 0644]
scripts/shaderlist.txt

index 66ac0b20b23ce711a0efa48b3f022781676ecbe1..3428112b113964db8af748dd7c1aa182bfde10d8 100644 (file)
@@ -463,10 +463,12 @@ set sv_dodging_wall_dodging 0 "set to 1 to allow dodging off walls. 0 to disable
 set sv_dodging_delay 0.5 "determines how long a player has to wait to be able to dodge again after dodging"
 set sv_dodging_up_speed 200 "the jump velocity of the dodge"
 set sv_dodging_horiz_speed 400 "the horizontal velocity of the dodge"
+set sv_dodging_horiz_speed_frozen 200 "the horizontal velocity of the dodge (while frozen)"
 set sv_dodging_ramp_time 0.1 "a ramp so that the horizontal part of the dodge is added smoothly (seconds)"
 set sv_dodging_height_threshold 10 "the maximum height above ground where to allow dodging"
 set sv_dodging_wall_distance_threshold 10 "the maximum distance from a wall that still allows dodging"
 set sv_dodging_sound 1 "if 1 dodging makes a sound. if 0 dodging is silent"
+set sv_dodging_frozen 0 "allow dodging while frozen"
 
 set g_spawn_alloweffects 1 "allow clients to enable spawn point and event effects such as particles and sounds, see cl_spawn_ cvars for more info"
 set g_spawn_furthest 1 "this amount of the spawns shall be far away from any players"
@@ -1601,3 +1603,21 @@ set cl_weapon_stay_color "2 0.5 0.5" "Color of picked up weapons when g_weapon_s
 set cl_weapon_stay_alpha 0.75 "Alpha of picked up weapons when g_weapon_stay > 0"
 
 seta g_superspectate 0 "server side, allows extended spectator functions through the cmd interface. followpowerup, followstrength, followstshield or followfc [red|blue] will transfer spectation to the relevent player, if any"
+
+set g_riflearena 0
+set g_riflearena_nades 1
+set g_riflearena_nade_lifetime 3.5
+set g_riflearena_nade_damage 225
+set g_riflearena_nade_edgedamage 90
+set g_riflearena_nade_radius 300
+set g_riflearena_nade_force 650
+set g_riflearena_nade_health 25
+set g_riflearena_nade_newton_style 0
+set g_riflearena_nade_minforce 400
+set g_riflearena_nade_maxforce 2000
+set g_riflearena_nade_refire 6
+set g_riflearena_rifle_secondary_spread 0
+set g_riflearena_rifle_secondary_shots 1
+set g_riflearena_rifle_secondary_animtime 0.15
+set g_riflearena_rifle_secondary_refire 0.15
+set g_riflearena_rifle_secondary_damage 40
index c2f702fa5ab243ac7d032a8583bb07e0c8d82570..52b67739a0ae03a68e7e276757fd38f033fe8651 100644 (file)
@@ -7778,6 +7778,398 @@ alpha 190 190 180
 sizeincrease -80
 color 0x0000FF 0x000097
 
+// nades
+effect nade_blue
+trailspacing 1
+type smoke
+color 0x006cff 0x0600ff
+tex 65 65
+size 3 3
+sizeincrease -1
+alpha 100 100 250
+//gravity -0.11
+// fire
+effect nade_blue
+notunderwater
+trailspacing 8
+type smoke
+color 0x0600ff 0x9794ff
+tex 65 65
+size 15 25
+sizeincrease -10
+alpha 30 30 150
+// bubbles
+effect nade_blue
+underwater
+trailspacing 16
+type bubble
+tex 62 62
+color 0x006cff 0x0600ff
+size 1 1
+alpha 256 256 256
+gravity -0.125
+bounce 1.5
+liquidfriction 4
+velocityjitter 16 16 16
+
+effect nade_red
+trailspacing 1
+type smoke
+color 0xff0000 0xff3c00
+tex 65 65
+size 3 3
+sizeincrease -1
+alpha 100 100 250
+//gravity -0.11
+// fire
+effect nade_red
+notunderwater
+trailspacing 8
+type smoke
+color 0xff0000 0xffa2a2
+tex 65 65
+size 15 25
+sizeincrease -10
+alpha 30 30 150
+// bubbles
+effect nade_red
+underwater
+trailspacing 16
+type bubble
+tex 62 62
+color 0xff0000 0xff3c00
+size 1 1
+alpha 256 256 256
+gravity -0.125
+bounce 1.5
+liquidfriction 4
+velocityjitter 16 16 16
+
+effect nade_red_burn
+trailspacing 1
+type smoke
+color 0xff0000 0xff3c00
+tex 65 65
+size 5 5
+sizeincrease -1
+alpha 100 100 250
+//gravity -0.11
+// fire
+effect nade_red_burn
+notunderwater
+trailspacing 64
+type smoke
+color 0xff0000 0xffa2a2
+tex 65 65
+size 45 25
+sizeincrease -30
+alpha 200 200 1000
+// bubbles
+effect nade_red_burn
+underwater
+trailspacing 16
+type bubble
+tex 62 62
+color 0xff0000 0xff3c00
+size 1 1
+alpha 256 256 256
+gravity -0.125
+bounce 1.5
+liquidfriction 4
+velocityjitter 16 16 16
+effect nade_red_burn
+trailspacing 16
+type smoke
+color 0xff0000 0xff3c00
+tex 71 73
+size 15 25
+sizeincrease -40
+rotate -180 180 20 -20
+originjitter 2 2 2
+velocityjitter 10 10 10
+alpha 300 900 1500
+
+effect nade_blue_burn
+trailspacing 1
+type smoke
+color 0x006cff 0x0600ff
+tex 65 65
+size 5 5
+sizeincrease -1
+alpha 100 100 250
+//gravity -0.11
+// fire
+effect nade_blue_burn
+notunderwater
+trailspacing 64
+type smoke
+color 0x0600ff 0x9794ff
+tex 65 65
+size 45 25
+sizeincrease -30
+alpha 200 200 1000
+// bubbles
+effect nade_blue_burn
+underwater
+trailspacing 16
+type bubble
+tex 62 62
+color 0x006cff 0x0600ff
+size 1 1
+alpha 256 256 256
+gravity -0.125
+bounce 1.5
+liquidfriction 4
+velocityjitter 16 16 16
+effect nade_blue_burn
+trailspacing 16
+type smoke
+color 0x006cff 0x0600ff
+tex 33 33
+size 25 25
+sizeincrease -30
+
+effect nade_blue_explode
+countabsolute 1
+type decal
+tex 8 16
+size 88 88
+alpha 256 256 0
+originjitter 26 26 26
+lightradius 300
+lightradiusfade 1500
+lightcolor 20 20 100
+// shockwave
+effect nade_blue_explode
+type smoke
+countabsolute 1
+tex 33 33
+size 32 32
+sizeincrease 1800
+color 0x80C0FF 0x80C0FF
+alpha 80 80 650
+velocitymultiplier 44
+// fire
+effect nade_blue_explode
+notunderwater
+count 16
+type smoke
+color 0x629dff 0x0018ff
+tex 48 55
+size 20 24
+sizeincrease 555
+alpha 400 656 2000
+airfriction 30
+originjitter 50 50 50
+velocityjitter 320 320 320
+rotate -180 180 -9 9
+// fire streched
+effect nade_blue_explode
+count 8
+type spark
+tex 48 55
+color 0x629dff 0x0018ff
+size 60 90
+alpha 1500 3000 13000
+stretchfactor 80
+sizeincrease 40
+velocityjitter 30 30 30
+airfriction -9
+//smoke
+effect nade_blue_explode
+type smoke
+count 32
+blend alpha
+tex 0 7
+size 60 30
+color 0x222222 0x000000
+alpha 128 328 390
+rotate -180 180 2 -2
+velocityjitter 200 200 200
+velocityoffset 0 0 180
+originjitter 50 50 10
+sizeincrease 50
+airfriction 0.04
+gravity 0.4
+// underwater bubbles
+effect nade_blue_explode
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 6
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 16 16 16
+velocityjitter 196 196 196
+rotate 0 0 0 0
+// bouncing sparks
+effect nade_blue_explode
+notunderwater
+count 8
+type spark
+tex 40 40
+color 0x006cff 0x0600ff
+size 1 2
+alpha 644 956 484
+gravity 1
+airfriction 1
+bounce 1.6
+liquidfriction 0.8
+velocityoffset 0 0 80
+originjitter 16 16 16
+velocityjitter 424 424 624
+// notbouncing sparks
+effect nade_blue_explode
+count 16
+type spark
+tex 40 40
+color 0x006cff 0x0600ff
+size 1 2
+alpha 644 956 684
+gravity 0.5
+airfriction 0.7
+liquidfriction 0.8
+velocityoffset 0 0 80
+originjitter 16 16 16
+velocityjitter 424 424 624
+// derbis
+effect nade_blue_explode
+notunderwater
+count 12
+type alphastatic
+tex 66 68
+color 0x6a3d25 0xcac5b4
+size 2 6
+alpha 644 956 684
+gravity 1.3
+airfriction 0.5
+bounce 1.6
+velocityjitter 324 324 524
+rotate -180 180 -1000 1000
+
+effect nade_red_explode
+countabsolute 1
+type decal
+tex 8 16
+size 88 88
+alpha 256 256 0
+originjitter 26 26 26
+lightradius 300
+lightradiusfade 1500
+lightcolor 100 20 20
+// shockwave
+effect nade_red_explode
+type smoke
+countabsolute 1
+tex 33 33
+size 32 32
+sizeincrease 2200
+color 0xff0000 0xffa2a2
+alpha 80 80 650
+velocitymultiplier 44
+// fire
+effect nade_red_explode
+notunderwater
+count 16
+type smoke
+color 0xff0000 0xff4200
+tex 48 55
+size 20 24
+sizeincrease 555
+alpha 400 656 2000
+airfriction 30
+originjitter 50 50 50
+velocityjitter 320 320 320
+rotate -180 180 -9 9
+// fire streched
+effect nade_red_explode
+count 8
+type spark
+tex 48 55
+color 0xff0000 0xff4200
+size 60 90
+alpha 1500 3000 13000
+stretchfactor 80
+sizeincrease 40
+velocityjitter 30 30 30
+airfriction -9
+//smoke
+effect nade_red_explode
+type smoke
+count 32
+blend alpha
+tex 0 7
+size 60 30
+color 0x222222 0x000000
+alpha 128 328 390
+rotate -180 180 2 -2
+velocityjitter 200 200 200
+velocityoffset 0 0 180
+originjitter 50 50 10
+sizeincrease 50
+airfriction 0.04
+gravity 0.4
+// underwater bubbles
+effect nade_red_explode
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 6
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 16 16 16
+velocityjitter 196 196 196
+rotate 0 0 0 0
+// bouncing sparks
+effect nade_red_explode
+notunderwater
+count 8
+type spark
+tex 40 40
+color 0xff0000 0xffa2a2
+size 1 2
+alpha 644 956 484
+gravity 1
+airfriction 1
+bounce 1.6
+liquidfriction 0.8
+velocityoffset 0 0 80
+originjitter 16 16 16
+velocityjitter 424 424 624
+// notbouncing sparks
+effect nade_red_explode
+count 16
+type spark
+tex 40 40
+color 0xff0000 0xffa2a2
+size 1 2
+alpha 644 956 684
+gravity 0.5
+airfriction 0.7
+liquidfriction 0.8
+velocityoffset 0 0 80
+originjitter 16 16 16
+velocityjitter 424 424 624
+// derbis
+effect nade_red_explode
+notunderwater
+count 8
+type smoke
+tex 71 73
+color 0xff0000 0xffa2a2
+size 20 40
+alpha 644 956 2500
+originjitter 64 64 64
+velocityjitter 324 324 324
+rotate -180 180 -100 100
 // spawn_point_red -- red team idle spawn point effect
 effect spawn_point_red
 count 37.5
diff --git a/models/ok_nade_counter/ok_nade_counter.md3 b/models/ok_nade_counter/ok_nade_counter.md3
new file mode 100644 (file)
index 0000000..7bcd7ef
Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter.md3 differ
diff --git a/models/ok_nade_counter/ok_nade_counter.md3_0.skin b/models/ok_nade_counter/ok_nade_counter.md3_0.skin
new file mode 100644 (file)
index 0000000..f510486
--- /dev/null
@@ -0,0 +1 @@
+sprite,models/ok_nade_counter/ok_nade_counter_01
\ No newline at end of file
diff --git a/models/ok_nade_counter/ok_nade_counter.md3_1.skin b/models/ok_nade_counter/ok_nade_counter.md3_1.skin
new file mode 100644 (file)
index 0000000..c7bfc3b
--- /dev/null
@@ -0,0 +1 @@
+sprite,models/ok_nade_counter/ok_nade_counter_02
\ No newline at end of file
diff --git a/models/ok_nade_counter/ok_nade_counter.md3_2.skin b/models/ok_nade_counter/ok_nade_counter.md3_2.skin
new file mode 100644 (file)
index 0000000..ee84c4f
--- /dev/null
@@ -0,0 +1 @@
+sprite,models/ok_nade_counter/ok_nade_counter_03
\ No newline at end of file
diff --git a/models/ok_nade_counter/ok_nade_counter.md3_3.skin b/models/ok_nade_counter/ok_nade_counter.md3_3.skin
new file mode 100644 (file)
index 0000000..df0b108
--- /dev/null
@@ -0,0 +1 @@
+sprite,models/ok_nade_counter/ok_nade_counter_04
\ No newline at end of file
diff --git a/models/ok_nade_counter/ok_nade_counter.md3_4.skin b/models/ok_nade_counter/ok_nade_counter.md3_4.skin
new file mode 100644 (file)
index 0000000..d76d110
--- /dev/null
@@ -0,0 +1 @@
+sprite,models/ok_nade_counter/ok_nade_counter_05
\ No newline at end of file
diff --git a/models/ok_nade_counter/ok_nade_counter.md3_5.skin b/models/ok_nade_counter/ok_nade_counter.md3_5.skin
new file mode 100644 (file)
index 0000000..c25c2b5
--- /dev/null
@@ -0,0 +1 @@
+sprite,models/ok_nade_counter/ok_nade_counter_06
\ No newline at end of file
diff --git a/models/ok_nade_counter/ok_nade_counter.md3_6.skin b/models/ok_nade_counter/ok_nade_counter.md3_6.skin
new file mode 100644 (file)
index 0000000..df03930
--- /dev/null
@@ -0,0 +1 @@
+sprite,models/ok_nade_counter/ok_nade_counter_07
\ No newline at end of file
diff --git a/models/ok_nade_counter/ok_nade_counter.md3_7.skin b/models/ok_nade_counter/ok_nade_counter.md3_7.skin
new file mode 100644 (file)
index 0000000..3021e51
--- /dev/null
@@ -0,0 +1 @@
+sprite,models/ok_nade_counter/ok_nade_counter_08
\ No newline at end of file
diff --git a/models/ok_nade_counter/ok_nade_counter.md3_8.skin b/models/ok_nade_counter/ok_nade_counter.md3_8.skin
new file mode 100644 (file)
index 0000000..e3df814
--- /dev/null
@@ -0,0 +1 @@
+sprite,models/ok_nade_counter/ok_nade_counter_09
\ No newline at end of file
diff --git a/models/ok_nade_counter/ok_nade_counter.md3_9.skin b/models/ok_nade_counter/ok_nade_counter.md3_9.skin
new file mode 100644 (file)
index 0000000..1402b7a
--- /dev/null
@@ -0,0 +1 @@
+sprite,models/ok_nade_counter/ok_nade_counter_10
\ No newline at end of file
diff --git a/models/ok_nade_counter/ok_nade_counter_01.tga b/models/ok_nade_counter/ok_nade_counter_01.tga
new file mode 100644 (file)
index 0000000..c58a70d
Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_01.tga differ
diff --git a/models/ok_nade_counter/ok_nade_counter_02.tga b/models/ok_nade_counter/ok_nade_counter_02.tga
new file mode 100644 (file)
index 0000000..3d91413
Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_02.tga differ
diff --git a/models/ok_nade_counter/ok_nade_counter_03.tga b/models/ok_nade_counter/ok_nade_counter_03.tga
new file mode 100644 (file)
index 0000000..eddb7cb
Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_03.tga differ
diff --git a/models/ok_nade_counter/ok_nade_counter_04.tga b/models/ok_nade_counter/ok_nade_counter_04.tga
new file mode 100644 (file)
index 0000000..7f14db6
Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_04.tga differ
diff --git a/models/ok_nade_counter/ok_nade_counter_05.tga b/models/ok_nade_counter/ok_nade_counter_05.tga
new file mode 100644 (file)
index 0000000..a7cdf8c
Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_05.tga differ
diff --git a/models/ok_nade_counter/ok_nade_counter_06.tga b/models/ok_nade_counter/ok_nade_counter_06.tga
new file mode 100644 (file)
index 0000000..150f061
Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_06.tga differ
diff --git a/models/ok_nade_counter/ok_nade_counter_07.tga b/models/ok_nade_counter/ok_nade_counter_07.tga
new file mode 100644 (file)
index 0000000..36e5c3b
Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_07.tga differ
diff --git a/models/ok_nade_counter/ok_nade_counter_08.tga b/models/ok_nade_counter/ok_nade_counter_08.tga
new file mode 100644 (file)
index 0000000..3f42394
Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_08.tga differ
diff --git a/models/ok_nade_counter/ok_nade_counter_09.tga b/models/ok_nade_counter/ok_nade_counter_09.tga
new file mode 100644 (file)
index 0000000..31219ab
Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_09.tga differ
index fb4fdd5ef24e1fd245486a58d3a69ecf5fae33a8..d3a9af094b9429d6f6c810f4a9c656d1ed347cce 100644 (file)
@@ -101,6 +101,12 @@ void Projectile_Draw()
                        case PROJECTILE_GRENADE_BOUNCING:
                                rot = '0 -1000 0'; // sideways
                                break;
+                       case PROJECTILE_NADE_RED_BURN:
+                       case PROJECTILE_NADE_RED:
+                       case PROJECTILE_NADE_BLUE_BURN:
+                       case PROJECTILE_NADE_BLUE:
+                               rot = self.avelocity; 
+                               break;
                        case PROJECTILE_HOOKBOMB:
                                rot = '1000 0 0'; // forward
                                break;
@@ -124,6 +130,12 @@ void Projectile_Draw()
        trailorigin = self.origin;
        switch(self.cnt)
        {
+               case PROJECTILE_NADE_RED:
+           case PROJECTILE_NADE_RED_BURN:
+           case PROJECTILE_NADE_BLUE:
+           case PROJECTILE_NADE_BLUE_BURN:
+                       trailorigin += v_up * 4;
+                       break;
                case PROJECTILE_GRENADE:
                case PROJECTILE_GRENADE_BOUNCING:
                        trailorigin += v_right * 1 + v_forward * -10;
@@ -300,6 +312,11 @@ void Ent_Projectile()
 
                        case PROJECTILE_BUMBLE_GUN: setmodel(self, "models/elaser.mdl");self.traileffect = particleeffectnum("TR_NEXUIZPLASMA"); break;
                        case PROJECTILE_BUMBLE_BEAM: setmodel(self, "models/elaser.mdl");self.traileffect = particleeffectnum("TR_NEXUIZPLASMA"); break;
+                       
+                       case PROJECTILE_NADE_RED: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_red"); break;
+                       case PROJECTILE_NADE_RED_BURN: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_red_burn"); break;
+                       case PROJECTILE_NADE_BLUE: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_blue"); break;
+                       case PROJECTILE_NADE_BLUE_BURN: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_blue_burn"); break;
 
                        default:
                                error("Received invalid CSQC projectile, can't work with this!");
@@ -334,6 +351,17 @@ void Ent_Projectile()
                                self.mins = '-3 -3 -3';
                                self.maxs = '3 3 3';
                                break;
+                       case PROJECTILE_NADE_RED_BURN:
+                       case PROJECTILE_NADE_RED:
+                       case PROJECTILE_NADE_BLUE_BURN:
+                       case PROJECTILE_NADE_BLUE:
+                               self.mins = '-3 -3 -3';
+                               self.maxs = '3 3 3';
+                               self.move_movetype = MOVETYPE_BOUNCE;
+                               self.move_touch = func_null;
+                               self.scale = 1.5;
+                               self.avelocity = randomvec() * 720;
+                               break;
                        case PROJECTILE_GRENADE_BOUNCING:
                                self.mins = '-3 -3 -3';
                                self.maxs = '3 3 3';
index b399f3857c3454e3c16572d0aed19a7aea627801..411bfa6489e55b69b998fb259cfd34d412113408 100644 (file)
@@ -355,6 +355,11 @@ float PROJECTILE_WAKICANNON     = 29;
 float PROJECTILE_BUMBLE_GUN     = 30;
 float PROJECTILE_BUMBLE_BEAM    = 31;
 
+float PROJECTILE_NADE_RED       = 50;
+float PROJECTILE_NADE_RED_BURN  = 51;
+float PROJECTILE_NADE_BLUE      = 52;
+float PROJECTILE_NADE_BLUE_BURN = 53;
+
 float SPECIES_HUMAN        =  0;
 float SPECIES_ROBOT_SOLID  =  1;
 float SPECIES_ALIEN        =  2;
index f9a9ceba25b1e0df2da7e77db433f5982e644b99..ee3f8bdd12d178cf6494c0cf0db613712f86f07f 100644 (file)
@@ -15,6 +15,7 @@
        DEATHTYPE(DEATH_KILL,                   DEATH_SELF_SUICIDE,                 NO_MSG,                        NORMAL_POS) \
        DEATHTYPE(DEATH_LAVA,                   DEATH_SELF_LAVA,                    DEATH_MURDER_LAVA,             NORMAL_POS) \
        DEATHTYPE(DEATH_MIRRORDAMAGE,           DEATH_SELF_BETRAYAL,                NO_MSG,                        NORMAL_POS) \
+       DEATHTYPE(DEATH_NADE_NORMAL,                    DEATH_SELF_NADE_NORMAL,                         DEATH_MURDER_NADE_NORMAL,          NORMAL_POS) \
        DEATHTYPE(DEATH_NOAMMO,                 DEATH_SELF_NOAMMO,                  NO_MSG,                        NORMAL_POS) \
        DEATHTYPE(DEATH_ROT,                    DEATH_SELF_ROT,                     NO_MSG,                        NORMAL_POS) \
        DEATHTYPE(DEATH_SHOOTING_STAR,          DEATH_SELF_SHOOTING_STAR,           DEATH_MURDER_SHOOTING_STAR,    NORMAL_POS) \
index 9bd8d5e32f4d3a8fd116054977b071aaf1ae3404..d85c1911e0415f728b8465a03a33da372bface8b 100644 (file)
@@ -263,6 +263,7 @@ void Send_Notification_WOVA(
        MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_FALL,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_fall",          _("^BG%s%s^K1 was grounded by ^BG%s^K1%s%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_FIRE,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_death",         _("^BG%s%s^K1 was burnt up into a crisp by ^BG%s^K1%s%s\n"), _("^BG%s%s^K1 felt a little hot from ^BG%s^K1's fire^K1%s%s\n")) \
        MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_LAVA,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_lava",          _("^BG%s%s^K1 was cooked by ^BG%s^K1%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE_NORMAL,       3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_death",         _("^BG%s%s^K1 was blown up by ^BG%s^K1's nade%s%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SHOOTING_STAR,     3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_shootingstar",  _("^BG%s%s^K1 was shot into space by ^BG%s^K1%s%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SLIME,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_slime",         _("^BG%s%s^K1 was slimed by ^BG%s^K1%s%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_SWAMP,             3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "notify_slime",         _("^BG%s%s^K1 was preserved by ^BG%s^K1%s%s\n"), "") \
@@ -291,6 +292,7 @@ void Send_Notification_WOVA(
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_FIRE,                2, 1, "s1 s2loc spree_lost", "s1",       "notify_death",         _("^BG%s^K1 became a bit too crispy%s%s\n"), _("^BG%s^K1 felt a little hot%s%s\n")) \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_GENERIC,             2, 1, "s1 s2loc spree_lost", "s1",       "notify_selfkill",      _("^BG%s^K1 died%s%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_LAVA,                2, 1, "s1 s2loc spree_lost", "s1",       "notify_lava",          _("^BG%s^K1 turned into hot slag%s%s\n"), _("^BG%s^K1 found a hot place%s%s\n")) \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE_NORMAL,             2, 1, "s1 s2loc spree_lost", "",                     "",                                             _("^BG%s^K1 ate their own nade%s%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NOAMMO,              2, 1, "s1 s2loc spree_lost", "s1",       "notify_outofammo",     _("^BG%s^K1 died%s%s. What's the point of living without ammo?\n"), _("^BG%s^K1 ran out of ammo%s%s\n")) \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_ROT,                 2, 1, "s1 s2loc spree_lost", "s1",       "notify_death",         _("^BG%s^K1 rotted away%s%s\n"), "") \
        MSG_INFO_NOTIF(1, INFO_DEATH_SELF_SHOOTING_STAR,       2, 1, "s1 s2loc spree_lost", "s1",       "notify_shootingstar",  _("^BG%s^K1 became a shooting star%s%s\n"), "") \
@@ -473,6 +475,7 @@ void Send_Notification_WOVA(
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_FIRE,             0, 0, "",             NO_CPID,             "0 0", _("^K1You got a little bit too crispy!"), _("^K1You felt a little too hot!")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_GENERIC,          0, 0, "",             NO_CPID,             "0 0", _("^K1You killed your own dumb self!"), _("^K1You need to be more careful!")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_LAVA,             0, 0, "",             NO_CPID,             "0 0", _("^K1You couldn't stand the heat!"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_NADE,                             0, 0, "",                         NO_CPID,                         "0 0", _("^K1You ate your own grenade!"), _("^K1Tastes like chicken!")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_NOAMMO,           0, 0, "",             NO_CPID,             "0 0", _("^K1You were killed for running out of ammo..."), _("^K1You are respawning for running out of ammo...")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_ROT,              0, 0, "",             NO_CPID,             "0 0", _("^K1You grew too old without taking your medicine"), _("^K1You need to preserve your health")) \
        MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_SHOOTING_STAR,    0, 0, "",             NO_CPID,             "0 0", _("^K1You became a shooting star!"), "") \
@@ -534,6 +537,7 @@ void Send_Notification_WOVA(
        MSG_CENTER_NOTIF(1, CENTER_MOTD,                        1, 0, "s1",            CPID_MOTD,             "-1 0", _("^BG%s"), "") \
        MSG_CENTER_NOTIF(1, CENTER_NIX_COUNTDOWN,               0, 2, "item_wepname",  CPID_NIX,              "1 f2", _("^F2^COUNT^BG until weapon change...\nNext weapon: ^F1%s"), "") \
        MSG_CENTER_NOTIF(1, CENTER_NIX_NEWWEAPON,               0, 1, "item_wepname",  CPID_NIX,              "0 0", _("^F2Active weapon: ^F1%s"), "") \
+       MSG_CENTER_NOTIF(1, CENTER_NADE,                                0, 0, "",              NO_CPID,                   "0 0", _("^BGPress ^F2DROPWEAPON^BG again to toss the grenade!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_OVERTIME_FRAG,               0, 0, "",              CPID_OVERTIME,         "0 0", _("^F2Now playing ^F4OVERTIME^F2!\nKeep fragging until we have a winner!"), _("^F2Now playing ^F4OVERTIME^F2!\nKeep scoring until we have a winner!")) \
        MSG_CENTER_NOTIF(1, CENTER_OVERTIME_TIME,               0, 1, "f1time",        CPID_OVERTIME,         "0 0", _("^F2Now playing ^F4OVERTIME^F2!\n^BGAdded ^F4%s^BG to the game!"), "") \
        MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_INVISIBILITY,      0, 0, "",              CPID_POWERUP,          "0 0", _("^F2Invisibility has worn off"), "") \
@@ -561,6 +565,7 @@ void Send_Notification_WOVA(
        MSG_MULTI_NOTIF(1, DEATH_MURDER_FALL,                    NO_MSG,        INFO_DEATH_MURDER_FALL,                    NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_FIRE,                    NO_MSG,        INFO_DEATH_MURDER_FIRE,                    NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_LAVA,                    NO_MSG,        INFO_DEATH_MURDER_LAVA,                    NO_MSG) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_NADE_NORMAL,                     NO_MSG,                INFO_DEATH_MURDER_NADE_NORMAL,                     NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_SHOOTING_STAR,           NO_MSG,        INFO_DEATH_MURDER_SHOOTING_STAR,           NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_SLIME,                   NO_MSG,        INFO_DEATH_MURDER_SLIME,                   NO_MSG) \
        MSG_MULTI_NOTIF(1, DEATH_MURDER_SWAMP,                   NO_MSG,        INFO_DEATH_MURDER_SWAMP,                   NO_MSG) \
@@ -589,6 +594,7 @@ void Send_Notification_WOVA(
        MSG_MULTI_NOTIF(1, DEATH_SELF_FIRE,                      NO_MSG,        INFO_DEATH_SELF_FIRE,                      CENTER_DEATH_SELF_FIRE) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_GENERIC,                   NO_MSG,        INFO_DEATH_SELF_GENERIC,                   CENTER_DEATH_SELF_GENERIC) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_LAVA,                      NO_MSG,        INFO_DEATH_SELF_LAVA,                      CENTER_DEATH_SELF_LAVA) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_NADE_NORMAL,                               NO_MSG,                INFO_DEATH_SELF_NADE_NORMAL,                       CENTER_DEATH_SELF_NADE) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_NOAMMO,                    NO_MSG,        INFO_DEATH_SELF_NOAMMO,                    CENTER_DEATH_SELF_NOAMMO) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_ROT,                       NO_MSG,        INFO_DEATH_SELF_ROT,                       CENTER_DEATH_SELF_ROT) \
        MSG_MULTI_NOTIF(1, DEATH_SELF_SHOOTING_STAR,             NO_MSG,        INFO_DEATH_SELF_SHOOTING_STAR,             CENTER_DEATH_SELF_SHOOTING_STAR) \
index dead5a9d4b360d924a0642f4b21fe0161e734ccd..ef695c3186648eaf6e1800e2e0293f0f8197928b 100644 (file)
@@ -1110,11 +1110,13 @@ float autocvar_sv_defaultplayerskin;
 float autocvar_sv_dodging_delay;
 float autocvar_sv_dodging_height_threshold;
 float autocvar_sv_dodging_horiz_speed;
+float autocvar_sv_dodging_horiz_speed_frozen;
 float autocvar_sv_dodging_ramp_time;
 float autocvar_sv_dodging_sound;
 float autocvar_sv_dodging_up_speed;
 float autocvar_sv_dodging_wall_distance_threshold;
 float autocvar_sv_dodging_wall_dodging;
+float autocvar_sv_dodging_frozen;
 float autocvar_sv_doublejump;
 float autocvar_sv_eventlog;
 float autocvar_sv_eventlog_console;
@@ -1234,3 +1236,14 @@ float autocvar_g_touchexplode_radius;
 float autocvar_g_touchexplode_damage;
 float autocvar_g_touchexplode_edgedamage;
 float autocvar_g_touchexplode_force;
+float autocvar_g_riflearena_nades;
+float autocvar_g_riflearena_nade_lifetime;
+float autocvar_g_riflearena_nade_damage;
+float autocvar_g_riflearena_nade_edgedamage;
+float autocvar_g_riflearena_nade_radius;
+float autocvar_g_riflearena_nade_force;
+float autocvar_g_riflearena_nade_health;
+float autocvar_g_riflearena_nade_newton_style;
+float autocvar_g_riflearena_nade_minforce;
+float autocvar_g_riflearena_nade_maxforce;
+float autocvar_g_riflearena_nade_refire;
index 5ce7b7d475f4d6848442b8fa9761106e5927ed2c..02a3b1c0956b190bff9d1f68ba3c9d805bfd68f4 100644 (file)
@@ -23,7 +23,7 @@ When you press the jump key
 */
 void PlayerJump (void)
 {
-       if(self.freezetag_frozen)
+       if(self.freezetag_frozen && !self.dodging_action)
                return; // no jumping in freezetag when frozen
 
        float mjumpheight;
index f69b133213f50666be3099491ce665f7f9767abf..b0aa2c12dd5884b0d8280b9b105f74ce310e9ec4 100644 (file)
@@ -920,6 +920,7 @@ void readlevelcvars(void)
        CHECK_MUTATOR_ADD("g_vampire", mutator_vampire, !cvar("g_minstagib"));
        CHECK_MUTATOR_ADD("g_superspectate", mutator_superspec, 1);
        CHECK_MUTATOR_ADD("g_sandbox", sandbox, 1);
+    CHECK_MUTATOR_ADD("g_riflearena", mutator_riflearena, !cvar("g_minstagib"));
        
        #undef CHECK_MUTATOR_ADD
        
index 82147826ee56345cad3162601515a20c05e631db..f2923d5434584e0eeebb2dbc40b5f8858bd82ca6 100644 (file)
@@ -523,7 +523,15 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPhysics)
 {
        if(self.freezetag_frozen)
        {
-               self.movement = '0 0 0';
+               if(autocvar_sv_dodging_frozen)
+               {
+                       self.movement_x = bound(-5, self.movement_x, 5);
+                       self.movement_y = bound(-5, self.movement_y, 5);
+                       self.movement_z = bound(-5, self.movement_z, 5);
+               }
+               else
+                       self.movement = '0 0 0';
+                       
                self.disableclientprediction = 1;
        }
        return 1;
index 1d6dd911eb7f958fad79b957c120e06575433530..0101b98c5c477b1be8812ac4086023c5d8982ebf 100644 (file)
 // and to ramp up the dodge acceleration in the physics hook.
 .float last_dodging_time;
 
-// set to 1 to indicate dodging has started.. reset by physics hook after dodge has been done..
-.float dodging_action;
-
 // This is the velocity gain to be added over the ramp time.
 // It will decrease from frame to frame during dodging_action = 1
 // until it's 0.
 .float dodging_velocity_gain;
 
-// the jump part of the dodge cannot be ramped
-.float dodging_single_action;
-
 MUTATOR_HOOKFUNCTION(dodging_GetCvars) {
        GetCvars_handleFloat(get_cvars_s, get_cvars_f, cvar_cl_dodging_timeout, "cl_dodging_timeout");
        return 0;
@@ -39,6 +33,10 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) {
        float new_velocity_gain;
        float velocity_difference;
        float clean_up_and_do_nothing;
+       float horiz_speed = autocvar_sv_dodging_horiz_speed;
+       
+       if(self.freezetag_frozen)
+               horiz_speed = autocvar_sv_dodging_horiz_speed_frozen;
 
     if (self.deadflag != DEAD_NO)
         return 0;
@@ -72,7 +70,7 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) {
        if (common_factor > 1) 
                common_factor = 1;
 
-       new_velocity_gain = self.dodging_velocity_gain - (common_factor * autocvar_sv_dodging_horiz_speed);
+       new_velocity_gain = self.dodging_velocity_gain - (common_factor * horiz_speed);
        if (new_velocity_gain < 0)
                new_velocity_gain = 0;
 
index 8e8be2513d49f90c1a952685ef6e21ae03a49940..9840325d97ce8a0ee71ac932242de069a0e3cabf 100644 (file)
@@ -1,2 +1,7 @@
 float g_dodging;
 
+// set to 1 to indicate dodging has started.. reset by physics hook after dodge has been done..
+.float dodging_action;
+
+// the jump part of the dodge cannot be ramped
+.float dodging_single_action;
diff --git a/qcsrc/server/mutators/mutator_riflearena.qc b/qcsrc/server/mutators/mutator_riflearena.qc
new file mode 100644 (file)
index 0000000..540f70d
--- /dev/null
@@ -0,0 +1,408 @@
+.entity ra_nade;
+.float ra_nade_refire;
+
+float ra_CanThrowNade()
+{
+       if(self.vehicle)
+               return FALSE;
+               
+       if(gameover)
+               return FALSE;
+               
+       if(self.deadflag)
+               return FALSE;
+               
+       if not(IS_PLAYER(self))
+               return FALSE;
+               
+       if not(autocvar_g_riflearena_nades)
+               return FALSE;
+               
+       if(forbidWeaponUse())
+               return FALSE;
+               
+       return TRUE;
+}
+
+void ra_nade_timer_think()
+{
+       self.skin = 8 - (self.owner.wait - time) / (autocvar_g_riflearena_nade_lifetime / 10);
+       self.nextthink = time;
+       if(!self.owner || wasfreed(self.owner))
+               remove(self);
+       
+}
+
+void ra_nade_burn_spawn(entity nade)
+{
+       switch(nade.realowner.team)
+       {
+               case NUM_TEAM_1:
+                       CSQCProjectile(nade, TRUE, PROJECTILE_NADE_RED_BURN, TRUE);
+                       break;
+               case NUM_TEAM_2:
+                       CSQCProjectile(nade, TRUE, PROJECTILE_NADE_BLUE_BURN, TRUE);
+                       break;
+               default:
+                       CSQCProjectile(nade, TRUE, PROJECTILE_NADE_RED_BURN, TRUE);
+                       break;
+       }
+}
+
+void ra_nade_spawn(entity nade)
+{
+       entity timer = spawn();
+       setmodel(timer, "models/ok_nade_counter/ok_nade_counter.md3");
+       setattachment(timer, nade, "");
+       timer.classname = "nade_timer";
+       timer.colormap = nade.colormap;
+       timer.glowmod = nade.glowmod;
+       timer.think = ra_nade_timer_think;
+       timer.nextthink = time;
+       timer.wait = nade.wait;
+       timer.owner = nade;     
+       timer.skin = 10;
+       
+       CSQCProjectile(nade, TRUE, ((nade.realowner.team == NUM_TEAM_2) ? PROJECTILE_NADE_BLUE: PROJECTILE_NADE_RED) , TRUE);
+       
+}
+
+void ra_nade_boom() // TODO: DamageInfo
+{
+       sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTN_NORM);
+       sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+       pointparticles(particleeffectnum((self.realowner.team == NUM_TEAM_2) ? "nade_blue_explode" : "nade_red_explode"), self.origin + '0 0 1', '0 0 0', 1);
+
+
+       self.takedamage = DAMAGE_NO;
+       RadiusDamage(self, self.realowner, autocvar_g_riflearena_nade_damage, autocvar_g_riflearena_nade_edgedamage,
+                                autocvar_g_riflearena_nade_radius, self, autocvar_g_riflearena_nade_force, self.projectiledeathtype, self.enemy);
+
+       remove(self);
+}
+
+void ra_nade_touch()
+{
+       PROJECTILE_TOUCH;
+       setsize(self, '-2 -2 -2', '2 2 2');
+       UpdateCSQCProjectile(self);
+       if(self.health == autocvar_g_riflearena_nade_health)
+       {
+               spamsound(self, CH_SHOTS, strcat("weapons/grenade_bounce", ftos(1 + rint(random() * 5)), ".wav"), VOL_BASE, ATTN_NORM);
+               return;
+       }
+
+       self.enemy = other;
+       ra_nade_boom();
+}
+
+void ra_nade_beep()
+{
+       sound(self, CH_SHOTS_SINGLE, "overkill/grenadebip.wav", VOL_BASE, 0.5 *(ATTN_LARGE + ATTN_MAX));
+       self.think = ra_nade_boom;
+       self.nextthink = max(self.wait, time);
+}
+
+void ra_nade_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+       if(DEATH_ISWEAPON(deathtype, WEP_LASER))
+               return;
+       
+       self.velocity += force;
+
+       if(!damage)
+               return;
+
+       if(self.health == autocvar_g_riflearena_nade_health)
+       {
+               sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, 0.5 *(ATTN_LARGE + ATTN_MAX));
+               self.nextthink = max(time + autocvar_g_riflearena_nade_lifetime, time);
+               self.think = ra_nade_beep;
+       }
+
+       self.health   -= damage;
+       self.realowner = attacker;
+
+       if(self.health <= 0)
+               W_PrepareExplosionByDamage(attacker, ra_nade_boom);
+       else
+               ra_nade_burn_spawn(self);
+}
+
+void ra_toss_nade(entity ent, vector _velocity, float _time)
+{
+       entity _nade = ent.ra_nade;
+       ent.ra_nade = world;
+       
+       setorigin(_nade, gettaginfo(_nade, gettagindex(_nade, "Object001")));
+       setattachment(_nade, world, "");
+       PROJECTILE_MAKETRIGGER(_nade);
+       setsize(_nade, '-16 -16 -16', '16 16 16');
+       _nade.movetype = MOVETYPE_BOUNCE;
+       
+       if(ent.crouch)
+               _nade.velocity = '0 0 -10';
+       else if(autocvar_g_riflearena_nade_newton_style == 1)
+               _nade.velocity = ent.velocity + _velocity;
+       else if(autocvar_g_riflearena_nade_newton_style == 2)
+               _nade.velocity = _velocity;
+       else
+               _nade.velocity = W_CalculateProjectileVelocity(ent.velocity, _velocity, FALSE);
+
+       _nade.solid = SOLID_BBOX;
+       _nade.touch = ra_nade_touch;
+       _nade.health = autocvar_g_riflearena_nade_health;
+       _nade.takedamage = DAMAGE_YES;
+       _nade.event_damage = ra_nade_damage;
+       _nade.teleportable = TRUE;
+
+       ra_nade_spawn(_nade);
+
+       if(_time)
+       {
+               _nade.think = ra_nade_boom;
+               _nade.nextthink = _time;
+       }
+       else
+               _nade.projectiledeathtype = DEATH_NADE_NORMAL;
+
+       ent.ra_nade_refire = time + autocvar_g_riflearena_nade_refire;
+}
+
+void ra_nade_prime()
+{
+       if(self.ra_nade)
+               remove(self.ra_nade);
+       
+       self.ra_nade = spawn();
+       setmodel(self.ra_nade, "models/weapons/h_ok_grenade.iqm");
+       setattachment(self.ra_nade, self.weaponentity, "");
+       self.ra_nade.classname = "nade";
+       self.ra_nade.realowner = self;
+       self.ra_nade.colormap = self.colormap;
+       self.ra_nade.glowmod = self.glowmod;
+       self.ra_nade.wait = time + autocvar_g_riflearena_nade_lifetime;
+       self.ra_nade.cnt = time;
+       self.ra_nade.think = ra_nade_beep;
+       self.ra_nade.nextthink = max(self.ra_nade.wait - 3, time);
+       self.ra_nade.projectiledeathtype = DEATH_NADE_NORMAL;
+}
+
+void ra_SetCvars()
+{
+       cvar_settemp("g_balance_rifle_secondary_spread", ftos(cvar("g_riflearena_rifle_secondary_spread")));
+       cvar_settemp("g_balance_rifle_secondary_shots", ftos(cvar("g_riflearena_rifle_secondary_shots")));
+       cvar_settemp("g_balance_rifle_secondary_animtime", ftos(cvar("g_riflearena_rifle_secondary_animtime")));
+       cvar_settemp("g_balance_rifle_secondary_refire", ftos(cvar("g_riflearena_rifle_secondary_refire")));
+       cvar_settemp("g_balance_rifle_secondary_damage", ftos(cvar("g_riflearena_rifle_secondary_damage")));
+}
+
+MUTATOR_HOOKFUNCTION(ra_VehicleEnter)
+{
+       if(other.ra_nade)
+               ra_toss_nade(other, '0 0 100', max(other.ra_nade.wait, time + 0.05));
+               
+       return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(ra_PlayerDamage)
+{
+       if(IS_PLAYER(frag_attacker))
+       if(IS_PLAYER(frag_target))
+       {
+               if (DEATH_ISWEAPON(frag_deathtype, WEP_LASER))
+               {
+                       if(frag_attacker == frag_target)
+                               frag_damage = 5;
+                       else
+                               frag_damage = 0;
+                       if (frag_target != frag_attacker)
+                       {
+                               if (frag_target.health >= 1 && IS_PLAYER(frag_target))
+                                       centerprint(frag_attacker, "Laser inflicts no damage!");
+                               frag_force = '0 0 0';
+                       }
+               }
+       }
+               
+       return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(ra_PlayerSpawn)
+{
+       WEPSET_CLEAR_E(self);
+       WEPSET_OR_EW(self, WEP_RIFLE);
+       WEPSET_OR_EW(self, WEP_LASER);
+       
+       self.ra_nade_refire = time + 2;
+       
+       return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(ra_FilterItem)
+{
+       switch (self.items)
+       {
+               case IT_5HP:
+               case IT_ARMOR_SHARD:
+                       return FALSE;
+       }
+               
+       return TRUE;
+}
+
+MUTATOR_HOOKFUNCTION(ra_PlayerThink)
+{
+       if(self.ra_nade)
+               if(self.ra_nade.wait - 0.1 <= time)
+                       ra_toss_nade(self, '0 0 0', time + 0.05);
+
+       if(ra_CanThrowNade())
+       if(self.ra_nade_refire < time)
+       {
+               if(self.BUTTON_HOOK)
+               {
+                       if(!self.ra_nade)
+                               ra_nade_prime();
+               }
+               else if(time - self.ra_nade.cnt >= 1)
+               {
+                       if(self.ra_nade)
+                       {
+                               makevectors(self.v_angle);
+                               float _force = time - self.ra_nade.cnt;
+                               _force /= autocvar_g_riflearena_nade_lifetime;
+                               _force = autocvar_g_riflearena_nade_minforce + (_force * (autocvar_g_riflearena_nade_maxforce - autocvar_g_riflearena_nade_minforce));                          
+                               ra_toss_nade(self, (v_forward * 0.7 + v_up * 0.2 + v_right * 0.1) * _force, 0);
+                       }
+               }
+       }
+       
+       self.hasweapon_complain_spam = time + 5; // this isn't needed, so keep it off
+       
+       return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(ra_RemovePlayer)
+{
+       if(self.ra_nade)
+               remove(self.ra_nade);
+               
+       return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(ra_StartItems)
+{
+       start_items |= IT_UNLIMITED_AMMO;
+       start_ammo_nails = 100;
+       
+       g_grappling_hook = 0;
+
+       return FALSE;
+}
+
+MUTATOR_HOOKFUNCTION(ra_PlayerDies)
+{
+       if(self.ra_nade)
+               ra_toss_nade(self, '0 0 100', max(self.ra_nade.wait, time + 0.05));
+
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(ra_ForbidThrowCurrentWeapon)
+{
+       if(!ra_CanThrowNade())
+               return 1;
+
+       if(!self.ra_nade)
+       {
+               if(self.ra_nade_refire < time)
+               {
+                       Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_NADE);
+                       ra_nade_prime();
+                       self.ra_nade_refire  = time + autocvar_g_riflearena_nade_refire;
+               }
+       }
+       else
+       {
+               if(time - self.ra_nade.cnt >= 1)
+               {
+                       makevectors(self.v_angle);
+                       float _force = time - self.ra_nade.cnt;
+                       _force /= autocvar_g_riflearena_nade_lifetime;
+                       _force = autocvar_g_riflearena_nade_minforce + (_force * (autocvar_g_riflearena_nade_maxforce - autocvar_g_riflearena_nade_minforce));
+                       ra_toss_nade(self, (v_forward * 0.75 + v_up * 0.2 + v_right * 0.05) * _force, 0);
+               }
+       }
+       return 1;
+}
+
+MUTATOR_HOOKFUNCTION(ra_BuildMutatorsString)
+{
+       ret_string = strcat(ret_string, ":RA");
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(ra_BuildMutatorsPrettyString)
+{
+       ret_string = strcat(ret_string, ", Rifle Arena");
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(ra_SetModname)
+{
+       modname = "Rifle Arena";
+       return TRUE;
+}
+
+MUTATOR_DEFINITION(mutator_riflearena)
+{
+       MUTATOR_HOOK(VehicleEnter, ra_VehicleEnter, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerDamage_Calculate, ra_PlayerDamage, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerSpawn, ra_PlayerSpawn, CBC_ORDER_ANY);
+       MUTATOR_HOOK(FilterItem, ra_FilterItem, CBC_ORDER_ANY);
+       MUTATOR_HOOK(SetStartItems, ra_StartItems, CBC_ORDER_ANY);
+       MUTATOR_HOOK(MakePlayerObserver, ra_RemovePlayer, CBC_ORDER_ANY);
+       MUTATOR_HOOK(ClientDisconnect, ra_RemovePlayer, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerDies, ra_PlayerDies, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerPreThink, ra_PlayerThink, CBC_ORDER_ANY);
+       MUTATOR_HOOK(ForbidThrowCurrentWeapon, ra_ForbidThrowCurrentWeapon, CBC_ORDER_ANY);
+       MUTATOR_HOOK(BuildMutatorsString, ra_BuildMutatorsString, CBC_ORDER_ANY);
+       MUTATOR_HOOK(BuildMutatorsPrettyString, ra_BuildMutatorsPrettyString, CBC_ORDER_ANY);
+       
+       MUTATOR_ONADD
+       {
+               ra_SetCvars();
+               
+               precache_model("models/ok_nade_counter/ok_nade_counter.md3");
+               
+               precache_model("models/weapons/h_ok_grenade.iqm");
+               precache_model("models/weapons/v_ok_grenade.md3");
+               precache_sound("weapons/rocket_impact.wav");
+               precache_sound("weapons/grenade_bounce1.wav");
+               precache_sound("weapons/grenade_bounce2.wav");
+               precache_sound("weapons/grenade_bounce3.wav");
+               precache_sound("weapons/grenade_bounce4.wav");
+               precache_sound("weapons/grenade_bounce5.wav");
+               precache_sound("weapons/grenade_bounce6.wav");
+               precache_sound("overkill/grenadebip.wav");
+               
+               weapon_action(WEP_LASER, WR_PRECACHE);
+               weapon_action(WEP_RIFLE, WR_PRECACHE);
+               
+               get_weaponinfo(WEP_HOOK).spawnflags |= WEP_FLAG_MUTATORBLOCKED;
+       }
+       
+       MUTATOR_ONROLLBACK_OR_REMOVE
+       {
+               get_weaponinfo(WEP_HOOK).spawnflags &~= WEP_FLAG_MUTATORBLOCKED;
+       }
+       
+       MUTATOR_ONREMOVE
+       {
+               print("This cannot be removed at runtime\n");
+               return -1;
+       }
+
+       return 0;
+}
index 3f9f020affc086c1968fbe80a2bfc64bd9a3d5e3..a6ace7b99fd6326788d860eabf2748eb2270d905 100644 (file)
@@ -21,5 +21,6 @@ MUTATOR_DECLARATION(mutator_vampire);
 MUTATOR_DECLARATION(mutator_superspec);
 MUTATOR_DECLARATION(mutator_minstagib);
 MUTATOR_DECLARATION(mutator_touchexplode);
+MUTATOR_DECLARATION(mutator_riflearena);
 
 MUTATOR_DECLARATION(sandbox);
index df5623f0535a42bd3c5b1a4b04baa0b516aa57b8..8ce3adc7397b5e1d8d1f6c92d04c9016543efc69 100644 (file)
@@ -248,6 +248,7 @@ mutators/sandbox.qc
 mutators/mutator_superspec.qc
 mutators/mutator_minstagib.qc
 mutators/mutator_touchexplode.qc
+mutators/mutator_riflearena.qc
 
 ../warpzonelib/anglestransform.qc
 ../warpzonelib/mathlib.qc
diff --git a/scripts/ok_nade_counter.shader b/scripts/ok_nade_counter.shader
new file mode 100644 (file)
index 0000000..130bee7
--- /dev/null
@@ -0,0 +1,90 @@
+models/ok_nade_counter/ok_nade_counter_01
+{
+       dpnoshadow
+       deformVertexes autosprite
+       dppolygonoffset -6000
+       {
+               map "models/ok_nade_counter/ok_nade_counter_01"
+               blendfunc add
+       }
+}
+models/ok_nade_counter/ok_nade_counter_02
+{
+       dpnoshadow
+       deformVertexes autosprite
+       dppolygonoffset -6000
+       {
+               map "models/ok_nade_counter/ok_nade_counter_02"
+               blendfunc add
+       }
+}
+models/ok_nade_counter/ok_nade_counter_03
+{
+       dpnoshadow
+       deformVertexes autosprite
+       dppolygonoffset -6000
+       {
+               map "models/ok_nade_counter/ok_nade_counter_03"
+               blendfunc add
+       }
+}
+models/ok_nade_counter/ok_nade_counter_04
+{
+       dpnoshadow
+       deformVertexes autosprite
+       dppolygonoffset -6000
+       {
+               map "models/ok_nade_counter/ok_nade_counter_04"
+               blendfunc add
+       }
+}
+models/ok_nade_counter/ok_nade_counter_05
+{
+       dpnoshadow
+       deformVertexes autosprite
+       dppolygonoffset -6000
+       {
+               map "models/ok_nade_counter/ok_nade_counter_05"
+               blendfunc add
+       }
+}
+models/ok_nade_counter/ok_nade_counter_06
+{
+       dpnoshadow
+       deformVertexes autosprite
+       dppolygonoffset -6000
+       {
+               map "models/ok_nade_counter/ok_nade_counter_06"
+               blendfunc add
+       }
+}
+models/ok_nade_counter/ok_nade_counter_07
+{
+       dpnoshadow
+       deformVertexes autosprite
+       dppolygonoffset -6000
+       {
+               map "models/ok_nade_counter/ok_nade_counter_07"
+               blendfunc add
+       }
+}
+models/ok_nade_counter/ok_nade_counter_08
+{
+       dpnoshadow
+       deformVertexes autosprite
+       dppolygonoffset -6000
+       {
+               map "models/ok_nade_counter/ok_nade_counter_08"
+               blendfunc add
+       }
+}
+models/ok_nade_counter/ok_nade_counter_09
+{
+       dpnoshadow
+       deformVertexes autosprite
+       dppolygonoffset -6000
+       {
+               map "models/ok_nade_counter/ok_nade_counter_09"
+               blendfunc add
+       }
+}
\ No newline at end of file
index a73e7e2064a38d6966bb223a7b425037d24b8901..366f24c6d0995654789874c83785eac06273ce11 100644 (file)
@@ -14,3 +14,4 @@ tree
 tuba
 turrets
 weapons
+ok_nade_counter