From 66318bb5b5b81df7106a2e7adac8e5ec2807ca66 Mon Sep 17 00:00:00 2001 From: Mario Date: Wed, 5 Jun 2013 15:59:52 +1000 Subject: [PATCH] Begin making nades a separate mutator --- defaultXonotic.cfg | 13 + effectinfo.txt | 973 ++++++++++++++++++ models/ok_nade_counter/ok_nade_counter.md3 | Bin 0 -> 540 bytes .../ok_nade_counter.md3_0.skin | 1 + .../ok_nade_counter.md3_1.skin | 1 + .../ok_nade_counter.md3_2.skin | 1 + .../ok_nade_counter.md3_3.skin | 1 + .../ok_nade_counter.md3_4.skin | 1 + .../ok_nade_counter.md3_5.skin | 1 + .../ok_nade_counter.md3_6.skin | 1 + .../ok_nade_counter.md3_7.skin | 1 + .../ok_nade_counter.md3_8.skin | 1 + .../ok_nade_counter.md3_9.skin | 1 + models/ok_nade_counter/ok_nade_counter_01.tga | Bin 0 -> 16428 bytes models/ok_nade_counter/ok_nade_counter_02.tga | Bin 0 -> 16428 bytes models/ok_nade_counter/ok_nade_counter_03.tga | Bin 0 -> 16428 bytes models/ok_nade_counter/ok_nade_counter_04.tga | Bin 0 -> 16428 bytes models/ok_nade_counter/ok_nade_counter_05.tga | Bin 0 -> 16428 bytes models/ok_nade_counter/ok_nade_counter_06.tga | Bin 0 -> 16428 bytes models/ok_nade_counter/ok_nade_counter_07.tga | Bin 0 -> 16428 bytes models/ok_nade_counter/ok_nade_counter_08.tga | Bin 0 -> 16428 bytes models/ok_nade_counter/ok_nade_counter_09.tga | Bin 0 -> 16428 bytes qcsrc/client/projectile.qc | 28 + qcsrc/common/constants.qh | 11 + qcsrc/common/deathtypes.qh | 1 + qcsrc/common/notifications.qh | 6 + qcsrc/server/autocvars.qh | 12 + qcsrc/server/cl_weaponsystem.qc | 3 + qcsrc/server/miscfunctions.qc | 1 + qcsrc/server/mutators/mutator_nades.qc | 346 +++++++ qcsrc/server/mutators/mutators.qh | 1 + qcsrc/server/progs.src | 1 + scripts/ok_nade_counter.shader | 90 ++ 33 files changed, 1496 insertions(+) create mode 100644 models/ok_nade_counter/ok_nade_counter.md3 create mode 100644 models/ok_nade_counter/ok_nade_counter.md3_0.skin create mode 100644 models/ok_nade_counter/ok_nade_counter.md3_1.skin create mode 100644 models/ok_nade_counter/ok_nade_counter.md3_2.skin create mode 100644 models/ok_nade_counter/ok_nade_counter.md3_3.skin create mode 100644 models/ok_nade_counter/ok_nade_counter.md3_4.skin create mode 100644 models/ok_nade_counter/ok_nade_counter.md3_5.skin create mode 100644 models/ok_nade_counter/ok_nade_counter.md3_6.skin create mode 100644 models/ok_nade_counter/ok_nade_counter.md3_7.skin create mode 100644 models/ok_nade_counter/ok_nade_counter.md3_8.skin create mode 100644 models/ok_nade_counter/ok_nade_counter.md3_9.skin create mode 100644 models/ok_nade_counter/ok_nade_counter_01.tga create mode 100644 models/ok_nade_counter/ok_nade_counter_02.tga create mode 100644 models/ok_nade_counter/ok_nade_counter_03.tga create mode 100644 models/ok_nade_counter/ok_nade_counter_04.tga create mode 100644 models/ok_nade_counter/ok_nade_counter_05.tga create mode 100644 models/ok_nade_counter/ok_nade_counter_06.tga create mode 100644 models/ok_nade_counter/ok_nade_counter_07.tga create mode 100644 models/ok_nade_counter/ok_nade_counter_08.tga create mode 100644 models/ok_nade_counter/ok_nade_counter_09.tga create mode 100644 qcsrc/server/mutators/mutator_nades.qc create mode 100644 scripts/ok_nade_counter.shader diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg index 66ac0b20b..038f99c15 100644 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@ -1601,3 +1601,16 @@ 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_nades 0 "enable off-hand grenades" +set g_nades_spawn 1 "give nades right away when player spawns rather than delaying entire refire" +set g_nades_nade_lifetime 3.5 +set g_nades_nade_minforce 400 +set g_nades_nade_maxforce 2000 +set g_nades_nade_health 25 +set g_nades_nade_refire 6 +set g_nades_nade_damage 225 +set g_nades_nade_edgedamage 90 +set g_nades_nade_radius 300 +set g_nades_nade_force 650 +set g_nades_nade_newton_style 0 diff --git a/effectinfo.txt b/effectinfo.txt index c2f702fa5..d069d5f0f 100644 --- a/effectinfo.txt +++ b/effectinfo.txt @@ -7977,3 +7977,976 @@ size 100 100 alpha 190 190 180 sizeincrease -80 color 0xFFFFFF 0xFFFFFF + + +// 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 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_yellow +trailspacing 1 +type smoke +color 0xFFFF0F 0xFFFF0F +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 + +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 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 +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 --git a/models/ok_nade_counter/ok_nade_counter.md3 b/models/ok_nade_counter/ok_nade_counter.md3 new file mode 100644 index 0000000000000000000000000000000000000000..7bcd7ef96662614b29fe28f3022a17e10a03aef9 GIT binary patch literal 540 zcmeZt2{7hoU|?{ziiyb2%P+}Hj!8)@NsP(OPf5)wj>*rC&r3{6jZe-m%_~VQLg(w{ zrWgY?Ljfa@M#ecn{t_S-0Sd}6ffO|ytXh+`6+{EE`6Vz#WYBtht+zn5HQ1wS$K-ng!=$*ND6=FLRVArBptr%{!2+Z~-roSkpfEWB z#4muD1E>HJ&iZKKjLwfYFa)Z{1wdvqLnT3Wf&h#U3}2vsVHhF@;RD%!K-m5u1IU3O L8pLOT@_{q}hz3mA literal 0 HcmV?d00001 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 index 000000000..f51048689 --- /dev/null +++ b/models/ok_nade_counter/ok_nade_counter.md3_0.skin @@ -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 index 000000000..c7bfc3b11 --- /dev/null +++ b/models/ok_nade_counter/ok_nade_counter.md3_1.skin @@ -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 index 000000000..ee84c4f24 --- /dev/null +++ b/models/ok_nade_counter/ok_nade_counter.md3_2.skin @@ -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 index 000000000..df0b108a7 --- /dev/null +++ b/models/ok_nade_counter/ok_nade_counter.md3_3.skin @@ -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 index 000000000..d76d11092 --- /dev/null +++ b/models/ok_nade_counter/ok_nade_counter.md3_4.skin @@ -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 index 000000000..c25c2b52d --- /dev/null +++ b/models/ok_nade_counter/ok_nade_counter.md3_5.skin @@ -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 index 000000000..df0393048 --- /dev/null +++ b/models/ok_nade_counter/ok_nade_counter.md3_6.skin @@ -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 index 000000000..3021e514b --- /dev/null +++ b/models/ok_nade_counter/ok_nade_counter.md3_7.skin @@ -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 index 000000000..e3df814e3 --- /dev/null +++ b/models/ok_nade_counter/ok_nade_counter.md3_8.skin @@ -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 index 000000000..1402b7a0b --- /dev/null +++ b/models/ok_nade_counter/ok_nade_counter.md3_9.skin @@ -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 index 0000000000000000000000000000000000000000..c58a70da2264d6e20e6a293bbb71768ac7ed6ec4 GIT binary patch literal 16428 zcmeHOODKI?7(d-oR}3T*luVf2i!x#KpZu>5^0@cndL$(Sk*R?aky48CD33hCKn5sE z24)H)12b0{NKsywOvJwDJ6Y>~XIYPL?S1yS_vWlRt;hHH{eEk0`?2;G2>cLWSxD&T))r9KuJl7v$VA2TwY!}s&aL8<*cl% zIKf~rR_o#G`tR)QsHBp|=jP`8oC{y|lSLXFeLO!!O@DuXe^>?P`uzNCP-Zso@9*>V zPfbk?2Mi4j@iC0&q8%0eSjEG`1Lu~Wo{mkf+E|mAATcqKV_`pwwkQ3=!^0w_a3AAK z9V`Y-xh5wkz084Y{Wmu^N)>PpXS_#8N0ojiLqkIY&vSZus&s#OdEtHxmsq>fuOxyD z7#|H=HEnZXe`4EOKUF|iR~KIsY7F)}KR@U3^YioAq-_&*v)oqtwZIZ1<5E^uCb8;= z($dlxN4=xO%5VuaSwEcDZA)=+v1bjPot?I@&ing2$2H6WN&m>mh&2Zm!0>NxZ`qKs z-rnBk{Ef~EhsDK3o`Z3a)Fk~12-0wVem>{1yu9o*H#hUX$fv2P$$`0M<1H;MBn*{P za&j`y#c~R@QNJoTb-ca3-NZp@9~>N{!YKU&y&{%Y|G>b2GB3pd@dkXOy}P@c0;Tks znVHdHX!R?T5)58-i}3_VrHhyg^|ktoii(subq17QH}}>y9j44ixDIIbGaV@@DUR-b z7h|&+ziN!7YVYpuQs#Ay> zQ1#3ySs$`~HYZ0%M@~{wl9ZDqf6V;K%ge*}y^N=_T4OyuJq~`yhV#O+x~yQIkG51l>=i(PJ+I8nOsTfQ!omm$cuynA z@5@+YV`Bt%Z*Q*>2ljBFz@CnTpH#oZkH@yQwnkv%jxH{mHjIhe8yg#(ClQaVe|mZv zLn+%tTw9*pUkQv1XJ=>J-@wPH|Kj2TWi~foUtg)%)_#wVk7fdbM_yi@4o9nBNM+SE z%)5@0)Mf=PIBU3Q^-oPr37PD=(Ksi<`%*6j?hoARhd8eVzLC=4Yi*^arC#B+`9r+4 z>kqtPuh&cI>+9nj;5wz+M+Yph;qSR}b922wJ6Ty-99yvlM*R?H^ZkuTnBlIit%)XO z|L*RN^Hw?;44a#qJO|?-sY&`F&P{>$5De2cp2dmxS=2l%-cXbELmu10u;DvR+fr3k z<$3NHzNWU)Z!-t@yWNwM6I=OVf5yA5t&JSdVu-c1e(D@xd@^~#(KZM6C$?Sbhum*( zZvxwYy7%|@{Md!#*ligfALn^yXJ@r(hdqxM}LB>6c;1^tc(5<&M&ruljBFCROutcz9^Dp0>We>c?wTS6Ao2 z{>;0_SDA6MmvF}-@yLbESv-aL=f8Y7Od*tjo?LTYnwbpO#?|gsu`A#JAM}(Je zk#CVNf5v+M#Xk3+^aJew$3Eh=HISX1Equv(4sBojlarHbNb$bx zA60M|wAq@QoAZ+c&-{0HcUlTKhx53nr>C`gHbF;6hp=;TaiLXzd3h0f+%K{A#IFrR z63G6gVW+064OySqcIKx73=R&8HKERt^)4?j#r);vWm#lw6S=uQt*u3* z=AnXu0v@AT5s`Aggqq9`=XKXoU0v;)VPIgu)h&B}e;0l&IUw;*O-(t+z$bA3_xJaF z$Xf63?~C}Y${K~$)m34G$AHu%evJ##aCv#Th+}zDz%kgXPY|S*Vku@K`S30AE&y}>M6XcFC+ih*qGKXMF8_H{;l$%p&^PZ ztg@XM{vC%DwAsJ5iOk-w^{N^8?3knEds?<_O<#AJl)fRUeb-cZmZPI1om;9;-+Hh=kB&z#8mkokE|&d$zQPEHOQ6JkF!y}G)(_rM|xYw{xrcC@n2zS65fY(A7Dy ze$w?%#}Ci@$b42(Qo`EX+ff;&AI4a3Z!ek$#5c+hdj(Kn&#Sn&7-g%htW59$ztbT0 zfBP8UuiDz$!eT-BO&mQvJqg@$$22cZWn}(^g#{T^+fGwXZ0%vp%5OWTsEK%eebxC& z$8jUS%I4DlAjg4`e|~=61vyDKUC)Wq+8Fsk&u@Wuq$Gdo*0%D)Uay}rGBP5Vhlhum zZXX?T1p8Sb@1pBHdV;)fW#6!;y2$L~6y&kMLF^Lxnw zj~(9AbS)vBJDvDlav;CAdwzcIiXYeK`3tai=BMUBj@c7@Y?5pvptdJ|h~@3=O^fyL z@E~GuY;4r(*#w$r7GXODIq}R7zE@UOP=u_kEDURf$tgj5kQ?Xek?YO$IBRIJ4IuG@^5Z# zdcjSY1Mgd;h!wLFD8C$cTU#63-Q8tRPfrPaatCCfgY45{v8Q4zG=4c3Y1Gc}Xa4{E g+5i6@`#MG<|NPzZy*1h#ZK(hH?~iER_rD@P0iI_)&;S4c literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..eddb7cbcc5639d14c621db43748f18ec71af7977 GIT binary patch literal 16428 zcmeI3JxC)#6o8il;Y14&8?m{@@=gUCt!(ZjctpLQc#4RijUZN{ohXVR2wJEhia)5J zScssFg`I`iSXiE5Ar?YVPO%Z)%L~l#vYDSZyP2>d8CYg^-kbN{_hz!$%x)a#gTqRb z)8u^mm^k~JIO2JF0Q@fHF%Fot)f#32PXl`zHH#axk+uK`LR_^ZZ-0kgc zHxh|tYd);b|MBs$43*r!y1HsJ7gqVnkQzmc*Qbo}PfScCDR8XM&(9h%z4-L>l+S;8 zd3kcc^z=0E!~T4fhY?YOjSmdjXnY;#yi;KB0tY^>;#6L4L;|(c!j{OT2 z3_5kT78e(TI)z!uATwPsB)n8s-xE}LMtbOrI13?1p zA9WiwO>JO(V%wOX3NSP@#OH)M2J2m4U-R*6Yin4fY!kVeZ6kiAV}X#x($dl*kgB^X zDk@lvYDIyR`6bk3ez>limd3`$zzljNnsa=Wy#%ug*<)fpc6jxH6 zm6a8h4<*0UC_xaE+dH1%QmW#$h0c}y4Gj%an<@daugbl#OyyH1)BHwI@-vRIvNBh7 zzl(jdF}7;#OV+-)xS-~i#E)4{PEKTQsXhbi$pY}PS0dzx?u-<#AWjSjW<_p?)Ucgydvc}8)vyD@k0!L3cUNq;x`@7##ye({C;x4 zVuxq2rX@?)P9uJk9N_nMFE1}m@ss*2e->+FergVI%)a0ggRl)tZD0Hl%iG(V6zk#P zfyds~)+W`{33hjPxt*}_Lpq3O0q9Pu*P{E+n5;u#__x!WC*gN?ciOHZ2T54)) zSgbbc!2FDLVPPSOT31)c<22n%6y*v&XUvC%I%E8z*hD;j`b4%f)Mu4{XJ^L`Zps*V z-y%b-B0E<3aoimp9qz%wf&29Il){HkKn6On2aU&CY-f$%B14c|75EGPf6n*+zb8JL Zj`Qos@2|1Q&q!F@yjB literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..7f14db672fa1238dede274017b0c001243c24bea GIT binary patch literal 16428 zcmeI3ze^)Q6vvkX;lxJl#O4~yJ0obJm5nFCBT?@zo{bh(f(ZTtqG%%sT8JQsB2h3{ zh=q-XorPlIA8>_*SO`Hq?L_ACynDmj-PxU)%}&@MJFv`;_h$0_yf@h-yBo*(;9%)< z`kYT6E4|;9qgYwXtWFPLhuqgIKkoaK-|!w77#Lu?ySwc6_Lc>eySqEKx3|Z# z*=()yVKo0ICnrIu%HumbJ0@dclwTQA;%M;v6dV7-!ooWR)%x=CA|aETudc2VpMOg6 z`1r{6wzjrXQ=~SHr-61=`CndM7BW$tLI;gOx|V@mNg3${)t2Vw;+pswI!^YlZSJE-tDd z2KvDK7;q5R0v+}zB|=ks(PZv*$%))wzu z76WB|jLF5t1#4<*vX$4X+s9uh6cANf)8F})XYt&tM8qs``@$w>;3aj_xlgr)3^8> z;M@N?-+$p*28-E2yN@4uWF?o&+0KpnmHFZKz9`r2?d@!AY)ohq`6p~l$bWu*{=Nm^ znpay}n~<%mtIM@brl+TcehK6CY83K^X`Y;%baB&8*t~?=l=(L|Hz{ghJE5H3yklR= ze{*va$SN|tzP{qxHq@c~B0kkIOZGu1|Hj6KDz4Daf^%XhKjg650?$Y#crQr#;aYDs zWqy91^UuxAv7qbd5F@yjR^w~wQhw02y}cbd1ep6$sid_A&NEyq@q>ma1)hCF{krpU zp5a=VKS~Txdt+mxE!z9Po8$JY#G}%0Iq7{5L^V8X6k7ZjoJQ3}4GoT@^oQYH4Zl z;ZUtUqvk+IM+c83T{ot7)%>Ufp4)@c+1bhU>Rw9}g$CYd_!3-v9qzd22e(kCC7Kh3xliKKJ?8*X+0cFV0^?dnHW( literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..a7cdf8ca2f30c1fd34184f2f276894d20e470c46 GIT binary patch literal 16428 zcmeI3y-OoO6u_4Q;UtaNrn$!QP6V5DHXcZheB4Jo>$Is;ied-^1XBb-5Jgl_EJC`F zB3+7f`2(&?1mvj>M@`AI>?!KLm&92Ot9oWp*o7wk!@9penvN4Pg21#4SmhtK1 zwDxCu{9Vuk*#Aurb3qSa2j4F$KZ*N@e=%bq@_%&w2eSSh9UYmFG+RppiT@e+>&MH> zi%vF}i@#E-(CAiKqZshb|Mc`^@j465W>c3K@Wt=s#p;^GfHXhGinW!?WgTKbiXY=- zwP_Fo!u-SGkcEo&?e6ZX9s@%B$H&JgpGc$PF(AY*!s#WGOeR&10WQB6muP#jSk#uE zJkyG@I^{ID2QdBbe%+IpWb!8x2^nNdRugux0h6C_tgNhhqrddBte@ZjmsYPD)(KRi72lvUUkD8CKtwUSP!Q9j^4KR-wN z6y_%S3iA`2bh}+M7K@Sby5}zbTrNjYx%th_&Aa1oG#XrPTA)-a>1+d+|HtDojmIr# zv)OmW&joe}Xt2hy{NwV!1CLvc__hA+H1faW_b+b1I|QQme_!#x==VR_=bx*qE7tu* z^*-17C-eOK`1q(gA5T9QKdfiGluD&|^Xk$s%n#r9v9*3}ZOz=<+e7;>dBxgL{!XVe z3jx^kipS$9+vet`Eldi90xG8%uTw{qpQUp?pSN+-71lUK`-J(=&dz95&$6PNPQQ~n zm%rcdd$M93&(F_fZXI$aKgK88rb!$y`A<(zMR8F%4c0^^KlpIo1n)>G91C22*z27q z9UL53{QLX+rq@0?*a-I0-gqya%MW^8TwM4z0rCC){k_y2WL(I(5I^YPC!L&}SiYAX zA2K)5OPJq}4G6>X^0F+x`9^D}6u*oO+U+*6vDxeOr1@b0v0sR}G{2|~Xq|n*E6fjU zlgY#rYcLpCzRP4Xo^rg7ySqDU9@?G(mVNo3od5Fj5=B^ATC(&;1tc2DxkAe4;s>2p zS65v$w63mB$%ggyb<39YyaAQx<|lg8YPA{J#>R%Fuk2nTW*WH8$T>pD1LMbZ!+89( zVRHx67ApVk?X4eN+ZcG?A|O_5o>2K|z2RNxdcAIrMk5;^U4cH3fjww?Y>4GI;}4Nx m9$Q8H(f^+p{r~UNOVcoZe*d+d+xfARPJRCUb?4jm7vn#L@)+y@ literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..150f061ff493b1ba10c7e51a223b8c293072f043 GIT binary patch literal 16428 zcmeI3JFDVA6oA8muwrLxvyGj*BKQMta~Fig$GWR)ZDHeY5L-deLIgn+3qdQfRj{+L z^9O8UVI?fWY9})52oomBB$J8BlE)dyoprX&0 z%>MUrp@3eP9os&r{KW5pKbSrM_J{os@h_NrAIE&y|FHjI|HJ-=^ItH10OCKye~ACV z-1~6;gYz%Me~AB@_&=M?5KgPr%J1hwrvE?TRex%=njdvxnxClSa5$huBH-E~}deHDMmrE`;J)qrgdszn>{_FKh<8jNyV$oOpTwv7zkAFMU*k6UmtpdNN zzny~pRp(!>!>a~>|NG1TMW26#Lcv$hKhg8gWHRv;zsULbcszQU9m}qX|2UrUQZ}3Q zIyaHuG=I0-C36&cJRV1tN=4D;p=Sb&$U3*9DW` zNakv_s^F$8M)O?SXPSR77|^J?WtVd5`6ibizwZ%Ax7$r`EjP9s@{4e*$9lvM4Eg*0 zz8XuY?tz$S$d7IKYHGDwZuEO16PG^{iM*tOX0u7wLXAcP<#IW>uHGZ~e~IC6sN1g| zZ$q8SkJlKDMwWFzWSr0ELiZr^9L`PgV;QWZPNyT=Qgpt<+(a(Z{8n^87{cMOC_eg6 zu~Ud&LcU`RW`7GNmpU>-#<8|Qg z(6k;MC|j~Wkz+g_GZ8|ekSsTIfIuTz%c1-wek@Zo8r9IyvT8a78qx{q9)C#U*&ThB!to>;l zmCI$cSS--xa#8Tn72Jo%;CImUTnEdJ+TTIB?a~kM!|$Ji{`>dGHkG6w-+#WBGQ~_T N`}x<`%(wS1(mzZk42u8& literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..36e5c3b31dc06da2835481de83bc164337a78353 GIT binary patch literal 16428 zcmeI3O=`kG6vu~xP;uu8dVyBFK{ghI(r7)u)G=IHbclfK_ zZfDU4!u*|1hsQpvXYhY?k@=U)AJ%Ua#lzce`E3G)?dMGDqld>Uca3 zeSg_Mf#;k2bdAYmBJBfa<6^N8nuCo~e2>IWZIHPJgMk-I(eaA8nO%|jWqiOG^7*_d zzVlDoDa0@0gUx2ceC+IYJ7Io0fca11U6?KU;q~odzQ0ayifLzzzb9Y%N9iSp3wcVzKC>;cfN36l^G!N}ezI zc@wI~=4W;chr>Uza=Gl;yI!vaY5m=4p0PC)+!NyuvdvE;*Ag^$LTyUI!)|IXmH*!N;FsA0s6X-# z|H;h0aX#{o{3HL!KjuG~Jplj1|M0)e>|_4J{0slX|L{NjkNIC_55WKMKm0E<`WB!-f1Molm5C6-|KIVVS|L{NjZ_WQ{nv(DPqqAlZ1e9gj=zWI&Xjd6Tjm)Q}HQD5*vG9rT%T(PUg4N16KHF!RwbSWPqJNj^nxb zl;=739LN z6-5!1Wl3GvjqZuLXPybekdt}%+pP5;@;~W0`0@R-^zYwwG?n`KI`2d8+dCaMmrw7o G->MsXi}UIL literal 0 HcmV?d00001 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 index 0000000000000000000000000000000000000000..31219ab3fc9afc0489385c8544dfb7b598c39d43 GIT binary patch literal 16428 zcmeI3b%<5l7sp2tySx1vSYV5ZIL0U=_OnGrFfc*?u>%vu#s>XE|4>XUL=^09vAeq! zTi1J^&D)1_k0MwN;Qe`0i zGLS1*E~!wVf+Qv;O2>{JrF-}8(yd!J>C&Z(G-=XADp#&7`SRtHv}x1+-|WdedGbh7 zQj&}wJzCbRStCb|9FdzhZ_0}oFXYXeH|qE5)hoGu`?j1sc~UlP*dP-pPLx)yT1nx; zh5xnlP^wfZS+Qb;eEIT4qNSfdf6A&=tE5hyI{&(PXxp}}JbU&mTIfc*r%#{C(4j*W z{;XNEsy$PpM2UaYd}Pj?Sw@W-B_~dtFxHBFj4X$xjT<*grAn0)UiQ(|t5;>-ym?Zn zP@#Xs9H6%@T)1GsJaFKE!51DC0 zm%)>ML3hCq@)~9jpck`e&#wByX4uiDO`B3&7INp#EqnItv13Pl+qrY6u`W}mPIav3 zRWNt%T%(_@Temt^fAHXe)TmLzs2fjNC|R;(guL4^g-qx@Tdi6(yDGlERj*!MVX9cM zqI~`O)wRvrw{N9s)24BqgW|=DE8FeL$lry_moGPXIeYf3pC%D?&YwSTw5KmW^!f8= zY2LiK(Jq#9kRwM9IdkTWA2w8-A3uIb`SRrzFT;lq_uWoc96x@%YFn^iLFFUq?_N*j zK+9gN@T2Q?@80b-^l#;}XU|p`@B!bwd-q$p(}#~AKT3fD1yoz+At>Fsb4SoovBDn> z5Aclc&zUo);=}3-pd*kGepVZTPKWnw*|N#qyLW@aSM}GeTNe}j=oI|WXsLhy{)&%c z#fr(~$&;1-z}LTV(r@}vfTbW?p z$!(Z1#qymw@X9BA`}R%6ox}^#;H3?I3ws|K)P1B$lSUdfY9!mYZx_a}qlXV4#tplk zN9NZ~A22V(#pTMCGkDfm$RE_MT|45t#%1@!-lMy=Y}umL-mH_UPo9q4j@hSq^5jX} zvFkZ7`vi|3J(B6urwjQeGZt(pYlseEz1FW^A5m_uYktS(-Me=$VtI)}(W7B1yoY_FBUwxGrky)?Rx!5bADh*(WlJGvVvU#ZDf8#gAHlzF zXMVD_Zu^`)NZhY|6mwhRHLKnVi`U#ge`}FCP zY~H+C%9JS+(Py(}&EmEXupwsbWy_Y8{rmSDJbAs08#gYZy}2*_K6BgYIhk0iVJsx{8 z2pv0i%o9I-2O)HE7(8LxVhi1Ll@$jumzHy+033J@IoF!w-><;Y`XJZ<05P7k*+J^SY6vVZHqB zgApS}M6@^erQeDD$zwPX_Kx`2?rsM80=N8L*m+@p>0FxTmnY{F?b@}I9Xoco=E)j2 zZtRIaUAlD2rkn8-|1MatK*hM^LG;+nKmPv6ks}pfI$swSr(1jGfcSU9gb6Zh)~w&; zk98sMefsoiGX#16{=IPjNb~OY96NTbfSFtm`1BcuZd1B+X_a$${P?jk2DxT8zGGQt z&QBn#>_g7|kOR#lPvUX%6P!PC_Fyh^duI+ibm$;OiWG@xL%cbE{(Q$A9Ouxn#A(+T zd)+So#X_*==m_&X{fG^H=?D&qwH*}8|5AZ@J7IMD&i;>v z*pqrMXnn;vLC!zSxini+#a@i*N3Aus->O`E3ha1M(t zB3{6Lp~ul@{LmMCCzrNt*)rp-qG7{^UfsKvlgssk(W?%AV>E=%!MQ*E<3CvmdtqnG zxaX&NistSR1#{;*R>NknH~bPgF7D_>i_@(g_l~heerVUOT?P+(_wM!6 zB%%&Dv@YcQ(ht3S`SQ0jIyXGglrab9`@T+m>AQ%mMYQ^pTmn3D=HZo> zFmT{N6|-ob@HrPQT&UTN`pKPJeGdiQgD&O#o!m=2F$L|Ly9X^=v@q_Sa(Bv)p7fd+ zbSF9le$Xl0r;GMZUrhu38$OLDO(dd89HL?5LAx>%C76!MqEqeq0$t#nq<$QrN z7W4!*jUQ*O#6IL$h!OCYxQD`B9BY56f5-p-G*jm|b&mf-GVmAFgoF<5J0^8X{v)|f O>q=dkCAUnfobV?=QkES6 literal 0 HcmV?d00001 diff --git a/qcsrc/client/projectile.qc b/qcsrc/client/projectile.qc index fb4fdd5ef..7ee071a75 100644 --- a/qcsrc/client/projectile.qc +++ b/qcsrc/client/projectile.qc @@ -300,6 +300,17 @@ 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; + case PROJECTILE_NADE_YELLOW: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_yellow"); break; + case PROJECTILE_NADE_YELLOW_BURN: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_yellow_burn"); break; + case PROJECTILE_NADE_PINK: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_pink"); break; + case PROJECTILE_NADE_PINK_BURN: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_pink_burn"); break; + case PROJECTILE_NADE: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade"); break; + case PROJECTILE_NADE_BURN: setmodel(self, "models/weapons/v_ok_grenade.md3");self.traileffect = particleeffectnum("nade_burn"); break; default: error("Received invalid CSQC projectile, can't work with this!"); @@ -342,6 +353,23 @@ void Ent_Projectile() self.move_bounce_factor = g_balance_grenadelauncher_bouncefactor; self.move_bounce_stopspeed = g_balance_grenadelauncher_bouncestop; break; + case PROJECTILE_NADE_RED_BURN: + case PROJECTILE_NADE_RED: + case PROJECTILE_NADE_BLUE_BURN: + case PROJECTILE_NADE_BLUE: + case PROJECTILE_NADE_YELLOW_BURN: + case PROJECTILE_NADE_YELLOW: + case PROJECTILE_NADE_PINK_BURN: + case PROJECTILE_NADE_PINK: + case PROJECTILE_NADE_BURN: + case PROJECTILE_NADE: + 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_MINE: self.mins = '-4 -4 -4'; self.maxs = '4 4 4'; diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index b399f3857..1a70b341d 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -355,6 +355,17 @@ 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 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; diff --git a/qcsrc/common/deathtypes.qh b/qcsrc/common/deathtypes.qh index f9a9ceba2..48a269b1a 100644 --- a/qcsrc/common/deathtypes.qh +++ b/qcsrc/common/deathtypes.qh @@ -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, 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) \ diff --git a/qcsrc/common/notifications.qh b/qcsrc/common/notifications.qh index 9bd8d5e32..576743222 100644 --- a/qcsrc/common/notifications.qh +++ b/qcsrc/common/notifications.qh @@ -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, 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, 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"), "") \ @@ -463,6 +465,7 @@ void Send_Notification_WOVA( MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAGGED, 1, 1, "spree_cen s1", NO_CPID, "0 0", _("^K1%sYou were typefragged by ^BG%s"), _("^K1%sYou were scored against by ^BG%s^K1 while typing!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAGGED_VERBOSE, 1, 4, "spree_cen s1 frag_stats", NO_CPID, "0 0", _("^K1%sYou were typefragged by ^BG%s^BG%s"), _("^K1%sYou were scored against by ^BG%s^K1 while typing^BG%s")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_MURDER_TYPEFRAG_VERBOSE, 1, 2, "spree_cen s1 frag_ping", NO_CPID, "0 0", _("^K1%sYou typefragged ^BG%s^BG%s"), _("^K1%sYou scored against ^BG%s^K1 while they were typing^BG%s")) \ + MSG_CENTER_NOTIF(1, CENTER_NADE_THROW, 0, 0, "", CPID_NADES, "0 0", _("^BGPress ^F2DROPWEAPON^BG again to toss the nade!"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_AUTOTEAMCHANGE, 0, 1, "death_team", NO_CPID, "0 0", _("^BGYou have been moved into a different team\nYou are now on: %s"), "") \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_BETRAYAL, 0, 0, "", NO_CPID, "0 0", _("^K1Don't shoot your team mates!"), _("^K1Don't go against your team mates!")) \ MSG_CENTER_NOTIF(1, CENTER_DEATH_SELF_CAMP, 0, 0, "", NO_CPID, "0 0", _("^K1Die camper!"), _("^K1Reconsider your tactics, camper!")) \ @@ -473,6 +476,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 forgot to put the pin back in!"), _("^K1Try throwing the nade!")) \ 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!"), "") \ @@ -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, 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) \ @@ -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, 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) \ diff --git a/qcsrc/server/autocvars.qh b/qcsrc/server/autocvars.qh index dead5a9d4..56a1f2ba7 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -1234,3 +1234,15 @@ float autocvar_g_touchexplode_radius; float autocvar_g_touchexplode_damage; float autocvar_g_touchexplode_edgedamage; float autocvar_g_touchexplode_force; +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; diff --git a/qcsrc/server/cl_weaponsystem.qc b/qcsrc/server/cl_weaponsystem.qc index 26af874e2..3a963d4ba 100644 --- a/qcsrc/server/cl_weaponsystem.qc +++ b/qcsrc/server/cl_weaponsystem.qc @@ -667,6 +667,9 @@ float client_hasweapon(entity cl, float wpn, float andammo, float complain) complain = 0; if(complain) self.hasweapon_complain_spam = time + 0.2; + + if(wpn == WEP_HOOK && !g_grappling_hook && autocvar_g_nades && !WEPSET_CONTAINS_AW(weaponsInMap, wpn)) + complain = 0; if (wpn < WEP_FIRST || wpn > WEP_LAST) { diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index f69b13321..923bcec80 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -919,6 +919,7 @@ void readlevelcvars(void) CHECK_MUTATOR_ADD("g_rocket_flying", mutator_rocketflying, !cvar("g_minstagib")); CHECK_MUTATOR_ADD("g_vampire", mutator_vampire, !cvar("g_minstagib")); CHECK_MUTATOR_ADD("g_superspectate", mutator_superspec, 1); + CHECK_MUTATOR_ADD("g_nades", mutator_nades, 1); CHECK_MUTATOR_ADD("g_sandbox", sandbox, 1); #undef CHECK_MUTATOR_ADD diff --git a/qcsrc/server/mutators/mutator_nades.qc b/qcsrc/server/mutators/mutator_nades.qc new file mode 100644 index 000000000..fc2182377 --- /dev/null +++ b/qcsrc/server/mutators/mutator_nades.qc @@ -0,0 +1,346 @@ +.entity nade; +.float nade_refire; + +void nade_timer_think() +{ + self.skin = 8 - (self.owner.wait - time) / (autocvar_g_nades_nade_lifetime / 10); + self.nextthink = time; + if(!self.owner || wasfreed(self.owner)) + remove(self); + +} + +void nade_burn_spawn(entity _nade) +{ + float p; + + switch(_nade.realowner.team) + { + case NUM_TEAM_1: p = PROJECTILE_NADE_RED_BURN; break; + case NUM_TEAM_2: p = PROJECTILE_NADE_BLUE_BURN; break; + case NUM_TEAM_3: p = PROJECTILE_NADE_YELLOW_BURN; break; + case NUM_TEAM_4: p = PROJECTILE_NADE_PINK_BURN; break; + default: p = PROJECTILE_NADE_BURN; break; + } + + CSQCProjectile(_nade, TRUE, p, TRUE); +} + +void nade_spawn(entity _nade) +{ + float p; + 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 = nade_timer_think; + timer.nextthink = time; + timer.wait = _nade.wait; + timer.owner = _nade; + timer.skin = 10; + + switch(_nade.realowner.team) + { + case NUM_TEAM_1: p = PROJECTILE_NADE_RED; break; + case NUM_TEAM_2: p = PROJECTILE_NADE_BLUE; break; + case NUM_TEAM_3: p = PROJECTILE_NADE_YELLOW; break; + case NUM_TEAM_4: p = PROJECTILE_NADE_PINK; break; + default: p = PROJECTILE_NADE; break; + } + + CSQCProjectile(_nade, TRUE, p, TRUE); + +} + +void nade_boom() // TODO: DamageInfo +{ + string expef; + + switch(self.realowner.team) + { + case NUM_TEAM_1: expef = "nade_blue_explode"; break; + case NUM_TEAM_2: expef = "nade_red_explode"; break; + case NUM_TEAM_3: expef = "nade_yellow_explode"; break; + case NUM_TEAM_4: expef = "nade_pink_explode"; break; + default: expef = "nade_explode"; break; + } + + 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(expef), self.origin + '0 0 1', '0 0 0', 1); + + self.takedamage = DAMAGE_NO; + RadiusDamage(self, self.realowner, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage, + autocvar_g_nades_nade_radius, self, autocvar_g_nades_nade_force, self.projectiledeathtype, self.enemy); + + remove(self); +} + +void nade_touch() +{ + PROJECTILE_TOUCH; + setsize(self, '-2 -2 -2', '2 2 2'); + UpdateCSQCProjectile(self); + if(self.health == autocvar_g_nades_nade_health) + { + spamsound(self, CH_SHOTS, strcat("weapons/grenade_bounce", ftos(1 + rint(random() * 5)), ".wav"), VOL_BASE, ATTN_NORM); + return; + } + + self.enemy = other; + nade_boom(); +} + +void nade_beep() +{ + sound(self, CH_SHOTS_SINGLE, "overkill/grenadebip.ogg", VOL_BASE, 0.5 *(ATTN_LARGE + ATTN_MAX)); + self.think = nade_boom; + self.nextthink = max(self.wait, time); +} + +void nade_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) +{ + if(DEATH_ISWEAPON(deathtype, WEP_LASER)) + return; + + if(DEATH_ISWEAPON(deathtype, WEP_NEX) || DEATH_ISWEAPON(deathtype, WEP_MINSTANEX)) + { + force *= 6; + damage = autocvar_g_nades_nade_health * 0.55; + } + + if(DEATH_ISWEAPON(deathtype, WEP_UZI)) + damage = autocvar_g_nades_nade_health * 0.1; + + if(DEATH_ISWEAPON(deathtype, WEP_SHOTGUN)) + damage = autocvar_g_nades_nade_health * 1.1; + + self.velocity += force; + + if(!damage) + return; + + if(self.health == autocvar_g_nades_nade_health) + { + sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, 0.5 *(ATTN_LARGE + ATTN_MAX)); + self.nextthink = max(time + autocvar_g_nades_nade_lifetime, time); + self.think = nade_beep; + } + + self.health -= damage; + self.realowner = attacker; + + if(self.health <= 0) + W_PrepareExplosionByDamage(attacker, nade_boom); + else + nade_burn_spawn(self); +} + +void toss_nade(entity e, vector _velocity, float _time) +{ + entity _nade = e.nade; + e.nade = world; + + Kill_Notification(NOTIF_ONE_ONLY, e, MSG_CENTER_CPID, CPID_NADES); + + 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(e.crouch) + _nade.velocity = '0 0 -10'; + else if(autocvar_g_nades_nade_newton_style == 1) + _nade.velocity = e.velocity + _velocity; + else if(autocvar_g_nades_nade_newton_style == 2) + _nade.velocity = _velocity; + else + _nade.velocity = W_CalculateProjectileVelocity(e.velocity, _velocity, FALSE); + + _nade.solid = SOLID_BBOX; + _nade.touch = nade_touch; + _nade.health = autocvar_g_nades_nade_health; + _nade.takedamage = DAMAGE_YES; + _nade.event_damage = nade_damage; + _nade.teleportable = TRUE; + + nade_spawn(_nade); + + if(_time) + { + _nade.think = nade_boom; + _nade.nextthink = _time; + } + + e.nade_refire = time + autocvar_g_nades_nade_refire; +} + +void nade_prime() +{ + if(self.nade) + remove(self.nade); + + self.nade = spawn(); + setmodel(self.nade, "models/weapons/h_ok_grenade.iqm"); + setattachment(self.nade, self.weaponentity, ""); + self.nade.classname = "nade"; + self.nade.realowner = self; + self.nade.colormap = self.colormap; + self.nade.glowmod = self.glowmod; + self.nade.wait = time + autocvar_g_nades_nade_lifetime; + self.nade.cnt = time; + self.nade.think = nade_beep; + self.nade.nextthink = max(self.nade.wait - 3, time); + self.nade.projectiledeathtype = DEATH_NADE; +} + +float CanThrowNade() +{ + if(self.vehicle) + return FALSE; + + if(gameover) + return FALSE; + + if not(autocvar_g_nades) + return FALSE; // allow turning them off mid match + + if(forbidWeaponUse()) + return FALSE; + + return TRUE; +} + +MUTATOR_HOOKFUNCTION(nades_ForbidThrowing) +{ + if(!g_weaponarena || !g_minstagib) + return FALSE; // TODO: fix this to support all modes that don't disable weapon dropping + + if(!CanThrowNade()) + return FALSE; + + if(!self.nade) + { + if(self.nade_refire < time) + { + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_NADE_THROW); + nade_prime(); + self.nade_refire = time + autocvar_g_nades_nade_refire; + } + } + else + { + if(time - self.nade.cnt >= 1) + { + makevectors(self.v_angle); + float _force = time - self.nade.cnt; + _force /= autocvar_g_nades_nade_lifetime; + _force = autocvar_g_nades_nade_minforce + (_force * (autocvar_g_nades_nade_maxforce - autocvar_g_nades_nade_minforce)); + toss_nade(self, (v_forward * 0.75 + v_up * 0.2 + v_right * 0.05) * _force, 0); + } + } + + return TRUE; +} + +MUTATOR_HOOKFUNCTION(nades_VehicleEnter) +{ + if(other.nade) + toss_nade(other, '0 0 100', max(other.nade.wait, time + 0.05)); + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(nades_PlayerPreThink) +{ + float key_pressed = ((g_grappling_hook) ? self.button16 : self.BUTTON_HOOK); + + if(self.nade) + if(self.nade.wait - 0.1 <= time) + toss_nade(self, '0 0 0', time + 0.05); + + if(CanThrowNade()) + if(self.nade_refire < time) + { + if(key_pressed) + { + if(!self.nade) + nade_prime(); + } + else if(time - self.nade.cnt >= 1) + { + if(self.nade) + { + makevectors(self.v_angle); + float _force = time - self.nade.cnt; + _force /= autocvar_g_nades_nade_lifetime; + _force = autocvar_g_nades_nade_minforce + (_force * (autocvar_g_nades_nade_maxforce - autocvar_g_nades_nade_minforce)); + toss_nade(self, (v_forward * 0.7 + v_up * 0.2 + v_right * 0.1) * _force, 0); + } + } + } + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(nades_PlayerSpawn) +{ + if(autocvar_g_nades_spawn) + self.nade_refire = time + autocvar_g_spawnshieldtime; + else + self.nade_refire = time + autocvar_g_nades_nade_refire; + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(nades_PlayerDies) +{ + if(self.nade) + toss_nade(self, '0 0 100', max(self.nade.wait, time + 0.05)); + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(nades_BuildMutatorsString) +{ + ret_string = strcat(ret_string, ":Nades"); + return FALSE; +} + +MUTATOR_HOOKFUNCTION(nades_BuildMutatorsPrettyString) +{ + ret_string = strcat(ret_string, ", Nades"); + return FALSE; +} + +MUTATOR_DEFINITION(mutator_nades) +{ + MUTATOR_HOOK(ForbidThrowCurrentWeapon, nades_ForbidThrowing, CBC_ORDER_ANY); + MUTATOR_HOOK(VehicleEnter, nades_VehicleEnter, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerPreThink, nades_PlayerPreThink, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerSpawn, nades_PlayerSpawn, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerDies, nades_PlayerDies, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsString, nades_BuildMutatorsString, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsPrettyString, nades_BuildMutatorsPrettyString, CBC_ORDER_ANY); + + MUTATOR_ONADD + { + 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.ogg"); + } + + return FALSE; +} diff --git a/qcsrc/server/mutators/mutators.qh b/qcsrc/server/mutators/mutators.qh index 3f9f020af..4f2f87aa4 100644 --- a/qcsrc/server/mutators/mutators.qh +++ b/qcsrc/server/mutators/mutators.qh @@ -21,5 +21,6 @@ MUTATOR_DECLARATION(mutator_vampire); MUTATOR_DECLARATION(mutator_superspec); MUTATOR_DECLARATION(mutator_minstagib); MUTATOR_DECLARATION(mutator_touchexplode); +MUTATOR_DECLARATION(mutator_nades); MUTATOR_DECLARATION(sandbox); diff --git a/qcsrc/server/progs.src b/qcsrc/server/progs.src index df5623f05..021b9b9b0 100644 --- a/qcsrc/server/progs.src +++ b/qcsrc/server/progs.src @@ -248,6 +248,7 @@ mutators/sandbox.qc mutators/mutator_superspec.qc mutators/mutator_minstagib.qc mutators/mutator_touchexplode.qc +mutators/mutator_nades.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 index 000000000..130bee7ab --- /dev/null +++ b/scripts/ok_nade_counter.shader @@ -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 -- 2.39.2