From: Rudolf Polzer Date: Fri, 9 Aug 2013 12:30:44 +0000 (+0200) Subject: Merge branch 'master' of git://nl.git.xonotic.org/xonotic/xonotic-data.pk3dir X-Git-Tag: xonotic-v0.8.0~369 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=290e3daadcf7e98417da9cd9e762f53634e01f38;hp=461c233f755633cefcda7ba02c6cd7519cff4eee Merge branch 'master' of git://nl.git.xonotic.org/xonotic/xonotic-data.pk3dir --- diff --git a/defaultXonotic.cfg b/defaultXonotic.cfg index c392e9a158..392ba9f905 100644 --- a/defaultXonotic.cfg +++ b/defaultXonotic.cfg @@ -380,13 +380,6 @@ set g_weapon_throwable 1 "if set to 1, weapons can be dropped" set g_powerups -1 "if set to 0 the strength and shield (invincibility) will not spawn on the map, if 1 they will spawn in all game modes, -1 is game mode default" set g_use_ammunition 1 "if set to 0 all weapons have unlimited ammunition" set g_pickup_items -1 "if set to 0 all items (health, armor, ammo, weapons...) are removed from the map, if 1 they are forced to spawn" -set g_minstagib 0 "enable minstagib" -set g_minstagib_extralives 1 "how many extra lives you will get per powerup" -set g_minstagib_ammo_start 10 "starting ammo" -set g_minstagib_ammo_drop 5 "how much ammo you'll get for weapons or cells" -set g_minstagib_invis_alpha 0.15 -set g_minstagib_speed_highspeed 1.5 "speed-multiplier that applies while you carry the invincibility powerup" -set g_vampire 0 "set to 1 to enable the vampire mode, where the damage done to your opponent gets added to your own health" set g_weaponarena "0" "put in a list of weapons to enable a weapon arena mode, or try \"all\" or \"most\"" set g_weaponarena_random "0" "if set to a number, only that weapon count is given on every spawn (randomly)" set g_weaponarena_random_with_laser "1" "additionally, always provide the laser in random weapon arena games" @@ -416,23 +409,6 @@ set g_player_alpha 1 set g_player_brightness 0 "set to 2 for brighter players" seta g_balance_cloaked_alpha 0.25 -set g_sandbox 0 "allow players to spawn and edit objects around the map" -set g_sandbox_info 1 "print object information to the server. 1 prints info about spawned / removed objects, 2 also prints info about edited objects" -set g_sandbox_readonly 0 "when this mode is active, players cannot modify objects or use any sandbox commands" -set g_sandbox_storage_name default "name of the selected storage to use" -set g_sandbox_storage_autosave 5 "storage is automatically saved every specified number of seconds" -set g_sandbox_storage_autoload 1 "if a storage file exists for the given map, automatically load it at startup" -set g_sandbox_editor_flood 1 "players must wait this many seconds between spawning objects" -set g_sandbox_editor_maxobjects 1000 "maximum number of objects that may exist at a time" -set g_sandbox_editor_free 1 "0 = players can only copy or edit their own objects, 1 = players can copy but not edit other objects, 2 = players can copy and edit all object" -set g_sandbox_editor_distance_spawn 200 "distance at which objects spawn in front of the player" -set g_sandbox_editor_distance_edit 300 "distance at which players can edit or remove objects they are looking at" -set g_sandbox_object_scale_min 0.1 "minimum scale that objects can be set to" -set g_sandbox_object_scale_max 2 "maximum scale that objects can be set to" -set g_sandbox_object_material_velocity_min 100 "velocity objects must have while colliding for material effects to be applied" -set g_sandbox_object_material_velocity_factor 0.002 "velocity range which decides the intensity of material effects" -set cl_sandbox_clipboard "" - seta menu_sandbox_spawn_model "" seta menu_sandbox_attach_bone "" seta menu_sandbox_edit_skin 0 @@ -455,26 +431,9 @@ set welcome_message_time 8 set g_grappling_hook 0 "let players spawn with the grappling hook which allows them to pull themselves up" -set g_invincible_projectiles 0 "set to 1 to disable any damage to projectiles in all balance configs, regardless of g_projectiles_damage" -set g_dodging 0 "set to 1 to enable dodging in games" -set g_rocket_flying 0 "set to 1 to enable rocket flying in all balance configs" - -seta cl_dodging_timeout 0.2 "determines how long apart (in seconds) two taps on the same direction key are considered a dodge. use 0 to disable" - -set sv_dodging_wall_dodging 0 "set to 1 to allow dodging off walls. 0 to disable" -set sv_dodging_delay 0.5 "determines how long a player has to wait to be able to dodge again after dodging" -set sv_dodging_up_speed 200 "the jump velocity of the dodge" -set sv_dodging_horiz_speed 400 "the horizontal velocity of the dodge" -set sv_dodging_ramp_time 0.1 "a ramp so that the horizontal part of the dodge is added smoothly (seconds)" -set sv_dodging_height_threshold 10 "the maximum height above ground where to allow dodging" -set sv_dodging_wall_distance_threshold 10 "the maximum distance from a wall that still allows dodging" -set sv_dodging_sound 1 "if 1 dodging makes a sound. if 0 dodging is silent" - set g_spawn_alloweffects 1 "allow clients to enable spawn point and event effects such as particles and sounds, see cl_spawn_ cvars for more info" set g_spawn_furthest 1 "this amount of the spawns shall be far away from any players" set g_spawn_useallspawns 0 "use all spawns, e.g. also team spawns in non-teamplay, and all spawns, even enemy spawns, in teamplay" -set g_spawn_near_teammate 0 "if set, players prefer spawns near a team mate" -set g_spawn_near_teammate_distance 640 "max distance to consider a spawn to be near a team mate" // respawn delay set g_respawn_delay 2 "number of seconds you have to wait before you can respawn again" set g_respawn_waves 0 "respawn in waves (every n seconds), intended to decrease overwhelming base attacks" @@ -751,13 +710,6 @@ bind F2 vno //used for spectate/observer mode bind F3 spec -// NIX (No Items Xonotic) - at each time, everyone uses the same weapon, -// and in regular intervals, this weapon is cycled -set g_nix 0 "No Items Xonotic - instead of pickup items, everyone plays with the same weapon. After some time, a countdown will start, after which everyone will switch to another weapon, and so on" -set g_nix_with_laser 0 "always carry the laser as an additional weapon in NIX" -set g_nix_with_healtharmor 0 "when 1, health and armor still show up in NIX" -set g_nix_with_powerups 0 "when 1, powerups still show up in NIX" - // score log set sv_logscores_console 0 "print scores to server console" set sv_logscores_file 0 "print scores to file" @@ -1091,10 +1043,6 @@ alias sethostname "set menu_use_default_hostname 0; hostname $*" set sv_foginterval 1 "force enable fog in regular intervals" -set g_physical_items 0 "1 uses ODE physics for dropped weapons, 2 for all items, requires physics_ode to be enabled" -set g_physical_items_damageforcescale 3 "how affected physical weapons are by damage" -set g_physical_items_reset 1 "return map items to their original lotation after being picked up" - // Audio track names (for old-style "cd loop NUMBER" usage) set _cdtrack_first "1" alias _cdtrack_0 "g_cdtracks_remaplist \"$g_cdtracks_remaplist $1\"" @@ -1177,12 +1125,6 @@ set g_bugrigs_speed_ref 400 "reference speed for accel and steer responsiveness" set g_bugrigs_speed_pow 2 "reference power for accel and steer responsiveness" set g_bugrigs_steer 1 "steering amount" -set g_touchexplode 0 -set g_touchexplode_radius 50 -set g_touchexplode_damage 10 -set g_touchexplode_edgedamage 0 -set g_touchexplode_force 150 - set g_ban_sync_uri "" "sync using this ban list provider (empty string to disable)" set g_ban_sync_interval 5 "sync every 5 minutes" set g_ban_sync_trusted_servers "" "request ban lists from these xonotic servers (do not include your own server there, or unbanning may fail)" @@ -1341,10 +1283,6 @@ seta cl_forcemyplayerskin 0 "set to the skin number you want to show yourself as seta cl_forcemyplayercolors 0 "set to the color value (encoding is same as _cl_color) for your own player model (ignored in teamplay; does not affect how enemies look with cl_forceplayermodels)" seta cl_movement_errorcompensation 1 "try to compensate for prediction errors and reduce preceived lag" -// debug cvars for keyhunt attaching -set _angles "0 0 0" -set _origin "0 0 0" - // campaign internal, set when loading a campaign map1G set _campaign_index "" set _campaign_name "" @@ -1571,6 +1509,7 @@ exec turrets.cfg exec vehicles.cfg exec crosshairs.cfg exec gamemodes.cfg +exec mutators.cfg exec notifications.cfg // load console command aliases and settings @@ -1604,5 +1543,3 @@ set cl_simpleitems_postfix "_simple" "posfix to add fo model name when simple it set cl_fullbright_items 0 "enable fullbright items (if server allows, controled by g_fullbrightitems)" set cl_weapon_stay_color "2 0.5 0.5" "Color of picked up weapons when g_weapon_stay > 0" 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" diff --git a/effectinfo.txt b/effectinfo.txt index c2f702fa5a..d069d5f0fc 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/gamemodes.cfg b/gamemodes.cfg index a1ad723d27..665fa55849 100644 --- a/gamemodes.cfg +++ b/gamemodes.cfg @@ -278,6 +278,8 @@ seta g_freezetag_point_leadlimit -1 "Freeze Tag point lead limit overriding the set g_freezetag_revive_speed 0.4 "Speed for reviving a frozen teammate" set g_freezetag_revive_clearspeed 1.6 "Speed at which reviving progress gets lost when out of range" set g_freezetag_revive_extra_size 100 "Distance in qu that you can stand from a frozen teammate to keep reviving him" +set g_freezetag_revive_falldamage 0 "Enable reviving from this amount of fall damage" +set g_freezetag_revive_falldamage_health 40 "Amount of health player has if they revived from falling" set g_freezetag_round_timelimit 180 set g_freezetag_frozen_force 0.6 "How much to multiply the force on a frozen player with" set g_freezetag_frozen_maxtime 60 "frozen players will be automatically unfrozen after this time in seconds" @@ -343,9 +345,6 @@ set g_lms 0 "Last Man Standing: everyone starts with a certain amount of lives, set g_lms_lives_override -1 set g_lms_extra_lives 0 set g_lms_regenerate 0 -set g_lms_campcheck_interval 10 -set g_lms_campcheck_damage 100 -set g_lms_campcheck_distance 1800 set g_lms_last_join 3 "if g_lms_join_anytime is false, new players can only join if the worst active player has more than (fraglimit - g_lms_last_join) lives" set g_lms_join_anytime 1 "if true, new players can join, but get same amount of lives as the worst player" 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 0000000000..7bcd7ef966 Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter.md3 differ diff --git a/models/ok_nade_counter/ok_nade_counter.md3_0.skin b/models/ok_nade_counter/ok_nade_counter.md3_0.skin new file mode 100644 index 0000000000..f510486891 --- /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 0000000000..c7bfc3b117 --- /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 0000000000..ee84c4f246 --- /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 0000000000..df0b108a71 --- /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 0000000000..d76d110926 --- /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 0000000000..c25c2b52d4 --- /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 0000000000..df03930482 --- /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 0000000000..3021e514b5 --- /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 0000000000..e3df814e36 --- /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 0000000000..1402b7a0b0 --- /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 0000000000..c58a70da22 Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_01.tga differ diff --git a/models/ok_nade_counter/ok_nade_counter_02.tga b/models/ok_nade_counter/ok_nade_counter_02.tga new file mode 100644 index 0000000000..3d91413b65 Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_02.tga differ diff --git a/models/ok_nade_counter/ok_nade_counter_03.tga b/models/ok_nade_counter/ok_nade_counter_03.tga new file mode 100644 index 0000000000..eddb7cbcc5 Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_03.tga differ diff --git a/models/ok_nade_counter/ok_nade_counter_04.tga b/models/ok_nade_counter/ok_nade_counter_04.tga new file mode 100644 index 0000000000..7f14db672f Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_04.tga differ diff --git a/models/ok_nade_counter/ok_nade_counter_05.tga b/models/ok_nade_counter/ok_nade_counter_05.tga new file mode 100644 index 0000000000..a7cdf8ca2f Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_05.tga differ diff --git a/models/ok_nade_counter/ok_nade_counter_06.tga b/models/ok_nade_counter/ok_nade_counter_06.tga new file mode 100644 index 0000000000..150f061ff4 Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_06.tga differ diff --git a/models/ok_nade_counter/ok_nade_counter_07.tga b/models/ok_nade_counter/ok_nade_counter_07.tga new file mode 100644 index 0000000000..36e5c3b31d Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_07.tga differ diff --git a/models/ok_nade_counter/ok_nade_counter_08.tga b/models/ok_nade_counter/ok_nade_counter_08.tga new file mode 100644 index 0000000000..3f42394935 Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_08.tga differ diff --git a/models/ok_nade_counter/ok_nade_counter_09.tga b/models/ok_nade_counter/ok_nade_counter_09.tga new file mode 100644 index 0000000000..31219ab3fc Binary files /dev/null and b/models/ok_nade_counter/ok_nade_counter_09.tga differ diff --git a/mutators.cfg b/mutators.cfg new file mode 100644 index 0000000000..b43bc006aa --- /dev/null +++ b/mutators.cfg @@ -0,0 +1,169 @@ +// ========================= +// Config for all mutators +// ========================= + + +// ========= +// dodging +// ========= +set g_dodging 0 "set to 1 to enable dodging in games" + +seta cl_dodging_timeout 0.2 "determines how long apart (in seconds) two taps on the same direction key are considered a dodge. use 0 to disable" + +set sv_dodging_wall_dodging 0 "set to 1 to allow dodging off walls. 0 to disable" +set sv_dodging_delay 0.5 "determines how long a player has to wait to be able to dodge again after dodging" +set sv_dodging_up_speed 200 "the jump velocity of the dodge" +set sv_dodging_horiz_speed 400 "the horizontal velocity of the dodge" +set sv_dodging_horiz_speed_frozen 200 "the horizontal velocity of the dodge while frozen" +set sv_dodging_ramp_time 0.1 "a ramp so that the horizontal part of the dodge is added smoothly (seconds)" +set sv_dodging_height_threshold 10 "the maximum height above ground where to allow dodging" +set sv_dodging_wall_distance_threshold 10 "the maximum distance from a wall that still allows dodging" +set sv_dodging_sound 1 "if 1 dodging makes a sound. if 0 dodging is silent" +set sv_dodging_frozen 0 "allow dodging while frozen" + + +// =========== +// minstagib +// =========== +set g_minstagib 0 "enable minstagib" +set g_minstagib_extralives 1 "how many extra lives you will get per powerup" +set g_minstagib_ammo_start 10 "starting ammo" +set g_minstagib_ammo_drop 5 "how much ammo you'll get for weapons or cells" +set g_minstagib_invis_alpha 0.15 +set g_minstagib_speed_highspeed 1.5 "speed-multiplier that applies while you carry the invincibility powerup" + + +// ========= +// vampire +// ========= +set g_vampire 0 "set to 1 to enable the vampire mode, where the damage done to your opponent gets added to your own health" + + +// ========= +// sandbox +// ========= +set g_sandbox 0 "allow players to spawn and edit objects around the map" +set g_sandbox_info 1 "print object information to the server. 1 prints info about spawned / removed objects, 2 also prints info about edited objects" +set g_sandbox_readonly 0 "when this mode is active, players cannot modify objects or use any sandbox commands" +set g_sandbox_storage_name default "name of the selected storage to use" +set g_sandbox_storage_autosave 5 "storage is automatically saved every specified number of seconds" +set g_sandbox_storage_autoload 1 "if a storage file exists for the given map, automatically load it at startup" +set g_sandbox_editor_flood 1 "players must wait this many seconds between spawning objects" +set g_sandbox_editor_maxobjects 1000 "maximum number of objects that may exist at a time" +set g_sandbox_editor_free 1 "0 = players can only copy or edit their own objects, 1 = players can copy but not edit other objects, 2 = players can copy and edit all object" +set g_sandbox_editor_distance_spawn 200 "distance at which objects spawn in front of the player" +set g_sandbox_editor_distance_edit 300 "distance at which players can edit or remove objects they are looking at" +set g_sandbox_object_scale_min 0.1 "minimum scale that objects can be set to" +set g_sandbox_object_scale_max 2 "maximum scale that objects can be set to" +set g_sandbox_object_material_velocity_min 100 "velocity objects must have while colliding for material effects to be applied" +set g_sandbox_object_material_velocity_factor 0.002 "velocity range which decides the intensity of material effects" +set cl_sandbox_clipboard "" + + +// ======================== +// invincible projectiles +// ======================== +set g_invincible_projectiles 0 "set to 1 to disable any damage to projectiles in all balance configs, regardless of g_projectiles_damage" + + +// =============== +// rocket flying +// =============== +set g_rocket_flying 0 "set to 1 to enable rocket flying in all balance configs" + + +// ===================== +// spawn near teammate +// ===================== +set g_spawn_near_teammate 0 "if set, players prefer spawns near a team mate" +set g_spawn_near_teammate_distance 640 "max distance to consider a spawn to be near a team mate" + + +// ======================== +// NIX (No Items Xonotic) +// ======================== +// at each time, everyone uses the same weapon, +// and in regular intervals, this weapon is cycled +set g_nix 0 "No Items Xonotic - instead of pickup items, everyone plays with the same weapon. After some time, a countdown will start, after which everyone will switch to another weapon, and so on" +set g_nix_with_laser 0 "always carry the laser as an additional weapon in NIX" +set g_nix_with_healtharmor 0 "when 1, health and armor still show up in NIX" +set g_nix_with_powerups 0 "when 1, powerups still show up in NIX" + + +// ================ +// physical items +// ================ +set g_physical_items 0 "1 uses ODE physics for dropped weapons, 2 for all items, requires physics_ode to be enabled" +set g_physical_items_damageforcescale 3 "how affected physical weapons are by damage" +set g_physical_items_reset 1 "return map items to their original lotation after being picked up" + + +// =============== +// touch explode +// =============== +set g_touchexplode 0 "touching other players causes an explosion" +set g_touchexplode_radius 50 +set g_touchexplode_damage 10 +set g_touchexplode_edgedamage 0 +set g_touchexplode_force 150 + + +// ================ +// super spectate +// ================ +set 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" + + +// ================== +// melee only arena +// ================== +set g_melee_only 0 "enable melee only arena" + + +// ================ +// random gravity +// ================ +set g_random_gravity 0 "enable random gravity mutator" +set g_random_gravity_delay 3 "delay between gravity changes" +set g_random_gravity_negative_chance 0.5 "chance of gravity being a negative value" +set g_random_gravity_min -2000 "minimum gravity" +set g_random_gravity_max 2000 "maximum gravity" +set g_random_gravity_positive 1000 "positive gravity multiplier" +set g_random_gravity_negative 1000 "negative gravity multiplier" + + +// ======= +// nades +// ======= +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 + + +// ============= +// rifle arena +// ============= +set g_riflearena 0 +set g_riflearena_rifle_secondary_spread 0 +set g_riflearena_rifle_secondary_shots 1 +set g_riflearena_rifle_secondary_animtime 0.15 +set g_riflearena_rifle_secondary_refire 0.15 +set g_riflearena_rifle_secondary_damage 40 + + +// ============ +// camp check +// ============ +set g_campcheck 0 "damages campers every few seconds" +set g_campcheck_interval 10 +set g_campcheck_damage 100 +set g_campcheck_distance 1800 diff --git a/qcsrc/client/projectile.qc b/qcsrc/client/projectile.qc index 09276650dd..de45141a13 100644 --- a/qcsrc/client/projectile.qc +++ b/qcsrc/client/projectile.qc @@ -101,6 +101,18 @@ void Projectile_Draw() case PROJECTILE_GRENADE_BOUNCING: rot = '0 -1000 0'; // sideways break; + case PROJECTILE_NADE_RED_BURN: + case PROJECTILE_NADE_RED: + case PROJECTILE_NADE_BLUE_BURN: + case PROJECTILE_NADE_BLUE: + 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: + rot = self.avelocity; + break; case PROJECTILE_HOOKBOMB: rot = '1000 0 0'; // forward break; @@ -124,6 +136,18 @@ void Projectile_Draw() trailorigin = self.origin; switch(self.cnt) { + 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: + trailorigin += v_up * 4; + break; case PROJECTILE_GRENADE: case PROJECTILE_GRENADE_BOUNCING: trailorigin += v_right * 1 + v_forward * -10; @@ -300,6 +324,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!"); @@ -334,6 +369,17 @@ void Ent_Projectile() self.mins = '-3 -3 -3'; self.maxs = '3 3 3'; break; + case PROJECTILE_NADE_RED_BURN: + case PROJECTILE_NADE_RED: + case PROJECTILE_NADE_BLUE_BURN: + case PROJECTILE_NADE_BLUE: + self.mins = '-3 -3 -3'; + self.maxs = '3 3 3'; + self.move_movetype = MOVETYPE_BOUNCE; + self.move_touch = func_null; + self.scale = 1.5; + self.avelocity = randomvec() * 720; + break; case PROJECTILE_GRENADE_BOUNCING: self.mins = '-3 -3 -3'; self.maxs = '3 3 3'; @@ -342,6 +388,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 = '-16 -16 -16'; + self.maxs = '16 16 16'; + 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'; @@ -460,6 +523,8 @@ void Projectile_Precache() precache_model("models/rocket.md3"); precache_model("models/tagrocket.md3"); precache_model("models/tracer.mdl"); + + precache_model("models/weapons/v_ok_grenade.md3"); precache_sound("weapons/electro_fly.wav"); precache_sound("weapons/rocket_fly.wav"); diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index b399f3857c..1a70b341d3 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 f9a9ceba25..48a269b1a3 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 9bd8d5e32f..1ad03e59b6 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"), "") \ @@ -324,6 +326,7 @@ void Send_Notification_WOVA( MULTITEAM_INFO(1, INFO_DEATH_TEAMKILL_, 4, 3, 1, "s1 s2 s3loc spree_end", "s2 s1", "notify_teamkill_%s", _("^BG%s^K1 was betrayed by ^BG%s^K1%s%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_FREEZETAG_FREEZE, 2, 0, "s1 s2", "", "", _("^BG%s^K1 was frozen by ^BG%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_FREEZETAG_REVIVED, 2, 0, "s1 s2", "", "", _("^BG%s^K3 was revived by ^BG%s\n"), "") \ + MSG_INFO_NOTIF(1, INFO_FREEZETAG_REVIVED_FALL, 1, 0, "s1", "", "", _("^BG%s^K3 was revived by falling\n"), "") \ MSG_INFO_NOTIF(1, INFO_FREEZETAG_AUTO_REVIVED, 1, 1, "s1 f1", "", "", _("^BG%s^K3 was automatically revived after %s second(s)\n"), "") \ MULTITEAM_INFO(1, INFO_ROUND_TEAM_WIN_, 4, 0, 0, "", "", "", _("^TC^TT^BG team wins the round\n"), "") \ MSG_INFO_NOTIF(1, INFO_ROUND_PLAYER_WIN, 1, 0, "s1", "", "", _("^BG%s^BG wins the round\n"), "") \ @@ -438,6 +441,7 @@ void Send_Notification_WOVA( MSG_CENTER_NOTIF(1, CENTER_COUNTDOWN_ROUNDSTOP, 0, 0, "", CPID_ROUND, "2 0", _("^F4Round cannot start"), "") \ MSG_CENTER_NOTIF(1, CENTER_ROUND_TIED, 0, 0, "", CPID_ROUND, "0 0", _("^BGRound tied"), "") \ MSG_CENTER_NOTIF(1, CENTER_ROUND_OVER, 0, 0, "", CPID_ROUND, "0 0", _("^BGRound over, there's no winner"), "") \ + MSG_CENTER_NOTIF(1, CENTER_CAMPCHECK, 0, 0, "", CPID_CAMPCHECK, "0 0", _("^F2Don't camp!"), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_FREE, 0, 0, "", CPID_CTF_CAPSHIELD, "0 0", _("^BGYou are now free.\n^BGFeel free to ^F2try to capture^BG the flag again\n^BGif you think you will succeed."), "") \ MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_SHIELDED, 0, 0, "", CPID_CTF_CAPSHIELD, "0 0", _("^BGYou are now ^F1shielded^BG from the flag\n^BGfor ^F2too many unsuccessful attempts^BG to capture.\n^BGMake some defensive scores before trying again."), "") \ MULTITEAM_CENTER(1, CENTER_CTF_CAPTURE_, 2, 0, 0, "", CPID_CTF_LOWPRIO, "0 0", _("^BGYou captured the ^TC^TT^BG flag!"), "") \ @@ -463,6 +467,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 +478,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!"), _("^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!"), "") \ @@ -500,6 +506,7 @@ void Send_Notification_WOVA( MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_FREEZE, 1, 0, "s1", NO_CPID, "0 0", _("^K3You froze ^BG%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_FROZEN, 1, 0, "s1", NO_CPID, "0 0", _("^K1You were frozen by ^BG%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVE, 1, 0, "s1", NO_CPID, "0 0", _("^K3You revived ^BG%s"), "") \ + MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVE_FALL, 0, 0, "", NO_CPID, "0 0", _("^K3You revived yourself"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_REVIVED, 1, 0, "s1", NO_CPID, "0 0", _("^K3You were revived by ^BG%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_FREEZETAG_AUTO_REVIVED, 0, 1, "f1", NO_CPID, "0 0", _("^K3You were automatically revived after %s second(s)"), "") \ MULTITEAM_CENTER(1, CENTER_ROUND_TEAM_WIN_, 4, 0, 0, "", CPID_ROUND, "0 0", _("^TC^TT^BG team wins the round"), "") \ @@ -526,7 +533,6 @@ void Send_Notification_WOVA( MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_WAIT, 0, 4, "missing_teams", CPID_KEYHUNT_OTHER, "0 0", _("^BGWaiting for players to join...\nNeed active players for: %s"), "") \ MSG_CENTER_NOTIF(1, CENTER_MISSING_TEAMS, 0, 4, "missing_teams", CPID_MISSING_TEAMS, "-1 0", _("^BGWaiting for players to join...\nNeed active players for: %s"), "") \ MSG_CENTER_NOTIF(1, CENTER_MISSING_PLAYERS, 0, 1, "f1", CPID_MISSING_PLAYERS, "-1 0", _("^BGWaiting for %s player(s) to join..."), "") \ - MSG_CENTER_NOTIF(1, CENTER_LMS_CAMPCHECK, 0, 0, "", CPID_LMS_CAMP, "0 0", _("^F2Don't camp!"), "") \ MSG_CENTER_NOTIF(1, CENTER_MINSTA_FINDAMMO, 0, 0, "", CPID_MINSTA_FINDAMMO, "1 9", _("^F4^COUNT^BG left to find some ammo!"), "") \ MSG_CENTER_NOTIF(1, CENTER_MINSTA_FINDAMMO_FIRST, 0, 0, "", CPID_MINSTA_FINDAMMO, "1 10", _("^BGGet some ammo or you'll be dead in ^F4^COUNT^BG!"), _("^BGGet some ammo! ^F4^COUNT^BG left!")) \ MSG_CENTER_NOTIF(1, CENTER_MINSTA_LIVES_REMAINING, 0, 1, "f1", NO_CPID, "0 0", _("^F2Extra lives remaining: ^K1%s"), "") \ @@ -534,6 +540,7 @@ void Send_Notification_WOVA( MSG_CENTER_NOTIF(1, CENTER_MOTD, 1, 0, "s1", CPID_MOTD, "-1 0", _("^BG%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_NIX_COUNTDOWN, 0, 2, "item_wepname", CPID_NIX, "1 f2", _("^F2^COUNT^BG until weapon change...\nNext weapon: ^F1%s"), "") \ MSG_CENTER_NOTIF(1, CENTER_NIX_NEWWEAPON, 0, 1, "item_wepname", CPID_NIX, "0 0", _("^F2Active weapon: ^F1%s"), "") \ + MSG_CENTER_NOTIF(1, CENTER_NADE, 0, 0, "", NO_CPID, "0 0", _("^BGPress ^F2DROPWEAPON^BG again to toss the grenade!"), "") \ MSG_CENTER_NOTIF(1, CENTER_OVERTIME_FRAG, 0, 0, "", CPID_OVERTIME, "0 0", _("^F2Now playing ^F4OVERTIME^F2!\nKeep fragging until we have a winner!"), _("^F2Now playing ^F4OVERTIME^F2!\nKeep scoring until we have a winner!")) \ MSG_CENTER_NOTIF(1, CENTER_OVERTIME_TIME, 0, 1, "f1time", CPID_OVERTIME, "0 0", _("^F2Now playing ^F4OVERTIME^F2!\n^BGAdded ^F4%s^BG to the game!"), "") \ MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_INVISIBILITY, 0, 0, "", CPID_POWERUP, "0 0", _("^F2Invisibility has worn off"), "") \ @@ -561,6 +568,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 +597,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 dead5a9d4b..3d640de5d0 100644 --- a/qcsrc/server/autocvars.qh +++ b/qcsrc/server/autocvars.qh @@ -817,6 +817,8 @@ string autocvar_g_forced_team_red; string autocvar_g_forced_team_yellow; float autocvar_g_freezetag_frozen_force; float autocvar_g_freezetag_frozen_maxtime; +float autocvar_g_freezetag_revive_falldamage; +float autocvar_g_freezetag_revive_falldamage_health; float autocvar_g_freezetag_point_leadlimit; float autocvar_g_freezetag_point_limit; float autocvar_g_freezetag_revive_extra_size; @@ -865,10 +867,7 @@ float autocvar_g_keyhunt_point_leadlimit; #define autocvar_g_keyhunt_point_limit cvar("g_keyhunt_point_limit") float autocvar_g_keyhunt_teams; float autocvar_g_keyhunt_teams_override; -float autocvar_g_lms_campcheck_damage; -float autocvar_g_lms_campcheck_distance; float autocvar_g_lms_extra_lives; -float autocvar_g_lms_campcheck_interval; float autocvar_g_lms_join_anytime; float autocvar_g_lms_last_join; #define autocvar_g_lms_lives_override cvar("g_lms_lives_override") @@ -892,7 +891,6 @@ float autocvar_g_maxplayers; float autocvar_g_maxplayers_spectator_blocktime; float autocvar_g_maxpushtime; float autocvar_g_maxspeed; -#define autocvar_g_midair cvar("g_midair") float autocvar_g_midair_shieldtime; #define autocvar_g_minstagib cvar("g_minstagib") float autocvar_g_minstagib_ammo_drop; @@ -1110,11 +1108,13 @@ float autocvar_sv_defaultplayerskin; float autocvar_sv_dodging_delay; float autocvar_sv_dodging_height_threshold; float autocvar_sv_dodging_horiz_speed; +float autocvar_sv_dodging_horiz_speed_frozen; float autocvar_sv_dodging_ramp_time; float autocvar_sv_dodging_sound; float autocvar_sv_dodging_up_speed; float autocvar_sv_dodging_wall_distance_threshold; float autocvar_sv_dodging_wall_dodging; +float autocvar_sv_dodging_frozen; float autocvar_sv_doublejump; float autocvar_sv_eventlog; float autocvar_sv_eventlog_console; @@ -1234,3 +1234,26 @@ float autocvar_g_touchexplode_radius; float autocvar_g_touchexplode_damage; float autocvar_g_touchexplode_edgedamage; float autocvar_g_touchexplode_force; +#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; diff --git a/qcsrc/server/bot/havocbot/havocbot.qc b/qcsrc/server/bot/havocbot/havocbot.qc index a9a3ea9f62..5b889b8ca1 100644 --- a/qcsrc/server/bot/havocbot/havocbot.qc +++ b/qcsrc/server/bot/havocbot/havocbot.qc @@ -253,9 +253,6 @@ void havocbot_bunnyhop(vector dir) float maxspeed; vector gco, gno; - if(autocvar_g_midair) - return; - // Don't jump when attacking if(self.aistatus & AI_STATUS_ATTACKING) return; diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index c687c4502c..d7ca62ba01 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -1517,15 +1517,6 @@ void player_powerups (void) if(autocvar_g_fullbrightplayers) self.effects = self.effects | EF_FULLBRIGHT; - // midair gamemode: damage only while in the air - // if in midair mode, being on ground grants temporary invulnerability - // (this is so that multishot weapon don't clear the ground flag on the - // first damage in the frame, leaving the player vulnerable to the - // remaining hits in the same frame) - if (self.flags & FL_ONGROUND) - if (g_midair) - self.spawnshieldtime = max(self.spawnshieldtime, time + autocvar_g_midair_shieldtime); - if (time >= game_starttime) if (time < self.spawnshieldtime) self.effects = self.effects | (EF_ADDITIVE | EF_FULLBRIGHT); @@ -2355,8 +2346,6 @@ 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) @@ -2388,15 +2377,6 @@ void PlayerPreThink (void) } } - if(self.health <= g_bloodloss && self.deadflag == DEAD_NO) - { - if(self.bloodloss_timer < time) - { - self.event_damage(self, self, 1, DEATH_ROT, self.origin, '0 0 0'); - self.bloodloss_timer = time + 0.5 + random() * 0.5; - } - } - FixPlayermodel(); GrapplingHookFrame(); @@ -2424,9 +2404,6 @@ void PlayerPreThink (void) if(frametime) player_anim(); - - if(g_nexball) - nexball_setstatus(); // secret status secrets_setstatus(); diff --git a/qcsrc/server/cl_physics.qc b/qcsrc/server/cl_physics.qc index 5ce7b7d475..a7051ff14c 100644 --- a/qcsrc/server/cl_physics.qc +++ b/qcsrc/server/cl_physics.qc @@ -10,10 +10,6 @@ .float wasFlying; .float spectatorspeed; -.float multijump_count; -.float multijump_ready; -.float prevjumpbutton; - /* ============= PlayerJump @@ -23,13 +19,16 @@ When you press the jump key */ void PlayerJump (void) { - if(self.freezetag_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); @@ -52,56 +51,6 @@ void PlayerJump (void) return; } - if (autocvar_g_multijump) - { - if (self.prevjumpbutton == FALSE && !(self.flags & FL_ONGROUND)) // jump button pressed this frame and we are in midair - self.multijump_ready = TRUE; // this is necessary to check that we released the jump button and pressed it again - else - self.multijump_ready = FALSE; - } - - if(!doublejump && self.multijump_ready && self.multijump_count < autocvar_g_multijump && self.velocity_z > autocvar_g_multijump_speed) - { - // doublejump = FALSE; // checked above in the if - if (autocvar_g_multijump) - { - if (autocvar_g_multijump_add == 0) // in this case we make the z velocity == jumpvelocity - { - if (self.velocity_z < mjumpheight) - { - doublejump = TRUE; - self.velocity_z = 0; - } - } - else - doublejump = TRUE; - - if(doublejump) - { - if(self.movement_x != 0 || self.movement_y != 0) // don't remove all speed if player isnt pressing any movement keys - { - float curspeed; - vector wishvel, wishdir; - - curspeed = max( - vlen(vec2(self.velocity)), // current xy speed - vlen(vec2(antilag_takebackavgvelocity(self, max(self.lastteleporttime + sys_frametime, time - 0.25), time))) // average xy topspeed over the last 0.25 secs - ); - makevectors(self.v_angle_y * '0 1 0'); - wishvel = v_forward * self.movement_x + v_right * self.movement_y; - wishdir = normalize(wishvel); - - self.velocity_x = wishdir_x * curspeed; // allow "dodging" at a multijump - self.velocity_y = wishdir_y * curspeed; - // keep velocity_z unchanged! - } - if (autocvar_g_multijump > 0) - self.multijump_count += 1; - } - } - self.multijump_ready = FALSE; // require releasing and pressing the jump button again for the next jump - } - if (!doublejump) if (!(self.flags & FL_ONGROUND)) return; @@ -110,9 +59,6 @@ void PlayerJump (void) if (!(self.flags & FL_JUMPRELEASED)) return; - if(self.health <= g_bloodloss) - return; - // sv_jumpspeedcap_min/sv_jumpspeedcap_max act as baseline // velocity bounds. Final velocity is bound between (jumpheight * // min + jumpheight) and (jumpheight * max + jumpheight); @@ -164,8 +110,8 @@ void PlayerJump (void) self.flags &~= FL_JUMPRELEASED; animdecide_setaction(self, ANIMACTION_JUMP, TRUE); - - if(g_jump_grunt) + + if(autocvar_g_jump_grunt) PlayerSound(playersound_jump, CH_PLAYER, VOICETYPE_PLAYERSOUND); self.restart_jump = -1; // restart jump anim next time @@ -201,14 +147,6 @@ void CheckWaterJump() } void CheckPlayerJump() { - if(self.flags & FL_ONGROUND) - { - if (autocvar_g_multijump > 0) - self.multijump_count = 0; - else - self.multijump_count = -2; // the cvar value for infinite jumps is -1, so this needs to be smaller - } - if (self.BUTTON_JUMP) PlayerJump (); else @@ -216,7 +154,6 @@ void CheckPlayerJump() if (self.waterlevel == WATERLEVEL_SWIMMING) CheckWaterJump (); - self.prevjumpbutton = self.BUTTON_JUMP; } float racecar_angle(float forward, float down) diff --git a/qcsrc/server/cl_player.qc b/qcsrc/server/cl_player.qc index 68a2de3439..fbe6d7aea9 100644 --- a/qcsrc/server/cl_player.qc +++ b/qcsrc/server/cl_player.qc @@ -262,22 +262,9 @@ void player_anim (void) void SpawnThrownWeapon (vector org, float w) { - if(g_pinata) - { - float j; - for(j = WEP_FIRST; j <= WEP_LAST; ++j) - { - if(WEPSET_CONTAINS_EW(self, j)) - if(W_IsWeaponThrowable(j)) - W_ThrowNewWeapon(self, j, FALSE, org, randomvec() * 175 + '0 0 325'); - } - } - else - { - if(WEPSET_CONTAINS_EW(self, self.weapon)) - if(W_IsWeaponThrowable(self.weapon)) - W_ThrowNewWeapon(self, self.weapon, FALSE, org, randomvec() * 125 + '0 0 200'); - } + if(WEPSET_CONTAINS_EW(self, self.weapon)) + if(W_IsWeaponThrowable(self.weapon)) + W_ThrowNewWeapon(self, self.weapon, FALSE, org, randomvec() * 125 + '0 0 200'); } void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force) @@ -498,9 +485,6 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht self.dmg_take = self.dmg_take + take;//max(take - 10, 0); self.dmg_inflictor = inflictor; - if(g_ca && self != attacker && IS_PLAYER(attacker)) - PlayerTeamScore_Add(attacker, SP_SCORE, ST_SCORE, (damage - excess) * autocvar_g_ca_damage2score_multiplier); - float abot, vbot, awep; abot = (IS_BOT_CLIENT(attacker)); vbot = (IS_BOT_CLIENT(self)); diff --git a/qcsrc/server/cl_weaponsystem.qc b/qcsrc/server/cl_weaponsystem.qc index 26af874e2a..81a4f5a7ef 100644 --- a/qcsrc/server/cl_weaponsystem.qc +++ b/qcsrc/server/cl_weaponsystem.qc @@ -233,7 +233,7 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector m ent.dphitcontentsmask = oldsolid; // restore solid type (generally SOLID_SLIDEBOX) - if (!g_norecoil) + if (!autocvar_g_norecoil) ent.punchangle_x = recoil * -1; if (snd != "") @@ -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_EW(cl, wpn) && !WEPSET_CONTAINS_AW(weaponsInMap, wpn)) + complain = 0; if (wpn < WEP_FIRST || wpn > WEP_LAST) { diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index 7d3585725d..74d4345b82 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -16,7 +16,7 @@ noref float require_spawnfunc_prefix; // if this float exists, only functions wi // Globals -float g_cloaked, g_footsteps, g_jump_grunt, g_grappling_hook, g_midair, g_minstagib, g_pinata, g_norecoil, g_bloodloss; +float g_cloaked, g_footsteps, g_grappling_hook, g_minstagib; float g_warmup_limit; float g_warmup_allguns; float g_warmup_allow_timeout; @@ -549,7 +549,6 @@ float client_cefc_accumulatortime; .float spectatee_status; .float zoomstate; -.float bloodloss_timer; .float restriction; .entity clientdata; diff --git a/qcsrc/server/g_damage.qc b/qcsrc/server/g_damage.qc index da013fc75d..bd4fe2b8b0 100644 --- a/qcsrc/server/g_damage.qc +++ b/qcsrc/server/g_damage.qc @@ -626,13 +626,10 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float { attacker.dmg_team = attacker.dmg_team + damage; complainteamdamage = attacker.dmg_team - autocvar_g_teamdamage_threshold; - if(complainteamdamage > 0 && !g_ca) // FIXME why is g_ca ruled out here? Why not just g_mirrordamage 0 on CA servers? + if(complainteamdamage > 0) mirrordamage = autocvar_g_mirrordamage * complainteamdamage; mirrorforce = autocvar_g_mirrordamage * vlen(force); - if(g_ca) - damage = 0; - else - damage = autocvar_g_friendlyfire * damage; + damage = autocvar_g_friendlyfire * damage; // mirrordamage will be used LATER if(autocvar_g_mirrordamage_virtual) @@ -708,7 +705,7 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float if (targ == attacker) { - if(g_ca || (g_cts && !autocvar_g_cts_selfdamage)) + if(g_cts && !autocvar_g_cts_selfdamage) damage = 0; else damage = damage * autocvar_g_balance_selfdamagepercent; // Partial damage if the attacker hits himself @@ -772,7 +769,7 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float // apply push if (self.damageforcescale) if (vlen(force)) - if (!IS_PLAYER(self) || time >= self.spawnshieldtime || g_midair) + if (!IS_PLAYER(self) || time >= self.spawnshieldtime) { vector farce = damage_explosion_calcpush(self.damageforcescale * force, self.velocity, autocvar_g_balance_damagepush_speedfactor); if(self.movetype == MOVETYPE_PHYSICS) diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index 7146c2fc72..e8b3450983 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -706,10 +706,6 @@ void spawnfunc_worldspawn (void) if(autocvar_g_norecoil) s = strcat(s, ":norecoil"); - // TODO to mutator system - if(autocvar_g_midair) - s = strcat(s, ":midair"); - // TODO to mutator system if(autocvar_g_powerups == 0) s = strcat(s, ":no_powerups"); diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index df09032139..018e4a3cb7 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -767,7 +767,6 @@ void readplayerstartcvars() if (g_weaponarena) { - g_pinata = 0; // incompatible g_weapon_stay = 0; // incompatible WEPSET_COPY_AA(start_weapons, g_weaponarena_weapons); start_items |= IT_UNLIMITED_AMMO; @@ -789,10 +788,7 @@ void readplayerstartcvars() if(!cvar("g_use_ammunition")) start_items |= IT_UNLIMITED_AMMO; - - if(cvar("g_nexball")) - start_items |= IT_UNLIMITED_SUPERWEAPONS; // FIXME BAD BAD BAD BAD HACK, NEXBALL SHOULDN'T ABUSE PORTO'S WEAPON SLOT - + if(start_items & IT_UNLIMITED_WEAPON_AMMO) { start_ammo_rockets = 999; @@ -919,7 +915,16 @@ 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_pinata", mutator_pinata, !cvar("g_minstagib")); + CHECK_MUTATOR_ADD("g_midair", mutator_midair, 1); + CHECK_MUTATOR_ADD("g_bloodloss", mutator_bloodloss, !cvar("g_minstagib")); + CHECK_MUTATOR_ADD("g_random_gravity", mutator_random_gravity, 1); + CHECK_MUTATOR_ADD("g_multijump", mutator_multijump, 1); + CHECK_MUTATOR_ADD("g_melee_only", mutator_melee_only, !cvar("g_minstagib")); + CHECK_MUTATOR_ADD("g_nades", mutator_nades, 1); CHECK_MUTATOR_ADD("g_sandbox", sandbox, 1); + CHECK_MUTATOR_ADD("g_riflearena", mutator_riflearena, !cvar("g_minstagib")); + CHECK_MUTATOR_ADD("g_campcheck", mutator_campcheck, 1); #undef CHECK_MUTATOR_ADD @@ -949,13 +954,9 @@ void readlevelcvars(void) g_cloaked = cvar("g_cloaked"); if(g_cts) g_cloaked = 1; // always enable cloak in CTS - g_jump_grunt = cvar("g_jump_grunt"); g_footsteps = cvar("g_footsteps"); g_grappling_hook = cvar("g_grappling_hook"); g_jetpack = cvar("g_jetpack"); - g_midair = cvar("g_midair"); - g_norecoil = cvar("g_norecoil"); - g_bloodloss = cvar("g_bloodloss"); sv_maxidle = cvar("sv_maxidle"); sv_maxidle_spectatorsareidle = cvar("sv_maxidle_spectatorsareidle"); sv_autotaunt = cvar("sv_autotaunt"); @@ -966,7 +967,7 @@ void readlevelcvars(void) g_warmup_allguns = cvar("g_warmup_allguns"); g_warmup_allow_timeout = cvar("g_warmup_allow_timeout"); - if ((g_race && g_race_qualifying == 2) || g_arena || g_minstagib || g_assault || cvar("g_campaign")) + if ((g_race && g_race_qualifying == 2) || g_arena || g_assault || cvar("g_campaign")) inWarmupStage = 0; // these modes cannot work together, sorry g_pickup_respawntime_weapon = cvar("g_pickup_respawntime_weapon"); @@ -1029,8 +1030,6 @@ void readlevelcvars(void) g_pickup_ammo_anyway = cvar("g_pickup_ammo_anyway"); g_pickup_weapons_anyway = cvar("g_pickup_weapons_anyway"); - g_pinata = cvar("g_pinata"); - g_weapon_stay = cvar(strcat("g_", GetGametype(), "_weapon_stay")); if(!g_weapon_stay) g_weapon_stay = cvar("g_weapon_stay"); diff --git a/qcsrc/server/mutators/base.qh b/qcsrc/server/mutators/base.qh index ee0da7e0cd..98a44944dd 100644 --- a/qcsrc/server/mutators/base.qh +++ b/qcsrc/server/mutators/base.qh @@ -72,6 +72,11 @@ MUTATOR_HOOKABLE(PlayerDies); entity frag_attacker; entity frag_target; // same as self float frag_deathtype; + +MUTATOR_HOOKABLE(PlayerJump); + // called when a player presses the jump key + // INPUT, OUTPUT: + float player_multijump; MUTATOR_HOOKABLE(GiveFragsForKill); // called when someone was fragged by "self", and is expected to change frag_score to adjust scoring for the kill diff --git a/qcsrc/server/mutators/gamemode_arena.qc b/qcsrc/server/mutators/gamemode_arena.qc index 46b8faccc1..bb6312ea1f 100644 --- a/qcsrc/server/mutators/gamemode_arena.qc +++ b/qcsrc/server/mutators/gamemode_arena.qc @@ -237,6 +237,15 @@ MUTATOR_HOOKFUNCTION(arena_SV_StartFrame) return 1; } +MUTATOR_HOOKFUNCTION(arena_FilterItem) +{ + if(autocvar_g_powerups <= 0) + if(self.flags & FL_POWERUP) + return TRUE; + + return FALSE; +} + void arena_Initialize() { maxspawned = max(2, autocvar_g_arena_maxspawned); @@ -260,6 +269,7 @@ MUTATOR_DEFINITION(gamemode_arena) MUTATOR_HOOK(GiveFragsForKill, arena_GiveFragsForKill, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerDies, arena_PlayerDies, CBC_ORDER_ANY); MUTATOR_HOOK(SV_StartFrame, arena_SV_StartFrame, CBC_ORDER_ANY); + MUTATOR_HOOK(FilterItem, arena_FilterItem, CBC_ORDER_ANY); MUTATOR_ONADD { diff --git a/qcsrc/server/mutators/gamemode_ca.qc b/qcsrc/server/mutators/gamemode_ca.qc index 7c8c1cb77c..7c49045650 100644 --- a/qcsrc/server/mutators/gamemode_ca.qc +++ b/qcsrc/server/mutators/gamemode_ca.qc @@ -238,6 +238,40 @@ MUTATOR_HOOKFUNCTION(ca_SetStartItems) return 0; } +MUTATOR_HOOKFUNCTION(ca_PlayerDamage) +{ + if(IS_PLAYER(frag_target)) + if(frag_target.deadflag == DEAD_NO) + if(frag_target == frag_attacker || !IsDifferentTeam(frag_target, frag_attacker) || frag_deathtype == DEATH_FALL) + frag_damage = 0; + + frag_mirrordamage = 0; + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(ca_FilterItem) +{ + if(autocvar_g_powerups <= 0) + if(self.flags & FL_POWERUP) + return TRUE; + + if(autocvar_g_pickup_items <= 0) + return TRUE; + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(ca_PlayerDamage_SplitHealthArmor) +{ + float excess = max(0, frag_damage - damage_take - damage_save); + + if(frag_target != frag_attacker && IS_PLAYER(frag_attacker)) + PlayerTeamScore_Add(frag_attacker, SP_SCORE, ST_SCORE, (frag_damage - excess) * autocvar_g_ca_damage2score_multiplier); + + return FALSE; +} + // scoreboard setup void ca_ScoreRules() { @@ -280,6 +314,9 @@ MUTATOR_DEFINITION(gamemode_ca) MUTATOR_HOOK(ForbidThrowCurrentWeapon, ca_ForbidThrowCurrentWeapon, CBC_ORDER_ANY); MUTATOR_HOOK(GiveFragsForKill, ca_GiveFragsForKill, CBC_ORDER_FIRST); MUTATOR_HOOK(SetStartItems, ca_SetStartItems, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerDamage_Calculate, ca_PlayerDamage, CBC_ORDER_ANY); + MUTATOR_HOOK(FilterItem, ca_FilterItem, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerDamage_SplitHealthArmor, ca_PlayerDamage_SplitHealthArmor, CBC_ORDER_ANY); MUTATOR_ONADD { diff --git a/qcsrc/server/mutators/gamemode_freezetag.qc b/qcsrc/server/mutators/gamemode_freezetag.qc index 82147826ee..eec33b2ec1 100644 --- a/qcsrc/server/mutators/gamemode_freezetag.qc +++ b/qcsrc/server/mutators/gamemode_freezetag.qc @@ -523,7 +523,15 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPhysics) { if(self.freezetag_frozen) { - self.movement = '0 0 0'; + if(autocvar_sv_dodging_frozen) + { + self.movement_x = bound(-5, self.movement_x, 5); + self.movement_y = bound(-5, self.movement_y, 5); + self.movement_z = bound(-5, self.movement_z, 5); + } + else + self.movement = '0 0 0'; + self.disableclientprediction = 1; } return 1; @@ -533,12 +541,31 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDamage_Calculate) { if(frag_target.freezetag_frozen && 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; } return 1; } +MUTATOR_HOOKFUNCTION(freezetag_PlayerJump) +{ + if(self.freezetag_frozen) + return TRUE; // no jumping in freezetag when frozen + + return FALSE; +} + MUTATOR_HOOKFUNCTION(freezetag_ForbidThrowCurrentWeapon) { if (self.freezetag_frozen) @@ -619,6 +646,7 @@ MUTATOR_DEFINITION(gamemode_freezetag) MUTATOR_HOOK(PlayerPreThink, freezetag_PlayerPreThink, CBC_ORDER_FIRST); MUTATOR_HOOK(PlayerPhysics, freezetag_PlayerPhysics, CBC_ORDER_FIRST); MUTATOR_HOOK(PlayerDamage_Calculate, freezetag_PlayerDamage_Calculate, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerJump, freezetag_PlayerJump, CBC_ORDER_ANY); MUTATOR_HOOK(ForbidThrowCurrentWeapon, freezetag_ForbidThrowCurrentWeapon, CBC_ORDER_ANY); MUTATOR_HOOK(ItemTouch, freezetag_ItemTouch, CBC_ORDER_ANY); MUTATOR_HOOK(HavocBot_ChooseRule, freezetag_BotRoles, CBC_ORDER_ANY); diff --git a/qcsrc/server/mutators/gamemode_lms.qc b/qcsrc/server/mutators/gamemode_lms.qc index 193b5378ec..aa8e8f37ea 100644 --- a/qcsrc/server/mutators/gamemode_lms.qc +++ b/qcsrc/server/mutators/gamemode_lms.qc @@ -46,14 +46,6 @@ MUTATOR_HOOKFUNCTION(lms_PlayerPreSpawn) return FALSE; } -MUTATOR_HOOKFUNCTION(lms_PlayerSpawn) -{ - self.lms_nextcheck = time + autocvar_g_lms_campcheck_interval*2; - self.lms_traveled_distance = 0; - - return FALSE; -} - MUTATOR_HOOKFUNCTION(lms_PlayerDies) { self.respawn_flags |= RESPAWN_FORCE; @@ -97,50 +89,6 @@ MUTATOR_HOOKFUNCTION(lms_PlayerThink) if(self.deadflag == DEAD_DYING) self.deadflag = DEAD_RESPAWNING; - if not(self.deadflag) - if(autocvar_g_lms_campcheck_interval) - { - vector dist; - - // calculate player movement (in 2 dimensions only, so jumping on one spot doesn't count as movement) - dist = self.prevorigin - self.origin; - dist_z = 0; - self.lms_traveled_distance += fabs(vlen(dist)); - - if((autocvar_g_campaign && !campaign_bots_may_start) || (time < game_starttime)) - { - self.lms_nextcheck = time + autocvar_g_lms_campcheck_interval*2; - self.lms_traveled_distance = 0; - } - - if(time > self.lms_nextcheck) - { - if(self.lms_traveled_distance < autocvar_g_lms_campcheck_distance) - { - Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_LMS_CAMPCHECK); - if(self.vehicle) - Damage(self.vehicle, self, self, autocvar_g_lms_campcheck_damage * 2, DEATH_CAMP, self.vehicle.origin, '0 0 0'); - else - Damage(self, self, self, bound(0, autocvar_g_lms_campcheck_damage, self.health + self.armorvalue * autocvar_g_balance_armor_blockpercent + 5), DEATH_CAMP, self.origin, '0 0 0'); - } - self.lms_nextcheck = time + autocvar_g_lms_campcheck_interval; - self.lms_traveled_distance = 0; - } - } - - return FALSE; -} - -MUTATOR_HOOKFUNCTION(lms_PlayerDamage) -{ - if(IS_PLAYER(frag_target)) - if(IS_PLAYER(frag_attacker)) - if(frag_attacker != frag_target) - { - frag_target.lms_traveled_distance = autocvar_g_lms_campcheck_distance; - frag_attacker.lms_traveled_distance = autocvar_g_lms_campcheck_distance; - } - return FALSE; } @@ -237,12 +185,10 @@ MUTATOR_DEFINITION(gamemode_lms) MUTATOR_HOOK(reset_map_global, lms_ResetMap, CBC_ORDER_ANY); MUTATOR_HOOK(reset_map_players, lms_ResetPlayers, CBC_ORDER_ANY); MUTATOR_HOOK(PutClientInServer, lms_PlayerPreSpawn, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerSpawn, lms_PlayerSpawn, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerDies, lms_PlayerDies, CBC_ORDER_ANY); MUTATOR_HOOK(MakePlayerObserver, lms_RemovePlayer, CBC_ORDER_ANY); MUTATOR_HOOK(ClientConnect, lms_ClientConnect, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerPreThink, lms_PlayerThink, CBC_ORDER_ANY); - MUTATOR_HOOK(PlayerDamage_Calculate, lms_PlayerDamage, CBC_ORDER_ANY); MUTATOR_HOOK(ForbidThrowCurrentWeapon, lms_ForbidThrowing, CBC_ORDER_ANY); MUTATOR_HOOK(GiveFragsForKill, lms_GiveFragsForKill, CBC_ORDER_ANY); MUTATOR_HOOK(SetStartItems, lms_SetStartItems, CBC_ORDER_ANY); diff --git a/qcsrc/server/mutators/gamemode_lms.qh b/qcsrc/server/mutators/gamemode_lms.qh index 508bf8c6cd..16fda61550 100644 --- a/qcsrc/server/mutators/gamemode_lms.qh +++ b/qcsrc/server/mutators/gamemode_lms.qh @@ -5,8 +5,4 @@ // lives related defs float lms_lowest_lives; float lms_next_place; -float LMS_NewPlayerLives(); - -// camp check -.float lms_nextcheck; -.float lms_traveled_distance; \ No newline at end of file +float LMS_NewPlayerLives(); \ No newline at end of file diff --git a/qcsrc/server/mutators/gamemode_nexball.qc b/qcsrc/server/mutators/gamemode_nexball.qc index 78d9d70768..adfb31a1b5 100644 --- a/qcsrc/server/mutators/gamemode_nexball.qc +++ b/qcsrc/server/mutators/gamemode_nexball.qc @@ -929,6 +929,9 @@ MUTATOR_HOOKFUNCTION(nexball_PlayerPreThink) } } + + nexball_setstatus(); + return FALSE; } @@ -944,6 +947,13 @@ MUTATOR_HOOKFUNCTION(nexball_PlayerSpawn) return FALSE; } +MUTATOR_HOOKFUNCTION(nexball_SetStartItems) +{ + start_items |= IT_UNLIMITED_SUPERWEAPONS; // FIXME BAD BAD BAD BAD HACK, NEXBALL SHOULDN'T ABUSE PORTO'S WEAPON SLOT + + return FALSE; +} + MUTATOR_DEFINITION(gamemode_nexball) { MUTATOR_HOOK(PlayerDies, nexball_BallDrop, CBC_ORDER_ANY); @@ -953,6 +963,7 @@ MUTATOR_DEFINITION(gamemode_nexball) MUTATOR_HOOK(BuildMutatorsString, nexball_BuildMutatorsString, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerSpawn, nexball_PlayerSpawn, CBC_ORDER_ANY); MUTATOR_HOOK(PlayerPreThink, nexball_PlayerPreThink, CBC_ORDER_ANY); + MUTATOR_HOOK(SetStartItems, nexball_SetStartItems, CBC_ORDER_ANY); MUTATOR_ONADD { diff --git a/qcsrc/server/mutators/mutator_bloodloss.qc b/qcsrc/server/mutators/mutator_bloodloss.qc new file mode 100644 index 0000000000..adffdece9b --- /dev/null +++ b/qcsrc/server/mutators/mutator_bloodloss.qc @@ -0,0 +1,48 @@ +.float bloodloss_timer; + +MUTATOR_HOOKFUNCTION(bloodloss_PlayerThink) +{ + if(IS_PLAYER(self)) + if(self.health <= autocvar_g_bloodloss && self.deadflag == DEAD_NO) + { + self.BUTTON_CROUCH = TRUE; + + if(time >= self.bloodloss_timer) + { + self.event_damage(self, self, 1, DEATH_ROT, self.origin, '0 0 0'); + self.bloodloss_timer = time + 0.5 + random() * 0.5; + } + } + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(bloodloss_PlayerJump) +{ + if(self.health <= autocvar_g_bloodloss) + return TRUE; + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(bloodloss_BuildMutatorsString) +{ + ret_string = strcat(ret_string, ":bloodloss"); + return FALSE; +} + +MUTATOR_HOOKFUNCTION(bloodloss_BuildMutatorsPrettyString) +{ + ret_string = strcat(ret_string, ", Blood loss"); + return FALSE; +} + +MUTATOR_DEFINITION(mutator_bloodloss) +{ + MUTATOR_HOOK(PlayerPreThink, bloodloss_PlayerThink, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerJump, bloodloss_PlayerJump, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsString, bloodloss_BuildMutatorsString, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsPrettyString, bloodloss_BuildMutatorsPrettyString, CBC_ORDER_ANY); + + return FALSE; +} diff --git a/qcsrc/server/mutators/mutator_campcheck.qc b/qcsrc/server/mutators/mutator_campcheck.qc new file mode 100644 index 0000000000..d9d219c5ad --- /dev/null +++ b/qcsrc/server/mutators/mutator_campcheck.qc @@ -0,0 +1,84 @@ +.float campcheck_nextcheck; +.float campcheck_traveled_distance; + +MUTATOR_HOOKFUNCTION(campcheck_PlayerDies) +{ + Kill_Notification(NOTIF_ONE_ONLY, self, MSG_CENTER_CPID, CPID_CAMPCHECK); + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(campcheck_PlayerDamage) +{ + if(IS_PLAYER(frag_target)) + if(IS_PLAYER(frag_attacker)) + if(frag_attacker != frag_target) + { + frag_target.campcheck_traveled_distance = autocvar_g_campcheck_distance; + frag_attacker.campcheck_traveled_distance = autocvar_g_campcheck_distance; + } + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(campcheck_PlayerThink) +{ + if(IS_PLAYER(self)) + if(self.deadflag == DEAD_NO) + if(autocvar_g_campcheck_interval) + { + vector dist; + + // calculate player movement (in 2 dimensions only, so jumping on one spot doesn't count as movement) + dist = self.prevorigin - self.origin; + dist_z = 0; + self.campcheck_traveled_distance += fabs(vlen(dist)); + + if((autocvar_g_campaign && !campaign_bots_may_start) || (time < game_starttime) || (round_handler_IsActive() && !round_handler_IsRoundStarted())) + { + self.campcheck_nextcheck = time + autocvar_g_campcheck_interval * 2; + self.campcheck_traveled_distance = 0; + } + + if(time > self.campcheck_nextcheck) + { + if(self.campcheck_traveled_distance < autocvar_g_campcheck_distance) + { + Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_CAMPCHECK); + if(self.vehicle) + Damage(self.vehicle, self, self, autocvar_g_campcheck_damage * 2, DEATH_CAMP, self.vehicle.origin, '0 0 0'); + else + Damage(self, self, self, bound(0, autocvar_g_campcheck_damage, self.health + self.armorvalue * autocvar_g_balance_armor_blockpercent + 5), DEATH_CAMP, self.origin, '0 0 0'); + } + self.campcheck_nextcheck = time + autocvar_g_campcheck_interval; + self.campcheck_traveled_distance = 0; + } + } + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(campcheck_PlayerSpawn) +{ + self.campcheck_nextcheck = time + autocvar_g_campcheck_interval * 2; + self.campcheck_traveled_distance = 0; + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(campcheck_BuildMutatorsString) +{ + ret_string = strcat(ret_string, ":CampCheck"); + return FALSE; +} + +MUTATOR_DEFINITION(mutator_campcheck) +{ + MUTATOR_HOOK(PlayerDies, campcheck_PlayerDies, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerDamage_Calculate, campcheck_PlayerDamage, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerPreThink, campcheck_PlayerThink, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerSpawn, campcheck_PlayerSpawn, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsString, campcheck_BuildMutatorsString, CBC_ORDER_ANY); + + return FALSE; +} diff --git a/qcsrc/server/mutators/mutator_dodging.qc b/qcsrc/server/mutators/mutator_dodging.qc index 1d6dd911eb..0101b98c5c 100644 --- a/qcsrc/server/mutators/mutator_dodging.qc +++ b/qcsrc/server/mutators/mutator_dodging.qc @@ -16,17 +16,11 @@ // and to ramp up the dodge acceleration in the physics hook. .float last_dodging_time; -// set to 1 to indicate dodging has started.. reset by physics hook after dodge has been done.. -.float dodging_action; - // This is the velocity gain to be added over the ramp time. // It will decrease from frame to frame during dodging_action = 1 // until it's 0. .float dodging_velocity_gain; -// the jump part of the dodge cannot be ramped -.float dodging_single_action; - MUTATOR_HOOKFUNCTION(dodging_GetCvars) { GetCvars_handleFloat(get_cvars_s, get_cvars_f, cvar_cl_dodging_timeout, "cl_dodging_timeout"); return 0; @@ -39,6 +33,10 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) { float new_velocity_gain; float velocity_difference; float clean_up_and_do_nothing; + float horiz_speed = autocvar_sv_dodging_horiz_speed; + + if(self.freezetag_frozen) + horiz_speed = autocvar_sv_dodging_horiz_speed_frozen; if (self.deadflag != DEAD_NO) return 0; @@ -72,7 +70,7 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) { if (common_factor > 1) common_factor = 1; - new_velocity_gain = self.dodging_velocity_gain - (common_factor * autocvar_sv_dodging_horiz_speed); + new_velocity_gain = self.dodging_velocity_gain - (common_factor * horiz_speed); if (new_velocity_gain < 0) new_velocity_gain = 0; diff --git a/qcsrc/server/mutators/mutator_dodging.qh b/qcsrc/server/mutators/mutator_dodging.qh index 8e8be2513d..9840325d97 100644 --- a/qcsrc/server/mutators/mutator_dodging.qh +++ b/qcsrc/server/mutators/mutator_dodging.qh @@ -1,2 +1,7 @@ float g_dodging; +// set to 1 to indicate dodging has started.. reset by physics hook after dodge has been done.. +.float dodging_action; + +// the jump part of the dodge cannot be ramped +.float dodging_single_action; diff --git a/qcsrc/server/mutators/mutator_melee_only.qc b/qcsrc/server/mutators/mutator_melee_only.qc new file mode 100644 index 0000000000..639bba507c --- /dev/null +++ b/qcsrc/server/mutators/mutator_melee_only.qc @@ -0,0 +1,44 @@ +MUTATOR_HOOKFUNCTION(melee_SetStartItems) +{ + start_ammo_shells = 0; + warmup_start_ammo_shells = 0; + + WEPSET_COPY_AW(start_weapons, WEP_SHOTGUN); + WEPSET_COPY_AW(warmup_start_weapons, WEP_SHOTGUN); + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(melee_FilterItem) +{ + switch (self.items) + { + case IT_5HP: + case IT_ARMOR_SHARD: + return FALSE; + } + + return TRUE; +} + +MUTATOR_HOOKFUNCTION(melee_BuildMutatorsString) +{ + ret_string = strcat(ret_string, ":MeleeOnly"); + return FALSE; +} + +MUTATOR_HOOKFUNCTION(melee_BuildMutatorsPrettyString) +{ + ret_string = strcat(ret_string, ", Melee Only Arena"); + return FALSE; +} + +MUTATOR_DEFINITION(mutator_melee_only) +{ + MUTATOR_HOOK(SetStartItems, melee_SetStartItems, CBC_ORDER_ANY); + MUTATOR_HOOK(FilterItem, melee_FilterItem, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsString, melee_BuildMutatorsString, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsPrettyString, melee_BuildMutatorsPrettyString, CBC_ORDER_ANY); + + return FALSE; +} diff --git a/qcsrc/server/mutators/mutator_midair.qc b/qcsrc/server/mutators/mutator_midair.qc new file mode 100644 index 0000000000..0d48fef9d0 --- /dev/null +++ b/qcsrc/server/mutators/mutator_midair.qc @@ -0,0 +1,54 @@ +.float midair_shieldtime; + +MUTATOR_HOOKFUNCTION(midair_PlayerDamage) +{ + if(IS_PLAYER(frag_attacker)) + if(IS_PLAYER(frag_target)) + if(time < self.midair_shieldtime) + frag_damage = FALSE; + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(midair_PlayerPowerups) +{ + if(time >= game_starttime) + if(self.flags & FL_ONGROUND) + { + self.effects |= (EF_ADDITIVE | EF_FULLBRIGHT); + self.midair_shieldtime = max(self.midair_shieldtime, time + autocvar_g_midair_shieldtime); + } + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(midair_PlayerSpawn) +{ + if(IS_BOT_CLIENT(self)) + self.bot_moveskill = 0; // disable bunnyhopping + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(midair_BuildMutatorsString) +{ + ret_string = strcat(ret_string, ":midair"); + return FALSE; +} + +MUTATOR_HOOKFUNCTION(midair_BuildMutatorsPrettyString) +{ + ret_string = strcat(ret_string, ", Midair"); + return FALSE; +} + +MUTATOR_DEFINITION(mutator_midair) +{ + MUTATOR_HOOK(PlayerDamage_Calculate, midair_PlayerDamage, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerPowerups, midair_PlayerPowerups, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerSpawn, midair_PlayerSpawn, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsString, midair_BuildMutatorsString, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsPrettyString, midair_BuildMutatorsPrettyString, CBC_ORDER_ANY); + + return FALSE; +} diff --git a/qcsrc/server/mutators/mutator_minstagib.qc b/qcsrc/server/mutators/mutator_minstagib.qc index a0786b7dab..9b4bd7012f 100644 --- a/qcsrc/server/mutators/mutator_minstagib.qc +++ b/qcsrc/server/mutators/mutator_minstagib.qc @@ -203,6 +203,7 @@ MUTATOR_HOOKFUNCTION(minstagib_SplitHealthArmor) MUTATOR_HOOKFUNCTION(minstagib_ForbidThrowing) { // weapon dropping on death handled by FilterItem + nades_CheckThrow(); return TRUE; } @@ -275,6 +276,7 @@ MUTATOR_HOOKFUNCTION(minstagib_SetStartItems) start_health = 100; start_armorvalue = 0; WEPSET_COPY_AW(start_weapons, WEP_MINSTANEX); + WEPSET_COPY_AW(warmup_start_weapons, WEP_MINSTANEX); start_items |= IT_UNLIMITED_SUPERWEAPONS; return FALSE; diff --git a/qcsrc/server/mutators/mutator_multijump.qc b/qcsrc/server/mutators/mutator_multijump.qc new file mode 100644 index 0000000000..c945e1c2f4 --- /dev/null +++ b/qcsrc/server/mutators/mutator_multijump.qc @@ -0,0 +1,88 @@ +.float multijump_count; +.float multijump_ready; + +MUTATOR_HOOKFUNCTION(multijump_PlayerPhysics) +{ + if(self.flags & FL_ONGROUND) + { + if (autocvar_g_multijump > 0) + self.multijump_count = 0; + else + self.multijump_count = -2; // the cvar value for infinite jumps is -1, so this needs to be smaller + } + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(multijump_PlayerJump) +{ + if (self.flags & FL_JUMPRELEASED && !(self.flags & FL_ONGROUND)) // jump button pressed this frame and we are in midair + self.multijump_ready = TRUE; // this is necessary to check that we released the jump button and pressed it again + else + self.multijump_ready = FALSE; + + if(!player_multijump && self.multijump_ready && self.multijump_count < autocvar_g_multijump && self.velocity_z > autocvar_g_multijump_speed) + { + if (autocvar_g_multijump) + { + if (autocvar_g_multijump_add == 0) // in this case we make the z velocity == jumpvelocity + { + if (self.velocity_z < autocvar_sv_jumpvelocity) + { + player_multijump = TRUE; + self.velocity_z = 0; + } + } + else + player_multijump = TRUE; + + if(player_multijump) + { + if(self.movement_x != 0 || self.movement_y != 0) // don't remove all speed if player isnt pressing any movement keys + { + float curspeed; + vector wishvel, wishdir; + + curspeed = max( + vlen(vec2(self.velocity)), // current xy speed + vlen(vec2(antilag_takebackavgvelocity(self, max(self.lastteleporttime + sys_frametime, time - 0.25), time))) // average xy topspeed over the last 0.25 secs + ); + makevectors(self.v_angle_y * '0 1 0'); + wishvel = v_forward * self.movement_x + v_right * self.movement_y; + wishdir = normalize(wishvel); + + self.velocity_x = wishdir_x * curspeed; // allow "dodging" at a multijump + self.velocity_y = wishdir_y * curspeed; + // keep velocity_z unchanged! + } + if (autocvar_g_multijump > 0) + self.multijump_count += 1; + } + } + self.multijump_ready = FALSE; // require releasing and pressing the jump button again for the next jump + } + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(multijump_BuildMutatorsString) +{ + ret_string = strcat(ret_string, ":multijump"); + return FALSE; +} + +MUTATOR_HOOKFUNCTION(multijump_BuildMutatorsPrettyString) +{ + ret_string = strcat(ret_string, ", Multi jump"); + return FALSE; +} + +MUTATOR_DEFINITION(mutator_multijump) +{ + MUTATOR_HOOK(PlayerPhysics, multijump_PlayerPhysics, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerJump, multijump_PlayerJump, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsString, multijump_BuildMutatorsString, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsPrettyString, multijump_BuildMutatorsPrettyString, CBC_ORDER_ANY); + + return FALSE; +} diff --git a/qcsrc/server/mutators/mutator_nades.qc b/qcsrc/server/mutators/mutator_nades.qc new file mode 100644 index 0000000000..a223f8be2b --- /dev/null +++ b/qcsrc/server/mutators/mutator_nades.qc @@ -0,0 +1,398 @@ +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() +{ + string expef; + + switch(self.realowner.team) + { + case NUM_TEAM_1: expef = "nade_red_explode"; break; + case NUM_TEAM_2: expef = "nade_blue_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); + + Damage_DamageInfo(self.origin, autocvar_g_nades_nade_damage, autocvar_g_nades_nade_edgedamage, autocvar_g_nades_nade_radius, '1 1 1' * autocvar_g_nades_nade_force, self.projectiledeathtype, 0, self); + + 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 == self.max_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 = self.max_health * 0.55; + } + + if(DEATH_ISWEAPON(deathtype, WEP_UZI)) + damage = self.max_health * 0.1; + + if(DEATH_ISWEAPON(deathtype, WEP_SHOTGUN) && !(deathtype & HITTYPE_SECONDARY)) + damage = self.max_health * 1.1; + + if(DEATH_ISWEAPON(deathtype, WEP_SHOTGUN) && (deathtype & HITTYPE_SECONDARY)) + { + damage = self.max_health * 0.1; + force *= 15; + } + + self.velocity += force; + + if(!damage || (self.flags & FL_ONGROUND && IS_PLAYER(attacker))) + return; + + if(self.health == self.max_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; + + remove(e.fake_nade); + e.fake_nade = world; + + makevectors(e.v_angle); + + W_SetupShot(e, FALSE, FALSE, "", CH_WEAPON_A, 0); + + Kill_Notification(NOTIF_ONE_ONLY, e, MSG_CENTER_CPID, CPID_NADES); + + //setorigin(_nade, CENTER_OR_VIEWOFS(e) + (v_right * 10) * -1); + setorigin(_nade, w_shotorg + (v_right * 25) * -1); + setmodel(_nade, "models/weapons/v_ok_grenade.md3"); + setattachment(_nade, world, ""); + PROJECTILE_MAKETRIGGER(_nade); + setsize(_nade, '-16 -16 -16', '16 16 16'); + _nade.movetype = MOVETYPE_BOUNCE; + + tracebox(_nade.origin, _nade.mins, _nade.maxs, _nade.origin, FALSE, _nade); + if (trace_startsolid) + setorigin(_nade, e.origin); + + 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, TRUE); + + //_nade.solid = SOLID_BBOX; // TODO: remember why this was needed + _nade.touch = nade_touch; + _nade.health = autocvar_g_nades_nade_health; + _nade.max_health = _nade.health; + _nade.takedamage = DAMAGE_AIM; + _nade.event_damage = nade_damage; + _nade.teleportable = TRUE; + _nade.pushable = TRUE; + _nade.gravity = 1; + _nade.missile_flags = MIF_SPLASH | MIF_ARC; + _nade.damagedbycontents = TRUE; + _nade.angles = vectoangles(_nade.velocity); + _nade.flags = FL_PROJECTILE; + + 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); + + if(self.fake_nade) + remove(self.fake_nade); + + self.nade = spawn(); + setmodel(self.nade, "null"); + setattachment(self.nade, self, "bip01 l hand"); + 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.lifetime = time; + self.nade.think = nade_beep; + self.nade.nextthink = max(self.nade.wait - 3, time); + self.nade.projectiledeathtype = DEATH_NADE; + + self.fake_nade = spawn(); + setmodel(self.fake_nade, "models/weapons/h_ok_grenade.iqm"); + setattachment(self.fake_nade, self.weaponentity, ""); + self.fake_nade.classname = "fake_nade"; + //self.fake_nade.viewmodelforclient = self; + self.fake_nade.realowner = self.fake_nade.owner = self; + self.fake_nade.colormap = self.colormap; + self.fake_nade.glowmod = self.glowmod; + self.fake_nade.think = SUB_Remove; + self.fake_nade.nextthink = self.nade.wait; +} + +float CanThrowNade() +{ + if(self.vehicle) + return FALSE; + + if(gameover) + return FALSE; + + if(self.deadflag != DEAD_NO) + return FALSE; + + if not(autocvar_g_nades) + return FALSE; // allow turning them off mid match + + if(forbidWeaponUse()) + return FALSE; + + if not(IS_PLAYER(self)) + return FALSE; + + return TRUE; +} + +void nades_CheckThrow() +{ + if(!CanThrowNade()) + return; + + 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.lifetime >= 1) + { + makevectors(self.v_angle); + float _force = time - self.nade.lifetime; + _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); + } + } +} + +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 || client_hasweapon(self, WEP_HOOK, FALSE, FALSE) || WEPSET_CONTAINS_AW(weaponsInMap, WEP_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.lifetime >= 1) + { + if(self.nade) + { + makevectors(self.v_angle); + float _force = time - self.nade.lifetime; + _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_RemovePlayer) +{ + if(self.nade) + remove(self.nade); + + if(self.fake_nade) + remove(self.fake_nade); + + 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(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(MakePlayerObserver, nades_RemovePlayer, CBC_ORDER_ANY); + MUTATOR_HOOK(ClientDisconnect, nades_RemovePlayer, 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/mutator_nades.qh b/qcsrc/server/mutators/mutator_nades.qh new file mode 100644 index 0000000000..1940f4e052 --- /dev/null +++ b/qcsrc/server/mutators/mutator_nades.qh @@ -0,0 +1,5 @@ +.entity nade; +.entity fake_nade; +.float nade_refire; + +void() nades_CheckThrow; diff --git a/qcsrc/server/mutators/mutator_pinata.qc b/qcsrc/server/mutators/mutator_pinata.qc new file mode 100644 index 0000000000..e32c08a2db --- /dev/null +++ b/qcsrc/server/mutators/mutator_pinata.qc @@ -0,0 +1,32 @@ +MUTATOR_HOOKFUNCTION(pinata_PlayerDies) +{ + float j; + for(j = WEP_FIRST; j <= WEP_LAST; ++j) + if(WEPSET_CONTAINS_EW(self, j)) + if(self.switchweapon != j) + if(W_IsWeaponThrowable(j)) + W_ThrowNewWeapon(self, j, FALSE, self.origin + (self.mins + self.maxs) * 0.5, randomvec() * 175 + '0 0 325'); + + return TRUE; +} + +MUTATOR_HOOKFUNCTION(pinata_BuildMutatorsString) +{ + ret_string = strcat(ret_string, ":Pinata"); + return FALSE; +} + +MUTATOR_HOOKFUNCTION(pinata_BuildMutatorsPrettyString) +{ + ret_string = strcat(ret_string, ", Piñata"); + return FALSE; +} + +MUTATOR_DEFINITION(mutator_pinata) +{ + MUTATOR_HOOK(PlayerDies, pinata_PlayerDies, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsString, pinata_BuildMutatorsString, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsPrettyString, pinata_BuildMutatorsPrettyString, CBC_ORDER_ANY); + + return FALSE; +} diff --git a/qcsrc/server/mutators/mutator_random_gravity.qc b/qcsrc/server/mutators/mutator_random_gravity.qc new file mode 100644 index 0000000000..e2832ace2d --- /dev/null +++ b/qcsrc/server/mutators/mutator_random_gravity.qc @@ -0,0 +1,51 @@ +// Random Gravity +// +// Mutator by Mario +// Inspired by Player 2 + +float gravity_delay; + +MUTATOR_HOOKFUNCTION(gravity_StartFrame) +{ + if(gameover || !cvar("g_random_gravity")) return FALSE; + if(time < gravity_delay) return FALSE; + if(time < game_starttime) return FALSE; + if(round_handler_IsActive() && !round_handler_IsRoundStarted()) return FALSE; + + if(random() >= autocvar_g_random_gravity_negative_chance) + cvar_set("sv_gravity", ftos(bound(autocvar_g_random_gravity_min, random() - random() * -autocvar_g_random_gravity_negative, autocvar_g_random_gravity_max))); + else + cvar_set("sv_gravity", ftos(bound(autocvar_g_random_gravity_min, random() * autocvar_g_random_gravity_positive, autocvar_g_random_gravity_max))); + + gravity_delay = time + autocvar_g_random_gravity_delay; + + dprint("Gravity is now: ", ftos(autocvar_sv_gravity), "\n"); + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(gravity_BuildMutatorsString) +{ + ret_string = strcat(ret_string, ":RandomGravity"); + return 0; +} + +MUTATOR_HOOKFUNCTION(gravity_BuildMutatorsPrettyString) +{ + ret_string = strcat(ret_string, ", Random gravity"); + return 0; +} + +MUTATOR_DEFINITION(mutator_random_gravity) +{ + MUTATOR_HOOK(SV_StartFrame, gravity_StartFrame, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsString, gravity_BuildMutatorsString, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsPrettyString, gravity_BuildMutatorsPrettyString, CBC_ORDER_ANY); + + MUTATOR_ONADD + { + cvar_settemp("sv_gravity", cvar_string("sv_gravity")); // settemp current gravity so it's restored on match end + } + + return FALSE; +} diff --git a/qcsrc/server/mutators/mutator_riflearena.qc b/qcsrc/server/mutators/mutator_riflearena.qc new file mode 100644 index 0000000000..64194335c9 --- /dev/null +++ b/qcsrc/server/mutators/mutator_riflearena.qc @@ -0,0 +1,110 @@ +void ra_SetCvars() +{ + cvar_settemp("g_balance_rifle_secondary_spread", ftos(cvar("g_riflearena_rifle_secondary_spread"))); + cvar_settemp("g_balance_rifle_secondary_shots", ftos(cvar("g_riflearena_rifle_secondary_shots"))); + cvar_settemp("g_balance_rifle_secondary_animtime", ftos(cvar("g_riflearena_rifle_secondary_animtime"))); + cvar_settemp("g_balance_rifle_secondary_refire", ftos(cvar("g_riflearena_rifle_secondary_refire"))); + cvar_settemp("g_balance_rifle_secondary_damage", ftos(cvar("g_riflearena_rifle_secondary_damage"))); +} + +MUTATOR_HOOKFUNCTION(ra_PlayerDamage) +{ + if(IS_PLAYER(frag_attacker)) + if(IS_PLAYER(frag_target)) + { + if (DEATH_ISWEAPON(frag_deathtype, WEP_LASER)) + { + if(frag_attacker == frag_target) + frag_damage = 5; + else + frag_damage = 0; + if (frag_target != frag_attacker) + { + if (frag_target.health >= 1 && IS_PLAYER(frag_target)) + centerprint(frag_attacker, "Laser inflicts no damage!"); + frag_force = '0 0 0'; + } + } + } + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(ra_PlayerSpawn) +{ + WEPSET_CLEAR_E(self); + WEPSET_OR_EW(self, WEP_RIFLE); + WEPSET_OR_EW(self, WEP_LASER); + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(ra_FilterItem) +{ + switch (self.items) + { + case IT_5HP: + case IT_ARMOR_SHARD: + return FALSE; + } + + return TRUE; +} + +MUTATOR_HOOKFUNCTION(ra_StartItems) +{ + start_items |= IT_UNLIMITED_AMMO; + start_ammo_nails = 100; + + return FALSE; +} + +MUTATOR_HOOKFUNCTION(ra_ForbidThrowCurrentWeapon) +{ + nades_CheckThrow(); + return TRUE; +} + +MUTATOR_HOOKFUNCTION(ra_BuildMutatorsString) +{ + ret_string = strcat(ret_string, ":RA"); + return FALSE; +} + +MUTATOR_HOOKFUNCTION(ra_BuildMutatorsPrettyString) +{ + ret_string = strcat(ret_string, ", Rifle Arena"); + return FALSE; +} + +MUTATOR_HOOKFUNCTION(ra_SetModname) +{ + modname = "Rifle Arena"; + return TRUE; +} + +MUTATOR_DEFINITION(mutator_riflearena) +{ + MUTATOR_HOOK(PlayerDamage_Calculate, ra_PlayerDamage, CBC_ORDER_ANY); + MUTATOR_HOOK(PlayerSpawn, ra_PlayerSpawn, CBC_ORDER_ANY); + MUTATOR_HOOK(FilterItem, ra_FilterItem, CBC_ORDER_ANY); + MUTATOR_HOOK(SetStartItems, ra_StartItems, CBC_ORDER_ANY); + MUTATOR_HOOK(ForbidThrowCurrentWeapon, ra_ForbidThrowCurrentWeapon, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsString, ra_BuildMutatorsString, CBC_ORDER_ANY); + MUTATOR_HOOK(BuildMutatorsPrettyString, ra_BuildMutatorsPrettyString, CBC_ORDER_ANY); + + MUTATOR_ONADD + { + ra_SetCvars(); + + weapon_action(WEP_LASER, WR_PRECACHE); + weapon_action(WEP_RIFLE, WR_PRECACHE); + } + MUTATOR_ONREMOVE + { + print("This cannot be removed at runtime\n"); + return -1; + } + + return FALSE; +} diff --git a/qcsrc/server/mutators/mutator_vampire.qc b/qcsrc/server/mutators/mutator_vampire.qc index 1aa293b39e..edfcba4398 100644 --- a/qcsrc/server/mutators/mutator_vampire.qc +++ b/qcsrc/server/mutators/mutator_vampire.qc @@ -1,19 +1,14 @@ MUTATOR_HOOKFUNCTION(vampire_PlayerDamage) { - if(time < self.spawnshieldtime) - return 0; - if(g_minstagib) + if(time >= frag_target.spawnshieldtime) + if(frag_target != frag_attacker) + if(frag_target.deadflag == DEAD_NO) { - // minstagib: each hit means +1 ammo - if(frag_attacker != frag_target) - frag_attacker.ammo_cells += 2; // note: 1 cell was deducted for the shot + frag_attacker.health += bound(0, damage_take, frag_target.health); + frag_attacker.health = bound(0, frag_attacker.health, autocvar_g_balance_health_limit); } - else - { - // otherwise: each hit gets damage back - frag_attacker.health = frag_attacker.health + bound(0, damage_take, self.health); - } - return 0; + + return FALSE; } MUTATOR_HOOKFUNCTION(vampire_BuildMutatorsString) diff --git a/qcsrc/server/mutators/mutators.qh b/qcsrc/server/mutators/mutators.qh index 3f9f020aff..6af356658e 100644 --- a/qcsrc/server/mutators/mutators.qh +++ b/qcsrc/server/mutators/mutators.qh @@ -21,5 +21,14 @@ MUTATOR_DECLARATION(mutator_vampire); MUTATOR_DECLARATION(mutator_superspec); MUTATOR_DECLARATION(mutator_minstagib); MUTATOR_DECLARATION(mutator_touchexplode); +MUTATOR_DECLARATION(mutator_pinata); +MUTATOR_DECLARATION(mutator_midair); +MUTATOR_DECLARATION(mutator_bloodloss); +MUTATOR_DECLARATION(mutator_random_gravity); +MUTATOR_DECLARATION(mutator_multijump); +MUTATOR_DECLARATION(mutator_melee_only); +MUTATOR_DECLARATION(mutator_nades); +MUTATOR_DECLARATION(mutator_riflearena); +MUTATOR_DECLARATION(mutator_campcheck); MUTATOR_DECLARATION(sandbox); diff --git a/qcsrc/server/progs.src b/qcsrc/server/progs.src index 367e8609de..839d1dd682 100644 --- a/qcsrc/server/progs.src +++ b/qcsrc/server/progs.src @@ -46,6 +46,7 @@ mutators/gamemode_keepaway.qh mutators/gamemode_nexball.qh mutators/gamemode_lms.qh mutators/mutator_dodging.qh +mutators/mutator_nades.qh //// tZork Turrets //// tturrets/include/turrets_early.qh @@ -249,6 +250,15 @@ mutators/sandbox.qc mutators/mutator_superspec.qc mutators/mutator_minstagib.qc mutators/mutator_touchexplode.qc +mutators/mutator_pinata.qc +mutators/mutator_midair.qc +mutators/mutator_bloodloss.qc +mutators/mutator_random_gravity.qc +mutators/mutator_multijump.qc +mutators/mutator_melee_only.qc +mutators/mutator_nades.qc +mutators/mutator_riflearena.qc +mutators/mutator_campcheck.qc ../warpzonelib/anglestransform.qc ../warpzonelib/mathlib.qc diff --git a/qcsrc/server/sv_main.qc b/qcsrc/server/sv_main.qc index 538dcc62c6..a9b2443b73 100644 --- a/qcsrc/server/sv_main.qc +++ b/qcsrc/server/sv_main.qc @@ -93,7 +93,7 @@ void CreatureFrame (void) { // check for falling damage float velocity_len = vlen(self.velocity); - if(!self.hook.state && !g_ca && !(g_cts && !autocvar_g_cts_selfdamage)) + if(!self.hook.state && !(g_cts && !autocvar_g_cts_selfdamage)) { dm = vlen(self.oldvelocity) - velocity_len; // dm is now the velocity DECREASE. Velocity INCREASE should never cause a sound or any damage. if (self.deadflag) diff --git a/qcsrc/server/t_items.qc b/qcsrc/server/t_items.qc index 9a290a2cc3..61e2a09bf8 100644 --- a/qcsrc/server/t_items.qc +++ b/qcsrc/server/t_items.qc @@ -277,10 +277,6 @@ float have_pickup_item(void) return TRUE; if(autocvar_g_powerups == 0) return FALSE; - if(g_ca) - return FALSE; - if(g_arena) - return FALSE; } else { @@ -288,8 +284,6 @@ float have_pickup_item(void) return TRUE; if(autocvar_g_pickup_items == 0) return FALSE; - if(g_ca) - return FALSE; if(g_weaponarena) if(!WEPSET_EMPTY_E(self) || (self.items & IT_AMMO)) return FALSE; diff --git a/qcsrc/server/t_jumppads.qc b/qcsrc/server/t_jumppads.qc index fba705c28a..0efb77df27 100644 --- a/qcsrc/server/t_jumppads.qc +++ b/qcsrc/server/t_jumppads.qc @@ -71,7 +71,7 @@ vector trigger_push_calculatevelocity(vector org, entity tgt, float ht) */ // push him so high... - vz = sqrt(2 * grav * jumpheight); // NOTE: sqrt(positive)! + vz = sqrt(fabs(2 * grav * jumpheight)); // NOTE: sqrt(positive)! // we start with downwards velocity only if it's a downjump and the jump apex should be outside the jump! if(ht < 0) diff --git a/qcsrc/server/teamplay.qc b/qcsrc/server/teamplay.qc index 0ba1e7c848..b481f46b3a 100644 --- a/qcsrc/server/teamplay.qc +++ b/qcsrc/server/teamplay.qc @@ -286,14 +286,8 @@ string getwelcomemessage(void) modifications = strcat(modifications, ", Cloaked"); if(g_grappling_hook) modifications = strcat(modifications, ", Hook"); - if(g_midair) - modifications = strcat(modifications, ", Midair"); - if(g_pinata) - modifications = strcat(modifications, ", Piñata"); if(g_weapon_stay && !g_cts) modifications = strcat(modifications, ", Weapons stay"); - if(g_bloodloss > 0) - modifications = strcat(modifications, ", Blood loss"); if(g_jetpack) modifications = strcat(modifications, ", Jet pack"); if(autocvar_g_powerups == 0) diff --git a/qcsrc/server/w_hlac.qc b/qcsrc/server/w_hlac.qc index 0b5d386fd8..618a21ffe8 100644 --- a/qcsrc/server/w_hlac.qc +++ b/qcsrc/server/w_hlac.qc @@ -41,7 +41,7 @@ void W_HLAC_Attack (void) W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_A, autocvar_g_balance_hlac_primary_damage); pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); - if (!g_norecoil) + if (!autocvar_g_norecoil) { self.punchangle_x = random () - 0.5; self.punchangle_y = random () - 0.5; @@ -129,7 +129,7 @@ void W_HLAC_Attack2 (void) for(i=autocvar_g_balance_hlac_secondary_shots;i>0;--i) W_HLAC_Attack2f(); - if (!g_norecoil) + if (!autocvar_g_norecoil) { self.punchangle_x = random () - 0.5; self.punchangle_y = random () - 0.5; diff --git a/qcsrc/server/w_uzi.qc b/qcsrc/server/w_uzi.qc index 923ed9504c..38793a96f2 100644 --- a/qcsrc/server/w_uzi.qc +++ b/qcsrc/server/w_uzi.qc @@ -52,7 +52,7 @@ void UziFlash() void W_UZI_Attack (float deathtype) { W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, ((self.misc_bulletcounter == 1) ? autocvar_g_balance_uzi_first_damage : autocvar_g_balance_uzi_sustained_damage)); - if (!g_norecoil) + if (!autocvar_g_norecoil) { self.punchangle_x = random () - 0.5; self.punchangle_y = random () - 0.5; @@ -129,7 +129,7 @@ void uzi_mode1_fire_auto() W_DecreaseAmmo(ammo_nails, autocvar_g_balance_uzi_sustained_ammo, autocvar_g_balance_uzi_reload_ammo); W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, autocvar_g_balance_uzi_sustained_damage); - if (!g_norecoil) + if (!autocvar_g_norecoil) { self.punchangle_x = random () - 0.5; self.punchangle_y = random () - 0.5; @@ -156,7 +156,7 @@ void uzi_mode1_fire_auto() void uzi_mode1_fire_burst() { W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CH_WEAPON_A, autocvar_g_balance_uzi_sustained_damage); - if (!g_norecoil) + if (!autocvar_g_norecoil) { self.punchangle_x = random () - 0.5; self.punchangle_y = random () - 0.5; diff --git a/scripts/ok_nade_counter.shader b/scripts/ok_nade_counter.shader new file mode 100644 index 0000000000..130bee7ab0 --- /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 diff --git a/scripts/shaderlist.txt b/scripts/shaderlist.txt index a73e7e2064..366f24c6d0 100644 --- a/scripts/shaderlist.txt +++ b/scripts/shaderlist.txt @@ -14,3 +14,4 @@ tree tuba turrets weapons +ok_nade_counter diff --git a/vehicle_racer.cfg b/vehicle_racer.cfg index 5c3e06aff1..4a78620083 100644 --- a/vehicle_racer.cfg +++ b/vehicle_racer.cfg @@ -52,7 +52,7 @@ set g_vehicle_racer_rocket_cost 0 set g_vehicle_racer_rocket_climbspeed 1600 set g_vehicle_racer_rocket_locktarget 1 -set g_vehicle_racer_rocket_locking_time 0.35 +set g_vehicle_racer_rocket_locking_time 0.9 set g_vehicle_racer_rocket_locking_releasetime 0.5 set g_vehicle_racer_rocket_locked_time 4 set g_vehicle_racer_rocket_locked_maxangle 1.8 diff --git a/vehicle_raptor.cfg b/vehicle_raptor.cfg index 1efc2f1753..d91b79b6ce 100644 --- a/vehicle_raptor.cfg +++ b/vehicle_raptor.cfg @@ -29,12 +29,12 @@ set g_vehicle_raptor_bomblet_force 150 set g_vehicle_raptor_bomblet_explode_delay 0.4 set g_vehicle_raptor_bombs_refire 5 -set g_vehicle_raptor_cannon_turnspeed 60 +set g_vehicle_raptor_cannon_turnspeed 120 set g_vehicle_raptor_cannon_turnlimit 20 set g_vehicle_raptor_cannon_pitchlimit_up 12 set g_vehicle_raptor_cannon_pitchlimit_down 32 -set g_vehicle_raptor_cannon_locktarget 1 +set g_vehicle_raptor_cannon_locktarget 0 set g_vehicle_raptor_cannon_locking_time 0.2 set g_vehicle_raptor_cannon_locking_releasetime 0.45 set g_vehicle_raptor_cannon_locked_time 1 @@ -44,7 +44,7 @@ set g_vehicle_raptor_cannon_cost 1 set g_vehicle_raptor_cannon_damage 10 set g_vehicle_raptor_cannon_radius 60 set g_vehicle_raptor_cannon_refire 0.03 -set g_vehicle_raptor_cannon_speed 12000 +set g_vehicle_raptor_cannon_speed 24000 set g_vehicle_raptor_cannon_spread 0.01 set g_vehicle_raptor_cannon_force 25 diff --git a/vehicle_spiderbot.cfg b/vehicle_spiderbot.cfg index 0223b09e89..23b0857a02 100644 --- a/vehicle_spiderbot.cfg +++ b/vehicle_spiderbot.cfg @@ -26,14 +26,14 @@ set g_vehicle_spiderbot_speed_strafe 400 set g_vehicle_spiderbot_movement_inertia 0.15 set g_vehicle_spiderbot_tiltlimit 90 -set g_vehicle_spiderbot_minigun_damage 12 // 400 (x2) DPS -set g_vehicle_spiderbot_minigun_refire 0.03 +set g_vehicle_spiderbot_minigun_damage 24 // 400 (x2) DPS +set g_vehicle_spiderbot_minigun_refire 0.06 set g_vehicle_spiderbot_minigun_force 9 set g_vehicle_spiderbot_minigun_spread 0.015 set g_vehicle_spiderbot_minigun_speed 45000 // ~ 32QU set g_vehicle_spiderbot_minigun_bulletconstant 110 set g_vehicle_spiderbot_minigun_ammo_cost 1 -set g_vehicle_spiderbot_minigun_ammo_max 200 +set g_vehicle_spiderbot_minigun_ammo_max 100 set g_vehicle_spiderbot_minigun_ammo_regen 40 set g_vehicle_spiderbot_minigun_ammo_regen_pause 1