Merge branch 'master' into Mario/monsters
authorMario <mario.mario@y7mail.com>
Fri, 16 Aug 2013 00:27:19 +0000 (10:27 +1000)
committerMario <mario.mario@y7mail.com>
Fri, 16 Aug 2013 00:27:19 +0000 (10:27 +1000)
28 files changed:
1  2 
defaultXonotic.cfg
effectinfo.txt
gamemodes.cfg
monsters.cfg
qcsrc/client/View.qc
qcsrc/client/projectile.qc
qcsrc/common/constants.qh
qcsrc/common/deathtypes.qh
qcsrc/common/notifications.qh
qcsrc/server/autocvars.qh
qcsrc/server/cl_client.qc
qcsrc/server/cl_physics.qc
qcsrc/server/cl_player.qc
qcsrc/server/cl_weaponsystem.qc
qcsrc/server/defs.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_world.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mutators/base.qh
qcsrc/server/mutators/gamemode_freezetag.qc
qcsrc/server/mutators/mutator_dodging.qc
qcsrc/server/mutators/mutator_minstagib.qc
qcsrc/server/mutators/mutators.qh
qcsrc/server/progs.src
qcsrc/server/sv_main.qc
qcsrc/server/t_items.qc
qcsrc/server/teamplay.qc
scripts/shaderlist.txt

@@@ -1579,8 -1509,8 +1517,9 @@@ exec turrets.cf
  exec vehicles.cfg
  exec crosshairs.cfg
  exec gamemodes.cfg
+ exec mutators.cfg
  exec notifications.cfg
 +exec monsters.cfg
  
  // load console command aliases and settings
  exec commands.cfg
diff --cc effectinfo.txt
@@@ -7978,42 -7978,975 +7978,974 @@@ alpha 190 190 18
  sizeincrease -80
  color 0xFFFFFF 0xFFFFFF
  
- // waypoint_link_red - red waypoint linking effect
- effect waypoint_link_red
- countabsolute 1
- type beam
- tex 200 200
 -
+ // nade effects
+ 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 64
- color 0xFF0F0F 0xFF0F0F
- sizeincrease 1
+ alpha 256 256 256
+ gravity -0.125
+ bounce 1.5
+ liquidfriction 4
+ velocityjitter 16 16 16
  
- // waypoint_link_blue - blue waypoint linking effect
- effect waypoint_link_blue
- countabsolute 1
- type beam
- tex 200 200
+ 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 64
- color 0x0F0FFF 0x0F0FFF
- sizeincrease 1
+ alpha 256 256 256
+ gravity -0.125
+ bounce 1.5
+ liquidfriction 4
+ velocityjitter 16 16 16
  
- // waypoint_link_yellow - yellow waypoint linking effect
- effect waypoint_link_yellow
- countabsolute 1
- type beam
- tex 200 200
- size 1 1
- alpha 256 256 64
+ effect nade_yellow
+ trailspacing 1
+ type smoke
  color 0xFFFF0F 0xFFFF0F
- sizeincrease 1
+ tex 65 65
+ size 3 3
+ sizeincrease -1
+ alpha 100 100 250
+ //gravity -0.11
+ // fire
+ effect nade_yellow
+ notunderwater
+ trailspacing 8
+ type smoke
+ color 0xFFFF0F 0xFFFF0F
+ tex 65 65
+ size 15 25
+ sizeincrease -10
+ alpha 30 30 150
+ // bubbles
+ effect nade_yellow
+ underwater
+ trailspacing 16
+ type bubble
+ tex 62 62
+ color 0xFFFF0F 0xFFFF0F
+ size 1 1
+ alpha 256 256 256
+ gravity -0.125
+ bounce 1.5
+ liquidfriction 4
+ velocityjitter 16 16 16
  
- // waypoint_link_pink - pink waypoint linking effect
- effect waypoint_link_pink
- countabsolute 1
- type beam
- tex 200 200
+ effect nade_pink
+ trailspacing 1
+ type smoke
+ color 0xFF0FFF 0xFF0FFF
+ tex 65 65
+ size 3 3
+ sizeincrease -1
+ alpha 100 100 250
+ //gravity -0.11
+ // fire
+ effect nade_pink
+ notunderwater
+ trailspacing 8
+ type smoke
+ color 0xFF0FFF 0xFF0FFF
+ tex 65 65
+ size 15 25
+ sizeincrease -10
+ alpha 30 30 150
+ // bubbles
+ effect nade_pink
+ underwater
+ trailspacing 16
+ type bubble
+ tex 62 62
+ color 0xFF0FFF 0xFF0FFF
  size 1 1
- alpha 256 256 64
+ alpha 256 256 256
+ gravity -0.125
+ bounce 1.5
+ liquidfriction 4
+ velocityjitter 16 16 16
+ effect nade
+ trailspacing 1
+ type smoke
+ color 0xFFFFFF 0xFFFFFF
+ tex 65 65
+ size 3 3
+ sizeincrease -1
+ alpha 100 100 250
+ //gravity -0.11
+ // fire
+ effect nade
+ notunderwater
+ trailspacing 8
+ type smoke
+ color 0xFFFFFF 0xFFFFFF
+ tex 65 65
+ size 15 25
+ sizeincrease -10
+ alpha 30 30 150
+ // bubbles
+ effect nade
+ underwater
+ trailspacing 16
+ type bubble
+ tex 62 62
+ color 0xFFFFFF 0xFFFFFF
+ 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_yellow_burn
+ trailspacing 1
+ type smoke
+ color 0xFFFF0F 0xFFFF0F
+ tex 65 65
+ size 5 5
+ sizeincrease -1
+ alpha 100 100 250
+ //gravity -0.11
+ // fire
+ effect nade_yellow_burn
+ notunderwater
+ trailspacing 64
+ type smoke
+ color 0xFFFF0F 0xFFFF0F
+ tex 65 65
+ size 45 25
+ sizeincrease -30
+ alpha 200 200 1000
+ // bubbles
+ effect nade_yellow_burn
+ underwater
+ trailspacing 16
+ type bubble
+ tex 62 62
+ color 0xFFFF0F 0xFFFF0F
+ size 1 1
+ alpha 256 256 256
+ gravity -0.125
+ bounce 1.5
+ liquidfriction 4
+ velocityjitter 16 16 16
+ effect nade_yellow_burn
+ trailspacing 16
+ type smoke
+ color 0xFFFF0F 0xFFFF0F
+ tex 33 33
+ size 25 25
+ sizeincrease -30
+ effect nade_pink_burn
+ trailspacing 1
+ type smoke
  color 0xFF0FFF 0xFF0FFF
- sizeincrease 1
+ tex 65 65
+ size 5 5
+ sizeincrease -1
+ alpha 100 100 250
+ //gravity -0.11
+ // fire
+ effect nade_pink_burn
+ notunderwater
+ trailspacing 64
+ type smoke
+ color 0xFF0FFF 0xFF0FFF
+ tex 65 65
+ size 45 25
+ sizeincrease -30
+ alpha 200 200 1000
+ // bubbles
+ effect nade_pink_burn
+ underwater
+ trailspacing 16
+ type bubble
+ tex 62 62
+ color 0xFF0FFF 0xFF0FFF
+ size 1 1
+ alpha 256 256 256
+ gravity -0.125
+ bounce 1.5
+ liquidfriction 4
+ velocityjitter 16 16 16
+ effect nade_pink_burn
+ trailspacing 16
+ type smoke
+ color 0xFF0FFF 0xFF0FFF
+ tex 33 33
+ size 25 25
+ sizeincrease -30
+ effect nade_burn
+ trailspacing 1
+ type smoke
+ color 0xFFFFFF 0xFFFFFF
+ tex 65 65
+ size 5 5
+ sizeincrease -1
+ alpha 100 100 250
+ //gravity -0.11
+ // fire
+ effect nade_burn
+ notunderwater
+ trailspacing 64
+ type smoke
+ color 0xFFFFFF 0xFFFFFF
+ tex 65 65
+ size 45 25
+ sizeincrease -30
+ alpha 200 200 1000
+ // bubbles
+ effect nade_burn
+ underwater
+ trailspacing 16
+ type bubble
+ tex 62 62
+ color 0xFFFFFF 0xFFFFFF
+ size 1 1
+ alpha 256 256 256
+ gravity -0.125
+ bounce 1.5
+ liquidfriction 4
+ velocityjitter 16 16 16
+ effect nade_burn
+ trailspacing 16
+ type smoke
+ color 0xFFFFFF 0xFFFFFF
+ 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
+ effect nade_yellow_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_yellow_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_yellow_explode
+ notunderwater
+ count 16
+ type smoke
+ color 0xFFFF0F 0xFFFF0F
+ 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_yellow_explode
+ count 8
+ type spark
+ tex 48 55
+ color 0xFFFF0F 0xFFFF0F
+ size 60 90
+ alpha 1500 3000 13000
+ stretchfactor 80
+ sizeincrease 40
+ velocityjitter 30 30 30
+ airfriction -9
+ //smoke
+ effect nade_yellow_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_yellow_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_yellow_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_yellow_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_yellow_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
+ effect nade_pink_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_pink_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_pink_explode
+ notunderwater
+ count 16
+ type smoke
+ color 0xFF0FFF 0xFF0FFF
+ 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_pink_explode
+ count 8
+ type spark
+ tex 48 55
+ color 0xFF0FFF 0xFF0FFF
+ size 60 90
+ alpha 1500 3000 13000
+ stretchfactor 80
+ sizeincrease 40
+ velocityjitter 30 30 30
+ airfriction -9
+ //smoke
+ effect nade_pink_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_pink_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_pink_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_pink_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_pink_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
+ effect nade_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_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_explode
+ notunderwater
+ count 16
+ type smoke
+ color 0xFFFFFF 0xFFFFFF
+ 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_explode
+ count 8
+ type spark
+ tex 48 55
+ color 0xFFFFFF 0xFFFFFF
+ size 60 90
+ alpha 1500 3000 13000
+ stretchfactor 80
+ sizeincrease 40
+ velocityjitter 30 30 30
+ airfriction -9
+ //smoke
+ effect nade_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_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_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_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_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
diff --cc gamemodes.cfg
Simple merge
diff --cc monsters.cfg
index 6589064,0000000..598e25d
mode 100644,000000..100644
--- /dev/null
@@@ -1,209 -1,0 +1,209 @@@
- set g_monster_zombie_attack_leap_damage 45 "Damage when zombie performs an attack leap"
 +// Misc
 +set g_monsters 1 "Enable monsters (master switch)"
 +set g_monsters_think_delay 0.1 "Delay between monster think frames"
 +set g_monsters_skill 1 "Monster skill (affecting some of their attributes). 1 - easy, 2 - medium, 3 - hard, 4 - insane, 5 - nightmare"
 +set g_monsters_miniboss_chance 5
 +set g_monsters_miniboss_healthboost 100
 +set g_monsters_forcedrop 0 "Force all monsters to drop this item on death. Use g_monsters_drop_* cvars to change forced drop item"
 +set g_monsters_drop_time 10 "Amount of time before monster's dropped loot disappears"
 +set g_monsters_drop_type armor "Type of item to drop when forced. Possible values are: health, armor, ammo"
 +set g_monsters_drop_size medium "Size of the item monsters drop. Possible health/amor values are: small, medium, large. Possible ammo values are: shells, bullets, cells, rockets"
 +set g_monsters_owners 1 "Monsters will not attack their owners in team matches if set to 1"
 +set g_monsters_teams 1
 +set g_monsters_spawnshieldtime 2 "Monsters will not take damage for this amount of seconds"
 +set g_monsters_typefrag 1
 +set g_monsters_healthbars 1 "Show health bars above monsters"
 +set g_monsters_target_range 2000
 +set g_monsters_target_infront 0 "Only find targets infront of the monster"
 +set g_monsters_respawn 1 "Enable monster respawning"
 +set g_monsters_respawn_delay 20 "Monsters respawn in this amount of seconds"
 +set g_monsters_score_kill 1 "Get this many points for killing a naturally spawned monster"
 +set g_monsters_max 20 "Global maximum player-spawned monsters"
 +set g_monsters_max_perplayer 0 "Maximum monsters per-player"
 +set g_monsters_skill_easy 2 "Monster easy skill level (used for skill based functions)"
 +set g_monsters_skill_normal 4 "Monster normal skill level (used for skill based functions)"
 +set g_monsters_skill_hard 5 "Monster hard skill level (used for skill based functions)"
 +set g_monsters_skill_insane 7 "Monster insane skill level (used for skill based functions)"
 +set g_monsters_skill_nightmare 10 "Monster nightmare skill level (used for skill based functions)"
 +
 +// Brute
 +set g_monster_brute 1 "Enable Brutes"
 +set g_monster_brute_health 200 "Brute health"
 +set g_monster_brute_chainsaw_damage 15 "Brute chainsaw damage (hits multiple times)"
 +set g_monster_brute_drop ammo "Brute drops this item on death"
 +set g_monster_brute_drop_size bullets "Size of the item Brutes drop. Possible values are: small, medium, large"
 +set g_monster_brute_speed_walk 100 "Brute walk speed"
 +set g_monster_brute_speed_run 150 "Brute run speed"
 +set g_monster_brute_attack_uzi_bullets 3 "Number of machine gun bullets Brute fires"
 +set g_monster_brute_attack_uzi_chance 0.1 "Chance for Brute to fire machine gun"
 +set g_monster_brute_attack_uzi_damage 10 "Brute machine gun damage per bullet"
 +set g_monster_brute_attack_uzi_force 5 "Brute machine gun knockback"
 +set g_monster_brute_attack_grenade_damage 50 "Brute grenade damage"
 +set g_monster_brute_attack_grenade_edgedamage 25 "Brute grenade indirect hit damage"
 +set g_monster_brute_attack_grenade_radius 200 "Brute grenade explosion radius"
 +set g_monster_brute_attack_grenade_force 15 "Brute grenade knockback"
 +
 +// Animus
 +set g_monster_animus 1 "Enable Animuses"
 +set g_monster_animus_health 300 "Animus health"
 +set g_monster_animus_attack_jump_damage 40 "Animus jump attack damage"
 +set g_monster_animus_damage 20 "Animus melee attack damage"
 +set g_monster_animus_drop health "Animus drops this item on death"
 +set g_monster_animus_drop_size medium "Size of the item Animuses drop. Possible values are: small, medium, large"
 +set g_monster_animus_speed_walk 150 "Animus walk speed"
 +set g_monster_animus_speed_run 300 "Animus run speed"
 +
 +// Shambler
 +set g_monster_shambler 1 "Enable Shamblers"
 +set g_monster_shambler_health 600 "Shambler health"
 +set g_monster_shambler_damage 50 "Shambler melee attack damage"
 +set g_monster_shambler_attack_lightning_damage 20 "Shambler lightning attack damage per frame"
 +set g_monster_shambler_attack_claw_damage 30 "Shambler claw attack damage"
 +set g_monster_shambler_drop health "Shambler drops this item on death"
 +set g_monster_shambler_drop_size large "Size of the item Shamblers drop. Possible values are: small, medium, large"
 +set g_monster_shambler_speed_walk 100 "Shambler walk speed"
 +set g_monster_shambler_speed_run 150 "Shambler run speed"
 +
 +// Bruiser
 +set g_monster_bruiser 1 "Enable Bruisers"
 +set g_monster_bruiser_health 75 "Bruiser Health"
 +set g_monster_bruiser_drop armor "Bruiser drops this item on death"
 +set g_monster_bruiser_drop_size medium "Size of the item Bruisers drop. Possible values are: small, medium, large"
 +set g_monster_bruiser_melee_damage 20 "Bruiser melee attack damage"
 +set g_monster_bruiser_melee_side_damage 10 "Bruiser melee attack side damage"
 +set g_monster_bruiser_speed_walk 40 "Bruiser walk speed"
 +set g_monster_bruiser_speed_run 70 "Bruiser run speed"
 +
 +// Wyvern
 +set g_monster_wyvern 1 "Enable Wyverns"
 +set g_monster_wyvern_health 80 "Wyvern health"
 +set g_monster_wyvern_drop ammo "Wyvern drops this item on death"
 +set g_monster_wyvern_drop_size cells "Size of the item Wyverns drop. Possible values are: small, medium, large"
 +set g_monster_wyvern_speed_walk 40 "Wyvern walk speed"
 +set g_monster_wyvern_speed_run 70 "Wyvern run speed"
 +set g_monster_wyvern_fireball_damagetime 3 "How long the enemy will burn if it's within fireball radius"
 +set g_monster_wyvern_fireball_damage 30 "Wyvern fireball projectile damage"
 +set g_monster_wyvern_fireball_edgedamage 20 "Wyvern fireball indirect hit damage"
 +set g_monster_wyvern_fireball_force 50 "Wyvern fireball projectile push force"
 +set g_monster_wyvern_fireball_radius 70 "Wyvern fireball projectile damage radius"
 +set g_monster_wyvern_fireball_speed 400 "Wyvern fireball projectile speed"
 +
 +// Cerberus
 +set g_monster_cerberus 1 "Enable Cerberuses"
 +set g_monster_cerberus_health 25 "Cerberus health"
 +set g_monster_cerberus_bite_damage 15 "Cerberus bite attack damage"
 +set g_monster_cerberus_attack_jump_damage 30 "Cerberus jump attack damage"
 +set g_monster_cerberus_drop health "Cerberus drops this item on death"
 +set g_monster_cerberus_drop_size small "Size of the item Cerberuss drop. Possible values are: small, medium, large"
 +set g_monster_cerberus_speed_walk 60 "Cerberus walk speed"
 +set g_monster_cerberus_speed_run 120 "Cerberus run speed"
 +
 +// Slime
 +set g_monster_slime 1 "Enable Slime"
 +set g_monster_slime_health 80 "Slime health"
 +set g_monster_slime_drop ammo "Slime drops this item when it explodes"
 +set g_monster_slime_drop_size rockets "Size of the item Slime drops. Possible values are: small, medium, large"
 +set g_monster_slime_speed_walk 20 "Slime walk speed"
 +set g_monster_slime_speed_run 30 "Slime run speed"
 +
 +// Knight
 +set g_monster_knight 1 "Enable Knights"
 +set g_monster_knight_health 250 "Knight health"
 +set g_monster_knight_drop armor "Knight drops this item on death"
 +set g_monster_knight_drop_size medium "Size of the item Knights drop. Possible values are: small, medium, large"
 +set g_monster_knight_inferno_damage 40 "Knight inferno damage"
 +set g_monster_knight_inferno_chance 0.4 "Knight inferno attack chance"
 +set g_monster_knight_inferno_damagetime 3 "How long the inferno should burn the player"
 +set g_monster_knight_fireball_damage 30 "Knight fireball projectile damage"
 +set g_monster_knight_fireball_edgedamage 10 "Knight fireball indirect hit damage"
 +set g_monster_knight_fireball_force 50 "Knight fireball projectile push force"
 +set g_monster_knight_fireball_radius 70 "Knight fireball projectile damage radius"
 +set g_monster_knight_fireball_speed 600 "Knight fireball projectile speed"
 +set g_monster_knight_fireball_spread 0 "Knight fireball projectile spread"
 +set g_monster_knight_fireball_chance 0.3 "Chance for Knight to throw a fireball"
 +set g_monster_knight_jump_chance 0.2 "Chance for Knight to jump at the player (always 1 if enemy is further than _dist)"
 +set g_monster_knight_jump_damage 25 "Knight jump attack damage"
 +set g_monster_knight_jump_dist 500 "Knight will prioritise jumping if the enemy is this far away"
 +set g_monster_knight_melee_damage 20 "Knight melee attack damage"
 +set g_monster_knight_spike_damage 5 "Knight spike projectile damage"
 +set g_monster_knight_spike_edgedamage 5 "Knight spike projectile indirect hit damage"
 +set g_monster_knight_spike_radius 20 "Knight spike projectile damage radius"
 +set g_monster_knight_spike_force 5 "Knight spike projectile force"
 +set g_monster_knight_spike_chance 0.5 "Knight spike attack chance"
 +set g_monster_knight_speed_walk 75 "Knight walk speed"
 +set g_monster_knight_speed_run 150 "Knight run speed"
 +
 +// Stingray
 +set g_monster_stingray 1 "Enable Stingray"
 +set g_monster_stingray_health 25 "Stingray health"
 +set g_monster_stingray_damage 10 "Stingray bite attack damage"
 +set g_monster_stingray_drop health "Stingray drops this item on death"
 +set g_monster_stingray_drop_size small "Size of the item Stingray drop. Possible values are: small, medium, large"
 +set g_monster_stingray_speed_walk 40 "Stingray walk speed"
 +set g_monster_stingray_speed_run 70 "Stingray run speed"
 +
 +// Mage
 +set g_monster_mage 1 "Enable Mages"
 +set g_monster_mage_health 200 "Mage health"
 +set g_monster_mage_drop health "Mage drops this item on death"
 +set g_monster_mage_drop_size medium "Size of the item Mages drop. Possible values are: small, medium, large"
 +set g_monster_mage_speed 50 "Mage move speed"
 +set g_monster_mage_attack_spike_damage 30 "Mage homing spike explosion damage"
 +set g_monster_mage_attack_spike_radius 60 "Mage homing spike explosion radius"
 +set g_monster_mage_attack_spike_delay 2 "Delay between Mage homing spike attacks"
 +set g_monster_mage_attack_melee_damage 30 "Mage magic attack damage"
 +set g_monster_mage_attack_melee_delay 0.7 "Delay between Mage melee attacks"
 +set g_monster_mage_heal_self 35 "Amount of health Mage will regenerate every attack when its low on health"
 +set g_monster_mage_heal_friends 15 "Amount of health Mage will regenerate nearby friends"
 +set g_monster_mage_heal_minhealth 250 "Health limit below which Mage will try to heal itself"
 +set g_monster_mage_heal_range 200 "Maximum healing distance"
 +set g_monster_mage_heal_delay 1.5 "Delay between healing bursts"
 +set g_monster_mage_shield_blockpercent 40 "% of damage inflicted on Mage if using a force field"
 +set g_monster_mage_shield_delay 7 "Refire for Mage force shield"
 +set g_monster_mage_shield_time 3 "Amount of time Mage force field lasts"
 +set g_monster_mage_attack_grenade_damage 25 "Mage fake item grenade attack damage"
 +set g_monster_mage_attack_grenade_edgedamage 20 "Mage fake item grenade attack edge damage"
 +set g_monster_mage_attack_grenade_radius 100 "Mage fake item grenade attack explosion radius"
 +set g_monster_mage_attack_grenade_lifetime 5 "Mage fake item grenade life time"
 +set g_monster_mage_attack_grenade_speed 150 "Mage fake item grenade forward speed"
 +set g_monster_mage_attack_grenade_speed_up 95 "Mage fake item grenade upwards speed"
 +set g_monster_mage_attack_grenade_speed_z 0 "Mage fake item grenade speed angle"
 +set g_monster_mage_attack_grenade_spread 0 "Mage fake item grenade spread"
 +set g_monster_mage_attack_grenade_force 170 "Mage fake item grenade damage knockback"
 +set g_monster_mage_attack_grenade_chance 30 "% chance of Mage attack being fake item grenade"
 +
 +// Zombie
 +set g_monster_zombie 1 "Enable Zombies"
- set g_monster_zombie_attack_stand_damage 35 "Damage when zombie hits from a standing position"
++set g_monster_zombie_attack_leap_damage 50 "Damage when zombie performs an attack leap"
 +set g_monster_zombie_attack_leap_delay 1.5 "Delay after zombie attack leap"
 +set g_monster_zombie_attack_leap_force 55 "Force of zombie attack leap"
 +set g_monster_zombie_attack_leap_range 96 "Range of zombie attack leap"
 +set g_monster_zombie_attack_leap_speed 500 "The speed of a zombie attack leap"
- set g_monster_zombie_health 200 "Zombie health"
++set g_monster_zombie_attack_stand_damage 40 "Damage when zombie hits from a standing position"
 +set g_monster_zombie_attack_stand_delay 1.2 "Delay after a zombie hits from a standing position"
 +set g_monster_zombie_attack_stand_range 48 "Range of a zombie standing position attack"
++set g_monster_zombie_health 150 "Zombie health"
 +set g_monster_zombie_speed_walk 150 "Zombie walk speed"
 +set g_monster_zombie_speed_run 400 "Zombie run speed"
 +set g_monster_zombie_stopspeed 100 "Speed at which zombie stops"
 +set g_monster_zombie_drop health "Zombie drops this item on death"
 +set g_monster_zombie_drop_size large "Size of the item zombies drop. Possible values are: small, medium, large"
 +
 +// Spider
 +set g_monster_spider 1 "Enable Spiders"
 +set g_monster_spider_attack_type 0 "Spider attack type (0 = ice, 1 = fire, ...)"
 +set g_monster_spider_attack_leap_delay 1.5 "Delay after spider attack leap"
 +set g_monster_spider_attack_stand_damage 35 "Damage when spider hits from a standing position"
 +set g_monster_spider_attack_stand_delay 1.2 "Delay after a spider hits from a standing position"
 +set g_monster_spider_attack_fire_time 2 "Spider fire attack burn time"
 +set g_monster_spider_attack_web_speed 1000 "Spider web fly speed"
 +set g_monster_spider_attack_web_speed_up 150 "Spider web upwards fly speed"
 +set g_monster_spider_attack_web_spread 0 "Spider web spread"
 +set g_monster_spider_attack_web_speed_z 0 "Spider web upwards angle"
 +set g_monster_spider_health 200 "Spider health"
 +set g_monster_spider_idle_timer_min 1 "Minimum time a spider can stay idle"
 +set g_monster_spider_speed_walk 150 "Spider walk speed"
 +set g_monster_spider_speed_run 400 "Spider run speed"
 +set g_monster_spider_stopspeed 100 Speed at which spider stops"
 +set g_monster_spider_drop health "Spider drops this item on death"
 +set g_monster_spider_drop_size large "Size of the item spiders drop. Possible values are: small, medium, large"
Simple merge
Simple merge
@@@ -363,8 -355,17 +363,19 @@@ float PROJECTILE_WAKICANNON     = 29
  float PROJECTILE_BUMBLE_GUN     = 30;
  float PROJECTILE_BUMBLE_BEAM    = 31;
  
 +float PROJECTILE_MAGE_SPIKE           = 32;
 +
+ float PROJECTILE_NADE_RED             = 50;
+ float PROJECTILE_NADE_RED_BURN        = 51;
+ float PROJECTILE_NADE_BLUE            = 52;
+ float PROJECTILE_NADE_BLUE_BURN       = 53;
+ float PROJECTILE_NADE_YELLOW          = 54;
+ float PROJECTILE_NADE_YELLOW_BURN     = 55;
+ float PROJECTILE_NADE_PINK            = 56;
+ float PROJECTILE_NADE_PINK_BURN       = 57;
+ float PROJECTILE_NADE                         = 58;
+ float PROJECTILE_NADE_BURN                    = 59;
  float SPECIES_HUMAN        =  0;
  float SPECIES_ROBOT_SOLID  =  1;
  float SPECIES_ALIEN        =  2;
        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_MONSTER_CERBERUS_BITE,  DEATH_SELF_MON_CERBERUS_BITE,           DEATH_MURDER_MONSTER,              DEATH_MONSTER_FIRST) \
 +      DEATHTYPE(DEATH_MONSTER_CERBERUS_JUMP,  DEATH_SELF_MON_CERBERUS_JUMP,           DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_ANIMUS,                 DEATH_SELF_MON_ANIMUS,                          DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_STINGRAY,               DEATH_SELF_MON_STINGRAY,                        DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_KNIGHT_CRUSH,   DEATH_SELF_MON_KNIGHT_CRUSH,            DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_KNIGHT_FBALL,   DEATH_SELF_MON_KNIGHT_FBALL,            DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_KNIGHT_INFERNO, DEATH_SELF_MON_KNIGHT_INFERNO,          DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_KNIGHT_MELEE,   DEATH_SELF_MON_KNIGHT_MELEE,            DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_KNIGHT_SPIKE,   DEATH_SELF_MON_KNIGHT_SPIKE,            DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_BRUISER,                DEATH_SELF_MON_BRUISER,                         DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_BRUTE_BLADE,    DEATH_SELF_MON_BRUTE_BLADE,                     DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_BRUTE_GRENADE,  DEATH_SELF_MON_BRUTE_GRENADE,           DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_BRUTE_UZI,              DEATH_SELF_MON_BRUTE_UZI,                       DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_MAGE,                   DEATH_SELF_MON_MAGE,                            DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_SHAMBLER_CLAW,  DEATH_SELF_MON_SHAMBLER_CLAW,           DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_SHAMBLER_SMASH, DEATH_SELF_MON_SHAMBLER_SMASH,          DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_SHAMBLER_ZAP,   DEATH_SELF_MON_SHAMBLER_ZAP,            DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_SPIDER,                 DEATH_SELF_MON_SPIDER,                          DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_SPIDER_FIRE,    DEATH_SELF_MON_SPIDER_FIRE,                     DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_SLIME,                  DEATH_SELF_MON_SLIME,                           DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_WYVERN,                 DEATH_SELF_MON_WYVERN,                          DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_ZOMBIE_JUMP,    DEATH_SELF_MON_ZOMBIE_JUMP,                     DEATH_MURDER_MONSTER,              NORMAL_POS) \
 +      DEATHTYPE(DEATH_MONSTER_ZOMBIE_MELEE,   DEATH_SELF_MON_ZOMBIE_MELEE,            DEATH_MURDER_MONSTER,              DEATH_MONSTER_LAST) \
+       DEATHTYPE(DEATH_NADE,                                   DEATH_SELF_NADE,                                        DEATH_MURDER_NADE,                         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) \
@@@ -263,7 -263,7 +263,8 @@@ 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_MONSTER,           3, 2, "spree_inf s1 s2 s3loc spree_end", "",       "",                             _("^BG%s%s^K1 was pushed infront of a monster by ^BG%s^K1%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_MURDER_NADE,              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"), "") \
        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_MON_CERBERUS_BITE,   2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was mauled by a Cerberus%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_CERBERUS_JUMP,   2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 didn't see the pouncing Cerberus%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ANIMUS,          2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was eviscerated by an Animus%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_STINGRAY,        2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was fatally wounded by a Stingray%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_KNIGHT_CRUSH,    2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was crushed by a pouncing Knight%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_KNIGHT_FBALL,    2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was turned to ash by a Knight%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_KNIGHT_INFERNO,  2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was burned to death by a Knight%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_KNIGHT_MELEE,    2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was slain by a Knight%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_KNIGHT_SPIKE,    2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was cursed by a Knight%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_BRUISER,             2, 1, "s1 s2loc spree_lost", "s1",           "notify_death",                 _("^BG%s^K1 was beaten in a fistfight by a Bruiser%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_BRUTE_BLADE,     2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was cut down by a Brute%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_BRUTE_GRENADE,   2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 almost dodged a Brute's grenade%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_BRUTE_UZI,           2, 1, "s1 s2loc spree_lost", "s1",           "notify_death",                 _("^BG%s^K1 was nailed by a Brute%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_MAGE,                2, 1, "s1 s2loc spree_lost", "s1",           "notify_death",                 _("^BG%s^K1 was exploded by a Mage%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SHAMBLER_CLAW,   2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1's innards became outwards by a Shambler%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SHAMBLER_SMASH,  2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was smashed by a Shambler%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SHAMBLER_ZAP,    2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was zapped to death by a Shambler%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SPIDER,              2, 1, "s1 s2loc spree_lost", "s1",           "notify_death",                 _("^BG%s^K1 was bitten by a Spider%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SPIDER_FIRE,     2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was incinerated by a Spider%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SLIME,           2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was blown up by a Slime%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_WYVERN,          2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was fireballed by a Wyvern%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ZOMBIE_JUMP,     2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 joins the Zombies%s%s\n"), "") \
 +      MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ZOMBIE_MELEE,    2, 1, "s1 s2loc spree_lost", "s1",               "notify_death",                 _("^BG%s^K1 was given kung fu lessons by a Zombie%s%s\n"), "") \
+       MSG_INFO_NOTIF(1, INFO_DEATH_SELF_NADE,                2, 1, "s1 s2loc spree_lost", "s1",       "notify_death",         _("^BG%s^K1 mastered the art of self-nading%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"), "") \
        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_MONSTER,          0, 0, "",             NO_CPID,             "0 0", _("^K1You were killed by a monster!"), _("^K1You need to watch out for monsters!")) \
+       MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_NADE,                             0, 0, "",                         NO_CPID,                         "0 0", _("^K1You forgot to put the pin back in!"), _("^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!"), "") \
        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_MONSTER,                 NO_MSG,        INFO_DEATH_MURDER_MONSTER,                 CENTER_DEATH_SELF_MONSTER) \
+       MSG_MULTI_NOTIF(1, DEATH_MURDER_NADE,                    NO_MSG,        INFO_DEATH_MURDER_NADE,                   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) \
        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_MON_CERBERUS_BITE,                 NO_MSG,        INFO_DEATH_SELF_MON_CERBERUS_BITE,                 CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_CERBERUS_JUMP,                 NO_MSG,        INFO_DEATH_SELF_MON_CERBERUS_JUMP,                 CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_ANIMUS,                                NO_MSG,        INFO_DEATH_SELF_MON_ANIMUS,                                CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_STINGRAY,                              NO_MSG,        INFO_DEATH_SELF_MON_STINGRAY,                      CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_KNIGHT_CRUSH,                  NO_MSG,        INFO_DEATH_SELF_MON_KNIGHT_CRUSH,                  CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_KNIGHT_FBALL,              NO_MSG,        INFO_DEATH_SELF_MON_KNIGHT_FBALL,              CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_KNIGHT_INFERNO,                NO_MSG,        INFO_DEATH_SELF_MON_KNIGHT_INFERNO,            CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_KNIGHT_MELEE,              NO_MSG,        INFO_DEATH_SELF_MON_KNIGHT_MELEE,              CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_KNIGHT_SPIKE,              NO_MSG,        INFO_DEATH_SELF_MON_KNIGHT_SPIKE,              CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_BRUISER,                               NO_MSG,        INFO_DEATH_SELF_MON_BRUISER,                       CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_BRUTE_BLADE,                   NO_MSG,        INFO_DEATH_SELF_MON_BRUTE_BLADE,                   CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_BRUTE_GRENADE,                 NO_MSG,        INFO_DEATH_SELF_MON_BRUTE_GRENADE,                 CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_BRUTE_UZI,                     NO_MSG,        INFO_DEATH_SELF_MON_BRUTE_UZI,                     CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_MAGE,                                  NO_MSG,        INFO_DEATH_SELF_MON_MAGE,                                  CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SHAMBLER_CLAW,                 NO_MSG,        INFO_DEATH_SELF_MON_SHAMBLER_CLAW,                 CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SHAMBLER_SMASH,                NO_MSG,        INFO_DEATH_SELF_MON_SHAMBLER_SMASH,                CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SHAMBLER_ZAP,                  NO_MSG,        INFO_DEATH_SELF_MON_SHAMBLER_ZAP,                  CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SPIDER,                                NO_MSG,        INFO_DEATH_SELF_MON_SPIDER,                                CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SPIDER_FIRE,                   NO_MSG,        INFO_DEATH_SELF_MON_SPIDER_FIRE,                   CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SLIME,                                 NO_MSG,        INFO_DEATH_SELF_MON_SLIME,                                 CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_WYVERN,                                NO_MSG,        INFO_DEATH_SELF_MON_WYVERN,                                CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_ZOMBIE_JUMP,                   NO_MSG,        INFO_DEATH_SELF_MON_ZOMBIE_JUMP,                   CENTER_DEATH_SELF_MONSTER) \
 +      MSG_MULTI_NOTIF(1, DEATH_SELF_MON_ZOMBIE_MELEE,                  NO_MSG,        INFO_DEATH_SELF_MON_ZOMBIE_MELEE,                  CENTER_DEATH_SELF_MONSTER) \
+       MSG_MULTI_NOTIF(1, DEATH_SELF_NADE,                                              NO_MSG,                INFO_DEATH_SELF_NADE,                                      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) \
@@@ -1259,8 -1234,26 +1259,31 @@@ float autocvar_g_touchexplode_radius
  float autocvar_g_touchexplode_damage;
  float autocvar_g_touchexplode_edgedamage;
  float autocvar_g_touchexplode_force;
 +float autocvar_g_invasion_round_timelimit;
 +float autocvar_g_invasion_round_limit;
 +float autocvar_g_invasion_warmup;
 +float autocvar_g_invasion_monster_count;
 +float autocvar_g_invasion_zombies_only;
+ #define autocvar_g_bloodloss cvar("g_bloodloss")
+ float autocvar_g_random_gravity_negative_chance;
+ float autocvar_g_random_gravity_min;
+ float autocvar_g_random_gravity_max;
+ float autocvar_g_random_gravity_positive;
+ float autocvar_g_random_gravity_negative;
+ float autocvar_g_random_gravity_delay;
+ float autocvar_g_nades;
+ float autocvar_g_nades_spawn;
+ float autocvar_g_nades_nade_lifetime;
+ float autocvar_g_nades_nade_minforce;
+ float autocvar_g_nades_nade_maxforce;
+ float autocvar_g_nades_nade_health;
+ float autocvar_g_nades_nade_refire;
+ float autocvar_g_nades_nade_damage;
+ float autocvar_g_nades_nade_edgedamage;
+ float autocvar_g_nades_nade_radius;
+ float autocvar_g_nades_nade_force;
+ float autocvar_g_nades_nade_newton_style;
+ float autocvar_g_campcheck_damage;
+ float autocvar_g_campcheck_distance;
+ float autocvar_g_campcheck_interval;
+ float autocvar_g_jump_grunt;
@@@ -2374,11 -2346,9 +2365,9 @@@ void PlayerPreThink (void
                float do_crouch = self.BUTTON_CROUCH;
                if(self.hook.state)
                        do_crouch = 0;
-               if(self.health <= g_bloodloss)
-                       do_crouch = 1;
                if(self.vehicle)
                        do_crouch = 0;
 -              if(self.freezetag_frozen)
 +              if(self.frozen)
                        do_crouch = 0;
                if(self.weapon == WEP_SHOTGUN && self.weaponentity.wframe == WFRAME_FIRE2 && time < self.weapon_nextthink)
                        do_crouch = 0;
@@@ -23,13 -19,16 +19,19 @@@ When you press the jump ke
  */
  void PlayerJump (void)
  {
 +      if(self.frozen)
 +              return; // no jumping in freezetag when frozen
++              
+       float doublejump = FALSE;
  
-       float mjumpheight;
-       float doublejump;
+       player_multijump = doublejump;
+       if(MUTATOR_CALLHOOK(PlayerJump))
+               return;
+               
+       doublejump = player_multijump;
  
-       doublejump = FALSE;
+       float mjumpheight;
+       
        if (autocvar_sv_doublejump)
        {
                tracebox(self.origin + '0 0 0.01', self.mins, self.maxs, self.origin - '0 0 0.01', MOVE_NORMAL, self);
@@@ -847,12 -784,6 +787,19 @@@ void SV_PlayerPhysics(
        self.disableclientprediction = 0;
        if(time < self.ladder_time)
                self.disableclientprediction = 1;
-               self.movement = '0 0 0';
 +              
 +      if(self.frozen)
 +      {
++              if(autocvar_sv_dodging_frozen && IS_REAL_CLIENT(self))
++              {
++                      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;
 +      }
  
        MUTATOR_CALLHOOK(PlayerPhysics);
  
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge
@@@ -477,10 -519,39 +477,21 @@@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPr
        return 1;
  }
  
 -MUTATOR_HOOKFUNCTION(freezetag_PlayerPhysics)
 -{
 -      if(self.freezetag_frozen)
 -      {
 -              if(autocvar_sv_dodging_frozen && IS_REAL_CLIENT(self))
 -              {
 -                      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;
 -}
 -
  MUTATOR_HOOKFUNCTION(freezetag_PlayerDamage_Calculate)
  {
 -      if(frag_target.freezetag_frozen && frag_deathtype != DEATH_HURTTRIGGER)
 +      if(frag_target.frozen == 1 && frag_deathtype != DEATH_HURTTRIGGER)
        {
+               if(autocvar_g_freezetag_revive_falldamage > 0)
+               if(frag_deathtype == DEATH_FALL)
+               if(frag_damage >= autocvar_g_freezetag_revive_falldamage)
+               {
+                       freezetag_Unfreeze(frag_target);
+                       frag_target.health = autocvar_g_freezetag_revive_falldamage_health;
+                       pointparticles(particleeffectnum("iceorglass"), frag_target.origin, '0 0 0', 3);
+                       Send_Notification(NOTIF_ALL, world, MSG_INFO, INFO_FREEZETAG_REVIVED_FALL, frag_target.netname);
+                       Send_Notification(NOTIF_ONE, frag_target, MSG_CENTER, CENTER_FREEZETAG_REVIVE_FALL);
+               }
+       
                frag_damage = 0;
                frag_force = frag_force * autocvar_g_freezetag_frozen_force;
        }
@@@ -39,6 -33,10 +33,10 @@@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhys
        float new_velocity_gain;
        float velocity_difference;
        float clean_up_and_do_nothing;
 -      if(self.freezetag_frozen)
+       float horiz_speed = autocvar_sv_dodging_horiz_speed;
+       
++      if(self.frozen)
+               horiz_speed = autocvar_sv_dodging_horiz_speed_frozen;
  
      if (self.deadflag != DEAD_NO)
          return 0;
@@@ -170,6 -168,9 +168,9 @@@ MUTATOR_HOOKFUNCTION(dodging_GetPressed
  
        tap_direction_x = 0;
        tap_direction_y = 0;
 -      frozen_dodging = (self.freezetag_frozen && autocvar_sv_dodging_frozen);
+       
+       float frozen_dodging;
++      frozen_dodging = (self.frozen && autocvar_sv_dodging_frozen);
  
        float dodge_detected;
        if (g_dodging == 0)
Simple merge
@@@ -45,8 -45,8 +45,9 @@@ mutators/gamemode_keyhunt.qh // TODO fi
  mutators/gamemode_keepaway.qh
  mutators/gamemode_nexball.qh 
  mutators/gamemode_lms.qh
 +mutators/gamemode_invasion.qh
  mutators/mutator_dodging.qh
+ mutators/mutator_nades.qh
  
  //// tZork Turrets ////
  tturrets/include/turrets_early.qh
Simple merge
Simple merge
Simple merge
@@@ -14,5 -14,4 +14,6 @@@ tre
  tuba
  turrets
  weapons
 +barricade
 +monsters
+ ok_nade_counter