]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into mirceakitsune/damage_effects
authorMircea Kitsune <sonichedgehog_hyperblast00@yahoo.com>
Thu, 25 Aug 2011 12:36:41 +0000 (15:36 +0300)
committerMircea Kitsune <sonichedgehog_hyperblast00@yahoo.com>
Thu, 25 Aug 2011 12:36:41 +0000 (15:36 +0300)
Conflicts:
effectinfo.txt
qcsrc/client/Main.qc
qcsrc/client/autocvars.qh
qcsrc/client/gibs.qc

512 files changed:
_hud_descriptions.cfg
balance25.cfg
balanceFruit.cfg [new file with mode: 0644]
balanceLeeStricklin.cfg
balanceSamual.cfg [deleted file]
balanceXonotic.cfg
balancetZork.cfg
check-translations.sh
config_update.cfg
csprogs.dat.de.po
csprogs.dat.it.po [new file with mode: 0644]
csprogs.dat.pot
defaultXonotic.cfg
effectinfo.txt
effects-high.cfg
effects-low.cfg
effects-med.cfg
effects-normal.cfg
effects-omg.cfg
effects-ultimate.cfg
effects-ultra.cfg
fixtooltips.pl [new file with mode: 0644]
gfx/crosshair_ring_rifle.tga [new file with mode: 0644]
gfx/crosshair_ring_sniperrifle.tga [deleted file]
gfx/hud/default/weaponrifle.tga [new file with mode: 0644]
gfx/hud/default/weaponsniperrifle.tga [deleted file]
gfx/hud/luminos/weaponrifle.tga [new file with mode: 0644]
gfx/hud/luminos/weaponsniperrifle.tga [deleted file]
gfx/hud/old/weaponrifle.tga [new file with mode: 0644]
gfx/hud/old/weaponsniperrifle.tga [deleted file]
gfx/loading.tga
gfx/loading10.tga
gfx/loading11.tga
gfx/loading12.tga
gfx/loading13.tga [new file with mode: 0644]
gfx/loading2.tga
gfx/loading3.tga
gfx/loading4.tga
gfx/loading5.tga
gfx/loading6.tga
gfx/loading7.tga
gfx/loading8.tga
gfx/loading9.tga
gfx/vehicles/axh-bracket.tga [new file with mode: 0644]
gfx/vehicles/axh-cross.tga [new file with mode: 0644]
gfx/vehicles/axh-dropcross.tga [new file with mode: 0644]
gfx/vehicles/axh-ring.tga [new file with mode: 0644]
gfx/vehicles/axh-special1.tga [new file with mode: 0644]
gfx/vehicles/axh-special2.tga [new file with mode: 0644]
gfx/vehicles/axh-tag.tga [new file with mode: 0644]
gfx/vehicles/axh-target.tga [new file with mode: 0644]
gfx/vehicles/axh-x.tga [new file with mode: 0644]
gfx/vehicles/bar_dwn_left.tga [new file with mode: 0644]
gfx/vehicles/bar_dwn_right.tga [new file with mode: 0644]
gfx/vehicles/bar_up_left.tga [new file with mode: 0644]
gfx/vehicles/bar_up_right.tga [new file with mode: 0644]
gfx/vehicles/bullets.tga [new file with mode: 0644]
gfx/vehicles/frame.tga [new file with mode: 0644]
gfx/vehicles/health.tga [new file with mode: 0644]
gfx/vehicles/hud_bg.tga [deleted file]
gfx/vehicles/raptor.tga [new file with mode: 0644]
gfx/vehicles/raptor_bombs.tga [new file with mode: 0644]
gfx/vehicles/raptor_guns.tga [new file with mode: 0644]
gfx/vehicles/rocket.tga [new file with mode: 0644]
gfx/vehicles/shield.tga [new file with mode: 0644]
gfx/vehicles/shiled.tga [deleted file]
gfx/vehicles/vh-shield.tga [new file with mode: 0644]
hook-firing_swap.cfg
hud_luminos.cfg
hud_luminos_minimal.cfg
hud_luminos_old.cfg
hud_luminos_xhair_minimal.cfg
hud_nexuiz.cfg
input-demoseeking.cfg [new file with mode: 0644]
keybinds.txt
keybinds.txt.it [new file with mode: 0644]
menu.dat.de.po
menu.dat.es.po
menu.dat.fi.po
menu.dat.fr.po
menu.dat.hu.po
menu.dat.it.po
menu.dat.nl.po
menu.dat.pot
menu.dat.pt.po
menu.dat.ro.po
menu.dat.ru.po
menu.dat.se.po
models/domination/dom_blue.md3
models/domination/dom_pink.md3
models/domination/dom_red.md3
models/domination/dom_unclaimed.md3
models/domination/dom_yellow.md3
models/player/erebus.iqm
models/player/erebus.iqm.framegroups
models/player/erebus.iqm_1.skin [deleted file]
models/player/erebus.iqm_1.sounds [deleted file]
models/player/erebus.iqm_1.tga [deleted file]
models/player/erebus.iqm_1.txt [deleted file]
models/player/erebus_lod1.iqm
models/player/erebus_lod1.iqm.framegroups
models/player/erebus_lod1.iqm_1.skin [deleted file]
models/player/erebus_lod2.iqm
models/player/erebus_lod2.iqm.framegroups
models/player/erebus_lod2.iqm_1.skin [deleted file]
models/player/gak.iqm
models/player/gak.iqm.framegroups
models/player/gak_lod1.iqm
models/player/gak_lod1.iqm.framegroups
models/player/gak_lod2.iqm
models/player/gak_lod2.iqm.framegroups
models/player/gakarmored.iqm
models/player/gakarmored.iqm.framegroups
models/player/gakarmored_lod1.iqm
models/player/gakarmored_lod1.iqm.framegroups
models/player/gakarmored_lod2.iqm
models/player/gakarmored_lod2.iqm.framegroups
models/player/gakmasked.iqm
models/player/gakmasked.iqm.framegroups
models/player/gakmasked_lod1.iqm
models/player/gakmasked_lod1.iqm.framegroups
models/player/gakmasked_lod2.iqm
models/player/gakmasked_lod2.iqm.framegroups
models/player/ignis.iqm
models/player/ignis.iqm.framegroups
models/player/ignis_lod1.iqm
models/player/ignis_lod1.iqm.framegroups
models/player/ignis_lod2.iqm
models/player/ignis_lod2.iqm.framegroups
models/player/ignishalfmasked.iqm
models/player/ignishalfmasked.iqm.framegroups
models/player/ignishalfmasked_lod1.iqm
models/player/ignishalfmasked_lod1.iqm.framegroups
models/player/ignishalfmasked_lod2.iqm
models/player/ignishalfmasked_lod2.iqm.framegroups
models/player/ignismasked.iqm
models/player/ignismasked.iqm.framegroups
models/player/ignismasked_lod1.iqm
models/player/ignismasked_lod1.iqm.framegroups
models/player/ignismasked_lod2.iqm
models/player/ignismasked_lod2.iqm.framegroups
models/player/megaerebus.iqm [new file with mode: 0644]
models/player/megaerebus.iqm.framegroups [new file with mode: 0644]
models/player/megaerebus.iqm_0.skin [new file with mode: 0644]
models/player/megaerebus.iqm_0.sounds [new file with mode: 0644]
models/player/megaerebus.iqm_0.tga [new file with mode: 0644]
models/player/megaerebus.iqm_0.txt [new file with mode: 0644]
models/player/megaerebus_lod1.iqm [new file with mode: 0644]
models/player/megaerebus_lod1.iqm.framegroups [new file with mode: 0644]
models/player/megaerebus_lod1.iqm_0.skin [new file with mode: 0644]
models/player/megaerebus_lod2.iqm [new file with mode: 0644]
models/player/megaerebus_lod2.iqm.framegroups [new file with mode: 0644]
models/player/megaerebus_lod2.iqm_0.skin [new file with mode: 0644]
models/player/nyx.iqm
models/player/nyx.iqm.framegroups
models/player/nyx_lod1.iqm
models/player/nyx_lod1.iqm.framegroups
models/player/nyx_lod2.iqm
models/player/nyx_lod2.iqm.framegroups
models/player/pyria.iqm
models/player/pyria.iqm.framegroups
models/player/pyria_lod1.iqm
models/player/pyria_lod1.iqm.framegroups
models/player/pyria_lod2.iqm
models/player/pyria_lod2.iqm.framegroups
models/player/seraphina.iqm
models/player/seraphina.iqm.framegroups
models/player/seraphina_lod1.iqm
models/player/seraphina_lod1.iqm.framegroups
models/player/seraphina_lod2.iqm
models/player/seraphina_lod2.iqm.framegroups
models/player/seraphinamasked.iqm
models/player/seraphinamasked.iqm.framegroups
models/player/seraphinamasked_lod1.iqm
models/player/seraphinamasked_lod1.iqm.framegroups
models/player/seraphinamasked_lod2.iqm
models/player/seraphinamasked_lod2.iqm.framegroups
models/player/umbra.iqm
models/player/umbra.iqm.framegroups
models/player/umbra_lod1.iqm
models/player/umbra_lod1.iqm.framegroups
models/player/umbra_lod2.iqm
models/player/umbra_lod2.iqm.framegroups
models/sprites/vehicle_frame0.tga [new file with mode: 0644]
models/sprites/vehicle_frame1.tga [new file with mode: 0644]
models/vehicles/bomblet.md3 [new file with mode: 0644]
models/vehicles/bumblebee.tga [new file with mode: 0644]
models/vehicles/bumblebee_body.dpm [new file with mode: 0644]
models/vehicles/bumblebee_gloss.tga [new file with mode: 0644]
models/vehicles/bumblebee_glow.tga [new file with mode: 0644]
models/vehicles/bumblebee_norm.tga [new file with mode: 0644]
models/vehicles/bumblebee_pants.tga [new file with mode: 0644]
models/vehicles/bumblebee_plasma_left.dpm [new file with mode: 0644]
models/vehicles/bumblebee_plasma_right.dpm [new file with mode: 0644]
models/vehicles/bumblebee_ray.dpm [new file with mode: 0644]
models/vehicles/clusterbomb.md3 [new file with mode: 0644]
models/vehicles/clusterbomb_folded.md3 [new file with mode: 0644]
models/vehicles/clusterbomb_fragment.md3 [new file with mode: 0644]
models/vehicles/raptor.dpm
models/vehicles/raptor_body.dpm [new file with mode: 0644]
models/vehicles/raptor_cockpit.dpm
models/vehicles/rocket01.md3 [new file with mode: 0644]
models/vehicles/rocket02.md3 [new file with mode: 0644]
models/vehicles/rockets.tga [new file with mode: 0644]
models/vehicles/rockets_gloss.tga [new file with mode: 0644]
models/vehicles/rockets_glow.tga [new file with mode: 0644]
models/vehicles/rockets_reflect.tga [new file with mode: 0644]
models/vehicles/spiderbot.dpm
models/vehicles/spiderbot.dpm.framegroups
models/vehicles/spiderbot_cockpit.dpm
models/vehicles/spiderbot_top.dpm
models/vehicles/spinner.dpm
models/vehicles/tracer.md3 [new file with mode: 0644]
models/vehicles/tracercore.tga [new file with mode: 0644]
models/vehicles/tracertrail.tga [new file with mode: 0644]
models/vehicles/tracertrail_glow.tga [new file with mode: 0644]
models/weapons/h_campingrifle.iqm
models/weapons/h_crylink.iqm
models/weapons/h_electro.iqm
models/weapons/h_fireball.iqm
models/weapons/h_gl.iqm
models/weapons/h_hagar.iqm
models/weapons/h_hlac.iqm
models/weapons/h_hookgun.iqm
models/weapons/h_laser.iqm
models/weapons/h_minelayer.iqm
models/weapons/h_minstanex.iqm
models/weapons/h_nex.iqm
models/weapons/h_porto.iqm
models/weapons/h_rl.iqm
models/weapons/h_seeker.iqm
models/weapons/h_shotgun.iqm
models/weapons/h_tuba.iqm
models/weapons/h_uzi.iqm
physicsX.cfg
qcsrc/client/Defs.qc
qcsrc/client/Main.qc
qcsrc/client/View.qc
qcsrc/client/autocvars.qh
qcsrc/client/casings.qc
qcsrc/client/csqc_builtins.qc
qcsrc/client/csqc_constants.qc
qcsrc/client/damage.qc
qcsrc/client/gibs.qc
qcsrc/client/hook.qc
qcsrc/client/hud.qc
qcsrc/client/hud.qh
qcsrc/client/hud_config.qc
qcsrc/client/interpolate.qc
qcsrc/client/main.qh
qcsrc/client/mapvoting.qc
qcsrc/client/miscfunctions.qc
qcsrc/client/movetypes.qc
qcsrc/client/movetypes.qh
qcsrc/client/particles.qc
qcsrc/client/progs.src
qcsrc/client/projectile.qc
qcsrc/client/scoreboard.qc
qcsrc/client/shownames.qc
qcsrc/client/shownames.qh
qcsrc/client/target_music.qc
qcsrc/client/teamradar.qh
qcsrc/client/tturrets.qc [new file with mode: 0644]
qcsrc/client/tturrets.qh [new file with mode: 0644]
qcsrc/client/tuba.qc
qcsrc/client/vehicles/racer.qc [new file with mode: 0644]
qcsrc/client/vehicles/raptor.qc [new file with mode: 0644]
qcsrc/client/vehicles/spiderbot.qc [new file with mode: 0644]
qcsrc/client/vehicles/vehicles.qc [new file with mode: 0644]
qcsrc/client/vehicles/vehicles.qh [new file with mode: 0644]
qcsrc/client/waypointsprites.qc
qcsrc/common/campaign_file.qc
qcsrc/common/constants.qh
qcsrc/common/mapinfo.qc
qcsrc/common/mapinfo.qh
qcsrc/common/urllib.qc [new file with mode: 0644]
qcsrc/common/urllib.qh [new file with mode: 0644]
qcsrc/common/util-pre.qh
qcsrc/common/util.qc
qcsrc/common/util.qh
qcsrc/menu/classes.c
qcsrc/menu/oo/classdefs.h [deleted file]
qcsrc/menu/oo/constructors.h [deleted file]
qcsrc/menu/oo/implementation.h
qcsrc/menu/oo/interface.h [new file with mode: 0644]
qcsrc/menu/progs.src
qcsrc/menu/xonotic/credits.c
qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c [new file with mode: 0644]
qcsrc/menu/xonotic/dialog_hudpanel_physics.c
qcsrc/menu/xonotic/dialog_multiplayer_create.c
qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c
qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c
qcsrc/menu/xonotic/dialog_multiplayer_demo.c
qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c
qcsrc/menu/xonotic/dialog_settings_audio.c
qcsrc/menu/xonotic/dialog_settings_effects.c
qcsrc/menu/xonotic/dialog_singleplayer.c
qcsrc/menu/xonotic/keybinder.c
qcsrc/menu/xonotic/mainwindow.c
qcsrc/menu/xonotic/maplist.c
qcsrc/menu/xonotic/util.qc
qcsrc/qc-client.cbp [deleted file]
qcsrc/qc-common.cbp [deleted file]
qcsrc/qc-server.cbp [deleted file]
qcsrc/server/accuracy.qc
qcsrc/server/arena.qc
qcsrc/server/assault.qc
qcsrc/server/autocvars.qh
qcsrc/server/bot/aim.qc
qcsrc/server/bot/bot.qc
qcsrc/server/bot/bot.qh
qcsrc/server/bot/havocbot/havocbot.qc
qcsrc/server/bot/havocbot/role_assault.qc [new file with mode: 0644]
qcsrc/server/bot/havocbot/role_ctf.qc
qcsrc/server/bot/havocbot/role_freezetag.qc [new file with mode: 0644]
qcsrc/server/bot/havocbot/role_keepaway.qc [new file with mode: 0644]
qcsrc/server/bot/havocbot/roles.qc
qcsrc/server/bot/navigation.qc
qcsrc/server/bot/navigation.qh
qcsrc/server/bot/scripting.qc
qcsrc/server/bot/waypoints.qc
qcsrc/server/builtins.qh
qcsrc/server/campaign.qc
qcsrc/server/cheats.qc
qcsrc/server/cl_client.qc
qcsrc/server/cl_impulse.qc
qcsrc/server/cl_physics.qc
qcsrc/server/cl_player.qc
qcsrc/server/cl_weapons.qc
qcsrc/server/cl_weaponsystem.qc
qcsrc/server/clientcommands.qc
qcsrc/server/constants.qh
qcsrc/server/csqcprojectile.qc
qcsrc/server/csqcprojectile.qh
qcsrc/server/ctf.qc
qcsrc/server/defs.qh
qcsrc/server/domination.qc
qcsrc/server/ent_cs.qc
qcsrc/server/extensions.qh
qcsrc/server/func_breakable.qc
qcsrc/server/g_damage.qc
qcsrc/server/g_hook.qc
qcsrc/server/g_models.qc
qcsrc/server/g_subs.qc
qcsrc/server/g_triggers.qc
qcsrc/server/g_world.qc
qcsrc/server/gamecommand.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mode_onslaught.qc
qcsrc/server/monsters/ai.qc
qcsrc/server/monsters/m_monsters.qc
qcsrc/server/movelib.qc
qcsrc/server/mutators/base.qc
qcsrc/server/mutators/base.qh
qcsrc/server/mutators/gamemode_freezetag.qc
qcsrc/server/mutators/gamemode_keepaway.qc
qcsrc/server/mutators/gamemode_keyhunt.qc
qcsrc/server/mutators/gamemode_keyhunt.qh
qcsrc/server/mutators/mutator_dodging.qc
qcsrc/server/mutators/mutator_nix.qc
qcsrc/server/nexball.qc
qcsrc/server/pathlib/pathlib.qh
qcsrc/server/playerstats.qc
qcsrc/server/playerstats.qh
qcsrc/server/portals.qc
qcsrc/server/progs.src
qcsrc/server/race.qc
qcsrc/server/scores_rules.qc
qcsrc/server/steerlib.qc
qcsrc/server/sv_main.qc
qcsrc/server/t_halflife.qc
qcsrc/server/t_items.qc
qcsrc/server/t_jumppads.qc
qcsrc/server/t_plats.qc
qcsrc/server/t_quake3.qc
qcsrc/server/t_teleporters.qc
qcsrc/server/teamplay.qc
qcsrc/server/tturrets/include/turrets_early.qh
qcsrc/server/tturrets/system/system_damage.qc
qcsrc/server/tturrets/system/system_main.qc
qcsrc/server/tturrets/system/system_misc.qc
qcsrc/server/tturrets/system/system_scoreprocs.qc
qcsrc/server/tturrets/units/unit_checkpoint.qc
qcsrc/server/tturrets/units/unit_ewheel.qc
qcsrc/server/tturrets/units/unit_flac.qc
qcsrc/server/tturrets/units/unit_fusionreactor.qc
qcsrc/server/tturrets/units/unit_hellion.qc
qcsrc/server/tturrets/units/unit_hk.qc
qcsrc/server/tturrets/units/unit_machinegun.qc
qcsrc/server/tturrets/units/unit_mlrs.qc
qcsrc/server/tturrets/units/unit_phaser.qc
qcsrc/server/tturrets/units/unit_plasma.qc
qcsrc/server/tturrets/units/unit_tessla.qc
qcsrc/server/tturrets/units/unit_walker.qc
qcsrc/server/vehicles/bumblebee.qc [new file with mode: 0644]
qcsrc/server/vehicles/collision.qc [new file with mode: 0644]
qcsrc/server/vehicles/network.qc [new file with mode: 0644]
qcsrc/server/vehicles/racer.qc
qcsrc/server/vehicles/raptor.qc
qcsrc/server/vehicles/spiderbot.qc
qcsrc/server/vehicles/vehicles.qc
qcsrc/server/vehicles/vehicles.qh
qcsrc/server/vehicles/vehicles_def.qh [new file with mode: 0644]
qcsrc/server/vote.qc
qcsrc/server/vote.qh
qcsrc/server/w_all.qc
qcsrc/server/w_common.qc
qcsrc/server/w_crylink.qc
qcsrc/server/w_electro.qc
qcsrc/server/w_fireball.qc
qcsrc/server/w_grenadelauncher.qc
qcsrc/server/w_hagar.qc
qcsrc/server/w_hlac.qc
qcsrc/server/w_hook.qc
qcsrc/server/w_laser.qc
qcsrc/server/w_minelayer.qc
qcsrc/server/w_minstanex.qc
qcsrc/server/w_nex.qc
qcsrc/server/w_porto.qc
qcsrc/server/w_rifle.qc [new file with mode: 0644]
qcsrc/server/w_rocketlauncher.qc
qcsrc/server/w_seeker.qc
qcsrc/server/w_shotgun.qc
qcsrc/server/w_sniperrifle.qc [deleted file]
qcsrc/server/w_tuba.qc
qcsrc/server/w_uzi.qc
qcsrc/server/waypointsprites.qc
qcsrc/warpzonelib/anglestransform.qc
qcsrc/warpzonelib/anglestransform.qh
qcsrc/warpzonelib/client.qc
qcsrc/warpzonelib/client.qh
qcsrc/warpzonelib/common.qc
qcsrc/warpzonelib/common.qh
qcsrc/warpzonelib/server.qc
qcsrc/warpzonelib/server.qh
qcsrc/xonotic-gamecode.workspace [deleted file]
quake.rc
scripts/vehicles.shader [new file with mode: 0644]
scripts/vrockets.shader [new file with mode: 0644]
sound/player/default.sounds
sound/player/espeak/coms/affirmative.ogg [new file with mode: 0644]
sound/player/espeak/coms/attack.ogg [new file with mode: 0644]
sound/player/espeak/coms/attackinfive.ogg [new file with mode: 0644]
sound/player/espeak/coms/attacking.ogg [new file with mode: 0644]
sound/player/espeak/coms/coverme.ogg [new file with mode: 0644]
sound/player/espeak/coms/defend.ogg [new file with mode: 0644]
sound/player/espeak/coms/defending.ogg [new file with mode: 0644]
sound/player/espeak/coms/droppedflag.ogg [new file with mode: 0644]
sound/player/espeak/coms/flagcarriertakingdamage.ogg [new file with mode: 0644]
sound/player/espeak/coms/freelance.ogg [new file with mode: 0644]
sound/player/espeak/coms/getflag.ogg [new file with mode: 0644]
sound/player/espeak/coms/incoming.ogg [new file with mode: 0644]
sound/player/espeak/coms/meet.ogg [new file with mode: 0644]
sound/player/espeak/coms/needhelp.ogg [new file with mode: 0644]
sound/player/espeak/coms/negative.ogg [new file with mode: 0644]
sound/player/espeak/coms/onmyway.ogg [new file with mode: 0644]
sound/player/espeak/coms/roaming.ogg [new file with mode: 0644]
sound/player/espeak/coms/seenenemy.ogg [new file with mode: 0644]
sound/player/espeak/coms/seenflag.ogg [new file with mode: 0644]
sound/player/espeak/coms/taunt.ogg [new file with mode: 0644]
sound/player/espeak/coms/teamshoot.ogg [new file with mode: 0644]
sound/player/espeak/make.sh [new file with mode: 0644]
sound/player/espeak/player/death.ogg [new file with mode: 0644]
sound/player/espeak/player/drown.ogg [new file with mode: 0644]
sound/player/espeak/player/fall.ogg [new file with mode: 0644]
sound/player/espeak/player/falling.ogg [new file with mode: 0644]
sound/player/espeak/player/gasp.ogg [new file with mode: 0644]
sound/player/espeak/player/jump.ogg [new file with mode: 0644]
sound/player/espeak/player/pain100.ogg [new file with mode: 0644]
sound/player/espeak/player/pain25.ogg [new file with mode: 0644]
sound/player/espeak/player/pain50.ogg [new file with mode: 0644]
sound/player/espeak/player/pain75.ogg [new file with mode: 0644]
sound/vehicles/alarm.wav [new file with mode: 0644]
sound/vehicles/alarm_shield.wav [new file with mode: 0644]
sound/vehicles/lock.wav [new file with mode: 0644]
sound/vehicles/locked.wav [new file with mode: 0644]
sound/vehicles/locking.wav [new file with mode: 0644]
sound/vehicles/racer_boost.wav [new file with mode: 0644]
sound/vehicles/racer_idle.wav [new file with mode: 0644]
sound/vehicles/racer_move.wav [new file with mode: 0644]
sound/vehicles/raptor_fly.wav [new file with mode: 0644]
sound/vehicles/raptor_speed.wav [new file with mode: 0644]
sound/vehicles/spiderbot_die.wav [new file with mode: 0644]
sound/vehicles/spiderbot_idle.wav [new file with mode: 0644]
sound/vehicles/spiderbot_jump.wav [new file with mode: 0644]
sound/vehicles/spiderbot_land.wav [new file with mode: 0644]
sound/vehicles/spiderbot_strafe.wav [new file with mode: 0644]
sound/vehicles/spiderbot_walk.wav [new file with mode: 0644]
textures/cockpit_gloss.tga [new file with mode: 0644]
textures/cockpit_reflect.tga [new file with mode: 0644]
textures/raptor.jpg [deleted file]
textures/raptor.tga [new file with mode: 0644]
textures/raptor_cockpit.jpg [deleted file]
textures/spiderbot_reflect.tga [new file with mode: 0644]
textures/wakazachi_gloss.jpg [new file with mode: 0644]
textures/wakazachi_glow.tga [new file with mode: 0644]
textures/wakazachi_reflect.tga [new file with mode: 0644]
tooltips.db
tooltips.db.de
tooltips.db.es
tooltips.db.fr
tooltips.db.it [new file with mode: 0644]
tooltips.db.ru
unit_walker.cfg
vehicle_bumblebee.cfg [new file with mode: 0644]
vehicle_racer.cfg
vehicle_raptor.cfg
vehicle_spiderbot.cfg
vehicles.cfg [new file with mode: 0644]
xonotic-credits.txt
xonotic-credits.txt.fr
xonotic-credits.txt.it [new file with mode: 0644]

index e4c669663324bca895414a5e8e954451199aaa02..13804214383530983ba25662d8c85d58a4039120 100644 (file)
@@ -31,8 +31,6 @@ seta hud_configure_grid "" "snap to grid when moving/resizing panels"
 seta hud_configure_grid_xsize "" "snap to X * vid_conwidth"
 seta hud_configure_grid_ysize "" "snap to Y * vid_conheight"
 
-seta scr_centerpos "" "Y position of the centerprint"
-
 seta hud_panel_weapons "" "enable/disable this panel"
 seta hud_panel_weapons_pos "" "position of this panel"
 seta hud_panel_weapons_size "" "size of this panel"
@@ -220,7 +218,7 @@ seta hud_panel_infomessages_bg_border "" "if set to something else than \"\" = o
 seta hud_panel_infomessages_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
 seta hud_panel_infomessages_flip "" "1 = align the items to the right"
 
-seta hud_panel_physics "" "enable/disable this panel, 1 = show if not observing, 2 = show always"
+seta hud_panel_physics "" "enable/disable this panel, 1 = show if not observing, 2 = show always, 3 = show only in race/cts if not observing"
 seta hud_panel_physics_pos "" "position of this base of the panel"
 seta hud_panel_physics_size "" "size of this panel"
 seta hud_panel_physics_bg "" "if set to something else than \"\" = override default background"
@@ -234,3 +232,18 @@ seta hud_panel_physics_flip "" "flip speed/acceleration positions"
 seta hud_panel_physics_progressbar "" "enable progressbar in panel (2 = only for speed; 3 = only for acceleration)"
 seta hud_panel_physics_acceleration_progressbar_mode "" "0 = progressbar increases from the center to the right if the acceleration is positive, to the left if it's negative; 1 = progressbar increases from the border in the same direction for both positive and negative accelerations"
 seta hud_panel_physics_text "" "show text in panel (2 = only for speed; 3 = only for acceleration)"
+
+seta hud_panel_centerprint "" "enable/disable this panel"
+seta hud_panel_centerprint_pos "" "position of this base of the panel"
+seta hud_panel_centerprint_size "" "size of this panel"
+seta hud_panel_centerprint_bg "" "if set to something else than \"\" = override default background"
+seta hud_panel_centerprint_bg_color "" "if set to something else than \"\" = override default panel background color"
+seta hud_panel_centerprint_bg_color_team "" "override panel color with team color in team based games"
+seta hud_panel_centerprint_bg_alpha "" "if set to something else than \"\" = override default panel background alpha"
+seta hud_panel_centerprint_bg_border "" "if set to something else than \"\" = override default size of border around the background"
+seta hud_panel_centerprint_bg_padding "" "if set to something else than \"\" = override default padding of contents from border"
+seta hud_panel_centerprint_align "" "text alignment: 0 left, 0.5 center, 1 right"
+seta hud_panel_centerprint_flip "" "invert messages order"
+seta hud_panel_centerprint_fontscale "" "scale the text font by this amount"
+seta hud_panel_centerprint_time "" "message duration (NOTE: certain messages have a fixed duration)"
+seta hud_panel_centerprint_fadetime "" "how long a message takes to fade out (this time is included in the message duration and can't be > 1)"
index ea66cd177f6f04e0e947e3e5e5415f0bfd1a0291..843bd634fdfedb6b7da041a49327245c3dd9f0d8 100644 (file)
@@ -13,7 +13,7 @@ set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provid
 set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_hlac -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_sniperrifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_rifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_seeker -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
@@ -333,7 +333,8 @@ set g_balance_grenadelauncher_secondary_speed_up 200
 set g_balance_grenadelauncher_secondary_speed_z 0
 set g_balance_grenadelauncher_secondary_spread 0
 set g_balance_grenadelauncher_secondary_lifetime 2.5
-set g_balance_grenadelauncher_secondary_lifetime2 0
+set g_balance_grenadelauncher_secondary_lifetime_bounce 0
+set g_balance_grenadelauncher_secondary_lifetime_stick 0
 set g_balance_grenadelauncher_secondary_refire 0.7
 set g_balance_grenadelauncher_secondary_animtime 0.3
 set g_balance_grenadelauncher_secondary_ammo 2
@@ -649,40 +650,40 @@ set g_balance_hlac_secondary_shots 6
 set g_balance_hlac_reload_ammo 0 //default: 20
 set g_balance_hlac_reload_time 2
 // }}}
-// {{{ sniperrifle
-set g_balance_sniperrifle_bursttime 0
-set g_balance_sniperrifle_primary_tracer 0
-set g_balance_sniperrifle_primary_shots 1
-set g_balance_sniperrifle_primary_damage 60
-set g_balance_sniperrifle_primary_headshotaddeddamage 100
-set g_balance_sniperrifle_primary_spread 0
-set g_balance_sniperrifle_primary_force 2
-set g_balance_sniperrifle_primary_speed 35000
-set g_balance_sniperrifle_primary_lifetime 5
-set g_balance_sniperrifle_primary_refire 0.8
-set g_balance_sniperrifle_primary_animtime 0.3
-set g_balance_sniperrifle_primary_ammo 10
-set g_balance_sniperrifle_primary_bulletconstant 130 // 56.3qu
-set g_balance_sniperrifle_primary_burstcost 0
-set g_balance_sniperrifle_primary_bullethail 0 // empty magazine on shot
-set g_balance_sniperrifle_secondary 1
-set g_balance_sniperrifle_secondary_reload 0
-set g_balance_sniperrifle_secondary_tracer 0
-set g_balance_sniperrifle_secondary_shots 1
-set g_balance_sniperrifle_secondary_damage 35
-set g_balance_sniperrifle_secondary_headshotaddeddamage 15 // 50 damage only on head
-set g_balance_sniperrifle_secondary_spread 0.008
-set g_balance_sniperrifle_secondary_force 1
-set g_balance_sniperrifle_secondary_speed 20000
-set g_balance_sniperrifle_secondary_lifetime 5
-set g_balance_sniperrifle_secondary_refire 0.15
-set g_balance_sniperrifle_secondary_animtime 0.1
-set g_balance_sniperrifle_secondary_ammo 10
-set g_balance_sniperrifle_secondary_bulletconstant 130 // 18.3qu
-set g_balance_sniperrifle_secondary_burstcost 0
-set g_balance_sniperrifle_secondary_bullethail 0 // empty magazine on shot
-set g_balance_sniperrifle_reload_ammo 80 //default: 80
-set g_balance_sniperrifle_reload_time 2
+// {{{ rifle
+set g_balance_rifle_bursttime 0
+set g_balance_rifle_primary_tracer 0
+set g_balance_rifle_primary_shots 1
+set g_balance_rifle_primary_damage 60
+set g_balance_rifle_primary_headshotaddeddamage 100
+set g_balance_rifle_primary_spread 0
+set g_balance_rifle_primary_force 2
+set g_balance_rifle_primary_speed 35000
+set g_balance_rifle_primary_lifetime 5
+set g_balance_rifle_primary_refire 0.8
+set g_balance_rifle_primary_animtime 0.3
+set g_balance_rifle_primary_ammo 10
+set g_balance_rifle_primary_bulletconstant 130 // 56.3qu
+set g_balance_rifle_primary_burstcost 0
+set g_balance_rifle_primary_bullethail 0 // empty magazine on shot
+set g_balance_rifle_secondary 1
+set g_balance_rifle_secondary_reload 0
+set g_balance_rifle_secondary_tracer 0
+set g_balance_rifle_secondary_shots 1
+set g_balance_rifle_secondary_damage 35
+set g_balance_rifle_secondary_headshotaddeddamage 15 // 50 damage only on head
+set g_balance_rifle_secondary_spread 0.008
+set g_balance_rifle_secondary_force 1
+set g_balance_rifle_secondary_speed 20000
+set g_balance_rifle_secondary_lifetime 5
+set g_balance_rifle_secondary_refire 0.15
+set g_balance_rifle_secondary_animtime 0.1
+set g_balance_rifle_secondary_ammo 10
+set g_balance_rifle_secondary_bulletconstant 130 // 18.3qu
+set g_balance_rifle_secondary_burstcost 0
+set g_balance_rifle_secondary_bullethail 0 // empty magazine on shot
+set g_balance_rifle_reload_ammo 80 //default: 80
+set g_balance_rifle_reload_time 2
 // }}}
 // {{{ tuba
 set g_balance_tuba_refire 0.05
diff --git a/balanceFruit.cfg b/balanceFruit.cfg
new file mode 100644 (file)
index 0000000..5a078e4
--- /dev/null
@@ -0,0 +1,792 @@
+// {{{ starting gear
+set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_uzi -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_grenadelauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_minelayer -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_hlac -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_rifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_seeker -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_balance_health_start 125
+set g_balance_armor_start 0
+set g_start_ammo_shells 20
+set g_start_ammo_nails 0
+set g_start_ammo_rockets 0
+set g_start_ammo_cells 0
+set g_start_ammo_fuel 0
+set g_warmup_start_health 200 "starting values when being in warmup-stage"
+set g_warmup_start_armor 100 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_shells 50 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_nails 150 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_rockets 50 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_cells 50 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_fuel 0 "starting values when being in warmup-stage"
+set g_lms_start_health 200
+set g_lms_start_armor 100
+set g_lms_start_ammo_shells 30
+set g_lms_start_ammo_nails 200
+set g_lms_start_ammo_rockets 150
+set g_lms_start_ammo_cells 150
+set g_lms_start_ammo_fuel 0
+set g_balance_nix_roundtime 25
+set g_balance_nix_incrtime 1.6
+set g_balance_nix_ammo_shells 15
+set g_balance_nix_ammo_nails 45
+set g_balance_nix_ammo_rockets 15
+set g_balance_nix_ammo_cells 15
+set g_balance_nix_ammo_fuel 0
+set g_balance_nix_ammoincr_shells 2
+set g_balance_nix_ammoincr_nails 6
+set g_balance_nix_ammoincr_rockets 2
+set g_balance_nix_ammoincr_cells 2
+set g_balance_nix_ammoincr_fuel 2
+// }}}
+
+// {{{ pickup items
+set g_pickup_ammo_anyway 1
+set g_pickup_weapons_anyway 1
+set g_pickup_shells 20
+set g_pickup_shells_weapon 10
+set g_pickup_shells_max 45
+set g_pickup_nails 120
+set g_pickup_nails_weapon 60
+set g_pickup_nails_max 300
+set g_pickup_rockets 25
+set g_pickup_rockets_weapon 15
+set g_pickup_rockets_max 150
+set g_pickup_cells 30
+set g_pickup_cells_weapon 20
+set g_pickup_cells_max 150
+set g_pickup_fuel 25
+set g_pickup_fuel_weapon 15
+set g_pickup_fuel_jetpack 50
+set g_pickup_fuel_max 100
+set g_pickup_armorsmall 5
+set g_pickup_armorsmall_max 150
+set g_pickup_armorsmall_anyway 1
+set g_pickup_armormedium 25
+set g_pickup_armormedium_max 50
+set g_pickup_armormedium_anyway 0
+set g_pickup_armorbig 50
+set g_pickup_armorbig_max 75; // LOG: to allow a little more armor from medium armor
+set g_pickup_armorbig_anyway 0
+set g_pickup_armorlarge 100
+set g_pickup_armorlarge_max 150
+set g_pickup_armorlarge_anyway 1
+set g_pickup_healthsmall 5
+set g_pickup_healthsmall_max 250
+set g_pickup_healthsmall_anyway 1
+set g_pickup_healthmedium 25
+set g_pickup_healthmedium_max 100
+set g_pickup_healthmedium_anyway 0
+set g_pickup_healthlarge 50
+set g_pickup_healthlarge_max 150
+set g_pickup_healthlarge_anyway 0
+set g_pickup_healthmega 100
+set g_pickup_healthmega_max 250
+set g_pickup_healthmega_anyway 1
+set g_pickup_respawntime_short 15
+set g_pickup_respawntime_medium 20
+set g_pickup_respawntime_long 30
+set g_pickup_respawntime_powerup 120
+set g_pickup_respawntime_weapon 10
+set g_pickup_respawntime_ammo 25
+set g_pickup_respawntimejitter_short 0
+set g_pickup_respawntimejitter_medium 0
+set g_pickup_respawntimejitter_long 0
+set g_pickup_respawntimejitter_powerup 10
+set g_pickup_respawntimejitter_weapon 0
+set g_pickup_respawntimejitter_ammo 0
+// }}}
+
+// {{{ regen/rot
+set g_balance_health_regen 0.05
+set g_balance_health_regenlinear 0
+set g_balance_pause_health_regen 5
+set g_balance_pause_health_regen_spawn 0
+set g_balance_health_rot 0
+set g_balance_health_rotlinear 1
+set g_balance_pause_health_rot 1
+set g_balance_pause_health_rot_spawn 0
+set g_balance_health_regenstable 100
+set g_balance_health_rotstable 100
+set g_balance_health_limit 999
+set g_balance_armor_regen 0
+set g_balance_armor_regenlinear 0
+set g_balance_armor_rot 0
+set g_balance_armor_rotlinear 1
+set g_balance_pause_armor_rot 1
+set g_balance_pause_armor_rot_spawn 0
+set g_balance_armor_regenstable 100
+set g_balance_armor_rotstable 100
+set g_balance_armor_limit 999
+set g_balance_armor_blockpercent 0.7
+set g_balance_fuel_regen 0.1 "fuel regeneration (only applies if the player owns IT_FUEL_REGEN)"
+set g_balance_fuel_regenlinear 0
+set g_balance_pause_fuel_regen 2 // other than this, fuel uses the health regen counter
+set g_balance_fuel_rot 0.05
+set g_balance_fuel_rotlinear 0
+set g_balance_pause_fuel_rot 5
+set g_balance_pause_fuel_rot_spawn 10
+set g_balance_fuel_regenstable 50
+set g_balance_fuel_rotstable 100
+set g_balance_fuel_limit 999
+// }}}
+
+// {{{ misc
+set g_balance_selfdamagepercent 0.65
+set g_balance_weaponswitchdelay 0.15
+set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
+set g_weaponratefactor 1 "weapon fire rate multiplier"
+set g_weapondamagefactor 1 "weapon damage multiplier"
+set g_weaponforcefactor 1 "weapon force multiplier"
+set g_weaponspreadfactor 1 "weapon spread multiplier"
+set g_balance_firetransfer_time 0.9
+set g_balance_firetransfer_damage 0.8
+set g_throughfloor_damage 0.7
+set g_throughfloor_force 0.8
+set g_projectiles_newton_style 2
+// possible values:
+// 0: absolute velocity projectiles (like Quake)
+// 1: relative velocity projectiles, "Newtonian" (like Tribes 2)
+// 2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard)
+// 3: absolute velocity + player velocity component in shot direction (note: does NOT yield the right relative velocity, but may be good enough, but it is somewhat prone to sniper rockets)
+// 4: just add the player velocity length to the absolute velocity (tZork's sniper rockets)
+set g_projectiles_newton_style_2_minfactor 0.7
+set g_projectiles_newton_style_2_maxfactor 5
+set g_projectiles_spread_style 7
+// possible values:
+// 0: forward + solid sphere (like Quake) - varies velocity
+// 1: forward + flattened solid sphere
+// 2: forward + solid circle
+// 3: forward + normal distribution 3D - varies velocity
+// 4: forward + normal distribution on a plane
+// 5: forward + circle with 1-r falloff
+// 6: forward + circle with 1-r^2 falloff
+// 7: forward + circle with (1-r)(2-r) falloff
+set g_balance_falldamage_deadminspeed 150
+set g_balance_falldamage_minspeed 800
+set g_balance_falldamage_factor 0.20
+set g_balance_falldamage_maxdamage 15
+set g_balance_damagepush_speedfactor 2.5
+// }}}
+
+// {{{ powerups
+set g_balance_powerup_invincible_takedamage 0.6
+set g_balance_powerup_invincible_time 30
+set g_balance_powerup_strength_damage 3
+set g_balance_powerup_strength_force 4
+set g_balance_powerup_strength_time 30
+set g_balance_powerup_strength_selfdamage 1.5
+set g_balance_powerup_strength_selfforce 1.5
+// }}}
+
+// {{{ jetpack/hook
+set g_jetpack_antigravity 0.8 "factor of gravity compensation of the jetpack"
+set g_jetpack_acceleration_side 1200 "acceleration of the jetpack in xy direction"
+set g_jetpack_acceleration_up 600 "acceleration of the jetpack in z direction (note: you have to factor in gravity here, if antigravity is not 1)"
+set g_jetpack_maxspeed_side 1500 "max speed of the jetpack in xy direction"
+set g_jetpack_maxspeed_up 600 "max speed of the jetpack in z direction"
+set g_jetpack_fuel 8 "fuel per second for jetpack"
+set g_jetpack_attenuation 2 "jetpack sound attenuation"
+
+set g_grappling_hook_tarzan 2 // 2: can also pull players
+set g_balance_grapplehook_speed_fly 1800
+set g_balance_grapplehook_speed_pull 2000
+set g_balance_grapplehook_force_rubber 2000
+set g_balance_grapplehook_force_rubber_overstretch 1000
+set g_balance_grapplehook_length_min 50
+set g_balance_grapplehook_stretch 50
+set g_balance_grapplehook_airfriction 0.2
+set g_balance_grapplehook_health 130
+// }}}
+
+// {{{ weapon properties
+// {{{ laser
+set g_balance_laser_primary_damage 20 // dps 33, hope that's not too high
+set g_balance_laser_primary_edgedamage 20
+set g_balance_laser_primary_force 150 // this looks insanely low, but actually isn't with zscale and velocitybias
+set g_balance_laser_primary_radius 60
+set g_balance_laser_primary_speed 5000
+set g_balance_laser_primary_spread 0
+set g_balance_laser_primary_refire 0.6
+set g_balance_laser_primary_animtime 0.4
+set g_balance_laser_primary_lifetime 5
+set g_balance_laser_primary_shotangle 0
+set g_balance_laser_primary_delay 0
+set g_balance_laser_primary_gauntlet 0
+set g_balance_laser_primary_force_zscale 2 // 300 upforce
+set g_balance_laser_primary_force_velocitybias 0.3
+set g_balance_laser_primary_force_other_scale 2.5 // force 375 when pushing others around
+set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
+set g_balance_laser_secondary_damage 200 // dps
+set g_balance_laser_secondary_edgedamage 0
+set g_balance_laser_secondary_force 1300
+set g_balance_laser_secondary_radius 60
+set g_balance_laser_secondary_speed 0
+set g_balance_laser_secondary_spread 0
+set g_balance_laser_secondary_refire 0.066
+set g_balance_laser_secondary_animtime 0.066
+set g_balance_laser_secondary_lifetime 0
+set g_balance_laser_secondary_shotangle 0
+set g_balance_laser_secondary_delay 0
+set g_balance_laser_secondary_gauntlet 1
+set g_balance_laser_secondary_force_zscale 1.25
+set g_balance_laser_secondary_force_velocitybias 0
+set g_balance_laser_secondary_force_other_scale 0
+set g_balance_laser_reload_ammo 0 //default: 6
+set g_balance_laser_reload_time 2
+// }}}
+// {{{ shotgun
+set g_balance_shotgun_primary_bullets 18
+set g_balance_shotgun_primary_damage 3.5 // LOG: changed from 4 to 3.5, total damage 63
+set g_balance_shotgun_primary_force 20
+set g_balance_shotgun_primary_spread 0.16 // LOG: changed from 0.18 -> 0.16 to compensate a little for lower damage
+set g_balance_shotgun_primary_refire 1
+set g_balance_shotgun_primary_animtime 0.3
+set g_balance_shotgun_primary_ammo 1
+set g_balance_shotgun_primary_speed 12000
+set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
+set g_balance_shotgun_secondary 1
+set g_balance_shotgun_secondary_melee_delay 0.35 // match the anim
+set g_balance_shotgun_secondary_melee_range 85
+set g_balance_shotgun_secondary_melee_swing 50
+set g_balance_shotgun_secondary_melee_time 0.1
+set g_balance_shotgun_secondary_melee_no_doubleslap 0
+set g_balance_shotgun_secondary_damage 110
+set g_balance_shotgun_secondary_force 150
+set g_balance_shotgun_secondary_refire 1.1
+set g_balance_shotgun_secondary_animtime 1
+set g_balance_shotgun_reload_ammo 0 //default: 5
+set g_balance_shotgun_reload_time 2
+// }}}
+// {{{ uzi
+set g_balance_uzi_mode 1                               // Activates varible spread for sustained & burst mode secondary
+set g_balance_uzi_spread_min 0.02
+set g_balance_uzi_spread_max 0.3 // LOG: 0.6 -> 0.3
+set g_balance_uzi_spread_add 0.008
+
+set g_balance_uzi_burst 3                              // # of bullets in a burst (if set to 2 or more)
+set g_balance_uzi_burst_animtime 0.45
+set g_balance_uzi_burst_refire 0.05            // refire between burst bullets
+set g_balance_uzi_burst_refire2 0.45   // refire after burst
+set g_balance_uzi_burst_spread 0.07
+set g_balance_uzi_burst_damage 25
+set g_balance_uzi_burst_force 50
+set g_balance_uzi_burst_ammo 3
+
+set g_balance_uzi_first 1
+set g_balance_uzi_first_damage 15 / f/ LOG: 22 -> 15
+set g_balance_uzi_first_force 50
+set g_balance_uzi_first_spread 0.03
+set g_balance_uzi_first_refire 0.2
+set g_balance_uzi_first_ammo 2
+
+set g_balance_uzi_sustained_damage 12   // 120 dps
+set g_balance_uzi_sustained_force 12
+set g_balance_uzi_sustained_spread 0.06
+set g_balance_uzi_sustained_refire 0.1
+set g_balance_uzi_sustained_ammo 1
+
+set g_balance_uzi_speed 18000
+set g_balance_uzi_bulletconstant 115 // 13.1qu
+
+set g_balance_uzi_reload_ammo 0 //default: 30
+set g_balance_uzi_reload_time 2
+// }}}
+// {{{ mortar
+set g_balance_grenadelauncher_primary_type 0
+set g_balance_grenadelauncher_primary_damage 44
+set g_balance_grenadelauncher_primary_edgedamage 32
+set g_balance_grenadelauncher_primary_force 300
+set g_balance_grenadelauncher_primary_radius 115
+set g_balance_grenadelauncher_primary_speed 1500
+set g_balance_grenadelauncher_primary_speed_up 225
+set g_balance_grenadelauncher_primary_speed_z 0
+set g_balance_grenadelauncher_primary_spread 0
+set g_balance_grenadelauncher_primary_lifetime 5
+set g_balance_grenadelauncher_primary_lifetime2 0.65
+set g_balance_grenadelauncher_primary_refire 0.8
+set g_balance_grenadelauncher_primary_animtime 0.3
+set g_balance_grenadelauncher_primary_ammo 2
+set g_balance_grenadelauncher_primary_health 80
+set g_balance_grenadelauncher_primary_damageforcescale 0
+set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
+
+set g_balance_grenadelauncher_secondary_type 1
+set g_balance_grenadelauncher_secondary_damage 62
+set g_balance_grenadelauncher_secondary_edgedamage 32
+set g_balance_grenadelauncher_secondary_force 300
+set g_balance_grenadelauncher_secondary_radius 150
+set g_balance_grenadelauncher_secondary_speed 1000
+set g_balance_grenadelauncher_secondary_speed_up 250
+set g_balance_grenadelauncher_secondary_speed_z 0
+set g_balance_grenadelauncher_secondary_spread 0
+set g_balance_grenadelauncher_secondary_lifetime 3
+set g_balance_grenadelauncher_secondary_lifetime_bounce 0
+set g_balance_grenadelauncher_secondary_lifetime_stick 0.65
+set g_balance_grenadelauncher_secondary_refire 0.8
+set g_balance_grenadelauncher_secondary_animtime 0.3
+set g_balance_grenadelauncher_secondary_ammo 2
+set g_balance_grenadelauncher_secondary_health 40
+set g_balance_grenadelauncher_secondary_damageforcescale 0
+set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
+
+set g_balance_grenadelauncher_bouncefactor 0.5
+set g_balance_grenadelauncher_bouncestop 0.12
+
+set g_balance_grenadelauncher_reload_ammo 0 //default: 12
+set g_balance_grenadelauncher_reload_time 2
+// }}}
+// {{{ minelayer
+set g_balance_minelayer_damage 42
+set g_balance_minelayer_edgedamage 30
+set g_balance_minelayer_force 250
+set g_balance_minelayer_radius 175
+set g_balance_minelayer_proximityradius 150
+set g_balance_minelayer_speed 750
+set g_balance_minelayer_lifetime 60
+set g_balance_minelayer_lifetime_countdown 0
+set g_balance_minelayer_refire 1.5
+set g_balance_minelayer_animtime 0.3
+set g_balance_minelayer_ammo 5
+set g_balance_minelayer_health 15
+set g_balance_minelayer_limit 3 // 0 disables the limit // LOG: 4 -> 3
+set g_balance_minelayer_protection 1 // don't explode if the mine would hurt the owner or a team mate
+set g_balance_minelayer_damageforcescale 0
+set g_balance_minelayer_detonatedelay -1 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
+set g_balance_minelayer_time 0.5
+set g_balance_minelayer_remote_damage 45
+set g_balance_minelayer_remote_edgedamage 40
+set g_balance_minelayer_remote_radius 200
+set g_balance_minelayer_remote_force 300
+set g_balance_minelayer_reload_ammo 0 //default: 15
+set g_balance_minelayer_reload_time 2
+// }}}
+// {{{ electro
+set g_balance_electro_lightning 1
+set g_balance_electro_primary_damage 100
+set g_balance_electro_primary_edgedamage 0
+set g_balance_electro_primary_force 425
+set g_balance_electro_primary_force_up 125
+set g_balance_electro_primary_radius 850
+set g_balance_electro_primary_comboradius 150
+set g_balance_electro_primary_speed 0
+set g_balance_electro_primary_spread 0
+set g_balance_electro_primary_lifetime 0
+set g_balance_electro_primary_refire 0.4
+set g_balance_electro_primary_animtime 0.2
+set g_balance_electro_primary_ammo 5
+set g_balance_electro_primary_range 800
+set g_balance_electro_primary_falloff_mindist 0
+set g_balance_electro_primary_falloff_maxdist 0
+set g_balance_electro_primary_falloff_halflifedist 0
+set g_balance_electro_secondary_damage 25
+set g_balance_electro_secondary_edgedamage 0
+set g_balance_electro_secondary_force 100
+set g_balance_electro_secondary_radius 100
+set g_balance_electro_secondary_speed 700
+set g_balance_electro_secondary_speed_up 200
+set g_balance_electro_secondary_speed_z 0
+set g_balance_electro_secondary_spread 0.08
+set g_balance_electro_secondary_lifetime 3.5
+set g_balance_electro_secondary_refire 0.2
+set g_balance_electro_secondary_refire2 2
+set g_balance_electro_secondary_animtime 0.2
+set g_balance_electro_secondary_ammo 2
+set g_balance_electro_secondary_health 10
+set g_balance_electro_secondary_damageforcescale 4
+set g_balance_electro_secondary_count 3
+set g_balance_electro_secondary_bouncefactor 0.5
+set g_balance_electro_secondary_bouncestop 0.075
+set g_balance_electro_combo_damage 50
+set g_balance_electro_combo_edgedamage 0
+set g_balance_electro_combo_force 80
+set g_balance_electro_combo_radius 250
+set g_balance_electro_combo_comboradius 0
+set g_balance_electro_combo_speed 400
+set g_balance_electro_reload_ammo 0 //default: 20
+set g_balance_electro_reload_time 2
+// }}}
+// {{{ crylink
+set g_balance_crylink_primary_damage 7 // LOG: 10 -> 7
+set g_balance_crylink_primary_edgedamage 4 // LOG: 6 -> 4
+set g_balance_crylink_primary_force 35
+set g_balance_crylink_primary_radius 80
+set g_balance_crylink_primary_speed 1500
+set g_balance_crylink_primary_spread 0.05
+set g_balance_crylink_primary_shots 7
+set g_balance_crylink_primary_bounces 2
+set g_balance_crylink_primary_refire 0.8
+set g_balance_crylink_primary_animtime 0.3
+set g_balance_crylink_primary_ammo 2
+set g_balance_crylink_primary_bouncedamagefactor 0.2
+set g_balance_crylink_primary_joindelay 0
+set g_balance_crylink_primary_joinspread 0.2
+set g_balance_crylink_primary_jointime 0.1
+set g_balance_crylink_primary_joinexplode 0
+set g_balance_crylink_primary_joinexplode_damage 0
+set g_balance_crylink_primary_joinexplode_edgedamage 0
+set g_balance_crylink_primary_joinexplode_radius 0
+set g_balance_crylink_primary_joinexplode_force 0
+set g_balance_crylink_primary_linkexplode 1
+
+set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000
+set g_balance_crylink_primary_middle_fadetime 5
+set g_balance_crylink_primary_other_lifetime 2 // range: 800 full, fades to 1300
+set g_balance_crylink_primary_other_fadetime 0.25
+
+set g_balance_crylink_secondary 1
+set g_balance_crylink_secondary_damage 5 // LOG: 8 -> 5
+set g_balance_crylink_secondary_edgedamage 3
+set g_balance_crylink_secondary_force 16 // LOG: 20 -> 16
+set g_balance_crylink_secondary_radius 15 // LOG: 20 -> 15
+set g_balance_crylink_secondary_speed 1250 // LOG: 1500 -> 1250
+set g_balance_crylink_secondary_spread 0.1
+set g_balance_crylink_secondary_shots 6
+set g_balance_crylink_secondary_bounces 2
+set g_balance_crylink_secondary_refire 0.9 // LOG: 0.8 -> 0.9
+set g_balance_crylink_secondary_animtime 0.3
+set g_balance_crylink_secondary_ammo 3 // LOG: 2 -> 3
+set g_balance_crylink_secondary_bouncedamagefactor 0.4 // LOG: 0.2 -> 0.4
+set g_balance_crylink_secondary_joindelay 0
+set g_balance_crylink_secondary_joinspread 0.2
+set g_balance_crylink_secondary_jointime 0.1
+set g_balance_crylink_secondary_joinexplode 0                  
+set g_balance_crylink_secondary_joinexplode_damage 0   
+set g_balance_crylink_secondary_joinexplode_edgedamage 0
+set g_balance_crylink_secondary_joinexplode_radius 0
+set g_balance_crylink_secondary_joinexplode_force 0
+set g_balance_crylink_secondary_linkexplode 0
+
+set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000
+set g_balance_crylink_secondary_middle_fadetime 5
+set g_balance_crylink_secondary_line_lifetime 2 // range: 4000 full, fades to 8000
+set g_balance_crylink_secondary_line_fadetime 0.25
+
+set g_balance_crylink_reload_ammo 0 //default: 10
+set g_balance_crylink_reload_time 2
+// }}}
+// {{{ nex
+set g_balance_nex_primary_damage 90
+set g_balance_nex_primary_force 500
+set g_balance_nex_primary_refire 1
+set g_balance_nex_primary_animtime 0.3
+set g_balance_nex_primary_ammo 5
+set g_balance_nex_primary_damagefalloff_mindist 0
+set g_balance_nex_primary_damagefalloff_maxdist 0
+set g_balance_nex_primary_damagefalloff_halflife 0
+set g_balance_nex_primary_damagefalloff_forcehalflife 0
+
+set g_balance_nex_secondary 0 // LOG: disable secondary
+set g_balance_nex_secondary_charge 0 // LOG: disable secondary charge
+set g_balance_nex_secondary_charge_rate 0.4
+set g_balance_nex_secondary_chargepool 1
+set g_balance_nex_secondary_chargepool_regen 0.25
+set g_balance_nex_secondary_chargepool_pause_regen 2
+set g_balance_nex_secondary_chargepool_pause_health_regen 0.5
+set g_balance_nex_secondary_damage 0
+set g_balance_nex_secondary_force 0
+set g_balance_nex_secondary_refire 0
+set g_balance_nex_secondary_animtime 0
+set g_balance_nex_secondary_ammo 0.4 // full charge pool is 1, so it depletes in 2.5 secs
+set g_balance_nex_secondary_damagefalloff_mindist 0
+set g_balance_nex_secondary_damagefalloff_maxdist 0
+set g_balance_nex_secondary_damagefalloff_halflife 0
+set g_balance_nex_secondary_damagefalloff_forcehalflife 0
+
+set g_balance_nex_charge 1
+set g_balance_nex_charge_mindmg 20
+set g_balance_nex_charge_start 0.5
+set g_balance_nex_charge_rate 0.5
+set g_balance_nex_charge_animlimit 0.5
+set g_balance_nex_charge_limit 1 // LOG: 0.5 -> 1 - allow to fully charge automaticaly
+set g_balance_nex_charge_rot_rate 0 // LOG: 0.1 -> 0 - disable rot
+set g_balance_nex_charge_rot_pause 0.5 // Dont rot down until this long after release of charge button
+set g_balance_nex_charge_shot_multiplier 0
+set g_balance_nex_charge_velocity_rate 0
+set g_balance_nex_charge_minspeed 600
+set g_balance_nex_charge_maxspeed 1000
+
+set g_balance_nex_reload_ammo 0 //default: 25
+set g_balance_nex_reload_time 2
+// }}}
+// {{{ minstanex
+set g_balance_minstanex_refire 1
+set g_balance_minstanex_animtime 0.50
+set g_balance_minstanex_ammo 10
+set g_balance_minstanex_laser_ammo 0
+set g_balance_minstanex_reload_ammo 0 //default: 50
+set g_balance_minstanex_reload_time 2
+// }}}
+// {{{ hagar
+set g_balance_hagar_primary_damage 14
+set g_balance_hagar_primary_edgedamage 6
+set g_balance_hagar_primary_force 70
+set g_balance_hagar_primary_radius 110
+set g_balance_hagar_primary_spread 0.1
+set g_balance_hagar_primary_speed 1800
+set g_balance_hagar_primary_lifetime 5
+set g_balance_hagar_primary_refire 0.12
+set g_balance_hagar_primary_ammo 1
+set g_balance_hagar_secondary 1
+set g_balance_hagar_secondary_load 0
+set g_balance_hagar_secondary_load_speed 0.6
+set g_balance_hagar_secondary_load_max 4
+set g_balance_hagar_secondary_load_hold 0
+set g_balance_hagar_secondary_load_releasedeath 1
+set g_balance_hagar_secondary_load_abort 1
+set g_balance_hagar_secondary_damage 14 // default for _load: 32
+set g_balance_hagar_secondary_edgedamage 6 // default for _load: 10
+set g_balance_hagar_secondary_force 70 // default for _load: 160
+set g_balance_hagar_secondary_radius 125
+set g_balance_hagar_secondary_spread 0.15 // default for _load: 0.08
+set g_balance_hagar_secondary_speed 1800
+set g_balance_hagar_secondary_lifetime_min 5
+set g_balance_hagar_secondary_lifetime_rand 0
+set g_balance_hagar_secondary_refire 0.12 // default for _load: 0.8
+set g_balance_hagar_secondary_ammo 1
+set g_balance_hagar_reload_ammo 0 //default: 25
+set g_balance_hagar_reload_time 2
+// }}}
+// {{{ rocketlauncher
+set g_balance_rocketlauncher_damage 82
+set g_balance_rocketlauncher_edgedamage 32
+set g_balance_rocketlauncher_force 350
+set g_balance_rocketlauncher_radius 130
+set g_balance_rocketlauncher_speed 1400
+set g_balance_rocketlauncher_speedaccel 1400
+set g_balance_rocketlauncher_speedstart 800
+set g_balance_rocketlauncher_lifetime 5
+set g_balance_rocketlauncher_refire 1
+set g_balance_rocketlauncher_animtime 0.3
+set g_balance_rocketlauncher_ammo 3
+set g_balance_rocketlauncher_health 0
+set g_balance_rocketlauncher_damageforcescale 0
+set g_balance_rocketlauncher_detonatedelay 0.05 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
+set g_balance_rocketlauncher_guiderate 42 // max degrees per second
+set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
+set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
+set g_balance_rocketlauncher_guidedelay 0.15 // delay before guiding kicks in
+set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
+set g_balance_rocketlauncher_remote_damage 60
+set g_balance_rocketlauncher_remote_edgedamage 20
+set g_balance_rocketlauncher_remote_radius 120
+set g_balance_rocketlauncher_remote_force 350
+set g_balance_rocketlauncher_reload_ammo 0 //default: 25
+set g_balance_rocketlauncher_reload_time 2
+// }}}
+// {{{ porto
+set g_balance_porto_primary_refire 1.5
+set g_balance_porto_primary_animtime 0.2
+set g_balance_porto_primary_speed 2000
+set g_balance_porto_primary_lifetime 5
+set g_balance_portal_health 200 // these get recharged whenever the portal is used
+set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
+// }}}
+// {{{ hook
+set g_balance_hook_primary_fuel 5 // hook monkeys set 0
+set g_balance_hook_primary_refire 0 // hook monkeys set 0
+set g_balance_hook_primary_animtime 0.2 // good shoot anim
+set g_balance_hook_primary_hooked_time_max 0 // infinite
+set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
+set g_balance_hook_primary_hooked_fuel 5 // fuel per second hooked
+set g_balance_hook_secondary_damage 25 // not much
+set g_balance_hook_secondary_edgedamage 5 // not much
+set g_balance_hook_secondary_radius 500 // LOTS
+set g_balance_hook_secondary_force -2000 // LOTS
+set g_balance_hook_secondary_ammo 50 // a whole pack
+set g_balance_hook_secondary_lifetime 5 // infinite
+set g_balance_hook_secondary_speed 0 // not much throwing
+set g_balance_hook_secondary_gravity 5 // fast falling
+set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
+set g_balance_hook_secondary_animtime 0.2 // good shoot anim
+set g_balance_hook_secondary_power 3 // effect behaves like a square function
+set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
+// }}}
+// {{{ hlac
+set g_balance_hlac_primary_spread_min 0.01
+set g_balance_hlac_primary_spread_max 0.075
+set g_balance_hlac_primary_spread_add 0.001
+set g_balance_hlac_primary_spread_crouchmod 0.25
+
+set g_balance_hlac_primary_damage 15
+set g_balance_hlac_primary_edgedamage 10
+set g_balance_hlac_primary_force 70
+set g_balance_hlac_primary_radius 40
+set g_balance_hlac_primary_speed 9000
+set g_balance_hlac_primary_lifetime 5
+
+set g_balance_hlac_primary_refire 0.1
+set g_balance_hlac_primary_animtime 0.2
+set g_balance_hlac_primary_ammo 1
+
+set g_balance_hlac_secondary 1
+set g_balance_hlac_secondary_spread 0.15
+set g_balance_hlac_secondary_spread_crouchmod 0.5
+
+set g_balance_hlac_secondary_damage 20
+set g_balance_hlac_secondary_edgedamage 13
+set g_balance_hlac_secondary_force 100
+set g_balance_hlac_secondary_radius 45
+set g_balance_hlac_secondary_speed 9000
+set g_balance_hlac_secondary_lifetime 5
+
+set g_balance_hlac_secondary_refire 0.8
+set g_balance_hlac_secondary_animtime 0.4
+set g_balance_hlac_secondary_ammo 4
+set g_balance_hlac_secondary_shots 6
+
+set g_balance_hlac_reload_ammo 0 //default: 20
+set g_balance_hlac_reload_time 2
+// }}}
+// {{{ rifle
+set g_balance_rifle_bursttime 0
+set g_balance_rifle_primary_tracer 1
+set g_balance_rifle_primary_shots 1
+set g_balance_rifle_primary_damage 60
+set g_balance_rifle_primary_headshotaddeddamage 60
+set g_balance_rifle_primary_spread 0
+set g_balance_rifle_primary_force 2
+set g_balance_rifle_primary_speed 40000
+set g_balance_rifle_primary_lifetime 5
+set g_balance_rifle_primary_refire 1.5
+set g_balance_rifle_primary_animtime 1.4
+set g_balance_rifle_primary_ammo 10
+set g_balance_rifle_primary_bulletconstant 110 // 62.2qu
+set g_balance_rifle_primary_burstcost 0
+set g_balance_rifle_primary_bullethail 0 // empty magazine on shot
+set g_balance_rifle_secondary 1
+set g_balance_rifle_secondary_reload 1
+set g_balance_rifle_secondary_tracer 0
+set g_balance_rifle_secondary_shots 1
+set g_balance_rifle_secondary_damage 42
+set g_balance_rifle_secondary_headshotaddeddamage 42
+set g_balance_rifle_secondary_spread 0
+set g_balance_rifle_secondary_force 2
+set g_balance_rifle_secondary_speed 20000
+set g_balance_rifle_secondary_lifetime 5
+set g_balance_rifle_secondary_refire 1.5
+set g_balance_rifle_secondary_animtime 1.4
+set g_balance_rifle_secondary_ammo 10
+set g_balance_rifle_secondary_bulletconstant 110 // 15.5qu
+set g_balance_rifle_secondary_burstcost 0
+set g_balance_rifle_secondary_bullethail 0 // empty magazine on shot
+set g_balance_rifle_reload_ammo 80 //default: 80
+set g_balance_rifle_reload_time 2
+// }}}
+// {{{ tuba
+set g_balance_tuba_refire 0.05
+set g_balance_tuba_animtime 0.05
+set g_balance_tuba_attenuation 0.5
+set g_balance_tuba_volume 1
+set g_balance_tuba_fadetime 0.25
+set g_balance_tuba_damage 5
+set g_balance_tuba_edgedamage 0
+set g_balance_tuba_radius 200
+set g_balance_tuba_force 40
+// }}}
+// {{{ fireball
+set g_balance_fireball_primary_ammo 40
+set g_balance_fireball_primary_animtime 0.2
+set g_balance_fireball_primary_bfgdamage 100
+set g_balance_fireball_primary_bfgforce 0
+set g_balance_fireball_primary_bfgradius 1000
+set g_balance_fireball_primary_damage 200
+set g_balance_fireball_primary_damageforcescale 4
+set g_balance_fireball_primary_edgedamage 0
+set g_balance_fireball_primary_force 700
+set g_balance_fireball_primary_health 50
+set g_balance_fireball_primary_laserburntime 0.5
+set g_balance_fireball_primary_laserdamage 80
+set g_balance_fireball_primary_laseredgedamage 20
+set g_balance_fireball_primary_laserradius 256
+set g_balance_fireball_primary_lifetime 15
+set g_balance_fireball_primary_radius 200
+set g_balance_fireball_primary_refire 5
+set g_balance_fireball_primary_refire2 0
+set g_balance_fireball_primary_speed 650
+set g_balance_fireball_primary_spread 0
+set g_balance_fireball_secondary_ammo 5
+set g_balance_fireball_secondary_animtime 0.2
+set g_balance_fireball_secondary_damage 40
+set g_balance_fireball_secondary_damageforcescale 4
+set g_balance_fireball_secondary_damagetime 5
+set g_balance_fireball_secondary_force 100
+set g_balance_fireball_secondary_laserburntime 0.5
+set g_balance_fireball_secondary_laserdamage 50
+set g_balance_fireball_secondary_laseredgedamage 20
+set g_balance_fireball_secondary_laserradius 110
+set g_balance_fireball_secondary_lifetime 7
+set g_balance_fireball_secondary_refire 2
+set g_balance_fireball_secondary_speed 900
+set g_balance_fireball_secondary_speed_up 100
+set g_balance_fireball_secondary_speed_z 0
+set g_balance_fireball_secondary_spread 0
+set g_balance_fireball_reload_ammo 0 //default: 60
+set g_balance_fireball_reload_time 2
+// }}}
+// {{{ seeker
+set g_balance_seeker_type 0 // 0 = old seeker, 1 = new seeker. THIS IS A TEMPORARY CVAR FOR TESTING, will be removed later.
+set g_balance_seeker_flac_ammo 0.5
+set g_balance_seeker_flac_animtime 0.1
+set g_balance_seeker_flac_damage 15
+set g_balance_seeker_flac_edgedamage 10
+set g_balance_seeker_flac_force 50
+set g_balance_seeker_flac_lifetime 0.1
+set g_balance_seeker_flac_lifetime_rand 0.05
+set g_balance_seeker_flac_radius 100
+set g_balance_seeker_flac_refire 0.1
+set g_balance_seeker_flac_speed 3000
+set g_balance_seeker_flac_speed_up 1000
+set g_balance_seeker_flac_speed_z 0
+set g_balance_seeker_flac_spread 0.4
+set g_balance_seeker_missile_accel 1400
+set g_balance_seeker_missile_ammo 2
+set g_balance_seeker_missile_animtime 0.2
+set g_balance_seeker_missile_count 3 // LOG: 8 -> 3
+set g_balance_seeker_missile_damage 30 // LOG: 15 -> 30
+set g_balance_seeker_missile_damageforcescale 4
+set g_balance_seeker_missile_decel 1400
+set g_balance_seeker_missile_delay 0.25
+set g_balance_seeker_missile_edgedamage 10
+set g_balance_seeker_missile_force 150 // LOG: 100 -> 150
+set g_balance_seeker_missile_health 5
+set g_balance_seeker_missile_lifetime 15
+set g_balance_seeker_missile_proxy 0
+set g_balance_seeker_missile_proxy_delay 0.2
+set g_balance_seeker_missile_proxy_maxrange 45
+set g_balance_seeker_missile_radius 80
+set g_balance_seeker_missile_refire 0.5
+set g_balance_seeker_missile_smart 1
+set g_balance_seeker_missile_smart_mindist 800
+set g_balance_seeker_missile_smart_trace_max 2500
+set g_balance_seeker_missile_smart_trace_min 1000
+set g_balance_seeker_missile_speed 700
+set g_balance_seeker_missile_speed_up 300
+set g_balance_seeker_missile_speed_z 0
+set g_balance_seeker_missile_speed_max 1300 // LOG: 1400 -> 1300
+set g_balance_seeker_missile_spread 0
+set g_balance_seeker_missile_turnrate 0.65
+set g_balance_seeker_tag_ammo 1
+set g_balance_seeker_tag_animtime 0.2
+set g_balance_seeker_tag_damageforcescale 4
+set g_balance_seeker_tag_health 5
+set g_balance_seeker_tag_lifetime 15
+set g_balance_seeker_tag_refire 0.75 // LOG: 0.7 -> 0.75
+set g_balance_seeker_tag_speed 5000
+set g_balance_seeker_tag_spread 0
+set g_balance_seeker_tag_tracker_lifetime 10
+set g_balance_seeker_reload_ammo 0 //default: 15
+set g_balance_seeker_reload_time 2
+// End new seeker
index bd72a707171645065832e2d1ed644c5a80353ef2..02e804e798ed7aca25363201c6c120632cfc917a 100644 (file)
@@ -13,7 +13,7 @@ set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provid
 set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_hlac 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_sniperrifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_rifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_fireball 0 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_seeker -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
@@ -333,7 +333,8 @@ set g_balance_grenadelauncher_secondary_speed_up 200
 set g_balance_grenadelauncher_secondary_speed_z 0
 set g_balance_grenadelauncher_secondary_spread 0
 set g_balance_grenadelauncher_secondary_lifetime 2.5
-set g_balance_grenadelauncher_secondary_lifetime2 1
+set g_balance_grenadelauncher_secondary_lifetime_bounce 0
+set g_balance_grenadelauncher_secondary_lifetime_stick 1
 set g_balance_grenadelauncher_secondary_refire 0.6
 set g_balance_grenadelauncher_secondary_animtime 0.3
 set g_balance_grenadelauncher_secondary_ammo 2
@@ -649,40 +650,40 @@ set g_balance_hlac_secondary_shots 6
 set g_balance_hlac_reload_ammo 0 //default: 20
 set g_balance_hlac_reload_time 2
 // }}}
-// {{{ sniperrifle
-set g_balance_sniperrifle_bursttime 0.85 // 0.35 - 0.1 + 0.35 - 0.1 + 0.35 = three secondaries
-set g_balance_sniperrifle_primary_tracer 0
-set g_balance_sniperrifle_primary_shots 1
-set g_balance_sniperrifle_primary_damage 75
-set g_balance_sniperrifle_primary_headshotaddeddamage 90
-set g_balance_sniperrifle_primary_spread 0
-set g_balance_sniperrifle_primary_force 2
-set g_balance_sniperrifle_primary_speed 35000
-set g_balance_sniperrifle_primary_lifetime 5
-set g_balance_sniperrifle_primary_refire 0.7
-set g_balance_sniperrifle_primary_animtime 0.3
-set g_balance_sniperrifle_primary_ammo 10
-set g_balance_sniperrifle_primary_bulletconstant 130 // 56.3qu
-set g_balance_sniperrifle_primary_burstcost 0 // require same cooldown as secondary, note it's smaller than primary refire time
-set g_balance_sniperrifle_primary_bullethail 0 // empty magazine on shot
-set g_balance_sniperrifle_secondary 1
-set g_balance_sniperrifle_secondary_reload 0
-set g_balance_sniperrifle_secondary_tracer 0
-set g_balance_sniperrifle_secondary_shots 1
-set g_balance_sniperrifle_secondary_damage 40
-set g_balance_sniperrifle_secondary_headshotaddeddamage 20
-set g_balance_sniperrifle_secondary_spread 0.008
-set g_balance_sniperrifle_secondary_force 1
-set g_balance_sniperrifle_secondary_speed 20000
-set g_balance_sniperrifle_secondary_lifetime 5
-set g_balance_sniperrifle_secondary_refire 0.0006
-set g_balance_sniperrifle_secondary_animtime 0.1
-set g_balance_sniperrifle_secondary_ammo 10
-set g_balance_sniperrifle_secondary_bulletconstant 130 // 18.3qu
-set g_balance_sniperrifle_secondary_burstcost 0
-set g_balance_sniperrifle_secondary_bullethail 0
-set g_balance_sniperrifle_reload_ammo 80 //default: 80
-set g_balance_sniperrifle_reload_time 2
+// {{{ rifle
+set g_balance_rifle_bursttime 0.85 // 0.35 - 0.1 + 0.35 - 0.1 + 0.35 = three secondaries
+set g_balance_rifle_primary_tracer 0
+set g_balance_rifle_primary_shots 1
+set g_balance_rifle_primary_damage 75
+set g_balance_rifle_primary_headshotaddeddamage 90
+set g_balance_rifle_primary_spread 0
+set g_balance_rifle_primary_force 2
+set g_balance_rifle_primary_speed 35000
+set g_balance_rifle_primary_lifetime 5
+set g_balance_rifle_primary_refire 0.7
+set g_balance_rifle_primary_animtime 0.3
+set g_balance_rifle_primary_ammo 10
+set g_balance_rifle_primary_bulletconstant 130 // 56.3qu
+set g_balance_rifle_primary_burstcost 0 // require same cooldown as secondary, note it's smaller than primary refire time
+set g_balance_rifle_primary_bullethail 0 // empty magazine on shot
+set g_balance_rifle_secondary 1
+set g_balance_rifle_secondary_reload 0
+set g_balance_rifle_secondary_tracer 0
+set g_balance_rifle_secondary_shots 1
+set g_balance_rifle_secondary_damage 40
+set g_balance_rifle_secondary_headshotaddeddamage 20
+set g_balance_rifle_secondary_spread 0.008
+set g_balance_rifle_secondary_force 1
+set g_balance_rifle_secondary_speed 20000
+set g_balance_rifle_secondary_lifetime 5
+set g_balance_rifle_secondary_refire 0.0006
+set g_balance_rifle_secondary_animtime 0.1
+set g_balance_rifle_secondary_ammo 10
+set g_balance_rifle_secondary_bulletconstant 130 // 18.3qu
+set g_balance_rifle_secondary_burstcost 0
+set g_balance_rifle_secondary_bullethail 0
+set g_balance_rifle_reload_ammo 80 //default: 80
+set g_balance_rifle_reload_time 2
 // }}}
 // {{{ tuba
 set g_balance_tuba_refire 0.05
diff --git a/balanceSamual.cfg b/balanceSamual.cfg
deleted file mode 100644 (file)
index f10c260..0000000
+++ /dev/null
@@ -1,791 +0,0 @@
-// {{{ starting gear
-set g_start_weapon_laser -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_shotgun -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_uzi -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_grenadelauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_minelayer -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms" // UNTIL IT CAN BE REMOVED FROM CODE
-set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_hlac -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms" // UNTIL IT CAN BE REMOVED FROM CODE
-set g_start_weapon_sniperrifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms" // UNTIL IT CAN BE REMOVED FROM CODE
-set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_seeker -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_balance_health_start 100
-set g_balance_armor_start 0
-set g_start_ammo_shells 15
-set g_start_ammo_nails 0
-set g_start_ammo_rockets 0
-set g_start_ammo_cells 0
-set g_start_ammo_fuel 0
-set g_warmup_start_health 100 "starting values when being in warmup-stage"
-set g_warmup_start_armor 100 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_nails 160 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_rockets 80 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_cells 90 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_fuel 0 "starting values when being in warmup-stage"
-set g_lms_start_health 200
-set g_lms_start_armor 200
-set g_lms_start_ammo_shells 60
-set g_lms_start_ammo_nails 320
-set g_lms_start_ammo_rockets 160
-set g_lms_start_ammo_cells 180
-set g_lms_start_ammo_fuel 0
-set g_balance_nix_roundtime 25
-set g_balance_nix_incrtime 1.6
-set g_balance_nix_ammo_shells 60
-set g_balance_nix_ammo_nails 320
-set g_balance_nix_ammo_rockets 160
-set g_balance_nix_ammo_cells 180
-set g_balance_nix_ammo_fuel 0
-set g_balance_nix_ammoincr_shells 2 // eh this will need figured out later I assume
-set g_balance_nix_ammoincr_nails 6
-set g_balance_nix_ammoincr_rockets 2
-set g_balance_nix_ammoincr_cells 2
-set g_balance_nix_ammoincr_fuel 2
-// }}}
-
-// {{{ pickup items
-set g_pickup_ammo_anyway 1
-set g_pickup_weapons_anyway 1
-set g_pickup_shells 15
-set g_pickup_shells_weapon 15
-set g_pickup_shells_max 60
-set g_pickup_nails 80
-set g_pickup_nails_weapon 80
-set g_pickup_nails_max 320
-set g_pickup_rockets 40
-set g_pickup_rockets_weapon 40
-set g_pickup_rockets_max 160
-set g_pickup_cells 30
-set g_pickup_cells_weapon 30
-set g_pickup_cells_max 180
-set g_pickup_fuel 50
-set g_pickup_fuel_weapon 50
-set g_pickup_fuel_jetpack 100
-set g_pickup_fuel_max 100
-set g_pickup_armorsmall 5
-set g_pickup_armorsmall_max 200
-set g_pickup_armorsmall_anyway 1
-set g_pickup_armormedium 25
-set g_pickup_armormedium_max 200
-set g_pickup_armormedium_anyway 1
-set g_pickup_armorbig 50
-set g_pickup_armorbig_max 200
-set g_pickup_armorbig_anyway 1
-set g_pickup_armorlarge 100
-set g_pickup_armorlarge_max 200
-set g_pickup_armorlarge_anyway 1
-set g_pickup_healthsmall 5
-set g_pickup_healthsmall_max 200
-set g_pickup_healthsmall_anyway 1
-set g_pickup_healthmedium 25
-set g_pickup_healthmedium_max 200
-set g_pickup_healthmedium_anyway 1
-set g_pickup_healthlarge 50
-set g_pickup_healthlarge_max 200
-set g_pickup_healthlarge_anyway 1
-set g_pickup_healthmega 100
-set g_pickup_healthmega_max 200
-set g_pickup_healthmega_anyway 1
-set g_pickup_respawntime_short 15
-set g_pickup_respawntime_medium 20
-set g_pickup_respawntime_long 30
-set g_pickup_respawntime_powerup 120
-set g_pickup_respawntime_weapon 10
-set g_pickup_respawntime_ammo 10
-set g_pickup_respawntimejitter_short 0
-set g_pickup_respawntimejitter_medium 0
-set g_pickup_respawntimejitter_long 0
-set g_pickup_respawntimejitter_powerup 30
-set g_pickup_respawntimejitter_weapon 0
-set g_pickup_respawntimejitter_ammo 0
-// }}}
-
-// {{{ regen/rot
-set g_balance_health_regen 0.08
-set g_balance_health_regenlinear 0.5
-set g_balance_pause_health_regen 5
-set g_balance_pause_health_regen_spawn 0
-set g_balance_health_rot 0.04
-set g_balance_health_rotlinear 0.75
-set g_balance_pause_health_rot 1
-set g_balance_pause_health_rot_spawn 5
-set g_balance_health_regenstable 100
-set g_balance_health_rotstable 100
-set g_balance_health_limit 999
-set g_balance_armor_regen 0
-set g_balance_armor_regenlinear 0
-set g_balance_armor_rot 0.04
-set g_balance_armor_rotlinear 0.75
-set g_balance_pause_armor_rot 1
-set g_balance_pause_armor_rot_spawn 5
-set g_balance_armor_regenstable 100
-set g_balance_armor_rotstable 100
-set g_balance_armor_limit 999
-set g_balance_armor_blockpercent 0.6
-set g_balance_fuel_regen 0.1 "fuel regeneration (only applies if the player owns IT_FUEL_REGEN)"
-set g_balance_fuel_regenlinear 0
-set g_balance_pause_fuel_regen 2 // other than this, fuel uses the health regen counter
-set g_balance_fuel_rot 0.05
-set g_balance_fuel_rotlinear 0
-set g_balance_pause_fuel_rot 5
-set g_balance_pause_fuel_rot_spawn 10
-set g_balance_fuel_regenstable 50
-set g_balance_fuel_rotstable 100
-set g_balance_fuel_limit 999
-// }}}
-
-// {{{ misc
-set g_balance_selfdamagepercent 0.75
-set g_balance_weaponswitchdelay 0.15
-set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
-set g_weaponratefactor 1 "weapon fire rate multiplier"
-set g_weapondamagefactor 1 "weapon damage multiplier"
-set g_weaponforcefactor 1 "weapon force multiplier"
-set g_weaponspreadfactor 1 "weapon spread multiplier"
-set g_balance_firetransfer_time 0.9
-set g_balance_firetransfer_damage 0.8
-set g_throughfloor_damage 0.4
-set g_throughfloor_force 0.7
-set g_projectiles_newton_style 2
-// possible values:
-// 0: absolute velocity projectiles (like Quake)
-// 1: relative velocity projectiles, "Newtonian" (like Tribes 2)
-// 2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard)
-// 3: absolute velocity + player velocity component in shot direction (note: does NOT yield the right relative velocity, but may be good enough, but it is somewhat prone to sniper rockets)
-// 4: just add the player velocity length to the absolute velocity (tZork's sniper rockets)
-set g_projectiles_newton_style_2_minfactor 0.8
-set g_projectiles_newton_style_2_maxfactor 1.5
-set g_projectiles_spread_style 7
-// possible values:
-// 0: forward + solid sphere (like Quake) - varies velocity
-// 1: forward + flattened solid sphere
-// 2: forward + solid circle
-// 3: forward + normal distribution 3D - varies velocity
-// 4: forward + normal distribution on a plane
-// 5: forward + circle with 1-r falloff
-// 6: forward + circle with 1-r^2 falloff
-// 7: forward + circle with (1-r)(2-r) falloff
-set g_balance_falldamage_deadminspeed 250
-set g_balance_falldamage_minspeed 900
-set g_balance_falldamage_factor 0.20
-set g_balance_falldamage_maxdamage 40
-set g_balance_damagepush_speedfactor 2.5
-// }}}
-
-// {{{ powerups
-set g_balance_powerup_invincible_takedamage 0.25 // only 1/4th damage is taken
-set g_balance_powerup_invincible_time 30
-set g_balance_powerup_strength_damage 3
-set g_balance_powerup_strength_force 3
-set g_balance_powerup_strength_time 30
-set g_balance_powerup_strength_selfdamage 1.5
-set g_balance_powerup_strength_selfforce 1.5
-// }}}
-
-// {{{ jetpack/hook
-set g_jetpack_antigravity 0.8 "factor of gravity compensation of the jetpack"
-set g_jetpack_acceleration_side 1200 "acceleration of the jetpack in xy direction"
-set g_jetpack_acceleration_up 600 "acceleration of the jetpack in z direction (note: you have to factor in gravity here, if antigravity is not 1)"
-set g_jetpack_maxspeed_side 1200 "max speed of the jetpack in xy direction"
-set g_jetpack_maxspeed_up 600 "max speed of the jetpack in z direction"
-set g_jetpack_fuel 8 "fuel per second for jetpack"
-set g_jetpack_attenuation 2 "jetpack sound attenuation"
-
-set g_grappling_hook_tarzan 2 // 2: can also pull players
-set g_balance_grapplehook_speed_fly 1800
-set g_balance_grapplehook_speed_pull 2000
-set g_balance_grapplehook_force_rubber 2000
-set g_balance_grapplehook_force_rubber_overstretch 1000
-set g_balance_grapplehook_length_min 50
-set g_balance_grapplehook_stretch 50
-set g_balance_grapplehook_airfriction 0.2
-set g_balance_grapplehook_health 130
-// }}}
-
-// {{{ weapon properties
-// {{{ laser
-set g_balance_laser_primary_damage 25
-set g_balance_laser_primary_edgedamage 12.5
-set g_balance_laser_primary_force 250
-set g_balance_laser_primary_radius 70
-set g_balance_laser_primary_speed 6000
-set g_balance_laser_primary_spread 0
-set g_balance_laser_primary_refire 0.7
-set g_balance_laser_primary_animtime 0.3
-set g_balance_laser_primary_lifetime 5
-set g_balance_laser_primary_shotangle 0
-set g_balance_laser_primary_delay 0
-set g_balance_laser_primary_gauntlet 0
-set g_balance_laser_primary_force_zscale 1.5
-set g_balance_laser_primary_force_velocitybias 0
-set g_balance_laser_primary_force_other_scale 1
-set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
-set g_balance_laser_secondary_damage 25
-set g_balance_laser_secondary_edgedamage 12.5
-set g_balance_laser_secondary_force 400
-set g_balance_laser_secondary_radius 70
-set g_balance_laser_secondary_speed 12000
-set g_balance_laser_secondary_spread 0
-set g_balance_laser_secondary_refire 0.7
-set g_balance_laser_secondary_animtime 0.3
-set g_balance_laser_secondary_lifetime 5
-set g_balance_laser_secondary_shotangle -90
-set g_balance_laser_secondary_delay 0
-set g_balance_laser_secondary_gauntlet 0
-set g_balance_laser_secondary_force_zscale 1.25
-set g_balance_laser_secondary_force_velocitybias 0
-set g_balance_laser_secondary_force_other_scale 1
-set g_balance_laser_reload_ammo 0 //default: 6
-set g_balance_laser_reload_time 2
-// }}}
-// {{{ shotgun
-set g_balance_shotgun_primary_bullets 14
-set g_balance_shotgun_primary_damage 4
-set g_balance_shotgun_primary_force 15
-set g_balance_shotgun_primary_spread 0.12
-set g_balance_shotgun_primary_refire 0.75
-set g_balance_shotgun_primary_animtime 0.2
-set g_balance_shotgun_primary_ammo 1
-set g_balance_shotgun_primary_speed 8000
-set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
-set g_balance_shotgun_secondary 1
-set g_balance_shotgun_secondary_melee_delay 0.35 // match the anim
-set g_balance_shotgun_secondary_melee_range 85
-set g_balance_shotgun_secondary_melee_swing 50
-set g_balance_shotgun_secondary_melee_time 0.1
-set g_balance_shotgun_secondary_melee_no_doubleslap 1
-set g_balance_shotgun_secondary_damage 115
-set g_balance_shotgun_secondary_force 150
-set g_balance_shotgun_secondary_refire 1.1
-set g_balance_shotgun_secondary_animtime 1
-set g_balance_shotgun_reload_ammo 0 //default: 5
-set g_balance_shotgun_reload_time 2
-// }}}
-// {{{ uzi
-set g_balance_uzi_mode 1                               // Activates varible spread for sustained & burst mode secondary
-set g_balance_uzi_spread_min 0.02
-set g_balance_uzi_spread_max 0.06
-set g_balance_uzi_spread_add 0.012
-
-set g_balance_uzi_burst 3                              // # of bullets in a burst (if set to 2 or more)
-set g_balance_uzi_burst_animtime 0.3
-set g_balance_uzi_burst_refire 0.06            // refire between burst bullets
-set g_balance_uzi_burst_refire2 0.45   // refire after burst
-set g_balance_uzi_burst_spread 0.03
-set g_balance_uzi_burst_damage 25              
-set g_balance_uzi_burst_force 20
-set g_balance_uzi_burst_ammo 3
-
-set g_balance_uzi_first 1
-set g_balance_uzi_first_damage 16
-set g_balance_uzi_first_force 5
-set g_balance_uzi_first_spread 0.03
-set g_balance_uzi_first_refire 0.2
-set g_balance_uzi_first_ammo 1
-
-set g_balance_uzi_sustained_damage 14
-set g_balance_uzi_sustained_force 5
-set g_balance_uzi_sustained_spread 0.04
-set g_balance_uzi_sustained_refire 0.1
-set g_balance_uzi_sustained_ammo 1
-
-set g_balance_uzi_speed 18000
-set g_balance_uzi_bulletconstant 115 // 13.1qu
-
-set g_balance_uzi_reload_ammo 60 //default: 30
-set g_balance_uzi_reload_time 2
-// }}}
-// {{{ mortar
-set g_balance_grenadelauncher_primary_type 0
-set g_balance_grenadelauncher_primary_damage 50
-set g_balance_grenadelauncher_primary_edgedamage 25
-set g_balance_grenadelauncher_primary_force 250
-set g_balance_grenadelauncher_primary_radius 130
-set g_balance_grenadelauncher_primary_speed 1900
-set g_balance_grenadelauncher_primary_speed_up 225
-set g_balance_grenadelauncher_primary_speed_z 0
-set g_balance_grenadelauncher_primary_spread 0.02
-set g_balance_grenadelauncher_primary_lifetime 5
-set g_balance_grenadelauncher_primary_lifetime2 1
-set g_balance_grenadelauncher_primary_refire 0.8
-set g_balance_grenadelauncher_primary_animtime 0.3
-set g_balance_grenadelauncher_primary_ammo 2
-set g_balance_grenadelauncher_primary_health 0
-set g_balance_grenadelauncher_primary_damageforcescale 0
-set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
-
-set g_balance_grenadelauncher_secondary_type 1
-set g_balance_grenadelauncher_secondary_damage 60
-set g_balance_grenadelauncher_secondary_edgedamage 30
-set g_balance_grenadelauncher_secondary_force 250
-set g_balance_grenadelauncher_secondary_radius 130
-set g_balance_grenadelauncher_secondary_speed 1400
-set g_balance_grenadelauncher_secondary_speed_up 150
-set g_balance_grenadelauncher_secondary_speed_z 0
-set g_balance_grenadelauncher_secondary_spread 0.02
-set g_balance_grenadelauncher_secondary_lifetime 1
-set g_balance_grenadelauncher_secondary_lifetime2 0
-set g_balance_grenadelauncher_secondary_refire 0.7
-set g_balance_grenadelauncher_secondary_animtime 0.3
-set g_balance_grenadelauncher_secondary_ammo 2
-set g_balance_grenadelauncher_secondary_health 0
-set g_balance_grenadelauncher_secondary_damageforcescale 4
-set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
-
-set g_balance_grenadelauncher_bouncefactor 0.5
-set g_balance_grenadelauncher_bouncestop 0.075
-
-set g_balance_grenadelauncher_reload_ammo 0 //default: 12
-set g_balance_grenadelauncher_reload_time 2
-// }}}
-// {{{ minelayer
-set g_balance_minelayer_damage 40
-set g_balance_minelayer_edgedamage 20
-set g_balance_minelayer_force 250
-set g_balance_minelayer_radius 175
-set g_balance_minelayer_proximityradius 150
-set g_balance_minelayer_speed 1000
-set g_balance_minelayer_lifetime 10
-set g_balance_minelayer_lifetime_countdown 0.5
-set g_balance_minelayer_refire 1.5
-set g_balance_minelayer_animtime 0.4
-set g_balance_minelayer_ammo 4
-set g_balance_minelayer_health 15
-set g_balance_minelayer_limit 3 // 0 disables the limit
-set g_balance_minelayer_protection 0 // don't explode if the mine would hurt the owner or a team mate
-set g_balance_minelayer_damageforcescale 0
-set g_balance_minelayer_detonatedelay -1 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
-set g_balance_minelayer_time 0.5
-set g_balance_minelayer_remote_damage 45
-set g_balance_minelayer_remote_edgedamage 40
-set g_balance_minelayer_remote_radius 200
-set g_balance_minelayer_remote_force 300
-set g_balance_minelayer_reload_ammo 0 //default: 15
-set g_balance_minelayer_reload_time 2
-// }}}
-// {{{ electro
-set g_balance_electro_lightning 0
-set g_balance_electro_primary_damage 55
-set g_balance_electro_primary_edgedamage 27.5
-set g_balance_electro_primary_force 200
-set g_balance_electro_primary_force_up 0
-set g_balance_electro_primary_radius 100
-set g_balance_electro_primary_comboradius 150
-set g_balance_electro_primary_speed 2500
-set g_balance_electro_primary_spread 0
-set g_balance_electro_primary_lifetime 5
-set g_balance_electro_primary_refire 0.6
-set g_balance_electro_primary_animtime 0.1
-set g_balance_electro_primary_ammo 4
-set g_balance_electro_primary_range 0
-set g_balance_electro_primary_falloff_mindist 255 // 0.3 * radius
-set g_balance_electro_primary_falloff_maxdist 850
-set g_balance_electro_primary_falloff_halflifedist 425
-set g_balance_electro_secondary_damage 40
-set g_balance_electro_secondary_edgedamage 20
-set g_balance_electro_secondary_force 200
-set g_balance_electro_secondary_radius 150
-set g_balance_electro_secondary_speed 900
-set g_balance_electro_secondary_speed_up 200
-set g_balance_electro_secondary_speed_z 0
-set g_balance_electro_secondary_spread 0.05
-set g_balance_electro_secondary_lifetime 3
-set g_balance_electro_secondary_refire 0.2
-set g_balance_electro_secondary_refire2 1.5
-set g_balance_electro_secondary_animtime 0.2
-set g_balance_electro_secondary_ammo 2
-set g_balance_electro_secondary_health 5
-set g_balance_electro_secondary_damageforcescale 4
-set g_balance_electro_secondary_count 3
-set g_balance_electro_secondary_bouncefactor 0.4
-set g_balance_electro_secondary_bouncestop 0.05
-set g_balance_electro_combo_damage 40
-set g_balance_electro_combo_edgedamage 20
-set g_balance_electro_combo_force 120
-set g_balance_electro_combo_radius 175
-set g_balance_electro_combo_comboradius 275
-set g_balance_electro_combo_speed 2000
-set g_balance_electro_reload_ammo 0 //default: 20
-set g_balance_electro_reload_time 2
-// }}}
-// {{{ crylink 
-set g_balance_crylink_primary_damage 10
-set g_balance_crylink_primary_edgedamage 5
-set g_balance_crylink_primary_force -55
-set g_balance_crylink_primary_radius 80
-set g_balance_crylink_primary_speed 1800
-set g_balance_crylink_primary_spread 0.075
-set g_balance_crylink_primary_shots 7
-set g_balance_crylink_primary_bounces 1
-set g_balance_crylink_primary_refire 0.7
-set g_balance_crylink_primary_animtime 0.3
-set g_balance_crylink_primary_ammo 3
-set g_balance_crylink_primary_bouncedamagefactor 0.5
-set g_balance_crylink_primary_joindelay 0
-set g_balance_crylink_primary_joinspread 0.4
-set g_balance_crylink_primary_jointime 0
-set g_balance_crylink_primary_joinexplode 1
-set g_balance_crylink_primary_joinexplode_damage 0
-set g_balance_crylink_primary_joinexplode_edgedamage 0
-set g_balance_crylink_primary_joinexplode_radius 0
-set g_balance_crylink_primary_joinexplode_force 0
-set g_balance_crylink_primary_linkexplode 1
-
-set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000
-set g_balance_crylink_primary_middle_fadetime 5
-set g_balance_crylink_primary_other_lifetime 5 
-set g_balance_crylink_primary_other_fadetime 5
-
-set g_balance_crylink_secondary 1
-set g_balance_crylink_secondary_damage 5
-set g_balance_crylink_secondary_edgedamage 0
-set g_balance_crylink_secondary_force -40
-set g_balance_crylink_secondary_radius 70
-set g_balance_crylink_secondary_speed 2000
-set g_balance_crylink_secondary_spread 0.02
-set g_balance_crylink_secondary_shots 3
-set g_balance_crylink_secondary_bounces 1
-set g_balance_crylink_secondary_refire 0.2
-set g_balance_crylink_secondary_animtime 0.2
-set g_balance_crylink_secondary_ammo 2
-set g_balance_crylink_secondary_bouncedamagefactor 0.5
-set g_balance_crylink_secondary_joindelay 0
-set g_balance_crylink_secondary_joinspread 0
-set g_balance_crylink_secondary_jointime 0
-set g_balance_crylink_secondary_joinexplode 0                  
-set g_balance_crylink_secondary_joinexplode_damage 0   
-set g_balance_crylink_secondary_joinexplode_edgedamage 0
-set g_balance_crylink_secondary_joinexplode_radius 0
-set g_balance_crylink_secondary_joinexplode_force 0
-set g_balance_crylink_secondary_linkexplode 1
-
-set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000
-set g_balance_crylink_secondary_middle_fadetime 5
-set g_balance_crylink_secondary_line_lifetime 5 
-set g_balance_crylink_secondary_line_fadetime 5
-
-set g_balance_crylink_reload_ammo 0 //default: 10
-set g_balance_crylink_reload_time 2
-// }}}
-// {{{ nex
-set g_balance_nex_primary_damage 90
-set g_balance_nex_primary_force 400
-set g_balance_nex_primary_refire 1.25
-set g_balance_nex_primary_animtime 0.3
-set g_balance_nex_primary_ammo 6
-set g_balance_nex_primary_damagefalloff_mindist 0 // 1000    For tZork ;3
-set g_balance_nex_primary_damagefalloff_maxdist 0 // 3000
-set g_balance_nex_primary_damagefalloff_halflife 0 // 1500
-set g_balance_nex_primary_damagefalloff_forcehalflife 0 // 1500
-
-set g_balance_nex_secondary 0
-set g_balance_nex_secondary_charge 0
-set g_balance_nex_secondary_charge_rate 0.1
-set g_balance_nex_secondary_chargepool 0
-set g_balance_nex_secondary_chargepool_regen 0.15
-set g_balance_nex_secondary_chargepool_pause_regen 1
-set g_balance_nex_secondary_chargepool_pause_health_regen 1
-set g_balance_nex_secondary_damage 0
-set g_balance_nex_secondary_force 0
-set g_balance_nex_secondary_refire 0
-set g_balance_nex_secondary_animtime 0
-set g_balance_nex_secondary_ammo 2
-set g_balance_nex_secondary_damagefalloff_mindist 0
-set g_balance_nex_secondary_damagefalloff_maxdist 0
-set g_balance_nex_secondary_damagefalloff_halflife 0
-set g_balance_nex_secondary_damagefalloff_forcehalflife 0
-
-set g_balance_nex_charge 1
-set g_balance_nex_charge_mindmg 40
-set g_balance_nex_charge_start 0
-set g_balance_nex_charge_rate 0.3
-set g_balance_nex_charge_animlimit 0.5
-set g_balance_nex_charge_limit 1
-set g_balance_nex_charge_rot_rate 0
-set g_balance_nex_charge_rot_pause 0 // Dont rot down untill this long after release of charge button
-set g_balance_nex_charge_shot_multiplier 0.25
-set g_balance_nex_charge_velocity_rate 0
-set g_balance_nex_charge_minspeed 400
-set g_balance_nex_charge_maxspeed 800
-
-set g_balance_nex_reload_ammo 0 //default: 25
-set g_balance_nex_reload_time 2
-// }}}
-// {{{ minstanex
-set g_balance_minstanex_refire 1
-set g_balance_minstanex_animtime 0.3
-set g_balance_minstanex_ammo 10
-set g_balance_minstanex_laser_ammo 0
-set g_balance_minstanex_reload_ammo 0 //default: 50
-set g_balance_minstanex_reload_time 2
-// }}}
-// {{{ hagar
-set g_balance_hagar_primary_damage 30
-set g_balance_hagar_primary_edgedamage 15
-set g_balance_hagar_primary_force 50
-set g_balance_hagar_primary_radius 70
-set g_balance_hagar_primary_spread 0.08
-set g_balance_hagar_primary_speed 2000
-set g_balance_hagar_primary_lifetime 5
-set g_balance_hagar_primary_refire 0.15
-set g_balance_hagar_primary_ammo 1
-set g_balance_hagar_secondary 1
-set g_balance_hagar_secondary_load 1
-set g_balance_hagar_secondary_load_speed 0.6
-set g_balance_hagar_secondary_load_max 4
-set g_balance_hagar_secondary_load_hold 1
-set g_balance_hagar_secondary_load_releasedeath 0
-set g_balance_hagar_secondary_load_abort 1
-set g_balance_hagar_secondary_damage 30
-set g_balance_hagar_secondary_edgedamage 15
-set g_balance_hagar_secondary_force 50
-set g_balance_hagar_secondary_radius 70
-set g_balance_hagar_secondary_spread 0.05
-set g_balance_hagar_secondary_speed 2000
-set g_balance_hagar_secondary_lifetime_min 10
-set g_balance_hagar_secondary_lifetime_rand 0
-set g_balance_hagar_secondary_refire 0.15
-set g_balance_hagar_secondary_ammo 1
-set g_balance_hagar_reload_ammo 0 //default: 25
-set g_balance_hagar_reload_time 2
-// }}}
-// {{{ rocketlauncher
-set g_balance_rocketlauncher_damage 80
-set g_balance_rocketlauncher_edgedamage 40
-set g_balance_rocketlauncher_force 400
-set g_balance_rocketlauncher_radius 100
-set g_balance_rocketlauncher_speed 1500
-set g_balance_rocketlauncher_speedaccel 1500
-set g_balance_rocketlauncher_speedstart 800
-set g_balance_rocketlauncher_lifetime 10
-set g_balance_rocketlauncher_refire 1.1
-set g_balance_rocketlauncher_animtime 0.3
-set g_balance_rocketlauncher_ammo 4
-set g_balance_rocketlauncher_health 0 // 30 // 5 hitpoints above maximum laser value -- this way lasers can't blow it up, but grenadelauncher still can most the time.
-set g_balance_rocketlauncher_damageforcescale 1 // low damage force scale so that it can still be affected by other hits, but not so much that it does a 90 degree turn
-set g_balance_rocketlauncher_detonatedelay 0.05 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
-set g_balance_rocketlauncher_guiderate 110 // max degrees per second
-set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
-set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
-set g_balance_rocketlauncher_guidedelay 0.2 // delay before guiding kicks in
-set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
-set g_balance_rocketlauncher_remote_damage 70
-set g_balance_rocketlauncher_remote_edgedamage 35
-set g_balance_rocketlauncher_remote_radius 100
-set g_balance_rocketlauncher_remote_force 400
-set g_balance_rocketlauncher_reload_ammo 0 //default: 25
-set g_balance_rocketlauncher_reload_time 2
-// }}}
-// {{{ porto
-set g_balance_porto_primary_refire 1.5
-set g_balance_porto_primary_animtime 0.3
-set g_balance_porto_primary_speed 5000
-set g_balance_porto_primary_lifetime 5
-set g_balance_portal_health 200 // these get recharged whenever the portal is used
-set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
-// }}}
-// {{{ hook
-set g_balance_hook_primary_fuel 5 // hook monkeys set 0
-set g_balance_hook_primary_refire 0 // hook monkeys set 0
-set g_balance_hook_primary_animtime 0.3 // good shoot anim
-set g_balance_hook_primary_hooked_time_max 0 // infinite
-set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
-set g_balance_hook_primary_hooked_fuel 5 // fuel per second hooked
-set g_balance_hook_secondary_damage 25 // not much
-set g_balance_hook_secondary_edgedamage 5 // not much
-set g_balance_hook_secondary_radius 500 // LOTS
-set g_balance_hook_secondary_force -2000 // LOTS
-set g_balance_hook_secondary_ammo 50 // a whole pack
-set g_balance_hook_secondary_lifetime 5 // infinite
-set g_balance_hook_secondary_speed 0 // not much throwing
-set g_balance_hook_secondary_gravity 5 // fast falling
-set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
-set g_balance_hook_secondary_animtime 0.3 // good shoot anim
-set g_balance_hook_secondary_power 3 // effect behaves like a square function
-set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
-// }}}
-// {{{ hlac // TO BE REMOVED
-set g_balance_hlac_primary_spread_min 0.01
-set g_balance_hlac_primary_spread_max 0.25
-set g_balance_hlac_primary_spread_add 0.0045
-set g_balance_hlac_primary_spread_crouchmod 0.25
-
-set g_balance_hlac_primary_damage 18
-set g_balance_hlac_primary_edgedamage 9
-set g_balance_hlac_primary_force 90
-set g_balance_hlac_primary_radius 70
-set g_balance_hlac_primary_speed 9000
-set g_balance_hlac_primary_lifetime 5
-
-set g_balance_hlac_primary_refire 0.15
-set g_balance_hlac_primary_animtime 0.4
-set g_balance_hlac_primary_ammo 1
-
-set g_balance_hlac_secondary 1
-set g_balance_hlac_secondary_spread 0.15
-set g_balance_hlac_secondary_spread_crouchmod 0.5
-
-set g_balance_hlac_secondary_damage 15
-set g_balance_hlac_secondary_edgedamage 7.5
-set g_balance_hlac_secondary_force 90
-set g_balance_hlac_secondary_radius 70
-set g_balance_hlac_secondary_speed 9000
-set g_balance_hlac_secondary_lifetime 5
-
-set g_balance_hlac_secondary_refire 1
-set g_balance_hlac_secondary_animtime 0.3
-set g_balance_hlac_secondary_ammo 10
-set g_balance_hlac_secondary_shots 6
-
-set g_balance_hlac_reload_ammo 0 //default: 20
-set g_balance_hlac_reload_time 2
-// }}}
-// {{{ sniperrifle
-set g_balance_sniperrifle_bursttime 0
-set g_balance_sniperrifle_primary_tracer 1
-set g_balance_sniperrifle_primary_shots 1
-set g_balance_sniperrifle_primary_damage 60
-set g_balance_sniperrifle_primary_headshotaddeddamage 50
-set g_balance_sniperrifle_primary_spread 0
-set g_balance_sniperrifle_primary_force 100
-set g_balance_sniperrifle_primary_speed 40000
-set g_balance_sniperrifle_primary_lifetime 5
-set g_balance_sniperrifle_primary_refire 1.5
-set g_balance_sniperrifle_primary_animtime 0.7
-set g_balance_sniperrifle_primary_ammo 10
-set g_balance_sniperrifle_primary_bulletconstant 110 // 62.2qu
-set g_balance_sniperrifle_primary_burstcost 0
-set g_balance_sniperrifle_primary_bullethail 0 // empty magazine on shot
-set g_balance_sniperrifle_secondary 0 // Nex and sniper rifle should never be on the same map, so this (zoom on secondary) is okay 
-set g_balance_sniperrifle_secondary_reload 0
-set g_balance_sniperrifle_secondary_tracer 0
-set g_balance_sniperrifle_secondary_shots 1
-set g_balance_sniperrifle_secondary_damage 25
-set g_balance_sniperrifle_secondary_headshotaddeddamage 35
-set g_balance_sniperrifle_secondary_spread 0.01
-set g_balance_sniperrifle_secondary_force 50
-set g_balance_sniperrifle_secondary_speed 20000
-set g_balance_sniperrifle_secondary_lifetime 5
-set g_balance_sniperrifle_secondary_refire 0.6
-set g_balance_sniperrifle_secondary_animtime 0.3
-set g_balance_sniperrifle_secondary_ammo 10
-set g_balance_sniperrifle_secondary_bulletconstant 110 // 15.5qu
-set g_balance_sniperrifle_secondary_burstcost 0
-set g_balance_sniperrifle_secondary_bullethail 0 // empty magazine on shot
-set g_balance_sniperrifle_reload_ammo 80 //default: 80
-set g_balance_sniperrifle_reload_time 2
-// }}}
-// {{{ tuba
-set g_balance_tuba_refire 0.05
-set g_balance_tuba_animtime 0.05
-set g_balance_tuba_attenuation 0.5
-set g_balance_tuba_volume 1
-set g_balance_tuba_fadetime 0.25
-set g_balance_tuba_damage 5
-set g_balance_tuba_edgedamage 0
-set g_balance_tuba_radius 200
-set g_balance_tuba_force 40
-// }}}
-// {{{ fireball // this is a superweapon -- lets make it behave as one. 
-set g_balance_fireball_primary_ammo 20
-set g_balance_fireball_primary_animtime 0.2
-set g_balance_fireball_primary_bfgdamage 100
-set g_balance_fireball_primary_bfgforce 0
-set g_balance_fireball_primary_bfgradius 1000
-set g_balance_fireball_primary_damage 200
-set g_balance_fireball_primary_damageforcescale 0
-set g_balance_fireball_primary_edgedamage 50
-set g_balance_fireball_primary_force 600
-set g_balance_fireball_primary_health 0
-set g_balance_fireball_primary_laserburntime 0.5
-set g_balance_fireball_primary_laserdamage 80
-set g_balance_fireball_primary_laseredgedamage 20
-set g_balance_fireball_primary_laserradius 256
-set g_balance_fireball_primary_lifetime 15
-set g_balance_fireball_primary_radius 200
-set g_balance_fireball_primary_refire 2
-set g_balance_fireball_primary_refire2 0
-set g_balance_fireball_primary_speed 1200
-set g_balance_fireball_primary_spread 0
-set g_balance_fireball_secondary_ammo 5
-set g_balance_fireball_secondary_animtime 0.3
-set g_balance_fireball_secondary_damage 40
-set g_balance_fireball_secondary_damageforcescale 4
-set g_balance_fireball_secondary_damagetime 5
-set g_balance_fireball_secondary_force 100
-set g_balance_fireball_secondary_laserburntime 0.5
-set g_balance_fireball_secondary_laserdamage 50
-set g_balance_fireball_secondary_laseredgedamage 20
-set g_balance_fireball_secondary_laserradius 110
-set g_balance_fireball_secondary_lifetime 7
-set g_balance_fireball_secondary_refire 1.5
-set g_balance_fireball_secondary_speed 900
-set g_balance_fireball_secondary_speed_up 100
-set g_balance_fireball_secondary_speed_z 0
-set g_balance_fireball_secondary_spread 0
-set g_balance_fireball_reload_ammo 0 //default: 100
-set g_balance_fireball_reload_time 2
-// }}}
-// {{{ seeker
-set g_balance_seeker_type 1 // 0 = old seeker, 1 = new seeker. THIS IS A TEMPORARY CVAR FOR TESTING, will be removed later.
-set g_balance_seeker_flac_ammo 0.5
-set g_balance_seeker_flac_animtime 0.1
-set g_balance_seeker_flac_damage 15
-set g_balance_seeker_flac_edgedamage 10
-set g_balance_seeker_flac_force 50
-set g_balance_seeker_flac_lifetime 0.1
-set g_balance_seeker_flac_lifetime_rand 0.05
-set g_balance_seeker_flac_radius 100
-set g_balance_seeker_flac_refire 0.1
-set g_balance_seeker_flac_speed 3000
-set g_balance_seeker_flac_speed_up 1000
-set g_balance_seeker_flac_speed_z 0
-set g_balance_seeker_flac_spread 0.4
-set g_balance_seeker_tag_ammo 1
-set g_balance_seeker_tag_animtime 0.2
-set g_balance_seeker_tag_damageforcescale 0
-set g_balance_seeker_tag_health 0
-set g_balance_seeker_tag_lifetime 15
-set g_balance_seeker_tag_refire 0.75 // LOG: 0.7 -> 0.75
-set g_balance_seeker_tag_speed 5000
-set g_balance_seeker_tag_spread 0
-set g_balance_seeker_tag_tracker_lifetime 10
-set g_balance_seeker_missile_accel 1500
-set g_balance_seeker_missile_ammo 2
-set g_balance_seeker_missile_animtime 0.2
-set g_balance_seeker_missile_count 3 // LOG: 8 -> 3
-set g_balance_seeker_missile_damage 16 // LOG: 15 -> 30
-set g_balance_seeker_missile_damageforcescale 4
-set g_balance_seeker_missile_decel 6000
-set g_balance_seeker_missile_delay 0.25
-set g_balance_seeker_missile_edgedamage 8
-set g_balance_seeker_missile_force 50 // LOG: 100 -> 150
-set g_balance_seeker_missile_health 1
-set g_balance_seeker_missile_lifetime 15
-set g_balance_seeker_missile_proxy 0
-set g_balance_seeker_missile_proxy_delay 0.2
-set g_balance_seeker_missile_proxy_maxrange 45
-set g_balance_seeker_missile_radius 70
-set g_balance_seeker_missile_refire 0.25
-set g_balance_seeker_missile_smart 0
-set g_balance_seeker_missile_smart_mindist 800
-set g_balance_seeker_missile_smart_trace_max 2500
-set g_balance_seeker_missile_smart_trace_min 1000
-set g_balance_seeker_missile_speed 1500
-set g_balance_seeker_missile_speed_up 0
-set g_balance_seeker_missile_speed_z 0
-set g_balance_seeker_missile_speed_max 2000 // LOG: 1400 -> 1300
-set g_balance_seeker_missile_spread 0
-set g_balance_seeker_missile_turnrate 0.15
-set g_balance_seeker_reload_ammo 0 //default: 15
-set g_balance_seeker_reload_time 2
-// End new seeker
index 5bffd7df9a9067f4fd498e468628d334fdf55b2f..864ead2ccedc87746f05987589d0e8cc82c76fa3 100644 (file)
@@ -7,45 +7,45 @@ set g_start_weapon_minelayer -1 "0 = never provide the weapon, 1 = always provid
 set g_start_weapon_electro -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_crylink -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_nex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_hagar -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms" // UNTIL IT CAN BE REMOVED FROM CODE
 set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_hlac -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_sniperrifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_hlac -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms" // UNTIL IT CAN BE REMOVED FROM CODE
+set g_start_weapon_rifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms" // UNTIL IT CAN BE REMOVED FROM CODE
 set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_seeker -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_balance_health_start 125
+set g_balance_health_start 100
 set g_balance_armor_start 0
-set g_start_ammo_shells 20
+set g_start_ammo_shells 15
 set g_start_ammo_nails 0
 set g_start_ammo_rockets 0
 set g_start_ammo_cells 0
 set g_start_ammo_fuel 0
-set g_warmup_start_health 200 "starting values when being in warmup-stage"
+set g_warmup_start_health 100 "starting values when being in warmup-stage"
 set g_warmup_start_armor 100 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_shells 50 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_nails 150 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_rockets 50 "starting values when being in warmup-stage"
-set g_warmup_start_ammo_cells 50 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_shells 30 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_nails 160 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_rockets 80 "starting values when being in warmup-stage"
+set g_warmup_start_ammo_cells 90 "starting values when being in warmup-stage"
 set g_warmup_start_ammo_fuel 0 "starting values when being in warmup-stage"
 set g_lms_start_health 200
-set g_lms_start_armor 100
-set g_lms_start_ammo_shells 30
-set g_lms_start_ammo_nails 200
-set g_lms_start_ammo_rockets 150
-set g_lms_start_ammo_cells 150
+set g_lms_start_armor 200
+set g_lms_start_ammo_shells 60
+set g_lms_start_ammo_nails 320
+set g_lms_start_ammo_rockets 160
+set g_lms_start_ammo_cells 180
 set g_lms_start_ammo_fuel 0
 set g_balance_nix_roundtime 25
 set g_balance_nix_incrtime 1.6
-set g_balance_nix_ammo_shells 15
-set g_balance_nix_ammo_nails 45
-set g_balance_nix_ammo_rockets 15
-set g_balance_nix_ammo_cells 15
+set g_balance_nix_ammo_shells 60
+set g_balance_nix_ammo_nails 320
+set g_balance_nix_ammo_rockets 160
+set g_balance_nix_ammo_cells 180
 set g_balance_nix_ammo_fuel 0
-set g_balance_nix_ammoincr_shells 2
+set g_balance_nix_ammoincr_shells 2 // eh this will need figured out later I assume
 set g_balance_nix_ammoincr_nails 6
 set g_balance_nix_ammoincr_rockets 2
 set g_balance_nix_ammoincr_cells 2
@@ -55,82 +55,82 @@ set g_balance_nix_ammoincr_fuel 2
 // {{{ pickup items
 set g_pickup_ammo_anyway 1
 set g_pickup_weapons_anyway 1
-set g_pickup_shells 20
-set g_pickup_shells_weapon 10
-set g_pickup_shells_max 45
-set g_pickup_nails 120
-set g_pickup_nails_weapon 60
-set g_pickup_nails_max 300
-set g_pickup_rockets 25
-set g_pickup_rockets_weapon 15
-set g_pickup_rockets_max 150
+set g_pickup_shells 15
+set g_pickup_shells_weapon 15
+set g_pickup_shells_max 60
+set g_pickup_nails 80
+set g_pickup_nails_weapon 80
+set g_pickup_nails_max 320
+set g_pickup_rockets 40
+set g_pickup_rockets_weapon 40
+set g_pickup_rockets_max 160
 set g_pickup_cells 30
-set g_pickup_cells_weapon 20
-set g_pickup_cells_max 150
-set g_pickup_fuel 25
-set g_pickup_fuel_weapon 15
-set g_pickup_fuel_jetpack 50
+set g_pickup_cells_weapon 30
+set g_pickup_cells_max 180
+set g_pickup_fuel 50
+set g_pickup_fuel_weapon 50
+set g_pickup_fuel_jetpack 100
 set g_pickup_fuel_max 100
 set g_pickup_armorsmall 5
-set g_pickup_armorsmall_max 150
+set g_pickup_armorsmall_max 200
 set g_pickup_armorsmall_anyway 1
 set g_pickup_armormedium 25
-set g_pickup_armormedium_max 50
-set g_pickup_armormedium_anyway 0
+set g_pickup_armormedium_max 200
+set g_pickup_armormedium_anyway 1
 set g_pickup_armorbig 50
-set g_pickup_armorbig_max 75; // LOG: to allow a little more armor from medium armor
-set g_pickup_armorbig_anyway 0
+set g_pickup_armorbig_max 200
+set g_pickup_armorbig_anyway 1
 set g_pickup_armorlarge 100
-set g_pickup_armorlarge_max 150
+set g_pickup_armorlarge_max 200
 set g_pickup_armorlarge_anyway 1
 set g_pickup_healthsmall 5
-set g_pickup_healthsmall_max 250
+set g_pickup_healthsmall_max 200
 set g_pickup_healthsmall_anyway 1
 set g_pickup_healthmedium 25
-set g_pickup_healthmedium_max 100
-set g_pickup_healthmedium_anyway 0
+set g_pickup_healthmedium_max 200
+set g_pickup_healthmedium_anyway 1
 set g_pickup_healthlarge 50
-set g_pickup_healthlarge_max 150
-set g_pickup_healthlarge_anyway 0
+set g_pickup_healthlarge_max 200
+set g_pickup_healthlarge_anyway 1
 set g_pickup_healthmega 100
-set g_pickup_healthmega_max 250
+set g_pickup_healthmega_max 200
 set g_pickup_healthmega_anyway 1
 set g_pickup_respawntime_short 15
 set g_pickup_respawntime_medium 20
 set g_pickup_respawntime_long 30
 set g_pickup_respawntime_powerup 120
 set g_pickup_respawntime_weapon 10
-set g_pickup_respawntime_ammo 25
+set g_pickup_respawntime_ammo 10
 set g_pickup_respawntimejitter_short 0
 set g_pickup_respawntimejitter_medium 0
 set g_pickup_respawntimejitter_long 0
-set g_pickup_respawntimejitter_powerup 10
+set g_pickup_respawntimejitter_powerup 30
 set g_pickup_respawntimejitter_weapon 0
 set g_pickup_respawntimejitter_ammo 0
 // }}}
 
 // {{{ regen/rot
-set g_balance_health_regen 0.05
-set g_balance_health_regenlinear 0
+set g_balance_health_regen 0.08
+set g_balance_health_regenlinear 0.5
 set g_balance_pause_health_regen 5
 set g_balance_pause_health_regen_spawn 0
-set g_balance_health_rot 0
-set g_balance_health_rotlinear 1
+set g_balance_health_rot 0.04
+set g_balance_health_rotlinear 0.75
 set g_balance_pause_health_rot 1
-set g_balance_pause_health_rot_spawn 0
+set g_balance_pause_health_rot_spawn 5
 set g_balance_health_regenstable 100
 set g_balance_health_rotstable 100
 set g_balance_health_limit 999
 set g_balance_armor_regen 0
 set g_balance_armor_regenlinear 0
-set g_balance_armor_rot 0
-set g_balance_armor_rotlinear 1
+set g_balance_armor_rot 0.04
+set g_balance_armor_rotlinear 0.75
 set g_balance_pause_armor_rot 1
-set g_balance_pause_armor_rot_spawn 0
+set g_balance_pause_armor_rot_spawn 5
 set g_balance_armor_regenstable 100
 set g_balance_armor_rotstable 100
 set g_balance_armor_limit 999
-set g_balance_armor_blockpercent 0.7
+set g_balance_armor_blockpercent 0.6
 set g_balance_fuel_regen 0.1 "fuel regeneration (only applies if the player owns IT_FUEL_REGEN)"
 set g_balance_fuel_regenlinear 0
 set g_balance_pause_fuel_regen 2 // other than this, fuel uses the health regen counter
@@ -144,7 +144,7 @@ set g_balance_fuel_limit 999
 // }}}
 
 // {{{ misc
-set g_balance_selfdamagepercent 0.65
+set g_balance_selfdamagepercent 0.75
 set g_balance_weaponswitchdelay 0.15
 set g_weaponspeedfactor 1 "weapon projectile speed multiplier"
 set g_weaponratefactor 1 "weapon fire rate multiplier"
@@ -153,8 +153,8 @@ set g_weaponforcefactor 1 "weapon force multiplier"
 set g_weaponspreadfactor 1 "weapon spread multiplier"
 set g_balance_firetransfer_time 0.9
 set g_balance_firetransfer_damage 0.8
-set g_throughfloor_damage 0.7
-set g_throughfloor_force 0.8
+set g_throughfloor_damage 0.4
+set g_throughfloor_force 0.7
 set g_projectiles_newton_style 2
 // possible values:
 // 0: absolute velocity projectiles (like Quake)
@@ -162,8 +162,8 @@ set g_projectiles_newton_style 2
 // 2: relative velocity projectiles, but aim is precorrected so projectiles hit the crosshair (note: strafe rockets then are SLOWER than ones shot while standing, happens in 1 too when aiming correctly which is hard)
 // 3: absolute velocity + player velocity component in shot direction (note: does NOT yield the right relative velocity, but may be good enough, but it is somewhat prone to sniper rockets)
 // 4: just add the player velocity length to the absolute velocity (tZork's sniper rockets)
-set g_projectiles_newton_style_2_minfactor 0.7
-set g_projectiles_newton_style_2_maxfactor 5
+set g_projectiles_newton_style_2_minfactor 0.8
+set g_projectiles_newton_style_2_maxfactor 1.5
 set g_projectiles_spread_style 7
 // possible values:
 // 0: forward + solid sphere (like Quake) - varies velocity
@@ -174,18 +174,18 @@ set g_projectiles_spread_style 7
 // 5: forward + circle with 1-r falloff
 // 6: forward + circle with 1-r^2 falloff
 // 7: forward + circle with (1-r)(2-r) falloff
-set g_balance_falldamage_deadminspeed 150
-set g_balance_falldamage_minspeed 800
+set g_balance_falldamage_deadminspeed 250
+set g_balance_falldamage_minspeed 900
 set g_balance_falldamage_factor 0.20
-set g_balance_falldamage_maxdamage 15
+set g_balance_falldamage_maxdamage 40
 set g_balance_damagepush_speedfactor 2.5
 // }}}
 
 // {{{ powerups
-set g_balance_powerup_invincible_takedamage 0.6
+set g_balance_powerup_invincible_takedamage 0.25 // only 1/4th damage is taken
 set g_balance_powerup_invincible_time 30
 set g_balance_powerup_strength_damage 3
-set g_balance_powerup_strength_force 4
+set g_balance_powerup_strength_force 3
 set g_balance_powerup_strength_time 30
 set g_balance_powerup_strength_selfdamage 1.5
 set g_balance_powerup_strength_selfforce 1.5
@@ -195,7 +195,7 @@ set g_balance_powerup_strength_selfforce 1.5
 set g_jetpack_antigravity 0.8 "factor of gravity compensation of the jetpack"
 set g_jetpack_acceleration_side 1200 "acceleration of the jetpack in xy direction"
 set g_jetpack_acceleration_up 600 "acceleration of the jetpack in z direction (note: you have to factor in gravity here, if antigravity is not 1)"
-set g_jetpack_maxspeed_side 1500 "max speed of the jetpack in xy direction"
+set g_jetpack_maxspeed_side 1200 "max speed of the jetpack in xy direction"
 set g_jetpack_maxspeed_up 600 "max speed of the jetpack in z direction"
 set g_jetpack_fuel 8 "fuel per second for jetpack"
 set g_jetpack_attenuation 2 "jetpack sound attenuation"
@@ -213,58 +213,58 @@ set g_balance_grapplehook_health 130
 
 // {{{ weapon properties
 // {{{ laser
-set g_balance_laser_primary_damage 20 // dps 33, hope that's not too high
-set g_balance_laser_primary_edgedamage 20
-set g_balance_laser_primary_force 150 // this looks insanely low, but actually isn't with zscale and velocitybias
-set g_balance_laser_primary_radius 60
-set g_balance_laser_primary_speed 5000
+set g_balance_laser_primary_damage 25
+set g_balance_laser_primary_edgedamage 12.5
+set g_balance_laser_primary_force 250
+set g_balance_laser_primary_radius 70
+set g_balance_laser_primary_speed 6000
 set g_balance_laser_primary_spread 0
-set g_balance_laser_primary_refire 0.6
-set g_balance_laser_primary_animtime 0.4
+set g_balance_laser_primary_refire 0.7
+set g_balance_laser_primary_animtime 0.3
 set g_balance_laser_primary_lifetime 5
 set g_balance_laser_primary_shotangle 0
 set g_balance_laser_primary_delay 0
 set g_balance_laser_primary_gauntlet 0
-set g_balance_laser_primary_force_zscale 2 // 300 upforce
-set g_balance_laser_primary_force_velocitybias 0.3
-set g_balance_laser_primary_force_other_scale 2.5 // force 375 when pushing others around
+set g_balance_laser_primary_force_zscale 1.5
+set g_balance_laser_primary_force_velocitybias 0
+set g_balance_laser_primary_force_other_scale 1
 set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
-set g_balance_laser_secondary_damage 200 // dps
-set g_balance_laser_secondary_edgedamage 0
-set g_balance_laser_secondary_force 1300
-set g_balance_laser_secondary_radius 60
-set g_balance_laser_secondary_speed 0
+set g_balance_laser_secondary_damage 25
+set g_balance_laser_secondary_edgedamage 12.5
+set g_balance_laser_secondary_force 400
+set g_balance_laser_secondary_radius 70
+set g_balance_laser_secondary_speed 12000
 set g_balance_laser_secondary_spread 0
-set g_balance_laser_secondary_refire 0.066
-set g_balance_laser_secondary_animtime 0.066
-set g_balance_laser_secondary_lifetime 0
-set g_balance_laser_secondary_shotangle 0
+set g_balance_laser_secondary_refire 0.7
+set g_balance_laser_secondary_animtime 0.3
+set g_balance_laser_secondary_lifetime 5
+set g_balance_laser_secondary_shotangle -90
 set g_balance_laser_secondary_delay 0
-set g_balance_laser_secondary_gauntlet 1
+set g_balance_laser_secondary_gauntlet 0
 set g_balance_laser_secondary_force_zscale 1.25
 set g_balance_laser_secondary_force_velocitybias 0
-set g_balance_laser_secondary_force_other_scale 0
+set g_balance_laser_secondary_force_other_scale 1
 set g_balance_laser_reload_ammo 0 //default: 6
 set g_balance_laser_reload_time 2
 // }}}
 // {{{ shotgun
-set g_balance_shotgun_primary_bullets 18
-set g_balance_shotgun_primary_damage 3.5 // LOG: changed from 4 to 3.5, total damage 63
-set g_balance_shotgun_primary_force 20
-set g_balance_shotgun_primary_spread 0.16 // LOG: changed from 0.18 -> 0.16 to compensate a little for lower damage
-set g_balance_shotgun_primary_refire 1
-set g_balance_shotgun_primary_animtime 0.3
+set g_balance_shotgun_primary_bullets 14
+set g_balance_shotgun_primary_damage 4
+set g_balance_shotgun_primary_force 15
+set g_balance_shotgun_primary_spread 0.12
+set g_balance_shotgun_primary_refire 0.75
+set g_balance_shotgun_primary_animtime 0.2
 set g_balance_shotgun_primary_ammo 1
-set g_balance_shotgun_primary_speed 12000
+set g_balance_shotgun_primary_speed 8000
 set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
 set g_balance_shotgun_secondary 1
-set g_balance_shotgun_secondary_melee_delay 0.35 // match the anim
-set g_balance_shotgun_secondary_melee_range 85
+set g_balance_shotgun_secondary_melee_delay 0.25 // 0.35 was too slow
+set g_balance_shotgun_secondary_melee_range 120
 set g_balance_shotgun_secondary_melee_swing 50
 set g_balance_shotgun_secondary_melee_time 0.1
-set g_balance_shotgun_secondary_melee_no_doubleslap 0
+set g_balance_shotgun_secondary_melee_no_doubleslap 1
 set g_balance_shotgun_secondary_damage 110
-set g_balance_shotgun_secondary_force 150
+set g_balance_shotgun_secondary_force 200
 set g_balance_shotgun_secondary_refire 1.1
 set g_balance_shotgun_secondary_animtime 1
 set g_balance_shotgun_reload_ammo 0 //default: 5
@@ -273,95 +273,96 @@ set g_balance_shotgun_reload_time 2
 // {{{ uzi
 set g_balance_uzi_mode 1                               // Activates varible spread for sustained & burst mode secondary
 set g_balance_uzi_spread_min 0.02
-set g_balance_uzi_spread_max 0.3 // LOG: 0.6 -> 0.3
-set g_balance_uzi_spread_add 0.008
+set g_balance_uzi_spread_max 0.06
+set g_balance_uzi_spread_add 0.012
 
 set g_balance_uzi_burst 3                              // # of bullets in a burst (if set to 2 or more)
-set g_balance_uzi_burst_animtime 0.45
-set g_balance_uzi_burst_refire 0.05            // refire between burst bullets
-set g_balance_uzi_burst_refire2 0.45   // refire after burst
-set g_balance_uzi_burst_spread 0.07
-set g_balance_uzi_burst_damage 25
-set g_balance_uzi_burst_force 50
+set g_balance_uzi_burst_animtime 0.3
+set g_balance_uzi_burst_refire 0.06            // refire between burst bullets
+set g_balance_uzi_burst_refire2 0.45   // refire after burst
+set g_balance_uzi_burst_spread 0.03
+set g_balance_uzi_burst_damage 25              
+set g_balance_uzi_burst_force 20
 set g_balance_uzi_burst_ammo 3
 
 set g_balance_uzi_first 1
-set g_balance_uzi_first_damage 15 / f/ LOG: 22 -> 15
-set g_balance_uzi_first_force 50
+set g_balance_uzi_first_damage 16
+set g_balance_uzi_first_force 5
 set g_balance_uzi_first_spread 0.03
 set g_balance_uzi_first_refire 0.2
-set g_balance_uzi_first_ammo 2
+set g_balance_uzi_first_ammo 1
 
-set g_balance_uzi_sustained_damage 12   // 120 dps
-set g_balance_uzi_sustained_force 12
-set g_balance_uzi_sustained_spread 0.06
+set g_balance_uzi_sustained_damage 14
+set g_balance_uzi_sustained_force 5
+set g_balance_uzi_sustained_spread 0.04
 set g_balance_uzi_sustained_refire 0.1
 set g_balance_uzi_sustained_ammo 1
 
 set g_balance_uzi_speed 18000
 set g_balance_uzi_bulletconstant 115 // 13.1qu
 
-set g_balance_uzi_reload_ammo 0 //default: 30
+set g_balance_uzi_reload_ammo 60 //default: 30
 set g_balance_uzi_reload_time 2
 // }}}
 // {{{ mortar
 set g_balance_grenadelauncher_primary_type 0
-set g_balance_grenadelauncher_primary_damage 44
-set g_balance_grenadelauncher_primary_edgedamage 32
-set g_balance_grenadelauncher_primary_force 300
-set g_balance_grenadelauncher_primary_radius 115
-set g_balance_grenadelauncher_primary_speed 1500
+set g_balance_grenadelauncher_primary_damage 50
+set g_balance_grenadelauncher_primary_edgedamage 25
+set g_balance_grenadelauncher_primary_force 250
+set g_balance_grenadelauncher_primary_radius 130
+set g_balance_grenadelauncher_primary_speed 1900
 set g_balance_grenadelauncher_primary_speed_up 225
 set g_balance_grenadelauncher_primary_speed_z 0
-set g_balance_grenadelauncher_primary_spread 0
+set g_balance_grenadelauncher_primary_spread 0.02
 set g_balance_grenadelauncher_primary_lifetime 5
-set g_balance_grenadelauncher_primary_lifetime2 0.65
+set g_balance_grenadelauncher_primary_lifetime2 1
 set g_balance_grenadelauncher_primary_refire 0.8
 set g_balance_grenadelauncher_primary_animtime 0.3
 set g_balance_grenadelauncher_primary_ammo 2
-set g_balance_grenadelauncher_primary_health 80
+set g_balance_grenadelauncher_primary_health 0
 set g_balance_grenadelauncher_primary_damageforcescale 0
 set g_balance_grenadelauncher_primary_remote_minbouncecnt 0
 
 set g_balance_grenadelauncher_secondary_type 1
-set g_balance_grenadelauncher_secondary_damage 62
-set g_balance_grenadelauncher_secondary_edgedamage 32
-set g_balance_grenadelauncher_secondary_force 300
-set g_balance_grenadelauncher_secondary_radius 150
-set g_balance_grenadelauncher_secondary_speed 1000
-set g_balance_grenadelauncher_secondary_speed_up 250
+set g_balance_grenadelauncher_secondary_damage 60
+set g_balance_grenadelauncher_secondary_edgedamage 30
+set g_balance_grenadelauncher_secondary_force 250
+set g_balance_grenadelauncher_secondary_radius 130
+set g_balance_grenadelauncher_secondary_speed 1400
+set g_balance_grenadelauncher_secondary_speed_up 150
 set g_balance_grenadelauncher_secondary_speed_z 0
-set g_balance_grenadelauncher_secondary_spread 0
-set g_balance_grenadelauncher_secondary_lifetime 3
-set g_balance_grenadelauncher_secondary_lifetime2 0.65
-set g_balance_grenadelauncher_secondary_refire 0.8
+set g_balance_grenadelauncher_secondary_spread 0.02
+set g_balance_grenadelauncher_secondary_lifetime 5
+set g_balance_grenadelauncher_secondary_lifetime_bounce 0.5
+set g_balance_grenadelauncher_secondary_lifetime_stick 0
+set g_balance_grenadelauncher_secondary_refire 0.7
 set g_balance_grenadelauncher_secondary_animtime 0.3
 set g_balance_grenadelauncher_secondary_ammo 2
-set g_balance_grenadelauncher_secondary_health 40
-set g_balance_grenadelauncher_secondary_damageforcescale 0
+set g_balance_grenadelauncher_secondary_health 0
+set g_balance_grenadelauncher_secondary_damageforcescale 4
 set g_balance_grenadelauncher_secondary_remote_detonateprimary 0
 
 set g_balance_grenadelauncher_bouncefactor 0.5
-set g_balance_grenadelauncher_bouncestop 0.12
+set g_balance_grenadelauncher_bouncestop 0.075
 
 set g_balance_grenadelauncher_reload_ammo 0 //default: 12
 set g_balance_grenadelauncher_reload_time 2
 // }}}
 // {{{ minelayer
-set g_balance_minelayer_damage 42
-set g_balance_minelayer_edgedamage 30
+set g_balance_minelayer_damage 40
+set g_balance_minelayer_edgedamage 20
 set g_balance_minelayer_force 250
 set g_balance_minelayer_radius 175
 set g_balance_minelayer_proximityradius 150
-set g_balance_minelayer_speed 750
-set g_balance_minelayer_lifetime 60
-set g_balance_minelayer_lifetime_countdown 0
+set g_balance_minelayer_speed 1000
+set g_balance_minelayer_lifetime 10
+set g_balance_minelayer_lifetime_countdown 0.5
 set g_balance_minelayer_refire 1.5
-set g_balance_minelayer_animtime 0.3
-set g_balance_minelayer_ammo 5
+set g_balance_minelayer_animtime 0.4
+set g_balance_minelayer_ammo 4
 set g_balance_minelayer_health 15
-set g_balance_minelayer_limit 3 // 0 disables the limit // LOG: 4 -> 3
-set g_balance_minelayer_protection 1 // don't explode if the mine would hurt the owner or a team mate
+set g_balance_minelayer_limit 3 // 0 disables the limit
+set g_balance_minelayer_protection 0 // don't explode if the mine would hurt the owner or a team mate
 set g_balance_minelayer_damageforcescale 0
 set g_balance_minelayer_detonatedelay -1 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
 set g_balance_minelayer_time 0.5
@@ -373,222 +374,222 @@ set g_balance_minelayer_reload_ammo 0 //default: 15
 set g_balance_minelayer_reload_time 2
 // }}}
 // {{{ electro
-set g_balance_electro_lightning 1
-set g_balance_electro_primary_damage 100
-set g_balance_electro_primary_edgedamage 0
-set g_balance_electro_primary_force 425
-set g_balance_electro_primary_force_up 125
-set g_balance_electro_primary_radius 850
+set g_balance_electro_lightning 0
+set g_balance_electro_primary_damage 55
+set g_balance_electro_primary_edgedamage 27.5
+set g_balance_electro_primary_force 200
+set g_balance_electro_primary_force_up 0
+set g_balance_electro_primary_radius 100
 set g_balance_electro_primary_comboradius 150
-set g_balance_electro_primary_speed 0
+set g_balance_electro_primary_speed 2500
 set g_balance_electro_primary_spread 0
-set g_balance_electro_primary_lifetime 0
-set g_balance_electro_primary_refire 0.4
-set g_balance_electro_primary_animtime 0.2
-set g_balance_electro_primary_ammo 5
-set g_balance_electro_primary_range 800
-set g_balance_electro_primary_falloff_mindist 0
-set g_balance_electro_primary_falloff_maxdist 0
-set g_balance_electro_primary_falloff_halflifedist 0
-set g_balance_electro_secondary_damage 25
-set g_balance_electro_secondary_edgedamage 0
-set g_balance_electro_secondary_force 100
-set g_balance_electro_secondary_radius 100
-set g_balance_electro_secondary_speed 700
+set g_balance_electro_primary_lifetime 5
+set g_balance_electro_primary_refire 0.6
+set g_balance_electro_primary_animtime 0.1
+set g_balance_electro_primary_ammo 4
+set g_balance_electro_primary_range 0
+set g_balance_electro_primary_falloff_mindist 255 // 0.3 * radius
+set g_balance_electro_primary_falloff_maxdist 850
+set g_balance_electro_primary_falloff_halflifedist 425
+set g_balance_electro_secondary_damage 40
+set g_balance_electro_secondary_edgedamage 20
+set g_balance_electro_secondary_force 200
+set g_balance_electro_secondary_radius 150
+set g_balance_electro_secondary_speed 900
 set g_balance_electro_secondary_speed_up 200
 set g_balance_electro_secondary_speed_z 0
-set g_balance_electro_secondary_spread 0.08
-set g_balance_electro_secondary_lifetime 3.5
+set g_balance_electro_secondary_spread 0.05
+set g_balance_electro_secondary_lifetime 3
 set g_balance_electro_secondary_refire 0.2
-set g_balance_electro_secondary_refire2 2
+set g_balance_electro_secondary_refire2 1.5
 set g_balance_electro_secondary_animtime 0.2
 set g_balance_electro_secondary_ammo 2
-set g_balance_electro_secondary_health 10
+set g_balance_electro_secondary_health 5
 set g_balance_electro_secondary_damageforcescale 4
 set g_balance_electro_secondary_count 3
-set g_balance_electro_secondary_bouncefactor 0.5
-set g_balance_electro_secondary_bouncestop 0.075
-set g_balance_electro_combo_damage 50
-set g_balance_electro_combo_edgedamage 0
-set g_balance_electro_combo_force 80
-set g_balance_electro_combo_radius 250
-set g_balance_electro_combo_comboradius 0
-set g_balance_electro_combo_speed 400
+set g_balance_electro_secondary_bouncefactor 0.4
+set g_balance_electro_secondary_bouncestop 0.05
+set g_balance_electro_combo_damage 40
+set g_balance_electro_combo_edgedamage 20
+set g_balance_electro_combo_force 120
+set g_balance_electro_combo_radius 175
+set g_balance_electro_combo_comboradius 275
+set g_balance_electro_combo_speed 2000
 set g_balance_electro_reload_ammo 0 //default: 20
 set g_balance_electro_reload_time 2
 // }}}
-// {{{ crylink
-set g_balance_crylink_primary_damage 7 // LOG: 10 -> 7
-set g_balance_crylink_primary_edgedamage 4 // LOG: 6 -> 4
-set g_balance_crylink_primary_force 35
+// {{{ crylink 
+set g_balance_crylink_primary_damage 10
+set g_balance_crylink_primary_edgedamage 5
+set g_balance_crylink_primary_force -55
 set g_balance_crylink_primary_radius 80
-set g_balance_crylink_primary_speed 1500
-set g_balance_crylink_primary_spread 0.05
+set g_balance_crylink_primary_speed 1800
+set g_balance_crylink_primary_spread 0.075
 set g_balance_crylink_primary_shots 7
-set g_balance_crylink_primary_bounces 2
-set g_balance_crylink_primary_refire 0.8
+set g_balance_crylink_primary_bounces 1
+set g_balance_crylink_primary_refire 0.7
 set g_balance_crylink_primary_animtime 0.3
-set g_balance_crylink_primary_ammo 2
-set g_balance_crylink_primary_bouncedamagefactor 0.2
+set g_balance_crylink_primary_ammo 3
+set g_balance_crylink_primary_bouncedamagefactor 0.5
 set g_balance_crylink_primary_joindelay 0
-set g_balance_crylink_primary_joinspread 0.2
-set g_balance_crylink_primary_jointime 0.1
-set g_balance_crylink_primary_joinexplode 0
+set g_balance_crylink_primary_joinspread 0.4
+set g_balance_crylink_primary_jointime 0
+set g_balance_crylink_primary_joinexplode 1
 set g_balance_crylink_primary_joinexplode_damage 0
 set g_balance_crylink_primary_joinexplode_edgedamage 0
 set g_balance_crylink_primary_joinexplode_radius 0
 set g_balance_crylink_primary_joinexplode_force 0
 set g_balance_crylink_primary_linkexplode 1
 
-set g_balance_crylink_primary_middle_lifetime 5 // range: 10000 full, fades to 20000
+set g_balance_crylink_primary_middle_lifetime 5 // range: 35000 full, fades to 70000
 set g_balance_crylink_primary_middle_fadetime 5
-set g_balance_crylink_primary_other_lifetime 2 // range: 800 full, fades to 1300
-set g_balance_crylink_primary_other_fadetime 0.25
+set g_balance_crylink_primary_other_lifetime 
+set g_balance_crylink_primary_other_fadetime 5
 
 set g_balance_crylink_secondary 1
-set g_balance_crylink_secondary_damage 5 // LOG: 8 -> 5
-set g_balance_crylink_secondary_edgedamage 3
-set g_balance_crylink_secondary_force 16 // LOG: 20 -> 16
-set g_balance_crylink_secondary_radius 15 // LOG: 20 -> 15
-set g_balance_crylink_secondary_speed 1250 // LOG: 1500 -> 1250
-set g_balance_crylink_secondary_spread 0.1
-set g_balance_crylink_secondary_shots 6
-set g_balance_crylink_secondary_bounces 2
-set g_balance_crylink_secondary_refire 0.9 // LOG: 0.8 -> 0.9
-set g_balance_crylink_secondary_animtime 0.3
-set g_balance_crylink_secondary_ammo 3 // LOG: 2 -> 3
-set g_balance_crylink_secondary_bouncedamagefactor 0.4 // LOG: 0.2 -> 0.4
+set g_balance_crylink_secondary_damage 5
+set g_balance_crylink_secondary_edgedamage 0
+set g_balance_crylink_secondary_force -40
+set g_balance_crylink_secondary_radius 70
+set g_balance_crylink_secondary_speed 2000
+set g_balance_crylink_secondary_spread 0.02
+set g_balance_crylink_secondary_shots 3
+set g_balance_crylink_secondary_bounces 1
+set g_balance_crylink_secondary_refire 0.2
+set g_balance_crylink_secondary_animtime 0.2
+set g_balance_crylink_secondary_ammo 2
+set g_balance_crylink_secondary_bouncedamagefactor 0.5
 set g_balance_crylink_secondary_joindelay 0
-set g_balance_crylink_secondary_joinspread 0.2
-set g_balance_crylink_secondary_jointime 0.1
+set g_balance_crylink_secondary_joinspread 0
+set g_balance_crylink_secondary_jointime 0
 set g_balance_crylink_secondary_joinexplode 0                  
 set g_balance_crylink_secondary_joinexplode_damage 0   
 set g_balance_crylink_secondary_joinexplode_edgedamage 0
 set g_balance_crylink_secondary_joinexplode_radius 0
 set g_balance_crylink_secondary_joinexplode_force 0
-set g_balance_crylink_secondary_linkexplode 0
+set g_balance_crylink_secondary_linkexplode 1
 
-set g_balance_crylink_secondary_middle_lifetime 5 // range: 10000 full, fades to 10000
+set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000
 set g_balance_crylink_secondary_middle_fadetime 5
-set g_balance_crylink_secondary_line_lifetime 2 // range: 4000 full, fades to 8000
-set g_balance_crylink_secondary_line_fadetime 0.25
+set g_balance_crylink_secondary_line_lifetime 
+set g_balance_crylink_secondary_line_fadetime 5
 
 set g_balance_crylink_reload_ammo 0 //default: 10
 set g_balance_crylink_reload_time 2
 // }}}
 // {{{ nex
 set g_balance_nex_primary_damage 90
-set g_balance_nex_primary_force 500
-set g_balance_nex_primary_refire 1
+set g_balance_nex_primary_force 400
+set g_balance_nex_primary_refire 1.25
 set g_balance_nex_primary_animtime 0.3
-set g_balance_nex_primary_ammo 5
-set g_balance_nex_primary_damagefalloff_mindist 0
-set g_balance_nex_primary_damagefalloff_maxdist 0
-set g_balance_nex_primary_damagefalloff_halflife 0
-set g_balance_nex_primary_damagefalloff_forcehalflife 0
+set g_balance_nex_primary_ammo 6
+set g_balance_nex_primary_damagefalloff_mindist 0 // 1000    For tZork ;3
+set g_balance_nex_primary_damagefalloff_maxdist 0 // 3000
+set g_balance_nex_primary_damagefalloff_halflife 0 // 1500
+set g_balance_nex_primary_damagefalloff_forcehalflife 0 // 1500
 
-set g_balance_nex_secondary 0 // LOG: disable secondary
-set g_balance_nex_secondary_charge 0 // LOG: disable secondary charge
-set g_balance_nex_secondary_charge_rate 0.4
-set g_balance_nex_secondary_chargepool 1
-set g_balance_nex_secondary_chargepool_regen 0.25
-set g_balance_nex_secondary_chargepool_pause_regen 2
-set g_balance_nex_secondary_chargepool_pause_health_regen 0.5
+set g_balance_nex_secondary 0
+set g_balance_nex_secondary_charge 0
+set g_balance_nex_secondary_charge_rate 0.1
+set g_balance_nex_secondary_chargepool 0
+set g_balance_nex_secondary_chargepool_regen 0.15
+set g_balance_nex_secondary_chargepool_pause_regen 1
+set g_balance_nex_secondary_chargepool_pause_health_regen 1
 set g_balance_nex_secondary_damage 0
 set g_balance_nex_secondary_force 0
 set g_balance_nex_secondary_refire 0
 set g_balance_nex_secondary_animtime 0
-set g_balance_nex_secondary_ammo 0.4 // full charge pool is 1, so it depletes in 2.5 secs
+set g_balance_nex_secondary_ammo 2
 set g_balance_nex_secondary_damagefalloff_mindist 0
 set g_balance_nex_secondary_damagefalloff_maxdist 0
 set g_balance_nex_secondary_damagefalloff_halflife 0
 set g_balance_nex_secondary_damagefalloff_forcehalflife 0
 
 set g_balance_nex_charge 1
-set g_balance_nex_charge_mindmg 20
+set g_balance_nex_charge_mindmg 40
 set g_balance_nex_charge_start 0.5
-set g_balance_nex_charge_rate 0.5
+set g_balance_nex_charge_rate 0.4
 set g_balance_nex_charge_animlimit 0.5
-set g_balance_nex_charge_limit 1 // LOG: 0.5 -> 1 - allow to fully charge automaticaly
-set g_balance_nex_charge_rot_rate 0 // LOG: 0.1 -> 0 - disable rot
-set g_balance_nex_charge_rot_pause 0.5 // Dont rot down until this long after release of charge button
+set g_balance_nex_charge_limit 1
+set g_balance_nex_charge_rot_rate 0
+set g_balance_nex_charge_rot_pause 0 // Dont rot down untill this long after release of charge button
 set g_balance_nex_charge_shot_multiplier 0
 set g_balance_nex_charge_velocity_rate 0
-set g_balance_nex_charge_minspeed 600
-set g_balance_nex_charge_maxspeed 1000
+set g_balance_nex_charge_minspeed 400
+set g_balance_nex_charge_maxspeed 800
 
 set g_balance_nex_reload_ammo 0 //default: 25
 set g_balance_nex_reload_time 2
 // }}}
 // {{{ minstanex
 set g_balance_minstanex_refire 1
-set g_balance_minstanex_animtime 0.50
+set g_balance_minstanex_animtime 0.3
 set g_balance_minstanex_ammo 10
 set g_balance_minstanex_laser_ammo 0
 set g_balance_minstanex_reload_ammo 0 //default: 50
 set g_balance_minstanex_reload_time 2
 // }}}
 // {{{ hagar
-set g_balance_hagar_primary_damage 14
-set g_balance_hagar_primary_edgedamage 6
-set g_balance_hagar_primary_force 70
-set g_balance_hagar_primary_radius 110
-set g_balance_hagar_primary_spread 0.1
-set g_balance_hagar_primary_speed 1800
+set g_balance_hagar_primary_damage 30
+set g_balance_hagar_primary_edgedamage 15
+set g_balance_hagar_primary_force 50
+set g_balance_hagar_primary_radius 70
+set g_balance_hagar_primary_spread 0.05
+set g_balance_hagar_primary_speed 2000
 set g_balance_hagar_primary_lifetime 5
-set g_balance_hagar_primary_refire 0.12
+set g_balance_hagar_primary_refire 0.15
 set g_balance_hagar_primary_ammo 1
 set g_balance_hagar_secondary 1
-set g_balance_hagar_secondary_load 0
-set g_balance_hagar_secondary_load_speed 0.6
+set g_balance_hagar_secondary_load 1
+set g_balance_hagar_secondary_load_speed 0.5
 set g_balance_hagar_secondary_load_max 4
-set g_balance_hagar_secondary_load_hold 0
-set g_balance_hagar_secondary_load_releasedeath 1
+set g_balance_hagar_secondary_load_hold 1
+set g_balance_hagar_secondary_load_releasedeath 0
 set g_balance_hagar_secondary_load_abort 1
-set g_balance_hagar_secondary_damage 14 // default for _load: 32
-set g_balance_hagar_secondary_edgedamage 6 // default for _load: 10
-set g_balance_hagar_secondary_force 70 // default for _load: 160
-set g_balance_hagar_secondary_radius 125
-set g_balance_hagar_secondary_spread 0.15 // default for _load: 0.08
-set g_balance_hagar_secondary_speed 1800
-set g_balance_hagar_secondary_lifetime_min 5
+set g_balance_hagar_secondary_damage 40
+set g_balance_hagar_secondary_edgedamage 20
+set g_balance_hagar_secondary_force 50
+set g_balance_hagar_secondary_radius 80
+set g_balance_hagar_secondary_spread 0.05
+set g_balance_hagar_secondary_speed 2000
+set g_balance_hagar_secondary_lifetime_min 10
 set g_balance_hagar_secondary_lifetime_rand 0
-set g_balance_hagar_secondary_refire 0.12 // default for _load: 0.8
+set g_balance_hagar_secondary_refire 0.5
 set g_balance_hagar_secondary_ammo 1
 set g_balance_hagar_reload_ammo 0 //default: 25
 set g_balance_hagar_reload_time 2
 // }}}
 // {{{ rocketlauncher
-set g_balance_rocketlauncher_damage 82
-set g_balance_rocketlauncher_edgedamage 32
-set g_balance_rocketlauncher_force 350
-set g_balance_rocketlauncher_radius 130
-set g_balance_rocketlauncher_speed 1400
-set g_balance_rocketlauncher_speedaccel 1400
+set g_balance_rocketlauncher_damage 80
+set g_balance_rocketlauncher_edgedamage 40
+set g_balance_rocketlauncher_force 400
+set g_balance_rocketlauncher_radius 100
+set g_balance_rocketlauncher_speed 1500
+set g_balance_rocketlauncher_speedaccel 1500
 set g_balance_rocketlauncher_speedstart 800
-set g_balance_rocketlauncher_lifetime 5
-set g_balance_rocketlauncher_refire 1
+set g_balance_rocketlauncher_lifetime 10
+set g_balance_rocketlauncher_refire 1.1
 set g_balance_rocketlauncher_animtime 0.3
-set g_balance_rocketlauncher_ammo 3
-set g_balance_rocketlauncher_health 0
-set g_balance_rocketlauncher_damageforcescale 0
+set g_balance_rocketlauncher_ammo 4
+set g_balance_rocketlauncher_health 0 // 30 // 5 hitpoints above maximum laser value -- this way lasers can't blow it up, but grenadelauncher still can most the time.
+set g_balance_rocketlauncher_damageforcescale 1 // low damage force scale so that it can still be affected by other hits, but not so much that it does a 90 degree turn
 set g_balance_rocketlauncher_detonatedelay 0.05 // positive: timer till detonation is allowed, negative: "security device" that prevents ANY remote detonation if it could hurt its owner, zero: detonatable at any time
-set g_balance_rocketlauncher_guiderate 42 // max degrees per second
+set g_balance_rocketlauncher_guiderate 110 // max degrees per second
 set g_balance_rocketlauncher_guideratedelay 0.01 // immediate
 set g_balance_rocketlauncher_guidegoal 512 // goal distance for (non-laser) guiding (higher = less control, lower = erratic)
-set g_balance_rocketlauncher_guidedelay 0.15 // delay before guiding kicks in
+set g_balance_rocketlauncher_guidedelay 0.2 // delay before guiding kicks in
 set g_balance_rocketlauncher_guidestop 0 // stop guiding when firing again
-set g_balance_rocketlauncher_remote_damage 60
-set g_balance_rocketlauncher_remote_edgedamage 20
-set g_balance_rocketlauncher_remote_radius 120
-set g_balance_rocketlauncher_remote_force 350
+set g_balance_rocketlauncher_remote_damage 70
+set g_balance_rocketlauncher_remote_edgedamage 35
+set g_balance_rocketlauncher_remote_radius 100
+set g_balance_rocketlauncher_remote_force 400
 set g_balance_rocketlauncher_reload_ammo 0 //default: 25
 set g_balance_rocketlauncher_reload_time 2
 // }}}
 // {{{ porto
 set g_balance_porto_primary_refire 1.5
-set g_balance_porto_primary_animtime 0.2
-set g_balance_porto_primary_speed 2000
+set g_balance_porto_primary_animtime 0.3
+set g_balance_porto_primary_speed 5000
 set g_balance_porto_primary_lifetime 5
 set g_balance_portal_health 200 // these get recharged whenever the portal is used
 set g_balance_portal_lifetime 15 // these get recharged whenever the portal is used
@@ -596,7 +597,7 @@ set g_balance_portal_lifetime 15 // these get recharged whenever the portal is u
 // {{{ hook
 set g_balance_hook_primary_fuel 5 // hook monkeys set 0
 set g_balance_hook_primary_refire 0 // hook monkeys set 0
-set g_balance_hook_primary_animtime 0.2 // good shoot anim
+set g_balance_hook_primary_animtime 0.3 // good shoot anim
 set g_balance_hook_primary_hooked_time_max 0 // infinite
 set g_balance_hook_primary_hooked_time_free 2 // 2s being hooked are free
 set g_balance_hook_primary_hooked_fuel 5 // fuel per second hooked
@@ -609,80 +610,80 @@ set g_balance_hook_secondary_lifetime 5 // infinite
 set g_balance_hook_secondary_speed 0 // not much throwing
 set g_balance_hook_secondary_gravity 5 // fast falling
 set g_balance_hook_secondary_refire 3 // don't drop too many bombs...
-set g_balance_hook_secondary_animtime 0.2 // good shoot anim
+set g_balance_hook_secondary_animtime 0.3 // good shoot anim
 set g_balance_hook_secondary_power 3 // effect behaves like a square function
 set g_balance_hook_secondary_duration 1.5 // effect runs for three seconds
 // }}}
-// {{{ hlac
+// {{{ hlac // TO BE REMOVED
 set g_balance_hlac_primary_spread_min 0.01
-set g_balance_hlac_primary_spread_max 0.075
-set g_balance_hlac_primary_spread_add 0.001
+set g_balance_hlac_primary_spread_max 0.25
+set g_balance_hlac_primary_spread_add 0.0045
 set g_balance_hlac_primary_spread_crouchmod 0.25
 
-set g_balance_hlac_primary_damage 15
-set g_balance_hlac_primary_edgedamage 10
-set g_balance_hlac_primary_force 70
-set g_balance_hlac_primary_radius 40
+set g_balance_hlac_primary_damage 18
+set g_balance_hlac_primary_edgedamage 9
+set g_balance_hlac_primary_force 90
+set g_balance_hlac_primary_radius 70
 set g_balance_hlac_primary_speed 9000
 set g_balance_hlac_primary_lifetime 5
 
-set g_balance_hlac_primary_refire 0.1
-set g_balance_hlac_primary_animtime 0.2
+set g_balance_hlac_primary_refire 0.15
+set g_balance_hlac_primary_animtime 0.4
 set g_balance_hlac_primary_ammo 1
 
 set g_balance_hlac_secondary 1
 set g_balance_hlac_secondary_spread 0.15
 set g_balance_hlac_secondary_spread_crouchmod 0.5
 
-set g_balance_hlac_secondary_damage 20
-set g_balance_hlac_secondary_edgedamage 13
-set g_balance_hlac_secondary_force 100
-set g_balance_hlac_secondary_radius 45
+set g_balance_hlac_secondary_damage 15
+set g_balance_hlac_secondary_edgedamage 7.5
+set g_balance_hlac_secondary_force 90
+set g_balance_hlac_secondary_radius 70
 set g_balance_hlac_secondary_speed 9000
 set g_balance_hlac_secondary_lifetime 5
 
-set g_balance_hlac_secondary_refire 0.8
-set g_balance_hlac_secondary_animtime 0.4
-set g_balance_hlac_secondary_ammo 4
+set g_balance_hlac_secondary_refire 1
+set g_balance_hlac_secondary_animtime 0.3
+set g_balance_hlac_secondary_ammo 10
 set g_balance_hlac_secondary_shots 6
 
 set g_balance_hlac_reload_ammo 0 //default: 20
 set g_balance_hlac_reload_time 2
 // }}}
-// {{{ sniperrifle
-set g_balance_sniperrifle_bursttime 0
-set g_balance_sniperrifle_primary_tracer 1
-set g_balance_sniperrifle_primary_shots 1
-set g_balance_sniperrifle_primary_damage 60
-set g_balance_sniperrifle_primary_headshotaddeddamage 60
-set g_balance_sniperrifle_primary_spread 0
-set g_balance_sniperrifle_primary_force 2
-set g_balance_sniperrifle_primary_speed 40000
-set g_balance_sniperrifle_primary_lifetime 5
-set g_balance_sniperrifle_primary_refire 1.5
-set g_balance_sniperrifle_primary_animtime 1.4
-set g_balance_sniperrifle_primary_ammo 10
-set g_balance_sniperrifle_primary_bulletconstant 110 // 62.2qu
-set g_balance_sniperrifle_primary_burstcost 0
-set g_balance_sniperrifle_primary_bullethail 0 // empty magazine on shot
-set g_balance_sniperrifle_secondary 1
-set g_balance_sniperrifle_secondary_reload 1
-set g_balance_sniperrifle_secondary_tracer 0
-set g_balance_sniperrifle_secondary_shots 1
-set g_balance_sniperrifle_secondary_damage 42
-set g_balance_sniperrifle_secondary_headshotaddeddamage 42
-set g_balance_sniperrifle_secondary_spread 0
-set g_balance_sniperrifle_secondary_force 2
-set g_balance_sniperrifle_secondary_speed 20000
-set g_balance_sniperrifle_secondary_lifetime 5
-set g_balance_sniperrifle_secondary_refire 1.5
-set g_balance_sniperrifle_secondary_animtime 1.4
-set g_balance_sniperrifle_secondary_ammo 10
-set g_balance_sniperrifle_secondary_bulletconstant 110 // 15.5qu
-set g_balance_sniperrifle_secondary_burstcost 0
-set g_balance_sniperrifle_secondary_bullethail 0 // empty magazine on shot
-set g_balance_sniperrifle_reload_ammo 80 //default: 80
-set g_balance_sniperrifle_reload_time 2
+// {{{ rifle
+set g_balance_rifle_bursttime 0
+set g_balance_rifle_primary_tracer 1
+set g_balance_rifle_primary_shots 1
+set g_balance_rifle_primary_damage 30
+set g_balance_rifle_primary_headshotaddeddamage 30
+set g_balance_rifle_primary_spread 0
+set g_balance_rifle_primary_force 100
+set g_balance_rifle_primary_speed 40000
+set g_balance_rifle_primary_lifetime 5
+set g_balance_rifle_primary_refire 1.2
+set g_balance_rifle_primary_animtime 0.4
+set g_balance_rifle_primary_ammo 10
+set g_balance_rifle_primary_bulletconstant 110 // 62.2qu
+set g_balance_rifle_primary_burstcost 0
+set g_balance_rifle_primary_bullethail 0 // empty magazine on shot
+set g_balance_rifle_secondary 1
+set g_balance_rifle_secondary_reload 0
+set g_balance_rifle_secondary_tracer 0
+set g_balance_rifle_secondary_shots 4
+set g_balance_rifle_secondary_damage 10
+set g_balance_rifle_secondary_headshotaddeddamage 10
+set g_balance_rifle_secondary_spread 0.02
+set g_balance_rifle_secondary_force 50
+set g_balance_rifle_secondary_speed 20000
+set g_balance_rifle_secondary_lifetime 5
+set g_balance_rifle_secondary_refire 0.9
+set g_balance_rifle_secondary_animtime 0.3
+set g_balance_rifle_secondary_ammo 10
+set g_balance_rifle_secondary_bulletconstant 110 // 15.5qu
+set g_balance_rifle_secondary_burstcost 0
+set g_balance_rifle_secondary_bullethail 0 // empty magazine on shot
+set g_balance_rifle_reload_ammo 80 //default: 80
+set g_balance_rifle_reload_time 2
 // }}}
 // {{{ tuba
 set g_balance_tuba_refire 0.05
@@ -695,29 +696,29 @@ set g_balance_tuba_edgedamage 0
 set g_balance_tuba_radius 200
 set g_balance_tuba_force 40
 // }}}
-// {{{ fireball
-set g_balance_fireball_primary_ammo 40
+// {{{ fireball // this is a superweapon -- lets make it behave as one. 
+set g_balance_fireball_primary_ammo 20
 set g_balance_fireball_primary_animtime 0.2
 set g_balance_fireball_primary_bfgdamage 100
 set g_balance_fireball_primary_bfgforce 0
 set g_balance_fireball_primary_bfgradius 1000
 set g_balance_fireball_primary_damage 200
-set g_balance_fireball_primary_damageforcescale 4
-set g_balance_fireball_primary_edgedamage 0
-set g_balance_fireball_primary_force 700
-set g_balance_fireball_primary_health 50
+set g_balance_fireball_primary_damageforcescale 0
+set g_balance_fireball_primary_edgedamage 50
+set g_balance_fireball_primary_force 600
+set g_balance_fireball_primary_health 0
 set g_balance_fireball_primary_laserburntime 0.5
 set g_balance_fireball_primary_laserdamage 80
 set g_balance_fireball_primary_laseredgedamage 20
 set g_balance_fireball_primary_laserradius 256
 set g_balance_fireball_primary_lifetime 15
 set g_balance_fireball_primary_radius 200
-set g_balance_fireball_primary_refire 5
+set g_balance_fireball_primary_refire 2
 set g_balance_fireball_primary_refire2 0
-set g_balance_fireball_primary_speed 650
+set g_balance_fireball_primary_speed 1200
 set g_balance_fireball_primary_spread 0
 set g_balance_fireball_secondary_ammo 5
-set g_balance_fireball_secondary_animtime 0.2
+set g_balance_fireball_secondary_animtime 0.3
 set g_balance_fireball_secondary_damage 40
 set g_balance_fireball_secondary_damageforcescale 4
 set g_balance_fireball_secondary_damagetime 5
@@ -727,16 +728,16 @@ set g_balance_fireball_secondary_laserdamage 50
 set g_balance_fireball_secondary_laseredgedamage 20
 set g_balance_fireball_secondary_laserradius 110
 set g_balance_fireball_secondary_lifetime 7
-set g_balance_fireball_secondary_refire 2
+set g_balance_fireball_secondary_refire 1.5
 set g_balance_fireball_secondary_speed 900
 set g_balance_fireball_secondary_speed_up 100
 set g_balance_fireball_secondary_speed_z 0
 set g_balance_fireball_secondary_spread 0
-set g_balance_fireball_reload_ammo 0 //default: 60
+set g_balance_fireball_reload_ammo 0 //default: 100
 set g_balance_fireball_reload_time 2
 // }}}
 // {{{ seeker
-set g_balance_seeker_type 0 // 0 = old seeker, 1 = new seeker. THIS IS A TEMPORARY CVAR FOR TESTING, will be removed later.
+set g_balance_seeker_type 1 // 0 = old seeker, 1 = new seeker. THIS IS A TEMPORARY CVAR FOR TESTING, will be removed later.
 set g_balance_seeker_flac_ammo 0.5
 set g_balance_seeker_flac_animtime 0.1
 set g_balance_seeker_flac_damage 15
@@ -750,42 +751,42 @@ set g_balance_seeker_flac_speed 3000
 set g_balance_seeker_flac_speed_up 1000
 set g_balance_seeker_flac_speed_z 0
 set g_balance_seeker_flac_spread 0.4
-set g_balance_seeker_missile_accel 1400
+set g_balance_seeker_tag_ammo 1
+set g_balance_seeker_tag_animtime 0.2
+set g_balance_seeker_tag_damageforcescale 0
+set g_balance_seeker_tag_health 0
+set g_balance_seeker_tag_lifetime 15
+set g_balance_seeker_tag_refire 0.75 // LOG: 0.7 -> 0.75
+set g_balance_seeker_tag_speed 5000
+set g_balance_seeker_tag_spread 0
+set g_balance_seeker_tag_tracker_lifetime 10
+set g_balance_seeker_missile_accel 1500
 set g_balance_seeker_missile_ammo 2
 set g_balance_seeker_missile_animtime 0.2
 set g_balance_seeker_missile_count 3 // LOG: 8 -> 3
-set g_balance_seeker_missile_damage 30 // LOG: 15 -> 30
+set g_balance_seeker_missile_damage 16 // LOG: 15 -> 30
 set g_balance_seeker_missile_damageforcescale 4
-set g_balance_seeker_missile_decel 1400
+set g_balance_seeker_missile_decel 6000
 set g_balance_seeker_missile_delay 0.25
-set g_balance_seeker_missile_edgedamage 10
-set g_balance_seeker_missile_force 150 // LOG: 100 -> 150
-set g_balance_seeker_missile_health 5
+set g_balance_seeker_missile_edgedamage 8
+set g_balance_seeker_missile_force 50 // LOG: 100 -> 150
+set g_balance_seeker_missile_health 1
 set g_balance_seeker_missile_lifetime 15
 set g_balance_seeker_missile_proxy 0
 set g_balance_seeker_missile_proxy_delay 0.2
 set g_balance_seeker_missile_proxy_maxrange 45
-set g_balance_seeker_missile_radius 80
-set g_balance_seeker_missile_refire 0.5
-set g_balance_seeker_missile_smart 1
+set g_balance_seeker_missile_radius 70
+set g_balance_seeker_missile_refire 0.25
+set g_balance_seeker_missile_smart 0
 set g_balance_seeker_missile_smart_mindist 800
 set g_balance_seeker_missile_smart_trace_max 2500
 set g_balance_seeker_missile_smart_trace_min 1000
-set g_balance_seeker_missile_speed 700
-set g_balance_seeker_missile_speed_up 300
+set g_balance_seeker_missile_speed 1500
+set g_balance_seeker_missile_speed_up 0
 set g_balance_seeker_missile_speed_z 0
-set g_balance_seeker_missile_speed_max 1300 // LOG: 1400 -> 1300
+set g_balance_seeker_missile_speed_max 2000 // LOG: 1400 -> 1300
 set g_balance_seeker_missile_spread 0
-set g_balance_seeker_missile_turnrate 0.65
-set g_balance_seeker_tag_ammo 1
-set g_balance_seeker_tag_animtime 0.2
-set g_balance_seeker_tag_damageforcescale 4
-set g_balance_seeker_tag_health 5
-set g_balance_seeker_tag_lifetime 15
-set g_balance_seeker_tag_refire 0.75 // LOG: 0.7 -> 0.75
-set g_balance_seeker_tag_speed 5000
-set g_balance_seeker_tag_spread 0
-set g_balance_seeker_tag_tracker_lifetime 10
+set g_balance_seeker_missile_turnrate 0.15
 set g_balance_seeker_reload_ammo 0 //default: 15
 set g_balance_seeker_reload_time 2
 // End new seeker
index 8a09f03e514a7a3299c23a7e71e26f928b7e6b61..57c4996871f3fc2fa46719ec04ac9e46cdf1aa75 100644 (file)
@@ -13,7 +13,7 @@ set g_start_weapon_minstanex -1 "0 = never provide the weapon, 1 = always provid
 set g_start_weapon_porto -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_hook -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_hlac -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
-set g_start_weapon_sniperrifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
+set g_start_weapon_rifle -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_tuba -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_fireball -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
 set g_start_weapon_seeker -1 "0 = never provide the weapon, 1 = always provide the weapon, -1 = game mode default, -2 = provide the weapon in ca and lms"
@@ -333,7 +333,8 @@ set g_balance_grenadelauncher_secondary_speed_up 200
 set g_balance_grenadelauncher_secondary_speed_z 0
 set g_balance_grenadelauncher_secondary_spread 0
 set g_balance_grenadelauncher_secondary_lifetime 2.5
-set g_balance_grenadelauncher_secondary_lifetime2 0
+set g_balance_grenadelauncher_secondary_lifetime_bounce 0
+set g_balance_grenadelauncher_secondary_lifetime_stick 0
 set g_balance_grenadelauncher_secondary_refire 0.7
 set g_balance_grenadelauncher_secondary_animtime 0.3
 set g_balance_grenadelauncher_secondary_ammo 2
@@ -648,40 +649,40 @@ set g_balance_hlac_secondary_shots 6
 set g_balance_hlac_reload_ammo 0 //default: 20
 set g_balance_hlac_reload_time 2
 // }}}
-// {{{ sniperrifle
-set g_balance_sniperrifle_bursttime 0
-set g_balance_sniperrifle_primary_tracer 1
-set g_balance_sniperrifle_primary_shots 1
-set g_balance_sniperrifle_primary_damage 40
-set g_balance_sniperrifle_primary_headshotaddeddamage 100
-set g_balance_sniperrifle_primary_spread 0
-set g_balance_sniperrifle_primary_force 2
-set g_balance_sniperrifle_primary_speed 40000
-set g_balance_sniperrifle_primary_lifetime 5
-set g_balance_sniperrifle_primary_refire 0.65
-set g_balance_sniperrifle_primary_animtime 0.6
-set g_balance_sniperrifle_primary_ammo 10
-set g_balance_sniperrifle_primary_bulletconstant 110 // 62.2qu
-set g_balance_sniperrifle_primary_burstcost 0
-set g_balance_sniperrifle_primary_bullethail 0 // empty magazine on shot
-set g_balance_sniperrifle_secondary 1
-set g_balance_sniperrifle_secondary_reload 0
-set g_balance_sniperrifle_secondary_tracer 0
-set g_balance_sniperrifle_secondary_shots 1
-set g_balance_sniperrifle_secondary_damage 50
-set g_balance_sniperrifle_secondary_headshotaddeddamage 50 // 50 damage only on head
-set g_balance_sniperrifle_secondary_spread 0
-set g_balance_sniperrifle_secondary_force 2
-set g_balance_sniperrifle_secondary_speed 20000
-set g_balance_sniperrifle_secondary_lifetime 5
-set g_balance_sniperrifle_secondary_refire 1.5
-set g_balance_sniperrifle_secondary_animtime 0.6
-set g_balance_sniperrifle_secondary_ammo 10
-set g_balance_sniperrifle_secondary_bulletconstant 110 // 15.5qu
-set g_balance_sniperrifle_secondary_burstcost 0
-set g_balance_sniperrifle_secondary_bullethail 0 // empty magazine on shot
-set g_balance_sniperrifle_reload_ammo 80 //default: 80
-set g_balance_sniperrifle_reload_time 2
+// {{{ rifle
+set g_balance_rifle_bursttime 0
+set g_balance_rifle_primary_tracer 1
+set g_balance_rifle_primary_shots 1
+set g_balance_rifle_primary_damage 40
+set g_balance_rifle_primary_headshotaddeddamage 100
+set g_balance_rifle_primary_spread 0
+set g_balance_rifle_primary_force 2
+set g_balance_rifle_primary_speed 40000
+set g_balance_rifle_primary_lifetime 5
+set g_balance_rifle_primary_refire 0.65
+set g_balance_rifle_primary_animtime 0.6
+set g_balance_rifle_primary_ammo 10
+set g_balance_rifle_primary_bulletconstant 110 // 62.2qu
+set g_balance_rifle_primary_burstcost 0
+set g_balance_rifle_primary_bullethail 0 // empty magazine on shot
+set g_balance_rifle_secondary 1
+set g_balance_rifle_secondary_reload 0
+set g_balance_rifle_secondary_tracer 0
+set g_balance_rifle_secondary_shots 1
+set g_balance_rifle_secondary_damage 50
+set g_balance_rifle_secondary_headshotaddeddamage 50 // 50 damage only on head
+set g_balance_rifle_secondary_spread 0
+set g_balance_rifle_secondary_force 2
+set g_balance_rifle_secondary_speed 20000
+set g_balance_rifle_secondary_lifetime 5
+set g_balance_rifle_secondary_refire 1.5
+set g_balance_rifle_secondary_animtime 0.6
+set g_balance_rifle_secondary_ammo 10
+set g_balance_rifle_secondary_bulletconstant 110 // 15.5qu
+set g_balance_rifle_secondary_burstcost 0
+set g_balance_rifle_secondary_bullethail 0 // empty magazine on shot
+set g_balance_rifle_reload_ammo 80 //default: 80
+set g_balance_rifle_reload_time 2
 // }}}
 // {{{ tuba
 set g_balance_tuba_refire 0.05
index fb1f68f32a64fecb6dd70b1334372defff54510c..3dc3222838a62f969b6ff0b218439b15bb6eb3e9 100755 (executable)
@@ -1,5 +1,29 @@
 #!/bin/sh
 
+case "$1" in
+       pot)
+               mode=pot
+               mail=true
+               ;;
+       po)
+               mode=po
+               mail=true
+               language=
+               ;;
+       '')
+               echo "Sorry, you are not supposed to use this script."
+               echo "This script is solely for use by the Xonotic Core Team."
+               echo "Unauthorized use of it can cause HIGHLY annoying merge"
+               echo "conflicts."
+               exit 1
+               ;;
+       *)
+               mode=po
+               mail=false
+               language=$1
+               ;;
+esac
+
 for VM in menu csprogs; do
        case "$VM" in
                csprogs)
@@ -9,66 +33,76 @@ for VM in menu csprogs; do
                        VMD=$VM
                        ;;
        esac
-       {
-               find qcsrc/"$VMD" -type f -not -name \*.po -not -name \*.txt
-               find qcsrc/common -type f -not -name \*.po -not -name \*.txt
-               find qcsrc/server -type f -name w_\*.qc
-       } | xgettext -LC -k_ -f- --from-code utf-8 -o "$VM".dat.pot >&2
-       for X in "$VM".dat.*.po; do
-               [ -f "$X" ] || continue
-               for Y in ~/check-translations/"$X".*; do
-                       [ -f "$Y" ] || continue
-                       msgcat -F --use-first "$Y" "$X" > "$X".new
-                       mv "$X".new "$X"
-               done
-               msgmerge -F -U "$X" "$VM".dat.pot >&2
-               msgattrib --untranslated "$X" | grep . > "$X".untranslated || rm -f "$X".untranslated
-               msgattrib --fuzzy "$X"        | grep . > "$X".fuzzy        || rm -f "$X".fuzzy
-               nu=$((`grep -c ^#: "$X".untranslated` + 0))
-               nf=$((`grep -c ^#: "$X".fuzzy`        + 0))
-               n=$(($nu + $nf))
-               if [ $n -gt 0 ]; then
-                       echo "TODO for translation $X:"
-                       echo "Untranslated: $nu"
-                       echo "Fuzzy:        $nf"
-                       ltr=`grep '^"Last-Translator: ' "$X" | cut -d ' ' -f 2- | cut -d '\\' -f 1 | egrep -v '<LL@li.org>|<EMAIL@ADDRESS>'`
-                       ltm=`grep '^"Language-Team: ' "$X" | cut -d ' ' -f 2- | cut -d '\\' -f 1 | egrep -v '<LL@li.org>|<EMAIL@ADDRESS>'`
-                       echo "Translators:  $ltr, $ltm"
-                       case "$ltr" in
-                               '')
-                                       to=$ltm
-                                       cc=
-                                       ;;
-                               *)
-                                       to=$ltr
-                                       if [ x"$ltr" = x"$ltm" ]; then
-                                               cc=
-                                       else
-                                               cc=$ltm
-                                       fi
-                                       ;;
-                       esac
-                       if [ -n "$to" ]; then
-                               echo "To:           $to"
-                       fi
-                       if [ -n "$cc" ]; then
-                               echo "Cc:           $cc"
+
+       if [ x"$mode" = x"pot" ]; then
+               {
+                       find qcsrc/"$VMD" -type f -not -name \*.po -not -name \*.txt
+                       find qcsrc/common -type f -not -name \*.po -not -name \*.txt
+                       find qcsrc/server -type f -name w_\*.qc
+               } | xgettext -LC -k_ -f- --from-code utf-8 -o "$VM".dat.pot >&2
+       fi
+
+       if [ x"$mode" = x"po" ]; then
+               for X in "$VM".dat.*.po; do
+                       [ -f "$X" ] || continue
+                       if [ -n "$language" ]; then
+                               if [ x"${X#*.dat.}" != x"$language.po" ]; then
+                                       continue
+                               fi
                        fi
-                       if [ -n "$to" ]; then
-                               while :; do
-                                       echo "Send mail? [y/n]"
-                                       read -r yesno
-                                       case "$yesno" in
-                                               y)
-                                                       attach=
-                                                       if [ $nu -gt 0 ]; then
-                                                               attach="$attach $X.untranslated"
-                                                       fi
-                                                       if [ $nf -gt 0 ]; then
-                                                               attach="$attach $X.fuzzy"
-                                                       fi
-                                                       {
-                                                               cat <<EOF
+                       for Y in ~/check-translations/"$X".*; do
+                               [ -f "$Y" ] || continue
+                               msgcat -F --use-first "$Y" "$X" > "$X".new
+                               mv "$X".new "$X"
+                       done
+                       msgmerge -F -U "$X" "$VM".dat.pot >&2
+                       msgattrib --untranslated "$X" | grep . > "$X".untranslated || rm -f "$X".untranslated
+                       msgattrib --fuzzy "$X"        | grep . > "$X".fuzzy        || rm -f "$X".fuzzy
+                       nu=$((`grep -c ^#: "$X".untranslated` + 0))
+                       nf=$((`grep -c ^#: "$X".fuzzy`        + 0))
+                       n=$(($nu + $nf))
+                       if [ $n -gt 0 ]; then
+                               echo "TODO for translation $X:"
+                               echo "Untranslated: $nu"
+                               echo "Fuzzy:        $nf"
+                               ltr=`grep '^"Last-Translator: ' "$X" | cut -d ' ' -f 2- | cut -d '\\' -f 1 | egrep -v '<LL@li.org>|<EMAIL@ADDRESS>'`
+                               ltm=`grep '^"Language-Team: ' "$X" | cut -d ' ' -f 2- | cut -d '\\' -f 1 | egrep -v '<LL@li.org>|<EMAIL@ADDRESS>'`
+                               echo "Translators:  $ltr, $ltm"
+                               case "$ltr" in
+                                       '')
+                                               to=$ltm
+                                               cc=
+                                               ;;
+                                       *)
+                                               to=$ltr
+                                               if [ x"$ltr" = x"$ltm" ]; then
+                                                       cc=
+                                               else
+                                                       cc=$ltm
+                                               fi
+                                               ;;
+                               esac
+                               if [ -n "$to" ]; then
+                                       echo "To:           $to"
+                               fi
+                               if [ -n "$cc" ]; then
+                                       echo "Cc:           $cc"
+                               fi
+                               if [ -n "$to" ]; then
+                                       while $mail; do
+                                               echo "Send mail? [y/n]"
+                                               read -r yesno
+                                               case "$yesno" in
+                                                       y)
+                                                               attach=
+                                                               if [ $nu -gt 0 ]; then
+                                                                       attach="$attach $X.untranslated"
+                                                               fi
+                                                               if [ $nf -gt 0 ]; then
+                                                                       attach="$attach $X.fuzzy"
+                                                               fi
+                                                               {
+                                                                       cat <<EOF
 Hi,
 
 as you provided us with translations in the past, we kindly ask you
@@ -79,50 +113,57 @@ If you do not wish to be contacted for translation updates any more,
 please tell us in a reply to this message.
 
 EOF
-                                                               if [ $nu -gt 0 ]; then
-                                                                       cat <<EOF
+                                                                       if [ $nu -gt 0 ]; then
+                                                                               cat <<EOF
 Attached to this message is a file
 $X.untranslated
 with $nu yet to be translated messages. Please translate them and reply
 with the file containing the translations in the "msgstr" fields.
 
 EOF
-                                                               fi
-                                                               if [ $nf -gt 0 ]; then
-                                                                       cat <<EOF
+                                                                       fi
+                                                                       if [ $nf -gt 0 ]; then
+                                                                               cat <<EOF
 Attached to this message is a file
 $X.fuzzy
 with $nf automatically generated translations. Please verify and/or fix
 them and reply with the file having been verified by you.
 
 EOF
-                                                               fi
-                                                               cat <<EOF
+                                                                       fi
+                                                                       cat <<EOF
 Thanks in advance,
 
 Team Xonotic
 EOF
-                                                       } | mutt \
-                                                               -e "set from=\"divVerent@xonotic.org\"" \
-                                                               -e "set use_from=yes" \
-                                                               -e "set use_envelope_from=yes" \
-                                                               -s "Need update for translations: $X" \
-                                                               -c "$cc" \
-                                                               -b "divVerent@xonotic.org" \
-                                                               -a $attach -- \
-                                                               "$to"
-                                                       break
-                                                       ;;
-                                               n)
-                                                       break
-                                                       ;;
-                                       esac
-                               done
+                                                               } | mutt \
+                                                                       -e "set from=\"divVerent@xonotic.org\"" \
+                                                                       -e "set use_from=yes" \
+                                                                       -e "set use_envelope_from=yes" \
+                                                                       -s "Need update for translations: $X" \
+                                                                       -c "$cc" \
+                                                                       -b "divVerent@xonotic.org" \
+                                                                       -a $attach -- \
+                                                                       "$to"
+                                                               break
+                                                               ;;
+                                                       n)
+                                                               break
+                                                               ;;
+                                               esac
+                                       done
+                               fi
                        fi
-               fi
-       done
-       for X in "$VM".dat.*.po.disabled; do
-               [ -f "$X" ] || continue
-               msgmerge -F -U "$X" "$VM".dat.pot >/dev/null 2>&1
-       done
+               done
+
+               for X in "$VM".dat.*.po.disabled; do
+                       [ -f "$X" ] || continue
+                       if [ -n "$language" ]; then
+                               if [ x"${X#*.dat.}" != x"$language.po" ]; then
+                                       continue
+                               fi
+                       fi
+                       msgmerge -F -U "$X" "$VM".dat.pot >/dev/null 2>&1
+               done
+       fi
 done
index 372784dd780c5cc14b7e4affc50518ddca673458..f470875425711ad29ff89f9e2df2a3ad98594823 100644 (file)
@@ -1,25 +1,21 @@
-// load engine's idea of vid_con*
-seta menu_vid_conwidth $vid_conwidth
-seta menu_vid_conheight $vid_conheight
+// updates for Nexuiz $OLD to 2.4 (also run on first startup, so be careful with what you put in here)
+alias _update_configversion_0 "_update_configversion_1"
 
-// fix cvar settings of the engine that Xonotic is not compatible with
-alias _update_generic_r_dynamic_0 "r_dynamic 1; r_shadow_realtime_dlight 1"
-alias _update_generic_r_dynamic_1 ""
-alias _update_generic "_update_generic_r_dynamic_$r_dynamic"
+// Updates for Nexuiz 2.4.1 to 2.4.2
+alias _update_configversion_1 "_update_configversion_2"
 
-// updates for ... to 2.4 (also run on first startup, so be careful with what you put in here)
-alias _update_configversion_0 ""
+// Updates for Nexuiz to Xonotic
+alias _update_configversion_2 "volume 1; cl_gunalign 1; _update_configversion_3"
 
-// Updates for 2.4.1 to 2.4.2
-alias _update_configversion_1 ""
+// Updates for gunalign fix
+alias _update_configversion_3 "cl_gunalign 3; menu_cl_gunalign 3; _update_configversion_4"
 
-// Updates for 2.5 to ...
-alias _update_configversion_2 ""
+// place to put further updates
+alias _update_configversion_4 "snd_entchannel0volume 1; snd_entchannel1volume 1; snd_entchannel2volume 1; snd_entchannel3volume 1; snd_entchannel4volume 1; snd_entchannel5volume 1; snd_entchannel6volume 1; snd_entchannel7volume 1; snd_playerchannel0volume 1; snd_playerchannel1volume 1; snd_playerchannel2volume 1; snd_playerchannel3volume 1; snd_playerchannel4volume 1; snd_playerchannel5volume 1; snd_playerchannel6volume 1; snd_playerchannel7volume 1; snd_worldchannel0volume 1; snd_worldchannel1volume 1; snd_worldchannel2volume 1; snd_worldchannel3volume 1; snd_worldchannel4volume 1; snd_worldchannel5volume 1; snd_worldchannel6volume 1; snd_worldchannel7volume 1; snd_csqcchannel0volume 1; snd_csqcchannel1volume 1; snd_csqcchannel2volume 1; snd_csqcchannel3volume 1; snd_csqcchannel4volume 1; snd_csqcchannel5volume 1; snd_csqcchannel6volume 1; snd_csqcchannel7volume 1; _update_configversion_5"
 
-_update_configversion_$g_configversion
-_update_generic
+// place to put further updates
+alias _update_configversion_5 ""
 
-set g_configversion 2
+_update_configversion_$g_configversion
 
-// we now use mastervolume
-volume 1
+set g_configversion 5
index e0e44495287e8ed4e928293d6339572f123e4840..6bae40da5a513003e74ed6e54becbf28a67142ad 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:06+0200\n"
+"POT-Creation-Date: 2011-08-21 14:00+0200\n"
 "PO-Revision-Date: 2011-04-20 10:46+0200\n"
 "Last-Translator: Rudolf Polzer <divVerent@xonotic.org>\n"
 "Language-Team: Rudolf Polzer <divVerent@xonotic.org>\n"
@@ -33,54 +33,62 @@ msgstr ""
 msgid "^4CSQC Build information: ^1%s\n"
 msgstr "^4CSQC Build-Information: ^1%s (deutsch)\n"
 
-#: qcsrc/client/Main.qc:232 qcsrc/client/Main.qc:248
+#: qcsrc/client/Main.qc:237 qcsrc/client/Main.qc:253
 #, c-format
 msgid "trying to switch to unsupported team %d\n"
 msgstr "es wurde versucht, in das nicht unterstützte Team %d zu wechseln"
 
-#: qcsrc/client/Main.qc:364 qcsrc/client/scoreboard.qc:241
+#: qcsrc/client/Main.qc:369 qcsrc/client/scoreboard.qc:241
 msgid "Usage:\n"
 msgstr "Syntax:\n"
 
-#: qcsrc/client/Main.qc:365
+#: qcsrc/client/Main.qc:370
 msgid "hud_save configname   (saves to hud_skinname_configname.cfg)\n"
 msgstr "hud_save configname   (speichert als hud_skinname_configname.cfg)\n"
 
-#: qcsrc/client/Main.qc:512
+#: qcsrc/client/Main.qc:494
 msgid "Usage: cl_cmd COMMAND..., where possible commands are:\n"
 msgstr "Syntax: cl_cmd BEFEHL..., wobei mögliche Befehle sind:\n"
 
-#: qcsrc/client/Main.qc:513
+#: qcsrc/client/Main.qc:495
 msgid "  settemp cvar value\n"
 msgstr "  settemp Cvar Wert\n"
 
-#: qcsrc/client/Main.qc:514
+#: qcsrc/client/Main.qc:496
 msgid "  scoreboard_columns_set ...\n"
 msgstr "  scoreboard_columns_set ...\n"
 
-#: qcsrc/client/Main.qc:515
+#: qcsrc/client/Main.qc:497
 msgid "  scoreboard_columns_help\n"
 msgstr "  scoreboard_columns_help\n"
 
-#: qcsrc/client/Main.qc:720
-msgid "A CSQC entity changed its owner!\n"
-msgstr "Ein CSQC-Entity hat seinen Besitzer gewechselt!\n"
+#: qcsrc/client/Main.qc:726
+#, c-format
+msgid "A CSQC entity changed its owner! (edict: %d, classname: %s)\n"
+msgstr ""
+"Ein CSQC-Entity hat seinen Besitzer gewechselt! (edict: %d, classname: %s)\n"
 
-#: qcsrc/client/Main.qc:934
-msgid "A CSQC entity changed its type!\n"
-msgstr "Ein CSQC-Entity hat seinen Typ gewechselt!\n"
+#: qcsrc/client/Main.qc:964
+#, c-format
+msgid "A CSQC entity changed its type! (edict: %d, classname: %s)\n"
+msgstr ""
+"Ein CSQC-Entity hat seinen Typ gewechselt! (edict: %d, classname: %s)\n"
 
-#: qcsrc/client/Main.qc:972
+#: qcsrc/client/Main.qc:1005
 #, c-format
-msgid "unknown entity type in CSQC_Ent_Update: %d\n"
-msgstr "unbekannter Entity-Typ in CSQC_Ent_Update: %d\n"
+msgid ""
+"Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: "
+"%s)\n"
+msgstr ""
+"Unbekannter Entity-Typ in CSQC_Ent_Update (enttype: %d, edict: %d, "
+"classname: %s)\n"
 
-#: qcsrc/client/Main.qc:1444
+#: qcsrc/client/Main.qc:1461
 #, c-format
 msgid "%s (not bound)"
 msgstr "%s (nicht zugewiesen)"
 
-#: qcsrc/client/Main.qc:1449 qcsrc/client/hud.qc:407
+#: qcsrc/client/Main.qc:1466 qcsrc/client/hud.qc:230
 #, c-format
 msgid "%s (%s)"
 msgstr "%s (%s)"
@@ -139,485 +147,488 @@ msgstr "Sie sind Befehlshaber!"
 msgid "Awaiting orders..."
 msgstr "Warten auf Auftrag..."
 
-#: qcsrc/client/hud.qc:337
+#: qcsrc/client/hud.qc:160
 msgid "1st"
 msgstr "1."
 
-#: qcsrc/client/hud.qc:339
+#: qcsrc/client/hud.qc:162
 msgid "2nd"
 msgstr "2."
 
-#: qcsrc/client/hud.qc:341
+#: qcsrc/client/hud.qc:164
 msgid "3rd"
 msgstr "3."
 
-#: qcsrc/client/hud.qc:343
+#: qcsrc/client/hud.qc:166
 #, c-format
 msgid "%dth"
 msgstr "%d."
 
-#: qcsrc/client/hud.qc:375
+#: qcsrc/client/hud.qc:198
 #, c-format
 msgid " (-%dL)"
 msgstr " (-%dR)"
 
-#: qcsrc/client/hud.qc:380
+#: qcsrc/client/hud.qc:203
 #, c-format
 msgid " (+%dL)"
 msgstr " (+%dR)"
 
-#: qcsrc/client/hud.qc:396
+#: qcsrc/client/hud.qc:219
 msgid "Start line"
 msgstr "Start"
 
-#: qcsrc/client/hud.qc:398 qcsrc/client/hud.qc:402
+#: qcsrc/client/hud.qc:221 qcsrc/client/hud.qc:225
 msgid "Finish line"
 msgstr "Ziel"
 
-#: qcsrc/client/hud.qc:400
+#: qcsrc/client/hud.qc:223
 #, c-format
 msgid "Intermediate %d"
 msgstr "Zwischenzeit %d"
 
-#: qcsrc/client/hud.qc:409
+#: qcsrc/client/hud.qc:232
 #, c-format
 msgid "%s (%s %s)"
 msgstr "%s (%s %s)"
 
-#: qcsrc/client/hud.qc:553
-#, c-format
-msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
-msgstr ""
-"^2Erfolgreich als %s exportiert! (Hinweis: die Datei wurde in data/data/ "
-"abgelegt)\n"
-
-#: qcsrc/client/hud.qc:557
-#, c-format
-msgid "^1Couldn't write to %s\n"
-msgstr "^1Konnte nicht nach %s schreiben\n"
-
-#: qcsrc/client/hud.qc:1837
+#: qcsrc/client/hud.qc:735
 msgid "Out of ammo"
 msgstr "Keine Munition mehr."
 
-#: qcsrc/client/hud.qc:1841
+#: qcsrc/client/hud.qc:739
 msgid "Don't have"
 msgstr "nicht vorhanden"
 
-#: qcsrc/client/hud.qc:1845
+#: qcsrc/client/hud.qc:743
 msgid "Unavailable"
 msgstr "nicht verfügbar"
 
-#: qcsrc/client/hud.qc:2696
+#: qcsrc/client/hud.qc:1476
 #, c-format
 msgid "^1%s^1 couldn't take it anymore\n"
 msgstr "^1%s^1 konnte es nicht mehr ertragen\n"
 
-#: qcsrc/client/hud.qc:2700 qcsrc/client/hud.qc:2992
+#: qcsrc/client/hud.qc:1480 qcsrc/client/hud.qc:1784
 #, c-format
 msgid "^1%s^1 died\n"
 msgstr "^1%s^1 ist gestorben\n"
 
-#: qcsrc/client/hud.qc:2704
+#: qcsrc/client/hud.qc:1484
 #, c-format
 msgid "^7%s^7 committed suicide. What's the point of living without ammo?\n"
 msgstr "^7%s^7 hat sich erhängt. Was ist schon ein Leben ohne Munition?\n"
 
-#: qcsrc/client/hud.qc:2708
+#: qcsrc/client/hud.qc:1488
 #, c-format
 msgid "^1%s^1 thought they found a nice camping ground\n"
 msgstr "^1%s^1 dachte, einen tollen Campingplatz gefunden zu haben\n"
 
-#: qcsrc/client/hud.qc:2712
+#: qcsrc/client/hud.qc:1492
 #, c-format
 msgid "^1%s^1 didn't become friends with the Lord of Teamplay\n"
 msgstr "^1%s^1 bekam Probleme mit dem Lord of Teamplay\n"
 
-#: qcsrc/client/hud.qc:2716
+#: qcsrc/client/hud.qc:1496
 #, c-format
 msgid "^1%s^1 unfairly eliminated themself\n"
 msgstr "^1%s^1 hat sich selbst auf unfaire Weise erledigt\n"
 
-#: qcsrc/client/hud.qc:2720
+#: qcsrc/client/hud.qc:1500
 #, c-format
 msgid "^1%s^1 burned to death\n"
 msgstr "^1%s^1 brannte zu Tode\n"
 
-#: qcsrc/client/hud.qc:2724
+#: qcsrc/client/hud.qc:1504
 #, c-format
 msgid "^1%s^1 couldn't resist the urge to self-destruct\n"
 msgstr ""
 "^1%s^1 konnte dem Drang zur Selbstzerstörung einfach nicht widerstehen\n"
 
-#: qcsrc/client/hud.qc:2728
+#: qcsrc/client/hud.qc:1508
 #, c-format
 msgid "^1%s^1 ended it all after a %d kill spree\n"
 msgstr "^1%s^1 machte seinem %d-Amoklauf ein Ende\n"
 
-#: qcsrc/client/hud.qc:2745
+#: qcsrc/client/hud.qc:1525
 #, c-format
 msgid "^1%s^1 took action against a team mate\n"
 msgstr "^1%s^1 ergriff Maßnahmen gegen einen Mitspieler\n"
 
-#: qcsrc/client/hud.qc:2747
+#: qcsrc/client/hud.qc:1527
 #, c-format
 msgid "^1%s^1 mows down a team mate\n"
 msgstr "^1%s^1 mähte einen Mitspieler nieder\n"
 
-#: qcsrc/client/hud.qc:2752
+#: qcsrc/client/hud.qc:1532
 #, c-format
 msgid "^1%s^1 ended a %d scoring spree by going against a team mate\n"
 msgstr ""
 "^1%s^1 dachte, %d Punkte hintereinander reichen, und trug dies an einem "
 "Mitspieler aus\n"
 
-#: qcsrc/client/hud.qc:2754
+#: qcsrc/client/hud.qc:1534
 #, c-format
 msgid "^1%s^1 ended a %d kill spree by killing a team mate\n"
 msgstr "^1%s^1 beendete seinen %d-Amoklauf, indem er einen Mitspieler tötete\n"
 
-#: qcsrc/client/hud.qc:2758
+#: qcsrc/client/hud.qc:1538
 #, c-format
 msgid "^1%s^1's %s scoring spree was ended by a team mate!\n"
 msgstr ""
 "^1%s^1s %s Punkte hintereinander wurden von einem Mitspieler gestört!\n"
 
-#: qcsrc/client/hud.qc:2760
+#: qcsrc/client/hud.qc:1540
 #, c-format
 msgid "^1%s^1's %s kill spree was ended by a team mate!\n"
 msgstr "^1%s^1s %s-Amoklauf wurde von einem Mitspieler beendet!\n"
 
-#: qcsrc/client/hud.qc:2764
+#: qcsrc/client/hud.qc:1544
 #, c-format
 msgid "^1%s^1 drew first blood\n"
 msgstr "^1%s^1 war der Erste\n"
 
-#: qcsrc/client/hud.qc:2768
+#: qcsrc/client/hud.qc:1548
 #, c-format
 msgid "^1%s^1 tried to occupy %s^1's teleport destination space\n"
 msgstr "^1%s^1 dachte, %s^1 am Teleportieren hindern zu können\n"
 
-#: qcsrc/client/hud.qc:2770
+#: qcsrc/client/hud.qc:1550
 #, c-format
 msgid "^1%s^1 was telefragged by %s\n"
 msgstr "^1%s^1 wurde von %s^1 telefragged\n"
 
-#: qcsrc/client/hud.qc:2775
+#: qcsrc/client/hud.qc:1555
 #, c-format
 msgid "^1%s^1 was drowned by %s\n"
 msgstr "^1%s^1 wurde von %s^1 etränkt\n"
 
-#: qcsrc/client/hud.qc:2780
+#: qcsrc/client/hud.qc:1560
 #, c-format
 msgid "^1%s^1 was slimed by %s\n"
 msgstr "^1%s^1 wurde von %s^1 im Schleim versenkt\n"
 
-#: qcsrc/client/hud.qc:2785
+#: qcsrc/client/hud.qc:1565
 #, c-format
 msgid "^1%s^1 was cooked by %s\n"
 msgstr "^1%s^1 wurde von %s^1 gebraten\n"
 
-#: qcsrc/client/hud.qc:2790
+#: qcsrc/client/hud.qc:1570
 #, c-format
 msgid "^1%s^1 was grounded by %s\n"
 msgstr "^1%s^1 wurde von %s^1 geerdet\n"
 
-#: qcsrc/client/hud.qc:2795
+#: qcsrc/client/hud.qc:1575
 #, c-format
 msgid "^1%s^1 was shot into space by %s\n"
 msgstr "^1%s^1 wurde von %s^1 ins All geschossen\n"
 
-#: qcsrc/client/hud.qc:2800
+#: qcsrc/client/hud.qc:1580
 #, c-format
 msgid "^1%s^1 was conserved by %s\n"
 msgstr "^1%s^1 wurde von %s^1 konserviert\n"
 
-#: qcsrc/client/hud.qc:2806
+#: qcsrc/client/hud.qc:1586
 #, c-format
 msgid "^1%s^1 was thrown into a world of hurt by %s\n"
 msgstr "^1%s^1 wurde von %s^1 in eine Welt des Schmerzes geworfen\n"
 
-#: qcsrc/client/hud.qc:2810
+#: qcsrc/client/hud.qc:1590
 #, c-format
 msgid "^1%s^1 was crushed by %s\n"
 msgstr "^1%s^1 wurde von %s^1 zerquetscht\n"
 
-#: qcsrc/client/hud.qc:2814
+#: qcsrc/client/hud.qc:1594
 #, c-format
 msgid "^1%s^1 got shredded by %s\n"
 msgstr "^1%s^1 wurde von %s^1 zerstückelt\n"
 
-#: qcsrc/client/hud.qc:2818
+#: qcsrc/client/hud.qc:1598
 #, c-format
 msgid "^1%s^1 was blasted to bits by %s\n"
 msgstr "^1%s^1 wurde von %s^1 in die Luft gejagt\n"
 
-#: qcsrc/client/hud.qc:2822
+#: qcsrc/client/hud.qc:1602
 #, c-format
 msgid "^1%s^1 got caught in the destruction of %s^1's vehicle\n"
 msgstr "^1%s^1 wurde von der Explosion von %s^1s Fahrzeug erwischt\n"
 
-#: qcsrc/client/hud.qc:2826
+#: qcsrc/client/hud.qc:1606
 #, c-format
 msgid "^1%s^1 was bolted down by %s\n"
 msgstr "^1%s^1 wurde von %s^1 niedergeschmettert\n"
 
-#: qcsrc/client/hud.qc:2830
+#: qcsrc/client/hud.qc:1610
 #, c-format
 msgid "^1%s^1 could find no shelter from %s^1's rockets\n"
 msgstr "^1%s^1 fand keine Deckung vor %s^1s Raketen\n"
 
-#: qcsrc/client/hud.qc:2834
+#: qcsrc/client/hud.qc:1614
 #, c-format
 msgid "^1%s^1 dies when %s^1's wakizashi dies.\n"
 msgstr "^1%s^1 starb zusammen mit %s^1's Wakizashi.\n"
 
-#: qcsrc/client/hud.qc:2838
+#: qcsrc/client/hud.qc:1618
+#, c-format
+msgid "^1%s^1 nailed to hell by %s\n"
+msgstr "^1%s^1 wurde von %s^1 in die Hölle geschossen\n"
+
+#: qcsrc/client/hud.qc:1622
+#, c-format
+msgid "^1%s^1 cluster crushed by %s\n"
+msgstr "^1%s^1 wurde von %s^1 total zerstört\n"
+
+#: qcsrc/client/hud.qc:1626
+#, c-format
+msgid "^1%s^1 dies when %s^1's raptor dies.\n"
+msgstr "^1%s^1 starb zusammen mit %s^1's Raptor.\n"
+
+#: qcsrc/client/hud.qc:1630
 #, c-format
 msgid "^1%s^1 was pushed into the line of fire by %s\n"
 msgstr "^1%s^1 wurde von %s^1 ins offene Feuer geschubst\n"
 
-#: qcsrc/client/hud.qc:2842
+#: qcsrc/client/hud.qc:1634
 #, c-format
 msgid "^1%s^1 was pushed into an accident by %s\n"
 msgstr "^1%s^1 wurde von %s^1 in einen unglücklichen Unfall geschubst\n"
 
-#: qcsrc/client/hud.qc:2846
+#: qcsrc/client/hud.qc:1638
 #, c-format
 msgid "^1%s^1 was unfairly eliminated by %s\n"
 msgstr "^1%s^1 wurde von %s auf unfaire Weise erledigt\n"
 
-#: qcsrc/client/hud.qc:2850
+#: qcsrc/client/hud.qc:1642
 #, c-format
 msgid "^1%s^1 was burnt to death by %s\n"
 msgstr "^1%s^1 wurde von %s verbrannt\n"
 
-#: qcsrc/client/hud.qc:2862
+#: qcsrc/client/hud.qc:1654
 #, c-format
 msgid "^1%s^1 was fragged by %s\n"
 msgstr "^1%s^1 wurde von %s^1 gefraggt\n"
 
-#: qcsrc/client/hud.qc:2867
+#: qcsrc/client/hud.qc:1659
 #, c-format
 msgid "^1%s^1's %s scoring spree was ended by %s\n"
 msgstr "^1%s^1's Punkte-Folge wurde von %s^1 beendet\n"
 
-#: qcsrc/client/hud.qc:2869
+#: qcsrc/client/hud.qc:1661
 #, c-format
 msgid "^1%s^1's %s kill spree was ended by %s\n"
 msgstr "^1%s^1's Kill-Spree wurde von %s^1 beendet\n"
 
-#: qcsrc/client/hud.qc:2872
+#: qcsrc/client/hud.qc:1664
 #, c-format
 msgid "^1%s^1 made %s scores in a row\n"
 msgstr "^1%s^1 machte %s Punkte hintereinander\n"
 
-#: qcsrc/client/hud.qc:2874
+#: qcsrc/client/hud.qc:1666
 #, c-format
 msgid "^1%s^1 has %s frags in a row\n"
 msgstr "^1%s^1 hat %s Frags hintereinander\n"
 
-#: qcsrc/client/hud.qc:2877
+#: qcsrc/client/hud.qc:1669
 #, c-format
 msgid "%s^7 made a ^1TRIPLE SCORE\n"
 msgstr "%s^7 hat einen ^1TRIPLE SCORE\n"
 
-#: qcsrc/client/hud.qc:2879
+#: qcsrc/client/hud.qc:1671
 #, c-format
 msgid "%s^7 made a ^1TRIPLE FRAG\n"
 msgstr "%s^7 hat einen ^1TRIPLE FRAG\n"
 
-#: qcsrc/client/hud.qc:2882
+#: qcsrc/client/hud.qc:1674
 #, c-format
 msgid "%s^7 unleashes ^1SCORING RAGE\n"
 msgstr "%s^7 hat ^1PUNKTE-RASEN\n"
 
-#: qcsrc/client/hud.qc:2884
+#: qcsrc/client/hud.qc:1676
 #, c-format
 msgid "%s^7 unleashes ^1RAGE\n"
 msgstr "%s^7 ^1RAST VOR ZORN\n"
 
-#: qcsrc/client/hud.qc:2887
+#: qcsrc/client/hud.qc:1679
 #, c-format
 msgid "%s^7 made ^1TEN SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1ZEHN PUNKTE HINTEREINANDER!\n"
 
-#: qcsrc/client/hud.qc:2889
+#: qcsrc/client/hud.qc:1681
 #, c-format
 msgid "%s^7 starts the ^1MASSACRE!\n"
 msgstr "%s^7 beginnt das ^1MASSAKER!\n"
 
-#: qcsrc/client/hud.qc:2892
+#: qcsrc/client/hud.qc:1684
 #, c-format
 msgid "%s^7 made ^1FIFTEEN SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1FÜNFZEHN PUNKTE HINTEREINANDER\n"
 
-#: qcsrc/client/hud.qc:2894
+#: qcsrc/client/hud.qc:1686
 #, c-format
 msgid "%s^7 executes ^1MAYHEM!\n"
 msgstr "%s^7 erzeugt das ^1CHAOS!\n"
 
-#: qcsrc/client/hud.qc:2897
+#: qcsrc/client/hud.qc:1689
 #, c-format
 msgid "%s^7 made ^1TWENTY SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1ZWANZIG PUNKTE HINTEREINANDER\n"
 
-#: qcsrc/client/hud.qc:2899
+#: qcsrc/client/hud.qc:1691
 #, c-format
 msgid "%s^7 is a ^1BERSERKER!\n"
 msgstr "%s^7 ist ein ^1BERSERKER!\n"
 
-#: qcsrc/client/hud.qc:2902
+#: qcsrc/client/hud.qc:1694
 #, c-format
 msgid "%s^7 made ^1TWENTY FIVE SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1FÜNFUNDZWANZIG PUNKTE HINTEREINANDER!\n"
 
-#: qcsrc/client/hud.qc:2904
+#: qcsrc/client/hud.qc:1696
 #, c-format
 msgid "%s^7 inflicts ^1CARNAGE!\n"
 msgstr "%s^7 hält ein ^1BLUTBAD!\n"
 
-#: qcsrc/client/hud.qc:2907
+#: qcsrc/client/hud.qc:1699
 #, c-format
 msgid "%s^7 made ^1THIRTY SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1DREISSIG PUNKTE HINTEREINANDER\n"
 
-#: qcsrc/client/hud.qc:2909
+#: qcsrc/client/hud.qc:1701
 #, c-format
 msgid "%s^7 unleashes ^1ARMAGEDDON!\n"
 msgstr "%s^7 lässt die ^1APOKALYPSE^7 los!\n"
 
-#: qcsrc/client/hud.qc:2917
+#: qcsrc/client/hud.qc:1709
 #, c-format
 msgid "^1%s^1 was in the water for too long\n"
 msgstr "^1%s^1 war zu lange im Wasser\n"
 
-#: qcsrc/client/hud.qc:2919
+#: qcsrc/client/hud.qc:1711
 #, c-format
 msgid "^1%s^1 drowned\n"
 msgstr "^1%s^1 ertrank\n"
 
-#: qcsrc/client/hud.qc:2924
+#: qcsrc/client/hud.qc:1716
 #, c-format
 msgid "^1%s^1 was slimed\n"
 msgstr "^1%s^1 wurde im Schleim versenkt\n"
 
-#: qcsrc/client/hud.qc:2930
+#: qcsrc/client/hud.qc:1722
 #, c-format
 msgid "^1%s^1 found a hot place\n"
 msgstr "^1%s^1 fand einen heißen Ort\n"
 
-#: qcsrc/client/hud.qc:2932
+#: qcsrc/client/hud.qc:1724
 #, c-format
 msgid "^1%s^1 turned into hot slag\n"
 msgstr "^1%s^1 verwandelte sich in heiße Schlacke\n"
 
-#: qcsrc/client/hud.qc:2939
+#: qcsrc/client/hud.qc:1731
 #, c-format
 msgid "^1%s^1 tested gravity (and it worked)\n"
 msgstr "^1%s^1 probierte die Gravitation aus (und sie funktionierte)\n"
 
-#: qcsrc/client/hud.qc:2941
+#: qcsrc/client/hud.qc:1733
 #, c-format
 msgid "^1%s^1 hit the ground with a crunch\n"
 msgstr "^1%s^1 landete mit einem Knall auf dem Boden\n"
 
-#: qcsrc/client/hud.qc:2946
+#: qcsrc/client/hud.qc:1738
 #, c-format
 msgid "^1%s^1 became a shooting star\n"
 msgstr "^1%s^1 wurde zu einer Sternschnuppe\n"
 
-#: qcsrc/client/hud.qc:2952
+#: qcsrc/client/hud.qc:1744
 #, c-format
 msgid "^1%s^1 discovered a swamp\n"
 msgstr "^1%s^1 entdeckte einen Sumpf\n"
 
-#: qcsrc/client/hud.qc:2954
+#: qcsrc/client/hud.qc:1746
 #, c-format
 msgid "^1%s^1 is now conserved for centuries to come\n"
 msgstr "^1%s^1 ist jetzt für Jahrhunderte konserviert\n"
 
-#: qcsrc/client/hud.qc:2959
+#: qcsrc/client/hud.qc:1751
 #, c-format
 msgid "^1%s^1 was mowed down by a turret \n"
 msgstr "^1%s^1 wurde von einem Turret niedergemäht\n"
 
-#: qcsrc/client/hud.qc:2971
+#: qcsrc/client/hud.qc:1763
 #, c-format
 msgid "^1%s^1 died in an accident\n"
 msgstr "^1%s^1 starb an einem Unfall\n"
 
-#: qcsrc/client/hud.qc:2975
+#: qcsrc/client/hud.qc:1767
 #, c-format
 msgid "^1%s^1 was unfairly eliminated\n"
 msgstr "^1%s^1 wurde auf unfaire Weise eliminiert\n"
 
-#: qcsrc/client/hud.qc:2981
+#: qcsrc/client/hud.qc:1773
 #, c-format
 msgid "^1%s^1 felt a little hot\n"
 msgstr "^1%s^1 fand es ein wenig zu warm\n"
 
-#: qcsrc/client/hud.qc:2983
+#: qcsrc/client/hud.qc:1775
 #, c-format
 msgid "^1%s^1 burnt to death\n"
 msgstr "^1%s^1 verbrannte\n"
 
-#: qcsrc/client/hud.qc:2990
+#: qcsrc/client/hud.qc:1782
 #, c-format
 msgid "^1%s^1 needs a restart\n"
 msgstr "^1%s^1 braucht einen Neustart\n"
 
-#: qcsrc/client/hud.qc:2997
+#: qcsrc/client/hud.qc:1789
 #, c-format
 msgid "^1%s^1 needs a restart after a %d scoring spree\n"
 msgstr "^1%s^1 braucht einen Neustart nach %d Punkten in Folge\n"
 
-#: qcsrc/client/hud.qc:2999
+#: qcsrc/client/hud.qc:1791
 #, c-format
 msgid "^1%s^1 died with a %d kill spree\n"
 msgstr "^1%s^1 starb mit einer %d-Kill-Spree\n"
 
-#: qcsrc/client/hud.qc:3003
+#: qcsrc/client/hud.qc:1795
 #, c-format
 msgid "%s^7 got the %s\n"
 msgstr "%s^7 bekam die %s\n"
 
-#: qcsrc/client/hud.qc:3006
+#: qcsrc/client/hud.qc:1798
 #, c-format
 msgid "%s^7 lost the %s\n"
 msgstr "%s^7 verlor die %s\n"
 
-#: qcsrc/client/hud.qc:3009
+#: qcsrc/client/hud.qc:1801
 #, c-format
 msgid "%s^7 picked up the %s\n"
 msgstr "%s^7 nahm sich die %s\n"
 
-#: qcsrc/client/hud.qc:3012
+#: qcsrc/client/hud.qc:1804
 #, c-format
 msgid "%s^7 returned the %s\n"
 msgstr "%s^7 brachte die %s^7 zurück\n"
 
-#: qcsrc/client/hud.qc:3015
+#: qcsrc/client/hud.qc:1807
 #, c-format
 msgid "%s^7 captured the %s%s\n"
 msgstr "%s^7 eroberte die %s%s\n"
 
-#: qcsrc/client/hud.qc:3034
+#: qcsrc/client/hud.qc:1826
 #, c-format
 msgid "%s^7 has picked up the ball!\n"
 msgstr "%s^7 hat den Ball genommen!\n"
 
-#: qcsrc/client/hud.qc:3039
+#: qcsrc/client/hud.qc:1831
 #, c-format
 msgid "%s^7 has dropped the ball!\n"
 msgstr "%s^7 hat den Ball verloren!\n"
 
-#: qcsrc/client/hud.qc:3052
+#: qcsrc/client/hud.qc:1842
 #, c-format
 msgid "You are now on: %s"
 msgstr "Du bist jetzt im: %s"
 
-#: qcsrc/client/hud.qc:3054
+#: qcsrc/client/hud.qc:1844
 #, c-format
 msgid ""
 "You have been moved into a different team to improve team balance\n"
@@ -626,307 +637,327 @@ msgstr ""
 "Du wurdest in ein anderes Team verschoben, um Team-Balance zu verbessern.\n"
 "Du bist jetzt im: %s"
 
-#: qcsrc/client/hud.qc:3057
+#: qcsrc/client/hud.qc:1847
 msgid "^1Reconsider your tactics, camper!"
 msgstr "^1Ändere dein Verhalten, Camper!"
 
-#: qcsrc/client/hud.qc:3059
+#: qcsrc/client/hud.qc:1849
 msgid "^1Die camper!"
 msgstr "^1Stirb, Camper!"
 
-#: qcsrc/client/hud.qc:3062
+#: qcsrc/client/hud.qc:1852
 msgid "^1You are reinserted into the game for running out of ammo..."
 msgstr ""
 "^1Du wurdest ins Spiel neu eingesetzt, weil dir die Munition ausging..."
 
-#: qcsrc/client/hud.qc:3064
+#: qcsrc/client/hud.qc:1854
 msgid "^1You were killed for running out of ammo..."
 msgstr "^1Du wurdest getötet, da dir die Munition ausging..."
 
-#: qcsrc/client/hud.qc:3067
+#: qcsrc/client/hud.qc:1857
 msgid "^1You need to preserve your health"
 msgstr "^1Du solltest deine Gesundheit erhalten"
 
-#: qcsrc/client/hud.qc:3069
+#: qcsrc/client/hud.qc:1859
 msgid "^1You grew too old without taking your medicine"
 msgstr "^1Du wurdest zu alt, und hast nicht deine Medizin genommen"
 
-#: qcsrc/client/hud.qc:3072
+#: qcsrc/client/hud.qc:1862
 msgid "^1Don't go against team mates!"
 msgstr "^1Ärgere deine Teamkollegen nicht!"
 
-#: qcsrc/client/hud.qc:3074
+#: qcsrc/client/hud.qc:1864
 msgid "^1Don't shoot your team mates!"
 msgstr "^1Schieße nicht auf deine Teamkollegen!"
 
-#: qcsrc/client/hud.qc:3079
+#: qcsrc/client/hud.qc:1869
 msgid "^1You need to be more careful!"
 msgstr "^1Sei vorsichtiger!"
 
-#: qcsrc/client/hud.qc:3081
+#: qcsrc/client/hud.qc:1871
 msgid "^1You killed your own dumb self!"
 msgstr "^1Du hast dich selbst umgebracht. Wie blöd."
 
-#: qcsrc/client/hud.qc:3086
+#: qcsrc/client/hud.qc:1876
 #, c-format
-msgid "^1Moron! You went against %s, a team mate!"
+msgid "^1Moron! You went against ^7%s^1, a team mate!"
 msgstr "^1Idiot! Du hast %s getroffen, also einen Teamkollegen von dir!"
 
-#: qcsrc/client/hud.qc:3088
+#: qcsrc/client/hud.qc:1878
 #, c-format
-msgid "^1Moron! You fragged %s, a team mate!"
+msgid "^1Moron! You fragged ^7%s^1, a team mate!"
 msgstr "^1Idiot! Du hast %s getötet, also einen Teamkollegen von dir!"
 
-#: qcsrc/client/hud.qc:3092
+#: qcsrc/client/hud.qc:1882
 msgid "^1First score"
 msgstr "^1Erster Punkt"
 
-#: qcsrc/client/hud.qc:3094
+#: qcsrc/client/hud.qc:1884
 msgid "^1First blood"
 msgstr "^1Erstes Blut"
 
-#: qcsrc/client/hud.qc:3098
+#: qcsrc/client/hud.qc:1888
 msgid "^1First casualty"
 msgstr "^1Erster Kollateralschaden"
 
-#: qcsrc/client/hud.qc:3100
+#: qcsrc/client/hud.qc:1890
 msgid "^1First victim"
 msgstr "^1Erstes Opfer"
 
-#: qcsrc/client/hud.qc:3104
+#: qcsrc/client/hud.qc:1894
 #, c-format
 msgid "^1You scored against ^7%s^1 who was typing!"
 msgstr "^1Du hast gegen ^7%s^1 gepunktet, während er am Tippen war!"
 
-#: qcsrc/client/hud.qc:3106
+#: qcsrc/client/hud.qc:1896
 #, c-format
 msgid "^1You typefragged ^7%s"
 msgstr "^1Du hast ^7%s^1 beim Tippen erschossen"
 
-#: qcsrc/client/hud.qc:3110
+#: qcsrc/client/hud.qc:1900
 #, c-format
 msgid "^1You were scored against by ^7%s^1 while you were typing!"
 msgstr "^1Gegen dich hat ^7%s^1 gepunktet, während du am Tippen warst!"
 
-#: qcsrc/client/hud.qc:3112
+#: qcsrc/client/hud.qc:1902
 #, c-format
 msgid "^1You were typefragged by ^7%s"
 msgstr "^1Du wurdest von ^7%s^1 erschossen, während du am Tippen warst"
 
-#: qcsrc/client/hud.qc:3116
+#: qcsrc/client/hud.qc:1906
 #, c-format
 msgid "^4You scored against ^7%s"
 msgstr "^4Du hast gegen ^7%s^4 gepunktet"
 
-#: qcsrc/client/hud.qc:3118
+#: qcsrc/client/hud.qc:1908
 #, c-format
 msgid "^4You fragged ^7%s"
 msgstr "^4Du hast ^7%s^4 getötet"
 
-#: qcsrc/client/hud.qc:3122
+#: qcsrc/client/hud.qc:1912
 #, c-format
 msgid "^1You were scored against by ^7%s"
 msgstr "^1Gegen dich hat ^7%s^1 gepunktet"
 
-#: qcsrc/client/hud.qc:3124
+#: qcsrc/client/hud.qc:1914
 #, c-format
 msgid "^1You were fragged by ^7%s"
 msgstr "^1Du wurdest von ^7%s^1 getötet"
 
-#: qcsrc/client/hud.qc:3129
+#: qcsrc/client/hud.qc:1919
 msgid "^1Watch your step!"
 msgstr "^1Achte, wo du hintrittst!"
 
-#: qcsrc/client/hud.qc:3194 qcsrc/client/hud.qc:3195
+#: qcsrc/client/hud.qc:1988 qcsrc/client/hud.qc:1989 qcsrc/client/hud.qc:2474
 #, c-format
 msgid "Player %d"
 msgstr "Spieler %d"
 
-#: qcsrc/client/hud.qc:3791
+#: qcsrc/client/hud.qc:2779
 msgid "^1Intermediate 1 (+15.42)"
 msgstr "^1Intermediate 1 (+15.42)"
 
-#: qcsrc/client/hud.qc:3793 qcsrc/client/hud.qc:3835 qcsrc/client/hud.qc:3876
+#: qcsrc/client/hud.qc:2781 qcsrc/client/hud.qc:2823 qcsrc/client/hud.qc:2864
 #, c-format
 msgid "^1PENALTY: %.1f (%s)"
 msgstr "^1STRAFE: %.1f (%s)"
 
-#: qcsrc/client/hud.qc:3878
+#: qcsrc/client/hud.qc:2866
 #, c-format
 msgid "^2PENALTY: %.1f (%s)"
 msgstr "^2STRAFE: %.1f (%s)"
 
-#: qcsrc/client/hud.qc:3903
+#: qcsrc/client/hud.qc:2894
+msgid "^1You must answer before entering hud configure mode\n"
+msgstr "^1Du musst antworten, bevore das HUD konfiguriert werden kann\n"
+
+#: qcsrc/client/hud.qc:2897
 msgid "^2Name ^7instead of \"^1Unregistered player^7\" in stats"
 msgstr "^2Name^7 statt \"^1Unregistered player^7\" in den Statistiken"
 
-#: qcsrc/client/hud.qc:3985
+#: qcsrc/client/hud.qc:2979
 msgid "A vote has been called for:"
 msgstr "Eine Abstimmung wurde initiiert für:"
 
-#: qcsrc/client/hud.qc:3987
+#: qcsrc/client/hud.qc:2981
 msgid "Allow servers to store and display your name?"
 msgstr "Erlaube Servern, deinen Namen zu speichern und später zu zeigen?"
 
-#: qcsrc/client/hud.qc:3991
+#: qcsrc/client/hud.qc:2985
 msgid "^1Configure the HUD"
 msgstr "^1Das HUD konfigurieren"
 
-#: qcsrc/client/hud.qc:3995
+#: qcsrc/client/hud.qc:2989
 #, c-format
 msgid "Yes (%s): %d"
 msgstr "Ja (%s): %d"
 
-#: qcsrc/client/hud.qc:3997
+#: qcsrc/client/hud.qc:2991
 #, c-format
 msgid "No (%s): %d"
 msgstr "Nein (%s): %d"
 
-#: qcsrc/client/hud.qc:4510 qcsrc/client/hud.qc:4513 qcsrc/client/hud.qc:4515
+#: qcsrc/client/hud.qc:3494 qcsrc/client/hud.qc:3497 qcsrc/client/hud.qc:3499
 msgid "Personal best"
 msgstr "Persönliche Bestzeit"
 
-#: qcsrc/client/hud.qc:4528 qcsrc/client/hud.qc:4531 qcsrc/client/hud.qc:4533
+#: qcsrc/client/hud.qc:3512 qcsrc/client/hud.qc:3515 qcsrc/client/hud.qc:3517
 msgid "Server best"
 msgstr "Server-Bestzeit"
 
-#: qcsrc/client/hud.qc:4765
+#: qcsrc/client/hud.qc:3861
 msgid "^3Player^7: This is the chat area."
 msgstr "^3Player^7: Das ist der Chat-Bereich."
 
-#: qcsrc/client/hud.qc:4828
+#: qcsrc/client/hud.qc:3929
 #, c-format
 msgid "FPS: %.*f"
 msgstr "FPS: %.*f"
 
-#: qcsrc/client/hud.qc:4893
+#: qcsrc/client/hud.qc:3996
 msgid "^1Observing"
 msgstr "^1Beobachten"
 
-#: qcsrc/client/hud.qc:4895
+#: qcsrc/client/hud.qc:3998
 #, c-format
 msgid "^1Spectating: ^7%s"
 msgstr "^1Zuschauen bei: ^7%s"
 
-#: qcsrc/client/hud.qc:4899
+#: qcsrc/client/hud.qc:4002
 #, c-format
 msgid "^1Press ^3%s^1 to spectate"
 msgstr "^1Drücke ^3%s^1, um bei jemandem zuzuschauen"
 
-#: qcsrc/client/hud.qc:4901
+#: qcsrc/client/hud.qc:4004
 #, c-format
 msgid "^1Press ^3%s^1 for another player"
 msgstr "^1Drücke ^3%s^1 für einen anderen Spieler"
 
-#: qcsrc/client/hud.qc:4905
+#: qcsrc/client/hud.qc:4008
 #, c-format
 msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
 msgstr "^1Benutze ^3%s^1 oder ^3%s^1 zum Ändern der Geschwindigkeit"
 
-#: qcsrc/client/hud.qc:4907
+#: qcsrc/client/hud.qc:4010
 #, c-format
 msgid "^1Press ^3%s^1 to observe"
 msgstr "^1Drücke ^3%s^1 zum Beobachten"
 
-#: qcsrc/client/hud.qc:4910
+#: qcsrc/client/hud.qc:4013
 #, c-format
 msgid "^1Press ^3%s^1 for gamemode info"
 msgstr "^1Drücke ^3%s^1 für Spielmodus-Info"
 
-#: qcsrc/client/hud.qc:4914
+#: qcsrc/client/hud.qc:4017
 msgid "^1Wait for your turn to join"
 msgstr "^1Warte, bis du dran bist"
 
-#: qcsrc/client/hud.qc:4920
+#: qcsrc/client/hud.qc:4023
 msgid "^1Match has already begun"
 msgstr "^1Das Match hat bereits begonnen"
 
-#: qcsrc/client/hud.qc:4922
+#: qcsrc/client/hud.qc:4025
 msgid "^1You have no more lives left"
 msgstr "^1Du hast keine Leben mehr übrig"
 
-#: qcsrc/client/hud.qc:4924 qcsrc/client/hud.qc:4927
+#: qcsrc/client/hud.qc:4027 qcsrc/client/hud.qc:4030
 #, c-format
 msgid "^1Press ^3%s^1 to join"
-msgstr "^1Drücke ^3%s^1 zum Eintreten"
+msgstr "^1Drücke ^3%s^1 zum Mitspielen"
 
-#: qcsrc/client/hud.qc:4935
+#: qcsrc/client/hud.qc:4038
 #, c-format
 msgid "^1Game starts in ^3%d^1 seconds"
 msgstr "^1Das Spiel beginnt in ^3%d^1 Sekunden"
 
-#: qcsrc/client/hud.qc:4942
+#: qcsrc/client/hud.qc:4045
 msgid "^2Currently in ^1warmup^2 stage!"
 msgstr "^2Momentan in der ^1Aufwärmphase!"
 
-#: qcsrc/client/hud.qc:4957
+#: qcsrc/client/hud.qc:4060
 #, c-format
 msgid "%sPress ^3%s%s to end warmup"
 msgstr "%sDrücke ^3%s%s um die Aufwärmphase zu beenden"
 
-#: qcsrc/client/hud.qc:4959
+#: qcsrc/client/hud.qc:4062
 #, c-format
 msgid "%sPress ^3%s%s once you are ready"
 msgstr "%sDrücke ^3%s%s sobald du soweit bist"
 
-#: qcsrc/client/hud.qc:4964
+#: qcsrc/client/hud.qc:4067
 msgid "^2Waiting for others to ready up to end warmup..."
 msgstr "^2Warte, bis andere bereit sind, um die Aufwärmphase zu beenden"
 
-#: qcsrc/client/hud.qc:4966
+#: qcsrc/client/hud.qc:4069
 msgid "^2Waiting for others to ready up..."
 msgstr "^2Warte, bis andere bereit sind..."
 
-#: qcsrc/client/hud.qc:4972
+#: qcsrc/client/hud.qc:4075
 #, c-format
 msgid "^2Press ^3%s^2 to end warmup"
 msgstr "^2Drücke ^3%s^2 um die Aufwärmphase zu beenden"
 
-#: qcsrc/client/hud.qc:4993
+#: qcsrc/client/hud.qc:4096
 msgid "Teamnumbers are unbalanced!"
 msgstr "Die Teams sind unbalanciert!"
 
-#: qcsrc/client/hud.qc:4998
+#: qcsrc/client/hud.qc:4101
 #, c-format
 msgid " Press ^3%s%s to adjust"
 msgstr "Drücke ^3%s%s um dies zu korrigieren"
 
-#: qcsrc/client/hud.qc:5006
+#: qcsrc/client/hud.qc:4109
 msgid "^7Press ^3ESC ^7to show HUD options."
 msgstr "^7Drücke ^3ESC^7 um die HUD-Optionen zu zeigen"
 
-#: qcsrc/client/hud.qc:5008
+#: qcsrc/client/hud.qc:4111
 msgid "^3Doubleclick ^7a panel for panel-specific options."
 msgstr "^3Doppelklick^7 auf ein Panel für Panel-spezifische Optionen."
 
-#: qcsrc/client/hud.qc:5010
+#: qcsrc/client/hud.qc:4113
 msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
 msgstr "^3CTRL^7 um Kollisionstests zu deaktivieren, ^3SHIFT^7 und"
 
-#: qcsrc/client/hud.qc:5012
+#: qcsrc/client/hud.qc:4115
 msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
 msgstr "^3ALT^7 + ^3PFEILTASTEN^7 für Feinjustierungen"
 
-#: qcsrc/client/hud.qc:5037
+#: qcsrc/client/hud.qc:4153
 msgid " qu/s"
 msgstr "qu/s"
 
-#: qcsrc/client/hud.qc:5041
+#: qcsrc/client/hud.qc:4157
 msgid " m/s"
 msgstr "m/s"
 
-#: qcsrc/client/hud.qc:5045
+#: qcsrc/client/hud.qc:4161
 msgid " km/h"
 msgstr "km/h"
 
-#: qcsrc/client/hud.qc:5049
+#: qcsrc/client/hud.qc:4165
 msgid " mph"
 msgstr "mph"
 
-#: qcsrc/client/hud.qc:5053
+#: qcsrc/client/hud.qc:4169
 msgid " knots"
 msgstr "Knoten"
 
+#: qcsrc/client/hud.qc:4814
+msgid "Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"
+msgstr "Falsche Panel-Nummern in _hud_panelorder wurden automatisch behoben"
+
+#: qcsrc/client/hud_config.qc:136
+#, c-format
+msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
+msgstr ""
+"^2Erfolgreich als %s exportiert! (Hinweis: die Datei wurde in data/data/ "
+"abgelegt)\n"
+
+#: qcsrc/client/hud_config.qc:140
+#, c-format
+msgid "^1Couldn't write to %s\n"
+msgstr "^1Konnte nicht nach %s schreiben\n"
+
 #: qcsrc/client/mapvoting.qc:28
 msgid " (1 vote)"
 msgstr "(1 Stimme)"
@@ -944,7 +975,7 @@ msgstr "Egal"
 msgid "Vote for a map"
 msgstr "Wähle eine Map"
 
-#: qcsrc/client/mapvoting.qc:199
+#: qcsrc/client/mapvoting.qc:200
 #, c-format
 msgid "%d seconds left"
 msgstr "%d Sekunden übrig"
@@ -994,6 +1025,18 @@ msgstr "Du hast die %s!"
 msgid "Trying to remove a team which is not in the teamlist!"
 msgstr "Versuchte, ein Team zu löschen, das nicht in der Teamliste ist!"
 
+#: qcsrc/client/movetypes.qc:163
+#, c-format
+msgid "Can't unstick an entity (edict: %d, classname: %s, origin: %s)\n"
+msgstr ""
+"Kann ein Objekt nicht befreien (edict: %d, classname: %s, origin: %s)\n"
+
+#: qcsrc/client/movetypes.qc:166
+#, c-format
+msgid "Sucessfully unstuck an entity (edict: %d, classname: %s, origin: %s)\n"
+msgstr ""
+"Ein Objekt wurde erfolgreich befreit (edict: %d, classname: %s, origin: %s)\n"
+
 #: qcsrc/client/scoreboard.qc:19
 msgid "SCO^bckills"
 msgstr "BC getötet"
@@ -1334,68 +1377,68 @@ msgstr "Fehlendes Feld '%s' wurde ergänzt.\n"
 msgid "N/A"
 msgstr "-"
 
-#: qcsrc/client/scoreboard.qc:951
+#: qcsrc/client/scoreboard.qc:950
 #, c-format
 msgid "Accuracy stats (average %d%%)"
 msgstr "Genauigkeit (Durchschn.: %d%%)"
 
-#: qcsrc/client/scoreboard.qc:1016
+#: qcsrc/client/scoreboard.qc:1015
 #, c-format
 msgid "%d%%"
 msgstr "%d%%"
 
-#: qcsrc/client/scoreboard.qc:1076
+#: qcsrc/client/scoreboard.qc:1075
 msgid "Rankings"
 msgstr "Platzierungen"
 
-#: qcsrc/client/scoreboard.qc:1167 qcsrc/client/scoreboard.qc:1169
+#: qcsrc/client/scoreboard.qc:1170
 msgid "Scoreboard"
 msgstr "Tabelle"
 
-#: qcsrc/client/scoreboard.qc:1210
+#: qcsrc/client/scoreboard.qc:1215
 #, c-format
 msgid "Speed award: %d ^7(%s^7)"
 msgstr "Höchstgeschwindigkeit: %d ^7(%s^7)"
 
-#: qcsrc/client/scoreboard.qc:1214
+#: qcsrc/client/scoreboard.qc:1219
 #, c-format
 msgid "All-time fastest: %d ^7(%s^7)"
 msgstr "Rekord: %d ^7(%s^7)"
 
-#: qcsrc/client/scoreboard.qc:1241 qcsrc/client/teamplay.qc:55
+#: qcsrc/client/scoreboard.qc:1246 qcsrc/client/teamplay.qc:63
 msgid "Spectators"
 msgstr "Zuschauer"
 
-#: qcsrc/client/scoreboard.qc:1248
+#: qcsrc/client/scoreboard.qc:1252
 #, c-format
 msgid "playing on ^2%s^7"
 msgstr "es wird auf ^2%s^7 gespielt"
 
-#: qcsrc/client/scoreboard.qc:1255 qcsrc/client/scoreboard.qc:1260
+#: qcsrc/client/scoreboard.qc:1259 qcsrc/client/scoreboard.qc:1264
 #, c-format
 msgid " for up to ^1%1.0f minutes^7"
 msgstr " für bis zu ^1%.1f Minuten^7"
 
-#: qcsrc/client/scoreboard.qc:1264 qcsrc/client/scoreboard.qc:1283
+#: qcsrc/client/scoreboard.qc:1268 qcsrc/client/scoreboard.qc:1287
 msgid " or"
 msgstr " oder"
 
-#: qcsrc/client/scoreboard.qc:1267 qcsrc/client/scoreboard.qc:1274
+#: qcsrc/client/scoreboard.qc:1271 qcsrc/client/scoreboard.qc:1278
 #, c-format
 msgid " until ^3%s %s^7"
 msgstr " bis ^3%s %s^7"
 
-#: qcsrc/client/scoreboard.qc:1268 qcsrc/client/scoreboard.qc:1275
-#: qcsrc/client/scoreboard.qc:1287 qcsrc/client/scoreboard.qc:1294
+#: qcsrc/client/scoreboard.qc:1272 qcsrc/client/scoreboard.qc:1279
+#: qcsrc/client/scoreboard.qc:1291 qcsrc/client/scoreboard.qc:1298
 msgid "SCO^points"
 msgstr "Punkte"
 
-#: qcsrc/client/scoreboard.qc:1269 qcsrc/client/scoreboard.qc:1276
-#: qcsrc/client/scoreboard.qc:1288 qcsrc/client/scoreboard.qc:1295
+#: qcsrc/client/scoreboard.qc:1273 qcsrc/client/scoreboard.qc:1280
+#: qcsrc/client/scoreboard.qc:1292 qcsrc/client/scoreboard.qc:1299
 msgid "SCO^is beaten"
 msgstr "geschlagen wird"
 
-#: qcsrc/client/scoreboard.qc:1286 qcsrc/client/scoreboard.qc:1293
+#: qcsrc/client/scoreboard.qc:1290 qcsrc/client/scoreboard.qc:1297
 #, c-format
 msgid " until a lead of ^3%s %s^7"
 msgstr " bis zu einem Vorsprung von ^3%s %s^7"
@@ -1405,26 +1448,228 @@ msgstr " bis zu einem Vorsprung von ^3%s %s^7"
 msgid "Cannot initialize sound %s\n"
 msgstr "Kann Sound %s nicht initialisieren\n"
 
-#: qcsrc/client/teamplay.qc:56
+#: qcsrc/client/teamplay.qc:64
 msgid "Red Team"
 msgstr "Rotes Team"
 
-#: qcsrc/client/teamplay.qc:57
+#: qcsrc/client/teamplay.qc:65
 msgid "Blue Team"
 msgstr "Blaues Team"
 
-#: qcsrc/client/teamplay.qc:58
+#: qcsrc/client/teamplay.qc:66
 msgid "Yellow Team"
 msgstr "Gelbes Team"
 
-#: qcsrc/client/teamplay.qc:59
+#: qcsrc/client/teamplay.qc:67
 msgid "Pink Team"
 msgstr "Pinkes Team"
 
-#: qcsrc/server/w_crylink.qc:2
+#: qcsrc/client/waypointsprites.qc:254
+msgid "Push"
+msgstr "Drücken"
+
+#: qcsrc/client/waypointsprites.qc:255
+msgid "Destroy"
+msgstr "Zerstören"
+
+#: qcsrc/client/waypointsprites.qc:256
+msgid "Defend"
+msgstr "Verteidigen"
+
+#: qcsrc/client/waypointsprites.qc:257
+msgid "Blue base"
+msgstr "Blaue Basis"
+
+#: qcsrc/client/waypointsprites.qc:258
+msgid "DANGER"
+msgstr "GEFAHR"
+
+#: qcsrc/client/waypointsprites.qc:259
+msgid "Flag carrier"
+msgstr "Flaggenträger"
+
+#: qcsrc/client/waypointsprites.qc:260
+msgid "Dropped flag"
+msgstr "Flagge"
+
+#: qcsrc/client/waypointsprites.qc:261
+msgid "Help me!"
+msgstr "Hilfe!"
+
+#: qcsrc/client/waypointsprites.qc:262
+msgid "Here"
+msgstr "Hier"
+
+#: qcsrc/client/waypointsprites.qc:263
+msgid "Dropped key"
+msgstr "Schlüssel"
+
+#: qcsrc/client/waypointsprites.qc:264 qcsrc/client/waypointsprites.qc:266
+#: qcsrc/client/waypointsprites.qc:267 qcsrc/client/waypointsprites.qc:268
+#: qcsrc/client/waypointsprites.qc:269
+msgid "Key carrier"
+msgstr "Schlüsselträger"
+
+#: qcsrc/client/waypointsprites.qc:265
+msgid "Run here"
+msgstr "Hier her!"
+
+#: qcsrc/client/waypointsprites.qc:270
+msgid "Red base"
+msgstr "Rote Basis"
+
+#: qcsrc/client/waypointsprites.qc:271
+msgid "Waypoint"
+msgstr "Wegpunkt"
+
+#: qcsrc/client/waypointsprites.qc:272 qcsrc/client/waypointsprites.qc:273
+#: qcsrc/client/waypointsprites.qc:274
+msgid "Generator"
+msgstr "Generator"
+
+#: qcsrc/client/waypointsprites.qc:275 qcsrc/client/waypointsprites.qc:276
+#: qcsrc/client/waypointsprites.qc:277 qcsrc/client/waypointsprites.qc:278
+#: qcsrc/client/waypointsprites.qc:279 qcsrc/client/waypointsprites.qc:280
+#: qcsrc/client/waypointsprites.qc:281 qcsrc/client/waypointsprites.qc:282
+#: qcsrc/client/waypointsprites.qc:306 qcsrc/client/waypointsprites.qc:307
+#: qcsrc/client/waypointsprites.qc:308 qcsrc/client/waypointsprites.qc:309
+#: qcsrc/client/waypointsprites.qc:310
+msgid "Control point"
+msgstr "Kontrollpunkt"
+
+#: qcsrc/client/waypointsprites.qc:283
+msgid "Checkpoint"
+msgstr "Checkpoint"
+
+#: qcsrc/client/waypointsprites.qc:284 qcsrc/client/waypointsprites.qc:286
+msgid "Finish"
+msgstr "Ziel"
+
+#: qcsrc/client/waypointsprites.qc:285 qcsrc/client/waypointsprites.qc:286
+msgid "Start"
+msgstr "Start"
+
+#: qcsrc/client/waypointsprites.qc:287 qcsrc/client/waypointsprites.qc:288
+msgid "Ball"
+msgstr "Ball"
+
+#: qcsrc/client/waypointsprites.qc:289
+msgid "Ball carrier"
+msgstr "Ballbesitzer"
+
+#: qcsrc/client/waypointsprites.qc:290 qcsrc/server/w_laser.qc:2
+msgid "Laser"
+msgstr "Laser"
+
+#: qcsrc/client/waypointsprites.qc:291 qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Shotgun"
+
+#: qcsrc/client/waypointsprites.qc:292 qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr "Machine Gun"
+
+#: qcsrc/client/waypointsprites.qc:293 qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
+msgstr "Mortar"
+
+#: qcsrc/client/waypointsprites.qc:294 qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr "Electro"
+
+#: qcsrc/client/waypointsprites.qc:295 qcsrc/server/w_crylink.qc:2
 msgid "Crylink"
 msgstr "Crylink"
 
+#: qcsrc/client/waypointsprites.qc:296 qcsrc/server/w_nex.qc:2
+msgid "Nex"
+msgstr "Nex"
+
+#: qcsrc/client/waypointsprites.qc:297 qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr "Hagar"
+
+#: qcsrc/client/waypointsprites.qc:298 qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
+
+#: qcsrc/client/waypointsprites.qc:299 qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr "Port-O-Launch"
+
+#: qcsrc/client/waypointsprites.qc:300
+msgid "Minstanex"
+msgstr "MinstaNex"
+
+#: qcsrc/client/waypointsprites.qc:301
+msgid "Hook"
+msgstr "Hook"
+
+#: qcsrc/client/waypointsprites.qc:302 qcsrc/server/w_fireball.qc:2
+msgid "Fireball"
+msgstr "Fireball"
+
+#: qcsrc/client/waypointsprites.qc:303
+msgid "HLAC"
+msgstr "HLAC"
+
+#: qcsrc/client/waypointsprites.qc:304 qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Gewehr"
+
+#: qcsrc/client/waypointsprites.qc:305 qcsrc/server/w_minelayer.qc:2
+msgid "Mine Layer"
+msgstr "Mine Layer"
+
+#: qcsrc/client/waypointsprites.qc:311
+msgid "Invisibility"
+msgstr "Unsichtbarkeit"
+
+#: qcsrc/client/waypointsprites.qc:312
+msgid "Extra life"
+msgstr "Extraleben"
+
+#: qcsrc/client/waypointsprites.qc:313
+msgid "Speed"
+msgstr "Geschwindigkeit"
+
+#: qcsrc/client/waypointsprites.qc:314
+msgid "Strength"
+msgstr "Stärke"
+
+#: qcsrc/client/waypointsprites.qc:315
+msgid "Shield"
+msgstr "Schutzschild"
+
+#: qcsrc/client/waypointsprites.qc:316
+msgid "Fuel regen"
+msgstr "Treibstoff-Regeneration"
+
+#: qcsrc/client/waypointsprites.qc:317
+msgid "Jet Pack"
+msgstr "Jetpack"
+
+#: qcsrc/client/waypointsprites.qc:318
+msgid "Frozen!"
+msgstr "Eingefroren!"
+
+#: qcsrc/client/waypointsprites.qc:319
+msgid "Tagged"
+msgstr "Getaggt!"
+
+#: qcsrc/client/waypointsprites.qc:320
+msgid "Vehicle"
+msgstr "Fahrzeug"
+
+#: qcsrc/client/waypointsprites.qc:590
+msgid "Spam"
+msgstr "Frühstücksfleisch"
+
+#: qcsrc/client/waypointsprites.qc:594
+#, c-format
+msgid "%s needing help!"
+msgstr "%s braucht Hilfe!"
+
 #: qcsrc/server/w_crylink.qc:664
 #, c-format
 msgid "%s succeeded at self-destructing themself with the Crylink"
@@ -1445,49 +1690,41 @@ msgstr "%s trat %ss Crylink zu nahe"
 msgid "%s took a close look at %s's Crylink"
 msgstr "%s schaute sich %ss Crylink sehr genau an"
 
-#: qcsrc/server/w_electro.qc:2
-msgid "Electro"
-msgstr "Electro"
-
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
 #, c-format
 msgid "%s could not remember where they put plasma"
 msgstr "%s vergaß, wo er das Plasma hingetan hatte"
 
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
 #, c-format
 msgid "%s played with plasma"
 msgstr "%s spielte mit Plasma"
 
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
 #, c-format
 msgid "%s just noticed %s's blue ball"
 msgstr "%s hat gerade %ss blaue Kugel bemerkt"
 
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
 #, c-format
 msgid "%s got in touch with %s's blue ball"
 msgstr "%s kam mit %ss blauer Kugel in Kontakt"
 
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
 #, c-format
 msgid "%s felt the electrifying air of %s's combo"
 msgstr "%s hat gespürt, wie %ss Combo die Luft elektrisierte"
 
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
 #, c-format
 msgid "%s got too close to %s's blue beam"
 msgstr "%s kam zu nah an %ss blauen Strahl"
 
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
 #, c-format
 msgid "%s was blasted by %s's blue beam"
 msgstr "%s wurde von %ss blauen Strahl erwischt"
 
-#: qcsrc/server/w_fireball.qc:2
-msgid "Fireball"
-msgstr "Fireball"
-
 #: qcsrc/server/w_fireball.qc:417
 #, c-format
 msgid "%s forgot about some firemine"
@@ -1528,50 +1765,42 @@ msgstr "%s ist %ss Feuerball zu nahe getreten"
 msgid "%s tasted %s's fireball"
 msgstr "%s hat von %ss Feuerball probiert"
 
-#: qcsrc/server/w_grenadelauncher.qc:2
-msgid "Mortar"
-msgstr "Mortar"
-
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
 #, c-format
 msgid "%s tried out his own grenade"
 msgstr "%s wollte wissen, ob seine Granate funktioniert"
 
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
 #, c-format
 msgid "%s detonated"
 msgstr "%s verfing sich in der eigenen Detonation"
 
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
 #, c-format
 msgid "%s didn't see %s's grenade"
 msgstr "%s hat %ss Granate nicht gesehen"
 
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
 #, c-format
 msgid "%s almost dodged %s's grenade"
 msgstr "%s ist fast %ss Granate ausgewichen"
 
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
 #, c-format
 msgid "%s ate %s's grenade"
 msgstr "%s nahm %ss Granate in den Mund"
 
-#: qcsrc/server/w_hagar.qc:2
-msgid "Hagar"
-msgstr "Hagar"
-
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655
 #, c-format
 msgid "%s played with tiny rockets"
 msgstr "%s hat mit kleinen Raketen gespielt"
 
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:386
 #, c-format
 msgid "%s hoped %s's missiles wouldn't bounce"
 msgstr "%s hat gehofft, dass %ss Raketen nicht von Wänden abprallen"
 
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661
 #, c-format
 msgid "%s was pummeled by %s"
 msgstr "^1%s^1 wurde von %s^1 erwischt"
@@ -1589,9 +1818,7 @@ msgstr "^1%s^1 wurde von %s^1 niedergehauen"
 msgid "Grappling Hook"
 msgstr "Grappling Hook"
 
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
 #, c-format
 msgid "%s did the impossible"
 msgstr "%s hat das Unmögliche geschafft"
@@ -1601,45 +1828,37 @@ msgstr "%s hat das Unmögliche geschafft"
 msgid "%s has run into %s's gravity bomb"
 msgstr "%s ist in %ss Gravitationsbombe reingelaufen"
 
-#: qcsrc/server/w_laser.qc:2
-msgid "Laser"
-msgstr "Laser"
-
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
 #, c-format
 msgid "%s lasered themself to hell"
 msgstr "%s hat sich in die Hölle gelasert"
 
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
 #, c-format
 msgid "%s was cut in half by %s's gauntlet"
 msgstr "%s ist von %ss Gauntlet halbiert worden"
 
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
 #, c-format
 msgid "%s was lasered to death by %s"
 msgstr "^1%s^1 wurde von %s^1 zu Tode gelasert"
 
-#: qcsrc/server/w_minelayer.qc:2
-msgid "Mine Layer"
-msgstr "Mine Layer"
-
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
 #, c-format
 msgid "%s exploded"
 msgstr "%s ist explodiert"
 
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
 #, c-format
 msgid "%s got too close to %s's mine"
 msgstr "%s ist %ss Mine zu nahe getreten"
 
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
 #, c-format
 msgid "%s almost dodged %s's mine"
 msgstr "%s ist fast %ss Mine ausgewichen"
 
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
 #, c-format
 msgid "%s stepped on %s's mine"
 msgstr "%s ist auf %ss Mine gelatscht"
@@ -1648,39 +1867,68 @@ msgstr "%s ist auf %ss Mine gelatscht"
 msgid "MinstaNex"
 msgstr "MinstaNex"
 
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr "%s kann jetzt mit Portalen denken"
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
 #, c-format
 msgid "%s has been vaporized by %s"
 msgstr "^1%s^1 wurde von %s^1 vernichtet"
 
-#: qcsrc/server/w_nex.qc:2
-msgid "Nex"
-msgstr "Nex"
-
-#: qcsrc/server/w_porto.qc:2
-msgid "Port-O-Launch"
-msgstr "Port-O-Launch"
-
 #: qcsrc/server/w_porto.qc:298
 #, c-format
 msgid "%s felt %s doing the impossible to him"
 msgstr "%s hat gespürt, wie %s das Unmögliche für ihn getan hat"
 
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
-msgstr "Rocket Launcher"
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s hat sich vollautomatisch selbst erschossen"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
 
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s ist in %ss Kugelhagel gefallen"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "^1%s^1 wurde von %s^1 erledigt"
+
+#: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
 msgid "%s got too close to %s's rocket"
 msgstr "%s ist %ss Rakete zu nahe getreten"
 
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
 msgid "%s almost dodged %s's rocket"
 msgstr "%s ist fast %ss Rakete ausgewichen"
 
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
 msgid "%s ate %s's rocket"
 msgstr "%s hat %ss Rakete in den Mund genommen"
@@ -1694,81 +1942,34 @@ msgstr "T.A.G. Seeker"
 msgid "%s was tagged by %s"
 msgstr "^1%s^1 wurde von %s^1 getagged"
 
-#: qcsrc/server/w_shotgun.qc:2
-msgid "Shotgun"
-msgstr "Shotgun"
-
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_shotgun.qc:219
 #, c-format
 msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
 msgstr "%2$1s ^7hat %1$s ^7ein wenig mit einer großen Schrotflinte geschlagen"
 
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_shotgun.qc:221
 #, c-format
 msgid "%s was gunned by %s"
 msgstr "^1%s^1 wurde von %s^1 erschossen"
 
-#: qcsrc/server/w_sniperrifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_sniperrifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s hat sich vollautomatisch selbst erschossen"
-
-#: qcsrc/server/w_sniperrifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
-
-#: qcsrc/server/w_sniperrifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
-
-#: qcsrc/server/w_sniperrifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s ist in %ss Kugelhagel gefallen"
-
-#: qcsrc/server/w_sniperrifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
-
-#: qcsrc/server/w_sniperrifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
-
-#: qcsrc/server/w_sniperrifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "^1%s^1 wurde von %s^1 erledigt"
-
 #: qcsrc/server/w_tuba.qc:2
 #, c-format
 msgid "@!#%'n Tuba"
 msgstr "@!#%'n Tuba"
 
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
 #, c-format
 msgid "%s hurt his own ears with the @!#%%'n Tuba"
 msgstr ""
 "%s haben die Ohren geschmerzt von seinem eigenen Spiel auf der @!#%%'n Tuba"
 
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
 #, c-format
 msgid "%s died of %s's great playing on the @!#%%'n Tuba"
 msgstr ""
 "%s ist an seinen Ohrenschmerzen, die von %ss großartigem Spiel auf der @!#"
 "%%'n Tuba stammten, gestorben"
 
-#: qcsrc/server/w_uzi.qc:2
-msgid "Machine Gun"
-msgstr "Machine Gun"
-
 #: qcsrc/server/w_uzi.qc:323
 #, c-format
 msgid "%s was riddled full of holes by %s"
diff --git a/csprogs.dat.it.po b/csprogs.dat.it.po
new file mode 100644 (file)
index 0000000..a65678a
--- /dev/null
@@ -0,0 +1,1991 @@
+# Xonotic CSQC\r
+# Copyright (C) 2011 Team Xonotic\r
+# This file is distributed under the same license as the Xonotic package.\r
+# Felice Sallustio <fel.sallustio@gmail.com>, 2011.\r
+# Antonio 'terencehill' Piu <piuntn@gmail.com>, 2011.\r
+#\r
+msgid ""\r
+msgstr ""\r
+"Project-Id-Version: 0.1preview\n"\r
+"Report-Msgid-Bugs-To: \n"\r
+"POT-Creation-Date: 2011-08-19 16:25+0200\n"\r
+"PO-Revision-Date: 2011-08-19 17:20+0100\n"\r
+"Last-Translator: Antonio 'terencehill' Piu <piuntn@gmail.com>\n"\r
+"Language-Team: Antonio 'terencehill' Piu <piuntn@gmail.com>\n"\r
+"MIME-Version: 1.0\n"\r
+"Content-Type: text/plain; charset=UTF-8\n"\r
+"Content-Transfer-Encoding: 8bit\n"\r
+"Language: it\n"\r
+"X-Poedit-Language: Italian\n"\r
+\r
+#: qcsrc/client/Main.qc:30\r
+msgid "ERROR - MENU IS VISIBLE BUT NO MENU WAS DEFINED!"\r
+msgstr "ERRORE - IL MENU E' VISIBILE MA NESSUN MENU E' STATO DEFINITO!"\r
+\r
+#: qcsrc/client/Main.qc:56\r
+msgid ""\r
+"^3Your engine build is outdated\n"\r
+"^3This Server uses a newer QC VM. Please update!\n"\r
+msgstr ""\r
+"^3La tua versione del motore logico è vecchia\n"\r
+"^3Questo server usa un nuovo QC VM. Per favore aggiornalo!\n"\r
+\r
+#: qcsrc/client/Main.qc:66\r
+#, c-format\r
+msgid "^4CSQC Build information: ^1%s\n"\r
+msgstr "^4Informazioni sulla build CSQC: ^1%s\n"\r
+\r
+#: qcsrc/client/Main.qc:237 qcsrc/client/Main.qc:253\r
+#, c-format\r
+msgid "trying to switch to unsupported team %d\n"\r
+msgstr "tentando di passare al team non supportato %d\n"\r
+\r
+#: qcsrc/client/Main.qc:369 qcsrc/client/scoreboard.qc:241\r
+msgid "Usage:\n"\r
+msgstr "Uso:\n"\r
+\r
+#: qcsrc/client/Main.qc:370\r
+msgid "hud_save configname   (saves to hud_skinname_configname.cfg)\n"\r
+msgstr "hud_save configname   (salva in hud_skinname_configname.cfg)\n"\r
+\r
+#: qcsrc/client/Main.qc:494\r
+msgid "Usage: cl_cmd COMMAND..., where possible commands are:\n"\r
+msgstr "Uso: cl_cmd COMANDO..., dove i possibili comandi sono:\n"\r
+\r
+#: qcsrc/client/Main.qc:495\r
+msgid "  settemp cvar value\n"\r
+msgstr "  settemp cvar value\n"\r
+\r
+#: qcsrc/client/Main.qc:496\r
+msgid "  scoreboard_columns_set ...\n"\r
+msgstr "  scoreboard_columns_set ...\n"\r
+\r
+#: qcsrc/client/Main.qc:497\r
+msgid "  scoreboard_columns_help\n"\r
+msgstr "  scoreboard_columns_help\n"\r
+\r
+#: qcsrc/client/Main.qc:726\r
+#, c-format\r
+msgid "A CSQC entity changed its owner! (edict: %d, classname: %s)\n"\r
+msgstr ""\r
+"Un'entity CSQC ha cambiato il suo proprietario! (edict: %d, classname: %s)\n"\r
+\r
+#: qcsrc/client/Main.qc:964\r
+#, c-format\r
+msgid "A CSQC entity changed its type! (edict: %d, classname: %s)\n"\r
+msgstr "Un'entity CSQC ha cambiato il suo tipo! (edict: %d, classname: %s)\n"\r
+\r
+#: qcsrc/client/Main.qc:1005\r
+#, c-format\r
+msgid ""\r
+"Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: %"\r
+"s)\n"\r
+msgstr ""\r
+"Tipo di entity sconosciuta in CSQC_Ent_Update (enttype: %d, edict: %d, "\r
+"classname: %s)\n"\r
+\r
+#: qcsrc/client/Main.qc:1461\r
+#, c-format\r
+msgid "%s (not bound)"\r
+msgstr "%s (nessun tasto)"\r
+\r
+#: qcsrc/client/Main.qc:1466 qcsrc/client/hud.qc:230\r
+#, c-format\r
+msgid "%s (%s)"\r
+msgstr "%s (%s)"\r
+\r
+#: qcsrc/client/ctf.qc:35\r
+msgid "----- Order Menu -----"\r
+msgstr "----- Menu degli ordini -----"\r
+\r
+#: qcsrc/client/ctf.qc:36\r
+#, c-format\r
+msgid "Order: %s"\r
+msgstr "Ordine: %s"\r
+\r
+#: qcsrc/client/ctf.qc:37\r
+msgid "1) ^3previous page"\r
+msgstr "1) ^3pagina precedente"\r
+\r
+#: qcsrc/client/ctf.qc:38\r
+msgid "2) ^3next page"\r
+msgstr "2) ^3pagina successiva"\r
+\r
+#: qcsrc/client/ctf.qc:55 qcsrc/client/ctf.qc:161\r
+msgid "ESC) Exit Menu"\r
+msgstr "ESC) Esci dal menu"\r
+\r
+#: qcsrc/client/ctf.qc:126\r
+#, c-format\r
+msgid "Couldn't find player %d\n"\r
+msgstr "Impossibile trovare il giocatore %d\n"\r
+\r
+#: qcsrc/client/ctf.qc:154\r
+msgid "----- Command Menu -----"\r
+msgstr "----- Menu dei comandi -----"\r
+\r
+#: qcsrc/client/ctf.qc:155\r
+msgid "Issue orders:"\r
+msgstr "Impartisci ordini:"\r
+\r
+#: qcsrc/client/ctf.qc:156\r
+msgid " 1) Attack"\r
+msgstr " 1) Attacca"\r
+\r
+#: qcsrc/client/ctf.qc:158\r
+msgid " 2) Defend"\r
+msgstr " 2) Difendi"\r
+\r
+#: qcsrc/client/ctf.qc:160\r
+msgid "3) Resign from command."\r
+msgstr "3) Dimettiti dal commando."\r
+\r
+#: qcsrc/client/ctf.qc:212\r
+msgid "You're commander!"\r
+msgstr "Sei il comandante!"\r
+\r
+#: qcsrc/client/ctf.qc:215\r
+msgid "Awaiting orders..."\r
+msgstr "Attendendo ordini..."\r
+\r
+#: qcsrc/client/hud.qc:160\r
+msgid "1st"\r
+msgstr "1°"\r
+\r
+#: qcsrc/client/hud.qc:162\r
+msgid "2nd"\r
+msgstr "2°"\r
+\r
+#: qcsrc/client/hud.qc:164\r
+msgid "3rd"\r
+msgstr "3°"\r
+\r
+#: qcsrc/client/hud.qc:166\r
+#, c-format\r
+msgid "%dth"\r
+msgstr "%d°"\r
+\r
+#: qcsrc/client/hud.qc:198\r
+#, c-format\r
+msgid " (-%dL)"\r
+msgstr " (-%dG)"\r
+\r
+#: qcsrc/client/hud.qc:203\r
+#, c-format\r
+msgid " (+%dL)"\r
+msgstr " (+%dG)"\r
+\r
+#: qcsrc/client/hud.qc:219\r
+msgid "Start line"\r
+msgstr "Linea di partenza"\r
+\r
+#: qcsrc/client/hud.qc:221 qcsrc/client/hud.qc:225\r
+msgid "Finish line"\r
+msgstr "Linea d'arrivo"\r
+\r
+#: qcsrc/client/hud.qc:223\r
+#, c-format\r
+msgid "Intermediate %d"\r
+msgstr "Intermedio %d"\r
+\r
+#: qcsrc/client/hud.qc:232\r
+#, c-format\r
+msgid "%s (%s %s)"\r
+msgstr "%s (%s %s)"\r
+\r
+#: qcsrc/client/hud.qc:735\r
+msgid "Out of ammo"\r
+msgstr "Scarica"\r
+\r
+#: qcsrc/client/hud.qc:739\r
+msgid "Don't have"\r
+msgstr "Mancante"\r
+\r
+#: qcsrc/client/hud.qc:743\r
+msgid "Unavailable"\r
+msgstr "Non disponibile"\r
+\r
+#: qcsrc/client/hud.qc:1476\r
+#, c-format\r
+msgid "^1%s^1 couldn't take it anymore\n"\r
+msgstr "^1%s^1 non ne poteva più\n"\r
+\r
+#: qcsrc/client/hud.qc:1480 qcsrc/client/hud.qc:1784\r
+#, c-format\r
+msgid "^1%s^1 died\n"\r
+msgstr "^1%s^1 è morto\n"\r
+\r
+#: qcsrc/client/hud.qc:1484\r
+#, c-format\r
+msgid "^7%s^7 committed suicide. What's the point of living without ammo?\n"\r
+msgstr ""\r
+"^7%s^7 ha commesso suicidio. Qual'è il motivo di vivere senza munizioni?\n"\r
+\r
+#: qcsrc/client/hud.qc:1488\r
+#, c-format\r
+msgid "^1%s^1 thought they found a nice camping ground\n"\r
+msgstr "^1%s^1 pensava di trovare un bel campeggio\n"\r
+\r
+#: qcsrc/client/hud.qc:1492\r
+#, c-format\r
+msgid "^1%s^1 didn't become friends with the Lord of Teamplay\n"\r
+msgstr "^1%s^1 non è diventato amico del Signore del Teamplay\n"\r
+\r
+#: qcsrc/client/hud.qc:1496\r
+#, c-format\r
+msgid "^1%s^1 unfairly eliminated themself\n"\r
+msgstr "^1%s^1 si è eliminato ingiustamente\n"\r
+\r
+#: qcsrc/client/hud.qc:1500\r
+#, c-format\r
+msgid "^1%s^1 burned to death\n"\r
+msgstr "^1%s^1 è morto bruciato\n"\r
+\r
+#: qcsrc/client/hud.qc:1504\r
+#, c-format\r
+msgid "^1%s^1 couldn't resist the urge to self-destruct\n"\r
+msgstr "^1%s^1 non ha resistito allo stimolo di autodistruggersi\n"\r
+\r
+#: qcsrc/client/hud.qc:1508\r
+#, c-format\r
+msgid "^1%s^1 ended it all after a %d kill spree\n"\r
+msgstr "^1%s^1 l'ha fatta finita con una serie di %d uccisioni\n"\r
+\r
+#: qcsrc/client/hud.qc:1525\r
+#, c-format\r
+msgid "^1%s^1 took action against a team mate\n"\r
+msgstr "^1%s^1 ha agito contro un compagno di squadra\n"\r
+\r
+#: qcsrc/client/hud.qc:1527\r
+#, c-format\r
+msgid "^1%s^1 mows down a team mate\n"\r
+msgstr "^1%s^1 ha falciato un compagno di squadra\n"\r
+\r
+#: qcsrc/client/hud.qc:1532\r
+#, c-format\r
+msgid "^1%s^1 ended a %d scoring spree by going against a team mate\n"\r
+msgstr ""\r
+"^1%s^1 ha concluso una serie di %d punti per esser andato contro un compagno "\r
+"di squadra\n"\r
+\r
+#: qcsrc/client/hud.qc:1534\r
+#, c-format\r
+msgid "^1%s^1 ended a %d kill spree by killing a team mate\n"\r
+msgstr ""\r
+"^1%s^1 ha concluso una serie di %d uccisioni per aver ammazzato un compagno "\r
+"di squadra\n"\r
+\r
+#: qcsrc/client/hud.qc:1538\r
+#, c-format\r
+msgid "^1%s^1's %s scoring spree was ended by a team mate!\n"\r
+msgstr ""\r
+"^1La serie di ^1%s^1 di ^1%s^1 punti è stata conclusa da un compagno di "\r
+"squadra!\n"\r
+\r
+#: qcsrc/client/hud.qc:1540\r
+#, c-format\r
+msgid "^1%s^1's %s kill spree was ended by a team mate!\n"\r
+msgstr ""\r
+"^1La serie di ^1%s ^1di ^1%s ^1uccisioni è stata conclusa da un compagno di "\r
+"squadra!\n"\r
+\r
+#: qcsrc/client/hud.qc:1544\r
+#, c-format\r
+msgid "^1%s^1 drew first blood\n"\r
+msgstr "^1%s^1 ha tratto la prima uccisione\n"\r
+\r
+#: qcsrc/client/hud.qc:1548\r
+#, c-format\r
+msgid "^1%s^1 tried to occupy %s^1's teleport destination space\n"\r
+msgstr ""\r
+"^1%s^1 ha provato a occupare lo spazio di destinazione della teleporta di %"\r
+"s\n"\r
+\r
+#: qcsrc/client/hud.qc:1550\r
+#, c-format\r
+msgid "^1%s^1 was telefragged by %s\n"\r
+msgstr "^1%s^1 è stato telefraggato da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1555\r
+#, c-format\r
+msgid "^1%s^1 was drowned by %s\n"\r
+msgstr "^1%s^1 è stato annegato da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1560\r
+#, c-format\r
+msgid "^1%s^1 was slimed by %s\n"\r
+msgstr "^1%s^1 è stato coperto di melma da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1565\r
+#, c-format\r
+msgid "^1%s^1 was cooked by %s\n"\r
+msgstr "^1%s^1 è stato cucinato da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1570\r
+#, c-format\r
+msgid "^1%s^1 was grounded by %s\n"\r
+msgstr "^1%s^1 è stato messo a terra da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1575\r
+#, c-format\r
+msgid "^1%s^1 was shot into space by %s\n"\r
+msgstr "^1%s^1 è stato buttato nello spazio da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1580\r
+#, c-format\r
+msgid "^1%s^1 was conserved by %s\n"\r
+msgstr "^1%s^1 è stato conservato da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1586\r
+#, c-format\r
+msgid "^1%s^1 was thrown into a world of hurt by %s\n"\r
+msgstr "^1%s^1 è stato lanciato in un mondo di dolore da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1590\r
+#, c-format\r
+msgid "^1%s^1 was crushed by %s\n"\r
+msgstr "^1%s^1 è stato schiacciato da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1594\r
+#, c-format\r
+msgid "^1%s^1 got shredded by %s\n"\r
+msgstr "^1%s^1 è stato triturato da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1598\r
+#, c-format\r
+msgid "^1%s^1 was blasted to bits by %s\n"\r
+msgstr "^1%s^1 è stato disintegrato da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1602\r
+#, c-format\r
+msgid "^1%s^1 got caught in the destruction of %s^1's vehicle\n"\r
+msgstr "^1%s^1 è caduto nella distruzione del veicolo di %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1606\r
+#, c-format\r
+msgid "^1%s^1 was bolted down by %s\n"\r
+msgstr "^1%s^1 è stato imbullonato da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1610\r
+#, c-format\r
+msgid "^1%s^1 could find no shelter from %s^1's rockets\n"\r
+msgstr "^1%s^1 non ha trovato riparo dai razzi di %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1614\r
+#, c-format\r
+msgid "^1%s^1 dies when %s^1's wakizashi dies.\n"\r
+msgstr "^1%s^1 muore mentre il wakizashi di %s^1 muore.\n"\r
+\r
+#: qcsrc/client/hud.qc:1618\r
+#, c-format\r
+msgid "^1%s^1 nailed to hell by %s\n"\r
+msgstr "^1%s^1 è stato inchiodato all'inferno da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1622\r
+#, c-format\r
+msgid "^1%s^1 cluster crushed by %s\n"\r
+msgstr "^1L'ammasso di ^1%s^1 è stato schiacciato da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1626\r
+#, c-format\r
+msgid "^1%s^1 dies when %s^1's raptor dies.\n"\r
+msgstr "^1%s^1 muore mentre il raptor di %s^1 muore.\n"\r
+\r
+#: qcsrc/client/hud.qc:1630\r
+#, c-format\r
+msgid "^1%s^1 was pushed into the line of fire by %s\n"\r
+msgstr "^1%s^1 è stato spinto nella linea di fuoco da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1634\r
+#, c-format\r
+msgid "^1%s^1 was pushed into an accident by %s\n"\r
+msgstr "^1%s^1 è stato spinto in un incidente da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1638\r
+#, c-format\r
+msgid "^1%s^1 was unfairly eliminated by %s\n"\r
+msgstr "^1%s^1 è stato ingiustamente eliminato da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1642\r
+#, c-format\r
+msgid "^1%s^1 was burnt to death by %s\n"\r
+msgstr "^1%s^1 è stato bruciato a morte da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1654\r
+#, c-format\r
+msgid "^1%s^1 was fragged by %s\n"\r
+msgstr "^1%s^1 è stato fraggato da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1659\r
+#, c-format\r
+msgid "^1%s^1's %s scoring spree was ended by %s\n"\r
+msgstr "^1La serie di ^1%s ^1di ^1%s^1 punti è stata conclusa da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1661\r
+#, c-format\r
+msgid "^1%s^1's %s kill spree was ended by %s\n"\r
+msgstr "^1La serie di %s^1 di ^1%s^1 uccisioni è stata conclusa da %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1664\r
+#, c-format\r
+msgid "^1%s^1 made %s scores in a row\n"\r
+msgstr "^1%s^1 ha fatto %s punti di fila\n"\r
+\r
+#: qcsrc/client/hud.qc:1666\r
+#, c-format\r
+msgid "^1%s^1 has %s frags in a row\n"\r
+msgstr "^1%s^1 ha %s frag di fila\n"\r
+\r
+#: qcsrc/client/hud.qc:1669\r
+#, c-format\r
+msgid "%s^7 made a ^1TRIPLE SCORE\n"\r
+msgstr "%s^7 ha realizzato un ^1TRIPLO PUNTO\n"\r
+\r
+#: qcsrc/client/hud.qc:1671\r
+#, c-format\r
+msgid "%s^7 made a ^1TRIPLE FRAG\n"\r
+msgstr "%s^7 ha realizzato un ^1FRAG TRIPLO\n"\r
+\r
+#: qcsrc/client/hud.qc:1674\r
+#, c-format\r
+msgid "%s^7 unleashes ^1SCORING RAGE\n"\r
+msgstr "%s^7 scatena una ^1FURIA DI PUNTI\n"\r
+\r
+#: qcsrc/client/hud.qc:1676\r
+#, c-format\r
+msgid "%s^7 unleashes ^1RAGE\n"\r
+msgstr "%s^7 scatena la propria ^1FURIA\n"\r
+\r
+#: qcsrc/client/hud.qc:1679\r
+#, c-format\r
+msgid "%s^7 made ^1TEN SCORES IN A ROW!\n"\r
+msgstr "%s^7 ha realizzato ^1DIECI PUNTI DI FILA!\n"\r
+\r
+#: qcsrc/client/hud.qc:1681\r
+#, c-format\r
+msgid "%s^7 starts the ^1MASSACRE!\n"\r
+msgstr "%s^7 ha iniziato il ^1MASSACRO!\n"\r
+\r
+#: qcsrc/client/hud.qc:1684\r
+#, c-format\r
+msgid "%s^7 made ^1FIFTEEN SCORES IN A ROW!\n"\r
+msgstr "%s^7 ha realizzato ^QUINDICI PUNTI DI FILA!\n"\r
+\r
+#: qcsrc/client/hud.qc:1686\r
+#, c-format\r
+msgid "%s^7 executes ^1MAYHEM!\n"\r
+msgstr "%s^7 ha eseguito un ^1MAYHEM!\n"\r
+\r
+#: qcsrc/client/hud.qc:1689\r
+#, c-format\r
+msgid "%s^7 made ^1TWENTY SCORES IN A ROW!\n"\r
+msgstr "%s^7 ha realizzato ^1VENTI PUNTI DI FILA!\n"\r
+\r
+#: qcsrc/client/hud.qc:1691\r
+#, c-format\r
+msgid "%s^7 is a ^1BERSERKER!\n"\r
+msgstr "%s^7 è un ^1FEROCE GUERRIERO!\n"\r
+\r
+#: qcsrc/client/hud.qc:1694\r
+#, c-format\r
+msgid "%s^7 made ^1TWENTY FIVE SCORES IN A ROW!\n"\r
+msgstr "%s^7 ha realizzato ^1VENTICINQUE PUNTI DI FILA!\n"\r
+\r
+#: qcsrc/client/hud.qc:1696\r
+#, c-format\r
+msgid "%s^7 inflicts ^1CARNAGE!\n"\r
+msgstr "%s^7 ha fatto una ^1CARNEFICINA!\n"\r
+\r
+#: qcsrc/client/hud.qc:1699\r
+#, c-format\r
+msgid "%s^7 made ^1THIRTY SCORES IN A ROW!\n"\r
+msgstr "%s^7 ha realizzato ^1TRENTA PUNTI DI FILA!\n"\r
+\r
+#: qcsrc/client/hud.qc:1701\r
+#, c-format\r
+msgid "%s^7 unleashes ^1ARMAGEDDON!\n"\r
+msgstr "%s^7 scatena un ^1ARMAGEDDON!\n"\r
+\r
+#: qcsrc/client/hud.qc:1709\r
+#, c-format\r
+msgid "^1%s^1 was in the water for too long\n"\r
+msgstr "^1%s^1 è stato in acqua per troppo tempo\n"\r
+\r
+#: qcsrc/client/hud.qc:1711\r
+#, c-format\r
+msgid "^1%s^1 drowned\n"\r
+msgstr "^1%s^1 è annegato\n"\r
+\r
+#: qcsrc/client/hud.qc:1716\r
+#, c-format\r
+msgid "^1%s^1 was slimed\n"\r
+msgstr "^1%s^1 è stato coperto di melma\n"\r
+\r
+#: qcsrc/client/hud.qc:1722\r
+#, c-format\r
+msgid "^1%s^1 found a hot place\n"\r
+msgstr "^1%s^1 ha trovato un posto caldo\n"\r
+\r
+#: qcsrc/client/hud.qc:1724\r
+#, c-format\r
+msgid "^1%s^1 turned into hot slag\n"\r
+msgstr "^1%s^1 è finito dentro la lava bollente\n"\r
+\r
+#: qcsrc/client/hud.qc:1731\r
+#, c-format\r
+msgid "^1%s^1 tested gravity (and it worked)\n"\r
+msgstr "^1%s^1 ha testato la gravità (e ha funzionato)\n"\r
+\r
+#: qcsrc/client/hud.qc:1733\r
+#, c-format\r
+msgid "^1%s^1 hit the ground with a crunch\n"\r
+msgstr "^1%s^1 ha fatto scricchiolare il terreno\n"\r
+\r
+#: qcsrc/client/hud.qc:1738\r
+#, c-format\r
+msgid "^1%s^1 became a shooting star\n"\r
+msgstr "^1%s^1 è diventato una stella cadente\n"\r
+\r
+#: qcsrc/client/hud.qc:1744\r
+#, c-format\r
+msgid "^1%s^1 discovered a swamp\n"\r
+msgstr "^1%s^1 ha scoperto una palude\n"\r
+\r
+#: qcsrc/client/hud.qc:1746\r
+#, c-format\r
+msgid "^1%s^1 is now conserved for centuries to come\n"\r
+msgstr "^1%s^1 è ora conservato per i secoli a venire\n"\r
+\r
+#: qcsrc/client/hud.qc:1751\r
+#, c-format\r
+msgid "^1%s^1 was mowed down by a turret \n"\r
+msgstr "^1%s^1 è stato falciato da una torretta \n"\r
+\r
+#: qcsrc/client/hud.qc:1763\r
+#, c-format\r
+msgid "^1%s^1 died in an accident\n"\r
+msgstr "^1%s^1 è morto in un incidente\n"\r
+\r
+#: qcsrc/client/hud.qc:1767\r
+#, c-format\r
+msgid "^1%s^1 was unfairly eliminated\n"\r
+msgstr "^1%s^1 è stato ingiustamente eliminato\n"\r
+\r
+#: qcsrc/client/hud.qc:1773\r
+#, c-format\r
+msgid "^1%s^1 felt a little hot\n"\r
+msgstr "^1%s^1 ha sentito un pò di caldo\n"\r
+\r
+#: qcsrc/client/hud.qc:1775\r
+#, c-format\r
+msgid "^1%s^1 burnt to death\n"\r
+msgstr "^1%s^1 è morto bruciato\n"\r
+\r
+#: qcsrc/client/hud.qc:1782\r
+#, c-format\r
+msgid "^1%s^1 needs a restart\n"\r
+msgstr "^1%s^1 ha bisogno di una ripresa\n"\r
+\r
+#: qcsrc/client/hud.qc:1789\r
+#, c-format\r
+msgid "^1%s^1 needs a restart after a %d scoring spree\n"\r
+msgstr "^1%s^1 ha bisogno di una ripresa dopo una serie di %d punti\n"\r
+\r
+#: qcsrc/client/hud.qc:1791\r
+#, c-format\r
+msgid "^1%s^1 died with a %d kill spree\n"\r
+msgstr "^1%s^1 è morto dopo una serie di %d uccisioni\n"\r
+\r
+#: qcsrc/client/hud.qc:1795\r
+#, c-format\r
+msgid "%s^7 got the %s\n"\r
+msgstr "%s^7 ha preso la %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1798\r
+#, c-format\r
+msgid "%s^7 lost the %s\n"\r
+msgstr "%s^7 ha perso la %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1801\r
+#, c-format\r
+msgid "%s^7 picked up the %s\n"\r
+msgstr "%s^7 ha raccolto la %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1804\r
+#, c-format\r
+msgid "%s^7 returned the %s\n"\r
+msgstr "%s^7 ha fatto ritornare la %s\n"\r
+\r
+#: qcsrc/client/hud.qc:1807\r
+#, c-format\r
+msgid "%s^7 captured the %s%s\n"\r
+msgstr "%s^7 ha catturato la %s%s\n"\r
+\r
+#: qcsrc/client/hud.qc:1826\r
+#, c-format\r
+msgid "%s^7 has picked up the ball!\n"\r
+msgstr "%s^7 ha raccolto la palla!\n"\r
+\r
+#: qcsrc/client/hud.qc:1831\r
+#, c-format\r
+msgid "%s^7 has dropped the ball!\n"\r
+msgstr "%s^7 ha rilasciato la palla!\n"\r
+\r
+#: qcsrc/client/hud.qc:1842\r
+#, c-format\r
+msgid "You are now on: %s"\r
+msgstr "Sei ora in: %s"\r
+\r
+#: qcsrc/client/hud.qc:1844\r
+#, c-format\r
+msgid ""\r
+"You have been moved into a different team to improve team balance\n"\r
+"You are now on: %s"\r
+msgstr ""\r
+"Sei stato spostato in una squadra differente per migliorare il bilanciamento "\r
+"delle squadre\n"\r
+"Sei ora in: %s"\r
+\r
+#: qcsrc/client/hud.qc:1847\r
+msgid "^1Reconsider your tactics, camper!"\r
+msgstr "^1Riconsidera le tue tattiche, camper!"\r
+\r
+#: qcsrc/client/hud.qc:1849\r
+msgid "^1Die camper!"\r
+msgstr "^1Muori camper!"\r
+\r
+#: qcsrc/client/hud.qc:1852\r
+msgid "^1You are reinserted into the game for running out of ammo..."\r
+msgstr "^1Sei reinserito nel gioco per mancanza di munizioni..."\r
+\r
+#: qcsrc/client/hud.qc:1854\r
+msgid "^1You were killed for running out of ammo..."\r
+msgstr "^1Sei stato ucciso per mancanza di munizioni..."\r
+\r
+#: qcsrc/client/hud.qc:1857\r
+msgid "^1You need to preserve your health"\r
+msgstr "^1Hai bisogno di preservare la tua vita"\r
+\r
+#: qcsrc/client/hud.qc:1859\r
+msgid "^1You grew too old without taking your medicine"\r
+msgstr "^1Sei diventato troppo vecchio senza prendere le tue medicine"\r
+\r
+#: qcsrc/client/hud.qc:1862\r
+msgid "^1Don't go against team mates!"\r
+msgstr "^1Non andare contro i tuoi compagni di squadra!"\r
+\r
+#: qcsrc/client/hud.qc:1864\r
+msgid "^1Don't shoot your team mates!"\r
+msgstr "^1Non sparare ai tuoi compagni di squadra!"\r
+\r
+#: qcsrc/client/hud.qc:1869\r
+msgid "^1You need to be more careful!"\r
+msgstr "^1Hai bisogno di essere più prudente!"\r
+\r
+#: qcsrc/client/hud.qc:1871\r
+msgid "^1You killed your own dumb self!"\r
+msgstr "^1Ti sei ammazzato da solo, stupido!"\r
+\r
+#: qcsrc/client/hud.qc:1876\r
+#, c-format\r
+msgid "^1Moron! You went against ^7%s^1, a team mate!"\r
+msgstr "^1Idiota! Sei andato contro ^7%s^1, un compagno di squadra!"\r
+\r
+#: qcsrc/client/hud.qc:1878\r
+#, c-format\r
+msgid "^1Moron! You fragged ^7%s^1, a team mate!"\r
+msgstr "^1Idiota! Hai fraggato ^7%s^1, un compagno di squadra!"\r
+\r
+#: qcsrc/client/hud.qc:1882\r
+msgid "^1First score"\r
+msgstr "^1Primo punto"\r
+\r
+#: qcsrc/client/hud.qc:1884\r
+msgid "^1First blood"\r
+msgstr "^1Primo sangue"\r
+\r
+#: qcsrc/client/hud.qc:1888\r
+msgid "^1First casualty"\r
+msgstr "^1Primo incidente"\r
+\r
+#: qcsrc/client/hud.qc:1890\r
+msgid "^1First victim"\r
+msgstr "^1Prima vittima"\r
+\r
+#: qcsrc/client/hud.qc:1894\r
+#, c-format\r
+msgid "^1You scored against ^7%s^1 who was typing!"\r
+msgstr "^1Hai segnato contro ^7%s^1 che stava scrivendo!"\r
+\r
+#: qcsrc/client/hud.qc:1896\r
+#, c-format\r
+msgid "^1You typefragged ^7%s"\r
+msgstr "^1Hai \"typefraggato\" ^7%s"\r
+\r
+#: qcsrc/client/hud.qc:1900\r
+#, c-format\r
+msgid "^1You were scored against by ^7%s^1 while you were typing!"\r
+msgstr "^1Sei stato segnato da ^7%s^1 mentre stavi scrivendo!"\r
+\r
+#: qcsrc/client/hud.qc:1902\r
+#, c-format\r
+msgid "^1You were typefragged by ^7%s"\r
+msgstr "^1Sei stato \"typefraggato\" da ^7%s"\r
+\r
+#: qcsrc/client/hud.qc:1906\r
+#, c-format\r
+msgid "^4You scored against ^7%s"\r
+msgstr "^4Hai segnato contro ^7%s"\r
+\r
+#: qcsrc/client/hud.qc:1908\r
+#, c-format\r
+msgid "^4You fragged ^7%s"\r
+msgstr "^4Hai fraggato ^7%s"\r
+\r
+#: qcsrc/client/hud.qc:1912\r
+#, c-format\r
+msgid "^1You were scored against by ^7%s"\r
+msgstr "^1Sei stato segnato da ^7%s"\r
+\r
+#: qcsrc/client/hud.qc:1914\r
+#, c-format\r
+msgid "^1You were fragged by ^7%s"\r
+msgstr "^1Sei stato fraggato da ^7%s"\r
+\r
+#: qcsrc/client/hud.qc:1919\r
+msgid "^1Watch your step!"\r
+msgstr "^1Attento a dove metti i piedi!"\r
+\r
+#: qcsrc/client/hud.qc:1988 qcsrc/client/hud.qc:1989 qcsrc/client/hud.qc:2474\r
+#, c-format\r
+msgid "Player %d"\r
+msgstr "Giocatore %d"\r
+\r
+#: qcsrc/client/hud.qc:2779\r
+msgid "^1Intermediate 1 (+15.42)"\r
+msgstr "^1Intermedio 1 (+15.42)"\r
+\r
+#: qcsrc/client/hud.qc:2781 qcsrc/client/hud.qc:2823 qcsrc/client/hud.qc:2864\r
+#, c-format\r
+msgid "^1PENALTY: %.1f (%s)"\r
+msgstr "^1PENALITÀ: %.1f (%s)"\r
+\r
+#: qcsrc/client/hud.qc:2866\r
+#, c-format\r
+msgid "^2PENALTY: %.1f (%s)"\r
+msgstr "^2PENALITÀ: %.1f (%s)"\r
+\r
+#: qcsrc/client/hud.qc:2894\r
+msgid "^1You must answer before entering hud configure mode\n"\r
+msgstr ""\r
+"^1Devi rispondere prima di entrare nella modalità di configurazione "\r
+"dell'HUD\n"\r
+\r
+#: qcsrc/client/hud.qc:2897\r
+msgid "^2Name ^7instead of \"^1Unregistered player^7\" in stats"\r
+msgstr "^2Nome ^7invece di \"^1Giocatore non registrato^7\" nelle statistiche"\r
+\r
+#: qcsrc/client/hud.qc:2979\r
+msgid "A vote has been called for:"\r
+msgstr "Un voto è stato chiamato per:"\r
+\r
+#: qcsrc/client/hud.qc:2981\r
+msgid "Allow servers to store and display your name?"\r
+msgstr "Permetti ai server di salvare e visualizzare il tuo nome?"\r
+\r
+#: qcsrc/client/hud.qc:2985\r
+msgid "^1Configure the HUD"\r
+msgstr "^1Configura l'HUD"\r
+\r
+#: qcsrc/client/hud.qc:2989\r
+#, c-format\r
+msgid "Yes (%s): %d"\r
+msgstr "Sì (%s): %d"\r
+\r
+#: qcsrc/client/hud.qc:2991\r
+#, c-format\r
+msgid "No (%s): %d"\r
+msgstr "No (%s): %d"\r
+\r
+#: qcsrc/client/hud.qc:3494 qcsrc/client/hud.qc:3497 qcsrc/client/hud.qc:3499\r
+msgid "Personal best"\r
+msgstr "Miglior personale"\r
+\r
+#: qcsrc/client/hud.qc:3512 qcsrc/client/hud.qc:3515 qcsrc/client/hud.qc:3517\r
+msgid "Server best"\r
+msgstr "Migliori del server"\r
+\r
+#: qcsrc/client/hud.qc:3861\r
+msgid "^3Player^7: This is the chat area."\r
+msgstr "^3Giocatore^7: Questa è l'area della chat."\r
+\r
+#: qcsrc/client/hud.qc:3929\r
+#, c-format\r
+msgid "FPS: %.*f"\r
+msgstr "FPS: %.*f"\r
+\r
+#: qcsrc/client/hud.qc:3996\r
+msgid "^1Observing"\r
+msgstr "^1Osservando"\r
+\r
+#: qcsrc/client/hud.qc:3998\r
+#, c-format\r
+msgid "^1Spectating: ^7%s"\r
+msgstr "^1Assistendo: ^7%s"\r
+\r
+#: qcsrc/client/hud.qc:4002\r
+#, c-format\r
+msgid "^1Press ^3%s^1 to spectate"\r
+msgstr "^1Premi ^3%s^1 per assistere"\r
+\r
+#: qcsrc/client/hud.qc:4004\r
+#, c-format\r
+msgid "^1Press ^3%s^1 for another player"\r
+msgstr "^1Premi ^3%s^1 per un altro giocatore"\r
+\r
+#: qcsrc/client/hud.qc:4008\r
+#, c-format\r
+msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"\r
+msgstr "^1Usa ^3%s^1 o ^3%s^1 per cambiare velocità"\r
+\r
+#: qcsrc/client/hud.qc:4010\r
+#, c-format\r
+msgid "^1Press ^3%s^1 to observe"\r
+msgstr "^1Premi ^3%s^1 per osservare"\r
+\r
+#: qcsrc/client/hud.qc:4013\r
+#, c-format\r
+msgid "^1Press ^3%s^1 for gamemode info"\r
+msgstr "^1Premi ^3%s^1 per le informazioni sulla modalità di gioco"\r
+\r
+#: qcsrc/client/hud.qc:4017\r
+msgid "^1Wait for your turn to join"\r
+msgstr "^1Attendi il tuo turno per entrare"\r
+\r
+#: qcsrc/client/hud.qc:4023\r
+msgid "^1Match has already begun"\r
+msgstr "^1La partita è già iniziata"\r
+\r
+#: qcsrc/client/hud.qc:4025\r
+msgid "^1You have no more lives left"\r
+msgstr "^1Non hai più vite a disposizione"\r
+\r
+#: qcsrc/client/hud.qc:4027 qcsrc/client/hud.qc:4030\r
+#, c-format\r
+msgid "^1Press ^3%s^1 to join"\r
+msgstr "^1Premi ^3%s^1 per entrare"\r
+\r
+#: qcsrc/client/hud.qc:4038\r
+#, c-format\r
+msgid "^1Game starts in ^3%d^1 seconds"\r
+msgstr "^1La partita inizia tra ^3%d^1 secondi"\r
+\r
+#: qcsrc/client/hud.qc:4045\r
+msgid "^2Currently in ^1warmup^2 stage!"\r
+msgstr "^2Attualmente in ^1warmup^2!"\r
+\r
+#: qcsrc/client/hud.qc:4060\r
+#, c-format\r
+msgid "%sPress ^3%s%s to end warmup"\r
+msgstr "%sPremi ^3%s%s per terminare il warmup"\r
+\r
+#: qcsrc/client/hud.qc:4062\r
+#, c-format\r
+msgid "%sPress ^3%s%s once you are ready"\r
+msgstr "%sPremi ^3%s%s una volta che sei pronto"\r
+\r
+#: qcsrc/client/hud.qc:4067\r
+msgid "^2Waiting for others to ready up to end warmup..."\r
+msgstr "^2Attendendo che gli altri siano pronti per terminare il warmup..."\r
+\r
+#: qcsrc/client/hud.qc:4069\r
+msgid "^2Waiting for others to ready up..."\r
+msgstr "^2Attendendo che gli altri siano pronti..."\r
+\r
+#: qcsrc/client/hud.qc:4075\r
+#, c-format\r
+msgid "^2Press ^3%s^2 to end warmup"\r
+msgstr "^2Premi ^3%s^2 per terminare il warmup"\r
+\r
+#: qcsrc/client/hud.qc:4096\r
+msgid "Teamnumbers are unbalanced!"\r
+msgstr "Il numero di giocatori per squadra è sbilanciato!"\r
+\r
+#: qcsrc/client/hud.qc:4101\r
+#, c-format\r
+msgid " Press ^3%s%s to adjust"\r
+msgstr " Premi ^3%s%s per aggiustare"\r
+\r
+#: qcsrc/client/hud.qc:4109\r
+msgid "^7Press ^3ESC ^7to show HUD options."\r
+msgstr "^7Premi ^3ESC ^7per mostrare le opzioni dell'HUD"\r
+\r
+#: qcsrc/client/hud.qc:4111\r
+msgid "^3Doubleclick ^7a panel for panel-specific options."\r
+msgstr "^7Fai ^3doppio-click ^7su un pannello per le sue specifiche opzioni "\r
+\r
+#: qcsrc/client/hud.qc:4113\r
+msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"\r
+msgstr "^3CTRL ^7per disabilitare il test di collisione, ^3SHIFT ^7e"\r
+\r
+#: qcsrc/client/hud.qc:4115\r
+msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."\r
+msgstr "^3ALT ^7+ ^3ARROW KEYS ^7per fini aggiustamenti"\r
+\r
+#: qcsrc/client/hud.qc:4153\r
+msgid " qu/s"\r
+msgstr " qu/s"\r
+\r
+#: qcsrc/client/hud.qc:4157\r
+msgid " m/s"\r
+msgstr " m/s"\r
+\r
+#: qcsrc/client/hud.qc:4161\r
+msgid " km/h"\r
+msgstr " km/h"\r
+\r
+#: qcsrc/client/hud.qc:4165\r
+msgid " mph"\r
+msgstr " mph"\r
+\r
+#: qcsrc/client/hud.qc:4169\r
+msgid " knots"\r
+msgstr " nodi"\r
+\r
+#: qcsrc/client/hud.qc:4814\r
+msgid "Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"\r
+msgstr ""\r
+"Corretti automaticamente numeri di pannello sbagliati/mancanti in "\r
+"_hud_panelorder\n"\r
+\r
+#: qcsrc/client/hud_config.qc:136\r
+#, c-format\r
+msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"\r
+msgstr "^2Esportato con successo in %s! (nota: E' salvato in data/data/)\n"\r
+\r
+#: qcsrc/client/hud_config.qc:140\r
+#, c-format\r
+msgid "^1Couldn't write to %s\n"\r
+msgstr "^1Impossibile scrivere in %s\n"\r
+\r
+#: qcsrc/client/mapvoting.qc:28\r
+msgid " (1 vote)"\r
+msgstr " (1 voto)"\r
+\r
+#: qcsrc/client/mapvoting.qc:30\r
+#, c-format\r
+msgid " (%d votes)"\r
+msgstr " (%d voti)"\r
+\r
+#: qcsrc/client/mapvoting.qc:113\r
+msgid "Don't care"\r
+msgstr "Non importa"\r
+\r
+#: qcsrc/client/mapvoting.qc:194\r
+msgid "Vote for a map"\r
+msgstr "Vota per una mappa"\r
+\r
+#: qcsrc/client/mapvoting.qc:200\r
+#, c-format\r
+msgid "%d seconds left"\r
+msgstr "%d secondi rimanenti"\r
+\r
+#: qcsrc/client/mapvoting.qc:263\r
+msgid ""\r
+"mv_mapdownload: ^3You're not supposed to use this command on your own!\n"\r
+msgstr "mv_mapdownload: ^3Non avrai creduto di poter usare questo comando!\n"\r
+\r
+#: qcsrc/client/mapvoting.qc:273\r
+msgid "^1Error:^7 Couldn't find pak index.\n"\r
+msgstr "^1Errore:^7 Impossibile trovare il pak index.\n"\r
+\r
+#: qcsrc/client/mapvoting.qc:282\r
+msgid "Requesting preview...\n"\r
+msgstr "Richiedendo l'anteprima...\n"\r
+\r
+#: qcsrc/client/miscfunctions.qc:23\r
+msgid "^1Begin!"\r
+msgstr "^1Inizia!"\r
+\r
+#: qcsrc/client/miscfunctions.qc:34\r
+#, c-format\r
+msgid "^1Game starts in %d seconds"\r
+msgstr "^1Il gioco inizia tra %d secondi"\r
+\r
+#: qcsrc/client/miscfunctions.qc:113\r
+msgid "^1RED^7 flag"\r
+msgstr "^7Bandiera ^1ROSSA"\r
+\r
+#: qcsrc/client/miscfunctions.qc:118\r
+msgid "^4BLUE^7 flag"\r
+msgstr "^7Bandiera ^4BLU"\r
+\r
+#: qcsrc/client/miscfunctions.qc:126\r
+#, c-format\r
+msgid "You picked up the %s!"\r
+msgstr "Hai raccolto la %s!"\r
+\r
+#: qcsrc/client/miscfunctions.qc:130\r
+#, c-format\r
+msgid "You got the %s!"\r
+msgstr "Hai preso la %s!"\r
+\r
+#: qcsrc/client/miscfunctions.qc:283\r
+msgid "Trying to remove a team which is not in the teamlist!"\r
+msgstr "Tentando di rimuovere una squadra che non è nella lista delle squadre!"\r
+\r
+#: qcsrc/client/movetypes.qc:163\r
+#, c-format\r
+msgid "Can't unstick an entity (edict: %d, classname: %s, origin: %s)\n"\r
+msgstr "Can't unstick an entity (edict: %d, classname: %s, origin: %s)\n"\r
+\r
+#: qcsrc/client/movetypes.qc:166\r
+#, c-format\r
+msgid "Sucessfully unstuck an entity (edict: %d, classname: %s, origin: %s)\n"\r
+msgstr "Sucessfully unstuck an entity (edict: %d, classname: %s, origin: %s)\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:19\r
+msgid "SCO^bckills"\r
+msgstr "uccisioni pp"\r
+\r
+#: qcsrc/client/scoreboard.qc:20\r
+msgid "SCO^bctime"\r
+msgstr "tempo pp"\r
+\r
+#: qcsrc/client/scoreboard.qc:21\r
+msgid "SCO^caps"\r
+msgstr "SCO^catture"\r
+\r
+#: qcsrc/client/scoreboard.qc:22\r
+msgid "SCO^deaths"\r
+msgstr "SCO^morti"\r
+\r
+#: qcsrc/client/scoreboard.qc:23\r
+msgid "SCO^destroyed"\r
+msgstr "SCO^distrutte"\r
+\r
+#: qcsrc/client/scoreboard.qc:24\r
+msgid "SCO^drops"\r
+msgstr "SCO^cadute"\r
+\r
+#: qcsrc/client/scoreboard.qc:25\r
+msgid "SCO^faults"\r
+msgstr "SCO^falli"\r
+\r
+#: qcsrc/client/scoreboard.qc:26\r
+msgid "SCO^fckills"\r
+msgstr "uccisioni pb"\r
+\r
+#: qcsrc/client/scoreboard.qc:27\r
+msgid "SCO^goals"\r
+msgstr "SCO^gol"\r
+\r
+#: qcsrc/client/scoreboard.qc:28\r
+msgid "SCO^kckills"\r
+msgstr "uccisioni pc"\r
+\r
+#: qcsrc/client/scoreboard.qc:29\r
+msgid "SCO^kdratio"\r
+msgstr "rapporto u/m"\r
+\r
+#: qcsrc/client/scoreboard.qc:30\r
+msgid "SCO^k/d"\r
+msgstr "u/m"\r
+\r
+#: qcsrc/client/scoreboard.qc:31\r
+msgid "SCO^kd"\r
+msgstr "um"\r
+\r
+#: qcsrc/client/scoreboard.qc:32\r
+msgid "SCO^kdr"\r
+msgstr "rum"\r
+\r
+#: qcsrc/client/scoreboard.qc:33\r
+msgid "SCO^kills"\r
+msgstr "SCO^uccisioni"\r
+\r
+#: qcsrc/client/scoreboard.qc:34\r
+msgid "SCO^laps"\r
+msgstr "SCO^giri"\r
+\r
+#: qcsrc/client/scoreboard.qc:35\r
+msgid "SCO^lives"\r
+msgstr "SCO^vite"\r
+\r
+#: qcsrc/client/scoreboard.qc:36\r
+msgid "SCO^losses"\r
+msgstr "SCO^perdute"\r
+\r
+#: qcsrc/client/scoreboard.qc:37\r
+msgid "SCO^name"\r
+msgstr "SCO^nome"\r
+\r
+#: qcsrc/client/scoreboard.qc:38\r
+msgid "SCO^nick"\r
+msgstr "SCO^nick"\r
+\r
+#: qcsrc/client/scoreboard.qc:39\r
+msgid "SCO^objectives"\r
+msgstr "obiettivi"\r
+\r
+#: qcsrc/client/scoreboard.qc:40\r
+msgid "SCO^pickups"\r
+msgstr "SCO^raccolte"\r
+\r
+#: qcsrc/client/scoreboard.qc:41\r
+msgid "SCO^ping"\r
+msgstr "SCO^ping"\r
+\r
+#: qcsrc/client/scoreboard.qc:42\r
+msgid "SCO^pl"\r
+msgstr "SCO^pl"\r
+\r
+#: qcsrc/client/scoreboard.qc:43\r
+msgid "SCO^pushes"\r
+msgstr "SCO^spinte"\r
+\r
+#: qcsrc/client/scoreboard.qc:44\r
+msgid "SCO^rank"\r
+msgstr "SCO^posizione"\r
+\r
+#: qcsrc/client/scoreboard.qc:45\r
+msgid "SCO^returns"\r
+msgstr "SCO^ritorni"\r
+\r
+#: qcsrc/client/scoreboard.qc:46\r
+msgid "SCO^revivals"\r
+msgstr "ravvivamenti"\r
+\r
+#: qcsrc/client/scoreboard.qc:47\r
+msgid "SCO^score"\r
+msgstr "SCO^punti"\r
+\r
+#: qcsrc/client/scoreboard.qc:48\r
+msgid "SCO^suicides"\r
+msgstr "SCO^suicidi"\r
+\r
+#: qcsrc/client/scoreboard.qc:49\r
+msgid "SCO^takes"\r
+msgstr "SCO^presi"\r
+\r
+#: qcsrc/client/scoreboard.qc:50\r
+msgid "SCO^ticks"\r
+msgstr "SCO^tick"\r
+\r
+#: qcsrc/client/scoreboard.qc:239\r
+msgid ""\r
+"You can modify the scoreboard using the ^2scoreboard_columns_set command.\n"\r
+msgstr ""\r
+"Puoi modificare lo scoreboard usando il comando ^2scoreboard_columns_set.\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:240\r
+msgid "^3|---------------------------------------------------------------|\n"\r
+msgstr "^3|---------------------------------------------------------------|\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:242\r
+msgid "^2scoreboard_columns_set default\n"\r
+msgstr "^2scoreboard_columns_set default\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:243\r
+msgid "^2scoreboard_columns_set ^7filed1 field2 ...\n"\r
+msgstr "^2scoreboard_columns_set ^7campo1 campo2 ...\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:244\r
+msgid "The following field names are recognized (case insensitive):\n"\r
+msgstr "I seguenti nomi dei campi sono riconosciuti (non case-sensitive):\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:245\r
+msgid ""\r
+"You can use a ^3|^7 to start the right-aligned fields.\n"\r
+"\n"\r
+msgstr ""\r
+"Puoi usare un ^3|^7 per iniziare i campi allineati a destra.\n"\r
+"\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:247\r
+msgid "^3name^7 or ^3nick^7         Name of a player\n"\r
+msgstr "^3name^7 o ^3nick^7         Nome di un giocatore\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:248\r
+msgid "^3ping^7                     Ping time\n"\r
+msgstr "^3ping^7                     Tempo di ping\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:249\r
+msgid "^3pl^7                       Packet loss\n"\r
+msgstr "^3pl^7                       Pacchetti persi\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:250\r
+msgid "^3kills^7                    Number of kills\n"\r
+msgstr "^3kills^7                    Numero di uccisioni\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:251\r
+msgid "^3deaths^7                   Number of deaths\n"\r
+msgstr "^3deaths^7                   Numero di morti\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:252\r
+msgid "^3suicides^7                 Number of suicides\n"\r
+msgstr "^3suicides^7                 Numero di suicidi\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:253\r
+msgid "^3frags^7                    kills - suicides\n"\r
+msgstr "^3frags^7                    uccisioni - suicidi\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:254\r
+msgid "^3kd^7                       The kill-death ratio\n"\r
+msgstr "^3kd^7                       Rapporto uccisioni-morti\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:255\r
+msgid ""\r
+"^3caps^7                     How often a flag (CTF) or a key (KeyHunt) was "\r
+"captured\n"\r
+msgstr ""\r
+"^3caps^7                     Per quante volte una bandiera (CTF) o una "\r
+"chiave (KeyHunt) è stata catturata\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:256\r
+msgid ""\r
+"^3pickups^7                  How often a flag (CTF) or a key (KeyHunt) or a "\r
+"ball (Keepaway) was picked up\n"\r
+msgstr ""\r
+"^3pickups^7                  Per quante volte una bandiera (CTF) o una "\r
+"chiave (KeyHunt) o una palla (Keepaway) viene raccolta\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:257\r
+msgid "^3fckills^7                  Number of flag carrier kills\n"\r
+msgstr ""\r
+"^3fckills^7                  Numero di uccisioni dei portatori di bandiera\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:258\r
+msgid "^3returns^7                  Number of flag returns\n"\r
+msgstr "^3returns^7                  Numbero di ritorni della bandiera\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:259\r
+msgid "^3drops^7                    Number of flag drops\n"\r
+msgstr "^3drops^7                    Numero di bandiere cadute\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:260\r
+msgid "^3lives^7                    Number of lives (LMS)\n"\r
+msgstr "^3lives^7                    Numero di vite (LMS)\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:261\r
+msgid "^3rank^7                     Player rank\n"\r
+msgstr "^3rank^7                     Posizione del giocatore\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:262\r
+msgid "^3pushes^7                   Number of players pushed into void\n"\r
+msgstr "^3pushes^7                   Numero di giocatori spinti nel vuoto\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:263\r
+msgid ""\r
+"^3destroyed^7                Number of keys destroyed by pushing them into "\r
+"void\n"\r
+msgstr ""\r
+"^3destroyed^7                Numero di chiavi distrutte spingendole nel "\r
+"vuoto\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:264\r
+msgid "^3kckills^7                  Number of keys carrier kills\n"\r
+msgstr ""\r
+"^3kckills^7                  Numero di uccisioni di portatori di chiavi\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:265\r
+msgid "^3losses^7                   Number of times a key was lost\n"\r
+msgstr ""\r
+"^3losses^7                   Numero di volte che una chiave s'è persa\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:266\r
+msgid "^3laps^7                     Number of laps finished (race/cts)\n"\r
+msgstr "^3laps^7                     Numero di giri completati (corsa/cts)\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:267\r
+msgid "^3time^7                     Total time raced (race/cts)\n"\r
+msgstr "^3time^7                     Tempo totale (corsa/cts)\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:268\r
+msgid "^3fastest^7                  Time of fastest lap (race/cts)\n"\r
+msgstr "^3fastest^7                  Tempo del giro più veloce (corsa/cts)\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:269\r
+msgid "^3ticks^7                    Number of ticks (DOM)\n"\r
+msgstr "^3ticks^7                    Numero di tick (DOM)\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:270\r
+msgid "^3takes^7                    Number of domination points taken (DOM)\n"\r
+msgstr "^3takes^7                    Numero di punti di dominio presi (DOM)\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:271\r
+msgid "^3bckills^7                  Number of ball carrier kills\n"\r
+msgstr ""\r
+"^3bckills^7                  Numbero di uccisioni di portatori di palla\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:272\r
+msgid ""\r
+"^3bctime^7                   Total amount of time holding the ball in "\r
+"Keepaway\n"\r
+msgstr ""\r
+"^3bctime^7                   Tempo totale di possesso della palla in "\r
+"Keepaway\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:273\r
+msgid ""\r
+"^3score^7                    Total score\n"\r
+"\n"\r
+msgstr ""\r
+"^3score^7                    Punteggio totale\n"\r
+"\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:275\r
+msgid ""\r
+"Before a field you can put a + or - sign, then a comma separated list\n"\r
+"of game types, then a slash, to make the field show up only in these\n"\r
+"or in all but these game types. You can also specify 'all' as a\n"\r
+"field to show all fields available for the current game mode.\n"\r
+"\n"\r
+msgstr ""\r
+"Prima di un campo puoi mettere il segno + o -, seguito da una lista di tipi "\r
+"di gioco\n"\r
+"separati da virgole, seguita dal segno /, per mostrare il campo solo in "\r
+"questi\n"\r
+"o in tutti tranne questi tipi di gioco. Puoi anche specificare "\r
+"'all' (tutti)\n"\r
+"come campo per mostrare tutti i campi disponibili per l'attuale mdo di "\r
+"gioco.\n"\r
+"\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:280\r
+msgid ""\r
+"The special game type names 'teams' and 'noteams' can be used to\n"\r
+"include/exclude ALL teams/noteams game modes.\n"\r
+"\n"\r
+msgstr ""\r
+"I nomi speciali per il tipo di gioco 'teams' e 'noteams' possono essere "\r
+"usati\n"\r
+"per includere/escludere TUTTE le modalità con team/senza team.\n"\r
+"\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:283\r
+msgid "Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4\n"\r
+msgstr ""\r
+"Esempio: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:284\r
+msgid ""\r
+"will display name, ping and pl aligned to the left, and the fields\n"\r
+"right of the vertical bar aligned to the right.\n"\r
+msgstr ""\r
+"farà visualizzare nome, ping e pl allineati a sinistra, e i campi\n"\r
+"a destra della barra verticale allineati a destra.\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:286\r
+msgid ""\r
+"'field3' will only be shown in CTF, and 'field4' will be shown in all\n"\r
+"other gamemodes except DM.\n"\r
+msgstr ""\r
+"'field3' sarà mostrato solo in CTF, e 'field4' sarà mostrato in tutte\n"\r
+"le altre modalità di gioco eccetto DM.\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:432 qcsrc/client/scoreboard.qc:447\r
+#: qcsrc/client/scoreboard.qc:457 qcsrc/client/scoreboard.qc:466\r
+#: qcsrc/client/scoreboard.qc:475\r
+#, c-format\r
+msgid "fixed missing field '%s'\n"\r
+msgstr "riparato campo mancante '%s'\n"\r
+\r
+#: qcsrc/client/scoreboard.qc:515 qcsrc/client/scoreboard.qc:522\r
+msgid "N/A"\r
+msgstr "N/D"\r
+\r
+#: qcsrc/client/scoreboard.qc:950\r
+#, c-format\r
+msgid "Accuracy stats (average %d%%)"\r
+msgstr "Statistiche precisione (media %d%%)"\r
+\r
+#: qcsrc/client/scoreboard.qc:1015\r
+#, c-format\r
+msgid "%d%%"\r
+msgstr "%d%%"\r
+\r
+#: qcsrc/client/scoreboard.qc:1075\r
+msgid "Rankings"\r
+msgstr "Classifica"\r
+\r
+#: qcsrc/client/scoreboard.qc:1170\r
+msgid "Scoreboard"\r
+msgstr "Tabella dei punteggi"\r
+\r
+#: qcsrc/client/scoreboard.qc:1215\r
+#, c-format\r
+msgid "Speed award: %d ^7(%s^7)"\r
+msgstr "Velocità migliore: %d ^7(%s^7)"\r
+\r
+#: qcsrc/client/scoreboard.qc:1219\r
+#, c-format\r
+msgid "All-time fastest: %d ^7(%s^7)"\r
+msgstr "Tempo più veloce in assoluto: %d ^7(%s^7)"\r
+\r
+#: qcsrc/client/scoreboard.qc:1246 qcsrc/client/teamplay.qc:63\r
+msgid "Spectators"\r
+msgstr "Spettatori"\r
+\r
+#: qcsrc/client/scoreboard.qc:1252\r
+#, c-format\r
+msgid "playing on ^2%s^7"\r
+msgstr "giocando in ^2%s^7"\r
+\r
+#: qcsrc/client/scoreboard.qc:1259 qcsrc/client/scoreboard.qc:1264\r
+#, c-format\r
+msgid " for up to ^1%1.0f minutes^7"\r
+msgstr " fino a ^1%1.0f minuti^7"\r
+\r
+#: qcsrc/client/scoreboard.qc:1268 qcsrc/client/scoreboard.qc:1287\r
+msgid " or"\r
+msgstr " o"\r
+\r
+#: qcsrc/client/scoreboard.qc:1271 qcsrc/client/scoreboard.qc:1278\r
+#, c-format\r
+msgid " until ^3%s %s^7"\r
+msgstr " fino a ^3%s %s^7"\r
+\r
+#: qcsrc/client/scoreboard.qc:1272 qcsrc/client/scoreboard.qc:1279\r
+#: qcsrc/client/scoreboard.qc:1291 qcsrc/client/scoreboard.qc:1298\r
+msgid "SCO^points"\r
+msgstr "SCO^punti"\r
+\r
+#: qcsrc/client/scoreboard.qc:1273 qcsrc/client/scoreboard.qc:1280\r
+#: qcsrc/client/scoreboard.qc:1292 qcsrc/client/scoreboard.qc:1299\r
+msgid "SCO^is beaten"\r
+msgstr "SCO^è battuto"\r
+\r
+#: qcsrc/client/scoreboard.qc:1290 qcsrc/client/scoreboard.qc:1297\r
+#, c-format\r
+msgid " until a lead of ^3%s %s^7"\r
+msgstr " fino a che si vince di ^3%s %s^7"\r
+\r
+#: qcsrc/client/target_music.qc:93 qcsrc/client/target_music.qc:181\r
+#, c-format\r
+msgid "Cannot initialize sound %s\n"\r
+msgstr "Impossibile inizializzare il suono %s\n"\r
+\r
+#: qcsrc/client/teamplay.qc:64\r
+msgid "Red Team"\r
+msgstr "Team Rosso"\r
+\r
+#: qcsrc/client/teamplay.qc:65\r
+msgid "Blue Team"\r
+msgstr "Team Blu"\r
+\r
+#: qcsrc/client/teamplay.qc:66\r
+msgid "Yellow Team"\r
+msgstr "Team Giallo"\r
+\r
+#: qcsrc/client/teamplay.qc:67\r
+msgid "Pink Team"\r
+msgstr "Team Rosa"\r
+\r
+#: qcsrc/client/waypointsprites.qc:254\r
+msgid "Push"\r
+msgstr "Spingi"\r
+\r
+#: qcsrc/client/waypointsprites.qc:255\r
+msgid "Destroy"\r
+msgstr "Distruggi"\r
+\r
+#: qcsrc/client/waypointsprites.qc:256\r
+msgid "Defend"\r
+msgstr "Difendi"\r
+\r
+#: qcsrc/client/waypointsprites.qc:257\r
+msgid "Blue base"\r
+msgstr "Base Blu"\r
+\r
+#: qcsrc/client/waypointsprites.qc:258\r
+msgid "DANGER"\r
+msgstr "PERICOLO"\r
+\r
+#: qcsrc/client/waypointsprites.qc:259\r
+msgid "Flag carrier"\r
+msgstr "Portatore bandiera"\r
+\r
+#: qcsrc/client/waypointsprites.qc:260\r
+msgid "Dropped flag"\r
+msgstr "Bandiera rilasciata"\r
+\r
+#: qcsrc/client/waypointsprites.qc:261\r
+msgid "Help me!"\r
+msgstr "Aiuto!"\r
+\r
+#: qcsrc/client/waypointsprites.qc:262\r
+msgid "Here"\r
+msgstr "Qui"\r
+\r
+#: qcsrc/client/waypointsprites.qc:263\r
+msgid "Dropped key"\r
+msgstr "Chiave rilasciata"\r
+\r
+#: qcsrc/client/waypointsprites.qc:264 qcsrc/client/waypointsprites.qc:266\r
+#: qcsrc/client/waypointsprites.qc:267 qcsrc/client/waypointsprites.qc:268\r
+#: qcsrc/client/waypointsprites.qc:269\r
+msgid "Key carrier"\r
+msgstr "Portatore chiave"\r
+\r
+#: qcsrc/client/waypointsprites.qc:265\r
+msgid "Run here"\r
+msgstr "Corri qui"\r
+\r
+#: qcsrc/client/waypointsprites.qc:270\r
+msgid "Red base"\r
+msgstr "Base Rossa"\r
+\r
+#: qcsrc/client/waypointsprites.qc:271\r
+msgid "Waypoint"\r
+msgstr "Waypoint"\r
+\r
+#: qcsrc/client/waypointsprites.qc:272 qcsrc/client/waypointsprites.qc:273\r
+#: qcsrc/client/waypointsprites.qc:274\r
+msgid "Generator"\r
+msgstr "Generatore"\r
+\r
+#: qcsrc/client/waypointsprites.qc:275 qcsrc/client/waypointsprites.qc:276\r
+#: qcsrc/client/waypointsprites.qc:277 qcsrc/client/waypointsprites.qc:278\r
+#: qcsrc/client/waypointsprites.qc:279 qcsrc/client/waypointsprites.qc:280\r
+#: qcsrc/client/waypointsprites.qc:281 qcsrc/client/waypointsprites.qc:282\r
+#: qcsrc/client/waypointsprites.qc:306 qcsrc/client/waypointsprites.qc:307\r
+#: qcsrc/client/waypointsprites.qc:308 qcsrc/client/waypointsprites.qc:309\r
+#: qcsrc/client/waypointsprites.qc:310\r
+msgid "Control point"\r
+msgstr "Punto di controllo"\r
+\r
+#: qcsrc/client/waypointsprites.qc:283\r
+msgid "Checkpoint"\r
+msgstr "Checkpoint"\r
+\r
+#: qcsrc/client/waypointsprites.qc:284 qcsrc/client/waypointsprites.qc:286\r
+msgid "Finish"\r
+msgstr "Arrivo"\r
+\r
+#: qcsrc/client/waypointsprites.qc:285 qcsrc/client/waypointsprites.qc:286\r
+msgid "Start"\r
+msgstr "Partenza"\r
+\r
+#: qcsrc/client/waypointsprites.qc:287 qcsrc/client/waypointsprites.qc:288\r
+msgid "Ball"\r
+msgstr "Palla"\r
+\r
+#: qcsrc/client/waypointsprites.qc:289\r
+msgid "Ball carrier"\r
+msgstr "Portatore palla"\r
+\r
+#: qcsrc/client/waypointsprites.qc:290 qcsrc/server/w_laser.qc:2\r
+msgid "Laser"\r
+msgstr "Laser"\r
+\r
+#: qcsrc/client/waypointsprites.qc:291 qcsrc/server/w_shotgun.qc:2\r
+msgid "Shotgun"\r
+msgstr "Shotgun"\r
+\r
+#: qcsrc/client/waypointsprites.qc:292 qcsrc/server/w_uzi.qc:2\r
+msgid "Machine Gun"\r
+msgstr "Machine Gun"\r
+\r
+#: qcsrc/client/waypointsprites.qc:293 qcsrc/server/w_grenadelauncher.qc:2\r
+msgid "Mortar"\r
+msgstr "Mortar"\r
+\r
+#: qcsrc/client/waypointsprites.qc:294 qcsrc/server/w_electro.qc:2\r
+msgid "Electro"\r
+msgstr "Electro"\r
+\r
+#: qcsrc/client/waypointsprites.qc:295 qcsrc/server/w_crylink.qc:2\r
+msgid "Crylink"\r
+msgstr "Crylink"\r
+\r
+#: qcsrc/client/waypointsprites.qc:296 qcsrc/server/w_nex.qc:2\r
+msgid "Nex"\r
+msgstr "Nex"\r
+\r
+#: qcsrc/client/waypointsprites.qc:297 qcsrc/server/w_hagar.qc:2\r
+msgid "Hagar"\r
+msgstr "Hagar"\r
+\r
+#: qcsrc/client/waypointsprites.qc:298 qcsrc/server/w_rocketlauncher.qc:2\r
+msgid "Rocket Launcher"\r
+msgstr "Rocket Launcher"\r
+\r
+#: qcsrc/client/waypointsprites.qc:299 qcsrc/server/w_porto.qc:2\r
+msgid "Port-O-Launch"\r
+msgstr "Port-O-Launch"\r
+\r
+#: qcsrc/client/waypointsprites.qc:300\r
+msgid "Minstanex"\r
+msgstr "Minstanex"\r
+\r
+#: qcsrc/client/waypointsprites.qc:301\r
+msgid "Hook"\r
+msgstr "Hook"\r
+\r
+#: qcsrc/client/waypointsprites.qc:302 qcsrc/server/w_fireball.qc:2\r
+msgid "Fireball"\r
+msgstr "Fireball"\r
+\r
+#: qcsrc/client/waypointsprites.qc:303\r
+msgid "HLAC"\r
+msgstr "HLAC"\r
+\r
+#: qcsrc/client/waypointsprites.qc:304 qcsrc/server/w_rifle.qc:2\r
+msgid "Rifle"\r
+msgstr "Fucile"\r
+\r
+#: qcsrc/client/waypointsprites.qc:305 qcsrc/server/w_minelayer.qc:2\r
+msgid "Mine Layer"\r
+msgstr "Mine Layer"\r
+\r
+#: qcsrc/client/waypointsprites.qc:311\r
+msgid "Invisibility"\r
+msgstr "Invisibilità"\r
+\r
+#: qcsrc/client/waypointsprites.qc:312\r
+msgid "Extra life"\r
+msgstr "Vita extra"\r
+\r
+#: qcsrc/client/waypointsprites.qc:313\r
+msgid "Speed"\r
+msgstr "Velocità"\r
+\r
+#: qcsrc/client/waypointsprites.qc:314\r
+msgid "Strength"\r
+msgstr "Forza"\r
+\r
+#: qcsrc/client/waypointsprites.qc:315\r
+msgid "Shield"\r
+msgstr "Scudo"\r
+\r
+#: qcsrc/client/waypointsprites.qc:316\r
+msgid "Fuel regen"\r
+msgstr "Rigeneratore di carburante"\r
+\r
+#: qcsrc/client/waypointsprites.qc:317\r
+msgid "Jet Pack"\r
+msgstr "Jet Pack"\r
+\r
+#: qcsrc/client/waypointsprites.qc:318\r
+msgid "Frozen!"\r
+msgstr "Congelato!"\r
+\r
+#: qcsrc/client/waypointsprites.qc:319\r
+msgid "Tagged"\r
+msgstr "Contrassegnato"\r
+\r
+#: qcsrc/client/waypointsprites.qc:320\r
+msgid "Vehicle"\r
+msgstr "Veicolo"\r
+\r
+#: qcsrc/client/waypointsprites.qc:590\r
+msgid "Spam"\r
+msgstr "Spam"\r
+\r
+#: qcsrc/client/waypointsprites.qc:594\r
+#, c-format\r
+msgid "%s needing help!"\r
+msgstr "%s sta chiedendo aiuto!"\r
+\r
+#: qcsrc/server/w_crylink.qc:664\r
+#, c-format\r
+msgid "%s succeeded at self-destructing themself with the Crylink"\r
+msgstr "%s è riuscito ad autodistruggersi col Crylink"\r
+\r
+#: qcsrc/server/w_crylink.qc:669\r
+#, c-format\r
+msgid "%s could not hide from %s's Crylink"\r
+msgstr "%s non s'è potuto nascondere dal Crylink di %s"\r
+\r
+#: qcsrc/server/w_crylink.qc:671\r
+#, c-format\r
+msgid "%s was too close to %s's Crylink"\r
+msgstr "%s era troppo vicino al Crylink di %s"\r
+\r
+#: qcsrc/server/w_crylink.qc:673\r
+#, c-format\r
+msgid "%s took a close look at %s's Crylink"\r
+msgstr "%s ha visto da vicino il Crylink di %s"\r
+\r
+#: qcsrc/server/w_electro.qc:574\r
+#, c-format\r
+msgid "%s could not remember where they put plasma"\r
+msgstr "%s non s'è ricordato dove aveva messo il plasma"\r
+\r
+#: qcsrc/server/w_electro.qc:576\r
+#, c-format\r
+msgid "%s played with plasma"\r
+msgstr "%s ha giocato col plasma"\r
+\r
+#: qcsrc/server/w_electro.qc:583\r
+#, c-format\r
+msgid "%s just noticed %s's blue ball"\r
+msgstr "%s ha appena notato la palla blu di %s"\r
+\r
+#: qcsrc/server/w_electro.qc:585\r
+#, c-format\r
+msgid "%s got in touch with %s's blue ball"\r
+msgstr "%s è entrato in contatto con la palla blu di %s"\r
+\r
+#: qcsrc/server/w_electro.qc:590\r
+#, c-format\r
+msgid "%s felt the electrifying air of %s's combo"\r
+msgstr "%s ha sentito l'aria elettrificata della combo di %s"\r
+\r
+#: qcsrc/server/w_electro.qc:592\r
+#, c-format\r
+msgid "%s got too close to %s's blue beam"\r
+msgstr "%s s'è avvicinato troppo al raggio blu di %s"\r
+\r
+#: qcsrc/server/w_electro.qc:594\r
+#, c-format\r
+msgid "%s was blasted by %s's blue beam"\r
+msgstr "%s è stato fatto saltare in aria dal raggio blu di %s"\r
+\r
+#: qcsrc/server/w_fireball.qc:417\r
+#, c-format\r
+msgid "%s forgot about some firemine"\r
+msgstr "%s s'è dimenticato di alcune mine infuocate"\r
+\r
+#: qcsrc/server/w_fireball.qc:419 qcsrc/server/w_hlac.qc:240\r
+#, c-format\r
+msgid "%s should have used a smaller gun"\r
+msgstr "%s avrebbe dovuto usare un'arma più piccola"\r
+\r
+#: qcsrc/server/w_fireball.qc:426\r
+#, c-format\r
+msgid "%s tried to catch %s's firemine"\r
+msgstr "%s ha provato a catturare la mina infuocata di %s"\r
+\r
+#: qcsrc/server/w_fireball.qc:428\r
+#, c-format\r
+msgid "%s fatefully ignored %s's firemine"\r
+msgstr "%s ha fatalmente ignorato la mina infuocata di %s"\r
+\r
+#: qcsrc/server/w_fireball.qc:435\r
+#, c-format\r
+msgid "%s could not hide from %s's fireball"\r
+msgstr "%s non è riuscito a nascondersi dalla fireball di %s"\r
+\r
+#: qcsrc/server/w_fireball.qc:437\r
+#, c-format\r
+msgid "%s saw the pretty lights of %s's fireball"\r
+msgstr "%s ha visto le belle luci della fireball di %s"\r
+\r
+#: qcsrc/server/w_fireball.qc:440\r
+#, c-format\r
+msgid "%s got too close to %s's fireball"\r
+msgstr "%s s'è avvicinato troppo alla fireball di %s"\r
+\r
+#: qcsrc/server/w_fireball.qc:442\r
+#, c-format\r
+msgid "%s tasted %s's fireball"\r
+msgstr "%s ha assaggiato la fireball di %s"\r
+\r
+#: qcsrc/server/w_grenadelauncher.qc:383\r
+#, c-format\r
+msgid "%s tried out his own grenade"\r
+msgstr "%s ha provato da solo la propria granata"\r
+\r
+#: qcsrc/server/w_grenadelauncher.qc:385\r
+#, c-format\r
+msgid "%s detonated"\r
+msgstr "%s è detonato"\r
+\r
+#: qcsrc/server/w_grenadelauncher.qc:391\r
+#, c-format\r
+msgid "%s didn't see %s's grenade"\r
+msgstr "%s non ha visto la granata di %s"\r
+\r
+#: qcsrc/server/w_grenadelauncher.qc:393\r
+#, c-format\r
+msgid "%s almost dodged %s's grenade"\r
+msgstr "%s ha quasi schivato la granata di %s"\r
+\r
+#: qcsrc/server/w_grenadelauncher.qc:395\r
+#, c-format\r
+msgid "%s ate %s's grenade"\r
+msgstr "%s ha mangiato la granata di %s"\r
+\r
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655\r
+#, c-format\r
+msgid "%s played with tiny rockets"\r
+msgstr "%s ha giocato con piccoli razzi"\r
+\r
+#: qcsrc/server/w_hagar.qc:386\r
+#, c-format\r
+msgid "%s hoped %s's missiles wouldn't bounce"\r
+msgstr "%s ha sperato che il missile di %s non rimbalzasse"\r
+\r
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661\r
+#, c-format\r
+msgid "%s was pummeled by %s"\r
+msgstr "%s è stato preso a pugni da %s"\r
+\r
+#: qcsrc/server/w_hlac.qc:2\r
+msgid "Heavy Laser Assault Cannon"\r
+msgstr "Heavy Laser Assault Cannon"\r
+\r
+#: qcsrc/server/w_hlac.qc:242\r
+#, c-format\r
+msgid "%s was cut down by %s"\r
+msgstr "%s è stato abbattuto da %s"\r
+\r
+#: qcsrc/server/w_hook.qc:2\r
+msgid "Grappling Hook"\r
+msgstr "Grappling Hook"\r
+\r
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296\r
+#, c-format\r
+msgid "%s did the impossible"\r
+msgstr "%s ha fatto l'impossibile"\r
+\r
+#: qcsrc/server/w_hook.qc:268\r
+#, c-format\r
+msgid "%s has run into %s's gravity bomb"\r
+msgstr "%s è corso nella bomba di gravità di %s"\r
+\r
+#: qcsrc/server/w_laser.qc:311\r
+#, c-format\r
+msgid "%s lasered themself to hell"\r
+msgstr "%s si è \"laserato\" all'inferno"\r
+\r
+#: qcsrc/server/w_laser.qc:315\r
+#, c-format\r
+msgid "%s was cut in half by %s's gauntlet"\r
+msgstr "%s è stato tagliato a metà dal guanto di %s"\r
+\r
+#: qcsrc/server/w_laser.qc:317\r
+#, c-format\r
+msgid "%s was lasered to death by %s"\r
+msgstr "%s è stato \"laserato\" alla morte da %s"\r
+\r
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501\r
+#, c-format\r
+msgid "%s exploded"\r
+msgstr "%s è esploso"\r
+\r
+#: qcsrc/server/w_minelayer.qc:527\r
+#, c-format\r
+msgid "%s got too close to %s's mine"\r
+msgstr "%s s'è avvicinato troppo alla mina di %s"\r
+\r
+#: qcsrc/server/w_minelayer.qc:529\r
+#, c-format\r
+msgid "%s almost dodged %s's mine"\r
+msgstr "%s ha quasi schivato la mina di %s"\r
+\r
+#: qcsrc/server/w_minelayer.qc:531\r
+#, c-format\r
+msgid "%s stepped on %s's mine"\r
+msgstr "%s è passato sopra la mina di %s"\r
+\r
+#: qcsrc/server/w_minstanex.qc:2\r
+msgid "MinstaNex"\r
+msgstr "MinstaNex"\r
+\r
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253\r
+#: qcsrc/server/w_shotgun.qc:209 qcsrc/server/w_uzi.qc:317\r
+#, c-format\r
+msgid "%s is now thinking with portals"\r
+msgstr "%s sta ora pensando con i portali"\r
+\r
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255\r
+#, c-format\r
+msgid "%s has been vaporized by %s"\r
+msgstr "%s è stato vaporizzato da %s"\r
+\r
+#: qcsrc/server/w_porto.qc:298\r
+#, c-format\r
+msgid "%s felt %s doing the impossible to him"\r
+msgstr "%s ha sentito %s fargli l'impossibile"\r
+\r
+#: qcsrc/server/w_rifle.qc:233\r
+#, c-format\r
+msgid "%s shot themself automatically"\r
+msgstr "%s si è sparato da solo automaticamente"\r
+\r
+#: qcsrc/server/w_rifle.qc:235\r
+#, c-format\r
+msgid "%s sniped themself somehow"\r
+msgstr "%s si è fucilato da solo in qualche modo"\r
+\r
+#: qcsrc/server/w_rifle.qc:242\r
+#, c-format\r
+msgid "%s failed to hide from %s's bullet hail"\r
+msgstr "%s non è riuscito a nascondersi dalla raffica di proiettili di %s"\r
+\r
+#: qcsrc/server/w_rifle.qc:244\r
+#, c-format\r
+msgid "%s died in %s's bullet hail"\r
+msgstr "%s è morto nella raffica di proiettili di %s"\r
+\r
+#: qcsrc/server/w_rifle.qc:251\r
+#, c-format\r
+msgid "%s failed to hide from %s's rifle"\r
+msgstr "%s non è riuscito a nascondersi dal fucile di %s"\r
+\r
+#: qcsrc/server/w_rifle.qc:256\r
+#, c-format\r
+msgid "%s got hit in the head by %s"\r
+msgstr "%s ha preso un colpo in testa da %s"\r
+\r
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321\r
+#, c-format\r
+msgid "%s was sniped by %s"\r
+msgstr "%s è stato fucilato da %s"\r
+\r
+#: qcsrc/server/w_rocketlauncher.qc:505\r
+#, c-format\r
+msgid "%s got too close to %s's rocket"\r
+msgstr "%s s'è avvicinato troppo al razzo di %s"\r
+\r
+#: qcsrc/server/w_rocketlauncher.qc:507\r
+#, c-format\r
+msgid "%s almost dodged %s's rocket"\r
+msgstr "%s ha quasi schivato il razzo di %s"\r
+\r
+#: qcsrc/server/w_rocketlauncher.qc:509\r
+#, c-format\r
+msgid "%s ate %s's rocket"\r
+msgstr "%s ha mangiato il razzo di %s"\r
+\r
+#: qcsrc/server/w_seeker.qc:2\r
+msgid "T.A.G. Seeker"\r
+msgstr "T.A.G. Seeker"\r
+\r
+#: qcsrc/server/w_seeker.qc:659\r
+#, c-format\r
+msgid "%s was tagged by %s"\r
+msgstr "%s è stato contrassegnato da %s"\r
+\r
+#: qcsrc/server/w_shotgun.qc:213\r
+#, c-format\r
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"\r
+msgstr "%2$s ^7ha schiaffeggiato %1$s ^7un pò con un grosso ^2shotgun"\r
+\r
+#: qcsrc/server/w_shotgun.qc:215\r
+#, c-format\r
+msgid "%s was gunned by %s"\r
+msgstr "%s è stato sparato da %s"\r
+\r
+#: qcsrc/server/w_tuba.qc:2\r
+#, c-format\r
+msgid "@!#%'n Tuba"\r
+msgstr "@!#%'n Tuba"\r
+\r
+#: qcsrc/server/w_tuba.qc:252\r
+#, c-format\r
+msgid "%s hurt his own ears with the @!#%%'n Tuba"\r
+msgstr "%s s'è fatto male alle orecchie con la @!#%%'n Tuba"\r
+\r
+#: qcsrc/server/w_tuba.qc:256\r
+#, c-format\r
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"\r
+msgstr "%s è morto nella gran esibizione di %s con la @!#%%'n Tuba"\r
+\r
+#: qcsrc/server/w_uzi.qc:323\r
+#, c-format\r
+msgid "%s was riddled full of holes by %s"\r
+msgstr "%s è stato riempito di buchi da %s"\r
index 1f7a47641a3b917fe38b1e04ce0210021236303b..5e4f2016bd01aa6b5e4e93aa9654bf76f49c90c5 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-08-21 14:00+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,1475 +17,1657 @@ msgstr ""
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: qcsrc/client/mapvoting.qc:28
-msgid " (1 vote)"
+#: qcsrc/client/scoreboard.qc:19
+msgid "SCO^bckills"
 msgstr ""
 
-#: qcsrc/client/mapvoting.qc:30
-#, c-format
-msgid " (%d votes)"
+#: qcsrc/client/scoreboard.qc:20
+msgid "SCO^bctime"
 msgstr ""
 
-#: qcsrc/client/mapvoting.qc:113
-msgid "Don't care"
+#: qcsrc/client/scoreboard.qc:21
+msgid "SCO^caps"
 msgstr ""
 
-#: qcsrc/client/mapvoting.qc:194
-msgid "Vote for a map"
+#: qcsrc/client/scoreboard.qc:22
+msgid "SCO^deaths"
 msgstr ""
 
-#: qcsrc/client/mapvoting.qc:199
-#, c-format
-msgid "%d seconds left"
+#: qcsrc/client/scoreboard.qc:23
+msgid "SCO^destroyed"
 msgstr ""
 
-#: qcsrc/client/mapvoting.qc:263
+#: qcsrc/client/scoreboard.qc:24
+msgid "SCO^drops"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:25
+msgid "SCO^faults"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:26
+msgid "SCO^fckills"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:27
+msgid "SCO^goals"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:28
+msgid "SCO^kckills"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:29
+msgid "SCO^kdratio"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:30
+msgid "SCO^k/d"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:31
+msgid "SCO^kd"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:32
+msgid "SCO^kdr"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:33
+msgid "SCO^kills"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:34
+msgid "SCO^laps"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:35
+msgid "SCO^lives"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:36
+msgid "SCO^losses"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:37
+msgid "SCO^name"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:38
+msgid "SCO^nick"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:39
+msgid "SCO^objectives"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:40
+msgid "SCO^pickups"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:41
+msgid "SCO^ping"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:42
+msgid "SCO^pl"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:43
+msgid "SCO^pushes"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:44
+msgid "SCO^rank"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:45
+msgid "SCO^returns"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:46
+msgid "SCO^revivals"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:47
+msgid "SCO^score"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:48
+msgid "SCO^suicides"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:49
+msgid "SCO^takes"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:50
+msgid "SCO^ticks"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:239
 msgid ""
-"mv_mapdownload: ^3You're not supposed to use this command on your own!\n"
+"You can modify the scoreboard using the ^2scoreboard_columns_set command.\n"
 msgstr ""
 
-#: qcsrc/client/mapvoting.qc:273
-msgid "^1Error:^7 Couldn't find pak index.\n"
+#: qcsrc/client/scoreboard.qc:240
+msgid "^3|---------------------------------------------------------------|\n"
 msgstr ""
 
-#: qcsrc/client/mapvoting.qc:282
-msgid "Requesting preview...\n"
+#: qcsrc/client/scoreboard.qc:241 qcsrc/client/Main.qc:369
+msgid "Usage:\n"
 msgstr ""
 
-#: qcsrc/client/Main.qc:30
-msgid "ERROR - MENU IS VISIBLE BUT NO MENU WAS DEFINED!"
+#: qcsrc/client/scoreboard.qc:242
+msgid "^2scoreboard_columns_set default\n"
 msgstr ""
 
-#: qcsrc/client/Main.qc:56
+#: qcsrc/client/scoreboard.qc:243
+msgid "^2scoreboard_columns_set ^7filed1 field2 ...\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:244
+msgid "The following field names are recognized (case insensitive):\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:245
 msgid ""
-"^3Your engine build is outdated\n"
-"^3This Server uses a newer QC VM. Please update!\n"
+"You can use a ^3|^7 to start the right-aligned fields.\n"
+"\n"
 msgstr ""
 
-#: qcsrc/client/Main.qc:66
-#, c-format
-msgid "^4CSQC Build information: ^1%s\n"
+#: qcsrc/client/scoreboard.qc:247
+msgid "^3name^7 or ^3nick^7         Name of a player\n"
 msgstr ""
 
-#: qcsrc/client/Main.qc:232 qcsrc/client/Main.qc:248
-#, c-format
-msgid "trying to switch to unsupported team %d\n"
+#: qcsrc/client/scoreboard.qc:248
+msgid "^3ping^7                     Ping time\n"
 msgstr ""
 
-#: qcsrc/client/Main.qc:364 qcsrc/client/scoreboard.qc:241
-msgid "Usage:\n"
+#: qcsrc/client/scoreboard.qc:249
+msgid "^3pl^7                       Packet loss\n"
 msgstr ""
 
-#: qcsrc/client/Main.qc:365
-msgid "hud_save configname   (saves to hud_skinname_configname.cfg)\n"
+#: qcsrc/client/scoreboard.qc:250
+msgid "^3kills^7                    Number of kills\n"
 msgstr ""
 
-#: qcsrc/client/Main.qc:512
-msgid "Usage: cl_cmd COMMAND..., where possible commands are:\n"
+#: qcsrc/client/scoreboard.qc:251
+msgid "^3deaths^7                   Number of deaths\n"
 msgstr ""
 
-#: qcsrc/client/Main.qc:513
-msgid "  settemp cvar value\n"
+#: qcsrc/client/scoreboard.qc:252
+msgid "^3suicides^7                 Number of suicides\n"
 msgstr ""
 
-#: qcsrc/client/Main.qc:514
-msgid "  scoreboard_columns_set ...\n"
+#: qcsrc/client/scoreboard.qc:253
+msgid "^3frags^7                    kills - suicides\n"
 msgstr ""
 
-#: qcsrc/client/Main.qc:515
-msgid "  scoreboard_columns_help\n"
+#: qcsrc/client/scoreboard.qc:254
+msgid "^3kd^7                       The kill-death ratio\n"
 msgstr ""
 
-#: qcsrc/client/Main.qc:720
-msgid "A CSQC entity changed its owner!\n"
+#: qcsrc/client/scoreboard.qc:255
+msgid ""
+"^3caps^7                     How often a flag (CTF) or a key (KeyHunt) was "
+"captured\n"
 msgstr ""
 
-#: qcsrc/client/Main.qc:934
-msgid "A CSQC entity changed its type!\n"
+#: qcsrc/client/scoreboard.qc:256
+msgid ""
+"^3pickups^7                  How often a flag (CTF) or a key (KeyHunt) or a "
+"ball (Keepaway) was picked up\n"
 msgstr ""
 
-#: qcsrc/client/Main.qc:972
-#, c-format
-msgid "unknown entity type in CSQC_Ent_Update: %d\n"
+#: qcsrc/client/scoreboard.qc:257
+msgid "^3fckills^7                  Number of flag carrier kills\n"
 msgstr ""
 
-#: qcsrc/client/Main.qc:1444
-#, c-format
-msgid "%s (not bound)"
+#: qcsrc/client/scoreboard.qc:258
+msgid "^3returns^7                  Number of flag returns\n"
 msgstr ""
 
-#: qcsrc/client/Main.qc:1449 qcsrc/client/hud.qc:407
-#, c-format
-msgid "%s (%s)"
+#: qcsrc/client/scoreboard.qc:259
+msgid "^3drops^7                    Number of flag drops\n"
 msgstr ""
 
-#: qcsrc/client/target_music.qc:93 qcsrc/client/target_music.qc:181
-#, c-format
-msgid "Cannot initialize sound %s\n"
+#: qcsrc/client/scoreboard.qc:260
+msgid "^3lives^7                    Number of lives (LMS)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:337
-msgid "1st"
+#: qcsrc/client/scoreboard.qc:261
+msgid "^3rank^7                     Player rank\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:339
-msgid "2nd"
+#: qcsrc/client/scoreboard.qc:262
+msgid "^3pushes^7                   Number of players pushed into void\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:341
-msgid "3rd"
+#: qcsrc/client/scoreboard.qc:263
+msgid ""
+"^3destroyed^7                Number of keys destroyed by pushing them into "
+"void\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:343
-#, c-format
-msgid "%dth"
+#: qcsrc/client/scoreboard.qc:264
+msgid "^3kckills^7                  Number of keys carrier kills\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:375
-#, c-format
-msgid " (-%dL)"
+#: qcsrc/client/scoreboard.qc:265
+msgid "^3losses^7                   Number of times a key was lost\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:266
+msgid "^3laps^7                     Number of laps finished (race/cts)\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:267
+msgid "^3time^7                     Total time raced (race/cts)\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:268
+msgid "^3fastest^7                  Time of fastest lap (race/cts)\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:269
+msgid "^3ticks^7                    Number of ticks (DOM)\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:270
+msgid "^3takes^7                    Number of domination points taken (DOM)\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:271
+msgid "^3bckills^7                  Number of ball carrier kills\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:272
+msgid ""
+"^3bctime^7                   Total amount of time holding the ball in "
+"Keepaway\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:273
+msgid ""
+"^3score^7                    Total score\n"
+"\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:275
+msgid ""
+"Before a field you can put a + or - sign, then a comma separated list\n"
+"of game types, then a slash, to make the field show up only in these\n"
+"or in all but these game types. You can also specify 'all' as a\n"
+"field to show all fields available for the current game mode.\n"
+"\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:280
+msgid ""
+"The special game type names 'teams' and 'noteams' can be used to\n"
+"include/exclude ALL teams/noteams game modes.\n"
+"\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:283
+msgid "Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:284
+msgid ""
+"will display name, ping and pl aligned to the left, and the fields\n"
+"right of the vertical bar aligned to the right.\n"
+msgstr ""
+
+#: qcsrc/client/scoreboard.qc:286
+msgid ""
+"'field3' will only be shown in CTF, and 'field4' will be shown in all\n"
+"other gamemodes except DM.\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:380
+#: qcsrc/client/scoreboard.qc:432 qcsrc/client/scoreboard.qc:447
+#: qcsrc/client/scoreboard.qc:457 qcsrc/client/scoreboard.qc:466
+#: qcsrc/client/scoreboard.qc:475
 #, c-format
-msgid " (+%dL)"
+msgid "fixed missing field '%s'\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:396
-msgid "Start line"
+#: qcsrc/client/scoreboard.qc:515 qcsrc/client/scoreboard.qc:522
+msgid "N/A"
 msgstr ""
 
-#: qcsrc/client/hud.qc:398 qcsrc/client/hud.qc:402
-msgid "Finish line"
+#: qcsrc/client/scoreboard.qc:950
+#, c-format
+msgid "Accuracy stats (average %d%%)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:400
+#: qcsrc/client/scoreboard.qc:1015
 #, c-format
-msgid "Intermediate %d"
+msgid "%d%%"
 msgstr ""
 
-#: qcsrc/client/hud.qc:409
-#, c-format
-msgid "%s (%s %s)"
+#: qcsrc/client/scoreboard.qc:1075
+msgid "Rankings"
 msgstr ""
 
-#: qcsrc/client/hud.qc:553
-#, c-format
-msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
+#: qcsrc/client/scoreboard.qc:1170
+msgid "Scoreboard"
 msgstr ""
 
-#: qcsrc/client/hud.qc:557
+#: qcsrc/client/scoreboard.qc:1215
 #, c-format
-msgid "^1Couldn't write to %s\n"
+msgid "Speed award: %d ^7(%s^7)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1837
-msgid "Out of ammo"
+#: qcsrc/client/scoreboard.qc:1219
+#, c-format
+msgid "All-time fastest: %d ^7(%s^7)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1841
-msgid "Don't have"
+#: qcsrc/client/scoreboard.qc:1246 qcsrc/client/teamplay.qc:63
+msgid "Spectators"
 msgstr ""
 
-#: qcsrc/client/hud.qc:1845
-msgid "Unavailable"
+#: qcsrc/client/scoreboard.qc:1252
+#, c-format
+msgid "playing on ^2%s^7"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2696
+#: qcsrc/client/scoreboard.qc:1259 qcsrc/client/scoreboard.qc:1264
 #, c-format
-msgid "^1%s^1 couldn't take it anymore\n"
+msgid " for up to ^1%1.0f minutes^7"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2700 qcsrc/client/hud.qc:2992
-#, c-format
-msgid "^1%s^1 died\n"
+#: qcsrc/client/scoreboard.qc:1268 qcsrc/client/scoreboard.qc:1287
+msgid " or"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2704
+#: qcsrc/client/scoreboard.qc:1271 qcsrc/client/scoreboard.qc:1278
 #, c-format
-msgid "^7%s^7 committed suicide. What's the point of living without ammo?\n"
+msgid " until ^3%s %s^7"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2708
-#, c-format
-msgid "^1%s^1 thought they found a nice camping ground\n"
+#: qcsrc/client/scoreboard.qc:1272 qcsrc/client/scoreboard.qc:1279
+#: qcsrc/client/scoreboard.qc:1291 qcsrc/client/scoreboard.qc:1298
+msgid "SCO^points"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2712
-#, c-format
-msgid "^1%s^1 didn't become friends with the Lord of Teamplay\n"
+#: qcsrc/client/scoreboard.qc:1273 qcsrc/client/scoreboard.qc:1280
+#: qcsrc/client/scoreboard.qc:1292 qcsrc/client/scoreboard.qc:1299
+msgid "SCO^is beaten"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2716
+#: qcsrc/client/scoreboard.qc:1290 qcsrc/client/scoreboard.qc:1297
 #, c-format
-msgid "^1%s^1 unfairly eliminated themself\n"
+msgid " until a lead of ^3%s %s^7"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2720
-#, c-format
-msgid "^1%s^1 burned to death\n"
+#: qcsrc/client/waypointsprites.qc:254
+msgid "Push"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2724
-#, c-format
-msgid "^1%s^1 couldn't resist the urge to self-destruct\n"
+#: qcsrc/client/waypointsprites.qc:255
+msgid "Destroy"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2728
-#, c-format
-msgid "^1%s^1 ended it all after a %d kill spree\n"
+#: qcsrc/client/waypointsprites.qc:256
+msgid "Defend"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2745
-#, c-format
-msgid "^1%s^1 took action against a team mate\n"
+#: qcsrc/client/waypointsprites.qc:257
+msgid "Blue base"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2747
-#, c-format
-msgid "^1%s^1 mows down a team mate\n"
+#: qcsrc/client/waypointsprites.qc:258
+msgid "DANGER"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2752
-#, c-format
-msgid "^1%s^1 ended a %d scoring spree by going against a team mate\n"
+#: qcsrc/client/waypointsprites.qc:259
+msgid "Flag carrier"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2754
-#, c-format
-msgid "^1%s^1 ended a %d kill spree by killing a team mate\n"
+#: qcsrc/client/waypointsprites.qc:260
+msgid "Dropped flag"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2758
-#, c-format
-msgid "^1%s^1's %s scoring spree was ended by a team mate!\n"
+#: qcsrc/client/waypointsprites.qc:261
+msgid "Help me!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2760
-#, c-format
-msgid "^1%s^1's %s kill spree was ended by a team mate!\n"
+#: qcsrc/client/waypointsprites.qc:262
+msgid "Here"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2764
-#, c-format
-msgid "^1%s^1 drew first blood\n"
+#: qcsrc/client/waypointsprites.qc:263
+msgid "Dropped key"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2768
-#, c-format
-msgid "^1%s^1 tried to occupy %s^1's teleport destination space\n"
+#: qcsrc/client/waypointsprites.qc:264 qcsrc/client/waypointsprites.qc:266
+#: qcsrc/client/waypointsprites.qc:267 qcsrc/client/waypointsprites.qc:268
+#: qcsrc/client/waypointsprites.qc:269
+msgid "Key carrier"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2770
-#, c-format
-msgid "^1%s^1 was telefragged by %s\n"
+#: qcsrc/client/waypointsprites.qc:265
+msgid "Run here"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2775
-#, c-format
-msgid "^1%s^1 was drowned by %s\n"
+#: qcsrc/client/waypointsprites.qc:270
+msgid "Red base"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2780
-#, c-format
-msgid "^1%s^1 was slimed by %s\n"
+#: qcsrc/client/waypointsprites.qc:271
+msgid "Waypoint"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2785
-#, c-format
-msgid "^1%s^1 was cooked by %s\n"
+#: qcsrc/client/waypointsprites.qc:272 qcsrc/client/waypointsprites.qc:273
+#: qcsrc/client/waypointsprites.qc:274
+msgid "Generator"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2790
-#, c-format
-msgid "^1%s^1 was grounded by %s\n"
+#: qcsrc/client/waypointsprites.qc:275 qcsrc/client/waypointsprites.qc:276
+#: qcsrc/client/waypointsprites.qc:277 qcsrc/client/waypointsprites.qc:278
+#: qcsrc/client/waypointsprites.qc:279 qcsrc/client/waypointsprites.qc:280
+#: qcsrc/client/waypointsprites.qc:281 qcsrc/client/waypointsprites.qc:282
+#: qcsrc/client/waypointsprites.qc:306 qcsrc/client/waypointsprites.qc:307
+#: qcsrc/client/waypointsprites.qc:308 qcsrc/client/waypointsprites.qc:309
+#: qcsrc/client/waypointsprites.qc:310
+msgid "Control point"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2795
-#, c-format
-msgid "^1%s^1 was shot into space by %s\n"
+#: qcsrc/client/waypointsprites.qc:283
+msgid "Checkpoint"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2800
-#, c-format
-msgid "^1%s^1 was conserved by %s\n"
+#: qcsrc/client/waypointsprites.qc:284 qcsrc/client/waypointsprites.qc:286
+msgid "Finish"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2806
-#, c-format
-msgid "^1%s^1 was thrown into a world of hurt by %s\n"
+#: qcsrc/client/waypointsprites.qc:285 qcsrc/client/waypointsprites.qc:286
+msgid "Start"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2810
-#, c-format
-msgid "^1%s^1 was crushed by %s\n"
+#: qcsrc/client/waypointsprites.qc:287 qcsrc/client/waypointsprites.qc:288
+msgid "Ball"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2814
-#, c-format
-msgid "^1%s^1 got shredded by %s\n"
+#: qcsrc/client/waypointsprites.qc:289
+msgid "Ball carrier"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2818
-#, c-format
-msgid "^1%s^1 was blasted to bits by %s\n"
+#: qcsrc/client/waypointsprites.qc:290 qcsrc/server/w_laser.qc:2
+msgid "Laser"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2822
-#, c-format
-msgid "^1%s^1 got caught in the destruction of %s^1's vehicle\n"
+#: qcsrc/client/waypointsprites.qc:291 qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2826
-#, c-format
-msgid "^1%s^1 was bolted down by %s\n"
+#: qcsrc/client/waypointsprites.qc:292 qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2830
-#, c-format
-msgid "^1%s^1 could find no shelter from %s^1's rockets\n"
+#: qcsrc/client/waypointsprites.qc:293 qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2834
-#, c-format
-msgid "^1%s^1 dies when %s^1's wakizashi dies.\n"
+#: qcsrc/client/waypointsprites.qc:294 qcsrc/server/w_electro.qc:2
+msgid "Electro"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2838
-#, c-format
-msgid "^1%s^1 was pushed into the line of fire by %s\n"
+#: qcsrc/client/waypointsprites.qc:295 qcsrc/server/w_crylink.qc:2
+msgid "Crylink"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2842
-#, c-format
-msgid "^1%s^1 was pushed into an accident by %s\n"
+#: qcsrc/client/waypointsprites.qc:296 qcsrc/server/w_nex.qc:2
+msgid "Nex"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2846
-#, c-format
-msgid "^1%s^1 was unfairly eliminated by %s\n"
+#: qcsrc/client/waypointsprites.qc:297 qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2850
-#, c-format
-msgid "^1%s^1 was burnt to death by %s\n"
+#: qcsrc/client/waypointsprites.qc:298 qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2862
-#, c-format
-msgid "^1%s^1 was fragged by %s\n"
+#: qcsrc/client/waypointsprites.qc:299 qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2867
-#, c-format
-msgid "^1%s^1's %s scoring spree was ended by %s\n"
+#: qcsrc/client/waypointsprites.qc:300
+msgid "Minstanex"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2869
-#, c-format
-msgid "^1%s^1's %s kill spree was ended by %s\n"
+#: qcsrc/client/waypointsprites.qc:301
+msgid "Hook"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2872
-#, c-format
-msgid "^1%s^1 made %s scores in a row\n"
+#: qcsrc/client/waypointsprites.qc:302 qcsrc/server/w_fireball.qc:2
+msgid "Fireball"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2874
-#, c-format
-msgid "^1%s^1 has %s frags in a row\n"
+#: qcsrc/client/waypointsprites.qc:303
+msgid "HLAC"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2877
-#, c-format
-msgid "%s^7 made a ^1TRIPLE SCORE\n"
+#: qcsrc/client/waypointsprites.qc:304 qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2879
-#, c-format
-msgid "%s^7 made a ^1TRIPLE FRAG\n"
+#: qcsrc/client/waypointsprites.qc:305 qcsrc/server/w_minelayer.qc:2
+msgid "Mine Layer"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2882
-#, c-format
-msgid "%s^7 unleashes ^1SCORING RAGE\n"
+#: qcsrc/client/waypointsprites.qc:311
+msgid "Invisibility"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2884
-#, c-format
-msgid "%s^7 unleashes ^1RAGE\n"
+#: qcsrc/client/waypointsprites.qc:312
+msgid "Extra life"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2887
-#, c-format
-msgid "%s^7 made ^1TEN SCORES IN A ROW!\n"
+#: qcsrc/client/waypointsprites.qc:313
+msgid "Speed"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2889
-#, c-format
-msgid "%s^7 starts the ^1MASSACRE!\n"
+#: qcsrc/client/waypointsprites.qc:314
+msgid "Strength"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2892
-#, c-format
-msgid "%s^7 made ^1FIFTEEN SCORES IN A ROW!\n"
+#: qcsrc/client/waypointsprites.qc:315
+msgid "Shield"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2894
-#, c-format
-msgid "%s^7 executes ^1MAYHEM!\n"
+#: qcsrc/client/waypointsprites.qc:316
+msgid "Fuel regen"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2897
-#, c-format
-msgid "%s^7 made ^1TWENTY SCORES IN A ROW!\n"
+#: qcsrc/client/waypointsprites.qc:317
+msgid "Jet Pack"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2899
-#, c-format
-msgid "%s^7 is a ^1BERSERKER!\n"
+#: qcsrc/client/waypointsprites.qc:318
+msgid "Frozen!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2902
-#, c-format
-msgid "%s^7 made ^1TWENTY FIVE SCORES IN A ROW!\n"
+#: qcsrc/client/waypointsprites.qc:319
+msgid "Tagged"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2904
-#, c-format
-msgid "%s^7 inflicts ^1CARNAGE!\n"
+#: qcsrc/client/waypointsprites.qc:320
+msgid "Vehicle"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2907
-#, c-format
-msgid "%s^7 made ^1THIRTY SCORES IN A ROW!\n"
+#: qcsrc/client/waypointsprites.qc:590
+msgid "Spam"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2909
+#: qcsrc/client/waypointsprites.qc:594
 #, c-format
-msgid "%s^7 unleashes ^1ARMAGEDDON!\n"
+msgid "%s needing help!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2917
+#: qcsrc/client/hud_config.qc:136
 #, c-format
-msgid "^1%s^1 was in the water for too long\n"
+msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2919
+#: qcsrc/client/hud_config.qc:140
 #, c-format
-msgid "^1%s^1 drowned\n"
+msgid "^1Couldn't write to %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2924
-#, c-format
-msgid "^1%s^1 was slimed\n"
+#: qcsrc/client/ctf.qc:35
+msgid "----- Order Menu -----"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2930
+#: qcsrc/client/ctf.qc:36
 #, c-format
-msgid "^1%s^1 found a hot place\n"
+msgid "Order: %s"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2932
-#, c-format
-msgid "^1%s^1 turned into hot slag\n"
+#: qcsrc/client/ctf.qc:37
+msgid "1) ^3previous page"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2939
-#, c-format
-msgid "^1%s^1 tested gravity (and it worked)\n"
+#: qcsrc/client/ctf.qc:38
+msgid "2) ^3next page"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2941
-#, c-format
-msgid "^1%s^1 hit the ground with a crunch\n"
+#: qcsrc/client/ctf.qc:55 qcsrc/client/ctf.qc:161
+msgid "ESC) Exit Menu"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2946
+#: qcsrc/client/ctf.qc:126
 #, c-format
-msgid "^1%s^1 became a shooting star\n"
+msgid "Couldn't find player %d\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2952
-#, c-format
-msgid "^1%s^1 discovered a swamp\n"
+#: qcsrc/client/ctf.qc:154
+msgid "----- Command Menu -----"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2954
-#, c-format
-msgid "^1%s^1 is now conserved for centuries to come\n"
+#: qcsrc/client/ctf.qc:155
+msgid "Issue orders:"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2959
-#, c-format
-msgid "^1%s^1 was mowed down by a turret \n"
+#: qcsrc/client/ctf.qc:156
+msgid " 1) Attack"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2971
-#, c-format
-msgid "^1%s^1 died in an accident\n"
+#: qcsrc/client/ctf.qc:158
+msgid " 2) Defend"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2975
-#, c-format
-msgid "^1%s^1 was unfairly eliminated\n"
+#: qcsrc/client/ctf.qc:160
+msgid "3) Resign from command."
 msgstr ""
 
-#: qcsrc/client/hud.qc:2981
-#, c-format
-msgid "^1%s^1 felt a little hot\n"
+#: qcsrc/client/ctf.qc:212
+msgid "You're commander!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2983
-#, c-format
-msgid "^1%s^1 burnt to death\n"
+#: qcsrc/client/ctf.qc:215
+msgid "Awaiting orders..."
 msgstr ""
 
-#: qcsrc/client/hud.qc:2990
-#, c-format
-msgid "^1%s^1 needs a restart\n"
+#: qcsrc/client/Main.qc:30
+msgid "ERROR - MENU IS VISIBLE BUT NO MENU WAS DEFINED!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2997
-#, c-format
-msgid "^1%s^1 needs a restart after a %d scoring spree\n"
+#: qcsrc/client/Main.qc:56
+msgid ""
+"^3Your engine build is outdated\n"
+"^3This Server uses a newer QC VM. Please update!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:2999
+#: qcsrc/client/Main.qc:66
 #, c-format
-msgid "^1%s^1 died with a %d kill spree\n"
+msgid "^4CSQC Build information: ^1%s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3003
+#: qcsrc/client/Main.qc:237 qcsrc/client/Main.qc:253
 #, c-format
-msgid "%s^7 got the %s\n"
+msgid "trying to switch to unsupported team %d\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3006
-#, c-format
-msgid "%s^7 lost the %s\n"
+#: qcsrc/client/Main.qc:370
+msgid "hud_save configname   (saves to hud_skinname_configname.cfg)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3009
-#, c-format
-msgid "%s^7 picked up the %s\n"
+#: qcsrc/client/Main.qc:494
+msgid "Usage: cl_cmd COMMAND..., where possible commands are:\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3012
-#, c-format
-msgid "%s^7 returned the %s\n"
+#: qcsrc/client/Main.qc:495
+msgid "  settemp cvar value\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3015
-#, c-format
-msgid "%s^7 captured the %s%s\n"
+#: qcsrc/client/Main.qc:496
+msgid "  scoreboard_columns_set ...\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3034
-#, c-format
-msgid "%s^7 has picked up the ball!\n"
+#: qcsrc/client/Main.qc:497
+msgid "  scoreboard_columns_help\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3039
+#: qcsrc/client/Main.qc:726
 #, c-format
-msgid "%s^7 has dropped the ball!\n"
+msgid "A CSQC entity changed its owner! (edict: %d, classname: %s)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3052
+#: qcsrc/client/Main.qc:964
 #, c-format
-msgid "You are now on: %s"
+msgid "A CSQC entity changed its type! (edict: %d, classname: %s)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3054
+#: qcsrc/client/Main.qc:1005
 #, c-format
 msgid ""
-"You have been moved into a different team to improve team balance\n"
-"You are now on: %s"
+"Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: "
+"%s)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3057
-msgid "^1Reconsider your tactics, camper!"
+#: qcsrc/client/Main.qc:1461
+#, c-format
+msgid "%s (not bound)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3059
-msgid "^1Die camper!"
+#: qcsrc/client/Main.qc:1466 qcsrc/client/hud.qc:230
+#, c-format
+msgid "%s (%s)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3062
-msgid "^1You are reinserted into the game for running out of ammo..."
+#: qcsrc/client/mapvoting.qc:28
+msgid " (1 vote)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3064
-msgid "^1You were killed for running out of ammo..."
+#: qcsrc/client/mapvoting.qc:30
+#, c-format
+msgid " (%d votes)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3067
-msgid "^1You need to preserve your health"
+#: qcsrc/client/mapvoting.qc:113
+msgid "Don't care"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3069
-msgid "^1You grew too old without taking your medicine"
+#: qcsrc/client/mapvoting.qc:194
+msgid "Vote for a map"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3072
-msgid "^1Don't go against team mates!"
+#: qcsrc/client/mapvoting.qc:200
+#, c-format
+msgid "%d seconds left"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3074
-msgid "^1Don't shoot your team mates!"
+#: qcsrc/client/mapvoting.qc:263
+msgid ""
+"mv_mapdownload: ^3You're not supposed to use this command on your own!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3079
-msgid "^1You need to be more careful!"
+#: qcsrc/client/mapvoting.qc:273
+msgid "^1Error:^7 Couldn't find pak index.\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3081
-msgid "^1You killed your own dumb self!"
+#: qcsrc/client/mapvoting.qc:282
+msgid "Requesting preview...\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3086
+#: qcsrc/client/movetypes.qc:163
 #, c-format
-msgid "^1Moron! You went against %s, a team mate!"
+msgid "Can't unstick an entity (edict: %d, classname: %s, origin: %s)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3088
+#: qcsrc/client/movetypes.qc:166
 #, c-format
-msgid "^1Moron! You fragged %s, a team mate!"
+msgid "Sucessfully unstuck an entity (edict: %d, classname: %s, origin: %s)\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3092
-msgid "^1First score"
-msgstr ""
-
-#: qcsrc/client/hud.qc:3094
-msgid "^1First blood"
+#: qcsrc/client/miscfunctions.qc:23
+msgid "^1Begin!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3098
-msgid "^1First casualty"
+#: qcsrc/client/miscfunctions.qc:34
+#, c-format
+msgid "^1Game starts in %d seconds"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3100
-msgid "^1First victim"
+#: qcsrc/client/miscfunctions.qc:113
+msgid "^1RED^7 flag"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3104
-#, c-format
-msgid "^1You scored against ^7%s^1 who was typing!"
+#: qcsrc/client/miscfunctions.qc:118
+msgid "^4BLUE^7 flag"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3106
+#: qcsrc/client/miscfunctions.qc:126
 #, c-format
-msgid "^1You typefragged ^7%s"
+msgid "You picked up the %s!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3110
+#: qcsrc/client/miscfunctions.qc:130
 #, c-format
-msgid "^1You were scored against by ^7%s^1 while you were typing!"
+msgid "You got the %s!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3112
-#, c-format
-msgid "^1You were typefragged by ^7%s"
+#: qcsrc/client/miscfunctions.qc:283
+msgid "Trying to remove a team which is not in the teamlist!"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3116
-#, c-format
-msgid "^4You scored against ^7%s"
+#: qcsrc/client/teamplay.qc:64
+msgid "Red Team"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3118
-#, c-format
-msgid "^4You fragged ^7%s"
+#: qcsrc/client/teamplay.qc:65
+msgid "Blue Team"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3122
-#, c-format
-msgid "^1You were scored against by ^7%s"
+#: qcsrc/client/teamplay.qc:66
+msgid "Yellow Team"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3124
-#, c-format
-msgid "^1You were fragged by ^7%s"
+#: qcsrc/client/teamplay.qc:67
+msgid "Pink Team"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3129
-msgid "^1Watch your step!"
+#: qcsrc/client/hud.qc:160
+msgid "1st"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3194 qcsrc/client/hud.qc:3195
-#, c-format
-msgid "Player %d"
+#: qcsrc/client/hud.qc:162
+msgid "2nd"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3791
-msgid "^1Intermediate 1 (+15.42)"
+#: qcsrc/client/hud.qc:164
+msgid "3rd"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3793 qcsrc/client/hud.qc:3835 qcsrc/client/hud.qc:3876
+#: qcsrc/client/hud.qc:166
 #, c-format
-msgid "^1PENALTY: %.1f (%s)"
+msgid "%dth"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3878
+#: qcsrc/client/hud.qc:198
 #, c-format
-msgid "^2PENALTY: %.1f (%s)"
-msgstr ""
-
-#: qcsrc/client/hud.qc:3903
-msgid "^2Name ^7instead of \"^1Unregistered player^7\" in stats"
+msgid " (-%dL)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3985
-msgid "A vote has been called for:"
+#: qcsrc/client/hud.qc:203
+#, c-format
+msgid " (+%dL)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3987
-msgid "Allow servers to store and display your name?"
+#: qcsrc/client/hud.qc:219
+msgid "Start line"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3991
-msgid "^1Configure the HUD"
+#: qcsrc/client/hud.qc:221 qcsrc/client/hud.qc:225
+msgid "Finish line"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3995
+#: qcsrc/client/hud.qc:223
 #, c-format
-msgid "Yes (%s): %d"
+msgid "Intermediate %d"
 msgstr ""
 
-#: qcsrc/client/hud.qc:3997
+#: qcsrc/client/hud.qc:232
 #, c-format
-msgid "No (%s): %d"
+msgid "%s (%s %s)"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4510 qcsrc/client/hud.qc:4513 qcsrc/client/hud.qc:4515
-msgid "Personal best"
+#: qcsrc/client/hud.qc:735
+msgid "Out of ammo"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4528 qcsrc/client/hud.qc:4531 qcsrc/client/hud.qc:4533
-msgid "Server best"
+#: qcsrc/client/hud.qc:739
+msgid "Don't have"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4765
-msgid "^3Player^7: This is the chat area."
+#: qcsrc/client/hud.qc:743
+msgid "Unavailable"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4828
+#: qcsrc/client/hud.qc:1476
 #, c-format
-msgid "FPS: %.*f"
+msgid "^1%s^1 couldn't take it anymore\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4893
-msgid "^1Observing"
+#: qcsrc/client/hud.qc:1480 qcsrc/client/hud.qc:1784
+#, c-format
+msgid "^1%s^1 died\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4895
+#: qcsrc/client/hud.qc:1484
 #, c-format
-msgid "^1Spectating: ^7%s"
+msgid "^7%s^7 committed suicide. What's the point of living without ammo?\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4899
+#: qcsrc/client/hud.qc:1488
 #, c-format
-msgid "^1Press ^3%s^1 to spectate"
+msgid "^1%s^1 thought they found a nice camping ground\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4901
+#: qcsrc/client/hud.qc:1492
 #, c-format
-msgid "^1Press ^3%s^1 for another player"
+msgid "^1%s^1 didn't become friends with the Lord of Teamplay\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4905
+#: qcsrc/client/hud.qc:1496
 #, c-format
-msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
+msgid "^1%s^1 unfairly eliminated themself\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4907
+#: qcsrc/client/hud.qc:1500
 #, c-format
-msgid "^1Press ^3%s^1 to observe"
+msgid "^1%s^1 burned to death\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4910
+#: qcsrc/client/hud.qc:1504
 #, c-format
-msgid "^1Press ^3%s^1 for gamemode info"
+msgid "^1%s^1 couldn't resist the urge to self-destruct\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4914
-msgid "^1Wait for your turn to join"
+#: qcsrc/client/hud.qc:1508
+#, c-format
+msgid "^1%s^1 ended it all after a %d kill spree\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4920
-msgid "^1Match has already begun"
+#: qcsrc/client/hud.qc:1525
+#, c-format
+msgid "^1%s^1 took action against a team mate\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4922
-msgid "^1You have no more lives left"
+#: qcsrc/client/hud.qc:1527
+#, c-format
+msgid "^1%s^1 mows down a team mate\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4924 qcsrc/client/hud.qc:4927
+#: qcsrc/client/hud.qc:1532
 #, c-format
-msgid "^1Press ^3%s^1 to join"
+msgid "^1%s^1 ended a %d scoring spree by going against a team mate\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4935
+#: qcsrc/client/hud.qc:1534
 #, c-format
-msgid "^1Game starts in ^3%d^1 seconds"
+msgid "^1%s^1 ended a %d kill spree by killing a team mate\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4942
-msgid "^2Currently in ^1warmup^2 stage!"
+#: qcsrc/client/hud.qc:1538
+#, c-format
+msgid "^1%s^1's %s scoring spree was ended by a team mate!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4957
+#: qcsrc/client/hud.qc:1540
 #, c-format
-msgid "%sPress ^3%s%s to end warmup"
+msgid "^1%s^1's %s kill spree was ended by a team mate!\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4959
+#: qcsrc/client/hud.qc:1544
 #, c-format
-msgid "%sPress ^3%s%s once you are ready"
+msgid "^1%s^1 drew first blood\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4964
-msgid "^2Waiting for others to ready up to end warmup..."
+#: qcsrc/client/hud.qc:1548
+#, c-format
+msgid "^1%s^1 tried to occupy %s^1's teleport destination space\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4966
-msgid "^2Waiting for others to ready up..."
+#: qcsrc/client/hud.qc:1550
+#, c-format
+msgid "^1%s^1 was telefragged by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4972
+#: qcsrc/client/hud.qc:1555
 #, c-format
-msgid "^2Press ^3%s^2 to end warmup"
+msgid "^1%s^1 was drowned by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4993
-msgid "Teamnumbers are unbalanced!"
+#: qcsrc/client/hud.qc:1560
+#, c-format
+msgid "^1%s^1 was slimed by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:4998
+#: qcsrc/client/hud.qc:1565
 #, c-format
-msgid " Press ^3%s%s to adjust"
+msgid "^1%s^1 was cooked by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:5006
-msgid "^7Press ^3ESC ^7to show HUD options."
+#: qcsrc/client/hud.qc:1570
+#, c-format
+msgid "^1%s^1 was grounded by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:5008
-msgid "^3Doubleclick ^7a panel for panel-specific options."
+#: qcsrc/client/hud.qc:1575
+#, c-format
+msgid "^1%s^1 was shot into space by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:5010
-msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
+#: qcsrc/client/hud.qc:1580
+#, c-format
+msgid "^1%s^1 was conserved by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:5012
-msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
+#: qcsrc/client/hud.qc:1586
+#, c-format
+msgid "^1%s^1 was thrown into a world of hurt by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:5037
-msgid " qu/s"
+#: qcsrc/client/hud.qc:1590
+#, c-format
+msgid "^1%s^1 was crushed by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:5041
-msgid " m/s"
+#: qcsrc/client/hud.qc:1594
+#, c-format
+msgid "^1%s^1 got shredded by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:5045
-msgid " km/h"
+#: qcsrc/client/hud.qc:1598
+#, c-format
+msgid "^1%s^1 was blasted to bits by %s\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:5049
-msgid " mph"
+#: qcsrc/client/hud.qc:1602
+#, c-format
+msgid "^1%s^1 got caught in the destruction of %s^1's vehicle\n"
 msgstr ""
 
-#: qcsrc/client/hud.qc:5053
-msgid " knots"
+#: qcsrc/client/hud.qc:1606
+#, c-format
+msgid "^1%s^1 was bolted down by %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:19
-msgid "SCO^bckills"
+#: qcsrc/client/hud.qc:1610
+#, c-format
+msgid "^1%s^1 could find no shelter from %s^1's rockets\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:20
-msgid "SCO^bctime"
+#: qcsrc/client/hud.qc:1614
+#, c-format
+msgid "^1%s^1 dies when %s^1's wakizashi dies.\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:21
-msgid "SCO^caps"
+#: qcsrc/client/hud.qc:1618
+#, c-format
+msgid "^1%s^1 nailed to hell by %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:22
-msgid "SCO^deaths"
+#: qcsrc/client/hud.qc:1622
+#, c-format
+msgid "^1%s^1 cluster crushed by %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:23
-msgid "SCO^destroyed"
+#: qcsrc/client/hud.qc:1626
+#, c-format
+msgid "^1%s^1 dies when %s^1's raptor dies.\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:24
-msgid "SCO^drops"
+#: qcsrc/client/hud.qc:1630
+#, c-format
+msgid "^1%s^1 was pushed into the line of fire by %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:25
-msgid "SCO^faults"
+#: qcsrc/client/hud.qc:1634
+#, c-format
+msgid "^1%s^1 was pushed into an accident by %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:26
-msgid "SCO^fckills"
+#: qcsrc/client/hud.qc:1638
+#, c-format
+msgid "^1%s^1 was unfairly eliminated by %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:27
-msgid "SCO^goals"
+#: qcsrc/client/hud.qc:1642
+#, c-format
+msgid "^1%s^1 was burnt to death by %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:28
-msgid "SCO^kckills"
+#: qcsrc/client/hud.qc:1654
+#, c-format
+msgid "^1%s^1 was fragged by %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:29
-msgid "SCO^kdratio"
+#: qcsrc/client/hud.qc:1659
+#, c-format
+msgid "^1%s^1's %s scoring spree was ended by %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:30
-msgid "SCO^k/d"
+#: qcsrc/client/hud.qc:1661
+#, c-format
+msgid "^1%s^1's %s kill spree was ended by %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:31
-msgid "SCO^kd"
+#: qcsrc/client/hud.qc:1664
+#, c-format
+msgid "^1%s^1 made %s scores in a row\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:32
-msgid "SCO^kdr"
+#: qcsrc/client/hud.qc:1666
+#, c-format
+msgid "^1%s^1 has %s frags in a row\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:33
-msgid "SCO^kills"
+#: qcsrc/client/hud.qc:1669
+#, c-format
+msgid "%s^7 made a ^1TRIPLE SCORE\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:34
-msgid "SCO^laps"
+#: qcsrc/client/hud.qc:1671
+#, c-format
+msgid "%s^7 made a ^1TRIPLE FRAG\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:35
-msgid "SCO^lives"
+#: qcsrc/client/hud.qc:1674
+#, c-format
+msgid "%s^7 unleashes ^1SCORING RAGE\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:36
-msgid "SCO^losses"
+#: qcsrc/client/hud.qc:1676
+#, c-format
+msgid "%s^7 unleashes ^1RAGE\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:37
-msgid "SCO^name"
+#: qcsrc/client/hud.qc:1679
+#, c-format
+msgid "%s^7 made ^1TEN SCORES IN A ROW!\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:38
-msgid "SCO^nick"
+#: qcsrc/client/hud.qc:1681
+#, c-format
+msgid "%s^7 starts the ^1MASSACRE!\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:39
-msgid "SCO^objectives"
+#: qcsrc/client/hud.qc:1684
+#, c-format
+msgid "%s^7 made ^1FIFTEEN SCORES IN A ROW!\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:40
-msgid "SCO^pickups"
+#: qcsrc/client/hud.qc:1686
+#, c-format
+msgid "%s^7 executes ^1MAYHEM!\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:41
-msgid "SCO^ping"
+#: qcsrc/client/hud.qc:1689
+#, c-format
+msgid "%s^7 made ^1TWENTY SCORES IN A ROW!\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:42
-msgid "SCO^pl"
+#: qcsrc/client/hud.qc:1691
+#, c-format
+msgid "%s^7 is a ^1BERSERKER!\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:43
-msgid "SCO^pushes"
+#: qcsrc/client/hud.qc:1694
+#, c-format
+msgid "%s^7 made ^1TWENTY FIVE SCORES IN A ROW!\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:44
-msgid "SCO^rank"
+#: qcsrc/client/hud.qc:1696
+#, c-format
+msgid "%s^7 inflicts ^1CARNAGE!\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:45
-msgid "SCO^returns"
+#: qcsrc/client/hud.qc:1699
+#, c-format
+msgid "%s^7 made ^1THIRTY SCORES IN A ROW!\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:46
-msgid "SCO^revivals"
+#: qcsrc/client/hud.qc:1701
+#, c-format
+msgid "%s^7 unleashes ^1ARMAGEDDON!\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:47
-msgid "SCO^score"
+#: qcsrc/client/hud.qc:1709
+#, c-format
+msgid "^1%s^1 was in the water for too long\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:48
-msgid "SCO^suicides"
+#: qcsrc/client/hud.qc:1711
+#, c-format
+msgid "^1%s^1 drowned\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:49
-msgid "SCO^takes"
+#: qcsrc/client/hud.qc:1716
+#, c-format
+msgid "^1%s^1 was slimed\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:50
-msgid "SCO^ticks"
+#: qcsrc/client/hud.qc:1722
+#, c-format
+msgid "^1%s^1 found a hot place\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:239
-msgid ""
-"You can modify the scoreboard using the ^2scoreboard_columns_set command.\n"
+#: qcsrc/client/hud.qc:1724
+#, c-format
+msgid "^1%s^1 turned into hot slag\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:240
-msgid "^3|---------------------------------------------------------------|\n"
+#: qcsrc/client/hud.qc:1731
+#, c-format
+msgid "^1%s^1 tested gravity (and it worked)\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:242
-msgid "^2scoreboard_columns_set default\n"
+#: qcsrc/client/hud.qc:1733
+#, c-format
+msgid "^1%s^1 hit the ground with a crunch\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:243
-msgid "^2scoreboard_columns_set ^7filed1 field2 ...\n"
+#: qcsrc/client/hud.qc:1738
+#, c-format
+msgid "^1%s^1 became a shooting star\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:244
-msgid "The following field names are recognized (case insensitive):\n"
+#: qcsrc/client/hud.qc:1744
+#, c-format
+msgid "^1%s^1 discovered a swamp\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:245
-msgid ""
-"You can use a ^3|^7 to start the right-aligned fields.\n"
-"\n"
+#: qcsrc/client/hud.qc:1746
+#, c-format
+msgid "^1%s^1 is now conserved for centuries to come\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:247
-msgid "^3name^7 or ^3nick^7         Name of a player\n"
+#: qcsrc/client/hud.qc:1751
+#, c-format
+msgid "^1%s^1 was mowed down by a turret \n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:248
-msgid "^3ping^7                     Ping time\n"
+#: qcsrc/client/hud.qc:1763
+#, c-format
+msgid "^1%s^1 died in an accident\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:249
-msgid "^3pl^7                       Packet loss\n"
+#: qcsrc/client/hud.qc:1767
+#, c-format
+msgid "^1%s^1 was unfairly eliminated\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:250
-msgid "^3kills^7                    Number of kills\n"
+#: qcsrc/client/hud.qc:1773
+#, c-format
+msgid "^1%s^1 felt a little hot\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:251
-msgid "^3deaths^7                   Number of deaths\n"
+#: qcsrc/client/hud.qc:1775
+#, c-format
+msgid "^1%s^1 burnt to death\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:252
-msgid "^3suicides^7                 Number of suicides\n"
+#: qcsrc/client/hud.qc:1782
+#, c-format
+msgid "^1%s^1 needs a restart\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:253
-msgid "^3frags^7                    kills - suicides\n"
+#: qcsrc/client/hud.qc:1789
+#, c-format
+msgid "^1%s^1 needs a restart after a %d scoring spree\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:254
-msgid "^3kd^7                       The kill-death ratio\n"
+#: qcsrc/client/hud.qc:1791
+#, c-format
+msgid "^1%s^1 died with a %d kill spree\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:255
-msgid ""
-"^3caps^7                     How often a flag (CTF) or a key (KeyHunt) was "
-"captured\n"
+#: qcsrc/client/hud.qc:1795
+#, c-format
+msgid "%s^7 got the %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:256
-msgid ""
-"^3pickups^7                  How often a flag (CTF) or a key (KeyHunt) or a "
-"ball (Keepaway) was picked up\n"
+#: qcsrc/client/hud.qc:1798
+#, c-format
+msgid "%s^7 lost the %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:257
-msgid "^3fckills^7                  Number of flag carrier kills\n"
+#: qcsrc/client/hud.qc:1801
+#, c-format
+msgid "%s^7 picked up the %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:258
-msgid "^3returns^7                  Number of flag returns\n"
+#: qcsrc/client/hud.qc:1804
+#, c-format
+msgid "%s^7 returned the %s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:259
-msgid "^3drops^7                    Number of flag drops\n"
+#: qcsrc/client/hud.qc:1807
+#, c-format
+msgid "%s^7 captured the %s%s\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:260
-msgid "^3lives^7                    Number of lives (LMS)\n"
+#: qcsrc/client/hud.qc:1826
+#, c-format
+msgid "%s^7 has picked up the ball!\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:261
-msgid "^3rank^7                     Player rank\n"
+#: qcsrc/client/hud.qc:1831
+#, c-format
+msgid "%s^7 has dropped the ball!\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:262
-msgid "^3pushes^7                   Number of players pushed into void\n"
+#: qcsrc/client/hud.qc:1842
+#, c-format
+msgid "You are now on: %s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:263
+#: qcsrc/client/hud.qc:1844
+#, c-format
 msgid ""
-"^3destroyed^7                Number of keys destroyed by pushing them into "
-"void\n"
+"You have been moved into a different team to improve team balance\n"
+"You are now on: %s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:264
-msgid "^3kckills^7                  Number of keys carrier kills\n"
+#: qcsrc/client/hud.qc:1847
+msgid "^1Reconsider your tactics, camper!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:265
-msgid "^3losses^7                   Number of times a key was lost\n"
+#: qcsrc/client/hud.qc:1849
+msgid "^1Die camper!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:266
-msgid "^3laps^7                     Number of laps finished (race/cts)\n"
+#: qcsrc/client/hud.qc:1852
+msgid "^1You are reinserted into the game for running out of ammo..."
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:267
-msgid "^3time^7                     Total time raced (race/cts)\n"
+#: qcsrc/client/hud.qc:1854
+msgid "^1You were killed for running out of ammo..."
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:268
-msgid "^3fastest^7                  Time of fastest lap (race/cts)\n"
+#: qcsrc/client/hud.qc:1857
+msgid "^1You need to preserve your health"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:269
-msgid "^3ticks^7                    Number of ticks (DOM)\n"
+#: qcsrc/client/hud.qc:1859
+msgid "^1You grew too old without taking your medicine"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:270
-msgid "^3takes^7                    Number of domination points taken (DOM)\n"
+#: qcsrc/client/hud.qc:1862
+msgid "^1Don't go against team mates!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:271
-msgid "^3bckills^7                  Number of ball carrier kills\n"
+#: qcsrc/client/hud.qc:1864
+msgid "^1Don't shoot your team mates!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:272
-msgid ""
-"^3bctime^7                   Total amount of time holding the ball in "
-"Keepaway\n"
+#: qcsrc/client/hud.qc:1869
+msgid "^1You need to be more careful!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:273
-msgid ""
-"^3score^7                    Total score\n"
-"\n"
+#: qcsrc/client/hud.qc:1871
+msgid "^1You killed your own dumb self!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:275
-msgid ""
-"Before a field you can put a + or - sign, then a comma separated list\n"
-"of game types, then a slash, to make the field show up only in these\n"
-"or in all but these game types. You can also specify 'all' as a\n"
-"field to show all fields available for the current game mode.\n"
-"\n"
+#: qcsrc/client/hud.qc:1876
+#, c-format
+msgid "^1Moron! You went against ^7%s^1, a team mate!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:280
-msgid ""
-"The special game type names 'teams' and 'noteams' can be used to\n"
-"include/exclude ALL teams/noteams game modes.\n"
-"\n"
+#: qcsrc/client/hud.qc:1878
+#, c-format
+msgid "^1Moron! You fragged ^7%s^1, a team mate!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:283
-msgid "Example: scoreboard_columns_set name ping pl | +ctf/field3 -dm/field4\n"
+#: qcsrc/client/hud.qc:1882
+msgid "^1First score"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:284
-msgid ""
-"will display name, ping and pl aligned to the left, and the fields\n"
-"right of the vertical bar aligned to the right.\n"
+#: qcsrc/client/hud.qc:1884
+msgid "^1First blood"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:286
-msgid ""
-"'field3' will only be shown in CTF, and 'field4' will be shown in all\n"
-"other gamemodes except DM.\n"
+#: qcsrc/client/hud.qc:1888
+msgid "^1First casualty"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:432 qcsrc/client/scoreboard.qc:447
-#: qcsrc/client/scoreboard.qc:457 qcsrc/client/scoreboard.qc:466
-#: qcsrc/client/scoreboard.qc:475
+#: qcsrc/client/hud.qc:1890
+msgid "^1First victim"
+msgstr ""
+
+#: qcsrc/client/hud.qc:1894
 #, c-format
-msgid "fixed missing field '%s'\n"
+msgid "^1You scored against ^7%s^1 who was typing!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:515 qcsrc/client/scoreboard.qc:522
-msgid "N/A"
+#: qcsrc/client/hud.qc:1896
+#, c-format
+msgid "^1You typefragged ^7%s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:951
+#: qcsrc/client/hud.qc:1900
 #, c-format
-msgid "Accuracy stats (average %d%%)"
+msgid "^1You were scored against by ^7%s^1 while you were typing!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1016
+#: qcsrc/client/hud.qc:1902
 #, c-format
-msgid "%d%%"
+msgid "^1You were typefragged by ^7%s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1076
-msgid "Rankings"
+#: qcsrc/client/hud.qc:1906
+#, c-format
+msgid "^4You scored against ^7%s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1167 qcsrc/client/scoreboard.qc:1169
-msgid "Scoreboard"
+#: qcsrc/client/hud.qc:1908
+#, c-format
+msgid "^4You fragged ^7%s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1210
+#: qcsrc/client/hud.qc:1912
 #, c-format
-msgid "Speed award: %d ^7(%s^7)"
+msgid "^1You were scored against by ^7%s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1214
+#: qcsrc/client/hud.qc:1914
 #, c-format
-msgid "All-time fastest: %d ^7(%s^7)"
+msgid "^1You were fragged by ^7%s"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1241 qcsrc/client/teamplay.qc:55
-msgid "Spectators"
+#: qcsrc/client/hud.qc:1919
+msgid "^1Watch your step!"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1248
+#: qcsrc/client/hud.qc:1988 qcsrc/client/hud.qc:1989 qcsrc/client/hud.qc:2474
 #, c-format
-msgid "playing on ^2%s^7"
+msgid "Player %d"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1255 qcsrc/client/scoreboard.qc:1260
-#, c-format
-msgid " for up to ^1%1.0f minutes^7"
+#: qcsrc/client/hud.qc:2779
+msgid "^1Intermediate 1 (+15.42)"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1264 qcsrc/client/scoreboard.qc:1283
-msgid " or"
+#: qcsrc/client/hud.qc:2781 qcsrc/client/hud.qc:2823 qcsrc/client/hud.qc:2864
+#, c-format
+msgid "^1PENALTY: %.1f (%s)"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1267 qcsrc/client/scoreboard.qc:1274
+#: qcsrc/client/hud.qc:2866
 #, c-format
-msgid " until ^3%s %s^7"
+msgid "^2PENALTY: %.1f (%s)"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1268 qcsrc/client/scoreboard.qc:1275
-#: qcsrc/client/scoreboard.qc:1287 qcsrc/client/scoreboard.qc:1294
-msgid "SCO^points"
+#: qcsrc/client/hud.qc:2894
+msgid "^1You must answer before entering hud configure mode\n"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1269 qcsrc/client/scoreboard.qc:1276
-#: qcsrc/client/scoreboard.qc:1288 qcsrc/client/scoreboard.qc:1295
-msgid "SCO^is beaten"
+#: qcsrc/client/hud.qc:2897
+msgid "^2Name ^7instead of \"^1Unregistered player^7\" in stats"
 msgstr ""
 
-#: qcsrc/client/scoreboard.qc:1286 qcsrc/client/scoreboard.qc:1293
-#, c-format
-msgid " until a lead of ^3%s %s^7"
+#: qcsrc/client/hud.qc:2979
+msgid "A vote has been called for:"
 msgstr ""
 
-#: qcsrc/client/miscfunctions.qc:23
-msgid "^1Begin!"
+#: qcsrc/client/hud.qc:2981
+msgid "Allow servers to store and display your name?"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2985
+msgid "^1Configure the HUD"
+msgstr ""
+
+#: qcsrc/client/hud.qc:2989
+#, c-format
+msgid "Yes (%s): %d"
 msgstr ""
 
-#: qcsrc/client/miscfunctions.qc:34
+#: qcsrc/client/hud.qc:2991
 #, c-format
-msgid "^1Game starts in %d seconds"
+msgid "No (%s): %d"
 msgstr ""
 
-#: qcsrc/client/miscfunctions.qc:113
-msgid "^1RED^7 flag"
+#: qcsrc/client/hud.qc:3494 qcsrc/client/hud.qc:3497 qcsrc/client/hud.qc:3499
+msgid "Personal best"
 msgstr ""
 
-#: qcsrc/client/miscfunctions.qc:118
-msgid "^4BLUE^7 flag"
+#: qcsrc/client/hud.qc:3512 qcsrc/client/hud.qc:3515 qcsrc/client/hud.qc:3517
+msgid "Server best"
 msgstr ""
 
-#: qcsrc/client/miscfunctions.qc:126
-#, c-format
-msgid "You picked up the %s!"
+#: qcsrc/client/hud.qc:3861
+msgid "^3Player^7: This is the chat area."
 msgstr ""
 
-#: qcsrc/client/miscfunctions.qc:130
+#: qcsrc/client/hud.qc:3929
 #, c-format
-msgid "You got the %s!"
+msgid "FPS: %.*f"
 msgstr ""
 
-#: qcsrc/client/miscfunctions.qc:283
-msgid "Trying to remove a team which is not in the teamlist!"
+#: qcsrc/client/hud.qc:3996
+msgid "^1Observing"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:35
-msgid "----- Order Menu -----"
+#: qcsrc/client/hud.qc:3998
+#, c-format
+msgid "^1Spectating: ^7%s"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:36
+#: qcsrc/client/hud.qc:4002
 #, c-format
-msgid "Order: %s"
+msgid "^1Press ^3%s^1 to spectate"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:37
-msgid "1) ^3previous page"
+#: qcsrc/client/hud.qc:4004
+#, c-format
+msgid "^1Press ^3%s^1 for another player"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:38
-msgid "2) ^3next page"
+#: qcsrc/client/hud.qc:4008
+#, c-format
+msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:55 qcsrc/client/ctf.qc:161
-msgid "ESC) Exit Menu"
+#: qcsrc/client/hud.qc:4010
+#, c-format
+msgid "^1Press ^3%s^1 to observe"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:126
+#: qcsrc/client/hud.qc:4013
 #, c-format
-msgid "Couldn't find player %d\n"
+msgid "^1Press ^3%s^1 for gamemode info"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:154
-msgid "----- Command Menu -----"
+#: qcsrc/client/hud.qc:4017
+msgid "^1Wait for your turn to join"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:155
-msgid "Issue orders:"
+#: qcsrc/client/hud.qc:4023
+msgid "^1Match has already begun"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:156
-msgid " 1) Attack"
+#: qcsrc/client/hud.qc:4025
+msgid "^1You have no more lives left"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:158
-msgid " 2) Defend"
+#: qcsrc/client/hud.qc:4027 qcsrc/client/hud.qc:4030
+#, c-format
+msgid "^1Press ^3%s^1 to join"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:160
-msgid "3) Resign from command."
+#: qcsrc/client/hud.qc:4038
+#, c-format
+msgid "^1Game starts in ^3%d^1 seconds"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:212
-msgid "You're commander!"
+#: qcsrc/client/hud.qc:4045
+msgid "^2Currently in ^1warmup^2 stage!"
 msgstr ""
 
-#: qcsrc/client/ctf.qc:215
-msgid "Awaiting orders..."
+#: qcsrc/client/hud.qc:4060
+#, c-format
+msgid "%sPress ^3%s%s to end warmup"
 msgstr ""
 
-#: qcsrc/client/teamplay.qc:56
-msgid "Red Team"
+#: qcsrc/client/hud.qc:4062
+#, c-format
+msgid "%sPress ^3%s%s once you are ready"
 msgstr ""
 
-#: qcsrc/client/teamplay.qc:57
-msgid "Blue Team"
+#: qcsrc/client/hud.qc:4067
+msgid "^2Waiting for others to ready up to end warmup..."
 msgstr ""
 
-#: qcsrc/client/teamplay.qc:58
-msgid "Yellow Team"
+#: qcsrc/client/hud.qc:4069
+msgid "^2Waiting for others to ready up..."
 msgstr ""
 
-#: qcsrc/client/teamplay.qc:59
-msgid "Pink Team"
+#: qcsrc/client/hud.qc:4075
+#, c-format
+msgid "^2Press ^3%s^2 to end warmup"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:2
-msgid "Fireball"
+#: qcsrc/client/hud.qc:4096
+msgid "Teamnumbers are unbalanced!"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:417
+#: qcsrc/client/hud.qc:4101
 #, c-format
-msgid "%s forgot about some firemine"
+msgid " Press ^3%s%s to adjust"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:419 qcsrc/server/w_hlac.qc:240
-#, c-format
-msgid "%s should have used a smaller gun"
+#: qcsrc/client/hud.qc:4109
+msgid "^7Press ^3ESC ^7to show HUD options."
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:426
-#, c-format
-msgid "%s tried to catch %s's firemine"
+#: qcsrc/client/hud.qc:4111
+msgid "^3Doubleclick ^7a panel for panel-specific options."
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:428
-#, c-format
-msgid "%s fatefully ignored %s's firemine"
+#: qcsrc/client/hud.qc:4113
+msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:435
-#, c-format
-msgid "%s could not hide from %s's fireball"
+#: qcsrc/client/hud.qc:4115
+msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:437
-#, c-format
-msgid "%s saw the pretty lights of %s's fireball"
+#: qcsrc/client/hud.qc:4153
+msgid " qu/s"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:440
-#, c-format
-msgid "%s got too close to %s's fireball"
+#: qcsrc/client/hud.qc:4157
+msgid " m/s"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:442
-#, c-format
-msgid "%s tasted %s's fireball"
+#: qcsrc/client/hud.qc:4161
+msgid " km/h"
 msgstr ""
 
-#: qcsrc/server/w_nex.qc:2
-msgid "Nex"
+#: qcsrc/client/hud.qc:4165
+msgid " mph"
 msgstr ""
 
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_shotgun.qc:203
-#: qcsrc/server/w_uzi.qc:317 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_porto.qc:296 qcsrc/server/w_hook.qc:266
-#, c-format
-msgid "%s did the impossible"
+#: qcsrc/client/hud.qc:4169
+msgid " knots"
 msgstr ""
 
-#: qcsrc/server/w_nex.qc:269 qcsrc/server/w_minstanex.qc:292
-#, c-format
-msgid "%s has been vaporized by %s"
+#: qcsrc/client/hud.qc:4814
+msgid "Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:2
-msgid "Laser"
+#: qcsrc/client/target_music.qc:93 qcsrc/client/target_music.qc:181
+#, c-format
+msgid "Cannot initialize sound %s\n"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_rifle.qc:233
 #, c-format
-msgid "%s lasered themself to hell"
+msgid "%s shot themself automatically"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_rifle.qc:235
 #, c-format
-msgid "%s was cut in half by %s's gauntlet"
+msgid "%s sniped themself somehow"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_rifle.qc:242
 #, c-format
-msgid "%s was lasered to death by %s"
+msgid "%s failed to hide from %s's bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:2
-msgid "Shotgun"
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_rifle.qc:251
 #, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgid "%s failed to hide from %s's rifle"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_rifle.qc:256
 #, c-format
-msgid "%s was gunned by %s"
+msgid "%s got hit in the head by %s"
 msgstr ""
 
-#: qcsrc/server/w_uzi.qc:2
-msgid "Machine Gun"
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
 msgstr ""
 
-#: qcsrc/server/w_uzi.qc:321 qcsrc/server/w_sniperrifle.qc:254
+#: qcsrc/server/w_uzi.qc:317 qcsrc/server/w_shotgun.qc:215
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
 #, c-format
-msgid "%s was sniped by %s"
+msgid "%s is now thinking with portals"
 msgstr ""
 
 #: qcsrc/server/w_uzi.qc:323
@@ -1493,128 +1675,127 @@ msgstr ""
 msgid "%s was riddled full of holes by %s"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:2
-msgid "Sniper Rifle"
-msgstr ""
-
-#: qcsrc/server/w_sniperrifle.qc:229
+#: qcsrc/server/w_rocketlauncher.qc:501 qcsrc/server/w_minelayer.qc:523
 #, c-format
-msgid "%s shot themself automatically"
+msgid "%s exploded"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:231
+#: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
-msgid "%s sniped themself somehow"
+msgid "%s got too close to %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:238
+#: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
-msgid "%s failed to hide from %s's bullet hail"
+msgid "%s almost dodged %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:240
+#: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
-msgid "%s died in %s's bullet hail"
+msgid "%s ate %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:247
+#: qcsrc/server/w_porto.qc:296 qcsrc/server/w_hook.qc:266
 #, c-format
-msgid "%s failed to hide from %s's rifle"
+msgid "%s did the impossible"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:252
+#: qcsrc/server/w_porto.qc:298
 #, c-format
-msgid "%s got hit in the head by %s"
+msgid "%s felt %s doing the impossible to him"
 msgstr ""
 
-#: qcsrc/server/w_minstanex.qc:2
-msgid "MinstaNex"
+#: qcsrc/server/w_hook.qc:2
+msgid "Grappling Hook"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:2
-msgid "Electro"
+#: qcsrc/server/w_hook.qc:268
+#, c-format
+msgid "%s has run into %s's gravity bomb"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
 #, c-format
 msgid "%s could not remember where they put plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
 #, c-format
 msgid "%s played with plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
 #, c-format
 msgid "%s just noticed %s's blue ball"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
 #, c-format
 msgid "%s got in touch with %s's blue ball"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
 #, c-format
 msgid "%s felt the electrifying air of %s's combo"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
 #, c-format
 msgid "%s got too close to %s's blue beam"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
 #, c-format
 msgid "%s was blasted by %s's blue beam"
 msgstr ""
 
-#: qcsrc/server/w_tuba.qc:2
+#: qcsrc/server/w_laser.qc:311
 #, c-format
-msgid "@!#%'n Tuba"
+msgid "%s lasered themself to hell"
 msgstr ""
 
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_laser.qc:315
 #, c-format
-msgid "%s hurt his own ears with the @!#%%'n Tuba"
+msgid "%s was cut in half by %s's gauntlet"
 msgstr ""
 
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_laser.qc:317
 #, c-format
-msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+msgid "%s was lasered to death by %s"
 msgstr ""
 
-#: qcsrc/server/w_porto.qc:2
-msgid "Port-O-Launch"
+#: qcsrc/server/w_shotgun.qc:219
+#, c-format
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
 msgstr ""
 
-#: qcsrc/server/w_porto.qc:298
+#: qcsrc/server/w_shotgun.qc:221
 #, c-format
-msgid "%s felt %s doing the impossible to him"
+msgid "%s was gunned by %s"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:2
-msgid "Hagar"
+#: qcsrc/server/w_tuba.qc:2
+#, c-format
+msgid "@!#%'n Tuba"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_tuba.qc:252
 #, c-format
-msgid "%s played with tiny rockets"
+msgid "%s hurt his own ears with the @!#%%'n Tuba"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_tuba.qc:256
 #, c-format
-msgid "%s hoped %s's missiles wouldn't bounce"
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
-#, c-format
-msgid "%s was pummeled by %s"
+#: qcsrc/server/w_minstanex.qc:2
+msgid "MinstaNex"
 msgstr ""
 
-#: qcsrc/server/w_crylink.qc:2
-msgid "Crylink"
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
+#, c-format
+msgid "%s has been vaporized by %s"
 msgstr ""
 
 #: qcsrc/server/w_crylink.qc:664
@@ -1637,56 +1818,58 @@ msgstr ""
 msgid "%s took a close look at %s's Crylink"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
+#: qcsrc/server/w_hlac.qc:2
+msgid "Heavy Laser Assault Cannon"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:500 qcsrc/server/w_minelayer.qc:495
+#: qcsrc/server/w_hlac.qc:240 qcsrc/server/w_fireball.qc:419
 #, c-format
-msgid "%s exploded"
+msgid "%s should have used a smaller gun"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_hlac.qc:242
 #, c-format
-msgid "%s got too close to %s's rocket"
+msgid "%s was cut down by %s"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_grenadelauncher.qc:383
 #, c-format
-msgid "%s almost dodged %s's rocket"
+msgid "%s tried out his own grenade"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_grenadelauncher.qc:385
 #, c-format
-msgid "%s ate %s's rocket"
+msgid "%s detonated"
 msgstr ""
 
-#: qcsrc/server/w_hook.qc:2
-msgid "Grappling Hook"
+#: qcsrc/server/w_grenadelauncher.qc:391
+#, c-format
+msgid "%s didn't see %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_hook.qc:268
+#: qcsrc/server/w_grenadelauncher.qc:393
 #, c-format
-msgid "%s has run into %s's gravity bomb"
+msgid "%s almost dodged %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:2
-msgid "Mine Layer"
+#: qcsrc/server/w_grenadelauncher.qc:395
+#, c-format
+msgid "%s ate %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655
 #, c-format
-msgid "%s got too close to %s's mine"
+msgid "%s played with tiny rockets"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_hagar.qc:386
 #, c-format
-msgid "%s almost dodged %s's mine"
+msgid "%s hoped %s's missiles wouldn't bounce"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661
 #, c-format
-msgid "%s stepped on %s's mine"
+msgid "%s was pummeled by %s"
 msgstr ""
 
 #: qcsrc/server/w_seeker.qc:2
@@ -1698,40 +1881,52 @@ msgstr ""
 msgid "%s was tagged by %s"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:2
-msgid "Mortar"
+#: qcsrc/server/w_fireball.qc:417
+#, c-format
+msgid "%s forgot about some firemine"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_fireball.qc:426
 #, c-format
-msgid "%s tried out his own grenade"
+msgid "%s tried to catch %s's firemine"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_fireball.qc:428
 #, c-format
-msgid "%s detonated"
+msgid "%s fatefully ignored %s's firemine"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_fireball.qc:435
 #, c-format
-msgid "%s didn't see %s's grenade"
+msgid "%s could not hide from %s's fireball"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_fireball.qc:437
 #, c-format
-msgid "%s almost dodged %s's grenade"
+msgid "%s saw the pretty lights of %s's fireball"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_fireball.qc:440
 #, c-format
-msgid "%s ate %s's grenade"
+msgid "%s got too close to %s's fireball"
 msgstr ""
 
-#: qcsrc/server/w_hlac.qc:2
-msgid "Heavy Laser Assault Cannon"
+#: qcsrc/server/w_fireball.qc:442
+#, c-format
+msgid "%s tasted %s's fireball"
 msgstr ""
 
-#: qcsrc/server/w_hlac.qc:242
+#: qcsrc/server/w_minelayer.qc:527
 #, c-format
-msgid "%s was cut down by %s"
+msgid "%s got too close to %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:529
+#, c-format
+msgid "%s almost dodged %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:531
+#, c-format
+msgid "%s stepped on %s's mine"
 msgstr ""
index fc5f98ef95bcc669860ec7eeb82f221cab9cf1a5..b896923f7fb3f7f05f40ed0a0a67e0e8ca3d5d43 100644 (file)
@@ -10,7 +10,7 @@
 // e.g. Xonotic 1.5.1 RC1 will be 15101
 set g_xonoticversion git "Xonotic version (formatted for humans)"
 
-gameversion 100 // 0.1.0
+gameversion 500 // 0.5.0
 gameversion_min 0 // git builds see all versions
 gameversion_max 65535 // git builds see all versions
 
@@ -52,6 +52,7 @@ alias asay_drop "say_team (%l) dropped %w ; impulse 17"
 // other aliases
 alias +hook +button6
 alias -hook -button6
+alias use "impulse 21"
 alias ready "cmd ready"
 alias lockteams "sv_cmd lockteams"
 alias unlockteams "sv_cmd unlockteams"
@@ -173,10 +174,10 @@ seta crosshair_seeker ""  "crosshair to display when wielding the TAG Seeker"
 seta crosshair_seeker_color "1 0.35 0.35"      "crosshair color to display when wielding the TAG seeker"
 seta crosshair_seeker_alpha 0.9        "crosshair alpha value to display when wielding the TAG seeker"
 seta crosshair_seeker_size 0.8 "crosshair size when wielding the TAG seeker"
-seta crosshair_sniperrifle ""  "crosshair to display when wielding the sniperrifle"
-seta crosshair_sniperrifle_color "0.85 0.5 0.25"       "crosshair color to display when wielding the sniperrifle"
-seta crosshair_sniperrifle_alpha 1     "crosshair alpha value to display when wielding the sniperrifle"
-seta crosshair_sniperrifle_size 0.65   "crosshair size when wielding the sniperrifle"
+seta crosshair_rifle ""        "crosshair to display when wielding the rifle"
+seta crosshair_rifle_color "0.85 0.5 0.25"     "crosshair color to display when wielding the rifle"
+seta crosshair_rifle_alpha 1   "crosshair alpha value to display when wielding the rifle"
+seta crosshair_rifle_size 0.65 "crosshair size when wielding the rifle"
 seta crosshair_tuba "" "crosshair to display when wielding the tuba"
 seta crosshair_tuba_color "0.85 0.5 0.25"      "crosshair color to display when wielding the tuba"
 seta crosshair_tuba_alpha 1    "crosshair alpha value to display when wielding the tuba"
@@ -281,13 +282,13 @@ cl_rollangle 0 // amount of view tilt when strafing, default is 2.0
 v_kicktime 0 // how long damage kicks of the view last, default is 0 seconds
 gl_polyblend 0 // whether to use screen tints, this has now been replaced by a better system in CSQC
 r_motionblur 0 // motion blur value, default is 0
-r_damageblur 0 // motion blur when damaged, default is 0
+r_damageblur 0 // motion blur when damaged, default is 0 (removed in Xonotic)
 
-r_bloom_blur 8
-r_bloom_brighten 3
+r_bloom_blur 16
+r_bloom_brighten 2.5
 r_bloom_colorexponent 1
 r_bloom_colorscale 1
-r_bloom_colorsubtract 0.25
+r_bloom_colorsubtract 0.15
 r_bloom_resolution 320
 r_hdr_range 4
 
@@ -319,8 +320,7 @@ set sv_ready_restart_repeatable 0   "allows the players to restart the game as oft
 seta cl_hitsound 1 "play a hit notifier sound when you have hit an enemy"
 set cl_hitsound_antispam_time 0.05 "don't play the hitsound more often than this"
 
-seta cl_eventchase_death 0 "camera goes into 3rd person mode when the player is dead"
-seta cl_eventchase_intermission 0 "camera goes into 3rd person mode when the match ends"
+seta cl_eventchase_death 1 "camera goes into 3rd person mode when the player is dead"
 seta cl_eventchase_distance 140 "final camera distance"
 seta cl_eventchase_speed 1.3 "how fast the camera slides back, 0 is instant"
 
@@ -455,9 +455,9 @@ set bot_ai_keyboard_threshold 0.57
 set bot_ai_aimskill_offset 0.3 "Amount of error induced to the bots aim"
 set bot_ai_aimskill_think 1 "Aiming velocity. Use values below 1 for slower aiming"
 set bot_ai_custom_weapon_priority_distances "300 850"  "Define close and far distances in any order. Based on the distance to the enemy bots will choose different weapons"
-set bot_ai_custom_weapon_priority_far   "minstanex nex sniperrifle electro rocketlauncher grenadelauncher hagar hlac crylink laser uzi fireball seeker shotgun tuba minelayer" "Desired weapons for far distances ordered by priority"
-set bot_ai_custom_weapon_priority_mid   "minstanex rocketlauncher nex fireball seeker grenadelauncher electro uzi sniperrifle crylink hlac hagar shotgun laser tuba minelayer" "Desired weapons for middle distances ordered by priority"
-set bot_ai_custom_weapon_priority_close "minstanex shotgun nex uzi hlac tuba seeker hagar crylink grenadelauncher electro sniperrifle rocketlauncher laser fireball minelayer" "Desired weapons for close distances ordered by priority"
+set bot_ai_custom_weapon_priority_far   "minstanex nex rifle electro rocketlauncher grenadelauncher hagar hlac crylink laser uzi fireball seeker shotgun tuba minelayer"       "Desired weapons for far distances ordered by priority"
+set bot_ai_custom_weapon_priority_mid   "minstanex rocketlauncher nex fireball seeker grenadelauncher electro uzi crylink hlac hagar shotgun laser rifle tuba minelayer"       "Desired weapons for middle distances ordered by priority"
+set bot_ai_custom_weapon_priority_close "minstanex shotgun nex uzi hlac tuba seeker hagar crylink grenadelauncher electro rocketlauncher laser fireball rifle minelayer"       "Desired weapons for close distances ordered by priority"
 set bot_ai_weapon_combo 1      "Enable bots to do weapon combos"
 set bot_ai_weapon_combo_threshold 0.4  "Try to make a combo N seconds after the last attack"
 set bot_ai_friends_aware_pickup_radius "500"   "Bots will not pickup items if a team mate is this distance near the item"
@@ -500,7 +500,7 @@ seta g_antilag 2    "AntiLag (0 = no AntiLag, 1 = verified client side hit scan, 2
 set g_trueaim_minrange 44 "TrueAim minimum range (TrueAim adjusts shots so they hit the crosshair point even though the gun is not at the screen center)"
 set g_antilag_nudge 0 "don't touch"
 set g_antilag_bullets 1 "Bullets AntiLag (0 = no AntiLag, 1 = server side hit scan in the past) - DO NOT TOUCH (severely changes weapon balance)"
-set g_shootfromclient 1 "let client decide if it has the gun left or right; if set to 2, center handedness is allowed, and defaulted to, too; see also cl_gunalign"
+set g_shootfromclient 2 "let client decide if it has the gun left or right; if set to 2, center handedness is allowed; see also cl_gunalign"
 set g_shootfromeye 0 "shots are fired from your eye/crosshair; visual gun position can still be influenced by cl_gunalign 1 and 2"
 set g_shootfromcenter 0 "weapon gets moved to the center, shots still come from the barrel of your weapon; visual gun position can still be influenced by cl_gunalign 1 and 2"
 set g_shootfromfixedorigin "" "if set to a string like 0 y z, the gun is moved to the given y and z coordinates. If set to a string like x y z, the whole shot origin is used"
@@ -708,7 +708,7 @@ set g_ctf_flagcarrier_selfforce 1
 set g_ctf_fullbrightflags 0
 set g_ctf_dynamiclights 0
 set g_ctf_allow_drop 1 "dropping allows circumventing carrierkill score, so enable this with care!"
-set g_ctf_reverse 0    "when 1, bases/flags are switched :P you have to capture your OWN flag by bringing it to the ENEMY's"
+set g_ctf_reverse 0    "if enabled, flags positions are switched: you have to capture the enemy's flag from your own base by bringing it to your own flag in the enemy base"
 set g_balance_ctf_delay_collect 1.0
 set g_balance_ctf_damageforcescale 1
 
@@ -905,6 +905,8 @@ set g_multijump_add 0       "0 = make the current z velocity equal to jumpvelocity, 1
 set g_multijump_speed -999999  "Minimum vertical speed a player must have in order to jump again"
 
 // effects
+r_glsl_vertextextureblend_usebothalphas 1 // allows to abuse texture blending as detail texture
+r_glsl_postprocess 1
 r_picmipsprites 0 // Xonotic uses sprites that should never be picmipped (team mate, typing, waypoints)
 r_picmipworld 1
 gl_picmip_world 0
@@ -916,7 +918,7 @@ r_shadow_realtime_world_lightmaps 1
 seta r_ambient 4
 cl_decals_fadetime 5
 cl_decals_time 2
-seta cl_gunalign 3 "Gun alignment; 1 = right, 2 = left, 3 = center or right, 4 = center or left"
+seta cl_gunalign 3 "Gun alignment; 1 = center (if allowed by g_shootfromclient) or right, 2 = center (if allowed by g_shootfromclient) or left, 3 = right only, 4 = left only"
 seta cl_nogibs 0 "reduce number of violence effects, or remove them totally"
 seta cl_particlegibs 0 "simpler gibs"
 seta cl_gibs_damageforcescale 3.5 "force to push around gibs"
@@ -1011,20 +1013,30 @@ bind ENTER +jump
 bind SPACE +jump
 
 // weapons
-bind 1 "impulse 1"
-bind 2 "impulse 2"
-bind 3 "impulse 3"
-bind 4 "impulse 4"
-bind 5 "impulse 5"
-bind 6 "impulse 6"
-bind 7 "impulse 7"
-bind 8 "impulse 8"
-bind 9 "impulse 9"
-bind 0 "impulse 14" // cycles the superweapons
+alias weapon_group_1 "impulse 1"
+alias weapon_group_2 "impulse 2"
+alias weapon_group_3 "impulse 3"
+alias weapon_group_4 "impulse 4"
+alias weapon_group_5 "impulse 5"
+alias weapon_group_6 "impulse 6"
+alias weapon_group_7 "impulse 7"
+alias weapon_group_8 "impulse 8"
+alias weapon_group_9 "impulse 9"
+alias weapon_group_0 "impulse 14" // cycles the superweapons
+bind 0 weapon_group_0
+bind 1 weapon_group_1
+bind 2 weapon_group_2
+bind 3 weapon_group_3
+bind 4 weapon_group_4
+bind 5 weapon_group_5
+bind 6 weapon_group_6
+bind 7 weapon_group_7
+bind 8 weapon_group_8
+bind 9 weapon_group_9
 bind q weaplast
 bind MOUSE1 +fire
 bind MOUSE2 +fire2
-bind MOUSE3 +zoom
+bind MOUSE3 togglezoom
 bind MOUSE4 weaplast
 bind MOUSE5 +hook
 bind MWHEELUP weapnext
@@ -1032,6 +1044,7 @@ bind MWHEELDOWN weapprev
 bind r reload
 bind BACKSPACE dropweapon
 bind g dropweapon
+// TODO change this to "use" once we can
 bind f +use
 
 // misc
@@ -1191,21 +1204,21 @@ alias cl_fbskin_green "playermodel models/player/erebus.iqm; playerskin 1; color
 alias cl_fbskin_red "playermodel models/player/erebus.iqm; playerskin 1; color 4 4"
 alias cl_fbskin_orange "playermodel models/player/erebus.iqm; playerskin 1; color 14 14"
 alias cl_fbskin_off "playermodel models/player/erebus.iqm; playerskin 0"
-alias sv_fbskin_green "sv_defaultcharacter 1; sv_defaultplayermodel models/player/erebus.iqm; sv_defaultplayerskin 1; sv_defaultplayercolors 51"
-alias sv_fbskin_red "sv_defaultcharacter 1; sv_defaultplayermodel models/player/erebus.iqm; sv_defaultplayerskin 1; sv_defaultplayercolors 68"
-alias sv_fbskin_orange "sv_defaultcharacter 1; sv_defaultplayermodel models/player/erebus.iqm; sv_defaultplayerskin 1; sv_defaultplayercolors 238"
+alias sv_fbskin_green "sv_defaultcharacter 1; sv_defaultplayermodel models/player/megaerebus.iqm; sv_defaultplayerskin 1; sv_defaultplayercolors 51"
+alias sv_fbskin_red "sv_defaultcharacter 1; sv_defaultplayermodel models/player/megaerebus.iqm; sv_defaultplayerskin 1; sv_defaultplayercolors 68"
+alias sv_fbskin_orange "sv_defaultcharacter 1; sv_defaultplayermodel models/player/megaerebus.iqm; sv_defaultplayerskin 1; sv_defaultplayercolors 238"
 alias sv_fbskin_off "sv_defaultcharacter 0; sv_defaultplayerskin 0; sv_defaultplayercolors \"\""
 
 seta sv_servermodelsonly 1
 
 cl_curl_enabled 1
-cl_curl_maxspeed 300
-sv_curl_defaulturl "http://www.xonotic.com/contentdownload/getmap.php?file="
+cl_curl_maxspeed 400
+sv_curl_defaulturl "http://www.xonotic.org/contentdownload/getmap.php?file="
 set sv_curl_serverpackages_auto 1 "automatically add packs with *.serverpackage files to sv_curl_serverpackages"
 
 set sv_motd ""
 
-set g_waypoints_for_items 1    "make waypoints out of items, values: 0 = never, 1 = unless the mapper prevents it by worldspawn.spawnflags & 1, 2 = always"
+set g_waypoints_for_items 0    "make waypoints out of items, values: 0 = never, 1 = unless the mapper prevents it by worldspawn.spawnflags & 1, 2 = always"
 
 seta g_maplist_votable 6 "number of maps that are shown in the map voting at the end of a match"
 seta g_maplist_votable_keeptwotime 15
@@ -1233,6 +1246,7 @@ set g_nick_flood_penalty 0.5 "duration of the nick flood penalty"
 set g_nick_flood_penalty_yellow 3 "number of changes to allow before warning and movement blocking"
 set g_nick_flood_penalty_red 30 "number of changes to allow before totally disorienting the player"
 
+seta g_waypointsprite_uppercase 1
 set g_waypointsprite_normdistance 512
 set g_waypointsprite_minscale 0.5
 set g_waypointsprite_minalpha 0.4
@@ -1243,16 +1257,22 @@ set g_waypointsprite_deadlifetime 1
 set g_waypointsprite_limitedrange 5120
 set g_waypointsprite_stuffbinds 0
 seta g_waypointsprite_scale 1
+seta g_waypointsprite_fontsize 12
 seta g_waypointsprite_alpha 1 "This allows the client to control transparency of the waypoint"
 seta g_waypointsprite_edgefadealpha 0.5 "alpha multiplier near the edge"
 seta g_waypointsprite_edgefadescale 1 "scale multiplier near the edge"
 seta g_waypointsprite_edgefadedistance 50 "distance in virtual pixels from edge where to start fading"
+seta g_waypointsprite_edgeoffset_bottom 0 "offset of how close the waypoint can be to the bottom edge of the screen"
+seta g_waypointsprite_edgeoffset_left 0 "offset of how close the waypoint can be to the left edge of the screen"
+seta g_waypointsprite_edgeoffset_right 0 "offset of how close the waypoint can be to the right edge of the screen"
+seta g_waypointsprite_edgeoffset_top 0 "offset of how close the waypoint can be to the top edge of the screen"
 seta g_waypointsprite_crosshairfadealpha 0.25 "alpha multiplier near crosshair"
 seta g_waypointsprite_crosshairfadescale 1 "scale multiplier near the crosshair"
 seta g_waypointsprite_crosshairfadedistance 150 "distance in virtual pixels from crosshair where to start fading"
 seta g_waypointsprite_distancefadealpha 1 "alpha multiplier near distance"
 seta g_waypointsprite_distancefadescale 0.7 "scale multiplier near the distance"
 seta g_waypointsprite_distancefadedistancemultiplier 0.5 "distance in map sizes from distance where to stop fading"
+set g_waypointsprite_spam 0 "Debugging feature. Set to 10 and load courtfun in race mode to test."
 alias "g_waypointsprite_personal"      "impulse 30"
 alias "g_waypointsprite_personal_p"    "impulse 31"
 alias "g_waypointsprite_personal_d"    "impulse 32"
@@ -1265,7 +1285,7 @@ alias "g_waypointsprite_team_danger_p"    "impulse 38"
 alias "g_waypointsprite_team_danger_d" "impulse 39"
 alias "g_waypointsprite_clear_personal"        "impulse 47"
 alias "g_waypointsprite_clear" "impulse 48"
-alias "g_waypointsprite_toggle"        "impulse 49"
+alias "g_waypointsprite_toggle"        "toggle cl_hidewaypoints"
 // key for that?
 seta cl_hidewaypoints 0 "disable static waypoints, only show team waypoints"
 
@@ -1291,7 +1311,6 @@ set g_balance_keyhunt_delay_round 5
 set g_balance_keyhunt_delay_tracking 10
 set g_balance_keyhunt_delay_fadeout 2
 set g_balance_keyhunt_delay_collect 1.5
-set g_balance_keyhunt_delay_drop 0.4
 set g_balance_keyhunt_maxdist 150
 set g_balance_keyhunt_score_collect 3
 set g_balance_keyhunt_score_carrierfrag 2
@@ -1369,6 +1388,7 @@ seta "userbind11_press" "say_team attacking (l:%l^7) (h:%h^7 a:%a^7 w:%w^7); g_w
 seta "userbind12_press" "say_team killed flagcarrier (l:%y^7); g_waypointsprite_team_p"; seta "userbind12_release" ""; seta "userbind12_description" "team: killed flag, icon"
 seta "userbind13_press" "say_team dropped flag (l:%d^7); g_waypointsprite_team_here_d"; seta "userbind13_release" ""; seta "userbind13_description" "team: dropped flag, icon"
 seta "userbind14_press" "say_team dropped gun %w^7 (l:%l^7); g_waypointsprite_team_here; wait; dropweapon"; seta "userbind14_release" ""; seta "userbind14_description" "team: drop gun, icon"
+// TODO change this to "use" once we can
 seta "userbind15_press" "say_team dropped flag/key %w^7 (l:%l^7); g_waypointsprite_team_here; wait; +use"; seta "userbind15_release" "-use"; seta "userbind15_description" "team: drop flag/key, icon"
 seta "userbind16_press" "say :-) / nice one"; seta "userbind16_release" ""; seta "userbind16_description" "chat: nice one"
 seta "userbind17_press" "say good game"; seta "userbind17_release" ""; seta "userbind17_description" "chat: good game"
@@ -1478,6 +1498,8 @@ seta hud_showbinds_limit 2        "maximum number of bound keys to show for a command.
 seta hud_colorflash_alpha 0.5 "starting alpha of the color flash"
 
 seta hud_damage 0.55 "an improved version of gl_polyblend for damage, draw an image instead when hurt"
+seta hud_damage_blur 10 "Use postprocessing to blur the screen when you have taken damage. This can be paired with current hud damage or just used alone. Higher values = more blur"
+seta hud_damage_blur_alpha 0.5 "Amount of alpha to use when merging the blurred layers back into the render. Turning this up higher will remove bloom, so it's best to find a balance"
 seta hud_damage_gentle_alpha_multiplier 0.10 "how much to multiply alpha of flash when using the cl_gentle version, it's much more opaque than the non-gentle version"
 seta hud_damage_gentle_color "1 0.7 1" "color of flash for cl_gentle version"
 seta hud_damage_color "1 0 0" "color of flash"
@@ -1490,7 +1512,15 @@ seta hud_damage_pain_threshold_lower_health 50 "at which health we start lowerin
 seta hud_damage_pain_threshold_pulsating_min 0.6 "minimum value when calculating the pulse: max(pulsating_min, fabs(sin(PI * time / period))"
 seta hud_damage_pain_threshold_pulsating_period 0.8 "one pulse every X seconds"
 
+seta hud_powerup 0 "power of the sharpen effect when owning the shield or strength powerups, default is 0.5"
+
+seta hud_postprocessing 1 "enables the ability for effects such as hud_damage_blur and hud_contents to apply a postprocessing method upon the screen - enabling this disables manual editing of the postprocess cvars"
+seta hud_postprocessing_maxbluralpha 0 "maximum alpha which the blur postprocess can be, default is 0.5"
+seta hud_postprocessing_maxblurradius 8 "maximum radius which the blur postprocess can be, default is 8"
+
 seta hud_contents 1 "an improved version of gl_polyblend for liquids such as water/lava/slime, draw a filler when inside the liquid"
+seta hud_contents_blur 10 "Use postprocessing to blur the screen when you are inside a liquid. Higher values = more blur"
+seta hud_contents_blur_alpha 0.5 "Amount of alpha to use when merging the blurred layers back into the render. Turning this up higher will remove bloom, so it's best to find a balance"
 seta hud_contents_factor 1 "factor at which to multiply the current faded value."
 seta hud_contents_fadeintime 0.02 "factor of time it takes for the alpha level to reach normal value when entering the liquid"
 seta hud_contents_fadeouttime 0.1 "factor of time it takes for the alpha level to reach normal value when leaving the liquid"
@@ -1608,14 +1638,15 @@ set con_completion_playermodel  models/player/*.iqm
 seta cl_port $cl_port
 seta r_showsurfaces $r_showsurfaces
 seta r_ambient $r_ambient
-seta skill $skill
+seta skill 4
 seta gl_finish $gl_finish
 seta v_kicktime $v_kicktime
 seta r_subdivisions_tolerance $r_subdivisions_tolerance
 
 // ticrate
-sys_ticrate 0.0166667
-cl_netfps 60 // should match
+//sys_ticrate 0.0166667
+sys_ticrate 0.0333333
+cl_netfps 60 // should match or be a multiple
 sv_gameplayfix_delayprojectiles 0
 sv_gameplayfix_q2airaccelerate 1
 sv_gameplayfix_stepmultipletimes 1
@@ -1670,7 +1701,6 @@ set capturelimit 0
 
 // hud: font size
 seta hud_fontsize 11
-seta scr_centersize 12
 seta hud_width 560
 
 // these entities are not referenced by anything directly, they just represent
@@ -1683,12 +1713,12 @@ set g_jump_grunt 0      "Do you make a grunting noise every time you jump? Is it the
 
 alias allready "sv_cmd allready"
 
-seta cl_weaponpriority "minstanex rocketlauncher nex grenadelauncher minelayer fireball hlac hagar seeker crylink sniperrifle uzi electro tuba shotgun laser hook porto" "weapon priority list"
+seta cl_weaponpriority "minstanex rocketlauncher nex grenadelauncher minelayer fireball hlac hagar seeker crylink rifle uzi electro tuba shotgun laser hook porto" "weapon priority list"
 seta cl_weaponpriority_useforcycling 0 "when set, weapon cycling by the mouse wheel makes use of the weapon priority list (the special value 2 uses the weapon ID list for cycling)"
 seta cl_weaponpriority0 "rocketlauncher grenadelauncher hagar seeker fireball" "use impulse 200 for prev gun from this list, 210 for best gun, 220 for next gun.  Default value: explosives"
 seta cl_weaponpriority1 "minstanex nex crylink hlac electro laser"             "use impulse 201 for prev gun from this list, 211 for best gun, 221 for next gun.  Default value: energy"
-seta cl_weaponpriority2 "minstanex nex sniperrifle"                           "use impulse 202 for prev gun from this list, 212 for best gun, 222 for next gun.  Default value: hitscan exact"
-seta cl_weaponpriority3 "minstanex nex sniperrifle uzi shotgun"               "use impulse 203 for prev gun from this list, 213 for best gun, 223 for next gun.  Default value: hitscan all"
+seta cl_weaponpriority2 "minstanex nex rifle"                           "use impulse 202 for prev gun from this list, 212 for best gun, 222 for next gun.  Default value: hitscan exact"
+seta cl_weaponpriority3 "minstanex nex rifle uzi shotgun"               "use impulse 203 for prev gun from this list, 213 for best gun, 223 for next gun.  Default value: hitscan all"
 seta cl_weaponpriority4 "grenadelauncher minelayer hlac hagar crylink seeker shotgun"    "use impulse 204 for prev gun from this list, 214 for best gun, 224 for next gun.  Default value: spam weapons"
 seta cl_weaponpriority5 "laser hook porto"                                     "use impulse 205 for prev gun from this list, 215 for best gun, 225 for next gun.  Default value: weapons for moving"
 seta cl_weaponpriority6 "" "use impulse 206 for prev gun from this list, 216 for best gun, 226 for next gun"
@@ -1718,7 +1748,9 @@ alias gl_flashblend_update "_gl_flashblend_update_$r_shadow_realtime_dlight$r_sh
 
 set sv_clones 0        "number of clones a player may make (reset by the \"kill\" command)"
 
-set cl_handicap 1      "the higher, the more damage you will receive (client setting)"
+set cl_handicap 1      "the higher, the more damage you will receive (client setting) NOTE: reconnect or use sendcvar command to update the choice."
+
+seta cl_clippedspectating 1 "movement collision for spectators so that you can't pass through walls and such. (client setting) NOTE: reconnect or use sendcvar command to update the choice." 
 
 // must be at the bottom of this file:
 // alias for switching the teamselect menu
@@ -1908,7 +1940,7 @@ seta cl_vehicle_spiderbot_cross_alpha 0.6
 seta cl_vehicle_spiderbot_cross_size 1
 
 //cl_gunalign calculator
-seta menu_cl_gunalign 3 "Gun alignment; 1 = right, 2 = left, 3 = center or right, 4 = center or left"
+seta menu_cl_gunalign 3 "Gun alignment; 1 = center (if allowed by g_shootfromclient) or right, 2 = center (if allowed by g_shootfromclient) or left, 3 = right only, 4 = left only"
 alias _gunalign_01 "cl_gunalign 1"
 alias _gunalign_02 "cl_gunalign 2"
 alias _gunalign_03 "cl_gunalign 3"
@@ -1957,6 +1989,7 @@ set speedmeter 0 "print landing speeds"
 set developer_shtest 0 "experimental speedhack detection"
 set waypoint_benchmark 0 "quit after waypoint loading to benchmark bot navigation code"
 set g_debug_bot_commands 0 "print scripted bot commands before executing"
+set g_debug_defaultsounds 0 "always use default sounds"
 
 // debug cvars for keyhunt attaching
 set _angles "0 0 0"
@@ -2016,7 +2049,7 @@ set g_weaponreplace_porto ""
 set g_weaponreplace_minstanex ""
 set g_weaponreplace_hook ""
 set g_weaponreplace_hlac ""
-set g_weaponreplace_sniperrifle ""
+set g_weaponreplace_rifle ""
 set g_weaponreplace_tuba ""
 set g_weaponreplace_fireball ""
 set g_weaponreplace_seeker ""
@@ -2043,8 +2076,8 @@ scr_conforcewhiledisconnected 0
 scr_infobar_height 12
 
 // DP cannot properly detect this, so rather turn off the detection
-r_texture_dds_load_dxt1_noalpha 1
-r_texture_dds_load_swdecode 1 // SW decode to quarter res if we want to load DDS but don't support the extension for it
+r_texture_dds_load_alphamode 2
+r_texture_dds_swdecode 1 // SW decode to quarter res if we want to load DDS but don't support the extension for it
 r_texture_dds_load_logfailure 0 // this engine feature SUCKS
 set vid_netwmfullscreen 0 // doesn't support non-native res
 
@@ -2057,10 +2090,11 @@ sv_cullentities_trace 1
 r_cullentities_trace 0
 
 // less "lagging" of other players, but also less PL tolerant... let's try this
-sv_clmovement_inputtimeout 0.05
+sv_clmovement_inputtimeout 0.07 // more than 2, less than 3 server frames
 
 // exact gloss looks better, e.g. on g-23
 r_shadow_glossexact 1
+r_shadow_glossintensity 1
 
 // use fake light if map has no lightmaps
 r_fakelight 1
@@ -2126,11 +2160,15 @@ set g_playerstats_debug 0 "when 1, player stats are dumped to the console too"
 // create this cvar in case the engine did not
 set snd_soundradius 1200
 
+// declare the channels we use
+seta snd_channel8volume 1 "QuakeC controlled background music volume"
+seta snd_channel9volume 1 "QuakeC controlled ambient sound volume"
+
 // loading screen
 scr_loadingscreen_background 0
 scr_loadingscreen_barcolor "0 0.5 1"
 scr_loadingscreen_barheight 12
-scr_loadingscreen_count 12
+scr_loadingscreen_count 13
 scr_loadingscreen_scale 999
 scr_loadingscreen_scale_base 1
 scr_loadingscreen_scale_limit 2
@@ -2145,6 +2183,7 @@ exec ctfscoring-ai.cfg
 exec effects-normal.cfg
 exec physicsX.cfg
 exec turrets.cfg
+exec vehicles.cfg
 
 // hud cvar descriptions
 exec _hud_descriptions.cfg
index 15563178d10b6362591e97012b519851a41a874a..f69cdc907ddce77eacc3179c4fc104b4c98c37db 100644 (file)
@@ -5258,6 +5258,1156 @@ originjitter 1 1 1
 velocityjitter 100 100 100
 velocitymultiplier -0.31
 
+// --------------- vehicles
+
+effect spiderbot_minigun_trail
+notunderwater
+trailspacing 10
+type smoke
+color 0xd0d0a0 0xffffff
+tex 0 8
+size 1 2
+alpha 20 50 100
+sizeincrease 2
+velocityjitter 5 5 5
+gravity -0.03
+airfriction 1
+
+effect spiderbot_minigun_muzzleflash
+count 3
+type spark
+color 0xff9c00 0xff8400
+tex 48 55
+size 10 15
+alpha 256 512 6280
+airfriction 10
+originjitter 2 2 2
+velocityjitter 150 150 150
+velocitymultiplier 0.35
+sizeincrease -100
+stretchfactor 1.3
+rotate -180 180 4000 -4000
+// fire
+effect spiderbot_minigun_muzzleflash
+count 6
+type spark
+color 0xff9c00 0xff8400
+tex 8 15
+size 5 7
+alpha 256 512 6280
+airfriction 12
+originjitter 2 2 2
+velocityjitter 200 200 200
+velocitymultiplier 0.2
+sizeincrease -10
+stretchfactor 0.8
+effect spiderbot_minigun_muzzleflash
+countabsolute 2
+type static
+tex 48 55
+color 0xff9c00 0xff8400
+size 32 32
+alpha 256 512 6680
+sizeincrease -100
+stretchfactor 0.1
+rotate -180 180 4000 -4000
+lightradius 120
+lightradiusfade 8000
+lightcolor 3 3 0
+
+effect spiderbot_minigun_impact
+countabsolute 1
+type static
+tex 65 65
+color 0xff9c00 0xf6ff00
+size 52 52
+alpha 50 100 1680
+sizeincrease -100
+stretchfactor 0.1
+rotate -180 180 4000 -4000
+// fire
+effect spiderbot_minigun_impact
+count 7
+type spark
+color 0xff9c00 0xff8400
+tex 48 55
+size 9 15
+alpha 256 512 6280
+airfriction 10
+originjitter 2 2 2
+velocityjitter 250 250 150
+velocitymultiplier 0.2
+sizeincrease 100
+stretchfactor 3
+airfriction 6
+rotate -180 180 4000 -4000
+// smoke 
+effect spiderbot_minigun_impact
+count 6
+type smoke
+color 0xd0d0a0 0xffffff
+tex 0 8
+size 10 20
+alpha 50 50 190
+sizeincrease 80
+velocityjitter 100 100 250
+velocitymultiplier 0.49
+gravity 1.3
+airfriction 10
+rotate -180 180 0 0
+// smoke 2
+effect spiderbot_minigun_impact
+count 7
+type spark
+color 0xd0d0a0 0xffffff
+tex 0 8
+size 15 19
+alpha 25 51 128
+airfriction 6
+originjitter 2 2 2
+velocityjitter 250 250 150
+velocitymultiplier 0.2
+sizeincrease 100
+stretchfactor 7.6
+// derbis
+effect spiderbot_minigun_impact
+notunderwater
+count 3
+type alphastatic
+tex 66 68
+color 0x99977D 0xFFFFFF
+size 6 8
+alpha 644 756 1484
+gravity 1.1
+airfriction 0.4
+sizeincrease -10
+velocitymultiplier 0.15
+originjitter 16 16 16
+velocityjitter 124 124 224
+rotate -180 180 -1000 1000
+// decal
+effect spiderbot_minigun_impact
+countabsolute 1
+type decal
+tex 56 59
+size 20 25
+alpha 256 256 0
+originjitter 16 16 16
+rotate -180 180 0 0
+
+effect spiderbot_rocket_explode
+countabsolute 1
+type decal
+tex 8 16
+size 72 72
+alpha 256 256 0
+originjitter 23 23 23
+lightradius 300
+lightradiusfade 1750
+lightcolor 8 4 0
+// shockwave
+effect spiderbot_rocket_explode
+countabsolute 1
+type static
+tex 33 33 
+size 22 22
+alpha 56 56 230
+color 0x8f0d00 0xff5a00
+sizeincrease 2400
+// glow
+effect spiderbot_rocket_explode
+countabsolute 1
+type static
+tex 64 64
+size 120 120
+alpha 156 156 830
+color 0x8f0d00 0xff5a00
+sizeincrease 240
+// fire effect
+effect spiderbot_rocket_explode
+notunderwater
+count 32
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 12 21
+sizeincrease 495
+alpha 200 256 812
+airfriction 8
+liquidfriction 8
+originjitter 100 100 100
+velocityjitter 512 512 512
+rotate -180 180 -50 50
+// fire effect 2
+effect spiderbot_rocket_explode
+notunderwater
+count 16
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 3 3
+sizeincrease 120
+alpha 200 256 912
+airfriction -2
+liquidfriction 8
+velocityjitter 412 412 412
+rotate -180 180 -150 150
+stretchfactor 10
+// fire rays
+effect spiderbot_rocket_explode
+notunderwater
+count 10
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 13 54
+sizeincrease 120
+alpha 200 256 1600
+airfriction -3
+liquidfriction 8
+originjitter 40 40 40
+velocityjitter 712 712 712
+stretchfactor 10
+// smoke
+effect spiderbot_rocket_explode
+type alphastatic
+notunderwater
+tex 0 8
+count 10
+size 10 15
+sizeincrease 280
+alpha 300 650 756
+originjitter 100 100 100
+velocityjitter 200 200 200
+airfriction 3
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+// smoke2
+effect spiderbot_rocket_explode
+type alphastatic
+notunderwater
+tex 0 8
+count 3
+size 100 150
+sizeincrease 30
+alpha 300 650 556
+originjitter 10 10 10
+velocityjitter 200 200 200
+airfriction 2
+gravity -0.5
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+// underwater bubbles
+effect spiderbot_rocket_explode
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 1 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 160 160 160
+velocityjitter 144 144 144
+// underwatershockwave
+effect spiderbot_rocket_explode
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 1200
+alpha 40 40 300
+
+
+effect spiderbot_rocket_thrust
+notunderwater
+count 3
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 5 10
+sizeincrease -40
+alpha 200 256 1600
+velocityjitter 20 20 20
+velocitymultiplier -1.4
+stretchfactor 0.9
+effect spiderbot_rocket_thrust
+notunderwater
+count 4
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 25 25
+sizeincrease -3000
+alpha 200 200 9000
+velocityjitter 60 60 60
+velocitymultiplier -1.4
+stretchfactor 1
+rotate -180 180 -500 500
+
+
+
+// long lasting smoke
+effect spiderbot_rocket_launch
+notunderwater
+count 8
+type smoke
+tex 0 8
+color 0xFFFFFF 0xD9C4B0
+size 30 30
+sizeincrease 20
+alpha 100 156 60
+velocityjitter 60 60 60
+velocitymultiplier -0.1
+airfriction 0.3
+gravity -0.01
+// fast smoke
+effect spiderbot_rocket_launch
+notunderwater
+count 14
+type smoke
+tex 0 8
+color 0xFFFFFF 0xD9C4B0
+size 30 30
+sizeincrease 20
+alpha 100 156 260
+gravity -0.3
+velocityjitter 160 160 60
+airfriction 0.3
+// fire
+effect spiderbot_rocket_launch
+notunderwater
+count 14
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 30 30
+sizeincrease 40
+velocitymultiplier 0.5
+alpha 200 256 1960
+velocityjitter 60 60 60
+airfriction 0.3
+stretchfactor 3
+airfriction 0.3
+//sparks
+effect spiderbot_rocket_launch
+notunderwater
+count 10
+type spark
+tex 40 40
+color 0xFFFFFF 0xD9C4B0
+size 1 4
+alpha 200 256 1000
+velocityjitter 160 160 160
+velocitymultiplier -0.5
+
+effect wakizashi_gun_impact
+count 15
+type spark
+color 0xff0000 0xc03535
+tex 41 41
+size 4 7
+alpha 256 512 1180
+airfriction 4
+gravity 3
+originjitter 40 40 10
+velocityjitter 350 350 550
+velocityoffset 0 0 700
+stretchfactor 0.9
+effect wakizashi_gun_impact
+type smoke
+count 24
+color 0xd0d0a0 0xc03535
+tex 0 8
+size 10 20
+alpha 50 90 150
+sizeincrease 80
+velocityjitter 250 250 450
+velocityoffset 0 0 600
+originjitter 40 40 10
+airfriction 4
+sizeincrease 80
+rotate -180 180 0 0
+effect wakizashi_gun_impact
+countabsolute 1
+type smoke
+tex 65 65
+color 0xff0000 0xc03535
+size 82 82
+alpha 250 300 680
+sizeincrease -180
+effect wakizashi_gun_impact
+countabsolute 1
+type smoke
+tex 33 33
+color 0xff0000 0xc03535
+size 40 40
+alpha 50 100 620
+sizeincrease 900
+rotate -180 180 400 -400
+effect wakizashi_gun_impact
+countabsolute 1
+type decal
+tex 59 59
+size 14 14
+alpha 256 256 0
+originjitter 16 16 16
+rotate -180 180 0 0
+
+effect wakizashi_gun_muzzleflash
+count 16
+type spark
+color 0xff0000 0xc03535
+tex 8 15
+size 5 7
+alpha 256 512 6280
+airfriction 12
+originjitter 2 2 2
+velocityjitter 200 200 200
+velocitymultiplier 0.2
+sizeincrease -10
+stretchfactor 0.7
+
+effect wakizashi_rocket_explode
+countabsolute 1
+type decal
+tex 8 16
+size 72 72
+alpha 256 256 0
+originjitter 23 23 23
+lightradius 300
+lightradiusfade 1750
+lightcolor 8 4 0
+// shockwave
+effect wakizashi_rocket_explode
+countabsolute 1
+type static
+tex 33 33 
+size 22 22
+alpha 56 56 230
+color 0x8f0d00 0xff5a00
+sizeincrease 2400
+// glow
+effect wakizashi_rocket_explode
+countabsolute 1
+type static
+tex 64 64
+size 120 120
+alpha 156 156 830
+color 0x8f0d00 0xff5a00
+sizeincrease 240
+// fire effect
+effect wakizashi_rocket_explode
+notunderwater
+count 64
+type static
+tex 48 55
+color 0xFFAE00 0xff5a00
+size 12 21
+sizeincrease 195
+alpha 200 256 512
+airfriction 2
+liquidfriction 8
+originjitter 10 10 10
+velocityjitter 512 512 512
+rotate -180 180 -50 50
+// fire rays
+effect wakizashi_rocket_explode
+notunderwater
+count 10
+type spark
+tex 48 55
+color 0xFFEA00 0xff5a00
+size 43 54
+sizeincrease 120
+alpha 200 256 1600
+airfriction -3
+liquidfriction 8
+originjitter 40 40 40
+velocityjitter 512 512 512
+stretchfactor 10
+// smoke
+effect wakizashi_rocket_explode
+type alphastatic
+notunderwater
+tex 0 8
+count 32
+size 10 15
+sizeincrease 230
+alpha 300 450 556
+originjitter 100 100 100
+velocityjitter 200 200 200
+airfriction 3
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+// bouncing sparks
+effect wakizashi_rocket_explode
+notunderwater
+count 14
+type spark
+tex 40 40
+color 0xffa35b 0xfff2be
+size 1 2
+alpha 644 956 884
+gravity 1
+airfriction 1
+liquidfriction 0.8
+velocityoffset 0 0 170
+originjitter 60 60 60
+velocityjitter 524 524 524
+// underwater bubbles
+effect wakizashi_rocket_explode
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 1 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 160 160 160
+velocityjitter 144 144 144
+// underwatershockwave
+effect wakizashi_rocket_explode
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 1200
+alpha 40 40 300
+
+effect wakizashi_rocket_thrust
+notunderwater
+countabsolute 3
+type spark
+tex 48 55
+color 0x00FFDD 0x6200FF
+size 14 19
+sizeincrease -2
+alpha 200 256 1600
+velocityjitter 60 60 60
+velocitymultiplier -1.1
+stretchfactor 1
+effect wakizashi_rocket_thrust
+notunderwater
+countabsolute 2
+type spark
+tex 48 55
+color 0xFFFF33 0xFFEE00
+size 5 10
+sizeincrease -2
+alpha 200 256 1900
+velocityjitter 60 60 60
+velocitymultiplier -0.3
+stretchfactor 3
+
+// long lasting smoke
+effect wakizashi_rocket_launch
+notunderwater
+count 8
+type smoke
+tex 0 8
+color 0xFFFFFF 0xD9C4B0
+size 3 30
+sizeincrease 20
+alpha 100 156 60
+velocityjitter 160 160 60
+velocitymultiplier -0.1
+airfriction 0.3
+// fast smoke
+effect wakizashi_rocket_launch
+notunderwater
+count 14
+type smoke
+tex 0 8
+color 0xFFFFFF 0xD9C4B0
+size 30 30
+sizeincrease 20
+alpha 100 156 260
+velocityjitter 160 160 60
+velocitymultiplier 0.4
+airfriction 0.3
+//sparks
+effect wakizashi_rocket_launch
+notunderwater
+count 10
+type spark
+tex 40 40
+color 0xFFFFFF 0xD9C4B0
+size 1 4
+alpha 200 256 1000
+velocityjitter 60 60 60
+velocitymultiplier -1.5
+
+effect wakizashi_booster_smoke
+type alphastatic
+notunderwater
+tex 0 8
+count 3
+size 60 100
+sizeincrease 10
+gravity -0.1
+alpha 200 750 200
+velocityjitter 40 40 40
+originjitter 60 60 60
+airfriction 2
+color 0xA69A80 0xB3B39F
+rotate -180 180 -20 20
+
+// decal
+effect raptor_cannon_impact
+countabsolute 1
+type decal
+tex 47 47
+size 24 24
+alpha 256 256 0
+originjitter 16 16 16
+rotate -180 180 0 0
+//spark
+effect raptor_cannon_impact
+notunderwater
+count 6
+type spark
+tex 40 40
+color 0xD400FF 0x571863
+size 1 1
+alpha 644 956 784
+gravity 1
+airfriction 0.2
+velocityoffset 0 0 150
+originjitter 16 16 16
+velocityjitter 124 124 524
+// smoke
+effect raptor_cannon_impact
+count 4
+type alphastatic
+tex 0 7
+size 50 50
+color 0x646364 0x151515
+alpha 428 428 600
+rotate -180 180 0 0
+velocityjitter 200 200 300
+velocityoffset 0 0 340
+gravity 0.7
+airfriction 2
+// fire
+effect raptor_cannon_impact
+notunderwater
+count 10
+type static
+tex 48 55
+color 0xD400FF 0x571863
+size 33 44
+sizeincrease 25
+alpha 200 256 812
+bounce 1.5
+airfriction 8
+liquidfriction 8
+originjitter 8 8 8
+velocityjitter 312 312 312
+
+
+effect raptor_cannon_muzzleflash
+count 16
+type spark
+color 0xD400FF 0x571863
+tex 8 15
+size 10 17
+alpha 1256 1512 56280
+airfriction 12
+originjitter 2 2 2
+velocityjitter 200 200 200
+velocitymultiplier 0.2
+sizeincrease -10
+stretchfactor 0.6
+effect raptor_cannon_muzzleflash
+countabsolute 1
+type static
+tex 48 55
+color 0xD400FF 0x571863
+size 32 32
+alpha 6056 20112 406280
+sizeincrease -100
+stretchfactor 0.1
+rotate -180 180 4000 -4000
+lightradius 150
+lightradiusfade 6000
+lightcolor 3 0 6
+
+// decal
+effect raptor_bomb_impact
+countabsolute 1
+type decal
+tex 8 16
+size 84 84
+alpha 256 256 0
+originjitter 16 16 16
+rotate -180 180 0 0
+
+//spark vertical
+effect raptor_bomb_impact
+count 3
+type spark
+color 0xff9c00 0xff3c00
+tex 48 55
+size 20 40
+alpha 300 300 600
+originjitter 10 10 10
+velocityjitter 40 40 120
+stretchfactor 210
+sizeincrease 50
+
+//fire
+effect raptor_bomb_impact
+count 4
+type static 
+color 0xff9c00 0xff3c00
+tex 48 55
+size 30 120
+alpha 300 300 500
+originjitter 10 10 10
+velocityjitter 950 950 0
+sizeincrease 230
+airfriction 2
+
+//smoke
+effect raptor_bomb_impact
+count 4
+type spark
+blend alpha
+tex 0 7
+size 120 180
+color 0x646364 0x151515
+alpha 428 428 600
+rotate -180 180 0 0
+velocityjitter 200 200 280
+velocityoffset 0 0 280
+originjitter 30 30 10
+stretchfactor 10
+
+//smoke 2
+effect raptor_bomb_impact
+count 4
+//type alphastatic
+type spark
+blend alpha
+tex 0 7
+size 40 100
+color 0x646364 0x151515
+alpha 328 328 350
+rotate -180 180 0 0
+velocityjitter 200 200 300
+velocityoffset 0 0 580
+originjitter 30 30 10
+sizeincrease 60
+airfriction 0.6
+gravity 2
+
+// sparks
+effect raptor_bomb_impact
+notunderwater
+count 5
+type spark
+tex 40 40
+color 0xffa35b 0xfff2be
+size 3 5
+alpha 644 956 984
+gravity 1
+airfriction 0.3
+velocityoffset 0 0 350
+originjitter 16 16 16
+velocityjitter 174 174 924
+stretchfactor 2
+
+effect raptor_bomb_spread
+notunderwater
+count 34
+type spark
+tex 40 40
+color 0xffa35b 0xfff2be
+size 1 2
+alpha 644 956 1284
+gravity 1
+airfriction 1
+liquidfriction 0.8
+originjitter 110 110 110
+velocityjitter 324 324 324
+
+
+// generic explosion size:big (biggest explosion ever)
+effect explosion_big
+countabsolute 1
+type decal
+tex 8 16
+size 172 172
+alpha 256 256 0
+originjitter 23 23 23
+lightradius 600
+lightradiusfade 1750
+lightcolor 8 4 0
+// shockwave
+effect explosion_big
+countabsolute 1
+type static
+tex 33 33 
+size 72 72
+alpha 56 56 330
+color 0x8f0d00 0xff5a00
+sizeincrease 4400
+// fire effect
+effect explosion_big
+notunderwater
+count 64
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 133 144
+sizeincrease 45
+alpha 200 256 712
+airfriction 8
+liquidfriction 8
+originjitter 80 80 80
+velocityjitter 2512 2512 2512
+// fire rays
+effect explosion_big
+notunderwater
+count 64
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 133 144
+sizeincrease 45
+alpha 200 256 800
+airfriction -5
+liquidfriction 8
+originjitter 40 40 40
+velocityjitter 512 512 512
+stretchfactor 10
+// smoke
+effect explosion_big
+type alphastatic
+notunderwater
+tex 0 8
+count 32
+size 50 100
+sizeincrease 244
+alpha 300 650 456
+velocityjitter 3444 3444 3444
+airfriction 8
+color 0x4F4B46 0x000000
+// bouncing sparks
+effect explosion_big
+notunderwater
+count 34
+type spark
+tex 40 40
+color 0xffa35b 0xfff2be
+size 3 4
+alpha 644 956 1284
+gravity 1
+airfriction 1
+liquidfriction 0.8
+velocityoffset 0 0 370
+originjitter 160 160 160
+velocityjitter 924 924 924
+stretchfactor 0.7
+// derbis
+effect explosion_big
+notunderwater
+count 16
+type alphastatic
+tex 66 68
+color 0xFFFFFF 0xcac5b4
+size 10 16
+alpha 444 1356 1184
+gravity 2.3
+airfriction 0.5
+velocityjitter 1800 1800 1800
+velocityoffset 0 0 970
+sizeincrease -5
+rotate -180 180 -1000 1000
+// underwater bubbles
+effect explosion_big
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 160 160 160
+velocityjitter 444 444 444
+// underwatershockwave
+effect explosion_big
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 2900
+alpha 40 40 300
+velocitymultiplier 0.3
+
+
+// generic explosion size:medium (it leaves rising smoke for a longer time)
+// shockwave
+effect explosion_medium
+countabsolute 1
+type static
+tex 33 33 
+size 72 72
+alpha 56 56 330
+color 0x8f0d00 0xff5a00
+sizeincrease 2400
+// fire effect
+effect explosion_medium
+notunderwater
+count 32
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 133 144
+sizeincrease 45
+alpha 200 256 712
+airfriction 8
+liquidfriction 8
+originjitter 30 30 30
+velocityjitter 1512 1512 1512
+rotate -180 180 -500 500
+// fire effect 2
+effect explosion_medium
+notunderwater
+count 32
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 73 94
+sizeincrease 40
+gravity -2
+alpha 200 256 612
+airfriction 8
+liquidfriction 8
+originjitter 30 30 30
+velocityjitter 1512 1512 1512
+rotate -180 180 -150 150
+// fire rays
+effect explosion_medium
+notunderwater
+count 14
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 43 74
+sizeincrease 40
+alpha 200 256 800
+airfriction -3
+liquidfriction 8
+originjitter 40 40 40
+velocityjitter 512 512 512
+stretchfactor 8
+// smoke 
+effect explosion_medium
+type alphastatic
+notunderwater
+tex 0 8
+count 5
+size 250 300
+sizeincrease -30
+alpha 300 650 756
+originjitter 100 100 100
+velocityjitter 200 200 200
+airfriction 3
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+// smoke 2
+effect explosion_medium
+type alphastatic
+notunderwater
+tex 0 8
+count 10
+size 50 100
+sizeincrease 50
+gravity -0.3
+alpha 300 650 256
+originjitter 100 100 100
+velocityjitter 500 500 500
+velocityoffset 0 0 200
+airfriction 3
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+// smoke rays
+effect explosion_medium
+type spark
+notunderwater
+tex 0 8
+count 13
+size 150 200
+sizeincrease 100
+alpha 140 255 350
+velocityjitter 250 250 250
+originjitter 40 40 40
+color 0x4F4B46 0x000000
+stretchfactor 50
+// bouncing sparks
+effect explosion_medium
+notunderwater
+count 14
+type spark
+tex 40 40
+color 0xffa35b 0xfff2be
+size 2 3
+alpha 644 956 984
+gravity 1
+airfriction 1
+liquidfriction 0.8
+velocityoffset 0 0 370
+originjitter 100 100 100
+velocityjitter 624 624 624
+stretchfactor 0.7
+// underwater bubbles
+effect explosion_medium
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 160 160 160
+velocityjitter 444 444 444
+// underwatershockwave
+effect explosion_medium
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 2900
+alpha 40 40 300
+velocitymultiplier 0.3
+
+// generic explosion size:small (its fire only, made to support other explosions)
+// shockwave
+effect explosion_small
+countabsolute 1
+type static
+tex 33 33 
+size 22 22
+alpha 56 56 330
+color 0x8f0d00 0xff5a00
+sizeincrease 2400
+// fire effect
+effect explosion_small
+notunderwater
+count 16
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 1 44
+sizeincrease 45
+alpha 200 256 1212
+airfriction 5
+liquidfriction 8
+velocityjitter 512 512 512
+rotate -180 180 -500 500
+// fire effect 2
+effect explosion_small
+notunderwater
+count 16
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 73 94
+sizeincrease 40
+alpha 200 256 812
+airfriction 8
+liquidfriction 8
+velocityjitter 912 912 912
+rotate -180 180 -150 150
+// fire rays
+effect explosion_small
+notunderwater
+count 14
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 13 54
+sizeincrease 30
+alpha 200 256 1300
+airfriction -3
+liquidfriction 8
+originjitter 40 40 40
+velocityjitter 512 512 512
+stretchfactor 8
+// underwater bubbles
+effect explosion_small
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 1 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 160 160 160
+velocityjitter 144 144 144
+// underwatershockwave
+effect explosion_small
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 1200
+alpha 40 40 300
+
+// big smoke ( for spamming on damaged stuff )
+effect smoke_big
+type alphastatic
+notunderwater
+tex 0 8
+count 3
+size 30 60
+sizeincrease 15
+gravity -0.5
+alpha 200 750 200
+originjitter 55 55 55
+velocityjitter 140 140 200
+velocityoffset 0 0 200
+airfriction 4
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+
+// small smoke ( more precise than big one, for spamming on damaged parts like raptors spinner )
+effect smoke_small
+type alphastatic
+notunderwater
+tex 0 8
+count 3
+size 60 100
+sizeincrease -10
+gravity -0.5
+alpha 200 750 200
+velocityjitter 40 40 400
+velocityoffset 0 0 200
+airfriction 4
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+
 // tuba does not use the weapon damage effect
 
 // laser damage effect
@@ -5900,4 +7050,4 @@ lightcolor 0.9 0.6 0.2
 
 // porto does not use the weapon damage effect
 
-// hook does not use the weapon damage effect
\ No newline at end of file
+// hook does not use the weapon damage effect
index e4d9632bcb458ec751958fe75220fe5da22a060e..48d0d43b87e409e030ca2ea3783fe1e7fd57bfd4 100644 (file)
@@ -1,4 +1,5 @@
 cl_decals 1
+cl_decals_models 0
 cl_decals_time 4
 cl_particles_quality 1
 gl_flashblend 0
@@ -8,7 +9,8 @@ mod_q3bsp_nolightmaps 0
 r_bloom 1
 r_coronas 1
 r_coronas_occlusionquery 1
-r_damageblur 0.4
+hud_postprocessing_maxbluralpha 0.5
+hud_powerup 0
 r_depthfirst 2
 r_drawdecals_drawdistance 500
 r_drawparticles_drawdistance 2000
index 0c3fef95b8cd4524e1052a0d23444a01a93fe9e2..9609a5780234582d3945e02c316c9a77d188174e 100644 (file)
@@ -1,4 +1,5 @@
 cl_decals 1
+cl_decals_models 0
 cl_decals_time 2
 cl_particles_quality 0.4
 gl_flashblend 1
@@ -8,7 +9,8 @@ mod_q3bsp_nolightmaps 1
 r_bloom 0
 r_coronas 1
 r_coronas_occlusionquery 0
-r_damageblur 0
+hud_postprocessing_maxbluralpha 0
+hud_powerup 0
 r_depthfirst 0
 r_drawdecals_drawdistance 200
 r_drawparticles_drawdistance 500
index 5b9ea85f39f48e75ee90ce96188460fe7655b629..94a85e5091a2146c326077707410d87142075e2f 100644 (file)
@@ -1,4 +1,5 @@
 cl_decals 1
+cl_decals_models 0
 cl_decals_time 2
 cl_particles_quality 1
 gl_flashblend 0
@@ -8,7 +9,8 @@ mod_q3bsp_nolightmaps 0
 r_bloom 0
 r_coronas 1
 r_coronas_occlusionquery 0
-r_damageblur 0
+hud_postprocessing_maxbluralpha 0
+hud_powerup 0
 r_depthfirst 0
 r_drawdecals_drawdistance 300
 r_drawparticles_drawdistance 1000
index 1ee62d057729f09d4eb04be9082c675c1cfdeff8..7822102ba9c11e9a0a4088eecdf5550cbf108a14 100644 (file)
@@ -1,4 +1,5 @@
 cl_decals 1
+cl_decals_models 0
 cl_decals_time 2
 cl_particles_quality 1
 gl_flashblend 0
@@ -8,7 +9,8 @@ mod_q3bsp_nolightmaps 0
 r_bloom 0
 r_coronas 1
 r_coronas_occlusionquery 0
-r_damageblur 0
+hud_postprocessing_maxbluralpha 0
+hud_powerup 0
 r_depthfirst 1
 r_drawdecals_drawdistance 300
 r_drawparticles_drawdistance 1000
index ffd5af713e2fae60aa7942b7a4e1a017a6d0018b..a68a15787ded9bb5b8a10003b278054e7e29c3c3 100644 (file)
@@ -1,4 +1,5 @@
 cl_decals 0
+cl_decals_models 0
 cl_decals_time 2
 cl_particles_quality 0.4
 gl_flashblend 1
@@ -8,7 +9,8 @@ mod_q3bsp_nolightmaps 1
 r_bloom 0
 r_coronas 1
 r_coronas_occlusionquery 0
-r_damageblur 0
+hud_postprocessing_maxbluralpha 0.5
+hud_powerup 0.5
 r_depthfirst 0
 r_drawdecals_drawdistance 100
 r_drawparticles_drawdistance 250
index e7a2efb3f1a0c368448853ae2ae779b037f24317..20cd2e563870d40b2678874e6802250a2ffbe02a 100644 (file)
@@ -1,4 +1,5 @@
 cl_decals 1
+cl_decals_models 1
 cl_decals_time 10
 cl_particles_quality 1
 gl_flashblend 0
@@ -8,7 +9,8 @@ mod_q3bsp_nolightmaps 0
 r_bloom 1
 r_coronas 1
 r_coronas_occlusionquery 1
-r_damageblur 0.4
+hud_postprocessing_maxbluralpha 0.5
+hud_powerup 0.5
 r_depthfirst 2
 r_drawdecals_drawdistance 500
 r_drawparticles_drawdistance 2000
index 218565408d372a4d3647ab023060e95b42d51575..94d47fab2e7cfcf4a600c625ecf6b8b401d99760 100644 (file)
@@ -1,4 +1,5 @@
 cl_decals 1
+cl_decals_models 1
 cl_decals_time 10
 cl_particles_quality 1
 gl_flashblend 0
@@ -8,7 +9,8 @@ mod_q3bsp_nolightmaps 0
 r_bloom 1
 r_coronas 1
 r_coronas_occlusionquery 1
-r_damageblur 0.4
+hud_postprocessing_maxbluralpha 0.5
+hud_powerup 0.5
 r_depthfirst 2
 r_drawdecals_drawdistance 500
 r_drawparticles_drawdistance 2000
diff --git a/fixtooltips.pl b/fixtooltips.pl
new file mode 100644 (file)
index 0000000..e7af7b2
--- /dev/null
@@ -0,0 +1,28 @@
+use strict;
+use warnings;
+use Locale::PO;
+
+sub quote($)
+{
+       my $s = shift;
+       $s = '"' . quotemeta($s) . '"';
+       return $s;
+}
+sub unquote($)
+{
+       my $s = shift;
+       $s =~ s/^"//;
+       $s =~ s/"$//;
+       $s =~ s/\\(.)/$1/g;
+       return $s;
+}
+my $po = Locale::PO->load_file_ashash("menu.dat." . $ENV{L} . ".po");
+while(<>)
+{
+       /\\(.*?)\\(.*)/s or do { print; next; };
+       my @s = split /\//, $1;
+       @s = map { $po->{quote($_)} ? unquote($po->{quote($_)}->msgstr()) : $_ } @s;
+       my $s = join "/", @s;
+       $_ = "\\$s\\$2";
+       print "$_";
+}
diff --git a/gfx/crosshair_ring_rifle.tga b/gfx/crosshair_ring_rifle.tga
new file mode 100644 (file)
index 0000000..b25e350
Binary files /dev/null and b/gfx/crosshair_ring_rifle.tga differ
diff --git a/gfx/crosshair_ring_sniperrifle.tga b/gfx/crosshair_ring_sniperrifle.tga
deleted file mode 100644 (file)
index b25e350..0000000
Binary files a/gfx/crosshair_ring_sniperrifle.tga and /dev/null differ
diff --git a/gfx/hud/default/weaponrifle.tga b/gfx/hud/default/weaponrifle.tga
new file mode 100644 (file)
index 0000000..f5c2e55
Binary files /dev/null and b/gfx/hud/default/weaponrifle.tga differ
diff --git a/gfx/hud/default/weaponsniperrifle.tga b/gfx/hud/default/weaponsniperrifle.tga
deleted file mode 100644 (file)
index f5c2e55..0000000
Binary files a/gfx/hud/default/weaponsniperrifle.tga and /dev/null differ
diff --git a/gfx/hud/luminos/weaponrifle.tga b/gfx/hud/luminos/weaponrifle.tga
new file mode 100644 (file)
index 0000000..f5c2e55
Binary files /dev/null and b/gfx/hud/luminos/weaponrifle.tga differ
diff --git a/gfx/hud/luminos/weaponsniperrifle.tga b/gfx/hud/luminos/weaponsniperrifle.tga
deleted file mode 100644 (file)
index f5c2e55..0000000
Binary files a/gfx/hud/luminos/weaponsniperrifle.tga and /dev/null differ
diff --git a/gfx/hud/old/weaponrifle.tga b/gfx/hud/old/weaponrifle.tga
new file mode 100644 (file)
index 0000000..09da559
Binary files /dev/null and b/gfx/hud/old/weaponrifle.tga differ
diff --git a/gfx/hud/old/weaponsniperrifle.tga b/gfx/hud/old/weaponsniperrifle.tga
deleted file mode 100644 (file)
index 09da559..0000000
Binary files a/gfx/hud/old/weaponsniperrifle.tga and /dev/null differ
index 76a7edf1fad45a5333f64ec13d3430c071efa4d2..67580e9daccdd08a4e6e8a66ce63fd7f42e7997f 100644 (file)
Binary files a/gfx/loading.tga and b/gfx/loading.tga differ
index 5f453bed6fd06bfe5918d341139166f5333cd60e..6cddc0ca32b09d1ca0b69b9c9ed574bab7e8bff3 100644 (file)
Binary files a/gfx/loading10.tga and b/gfx/loading10.tga differ
index 5fb261efc6cc1d8bc8416a6c266a83856c6613e0..0cee44b8c5ebb1385f428d99ac610a783dd6500c 100644 (file)
Binary files a/gfx/loading11.tga and b/gfx/loading11.tga differ
index 6345a9aa67343c06f38faa3f28e1450cab08a587..0314a97a7a1c4f836516d7d608ff9a11b8e49bcc 100644 (file)
Binary files a/gfx/loading12.tga and b/gfx/loading12.tga differ
diff --git a/gfx/loading13.tga b/gfx/loading13.tga
new file mode 100644 (file)
index 0000000..ef30878
Binary files /dev/null and b/gfx/loading13.tga differ
index 3aa4a29e150abc0068394c2a16c9761c4c936d33..63c4c4782023651f310c4c51aa5c3a6656450465 100644 (file)
Binary files a/gfx/loading2.tga and b/gfx/loading2.tga differ
index 639608565eafd28867b74cdebb00158f1aa02d15..42ae5cd48f228478a6ae26ac18f08571cfa53b2c 100644 (file)
Binary files a/gfx/loading3.tga and b/gfx/loading3.tga differ
index eaf44d09496ca033b8e57f97c1e79739117211be..62877a6729f2dcf2ca2e72520be72a041c790d68 100644 (file)
Binary files a/gfx/loading4.tga and b/gfx/loading4.tga differ
index c06d32320fd7370f5376f3feb839c3a1b476139a..96ec6c4a742a03742dc65aedf8178a07b7e0fe29 100644 (file)
Binary files a/gfx/loading5.tga and b/gfx/loading5.tga differ
index 7c8007c44680432d5f14cf900e20796951f65caf..a0e2fc85318dbf9081544ac239a531ee743e96da 100644 (file)
Binary files a/gfx/loading6.tga and b/gfx/loading6.tga differ
index 56aa4afc4b19b7bbd24c7bb01a5824004471ccdc..87d5f13e058959833fc64cb1a90237f7a004bc39 100644 (file)
Binary files a/gfx/loading7.tga and b/gfx/loading7.tga differ
index a41d344ef8b8e8b225d8f3d534a830aa1fc3078c..c8689704489adb6baf9b7bc5a0b4c3e2cef98a63 100644 (file)
Binary files a/gfx/loading8.tga and b/gfx/loading8.tga differ
index dc636036947a0671376bf6fc9528afa92ad0db96..ac758099aa2eda35a61f45fd31c58dd3c688449d 100644 (file)
Binary files a/gfx/loading9.tga and b/gfx/loading9.tga differ
diff --git a/gfx/vehicles/axh-bracket.tga b/gfx/vehicles/axh-bracket.tga
new file mode 100644 (file)
index 0000000..82f0796
Binary files /dev/null and b/gfx/vehicles/axh-bracket.tga differ
diff --git a/gfx/vehicles/axh-cross.tga b/gfx/vehicles/axh-cross.tga
new file mode 100644 (file)
index 0000000..69e1c0b
Binary files /dev/null and b/gfx/vehicles/axh-cross.tga differ
diff --git a/gfx/vehicles/axh-dropcross.tga b/gfx/vehicles/axh-dropcross.tga
new file mode 100644 (file)
index 0000000..e8ba095
Binary files /dev/null and b/gfx/vehicles/axh-dropcross.tga differ
diff --git a/gfx/vehicles/axh-ring.tga b/gfx/vehicles/axh-ring.tga
new file mode 100644 (file)
index 0000000..bb3ade5
Binary files /dev/null and b/gfx/vehicles/axh-ring.tga differ
diff --git a/gfx/vehicles/axh-special1.tga b/gfx/vehicles/axh-special1.tga
new file mode 100644 (file)
index 0000000..184a065
Binary files /dev/null and b/gfx/vehicles/axh-special1.tga differ
diff --git a/gfx/vehicles/axh-special2.tga b/gfx/vehicles/axh-special2.tga
new file mode 100644 (file)
index 0000000..caad1d7
Binary files /dev/null and b/gfx/vehicles/axh-special2.tga differ
diff --git a/gfx/vehicles/axh-tag.tga b/gfx/vehicles/axh-tag.tga
new file mode 100644 (file)
index 0000000..4eb3b66
Binary files /dev/null and b/gfx/vehicles/axh-tag.tga differ
diff --git a/gfx/vehicles/axh-target.tga b/gfx/vehicles/axh-target.tga
new file mode 100644 (file)
index 0000000..8c05908
Binary files /dev/null and b/gfx/vehicles/axh-target.tga differ
diff --git a/gfx/vehicles/axh-x.tga b/gfx/vehicles/axh-x.tga
new file mode 100644 (file)
index 0000000..f6a4fce
Binary files /dev/null and b/gfx/vehicles/axh-x.tga differ
diff --git a/gfx/vehicles/bar_dwn_left.tga b/gfx/vehicles/bar_dwn_left.tga
new file mode 100644 (file)
index 0000000..011f9a9
Binary files /dev/null and b/gfx/vehicles/bar_dwn_left.tga differ
diff --git a/gfx/vehicles/bar_dwn_right.tga b/gfx/vehicles/bar_dwn_right.tga
new file mode 100644 (file)
index 0000000..e93b5e6
Binary files /dev/null and b/gfx/vehicles/bar_dwn_right.tga differ
diff --git a/gfx/vehicles/bar_up_left.tga b/gfx/vehicles/bar_up_left.tga
new file mode 100644 (file)
index 0000000..f49d205
Binary files /dev/null and b/gfx/vehicles/bar_up_left.tga differ
diff --git a/gfx/vehicles/bar_up_right.tga b/gfx/vehicles/bar_up_right.tga
new file mode 100644 (file)
index 0000000..a3b5910
Binary files /dev/null and b/gfx/vehicles/bar_up_right.tga differ
diff --git a/gfx/vehicles/bullets.tga b/gfx/vehicles/bullets.tga
new file mode 100644 (file)
index 0000000..ff853ee
Binary files /dev/null and b/gfx/vehicles/bullets.tga differ
diff --git a/gfx/vehicles/frame.tga b/gfx/vehicles/frame.tga
new file mode 100644 (file)
index 0000000..92a6573
Binary files /dev/null and b/gfx/vehicles/frame.tga differ
diff --git a/gfx/vehicles/health.tga b/gfx/vehicles/health.tga
new file mode 100644 (file)
index 0000000..3956a3f
Binary files /dev/null and b/gfx/vehicles/health.tga differ
diff --git a/gfx/vehicles/hud_bg.tga b/gfx/vehicles/hud_bg.tga
deleted file mode 100644 (file)
index a2ba3b3..0000000
Binary files a/gfx/vehicles/hud_bg.tga and /dev/null differ
diff --git a/gfx/vehicles/raptor.tga b/gfx/vehicles/raptor.tga
new file mode 100644 (file)
index 0000000..9a2519a
Binary files /dev/null and b/gfx/vehicles/raptor.tga differ
diff --git a/gfx/vehicles/raptor_bombs.tga b/gfx/vehicles/raptor_bombs.tga
new file mode 100644 (file)
index 0000000..9012fb2
Binary files /dev/null and b/gfx/vehicles/raptor_bombs.tga differ
diff --git a/gfx/vehicles/raptor_guns.tga b/gfx/vehicles/raptor_guns.tga
new file mode 100644 (file)
index 0000000..0d0012a
Binary files /dev/null and b/gfx/vehicles/raptor_guns.tga differ
diff --git a/gfx/vehicles/rocket.tga b/gfx/vehicles/rocket.tga
new file mode 100644 (file)
index 0000000..f0385b9
Binary files /dev/null and b/gfx/vehicles/rocket.tga differ
diff --git a/gfx/vehicles/shield.tga b/gfx/vehicles/shield.tga
new file mode 100644 (file)
index 0000000..916268f
Binary files /dev/null and b/gfx/vehicles/shield.tga differ
diff --git a/gfx/vehicles/shiled.tga b/gfx/vehicles/shiled.tga
deleted file mode 100644 (file)
index bd728e2..0000000
Binary files a/gfx/vehicles/shiled.tga and /dev/null differ
diff --git a/gfx/vehicles/vh-shield.tga b/gfx/vehicles/vh-shield.tga
new file mode 100644 (file)
index 0000000..bd728e2
Binary files /dev/null and b/gfx/vehicles/vh-shield.tga differ
index a24a98c93330dc85b675e4c59a581e3038008083..4ed1381201a350b10cc7a0442120af1687d892eb 100644 (file)
@@ -24,7 +24,7 @@ seta cl_swapattacks_minstanex 0
 seta cl_swapattacks_hook 0
 seta cl_swapattacks_hlac 0
 seta cl_swapattacks_tuba 0
-seta cl_swapattacks_sniperrifle 0
+seta cl_swapattacks_rifle 0
 seta cl_swapattacks_fireball 0
 seta cl_swapattacks_seeker 0
 
index 4c11d42079856dee560dc26463a74c9e2001df10..de4dd05a852441dcd8c85a74b8a8d7697262c38d 100644 (file)
@@ -23,14 +23,12 @@ seta hud_progressbar_speed_color "1 0.75 0"
 seta hud_progressbar_acceleration_color "0.5 0.75 1"
 seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
 
-seta _hud_panelorder "15 12 9 10 5 6 14 0 7 4 11 2 1 3 8 13 "
+seta _hud_panelorder "15 12 9 10 5 6 14 0 7 4 11 2 1 3 8 13 16 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.010000"
 seta hud_configure_grid_ysize "0.010000"
 
-seta scr_centerpos "0.25"
-
 seta hud_panel_weapons 1
 seta hud_panel_weapons_pos "0.940000 0.180000"
 seta hud_panel_weapons_size "0.060000 0.610000"
@@ -218,7 +216,7 @@ seta hud_panel_infomessages_bg_border ""
 seta hud_panel_infomessages_bg_padding "0"
 seta hud_panel_infomessages_flip "1"
 
-seta hud_panel_physics 0
+seta hud_panel_physics 3
 seta hud_panel_physics_pos "0.420000 0.620000"
 seta hud_panel_physics_size "0.170000 0.080000"
 seta hud_panel_physics_bg ""
@@ -233,4 +231,19 @@ seta hud_panel_physics_acceleration_progressbar_mode "0"
 seta hud_panel_physics_progressbar "1"
 seta hud_panel_physics_text "1"
 
+seta hud_panel_centerprint 1
+seta hud_panel_centerprint_pos "0.180000 0.260000"
+seta hud_panel_centerprint_size "0.650000 0.210000"
+seta hud_panel_centerprint_bg "0"
+seta hud_panel_centerprint_bg_color ""
+seta hud_panel_centerprint_bg_color_team ""
+seta hud_panel_centerprint_bg_alpha ""
+seta hud_panel_centerprint_bg_border ""
+seta hud_panel_centerprint_bg_padding ""
+seta hud_panel_centerprint_align "0.5"
+seta hud_panel_centerprint_flip "1"
+seta hud_panel_centerprint_fontscale "1"
+seta hud_panel_centerprint_time "3"
+seta hud_panel_centerprint_fadetime "0.25"
+
 menu_sync
index 5d803304475b0b1a78ee8416ef6a2c62bff8db55..52d2aef67e98ba520abef50fa35ff2252d0746f8 100644 (file)
@@ -23,14 +23,12 @@ seta hud_progressbar_speed_color "1 0.75 0"
 seta hud_progressbar_acceleration_color "0.5 0.75 1"
 seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
 
-seta _hud_panelorder "10 3 0 14 6 9 13 4 1 2 11 12 7 5 8 15 "
+seta _hud_panelorder "10 3 0 14 6 9 13 4 1 2 11 12 7 5 8 15 16 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.010000"
 seta hud_configure_grid_ysize "0.010000"
 
-seta scr_centerpos "0.25"
-
 seta hud_panel_weapons 1
 seta hud_panel_weapons_pos "0.350000 0.940000"
 seta hud_panel_weapons_size "0.300000 0.060000"
@@ -218,7 +216,7 @@ seta hud_panel_infomessages_bg_border ""
 seta hud_panel_infomessages_bg_padding "0"
 seta hud_panel_infomessages_flip "1"
 
-seta hud_panel_physics 0
+seta hud_panel_physics 3
 seta hud_panel_physics_pos "0.440000 0.590000"
 seta hud_panel_physics_size "0.120000 0.050000"
 seta hud_panel_physics_bg ""
@@ -233,4 +231,19 @@ seta hud_panel_physics_acceleration_progressbar_mode "0"
 seta hud_panel_physics_progressbar "3"
 seta hud_panel_physics_text "2"
 
+seta hud_panel_centerprint 1
+seta hud_panel_centerprint_pos "0.180000 0.260000"
+seta hud_panel_centerprint_size "0.650000 0.210000"
+seta hud_panel_centerprint_bg "0"
+seta hud_panel_centerprint_bg_color ""
+seta hud_panel_centerprint_bg_color_team ""
+seta hud_panel_centerprint_bg_alpha ""
+seta hud_panel_centerprint_bg_border ""
+seta hud_panel_centerprint_bg_padding ""
+seta hud_panel_centerprint_align "0.5"
+seta hud_panel_centerprint_flip "1"
+seta hud_panel_centerprint_fontscale "1"
+seta hud_panel_centerprint_time "3"
+seta hud_panel_centerprint_fadetime "0.25"
+
 menu_sync
index a5e16e75a4acb7430e89a8c3e67bf1e07980ce77..8ff2dd2a82aab3de02637ca12822368413cba0ed 100644 (file)
@@ -23,14 +23,12 @@ seta hud_progressbar_speed_color "1 0.75 0"
 seta hud_progressbar_acceleration_color "0.5 0.75 1"
 seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
 
-seta _hud_panelorder "15 10 9 6 8 14 5 0 4 13 2 7 1 3 11 12 "
+seta _hud_panelorder "15 10 9 6 8 14 5 0 4 13 2 7 1 3 11 12 16 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.010000"
 seta hud_configure_grid_ysize "0.010000"
 
-seta scr_centerpos "0.25"
-
 seta hud_panel_weapons 1
 seta hud_panel_weapons_pos "0.920000 0.090000"
 seta hud_panel_weapons_size "0.060000 0.630000"
@@ -218,7 +216,7 @@ seta hud_panel_infomessages_bg_border ""
 seta hud_panel_infomessages_bg_padding "0"
 seta hud_panel_infomessages_flip "1"
 
-seta hud_panel_physics 0
+seta hud_panel_physics 3
 seta hud_panel_physics_pos "0.410000 0.590000"
 seta hud_panel_physics_size "0.180000 0.100000"
 seta hud_panel_physics_bg ""
@@ -233,4 +231,19 @@ seta hud_panel_physics_acceleration_progressbar_mode "0"
 seta hud_panel_physics_progressbar "1"
 seta hud_panel_physics_text "1"
 
+seta hud_panel_centerprint 1
+seta hud_panel_centerprint_pos "0.180000 0.260000"
+seta hud_panel_centerprint_size "0.650000 0.210000"
+seta hud_panel_centerprint_bg "0"
+seta hud_panel_centerprint_bg_color ""
+seta hud_panel_centerprint_bg_color_team ""
+seta hud_panel_centerprint_bg_alpha ""
+seta hud_panel_centerprint_bg_border ""
+seta hud_panel_centerprint_bg_padding ""
+seta hud_panel_centerprint_align "0.5"
+seta hud_panel_centerprint_flip "1"
+seta hud_panel_centerprint_fontscale "1"
+seta hud_panel_centerprint_time "3"
+seta hud_panel_centerprint_fadetime "0.25"
+
 menu_sync
index 55a1149e9226adbe2140ddaae253cf51cdd4fcba..1d70bc03e9fe140e9f59163dd8106186de0e16f6 100644 (file)
@@ -23,14 +23,12 @@ seta hud_progressbar_speed_color "1 0.75 0"
 seta hud_progressbar_acceleration_color "0.5 0.75 1"
 seta hud_progressbar_acceleration_neg_color "0.125 0.25 0.5"
 
-seta _hud_panelorder "15 3 1 2 11 10 0 14 6 9 13 4 12 7 5 8 "
+seta _hud_panelorder "15 3 1 2 11 10 0 14 6 9 13 4 12 7 5 8 16 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.010000"
 seta hud_configure_grid_ysize "0.010000"
 
-seta scr_centerpos "0.25"
-
 seta hud_panel_weapons 1
 seta hud_panel_weapons_pos "0.350000 0.940000"
 seta hud_panel_weapons_size "0.300000 0.060000"
@@ -218,7 +216,7 @@ seta hud_panel_infomessages_bg_border ""
 seta hud_panel_infomessages_bg_padding "0"
 seta hud_panel_infomessages_flip "1"
 
-seta hud_panel_physics 0
+seta hud_panel_physics 3
 seta hud_panel_physics_pos "0.270000 0.730000"
 seta hud_panel_physics_size "0.170000 0.030000"
 seta hud_panel_physics_bg ""
@@ -233,4 +231,19 @@ seta hud_panel_physics_acceleration_progressbar_mode "0"
 seta hud_panel_physics_progressbar "3"
 seta hud_panel_physics_text "2"
 
+seta hud_panel_centerprint 1
+seta hud_panel_centerprint_pos "0.180000 0.260000"
+seta hud_panel_centerprint_size "0.650000 0.210000"
+seta hud_panel_centerprint_bg "0"
+seta hud_panel_centerprint_bg_color ""
+seta hud_panel_centerprint_bg_color_team ""
+seta hud_panel_centerprint_bg_alpha ""
+seta hud_panel_centerprint_bg_border ""
+seta hud_panel_centerprint_bg_padding ""
+seta hud_panel_centerprint_align "0.5"
+seta hud_panel_centerprint_flip "1"
+seta hud_panel_centerprint_fontscale "1"
+seta hud_panel_centerprint_time "3"
+seta hud_panel_centerprint_fadetime "0.25"
+
 menu_sync
index 87bebc5d035fd5e49d33a74a149e23ffcce4bbc3..3b17d6cc446bfe9d9fd66231501e0b82fbba2e45 100644 (file)
@@ -23,14 +23,12 @@ seta hud_progressbar_speed_color "0.25 0.25 1"
 seta hud_progressbar_acceleration_color "0.25 1 0.25"
 seta hud_progressbar_acceleration_neg_color "1 0.25 0.25"
 
-seta _hud_panelorder "15 0 11 8 5 6 14 9 13 7 2 3 1 10 12 4 "
+seta _hud_panelorder "15 0 11 8 5 6 14 9 13 7 2 3 1 10 12 4 16 "
 
 seta hud_configure_grid "1"
 seta hud_configure_grid_xsize "0.01"
 seta hud_configure_grid_ysize "0.01"
 
-seta scr_centerpos "0.25"
-
 seta hud_panel_weapons 1
 seta hud_panel_weapons_pos "0.370000 0.870000"
 seta hud_panel_weapons_size "0.340000 0.060000"
@@ -218,7 +216,7 @@ seta hud_panel_infomessages_bg_border ""
 seta hud_panel_infomessages_bg_padding ""
 seta hud_panel_infomessages_flip "1"
 
-seta hud_panel_physics 0
+seta hud_panel_physics 3
 seta hud_panel_physics_pos "0.430000 0.640000"
 seta hud_panel_physics_size "0.140000 0.100000"
 seta hud_panel_physics_bg "0"
@@ -233,4 +231,19 @@ seta hud_panel_physics_acceleration_progressbar_mode "0"
 seta hud_panel_physics_progressbar "3"
 seta hud_panel_physics_text "2"
 
+seta hud_panel_centerprint 1
+seta hud_panel_centerprint_pos "0.180000 0.260000"
+seta hud_panel_centerprint_size "0.650000 0.210000"
+seta hud_panel_centerprint_bg "0"
+seta hud_panel_centerprint_bg_color ""
+seta hud_panel_centerprint_bg_color_team ""
+seta hud_panel_centerprint_bg_alpha ""
+seta hud_panel_centerprint_bg_border ""
+seta hud_panel_centerprint_bg_padding ""
+seta hud_panel_centerprint_align "0.5"
+seta hud_panel_centerprint_flip "1"
+seta hud_panel_centerprint_fontscale "1"
+seta hud_panel_centerprint_time "3"
+seta hud_panel_centerprint_fadetime "0.25"
+
 menu_sync
diff --git a/input-demoseeking.cfg b/input-demoseeking.cfg
new file mode 100644 (file)
index 0000000..45df74f
--- /dev/null
@@ -0,0 +1,32 @@
+alias playdemo "set _demo_name \"$1\""
+set _demo_name ""
+set _demo_seeking 0
+set _demo_good 0
+set _demo_time_increasing 0
+set _demo_time 0
+set _demo_time_step 0
+alias seekdemo "_seekdemo_1_$_demo_seeking $1"
+alias _seekdemo_1_0 "cl_cmd rpn time dup        \"$1\" add dup /_demo_time exch def le /_demo_time_increasing exch def; _seekdemo_2"
+alias _seekdemo_1_1 "cl_cmd rpn time _demo_time \"$1\" add dup /_demo_time exch def le /_demo_time_increasing exch def; _seekdemo_2"
+alias _seekdemo_2 "_demo_seeking 1; r_render 0; snd_startnonloopingsounds 0; _seekdemo_3_$_demo_time_increasing"
+alias _seekdemo_3_0 "playdemo \"$_demo_name\"; _seekdemo_4; defer 10 _seekdemo_9_2"
+alias _seekdemo_3_1 "_seekdemo_7"
+alias _seekdemo_4 "set _demo_good 0; cl_cmd rpn /_demo_good 1 def; _seekdemo_5"
+alias _seekdemo_5 "_seekdemo_6_$_demo_good"
+alias _seekdemo_6_0 "defer 0.001 _seekdemo_4"
+alias _seekdemo_6_1 "defer clear; _seekdemo_7"
+alias _seekdemo_7 "set _demo_time_step 2; cl_cmd rpn _demo_time time gt /_demo_time_step exch def; _seekdemo_8"
+alias _seekdemo_8 "_seekdemo_9_$_demo_time_step"
+alias _seekdemo_9_0 "slowmo 1; set _demo_seeking 0; r_render 1; snd_startnonloopingsounds 1"
+alias _seekdemo_9_1 "cl_cmd rpn _demo_time time sub 10 mul 1 add /slowmo exch def; defer 0.001 _seekdemo_7"
+alias _seekdemo_9_2 "slowmo 1; set _demo_seeking 0; r_render 1; snd_startnonloopingsounds 1; echo SEEK FAILED"
+bind , "seekdemo -5"
+bind . "seekdemo +5"
+bind m "seekdemo -30"
+bind - "seekdemo +30"
+bind / "seekdemo +30"
+
+// Usage:
+//   start a demo
+//   use ,. keys to seek -5/+5 seconds
+//   use m/ keys (left/right of ,.) to seek -30/+30 seconds
index 56ff29d76685d0a2a16f2a11f24d44d477cde172..ca1f9b37e074d6d8ad824987262002cffda23830 100644 (file)
 "weaplast"                              "previously used"
 "weapbest"                              "best"
 "reload"                                "reload"
-"impulse 1"                             "Laser"
-"impulse 2"                             "Shotgun"
-"impulse 3"                             "Machine Gun"
-"impulse 4"                             "Mortar / Mine Layer"
-"impulse 5"                             "Electro"
-"impulse 6"                             "Crylink / HLAC"
-"impulse 7"                             "Nex / MinstaNex / Rifle"
-"impulse 8"                             "Hagar / Seeker"
-"impulse 9"                             "Rocket Launcher / Fireball"
-"impulse 14"                            "Port-O-Launch / Hook"
+"weapon_group_1"                        "Laser"
+"weapon_group_2"                        "Shotgun"
+"weapon_group_3"                        "Machine Gun"
+"weapon_group_4"                        "Mortar / Mine Layer"
+"weapon_group_5"                        "Electro"
+"weapon_group_6"                        "Crylink / HLAC"
+"weapon_group_7"                        "Nex / MinstaNex / Rifle"
+"weapon_group_8"                        "Hagar / Seeker"
+"weapon_group_9"                        "Rocket Launcher / Fireball"
+"weapon_group_0"                        "Port-O-Launch / Hook"
 ""                                      ""
 ""                                      "View"
 "+zoom"                                 "hold zoom"
diff --git a/keybinds.txt.it b/keybinds.txt.it
new file mode 100644 (file)
index 0000000..82baa6e
--- /dev/null
@@ -0,0 +1,91 @@
+""                                      "Movimento"
+"+forward"                              "avanti"
+"+back"                                 "indietro"
+"+moveleft"                             "a sinistra"
+"+moveright"                            "a destra"
+"+jump"                                 "salta / nuota"
+"+crouch"                               "accovacciarsi / abbassarsi"
+"+hook"                                 "uncino / jet pack"
+""                                      ""
+""                                      "Attacco"
+"+fire"                                 "fuoco primario"
+"+fire2"                                "fuoco secondario"
+""                                      ""
+""                                      "Cambio d'arma"
+"weapprev"                              "arma precedente"
+"weapnext"                              "arma successiva"
+"weaplast"                              "ultima arma usata"
+"weapbest"                              "miglior arma"
+"reload"                                "ricarica"
+"impulse 1"                             "Laser"
+"impulse 2"                             "Shotgun"
+"impulse 3"                             "Machine Gun"
+"impulse 4"                             "Mortar / Mine Layer"
+"impulse 5"                             "Electro"
+"impulse 6"                             "Crylink / HLAC"
+"impulse 7"                             "Nex / MinstaNex / Fucile"
+"impulse 8"                             "Hagar / Seeker"
+"impulse 9"                             "Rocket Launcher / Fireball"
+"impulse 14"                            "Port-O-Launch / Hook"
+""                                      ""
+""                                      "Vista"
+"+zoom"                                 "tieni zoom"
+"togglezoom"                            "attiva/disattiva zoom"
+"+showscores"                           "mostra punteggio"
+"screenshot"                            "cattura schermata"
+""                                      ""
+""                                      "Comunicazione"
+"messagemode"                           "chat pubblica"
+"messagemode2"                          "chat di squadra"
+"+con_chat_maximize"                    "mostra storia chat"
+"vyes"                                  "vota SÌ"
+"vno"                                   "vota NO"
+"ready"                                 "pronto"
+""                                      ""
+""                                      "Client"
+"+show_info"                            "info del server"
+"toggleconsole"                         "apri console"
+"disconnect"                            "disconnetti"
+"quit"                                  "esci"
+""                                      ""
+""                                      "Teamplay"
+"messagemode2"                          "chat di squadra"
+"team_auto"                             "auto-unisciti ad una squadra"
+"menu_showteamselect"                   "selezione della squadra"
+"spec"                                  "entra in modalità spettatore"
+"dropweapon"                            "rilascia arma"
+"+use"                                  "rilascia chiave / rilascia bandiera"
+""                                      ""
+""                                      "Definiti dall'utente"
+"+userbind 1"                           "$userbind1"
+"+userbind 2"                           "$userbind2"
+"+userbind 3"                           "$userbind3"
+"+userbind 4"                           "$userbind4"
+"+userbind 5"                           "$userbind5"
+"+userbind 6"                           "$userbind6"
+"+userbind 7"                           "$userbind7"
+"+userbind 8"                           "$userbind8"
+"+userbind 9"                           "$userbind9"
+"+userbind 10"                          "$userbind10"
+"+userbind 11"                          "$userbind11"
+"+userbind 12"                          "$userbind12"
+"+userbind 13"                          "$userbind13"
+"+userbind 14"                          "$userbind14"
+"+userbind 15"                          "$userbind15"
+"+userbind 16"                          "$userbind16"
+"+userbind 17"                          "$userbind17"
+"+userbind 18"                          "$userbind18"
+"+userbind 19"                          "$userbind19"
+"+userbind 20"                          "$userbind20"
+"+userbind 21"                          "$userbind21"
+"+userbind 22"                          "$userbind22"
+"+userbind 23"                          "$userbind23"
+"+userbind 24"                          "$userbind24"
+"+userbind 25"                          "$userbind25"
+"+userbind 26"                          "$userbind26"
+"+userbind 27"                          "$userbind27"
+"+userbind 28"                          "$userbind28"
+"+userbind 29"                          "$userbind29"
+"+userbind 30"                          "$userbind30"
+"+userbind 31"                          "$userbind31"
+"+userbind 32"                          "$userbind32"
index 3239d487d8f3141ca738550e6307d8b73a9aa7a6..2ec8ac7b875b8fd60ce9de35bc92879251850ee9 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:05+0200\n"
+"POT-Creation-Date: 2011-08-21 14:00+0200\n"
 "PO-Revision-Date: 2011-04-20 10:46+0200\n"
 "Last-Translator: Rudolf Polzer <divVerent@xonotic.org>\n"
 "Language-Team: Rudolf Polzer <divVerent@xonotic.org>\n"
@@ -111,7 +111,7 @@ msgstr "Entwickler"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
 #: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
 msgid "OK"
@@ -158,7 +158,12 @@ msgstr "Munitionsanzeige:"
 msgid "Show only current ammo type"
 msgstr "Nur aktuellen Munitionstyp anzeigen"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr "Icon ausrichten:"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
@@ -167,6 +172,7 @@ msgid "Left"
 msgstr "Links"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
@@ -174,6 +180,35 @@ msgstr "Links"
 msgid "Right"
 msgstr "Rechts"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr "Nachrichten"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
+msgstr "Anzeigedauer:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+msgid "Fade time:"
+msgstr "Ausblenden nach:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
+msgstr "Reihenfolge vertauschen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+msgid "Text alignment:"
+msgstr "Textausrichtung:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr "Mittig"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
+msgstr "Schriftgröße:"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
 msgid "Chat Panel"
 msgstr "Chat-Panel"
@@ -283,6 +318,102 @@ msgstr "Eintrags-Sichtbarkeit:"
 msgid "Entry fadetime:"
 msgstr "Eintrags-Ausblendung:"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr "Physik-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Panel nicht anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
+msgstr "Panel anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
+msgstr "Panel auch beim Zuschauen anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
+msgstr "Panel nur in Race und CTS anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr "Statusleiste"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Links"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Rechts"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr "Innen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr "Außen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr "Geschwindigkeit/Beschleunigung tauschen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
+msgstr "Geschwindigkeit:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr "Mit vertikaler Geschwindigkeit"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr "Geschwindigkeitseinheit:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "Knoten"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
+msgstr "Anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
+msgstr "Geschwindigkeitsrekord:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr "Beschleunigung:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr "Mit vertikaler Beschleunigung"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
 msgid "Powerups Panel"
 msgstr "Bonus-Panel"
@@ -295,11 +426,6 @@ msgstr "Strength und Shield vertauschen"
 msgid "Pressed Keys Panel"
 msgstr "Gedrückte-Tasten-Panel"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Panel nicht anzeigen"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
 msgid "Panel enabled when spectating"
 msgstr "Panel beim Zuschauen anzeigen"
@@ -333,7 +459,7 @@ msgstr "Radar:"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
 msgid "Alpha:"
 msgstr "Alpha:"
 
@@ -389,6 +515,26 @@ msgstr "nie vergrößert"
 msgid "Score Panel"
 msgstr "Punkte-Panel"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr "Punkte:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr "Platzierungen:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr "Aus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr "Auch für mich"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr "Rein"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
 msgid "Timer Panel"
 msgstr "Zeit-Panel"
@@ -431,11 +577,11 @@ msgstr "%ds"
 msgid "Fade effect:"
 msgstr "Ausblendeeffekt:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
 msgid "EF^None"
 msgstr "keiner"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
 msgid "Slide"
 msgstr "Schieben"
 
@@ -443,39 +589,43 @@ msgstr "Schieben"
 msgid "Alpha"
 msgstr "Alpha"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
+msgstr "beide"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
 msgid "Weapon icons:"
 msgstr "Waffensymbole:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
 msgid "Show weapon ID as:"
 msgstr "Waffen-ID zeigen als:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
 msgid "SHOWAS^None"
 msgstr "nichts"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
 msgid "Number"
 msgstr "Zahl"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
 msgid "Bind"
 msgstr "Taste"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
 msgid "Show Accuracy"
 msgstr "Trefferquote zeigen"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
 msgid "Show Ammo"
 msgstr "Munition zeigen"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
 msgid "Ammo bar color:"
 msgstr "Muntionsleistenfarbe:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
 msgid "Ammo bar alpha:"
 msgstr "Munitionsleistenalpha:"
 
@@ -487,20 +637,24 @@ msgstr "HUD-Konfiguration"
 msgid "Panel background defaults:"
 msgstr "Panel-Standardhintergrund:"
 
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Hintergrund:"
+
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
 msgid "Disable"
 msgstr "Aus"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
 msgid "Color:"
 msgstr "Farbe:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
 msgid "Border size:"
 msgstr "Rahmengröße:"
 
@@ -509,11 +663,11 @@ msgstr "Rahmengröße:"
 msgid "Team color:"
 msgstr "Teamfarbe:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
 msgid "Test team color in configure mode"
 msgstr "Teamfarbe bei Konfiguration testen"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
 msgid "Padding:"
 msgstr "Abstand:"
 
@@ -583,131 +737,131 @@ msgstr "Demos"
 msgid "Player Setup"
 msgstr "Spieler-Einstellungen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
 msgid "Game type:"
 msgstr "Spieltyp"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
 msgid "Match settings:"
 msgstr "Spieleinstellungen:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
 msgid "Time limit:"
 msgstr "Zeitlimit:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
 msgid "Use map specified default"
 msgstr "Standardwert der Map verwenden"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
 msgid "Point limit:"
 msgstr "Punktelimit"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
 msgid "Player slots:"
 msgstr "Spielerplätze:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
 msgid "Number of bots:"
 msgstr "Anzahl Bots:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
 msgid "Bot skill:"
 msgstr "Spielstärke:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
 msgid "Botlike"
 msgstr "Bots halt"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
 msgid "Beginner"
 msgstr "Anfänger"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
 msgid "You will win"
 msgstr "Gewinnst schon"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
 msgid "You can win"
 msgstr "Kannst gewinnen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
 msgid "You might win"
 msgstr "Könntest gewinnen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
 msgid "Advanced"
 msgstr "Fortgeschritten"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
 msgid "Expert"
 msgstr "Experte"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
 msgid "Pro"
 msgstr "Profi"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
 msgid "Assassin"
 msgstr "Mörder"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
 msgid "Unhuman"
 msgstr "Übermenschlich"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
 msgid "Godlike"
 msgstr "Gottgleich"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
 msgid "Mutators..."
 msgstr "Mutators..."
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
 msgid "Advanced settings..."
 msgstr "Erweiterte Einstellungen..."
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
 msgid "Map list:"
 msgstr "Mapliste:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
 msgid "Select all"
 msgstr "Alle auswählen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
 msgid "Select none"
 msgstr "Keine auswählen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
 msgid "Start Multiplayer!"
 msgstr "Starten!"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
 msgid "Capture limit:"
 msgstr "Capture-Limit:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
 msgid "Lives:"
 msgstr "Leben:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
 msgid "Laps:"
 msgstr "Runden:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
 msgid "Goals:"
 msgstr "Tore:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
 msgid "Frag limit:"
 msgstr "Punktelimit:"
 
@@ -827,14 +981,13 @@ msgstr "Features:"
 msgid "Game types:"
 msgstr "Spieltyp:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
 msgid "Close"
 msgstr "Schließen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+msgid "MAP^Play"
 msgstr "Start"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
@@ -984,6 +1137,10 @@ msgstr "Löschen"
 msgid "Timedemo"
 msgstr "Timedemo"
 
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "DEMO^Play"
+msgstr "Abspielen"
+
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
 msgid "Join"
 msgstr "Verbinden"
@@ -1251,11 +1408,11 @@ msgid "Damage splash:"
 msgstr "Schadenseffekt:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:194
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:30
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
 msgid "Apply immediately"
 msgstr "Sofort anwenden"
 
@@ -1315,15 +1472,7 @@ msgstr "Automatisch auf beste Waffe wechseln"
 msgid "Draw 1st person weapon model"
 msgstr "Waffe in 3D anzeigen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Links"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Rechts"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
 msgid "Flip view horizontally"
 msgstr "3D-Ansicht spiegeln"
 
@@ -1393,7 +1542,7 @@ msgstr "Master:"
 msgid "Music:"
 msgstr "Musik:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
 msgid "VOL^Ambient:"
 msgstr "Umgebung:"
 
@@ -1401,180 +1550,180 @@ msgstr "Umgebung:"
 msgid "Info:"
 msgstr "Info:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
 msgid "Items:"
 msgstr "Gegenstände:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
 msgid "Pain:"
 msgstr "Schmerz:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
 msgid "Player:"
 msgstr "Spieler:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
 msgid "Shots:"
 msgstr "Schüsse:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
 msgid "Voice:"
 msgstr "Stimme:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
 msgid "Weapons:"
 msgstr "Waffen:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
 msgid "Frequency:"
 msgstr "Frequenz:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
 msgid "8 kHz"
 msgstr "8 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
 msgid "11.025 kHz"
 msgstr "11,025 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
 msgid "16 kHz"
 msgstr "16 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
 msgid "22.05 kHz"
 msgstr "22,05 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
 msgid "24 kHz"
 msgstr "24 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
 msgid "32 kHz"
 msgstr "32 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
 msgid "44.1 kHz"
 msgstr "44,1 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
 msgid "48 kHz"
 msgstr "48 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
 msgid "Channels:"
 msgstr "Kanäle"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
 msgid "Mono"
 msgstr "Mono"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
 msgid "Stereo"
 msgstr "Stereo"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
 msgid "2.1"
 msgstr "2.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
 msgid "4"
 msgstr "4"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
 msgid "5"
 msgstr "5"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
 msgid "5.1"
 msgstr "5.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
 msgid "6.1"
 msgstr "6.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
 msgid "7.1"
 msgstr "7.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
 msgid "Swap Stereo"
 msgstr "Stereokanäle tauschen"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
 msgid "Headphone friendly mode"
 msgstr "Kopfhörer-Modus"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
 msgid "Spatial voices:"
 msgstr "Räumliche Sprachnachrichten:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
 msgid "VOCS^None"
 msgstr "keine"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
 msgid "VOCS^Taunts"
 msgstr "nur Spott"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
 msgid "VOCS^All"
 msgstr "alle"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
 msgid "Taunt range:"
 msgstr "Spott-Radius:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
 msgid "RNG^Very short"
 msgstr "Sehr klein"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
 msgid "RNG^Short"
 msgstr "Klein"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
 msgid "RNG^Normal"
 msgstr "Normal"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
 msgid "RNG^Long"
 msgstr "Groß"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
 msgid "RNG^Full"
 msgstr "Sehr groß"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
 msgid "Automatic taunts"
 msgstr "Automatischer Spott"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
 msgid "Time warning:"
 msgstr "Zeitwarnung:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
 msgid "WRN^None"
 msgstr "keine"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
 msgid "1 minute"
 msgstr "1 Minute"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
 msgid "5 minutes"
 msgstr "5 Minuten"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
 msgid "WRN^Both"
 msgstr "beide"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
 msgid "Hit indicator"
 msgstr "Treffer-Indikator"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
 msgid "Menu sounds"
 msgstr "Menü-Sounds"
 
@@ -1717,106 +1866,110 @@ msgstr "Partikeldistanz:"
 msgid "Decals"
 msgstr "Einschusslöcher"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr "auch auf Objekten"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
 msgid "Distance:"
 msgstr "Distanz:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
 msgid "Time:"
 msgstr "Zeit:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
 msgid "Use lightmaps"
 msgstr "Lightmaps verwenden"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
 msgid "Deluxe mapping"
 msgstr "Deluxemapping"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
 msgid "Gloss"
 msgstr "Glanz"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
 msgid "Offset mapping"
 msgstr "Offsetmapping"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
 msgid "Relief mapping"
 msgstr "Reliefmapping"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
 msgid "Reflections:"
 msgstr "Reflexionen:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
 msgid "Blurred"
 msgstr "Schwammig"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
 msgid "REFL^Good"
 msgstr "Gut"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
 msgid "Sharp"
 msgstr "Scharf"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
 msgid "Show surfaces"
 msgstr "Oberflächen anzeigen"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
 msgid "No dynamic lighting"
 msgstr "Kein dynamisches Licht"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
 msgid "Flash blend approximation"
 msgstr "Flash-Blend-Näherung"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
 msgid "Realtime dynamic lighting"
 msgstr "Dynamisches Licht in Echtzeit"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
 msgid "Shadows"
 msgstr "Schatten"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
 msgid "Realtime world lighting"
 msgstr "Map-Licht in Echtzeit"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
 msgid "Use normal maps"
 msgstr "Normalmaps verwenden"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
 msgid "Soft shadows"
 msgstr "Weiche Schatten"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
 msgid "Coronas"
 msgstr "Koronas"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
 msgid "Use Occlusion Queries"
 msgstr "Occlusion Queries verwenden"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
 msgid "Bloom"
 msgstr "Überstrahlung"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
 msgid "High Dynamic Range (HDR)"
 msgstr "Lichtdynamik (HDR)"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
 msgid "Motion blur:"
 msgstr "Bewegungsunschärfe:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr "Schadensunschärfe:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
+msgstr "Schärfeeffekte"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:26
 msgid "Key bindings:"
@@ -1834,29 +1987,29 @@ msgstr "Bearbeiten..."
 msgid "Sensitivity:"
 msgstr "Empfindlichkeit:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
 msgid "UI mouse speed:"
 msgstr "Mausgeschwindigkeit:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
 msgid "Mouse filter"
 msgstr "Mausfilterung"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
 msgid "Invert mouse"
 msgstr "Höhe invertieren"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
 msgid "Use joystick input"
 msgstr "Joystick verwenden"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
 msgid "Turn off OS mouse acceleration"
 msgstr "Mausbeschleunigung deaktivieren"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
 msgid "\"enter console\" also closes"
 msgstr "\"Konsole öffnen\" schließt auch"
 
@@ -1897,42 +2050,6 @@ msgid "Show frames per second"
 msgstr "Frames pro Sekunde anzeigen"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Tachometer"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (ohne Einheit)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "Knoten"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Akzelerometer anzeigen"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Akzelerometer-Skalierung:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
 msgid "Minimize input latency"
 msgstr "Eingabelatenz minimieren"
 
@@ -2128,19 +2245,19 @@ msgstr "Kontrast:"
 msgid "Gamma:"
 msgstr "Gamma:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
 msgid "Contrast boost:"
 msgstr "Kontrasterhöhung:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
 msgid "Saturation:"
 msgstr "Sättigung:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
 msgid "LIT^Ambient:"
 msgstr "Umgebungslicht:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
 msgid "Intensity:"
 msgstr "Lichtstärke:"
 
@@ -2316,7 +2433,7 @@ msgstr "^1%s TESTVERSION"
 msgid "Update to %s now!"
 msgstr "Jetzt auf %s updaten!"
 
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems.\n"
@@ -2324,94 +2441,90 @@ msgstr ""
 "^1FEHLER: Texturekompression ist notwendig aber nicht unterstützt.\n"
 "^1Darstellungsprobleme sind zu erwarten.\n"
 
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
 msgid "Arena"
 msgstr "Arena"
 
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
 msgid "Assault"
 msgstr "Assault"
 
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
 msgid "Capture The Flag"
 msgstr "Capture The Flag"
 
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
 msgid "Clan Arena"
 msgstr "Clan Arena"
 
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
 msgid "Deathmatch"
 msgstr "Deathmatch"
 
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
 msgid "Domination"
 msgstr "Domination"
 
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
 msgid "Freeze Tag"
 msgstr "Freeze Tag"
 
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
 msgid "Keepaway"
 msgstr "Keepaway"
 
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
 msgid "Key Hunt"
 msgstr "Key Hunt"
 
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
 msgid "Last Man Standing"
 msgstr "Last Man Standing"
 
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
 msgid "Nexball"
 msgstr "Nexball"
 
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
 msgid "Onslaught"
 msgstr "Onslaught"
 
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
 msgid "Race"
 msgstr "Race"
 
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
 msgid "Race CTS"
 msgstr "Race CTS"
 
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
 msgid "Runematch"
 msgstr "Runematch"
 
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
 msgid "Team Deathmatch"
 msgstr "Team Deathmatch"
 
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
 #, c-format
 msgid "@!#%'n Tuba Throwing"
 msgstr "@!#%'n Tuba-Werfen"
 
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Hintergrund:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
 msgid "Default"
 msgstr "Standard"
 
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
 msgid "Use default"
 msgstr "Standard verwenden"
 
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
 msgid "Team Color:"
 msgstr "Teamfarbe:"
 
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
 msgid "Enable panel"
 msgstr "Panel aktivieren"
 
@@ -2443,37 +2556,37 @@ msgstr "%s schaute sich %ss Crylink sehr genau an"
 msgid "Electro"
 msgstr "Electro"
 
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
 #, c-format
 msgid "%s could not remember where they put plasma"
 msgstr "%s vergaß, wo er das Plasma hingetan hatte"
 
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
 #, c-format
 msgid "%s played with plasma"
 msgstr "%s spielte mit Plasma"
 
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
 #, c-format
 msgid "%s just noticed %s's blue ball"
 msgstr "%s hat gerade %ss blaue Kugel bemerkt"
 
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
 #, c-format
 msgid "%s got in touch with %s's blue ball"
 msgstr "%s kam mit %ss blauer Kugel in Kontakt"
 
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
 #, c-format
 msgid "%s felt the electrifying air of %s's combo"
 msgstr "%s hat gespürt, wie %ss Combo die Luft elektrisierte"
 
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
 #, c-format
 msgid "%s got too close to %s's blue beam"
 msgstr "%s kam zu nah an %ss blauen Strahl"
 
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
 #, c-format
 msgid "%s was blasted by %s's blue beam"
 msgstr "%s wurde von %ss blauen Strahl erwischt"
@@ -2526,27 +2639,27 @@ msgstr "%s hat von %ss Feuerball probiert"
 msgid "Mortar"
 msgstr "Mortar"
 
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
 #, c-format
 msgid "%s tried out his own grenade"
 msgstr "%s wollte wissen, ob seine Granate funktioniert"
 
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
 #, c-format
 msgid "%s detonated"
 msgstr "%s verfing sich in der eigenen Detonation"
 
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
 #, c-format
 msgid "%s didn't see %s's grenade"
 msgstr "%s hat %ss Granate nicht gesehen"
 
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
 #, c-format
 msgid "%s almost dodged %s's grenade"
 msgstr "%s ist fast %ss Granate ausgewichen"
 
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
 #, c-format
 msgid "%s ate %s's grenade"
 msgstr "%s nahm %ss Granate in den Mund"
@@ -2555,17 +2668,17 @@ msgstr "%s nahm %ss Granate in den Mund"
 msgid "Hagar"
 msgstr "Hagar"
 
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655
 #, c-format
 msgid "%s played with tiny rockets"
 msgstr "%s hat mit kleinen Raketen gespielt"
 
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:386
 #, c-format
 msgid "%s hoped %s's missiles wouldn't bounce"
 msgstr "%s hat gehofft, dass %ss Raketen nicht von Wänden abprallen"
 
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661
 #, c-format
 msgid "%s was pummeled by %s"
 msgstr "^1%s^1 wurde von %s^1 erwischt"
@@ -2583,9 +2696,7 @@ msgstr "^1%s^1 wurde von %s^1 niedergehauen"
 msgid "Grappling Hook"
 msgstr "Grappling Hook"
 
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
 #, c-format
 msgid "%s did the impossible"
 msgstr "%s hat das Unmögliche geschafft"
@@ -2599,17 +2710,17 @@ msgstr "%s ist in %ss Gravitationsbombe reingelaufen"
 msgid "Laser"
 msgstr "Laser"
 
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
 #, c-format
 msgid "%s lasered themself to hell"
 msgstr "%s hat sich in die Hölle gelasert"
 
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
 #, c-format
 msgid "%s was cut in half by %s's gauntlet"
 msgstr "%s ist von %ss Gauntlet halbiert worden"
 
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
 #, c-format
 msgid "%s was lasered to death by %s"
 msgstr "^1%s^1 wurde von %s^1 zu Tode gelasert"
@@ -2618,22 +2729,22 @@ msgstr "^1%s^1 wurde von %s^1 zu Tode gelasert"
 msgid "Mine Layer"
 msgstr "Mine Layer"
 
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
 #, c-format
 msgid "%s exploded"
 msgstr "%s ist explodiert"
 
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
 #, c-format
 msgid "%s got too close to %s's mine"
 msgstr "%s ist %ss Mine zu nahe getreten"
 
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
 #, c-format
 msgid "%s almost dodged %s's mine"
 msgstr "%s ist fast %ss Mine ausgewichen"
 
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
 #, c-format
 msgid "%s stepped on %s's mine"
 msgstr "%s ist auf %ss Mine gelatscht"
@@ -2642,7 +2753,13 @@ msgstr "%s ist auf %ss Mine gelatscht"
 msgid "MinstaNex"
 msgstr "MinstaNex"
 
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr "%s kann jetzt mit Portalen denken"
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
 #, c-format
 msgid "%s has been vaporized by %s"
 msgstr "^1%s^1 wurde von %s^1 vernichtet"
@@ -2660,21 +2777,60 @@ msgstr "Port-O-Launch"
 msgid "%s felt %s doing the impossible to him"
 msgstr "%s hat gespürt, wie %s das Unmögliche für ihn getan hat"
 
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Gewehr"
+
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s hat sich vollautomatisch selbst erschossen"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s ist in %ss Kugelhagel gefallen"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "^1%s^1 wurde von %s^1 erledigt"
+
 #: qcsrc/server/w_rocketlauncher.qc:2
 msgid "Rocket Launcher"
 msgstr "Rocket Launcher"
 
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
 msgid "%s got too close to %s's rocket"
 msgstr "%s ist %ss Rakete zu nahe getreten"
 
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
 msgid "%s almost dodged %s's rocket"
 msgstr "%s ist fast %ss Rakete ausgewichen"
 
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
 msgid "%s ate %s's rocket"
 msgstr "%s hat %ss Rakete in den Mund genommen"
@@ -2692,67 +2848,28 @@ msgstr "^1%s^1 wurde von %s^1 getagged"
 msgid "Shotgun"
 msgstr "Shotgun"
 
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_shotgun.qc:219
 #, c-format
 msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
 msgstr "%2$1s ^7hat %1$s ^7ein wenig mit einer großen Schrotflinte geschlagen"
 
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_shotgun.qc:221
 #, c-format
 msgid "%s was gunned by %s"
 msgstr "^1%s^1 wurde von %s^1 erschossen"
 
-#: qcsrc/server/w_sniperrifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_sniperrifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s hat sich vollautomatisch selbst erschossen"
-
-#: qcsrc/server/w_sniperrifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
-
-#: qcsrc/server/w_sniperrifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
-
-#: qcsrc/server/w_sniperrifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s ist in %ss Kugelhagel gefallen"
-
-#: qcsrc/server/w_sniperrifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
-
-#: qcsrc/server/w_sniperrifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
-
-#: qcsrc/server/w_sniperrifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "^1%s^1 wurde von %s^1 erledigt"
-
 #: qcsrc/server/w_tuba.qc:2
 #, c-format
 msgid "@!#%'n Tuba"
 msgstr "@!#%'n Tuba"
 
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
 #, c-format
 msgid "%s hurt his own ears with the @!#%%'n Tuba"
 msgstr ""
 "%s haben die Ohren geschmerzt von seinem eigenen Spiel auf der @!#%%'n Tuba"
 
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
 #, c-format
 msgid "%s died of %s's great playing on the @!#%%'n Tuba"
 msgstr ""
@@ -2767,3 +2884,9 @@ msgstr "Machine Gun"
 #, c-format
 msgid "%s was riddled full of holes by %s"
 msgstr "%s ist von %s durchlöchert worden wie ein Schweizer Käse"
+
+#~ msgid "Powerup sharpen"
+#~ msgstr "Bonus-Schärfe"
+
+#~ msgid "Damage & water blur"
+#~ msgstr "Schadens-Unschärfe"
index 13c74ff442efd28d4d995846bccfefcf124005a1..c8c8217a0195de32b06e82e3fa1d8ec6059fd4e3 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Xonotic 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-08-21 14:00+0200\n"
 "Last-Translator: Rodrigo Mouton Laudin <ratogenesis@gmail.com>\n"
 "Language: es\n"
 "MIME-Version: 1.0\n"
@@ -39,12 +39,12 @@ msgstr "error creando el manejador curl\n"
 #: qcsrc/menu/gamecommand.qc:239
 msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
 msgstr ""
-"Comando no valido. Para una lista de comandos soportados, teclea menu_cmd "
+"Comando no válido. Para una lista de comandos soportados, escriba menu_cmd "
 "help\n"
 
 #: qcsrc/menu/item/gecko.c:49
 msgid "Browser not initialized!"
-msgstr "navegador no inicializado!"
+msgstr "Navegador no inicializado!"
 
 #: qcsrc/menu/item/label.c:63
 #, c-format
@@ -67,7 +67,7 @@ msgid "custom"
 msgstr "Personalizado"
 
 #: qcsrc/menu/menu.qc:29
-#, fuzzy, c-format
+#, c-format
 msgid "^4MQC Build information: ^1%s\n"
 msgstr "^4MQC Información de compilación/build %s\n"
 
@@ -109,7 +109,7 @@ msgstr "Créditos"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
 #: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
 msgid "OK"
@@ -125,7 +125,7 @@ msgid ""
 "player name to get started.  You can change these options later through the "
 "menu system."
 msgstr ""
-"Bienvenido a Xonotic, por favor seleccióne su Lenguaje preferido y luego "
+"Bienvenido a Xonotic, por favor seleccióne su lenguaje preferido y luego "
 "ingrese su nombre de jugador. Estas opciones pueden ser modificadas luego "
 "utilizando el menú de configuración"
 
@@ -146,7 +146,7 @@ msgstr "Guardar configuración"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
 msgid "Ammo Panel"
-msgstr "panel de munición"
+msgstr "Panel de munición"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
 msgid "Ammunition display:"
@@ -156,7 +156,12 @@ msgstr "Pantalla de munición:"
 msgid "Show only current ammo type"
 msgstr "Mostrar sólo la munición actual"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr "Alinear ícono"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
@@ -165,6 +170,7 @@ msgid "Left"
 msgstr "Izquierda"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
@@ -172,6 +178,35 @@ msgstr "Izquierda"
 msgid "Right"
 msgstr "Derecha"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr "Mensaje centrado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
+msgstr "Duración del mensaje:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+msgid "Fade time:"
+msgstr "Tiempo hasta desaparecer:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
+msgstr "Intercambiar orden de mensajes"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+msgid "Text alignment:"
+msgstr "Alineado de texto"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr "Centro"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
+msgstr "Escala de fuente:"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
 msgid "Chat Panel"
 msgstr "Panel de chat"
@@ -281,6 +316,102 @@ msgstr "Tiempo de vida de la entrada:"
 msgid "Entry fadetime:"
 msgstr "Desaparecimento de la entrada:"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr "Panel de Física"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Panel desactivado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
+msgstr "Panel habilitado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
+msgstr "Panel activado aún como espectador"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
+msgstr "Panel activo en modo Race/CTS"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr "Barra de estado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Alinear a la izquierda"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Alinear a la derecha"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr "Alineado interior"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr "Alineado exterior"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr "Intercambiar la posición de velocidad/aceleración"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
+msgstr "Velocidad:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr "Incluir velocidad vertical"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr "Unidad de velocidad"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "nudos"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
+msgstr "Mostrar"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
+msgstr "Máxima velocidad:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr "Aceleración:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr "Incluir aceleración vertical"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
 msgid "Powerups Panel"
 msgstr "Panel de Poderes"
@@ -293,11 +424,6 @@ msgstr "Intercambiar posición de escudo y fuerza"
 msgid "Pressed Keys Panel"
 msgstr "Panel de teclas presionadas"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Panel desactivado"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
 msgid "Panel enabled when spectating"
 msgstr "Panel activado cuando este espectador"
@@ -331,7 +457,7 @@ msgstr "Radar:"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
 msgid "Alpha:"
 msgstr "Transparencia:"
 
@@ -387,6 +513,26 @@ msgstr "Nunca ampliado"
 msgid "Score Panel"
 msgstr "Panel de Puntos"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr "Puntaje"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr "Posiciones:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr "Desactivado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr "Y yo"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr "Puro"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
 msgid "Timer Panel"
 msgstr "Panel del Temporizador"
@@ -429,12 +575,11 @@ msgstr "%ds"
 msgid "Fade effect:"
 msgstr "Efecto de desvanecimento"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
 msgid "EF^None"
 msgstr "Ninguno"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
 msgid "Slide"
 msgstr "Corte"
 
@@ -442,40 +587,43 @@ msgstr "Corte"
 msgid "Alpha"
 msgstr "Transparencia"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
+msgstr "Ambos"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
 msgid "Weapon icons:"
 msgstr "íconos de armas"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
 msgid "Show weapon ID as:"
 msgstr "Mostra ID de arma como:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
 msgid "SHOWAS^None"
-msgstr "Nenhum"
+msgstr "Ninguno"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
 msgid "Number"
 msgstr "Número"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
 msgid "Bind"
 msgstr "Lazo"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
 msgid "Show Accuracy"
 msgstr "Mostrar precision"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
 msgid "Show Ammo"
 msgstr "Mostrar munición"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
 msgid "Ammo bar color:"
 msgstr "Color de la barra de munición:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
 msgid "Ammo bar alpha:"
 msgstr "Transparencia de la barra de munición:"
 
@@ -487,20 +635,24 @@ msgstr "configuración del panel HUD"
 msgid "Panel background defaults:"
 msgstr "Panel de fondo por defecto:"
 
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Fondo:"
+
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
 msgid "Disable"
 msgstr "Desactivar"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
 msgid "Color:"
 msgstr "Color:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
 msgid "Border size:"
 msgstr "Tamaño de limite:"
 
@@ -509,11 +661,11 @@ msgstr "Tamaño de limite:"
 msgid "Team color:"
 msgstr "Color del equipo:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
 msgid "Test team color in configure mode"
 msgstr "Probar color del equipo en modo configuración"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
 msgid "Padding:"
 msgstr "Relleno:"
 
@@ -522,22 +674,18 @@ msgid "HUD Dock:"
 msgstr "Muelle de HUD:"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
-#, fuzzy
 msgid "DOCK^Disabled"
 msgstr "Desactivado"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
-#, fuzzy
 msgid "DOCK^Small"
-msgstr "Pequeno"
+msgstr "Chico"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
-#, fuzzy
 msgid "DOCK^Medium"
 msgstr "Medio"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
-#, fuzzy
 msgid "DOCK^Large"
 msgstr "Grande"
 
@@ -587,131 +735,131 @@ msgstr "Demos"
 msgid "Player Setup"
 msgstr "Jugador"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
 msgid "Game type:"
 msgstr "Tipo de juego:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
 msgid "Match settings:"
 msgstr "Configuración del encuentro:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
 msgid "Time limit:"
 msgstr "Limite de tiempo:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
 msgid "Use map specified default"
 msgstr "Usar definicion especifica del mapa"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
 msgid "Point limit:"
 msgstr "Limite de puntos:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
 msgid "Player slots:"
 msgstr "Slots de Jugadores:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
 msgid "Number of bots:"
 msgstr "Número de bots:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
 msgid "Bot skill:"
 msgstr "Dificultad del bot:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
 msgid "Botlike"
 msgstr "Bot"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
 msgid "Beginner"
 msgstr "Iniciado"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
 msgid "You will win"
 msgstr "Ganaras"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
 msgid "You can win"
 msgstr "Puedes ganar"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
 msgid "You might win"
 msgstr "Podrias ganar ganar"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
 msgid "Advanced"
 msgstr "Avanzado"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
 msgid "Expert"
 msgstr "Experto"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
 msgid "Pro"
 msgstr "Profesional"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
 msgid "Assassin"
 msgstr "Asesino"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
 msgid "Unhuman"
 msgstr "No humano"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
 msgid "Godlike"
 msgstr "Semi-dios"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
 msgid "Mutators..."
 msgstr "Mutators..."
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
 msgid "Advanced settings..."
 msgstr "Configuración avanzada..."
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
 msgid "Map list:"
 msgstr "Lista de mapas:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
 msgid "Select all"
 msgstr "Seleccionar todos"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
 msgid "Select none"
 msgstr "Seleccionar ninguno"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
 msgid "Start Multiplayer!"
 msgstr "Comenzar Multijugador!"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
 msgid "Capture limit:"
 msgstr "Limite de capturas:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
 msgid "Lives:"
 msgstr "Vidas:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
 msgid "Laps:"
 msgstr "Vueltas:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
 msgid "Goals:"
 msgstr "Metas:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
 msgid "Frag limit:"
 msgstr "Limite de Frags:"
 
@@ -831,14 +979,13 @@ msgstr "Características:"
 msgid "Game types:"
 msgstr "Modos de juego:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
 msgid "Close"
 msgstr "Cerrar"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+msgid "MAP^Play"
 msgstr "Jugar"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
@@ -928,7 +1075,6 @@ msgid "Jet pack"
 msgstr "Jetpack"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
-#, fuzzy
 msgid "MUT^None"
 msgstr "Ninguno"
 
@@ -989,17 +1135,20 @@ msgstr "Limpiar"
 msgid "Timedemo"
 msgstr "Demo temporizado"
 
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+#, fuzzy
+msgid "DEMO^Play"
+msgstr "Jugar"
+
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
 msgid "Join"
 msgstr "Ingresar"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
-#, fuzzy
 msgid "SRVS^Empty"
 msgstr "Vacío"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
-#, fuzzy
 msgid "SRVS^Full"
 msgstr "Completo"
 
@@ -1035,7 +1184,7 @@ msgstr "N/A"
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
 #, c-format
 msgid "%d/%d, %d free player slots"
-msgstr ""
+msgstr "%d/%d, %d lugares para jugar disponibles"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
 #, c-format
@@ -1175,10 +1324,9 @@ msgstr "Color de mira:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:140
 msgid "By health"
-msgstr ""
+msgstr "Por salud"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
-#, fuzzy
 msgid "Custom"
 msgstr "Personalizado"
 
@@ -1195,7 +1343,6 @@ msgid "Hit test:"
 msgstr "Test de tiro:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:159
-#, fuzzy
 msgid "HTST^None"
 msgstr "Ninguno"
 
@@ -1220,17 +1367,14 @@ msgid "Force models:"
 msgstr "Forzar modelos:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
-#, fuzzy
 msgid "MDL^None"
 msgstr "Ninguno"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
-#, fuzzy
 msgid "MDL^Custom"
-msgstr "Modificado"
+msgstr "Personalizado"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
-#, fuzzy
 msgid "MDL^All"
 msgstr "Todos"
 
@@ -1243,7 +1387,6 @@ msgid "Gibs:"
 msgstr "Gibs:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
-#, fuzzy
 msgid "GIBS^None"
 msgstr "Ninguno"
 
@@ -1252,12 +1395,10 @@ msgid "GIBS^Few"
 msgstr "Pocas"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
-#, fuzzy
 msgid "GIBS^Many"
-msgstr "Muchas"
+msgstr "Muchos"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:187
-#, fuzzy
 msgid "GIBS^Lots"
 msgstr "Abundante"
 
@@ -1266,11 +1407,11 @@ msgid "Damage splash:"
 msgstr "Daño colateral:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:194
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:30
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
 msgid "Apply immediately"
 msgstr "Aplicar imediatamente"
 
@@ -1330,15 +1471,7 @@ msgstr "Cambiar de arma al recojer"
 msgid "Draw 1st person weapon model"
 msgstr "Dibujar modelo de arma en primera persona"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Alinear a la izquierda"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Alinear a la derecha"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
 msgid "Flip view horizontally"
 msgstr "Invertir vista horizontalmente"
 
@@ -1408,8 +1541,7 @@ msgstr "Principal:"
 msgid "Music:"
 msgstr "Musica:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
 msgid "VOL^Ambient:"
 msgstr "Ambiente:"
 
@@ -1417,190 +1549,180 @@ msgstr "Ambiente:"
 msgid "Info:"
 msgstr "Información:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
 msgid "Items:"
 msgstr "Items:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
 msgid "Pain:"
 msgstr "Dolor:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
 msgid "Player:"
 msgstr "Jugador:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
 msgid "Shots:"
 msgstr "Disparos:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
 msgid "Voice:"
 msgstr "Voz:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
 msgid "Weapons:"
 msgstr "Armas:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
 msgid "Frequency:"
 msgstr "Frecuencia:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
 msgid "8 kHz"
 msgstr "8 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
 msgid "11.025 kHz"
 msgstr "11.025 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
 msgid "16 kHz"
 msgstr "16 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
 msgid "22.05 kHz"
 msgstr "22.05 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
 msgid "24 kHz"
 msgstr "24 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
 msgid "32 kHz"
 msgstr "32 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
 msgid "44.1 kHz"
 msgstr "44.1 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
 msgid "48 kHz"
 msgstr "48 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
 msgid "Channels:"
 msgstr "Canales:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
 msgid "Mono"
 msgstr "Mono"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
 msgid "Stereo"
 msgstr "Stereo"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
 msgid "2.1"
 msgstr "2.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
 msgid "4"
 msgstr "4"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
 msgid "5"
 msgstr "5"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
 msgid "5.1"
 msgstr "5.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
 msgid "6.1"
 msgstr "6.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
 msgid "7.1"
 msgstr "7.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
 msgid "Swap Stereo"
 msgstr "Intercambiar Stereo"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
 msgid "Headphone friendly mode"
 msgstr "Modo para auricular"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
 msgid "Spatial voices:"
 msgstr "Voces espaciales:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
 msgid "VOCS^None"
 msgstr "Ninguno"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
 msgid "VOCS^Taunts"
-msgstr "bromas"
+msgstr "Provocaciones"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
 msgid "VOCS^All"
 msgstr "Todos"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
 msgid "Taunt range:"
 msgstr "Nivel de taunts:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
 msgid "RNG^Very short"
-msgstr "Bien corto"
+msgstr "Muy corto"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
 msgid "RNG^Short"
 msgstr "Corto"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
 msgid "RNG^Normal"
 msgstr "Normal"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
 msgid "RNG^Long"
 msgstr "Alto"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
 msgid "RNG^Full"
 msgstr "Total"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
 msgid "Automatic taunts"
 msgstr "Taunts Automatico"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
 msgid "Time warning:"
 msgstr "Aviso de tiempo:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
 msgid "WRN^None"
 msgstr "Ninguno"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
 msgid "1 minute"
 msgstr "1 minuto"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
 msgid "5 minutes"
 msgstr "5 minutos"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
 msgid "WRN^Both"
 msgstr "Ambos"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
 msgid "Hit indicator"
 msgstr "Indicador de tiro acertado"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
 msgid "Menu sounds"
 msgstr "Sonidos del menú"
 
@@ -1609,37 +1731,30 @@ msgid "Quality preset:"
 msgstr "Predefinición de calidad:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:41
-#, fuzzy
 msgid "PRE^OMG!"
 msgstr "OMG!"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:42
-#, fuzzy
 msgid "PRE^Low"
 msgstr "Bajo"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:43
-#, fuzzy
 msgid "PRE^Medium"
 msgstr "Media"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:44
-#, fuzzy
 msgid "PRE^Normal"
 msgstr "Normal"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:45
-#, fuzzy
 msgid "PRE^High"
 msgstr "Alta"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:46
-#, fuzzy
 msgid "PRE^Ultra"
 msgstr "Ultra"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:48
-#, fuzzy
 msgid "PRE^Ultimate"
 msgstr "Máxima"
 
@@ -1648,32 +1763,26 @@ msgid "Geometry detail:"
 msgstr "Detalles geométricos:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:54
-#, fuzzy
 msgid "DET^Lowest"
 msgstr "Mínimo"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:55
-#, fuzzy
 msgid "DET^Low"
 msgstr "Bajo"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:56
-#, fuzzy
 msgid "DET^Normal"
 msgstr "Normal"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:57
-#, fuzzy
 msgid "DET^Good"
 msgstr "Bueno"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:58
-#, fuzzy
 msgid "DET^Best"
 msgstr "Mejor"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:59
-#, fuzzy
 msgid "DET^Insane"
 msgstr "Insano"
 
@@ -1682,7 +1791,6 @@ msgid "Antialiasing:"
 msgstr "Antialiasing:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:64
-#, fuzzy
 msgid "AA^Disabled"
 msgstr "Deshabilitado"
 
@@ -1701,32 +1809,26 @@ msgid "Texture resolution:"
 msgstr "Resolución de textura:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:73
-#, fuzzy
 msgid "RES^Leet"
 msgstr "Leet"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:74
-#, fuzzy
 msgid "RES^Lowest"
 msgstr "Mínimo"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:75
-#, fuzzy
 msgid "RES^Low"
 msgstr "Bajo"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:76
-#, fuzzy
 msgid "RES^Normal"
 msgstr "Normal"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:77
-#, fuzzy
 msgid "RES^Good"
 msgstr "Bueno"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:78
-#, fuzzy
 msgid "RES^Best"
 msgstr "Mejor"
 
@@ -1740,7 +1842,6 @@ msgid "Anisotropy:"
 msgstr "Filtro Anisotrópico:"
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:102
-#, fuzzy
 msgid "ANISO^Disabled"
 msgstr "Deshabilitado"
 
@@ -1764,107 +1865,110 @@ msgstr "Distancia de partículas:"
 msgid "Decals"
 msgstr "Símbolos"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr "Marcas en los jugadores"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
 msgid "Distance:"
 msgstr "Distancia:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
 msgid "Time:"
 msgstr "Tiempo:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
 msgid "Use lightmaps"
 msgstr "Usar lightmaps"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
 msgid "Deluxe mapping"
 msgstr "Mapeado Deluxe"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
 msgid "Gloss"
 msgstr "Brillo"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
 msgid "Offset mapping"
 msgstr "Despl. de mapeado"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
 msgid "Relief mapping"
 msgstr "Mapeado Relief"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
 msgid "Reflections:"
 msgstr "Reflejos:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
 msgid "Blurred"
 msgstr "Borroso"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
 msgid "REFL^Good"
 msgstr "Bueno"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
 msgid "Sharp"
 msgstr "Ajustado"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
 msgid "Show surfaces"
 msgstr "Mostrar superficies"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
 msgid "No dynamic lighting"
 msgstr "Sin iluminación dinámica"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
 msgid "Flash blend approximation"
 msgstr "Aproximación de flash mezclado"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
 msgid "Realtime dynamic lighting"
 msgstr "Iluminación dinámica en tiempo real"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
 msgid "Shadows"
 msgstr "Sombras"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
 msgid "Realtime world lighting"
 msgstr "Iluminación del mundo en tiempo real"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
 msgid "Use normal maps"
 msgstr "Usar mapa de normales"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
 msgid "Soft shadows"
 msgstr "Sombras Suaves"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
 msgid "Coronas"
 msgstr "Coronas"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
 msgid "Use Occlusion Queries"
 msgstr "Usar consultas de oclusion"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
 msgid "Bloom"
 msgstr "Bloom"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
 msgid "High Dynamic Range (HDR)"
 msgstr "High Dynamic Range (HDR)"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
 msgid "Motion blur:"
-msgstr "Distorsión p/ movimiento:"
+msgstr "Difuminado p/ movimiento:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr "Distorsión por daño:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
+msgstr "Difuminado y postprocesamiento ajustado"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:26
 msgid "Key bindings:"
@@ -1882,29 +1986,29 @@ msgstr "Editar..."
 msgid "Sensitivity:"
 msgstr "Sensibilidad:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
 msgid "UI mouse speed:"
 msgstr "Velocidad del puntero:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
 msgid "Mouse filter"
 msgstr "Filtro del raton"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
 msgid "Invert mouse"
 msgstr "Invertir eje Y"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
 msgid "Use joystick input"
 msgstr "Usar entrada de joystick"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
 msgid "Turn off OS mouse acceleration"
 msgstr "Desactivar aceleracion del raton"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
 msgid "\"enter console\" also closes"
 msgstr "\"entrar a la consola\" tambien cerrar"
 
@@ -1945,42 +2049,6 @@ msgid "Show frames per second"
 msgstr "Mostrar cuadros por segundo"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Medidor de Velocidad"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (escondido)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "nudos"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Mostrar acelerómetro"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Escala del acelerómetro:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
 msgid "Minimize input latency"
 msgstr "Minimizar retardo de entrada"
 
@@ -2065,47 +2133,38 @@ msgid "Font/UI size:"
 msgstr "Tamaño de Font/UI:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:31
-#, fuzzy
 msgid "SZ^Unreadable"
 msgstr "Ilegible"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:32
-#, fuzzy
 msgid "SZ^Tiny"
 msgstr "Minuscula"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:33
-#, fuzzy
 msgid "SZ^Little"
 msgstr "Muy pequeña"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:34
-#, fuzzy
 msgid "SZ^Small"
 msgstr "Pequeña"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:35
-#, fuzzy
 msgid "SZ^Medium"
 msgstr "Media"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:36
-#, fuzzy
 msgid "SZ^Large"
 msgstr "Grande"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:37
-#, fuzzy
 msgid "SZ^Huge"
 msgstr "Enorme"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:38
-#, fuzzy
 msgid "SZ^Gigantic"
 msgstr "Gigante"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:39
-#, fuzzy
 msgid "SZ^Colossal"
 msgstr "Colossal"
 
@@ -2134,7 +2193,6 @@ msgid "Vertex Buffer Objects (VBOs)"
 msgstr "Vertex Buffer Objects (VBOs)"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:59
-#, fuzzy
 msgid "VBO^Off"
 msgstr "Desactivado"
 
@@ -2155,17 +2213,14 @@ msgid "Depth first:"
 msgstr "Profundidad primero:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:69
-#, fuzzy
 msgid "DF^Disabled"
 msgstr "Desactivado"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:70
-#, fuzzy
 msgid "DF^World"
 msgstr "Mundo"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:71
-#, fuzzy
 msgid "DF^All"
 msgstr "Todos"
 
@@ -2189,20 +2244,19 @@ msgstr "Contraste:"
 msgid "Gamma:"
 msgstr "Gamma:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
 msgid "Contrast boost:"
 msgstr "Resaltador de contraste"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
 msgid "Saturation:"
 msgstr "Saturacion de color:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
-#, fuzzy
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
 msgid "LIT^Ambient:"
 msgstr "Ambiente:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
 msgid "Intensity:"
 msgstr "Intensidad:"
 
@@ -2320,12 +2374,10 @@ msgid "%s: %s"
 msgstr "%s: %s"
 
 #: qcsrc/menu/xonotic/slider_decibels.c:50
-#, fuzzy
 msgid "VOL^OFF"
 msgstr "DESACTIVADO"
 
 #: qcsrc/menu/xonotic/slider_decibels.c:52
-#, fuzzy
 msgid "VOL^MAX"
 msgstr "MAXIMO"
 
@@ -2376,14 +2428,14 @@ msgstr "Generación automática de información para mapas nuevos..."
 #: qcsrc/menu/xonotic/util.qc:367
 #, c-format
 msgid "^1%s TEST BUILD"
-msgstr ""
+msgstr "^1%s TEST BUILD"
 
 #: qcsrc/menu/xonotic/util.qc:432
 #, c-format
 msgid "Update to %s now!"
 msgstr "Actualizar para %s ahora!"
 
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems.\n"
@@ -2391,94 +2443,90 @@ msgstr ""
 "^1ERROR: Se requiere la compresion de texturas, pero no es soportada.\n"
 "^1Pueden ocurrir posibles problemas visuales.\n"
 
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
 msgid "Arena"
 msgstr "Arena"
 
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
 msgid "Assault"
 msgstr "Asalto"
 
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
 msgid "Capture The Flag"
 msgstr "Captura la Bandera"
 
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
 msgid "Clan Arena"
 msgstr "Clan arena"
 
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
 msgid "Deathmatch"
 msgstr "Combate a muerte"
 
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
 msgid "Domination"
 msgstr "Dominación"
 
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
 msgid "Freeze Tag"
 msgstr "Freeze Tag"
 
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
 msgid "Keepaway"
 msgstr "Keepaway"
 
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
 msgid "Key Hunt"
 msgstr "Caza de llave"
 
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
 msgid "Last Man Standing"
 msgstr "Ultimo Sobreviviente"
 
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
 msgid "Nexball"
 msgstr "Nexball"
 
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
 msgid "Onslaught"
 msgstr "Embestida"
 
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
 msgid "Race"
 msgstr "Carrera"
 
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
 msgid "Race CTS"
 msgstr "Carrera CTS"
 
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
 msgid "Runematch"
 msgstr "Runamatch"
 
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
 msgid "Team Deathmatch"
 msgstr "Combate a muerte por equipos"
 
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
 #, c-format
 msgid "@!#%'n Tuba Throwing"
 msgstr "@!#%'n Tuba Throwing"
 
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Fondo:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
 msgid "Default"
 msgstr "Por Defecto"
 
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
 msgid "Use default"
 msgstr "Usar por defecto"
 
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
 msgid "Team Color:"
 msgstr "Color del equipo:"
 
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
 msgid "Enable panel"
 msgstr "Activar panel"
 
@@ -2510,37 +2558,37 @@ msgstr "%s miró de cerca al Crylink de %s"
 msgid "Electro"
 msgstr "Electro"
 
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
 #, c-format
 msgid "%s could not remember where they put plasma"
 msgstr "%s no pudo recordar donde dejó su plasma la última vez"
 
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
 #, c-format
 msgid "%s played with plasma"
 msgstr "%s jugó con plasma"
 
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
 #, c-format
 msgid "%s just noticed %s's blue ball"
 msgstr "%s acaba de percatarse de la bola azul de %s"
 
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
 #, c-format
 msgid "%s got in touch with %s's blue ball"
 msgstr "%s tuvo un encuentro cercano con la bola azul de %s"
 
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
 #, c-format
 msgid "%s felt the electrifying air of %s's combo"
 msgstr "%s sintió el aire electrificante del combo de %s"
 
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
 #, c-format
 msgid "%s got too close to %s's blue beam"
 msgstr "%s estuvo demasiado cerca del rayo azul de %s"
 
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
 #, c-format
 msgid "%s was blasted by %s's blue beam"
 msgstr "%s estuvo en estado critico por el rayo azul de %s"
@@ -2593,27 +2641,27 @@ msgstr "%s probó el fireball de %s"
 msgid "Mortar"
 msgstr "Mortero"
 
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
 #, c-format
 msgid "%s tried out his own grenade"
 msgstr "%s probó su propia granada"
 
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
 #, c-format
 msgid "%s detonated"
 msgstr "%s ha detonado"
 
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
 #, c-format
 msgid "%s didn't see %s's grenade"
 msgstr "%s no vió la granada de %s"
 
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
 #, c-format
 msgid "%s almost dodged %s's grenade"
 msgstr "%s casi esquivó la granada de %s"
 
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
 #, c-format
 msgid "%s ate %s's grenade"
 msgstr "%s se comió la granada de %s"
@@ -2622,17 +2670,17 @@ msgstr "%s se comió la granada de %s"
 msgid "Hagar"
 msgstr "Hagar"
 
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655
 #, c-format
 msgid "%s played with tiny rockets"
 msgstr "%s jugó con pequeños cohetes"
 
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:386
 #, c-format
 msgid "%s hoped %s's missiles wouldn't bounce"
 msgstr "%s esperó que no le reboten misiles de %s"
 
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661
 #, c-format
 msgid "%s was pummeled by %s"
 msgstr "%s fue molido por %s"
@@ -2650,9 +2698,7 @@ msgstr "%s fue rebanado por %s"
 msgid "Grappling Hook"
 msgstr "Grappling Hook"
 
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
 #, c-format
 msgid "%s did the impossible"
 msgstr "%s hizo lo imposible"
@@ -2666,17 +2712,17 @@ msgstr "%s entró a la bomba de gravedad de %s"
 msgid "Laser"
 msgstr "Laser"
 
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
 #, c-format
 msgid "%s lasered themself to hell"
 msgstr "%s se fué al infierno montado en su laser"
 
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
 #, c-format
 msgid "%s was cut in half by %s's gauntlet"
 msgstr "%s fue cortado a la mitad por el gauntlet de %s"
 
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
 #, c-format
 msgid "%s was lasered to death by %s"
 msgstr "%s fue muerto por el laser de %s"
@@ -2685,22 +2731,22 @@ msgstr "%s fue muerto por el laser de %s"
 msgid "Mine Layer"
 msgstr "Mine Layer"
 
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
 #, c-format
 msgid "%s exploded"
 msgstr "%s explotó"
 
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
 #, c-format
 msgid "%s got too close to %s's mine"
 msgstr "%s estuvo cerca de la mina de %s"
 
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
 #, c-format
 msgid "%s almost dodged %s's mine"
 msgstr "%s casi esquivo la mina de %s"
 
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
 #, c-format
 msgid "%s stepped on %s's mine"
 msgstr "%s caminó encima de la mina de %s"
@@ -2709,7 +2755,13 @@ msgstr "%s caminó encima de la mina de %s"
 msgid "MinstaNex"
 msgstr "MinstaNex"
 
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr "%s ahora está \"thinking with portals\""
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
 #, c-format
 msgid "%s has been vaporized by %s"
 msgstr "%s ha sido vaporizado por %s"
@@ -2727,21 +2779,60 @@ msgstr "Port-O-Launch"
 msgid "%s felt %s doing the impossible to him"
 msgstr "%s sintió a %s hacer lo imposible por él/ella"
 
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Rifle"
+
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s se disparó a si mismo"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s se disparó a si mismo"
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s no logró esconderse del granizo de balas de %s"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s murió en el granizo de balas de %s"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s no logró esconderse del rifle de %s"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s fué disparado en la cabeza por %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "%s fué disparado con un rifle por %s"
+
 #: qcsrc/server/w_rocketlauncher.qc:2
 msgid "Rocket Launcher"
 msgstr "Rocket Launcher"
 
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
 msgid "%s got too close to %s's rocket"
 msgstr "%s estuvo demasiado cerca del cohete de %s"
 
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
 msgid "%s almost dodged %s's rocket"
 msgstr "%s casi esquivó el cohete de %s"
 
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
 msgid "%s ate %s's rocket"
 msgstr "%s se comió el misil de %s"
@@ -2759,66 +2850,27 @@ msgstr "%s fue marcado por %s"
 msgid "Shotgun"
 msgstr "Escopeta"
 
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_shotgun.qc:219
 #, c-format
 msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
 msgstr "%2$s ^7abofeteó %1$s ^7con una gran ^2shotgun"
 
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_shotgun.qc:221
 #, c-format
 msgid "%s was gunned by %s"
 msgstr "%s fue tiroteado por %s"
 
-#: qcsrc/server/w_sniperrifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_sniperrifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s se disparó a si mismo"
-
-#: qcsrc/server/w_sniperrifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s se disparó a si mismo"
-
-#: qcsrc/server/w_sniperrifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s no logró esconderse del granizo de balas de %s"
-
-#: qcsrc/server/w_sniperrifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s murió en el granizo de balas de %s"
-
-#: qcsrc/server/w_sniperrifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s no logró esconderse del rifle de %s"
-
-#: qcsrc/server/w_sniperrifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s fué disparado en la cabeza por %s"
-
-#: qcsrc/server/w_sniperrifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "%s fué disparado con un rifle por %s"
-
 #: qcsrc/server/w_tuba.qc:2
 #, c-format
 msgid "@!#%'n Tuba"
 msgstr "@!#%'n Tuba"
 
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
 #, c-format
 msgid "%s hurt his own ears with the @!#%%'n Tuba"
 msgstr "%s se lastimó sus propios oídos con la Tuba de @!#%%"
 
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
 #, c-format
 msgid "%s died of %s's great playing on the @!#%%'n Tuba"
 msgstr "%s murió por la gran interpretación de Tuba de @!#%%"
@@ -2831,12 +2883,3 @@ msgstr "Machine Gun"
 #, c-format
 msgid "%s was riddled full of holes by %s"
 msgstr "%s fue totalmente acribillado por %s"
-
-#~ msgid "%s ran into %s's flac"
-#~ msgstr "%s se cruzó con el flac de %s"
-
-#~ msgid "Waypoint settings:"
-#~ msgstr "configuración de puntos de camino:"
-
-#~ msgid "%d/%d"
-#~ msgstr "%d/%d"
index dfa0ceb0e1423cc0ace6e761b356a9a7cdc44720..68d3b5cc9e563eb58a4e0328d2e0be5a58aa6d62 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-06-27 18:26+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Henry 'Exitium' Sanmark <henry.sanmark@gmail.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -110,7 +110,7 @@ msgstr "Tekijät"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
 #: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
 msgid "OK"
@@ -154,6 +154,10 @@ msgstr "Ammuksien näyttö:"
 msgid "Show only current ammo type"
 msgstr "Näytä vain nykyinen ammustyyppi"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
@@ -279,6 +283,110 @@ msgstr "Sisääntulon kesto"
 msgid "Entry fadetime:"
 msgstr "Sisääntulon häivennyksen kesto"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+#, fuzzy
+msgid "Physics Panel"
+msgstr "Keskustelupaneeli"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Paneeli pois päältä"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+#, fuzzy
+msgid "Panel enabled if not observing"
+msgstr "Paneeli päällä kun katsojana"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr "Paneeli aina päällä"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+#, fuzzy
+msgid "Status bar"
+msgstr "Ota tilapalkki käyttöön"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Vasen tasaus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Oikea tasaus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+#, fuzzy
+msgid "Inward align"
+msgstr "Sisäänpäin"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+#, fuzzy
+msgid "Outward align"
+msgstr "Ulospäin"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+#, fuzzy
+msgid "Flip speed/acceleration positions"
+msgstr "Vaihda elämän ja panssarin paikkaa"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+#, fuzzy
+msgid "Speed:"
+msgstr "Nopeus (kb/s)"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "knots"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+#, fuzzy
+msgid "Show"
+msgstr "Näytä panokset"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+#, fuzzy
+msgid "Top speed"
+msgstr "Tarkennuksen nopeus:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+#, fuzzy
+msgid "Acceleration:"
+msgstr "Heijastukset:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
 msgid "Powerups Panel"
 msgstr "Tehonlisäyspaneeli"
@@ -291,20 +399,10 @@ msgstr "Käännä voimakkuuden ja suojauksen sijainnit"
 msgid "Pressed Keys Panel"
 msgstr "Painettujen näppäinten paneeli"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Paneeli pois päältä"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
 msgid "Panel enabled when spectating"
 msgstr "Paneeli päällä kun katsojana"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
-msgid "Panel always enabled"
-msgstr "Paneeli aina päällä"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
 msgid "Forced aspect:"
 msgstr "Pakotettu näkymä:"
@@ -329,7 +427,7 @@ msgstr "Tutka:"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
 msgid "Alpha:"
 msgstr "Alpha:"
 
@@ -385,6 +483,27 @@ msgstr "Tarkennus ei ikinä päällä"
 msgid "Score Panel"
 msgstr "Tulospaneeli"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+#, fuzzy
+msgid "Off"
+msgstr "VBO^Pois"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
 msgid "Timer Panel"
 msgstr "Ajastinpaneeli"
@@ -427,11 +546,11 @@ msgstr "%dt"
 msgid "Fade effect:"
 msgstr "Himmennyseffekti:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
 msgid "EF^None"
 msgstr "EF^Ei mikään"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
 msgid "Slide"
 msgstr "Liukuminen"
 
@@ -439,39 +558,44 @@ msgstr "Liukuminen"
 msgid "Alpha"
 msgstr "Alpha"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+#, fuzzy
+msgid "EF^Both"
+msgstr "WRN^Molemmat"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
 msgid "Weapon icons:"
 msgstr "Aseiden kuvakkeet:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
 msgid "Show weapon ID as:"
 msgstr "Näytä aseen tunniste:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
 msgid "SHOWAS^None"
 msgstr "SHOWAS^Ei mitään."
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
 msgid "Number"
 msgstr "Numero"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
 msgid "Bind"
 msgstr "Näppäin"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
 msgid "Show Accuracy"
 msgstr "Näytä tarkkuus"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
 msgid "Show Ammo"
 msgstr "Näytä panokset"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
 msgid "Ammo bar color:"
 msgstr "Ammuskotelon väri"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
 msgid "Ammo bar alpha:"
 msgstr "Ammuskotelon alpha"
 
@@ -483,20 +607,24 @@ msgstr "Paneelin näkymän asetukset"
 msgid "Panel background defaults:"
 msgstr "Paneelin taustan perusasetukset:"
 
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Tausta:"
+
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
 msgid "Disable"
 msgstr "Pois päältä"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
 msgid "Color:"
 msgstr "Väri:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
 msgid "Border size:"
 msgstr "Reunan koko:"
 
@@ -505,11 +633,11 @@ msgstr "Reunan koko:"
 msgid "Team color:"
 msgstr "Joukkueen väri:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
 msgid "Test team color in configure mode"
 msgstr "Kokeile joukkueen väriä muokkaustilassa"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
 msgid "Padding:"
 msgstr "Pehmustus:"
 
@@ -667,7 +795,7 @@ msgid "Mutators..."
 msgstr "Muokkaukset..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
 msgid "Advanced settings..."
 msgstr "Edistyneet asetukset..."
 
@@ -1249,10 +1377,10 @@ msgstr "Vahinkoroiskeet"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:178
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:191
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:30
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
 msgid "Apply immediately"
 msgstr "Ota heti käyttöön"
 
@@ -1312,15 +1440,11 @@ msgstr "Vaihda ase automaattisesti poimimisen jälkeen"
 msgid "Draw 1st person weapon model"
 msgstr "Piirrä ensimmäisen persoonan asemalli"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Vasen tasaus"
-
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Oikea tasaus"
+msgid "Center"
+msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
 msgid "Flip view horizontally"
 msgstr "Käännä näkymä horisontaalisesti"
 
@@ -1811,10 +1935,16 @@ msgstr "HDR"
 msgid "Motion blur:"
 msgstr "Liikesumeus:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:187
+#, fuzzy
+msgid "Damage & water blur"
 msgstr "Vahinkosumeus:"
 
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
+#, fuzzy
+msgid "Powerup sharpen"
+msgstr "Tehonlisäyspaneeli"
+
 #: qcsrc/menu/xonotic/dialog_settings_input.c:26
 msgid "Key bindings:"
 msgstr "Näppäimet:"
@@ -1831,29 +1961,29 @@ msgstr "Muokkaa..."
 msgid "Sensitivity:"
 msgstr "Herkkyys:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
 msgid "UI mouse speed:"
 msgstr "Käyttöliittymän hiiren nopeus:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
 msgid "Mouse filter"
 msgstr "Hiiren suodatin"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
 msgid "Invert mouse"
 msgstr "Käännä hiiren suunta"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
 msgid "Use joystick input"
 msgstr "Käytä peliohjainta"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
 msgid "Turn off OS mouse acceleration"
 msgstr "Laita käyttöjärjestelmän hiiren kiihtyvyys pois päältä"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
 msgid "\"enter console\" also closes"
 msgstr "\"avaa komentorivi\" myös sulkee komentorivin"
 
@@ -1894,42 +2024,6 @@ msgid "Show frames per second"
 msgstr "Näytä ruudunpäivitysnopeus (FPS)"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Nopeusmittari"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (kätketty)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "knots"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Näytä kiihtyvyysmittari"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Kiihtyvyysmittarin skaala:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
 msgid "Minimize input latency"
 msgstr "Minimoi syötteen viive"
 
@@ -2125,19 +2219,19 @@ msgstr "Kontrasti:"
 msgid "Gamma:"
 msgstr "Gamma:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
 msgid "Contrast boost:"
 msgstr "Kontrastin lisäys:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
 msgid "Saturation:"
 msgstr "Kylläisyys:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
 msgid "LIT^Ambient:"
 msgstr "LIT^Ympäristö:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
 msgid "Intensity:"
 msgstr "Intensiivisyys:"
 
@@ -2314,7 +2408,7 @@ msgstr ""
 msgid "Update to %s now!"
 msgstr "Päivitä versioon %s nyt!"
 
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems.\n"
@@ -2322,94 +2416,90 @@ msgstr ""
 "^1VIRHE: Tekstuurien pakkaus vaaditaan mutta ei ole tuettuna.\n"
 "^1Grafiikkavirheitä odotettavissa.\n"
 
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
 msgid "Arena"
 msgstr "Areena"
 
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
 msgid "Assault"
 msgstr "Rynnäkkö (Assault)"
 
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
 msgid "Capture The Flag"
 msgstr "Lipunryöstö (CTF)"
 
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
 msgid "Clan Arena"
 msgstr "Klaaniareena (Clan Arena)"
 
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
 msgid "Deathmatch"
 msgstr "Mättö (Deathmatch)"
 
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
 msgid "Domination"
 msgstr "Hallinta (Domination)"
 
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
 msgid "Freeze Tag"
 msgstr "Pakkashippa (Freeze Tag)"
 
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
 msgid "Keepaway"
 msgstr "Pakomatka (Keepaway)"
 
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
 msgid "Key Hunt"
 msgstr "Avaimenmetsästys (Key Hunt)"
 
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
 msgid "Last Man Standing"
 msgstr "Viimeiseen mieheen (Last Man Standing)"
 
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
 msgid "Nexball"
 msgstr "Nexpallo (Nexball)"
 
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
 msgid "Onslaught"
 msgstr "Suurtaistelu (Onslaught)"
 
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
 msgid "Race"
 msgstr "Kilpailu (RACE)"
 
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
 msgid "Race CTS"
 msgstr "Kilpailu CTS"
 
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
 msgid "Runematch"
 msgstr "Riimu-ottelu (Runematch)"
 
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
 msgid "Team Deathmatch"
 msgstr "Joukkuemättö (Team Deatchmatch)"
 
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
 #, c-format
 msgid "@!#%'n Tuba Throwing"
 msgstr "@!#% tuubanheitto!"
 
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Tausta:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
 msgid "Default"
 msgstr "Perusasetus"
 
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
 msgid "Use default"
 msgstr "Käytä perusasetusta"
 
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
 msgid "Team Color:"
 msgstr "Joukkueen väri"
 
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
 msgid "Enable panel"
 msgstr "Ota paneeli käyttöön"
 
@@ -2441,37 +2531,37 @@ msgstr ""
 msgid "Electro"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:577
 #, c-format
 msgid "%s could not remember where they put plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:579
 #, c-format
 msgid "%s played with plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:586
 #, c-format
 msgid "%s just noticed %s's blue ball"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:588
 #, c-format
 msgid "%s got in touch with %s's blue ball"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:593
 #, c-format
 msgid "%s felt the electrifying air of %s's combo"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:595
 #, c-format
 msgid "%s got too close to %s's blue beam"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:597
 #, c-format
 msgid "%s was blasted by %s's blue beam"
 msgstr ""
@@ -2525,27 +2615,27 @@ msgstr ""
 msgid "Mortar"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:379
 #, c-format
 msgid "%s tried out his own grenade"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:381
 #, c-format
 msgid "%s detonated"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:387
 #, c-format
 msgid "%s didn't see %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:389
 #, c-format
 msgid "%s almost dodged %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:391
 #, c-format
 msgid "%s ate %s's grenade"
 msgstr ""
@@ -2554,17 +2644,17 @@ msgstr ""
 msgid "Hagar"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655
 #, c-format
 msgid "%s played with tiny rockets"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:386
 #, c-format
 msgid "%s hoped %s's missiles wouldn't bounce"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661
 #, c-format
 msgid "%s was pummeled by %s"
 msgstr ""
@@ -2583,9 +2673,7 @@ msgstr ""
 msgid "Grappling Hook"
 msgstr "Köysi"
 
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
 #, c-format
 msgid "%s did the impossible"
 msgstr ""
@@ -2599,17 +2687,17 @@ msgstr ""
 msgid "Laser"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
 #, c-format
 msgid "%s lasered themself to hell"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
 #, c-format
 msgid "%s was cut in half by %s's gauntlet"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
 #, c-format
 msgid "%s was lasered to death by %s"
 msgstr ""
@@ -2619,22 +2707,22 @@ msgstr ""
 msgid "Mine Layer"
 msgstr "Yksinpeli"
 
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
 #, c-format
 msgid "%s exploded"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
 #, c-format
 msgid "%s got too close to %s's mine"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
 #, c-format
 msgid "%s almost dodged %s's mine"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
 #, c-format
 msgid "%s stepped on %s's mine"
 msgstr ""
@@ -2644,7 +2732,13 @@ msgstr ""
 msgid "MinstaNex"
 msgstr "MinstaGib"
 
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:290 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:209 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:255
 #, c-format
 msgid "%s has been vaporized by %s"
 msgstr ""
@@ -2663,86 +2757,86 @@ msgstr ""
 msgid "%s felt %s doing the impossible to him"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rifle.qc:233
 #, c-format
-msgid "%s got too close to %s's rocket"
+msgid "%s shot themself automatically"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rifle.qc:235
 #, c-format
-msgid "%s almost dodged %s's rocket"
+msgid "%s sniped themself somehow"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rifle.qc:242
 #, c-format
-msgid "%s ate %s's rocket"
+msgid "%s failed to hide from %s's bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_seeker.qc:2
-msgid "T.A.G. Seeker"
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_seeker.qc:659
+#: qcsrc/server/w_rifle.qc:251
 #, c-format
-msgid "%s was tagged by %s"
+msgid "%s failed to hide from %s's rifle"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:2
-#, fuzzy
-msgid "Shotgun"
-msgstr "Laukaukset:"
-
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_rifle.qc:256
 #, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgid "%s got hit in the head by %s"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
 #, c-format
-msgid "%s was gunned by %s"
+msgid "%s was sniped by %s"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:2
-msgid "Sniper Rifle"
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:229
+#: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
-msgid "%s shot themself automatically"
+msgid "%s got too close to %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:231
+#: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
-msgid "%s sniped themself somehow"
+msgid "%s almost dodged %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:238
+#: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
-msgid "%s failed to hide from %s's bullet hail"
+msgid "%s ate %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:247
+#: qcsrc/server/w_seeker.qc:659
 #, c-format
-msgid "%s failed to hide from %s's rifle"
+msgid "%s was tagged by %s"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:252
+#: qcsrc/server/w_shotgun.qc:2
+#, fuzzy
+msgid "Shotgun"
+msgstr "Laukaukset:"
+
+#: qcsrc/server/w_shotgun.qc:213
 #, c-format
-msgid "%s got hit in the head by %s"
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:254 qcsrc/server/w_uzi.qc:321
+#: qcsrc/server/w_shotgun.qc:215
 #, c-format
-msgid "%s was sniped by %s"
+msgid "%s was gunned by %s"
 msgstr ""
 
 #: qcsrc/server/w_tuba.qc:2
@@ -2769,6 +2863,18 @@ msgstr ""
 msgid "%s was riddled full of holes by %s"
 msgstr ""
 
+#~ msgid "Speedometer"
+#~ msgstr "Nopeusmittari"
+
+#~ msgid "qu/s (hidden)"
+#~ msgstr "qu/s (kätketty)"
+
+#~ msgid "Show accelerometer"
+#~ msgstr "Näytä kiihtyvyysmittari"
+
+#~ msgid "Accelerometer scale:"
+#~ msgstr "Kiihtyvyysmittarin skaala:"
+
 #~ msgid "Waypoint settings:"
 #~ msgstr "Välimatkojen asetukset:"
 
index 10de090431153f64e0b0f5717ebf8ff353a5ea39..122fc1fbf66b7dcde8c1f7f14eb015b495077c2c 100644 (file)
@@ -8,10 +8,10 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Xonotic 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
-"PO-Revision-Date: 2011-03-09 15:48-0500\n"
-"Last-Translator: Maxime Paradis <taximus.micro@gmail.com>\n"
-"Language-Team: French <kde-i18n-doc@kde.org>\n"
+"POT-Creation-Date: 2011-08-21 14:00+0200\n"
+"PO-Revision-Date: 2011-08-23 18:51-0400\n"
+"Last-Translator: \n"
+"Language-Team: \n"
 "Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -73,9 +73,9 @@ msgid "custom"
 msgstr "personnalisé"
 
 #: qcsrc/menu/menu.qc:29
-#, fuzzy, c-format
+#, c-format
 msgid "^4MQC Build information: ^1%s\n"
-msgstr "^4MQC Build information : %s (français)\n"
+msgstr "^4MQC Information de version : %s (français)\n"
 
 #: qcsrc/menu/xonotic/campaign.c:284
 #: qcsrc/menu/xonotic/dialog_singleplayer.c:66
@@ -115,7 +115,7 @@ msgstr "Crédits"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
 #: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
 msgid "OK"
@@ -162,7 +162,12 @@ msgstr "Affichage munitions:"
 msgid "Show only current ammo type"
 msgstr "Ne montrer que le type de munition actuel"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr "Aligner l'icône"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
@@ -171,6 +176,7 @@ msgid "Left"
 msgstr "Gauche"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
@@ -178,6 +184,35 @@ msgstr "Gauche"
 msgid "Right"
 msgstr "Droite"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr "Écriture du centre"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
+msgstr "Durée du message:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+msgid "Fade time:"
+msgstr "Temps d'effacement d'une entrée:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
+msgstr "Inverser l'ordre des notifications"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+msgid "Text alignment:"
+msgstr "Alignement icônes:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr "Centre"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
+msgstr "Taille de police:"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
 msgid "Chat Panel"
 msgstr "Panneau de Chat"
@@ -287,6 +322,102 @@ msgstr "Durée d'une entrée:"
 msgid "Entry fadetime:"
 msgstr "Temps d'effacement d'une entrée:"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr "Panneau d'effets physiques"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Panneau désactivé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
+msgstr "Panneau activé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
+msgstr "Panneau activé même en spectateur"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
+msgstr "Panneau activé seulement en Race/CTS"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr "Barre de statut"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "À gauche"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "À droite"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr "Aligner vers l'intérieur"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr "Aligner vers l'extérieur"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr "Échanger positions Vitesse/Accélération"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
+msgstr "Vitesse:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr "Inclure vitesse verticale"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr "Unité de vitesse"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "noeuds"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
+msgstr "Montrer"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
+msgstr "Vitesse maximale:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr "Accélération:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr "Inclure accélération verticale"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
 msgid "Powerups Panel"
 msgstr "Panneau des Pouvoirs"
@@ -299,11 +430,6 @@ msgstr "Échanger les positions Force/Bouclier"
 msgid "Pressed Keys Panel"
 msgstr "Panneau Touches Pressées"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Panneau désactivé"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
 msgid "Panel enabled when spectating"
 msgstr "Panneau activé en spectateur"
@@ -337,7 +463,7 @@ msgstr "Mini-carte:"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
 msgid "Alpha:"
 msgstr "Opacité:"
 
@@ -393,6 +519,26 @@ msgstr "Toujours Dézoomé"
 msgid "Score Panel"
 msgstr "Tableau des scores"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr "Score:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr "Rangs:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr "Désactivé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr "Et moi"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr "Pure"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
 msgid "Timer Panel"
 msgstr "Chronomètre"
@@ -435,11 +581,11 @@ msgstr "%dsec."
 msgid "Fade effect:"
 msgstr "Effet d'effacement:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
 msgid "EF^None"
 msgstr "Aucun"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
 msgid "Slide"
 msgstr "Glisse"
 
@@ -447,39 +593,43 @@ msgstr "Glisse"
 msgid "Alpha"
 msgstr "Opacité"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
+msgstr "Les deux"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
 msgid "Weapon icons:"
 msgstr "Icônes d'armes:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
 msgid "Show weapon ID as:"
 msgstr "Montrer le numéro d'arme:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
 msgid "SHOWAS^None"
 msgstr "Aucun"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
 msgid "Number"
 msgstr "Numéro"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
 msgid "Bind"
 msgstr "Touche"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
 msgid "Show Accuracy"
 msgstr "Monter la précision"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
 msgid "Show Ammo"
 msgstr "Montrer barre de munitions"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
 msgid "Ammo bar color:"
 msgstr "Couleur barre de munitions:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
 msgid "Ammo bar alpha:"
 msgstr "Opacité barre de munitions:"
 
@@ -491,20 +641,24 @@ msgstr "Configuration Interface"
 msgid "Panel background defaults:"
 msgstr "Fond du Panneau par défaut:"
 
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Arrière-plan:"
+
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
 msgid "Disable"
 msgstr "Désactiver"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
 msgid "Color:"
 msgstr "Couleur:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
 msgid "Border size:"
 msgstr "Taille des bords:"
 
@@ -513,11 +667,11 @@ msgstr "Taille des bords:"
 msgid "Team color:"
 msgstr "Couleur d'équipe:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
 msgid "Test team color in configure mode"
 msgstr "Afficher la couleur d'équipe en mode configuration"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
 msgid "Padding:"
 msgstr "Ajustement:"
 
@@ -526,22 +680,18 @@ msgid "HUD Dock:"
 msgstr "Contour interface:"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
-#, fuzzy
 msgid "DOCK^Disabled"
 msgstr "Désactivé"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
-#, fuzzy
 msgid "DOCK^Small"
 msgstr "Petit"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
-#, fuzzy
 msgid "DOCK^Medium"
 msgstr "Moyen"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
-#, fuzzy
 msgid "DOCK^Large"
 msgstr "Grand"
 
@@ -591,131 +741,131 @@ msgstr "Vidéos"
 msgid "Player Setup"
 msgstr "Paramètres Joueur"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
 msgid "Game type:"
 msgstr "Mode de jeu:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
 msgid "Match settings:"
 msgstr "Paramètres match:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
 msgid "Time limit:"
 msgstr "Limite de temps:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
 msgid "Use map specified default"
 msgstr "Utiliser le paramètre de carte"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
 msgid "Point limit:"
 msgstr "Limite de points:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
 msgid "Player slots:"
 msgstr "Nombre de joueurs max.:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
 msgid "Number of bots:"
 msgstr "Nombre de robots:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
 msgid "Bot skill:"
 msgstr "Difficulté robot:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
 msgid "Botlike"
 msgstr "Nul"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
 msgid "Beginner"
 msgstr "Jeu d'enfant"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
 msgid "You will win"
 msgstr "Très Facile"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
 msgid "You can win"
 msgstr "Facile"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
 msgid "You might win"
 msgstr "Assez Facile"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
 msgid "Advanced"
 msgstr "Avancé"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
 msgid "Expert"
 msgstr "Expert"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
 msgid "Pro"
 msgstr "Professionnel"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
 msgid "Assassin"
 msgstr "Assassin"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
 msgid "Unhuman"
 msgstr "Inhumain"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
 msgid "Godlike"
 msgstr "Dieu"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
 msgid "Mutators..."
 msgstr "Spéciales..."
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
 msgid "Advanced settings..."
 msgstr "Paramètres avancés..."
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
 msgid "Map list:"
 msgstr "Liste de cartes:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
 msgid "Select all"
 msgstr "Tout sélectionner"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
 msgid "Select none"
 msgstr "Ne rien sélectionner"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
 msgid "Start Multiplayer!"
 msgstr "Démarrer!"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
 msgid "Capture limit:"
 msgstr "Limite de captures:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
 msgid "Lives:"
 msgstr "Vies:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
 msgid "Laps:"
 msgstr "Tours:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
 msgid "Goals:"
 msgstr "Buts:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
 msgid "Frag limit:"
 msgstr "Limite de tués:"
 
@@ -835,14 +985,13 @@ msgstr "Fonctions:"
 msgid "Game types:"
 msgstr "Modes de jeux:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
 msgid "Close"
 msgstr "Fermer"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+msgid "MAP^Play"
 msgstr "Jouer"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
@@ -992,6 +1141,10 @@ msgstr "Effacer"
 msgid "Timedemo"
 msgstr "Test Performance"
 
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "DEMO^Play"
+msgstr "Jouer"
+
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
 msgid "Join"
 msgstr "Joindre"
@@ -1036,7 +1189,7 @@ msgstr "N/A"
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
 #, c-format
 msgid "%d/%d, %d free player slots"
-msgstr ""
+msgstr "%d/%d, %d Emplacements libres"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
 #, c-format
@@ -1176,12 +1329,11 @@ msgstr "Couleur viseur:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:140
 msgid "By health"
-msgstr ""
+msgstr "Par vie"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
-#, fuzzy
 msgid "Custom"
-msgstr "personnalisé"
+msgstr "Personnalisé"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
 msgid "Enable center dot"
@@ -1260,11 +1412,11 @@ msgid "Damage splash:"
 msgstr "Effet santé faible:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:194
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:30
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
 msgid "Apply immediately"
 msgstr "Appliquer maintenant"
 
@@ -1324,15 +1476,7 @@ msgstr "Changer d'arme en prenant une arme meilleure"
 msgid "Draw 1st person weapon model"
 msgstr "Afficher l'arme à la première personne"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "À gauche"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "À droite"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
 msgid "Flip view horizontally"
 msgstr "Vue Miroir"
 
@@ -1402,7 +1546,7 @@ msgstr "Général:"
 msgid "Music:"
 msgstr "Musique:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
 msgid "VOL^Ambient:"
 msgstr "Ambiance:"
 
@@ -1410,180 +1554,180 @@ msgstr "Ambiance:"
 msgid "Info:"
 msgstr "Information:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
 msgid "Items:"
 msgstr "Objets:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
 msgid "Pain:"
 msgstr "Douleur:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
 msgid "Player:"
 msgstr "Joueur:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
 msgid "Shots:"
 msgstr "Tirs:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
 msgid "Voice:"
 msgstr "Voix:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
 msgid "Weapons:"
 msgstr "Armes:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
 msgid "Frequency:"
 msgstr "Fréquence:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
 msgid "8 kHz"
 msgstr "8 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
 msgid "11.025 kHz"
 msgstr "11.025 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
 msgid "16 kHz"
 msgstr "16 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
 msgid "22.05 kHz"
 msgstr "22.05 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
 msgid "24 kHz"
 msgstr "24 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
 msgid "32 kHz"
 msgstr "32 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
 msgid "44.1 kHz"
 msgstr "44.1 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
 msgid "48 kHz"
 msgstr "48 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
 msgid "Channels:"
 msgstr "Canaux:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
 msgid "Mono"
 msgstr "Mono"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
 msgid "Stereo"
 msgstr "Stéréo"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
 msgid "2.1"
 msgstr "2.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
 msgid "4"
 msgstr "4"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
 msgid "5"
 msgstr "5"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
 msgid "5.1"
 msgstr "5.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
 msgid "6.1"
 msgstr "6.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
 msgid "7.1"
 msgstr "7.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
 msgid "Swap Stereo"
 msgstr "Échanger les canaux Stéréo"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
 msgid "Headphone friendly mode"
 msgstr "Mode casque audio"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
 msgid "Spatial voices:"
 msgstr "Voix personnages:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
 msgid "VOCS^None"
 msgstr "Aucun"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
 msgid "VOCS^Taunts"
 msgstr "Voix"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
 msgid "VOCS^All"
 msgstr "Tout"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
 msgid "Taunt range:"
 msgstr "Distance voix:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
 msgid "RNG^Very short"
 msgstr "Très court"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
 msgid "RNG^Short"
 msgstr "Court"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
 msgid "RNG^Normal"
 msgstr "Normal"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
 msgid "RNG^Long"
 msgstr "Long"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
 msgid "RNG^Full"
 msgstr "Tout"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
 msgid "Automatic taunts"
 msgstr "Voix automatiques"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
 msgid "Time warning:"
 msgstr "Avertissement temps:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
 msgid "WRN^None"
 msgstr "Aucun"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
 msgid "1 minute"
 msgstr "1 minute"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
 msgid "5 minutes"
 msgstr "5 minutes"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
 msgid "WRN^Both"
 msgstr "Les deux"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
 msgid "Hit indicator"
 msgstr "Son tir réussi"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
 msgid "Menu sounds"
 msgstr "Sons du menu"
 
@@ -1726,106 +1870,110 @@ msgstr "Distance max. particules:"
 msgid "Decals"
 msgstr "Marques impacts"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr "Décalques sur les modèles"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
 msgid "Distance:"
 msgstr "Distance max.:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
 msgid "Time:"
 msgstr "Temps:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
 msgid "Use lightmaps"
 msgstr "Utiliser les lightmaps"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
 msgid "Deluxe mapping"
 msgstr "Textures Deluxe"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
 msgid "Gloss"
 msgstr "Brillance textures"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
 msgid "Offset mapping"
 msgstr "Textures relief"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
 msgid "Relief mapping"
 msgstr "Textures relief avancé"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
 msgid "Reflections:"
 msgstr "Réflexions:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
 msgid "Blurred"
 msgstr "Flou"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
 msgid "REFL^Good"
 msgstr "Bon"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
 msgid "Sharp"
 msgstr "Net"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
 msgid "Show surfaces"
 msgstr "Textures unies"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
 msgid "No dynamic lighting"
 msgstr "Pas de lumières dynamiques"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
 msgid "Flash blend approximation"
 msgstr "Lumières dynamiques rapides"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
 msgid "Realtime dynamic lighting"
 msgstr "Lumières dynamiques en temps réel"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
 msgid "Shadows"
 msgstr "Ombres"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
 msgid "Realtime world lighting"
 msgstr "Lumières carte en temps réel"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
 msgid "Use normal maps"
 msgstr "Lumières Deluxe"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
 msgid "Soft shadows"
 msgstr "Ombres avancées"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
 msgid "Coronas"
 msgstr "Brillance Lumière"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
 msgid "Use Occlusion Queries"
 msgstr "Utiliser l'Occlusion du rendu"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
 msgid "Bloom"
 msgstr "Effets d'éblouissement"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
 msgid "High Dynamic Range (HDR)"
 msgstr "High Dynamic Range (HDR)"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
 msgid "Motion blur:"
 msgstr "Flou de vitesse:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr "Flou de dégâts:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
+msgstr "Flou et netteté post-processeur"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:26
 msgid "Key bindings:"
@@ -1843,29 +1991,29 @@ msgstr "Éditer..."
 msgid "Sensitivity:"
 msgstr "Sensibilité:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
 msgid "UI mouse speed:"
 msgstr "Vitesse souris menus:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
 msgid "Mouse filter"
 msgstr "Filtre Souris"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
 msgid "Invert mouse"
 msgstr "Inverser souris (axe Y)"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
 msgid "Use joystick input"
 msgstr "Utiliser une manette"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
 msgid "Turn off OS mouse acceleration"
 msgstr "Désactiver l'accélération souris de l'OS"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
 msgid "\"enter console\" also closes"
 msgstr "\"ouvrir la console\" ferme aussi la console"
 
@@ -1906,42 +2054,6 @@ msgid "Show frames per second"
 msgstr "Montrer les Images Par Seconde"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Speedomètre"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (caché)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "noeuds"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Montrer l'accéléromètre"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Taille accéléromètre:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
 msgid "Minimize input latency"
 msgstr "Minimiser la latence des contrôles"
 
@@ -2082,12 +2194,10 @@ msgid "Use GLSL to handle color control"
 msgstr "Utiliser GLSL pour gérer les couleurs"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:56
-#, fuzzy
 msgid "Vertex Buffer Objects (VBOs)"
 msgstr "Objets en tampon mémoire (VBOs)"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:59
-#, fuzzy
 msgid "VBO^Off"
 msgstr "Désactivé"
 
@@ -2104,22 +2214,18 @@ msgid "Vertices and Triangles"
 msgstr "Points et Triangles"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:67
-#, fuzzy
 msgid "Depth first:"
-msgstr "Fixeur profondeur:"
+msgstr "Profondeur d'abord:"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:69
-#, fuzzy
 msgid "DF^Disabled"
 msgstr "Désactivé"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:70
-#, fuzzy
 msgid "DF^World"
-msgstr "Carte"
+msgstr "Monde"
 
 #: qcsrc/menu/xonotic/dialog_settings_video.c:71
-#, fuzzy
 msgid "DF^All"
 msgstr "Tout"
 
@@ -2143,19 +2249,19 @@ msgstr "Contraste:"
 msgid "Gamma:"
 msgstr "Gamma:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
 msgid "Contrast boost:"
 msgstr "Amélioration contraste:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
 msgid "Saturation:"
 msgstr "Saturation:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
 msgid "LIT^Ambient:"
 msgstr "Ambiance:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
 msgid "Intensity:"
 msgstr "Intensité:"
 
@@ -2327,14 +2433,14 @@ msgstr "Génération des mapinfo pour les nouvelles cartes ajoutées..."
 #: qcsrc/menu/xonotic/util.qc:367
 #, c-format
 msgid "^1%s TEST BUILD"
-msgstr ""
+msgstr "VERSION DE TEST ^1%s"
 
 #: qcsrc/menu/xonotic/util.qc:432
 #, c-format
 msgid "Update to %s now!"
 msgstr "Mettez à jour vers %s maintenant !"
 
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems.\n"
@@ -2342,94 +2448,90 @@ msgstr ""
 "^1ERROR: La texture de compression est nécessaire mais non supportée.\n"
 "^1Attendez vous à voir des problèmes de rendu.\n"
 
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
 msgid "Arena"
 msgstr "Arène Duel"
 
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
 msgid "Assault"
 msgstr "Assaut"
 
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
 msgid "Capture The Flag"
 msgstr "Capture Du Drapeau"
 
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
 msgid "Clan Arena"
 msgstr "Arène Équipes"
 
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
 msgid "Deathmatch"
 msgstr "Match à Mort"
 
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
 msgid "Domination"
 msgstr "Domination"
 
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
 msgid "Freeze Tag"
 msgstr "Freeze Tag"
 
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
 msgid "Keepaway"
 msgstr "Cache-Cache Du Drapeau"
 
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
 msgid "Key Hunt"
 msgstr "Chasse aux Clés"
 
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
 msgid "Last Man Standing"
 msgstr "Dernier Survivant"
 
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
 msgid "Nexball"
 msgstr "Nexball"
 
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
 msgid "Onslaught"
 msgstr "Onslaught"
 
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
 msgid "Race"
 msgstr "Course"
 
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
 msgid "Race CTS"
 msgstr "Course CTS"
 
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
 msgid "Runematch"
 msgstr "Runematch"
 
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
 msgid "Team Deathmatch"
 msgstr "Match à Mort Équipe"
 
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
 #, c-format
 msgid "@!#%'n Tuba Throwing"
 msgstr "Lancer de @!#%'n Tuba"
 
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Arrière-plan:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
 msgid "Default"
 msgstr "Par défaut"
 
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
 msgid "Use default"
 msgstr "Par défaut"
 
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
 msgid "Team Color:"
 msgstr "Couleur d'équipe:"
 
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
 msgid "Enable panel"
 msgstr "Activer ce panneau"
 
@@ -2461,45 +2563,44 @@ msgstr "%s a voulu voir se qui se trouvait dans le Crylink de %s"
 msgid "Electro"
 msgstr "Electro"
 
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
 #, c-format
 msgid "%s could not remember where they put plasma"
 msgstr "%s ne se souvenait pas où il a tiré du plasma"
 
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
 #, c-format
 msgid "%s played with plasma"
 msgstr "%s a joué avec du plasma"
 
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
 #, c-format
 msgid "%s just noticed %s's blue ball"
 msgstr "%s vient de remarquer la boule plasma de %s"
 
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
 #, c-format
 msgid "%s got in touch with %s's blue ball"
 msgstr "%s s'est fait toucher par la boule plasma de %s"
 
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
 #, c-format
 msgid "%s felt the electrifying air of %s's combo"
 msgstr "%s se sent électrisé par le combo de %s"
 
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
 #, c-format
 msgid "%s got too close to %s's blue beam"
 msgstr "%s a été trop près du rayon plasma de %s"
 
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
 #, c-format
 msgid "%s was blasted by %s's blue beam"
 msgstr "%s a été désintégré à cause du rayon plasma de %s"
 
 #: qcsrc/server/w_fireball.qc:2
-#, fuzzy
 msgid "Fireball"
-msgstr "Fireball"
+msgstr "Boule de Feu"
 
 #: qcsrc/server/w_fireball.qc:417
 #, c-format
@@ -2545,27 +2646,27 @@ msgstr "%s a goûté la boule de feu de %s"
 msgid "Mortar"
 msgstr "Mortier"
 
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
 #, c-format
 msgid "%s tried out his own grenade"
 msgstr "%s a mangé sa propre grenade"
 
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
 #, c-format
 msgid "%s detonated"
 msgstr "%s a fait boum"
 
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
 #, c-format
 msgid "%s didn't see %s's grenade"
 msgstr "%s n'a pas vu la grenade de %s"
 
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
 #, c-format
 msgid "%s almost dodged %s's grenade"
 msgstr "%s a presque réussi à esquiver la grenade de %s"
 
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
 #, c-format
 msgid "%s ate %s's grenade"
 msgstr "%s a mangé la grenade de %s"
@@ -2574,17 +2675,17 @@ msgstr "%s a mangé la grenade de %s"
 msgid "Hagar"
 msgstr "Hagar"
 
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655
 #, c-format
 msgid "%s played with tiny rockets"
 msgstr "%s a joué avec des petits missiles"
 
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:386
 #, c-format
 msgid "%s hoped %s's missiles wouldn't bounce"
 msgstr "%s a pensé que les petits missiles de %s ne rebondissaient pas"
 
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661
 #, c-format
 msgid "%s was pummeled by %s"
 msgstr "%s a trop mangé de mini-missiles de la part de %s"
@@ -2599,13 +2700,10 @@ msgid "%s was cut down by %s"
 msgstr "%s s'est fait couper par %s"
 
 #: qcsrc/server/w_hook.qc:2
-#, fuzzy
 msgid "Grappling Hook"
 msgstr "Grappin"
 
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
 #, c-format
 msgid "%s did the impossible"
 msgstr "%s a fait l'impossible"
@@ -2619,58 +2717,61 @@ msgstr "%s a été emprisonné par la bombe à gravité de %s"
 msgid "Laser"
 msgstr "Laser"
 
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
 #, c-format
 msgid "%s lasered themself to hell"
 msgstr "%s s'est suicidé au laser"
 
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
 #, c-format
 msgid "%s was cut in half by %s's gauntlet"
 msgstr "%s s'est fait couper en deux par le laser de %s"
 
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
 #, c-format
 msgid "%s was lasered to death by %s"
 msgstr "%s a été désintégré par le laser de %s"
 
 #: qcsrc/server/w_minelayer.qc:2
-#, fuzzy
 msgid "Mine Layer"
 msgstr "Lance-Mines"
 
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
 #, c-format
 msgid "%s exploded"
 msgstr "%s a explosé"
 
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
 #, c-format
 msgid "%s got too close to %s's mine"
 msgstr "%s s'est trop approché de la mine de %s"
 
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
 #, c-format
 msgid "%s almost dodged %s's mine"
 msgstr "%s a presque esquivé la mine de %s"
 
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
 #, c-format
 msgid "%s stepped on %s's mine"
 msgstr "%s a marché sur la mine de %s"
 
 #: qcsrc/server/w_minstanex.qc:2
-#, fuzzy
 msgid "MinstaNex"
 msgstr "MinstaNex"
 
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr "%s pense maintenant avec les portails"
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
 #, c-format
 msgid "%s has been vaporized by %s"
 msgstr "%s s'est fait vaporiser par %s"
 
 #: qcsrc/server/w_nex.qc:2
-#, fuzzy
 msgid "Nex"
 msgstr "Nex"
 
@@ -2683,21 +2784,60 @@ msgstr "Lance-O-Port"
 msgid "%s felt %s doing the impossible to him"
 msgstr "%s a eu tort de prendre le portail de %s"
 
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Fusil"
+
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s s'est suicidé au sniper"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s a oublié le cran de sûreté en chargeant"
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s n'a pas pu se cacher de la nuée de balles de %s"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s est mort de la nuée de balles de %s"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s n'a pas réussi à se cacher du sniper de %s"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s s'est fait décapiter au sniper par %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "%s s'est fait descendre au sniper par %s"
+
 #: qcsrc/server/w_rocketlauncher.qc:2
 msgid "Rocket Launcher"
 msgstr "Lance-Roquettes"
 
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
 msgid "%s got too close to %s's rocket"
 msgstr "%s s'est trop approché de la roquette de %s"
 
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
 msgid "%s almost dodged %s's rocket"
 msgstr "%s a presque esquivé la roquette de %s"
 
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
 msgid "%s ate %s's rocket"
 msgstr "%s a mangé la roquette de %s"
@@ -2712,70 +2852,30 @@ msgid "%s was tagged by %s"
 msgstr "%s s'est fait tagguer par %s"
 
 #: qcsrc/server/w_shotgun.qc:2
-#, fuzzy
 msgid "Shotgun"
 msgstr "Fusil"
 
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_shotgun.qc:219
 #, c-format
 msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
 msgstr "%2$s ^7a baffé %1$s ^7avec un ^2fusil"
 
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_shotgun.qc:221
 #, c-format
 msgid "%s was gunned by %s"
 msgstr "%s s'est fait fusiller par %s"
 
-#: qcsrc/server/w_sniperrifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Fusil Sniper"
-
-#: qcsrc/server/w_sniperrifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s s'est suicidé au sniper"
-
-#: qcsrc/server/w_sniperrifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s a oublié le cran de sûreté en chargeant"
-
-#: qcsrc/server/w_sniperrifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s n'a pas pu se cacher de la nuée de balles de %s"
-
-#: qcsrc/server/w_sniperrifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s est mort de la nuée de balles de %s"
-
-#: qcsrc/server/w_sniperrifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s n'a pas réussi à se cacher du sniper de %s"
-
-#: qcsrc/server/w_sniperrifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s s'est fait décapiter au sniper par %s"
-
-#: qcsrc/server/w_sniperrifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "%s s'est fait descendre au sniper par %s"
-
 #: qcsrc/server/w_tuba.qc:2
-#, fuzzy, c-format
+#, c-format
 msgid "@!#%'n Tuba"
-msgstr "@!#%'n Tuba"
+msgstr "@!#% Tuba"
 
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
 #, c-format
 msgid "%s hurt his own ears with the @!#%%'n Tuba"
 msgstr "%s s'est fait casser les tympans par son propre tuba"
 
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
 #, c-format
 msgid "%s died of %s's great playing on the @!#%%'n Tuba"
 msgstr "%s n'a pas aimé la musique de %s et en est mort"
@@ -2789,11 +2889,8 @@ msgstr "Mitraillette"
 msgid "%s was riddled full of holes by %s"
 msgstr "%s s'est fait trouer par %s"
 
-#~ msgid "%s ran into %s's flac"
-#~ msgstr "%s n'a pas eu peur des missiles de %s"
-
-#~ msgid "Waypoint settings:"
-#~ msgstr "Paramètres Waypoint (flèches 3D sur la carte):"
+#~ msgid "Damage & water blur"
+#~ msgstr "Flou de d�g�ts:"
 
-#~ msgid "%d/%d"
-#~ msgstr "%d/%d"
+#~ msgid "Powerup sharpen"
+#~ msgstr "Panneau des Pouvoirs"
index 75096ed81536b5762f621be1b83125cc8c7db7fa..c59927c474aecc69c8e7cc90988cf961412228ce 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-06-27 18:26+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -110,7 +110,7 @@ msgstr "Köszönetek"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
 #: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
 msgid "OK"
@@ -154,6 +154,10 @@ msgstr "Lőszer kijelző:"
 msgid "Show only current ammo type"
 msgstr "Csak az aktuális lőszer típus megjelenítése"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
@@ -279,6 +283,110 @@ msgstr "Bejegyzés élettartam:"
 msgid "Entry fadetime:"
 msgstr "Bejegyzés halványulási idő:"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+#, fuzzy
+msgid "Physics Panel"
+msgstr "Csevely Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Panel kikapcsolva"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+#, fuzzy
+msgid "Panel enabled if not observing"
+msgstr "Panel engedélyezett, ha csak néző vagy"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr "Panel mindig látható"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+#, fuzzy
+msgid "Status bar"
+msgstr "Állapotsor engedélyezése"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Balra igazítása"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Jobbra igazított"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+#, fuzzy
+msgid "Inward align"
+msgstr "Befelé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+#, fuzzy
+msgid "Outward align"
+msgstr "Kifelé"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+#, fuzzy
+msgid "Flip speed/acceleration positions"
+msgstr "Életerő és páncél poziciójának cseréje"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+#, fuzzy
+msgid "Speed:"
+msgstr "Sebesség (kB/s):"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "csomó"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+#, fuzzy
+msgid "Show"
+msgstr "Lőszer mutatása"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+#, fuzzy
+msgid "Top speed"
+msgstr "Nagyítás sebesség:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+#, fuzzy
+msgid "Acceleration:"
+msgstr "Tükrözödés:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
 msgid "Powerups Panel"
 msgstr "Powerups Panel"
@@ -291,20 +399,10 @@ msgstr "Erő és pajzs pozíciók felcserélése"
 msgid "Pressed Keys Panel"
 msgstr "Lenyomott gombok lapja"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Panel kikapcsolva"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
 msgid "Panel enabled when spectating"
 msgstr "Panel engedélyezett, ha csak néző vagy"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
-msgid "Panel always enabled"
-msgstr "Panel mindig látható"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
 msgid "Forced aspect:"
 msgstr ""
@@ -329,7 +427,7 @@ msgstr "Radar:"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
 msgid "Alpha:"
 msgstr "Alpha:"
 
@@ -385,6 +483,27 @@ msgstr "Sohasem nagyított"
 msgid "Score Panel"
 msgstr "Ponttáblázat"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+#, fuzzy
+msgid "Off"
+msgstr "VBO^Off"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
 msgid "Timer Panel"
 msgstr "Időtáblázat"
@@ -427,11 +546,11 @@ msgstr "%ds"
 msgid "Fade effect:"
 msgstr "Halványulás hatás:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
 msgid "EF^None"
 msgstr "EF^Nincs"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
 msgid "Slide"
 msgstr "Csúszás"
 
@@ -439,39 +558,44 @@ msgstr "Csúszás"
 msgid "Alpha"
 msgstr "Alpha"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+#, fuzzy
+msgid "EF^Both"
+msgstr "Mindkettő"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
 msgid "Weapon icons:"
 msgstr "Fegyver ikonok:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
 msgid "Show weapon ID as:"
 msgstr "A Fegyver azonosító megjelenítés eszerint:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
 msgid "SHOWAS^None"
 msgstr "Nincs"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
 msgid "Number"
 msgstr "Szám"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
 msgid "Bind"
 msgstr "Hozzárendelés"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
 msgid "Show Accuracy"
 msgstr "Pontosság mutatása"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
 msgid "Show Ammo"
 msgstr "Lőszer mutatása"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
 msgid "Ammo bar color:"
 msgstr "Lőszer jelző színe:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
 msgid "Ammo bar alpha:"
 msgstr "Lőszer jelző alpha:"
 
@@ -483,20 +607,24 @@ msgstr "HUD panel beállítás"
 msgid "Panel background defaults:"
 msgstr "Panel háttér alapértelmezett:"
 
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Háttér:"
+
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
 msgid "Disable"
 msgstr "Letiltás"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
 msgid "Color:"
 msgstr "Szín:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
 msgid "Border size:"
 msgstr "Keret méret:"
 
@@ -505,11 +633,11 @@ msgstr "Keret méret:"
 msgid "Team color:"
 msgstr "Csapat szín:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
 msgid "Test team color in configure mode"
 msgstr "Csapat szín ellenörzés konfigurációs módban"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
 msgid "Padding:"
 msgstr "Padding:"
 
@@ -668,7 +796,7 @@ msgid "Mutators..."
 msgstr "Mutatorok..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
 msgid "Advanced settings..."
 msgstr "Különleges beállítások ..."
 
@@ -1250,10 +1378,10 @@ msgstr "Sérülés szórás:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:178
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:191
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:30
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
 msgid "Apply immediately"
 msgstr "Azonnali alkalmazás"
 
@@ -1313,15 +1441,11 @@ msgstr "Automatikus váltás a felvett fegyverre"
 msgid "Draw 1st person weapon model"
 msgstr "1.személyű fegyver modell kirajzolása"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Balra igazítása"
-
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Jobbra igazított"
+msgid "Center"
+msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
 msgid "Flip view horizontally"
 msgstr "A nézet horizontális döntése"
 
@@ -1812,10 +1936,16 @@ msgstr "Magas dinamika tartomány (HDR)"
 msgid "Motion blur:"
 msgstr "Mozgási elmosás:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:187
+#, fuzzy
+msgid "Damage & water blur"
 msgstr "Sérülés elmosás:"
 
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
+#, fuzzy
+msgid "Powerup sharpen"
+msgstr "Powerups Panel"
+
 #: qcsrc/menu/xonotic/dialog_settings_input.c:26
 msgid "Key bindings:"
 msgstr "Billentyű hozzárendelések:"
@@ -1832,29 +1962,29 @@ msgstr "Szerkesztés..."
 msgid "Sensitivity:"
 msgstr "Érzékenység:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
 msgid "UI mouse speed:"
 msgstr "UI egér sebesség:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
 msgid "Mouse filter"
 msgstr "Egér szürés"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
 msgid "Invert mouse"
 msgstr "Forditott egér"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
 msgid "Use joystick input"
 msgstr "Joystick bemenet használata"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
 msgid "Turn off OS mouse acceleration"
 msgstr "OS egér gyorsítás kikapcsolása"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
 msgid "\"enter console\" also closes"
 msgstr "\"belépés a konzolba\" zár is"
 
@@ -1895,42 +2025,6 @@ msgid "Show frames per second"
 msgstr "A képkocka/s mutatása"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Sebességmérő"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (rejtett)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "csomó"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Gyorsulásmérő mutatása"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Gyorsulásmérő beosztás:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
 msgid "Minimize input latency"
 msgstr "Bemeneti késleltetés minimalizása"
 
@@ -2126,19 +2220,19 @@ msgstr "Kontraszt:"
 msgid "Gamma:"
 msgstr "Gamma:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
 msgid "Contrast boost:"
 msgstr "Kontraszt növelés:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
 msgid "Saturation:"
 msgstr "Színtelítettség:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
 msgid "LIT^Ambient:"
 msgstr "Környezet:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
 msgid "Intensity:"
 msgstr "Erősség:"
 
@@ -2315,7 +2409,7 @@ msgstr ""
 msgid "Update to %s now!"
 msgstr "Most frissítsd %s-re!"
 
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems.\n"
@@ -2323,94 +2417,90 @@ msgstr ""
 "^1Hiba: textúra tömörítés szükséges, de nem támogatott.\n"
 "^1Gondok lehetnek a látvánnyal.\n"
 
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
 msgid "Arena"
 msgstr "Aréna"
 
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
 msgid "Assault"
 msgstr "Ostrom"
 
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
 msgid "Capture The Flag"
 msgstr "Szerezd meg a zászlót"
 
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
 msgid "Clan Arena"
 msgstr "Klán Aréna"
 
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
 msgid "Deathmatch"
 msgstr "Mindenki mindenki ellen"
 
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
 msgid "Domination"
 msgstr "Uralom"
 
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
 msgid "Freeze Tag"
 msgstr "Freeze Tag"
 
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
 msgid "Keepaway"
 msgstr "Keepaway"
 
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
 msgid "Key Hunt"
 msgstr "Kulcs vadászat"
 
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
 msgid "Last Man Standing"
 msgstr "Last Man Standing"
 
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
 msgid "Nexball"
 msgstr "Nexball"
 
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
 msgid "Onslaught"
 msgstr "Támadás"
 
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
 msgid "Race"
 msgstr "Futam"
 
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
 msgid "Race CTS"
 msgstr "Race CTS"
 
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
 msgid "Runematch"
 msgstr "Rúnameccs"
 
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
 msgid "Team Deathmatch"
 msgstr "Csapatos öldöklés"
 
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
 #, c-format
 msgid "@!#%'n Tuba Throwing"
 msgstr "@!#%'n Tuba Dobás"
 
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Háttér:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
 msgid "Default"
 msgstr "Alapértelmezett"
 
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
 msgid "Use default"
 msgstr "Alapértékek használata"
 
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
 msgid "Team Color:"
 msgstr "Csapat színe:"
 
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
 msgid "Enable panel"
 msgstr "Panel engedélyezés"
 
@@ -2442,37 +2532,37 @@ msgstr ""
 msgid "Electro"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:577
 #, c-format
 msgid "%s could not remember where they put plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:579
 #, c-format
 msgid "%s played with plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:586
 #, c-format
 msgid "%s just noticed %s's blue ball"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:588
 #, c-format
 msgid "%s got in touch with %s's blue ball"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:593
 #, c-format
 msgid "%s felt the electrifying air of %s's combo"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:595
 #, c-format
 msgid "%s got too close to %s's blue beam"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:597
 #, c-format
 msgid "%s was blasted by %s's blue beam"
 msgstr ""
@@ -2527,27 +2617,27 @@ msgstr ""
 msgid "Mortar"
 msgstr "Előre"
 
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:379
 #, c-format
 msgid "%s tried out his own grenade"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:381
 #, fuzzy, c-format
 msgid "%s detonated"
 msgstr "néző"
 
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:387
 #, c-format
 msgid "%s didn't see %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:389
 #, c-format
 msgid "%s almost dodged %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:391
 #, c-format
 msgid "%s ate %s's grenade"
 msgstr ""
@@ -2556,17 +2646,17 @@ msgstr ""
 msgid "Hagar"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655
 #, c-format
 msgid "%s played with tiny rockets"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:386
 #, c-format
 msgid "%s hoped %s's missiles wouldn't bounce"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661
 #, c-format
 msgid "%s was pummeled by %s"
 msgstr ""
@@ -2585,9 +2675,7 @@ msgstr ""
 msgid "Grappling Hook"
 msgstr "Ragadós horog"
 
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
 #, c-format
 msgid "%s did the impossible"
 msgstr ""
@@ -2602,17 +2690,17 @@ msgstr ""
 msgid "Laser"
 msgstr "Mester:"
 
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
 #, c-format
 msgid "%s lasered themself to hell"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
 #, c-format
 msgid "%s was cut in half by %s's gauntlet"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
 #, c-format
 msgid "%s was lasered to death by %s"
 msgstr ""
@@ -2622,22 +2710,22 @@ msgstr ""
 msgid "Mine Layer"
 msgstr "Egyjátékos"
 
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
 #, c-format
 msgid "%s exploded"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
 #, c-format
 msgid "%s got too close to %s's mine"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
 #, c-format
 msgid "%s almost dodged %s's mine"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
 #, c-format
 msgid "%s stepped on %s's mine"
 msgstr ""
@@ -2647,7 +2735,13 @@ msgstr ""
 msgid "MinstaNex"
 msgstr "MinstaGib"
 
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:290 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:209 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:255
 #, c-format
 msgid "%s has been vaporized by %s"
 msgstr ""
@@ -2666,86 +2760,86 @@ msgstr ""
 msgid "%s felt %s doing the impossible to him"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rifle.qc:233
 #, c-format
-msgid "%s got too close to %s's rocket"
+msgid "%s shot themself automatically"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rifle.qc:235
 #, c-format
-msgid "%s almost dodged %s's rocket"
+msgid "%s sniped themself somehow"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rifle.qc:242
 #, c-format
-msgid "%s ate %s's rocket"
+msgid "%s failed to hide from %s's bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_seeker.qc:2
-msgid "T.A.G. Seeker"
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_seeker.qc:659
+#: qcsrc/server/w_rifle.qc:251
 #, c-format
-msgid "%s was tagged by %s"
+msgid "%s failed to hide from %s's rifle"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:2
-#, fuzzy
-msgid "Shotgun"
-msgstr "Lövések:"
-
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_rifle.qc:256
 #, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgid "%s got hit in the head by %s"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
 #, c-format
-msgid "%s was gunned by %s"
+msgid "%s was sniped by %s"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:2
-msgid "Sniper Rifle"
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:229
+#: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
-msgid "%s shot themself automatically"
+msgid "%s got too close to %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:231
+#: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
-msgid "%s sniped themself somehow"
+msgid "%s almost dodged %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:238
+#: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
-msgid "%s failed to hide from %s's bullet hail"
+msgid "%s ate %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:247
+#: qcsrc/server/w_seeker.qc:659
 #, c-format
-msgid "%s failed to hide from %s's rifle"
+msgid "%s was tagged by %s"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:252
+#: qcsrc/server/w_shotgun.qc:2
+#, fuzzy
+msgid "Shotgun"
+msgstr "Lövések:"
+
+#: qcsrc/server/w_shotgun.qc:213
 #, c-format
-msgid "%s got hit in the head by %s"
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:254 qcsrc/server/w_uzi.qc:321
+#: qcsrc/server/w_shotgun.qc:215
 #, c-format
-msgid "%s was sniped by %s"
+msgid "%s was gunned by %s"
 msgstr ""
 
 #: qcsrc/server/w_tuba.qc:2
@@ -2772,6 +2866,18 @@ msgstr ""
 msgid "%s was riddled full of holes by %s"
 msgstr ""
 
+#~ msgid "Speedometer"
+#~ msgstr "Sebességmérő"
+
+#~ msgid "qu/s (hidden)"
+#~ msgstr "qu/s (rejtett)"
+
+#~ msgid "Show accelerometer"
+#~ msgstr "Gyorsulásmérő mutatása"
+
+#~ msgid "Accelerometer scale:"
+#~ msgstr "Gyorsulásmérő beosztás:"
+
 #~ msgid ""
 #~ "Please answer a few initial questions to enhance the game experience."
 #~ msgstr ""
index 2355692707e7c9d369023c823a50734a6cdae6b9..8e58a5936d79453bc646d08098a330b1bdf06dba 100644 (file)
-# Xonotic Menu
-# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
-# This file is distributed under the same license as the PACKAGE package.
-# Felice Sallustio <fel.sallustio@gmail.com>, 2011.
-# Antonio 'terencehill' Piu <piuntn@gmail.com>, 2011.
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: 0.1preview\n"
-"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-05-01 13:33+0200\n"
-"PO-Revision-Date: 2011-04-29 16:29+0100\n"
-"Last-Translator: Antonio 'terencehill' Piu <piuntn@gmail.com>\n"
-"Language-Team: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: 8bit\n"
-"Language: \n"
-"X-Poedit-Language: Italian\n"
-
-#: qcsrc/menu/gamecommand.qc:47
-#, c-format
-msgid "error: status is %d\n"
-msgstr "errore: lo stato è impostato su %d\n"
-
-#: qcsrc/menu/gamecommand.qc:65
-msgid "Usage: menu_cmd command..., where possible commands are:\n"
-msgstr "Uso: menu_cmd command..., dove i possibili comandi sono:\n"
-
-#: qcsrc/menu/gamecommand.qc:66
-msgid "  sync - reloads all cvars on the current menu page\n"
-msgstr "  sync - ricarica tutte le cvar sulla corrente pagina\n"
-
-#: qcsrc/menu/gamecommand.qc:67
-msgid "  directmenu ITEM - select a menu item as main item\n"
-msgstr "  directmenu OGGETTO - seleziona un oggetto come il principale\n"
-
-#: qcsrc/menu/gamecommand.qc:193
-msgid "error creating curl handle\n"
-msgstr "error creating curl handle\n"
-
-#: qcsrc/menu/gamecommand.qc:239
-msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
-msgstr ""
-"Comando non valido. Per una lista dei comandi supportati, prova menu_cmd "
-"help.\n"
-
-#: qcsrc/menu/item/gecko.c:49
-msgid "Browser not initialized!"
-msgstr "Browser non inizializzato!"
-
-#: qcsrc/menu/item/label.c:63
-#, c-format
-msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
-msgstr ""
-"NOTA: testo dell'etichetta %s troppo grande per l'etichetta, compresso di un "
-"fattore %f\n"
-
-#: qcsrc/menu/item/listbox.c:300
-#, c-format
-msgid "Item %d"
-msgstr "Oggetto %d"
-
-#: qcsrc/menu/item/slider.c:64
-#, c-format
-msgid "%d (%s)"
-msgstr "%d (%s)"
-
-#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31
-msgid "custom"
-msgstr "personalizzato"
-
-#: qcsrc/menu/menu.qc:29
-#, c-format
-msgid "^4MQC Build information: ^1%s\n"
-msgstr "^4MQC Build information: ^1%s\n"
-
-#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
-msgid "???"
-msgstr "???"
-
-#: qcsrc/menu/xonotic/campaign.c:285
-#, c-format
-msgid "Level %d: %s"
-msgstr "Livello %d: %s"
-
-#: qcsrc/menu/xonotic/cvarlist.c:85
-msgid "will be saved to config.cfg"
-msgstr "sarà salvato su config.cfg"
-
-#: qcsrc/menu/xonotic/cvarlist.c:87
-msgid "will not be saved"
-msgstr "non sarà salvato"
-
-#: qcsrc/menu/xonotic/cvarlist.c:89
-msgid "private"
-msgstr "privata"
-
-#: qcsrc/menu/xonotic/cvarlist.c:91
-msgid "engine setting"
-msgstr "impostazioni motore"
-
-#: qcsrc/menu/xonotic/cvarlist.c:93
-msgid "read only"
-msgstr "sola lettura"
-
-#: qcsrc/menu/xonotic/dialog_credits.c:5
-msgid "Credits"
-msgstr "Crediti"
-
-#: qcsrc/menu/xonotic/dialog_credits.c:21
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
-#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
-msgid "OK"
-msgstr "OK"
-
-#: qcsrc/menu/xonotic/dialog_firstrun.c:4
-msgid "Welcome"
-msgstr "Benvenuto"
-
-#: qcsrc/menu/xonotic/dialog_firstrun.c:33
-msgid ""
-"Welcome to Xonotic, please select your language preference and enter your "
-"player name to get started.  You can change these options later through the "
-"menu system."
-msgstr ""
-"Benvenuto in Xonotic, per favore selezione la tua lingua e inserisci il tuo "
-"nome come giocatore per iniziare.  Puoi cambiare queste opzioni più tardi "
-"tramite il menu."
-
-#: qcsrc/menu/xonotic/dialog_firstrun.c:38
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
-msgid "Text language:"
-msgstr "Lingua testo:"
-
-#: qcsrc/menu/xonotic/dialog_firstrun.c:47
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
-msgid "Name:"
-msgstr "Nome:"
-
-#: qcsrc/menu/xonotic/dialog_firstrun.c:69
-msgid "Save settings"
-msgstr "Salva impostazioni"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
-msgid "Ammo Panel"
-msgstr "Pannello munizioni"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
-msgid "Ammunition display:"
-msgstr "Mostra munizioni:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25
-msgid "Show only current ammo type"
-msgstr "Mostra solo il tipo corrente di munizioni"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
-msgid "Left"
-msgstr "Sinistra"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
-msgid "Right"
-msgstr "Destra"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
-msgid "Chat Panel"
-msgstr "Pannello Chat"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22
-msgid "Chat entries:"
-msgstr "N° righe della chat:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25
-msgid "Chat size:"
-msgstr "Dimensioni chat:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29
-msgid "Chat lifetime:"
-msgstr "Durata chat:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33
-msgid "Chat beep sound"
-msgstr "Suono della chat"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
-msgid "Engine Info Panel"
-msgstr "Pannello info motore"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
-msgid "Engine info:"
-msgstr "Info motore:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
-msgid "Use an averaging algorithm for fps"
-msgstr "Usa un algoritmo mediano per gli fps"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4
-msgid "Health/Armor Panel"
-msgstr "Pannello vita/armatura"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22
-msgid "Enable status bar"
-msgstr "Abilita barra di stato"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24
-msgid "Status bar alignment:"
-msgstr "Allineamento barra di stato:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42
-msgid "Inward"
-msgstr "Interno"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43
-msgid "Outward"
-msgstr "Esterno"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37
-msgid "Icon alignment:"
-msgstr "Allineamento icone:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
-msgid "Flip health and armor positions"
-msgstr "Inverti posizioni di vita e armatura"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
-msgid "Info Messages Panel"
-msgstr "Pannello delle informazioni"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
-msgid "Info messages:"
-msgstr "Informazioni"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
-msgid "Flip align"
-msgstr "Inverti allineamento"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
-msgid "Mod Icons Panel"
-msgstr "Pannello delle icone delle Mod"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4
-msgid "Notification Panel"
-msgstr "Pannello di notifica"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22
-msgid "Notifications:"
-msgstr "Notifiche:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
-msgid "Also print notifications to the console"
-msgstr "Mostra anche le notifiche sulla console"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
-msgid "Flip notify order"
-msgstr "Inverti ordine delle notifiche"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
-msgid "Entry lifetime:"
-msgstr "Durata notifica:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
-msgid "Entry fadetime:"
-msgstr "Durata dissolvenza:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
-msgid "Powerups Panel"
-msgstr "Pannello dei Powerup"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
-msgid "Flip strength and shield positions"
-msgstr "Inverti posizioni di forza e scudo"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4
-msgid "Pressed Keys Panel"
-msgstr "Pannello dei tasto premuti"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Pannello disabilitato"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
-msgid "Panel enabled when spectating"
-msgstr "Pannello abilitato in modalità spettatore"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
-msgid "Panel always enabled"
-msgstr "Pannello sempre abilitato"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
-msgid "Forced aspect:"
-msgstr "Forza aspetto:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
-msgid "Race Timer Panel"
-msgstr "Pannello tempi Corsa"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:4
-msgid "Radar Panel"
-msgstr "Pannello Radar"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:22
-msgid "Panel enabled in teamgames"
-msgstr "Pannello abilitato nei teamgames"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:29
-msgid "Radar:"
-msgstr "Radar:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
-msgid "Alpha:"
-msgstr "Opacità:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:36
-msgid "Rotation:"
-msgstr "Rotazione:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:38
-msgid "Forward"
-msgstr "Avanti"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:39
-msgid "West"
-msgstr "Ovest"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:40
-msgid "South"
-msgstr "Sud"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:41
-msgid "East"
-msgstr "Est"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:42
-msgid "North"
-msgstr "Nord"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46
-msgid "Scale:"
-msgstr "Scala:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:50
-msgid "Zoom mode:"
-msgstr "Modalità zoom:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:52
-msgid "Zoomed in"
-msgstr "Ingrandito"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:53
-msgid "Zoomed out"
-msgstr "Non ingrandito"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:54
-msgid "Always zoomed"
-msgstr "Sempre ingrandito"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:55
-msgid "Never zoomed"
-msgstr "Mai ingrandito"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
-msgid "Score Panel"
-msgstr "Pannello punteggio"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
-msgid "Timer Panel"
-msgstr "Pannello tempo"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
-msgid "Timer:"
-msgstr "Tempo:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25
-msgid "Show elapsed time"
-msgstr "Mostra tempo trascorso"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
-msgid "Vote Panel"
-msgstr "Pannello di voto"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
-msgid "Alpha after voting:"
-msgstr "Opacità dopo aver votato:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
-msgid "Weapons Panel"
-msgstr "Pannello armi"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
-msgid "Fade out after:"
-msgstr "Dissolvi dopo:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36
-msgid "Never"
-msgstr "Mai"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28
-#, c-format
-msgid "%ds"
-msgstr "%ds"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
-msgid "Fade effect:"
-msgstr "Effetto dissolvenza:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
-msgid "EF^None"
-msgstr "EF^Nessuno"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
-msgid "Slide"
-msgstr "Slide"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
-msgid "Alpha"
-msgstr "Opacità"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
-msgid "Weapon icons:"
-msgstr "Icone armi:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
-msgid "Show weapon ID as:"
-msgstr "Mostra ID arma come:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
-msgid "SHOWAS^None"
-msgstr "SHOWAS^Nessuno"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
-msgid "Number"
-msgstr "Numero"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
-msgid "Bind"
-msgstr "Bind"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
-msgid "Show Accuracy"
-msgstr "Mostra precisione"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
-msgid "Show Ammo"
-msgstr "Mostra munizioni"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
-msgid "Ammo bar color:"
-msgstr "Colore barra munizioni:"
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
-msgid "Ammo bar alpha:"
-msgstr "Opacità barra munizioni:"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
-msgid "Panel HUD Setup"
-msgstr "Setup del Panel HUD"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
-msgid "Panel background defaults:"
-msgstr "Sfondo del pannello predefinito:"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
-msgid "Disable"
-msgstr "Disabilita"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
-msgid "Color:"
-msgstr "Colore:"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
-msgid "Border size:"
-msgstr "Dimensioni del bordo:"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
-msgid "Team color:"
-msgstr "Colore team:"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
-msgid "Test team color in configure mode"
-msgstr "Prova colore team in modalità configurazione"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
-msgid "Padding:"
-msgstr "Riempimento:"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
-msgid "HUD Dock:"
-msgstr "Sfondo dell'HUD:"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
-msgid "DOCK^Disabled"
-msgstr "DOCK^Disabilitato"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
-msgid "DOCK^Small"
-msgstr "DOCK^Piccolo"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
-msgid "DOCK^Medium"
-msgstr "DOCK^Medio"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
-msgid "DOCK^Large"
-msgstr "DOCK^Largo"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
-msgid "Grid settings:"
-msgstr "Impostazioni griglia:"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99
-msgid "Snap panels to grid"
-msgstr "Incolla i pannelli alla griglia"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102
-msgid "Grid size:"
-msgstr "Dimensioni griglia:"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:103
-msgid "X:"
-msgstr "X:"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:109
-msgid "Y:"
-msgstr "Y:"
-
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:117
-msgid "Exit setup"
-msgstr "Esci dal setup"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer.c:4
-msgid "Multiplayer"
-msgstr "Multiplayer"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer.c:18
-msgid "Servers"
-msgstr "Server"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer.c:19
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
-msgid "Create"
-msgstr "Crea"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer.c:20
-msgid "Demos"
-msgstr "Demo"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer.c:21
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5
-msgid "Player Setup"
-msgstr "Setup giocatore"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
-msgid "Game type:"
-msgstr "Tipo di gioco:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
-msgid "Match settings:"
-msgstr "Impostazioni partita:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
-msgid "Time limit:"
-msgstr "Limite di tempo:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
-msgid "Use map specified default"
-msgstr "Usa le impostazioni di default della mappa"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
-msgid "Point limit:"
-msgstr "Limiti di punteggio:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
-msgid "Player slots:"
-msgstr "Posti per giocatori:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
-msgid "Number of bots:"
-msgstr "Numero di bot:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
-msgid "Bot skill:"
-msgstr "Abilità bot:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
-msgid "Botlike"
-msgstr "\"Come un bot\""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
-msgid "Beginner"
-msgstr "Principiante"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
-msgid "You will win"
-msgstr "Vincerai"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
-msgid "You can win"
-msgstr "Puoi vincere"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
-msgid "You might win"
-msgstr "Potresti vincere"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
-msgid "Advanced"
-msgstr "Avanzato"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
-msgid "Expert"
-msgstr "Esperto"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
-msgid "Pro"
-msgstr "Pro"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
-msgid "Assassin"
-msgstr "Assassino"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
-msgid "Unhuman"
-msgstr "Inumano"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
-msgid "Godlike"
-msgstr "\"Come un Dio\""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
-msgid "Mutators..."
-msgstr "Mutatori..."
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
-msgid "Advanced settings..."
-msgstr "Impostazioni avanzate..."
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
-msgid "Map list:"
-msgstr "Lista delle mappe:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
-msgid "Select all"
-msgstr "Seleziona tutto"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
-msgid "Select none"
-msgstr "Deseleziona tutto"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
-msgid "Start Multiplayer!"
-msgstr "Inizia Multiplayer!"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
-msgid "Capture limit:"
-msgstr "Limite catture:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
-msgid "Lives:"
-msgstr "Vite:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
-msgid "Laps:"
-msgstr "Giri:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
-msgid "Goals:"
-msgstr "Goal:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
-msgid "Frag limit:"
-msgstr "Limiti di frag:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
-msgid "Advanced server settings"
-msgstr "Impostazioni avanzate server"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
-msgid "Game settings:"
-msgstr "Impostazioni gioco:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
-msgid "Allow spectating"
-msgstr "Permetti spettatori"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
-msgid "Spawn shield:"
-msgstr "Protezione nascita:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
-msgid "Game speed:"
-msgstr "Velocità gioco:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
-msgid "Teamplay settings:"
-msgstr "Impostazioni Teamplay:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
-msgid "Friendly fire scale:"
-msgstr "Scala di fuoco amico:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
-msgid "Virtual friendly fire (effect only)"
-msgstr "Penalità virtuale (solo effetto)"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
-msgid "Friendly fire penalty:"
-msgstr "Penalità fuoco amico:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
-msgid "Virtual penalty (effect only)"
-msgstr "Penalità virtuale (solo effetto)"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
-msgid "Teams:"
-msgstr "Team:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
-msgid "Map voting:"
-msgstr "Voto della mappa:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
-msgid "No voting"
-msgstr "Nessun voto"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69
-msgid "2 choices"
-msgstr "2 scelte"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70
-msgid "3 choices"
-msgstr "3 scelte"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71
-msgid "4 choices"
-msgstr "4 scelte"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72
-msgid "5 choices"
-msgstr "5 scelte"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73
-msgid "6 choices"
-msgstr "6 scelte"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74
-msgid "7 choices"
-msgstr "7 scelte"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75
-msgid "8 choices"
-msgstr "8 scelte"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76
-msgid "9 choices"
-msgstr "9 scelte"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79
-msgid "Simple majority wins vcall"
-msgstr "La semplice maggioranza vince il vcall"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
-msgid "Map Information"
-msgstr "Informazioni mappa"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
-msgid "Full item placement"
-msgstr "Posizionamento oggetti completo"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
-msgid "MinstaGib only"
-msgstr "Solo MinstaGib"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
-msgid "Title:"
-msgstr "Titolo:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
-msgid "Author:"
-msgstr "Autore:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
-msgid "Features:"
-msgstr "Caratteristiche:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
-msgid "Game types:"
-msgstr "Tipi di gioco:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
-msgid "Close"
-msgstr "Chiudi"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
-msgstr "Gioca"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
-msgid "Mutators"
-msgstr "Mutatori"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
-msgid "All Weapons Arena"
-msgstr "Arena con tutte le armi"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35
-msgid "Most Weapons Arena"
-msgstr "Arena con la maggior parte delle armi"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56
-#, c-format
-msgid "%s Arena"
-msgstr "Arena con %s"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
-msgid "Dodging"
-msgstr "Dodging"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
-msgid "MinstaGib"
-msgstr "MinstaGib"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
-msgid "NIX"
-msgstr "NIX"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
-msgid "Rocket Flying"
-msgstr "Razzo volante"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
-msgid "No start weapons"
-msgstr "Senza armi all'inizio"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189
-msgid "Low gravity"
-msgstr "Bassa gravità"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
-msgid "Cloaked"
-msgstr "Invisibile"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
-msgid "Hook"
-msgstr "Hook"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
-msgid "Midair"
-msgstr "A mezz'aria"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
-msgid "Vampire"
-msgstr "Vampiro"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
-msgid "Piñata"
-msgstr "Piñata"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
-msgid "Weapons stay"
-msgstr "Armi rimangono"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180
-msgid "Blood loss"
-msgstr "Perdita di sangue"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
-msgid "Jet pack"
-msgstr "Jet pack"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
-msgid "MUT^None"
-msgstr "MUT^Nessuno"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
-msgid "Gameplay mutators:"
-msgstr "Mutatori di gioco:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
-msgid "Weapon & item mutators:"
-msgstr "Mutatori di armi ed oggetti:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
-msgid "Grappling hook"
-msgstr "Grappling hook"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
-msgid "Weapon arenas:"
-msgstr "Arene di armi:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
-msgid "Regular (no arena)"
-msgstr "Regolare (no arena)"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
-msgid "with laser"
-msgstr "con laser"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
-msgid "Special arenas:"
-msgstr "Arene speciali:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
-msgid "Most weapons"
-msgstr "Maggior parte delle armi"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
-msgid "Demo"
-msgstr "Demo"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
-msgid "Record demos while playing"
-msgstr "Registra demo durante le partite"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
-msgid "Filter:"
-msgstr "Filtro:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29
-#: qcsrc/menu/xonotic/dialog_settings_input.c:41
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24
-msgid "Clear"
-msgstr "Pulisci"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
-msgid "Timedemo"
-msgstr "Timedemo"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
-msgid "Join"
-msgstr "Entra"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
-msgid "SRVS^Empty"
-msgstr "SRVS^Vuoti"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
-msgid "SRVS^Full"
-msgstr "SRVS^Pieni"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
-msgid "Pause"
-msgstr "In pausa"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
-msgid "Address:"
-msgstr "Indirizzo:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:67
-msgid "Info..."
-msgstr "Info..."
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:72
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
-msgid "Join!"
-msgstr "Entra!"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
-msgid "Server Information"
-msgstr "Informazioni del server"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
-msgid "N/A"
-msgstr "N/A"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
-#, c-format
-msgid "%d/%d, %d free player slots"
-msgstr "%d/%d, %d slot liberi"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
-#, c-format
-msgid "%d modified settings"
-msgstr "%d impostazioni modificate"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
-msgid "Official settings"
-msgstr "Impostazioni ufficiali"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
-msgid "N/A (can't connect)"
-msgstr "N/A (impossibile connettersi)"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
-msgid "not supported (can't connect)"
-msgstr "non supportato (impossibile connettersi)"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
-msgid "not supported (won't encrypt)"
-msgstr "non supportato (non criptato)"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
-msgid "supported (will encrypt)"
-msgstr "supportato (criptato)"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
-msgid "supported (won't encrypt)"
-msgstr "supportato (non criptato)"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
-msgid "requested (will encrypt)"
-msgstr "richiesto (criptato)"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
-msgid "requested (won't encrypt)"
-msgstr "richiesto (non criptato)"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
-msgid "required (can't connect)"
-msgstr "richiesto (impossibile connettersi)"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
-msgid "required (will encrypt)"
-msgstr "richiesto (criptato)"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
-msgid "Players:"
-msgstr "Giocatori:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
-msgid "Type:"
-msgstr "Tipo:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
-msgid "Map:"
-msgstr "Mappa:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
-msgid "Gameplay:"
-msgstr "Gameplay:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
-msgid "Bots:"
-msgstr "Bot:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279
-msgid "Mod:"
-msgstr "Mod:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
-msgid "Version:"
-msgstr "Versione:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289
-msgid "Ping:"
-msgstr "Ping:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
-msgid "CA:"
-msgstr "CA:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
-msgid "Key:"
-msgstr "Chiave:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
-msgid "Encryption:"
-msgstr "Crittografia:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63
-msgid "Model:"
-msgstr "Modello:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88
-msgid "Field of view:"
-msgstr "Campo di vista:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92
-msgid "View bobbing:"
-msgstr "Ondeggiamento vista:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96
-msgid "Zoom factor:"
-msgstr "Moltiplicatore zoom:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100
-msgid "Zoom speed:"
-msgstr "Velocità zoom:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103
-msgid "Weapon settings..."
-msgstr "Impostazioni arma..."
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:110
-msgid "Crosshair:"
-msgstr "Mirino:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:111
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:139
-msgid "Per weapon"
-msgstr "Per singola arma"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130
-msgid "Crosshair size:"
-msgstr "Dimensioni mirino:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134
-msgid "Crosshair alpha:"
-msgstr "Opacità mirino:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138
-msgid "Crosshair color:"
-msgstr "Colore mirino:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:140
-msgid "By health"
-msgstr "In base alla vita"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143
-msgid "Custom"
-msgstr "Personalizzato"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148
-msgid "Enable center dot"
-msgstr "Abilita puntino al centro"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151
-msgid "Size:"
-msgstr "Dimensioni:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:158
-msgid "Hit test:"
-msgstr "Test colpi:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:159
-msgid "HTST^None"
-msgstr "HTST^Nessuno"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:160
-msgid "TrueAim"
-msgstr "TrueAim"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161
-msgid "Enemies"
-msgstr "Nemici"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:164
-msgid "Waypoints setup..."
-msgstr "Setup dei waypoint..."
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:169
-msgid "Enter HUD editor"
-msgstr "Apri HUD editor"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174
-msgid "Force models:"
-msgstr "Forza modelli:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175
-msgid "MDL^None"
-msgstr "MDL^Nessuno"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176
-msgid "MDL^Custom"
-msgstr "MDL^Personalizzato"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177
-msgid "MDL^All"
-msgstr "MDL^Tutti"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:180
-msgid "Disable gore effects"
-msgstr "Disabilita effetti sangue"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:182
-msgid "Gibs:"
-msgstr "Gib:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184
-msgid "GIBS^None"
-msgstr "GIBS^Nessuno"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:185
-msgid "GIBS^Few"
-msgstr "GIBS^Pochi"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186
-msgid "GIBS^Many"
-msgstr "GIBS^Molti"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:187
-msgid "GIBS^Lots"
-msgstr "GIBS^Parecchi"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:191
-msgid "Damage splash:"
-msgstr "Schizzo del danno:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
-msgid "Apply immediately"
-msgstr "Applica immediatamente"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
-msgid "Waypoints"
-msgstr "Waypoint"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
-msgid "Show base waypoints"
-msgstr "Mostra i waypoint della base"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
-msgid "Waypoint scale:"
-msgstr "Grandezza dei waypoint:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
-msgid "Waypoint alpha:"
-msgstr "Opacità dei waypoint"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
-msgid "Show names:"
-msgstr "Mostra nomi:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
-msgid "Teammates"
-msgstr "Compagni del team"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
-msgid "All players"
-msgstr "Tutti i giocatori"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
-msgid "Weapon settings"
-msgstr "Impostazioni arma"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
-msgid "Weapon priority list:"
-msgstr "Lista priorità armi:"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
-msgid "Up"
-msgstr "Su"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
-msgid "Down"
-msgstr "Giù"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
-msgid "Use priority list for weapon cycling"
-msgstr "Usa la lista di priorità per ciclare le armi"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
-msgid "Auto switch weapons on pickup"
-msgstr "Cambia automaticamente armi dopo raccolta"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
-msgid "Draw 1st person weapon model"
-msgstr "Mostra modello arma in 1ª persona"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Allinea a sinistra"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Allinea a destra"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
-msgid "Flip view horizontally"
-msgstr "Capovolgi la vista orizzontalmente"
-
-#: qcsrc/menu/xonotic/dialog_news.c:4
-msgid "News"
-msgstr "Notizie"
-
-#: qcsrc/menu/xonotic/dialog_news.c:18
-msgid "http://www.xonotic.org/team/blog/"
-msgstr "http://www.xonotic.org/team/blog/"
-
-#: qcsrc/menu/xonotic/dialog_quit.c:4
-msgid "Quit"
-msgstr "Esci"
-
-#: qcsrc/menu/xonotic/dialog_quit.c:17
-msgid "Are you sure you want to quit?"
-msgstr "Sei sicuro di voler uscire?"
-
-#: qcsrc/menu/xonotic/dialog_quit.c:20
-msgid "Yes"
-msgstr "Si"
-
-#: qcsrc/menu/xonotic/dialog_quit.c:21
-msgid "No"
-msgstr "No"
-
-#: qcsrc/menu/xonotic/dialog_settings.c:4
-msgid "Settings"
-msgstr "Impostazioni"
-
-#: qcsrc/menu/xonotic/dialog_settings.c:18
-#: qcsrc/menu/xonotic/dialog_settings_input.c:4
-msgid "Input"
-msgstr "Comandi"
-
-#: qcsrc/menu/xonotic/dialog_settings.c:19
-#: qcsrc/menu/xonotic/dialog_settings_video.c:4
-msgid "Video"
-msgstr "Video"
-
-#: qcsrc/menu/xonotic/dialog_settings.c:20
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:4
-msgid "Effects"
-msgstr "Effetti"
-
-#: qcsrc/menu/xonotic/dialog_settings.c:21
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:4
-msgid "Audio"
-msgstr "Audio"
-
-#: qcsrc/menu/xonotic/dialog_settings.c:22
-#: qcsrc/menu/xonotic/dialog_settings_network.c:4
-msgid "Network"
-msgstr "Rete"
-
-#: qcsrc/menu/xonotic/dialog_settings.c:23
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:4
-msgid "Misc"
-msgstr "Altro"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:27
-msgid "Master:"
-msgstr "Master:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:33
-msgid "Music:"
-msgstr "Musica:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
-msgid "VOL^Ambient:"
-msgstr "VOL^Ambiente:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:48
-msgid "Info:"
-msgstr "Info:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
-msgid "Items:"
-msgstr "Oggetti:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
-msgid "Pain:"
-msgstr "Dolore:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
-msgid "Player:"
-msgstr "Giocatore:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
-msgid "Shots:"
-msgstr "Spari:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
-msgid "Voice:"
-msgstr "Voce:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
-msgid "Weapons:"
-msgstr "Armi:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
-msgid "Frequency:"
-msgstr "Frequenza:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
-msgid "8 kHz"
-msgstr "8 kHz"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
-msgid "11.025 kHz"
-msgstr "11.025 kHz"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
-msgid "16 kHz"
-msgstr "16 kHz"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
-msgid "22.05 kHz"
-msgstr "22.05 kHz"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
-msgid "24 kHz"
-msgstr "24 kHz"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
-msgid "32 kHz"
-msgstr "32 kHz"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
-msgid "44.1 kHz"
-msgstr "44.1 kHz"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
-msgid "48 kHz"
-msgstr "48 kHz"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
-msgid "Channels:"
-msgstr "Canali:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
-msgid "Mono"
-msgstr "Mono"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
-msgid "Stereo"
-msgstr "Stereo"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
-msgid "2.1"
-msgstr "2.1"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
-msgid "4"
-msgstr "4"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
-msgid "5"
-msgstr "5"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
-msgid "5.1"
-msgstr "5.1"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
-msgid "6.1"
-msgstr "6.1"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
-msgid "7.1"
-msgstr "7.1"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
-msgid "Swap Stereo"
-msgstr "Scambia canali stereo"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
-msgid "Headphone friendly mode"
-msgstr "Modalità cuffie"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
-msgid "Spatial voices:"
-msgstr "Voci spaziali:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
-msgid "VOCS^None"
-msgstr "VOCS^Nessuna"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
-msgid "VOCS^Taunts"
-msgstr "VOCS^Insulti"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
-msgid "VOCS^All"
-msgstr "VOCS^Tutte"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
-msgid "Taunt range:"
-msgstr "Range di insulti:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
-msgid "RNG^Very short"
-msgstr "RNG^Molto ristretto"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
-msgid "RNG^Short"
-msgstr "RNG^Ristretto"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
-msgid "RNG^Normal"
-msgstr "RNG^Normale"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
-msgid "RNG^Long"
-msgstr "RNG^Lungo"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
-msgid "RNG^Full"
-msgstr "RNG^Pieno"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
-msgid "Automatic taunts"
-msgstr "Insulti automatici"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
-msgid "Time warning:"
-msgstr "Avvertimento di tempo:"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
-msgid "WRN^None"
-msgstr "WRN^Nessuno"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
-msgid "1 minute"
-msgstr "1 minuto"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
-msgid "5 minutes"
-msgstr "5 minuti"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
-msgid "WRN^Both"
-msgstr "WNR^Entrambi"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
-msgid "Hit indicator"
-msgstr "Indicatore di colpo"
-
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
-msgid "Menu sounds"
-msgstr "Suoni del menu"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:38
-msgid "Quality preset:"
-msgstr "Preset qualità:"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:41
-msgid "PRE^OMG!"
-msgstr "PRE^Oh mio dio!"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:42
-msgid "PRE^Low"
-msgstr "PRE^Bassa"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:43
-msgid "PRE^Medium"
-msgstr "PRE^Media"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:44
-msgid "PRE^Normal"
-msgstr "PRE^Normale"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:45
-msgid "PRE^High"
-msgstr "PRE^Alta"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:46
-msgid "PRE^Ultra"
-msgstr "PRE^Ultra"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:48
-msgid "PRE^Ultimate"
-msgstr "PRE^Massima"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:52
-msgid "Geometry detail:"
-msgstr "Dettagli geometrici:"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:54
-msgid "DET^Lowest"
-msgstr "DET^Molto bassi"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:55
-msgid "DET^Low"
-msgstr "DET^Bassi"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:56
-msgid "DET^Normal"
-msgstr "DET^Normali"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:57
-msgid "DET^Good"
-msgstr "DET^Buoni"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:58
-msgid "DET^Best"
-msgstr "DET^Ottimi"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:59
-msgid "DET^Insane"
-msgstr "DET^Bestiali"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:62
-msgid "Antialiasing:"
-msgstr "Antialiasing:"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:64
-msgid "AA^Disabled"
-msgstr "AA^Disabilitato"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:65
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:103
-msgid "2x"
-msgstr "2x"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:66
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:104
-msgid "4x"
-msgstr "4x"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:70
-msgid "Texture resolution:"
-msgstr "Risoluzione texture:"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:73
-msgid "RES^Leet"
-msgstr "RES^Leet"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:74
-msgid "RES^Lowest"
-msgstr "RES^Molto bassa"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:75
-msgid "RES^Low"
-msgstr "RES^Bassa"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:76
-msgid "RES^Normal"
-msgstr "RES^Normale"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:77
-msgid "RES^Good"
-msgstr "RES^Buona"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:78
-msgid "RES^Best"
-msgstr "RES^Ottima"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:91
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:94
-msgid "Avoid lossy texture compression"
-msgstr "Evita compressione texture con perdita"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:100
-msgid "Anisotropy:"
-msgstr "Anisotropia:"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:102
-msgid "ANISO^Disabled"
-msgstr "ANISO^Disabilitato"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:105
-msgid "8x"
-msgstr "8x"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:106
-msgid "16x"
-msgstr "16x"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:110
-msgid "Particle quality:"
-msgstr "Qualità dei particolari:"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:113
-msgid "Particle distance:"
-msgstr "Distanza dei particolari:"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:117
-msgid "Decals"
-msgstr "Segni"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
-msgid "Distance:"
-msgstr "Distanza:"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
-msgid "Time:"
-msgstr "Tempo:"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
-msgid "Use lightmaps"
-msgstr "Usa lightmaps"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
-msgid "Deluxe mapping"
-msgstr "Mappaggio Deluxe"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
-msgid "Gloss"
-msgstr "Lucentezza"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
-msgid "Offset mapping"
-msgstr "Mappaggio in offset"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
-msgid "Relief mapping"
-msgstr "Mappaggio in rilievo"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
-msgid "Reflections:"
-msgstr "Riflessioni:"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
-msgid "Blurred"
-msgstr "Sfocate"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
-msgid "REFL^Good"
-msgstr "REFL^Buone"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
-msgid "Sharp"
-msgstr "Nitide"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
-msgid "Show surfaces"
-msgstr "Mostra superfici"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
-msgid "No dynamic lighting"
-msgstr "Nessuna illuminazione dinamica"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
-msgid "Flash blend approximation"
-msgstr "Approssimazione Flash blend"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
-msgid "Realtime dynamic lighting"
-msgstr "Illuminazione dinamica in tempo reale"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
-msgid "Shadows"
-msgstr "Ombre"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
-msgid "Realtime world lighting"
-msgstr "Illuminazione globale in tempo reale"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
-msgid "Use normal maps"
-msgstr "Usa mappe normali"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
-msgid "Soft shadows"
-msgstr "Ombre morbide"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
-msgid "Coronas"
-msgstr "Corone"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
-msgid "Use Occlusion Queries"
-msgstr "Usa le Occlusion Queries"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
-msgid "Bloom"
-msgstr "Bloom"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
-msgid "High Dynamic Range (HDR)"
-msgstr "High Dynamic Range (HDR)"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
-msgid "Motion blur:"
-msgstr "Sfocatura da movimento:"
-
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr "Sfocatura da danno:"
-
-#: qcsrc/menu/xonotic/dialog_settings_input.c:26
-msgid "Key bindings:"
-msgstr "Associazione tasti (bind):"
-
-#: qcsrc/menu/xonotic/dialog_settings_input.c:31
-msgid "Change key..."
-msgstr "Cambia tasto..."
-
-#: qcsrc/menu/xonotic/dialog_settings_input.c:35
-msgid "Edit..."
-msgstr "Modifica..."
-
-#: qcsrc/menu/xonotic/dialog_settings_input.c:46
-msgid "Sensitivity:"
-msgstr "Sensibilità:"
-
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
-msgid "UI mouse speed:"
-msgstr "Velocità UI mouse:"
-
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
-msgid "Mouse filter"
-msgstr "Filtro mouse"
-
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
-msgid "Invert mouse"
-msgstr "Inverti mouse"
-
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
-msgid "Use joystick input"
-msgstr "Usa joystick"
-
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
-msgid "Turn off OS mouse acceleration"
-msgstr "Disattiva l'accelerazione mouse dell'OS"
-
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
-msgid "\"enter console\" also closes"
-msgstr "\"apri console\" chiude anche"
-
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
-msgid "User defined key bind"
-msgstr "Tasti \"bind\" definiti dall'utente"
-
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
-msgid "Command when pressed:"
-msgstr "Comando quando premuto:"
-
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45
-msgid "Command when released:"
-msgstr "Comando quando rilasciato:"
-
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48
-msgid "Save"
-msgstr "Salva"
-
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51
-msgid "Cancel"
-msgstr "Annulla"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:26
-msgid "Menu skins:"
-msgstr "Temi del menu:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
-msgid "Show current time"
-msgstr "Mostra orario corrente"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:49
-msgid "Show current date"
-msgstr "Mostra data corrente"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:51
-msgid "Show frames per second"
-msgstr "Mostra fotogrammi al secondo"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Tachimetro"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (nascosto)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "nodi"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Mostra accelerometro"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Scala accelerometro:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
-msgid "Minimize input latency"
-msgstr "Minimizza latenza in entrata"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
-msgid "Advanced settings"
-msgstr "Impostazioni avanzate"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
-msgid "Cvar filter:"
-msgstr "Filtro delle cvar:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
-msgid "Setting:"
-msgstr "Impostazioni:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
-msgid "Value:"
-msgstr "Valore:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
-msgid "Description:"
-msgstr "Descrizione:"
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:26
-msgid "Client-side movement prediction"
-msgstr "Predizione del movimento lato client"
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:30
-msgid "Show netgraph"
-msgstr "Mostra grafico di rete"
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:33
-msgid "Network speed:"
-msgstr "Velocità rete:"
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:35
-msgid "56k"
-msgstr "56k"
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:36
-msgid "ISDN"
-msgstr "ISDN"
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:37
-msgid "Slow ADSL"
-msgstr "ADSL lenta"
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:38
-msgid "Fast ADSL"
-msgstr "ADSL veloce"
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:39
-msgid "Broadband"
-msgstr "Banda larga"
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:42
-msgid "Input packets/s:"
-msgstr "Pacchetti/sec in entrata:"
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:46
-msgid "HTTP downloads:"
-msgstr "Download via HTTP:"
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:49
-msgid "Downloads:"
-msgstr "N° di download:"
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:53
-msgid "Speed (kB/s):"
-msgstr "Velocità (kB/s):"
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:57
-msgid "Client UDP port:"
-msgstr "Porta UDP del client:"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:26
-msgid "Resolution:"
-msgstr "Risoluzione:"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:29
-msgid "Font/UI size:"
-msgstr "Dimensioni caratteri:"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:31
-msgid "SZ^Unreadable"
-msgstr "SZ^Illeggibile"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:32
-msgid "SZ^Tiny"
-msgstr "SZ^Minuscolo"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:33
-msgid "SZ^Little"
-msgstr "SZ^Molto piccolo"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:34
-msgid "SZ^Small"
-msgstr "SZ^Piccolo"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:35
-msgid "SZ^Medium"
-msgstr "SZ^Medio"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:36
-msgid "SZ^Large"
-msgstr "SZ^Largo"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:37
-msgid "SZ^Huge"
-msgstr "SZ^Enorme"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:38
-msgid "SZ^Gigantic"
-msgstr "SZ^Gigante"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:39
-msgid "SZ^Colossal"
-msgstr "SZ^Colossale"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:42
-msgid "Color depth:"
-msgstr "Profondità colore:"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:45
-msgid "Full screen"
-msgstr "Schermo intero"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:46
-msgid "Vertical Synchronization"
-msgstr "Sincronizzazione verticale"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:49
-msgid "Use OpenGL 2.0 shaders (GLSL)"
-msgstr "Usa gli shader OpenGL 2.0 (GLSL)"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:52
-msgid "Use GLSL to handle color control"
-msgstr "Usa GLSL per gestire il controllo del colore"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:56
-msgid "Vertex Buffer Objects (VBOs)"
-msgstr "Vertex Buffer Objects (VBOs)"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:59
-msgid "VBO^Off"
-msgstr "VBO^Off"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:60
-msgid "Vertices, some Tris (compatible)"
-msgstr "Vertici, alcuni Triangoli (compatibile)"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:63
-msgid "Vertices"
-msgstr "Vertici"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:64
-msgid "Vertices and Triangles"
-msgstr "Vertici e Triangoli"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:67
-msgid "Depth first:"
-msgstr "Profondità prima:"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:69
-msgid "DF^Disabled"
-msgstr "DF^Disabilitata"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:70
-msgid "DF^World"
-msgstr "DF^Globale"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:71
-msgid "DF^All"
-msgstr "DF^Tutto"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:75
-msgid "Disable multithreaded OpenGL"
-msgstr "Disabilita il multithreading OpenGL"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:77
-msgid "Wait for GPU to finish each frame"
-msgstr "Attendi che la GPU finisca di elaborare ogni frame"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:80
-msgid "Brightness:"
-msgstr "Luminosità:"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:83
-msgid "Contrast:"
-msgstr "Contrasto:"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:86
-msgid "Gamma:"
-msgstr "Gamma:"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
-msgid "Contrast boost:"
-msgstr "Aumenta contrasto:"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
-msgid "Saturation:"
-msgstr "Saturazione:"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
-msgid "LIT^Ambient:"
-msgstr "LIT^Ambiente:"
-
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
-msgid "Intensity:"
-msgstr "Intensità:"
-
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:4
-msgid "Singleplayer"
-msgstr "Giocatore singolo"
-
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
-msgid "Instant action! (random map with bots)"
-msgstr "Inizia ora! (mappa casuale con bot)"
-
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
-msgid "Start Singleplayer!"
-msgstr "Inizia modalità Giocatore Singolo!"
-
-#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
-msgid "Winner"
-msgstr "Vincitore"
-
-#: qcsrc/menu/xonotic/dialog_teamselect.c:5
-msgid "Team Selection"
-msgstr "Selezione team"
-
-#: qcsrc/menu/xonotic/dialog_teamselect.c:41
-msgid "join 'best' team (auto-select)"
-msgstr "entra nel 'miglior' team (auto-selezione)"
-
-#: qcsrc/menu/xonotic/dialog_teamselect.c:45
-msgid "red"
-msgstr "rosso"
-
-#: qcsrc/menu/xonotic/dialog_teamselect.c:46
-msgid "blue"
-msgstr "blu"
-
-#: qcsrc/menu/xonotic/dialog_teamselect.c:47
-msgid "yellow"
-msgstr "giallo"
-
-#: qcsrc/menu/xonotic/dialog_teamselect.c:48
-msgid "pink"
-msgstr "rosa"
-
-#: qcsrc/menu/xonotic/dialog_teamselect.c:51
-msgid "spectate"
-msgstr "spettatore"
-
-#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
-msgid "Do not press this button again!"
-msgstr "Non premere questo tasto di nuovo!"
-
-#: qcsrc/menu/xonotic/maplist.c:278
-msgid ""
-"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
-msgstr ""
-"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
-
-#: qcsrc/menu/xonotic/maplist.c:286
-#, c-format
-msgid "%s's Xonotic Server"
-msgstr "Server Xonotic di %s"
-
-#: qcsrc/menu/xonotic/maplist.c:291
-msgid ""
-"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
-"again.\n"
-msgstr ""
-"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
-"again.\n"
-
-#: qcsrc/menu/xonotic/playermodel.c:174
-msgid "<no model found>"
-msgstr "<nessun modello trovato>"
-
-#: qcsrc/menu/xonotic/serverlist.c:185
-msgid "Remove"
-msgstr "Rimuovi"
-
-#: qcsrc/menu/xonotic/serverlist.c:187
-msgid "Bookmark"
-msgstr "Aggiungi tra i preferiti"
-
-#: qcsrc/menu/xonotic/serverlist.c:523
-msgid "Ping"
-msgstr "Ping"
-
-#: qcsrc/menu/xonotic/serverlist.c:524
-msgid "Host name"
-msgstr "Nome dell'host"
-
-#: qcsrc/menu/xonotic/serverlist.c:525
-msgid "Map"
-msgstr "Mappa"
-
-#: qcsrc/menu/xonotic/serverlist.c:526
-msgid "Type"
-msgstr "Tipo"
-
-#: qcsrc/menu/xonotic/serverlist.c:527
-msgid "Players"
-msgstr "Giocatori"
-
-#: qcsrc/menu/xonotic/skinlist.c:105
-msgid "<TITLE>"
-msgstr "<TITOLO>"
-
-#: qcsrc/menu/xonotic/skinlist.c:106
-msgid "<AUTHOR>"
-msgstr "<AUTORE>"
-
-#: qcsrc/menu/xonotic/skinlist.c:163
-#, c-format
-msgid "%s: %s"
-msgstr "%s: %s"
-
-#: qcsrc/menu/xonotic/slider_decibels.c:50
-msgid "VOL^OFF"
-msgstr "VOL^OFF"
-
-#: qcsrc/menu/xonotic/slider_decibels.c:52
-msgid "VOL^MAX"
-msgstr "VOL^MAX"
-
-#: qcsrc/menu/xonotic/slider_decibels.c:53
-#, c-format
-msgid "%s dB"
-msgstr "%s dB"
-
-#: qcsrc/menu/xonotic/slider_resolution.c:65
-#, c-format
-msgid "%dx%d"
-msgstr "%dx%d"
-
-#: qcsrc/menu/xonotic/util.qc:270
-#, c-format
-msgid "Received HTTP request data for an invalid id %d.\n"
-msgstr "Ricevuta richiesta HTTP per un invalido id %d.\n"
-
-#: qcsrc/menu/xonotic/util.qc:285
-#, c-format
-msgid "error receiving update notification: status is %d\n"
-msgstr ""
-"errore durante la notifica d'aggiornamento: lo stato è impostato su %d\n"
-
-#: qcsrc/menu/xonotic/util.qc:290
-msgid "error: received HTML instead of an update notification\n"
-msgstr "errore: ricevuto HTML invece di una notifica d'aggiornamento\n"
-
-#: qcsrc/menu/xonotic/util.qc:295
-msgid "error: received carriage returns from update notification server\n"
-msgstr "error: received carriage returns from update notification server\n"
-
-#: qcsrc/menu/xonotic/util.qc:316
-#, c-format
-msgid ""
-"Update can be downloaded at:\n"
-"%s\n"
-msgstr ""
-"L'aggiornamento può essere scaricato da:\n"
-"%s\n"
-
-#: qcsrc/menu/xonotic/util.qc:337
-msgid "Autogenerating mapinfo for newly added maps..."
-msgstr "Autogenerando le mapinfo per le nuove mappe..."
-
-#: qcsrc/menu/xonotic/util.qc:367
-#, c-format
-msgid "^1%s TEST BUILD"
-msgstr "^1%s TEST BUILD"
-
-#: qcsrc/menu/xonotic/util.qc:432
-#, c-format
-msgid "Update to %s now!"
-msgstr "Aggiorna a %s ora!"
-
-#: qcsrc/menu/xonotic/util.qc:509
-msgid ""
-"^1ERROR: Texture compression is required but not supported.\n"
-"^1Expect visual problems.\n"
-msgstr ""
-"^1ERRORE: La compressione texture è richiesta ma non supportata.\n"
-"^1Previsti problemi visuali.\n"
-
-#: qcsrc/menu/xonotic/util.qc:531
-msgid "Arena"
-msgstr "Arena"
-
-#: qcsrc/menu/xonotic/util.qc:532
-msgid "Assault"
-msgstr "Assalto"
-
-#: qcsrc/menu/xonotic/util.qc:533
-msgid "Capture The Flag"
-msgstr "Capture The Flag"
-
-#: qcsrc/menu/xonotic/util.qc:534
-msgid "Clan Arena"
-msgstr "Clan Arena"
-
-#: qcsrc/menu/xonotic/util.qc:535
-msgid "Deathmatch"
-msgstr "Deathmatch"
-
-#: qcsrc/menu/xonotic/util.qc:536
-msgid "Domination"
-msgstr "Dominazione"
-
-#: qcsrc/menu/xonotic/util.qc:537
-msgid "Freeze Tag"
-msgstr "Freeze Tag"
-
-#: qcsrc/menu/xonotic/util.qc:538
-msgid "Keepaway"
-msgstr "Keepaway"
-
-#: qcsrc/menu/xonotic/util.qc:539
-msgid "Key Hunt"
-msgstr "Key Hunt"
-
-#: qcsrc/menu/xonotic/util.qc:540
-msgid "Last Man Standing"
-msgstr "Last Man Standing"
-
-#: qcsrc/menu/xonotic/util.qc:541
-msgid "Nexball"
-msgstr "Nexball"
-
-#: qcsrc/menu/xonotic/util.qc:542
-msgid "Onslaught"
-msgstr "Onslaught"
-
-#: qcsrc/menu/xonotic/util.qc:543
-msgid "Race"
-msgstr "Corsa"
-
-#: qcsrc/menu/xonotic/util.qc:544
-msgid "Race CTS"
-msgstr "Corsa CTS"
-
-#: qcsrc/menu/xonotic/util.qc:545
-msgid "Runematch"
-msgstr "Runematch"
-
-#: qcsrc/menu/xonotic/util.qc:546
-msgid "Team Deathmatch"
-msgstr "Team Deathmatch"
-
-#: qcsrc/menu/xonotic/util.qc:565
-#, c-format
-msgid "@!#%'n Tuba Throwing"
-msgstr "@!#%'n Tuba Throwing"
-
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Sfondo:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
-msgid "Default"
-msgstr "Predefinito"
-
-#: qcsrc/menu/xonotic/util.qc:596
-msgid "Use default"
-msgstr "Usa predefinito"
-
-#: qcsrc/menu/xonotic/util.qc:616
-msgid "Team Color:"
-msgstr "Colore Team:"
-
-#: qcsrc/menu/xonotic/util.qh:49
-msgid "Enable panel"
-msgstr "Abilita pannello"
-
-#: qcsrc/server/w_crylink.qc:2
-msgid "Crylink"
-msgstr "Crylink"
-
-#: qcsrc/server/w_crylink.qc:664
-#, c-format
-msgid "%s succeeded at self-destructing themself with the Crylink"
-msgstr "%s è riuscito ad autodistrugersi col Crylink"
-
-#: qcsrc/server/w_crylink.qc:669
-#, c-format
-msgid "%s could not hide from %s's Crylink"
-msgstr "%s non s'è potuto nascondere dal Crylink di %s"
-
-#: qcsrc/server/w_crylink.qc:671
-#, c-format
-msgid "%s was too close to %s's Crylink"
-msgstr "%s era troppo vicino al Crylink di %s"
-
-#: qcsrc/server/w_crylink.qc:673
-#, c-format
-msgid "%s took a close look at %s's Crylink"
-msgstr "%s ha visto da vicino il Crylink di %s"
-
-#: qcsrc/server/w_electro.qc:2
-msgid "Electro"
-msgstr "Electro"
-
-#: qcsrc/server/w_electro.qc:571
-#, c-format
-msgid "%s could not remember where they put plasma"
-msgstr "%s non s'è ricordato dove aveva messo il plasma"
-
-#: qcsrc/server/w_electro.qc:573
-#, c-format
-msgid "%s played with plasma"
-msgstr "%s ha giocato col plasma"
-
-#: qcsrc/server/w_electro.qc:580
-#, c-format
-msgid "%s just noticed %s's blue ball"
-msgstr "%s ha appena notato la palla blu di %s"
-
-#: qcsrc/server/w_electro.qc:582
-#, c-format
-msgid "%s got in touch with %s's blue ball"
-msgstr "%s è entrato in contatto con la palla blu di %s"
-
-#: qcsrc/server/w_electro.qc:587
-#, c-format
-msgid "%s felt the electrifying air of %s's combo"
-msgstr "%s ha sentito l'aria elettrificata della combo di %s"
-
-#: qcsrc/server/w_electro.qc:589
-#, c-format
-msgid "%s got too close to %s's blue beam"
-msgstr "%s s'è avvicinato troppo al raggio blu di %s"
-
-#: qcsrc/server/w_electro.qc:591
-#, c-format
-msgid "%s was blasted by %s's blue beam"
-msgstr "%s è stato fatto saltare in aria dal raggio blu di %s"
-
-#: qcsrc/server/w_fireball.qc:2
-msgid "Fireball"
-msgstr "Fireball"
-
-#: qcsrc/server/w_fireball.qc:417
-#, c-format
-msgid "%s forgot about some firemine"
-msgstr "%s s'è dimenticato di alcune mine infuocate"
-
-#: qcsrc/server/w_fireball.qc:419 qcsrc/server/w_hlac.qc:240
-#, c-format
-msgid "%s should have used a smaller gun"
-msgstr "%s avrebbe dovuto usare un'arma più piccola"
-
-#: qcsrc/server/w_fireball.qc:426
-#, c-format
-msgid "%s tried to catch %s's firemine"
-msgstr "%s ha provato a catturare la mina infuocata di %s"
-
-#: qcsrc/server/w_fireball.qc:428
-#, c-format
-msgid "%s fatefully ignored %s's firemine"
-msgstr "%s ha fatalmente ignorato la mina infuocata di %s"
-
-#: qcsrc/server/w_fireball.qc:435
-#, c-format
-msgid "%s could not hide from %s's fireball"
-msgstr "%s non è riuscito a nascondersi dalla fireball di %s"
-
-#: qcsrc/server/w_fireball.qc:437
-#, c-format
-msgid "%s saw the pretty lights of %s's fireball"
-msgstr "%s ha visto le belle luci della fireball di %s"
-
-#: qcsrc/server/w_fireball.qc:440
-#, c-format
-msgid "%s got too close to %s's fireball"
-msgstr "%s s'è avvicinato troppo alla fireball di %s"
-
-#: qcsrc/server/w_fireball.qc:442
-#, c-format
-msgid "%s tasted %s's fireball"
-msgstr "%s ha assaggiato la fireball di %s"
-
-#: qcsrc/server/w_grenadelauncher.qc:2
-msgid "Mortar"
-msgstr "Mortar"
-
-#: qcsrc/server/w_grenadelauncher.qc:378
-#, c-format
-msgid "%s tried out his own grenade"
-msgstr "%s ha provato da solo la propria granata"
-
-#: qcsrc/server/w_grenadelauncher.qc:380
-#, c-format
-msgid "%s detonated"
-msgstr "%s è detonato"
-
-#: qcsrc/server/w_grenadelauncher.qc:386
-#, c-format
-msgid "%s didn't see %s's grenade"
-msgstr "%s non ha visto la granata di %s"
-
-#: qcsrc/server/w_grenadelauncher.qc:388
-#, c-format
-msgid "%s almost dodged %s's grenade"
-msgstr "%s ha quasi schivato la granata di %s"
-
-#: qcsrc/server/w_grenadelauncher.qc:390
-#, c-format
-msgid "%s ate %s's grenade"
-msgstr "%s ha mangiato la granata di %s"
-
-#: qcsrc/server/w_hagar.qc:2
-msgid "Hagar"
-msgstr "Hagar"
-
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
-#, c-format
-msgid "%s played with tiny rockets"
-msgstr "%s ha giocato con piccoli razzi"
-
-#: qcsrc/server/w_hagar.qc:213
-#, c-format
-msgid "%s hoped %s's missiles wouldn't bounce"
-msgstr "%s ha sperato che il missile di %s non rimbalzasse"
-
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
-#, c-format
-msgid "%s was pummeled by %s"
-msgstr "%s è stato preso a pugni da %s"
-
-#: qcsrc/server/w_hlac.qc:2
-msgid "Heavy Laser Assault Cannon"
-msgstr "Heavy Laser Assault Cannon"
-
-#: qcsrc/server/w_hlac.qc:242
-#, c-format
-msgid "%s was cut down by %s"
-msgstr "%s è stato abbattuto da %s"
-
-#: qcsrc/server/w_hook.qc:2
-msgid "Grappling Hook"
-msgstr "Grappling Hook"
-
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
-#, c-format
-msgid "%s did the impossible"
-msgstr "%s ha fatto l'impossibile"
-
-#: qcsrc/server/w_hook.qc:268
-#, c-format
-msgid "%s has run into %s's gravity bomb"
-msgstr "%s è corso nella bomba di gravità di %s"
-
-#: qcsrc/server/w_laser.qc:2
-msgid "Laser"
-msgstr "Laser"
-
-#: qcsrc/server/w_laser.qc:305
-#, c-format
-msgid "%s lasered themself to hell"
-msgstr "%s si è \"laserato\" all'inferno"
-
-#: qcsrc/server/w_laser.qc:309
-#, c-format
-msgid "%s was cut in half by %s's gauntlet"
-msgstr "%s è stato tagliato a metà dal guanto di %s"
-
-#: qcsrc/server/w_laser.qc:311
-#, c-format
-msgid "%s was lasered to death by %s"
-msgstr "%s è stato \"laserato\" alla morte da %s"
-
-#: qcsrc/server/w_minelayer.qc:2
-msgid "Mine Layer"
-msgstr "Mine Layer"
-
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
-#, c-format
-msgid "%s exploded"
-msgstr "%s è esploso"
-
-#: qcsrc/server/w_minelayer.qc:499
-#, c-format
-msgid "%s got too close to %s's mine"
-msgstr "%s s'è avvicinato troppo alla mina di %s"
-
-#: qcsrc/server/w_minelayer.qc:501
-#, c-format
-msgid "%s almost dodged %s's mine"
-msgstr "%s ha quasi schivato la mina di %s"
-
-#: qcsrc/server/w_minelayer.qc:503
-#, c-format
-msgid "%s stepped on %s's mine"
-msgstr "%s è passato sopra la mina di %s"
-
-#: qcsrc/server/w_minstanex.qc:2
-msgid "MinstaNex"
-msgstr "MinstaNex"
-
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
-#, c-format
-msgid "%s has been vaporized by %s"
-msgstr "%s è stato vaporizzato da %s"
-
-#: qcsrc/server/w_nex.qc:2
-msgid "Nex"
-msgstr "Nex"
-
-#: qcsrc/server/w_porto.qc:2
-msgid "Port-O-Launch"
-msgstr "Port-O-Launch"
-
-#: qcsrc/server/w_porto.qc:298
-#, c-format
-msgid "%s felt %s doing the impossible to him"
-msgstr "%s ha sentito %s fargli l'impossibile"
-
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
-msgstr "Rocket Launcher"
-
-#: qcsrc/server/w_rocketlauncher.qc:504
-#, c-format
-msgid "%s got too close to %s's rocket"
-msgstr "%s s'è avvicinato troppo al razzo di %s"
-
-#: qcsrc/server/w_rocketlauncher.qc:506
-#, c-format
-msgid "%s almost dodged %s's rocket"
-msgstr "%s ha quasi schivato il razzo di %s"
-
-#: qcsrc/server/w_rocketlauncher.qc:508
-#, c-format
-msgid "%s ate %s's rocket"
-msgstr "%s ha mangiato il razzo di %s"
-
-#: qcsrc/server/w_seeker.qc:2
-msgid "T.A.G. Seeker"
-msgstr "T.A.G. Seeker"
-
-#: qcsrc/server/w_seeker.qc:659
-#, c-format
-msgid "%s was tagged by %s"
-msgstr "%s è stato contrassegnato da %s"
-
-#: qcsrc/server/w_shotgun.qc:2
-msgid "Shotgun"
-msgstr "Shotgun"
-
-#: qcsrc/server/w_shotgun.qc:207
-#, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
-msgstr "%2$s ^7ha schiaffeggiato %1$s ^7un pò con un grosso ^2shotgun"
-
-#: qcsrc/server/w_shotgun.qc:209
-#, c-format
-msgid "%s was gunned by %s"
-msgstr "%s è stato sparato da %s"
-
-#: qcsrc/server/w_sniperrifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_sniperrifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s si è sparato da solo automaticamente"
-
-#: qcsrc/server/w_sniperrifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s si è fucilato da solo in qualche modo"
-
-#: qcsrc/server/w_sniperrifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s non è riuscito a nascondersi dalla raffica di proiettili di %s"
-
-#: qcsrc/server/w_sniperrifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s è morto nella raffica di proiettili di %s"
-
-#: qcsrc/server/w_sniperrifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s non è riuscito a nascondersi dal fucile di %s"
-
-#: qcsrc/server/w_sniperrifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s ha preso un colpo in testa da %s"
-
-#: qcsrc/server/w_sniperrifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "%s è stato fucilato da %s"
-
-#: qcsrc/server/w_tuba.qc:2
-#, c-format
-msgid "@!#%'n Tuba"
-msgstr "@!#%'n Tuba"
-
-#: qcsrc/server/w_tuba.qc:263
-#, c-format
-msgid "%s hurt his own ears with the @!#%%'n Tuba"
-msgstr "%s s'è fatto male alle orecchie con la @!#%%'n Tuba"
-
-#: qcsrc/server/w_tuba.qc:267
-#, c-format
-msgid "%s died of %s's great playing on the @!#%%'n Tuba"
-msgstr "%s è morto nella gran esibizione di %s con la @!#%%'n Tuba"
-
-#: qcsrc/server/w_uzi.qc:2
-msgid "Machine Gun"
-msgstr "Machine Gun"
-
-#: qcsrc/server/w_uzi.qc:323
-#, c-format
-msgid "%s was riddled full of holes by %s"
-msgstr "%s è stato riempito di buchi da %s"
-
-#~ msgid "%d/%d"
-#~ msgstr "%d/%d"
-
-#~ msgid ""
-#~ "Please answer a few initial questions to enhance the game experience."
-#~ msgstr ""
-#~ "Per favore rispondi a poche domande iniziali per migliorare l'esperienza "
-#~ "di gioco."
-
-#~ msgid "Waypoint settings:"
-#~ msgstr "Impostazioni dei waypoint"
+# Xonotic Menu\r
+# Copyright (C) 2011 Team Xonotic\r
+# This file is distributed under the same license as the PACKAGE package.\r
+# Felice Sallustio <fel.sallustio@gmail.com>, 2011.\r
+# Antonio 'terencehill' Piu <piuntn@gmail.com>, 2011.\r
+#\r
+msgid ""\r
+msgstr ""\r
+"Project-Id-Version: 0.1preview\n"\r
+"Report-Msgid-Bugs-To: \n"\r
+"POT-Creation-Date: 2011-08-19 16:25+0200\n"\r
+"PO-Revision-Date: 2011-08-19 17:20+0100\n"\r
+"Last-Translator: Antonio 'terencehill' Piu <piuntn@gmail.com>\n"\r
+"Language-Team: Antonio 'terencehill' Piu <piuntn@gmail.com>\n"\r
+"MIME-Version: 1.0\n"\r
+"Content-Type: text/plain; charset=UTF-8\n"\r
+"Content-Transfer-Encoding: 8bit\n"\r
+"Language: it\n"\r
+"X-Poedit-Language: Italian\n"\r
+\r
+#: qcsrc/menu/gamecommand.qc:47\r
+#, c-format\r
+msgid "error: status is %d\n"\r
+msgstr "errore: lo stato è impostato su %d\n"\r
+\r
+#: qcsrc/menu/gamecommand.qc:65\r
+msgid "Usage: menu_cmd command..., where possible commands are:\n"\r
+msgstr "Uso: menu_cmd comando..., dove i possibili comandi sono:\n"\r
+\r
+#: qcsrc/menu/gamecommand.qc:66\r
+msgid "  sync - reloads all cvars on the current menu page\n"\r
+msgstr "  sync - ricarica tutte le cvar sulla corrente pagina\n"\r
+\r
+#: qcsrc/menu/gamecommand.qc:67\r
+msgid "  directmenu ITEM - select a menu item as main item\n"\r
+msgstr "  directmenu OGGETTO - seleziona un oggetto come il principale\n"\r
+\r
+#: qcsrc/menu/gamecommand.qc:193\r
+msgid "error creating curl handle\n"\r
+msgstr "error creating curl handle\n"\r
+\r
+#: qcsrc/menu/gamecommand.qc:239\r
+msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"\r
+msgstr ""\r
+"Comando non valido. Per una lista dei comandi supportati, prova menu_cmd "\r
+"help.\n"\r
+\r
+#: qcsrc/menu/item/gecko.c:49\r
+msgid "Browser not initialized!"\r
+msgstr "Browser non inizializzato!"\r
+\r
+#: qcsrc/menu/item/label.c:63\r
+#, c-format\r
+msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"\r
+msgstr ""\r
+"NOTA: testo dell'etichetta %s troppo grande per l'etichetta, compresso di un "\r
+"fattore %f\n"\r
+\r
+#: qcsrc/menu/item/listbox.c:300\r
+#, c-format\r
+msgid "Item %d"\r
+msgstr "Oggetto %d"\r
+\r
+#: qcsrc/menu/item/slider.c:64\r
+#, c-format\r
+msgid "%d (%s)"\r
+msgstr "%d (%s)"\r
+\r
+#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31\r
+msgid "custom"\r
+msgstr "personalizzato"\r
+\r
+#: qcsrc/menu/menu.qc:29\r
+#, c-format\r
+msgid "^4MQC Build information: ^1%s\n"\r
+msgstr "^4MQC Build information: ^1%s\n"\r
+\r
+#: qcsrc/menu/xonotic/campaign.c:284\r
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:66\r
+msgid "???"\r
+msgstr "???"\r
+\r
+#: qcsrc/menu/xonotic/campaign.c:285\r
+#, c-format\r
+msgid "Level %d: %s"\r
+msgstr "Livello %d: %s"\r
+\r
+#: qcsrc/menu/xonotic/cvarlist.c:85\r
+msgid "will be saved to config.cfg"\r
+msgstr "sarà salvato su config.cfg"\r
+\r
+#: qcsrc/menu/xonotic/cvarlist.c:87\r
+msgid "will not be saved"\r
+msgstr "non sarà salvato"\r
+\r
+#: qcsrc/menu/xonotic/cvarlist.c:89\r
+msgid "private"\r
+msgstr "privata"\r
+\r
+#: qcsrc/menu/xonotic/cvarlist.c:91\r
+msgid "engine setting"\r
+msgstr "impostazioni motore"\r
+\r
+#: qcsrc/menu/xonotic/cvarlist.c:93\r
+msgid "read only"\r
+msgstr "sola lettura"\r
+\r
+#: qcsrc/menu/xonotic/dialog_credits.c:5\r
+msgid "Credits"\r
+msgstr "Crediti"\r
+\r
+#: qcsrc/menu/xonotic/dialog_credits.c:21\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57\r
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61\r
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21\r
+msgid "OK"\r
+msgstr "OK"\r
+\r
+#: qcsrc/menu/xonotic/dialog_firstrun.c:4\r
+msgid "Welcome"\r
+msgstr "Benvenuto"\r
+\r
+#: qcsrc/menu/xonotic/dialog_firstrun.c:33\r
+msgid ""\r
+"Welcome to Xonotic, please select your language preference and enter your "\r
+"player name to get started.  You can change these options later through the "\r
+"menu system."\r
+msgstr ""\r
+"Benvenuto in Xonotic, per favore selezione la tua lingua e inserisci il tuo "\r
+"nome come giocatore per iniziare.  Puoi cambiare queste opzioni più tardi "\r
+"tramite il menu."\r
+\r
+#: qcsrc/menu/xonotic/dialog_firstrun.c:38\r
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:35\r
+msgid "Text language:"\r
+msgstr "Lingua testo:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_firstrun.c:47\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40\r
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39\r
+msgid "Name:"\r
+msgstr "Nome:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_firstrun.c:69\r
+msgid "Save settings"\r
+msgstr "Salva impostazioni"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4\r
+msgid "Ammo Panel"\r
+msgstr "Pannello munizioni"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22\r
+msgid "Ammunition display:"\r
+msgstr "Mostra munizioni:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25\r
+msgid "Show only current ammo type"\r
+msgstr "Mostra solo il tipo corrente di munizioni"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28\r
+msgid "Align icon:"\r
+msgstr "Allinea icone:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40\r
+msgid "Left"\r
+msgstr "Sinistra"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41\r
+msgid "Right"\r
+msgstr "Destra"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4\r
+msgid "Centerprint"\r
+msgstr "Centerprint"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23\r
+msgid "Message duration:"\r
+msgstr "Durata messaggi:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27\r
+msgid "Fade time:"\r
+msgstr "Durata dissolvenza:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31\r
+msgid "Flip messages order"\r
+msgstr "Inverti ordine messaggi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33\r
+msgid "Text alignment:"\r
+msgstr "Allineamento testo:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50\r
+msgid "Center"\r
+msgstr "Centro"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41\r
+msgid "Font scale:"\r
+msgstr "Scala testo:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4\r
+msgid "Chat Panel"\r
+msgstr "Pannello Chat"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22\r
+msgid "Chat entries:"\r
+msgstr "N° righe della chat:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25\r
+msgid "Chat size:"\r
+msgstr "Dimensioni chat:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29\r
+msgid "Chat lifetime:"\r
+msgstr "Durata chat:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33\r
+msgid "Chat beep sound"\r
+msgstr "Suono della chat"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4\r
+msgid "Engine Info Panel"\r
+msgstr "Pannello info motore"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22\r
+msgid "Engine info:"\r
+msgstr "Info motore:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25\r
+msgid "Use an averaging algorithm for fps"\r
+msgstr "Usa un algoritmo mediano per gli fps"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4\r
+msgid "Health/Armor Panel"\r
+msgstr "Pannello vita/armatura"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22\r
+msgid "Enable status bar"\r
+msgstr "Abilita barra di stato"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24\r
+msgid "Status bar alignment:"\r
+msgstr "Allineamento barra di stato:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42\r
+msgid "Inward"\r
+msgstr "Interno"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43\r
+msgid "Outward"\r
+msgstr "Esterno"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37\r
+msgid "Icon alignment:"\r
+msgstr "Allineamento icone:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45\r
+msgid "Flip health and armor positions"\r
+msgstr "Inverti posizioni di vita e armatura"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4\r
+msgid "Info Messages Panel"\r
+msgstr "Pannello delle informazioni"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22\r
+msgid "Info messages:"\r
+msgstr "Informazioni"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25\r
+msgid "Flip align"\r
+msgstr "Inverti allineamento"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4\r
+msgid "Mod Icons Panel"\r
+msgstr "Pannello delle icone delle Mod"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4\r
+msgid "Notification Panel"\r
+msgstr "Pannello di notifica"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22\r
+msgid "Notifications:"\r
+msgstr "Notifiche:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25\r
+msgid "Also print notifications to the console"\r
+msgstr "Mostra anche le notifiche sulla console"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28\r
+msgid "Flip notify order"\r
+msgstr "Inverti ordine notifiche"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31\r
+msgid "Entry lifetime:"\r
+msgstr "Durata notifica:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35\r
+msgid "Entry fadetime:"\r
+msgstr "Durata dissolvenza:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4\r
+msgid "Physics Panel"\r
+msgstr "Pannello Fisica"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21\r
+msgid "Panel disabled"\r
+msgstr "Pannello disabilitato"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23\r
+msgid "Panel enabled"\r
+msgstr "Pannello abilitato"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24\r
+msgid "Panel enabled even observing"\r
+msgstr "Pannello abilitato anche osservando"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25\r
+msgid "Panel enabled only in Race/CTS"\r
+msgstr "Pannello abilitato solo in Corsa/CTS"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31\r
+msgid "Status bar"\r
+msgstr "Barra di stato"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48\r
+msgid "Left align"\r
+msgstr "Allinea a sinistra"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52\r
+msgid "Right align"\r
+msgstr "Allinea a destra"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35\r
+msgid "Inward align"\r
+msgstr "Allinea all'interno"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36\r
+msgid "Outward align"\r
+msgstr "Allinea all'esterno"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40\r
+msgid "Flip speed/acceleration positions"\r
+msgstr "Inverti posizioni velocità/accelerazione"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44\r
+msgid "Speed:"\r
+msgstr "Velocità:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45\r
+msgid "Include vertical speed"\r
+msgstr "Includi velocità verticale"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56\r
+msgid "Speed unit:"\r
+msgstr "Unità di velocità:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58\r
+msgid "qu/s"\r
+msgstr "qu/s"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59\r
+msgid "m/s"\r
+msgstr "m/s"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60\r
+msgid "km/h"\r
+msgstr "km/h"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61\r
+msgid "mph"\r
+msgstr "mph"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62\r
+msgid "knots"\r
+msgstr "nodi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64\r
+msgid "Show"\r
+msgstr "Mostra"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67\r
+msgid "Top speed"\r
+msgstr "Velocità massima"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73\r
+msgid "Acceleration:"\r
+msgstr "Accelerazione:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74\r
+msgid "Include vertical acceleration"\r
+msgstr "Includi accelerazione verticale"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4\r
+msgid "Powerups Panel"\r
+msgstr "Pannello dei Powerup"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45\r
+msgid "Flip strength and shield positions"\r
+msgstr "Inverti posizioni di forza e scudo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4\r
+msgid "Pressed Keys Panel"\r
+msgstr "Pannello dei tasto premuti"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22\r
+msgid "Panel enabled when spectating"\r
+msgstr "Pannello abilitato quando spettatore"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23\r
+msgid "Panel always enabled"\r
+msgstr "Pannello sempre abilitato"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30\r
+msgid "Forced aspect:"\r
+msgstr "Forza aspetto:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4\r
+msgid "Race Timer Panel"\r
+msgstr "Pannello tempi Corsa"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:4\r
+msgid "Radar Panel"\r
+msgstr "Pannello Radar"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:22\r
+msgid "Panel enabled in teamgames"\r
+msgstr "Pannello abilitato nei teamgames"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:29\r
+msgid "Radar:"\r
+msgstr "Radar:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154\r
+#: qcsrc/menu/xonotic/util.qc:600\r
+msgid "Alpha:"\r
+msgstr "Opacità:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:36\r
+msgid "Rotation:"\r
+msgstr "Rotazione:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:38\r
+msgid "Forward"\r
+msgstr "Avanti"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:39\r
+msgid "West"\r
+msgstr "Ovest"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:40\r
+msgid "South"\r
+msgstr "Sud"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:41\r
+msgid "East"\r
+msgstr "Est"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:42\r
+msgid "North"\r
+msgstr "Nord"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:46\r
+msgid "Scale:"\r
+msgstr "Scala:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:50\r
+msgid "Zoom mode:"\r
+msgstr "Modalità zoom:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:52\r
+msgid "Zoomed in"\r
+msgstr "Ingrandito"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:53\r
+msgid "Zoomed out"\r
+msgstr "Non ingrandito"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:54\r
+msgid "Always zoomed"\r
+msgstr "Sempre ingrandito"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:55\r
+msgid "Never zoomed"\r
+msgstr "Mai ingrandito"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4\r
+msgid "Score Panel"\r
+msgstr "Pannello punteggio"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22\r
+msgid "Score:"\r
+msgstr "Punteggi:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25\r
+msgid "Rankings:"\r
+msgstr "Classifica:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26\r
+msgid "Off"\r
+msgstr "Off"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27\r
+msgid "And me"\r
+msgstr "E me"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28\r
+msgid "Pure"\r
+msgstr "Puro"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4\r
+msgid "Timer Panel"\r
+msgstr "Pannello tempo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22\r
+msgid "Timer:"\r
+msgstr "Tempo:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25\r
+msgid "Show elapsed time"\r
+msgstr "Mostra tempo trascorso"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4\r
+msgid "Vote Panel"\r
+msgstr "Pannello di voto"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22\r
+msgid "Alpha after voting:"\r
+msgstr "Opacità dopo aver votato:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4\r
+msgid "Weapons Panel"\r
+msgstr "Pannello armi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24\r
+msgid "Fade out after:"\r
+msgstr "Dissolvi dopo:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36\r
+msgid "Never"\r
+msgstr "Mai"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28\r
+#, c-format\r
+msgid "%ds"\r
+msgstr "%ds"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32\r
+msgid "Fade effect:"\r
+msgstr "Effetto dissolvenza:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35\r
+msgid "EF^None"\r
+msgstr "EF^Nessuno"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36\r
+msgid "Slide"\r
+msgstr "Slide"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37\r
+msgid "Alpha"\r
+msgstr "Opacità"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38\r
+msgid "EF^Both"\r
+msgstr "EF^Entrambi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42\r
+msgid "Weapon icons:"\r
+msgstr "Icone armi:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45\r
+msgid "Show weapon ID as:"\r
+msgstr "Mostra ID arma come:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46\r
+msgid "SHOWAS^None"\r
+msgstr "SHOWAS^Nessuno"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47\r
+msgid "Number"\r
+msgstr "Numero"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48\r
+msgid "Bind"\r
+msgstr "Tasto"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51\r
+msgid "Show Accuracy"\r
+msgstr "Mostra precisione"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52\r
+msgid "Show Ammo"\r
+msgstr "Mostra munizioni"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55\r
+msgid "Ammo bar color:"\r
+msgstr "Colore barra munizioni:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61\r
+msgid "Ammo bar alpha:"\r
+msgstr "Opacità barra munizioni:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4\r
+msgid "Panel HUD Setup"\r
+msgstr "Setup del Panel HUD"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21\r
+msgid "Panel background defaults:"\r
+msgstr "Predefiniti dello sfondo del pannello :"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575\r
+msgid "Background:"\r
+msgstr "Sfondo:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578\r
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611\r
+msgid "Disable"\r
+msgstr "Disabilita"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583\r
+msgid "Color:"\r
+msgstr "Colore:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591\r
+msgid "Border size:"\r
+msgstr "Dimensioni bordo:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89\r
+msgid "Team color:"\r
+msgstr "Colore team:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617\r
+msgid "Test team color in configure mode"\r
+msgstr "Prova colore team in modalità configurazione"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620\r
+msgid "Padding:"\r
+msgstr "Riempimento:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68\r
+msgid "HUD Dock:"\r
+msgstr "Sfondo dell'HUD:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70\r
+msgid "DOCK^Disabled"\r
+msgstr "DOCK^Disabilitato"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71\r
+msgid "DOCK^Small"\r
+msgstr "DOCK^Piccolo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72\r
+msgid "DOCK^Medium"\r
+msgstr "DOCK^Medio"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73\r
+msgid "DOCK^Large"\r
+msgstr "DOCK^Largo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96\r
+msgid "Grid settings:"\r
+msgstr "Impostazioni griglia:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99\r
+msgid "Snap panels to grid"\r
+msgstr "Incolla i pannelli alla griglia"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102\r
+msgid "Grid size:"\r
+msgstr "Dimensioni griglia:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:103\r
+msgid "X:"\r
+msgstr "X:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:109\r
+msgid "Y:"\r
+msgstr "Y:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:117\r
+msgid "Exit setup"\r
+msgstr "Esci dal setup"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:4\r
+msgid "Multiplayer"\r
+msgstr "Multiplayer"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:18\r
+msgid "Servers"\r
+msgstr "Server"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:19\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5\r
+msgid "Create"\r
+msgstr "Crea"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:20\r
+msgid "Demos"\r
+msgstr "Demo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:21\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5\r
+msgid "Player Setup"\r
+msgstr "Setup giocatore"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34\r
+msgid "Game type:"\r
+msgstr "Tipo di gioco:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46\r
+msgid "Match settings:"\r
+msgstr "Impostazioni partita:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49\r
+msgid "Time limit:"\r
+msgstr "Limite di tempo:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61\r
+msgid "Use map specified default"\r
+msgstr "Usa le impostazioni di default della mappa"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163\r
+msgid "Point limit:"\r
+msgstr "Limite di punteggio:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64\r
+msgid "Player slots:"\r
+msgstr "Posti per giocatori:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67\r
+msgid "Number of bots:"\r
+msgstr "Numero di bot:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71\r
+msgid "Bot skill:"\r
+msgstr "Abilità bot:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74\r
+msgid "Botlike"\r
+msgstr "\"Come un bot\""\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75\r
+msgid "Beginner"\r
+msgstr "Principiante"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76\r
+msgid "You will win"\r
+msgstr "Vincerai"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77\r
+msgid "You can win"\r
+msgstr "Puoi vincere"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78\r
+msgid "You might win"\r
+msgstr "Potresti vincere"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79\r
+msgid "Advanced"\r
+msgstr "Avanzato"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80\r
+msgid "Expert"\r
+msgstr "Esperto"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81\r
+msgid "Pro"\r
+msgstr "Pro"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82\r
+msgid "Assassin"\r
+msgstr "Assassino"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83\r
+msgid "Unhuman"\r
+msgstr "Inumano"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84\r
+msgid "Godlike"\r
+msgstr "\"Come un Dio\""\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88\r
+msgid "Mutators..."\r
+msgstr "Mutatori..."\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97\r
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57\r
+msgid "Advanced settings..."\r
+msgstr "Impostazioni avanzate..."\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104\r
+msgid "Map list:"\r
+msgstr "Lista delle mappe:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110\r
+msgid "Select all"\r
+msgstr "Seleziona tutto"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113\r
+msgid "Select none"\r
+msgstr "Deseleziona tutto"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119\r
+msgid "Start Multiplayer!"\r
+msgstr "Inizia Multiplayer!"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154\r
+msgid "Capture limit:"\r
+msgstr "Limite catture:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158\r
+msgid "Lives:"\r
+msgstr "Vite:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159\r
+msgid "Laps:"\r
+msgstr "Giri:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160\r
+msgid "Goals:"\r
+msgstr "Goal:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164\r
+msgid "Frag limit:"\r
+msgstr "Limite di frag:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6\r
+msgid "Advanced server settings"\r
+msgstr "Impostazioni avanzate server"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25\r
+msgid "Game settings:"\r
+msgstr "Impostazioni gioco:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28\r
+msgid "Allow spectating"\r
+msgstr "Permetti spettatori"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31\r
+msgid "Spawn shield:"\r
+msgstr "Protezione nascita:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36\r
+msgid "Game speed:"\r
+msgstr "Velocità gioco:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40\r
+msgid "Teamplay settings:"\r
+msgstr "Impostazioni Teamplay:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43\r
+msgid "Friendly fire scale:"\r
+msgstr "Scala di fuoco amico:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47\r
+msgid "Virtual friendly fire (effect only)"\r
+msgstr "Penalità virtuale (solo effetto)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50\r
+msgid "Friendly fire penalty:"\r
+msgstr "Penalità fuoco amico:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54\r
+msgid "Virtual penalty (effect only)"\r
+msgstr "Penalità virtuale (solo effetto)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57\r
+msgid "Teams:"\r
+msgstr "Team:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66\r
+msgid "Map voting:"\r
+msgstr "Voto della mappa:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68\r
+msgid "No voting"\r
+msgstr "Nessun voto"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69\r
+msgid "2 choices"\r
+msgstr "2 scelte"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70\r
+msgid "3 choices"\r
+msgstr "3 scelte"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71\r
+msgid "4 choices"\r
+msgstr "4 scelte"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72\r
+msgid "5 choices"\r
+msgstr "5 scelte"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73\r
+msgid "6 choices"\r
+msgstr "6 scelte"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74\r
+msgid "7 choices"\r
+msgstr "7 scelte"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75\r
+msgid "8 choices"\r
+msgstr "8 scelte"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76\r
+msgid "9 choices"\r
+msgstr "9 scelte"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79\r
+msgid "Simple majority wins vcall"\r
+msgstr "La semplice maggioranza vince il vcall"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5\r
+msgid "Map Information"\r
+msgstr "Informazioni mappa"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49\r
+msgid "Full item placement"\r
+msgstr "Posizionamento oggetti completo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49\r
+msgid "MinstaGib only"\r
+msgstr "Solo MinstaGib"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78\r
+msgid "Title:"\r
+msgstr "Titolo:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84\r
+msgid "Author:"\r
+msgstr "Autore:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90\r
+msgid "Features:"\r
+msgstr "Caratteristiche:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95\r
+msgid "Game types:"\r
+msgstr "Tipi di gioco:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314\r
+msgid "Close"\r
+msgstr "Chiudi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121\r
+msgid "MAP^Play"\r
+msgstr "Gioca"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7\r
+msgid "Mutators"\r
+msgstr "Mutatori"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33\r
+msgid "All Weapons Arena"\r
+msgstr "Arena con tutte le armi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35\r
+msgid "Most Weapons Arena"\r
+msgstr "Arena con la maggior parte delle armi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56\r
+#, c-format\r
+msgid "%s Arena"\r
+msgstr "Arena con %s"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167\r
+msgid "Dodging"\r
+msgstr "Schivamento"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250\r
+msgid "MinstaGib"\r
+msgstr "MinstaGib"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253\r
+msgid "NIX"\r
+msgstr "NIX"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205\r
+msgid "Rocket Flying"\r
+msgstr "Razzo volante"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264\r
+msgid "No start weapons"\r
+msgstr "Senza armi all'inizio"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189\r
+msgid "Low gravity"\r
+msgstr "Bassa gravità"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170\r
+msgid "Cloaked"\r
+msgstr "Invisibile"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84\r
+msgid "Hook"\r
+msgstr "Hook"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173\r
+msgid "Midair"\r
+msgstr "A mezz'aria"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176\r
+msgid "Vampire"\r
+msgstr "Vampiro"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208\r
+msgid "Piñata"\r
+msgstr "Piñata"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211\r
+msgid "Weapons stay"\r
+msgstr "Armi rimangono"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180\r
+msgid "Blood loss"\r
+msgstr "Perdita di sangue"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202\r
+msgid "Jet pack"\r
+msgstr "Jet pack"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98\r
+msgid "MUT^None"\r
+msgstr "MUT^Nessuno"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164\r
+msgid "Gameplay mutators:"\r
+msgstr "Mutatori di gioco:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196\r
+msgid "Weapon & item mutators:"\r
+msgstr "Mutatori di armi ed oggetti:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199\r
+msgid "Grappling hook"\r
+msgstr "Grappling hook"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215\r
+msgid "Weapon arenas:"\r
+msgstr "Arene di armi:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218\r
+msgid "Regular (no arena)"\r
+msgstr "Regolare (no arena)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256\r
+msgid "with laser"\r
+msgstr "con laser"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247\r
+msgid "Special arenas:"\r
+msgstr "Arene speciali:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260\r
+msgid "Most weapons"\r
+msgstr "Maggior parte delle armi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4\r
+msgid "Demo"\r
+msgstr "Demo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28\r
+msgid "Record demos while playing"\r
+msgstr "Registra demo durante le partite"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28\r
+msgid "Filter:"\r
+msgstr "Filtro:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29\r
+#: qcsrc/menu/xonotic/dialog_settings_input.c:41\r
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24\r
+msgid "Clear"\r
+msgstr "Pulisci"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43\r
+msgid "Timedemo"\r
+msgstr "Timedemo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46\r
+msgid "DEMO^Play"\r
+msgstr "Riproduci"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4\r
+msgid "Join"\r
+msgstr "Entra"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36\r
+msgid "SRVS^Empty"\r
+msgstr "SRVS^Vuoti"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40\r
+msgid "SRVS^Full"\r
+msgstr "SRVS^Pieni"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44\r
+msgid "Pause"\r
+msgstr "In pausa"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56\r
+msgid "Address:"\r
+msgstr "Indirizzo:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:67\r
+msgid "Info..."\r
+msgstr "Info..."\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:72\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317\r
+msgid "Join!"\r
+msgstr "Entra!"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5\r
+msgid "Server Information"\r
+msgstr "Informazioni del server"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199\r
+msgid "N/A"\r
+msgstr "N/D"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158\r
+#, c-format\r
+msgid "%d/%d, %d free player slots"\r
+msgstr "%d/%d, %d slot liberi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172\r
+#, c-format\r
+msgid "%d modified settings"\r
+msgstr "%d impostazioni modificate"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172\r
+msgid "Official settings"\r
+msgstr "Impostazioni ufficiali"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197\r
+msgid "N/A (can't connect)"\r
+msgstr "N/D (impossibile connettersi)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205\r
+msgid "not supported (can't connect)"\r
+msgstr "non supportato (impossibile connettersi)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207\r
+msgid "not supported (won't encrypt)"\r
+msgstr "non supportato (non criptato)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211\r
+msgid "supported (will encrypt)"\r
+msgstr "supportato (criptato)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213\r
+msgid "supported (won't encrypt)"\r
+msgstr "supportato (non criptato)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217\r
+msgid "requested (will encrypt)"\r
+msgstr "richiesto (criptato)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219\r
+msgid "requested (won't encrypt)"\r
+msgstr "richiesto (non criptato)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223\r
+msgid "required (can't connect)"\r
+msgstr "richiesto (impossibile connettersi)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225\r
+msgid "required (will encrypt)"\r
+msgstr "richiesto (criptato)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269\r
+msgid "Players:"\r
+msgstr "Giocatori:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254\r
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38\r
+msgid "Type:"\r
+msgstr "Tipo:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259\r
+msgid "Map:"\r
+msgstr "Mappa:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264\r
+msgid "Gameplay:"\r
+msgstr "Gameplay:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274\r
+msgid "Bots:"\r
+msgstr "Bot:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279\r
+msgid "Mod:"\r
+msgstr "Mod:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284\r
+msgid "Version:"\r
+msgstr "Versione:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289\r
+msgid "Ping:"\r
+msgstr "Ping:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295\r
+msgid "CA:"\r
+msgstr "CA:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301\r
+msgid "Key:"\r
+msgstr "Chiave:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307\r
+msgid "Encryption:"\r
+msgstr "Crittografia:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:63\r
+msgid "Model:"\r
+msgstr "Modello:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:88\r
+msgid "Field of view:"\r
+msgstr "Campo di vista:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:92\r
+msgid "View bobbing:"\r
+msgstr "Ondeggiamento:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:96\r
+msgid "Zoom factor:"\r
+msgstr "Fattore zoom:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:100\r
+msgid "Zoom speed:"\r
+msgstr "Velocità zoom:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:103\r
+msgid "Weapon settings..."\r
+msgstr "Impostazioni arma..."\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:110\r
+msgid "Crosshair:"\r
+msgstr "Mirino:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:111\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:139\r
+msgid "Per weapon"\r
+msgstr "Per singola arma"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:130\r
+msgid "Crosshair size:"\r
+msgstr "Dimensioni mirino:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:134\r
+msgid "Crosshair alpha:"\r
+msgstr "Opacità mirino:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:138\r
+msgid "Crosshair color:"\r
+msgstr "Colore mirino:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:140\r
+msgid "By health"\r
+msgstr "In base alla vita"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:143\r
+msgid "Custom"\r
+msgstr "Personalizzato"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:148\r
+msgid "Enable center dot"\r
+msgstr "Abilita puntino al centro"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:151\r
+msgid "Size:"\r
+msgstr "Dimensioni:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:158\r
+msgid "Hit test:"\r
+msgstr "Test colpi:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:159\r
+msgid "HTST^None"\r
+msgstr "HTST^Nessuno"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:160\r
+msgid "TrueAim"\r
+msgstr "TrueAim"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:161\r
+msgid "Enemies"\r
+msgstr "Nemici"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:164\r
+msgid "Waypoints setup..."\r
+msgstr "Setup dei waypoint..."\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:169\r
+msgid "Enter HUD editor"\r
+msgstr "Apri HUD editor"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:174\r
+msgid "Force models:"\r
+msgstr "Forza modelli:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:175\r
+msgid "MDL^None"\r
+msgstr "MDL^Nessuno"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:176\r
+msgid "MDL^Custom"\r
+msgstr "MDL^Personalizzato"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:177\r
+msgid "MDL^All"\r
+msgstr "MDL^Tutti"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:180\r
+msgid "Disable gore effects"\r
+msgstr "Disabilita effetti sangue"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:182\r
+msgid "Gibs:"\r
+msgstr "Gib:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:184\r
+msgid "GIBS^None"\r
+msgstr "GIBS^Nessuno"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:185\r
+msgid "GIBS^Few"\r
+msgstr "GIBS^Pochi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:186\r
+msgid "GIBS^Many"\r
+msgstr "GIBS^Molti"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:187\r
+msgid "GIBS^Lots"\r
+msgstr "GIBS^Parecchi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:191\r
+msgid "Damage splash:"\r
+msgstr "Schizzo del danno:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:193\r
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:30\r
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:41\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109\r
+msgid "Apply immediately"\r
+msgstr "Applica immediatamente"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5\r
+msgid "Waypoints"\r
+msgstr "Waypoint"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23\r
+msgid "Show base waypoints"\r
+msgstr "Mostra i waypoint della base"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25\r
+msgid "Waypoint scale:"\r
+msgstr "Grandezza dei waypoint:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29\r
+msgid "Waypoint alpha:"\r
+msgstr "Opacità dei waypoint"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34\r
+msgid "Show names:"\r
+msgstr "Mostra nomi:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37\r
+msgid "Teammates"\r
+msgstr "Compagni del team"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38\r
+msgid "All players"\r
+msgstr "Tutti i giocatori"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6\r
+msgid "Weapon settings"\r
+msgstr "Impostazioni arma"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29\r
+msgid "Weapon priority list:"\r
+msgstr "Lista priorità armi:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34\r
+msgid "Up"\r
+msgstr "Su"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37\r
+msgid "Down"\r
+msgstr "Giù"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41\r
+msgid "Use priority list for weapon cycling"\r
+msgstr "Usa la lista di priorità per ciclare le armi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43\r
+msgid "Auto switch weapons on pickup"\r
+msgstr "Cambia automaticamente armi dopo raccolta"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45\r
+msgid "Draw 1st person weapon model"\r
+msgstr "Mostra modello arma in 1ª persona"\r
+\r
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55\r
+msgid "Flip view horizontally"\r
+msgstr "Capovolgi la vista orizzontalmente"\r
+\r
+#: qcsrc/menu/xonotic/dialog_news.c:4\r
+msgid "News"\r
+msgstr "Notizie"\r
+\r
+#: qcsrc/menu/xonotic/dialog_news.c:18\r
+msgid "http://www.xonotic.org/team/blog/"\r
+msgstr "http://www.xonotic.org/team/blog/"\r
+\r
+#: qcsrc/menu/xonotic/dialog_quit.c:4\r
+msgid "Quit"\r
+msgstr "Esci"\r
+\r
+#: qcsrc/menu/xonotic/dialog_quit.c:17\r
+msgid "Are you sure you want to quit?"\r
+msgstr "Sei sicuro di voler uscire?"\r
+\r
+#: qcsrc/menu/xonotic/dialog_quit.c:20\r
+msgid "Yes"\r
+msgstr "Sì"\r
+\r
+#: qcsrc/menu/xonotic/dialog_quit.c:21\r
+msgid "No"\r
+msgstr "No"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings.c:4\r
+msgid "Settings"\r
+msgstr "Impostazioni"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings.c:18\r
+#: qcsrc/menu/xonotic/dialog_settings_input.c:4\r
+msgid "Input"\r
+msgstr "Comandi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings.c:19\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:4\r
+msgid "Video"\r
+msgstr "Video"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings.c:20\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:4\r
+msgid "Effects"\r
+msgstr "Effetti"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings.c:21\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:4\r
+msgid "Audio"\r
+msgstr "Audio"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings.c:22\r
+#: qcsrc/menu/xonotic/dialog_settings_network.c:4\r
+msgid "Network"\r
+msgstr "Rete"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings.c:23\r
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:4\r
+msgid "Misc"\r
+msgstr "Altro"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:27\r
+msgid "Master:"\r
+msgstr "Master:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:33\r
+msgid "Music:"\r
+msgstr "Musica:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41\r
+msgid "VOL^Ambient:"\r
+msgstr "VOL^Ambiente:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:48\r
+msgid "Info:"\r
+msgstr "Info:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55\r
+msgid "Items:"\r
+msgstr "Oggetti:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62\r
+msgid "Pain:"\r
+msgstr "Dolore:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69\r
+msgid "Player:"\r
+msgstr "Giocatore:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76\r
+msgid "Shots:"\r
+msgstr "Spari:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83\r
+msgid "Voice:"\r
+msgstr "Voce:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91\r
+msgid "Weapons:"\r
+msgstr "Armi:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156\r
+msgid "Frequency:"\r
+msgstr "Frequenza:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100\r
+msgid "8 kHz"\r
+msgstr "8 kHz"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101\r
+msgid "11.025 kHz"\r
+msgstr "11.025 kHz"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102\r
+msgid "16 kHz"\r
+msgstr "16 kHz"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103\r
+msgid "22.05 kHz"\r
+msgstr "22.05 kHz"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104\r
+msgid "24 kHz"\r
+msgstr "24 kHz"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105\r
+msgid "32 kHz"\r
+msgstr "32 kHz"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106\r
+msgid "44.1 kHz"\r
+msgstr "44.1 kHz"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107\r
+msgid "48 kHz"\r
+msgstr "48 kHz"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110\r
+msgid "Channels:"\r
+msgstr "Canali:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112\r
+msgid "Mono"\r
+msgstr "Mono"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113\r
+msgid "Stereo"\r
+msgstr "Stereo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114\r
+msgid "2.1"\r
+msgstr "2.1"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115\r
+msgid "4"\r
+msgstr "4"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116\r
+msgid "5"\r
+msgstr "5"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117\r
+msgid "5.1"\r
+msgstr "5.1"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118\r
+msgid "6.1"\r
+msgstr "6.1"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119\r
+msgid "7.1"\r
+msgstr "7.1"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123\r
+msgid "Swap Stereo"\r
+msgstr "Scambia canali stereo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127\r
+msgid "Headphone friendly mode"\r
+msgstr "Modalità cuffie"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131\r
+msgid "Spatial voices:"\r
+msgstr "Voci spaziali:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132\r
+msgid "VOCS^None"\r
+msgstr "VOCS^Nessuna"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133\r
+msgid "VOCS^Taunts"\r
+msgstr "VOCS^Insulti"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134\r
+msgid "VOCS^All"\r
+msgstr "VOCS^Tutte"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137\r
+msgid "Taunt range:"\r
+msgstr "Range di insulti:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140\r
+msgid "RNG^Very short"\r
+msgstr "RNG^Molto ristretto"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141\r
+msgid "RNG^Short"\r
+msgstr "RNG^Ristretto"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142\r
+msgid "RNG^Normal"\r
+msgstr "RNG^Normale"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143\r
+msgid "RNG^Long"\r
+msgstr "RNG^Lungo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144\r
+msgid "RNG^Full"\r
+msgstr "RNG^Pieno"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151\r
+msgid "Automatic taunts"\r
+msgstr "Insulti automatici"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160\r
+msgid "Time warning:"\r
+msgstr "Avvertimento di tempo:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162\r
+msgid "WRN^None"\r
+msgstr "WRN^Nessuno"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163\r
+msgid "1 minute"\r
+msgstr "1 minuto"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164\r
+msgid "5 minutes"\r
+msgstr "5 minuti"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165\r
+msgid "WRN^Both"\r
+msgstr "WNR^Entrambi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168\r
+msgid "Hit indicator"\r
+msgstr "Indicatore di colpo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170\r
+msgid "Menu sounds"\r
+msgstr "Suoni del menu"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:38\r
+msgid "Quality preset:"\r
+msgstr "Preset qualità:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:41\r
+msgid "PRE^OMG!"\r
+msgstr "PRE^Oh mio dio!"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:42\r
+msgid "PRE^Low"\r
+msgstr "PRE^Bassa"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:43\r
+msgid "PRE^Medium"\r
+msgstr "PRE^Media"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:44\r
+msgid "PRE^Normal"\r
+msgstr "PRE^Normale"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:45\r
+msgid "PRE^High"\r
+msgstr "PRE^Alta"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:46\r
+msgid "PRE^Ultra"\r
+msgstr "PRE^Ultra"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:48\r
+msgid "PRE^Ultimate"\r
+msgstr "PRE^Massima"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:52\r
+msgid "Geometry detail:"\r
+msgstr "Dettagli geometrici:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:54\r
+msgid "DET^Lowest"\r
+msgstr "DET^Molto bassi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:55\r
+msgid "DET^Low"\r
+msgstr "DET^Bassi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:56\r
+msgid "DET^Normal"\r
+msgstr "DET^Normali"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:57\r
+msgid "DET^Good"\r
+msgstr "DET^Buoni"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:58\r
+msgid "DET^Best"\r
+msgstr "DET^Ottimi"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:59\r
+msgid "DET^Insane"\r
+msgstr "DET^Bestiali"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:62\r
+msgid "Antialiasing:"\r
+msgstr "Antialiasing:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:64\r
+msgid "AA^Disabled"\r
+msgstr "AA^Disabilitato"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:65\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:103\r
+msgid "2x"\r
+msgstr "2x"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:66\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:104\r
+msgid "4x"\r
+msgstr "4x"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:70\r
+msgid "Texture resolution:"\r
+msgstr "Risoluzione texture:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:73\r
+msgid "RES^Leet"\r
+msgstr "RES^Leet"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:74\r
+msgid "RES^Lowest"\r
+msgstr "RES^Molto bassa"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:75\r
+msgid "RES^Low"\r
+msgstr "RES^Bassa"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:76\r
+msgid "RES^Normal"\r
+msgstr "RES^Normale"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:77\r
+msgid "RES^Good"\r
+msgstr "RES^Buona"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:78\r
+msgid "RES^Best"\r
+msgstr "RES^Ottima"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:91\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:94\r
+msgid "Avoid lossy texture compression"\r
+msgstr "Evita compressione texture con perdita"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:100\r
+msgid "Anisotropy:"\r
+msgstr "Anisotropia:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:102\r
+msgid "ANISO^Disabled"\r
+msgstr "ANISO^Disabilitato"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:105\r
+msgid "8x"\r
+msgstr "8x"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:106\r
+msgid "16x"\r
+msgstr "16x"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:110\r
+msgid "Particle quality:"\r
+msgstr "Qualità particelle:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:113\r
+msgid "Particle distance:"\r
+msgstr "Distanza particelle:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:117\r
+msgid "Decals"\r
+msgstr "Decal"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118\r
+msgid "Decals on models"\r
+msgstr "Decal sui modelli"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122\r
+msgid "Distance:"\r
+msgstr "Distanza:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128\r
+msgid "Time:"\r
+msgstr "Tempo:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134\r
+msgid "Use lightmaps"\r
+msgstr "Usa mappe di luce"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135\r
+msgid "Deluxe mapping"\r
+msgstr "Mappaggio Deluxe"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137\r
+msgid "Gloss"\r
+msgstr "Lucentezza"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140\r
+msgid "Offset mapping"\r
+msgstr "Mappaggio in offset"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142\r
+msgid "Relief mapping"\r
+msgstr "Mappaggio in rilievo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145\r
+msgid "Reflections:"\r
+msgstr "Riflessioni:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148\r
+msgid "Blurred"\r
+msgstr "Sfocate"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149\r
+msgid "REFL^Good"\r
+msgstr "REFL^Buone"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150\r
+msgid "Sharp"\r
+msgstr "Nitide"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155\r
+msgid "Show surfaces"\r
+msgstr "Mostra superfici"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157\r
+msgid "No dynamic lighting"\r
+msgstr "Nessuna illuminazione dinamica"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159\r
+msgid "Flash blend approximation"\r
+msgstr "Approssimazione Flash blend"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161\r
+msgid "Realtime dynamic lighting"\r
+msgstr "Illuminazione dinamica in tempo reale"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166\r
+msgid "Shadows"\r
+msgstr "Ombre"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165\r
+msgid "Realtime world lighting"\r
+msgstr "Illuminazione globale in tempo reale"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170\r
+msgid "Use normal maps"\r
+msgstr "Usa mappe normali"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172\r
+msgid "Soft shadows"\r
+msgstr "Ombre morbide"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175\r
+msgid "Coronas"\r
+msgstr "Corone"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176\r
+msgid "Use Occlusion Queries"\r
+msgstr "Usa le Occlusion Queries"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178\r
+msgid "Bloom"\r
+msgstr "Bloom"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180\r
+msgid "High Dynamic Range (HDR)"\r
+msgstr "High Dynamic Range (HDR)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184\r
+msgid "Motion blur:"\r
+msgstr "Sfocatura movimento:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189\r
+msgid "Damage & water blur"\r
+msgstr "Sfocatura da danno & acqua:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:190\r
+msgid "Powerup sharpen"\r
+msgstr "Powerup nitido"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_input.c:26\r
+msgid "Key bindings:"\r
+msgstr "Associazione tasti (bind):"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_input.c:31\r
+msgid "Change key..."\r
+msgstr "Cambia tasto..."\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_input.c:35\r
+msgid "Edit..."\r
+msgstr "Modifica..."\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_input.c:46\r
+msgid "Sensitivity:"\r
+msgstr "Sensibilità:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51\r
+msgid "UI mouse speed:"\r
+msgstr "Velocità UI mouse:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55\r
+msgid "Mouse filter"\r
+msgstr "Filtro mouse"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57\r
+msgid "Invert mouse"\r
+msgstr "Inverti mouse"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60\r
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62\r
+msgid "Use joystick input"\r
+msgstr "Usa joystick"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65\r
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67\r
+msgid "Turn off OS mouse acceleration"\r
+msgstr "Disattiva l'accelerazione mouse dell'OS"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69\r
+msgid "\"enter console\" also closes"\r
+msgstr "\"apri console\" chiude anche"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5\r
+msgid "User defined key bind"\r
+msgstr "Tasti \"bind\" definiti dall'utente"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42\r
+msgid "Command when pressed:"\r
+msgstr "Comando quando premuto:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45\r
+msgid "Command when released:"\r
+msgstr "Comando quando rilasciato:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48\r
+msgid "Save"\r
+msgstr "Salva"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51\r
+msgid "Cancel"\r
+msgstr "Annulla"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:26\r
+msgid "Menu skins:"\r
+msgstr "Temi del menu:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:47\r
+msgid "Show current time"\r
+msgstr "Mostra orario corrente"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:49\r
+msgid "Show current date"\r
+msgstr "Mostra data corrente"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:51\r
+msgid "Show frames per second"\r
+msgstr "Mostra fotogrammi al secondo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:53\r
+msgid "Minimize input latency"\r
+msgstr "Minimizza latenza in entrata"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5\r
+msgid "Advanced settings"\r
+msgstr "Impostazioni avanzate"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23\r
+msgid "Cvar filter:"\r
+msgstr "Filtro delle cvar:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34\r
+msgid "Setting:"\r
+msgstr "Impostazioni:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42\r
+msgid "Value:"\r
+msgstr "Valore:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56\r
+msgid "Description:"\r
+msgstr "Descrizione:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_network.c:26\r
+msgid "Client-side movement prediction"\r
+msgstr "Predizione del movimento lato client"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_network.c:30\r
+msgid "Show netgraph"\r
+msgstr "Mostra grafico di rete"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_network.c:33\r
+msgid "Network speed:"\r
+msgstr "Velocità rete:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_network.c:35\r
+msgid "56k"\r
+msgstr "56k"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_network.c:36\r
+msgid "ISDN"\r
+msgstr "ISDN"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_network.c:37\r
+msgid "Slow ADSL"\r
+msgstr "ADSL lenta"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_network.c:38\r
+msgid "Fast ADSL"\r
+msgstr "ADSL veloce"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_network.c:39\r
+msgid "Broadband"\r
+msgstr "Banda larga"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_network.c:42\r
+msgid "Input packets/s:"\r
+msgstr "Pacchetti/s in entrata:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_network.c:46\r
+msgid "HTTP downloads:"\r
+msgstr "Download via HTTP:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_network.c:49\r
+msgid "Downloads:"\r
+msgstr "N° di download:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_network.c:53\r
+msgid "Speed (kB/s):"\r
+msgstr "Velocità (kB/s):"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_network.c:57\r
+msgid "Client UDP port:"\r
+msgstr "Porta UDP del client:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:26\r
+msgid "Resolution:"\r
+msgstr "Risoluzione:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:29\r
+msgid "Font/UI size:"\r
+msgstr "Dimensioni caratteri:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:31\r
+msgid "SZ^Unreadable"\r
+msgstr "SZ^Illeggibile"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:32\r
+msgid "SZ^Tiny"\r
+msgstr "SZ^Minuscolo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:33\r
+msgid "SZ^Little"\r
+msgstr "SZ^Molto piccolo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:34\r
+msgid "SZ^Small"\r
+msgstr "SZ^Piccolo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:35\r
+msgid "SZ^Medium"\r
+msgstr "SZ^Medio"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:36\r
+msgid "SZ^Large"\r
+msgstr "SZ^Largo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:37\r
+msgid "SZ^Huge"\r
+msgstr "SZ^Enorme"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:38\r
+msgid "SZ^Gigantic"\r
+msgstr "SZ^Gigante"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:39\r
+msgid "SZ^Colossal"\r
+msgstr "SZ^Colossale"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:42\r
+msgid "Color depth:"\r
+msgstr "Profondità colore:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:45\r
+msgid "Full screen"\r
+msgstr "Schermo intero"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:46\r
+msgid "Vertical Synchronization"\r
+msgstr "Sincronizzazione verticale"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:49\r
+msgid "Use OpenGL 2.0 shaders (GLSL)"\r
+msgstr "Usa gli shader OpenGL 2.0 (GLSL)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:52\r
+msgid "Use GLSL to handle color control"\r
+msgstr "Usa GLSL per gestire il controllo del colore"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:56\r
+msgid "Vertex Buffer Objects (VBOs)"\r
+msgstr "Vertex Buffer Objects (VBOs)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:59\r
+msgid "VBO^Off"\r
+msgstr "VBO^Off"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:60\r
+msgid "Vertices, some Tris (compatible)"\r
+msgstr "Vertici, alcuni Triangoli (compatibile)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:63\r
+msgid "Vertices"\r
+msgstr "Vertici"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:64\r
+msgid "Vertices and Triangles"\r
+msgstr "Vertici e Triangoli"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:67\r
+msgid "Depth first:"\r
+msgstr "Profondità prima:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:69\r
+msgid "DF^Disabled"\r
+msgstr "DF^Disabilitata"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:70\r
+msgid "DF^World"\r
+msgstr "DF^Globale"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:71\r
+msgid "DF^All"\r
+msgstr "DF^Tutto"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:75\r
+msgid "Disable multithreaded OpenGL"\r
+msgstr "Disabilita il multithreading OpenGL"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:77\r
+msgid "Wait for GPU to finish each frame"\r
+msgstr "Attendi che la GPU finisca di elaborare ogni frame"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:80\r
+msgid "Brightness:"\r
+msgstr "Luminosità:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:83\r
+msgid "Contrast:"\r
+msgstr "Contrasto:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:86\r
+msgid "Gamma:"\r
+msgstr "Gamma:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91\r
+msgid "Contrast boost:"\r
+msgstr "Aumenta contrasto:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96\r
+msgid "Saturation:"\r
+msgstr "Saturazione:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102\r
+msgid "LIT^Ambient:"\r
+msgstr "LIT^Ambiente:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105\r
+msgid "Intensity:"\r
+msgstr "Intensità:"\r
+\r
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:4\r
+msgid "Singleplayer"\r
+msgstr "Giocatore singolo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:59\r
+msgid "Instant action! (random map with bots)"\r
+msgstr "Inizia ora! (mappa casuale con bot)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:80\r
+msgid "Start Singleplayer!"\r
+msgstr "Inizia modalità Giocatore Singolo!"\r
+\r
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4\r
+msgid "Winner"\r
+msgstr "Vincitore"\r
+\r
+#: qcsrc/menu/xonotic/dialog_teamselect.c:5\r
+msgid "Team Selection"\r
+msgstr "Selezione team"\r
+\r
+#: qcsrc/menu/xonotic/dialog_teamselect.c:41\r
+msgid "join 'best' team (auto-select)"\r
+msgstr "entra nel 'miglior' team (auto-selezione)"\r
+\r
+#: qcsrc/menu/xonotic/dialog_teamselect.c:45\r
+msgid "red"\r
+msgstr "rosso"\r
+\r
+#: qcsrc/menu/xonotic/dialog_teamselect.c:46\r
+msgid "blue"\r
+msgstr "blu"\r
+\r
+#: qcsrc/menu/xonotic/dialog_teamselect.c:47\r
+msgid "yellow"\r
+msgstr "giallo"\r
+\r
+#: qcsrc/menu/xonotic/dialog_teamselect.c:48\r
+msgid "pink"\r
+msgstr "rosa"\r
+\r
+#: qcsrc/menu/xonotic/dialog_teamselect.c:51\r
+msgid "spectate"\r
+msgstr "spettatore"\r
+\r
+#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38\r
+msgid "Do not press this button again!"\r
+msgstr "Non premere questo tasto di nuovo!"\r
+\r
+#: qcsrc/menu/xonotic/maplist.c:278\r
+msgid ""\r
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"\r
+msgstr ""\r
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"\r
+\r
+#: qcsrc/menu/xonotic/maplist.c:286\r
+#, c-format\r
+msgid "%s's Xonotic Server"\r
+msgstr "Server Xonotic di %s"\r
+\r
+#: qcsrc/menu/xonotic/maplist.c:291\r
+msgid ""\r
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "\r
+"again.\n"\r
+msgstr ""\r
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "\r
+"again.\n"\r
+\r
+#: qcsrc/menu/xonotic/playermodel.c:174\r
+msgid "<no model found>"\r
+msgstr "<nessun modello trovato>"\r
+\r
+#: qcsrc/menu/xonotic/serverlist.c:185\r
+msgid "Remove"\r
+msgstr "Rimuovi"\r
+\r
+#: qcsrc/menu/xonotic/serverlist.c:187\r
+msgid "Bookmark"\r
+msgstr "Aggiungi tra i preferiti"\r
+\r
+#: qcsrc/menu/xonotic/serverlist.c:523\r
+msgid "Ping"\r
+msgstr "Ping"\r
+\r
+#: qcsrc/menu/xonotic/serverlist.c:524\r
+msgid "Host name"\r
+msgstr "Nome dell'host"\r
+\r
+#: qcsrc/menu/xonotic/serverlist.c:525\r
+msgid "Map"\r
+msgstr "Mappa"\r
+\r
+#: qcsrc/menu/xonotic/serverlist.c:526\r
+msgid "Type"\r
+msgstr "Tipo"\r
+\r
+#: qcsrc/menu/xonotic/serverlist.c:527\r
+msgid "Players"\r
+msgstr "Giocatori"\r
+\r
+#: qcsrc/menu/xonotic/skinlist.c:105\r
+msgid "<TITLE>"\r
+msgstr "<TITOLO>"\r
+\r
+#: qcsrc/menu/xonotic/skinlist.c:106\r
+msgid "<AUTHOR>"\r
+msgstr "<AUTORE>"\r
+\r
+#: qcsrc/menu/xonotic/skinlist.c:163\r
+#, c-format\r
+msgid "%s: %s"\r
+msgstr "%s: %s"\r
+\r
+#: qcsrc/menu/xonotic/slider_decibels.c:50\r
+msgid "VOL^OFF"\r
+msgstr "VOL^OFF"\r
+\r
+#: qcsrc/menu/xonotic/slider_decibels.c:52\r
+msgid "VOL^MAX"\r
+msgstr "VOL^MAX"\r
+\r
+#: qcsrc/menu/xonotic/slider_decibels.c:53\r
+#, c-format\r
+msgid "%s dB"\r
+msgstr "%s dB"\r
+\r
+#: qcsrc/menu/xonotic/slider_resolution.c:65\r
+#, c-format\r
+msgid "%dx%d"\r
+msgstr "%dx%d"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:270\r
+#, c-format\r
+msgid "Received HTTP request data for an invalid id %d.\n"\r
+msgstr "Ricevuta richiesta HTTP per un invalido id %d.\n"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:285\r
+#, c-format\r
+msgid "error receiving update notification: status is %d\n"\r
+msgstr ""\r
+"errore durante la notifica d'aggiornamento: lo stato è impostato su %d\n"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:290\r
+msgid "error: received HTML instead of an update notification\n"\r
+msgstr "errore: ricevuto HTML invece di una notifica d'aggiornamento\n"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:295\r
+msgid "error: received carriage returns from update notification server\n"\r
+msgstr "error: received carriage returns from update notification server\n"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:316\r
+#, c-format\r
+msgid ""\r
+"Update can be downloaded at:\n"\r
+"%s\n"\r
+msgstr ""\r
+"L'aggiornamento può essere scaricato da:\n"\r
+"%s\n"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:337\r
+msgid "Autogenerating mapinfo for newly added maps..."\r
+msgstr "Autogenerando le mapinfo per le nuove mappe..."\r
+\r
+#: qcsrc/menu/xonotic/util.qc:367\r
+#, c-format\r
+msgid "^1%s TEST BUILD"\r
+msgstr "^1%s TEST BUILD"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:432\r
+#, c-format\r
+msgid "Update to %s now!"\r
+msgstr "Aggiorna a %s ora!"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:501\r
+msgid ""\r
+"^1ERROR: Texture compression is required but not supported.\n"\r
+"^1Expect visual problems.\n"\r
+msgstr ""\r
+"^1ERRORE: La compressione texture è richiesta ma non supportata.\n"\r
+"^1Previsti problemi visuali.\n"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:523\r
+msgid "Arena"\r
+msgstr "Arena"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:524\r
+msgid "Assault"\r
+msgstr "Assalto"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:525\r
+msgid "Capture The Flag"\r
+msgstr "Capture The Flag"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:526\r
+msgid "Clan Arena"\r
+msgstr "Clan Arena"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:527\r
+msgid "Deathmatch"\r
+msgstr "Deathmatch"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:528\r
+msgid "Domination"\r
+msgstr "Dominazione"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:529\r
+msgid "Freeze Tag"\r
+msgstr "Freeze Tag"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:530\r
+msgid "Keepaway"\r
+msgstr "Keepaway"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:531\r
+msgid "Key Hunt"\r
+msgstr "Key Hunt"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:532\r
+msgid "Last Man Standing"\r
+msgstr "Last Man Standing"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:533\r
+msgid "Nexball"\r
+msgstr "Nexball"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:534\r
+msgid "Onslaught"\r
+msgstr "Onslaught"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:535\r
+msgid "Race"\r
+msgstr "Corsa"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:536\r
+msgid "Race CTS"\r
+msgstr "Corsa CTS"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:537\r
+msgid "Runematch"\r
+msgstr "Runematch"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:538\r
+msgid "Team Deathmatch"\r
+msgstr "Team Deathmatch"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:557\r
+#, c-format\r
+msgid "@!#%'n Tuba Throwing"\r
+msgstr "@!#%'n Tuba Throwing"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593\r
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610\r
+#: qcsrc/menu/xonotic/util.qc:622\r
+msgid "Default"\r
+msgstr "Predefinito"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:588\r
+msgid "Use default"\r
+msgstr "Usa predefinito"\r
+\r
+#: qcsrc/menu/xonotic/util.qc:608\r
+msgid "Team Color:"\r
+msgstr "Colore Team:"\r
+\r
+#: qcsrc/menu/xonotic/util.qh:47\r
+msgid "Enable panel"\r
+msgstr "Abilita pannello"\r
+\r
+#: qcsrc/server/w_crylink.qc:2\r
+msgid "Crylink"\r
+msgstr "Crylink"\r
+\r
+#: qcsrc/server/w_crylink.qc:664\r
+#, c-format\r
+msgid "%s succeeded at self-destructing themself with the Crylink"\r
+msgstr "%s è riuscito ad autodistruggersi col Crylink"\r
+\r
+#: qcsrc/server/w_crylink.qc:669\r
+#, c-format\r
+msgid "%s could not hide from %s's Crylink"\r
+msgstr "%s non s'è potuto nascondere dal Crylink di %s"\r
+\r
+#: qcsrc/server/w_crylink.qc:671\r
+#, c-format\r
+msgid "%s was too close to %s's Crylink"\r
+msgstr "%s era troppo vicino al Crylink di %s"\r
+\r
+#: qcsrc/server/w_crylink.qc:673\r
+#, c-format\r
+msgid "%s took a close look at %s's Crylink"\r
+msgstr "%s ha visto da vicino il Crylink di %s"\r
+\r
+#: qcsrc/server/w_electro.qc:2\r
+msgid "Electro"\r
+msgstr "Electro"\r
+\r
+#: qcsrc/server/w_electro.qc:574\r
+#, c-format\r
+msgid "%s could not remember where they put plasma"\r
+msgstr "%s non s'è ricordato dove aveva messo il plasma"\r
+\r
+#: qcsrc/server/w_electro.qc:576\r
+#, c-format\r
+msgid "%s played with plasma"\r
+msgstr "%s ha giocato col plasma"\r
+\r
+#: qcsrc/server/w_electro.qc:583\r
+#, c-format\r
+msgid "%s just noticed %s's blue ball"\r
+msgstr "%s ha appena notato la palla blu di %s"\r
+\r
+#: qcsrc/server/w_electro.qc:585\r
+#, c-format\r
+msgid "%s got in touch with %s's blue ball"\r
+msgstr "%s è entrato in contatto con la palla blu di %s"\r
+\r
+#: qcsrc/server/w_electro.qc:590\r
+#, c-format\r
+msgid "%s felt the electrifying air of %s's combo"\r
+msgstr "%s ha sentito l'aria elettrificata della combo di %s"\r
+\r
+#: qcsrc/server/w_electro.qc:592\r
+#, c-format\r
+msgid "%s got too close to %s's blue beam"\r
+msgstr "%s s'è avvicinato troppo al raggio blu di %s"\r
+\r
+#: qcsrc/server/w_electro.qc:594\r
+#, c-format\r
+msgid "%s was blasted by %s's blue beam"\r
+msgstr "%s è stato fatto saltare in aria dal raggio blu di %s"\r
+\r
+#: qcsrc/server/w_fireball.qc:2\r
+msgid "Fireball"\r
+msgstr "Fireball"\r
+\r
+#: qcsrc/server/w_fireball.qc:417\r
+#, c-format\r
+msgid "%s forgot about some firemine"\r
+msgstr "%s s'è dimenticato di alcune mine infuocate"\r
+\r
+#: qcsrc/server/w_fireball.qc:419 qcsrc/server/w_hlac.qc:240\r
+#, c-format\r
+msgid "%s should have used a smaller gun"\r
+msgstr "%s avrebbe dovuto usare un'arma più piccola"\r
+\r
+#: qcsrc/server/w_fireball.qc:426\r
+#, c-format\r
+msgid "%s tried to catch %s's firemine"\r
+msgstr "%s ha provato a catturare la mina infuocata di %s"\r
+\r
+#: qcsrc/server/w_fireball.qc:428\r
+#, c-format\r
+msgid "%s fatefully ignored %s's firemine"\r
+msgstr "%s ha fatalmente ignorato la mina infuocata di %s"\r
+\r
+#: qcsrc/server/w_fireball.qc:435\r
+#, c-format\r
+msgid "%s could not hide from %s's fireball"\r
+msgstr "%s non è riuscito a nascondersi dalla fireball di %s"\r
+\r
+#: qcsrc/server/w_fireball.qc:437\r
+#, c-format\r
+msgid "%s saw the pretty lights of %s's fireball"\r
+msgstr "%s ha visto le belle luci della fireball di %s"\r
+\r
+#: qcsrc/server/w_fireball.qc:440\r
+#, c-format\r
+msgid "%s got too close to %s's fireball"\r
+msgstr "%s s'è avvicinato troppo alla fireball di %s"\r
+\r
+#: qcsrc/server/w_fireball.qc:442\r
+#, c-format\r
+msgid "%s tasted %s's fireball"\r
+msgstr "%s ha assaggiato la fireball di %s"\r
+\r
+#: qcsrc/server/w_grenadelauncher.qc:2\r
+msgid "Mortar"\r
+msgstr "Mortar"\r
+\r
+#: qcsrc/server/w_grenadelauncher.qc:383\r
+#, c-format\r
+msgid "%s tried out his own grenade"\r
+msgstr "%s ha provato da solo la propria granata"\r
+\r
+#: qcsrc/server/w_grenadelauncher.qc:385\r
+#, c-format\r
+msgid "%s detonated"\r
+msgstr "%s è detonato"\r
+\r
+#: qcsrc/server/w_grenadelauncher.qc:391\r
+#, c-format\r
+msgid "%s didn't see %s's grenade"\r
+msgstr "%s non ha visto la granata di %s"\r
+\r
+#: qcsrc/server/w_grenadelauncher.qc:393\r
+#, c-format\r
+msgid "%s almost dodged %s's grenade"\r
+msgstr "%s ha quasi schivato la granata di %s"\r
+\r
+#: qcsrc/server/w_grenadelauncher.qc:395\r
+#, c-format\r
+msgid "%s ate %s's grenade"\r
+msgstr "%s ha mangiato la granata di %s"\r
+\r
+#: qcsrc/server/w_hagar.qc:2\r
+msgid "Hagar"\r
+msgstr "Hagar"\r
+\r
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655\r
+#, c-format\r
+msgid "%s played with tiny rockets"\r
+msgstr "%s ha giocato con piccoli razzi"\r
+\r
+#: qcsrc/server/w_hagar.qc:386\r
+#, c-format\r
+msgid "%s hoped %s's missiles wouldn't bounce"\r
+msgstr "%s ha sperato che i missili di %s non rimbalzassero"\r
+\r
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661\r
+#, c-format\r
+msgid "%s was pummeled by %s"\r
+msgstr "%s è stato preso a pugni da %s"\r
+\r
+#: qcsrc/server/w_hlac.qc:2\r
+msgid "Heavy Laser Assault Cannon"\r
+msgstr "Heavy Laser Assault Cannon"\r
+\r
+#: qcsrc/server/w_hlac.qc:242\r
+#, c-format\r
+msgid "%s was cut down by %s"\r
+msgstr "%s è stato abbattuto da %s"\r
+\r
+#: qcsrc/server/w_hook.qc:2\r
+msgid "Grappling Hook"\r
+msgstr "Grappling Hook"\r
+\r
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296\r
+#, c-format\r
+msgid "%s did the impossible"\r
+msgstr "%s ha fatto l'impossibile"\r
+\r
+#: qcsrc/server/w_hook.qc:268\r
+#, c-format\r
+msgid "%s has run into %s's gravity bomb"\r
+msgstr "%s si è imbattuto nella bomba di gravità di %s"\r
+\r
+#: qcsrc/server/w_laser.qc:2\r
+msgid "Laser"\r
+msgstr "Laser"\r
+\r
+#: qcsrc/server/w_laser.qc:311\r
+#, c-format\r
+msgid "%s lasered themself to hell"\r
+msgstr "%s si è \"laserato\" all'inferno"\r
+\r
+#: qcsrc/server/w_laser.qc:315\r
+#, c-format\r
+msgid "%s was cut in half by %s's gauntlet"\r
+msgstr "%s è stato tagliato a metà dal guanto di %s"\r
+\r
+#: qcsrc/server/w_laser.qc:317\r
+#, c-format\r
+msgid "%s was lasered to death by %s"\r
+msgstr "%s è stato \"laserato\" a morte da %s"\r
+\r
+#: qcsrc/server/w_minelayer.qc:2\r
+msgid "Mine Layer"\r
+msgstr "Mine Layer"\r
+\r
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501\r
+#, c-format\r
+msgid "%s exploded"\r
+msgstr "%s è esploso"\r
+\r
+#: qcsrc/server/w_minelayer.qc:527\r
+#, c-format\r
+msgid "%s got too close to %s's mine"\r
+msgstr "%s s'è avvicinato troppo alla mina di %s"\r
+\r
+#: qcsrc/server/w_minelayer.qc:529\r
+#, c-format\r
+msgid "%s almost dodged %s's mine"\r
+msgstr "%s ha quasi schivato la mina di %s"\r
+\r
+#: qcsrc/server/w_minelayer.qc:531\r
+#, c-format\r
+msgid "%s stepped on %s's mine"\r
+msgstr "%s è passato sopra la mina di %s"\r
+\r
+#: qcsrc/server/w_minstanex.qc:2\r
+msgid "MinstaNex"\r
+msgstr "MinstaNex"\r
+\r
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253\r
+#: qcsrc/server/w_shotgun.qc:209 qcsrc/server/w_uzi.qc:317\r
+#, c-format\r
+msgid "%s is now thinking with portals"\r
+msgstr "%s sta ora pensando con i portali"\r
+\r
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255\r
+#, c-format\r
+msgid "%s has been vaporized by %s"\r
+msgstr "%s è stato vaporizzato da %s"\r
+\r
+#: qcsrc/server/w_nex.qc:2\r
+msgid "Nex"\r
+msgstr "Nex"\r
+\r
+#: qcsrc/server/w_porto.qc:2\r
+msgid "Port-O-Launch"\r
+msgstr "Port-O-Launch"\r
+\r
+#: qcsrc/server/w_porto.qc:298\r
+#, c-format\r
+msgid "%s felt %s doing the impossible to him"\r
+msgstr "%s ha sentito %s fargli l'impossibile"\r
+\r
+#: qcsrc/server/w_rifle.qc:2\r
+msgid "Rifle"\r
+msgstr "Fucile"\r
+\r
+#: qcsrc/server/w_rifle.qc:233\r
+#, c-format\r
+msgid "%s shot themself automatically"\r
+msgstr "%s si è sparato da solo automaticamente"\r
+\r
+#: qcsrc/server/w_rifle.qc:235\r
+#, c-format\r
+msgid "%s sniped themself somehow"\r
+msgstr "%s si è fucilato da solo in qualche modo"\r
+\r
+#: qcsrc/server/w_rifle.qc:242\r
+#, c-format\r
+msgid "%s failed to hide from %s's bullet hail"\r
+msgstr "%s non è riuscito a nascondersi dalla raffica di proiettili di %s"\r
+\r
+#: qcsrc/server/w_rifle.qc:244\r
+#, c-format\r
+msgid "%s died in %s's bullet hail"\r
+msgstr "%s è morto nella raffica di proiettili di %s"\r
+\r
+#: qcsrc/server/w_rifle.qc:251\r
+#, c-format\r
+msgid "%s failed to hide from %s's rifle"\r
+msgstr "%s non è riuscito a nascondersi dal fucile di %s"\r
+\r
+#: qcsrc/server/w_rifle.qc:256\r
+#, c-format\r
+msgid "%s got hit in the head by %s"\r
+msgstr "%s ha preso un colpo in testa da %s"\r
+\r
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321\r
+#, c-format\r
+msgid "%s was sniped by %s"\r
+msgstr "%s è stato fucilato da %s"\r
+\r
+#: qcsrc/server/w_rocketlauncher.qc:2\r
+msgid "Rocket Launcher"\r
+msgstr "Rocket Launcher"\r
+\r
+#: qcsrc/server/w_rocketlauncher.qc:505\r
+#, c-format\r
+msgid "%s got too close to %s's rocket"\r
+msgstr "%s s'è avvicinato troppo al razzo di %s"\r
+\r
+#: qcsrc/server/w_rocketlauncher.qc:507\r
+#, c-format\r
+msgid "%s almost dodged %s's rocket"\r
+msgstr "%s ha quasi schivato il razzo di %s"\r
+\r
+#: qcsrc/server/w_rocketlauncher.qc:509\r
+#, c-format\r
+msgid "%s ate %s's rocket"\r
+msgstr "%s ha mangiato il razzo di %s"\r
+\r
+#: qcsrc/server/w_seeker.qc:2\r
+msgid "T.A.G. Seeker"\r
+msgstr "T.A.G. Seeker"\r
+\r
+#: qcsrc/server/w_seeker.qc:659\r
+#, c-format\r
+msgid "%s was tagged by %s"\r
+msgstr "%s è stato contrassegnato da %s"\r
+\r
+#: qcsrc/server/w_shotgun.qc:2\r
+msgid "Shotgun"\r
+msgstr "Shotgun"\r
+\r
+#: qcsrc/server/w_shotgun.qc:213\r
+#, c-format\r
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"\r
+msgstr "%2$s ^7ha schiaffeggiato %1$s ^7un pò con un grosso ^2shotgun"\r
+\r
+#: qcsrc/server/w_shotgun.qc:215\r
+#, c-format\r
+msgid "%s was gunned by %s"\r
+msgstr "%s è stato sparato da %s"\r
+\r
+#: qcsrc/server/w_tuba.qc:2\r
+#, c-format\r
+msgid "@!#%'n Tuba"\r
+msgstr "@!#%'n Tuba"\r
+\r
+#: qcsrc/server/w_tuba.qc:252\r
+#, c-format\r
+msgid "%s hurt his own ears with the @!#%%'n Tuba"\r
+msgstr "%s s'è fatto male alle orecchie con la @!#%%'n Tuba"\r
+\r
+#: qcsrc/server/w_tuba.qc:256\r
+#, c-format\r
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"\r
+msgstr "%s è morto nella gran esibizione di %s con la @!#%%'n Tuba"\r
+\r
+#: qcsrc/server/w_uzi.qc:2\r
+msgid "Machine Gun"\r
+msgstr "Machine Gun"\r
+\r
+#: qcsrc/server/w_uzi.qc:323\r
+#, c-format\r
+msgid "%s was riddled full of holes by %s"\r
+msgstr "%s è stato riempito di buchi da %s"\r
+\r
+#~ msgid "Waypoint settings:"\r
+#~ msgstr "Impostazioni dei waypoint"\r
+\r
+#~ msgid ""\r
+#~ "Please answer a few initial questions to enhance the game experience."\r
+#~ msgstr ""\r
+#~ "Per favore rispondi a poche domande iniziali per migliorare l'esperienza "\r
+#~ "di gioco."\r
+\r
+#~ msgid "%d/%d"\r
+#~ msgstr "%d/%d"\r
+\r
+#~ msgid "Sniper Rifle"\r
+#~ msgstr "Sniper Rifle"\r
+\r
+#~ msgid "Accelerometer scale:"\r
+#~ msgstr "Scala accelerometro:"\r
+\r
+#~ msgid "Show accelerometer"\r
+#~ msgstr "Mostra accelerometro"\r
+\r
+#~ msgid "qu/s (hidden)"\r
+#~ msgstr "qu/s (nascosto)"\r
+\r
+#~ msgid "Speedometer"\r
+#~ msgstr "Tachimetro"\r
index 66a05ed647ac7ca9ae5cebe340d67c75389a7e58..c09e97aafa1be87fd2ec8a82809f40d7dae0f1de 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-06-27 18:26+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -112,7 +112,7 @@ msgstr "Aftiteling"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
 #: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
 msgid "OK"
@@ -156,6 +156,10 @@ msgstr "Ammunitie venster:"
 msgid "Show only current ammo type"
 msgstr "Laat alleen huidig ammunitietype zien"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
@@ -281,6 +285,110 @@ msgstr "Post tijd:"
 msgid "Entry fadetime:"
 msgstr "Post vervaagtijd:"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+#, fuzzy
+msgid "Physics Panel"
+msgstr "Chat Paneel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Paneel uitgeschakeld"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+#, fuzzy
+msgid "Panel enabled if not observing"
+msgstr "Paneel activeren tijdens observeren"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr "Paneel altijd actief"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+#, fuzzy
+msgid "Status bar"
+msgstr "Activeer status balk"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Links"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Rechts"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+#, fuzzy
+msgid "Inward align"
+msgstr "Binnenkant"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+#, fuzzy
+msgid "Outward align"
+msgstr "Buitenkant"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+#, fuzzy
+msgid "Flip speed/acceleration positions"
+msgstr "Keer health en armor posities om"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+#, fuzzy
+msgid "Speed:"
+msgstr "Snelheid (kB/s):"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "knopen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+#, fuzzy
+msgid "Show"
+msgstr "Ammunitie tonen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+#, fuzzy
+msgid "Top speed"
+msgstr "Zoom snelheid:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+#, fuzzy
+msgid "Acceleration:"
+msgstr "Reflecties"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
 msgid "Powerups Panel"
 msgstr "Powerups paneel"
@@ -293,20 +401,10 @@ msgstr "Keer kracht en schild posities om"
 msgid "Pressed Keys Panel"
 msgstr "Ingedrukte Toetsen Paneel"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Paneel uitgeschakeld"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
 msgid "Panel enabled when spectating"
 msgstr "Paneel activeren tijdens observeren"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
-msgid "Panel always enabled"
-msgstr "Paneel altijd actief"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
 msgid "Forced aspect:"
 msgstr "Aspect ratio:"
@@ -331,7 +429,7 @@ msgstr "Radar:"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
 msgid "Alpha:"
 msgstr "Alpha:"
 
@@ -387,6 +485,27 @@ msgstr "Altijd uitgezoomd"
 msgid "Score Panel"
 msgstr "Score Paneel"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+#, fuzzy
+msgid "Off"
+msgstr "VBO^Uit"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
 msgid "Timer Panel"
 msgstr "Tijd Paneel"
@@ -429,11 +548,11 @@ msgstr "%ds"
 msgid "Fade effect:"
 msgstr "Vervagingseffect:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
 msgid "EF^None"
 msgstr "EF^Geen"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
 msgid "Slide"
 msgstr "Schuiven"
 
@@ -441,39 +560,44 @@ msgstr "Schuiven"
 msgid "Alpha"
 msgstr "Alpha"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+#, fuzzy
+msgid "EF^Both"
+msgstr "WRN^Beiden"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
 msgid "Weapon icons:"
 msgstr "Wapeniconen:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
 msgid "Show weapon ID as:"
 msgstr "Toon wapen-ID als:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
 msgid "SHOWAS^None"
 msgstr "SHOWAS^Geen"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
 msgid "Number"
 msgstr "Nummer"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
 msgid "Bind"
 msgstr "Binden"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
 msgid "Show Accuracy"
 msgstr "Nauwkeurigheid tonen"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
 msgid "Show Ammo"
 msgstr "Ammunitie tonen"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
 msgid "Ammo bar color:"
 msgstr "Ammunitie balk kleur:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
 msgid "Ammo bar alpha:"
 msgstr "Ammunitie alpha:"
 
@@ -485,20 +609,24 @@ msgstr "Paneel HUD Instellingen"
 msgid "Panel background defaults:"
 msgstr "Paneel achtergrond standaards:"
 
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Achtergrond"
+
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
 msgid "Disable"
 msgstr "Uitschakelen"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
 msgid "Color:"
 msgstr "Kleur:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
 msgid "Border size:"
 msgstr "Grootte rand:"
 
@@ -507,11 +635,11 @@ msgstr "Grootte rand:"
 msgid "Team color:"
 msgstr "Teamkleur:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
 msgid "Test team color in configure mode"
 msgstr "Test teamkleur in aanpassingsmodus"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
 msgid "Padding:"
 msgstr "Opvulling:"
 
@@ -669,7 +797,7 @@ msgid "Mutators..."
 msgstr "Mutaties..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
 msgid "Advanced settings..."
 msgstr "Geavanceerde instellingen..."
 
@@ -1251,10 +1379,10 @@ msgstr "Pijn spatten:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:178
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:191
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:30
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
 msgid "Apply immediately"
 msgstr "Meteen toepassen"
 
@@ -1314,15 +1442,11 @@ msgstr "Automatisch wapens wisselen bij oppakken"
 msgid "Draw 1st person weapon model"
 msgstr "Wapen positie"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Links"
-
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Rechts"
+msgid "Center"
+msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
 msgid "Flip view horizontally"
 msgstr "Spiegel zicht horizontaal"
 
@@ -1813,10 +1937,16 @@ msgstr "Hoog dynamisch bereik (HDR)"
 msgid "Motion blur:"
 msgstr "Bewegingsonscherpte:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:187
+#, fuzzy
+msgid "Damage & water blur"
 msgstr "Schadeonscherpte"
 
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
+#, fuzzy
+msgid "Powerup sharpen"
+msgstr "Powerups paneel"
+
 #: qcsrc/menu/xonotic/dialog_settings_input.c:26
 msgid "Key bindings:"
 msgstr "Toetsen:"
@@ -1833,29 +1963,29 @@ msgstr "Aanpassen..."
 msgid "Sensitivity:"
 msgstr "Gevoeligheid:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
 msgid "UI mouse speed:"
 msgstr "UI muis snelheid:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
 msgid "Mouse filter"
 msgstr "Muis filter"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
 msgid "Invert mouse"
 msgstr "Invert muis"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
 msgid "Use joystick input"
 msgstr "Gebruik joystick input"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
 msgid "Turn off OS mouse acceleration"
 msgstr "Gebruik joystick input"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
 msgid "\"enter console\" also closes"
 msgstr "\"console activeren\" sluit deze ook weer"
 
@@ -1896,42 +2026,6 @@ msgid "Show frames per second"
 msgstr "Laat frames per seconde zien"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Snelheidsmeter"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (verborgen)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "knopen"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Laat versnellingsmeter zien"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Versnellingsmeter schaal"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
 msgid "Minimize input latency"
 msgstr "Minimaliseer input latentie"
 
@@ -2127,19 +2221,19 @@ msgstr "Contrast:"
 msgid "Gamma:"
 msgstr "Gamma:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
 msgid "Contrast boost:"
 msgstr "Verhoog contrast:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
 msgid "Saturation:"
 msgstr "Verzadiging:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
 msgid "LIT^Ambient:"
 msgstr "LIT^Omgevingslicht"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
 msgid "Intensity:"
 msgstr "Intensiteit:"
 
@@ -2315,7 +2409,7 @@ msgstr ""
 msgid "Update to %s now!"
 msgstr "Update nu naar %s!"
 
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems.\n"
@@ -2323,94 +2417,90 @@ msgstr ""
 "^1ERROR: Textuurcompressie is nodig maar niet ondersteund.\n"
 "^1Verwacht grafische problemen.\n"
 
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
 msgid "Arena"
 msgstr "Arena"
 
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
 msgid "Assault"
 msgstr "Assault"
 
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
 msgid "Capture The Flag"
 msgstr "Capture The Flag"
 
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
 msgid "Clan Arena"
 msgstr "Clan Arena"
 
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
 msgid "Deathmatch"
 msgstr "Deathmatch"
 
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
 msgid "Domination"
 msgstr "Domination"
 
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
 msgid "Freeze Tag"
 msgstr "Freeze Tag"
 
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
 msgid "Keepaway"
 msgstr "Keepaway"
 
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
 msgid "Key Hunt"
 msgstr "Key Hunt"
 
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
 msgid "Last Man Standing"
 msgstr "Last Man Standing"
 
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
 msgid "Nexball"
 msgstr "Nexball"
 
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
 msgid "Onslaught"
 msgstr "Onslaught"
 
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
 msgid "Race"
 msgstr "Race"
 
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
 msgid "Race CTS"
 msgstr "Race CTS"
 
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
 msgid "Runematch"
 msgstr "Runematch"
 
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
 msgid "Team Deathmatch"
 msgstr "Team Deathmatch"
 
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
 #, c-format
 msgid "@!#%'n Tuba Throwing"
 msgstr "@!#%'n Tuba Smijten"
 
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Achtergrond"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
 msgid "Default"
 msgstr "Standaard"
 
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
 msgid "Use default"
 msgstr "Gebruik standaard"
 
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
 msgid "Team Color:"
 msgstr "Team Kleur:"
 
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
 msgid "Enable panel"
 msgstr "Activeer paneel"
 
@@ -2442,37 +2532,37 @@ msgstr ""
 msgid "Electro"
 msgstr "Electro"
 
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:577
 #, c-format
 msgid "%s could not remember where they put plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:579
 #, c-format
 msgid "%s played with plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:586
 #, c-format
 msgid "%s just noticed %s's blue ball"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:588
 #, c-format
 msgid "%s got in touch with %s's blue ball"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:593
 #, c-format
 msgid "%s felt the electrifying air of %s's combo"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:595
 #, c-format
 msgid "%s got too close to %s's blue beam"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:597
 #, c-format
 msgid "%s was blasted by %s's blue beam"
 msgstr ""
@@ -2525,27 +2615,27 @@ msgstr ""
 msgid "Mortar"
 msgstr "Mortar"
 
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:379
 #, c-format
 msgid "%s tried out his own grenade"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:381
 #, c-format
 msgid "%s detonated"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:387
 #, c-format
 msgid "%s didn't see %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:389
 #, c-format
 msgid "%s almost dodged %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:391
 #, c-format
 msgid "%s ate %s's grenade"
 msgstr ""
@@ -2554,17 +2644,17 @@ msgstr ""
 msgid "Hagar"
 msgstr "Hagar"
 
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655
 #, c-format
 msgid "%s played with tiny rockets"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:386
 #, c-format
 msgid "%s hoped %s's missiles wouldn't bounce"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661
 #, c-format
 msgid "%s was pummeled by %s"
 msgstr ""
@@ -2582,9 +2672,7 @@ msgstr ""
 msgid "Grappling Hook"
 msgstr "Grappling Hook"
 
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
 #, c-format
 msgid "%s did the impossible"
 msgstr ""
@@ -2598,17 +2686,17 @@ msgstr ""
 msgid "Laser"
 msgstr "Laser"
 
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
 #, c-format
 msgid "%s lasered themself to hell"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
 #, c-format
 msgid "%s was cut in half by %s's gauntlet"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
 #, c-format
 msgid "%s was lasered to death by %s"
 msgstr ""
@@ -2617,22 +2705,22 @@ msgstr ""
 msgid "Mine Layer"
 msgstr "Mine Layer"
 
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
 #, c-format
 msgid "%s exploded"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
 #, c-format
 msgid "%s got too close to %s's mine"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
 #, c-format
 msgid "%s almost dodged %s's mine"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
 #, c-format
 msgid "%s stepped on %s's mine"
 msgstr ""
@@ -2641,7 +2729,13 @@ msgstr ""
 msgid "MinstaNex"
 msgstr "MinstaNex"
 
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:290 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:209 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:255
 #, c-format
 msgid "%s has been vaporized by %s"
 msgstr ""
@@ -2659,85 +2753,85 @@ msgstr "Port-O-Launch"
 msgid "%s felt %s doing the impossible to him"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
-msgstr "Rocket Launcher"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rifle.qc:233
 #, c-format
-msgid "%s got too close to %s's rocket"
+msgid "%s shot themself automatically"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rifle.qc:235
 #, c-format
-msgid "%s almost dodged %s's rocket"
+msgid "%s sniped themself somehow"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rifle.qc:242
 #, c-format
-msgid "%s ate %s's rocket"
+msgid "%s failed to hide from %s's bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_seeker.qc:2
-msgid "T.A.G. Seeker"
-msgstr "T.A.G. Seeker"
-
-#: qcsrc/server/w_seeker.qc:659
+#: qcsrc/server/w_rifle.qc:244
 #, c-format
-msgid "%s was tagged by %s"
+msgid "%s died in %s's bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:2
-msgid "Shotgun"
-msgstr "Shotgun"
-
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_rifle.qc:251
 #, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgid "%s failed to hide from %s's rifle"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_rifle.qc:256
 #, c-format
-msgid "%s was gunned by %s"
+msgid "%s got hit in the head by %s"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_sniperrifle.qc:229
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
 #, c-format
-msgid "%s shot themself automatically"
+msgid "%s was sniped by %s"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:231
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
+
+#: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
-msgid "%s sniped themself somehow"
+msgid "%s got too close to %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:238
+#: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
-msgid "%s failed to hide from %s's bullet hail"
+msgid "%s almost dodged %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:240
+#: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
-msgid "%s died in %s's bullet hail"
+msgid "%s ate %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:247
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr "T.A.G. Seeker"
+
+#: qcsrc/server/w_seeker.qc:659
 #, c-format
-msgid "%s failed to hide from %s's rifle"
+msgid "%s was tagged by %s"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:252
+#: qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Shotgun"
+
+#: qcsrc/server/w_shotgun.qc:213
 #, c-format
-msgid "%s got hit in the head by %s"
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:254 qcsrc/server/w_uzi.qc:321
+#: qcsrc/server/w_shotgun.qc:215
 #, c-format
-msgid "%s was sniped by %s"
+msgid "%s was gunned by %s"
 msgstr ""
 
 #: qcsrc/server/w_tuba.qc:2
@@ -2764,6 +2858,21 @@ msgstr "Machine Gun"
 msgid "%s was riddled full of holes by %s"
 msgstr ""
 
+#~ msgid "Speedometer"
+#~ msgstr "Snelheidsmeter"
+
+#~ msgid "qu/s (hidden)"
+#~ msgstr "qu/s (verborgen)"
+
+#~ msgid "Show accelerometer"
+#~ msgstr "Laat versnellingsmeter zien"
+
+#~ msgid "Accelerometer scale:"
+#~ msgstr "Versnellingsmeter schaal"
+
+#~ msgid "Sniper Rifle"
+#~ msgstr "Sniper Rifle"
+
 #~ msgid "Waypoint settings:"
 #~ msgstr "Wegwijzer instellingen"
 
index 25b8d1942189fceb5ffaf2b35894f78ad8d3a3ca..b0f0571090c6812f1ea36c7b6178fa043b087987 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-08-21 14:00+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,285 +17,499 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: qcsrc/menu/menu.qc:29
-#, c-format
-msgid "^4MQC Build information: ^1%s\n"
-msgstr ""
-
-#: qcsrc/menu/item/slider.c:64
-#, c-format
-msgid "%d (%s)"
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
+msgid "Engine Info Panel"
 msgstr ""
 
-#: qcsrc/menu/item/label.c:63
-#, c-format
-msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
+msgid "Engine info:"
 msgstr ""
 
-#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31
-msgid "custom"
+#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
+msgid "Use an averaging algorithm for fps"
 msgstr ""
 
-#: qcsrc/menu/item/gecko.c:49
-msgid "Browser not initialized!"
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:4
+msgid "Singleplayer"
 msgstr ""
 
-#: qcsrc/menu/item/listbox.c:300
-#, c-format
-msgid "Item %d"
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
+msgid "Instant action! (random map with bots)"
 msgstr ""
 
-#: qcsrc/menu/gamecommand.qc:47
-#, c-format
-msgid "error: status is %d\n"
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
+#: qcsrc/menu/xonotic/campaign.c:284
+msgid "???"
 msgstr ""
 
-#: qcsrc/menu/gamecommand.qc:65
-msgid "Usage: menu_cmd command..., where possible commands are:\n"
+#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
+msgid "Start Singleplayer!"
 msgstr ""
 
-#: qcsrc/menu/gamecommand.qc:66
-msgid "  sync - reloads all cvars on the current menu page\n"
+#: qcsrc/menu/xonotic/util.qc:270
+#, c-format
+msgid "Received HTTP request data for an invalid id %d.\n"
 msgstr ""
 
-#: qcsrc/menu/gamecommand.qc:67
-msgid "  directmenu ITEM - select a menu item as main item\n"
+#: qcsrc/menu/xonotic/util.qc:285
+#, c-format
+msgid "error receiving update notification: status is %d\n"
 msgstr ""
 
-#: qcsrc/menu/gamecommand.qc:193
-msgid "error creating curl handle\n"
+#: qcsrc/menu/xonotic/util.qc:290
+msgid "error: received HTML instead of an update notification\n"
 msgstr ""
 
-#: qcsrc/menu/gamecommand.qc:239
-msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
+#: qcsrc/menu/xonotic/util.qc:295
+msgid "error: received carriage returns from update notification server\n"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:4
-#: qcsrc/menu/xonotic/dialog_settings.c:19
-msgid "Video"
+#: qcsrc/menu/xonotic/util.qc:316
+#, c-format
+msgid ""
+"Update can be downloaded at:\n"
+"%s\n"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:26
-msgid "Resolution:"
+#: qcsrc/menu/xonotic/util.qc:337
+msgid "Autogenerating mapinfo for newly added maps..."
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:29
-msgid "Font/UI size:"
+#: qcsrc/menu/xonotic/util.qc:367
+#, c-format
+msgid "^1%s TEST BUILD"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:31
-msgid "SZ^Unreadable"
+#: qcsrc/menu/xonotic/util.qc:432
+#, c-format
+msgid "Update to %s now!"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:32
-msgid "SZ^Tiny"
+#: qcsrc/menu/xonotic/util.qc:501
+msgid ""
+"^1ERROR: Texture compression is required but not supported.\n"
+"^1Expect visual problems.\n"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:33
-msgid "SZ^Little"
+#: qcsrc/menu/xonotic/util.qc:523
+msgid "Arena"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:34
-msgid "SZ^Small"
+#: qcsrc/menu/xonotic/util.qc:524
+msgid "Assault"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:35
-msgid "SZ^Medium"
+#: qcsrc/menu/xonotic/util.qc:525
+msgid "Capture The Flag"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:36
-msgid "SZ^Large"
+#: qcsrc/menu/xonotic/util.qc:526
+msgid "Clan Arena"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:37
-msgid "SZ^Huge"
+#: qcsrc/menu/xonotic/util.qc:527
+msgid "Deathmatch"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:38
-msgid "SZ^Gigantic"
+#: qcsrc/menu/xonotic/util.qc:528
+msgid "Domination"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:39
-msgid "SZ^Colossal"
+#: qcsrc/menu/xonotic/util.qc:529
+msgid "Freeze Tag"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:42
-msgid "Color depth:"
+#: qcsrc/menu/xonotic/util.qc:530
+msgid "Keepaway"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:45
-msgid "Full screen"
+#: qcsrc/menu/xonotic/util.qc:531
+msgid "Key Hunt"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:46
-msgid "Vertical Synchronization"
+#: qcsrc/menu/xonotic/util.qc:532
+msgid "Last Man Standing"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:49
-msgid "Use OpenGL 2.0 shaders (GLSL)"
+#: qcsrc/menu/xonotic/util.qc:533
+msgid "Nexball"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:52
-msgid "Use GLSL to handle color control"
+#: qcsrc/menu/xonotic/util.qc:534
+msgid "Onslaught"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:56
-msgid "Vertex Buffer Objects (VBOs)"
+#: qcsrc/menu/xonotic/util.qc:535
+msgid "Race"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:59
-msgid "VBO^Off"
+#: qcsrc/menu/xonotic/util.qc:536
+msgid "Race CTS"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:60
-msgid "Vertices, some Tris (compatible)"
+#: qcsrc/menu/xonotic/util.qc:537
+msgid "Runematch"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:63
-msgid "Vertices"
+#: qcsrc/menu/xonotic/util.qc:538
+msgid "Team Deathmatch"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:64
-msgid "Vertices and Triangles"
+#: qcsrc/menu/xonotic/util.qc:557
+#, c-format
+msgid "@!#%'n Tuba Throwing"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:67
-msgid "Depth first:"
+#: qcsrc/menu/xonotic/util.qc:575 qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23
+msgid "Background:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:69
-msgid "DF^Disabled"
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
+msgid "Default"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:70
-msgid "DF^World"
+#: qcsrc/menu/xonotic/util.qc:578 qcsrc/menu/xonotic/util.qc:594
+#: qcsrc/menu/xonotic/util.qc:611 qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91
+msgid "Disable"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:71
-msgid "DF^All"
+#: qcsrc/menu/xonotic/util.qc:583 qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77
+msgid "Color:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:75
-msgid "Disable multithreaded OpenGL"
+#: qcsrc/menu/xonotic/util.qc:588
+msgid "Use default"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:77
-msgid "Wait for GPU to finish each frame"
+#: qcsrc/menu/xonotic/util.qc:591 qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35
+msgid "Border size:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:80
-msgid "Brightness:"
+#: qcsrc/menu/xonotic/util.qc:600 qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
+msgid "Alpha:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:83
-msgid "Contrast:"
+#: qcsrc/menu/xonotic/util.qc:608
+msgid "Team Color:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:86
-msgid "Gamma:"
+#: qcsrc/menu/xonotic/util.qc:617 qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58
+msgid "Test team color in configure mode"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
-msgid "Contrast boost:"
+#: qcsrc/menu/xonotic/util.qc:620 qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61
+msgid "Padding:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
-msgid "Saturation:"
+#: qcsrc/menu/xonotic/dialog_news.c:4
+msgid "News"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
-msgid "LIT^Ambient:"
+#: qcsrc/menu/xonotic/dialog_news.c:18
+msgid "http://www.xonotic.org/team/blog/"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
-msgid "Intensity:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
+msgid "Weapons Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
-msgid "Apply immediately"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
+msgid "Fade out after:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
-msgid "Panel HUD Setup"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36
+msgid "Never"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
-msgid "Panel background defaults:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28
+#, c-format
+msgid "%ds"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
-msgid "Disable"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
+msgid "Fade effect:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
-msgid "Color:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+msgid "EF^None"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
-msgid "Border size:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
+msgid "Slide"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:32
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
-msgid "Alpha:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
+msgid "Alpha"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
-msgid "Team color:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
-msgid "Test team color in configure mode"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
+msgid "Weapon icons:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
-msgid "Padding:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+msgid "Show weapon ID as:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
-msgid "HUD Dock:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+msgid "SHOWAS^None"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
-msgid "DOCK^Disabled"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
+msgid "Number"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
-msgid "DOCK^Small"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
+msgid "Bind"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
-msgid "DOCK^Medium"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
+msgid "Show Accuracy"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
-msgid "DOCK^Large"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
+msgid "Show Ammo"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
-msgid "Grid settings:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
+msgid "Ammo bar color:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99
-msgid "Snap panels to grid"
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
+msgid "Ammo bar alpha:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102
-msgid "Grid size:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
+msgid "Server Information"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
+msgid "N/A"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
+#, c-format
+msgid "%d/%d, %d free player slots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+msgid "Official settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
+#, c-format
+msgid "%d modified settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
+msgid "N/A (can't connect)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
+msgid "not supported (can't connect)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
+msgid "not supported (won't encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
+msgid "supported (will encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
+msgid "supported (won't encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
+msgid "requested (will encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
+msgid "requested (won't encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
+msgid "required (can't connect)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
+msgid "required (will encrypt)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
+msgid "Players:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
+msgid "Type:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
+msgid "Map:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
+msgid "Gameplay:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
+msgid "Bots:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279
+msgid "Mod:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
+msgid "Version:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289
+msgid "Ping:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
+msgid "CA:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
+msgid "Key:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
+msgid "Encryption:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
+msgid "Close"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:72
+msgid "Join!"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
+msgid "Weapon settings"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
+msgid "Weapon priority list:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
+msgid "Up"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
+msgid "Down"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
+msgid "Use priority list for weapon cycling"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
+msgid "Auto switch weapons on pickup"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
+msgid "Draw 1st person weapon model"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+msgid "Left align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+msgid "Center"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+msgid "Right align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+msgid "Flip view horizontally"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
+#: qcsrc/menu/xonotic/dialog_credits.c:21
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
+msgid "OK"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:4
+msgid "Panel HUD Setup"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:21
+msgid "Panel background defaults:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:50
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:89
+msgid "Team color:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:68
+msgid "HUD Dock:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:70
+msgid "DOCK^Disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:71
+msgid "DOCK^Small"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:72
+msgid "DOCK^Medium"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:73
+msgid "DOCK^Large"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:96
+msgid "Grid settings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:99
+msgid "Snap panels to grid"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:102
+msgid "Grid size:"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:103
@@ -310,766 +524,918 @@ msgstr ""
 msgid "Exit setup"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
-msgid "Vote Panel"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
+msgid "Map Information"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
-msgid "Alpha after voting:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "Full item placement"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
-msgid "Mod Icons Panel"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
+msgid "MinstaGib only"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
-msgid "Info Messages Panel"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
+msgid "Title:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
-msgid "Info messages:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
+msgid "Author:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
-msgid "Flip align"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
+msgid "Features:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
-msgid "Waypoints"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
+msgid "Game types:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
-msgid "Show base waypoints"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+msgid "MAP^Play"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
-msgid "Waypoint scale:"
+#: qcsrc/menu/xonotic/campaign.c:285
+#, c-format
+msgid "Level %d: %s"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
-msgid "Waypoint alpha:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4
+msgid "Health/Armor Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
-msgid "Show names:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22
+msgid "Enable status bar"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:36
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:26
-msgid "Never"
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24
+msgid "Status bar alignment:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
-msgid "Teammates"
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
+msgid "Left"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
-msgid "All players"
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
+msgid "Right"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_credits.c:21
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
-#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
-msgid "OK"
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42
+msgid "Inward"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43
+msgid "Outward"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37
+msgid "Icon alignment:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
+msgid "Flip health and armor positions"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
+msgid "Demo"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
+msgid "Record demos while playing"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
+msgid "Filter:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29
+#: qcsrc/menu/xonotic/dialog_settings_input.c:41
+msgid "Clear"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
+msgid "Timedemo"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+msgid "DEMO^Play"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4
+msgid "Pressed Keys Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+msgid "Panel disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
+msgid "Panel enabled when spectating"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
+msgid "Forced aspect:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:5
+msgid "Team Selection"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:41
+msgid "join 'best' team (auto-select)"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:45
+msgid "red"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:46
+msgid "blue"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:47
+msgid "yellow"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:48
+msgid "pink"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_teamselect.c:51
+msgid "spectate"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
+msgid "Mutators"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
+msgid "All Weapons Arena"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35
+msgid "Most Weapons Arena"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56
+#, c-format
+msgid "%s Arena"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
+msgid "Dodging"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
+msgid "MinstaGib"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
+msgid "NIX"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
+msgid "Rocket Flying"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
+msgid "No start weapons"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189
+msgid "Low gravity"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
+msgid "Cloaked"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
+msgid "Hook"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
+msgid "Midair"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
+msgid "Vampire"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_credits.c:5
-msgid "Credits"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
+msgid "Piñata"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
-msgid "Advanced settings"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
+msgid "Weapons stay"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
-msgid "Cvar filter:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180
+msgid "Blood loss"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:24
-#: qcsrc/menu/xonotic/dialog_settings_input.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:29
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:33
-msgid "Clear"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
+msgid "Jet pack"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
-msgid "Setting:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
+msgid "MUT^None"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:38
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:254
-msgid "Type:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
+msgid "Gameplay mutators:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
-msgid "Value:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
+msgid "Weapon & item mutators:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
-msgid "Description:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
+msgid "Grappling hook"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:4
-msgid "Pressed Keys Panel"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
+msgid "Weapon arenas:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
+msgid "Regular (no arena)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
-msgid "Panel enabled when spectating"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
+msgid "with laser"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
-msgid "Panel always enabled"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
+msgid "Special arenas:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
-msgid "Forced aspect:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
+msgid "Most weapons"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_teamselect.c:5
-msgid "Team Selection"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
+msgid "Advanced server settings"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_teamselect.c:41
-msgid "join 'best' team (auto-select)"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
+msgid "Game settings:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_teamselect.c:45
-msgid "red"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
+msgid "Allow spectating"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_teamselect.c:46
-msgid "blue"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
+msgid "Spawn shield:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_teamselect.c:47
-msgid "yellow"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
+msgid "Game speed:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_teamselect.c:48
-msgid "pink"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
+msgid "Teamplay settings:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_teamselect.c:51
-msgid "spectate"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
+msgid "Friendly fire scale:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/slider_resolution.c:65
-#, c-format
-msgid "%dx%d"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
+msgid "Virtual friendly fire (effect only)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings.c:4
-msgid "Settings"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
+msgid "Friendly fire penalty:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings.c:18
-#: qcsrc/menu/xonotic/dialog_settings_input.c:4
-msgid "Input"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
+msgid "Virtual penalty (effect only)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings.c:20
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:4
-msgid "Effects"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
+msgid "Teams:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings.c:21
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:4
-msgid "Audio"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
+msgid "Map voting:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings.c:22
-#: qcsrc/menu/xonotic/dialog_settings_network.c:4
-msgid "Network"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
+msgid "No voting"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings.c:23
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:4
-msgid "Misc"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69
+msgid "2 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_firstrun.c:4
-msgid "Welcome"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70
+msgid "3 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_firstrun.c:33
-msgid ""
-"Welcome to Xonotic, please select your language preference and enter your "
-"player name to get started.  You can change these options later through the "
-"menu system."
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71
+msgid "4 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_firstrun.c:38
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
-msgid "Text language:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72
+msgid "5 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_firstrun.c:47
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
-msgid "Name:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73
+msgid "6 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_firstrun.c:69
-msgid "Save settings"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74
+msgid "7 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/campaign.c:284
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:66
-msgid "???"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75
+msgid "8 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/campaign.c:285
-#, c-format
-msgid "Level %d: %s"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76
+msgid "9 choices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:26
-msgid "Key bindings:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79
+msgid "Simple majority wins vcall"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:31
-msgid "Change key..."
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
+msgid "Chat Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:35
-msgid "Edit..."
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22
+msgid "Chat entries:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:46
-msgid "Sensitivity:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25
+msgid "Chat size:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
-msgid "UI mouse speed:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29
+msgid "Chat lifetime:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
-msgid "Mouse filter"
+#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33
+msgid "Chat beep sound"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
-msgid "Invert mouse"
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
+msgid "Ammo Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
-msgid "Use joystick input"
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
+msgid "Ammunition display:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
-msgid "Turn off OS mouse acceleration"
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25
+msgid "Show only current ammo type"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
-msgid "\"enter console\" also closes"
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:4
-msgid "Weapons Panel"
+#: qcsrc/menu/xonotic/dialog_settings.c:4
+msgid "Settings"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:24
-msgid "Fade out after:"
+#: qcsrc/menu/xonotic/dialog_settings.c:18
+#: qcsrc/menu/xonotic/dialog_settings_input.c:4
+msgid "Input"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:28
-#, c-format
-msgid "%ds"
+#: qcsrc/menu/xonotic/dialog_settings.c:19
+#: qcsrc/menu/xonotic/dialog_settings_video.c:4
+msgid "Video"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:32
-msgid "Fade effect:"
+#: qcsrc/menu/xonotic/dialog_settings.c:20
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:4
+msgid "Effects"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
-msgid "EF^None"
+#: qcsrc/menu/xonotic/dialog_settings.c:21
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:4
+msgid "Audio"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
-msgid "Slide"
+#: qcsrc/menu/xonotic/dialog_settings.c:22
+#: qcsrc/menu/xonotic/dialog_settings_network.c:4
+msgid "Network"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:37
-msgid "Alpha"
+#: qcsrc/menu/xonotic/dialog_settings.c:23
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:4
+msgid "Misc"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
-msgid "Weapon icons:"
+#: qcsrc/menu/xonotic/playermodel.c:174
+msgid "<no model found>"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
-msgid "Show weapon ID as:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
+msgid "Score Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
-msgid "SHOWAS^None"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
-msgid "Number"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
-msgid "Bind"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
-msgid "Show Accuracy"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
-msgid "Show Ammo"
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
-msgid "Ammo bar color:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_modicons.c:4
+msgid "Mod Icons Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
-msgid "Ammo bar alpha:"
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:5
+msgid "Advanced settings"
 msgstr ""
 
-#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
-msgid "Do not press this button again!"
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:23
+msgid "Cvar filter:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:4
-msgid "Engine Info Panel"
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:34
+msgid "Setting:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:22
-msgid "Engine info:"
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:42
+msgid "Value:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_engineinfo.c:25
-msgid "Use an averaging algorithm for fps"
+#: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:56
+msgid "Description:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_quit.c:4
-msgid "Quit"
+#: qcsrc/menu/xonotic/slider_decibels.c:50
+msgid "VOL^OFF"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_quit.c:17
-msgid "Are you sure you want to quit?"
+#: qcsrc/menu/xonotic/slider_decibels.c:52
+msgid "VOL^MAX"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_quit.c:20
-msgid "Yes"
+#: qcsrc/menu/xonotic/slider_decibels.c:53
+#, c-format
+msgid "%s dB"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_quit.c:21
-msgid "No"
+#: qcsrc/menu/xonotic/mainwindow.c:35 qcsrc/menu/xonotic/mainwindow.c:38
+msgid "Do not press this button again!"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
-msgid "Join"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:26
+msgid "Resolution:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:28
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:32
-msgid "Filter:"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:29
+msgid "Font/UI size:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
-msgid "SRVS^Empty"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:31
+msgid "SZ^Unreadable"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
-msgid "SRVS^Full"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:32
+msgid "SZ^Tiny"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
-msgid "Pause"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:33
+msgid "SZ^Little"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
-msgid "Address:"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:34
+msgid "SZ^Small"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:67
-msgid "Info..."
+#: qcsrc/menu/xonotic/dialog_settings_video.c:35
+msgid "SZ^Medium"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:72
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:317
-msgid "Join!"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:36
+msgid "SZ^Large"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4
-msgid "Notification Panel"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:37
+msgid "SZ^Huge"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22
-msgid "Notifications:"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:38
+msgid "SZ^Gigantic"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
-msgid "Also print notifications to the console"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:39
+msgid "SZ^Colossal"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
-msgid "Flip notify order"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:42
+msgid "Color depth:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
-msgid "Entry lifetime:"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:45
+msgid "Full screen"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
-msgid "Entry fadetime:"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:46
+msgid "Vertical Synchronization"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qh:49
-msgid "Enable panel"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:49
+msgid "Use OpenGL 2.0 shaders (GLSL)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:26
-msgid "Menu skins:"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:52
+msgid "Use GLSL to handle color control"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
-msgid "Show current time"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:56
+msgid "Vertex Buffer Objects (VBOs)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:49
-msgid "Show current date"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:59
+msgid "VBO^Off"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:51
-msgid "Show frames per second"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:60
+msgid "Vertices, some Tris (compatible)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:63
+msgid "Vertices"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:64
+msgid "Vertices and Triangles"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:67
+msgid "Depth first:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:69
+msgid "DF^Disabled"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:70
+msgid "DF^World"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:71
+msgid "DF^All"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:75
+msgid "Disable multithreaded OpenGL"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:77
+msgid "Wait for GPU to finish each frame"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:80
+msgid "Brightness:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
-msgid "Minimize input latency"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:83
+msgid "Contrast:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-msgid "Advanced settings..."
+#: qcsrc/menu/xonotic/dialog_settings_video.c:86
+msgid "Gamma:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:4
-msgid "Singleplayer"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
+msgid "Contrast boost:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:59
-msgid "Instant action! (random map with bots)"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
+msgid "Saturation:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_singleplayer.c:80
-msgid "Start Singleplayer!"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
+msgid "LIT^Ambient:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/skinlist.c:105
-msgid "<TITLE>"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+msgid "Intensity:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/skinlist.c:106
-msgid "<AUTHOR>"
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:30
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:41
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+msgid "Apply immediately"
 msgstr ""
 
-#: qcsrc/menu/xonotic/skinlist.c:163
-#, c-format
-msgid "%s: %s"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
+msgid "Join"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_news.c:4
-msgid "News"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:36
+msgid "SRVS^Empty"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_news.c:18
-msgid "http://www.xonotic.org/team/blog/"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:40
+msgid "SRVS^Full"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:5
-msgid "Server Information"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:44
+msgid "Pause"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:115
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:116
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:183
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:189
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:199
-msgid "N/A"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:56
+msgid "Address:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:158
-#, c-format
-msgid "%d/%d, %d free player slots"
+#: qcsrc/menu/xonotic/dialog_multiplayer_join.c:67
+msgid "Info..."
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
-msgid "Official settings"
+#: qcsrc/menu/xonotic/dialog_credits.c:5
+msgid "Credits"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:172
-#, c-format
-msgid "%d modified settings"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:26
+msgid "Menu skins:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:197
-msgid "N/A (can't connect)"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:35
+#: qcsrc/menu/xonotic/dialog_firstrun.c:38
+msgid "Text language:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:205
-msgid "not supported (can't connect)"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:47
+msgid "Show current time"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:207
-msgid "not supported (won't encrypt)"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:49
+msgid "Show current date"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:211
-msgid "supported (will encrypt)"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:51
+msgid "Show frames per second"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:213
-msgid "supported (won't encrypt)"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:53
+msgid "Minimize input latency"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:217
-msgid "requested (will encrypt)"
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+msgid "Advanced settings..."
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:219
-msgid "requested (won't encrypt)"
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:4
+msgid "Notification Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:223
-msgid "required (can't connect)"
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:22
+msgid "Notifications:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:225
-msgid "required (will encrypt)"
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:25
+msgid "Also print notifications to the console"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:246
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:269
-msgid "Players:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:28
+msgid "Flip notify order"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:259
-msgid "Map:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:31
+msgid "Entry lifetime:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:264
-msgid "Gameplay:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_notification.c:35
+msgid "Entry fadetime:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:274
-msgid "Bots:"
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
+msgid "User defined key bind"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:279
-msgid "Mod:"
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:39
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:40
+#: qcsrc/menu/xonotic/dialog_firstrun.c:47
+msgid "Name:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:284
-msgid "Version:"
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
+msgid "Command when pressed:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45
+msgid "Command when released:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:289
-msgid "Ping:"
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48
+msgid "Save"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:295
-msgid "CA:"
+#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51
+msgid "Cancel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:301
-msgid "Key:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:4
+msgid "Vote Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:307
-msgid "Encryption:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_vote.c:22
+msgid "Alpha after voting:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
-msgid "Close"
+#: qcsrc/menu/xonotic/util.qh:47
+msgid "Enable panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/slider_decibels.c:50
-msgid "VOL^OFF"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:19
+msgid "Create"
 msgstr ""
 
-#: qcsrc/menu/xonotic/slider_decibels.c:52
-msgid "VOL^MAX"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
+msgid "Game type:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/slider_decibels.c:53
-#, c-format
-msgid "%s dB"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
+msgid "Match settings:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
-msgid "Mutators"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
+msgid "Time limit:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:33
-msgid "All Weapons Arena"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
+msgid "Use map specified default"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:35
-msgid "Most Weapons Arena"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
+msgid "Point limit:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:56
-#, c-format
-msgid "%s Arena"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
+msgid "Player slots:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:68
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:167
-msgid "Dodging"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
+msgid "Number of bots:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:70
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:250
-msgid "MinstaGib"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
+msgid "Bot skill:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:72
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:253
-msgid "NIX"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
+msgid "Botlike"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:74
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:205
-msgid "Rocket Flying"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+msgid "Beginner"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:78
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:264
-msgid "No start weapons"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+msgid "You will win"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:80
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:189
-msgid "Low gravity"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+msgid "You can win"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:82
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:170
-msgid "Cloaked"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+msgid "You might win"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:84
-msgid "Hook"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+msgid "Advanced"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:86
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:173
-msgid "Midair"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+msgid "Expert"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:88
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:176
-msgid "Vampire"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+msgid "Pro"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:90
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:208
-msgid "Piñata"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+msgid "Assassin"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:92
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:211
-msgid "Weapons stay"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+msgid "Unhuman"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:94
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:180
-msgid "Blood loss"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+msgid "Godlike"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:96
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:202
-msgid "Jet pack"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
+msgid "Mutators..."
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:98
-msgid "MUT^None"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
+msgid "Map list:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:164
-msgid "Gameplay mutators:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
+msgid "Select all"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:196
-msgid "Weapon & item mutators:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
+msgid "Select none"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:199
-msgid "Grappling hook"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
+msgid "Start Multiplayer!"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:215
-msgid "Weapon arenas:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
+msgid "Capture limit:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:218
-msgid "Regular (no arena)"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+msgid "Lives:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:239
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:256
-msgid "with laser"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+msgid "Laps:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:247
-msgid "Special arenas:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+msgid "Goals:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:260
-msgid "Most weapons"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
+msgid "Frag limit:"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:4
@@ -1132,180 +1498,171 @@ msgstr ""
 msgid "Never zoomed"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
-msgid "Race Timer Panel"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
-msgid "Chat Panel"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:22
-msgid "Chat entries:"
+#: qcsrc/menu/xonotic/maplist.c:278
+msgid ""
+"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:25
-msgid "Chat size:"
+#: qcsrc/menu/xonotic/maplist.c:286
+#, c-format
+msgid "%s's Xonotic Server"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:29
-msgid "Chat lifetime:"
+#: qcsrc/menu/xonotic/maplist.c:291
+msgid ""
+"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
+"again.\n"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:33
-msgid "Chat beep sound"
+#: qcsrc/menu/xonotic/slider_resolution.c:65
+#, c-format
+msgid "%dx%d"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:5
-#: qcsrc/menu/xonotic/dialog_multiplayer.c:19
-msgid "Create"
+#: qcsrc/menu/xonotic/dialog_quit.c:4
+msgid "Quit"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
-msgid "Game type:"
+#: qcsrc/menu/xonotic/dialog_quit.c:17
+msgid "Are you sure you want to quit?"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
-msgid "Match settings:"
+#: qcsrc/menu/xonotic/dialog_quit.c:20
+msgid "Yes"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
-msgid "Time limit:"
+#: qcsrc/menu/xonotic/dialog_quit.c:21
+msgid "No"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
-msgid "Use map specified default"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:26
+msgid "Key bindings:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
-msgid "Point limit:"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:31
+msgid "Change key..."
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
-msgid "Player slots:"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:35
+msgid "Edit..."
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
-msgid "Number of bots:"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:46
+msgid "Sensitivity:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
-msgid "Bot skill:"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
+msgid "UI mouse speed:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
-msgid "Botlike"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
+msgid "Mouse filter"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
-msgid "Beginner"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
+msgid "Invert mouse"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
-msgid "You will win"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
+msgid "Use joystick input"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
-msgid "You can win"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
+msgid "Turn off OS mouse acceleration"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
-msgid "You might win"
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
+msgid "\"enter console\" also closes"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
-msgid "Advanced"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:26
+msgid "Client-side movement prediction"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
-msgid "Expert"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:30
+msgid "Show netgraph"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
-msgid "Pro"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:33
+msgid "Network speed:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
-msgid "Assassin"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:35
+msgid "56k"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
-msgid "Unhuman"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:36
+msgid "ISDN"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
-msgid "Godlike"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:37
+msgid "Slow ADSL"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
-msgid "Mutators..."
+#: qcsrc/menu/xonotic/dialog_settings_network.c:38
+msgid "Fast ADSL"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
-msgid "Map list:"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:39
+msgid "Broadband"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
-msgid "Select all"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:42
+msgid "Input packets/s:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
-msgid "Select none"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:46
+msgid "HTTP downloads:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
-msgid "Start Multiplayer!"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:49
+msgid "Downloads:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
-msgid "Capture limit:"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:53
+msgid "Speed (kB/s):"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
-msgid "Lives:"
+#: qcsrc/menu/xonotic/dialog_settings_network.c:57
+msgid "Client UDP port:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
-msgid "Laps:"
+#: qcsrc/menu/xonotic/cvarlist.c:85
+msgid "will be saved to config.cfg"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
-msgid "Goals:"
+#: qcsrc/menu/xonotic/cvarlist.c:87
+msgid "will not be saved"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
-msgid "Frag limit:"
+#: qcsrc/menu/xonotic/cvarlist.c:89
+msgid "private"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
-msgid "Winner"
+#: qcsrc/menu/xonotic/cvarlist.c:91
+msgid "engine setting"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:5
-msgid "User defined key bind"
+#: qcsrc/menu/xonotic/cvarlist.c:93
+msgid "read only"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:42
-msgid "Command when pressed:"
+#: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:4
+msgid "Winner"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:45
-msgid "Command when released:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
+msgid "Timer Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:48
-msgid "Save"
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
+msgid "Timer:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input_userbind.c:51
-msgid "Cancel"
+#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25
+msgid "Show elapsed time"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:5
@@ -1442,365 +1799,187 @@ msgstr ""
 msgid "Damage splash:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/cvarlist.c:85
-msgid "will be saved to config.cfg"
-msgstr ""
-
-#: qcsrc/menu/xonotic/cvarlist.c:87
-msgid "will not be saved"
-msgstr ""
-
-#: qcsrc/menu/xonotic/cvarlist.c:89
-msgid "private"
-msgstr ""
-
-#: qcsrc/menu/xonotic/cvarlist.c:91
-msgid "engine setting"
-msgstr ""
-
-#: qcsrc/menu/xonotic/cvarlist.c:93
-msgid "read only"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:4
-msgid "Score Panel"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
-msgid "Timer Panel"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:22
-msgid "Timer:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:25
-msgid "Show elapsed time"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:5
-msgid "Map Information"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
-msgid "Full item placement"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:49
-msgid "MinstaGib only"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:78
-msgid "Title:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:84
-msgid "Author:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:90
-msgid "Features:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:95
-msgid "Game types:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:6
-msgid "Advanced server settings"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:25
-msgid "Game settings:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:28
-msgid "Allow spectating"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:31
-msgid "Spawn shield:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:36
-msgid "Game speed:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:40
-msgid "Teamplay settings:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:43
-msgid "Friendly fire scale:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:47
-msgid "Virtual friendly fire (effect only)"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:50
-msgid "Friendly fire penalty:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:54
-msgid "Virtual penalty (effect only)"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:57
-msgid "Teams:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:66
-msgid "Map voting:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:68
-msgid "No voting"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:69
-msgid "2 choices"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:70
-msgid "3 choices"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:71
-msgid "4 choices"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:72
-msgid "5 choices"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:73
-msgid "6 choices"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:74
-msgid "7 choices"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:75
-msgid "8 choices"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:76
-msgid "9 choices"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:79
-msgid "Simple majority wins vcall"
-msgstr ""
-
-#: qcsrc/menu/xonotic/util.qc:270
-#, c-format
-msgid "Received HTTP request data for an invalid id %d.\n"
-msgstr ""
-
-#: qcsrc/menu/xonotic/util.qc:285
-#, c-format
-msgid "error receiving update notification: status is %d\n"
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:4
+msgid "Info Messages Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:290
-msgid "error: received HTML instead of an update notification\n"
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:22
+msgid "Info messages:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:295
-msgid "error: received carriage returns from update notification server\n"
+#: qcsrc/menu/xonotic/dialog_hudpanel_infomessages.c:25
+msgid "Flip align"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:316
-#, c-format
-msgid ""
-"Update can be downloaded at:\n"
-"%s\n"
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:4
+msgid "Multiplayer"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:337
-msgid "Autogenerating mapinfo for newly added maps..."
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:18
+msgid "Servers"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:367
-#, c-format
-msgid "^1%s TEST BUILD"
+#: qcsrc/menu/xonotic/dialog_multiplayer.c:20
+msgid "Demos"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:432
-#, c-format
-msgid "Update to %s now!"
+#: qcsrc/menu/xonotic/dialog_hudpanel_racetimer.c:4
+msgid "Race Timer Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:509
-msgid ""
-"^1ERROR: Texture compression is required but not supported.\n"
-"^1Expect visual problems.\n"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:531
-msgid "Arena"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:532
-msgid "Assault"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:533
-msgid "Capture The Flag"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:534
-msgid "Clan Arena"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:535
-msgid "Deathmatch"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:536
-msgid "Domination"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:537
-msgid "Freeze Tag"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:538
-msgid "Keepaway"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:539
-msgid "Key Hunt"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:540
-msgid "Last Man Standing"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:541
-msgid "Nexball"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:542
-msgid "Onslaught"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:543
-msgid "Race"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:544
-msgid "Race CTS"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:545
-msgid "Runematch"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:546
-msgid "Team Deathmatch"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:565
-#, c-format
-msgid "@!#%'n Tuba Throwing"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
-msgid "Default"
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:596
-msgid "Use default"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:5
+msgid "Waypoints"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:616
-msgid "Team Color:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:23
+msgid "Show base waypoints"
 msgstr ""
 
-#: qcsrc/menu/xonotic/playermodel.c:174
-msgid "<no model found>"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:25
+msgid "Waypoint scale:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:4
-msgid "Ammo Panel"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:29
+msgid "Waypoint alpha:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:22
-msgid "Ammunition display:"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:34
+msgid "Show names:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:25
-msgid "Show only current ammo type"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:37
+msgid "Teammates"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:40
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
-msgid "Left"
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:38
+msgid "All players"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:41
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
-msgid "Right"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:6
-msgid "Weapon settings"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:29
-msgid "Weapon priority list:"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+msgid "Fade time:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:34
-msgid "Up"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:37
-msgid "Down"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+msgid "Text alignment:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:41
-msgid "Use priority list for weapon cycling"
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:43
-msgid "Auto switch weapons on pickup"
+#: qcsrc/menu/xonotic/dialog_firstrun.c:4
+msgid "Welcome"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:45
-msgid "Draw 1st person weapon model"
+#: qcsrc/menu/xonotic/dialog_firstrun.c:33
+msgid ""
+"Welcome to Xonotic, please select your language preference and enter your "
+"player name to get started.  You can change these options later through the "
+"menu system."
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
+#: qcsrc/menu/xonotic/dialog_firstrun.c:69
+msgid "Save settings"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
+msgid "Powerups Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
-msgid "Flip view horizontally"
+#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
+msgid "Flip strength and shield positions"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:38
@@ -1942,157 +2121,122 @@ msgstr ""
 msgid "Decals"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
 msgid "Distance:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
 msgid "Time:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
 msgid "Use lightmaps"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
 msgid "Deluxe mapping"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
 msgid "Gloss"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
 msgid "Offset mapping"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
 msgid "Relief mapping"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
 msgid "Reflections:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
 msgid "Blurred"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
 msgid "REFL^Good"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
 msgid "Sharp"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
 msgid "Show surfaces"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
 msgid "No dynamic lighting"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
 msgid "Flash blend approximation"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
 msgid "Realtime dynamic lighting"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
 msgid "Shadows"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
 msgid "Realtime world lighting"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
 msgid "Use normal maps"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
 msgid "Soft shadows"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
 msgid "Coronas"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
 msgid "Use Occlusion Queries"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
 msgid "Bloom"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
 msgid "High Dynamic Range (HDR)"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
 msgid "Motion blur:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:26
-msgid "Client-side movement prediction"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:30
-msgid "Show netgraph"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:33
-msgid "Network speed:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:35
-msgid "56k"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:36
-msgid "ISDN"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:37
-msgid "Slow ADSL"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:38
-msgid "Fast ADSL"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:39
-msgid "Broadband"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:42
-msgid "Input packets/s:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_network.c:46
-msgid "HTTP downloads:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:49
-msgid "Downloads:"
+#: qcsrc/menu/xonotic/skinlist.c:105
+msgid "<TITLE>"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:53
-msgid "Speed (kB/s):"
+#: qcsrc/menu/xonotic/skinlist.c:106
+msgid "<AUTHOR>"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_network.c:57
-msgid "Client UDP port:"
+#: qcsrc/menu/xonotic/skinlist.c:163
+#, c-format
+msgid "%s: %s"
 msgstr ""
 
 #: qcsrc/menu/xonotic/serverlist.c:185
@@ -2123,71 +2267,6 @@ msgstr ""
 msgid "Players"
 msgstr ""
 
-#: qcsrc/menu/xonotic/maplist.c:278
-msgid ""
-"Huh? Can't play this (m is NULL). Refiltering so this won't happen again.\n"
-msgstr ""
-
-#: qcsrc/menu/xonotic/maplist.c:286
-#, c-format
-msgid "%s's Xonotic Server"
-msgstr ""
-
-#: qcsrc/menu/xonotic/maplist.c:291
-msgid ""
-"Huh? Can't play this (invalid game type). Refiltering so this won't happen "
-"again.\n"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:4
-msgid "Demo"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:28
-msgid "Record demos while playing"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:43
-msgid "Timedemo"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
-msgid "Powerups Panel"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:22
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:22
-msgid "Enable status bar"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:24
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:24
-msgid "Status bar alignment:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:32
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:42
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:32
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:42
-msgid "Inward"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:34
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:43
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:34
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:43
-msgid "Outward"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:37
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:37
-msgid "Icon alignment:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:45
-msgid "Flip strength and shield positions"
-msgstr ""
-
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:27
 msgid "Master:"
 msgstr ""
@@ -2196,7 +2275,7 @@ msgstr ""
 msgid "Music:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
 msgid "VOL^Ambient:"
 msgstr ""
 
@@ -2204,303 +2283,283 @@ msgstr ""
 msgid "Info:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
 msgid "Items:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
 msgid "Pain:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
 msgid "Player:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
 msgid "Shots:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
 msgid "Voice:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
 msgid "Weapons:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
 msgid "Frequency:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
 msgid "8 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
 msgid "11.025 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
 msgid "16 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
 msgid "22.05 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
 msgid "24 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
 msgid "32 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
 msgid "44.1 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
 msgid "48 kHz"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
 msgid "Channels:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
 msgid "Mono"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
 msgid "Stereo"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
 msgid "2.1"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
 msgid "4"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
 msgid "5"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
 msgid "5.1"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
 msgid "6.1"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
 msgid "7.1"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
 msgid "Swap Stereo"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
 msgid "Headphone friendly mode"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
 msgid "Spatial voices:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
 msgid "VOCS^None"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
 msgid "VOCS^Taunts"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
 msgid "VOCS^All"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
 msgid "Taunt range:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
 msgid "RNG^Very short"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
 msgid "RNG^Short"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
 msgid "RNG^Normal"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
 msgid "RNG^Long"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
 msgid "RNG^Full"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
 msgid "Automatic taunts"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
 msgid "Time warning:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
 msgid "WRN^None"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
 msgid "1 minute"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
 msgid "5 minutes"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
 msgid "WRN^Both"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
 msgid "Hit indicator"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
 msgid "Menu sounds"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer.c:4
-msgid "Multiplayer"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer.c:18
-msgid "Servers"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_multiplayer.c:20
-msgid "Demos"
+#: qcsrc/menu/gamecommand.qc:47
+#, c-format
+msgid "error: status is %d\n"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:4
-msgid "Health/Armor Panel"
+#: qcsrc/menu/gamecommand.qc:65
+msgid "Usage: menu_cmd command..., where possible commands are:\n"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:45
-msgid "Flip health and armor positions"
+#: qcsrc/menu/gamecommand.qc:66
+msgid "  sync - reloads all cvars on the current menu page\n"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:2
-msgid "Fireball"
+#: qcsrc/menu/gamecommand.qc:67
+msgid "  directmenu ITEM - select a menu item as main item\n"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:417
-#, c-format
-msgid "%s forgot about some firemine"
+#: qcsrc/menu/gamecommand.qc:193
+msgid "error creating curl handle\n"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:419 qcsrc/server/w_hlac.qc:240
-#, c-format
-msgid "%s should have used a smaller gun"
+#: qcsrc/menu/gamecommand.qc:239
+msgid "Invalid command. For a list of supported commands, try menu_cmd help.\n"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:426
+#: qcsrc/menu/menu.qc:29
 #, c-format
-msgid "%s tried to catch %s's firemine"
+msgid "^4MQC Build information: ^1%s\n"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:428
+#: qcsrc/menu/item/listbox.c:300
 #, c-format
-msgid "%s fatefully ignored %s's firemine"
+msgid "Item %d"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:435
-#, c-format
-msgid "%s could not hide from %s's fireball"
+#: qcsrc/menu/item/gecko.c:49
+msgid "Browser not initialized!"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:437
+#: qcsrc/menu/item/label.c:63
 #, c-format
-msgid "%s saw the pretty lights of %s's fireball"
+msgid "NOTE: label text %s too wide for label, condensed by factor %f\n"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:440
+#: qcsrc/menu/item/slider.c:64
 #, c-format
-msgid "%s got too close to %s's fireball"
+msgid "%d (%s)"
 msgstr ""
 
-#: qcsrc/server/w_fireball.qc:442
-#, c-format
-msgid "%s tasted %s's fireball"
+#: qcsrc/menu/item/textslider.c:29 qcsrc/menu/item/textslider.c:31
+msgid "custom"
 msgstr ""
 
-#: qcsrc/server/w_nex.qc:2
-msgid "Nex"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
 msgstr ""
 
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_shotgun.qc:203
-#: qcsrc/server/w_uzi.qc:317 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_porto.qc:296 qcsrc/server/w_hook.qc:266
+#: qcsrc/server/w_rifle.qc:233
 #, c-format
-msgid "%s did the impossible"
+msgid "%s shot themself automatically"
 msgstr ""
 
-#: qcsrc/server/w_nex.qc:269 qcsrc/server/w_minstanex.qc:292
+#: qcsrc/server/w_rifle.qc:235
 #, c-format
-msgid "%s has been vaporized by %s"
-msgstr ""
-
-#: qcsrc/server/w_laser.qc:2
-msgid "Laser"
+msgid "%s sniped themself somehow"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_rifle.qc:242
 #, c-format
-msgid "%s lasered themself to hell"
+msgid "%s failed to hide from %s's bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_rifle.qc:244
 #, c-format
-msgid "%s was cut in half by %s's gauntlet"
+msgid "%s died in %s's bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_rifle.qc:251
 #, c-format
-msgid "%s was lasered to death by %s"
-msgstr ""
-
-#: qcsrc/server/w_shotgun.qc:2
-msgid "Shotgun"
+msgid "%s failed to hide from %s's rifle"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_rifle.qc:256
 #, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgid "%s got hit in the head by %s"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
 #, c-format
-msgid "%s was gunned by %s"
+msgid "%s was sniped by %s"
 msgstr ""
 
 #: qcsrc/server/w_uzi.qc:2
 msgid "Machine Gun"
 msgstr ""
 
-#: qcsrc/server/w_uzi.qc:321 qcsrc/server/w_sniperrifle.qc:254
+#: qcsrc/server/w_uzi.qc:317 qcsrc/server/w_shotgun.qc:215
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
 #, c-format
-msgid "%s was sniped by %s"
+msgid "%s is now thinking with portals"
 msgstr ""
 
 #: qcsrc/server/w_uzi.qc:323
@@ -2508,124 +2567,147 @@ msgstr ""
 msgid "%s was riddled full of holes by %s"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:2
-msgid "Sniper Rifle"
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:229
+#: qcsrc/server/w_rocketlauncher.qc:501 qcsrc/server/w_minelayer.qc:523
 #, c-format
-msgid "%s shot themself automatically"
+msgid "%s exploded"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:231
+#: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
-msgid "%s sniped themself somehow"
+msgid "%s got too close to %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:238
+#: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
-msgid "%s failed to hide from %s's bullet hail"
+msgid "%s almost dodged %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:240
+#: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
-msgid "%s died in %s's bullet hail"
+msgid "%s ate %s's rocket"
+msgstr ""
+
+#: qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:247
+#: qcsrc/server/w_porto.qc:296 qcsrc/server/w_hook.qc:266
 #, c-format
-msgid "%s failed to hide from %s's rifle"
+msgid "%s did the impossible"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:252
+#: qcsrc/server/w_porto.qc:298
 #, c-format
-msgid "%s got hit in the head by %s"
+msgid "%s felt %s doing the impossible to him"
 msgstr ""
 
-#: qcsrc/server/w_minstanex.qc:2
-msgid "MinstaNex"
+#: qcsrc/server/w_hook.qc:2
+msgid "Grappling Hook"
+msgstr ""
+
+#: qcsrc/server/w_hook.qc:268
+#, c-format
+msgid "%s has run into %s's gravity bomb"
 msgstr ""
 
 #: qcsrc/server/w_electro.qc:2
 msgid "Electro"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
 #, c-format
 msgid "%s could not remember where they put plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
 #, c-format
 msgid "%s played with plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
 #, c-format
 msgid "%s just noticed %s's blue ball"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
 #, c-format
 msgid "%s got in touch with %s's blue ball"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
 #, c-format
 msgid "%s felt the electrifying air of %s's combo"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
 #, c-format
 msgid "%s got too close to %s's blue beam"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
 #, c-format
 msgid "%s was blasted by %s's blue beam"
 msgstr ""
 
-#: qcsrc/server/w_tuba.qc:2
+#: qcsrc/server/w_laser.qc:2
+msgid "Laser"
+msgstr ""
+
+#: qcsrc/server/w_laser.qc:311
 #, c-format
-msgid "@!#%'n Tuba"
+msgid "%s lasered themself to hell"
 msgstr ""
 
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_laser.qc:315
 #, c-format
-msgid "%s hurt his own ears with the @!#%%'n Tuba"
+msgid "%s was cut in half by %s's gauntlet"
 msgstr ""
 
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_laser.qc:317
 #, c-format
-msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+msgid "%s was lasered to death by %s"
 msgstr ""
 
-#: qcsrc/server/w_porto.qc:2
-msgid "Port-O-Launch"
+#: qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
 msgstr ""
 
-#: qcsrc/server/w_porto.qc:298
+#: qcsrc/server/w_shotgun.qc:219
 #, c-format
-msgid "%s felt %s doing the impossible to him"
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:2
-msgid "Hagar"
+#: qcsrc/server/w_shotgun.qc:221
+#, c-format
+msgid "%s was gunned by %s"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_tuba.qc:2
 #, c-format
-msgid "%s played with tiny rockets"
+msgid "@!#%'n Tuba"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_tuba.qc:252
 #, c-format
-msgid "%s hoped %s's missiles wouldn't bounce"
+msgid "%s hurt his own ears with the @!#%%'n Tuba"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_tuba.qc:256
 #, c-format
-msgid "%s was pummeled by %s"
+msgid "%s died of %s's great playing on the @!#%%'n Tuba"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:2
+msgid "MinstaNex"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
+#, c-format
+msgid "%s has been vaporized by %s"
 msgstr ""
 
 #: qcsrc/server/w_crylink.qc:2
@@ -2652,56 +2734,66 @@ msgstr ""
 msgid "%s took a close look at %s's Crylink"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
+#: qcsrc/server/w_hlac.qc:2
+msgid "Heavy Laser Assault Cannon"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:500 qcsrc/server/w_minelayer.qc:495
+#: qcsrc/server/w_hlac.qc:240 qcsrc/server/w_fireball.qc:419
 #, c-format
-msgid "%s exploded"
+msgid "%s should have used a smaller gun"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_hlac.qc:242
 #, c-format
-msgid "%s got too close to %s's rocket"
+msgid "%s was cut down by %s"
+msgstr ""
+
+#: qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_grenadelauncher.qc:383
 #, c-format
-msgid "%s almost dodged %s's rocket"
+msgid "%s tried out his own grenade"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_grenadelauncher.qc:385
 #, c-format
-msgid "%s ate %s's rocket"
+msgid "%s detonated"
 msgstr ""
 
-#: qcsrc/server/w_hook.qc:2
-msgid "Grappling Hook"
+#: qcsrc/server/w_grenadelauncher.qc:391
+#, c-format
+msgid "%s didn't see %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_hook.qc:268
+#: qcsrc/server/w_grenadelauncher.qc:393
 #, c-format
-msgid "%s has run into %s's gravity bomb"
+msgid "%s almost dodged %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:2
-msgid "Mine Layer"
+#: qcsrc/server/w_grenadelauncher.qc:395
+#, c-format
+msgid "%s ate %s's grenade"
+msgstr ""
+
+#: qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655
 #, c-format
-msgid "%s got too close to %s's mine"
+msgid "%s played with tiny rockets"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_hagar.qc:386
 #, c-format
-msgid "%s almost dodged %s's mine"
+msgid "%s hoped %s's missiles wouldn't bounce"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661
 #, c-format
-msgid "%s stepped on %s's mine"
+msgid "%s was pummeled by %s"
 msgstr ""
 
 #: qcsrc/server/w_seeker.qc:2
@@ -2713,40 +2805,64 @@ msgstr ""
 msgid "%s was tagged by %s"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:2
-msgid "Mortar"
+#: qcsrc/server/w_fireball.qc:2
+msgid "Fireball"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_fireball.qc:417
 #, c-format
-msgid "%s tried out his own grenade"
+msgid "%s forgot about some firemine"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_fireball.qc:426
 #, c-format
-msgid "%s detonated"
+msgid "%s tried to catch %s's firemine"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_fireball.qc:428
 #, c-format
-msgid "%s didn't see %s's grenade"
+msgid "%s fatefully ignored %s's firemine"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_fireball.qc:435
 #, c-format
-msgid "%s almost dodged %s's grenade"
+msgid "%s could not hide from %s's fireball"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_fireball.qc:437
 #, c-format
-msgid "%s ate %s's grenade"
+msgid "%s saw the pretty lights of %s's fireball"
 msgstr ""
 
-#: qcsrc/server/w_hlac.qc:2
-msgid "Heavy Laser Assault Cannon"
+#: qcsrc/server/w_fireball.qc:440
+#, c-format
+msgid "%s got too close to %s's fireball"
 msgstr ""
 
-#: qcsrc/server/w_hlac.qc:242
+#: qcsrc/server/w_fireball.qc:442
 #, c-format
-msgid "%s was cut down by %s"
+msgid "%s tasted %s's fireball"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:2
+msgid "Mine Layer"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:527
+#, c-format
+msgid "%s got too close to %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:529
+#, c-format
+msgid "%s almost dodged %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_minelayer.qc:531
+#, c-format
+msgid "%s stepped on %s's mine"
+msgstr ""
+
+#: qcsrc/server/w_nex.qc:2
+msgid "Nex"
 msgstr ""
index f1eb38b07e5e40d43d11b92ca46382e11b34975c..53ce1e57c5741591cb39bd8bb54aa3667a745cd2 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Xontoic 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-08-21 14:00+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Ricardo 'Hellgardia' Silva <ricardo.mccs@gmail.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -69,7 +69,7 @@ msgid "custom"
 msgstr "modificado"
 
 #: qcsrc/menu/menu.qc:29
-#, fuzzy, c-format
+#, c-format
 msgid "^4MQC Build information: ^1%s\n"
 msgstr "^4MQC Informação da Build %s\n"
 
@@ -111,7 +111,7 @@ msgstr "Créditos"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
 #: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
 msgid "OK"
@@ -157,7 +157,12 @@ msgstr "Mostrar munições:"
 msgid "Show only current ammo type"
 msgstr "Mostrar apenas o tipo de munição actual"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr "Alinhar icones"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:36
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:28
@@ -166,6 +171,7 @@ msgid "Left"
 msgstr "Esquerda"
 
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:30
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:38
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:30
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:41
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:30
@@ -173,6 +179,35 @@ msgstr "Esquerda"
 msgid "Right"
 msgstr "Direita"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:4
+msgid "Centerprint"
+msgstr "Centro"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:23
+msgid "Message duration:"
+msgstr "Duração da mensagem:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:27
+msgid "Fade time:"
+msgstr "Desaparecimento de cada entrada:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:31
+msgid "Flip messages order"
+msgstr "Trocar ordem de notificações"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:33
+msgid "Text alignment:"
+msgstr "Alinhamento do Texto"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:37
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
+msgid "Center"
+msgstr "Centro"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c:41
+msgid "Font scale:"
+msgstr "Tamanho de letra:"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_chat.c:4
 msgid "Chat Panel"
 msgstr "Painel de Conversa"
@@ -282,6 +317,102 @@ msgstr "Tempo de vida de cada entrada:"
 msgid "Entry fadetime:"
 msgstr "Desaparecimento de cada entrada:"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr "Painel de Física"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:22
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Painel desactivado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+msgid "Panel enabled"
+msgstr "Painel activado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled even observing"
+msgstr "Painel activado quando espectador"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+msgid "Panel enabled only in Race/CTS"
+msgstr "Painel activo apenas em jogos de Corrida/CTS"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr "Barra de estado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Alinhamento à esquerda"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Alinhamento à direita"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr "Para Dentro"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr "Para Fora"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr "Trocar posição da velocidade e aceleração"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
+msgstr "Velocidade:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr "Incluir velocidade vertical"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr "Unidade de velocidade:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "nós"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
+msgstr "Mostrar"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
+msgstr "Velocidade Máxima:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr "Aceleração:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr "Incluir aceleração vertical"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
 msgid "Powerups Panel"
 msgstr "Painel de Powerups"
@@ -294,11 +425,6 @@ msgstr "Trocar posição do escudo e da força"
 msgid "Pressed Keys Panel"
 msgstr "Painel das Teclas Pressionadas"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Painel desactivado"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
 msgid "Panel enabled when spectating"
 msgstr "Painel activado quando espectador"
@@ -332,7 +458,7 @@ msgstr "Radar:"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
 msgid "Alpha:"
 msgstr "Alfa:"
 
@@ -388,6 +514,26 @@ msgstr "Nunca ampliado"
 msgid "Score Panel"
 msgstr "Painel de Pontos"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr "Pontuação:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr "Tabela Classficativa:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr "Desligado"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr "E eu"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr "Puro"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
 msgid "Timer Panel"
 msgstr "Painel Temporizador"
@@ -430,11 +576,11 @@ msgstr "%ds"
 msgid "Fade effect:"
 msgstr "Efeito de desaparecimento"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
 msgid "EF^None"
 msgstr "Nenhum"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
 msgid "Slide"
 msgstr "Deslocador"
 
@@ -442,39 +588,43 @@ msgstr "Deslocador"
 msgid "Alpha"
 msgstr "Alfa"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
+msgstr "Ambos"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
 msgid "Weapon icons:"
 msgstr "Icones das armas"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
 msgid "Show weapon ID as:"
 msgstr "Mostra o ID da arma como:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
 msgid "SHOWAS^None"
 msgstr "Nenhum"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
 msgid "Number"
 msgstr "Número"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
 msgid "Bind"
 msgstr "Ligar"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
 msgid "Show Accuracy"
 msgstr "Mostrar Pontaria"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
 msgid "Show Ammo"
 msgstr "Mostrar Munições"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
 msgid "Ammo bar color:"
 msgstr "Cor da barra de munições:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
 msgid "Ammo bar alpha:"
 msgstr "Cor da barra alfa:"
 
@@ -486,20 +636,24 @@ msgstr "Configuração do painel do HUD"
 msgid "Panel background defaults:"
 msgstr "Fundo do painel por defeito:"
 
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Fundo:"
+
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
 msgid "Disable"
 msgstr "Desactivar"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
 msgid "Color:"
 msgstr "Cor:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
 msgid "Border size:"
 msgstr "Tamanho do limite:"
 
@@ -508,11 +662,11 @@ msgstr "Tamanho do limite:"
 msgid "Team color:"
 msgstr "Cor da Equipa:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
 msgid "Test team color in configure mode"
 msgstr "Testa cor da equipa no modo de configuração"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
 msgid "Padding:"
 msgstr "Padding:"
 
@@ -582,131 +736,131 @@ msgstr "Demos"
 msgid "Player Setup"
 msgstr "Configuração do Jogador"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:35
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:34
 msgid "Game type:"
 msgstr "Tipo de jogo:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:47
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:46
 msgid "Match settings:"
 msgstr "Definições de jogo:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:50
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:49
 msgid "Time limit:"
 msgstr "Tempo limite:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:54
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:62
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:61
 msgid "Use map specified default"
 msgstr "Usar definição específica do mapa"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:57
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:56
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:156
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:157
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:162
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:163
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
 msgid "Point limit:"
 msgstr "Limite de pontos:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:65
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:64
 msgid "Player slots:"
 msgstr "Slots para Jogadores:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:68
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:67
 msgid "Number of bots:"
 msgstr "Número de jogadores controlados pelo computador:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:72
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:71
 msgid "Bot skill:"
 msgstr "Nível de dificuldade:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:74
 msgid "Botlike"
 msgstr "Bot"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:75
 msgid "Beginner"
 msgstr "Iniciado"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:76
 msgid "You will win"
 msgstr "Vais ganhar"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:77
 msgid "You can win"
 msgstr "Podes ganhar"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:78
 msgid "You might win"
 msgstr "Talvez ganhes"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:79
 msgid "Advanced"
 msgstr "Avançado"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:80
 msgid "Expert"
 msgstr "Perito"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:81
 msgid "Pro"
 msgstr "Profissional"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:82
 msgid "Assassin"
 msgstr "Assassino"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:83
 msgid "Unhuman"
 msgstr "Desumano"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:85
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:84
 msgid "Godlike"
 msgstr "Divinal"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:89
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:88
 msgid "Mutators..."
 msgstr "Mutators..."
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:97
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
 msgid "Advanced settings..."
 msgstr "Definições avançadas..."
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:105
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:104
 msgid "Map list:"
 msgstr "Lista de mapas:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:111
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:110
 msgid "Select all"
 msgstr "Seleccionar todos"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:114
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:113
 msgid "Select none"
 msgstr "Seleccionar nenhum"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:120
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:119
 msgid "Start Multiplayer!"
 msgstr "Começar Multijogador!"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:155
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:154
 msgid "Capture limit:"
 msgstr "Limite de capturas:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:158
 msgid "Lives:"
 msgstr "Vidas:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:159
 msgid "Laps:"
 msgstr "Voltas:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:161
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:160
 msgid "Goals:"
 msgstr "Golos:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:165
+#: qcsrc/menu/xonotic/dialog_multiplayer_create.c:164
 msgid "Frag limit:"
 msgstr "Limite de Frags:"
 
@@ -826,14 +980,13 @@ msgstr "Características:"
 msgid "Game types:"
 msgstr "Modos de jogo:"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:119
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:118
 #: qcsrc/menu/xonotic/dialog_multiplayer_join_serverinfo.c:314
 msgid "Close"
 msgstr "Fechar"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:122
-#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
-msgid "Play"
+#: qcsrc/menu/xonotic/dialog_multiplayer_create_mapinfo.c:121
+msgid "MAP^Play"
 msgstr "Jogar"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:7
@@ -983,6 +1136,11 @@ msgstr "Limpar"
 msgid "Timedemo"
 msgstr "Demo temporizado"
 
+#: qcsrc/menu/xonotic/dialog_multiplayer_demo.c:46
+#, fuzzy
+msgid "DEMO^Play"
+msgstr "Jogar"
+
 #: qcsrc/menu/xonotic/dialog_multiplayer_join.c:4
 msgid "Join"
 msgstr "Juntar"
@@ -1250,11 +1408,11 @@ msgid "Damage splash:"
 msgstr "Dano Colateral:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:178
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:194
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:30
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
 msgid "Apply immediately"
 msgstr "Aplicar imediatamente"
 
@@ -1314,15 +1472,7 @@ msgstr "Mudar armas automaticamente ao apanhar do chão"
 msgid "Draw 1st person weapon model"
 msgstr "Desenhar modelo da arma na 1a pessoa"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Alinhamento à esquerda"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Alinhamento à direita"
-
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
 msgid "Flip view horizontally"
 msgstr "Trocar vista horizontal"
 
@@ -1392,7 +1542,7 @@ msgstr "Principal:"
 msgid "Music:"
 msgstr "Música:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:40
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:41
 msgid "VOL^Ambient:"
 msgstr "Som Ambiente:"
 
@@ -1400,180 +1550,180 @@ msgstr "Som Ambiente:"
 msgid "Info:"
 msgstr "Informação:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:57
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:55
 msgid "Items:"
 msgstr "Items:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:65
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:62
 msgid "Pain:"
 msgstr "Dor:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:73
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:69
 msgid "Player:"
 msgstr "Jogador:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:81
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:76
 msgid "Shots:"
 msgstr "Tiros:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:88
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:83
 msgid "Voice:"
 msgstr "Voz:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:96
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:91
 msgid "Weapons:"
 msgstr "Armas:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:161
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:98
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
 msgid "Frequency:"
 msgstr "Frequência:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:100
 msgid "8 kHz"
 msgstr "8 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:101
 msgid "11.025 kHz"
 msgstr "11.025 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:102
 msgid "16 kHz"
 msgstr "16 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:108
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:103
 msgid "22.05 kHz"
 msgstr "22.05 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:109
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:104
 msgid "24 kHz"
 msgstr "24 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:105
 msgid "32 kHz"
 msgstr "32 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:111
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:106
 msgid "44.1 kHz"
 msgstr "44.1 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:107
 msgid "48 kHz"
 msgstr "48 kHz"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:110
 msgid "Channels:"
 msgstr "Canais:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:112
 msgid "Mono"
 msgstr "Mono"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:113
 msgid "Stereo"
 msgstr "Stereo"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:114
 msgid "2.1"
 msgstr "2.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:120
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:115
 msgid "4"
 msgstr "4"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:121
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:116
 msgid "5"
 msgstr "5"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:122
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:117
 msgid "5.1"
 msgstr "5.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:118
 msgid "6.1"
 msgstr "6.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:124
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:119
 msgid "7.1"
 msgstr "7.1"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:128
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:123
 msgid "Swap Stereo"
 msgstr "Trocar Stereo"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:127
 msgid "Headphone friendly mode"
 msgstr "Modo de Headphones"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:136
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:131
 msgid "Spatial voices:"
 msgstr "Vozes espaciais:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:132
 msgid "VOCS^None"
 msgstr "Nenhum"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:138
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:133
 msgid "VOCS^Taunts"
 msgstr "Taunts"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:139
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:134
 msgid "VOCS^All"
 msgstr "Todos"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:137
 msgid "Taunt range:"
 msgstr "Nível dos taunts:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:145
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:140
 msgid "RNG^Very short"
 msgstr "Muito baixo"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:146
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:141
 msgid "RNG^Short"
 msgstr "Baixo"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:147
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:142
 msgid "RNG^Normal"
 msgstr "Normal"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:148
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:143
 msgid "RNG^Long"
 msgstr "Alto"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:149
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:144
 msgid "RNG^Full"
 msgstr "Total"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:156
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:151
 msgid "Automatic taunts"
 msgstr "Taunts Automáticos"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:160
 msgid "Time warning:"
 msgstr "Aviso de tempo:"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:167
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:162
 msgid "WRN^None"
 msgstr "Nenhum"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:163
 msgid "1 minute"
 msgstr "1 minuto"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:169
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:164
 msgid "5 minutes"
 msgstr "5 minutos"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:165
 msgid "WRN^Both"
 msgstr "Ambos"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:173
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:168
 msgid "Hit indicator"
 msgstr "Indicador de tiro acertado"
 
-#: qcsrc/menu/xonotic/dialog_settings_audio.c:175
+#: qcsrc/menu/xonotic/dialog_settings_audio.c:170
 msgid "Menu sounds"
 msgstr "Sons do menu"
 
@@ -1716,106 +1866,110 @@ msgstr "Distancia visível das Partículas:"
 msgid "Decals"
 msgstr "Símbolos"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:120
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:118
+msgid "Decals on models"
+msgstr "Marcas nos modelos"
+
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:122
 msgid "Distance:"
 msgstr "Distância:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:126
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:128
 msgid "Time:"
 msgstr "Tempo:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:132
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:134
 msgid "Use lightmaps"
 msgstr "Usar lightmaps"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:133
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
 msgid "Deluxe mapping"
 msgstr "Mapeamento Deluxe"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:135
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:137
 msgid "Gloss"
 msgstr "Lustro"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:138
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
 msgid "Offset mapping"
 msgstr "Mapeamento Offset"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:140
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:142
 msgid "Relief mapping"
 msgstr "Mapeamento Relief"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:143
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:145
 msgid "Reflections:"
 msgstr "Reflexos:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:146
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
 msgid "Blurred"
 msgstr "Grau de Blur"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:147
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:149
 msgid "REFL^Good"
 msgstr "Bom"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:148
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:150
 msgid "Sharp"
 msgstr "Grau de Definição"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:153
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
 msgid "Show surfaces"
 msgstr "Mostrar superfícies"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:155
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
 msgid "No dynamic lighting"
 msgstr "Iluminação dinâmica desligada"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:157
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
 msgid "Flash blend approximation"
 msgstr "Aproximação Flash Blend"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:159
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:161
 msgid "Realtime dynamic lighting"
 msgstr "Iluminação dinâmica em tempo real"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:160
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:164
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:162
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:166
 msgid "Shadows"
 msgstr "Sombras"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:163
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:165
 msgid "Realtime world lighting"
 msgstr "Iluminação do mundo em tempo real"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:168
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
 msgid "Use normal maps"
 msgstr "Usar mapas normais"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:170
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:172
 msgid "Soft shadows"
 msgstr "Sombras Suaves"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:173
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:175
 msgid "Coronas"
 msgstr "Coronas"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:174
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
 msgid "Use Occlusion Queries"
 msgstr "Usar Consultas Oclusão"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:176
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
 msgid "Bloom"
 msgstr "Bloom"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:178
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:180
 msgid "High Dynamic Range (HDR)"
 msgstr "High Dynamic Range (HDR)"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:182
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:184
 msgid "Motion blur:"
 msgstr "Distorção por movimento:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
-msgstr "Distorção por dano:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:189
+msgid "Blur and sharpen postprocessing"
+msgstr "Blur e postprocessing"
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:26
 msgid "Key bindings:"
@@ -1833,29 +1987,29 @@ msgstr "Editar..."
 msgid "Sensitivity:"
 msgstr "Sensibilidade:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
 msgid "UI mouse speed:"
 msgstr "Velocidade do rato:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
 msgid "Mouse filter"
 msgstr "Filtro do Rato"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
 msgid "Invert mouse"
 msgstr "Inverter Rato"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
 msgid "Use joystick input"
 msgstr "Usar input do joystick"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
 msgid "Turn off OS mouse acceleration"
 msgstr "Desligar aceleração de Rato do SO"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
 msgid "\"enter console\" also closes"
 msgstr "\"entrar na consola\" também fecha"
 
@@ -1896,42 +2050,6 @@ msgid "Show frames per second"
 msgstr "Mostrar Frames por Segundo"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Medidor de Velocidade"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (escondido)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "nós"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Mostrar accelerómetro"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Escala do accelerómetro:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
 msgid "Minimize input latency"
 msgstr "Minimizar latência de entrada"
 
@@ -2127,19 +2245,19 @@ msgstr "Contraste:"
 msgid "Gamma:"
 msgstr "Gamma:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
 msgid "Contrast boost:"
 msgstr "Contraste - Boost"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
 msgid "Saturation:"
 msgstr "Saturação da Cor:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
 msgid "LIT^Ambient:"
 msgstr "Som Ambiente:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
 msgid "Intensity:"
 msgstr "Intensidade:"
 
@@ -2310,14 +2428,14 @@ msgstr "Informação de mapas auto-gerada para novos mapas..."
 #: qcsrc/menu/xonotic/util.qc:367
 #, c-format
 msgid "^1%s TEST BUILD"
-msgstr ""
+msgstr "^1%s VERSAO DE TESTE"
 
 #: qcsrc/menu/xonotic/util.qc:432
 #, c-format
 msgid "Update to %s now!"
 msgstr "Actualize para %s agora!"
 
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems.\n"
@@ -2325,94 +2443,90 @@ msgstr ""
 "^1ERRO: A compressão de texturas é necessária mas não é suportada.\n"
 "^1Possíveis problemas visuais.\n"
 
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
 msgid "Arena"
 msgstr "Arena"
 
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
 msgid "Assault"
 msgstr "Assalto"
 
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
 msgid "Capture The Flag"
 msgstr "Captura a Bandeira"
 
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
 msgid "Clan Arena"
 msgstr "Clan Arena"
 
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
 msgid "Deathmatch"
 msgstr "Combate até à Morte"
 
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
 msgid "Domination"
 msgstr "Domínio"
 
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
 msgid "Freeze Tag"
 msgstr "Freeze Tag"
 
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
 msgid "Keepaway"
 msgstr "Keepaway"
 
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
 msgid "Key Hunt"
 msgstr "Procura da Chave"
 
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
 msgid "Last Man Standing"
 msgstr "O Ultimo a Cair"
 
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
 msgid "Nexball"
 msgstr "Nexball"
 
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
 msgid "Onslaught"
 msgstr "Investida"
 
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
 msgid "Race"
 msgstr "Corrida"
 
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
 msgid "Race CTS"
 msgstr "Corrida CTS"
 
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
 msgid "Runematch"
 msgstr "Luta de Runas"
 
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
 msgid "Team Deathmatch"
 msgstr "Combate até à Morte por Equipas"
 
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
 #, c-format
 msgid "@!#%'n Tuba Throwing"
 msgstr "@!#%'n Tuba Throwing"
 
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Fundo:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
 msgid "Default"
 msgstr "Por Defeito"
 
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
 msgid "Use default"
 msgstr "Usar defeito"
 
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
 msgid "Team Color:"
 msgstr "Cor da Equipa:"
 
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
 msgid "Enable panel"
 msgstr "Actival painel"
 
@@ -2444,37 +2558,37 @@ msgstr "%s pode ver de perto a Crylink do %s"
 msgid "Electro"
 msgstr "Electro"
 
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:574
 #, c-format
 msgid "%s could not remember where they put plasma"
 msgstr "%s não se conseguiu lembrar onde pôs a plasma"
 
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:576
 #, c-format
 msgid "%s played with plasma"
 msgstr "%s brincou com plasma"
 
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:583
 #, c-format
 msgid "%s just noticed %s's blue ball"
 msgstr "%s acabou de reparar na bola azul de %s"
 
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:585
 #, c-format
 msgid "%s got in touch with %s's blue ball"
 msgstr "%s esteve em contacto com a bola azul de %s"
 
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:590
 #, c-format
 msgid "%s felt the electrifying air of %s's combo"
 msgstr "%s sentiu o ar electrizante do combo de %s"
 
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:592
 #, c-format
 msgid "%s got too close to %s's blue beam"
 msgstr "%s estava perto demais do raio azul de %s"
 
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:594
 #, c-format
 msgid "%s was blasted by %s's blue beam"
 msgstr "%s foi atingido pelo raio azul de %s"
@@ -2527,27 +2641,27 @@ msgstr "%s provou a bola de fogo de %s"
 msgid "Mortar"
 msgstr "Mortar"
 
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:383
 #, c-format
 msgid "%s tried out his own grenade"
 msgstr "%s experimentou a sua própria granada"
 
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:385
 #, c-format
 msgid "%s detonated"
 msgstr "%s foi detonado"
 
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:391
 #, c-format
 msgid "%s didn't see %s's grenade"
 msgstr "%s não viu a granada de %s"
 
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:393
 #, c-format
 msgid "%s almost dodged %s's grenade"
 msgstr "%s quase se desviou da granada de %s"
 
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:395
 #, c-format
 msgid "%s ate %s's grenade"
 msgstr "%s comeu a granada de %s"
@@ -2556,17 +2670,17 @@ msgstr "%s comeu a granada de %s"
 msgid "Hagar"
 msgstr "Hagar"
 
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655
 #, c-format
 msgid "%s played with tiny rockets"
 msgstr "%s brincou com pequenos foguetes"
 
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:386
 #, c-format
 msgid "%s hoped %s's missiles wouldn't bounce"
 msgstr "%s rezou para que os misseis de %s não resaltassem"
 
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661
 #, c-format
 msgid "%s was pummeled by %s"
 msgstr "%s foi serrado por %s"
@@ -2584,9 +2698,7 @@ msgstr "%s foi totalmente cortado por %s"
 msgid "Grappling Hook"
 msgstr "Grappling Hook"
 
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
 #, c-format
 msgid "%s did the impossible"
 msgstr "%s fez o impossível"
@@ -2600,17 +2712,17 @@ msgstr "%s correu contra uma bomba gravitacional %s"
 msgid "Laser"
 msgstr "Laser"
 
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
 #, c-format
 msgid "%s lasered themself to hell"
 msgstr "%s laserou-se até à morte"
 
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
 #, c-format
 msgid "%s was cut in half by %s's gauntlet"
 msgstr "%s foi cortado ao meio pela gauntlet de %s"
 
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
 #, c-format
 msgid "%s was lasered to death by %s"
 msgstr "%s foi lasereado até à morte por %s"
@@ -2619,22 +2731,22 @@ msgstr "%s foi lasereado até à morte por %s"
 msgid "Mine Layer"
 msgstr "Mine Layer"
 
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
 #, c-format
 msgid "%s exploded"
 msgstr "%s explodiu"
 
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
 #, c-format
 msgid "%s got too close to %s's mine"
 msgstr "%s estava perto demais da mina de %s"
 
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
 #, c-format
 msgid "%s almost dodged %s's mine"
 msgstr "%s quase se desviou da mina de %s"
 
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
 #, c-format
 msgid "%s stepped on %s's mine"
 msgstr "%s pisou a mina de %s"
@@ -2643,7 +2755,13 @@ msgstr "%s pisou a mina de %s"
 msgid "MinstaNex"
 msgstr "MinstaNex"
 
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:293 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:215 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr "%s está agora a pensar com portais"
+
+#: qcsrc/server/w_minstanex.qc:295 qcsrc/server/w_nex.qc:255
 #, c-format
 msgid "%s has been vaporized by %s"
 msgstr "%s foi vaporizado por %s"
@@ -2661,21 +2779,60 @@ msgstr "Port-O-Launch"
 msgid "%s felt %s doing the impossible to him"
 msgstr "%s sentiu %s fazer-lhe o impossível"
 
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Espingarda"
+
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s disparou em si próprio"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s snipou-se de alguma forma..."
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s não se conseguiu esconder da chuva de balas de %s"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s morreu na chuva de balas de %s"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s não se conseguiu esconder da espingarda de %s"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s foi atingido na cabeça por %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "%s foi snipado por %s"
+
 #: qcsrc/server/w_rocketlauncher.qc:2
 msgid "Rocket Launcher"
 msgstr "Rocket Launcher"
 
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
 msgid "%s got too close to %s's rocket"
 msgstr "%s estava demasiado perto do foguete de %s"
 
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
 msgid "%s almost dodged %s's rocket"
 msgstr "%s quase se desviou do foguete de %s"
 
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
 msgid "%s ate %s's rocket"
 msgstr "%s comeu o foguete de %s"
@@ -2693,66 +2850,27 @@ msgstr "%s foi marcado por %s"
 msgid "Shotgun"
 msgstr "Shotgun"
 
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_shotgun.qc:219
 #, c-format
 msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
 msgstr "%2$s ^7maltratou %1$s ^7com uma grande ^2caçadeira"
 
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_shotgun.qc:221
 #, c-format
 msgid "%s was gunned by %s"
 msgstr "%s foi atingido por %s"
 
-#: qcsrc/server/w_sniperrifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_sniperrifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s disparou em si próprio"
-
-#: qcsrc/server/w_sniperrifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s snipou-se de alguma forma..."
-
-#: qcsrc/server/w_sniperrifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s não se conseguiu esconder da chuva de balas de %s"
-
-#: qcsrc/server/w_sniperrifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s morreu na chuva de balas de %s"
-
-#: qcsrc/server/w_sniperrifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s não se conseguiu esconder da espingarda de %s"
-
-#: qcsrc/server/w_sniperrifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s foi atingido na cabeça por %s"
-
-#: qcsrc/server/w_sniperrifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "%s foi snipado por %s"
-
 #: qcsrc/server/w_tuba.qc:2
 #, c-format
 msgid "@!#%'n Tuba"
 msgstr "@!#%'n Tuba"
 
-#: qcsrc/server/w_tuba.qc:263
+#: qcsrc/server/w_tuba.qc:252
 #, c-format
 msgid "%s hurt his own ears with the @!#%%'n Tuba"
 msgstr "%s magoou-se a si próprio com a Tuba"
 
-#: qcsrc/server/w_tuba.qc:267
+#: qcsrc/server/w_tuba.qc:256
 #, c-format
 msgid "%s died of %s's great playing on the @!#%%'n Tuba"
 msgstr "%s morreu por causa da grande actuação de %s"
@@ -2765,9 +2883,3 @@ msgstr "Machine Gun"
 #, c-format
 msgid "%s was riddled full of holes by %s"
 msgstr "%s foi enchido de buracos por %s"
-
-#~ msgid "%d/%d"
-#~ msgstr "%d/%d"
-
-#~ msgid "Waypoint settings:"
-#~ msgstr "Definições dos caminhos:"
index acac44b63d64ba1232ea2c43298a591924f95bfd..1bf7b882f0b95b0f4f892eaef8cf965f843b3295 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Xonotic 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-06-27 18:26+0200\n"
 "PO-Revision-Date: 2011-01-18 11:53+0100\t\n"
 "Last-Translator: MirceaKitsune <sonichedgehog_hyperblast00@yahoo.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -110,7 +110,7 @@ msgstr "Credite"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
 #: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
 msgid "OK"
@@ -157,6 +157,10 @@ msgstr "Afisaj mutitii:"
 msgid "Show only current ammo type"
 msgstr "Afiseaza numai munitia armei selectate"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
@@ -282,6 +286,110 @@ msgstr "Durata notificare:"
 msgid "Entry fadetime:"
 msgstr "Durata atenuare notificatie:"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+#, fuzzy
+msgid "Physics Panel"
+msgstr "Fereastra Chat"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Dezactivata"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+#, fuzzy
+msgid "Panel enabled if not observing"
+msgstr "Activa pentru spectatori"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr "Mereu activa"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+#, fuzzy
+msgid "Status bar"
+msgstr "Activare bara de statut"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Aliniere stanga"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Aliniere dreapta"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+#, fuzzy
+msgid "Inward align"
+msgstr "Interior"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+#, fuzzy
+msgid "Outward align"
+msgstr "Exterior"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+#, fuzzy
+msgid "Flip speed/acceleration positions"
+msgstr "Oglindire pozitie viata/armura"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+#, fuzzy
+msgid "Speed:"
+msgstr "Viteza (kB/s):"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "noduri"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+#, fuzzy
+msgid "Show"
+msgstr "Afisaj Munitie"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+#, fuzzy
+msgid "Top speed"
+msgstr "Viteza Zoom:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+#, fuzzy
+msgid "Acceleration:"
+msgstr "Reflectii:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
 msgid "Powerups Panel"
 msgstr "Fereastra Powerup"
@@ -294,20 +402,10 @@ msgstr "Oglindire pozitie iconuri"
 msgid "Pressed Keys Panel"
 msgstr "Fereastra Taste Apasate"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Dezactivata"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
 msgid "Panel enabled when spectating"
 msgstr "Activa pentru spectatori"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
-msgid "Panel always enabled"
-msgstr "Mereu activa"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
 msgid "Forced aspect:"
 msgstr "Aspect fortat:"
@@ -332,7 +430,7 @@ msgstr "Radar:"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
 msgid "Alpha:"
 msgstr "Opacitate:"
 
@@ -388,6 +486,27 @@ msgstr "Niciodata activ"
 msgid "Score Panel"
 msgstr "Fereastra Scor"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+#, fuzzy
+msgid "Off"
+msgstr "Dezactivat"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
 msgid "Timer Panel"
 msgstr "Fereastra Timp"
@@ -430,11 +549,11 @@ msgstr "%ds"
 msgid "Fade effect:"
 msgstr "Atenuare opacitate:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
 msgid "EF^None"
 msgstr "Nici una"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
 msgid "Slide"
 msgstr "Glisare"
 
@@ -442,39 +561,44 @@ msgstr "Glisare"
 msgid "Alpha"
 msgstr "Opacitate"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+#, fuzzy
+msgid "EF^Both"
+msgstr "Ambele"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
 msgid "Weapon icons:"
 msgstr "Iconuri arme:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
 msgid "Show weapon ID as:"
 msgstr "Afisaj ID arme ca:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
 msgid "SHOWAS^None"
 msgstr "Nici una"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
 msgid "Number"
 msgstr "Numar"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
 msgid "Bind"
 msgstr "Tasta"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
 msgid "Show Accuracy"
 msgstr "Afisaj Acuratete"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
 msgid "Show Ammo"
 msgstr "Afisaj Munitie"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
 msgid "Ammo bar color:"
 msgstr "Culoare bara munitie:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
 msgid "Ammo bar alpha:"
 msgstr "Opacitate bara munitie:"
 
@@ -486,20 +610,24 @@ msgstr "Configurate Interfata (HUD)"
 msgid "Panel background defaults:"
 msgstr "Setari normale fond:"
 
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Fundal:"
+
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
 msgid "Disable"
 msgstr "Dezactivat"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
 msgid "Color:"
 msgstr "Culoare:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
 msgid "Border size:"
 msgstr "Marime borduri:"
 
@@ -508,11 +636,11 @@ msgstr "Marime borduri:"
 msgid "Team color:"
 msgstr "Culoare echipa:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
 msgid "Test team color in configure mode"
 msgstr "Testare culoare echipa in timpul configurarii"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
 msgid "Padding:"
 msgstr "Ajustare:"
 
@@ -670,7 +798,7 @@ msgid "Mutators..."
 msgstr "Modificari speciale..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
 msgid "Advanced settings..."
 msgstr "Setari avansate..."
 
@@ -1251,10 +1379,10 @@ msgstr "Efect ranire:"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:178
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:191
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:30
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
 msgid "Apply immediately"
 msgstr "Aplica imediat"
 
@@ -1314,15 +1442,11 @@ msgstr "Selectare automata a armelor obtinute"
 msgid "Draw 1st person weapon model"
 msgstr "Afisaj model 1st person"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Aliniere stanga"
-
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Aliniere dreapta"
+msgid "Center"
+msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
 msgid "Flip view horizontally"
 msgstr "Oglindire orizontala ecran"
 
@@ -1813,10 +1937,16 @@ msgstr "Distanta Dinamica Inalta (HDR)"
 msgid "Motion blur:"
 msgstr "Blurare viteza:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:187
+#, fuzzy
+msgid "Damage & water blur"
 msgstr "Blurare ranire:"
 
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
+#, fuzzy
+msgid "Powerup sharpen"
+msgstr "Fereastra Powerup"
+
 #: qcsrc/menu/xonotic/dialog_settings_input.c:26
 msgid "Key bindings:"
 msgstr "Taste:"
@@ -1833,29 +1963,29 @@ msgstr "Editare..."
 msgid "Sensitivity:"
 msgstr "Sensitivitate:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
 msgid "UI mouse speed:"
 msgstr "Viteza mouse in meniu:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
 msgid "Mouse filter"
 msgstr "Filtrare mouse"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
 msgid "Invert mouse"
 msgstr "Inversare mouse"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
 msgid "Use joystick input"
 msgstr "Utilizare joystick"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
 msgid "Turn off OS mouse acceleration"
 msgstr "Dezactivare acceleratie mouse din OS"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
 msgid "\"enter console\" also closes"
 msgstr "\"enter\" inchide si consola"
 
@@ -1896,42 +2026,6 @@ msgid "Show frames per second"
 msgstr "Afisaj cadre pe secunda"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Vitezometru"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (ascuns)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "noduri"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Afisaj metru acceleratie"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Marime metru acceleratie:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
 msgid "Minimize input latency"
 msgstr "Minimizare latenta control"
 
@@ -2127,19 +2221,19 @@ msgstr "Contrast:"
 msgid "Gamma:"
 msgstr "Gama:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
 msgid "Contrast boost:"
 msgstr "Exagerare contrast:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
 msgid "Saturation:"
 msgstr "Saturatie:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
 msgid "LIT^Ambient:"
 msgstr "Ambianta:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
 msgid "Intensity:"
 msgstr "Intensitate:"
 
@@ -2315,7 +2409,7 @@ msgstr ""
 msgid "Update to %s now!"
 msgstr "Updatati la %s acum!"
 
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems.\n"
@@ -2323,94 +2417,90 @@ msgstr ""
 "^1EROARE: Comprimarea texturilor este necesara dar nu si suportata.\n"
 "^1Asteptati-va la probleme vizuale.\n"
 
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
 msgid "Arena"
 msgstr "Arena"
 
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
 msgid "Assault"
 msgstr "Asalt"
 
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
 msgid "Capture The Flag"
 msgstr "Captureaza Steagul"
 
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
 msgid "Clan Arena"
 msgstr "Clan Arena"
 
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
 msgid "Deathmatch"
 msgstr "Meciul Mortii"
 
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
 msgid "Domination"
 msgstr "Dominatie"
 
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
 msgid "Freeze Tag"
 msgstr "Inghet"
 
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
 msgid "Keepaway"
 msgstr "Keepaway"
 
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
 msgid "Key Hunt"
 msgstr "Vanatoarea Cheilor"
 
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
 msgid "Last Man Standing"
 msgstr "Ultimul Supravietuitor"
 
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
 msgid "Nexball"
 msgstr "Nexball"
 
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
 msgid "Onslaught"
 msgstr "Onslaught"
 
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
 msgid "Race"
 msgstr "Cursa"
 
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
 msgid "Race CTS"
 msgstr "Cursa CTS"
 
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
 msgid "Runematch"
 msgstr "Runematch"
 
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
 msgid "Team Deathmatch"
 msgstr "Meciul Mortii (in echipa)"
 
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
 #, c-format
 msgid "@!#%'n Tuba Throwing"
 msgstr "Arunca @!#%'n Tuba"
 
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Fundal:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
 msgid "Default"
 msgstr "Setare normala"
 
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
 msgid "Use default"
 msgstr "Utilizare setare normala"
 
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
 msgid "Team Color:"
 msgstr "Culoare echipa:"
 
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
 msgid "Enable panel"
 msgstr "Activare panou"
 
@@ -2442,37 +2532,37 @@ msgstr "%s s-a uitat in deaproape la Crylink-ul lui %s"
 msgid "Electro"
 msgstr "Electro"
 
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:577
 #, c-format
 msgid "%s could not remember where they put plasma"
 msgstr "%s a uitat unde a pus plasma"
 
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:579
 #, c-format
 msgid "%s played with plasma"
 msgstr "%s s-a jucat cu plasma"
 
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:586
 #, c-format
 msgid "%s just noticed %s's blue ball"
 msgstr "%s tocmai a observat bilele albastre ale lui %s"
 
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:588
 #, c-format
 msgid "%s got in touch with %s's blue ball"
 msgstr "%s a intrat in contact cu bila albastra a lui %s"
 
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:593
 #, c-format
 msgid "%s felt the electrifying air of %s's combo"
 msgstr "%s a simtit forta electrica a combinatiei lui %s"
 
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:595
 #, c-format
 msgid "%s got too close to %s's blue beam"
 msgstr "%s s-a apropiat prea mult de raza albastra a lui %s"
 
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:597
 #, c-format
 msgid "%s was blasted by %s's blue beam"
 msgstr "%s a fost lovit de raza albastra a lui %s"
@@ -2525,27 +2615,27 @@ msgstr "%s a gustat din Fireball-ul lui %s"
 msgid "Mortar"
 msgstr "Mortar"
 
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:379
 #, c-format
 msgid "%s tried out his own grenade"
 msgstr "%s si-a incercat propria grenada"
 
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:381
 #, c-format
 msgid "%s detonated"
 msgstr "%s a detonat"
 
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:387
 #, c-format
 msgid "%s didn't see %s's grenade"
 msgstr "%s nu a vazut grenada lui %s"
 
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:389
 #, c-format
 msgid "%s almost dodged %s's grenade"
 msgstr "%s aproape ca s-a ferit de grenada lui %s"
 
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:391
 #, c-format
 msgid "%s ate %s's grenade"
 msgstr "%s a mancat grenada lui %s"
@@ -2554,17 +2644,17 @@ msgstr "%s a mancat grenada lui %s"
 msgid "Hagar"
 msgstr "Hagar"
 
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655
 #, c-format
 msgid "%s played with tiny rockets"
 msgstr "%s s-a jucat cu rachete"
 
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:386
 #, c-format
 msgid "%s hoped %s's missiles wouldn't bounce"
 msgstr "%s a sperat ca rachetele lui %s nu vor ricosa"
 
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661
 #, c-format
 msgid "%s was pummeled by %s"
 msgstr "%s a fost batut mar de %s"
@@ -2582,9 +2672,7 @@ msgstr "%s a fost taiat de %s"
 msgid "Grappling Hook"
 msgstr "Grappling Hook"
 
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
 #, c-format
 msgid "%s did the impossible"
 msgstr "%s a reusit imposibilul"
@@ -2598,17 +2686,17 @@ msgstr "%s a fost absorbit de bomba gravitationala a lui %s"
 msgid "Laser"
 msgstr "Laser"
 
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
 #, c-format
 msgid "%s lasered themself to hell"
 msgstr "%s s-a lovit prea mult cu laserul"
 
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
 #, c-format
 msgid "%s was cut in half by %s's gauntlet"
 msgstr "%s a fost taiat in doua de socul lui %s"
 
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
 #, c-format
 msgid "%s was lasered to death by %s"
 msgstr "%s a fost omorat cu laser de %s"
@@ -2617,22 +2705,22 @@ msgstr "%s a fost omorat cu laser de %s"
 msgid "Mine Layer"
 msgstr "Mine Layer"
 
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
 #, c-format
 msgid "%s exploded"
 msgstr "%s a explodat"
 
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
 #, c-format
 msgid "%s got too close to %s's mine"
 msgstr "%s s-a apropiat prea mult de mina lui %s"
 
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
 #, c-format
 msgid "%s almost dodged %s's mine"
 msgstr "%s aproape ca s-a ferit de mina lui %s"
 
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
 #, c-format
 msgid "%s stepped on %s's mine"
 msgstr "%s a calcat pe mina lui %s"
@@ -2641,7 +2729,13 @@ msgstr "%s a calcat pe mina lui %s"
 msgid "MinstaNex"
 msgstr "MinstaNex"
 
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:290 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:209 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:255
 #, c-format
 msgid "%s has been vaporized by %s"
 msgstr "%s a fost vaporizat de %s"
@@ -2659,21 +2753,60 @@ msgstr "Port-O-Launch"
 msgid "%s felt %s doing the impossible to him"
 msgstr "%s a simtit cum %s a reusit imposibilul"
 
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr ""
+
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s s-a impuscat automat"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s s-a impuscat oarecum cu luneta"
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s nu a reusit sa se ascunda de ploaia de gloante a lui %s"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s a murit in ploaia de gloante a lui %s"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s nu a reusit sa se ascunda de luneta lui %s"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s a fost lovit in cap de %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "%s a fost nimerit cu luneta de %s"
+
 #: qcsrc/server/w_rocketlauncher.qc:2
 msgid "Rocket Launcher"
 msgstr "Rocket Launcher"
 
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
 msgid "%s got too close to %s's rocket"
 msgstr "%s s-a apropiat prea mult de racheta lui %s"
 
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
 msgid "%s almost dodged %s's rocket"
 msgstr "%s aproape ca s-a ferit de racheta lui %s"
 
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
 msgid "%s ate %s's rocket"
 msgstr "%s a mancat racheta lui %s"
@@ -2691,55 +2824,16 @@ msgstr "%s a fost marcat de %s"
 msgid "Shotgun"
 msgstr "Shotgun"
 
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_shotgun.qc:213
 #, c-format
 msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
 msgstr "%2$s ^7l-a plesnit pe %1$s ^7cu o ^2Pusca ^7foarte mare"
 
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_shotgun.qc:215
 #, c-format
 msgid "%s was gunned by %s"
 msgstr "%s a fost impuscat de %s"
 
-#: qcsrc/server/w_sniperrifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_sniperrifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s s-a impuscat automat"
-
-#: qcsrc/server/w_sniperrifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s s-a impuscat oarecum cu luneta"
-
-#: qcsrc/server/w_sniperrifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s nu a reusit sa se ascunda de ploaia de gloante a lui %s"
-
-#: qcsrc/server/w_sniperrifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s a murit in ploaia de gloante a lui %s"
-
-#: qcsrc/server/w_sniperrifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s nu a reusit sa se ascunda de luneta lui %s"
-
-#: qcsrc/server/w_sniperrifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s a fost lovit in cap de %s"
-
-#: qcsrc/server/w_sniperrifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "%s a fost nimerit cu luneta de %s"
-
 #: qcsrc/server/w_tuba.qc:2
 #, c-format
 msgid "@!#%'n Tuba"
@@ -2764,6 +2858,21 @@ msgstr "Machine Gun"
 msgid "%s was riddled full of holes by %s"
 msgstr "%s a fost gaurit de %s"
 
+#~ msgid "Speedometer"
+#~ msgstr "Vitezometru"
+
+#~ msgid "qu/s (hidden)"
+#~ msgstr "qu/s (ascuns)"
+
+#~ msgid "Show accelerometer"
+#~ msgstr "Afisaj metru acceleratie"
+
+#~ msgid "Accelerometer scale:"
+#~ msgstr "Marime metru acceleratie:"
+
+#~ msgid "Sniper Rifle"
+#~ msgstr "Sniper Rifle"
+
 #~ msgid "Waypoint settings:"
 #~ msgstr "Setari indicatoare:"
 
index 87021d894f5a4f7046ac4edab3bf71e52f231e8d..676e9597dbe1ca04b9ff5942e7d244b33529bc7c 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:07+0200\n"
+"POT-Creation-Date: 2011-06-27 18:26+0200\n"
 "PO-Revision-Date: 2011-01-20 13:16+0300\n"
 "Last-Translator: Nikoli <nikoli@lavabit.com>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -110,7 +110,7 @@ msgstr "Разработчики"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
 #: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
 msgid "OK"
@@ -158,6 +158,10 @@ msgstr "Показ боеприпасов:"
 msgid "Show only current ammo type"
 msgstr "Показывать только текущий вид боеприпасов"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
@@ -283,6 +287,110 @@ msgstr "Время видимости:"
 msgid "Entry fadetime:"
 msgstr "Время исчезновения:"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+#, fuzzy
+msgid "Physics Panel"
+msgstr "Панель чата"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Отключена"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+#, fuzzy
+msgid "Panel enabled if not observing"
+msgstr "Включена при наблюдении"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr "Всегда включена"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+#, fuzzy
+msgid "Status bar"
+msgstr "Включить полосу состояния"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Слева"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Справа"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+#, fuzzy
+msgid "Inward align"
+msgstr "Внутрь"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+#, fuzzy
+msgid "Outward align"
+msgstr "Наружу"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+#, fuzzy
+msgid "Flip speed/acceleration positions"
+msgstr "Поменять местами здоровье и броню"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+#, fuzzy
+msgid "Speed:"
+msgstr "Скорость (кБ/с):"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "м/с"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "км/ч"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "м/ч"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "узлы"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+#, fuzzy
+msgid "Show"
+msgstr "Показывать Боеприпасы"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+#, fuzzy
+msgid "Top speed"
+msgstr "Скорость увеличения:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+#, fuzzy
+msgid "Acceleration:"
+msgstr "Отражения:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
 msgid "Powerups Panel"
 msgstr "Панель бонусов"
@@ -295,20 +403,10 @@ msgstr "Поменять местами Силу и Щит"
 msgid "Pressed Keys Panel"
 msgstr "Панель нажатых кнопок"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Отключена"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
 msgid "Panel enabled when spectating"
 msgstr "Включена при наблюдении"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
-msgid "Panel always enabled"
-msgstr "Всегда включена"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
 msgid "Forced aspect:"
 msgstr "Соотношение:"
@@ -333,7 +431,7 @@ msgstr "Радар:"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
 msgid "Alpha:"
 msgstr "Прозрачность:"
 
@@ -389,6 +487,27 @@ msgstr "Никогда не приближён"
 msgid "Score Panel"
 msgstr "Таблица Очков"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+#, fuzzy
+msgid "Off"
+msgstr "Отключено"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
 msgid "Timer Panel"
 msgstr "Панель таймера"
@@ -431,11 +550,11 @@ msgstr "%dс"
 msgid "Fade effect:"
 msgstr "Эффект исчезновения:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
 msgid "EF^None"
 msgstr "Отсутствует"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
 msgid "Slide"
 msgstr "Скольжение"
 
@@ -443,39 +562,44 @@ msgstr "Скольжение"
 msgid "Alpha"
 msgstr "Исчезновение"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+#, fuzzy
+msgid "EF^Both"
+msgstr "1 и 5 минут"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
 msgid "Weapon icons:"
 msgstr "Иконки оружия:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
 msgid "Show weapon ID as:"
 msgstr "Показывать ID оружия как:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
 msgid "SHOWAS^None"
 msgstr "Не показывать"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
 msgid "Number"
 msgstr "Число"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
 msgid "Bind"
 msgstr "Привязка"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
 msgid "Show Accuracy"
 msgstr "Показывать Точность"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
 msgid "Show Ammo"
 msgstr "Показывать Боеприпасы"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
 msgid "Ammo bar color:"
 msgstr "Цвет полосы боеприпасов"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
 msgid "Ammo bar alpha:"
 msgstr "Прозрачность полосы боеприпасов:"
 
@@ -487,20 +611,24 @@ msgstr "Настройка панелей"
 msgid "Panel background defaults:"
 msgstr "Фон по умолчанию:"
 
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Фон:"
+
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
 msgid "Disable"
 msgstr "Отключить"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
 msgid "Color:"
 msgstr "Цвет:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
 msgid "Border size:"
 msgstr "Ширина краёв:"
 
@@ -509,11 +637,11 @@ msgstr "Ширина краёв:"
 msgid "Team color:"
 msgstr "Цвет команды:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
 msgid "Test team color in configure mode"
 msgstr "Проверить цвет команды в режиме настройки"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
 msgid "Padding:"
 msgstr "Промежуток:"
 
@@ -671,7 +799,7 @@ msgid "Mutators..."
 msgstr "Мутаторы..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
 msgid "Advanced settings..."
 msgstr "Доп. настройки..."
 
@@ -1255,10 +1383,10 @@ msgstr "Изображ. урона"
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:178
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:191
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:30
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
 msgid "Apply immediately"
 msgstr "Применить"
 
@@ -1318,15 +1446,11 @@ msgstr "Автоматически переключаться на поднят
 msgid "Draw 1st person weapon model"
 msgstr "Показывать модель оружия в руках"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Слева"
-
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Справа"
+msgid "Center"
+msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
 msgid "Flip view horizontally"
 msgstr "Перевернуть изображение по горизонтали"
 
@@ -1818,10 +1942,16 @@ msgstr "High Dynamic Range (HDR)"
 msgid "Motion blur:"
 msgstr "Размытие от движения:"
 
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:187
+#, fuzzy
+msgid "Damage & water blur"
 msgstr "Размытие от урона:"
 
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:188
+#, fuzzy
+msgid "Powerup sharpen"
+msgstr "Панель бонусов"
+
 #: qcsrc/menu/xonotic/dialog_settings_input.c:26
 msgid "Key bindings:"
 msgstr "Привязки клавиш:"
@@ -1838,29 +1968,29 @@ msgstr "Изменить..."
 msgid "Sensitivity:"
 msgstr "Чувствительность:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
 msgid "UI mouse speed:"
 msgstr "Скорость мыши в UI:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
 msgid "Mouse filter"
 msgstr "Фильтр мыши"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
 msgid "Invert mouse"
 msgstr "Обратить мышь"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
 msgid "Use joystick input"
 msgstr "Использовать ввод с джойстика"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
 msgid "Turn off OS mouse acceleration"
 msgstr "Отключить ускорение OS мыши"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
 msgid "\"enter console\" also closes"
 msgstr "\"открыть консоль\" также закрывает"
 
@@ -1901,45 +2031,6 @@ msgid "Show frames per second"
 msgstr "Показывать кадры/с (FPS)"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Спидометр"
-
-# "quake units per second"
-# you can also translate it as inch/second
-# as it is roughly the same
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (без назв.)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "м/с"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "км/ч"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "м/ч"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "узлы"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Показывать акселерометр"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Размер акселерометра:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
 msgid "Minimize input latency"
 msgstr "Уменьшить задержку ввода"
 
@@ -2135,19 +2226,19 @@ msgstr "Контраст:"
 msgid "Gamma:"
 msgstr "Гамма:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
 msgid "Contrast boost:"
 msgstr "Усиление контраста:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
 msgid "Saturation:"
 msgstr "Насыщенность:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
 msgid "LIT^Ambient:"
 msgstr "Окружающее освещение:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
 msgid "Intensity:"
 msgstr "Мощность:"
 
@@ -2325,7 +2416,7 @@ msgstr ""
 msgid "Update to %s now!"
 msgstr "Обновитесь до %s сейчас же!"
 
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems.\n"
@@ -2333,94 +2424,90 @@ msgstr ""
 "1^ОШИБКА: Сжатие текстур требуется, но не поддерживается.\n"
 "1^Ожидайте проблемы с отображением.\n"
 
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
 msgid "Arena"
 msgstr "Arena"
 
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
 msgid "Assault"
 msgstr "Assault"
 
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
 msgid "Capture The Flag"
 msgstr "Capture The Flag"
 
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
 msgid "Clan Arena"
 msgstr "Clan Arena"
 
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
 msgid "Deathmatch"
 msgstr "Deathmatch"
 
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
 msgid "Domination"
 msgstr "Domination"
 
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
 msgid "Freeze Tag"
 msgstr "Freeze Tag"
 
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
 msgid "Keepaway"
 msgstr "Keepaway"
 
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
 msgid "Key Hunt"
 msgstr "Key Hunt"
 
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
 msgid "Last Man Standing"
 msgstr "Last Man Standing"
 
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
 msgid "Nexball"
 msgstr "Nexball"
 
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
 msgid "Onslaught"
 msgstr "Onslaught"
 
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
 msgid "Race"
 msgstr "Race"
 
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
 msgid "Race CTS"
 msgstr "Race CTS"
 
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
 msgid "Runematch"
 msgstr "Runematch"
 
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
 msgid "Team Deathmatch"
 msgstr "Team Deathmatch"
 
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
 #, c-format
 msgid "@!#%'n Tuba Throwing"
 msgstr "@!#%'n Швыряние Тубой"
 
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Фон:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
 msgid "Default"
 msgstr "По умолчанию"
 
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
 msgid "Use default"
 msgstr "Исп. настройки по умолчанию"
 
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
 msgid "Team Color:"
 msgstr "Цвет команды:"
 
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
 msgid "Enable panel"
 msgstr "Включить панель"
 
@@ -2452,37 +2539,37 @@ msgstr ""
 msgid "Electro"
 msgstr "Electro"
 
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:577
 #, c-format
 msgid "%s could not remember where they put plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:579
 #, c-format
 msgid "%s played with plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:586
 #, c-format
 msgid "%s just noticed %s's blue ball"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:588
 #, c-format
 msgid "%s got in touch with %s's blue ball"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:593
 #, c-format
 msgid "%s felt the electrifying air of %s's combo"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:595
 #, c-format
 msgid "%s got too close to %s's blue beam"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:597
 #, c-format
 msgid "%s was blasted by %s's blue beam"
 msgstr ""
@@ -2535,27 +2622,27 @@ msgstr ""
 msgid "Mortar"
 msgstr "Mortar"
 
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:379
 #, c-format
 msgid "%s tried out his own grenade"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:381
 #, c-format
 msgid "%s detonated"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:387
 #, c-format
 msgid "%s didn't see %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:389
 #, c-format
 msgid "%s almost dodged %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:391
 #, c-format
 msgid "%s ate %s's grenade"
 msgstr ""
@@ -2564,17 +2651,17 @@ msgstr ""
 msgid "Hagar"
 msgstr "Hagar"
 
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655
 #, c-format
 msgid "%s played with tiny rockets"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:386
 #, c-format
 msgid "%s hoped %s's missiles wouldn't bounce"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661
 #, c-format
 msgid "%s was pummeled by %s"
 msgstr ""
@@ -2592,9 +2679,7 @@ msgstr ""
 msgid "Grappling Hook"
 msgstr "Grappling Hook"
 
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
 #, c-format
 msgid "%s did the impossible"
 msgstr ""
@@ -2608,17 +2693,17 @@ msgstr ""
 msgid "Laser"
 msgstr "Laser"
 
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
 #, c-format
 msgid "%s lasered themself to hell"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
 #, c-format
 msgid "%s was cut in half by %s's gauntlet"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
 #, c-format
 msgid "%s was lasered to death by %s"
 msgstr ""
@@ -2627,22 +2712,22 @@ msgstr ""
 msgid "Mine Layer"
 msgstr "Mine Layer"
 
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
 #, c-format
 msgid "%s exploded"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
 #, c-format
 msgid "%s got too close to %s's mine"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
 #, c-format
 msgid "%s almost dodged %s's mine"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
 #, c-format
 msgid "%s stepped on %s's mine"
 msgstr ""
@@ -2651,7 +2736,13 @@ msgstr ""
 msgid "MinstaNex"
 msgstr "MinstaNex"
 
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:290 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:209 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:255
 #, c-format
 msgid "%s has been vaporized by %s"
 msgstr ""
@@ -2669,85 +2760,85 @@ msgstr "Port-O-Launch"
 msgid "%s felt %s doing the impossible to him"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
-msgstr "Rocket Launcher"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rifle.qc:233
 #, c-format
-msgid "%s got too close to %s's rocket"
+msgid "%s shot themself automatically"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rifle.qc:235
 #, c-format
-msgid "%s almost dodged %s's rocket"
+msgid "%s sniped themself somehow"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rifle.qc:242
 #, c-format
-msgid "%s ate %s's rocket"
+msgid "%s failed to hide from %s's bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_seeker.qc:2
-msgid "T.A.G. Seeker"
-msgstr "T.A.G. Seeker"
-
-#: qcsrc/server/w_seeker.qc:659
+#: qcsrc/server/w_rifle.qc:244
 #, c-format
-msgid "%s was tagged by %s"
+msgid "%s died in %s's bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:2
-msgid "Shotgun"
-msgstr "Shotgun"
-
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_rifle.qc:251
 #, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgid "%s failed to hide from %s's rifle"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_rifle.qc:256
 #, c-format
-msgid "%s was gunned by %s"
+msgid "%s got hit in the head by %s"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_sniperrifle.qc:229
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
 #, c-format
-msgid "%s shot themself automatically"
+msgid "%s was sniped by %s"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:231
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
+
+#: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
-msgid "%s sniped themself somehow"
+msgid "%s got too close to %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:238
+#: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
-msgid "%s failed to hide from %s's bullet hail"
+msgid "%s almost dodged %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:240
+#: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
-msgid "%s died in %s's bullet hail"
+msgid "%s ate %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:247
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
+msgstr "T.A.G. Seeker"
+
+#: qcsrc/server/w_seeker.qc:659
 #, c-format
-msgid "%s failed to hide from %s's rifle"
+msgid "%s was tagged by %s"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:252
+#: qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Shotgun"
+
+#: qcsrc/server/w_shotgun.qc:213
 #, c-format
-msgid "%s got hit in the head by %s"
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:254 qcsrc/server/w_uzi.qc:321
+#: qcsrc/server/w_shotgun.qc:215
 #, c-format
-msgid "%s was sniped by %s"
+msgid "%s was gunned by %s"
 msgstr ""
 
 #: qcsrc/server/w_tuba.qc:2
@@ -2774,6 +2865,24 @@ msgstr "Machine Gun"
 msgid "%s was riddled full of holes by %s"
 msgstr ""
 
+#~ msgid "Speedometer"
+#~ msgstr "Спидометр"
+
+# "quake units per second"
+# you can also translate it as inch/second
+# as it is roughly the same
+#~ msgid "qu/s (hidden)"
+#~ msgstr "qu/s (без назв.)"
+
+#~ msgid "Show accelerometer"
+#~ msgstr "Показывать акселерометр"
+
+#~ msgid "Accelerometer scale:"
+#~ msgstr "Размер акселерометра:"
+
+#~ msgid "Sniper Rifle"
+#~ msgstr "Sniper Rifle"
+
 #~ msgid "Waypoint settings:"
 #~ msgstr "Настройки отметок:"
 
index ff5d4fde7b3880b75310134efcca372678a69c75..79f4ffd37ffaff0457f1299f1ba51bd640dc87dd 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:06+0200\n"
+"POT-Creation-Date: 2011-06-27 18:24+0200\n"
 "PO-Revision-Date: 2011-01-11 22:51+ZONE\n"
 "Last-Translator: marcus256 <marcus256@users.sourceforge.net>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -110,7 +110,7 @@ msgstr ""
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
 #: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
 msgid "OK"
@@ -156,6 +156,10 @@ msgstr ""
 msgid "Show only current ammo type"
 msgstr ""
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
@@ -281,6 +285,103 @@ msgstr ""
 msgid "Entry fadetime:"
 msgstr ""
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled if not observing"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+#, fuzzy
+msgid "Speed:"
+msgstr "Hastighet (kB/s):"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+#, fuzzy
+msgid "Show"
+msgstr "Visa Ammunition"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+#, fuzzy
+msgid "Top speed"
+msgstr "Nätverkshastighet:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
 msgid "Powerups Panel"
 msgstr ""
@@ -293,20 +394,10 @@ msgstr ""
 msgid "Pressed Keys Panel"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr ""
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
 msgid "Panel enabled when spectating"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
-msgid "Panel always enabled"
-msgstr ""
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
 msgid "Forced aspect:"
 msgstr ""
@@ -331,7 +422,7 @@ msgstr ""
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
 msgid "Alpha:"
 msgstr "Alfa:"
 
@@ -387,6 +478,26 @@ msgstr ""
 msgid "Score Panel"
 msgstr "Poängpanel"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr ""
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
 msgid "Timer Panel"
 msgstr ""
@@ -429,11 +540,11 @@ msgstr "%ds"
 msgid "Fade effect:"
 msgstr "Uttoningseffekt:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
 msgid "EF^None"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
 msgid "Slide"
 msgstr "Ingen"
 
@@ -441,39 +552,44 @@ msgstr "Ingen"
 msgid "Alpha"
 msgstr "Alfa"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+#, fuzzy
+msgid "EF^Both"
+msgstr "Både och"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
 msgid "Weapon icons:"
 msgstr "Vapenikoner:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
 msgid "Show weapon ID as:"
 msgstr "Visa vapen-ID som:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
 msgid "SHOWAS^None"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
 msgid "Number"
 msgstr "Nummer"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
 msgid "Bind"
 msgstr "Koppla"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
 msgid "Show Accuracy"
 msgstr "Visa Noggrannhet"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
 msgid "Show Ammo"
 msgstr "Visa Ammunition"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
 msgid "Ammo bar color:"
 msgstr "Färg på ammoraden:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
 msgid "Ammo bar alpha:"
 msgstr "Alfa på ammoraden:"
 
@@ -485,20 +601,24 @@ msgstr ""
 msgid "Panel background defaults:"
 msgstr ""
 
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Bakgrund:"
+
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
 msgid "Disable"
 msgstr "Inaktivera"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
 msgid "Color:"
 msgstr "Färg:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
 msgid "Border size:"
 msgstr "Ramstorlek:"
 
@@ -507,11 +627,11 @@ msgstr "Ramstorlek:"
 msgid "Team color:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
 msgid "Test team color in configure mode"
 msgstr "Testa lagfärg i konfigureringsläge"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
 msgid "Padding:"
 msgstr "Utfyllnad:"
 
@@ -670,7 +790,7 @@ msgid "Mutators..."
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
 msgid "Advanced settings..."
 msgstr ""
 
@@ -1254,10 +1374,10 @@ msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:195
 #: qcsrc/menu/xonotic/dialog_settings_audio.c:178
-#: qcsrc/menu/xonotic/dialog_settings_effects.c:194
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:191
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:30
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
 msgid "Apply immediately"
 msgstr "Tillämpa nu"
 
@@ -1317,15 +1437,11 @@ msgstr ""
 msgid "Draw 1st person weapon model"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr ""
-
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
+msgid "Center"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
 msgid "Flip view horizontally"
 msgstr ""
 
@@ -1829,8 +1945,12 @@ msgstr ""
 msgid "Motion blur:"
 msgstr ""
 
+#: qcsrc/menu/xonotic/dialog_settings_effects.c:187
+msgid "Damage & water blur"
+msgstr ""
+
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:188
-msgid "Damage blur:"
+msgid "Powerup sharpen"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_input.c:26
@@ -1849,29 +1969,29 @@ msgstr ""
 msgid "Sensitivity:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
 msgid "UI mouse speed:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
 msgid "Mouse filter"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
 msgid "Invert mouse"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
 msgid "Use joystick input"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
 msgid "Turn off OS mouse acceleration"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
 msgid "\"enter console\" also closes"
 msgstr ""
 
@@ -1912,42 +2032,6 @@ msgid "Show frames per second"
 msgstr ""
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr ""
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
 msgid "Minimize input latency"
 msgstr ""
 
@@ -2145,20 +2229,20 @@ msgstr ""
 msgid "Gamma:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
 msgid "Contrast boost:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
 msgid "Saturation:"
 msgstr ""
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
 #, fuzzy
 msgid "LIT^Ambient:"
 msgstr "Bakgrund"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
 msgid "Intensity:"
 msgstr ""
 
@@ -2330,7 +2414,7 @@ msgstr ""
 msgid "Update to %s now!"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems.\n"
@@ -2338,94 +2422,90 @@ msgstr ""
 "^1FEL: Texturkompression krävs men stöds ej.\n"
 "^1Räkna med visuella problem.\n"
 
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
 msgid "Arena"
 msgstr "Arena"
 
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
 msgid "Assault"
 msgstr "Anfall"
 
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
 msgid "Capture The Flag"
 msgstr "Erövra Flaggan"
 
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
 msgid "Clan Arena"
 msgstr "Klan Arena"
 
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
 msgid "Deathmatch"
 msgstr "Dödsmatch"
 
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
 msgid "Domination"
 msgstr "Dominering"
 
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
 msgid "Freeze Tag"
 msgstr "Frys-Kull"
 
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
 msgid "Keepaway"
 msgstr "Håll Dig Undan"
 
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
 msgid "Key Hunt"
 msgstr "Nyckeljakt"
 
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
 msgid "Last Man Standing"
 msgstr "Herre På Täppan"
 
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
 msgid "Nexball"
 msgstr "Nexboll"
 
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
 msgid "Onslaught"
 msgstr "Stormning"
 
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
 msgid "Race"
 msgstr "Lopp"
 
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
 msgid "Race CTS"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
 msgid "Runematch"
 msgstr ""
 
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
 msgid "Team Deathmatch"
 msgstr "Dödsmatch i Lag"
 
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
 #, c-format
 msgid "@!#%'n Tuba Throwing"
 msgstr "@!#%'n Tubakastning"
 
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Bakgrund:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
 msgid "Default"
 msgstr "Standard"
 
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
 msgid "Use default"
 msgstr "Använd standard"
 
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
 msgid "Team Color:"
 msgstr "Lagfärg:"
 
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
 msgid "Enable panel"
 msgstr ""
 
@@ -2457,37 +2537,37 @@ msgstr ""
 msgid "Electro"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:571
+#: qcsrc/server/w_electro.qc:577
 #, c-format
 msgid "%s could not remember where they put plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:573
+#: qcsrc/server/w_electro.qc:579
 #, c-format
 msgid "%s played with plasma"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:580
+#: qcsrc/server/w_electro.qc:586
 #, c-format
 msgid "%s just noticed %s's blue ball"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:582
+#: qcsrc/server/w_electro.qc:588
 #, c-format
 msgid "%s got in touch with %s's blue ball"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:587
+#: qcsrc/server/w_electro.qc:593
 #, c-format
 msgid "%s felt the electrifying air of %s's combo"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:589
+#: qcsrc/server/w_electro.qc:595
 #, c-format
 msgid "%s got too close to %s's blue beam"
 msgstr ""
 
-#: qcsrc/server/w_electro.qc:591
+#: qcsrc/server/w_electro.qc:597
 #, c-format
 msgid "%s was blasted by %s's blue beam"
 msgstr ""
@@ -2541,27 +2621,27 @@ msgstr ""
 msgid "Mortar"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:379
 #, c-format
 msgid "%s tried out his own grenade"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:381
 #, c-format
 msgid "%s detonated"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:387
 #, c-format
 msgid "%s didn't see %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:389
 #, c-format
 msgid "%s almost dodged %s's grenade"
 msgstr ""
 
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:391
 #, c-format
 msgid "%s ate %s's grenade"
 msgstr ""
@@ -2570,17 +2650,17 @@ msgstr ""
 msgid "Hagar"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655
 #, c-format
 msgid "%s played with tiny rockets"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:386
 #, c-format
 msgid "%s hoped %s's missiles wouldn't bounce"
 msgstr ""
 
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661
 #, c-format
 msgid "%s was pummeled by %s"
 msgstr ""
@@ -2598,9 +2678,7 @@ msgstr ""
 msgid "Grappling Hook"
 msgstr ""
 
-#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
-#: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
+#: qcsrc/server/w_hook.qc:266 qcsrc/server/w_porto.qc:296
 #, c-format
 msgid "%s did the impossible"
 msgstr ""
@@ -2615,17 +2693,17 @@ msgstr ""
 msgid "Laser"
 msgstr "Master:"
 
-#: qcsrc/server/w_laser.qc:305
+#: qcsrc/server/w_laser.qc:311
 #, c-format
 msgid "%s lasered themself to hell"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:309
+#: qcsrc/server/w_laser.qc:315
 #, c-format
 msgid "%s was cut in half by %s's gauntlet"
 msgstr ""
 
-#: qcsrc/server/w_laser.qc:311
+#: qcsrc/server/w_laser.qc:317
 #, c-format
 msgid "%s was lasered to death by %s"
 msgstr ""
@@ -2635,22 +2713,22 @@ msgstr ""
 msgid "Mine Layer"
 msgstr "En Spelare"
 
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:523 qcsrc/server/w_rocketlauncher.qc:501
 #, c-format
 msgid "%s exploded"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:527
 #, c-format
 msgid "%s got too close to %s's mine"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:529
 #, c-format
 msgid "%s almost dodged %s's mine"
 msgstr ""
 
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:531
 #, c-format
 msgid "%s stepped on %s's mine"
 msgstr ""
@@ -2659,7 +2737,13 @@ msgstr ""
 msgid "MinstaNex"
 msgstr ""
 
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:290 qcsrc/server/w_nex.qc:253
+#: qcsrc/server/w_shotgun.qc:209 qcsrc/server/w_uzi.qc:317
+#, c-format
+msgid "%s is now thinking with portals"
+msgstr ""
+
+#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:255
 #, c-format
 msgid "%s has been vaporized by %s"
 msgstr ""
@@ -2678,86 +2762,86 @@ msgstr ""
 msgid "%s felt %s doing the impossible to him"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rifle.qc:233
 #, c-format
-msgid "%s got too close to %s's rocket"
+msgid "%s shot themself automatically"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rifle.qc:235
 #, c-format
-msgid "%s almost dodged %s's rocket"
+msgid "%s sniped themself somehow"
 msgstr ""
 
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rifle.qc:242
 #, c-format
-msgid "%s ate %s's rocket"
+msgid "%s failed to hide from %s's bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_seeker.qc:2
-msgid "T.A.G. Seeker"
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
 msgstr ""
 
-#: qcsrc/server/w_seeker.qc:659
+#: qcsrc/server/w_rifle.qc:251
 #, c-format
-msgid "%s was tagged by %s"
+msgid "%s failed to hide from %s's rifle"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:2
-#, fuzzy
-msgid "Shotgun"
-msgstr "Kort"
-
-#: qcsrc/server/w_shotgun.qc:207
+#: qcsrc/server/w_rifle.qc:256
 #, c-format
-msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
+msgid "%s got hit in the head by %s"
 msgstr ""
 
-#: qcsrc/server/w_shotgun.qc:209
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
 #, c-format
-msgid "%s was gunned by %s"
+msgid "%s was sniped by %s"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:2
-msgid "Sniper Rifle"
+#: qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:229
+#: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
-msgid "%s shot themself automatically"
+msgid "%s got too close to %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:231
+#: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
-msgid "%s sniped themself somehow"
+msgid "%s almost dodged %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:238
+#: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
-msgid "%s failed to hide from %s's bullet hail"
+msgid "%s ate %s's rocket"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
+#: qcsrc/server/w_seeker.qc:2
+msgid "T.A.G. Seeker"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:247
+#: qcsrc/server/w_seeker.qc:659
 #, c-format
-msgid "%s failed to hide from %s's rifle"
+msgid "%s was tagged by %s"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:252
+#: qcsrc/server/w_shotgun.qc:2
+#, fuzzy
+msgid "Shotgun"
+msgstr "Kort"
+
+#: qcsrc/server/w_shotgun.qc:213
 #, c-format
-msgid "%s got hit in the head by %s"
+msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
 msgstr ""
 
-#: qcsrc/server/w_sniperrifle.qc:254 qcsrc/server/w_uzi.qc:321
+#: qcsrc/server/w_shotgun.qc:215
 #, c-format
-msgid "%s was sniped by %s"
+msgid "%s was gunned by %s"
 msgstr ""
 
 #: qcsrc/server/w_tuba.qc:2
index 8fd6b4fc09c8b7b238a2b5daecafe4c163d1da0f..6429f48948dcc8f8482395974fe30403740c15b0 100644 (file)
Binary files a/models/domination/dom_blue.md3 and b/models/domination/dom_blue.md3 differ
index d8a9579cdb97bddd28fe37670c81dacfafe44533..7aa01bf395a317cbcf42ce51c1141169b3c2c6b0 100644 (file)
Binary files a/models/domination/dom_pink.md3 and b/models/domination/dom_pink.md3 differ
index cb68ce4051de2e1e6d415b93a19ad44c2c58b635..332b0f239560283f7d079fa66f7278b356c62919 100644 (file)
Binary files a/models/domination/dom_red.md3 and b/models/domination/dom_red.md3 differ
index efbcf9cf74ba7fd7932192ddbdac2c7d14e81f72..be5aaa9571860d4e8570e3c096b6c2d66cc8029a 100644 (file)
Binary files a/models/domination/dom_unclaimed.md3 and b/models/domination/dom_unclaimed.md3 differ
index bb6ff52fe546b0319c61ac7d7ef429599cc55ede..b1da0d1b0990a4d8cda307a0bb86a67e675470a9 100644 (file)
Binary files a/models/domination/dom_yellow.md3 and b/models/domination/dom_yellow.md3 differ
index fb9e1a1bf81ac6a2e850ceaa90361ffaad03adc8..106333058667c5c8c90a7c1351adf7f74746ac4d 100644 (file)
Binary files a/models/player/erebus.iqm and b/models/player/erebus.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -1,24 +1,24 @@
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
 91 21 30.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
diff --git a/models/player/erebus.iqm_1.skin b/models/player/erebus.iqm_1.skin
deleted file mode 100644 (file)
index 4597cef..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-erebus,erebusfullbright
-erebus.001,shadowhead
diff --git a/models/player/erebus.iqm_1.sounds b/models/player/erebus.iqm_1.sounds
deleted file mode 100644 (file)
index a97a073..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-//TAG: soldier
-//affirmative sound/player/carni-lycan/player/affirmative 0
-attack sound/player/soldier/coms/attack 0
-//attacking sound/player/carni-lycan/player/attacking 0
-attackinfive sound/player/soldier/coms/attackinfive 0
-coverme sound/player/soldier/coms/coverme 0
-defend sound/player/soldier/coms/defend 0
-//defending sound/player/carni-lycan/player/defending 0
-//droppedflag sound/player/carni-lycan/player/droppedflag 0
-flagcarriertakingdamage sound/player/soldier/coms/flagcarriertakingdamage 0
-freelance sound/player/soldier/coms/freelance 2
-getflag sound/player/soldier/coms/getflag 0
-incoming sound/player/soldier/coms/incoming 0
-meet sound/player/soldier/coms/meet 0
-needhelp sound/player/soldier/coms/needhelp 2
-//negative sound/player/carni-lycan/player/negative 0
-//onmyway sound/player/carni-lycan/player/onmyway 0
-//roaming sound/player/carni-lycan/player/roaming 0
-//seenenemy sound/player/carni-lycan/player/seenenemy 0
-seenflag sound/player/soldier/coms/seenflag 0
-taunt sound/player/soldier/coms/taunt 3
-teamshoot sound/player/soldier/coms/teamshoot 3
-death sound/player/soldier/player/death 3
-drown sound/player/soldier/player/drown 0
-fall sound/player/soldier/player/fall 0
-falling sound/player/soldier/player/falling 0
-gasp sound/player/soldier/player/gasp 0
-jump sound/player/soldier/player/jump 0
-pain25 sound/player/soldier/player/pain25 0
-pain50 sound/player/soldier/player/pain50 0
-pain75 sound/player/soldier/player/pain75 0
-pain100 sound/player/soldier/player/pain100 0
diff --git a/models/player/erebus.iqm_1.tga b/models/player/erebus.iqm_1.tga
deleted file mode 100644 (file)
index bf151b5..0000000
Binary files a/models/player/erebus.iqm_1.tga and /dev/null differ
diff --git a/models/player/erebus.iqm_1.txt b/models/player/erebus.iqm_1.txt
deleted file mode 100644 (file)
index 7b8389b..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-name Glowing Erebus
-species human
-sex Male
-weight 106
-age 26
-
-Heavyweight Xonotic Solider with LEDs
index 7b35a7105bd3cfc7902a73300a960373a3a9da24..fc3fc19fa1e669b7142a35426c70ff42f539f6c2 100644 (file)
Binary files a/models/player/erebus_lod1.iqm and b/models/player/erebus_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -1,24 +1,24 @@
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
 91 21 30.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
diff --git a/models/player/erebus_lod1.iqm_1.skin b/models/player/erebus_lod1.iqm_1.skin
deleted file mode 100644 (file)
index 4597cef..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-erebus,erebusfullbright
-erebus.001,shadowhead
index ba28fda523d9ab23295c082a1acddae7c3529458..159dee54e16a97f1ba0be19fddf4454126329f54 100644 (file)
Binary files a/models/player/erebus_lod2.iqm and b/models/player/erebus_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -1,24 +1,24 @@
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
 91 21 30.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
diff --git a/models/player/erebus_lod2.iqm_1.skin b/models/player/erebus_lod2.iqm_1.skin
deleted file mode 100644 (file)
index 4597cef..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-erebus,erebusfullbright
-erebus.001,shadowhead
index 4e2835a5b6880ae6138b16bc06baa4b8a7f9d2b7..c423ecd41fcd00017c9b0a73be8f4c6d8980f648 100644 (file)
Binary files a/models/player/gak.iqm and b/models/player/gak.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 7fc4655458f53faf224a00606eb0a9867c932795..8b4b72dc7c2b6410d343f7ef179cfb4eedf2b182 100644 (file)
Binary files a/models/player/gak_lod1.iqm and b/models/player/gak_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 8c35e2c2480335b708b34ee7d10cdca877dd2b09..f4a8080440607c8bc5e79a9f0d9684abf2db9904 100644 (file)
Binary files a/models/player/gak_lod2.iqm and b/models/player/gak_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 168f798ada124321cc395e6ad819fb425e89ac27..400812c5be3db15d34380370567d7c54fa988b3b 100644 (file)
Binary files a/models/player/gakarmored.iqm and b/models/player/gakarmored.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 5d6d716fcdaf529e2ea5b05eca249754597528d5..27f7e03a7c694250d2cb2add36d89362cc8e1b40 100644 (file)
Binary files a/models/player/gakarmored_lod1.iqm and b/models/player/gakarmored_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 36b6ed994c18f45d35f29201811d624a489104bb..2d8fa0d64466e8fd7eb262d73e8d9f26e99033c0 100644 (file)
Binary files a/models/player/gakarmored_lod2.iqm and b/models/player/gakarmored_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 01864ca353cae05c970dcd09249c608f147217f8..2c283abffb1e3bfb41c16e28a6c1bdfd1361b6e9 100644 (file)
Binary files a/models/player/gakmasked.iqm and b/models/player/gakmasked.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index e8355c0a415c5d427e2909b25b3d39ba22ea2101..e5e58a762a00696ff5404393fbc8455315de20a2 100644 (file)
Binary files a/models/player/gakmasked_lod1.iqm and b/models/player/gakmasked_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 9ea8fd10bcf2e5f79d17d943831a1392e79b3803..142e28a579a1c995335988427d30594f98ea0ecf 100644 (file)
Binary files a/models/player/gakmasked_lod2.iqm and b/models/player/gakmasked_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 2a098f101fde0cf084e5f7aab903b78a91ae07c7..692be86d8efdfd2ee2740e7d35d2cbd1602bef56 100644 (file)
Binary files a/models/player/ignis.iqm and b/models/player/ignis.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -1,24 +1,24 @@
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
 91 21 30.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index f53f423e57ee7e7379fbeb8de0a7e85800a02d06..15fd6e2dc27ab14b2afbc11860d87a4378a761ef 100644 (file)
Binary files a/models/player/ignis_lod1.iqm and b/models/player/ignis_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -1,24 +1,24 @@
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
 91 21 30.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 0d984b49fdb72c431776bf575f7dba3920cdd43f..caa5ebe19366f7305803eee0144a3bc53e8474b2 100644 (file)
Binary files a/models/player/ignis_lod2.iqm and b/models/player/ignis_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -1,24 +1,24 @@
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
 91 21 30.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 968f2322c9b241ea64e0c11367d7eef06f250eed..98ee7cf7c6a5a195b8759380f41572a593dd0a9a 100644 (file)
Binary files a/models/player/ignishalfmasked.iqm and b/models/player/ignishalfmasked.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -1,24 +1,24 @@
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
 91 21 30.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index d0c50d1e57d006c3ca07b8435d5137bc50e4853e..a1421f17a582a345e876b90dabae3536afed6545 100644 (file)
Binary files a/models/player/ignishalfmasked_lod1.iqm and b/models/player/ignishalfmasked_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -1,24 +1,24 @@
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
 91 21 30.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 069f96c212bb2e1c862f3b898e48b0f0f3ec21ba..cbb13f4acab95d7f7affcf0032db52efc101ffd8 100644 (file)
Binary files a/models/player/ignishalfmasked_lod2.iqm and b/models/player/ignishalfmasked_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -1,24 +1,24 @@
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
 91 21 30.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 15cce9fd7673a2d26ea877734107d5203e39bc97..abcc4f3728a8263b1c887397c43af81b37d2f690 100644 (file)
Binary files a/models/player/ignismasked.iqm and b/models/player/ignismasked.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -1,24 +1,24 @@
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
 91 21 30.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 15c031e6ca08523c33dc1b09cf045ef24aef479a..2cd6aa1a8651c8dd830eb94fdd6b3975514161a6 100644 (file)
Binary files a/models/player/ignismasked_lod1.iqm and b/models/player/ignismasked_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -1,24 +1,24 @@
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
 91 21 30.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 99e6dec0f695e938dc6ecaba8a0fae65455aa726..0c0cf7058b5a0e355c3793c0980520d309a15fc4 100644 (file)
Binary files a/models/player/ignismasked_lod2.iqm and b/models/player/ignismasked_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -1,24 +1,24 @@
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
 91 21 30.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
diff --git a/models/player/megaerebus.iqm b/models/player/megaerebus.iqm
new file mode 100644 (file)
index 0000000..5269830
Binary files /dev/null and b/models/player/megaerebus.iqm differ
diff --git a/models/player/megaerebus.iqm.framegroups b/models/player/megaerebus.iqm.framegroups
new file mode 100644 (file)
index 0000000..07516e0
--- /dev/null
@@ -0,0 +1,24 @@
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
+71 20 15.000000 1 // duck
+91 21 30.000000 1 // duckwalk
+112 16 15.000000 0 // duckjump
+128 15 5.000000 1 // duckidle
+143 41 5.000000 1 // idle
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
diff --git a/models/player/megaerebus.iqm_0.skin b/models/player/megaerebus.iqm_0.skin
new file mode 100644 (file)
index 0000000..4597cef
--- /dev/null
@@ -0,0 +1,2 @@
+erebus,erebusfullbright
+erebus.001,shadowhead
diff --git a/models/player/megaerebus.iqm_0.sounds b/models/player/megaerebus.iqm_0.sounds
new file mode 100644 (file)
index 0000000..a97a073
--- /dev/null
@@ -0,0 +1,32 @@
+//TAG: soldier
+//affirmative sound/player/carni-lycan/player/affirmative 0
+attack sound/player/soldier/coms/attack 0
+//attacking sound/player/carni-lycan/player/attacking 0
+attackinfive sound/player/soldier/coms/attackinfive 0
+coverme sound/player/soldier/coms/coverme 0
+defend sound/player/soldier/coms/defend 0
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+flagcarriertakingdamage sound/player/soldier/coms/flagcarriertakingdamage 0
+freelance sound/player/soldier/coms/freelance 2
+getflag sound/player/soldier/coms/getflag 0
+incoming sound/player/soldier/coms/incoming 0
+meet sound/player/soldier/coms/meet 0
+needhelp sound/player/soldier/coms/needhelp 2
+//negative sound/player/carni-lycan/player/negative 0
+//onmyway sound/player/carni-lycan/player/onmyway 0
+//roaming sound/player/carni-lycan/player/roaming 0
+//seenenemy sound/player/carni-lycan/player/seenenemy 0
+seenflag sound/player/soldier/coms/seenflag 0
+taunt sound/player/soldier/coms/taunt 3
+teamshoot sound/player/soldier/coms/teamshoot 3
+death sound/player/soldier/player/death 3
+drown sound/player/soldier/player/drown 0
+fall sound/player/soldier/player/fall 0
+falling sound/player/soldier/player/falling 0
+gasp sound/player/soldier/player/gasp 0
+jump sound/player/soldier/player/jump 0
+pain25 sound/player/soldier/player/pain25 0
+pain50 sound/player/soldier/player/pain50 0
+pain75 sound/player/soldier/player/pain75 0
+pain100 sound/player/soldier/player/pain100 0
diff --git a/models/player/megaerebus.iqm_0.tga b/models/player/megaerebus.iqm_0.tga
new file mode 100644 (file)
index 0000000..69f1664
Binary files /dev/null and b/models/player/megaerebus.iqm_0.tga differ
diff --git a/models/player/megaerebus.iqm_0.txt b/models/player/megaerebus.iqm_0.txt
new file mode 100644 (file)
index 0000000..b4e2aa8
--- /dev/null
@@ -0,0 +1,7 @@
+name Mega Erebus
+species human
+sex Male
+weight 210
+age 26
+
+Heavyweight Xonotic Solider
diff --git a/models/player/megaerebus_lod1.iqm b/models/player/megaerebus_lod1.iqm
new file mode 100644 (file)
index 0000000..7cf7312
Binary files /dev/null and b/models/player/megaerebus_lod1.iqm differ
diff --git a/models/player/megaerebus_lod1.iqm.framegroups b/models/player/megaerebus_lod1.iqm.framegroups
new file mode 100644 (file)
index 0000000..07516e0
--- /dev/null
@@ -0,0 +1,24 @@
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
+71 20 15.000000 1 // duck
+91 21 30.000000 1 // duckwalk
+112 16 15.000000 0 // duckjump
+128 15 5.000000 1 // duckidle
+143 41 5.000000 1 // idle
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
diff --git a/models/player/megaerebus_lod1.iqm_0.skin b/models/player/megaerebus_lod1.iqm_0.skin
new file mode 100644 (file)
index 0000000..4597cef
--- /dev/null
@@ -0,0 +1,2 @@
+erebus,erebusfullbright
+erebus.001,shadowhead
diff --git a/models/player/megaerebus_lod2.iqm b/models/player/megaerebus_lod2.iqm
new file mode 100644 (file)
index 0000000..7d05b66
Binary files /dev/null and b/models/player/megaerebus_lod2.iqm differ
diff --git a/models/player/megaerebus_lod2.iqm.framegroups b/models/player/megaerebus_lod2.iqm.framegroups
new file mode 100644 (file)
index 0000000..07516e0
--- /dev/null
@@ -0,0 +1,24 @@
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
+71 20 15.000000 1 // duck
+91 21 30.000000 1 // duckwalk
+112 16 15.000000 0 // duckjump
+128 15 5.000000 1 // duckidle
+143 41 5.000000 1 // idle
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
diff --git a/models/player/megaerebus_lod2.iqm_0.skin b/models/player/megaerebus_lod2.iqm_0.skin
new file mode 100644 (file)
index 0000000..4597cef
--- /dev/null
@@ -0,0 +1,2 @@
+erebus,erebusfullbright
+erebus.001,shadowhead
index 88f2a7dccfdaf1ca2351c6cbbec6c247b3e8b1a9..24cc947bf13ea2a690b6f92f9c9f0b2f007479e7 100644 (file)
Binary files a/models/player/nyx.iqm and b/models/player/nyx.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index a60e8b2037c0783c2e0e09422fa758496827ee35..27a418a382f5ab79dc5b3d3be46c92c75192b29e 100644 (file)
Binary files a/models/player/nyx_lod1.iqm and b/models/player/nyx_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 57b1773ebb65ff87bff93aef1ee4bf6084398818..82d48b6c9d4c6558f7ae78bd00b7273cb20a1e38 100644 (file)
Binary files a/models/player/nyx_lod2.iqm and b/models/player/nyx_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index d3b7b2d616eb027b3607e770a2964e841ac7d0ed..4dad4b7985199d32192a3c8eb98c9e5e74591ce5 100644 (file)
Binary files a/models/player/pyria.iqm and b/models/player/pyria.iqm differ
index b3a5c2647bee189640476e55b5cdcb976c06d665..686dd60cef5afdd8ce051d191baed2e12a781354 100644 (file)
@@ -6,19 +6,19 @@
 109 16 15.000000 0 // duckjump
 125 15 5.000000 1 // duckidle
 140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
index dbbeef823a2281f2f565e75bb5b820bd66019aba..037b6598795dfc49b2b922046c2f4758b6632542 100644 (file)
Binary files a/models/player/pyria_lod1.iqm and b/models/player/pyria_lod1.iqm differ
index b3a5c2647bee189640476e55b5cdcb976c06d665..686dd60cef5afdd8ce051d191baed2e12a781354 100644 (file)
@@ -6,19 +6,19 @@
 109 16 15.000000 0 // duckjump
 125 15 5.000000 1 // duckidle
 140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
index 99fcc86d43e9bf262c2b376ce7e6f98249cbaf6e..383060331b6dc2796b541ab97871cda68dc574d0 100644 (file)
Binary files a/models/player/pyria_lod2.iqm and b/models/player/pyria_lod2.iqm differ
index b3a5c2647bee189640476e55b5cdcb976c06d665..686dd60cef5afdd8ce051d191baed2e12a781354 100644 (file)
@@ -6,19 +6,19 @@
 109 16 15.000000 0 // duckjump
 125 15 5.000000 1 // duckidle
 140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
index 17f700e7d8ff094fa850b183a36c770f04ff9cd1..95c46a3a5005417c6bdd8574b4acb31fd5105838 100644 (file)
Binary files a/models/player/seraphina.iqm and b/models/player/seraphina.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 692d24b136ad142f7d54853e06e39fc67870e193..cd8ff803036b04cf7922fdf5bdff09877401459e 100644 (file)
Binary files a/models/player/seraphina_lod1.iqm and b/models/player/seraphina_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 9624f0c8b6c79ed0f62c7d7059b83a0caa57690a..118efe6fd93c50fac4c407951fea7214b06ea0a2 100644 (file)
Binary files a/models/player/seraphina_lod2.iqm and b/models/player/seraphina_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 418aeb722b4e0b271816ddfbc587f1507e29432e..185263d6243a35bec0cf5d3813b50aecbf8e7420 100644 (file)
Binary files a/models/player/seraphinamasked.iqm and b/models/player/seraphinamasked.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 11b115c65560029b4d075be34b09a7c4bde64832..4b1ea685bc9a4b0dd1a208cd6c67b91904a5ef1d 100644 (file)
Binary files a/models/player/seraphinamasked_lod1.iqm and b/models/player/seraphinamasked_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index f4805a53c9a1f4a267fc7d1a08e67f7b3a74a59c..58fe05c4f42c3d8d4b76edaad9a24419730ffc9a 100644 (file)
Binary files a/models/player/seraphinamasked_lod2.iqm and b/models/player/seraphinamasked_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index f876a0310abcc295c6a6a6f78173f87c38f1ff95..07f73615b59cafed9fa0ee7866dbd4e78dfc702f 100644 (file)
Binary files a/models/player/umbra.iqm and b/models/player/umbra.iqm differ
index b3a5c2647bee189640476e55b5cdcb976c06d665..686dd60cef5afdd8ce051d191baed2e12a781354 100644 (file)
@@ -6,19 +6,19 @@
 109 16 15.000000 0 // duckjump
 125 15 5.000000 1 // duckidle
 140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
index e32fa7b472dbe962a48f5137f53ae924a3626b8c..1173db86bb8dbcea34901bb67ecb97fd04396106 100644 (file)
Binary files a/models/player/umbra_lod1.iqm and b/models/player/umbra_lod1.iqm differ
index b3a5c2647bee189640476e55b5cdcb976c06d665..686dd60cef5afdd8ce051d191baed2e12a781354 100644 (file)
@@ -6,19 +6,19 @@
 109 16 15.000000 0 // duckjump
 125 15 5.000000 1 // duckidle
 140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
index e283e9cb6047870bf315c4ba63af25f8858ac27b..b47ac76f0fb1570d8afd2e4c17f56bea6092af71 100644 (file)
Binary files a/models/player/umbra_lod2.iqm and b/models/player/umbra_lod2.iqm differ
index b3a5c2647bee189640476e55b5cdcb976c06d665..686dd60cef5afdd8ce051d191baed2e12a781354 100644 (file)
@@ -6,19 +6,19 @@
 109 16 15.000000 0 // duckjump
 125 15 5.000000 1 // duckidle
 140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
diff --git a/models/sprites/vehicle_frame0.tga b/models/sprites/vehicle_frame0.tga
new file mode 100644 (file)
index 0000000..0864bcb
Binary files /dev/null and b/models/sprites/vehicle_frame0.tga differ
diff --git a/models/sprites/vehicle_frame1.tga b/models/sprites/vehicle_frame1.tga
new file mode 100644 (file)
index 0000000..073354d
Binary files /dev/null and b/models/sprites/vehicle_frame1.tga differ
diff --git a/models/vehicles/bomblet.md3 b/models/vehicles/bomblet.md3
new file mode 100644 (file)
index 0000000..55ca725
Binary files /dev/null and b/models/vehicles/bomblet.md3 differ
diff --git a/models/vehicles/bumblebee.tga b/models/vehicles/bumblebee.tga
new file mode 100644 (file)
index 0000000..a20e851
Binary files /dev/null and b/models/vehicles/bumblebee.tga differ
diff --git a/models/vehicles/bumblebee_body.dpm b/models/vehicles/bumblebee_body.dpm
new file mode 100644 (file)
index 0000000..9962dd7
Binary files /dev/null and b/models/vehicles/bumblebee_body.dpm differ
diff --git a/models/vehicles/bumblebee_gloss.tga b/models/vehicles/bumblebee_gloss.tga
new file mode 100644 (file)
index 0000000..bbfb176
Binary files /dev/null and b/models/vehicles/bumblebee_gloss.tga differ
diff --git a/models/vehicles/bumblebee_glow.tga b/models/vehicles/bumblebee_glow.tga
new file mode 100644 (file)
index 0000000..c688168
Binary files /dev/null and b/models/vehicles/bumblebee_glow.tga differ
diff --git a/models/vehicles/bumblebee_norm.tga b/models/vehicles/bumblebee_norm.tga
new file mode 100644 (file)
index 0000000..0ab707c
Binary files /dev/null and b/models/vehicles/bumblebee_norm.tga differ
diff --git a/models/vehicles/bumblebee_pants.tga b/models/vehicles/bumblebee_pants.tga
new file mode 100644 (file)
index 0000000..32d0aa5
Binary files /dev/null and b/models/vehicles/bumblebee_pants.tga differ
diff --git a/models/vehicles/bumblebee_plasma_left.dpm b/models/vehicles/bumblebee_plasma_left.dpm
new file mode 100644 (file)
index 0000000..57df41a
Binary files /dev/null and b/models/vehicles/bumblebee_plasma_left.dpm differ
diff --git a/models/vehicles/bumblebee_plasma_right.dpm b/models/vehicles/bumblebee_plasma_right.dpm
new file mode 100644 (file)
index 0000000..1689979
Binary files /dev/null and b/models/vehicles/bumblebee_plasma_right.dpm differ
diff --git a/models/vehicles/bumblebee_ray.dpm b/models/vehicles/bumblebee_ray.dpm
new file mode 100644 (file)
index 0000000..2e36eb5
Binary files /dev/null and b/models/vehicles/bumblebee_ray.dpm differ
diff --git a/models/vehicles/clusterbomb.md3 b/models/vehicles/clusterbomb.md3
new file mode 100644 (file)
index 0000000..c0842df
Binary files /dev/null and b/models/vehicles/clusterbomb.md3 differ
diff --git a/models/vehicles/clusterbomb_folded.md3 b/models/vehicles/clusterbomb_folded.md3
new file mode 100644 (file)
index 0000000..f1b65a6
Binary files /dev/null and b/models/vehicles/clusterbomb_folded.md3 differ
diff --git a/models/vehicles/clusterbomb_fragment.md3 b/models/vehicles/clusterbomb_fragment.md3
new file mode 100644 (file)
index 0000000..516da16
Binary files /dev/null and b/models/vehicles/clusterbomb_fragment.md3 differ
index 83518c5c629d255f7412295d9248aadd30aebf46..bbd758a1c7216591a1d3c1baf10ca66d72925d57 100644 (file)
Binary files a/models/vehicles/raptor.dpm and b/models/vehicles/raptor.dpm differ
diff --git a/models/vehicles/raptor_body.dpm b/models/vehicles/raptor_body.dpm
new file mode 100644 (file)
index 0000000..2a28317
Binary files /dev/null and b/models/vehicles/raptor_body.dpm differ
index fe933e4e427835b1a15efe7231cc88a5e1982282..d321f37d3d386eb8cf8b34258edf671812acdbdb 100644 (file)
Binary files a/models/vehicles/raptor_cockpit.dpm and b/models/vehicles/raptor_cockpit.dpm differ
diff --git a/models/vehicles/rocket01.md3 b/models/vehicles/rocket01.md3
new file mode 100644 (file)
index 0000000..1d9aab9
Binary files /dev/null and b/models/vehicles/rocket01.md3 differ
diff --git a/models/vehicles/rocket02.md3 b/models/vehicles/rocket02.md3
new file mode 100644 (file)
index 0000000..0a3eef0
Binary files /dev/null and b/models/vehicles/rocket02.md3 differ
diff --git a/models/vehicles/rockets.tga b/models/vehicles/rockets.tga
new file mode 100644 (file)
index 0000000..a6b873c
Binary files /dev/null and b/models/vehicles/rockets.tga differ
diff --git a/models/vehicles/rockets_gloss.tga b/models/vehicles/rockets_gloss.tga
new file mode 100644 (file)
index 0000000..22616da
Binary files /dev/null and b/models/vehicles/rockets_gloss.tga differ
diff --git a/models/vehicles/rockets_glow.tga b/models/vehicles/rockets_glow.tga
new file mode 100644 (file)
index 0000000..14c9f30
Binary files /dev/null and b/models/vehicles/rockets_glow.tga differ
diff --git a/models/vehicles/rockets_reflect.tga b/models/vehicles/rockets_reflect.tga
new file mode 100644 (file)
index 0000000..3cad23f
Binary files /dev/null and b/models/vehicles/rockets_reflect.tga differ
index eeb5e92e7e37ec0e1a75677c0cd0d0455b7e025b..2b5624f03cc41d29029fa7fdd49885c1bc5bd87c 100644 (file)
Binary files a/models/vehicles/spiderbot.dpm and b/models/vehicles/spiderbot.dpm differ
index f9db7221e4f2e959f420eaee3a6e000ae3551ad1..835bd3bd176e2b806fcfb89773bcdbecf55d6878 100644 (file)
@@ -1,6 +1,17 @@
-1   30  20 1 // forward
-32  30  20 1 // backward
-63  30  20 1 // left
-94  30 20 1 // right
-125 30 20 0 // jump
-0   1   20 0 // idle
+/*
+Generated framegroups file for spiderbot
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 31 30 1 // spiderbot forward
+32 31 30 1 // spiderbot backwards
+63 31 20 1 // spiderbot left
+94 31 20 1 // spiderbot right
+125 31 20 0 // spiderbot jump
+156 1 1 0 // spiderbot idle
+157 12 20 0 // spiderbot jump2
+169 7 20 0 // spiderbot jump_charge
+176 11 15 0 // spiderbot jump_fly
+187 21 20 0 // spiderbot jump_land
+208 51 15 0 // spiderbot death
+259 3 1 0 // spiderbot dead
index 8d64449d3c0adc908e5e9deba373c2b92a4d7a91..a851f3e0832cb42cfb76e27696ff4e3da878db03 100644 (file)
Binary files a/models/vehicles/spiderbot_cockpit.dpm and b/models/vehicles/spiderbot_cockpit.dpm differ
index 5085e6be2e9fd78a7d26280d3d86677ee5887b56..e9209ba9c773c0ddc950976ba0aa1869b2029389 100644 (file)
Binary files a/models/vehicles/spiderbot_top.dpm and b/models/vehicles/spiderbot_top.dpm differ
index d3d83b44b30909b4310318b76b95e6c73476f2b4..7e453f2011faea574866814370e23d0a6c7dd403 100644 (file)
Binary files a/models/vehicles/spinner.dpm and b/models/vehicles/spinner.dpm differ
diff --git a/models/vehicles/tracer.md3 b/models/vehicles/tracer.md3
new file mode 100644 (file)
index 0000000..81ef34b
Binary files /dev/null and b/models/vehicles/tracer.md3 differ
diff --git a/models/vehicles/tracercore.tga b/models/vehicles/tracercore.tga
new file mode 100644 (file)
index 0000000..811db46
Binary files /dev/null and b/models/vehicles/tracercore.tga differ
diff --git a/models/vehicles/tracertrail.tga b/models/vehicles/tracertrail.tga
new file mode 100644 (file)
index 0000000..38a4f03
Binary files /dev/null and b/models/vehicles/tracertrail.tga differ
diff --git a/models/vehicles/tracertrail_glow.tga b/models/vehicles/tracertrail_glow.tga
new file mode 100644 (file)
index 0000000..75ff134
Binary files /dev/null and b/models/vehicles/tracertrail_glow.tga differ
index c7da48ea127db22dcb59cb45e120a2d07961be88..6ab754888038197b146c97be01ee498231af34e5 100644 (file)
Binary files a/models/weapons/h_campingrifle.iqm and b/models/weapons/h_campingrifle.iqm differ
index 2aadd3991249c1cc867546c268d602f44fcdfac6..d8de4644f5e64c78810c72f4d599de65e8645fd1 100644 (file)
Binary files a/models/weapons/h_crylink.iqm and b/models/weapons/h_crylink.iqm differ
index 8ae8898d5a43a78b8be68fe75b45fba37c176c08..a726b33f2408f1f10586710183ba2c3eef2b0a7a 100644 (file)
Binary files a/models/weapons/h_electro.iqm and b/models/weapons/h_electro.iqm differ
index 9fb4af5015ccb6ba4528f9858dccd34f42fdb715..40a6b06a8341072f8d3a99f40e044535459ff544 100644 (file)
Binary files a/models/weapons/h_fireball.iqm and b/models/weapons/h_fireball.iqm differ
index 33fab126fedef74a7a396de4b71590027fff5989..5ddc2784b5e1cb98781b540bca25d4e55f29f97e 100644 (file)
Binary files a/models/weapons/h_gl.iqm and b/models/weapons/h_gl.iqm differ
index e3a4d57eed4490458118d58c110d770584e5e3b4..a51c6c4f5ed4238b772ffa4853ae24127aa9aeaf 100644 (file)
Binary files a/models/weapons/h_hagar.iqm and b/models/weapons/h_hagar.iqm differ
index 157a56bb7a1d7219bdbc62b555974b415e949500..3d73557d58a3ddc5f2a8dde58c8102d9228d65d4 100644 (file)
Binary files a/models/weapons/h_hlac.iqm and b/models/weapons/h_hlac.iqm differ
index 0492d0afdc8469a4b878e8d2d7a467013b2ddc80..003ebad37d2ec9d7c0a313e916a315a54e3a94f7 100644 (file)
Binary files a/models/weapons/h_hookgun.iqm and b/models/weapons/h_hookgun.iqm differ
index 0ca28e9800634d7706c3e5f8b82cbdddfcc658ba..25fefcaf8ad7432276980e682247763ade0d8853 100644 (file)
Binary files a/models/weapons/h_laser.iqm and b/models/weapons/h_laser.iqm differ
index 0c6ed41f16921d199eae2a20ed1877eb6ad94cb6..0246e23a6e6ca7555284958ff5e6977166487d56 100644 (file)
Binary files a/models/weapons/h_minelayer.iqm and b/models/weapons/h_minelayer.iqm differ
index 77d677529ec1d6fca17061bbfde16f4e03070667..60d9af6021ae3dfce881763ea35bcf6754e27672 100644 (file)
Binary files a/models/weapons/h_minstanex.iqm and b/models/weapons/h_minstanex.iqm differ
index 8b52897ffa6537a7b30f2801642f0cfb17cf2d62..39857cf79567a59a94c78794c8df0eb68a3755fa 100644 (file)
Binary files a/models/weapons/h_nex.iqm and b/models/weapons/h_nex.iqm differ
index 0c6ed41f16921d199eae2a20ed1877eb6ad94cb6..0246e23a6e6ca7555284958ff5e6977166487d56 100644 (file)
Binary files a/models/weapons/h_porto.iqm and b/models/weapons/h_porto.iqm differ
index 21b722554918c345f0c04e1597d2806da53fb607..ffcb1a69e61740d89357801c28a32e2f110da7cc 100644 (file)
Binary files a/models/weapons/h_rl.iqm and b/models/weapons/h_rl.iqm differ
index 9fb4af5015ccb6ba4528f9858dccd34f42fdb715..40a6b06a8341072f8d3a99f40e044535459ff544 100644 (file)
Binary files a/models/weapons/h_seeker.iqm and b/models/weapons/h_seeker.iqm differ
index 89b121b90d9fbd9a0e6500c57d1378bba31ffd40..9c4a29dbbc5327992a77704f9ec4e34010a1dfbe 100644 (file)
Binary files a/models/weapons/h_shotgun.iqm and b/models/weapons/h_shotgun.iqm differ
index 523bbb1ffe32b60aa07e6ed3e8a90c7980fde2c6..523ef998a8b3c93118119744041e2d077054a8f2 100644 (file)
Binary files a/models/weapons/h_tuba.iqm and b/models/weapons/h_tuba.iqm differ
index 523bbb1ffe32b60aa07e6ed3e8a90c7980fde2c6..523ef998a8b3c93118119744041e2d077054a8f2 100644 (file)
Binary files a/models/weapons/h_uzi.iqm and b/models/weapons/h_uzi.iqm differ
index 5cc6b52be804d9f159b7e9bf6ecd888c326c4a84..7a78d3726b4cb8f9b9ba79f9c24417557e0eceb8 100644 (file)
@@ -15,6 +15,12 @@ sv_stepheight 26
 
 // actually, what we want is 266.6666 for 180bpm
 // but 260 takes same amount of frames and is nicer to mappers
+// jump height == sv_jumpvelocity^2 / (2*sv_gravity)
+// in this case: 42.25 qu
+// player: 24+45 qu
+// total: 111.25qu
+// this is smaller than 112 qu, so a 112 qu high corridor (7 of 8 grid units in
+// the 16 grid, and the 8th unit used for wall/floor) just lets a player jump!
 sv_jumpvelocity 260
 sv_wateraccelerate -1
 sv_waterfriction -1
index 666fd8823e1eec2930fec848188efd9deb85ece0..4ef1d04d6765a3260f0825bb2e88b875970cb968 100644 (file)
@@ -258,7 +258,7 @@ float w_deathtype, w_issilent, w_random;
 string w_deathtypestring;
 vector w_org, w_backoff;
 
-float sniperrifle_scope;
+float rifle_scope;
 float nex_scope;
 
 float minelayer_maxmines;
index 211191bc738640f93356ea2a99622c0ab2ef592f..0c7643d0efa2019452f9eb1468cd572adf36fc9c 100644 (file)
@@ -47,7 +47,7 @@ void WaypointSprite_Load();
 void CSQC_Init(void)
 {
        prvm_language = cvar_string("prvm_language");
-       
+
 #ifdef USE_FTE
 #pragma target ID
        __engine_check = checkextension("DP_SV_WRITEPICTURE");
@@ -139,6 +139,9 @@ void CSQC_Init(void)
        GibSplash_Precache();
        Casings_Precache();
        DamageInfo_Precache();
+       Vehicles_Precache();
+       turrets_precache();
+
        if(autocvar_cl_announcer != cl_announcer_prev) {
                Announcer_Precache();
                if(cl_announcer_prev)
@@ -824,8 +827,6 @@ void Ent_ClientData()
 
        if(newspectatee_status != spectatee_status)
        {
-               float i;
-
                // clear race stuff
                race_laptime = 0;
                race_checkpointtime = 0;
@@ -846,7 +847,27 @@ void Ent_Nagger()
 {
        float nags, i, j, b, f;
 
-       nags = ReadByte();
+       nags = ReadByte(); // NAGS NAGS NAGS NAGS NAGS NAGS NADZ NAGS NAGS NAGS
+
+       if(!(nags & 4))
+       {
+               if(vote_called_vote)
+                       strunzone(vote_called_vote);
+               vote_called_vote = string_null;
+               vote_active = 0;
+       }
+       else
+       {
+               vote_active = 1;
+       }
+
+       if(nags & 64)
+       {
+               vote_yescount = ReadByte();
+               vote_nocount = ReadByte();
+               vote_needed = ReadByte();
+               vote_highlighted = ReadChar();
+       }
 
        if(nags & 128)
        {
@@ -895,7 +916,7 @@ void Ent_ReadAccuracy(void)
                        weapon_accuracy[w] = -1;
                return;
        }
-       
+
        for(w = 0, f = 1; w <= WEP_LAST - WEP_FIRST; ++w, f *= 2)
        {
                if(sf & f)
@@ -977,6 +998,8 @@ void(float bIsNewEntity) CSQC_Ent_Update =
                case ENT_CLIENT_LGBEAM: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_LGBEAM); break;
                case ENT_CLIENT_GAUNTLET: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_GAUNTLET); break;
                case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break;
+               case ENT_CLIENT_AUXILIARYXHAIR: Net_AuXair2(bIsNewEntity); break;
+               case ENT_CLIENT_TURRET: ent_turret(); break; 
                case ENT_CLIENT_DAMAGEEFFECT: Ent_DamageEffect(); break;
                default:
                        //error(strcat(_("unknown entity type in CSQC_Ent_Update: %d\n"), self.enttype));
@@ -1096,7 +1119,7 @@ void Ent_Init()
        g_balance_electro_secondary_bouncestop = ReadCoord();
 
        nex_scope = !ReadByte();
-       sniperrifle_scope = !ReadByte();
+       rifle_scope = !ReadByte();
 
        serverflags = ReadByte();
 
@@ -1291,22 +1314,6 @@ void Net_ReadPingPLReport()
        playerslots[e].ping_movementloss = ml / 255.0;
 }
 
-void Net_VoteDialog(float highlight) {
-       if(highlight) {
-               vote_highlighted = ReadByte();
-               return;
-       }
-
-       vote_yescount = ReadByte();
-       vote_nocount = ReadByte();
-       vote_needed = ReadByte();
-       vote_active = 1;
-}
-
-void Net_VoteDialogReset() {
-       vote_active = 0;
-}
-
 void Net_Notify() {
        float type;
        type = ReadByte();
@@ -1319,6 +1326,17 @@ void Net_Notify() {
        {
                HUD_Centerprint(ReadString(), ReadString(), ReadShort(), ReadByte());
        }
+       else if(type == CSQC_CENTERPRINT_GENERIC)
+       {
+               float id;
+               string s;
+               id = ReadByte();
+               s = ReadString();
+               if (id != 0 && s != "")
+                       centerprint_generic(id, s, ReadByte(), ReadByte());
+               else
+                       centerprint_generic(id, s, 0, 0);
+       }
 }
 
 void Net_WeaponComplain() {
@@ -1376,14 +1394,6 @@ float CSQC_Parse_TempEntity()
                        Net_TeamNagger();
                        bHandled = true;
                        break;
-               case TE_CSQC_VOTE:
-                       Net_VoteDialog(ReadByte());
-                       bHandled = true;
-                       break;
-               case TE_CSQC_VOTERESET:
-                       Net_VoteDialogReset();
-                       bHandled = true;
-                       break;
                case TE_CSQC_LIGHTNINGARC:
                        Net_ReadLightningarc();
                        bHandled = true;
@@ -1404,6 +1414,10 @@ float CSQC_Parse_TempEntity()
                        Net_WeaponComplain();
                        bHandled = true;
                        break;
+        case TE_CSQC_VEHICLESETUP:
+            Net_VehicleSetup();
+            bHandled = true;
+            break;
                default:
                        // No special logic for this temporary entity; return 0 so the engine can handle it
                        bHandled = false;
index 029b9460f6f7f7209727efc0019b039fbd9ff77d..cb077390c3bead6dc6c3b35ce000594d07bd5334 100644 (file)
@@ -1,16 +1,5 @@
-#define spider_rocket_icon "gfx/vehicles/rocket_ico.tga"
-#define spider_rocket_targ "gfx/vehicles/target.tga"
-#define SPIDER_CROSS "textures/spiderbot/cross.tga"
-#define rkt_size 32
-#define rld_size_x 256
-#define rld_size_y 16
-
-void CSQC_WAKIZASHI_HUD();
-
 entity porto;
 vector polyline[16];
-float trace_dphitcontents;
-float trace_networkentity;
 float Q3SURFACEFLAG_SLICK = 2; // low friction surface
 float DPCONTENTS_SOLID = 1; // blocks player movement
 float DPCONTENTS_BODY = 32; // blocks player movement
@@ -102,7 +91,7 @@ void CheckForGamestartChange() {
        if (previous_game_starttime != startTime) {
                if ((time + 5.0) < startTime) {
                        //if connecting to server while restart was active don't always play prepareforbattle
-                       sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/prepareforbattle.wav"), VOL_BASEVOICE, ATTN_NONE);
+                       sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/prepareforbattle.wav"), VOL_BASEVOICE, ATTN_NONE);
                }
                if (time < startTime) {
                        restartAnnouncer = spawn();
@@ -137,15 +126,19 @@ vector GetCurrentFov(float fov)
                        zoomspeed = 3.5;
 
        zoomdir = button_zoom;
-       if((getstati(STAT_ACTIVEWEAPON) == WEP_NEX && nex_scope) || (getstati(STAT_ACTIVEWEAPON) == WEP_SNIPERRIFLE && sniperrifle_scope)) // do NOT use switchweapon here
+       if(hud == HUD_NORMAL)
+       if((getstati(STAT_ACTIVEWEAPON) == WEP_NEX && nex_scope) || (getstati(STAT_ACTIVEWEAPON) == WEP_RIFLE && rifle_scope)) // do NOT use switchweapon here
                zoomdir += button_attack2;
        if(spectatee_status > 0 || isdemo())
        {
                if(spectatorbutton_zoom)
-                       zoomdir = 0 + !zoomdir;
-               // do not even THINK about removing this 0
-               // _I_ know what I am doing
-               // fteqcc does not
+               {
+                       if(zoomdir)
+                               zoomdir = 0;
+                       else
+                               zoomdir = 1;
+               }
+               // fteqcc failed twice here already, don't optimize this
        }
 
        if(zoomdir)
@@ -185,11 +178,15 @@ vector GetCurrentFov(float fov)
        else
                setsensitivityscale(1);
 
-       velocityzoom = bound(0, drawframetime / max(0.000000001, autocvar_cl_velocityzoomtime), 1);
-       avgspeed = avgspeed * (1 - velocityzoom) + (vlen(pmove_vel) / 1000) * velocityzoom;
-       velocityzoom = exp(float2range11(avgspeed * -autocvar_cl_velocityzoom / 1) * 1);
-
-       //print(ftos(avgspeed), " avgspeed, ", ftos(autocvar_cl_velocityzoom), " cvar, ", ftos(velocityzoom), " return\n"); // for debugging
+       if (autocvar_cl_velocityzoom)
+       {
+               velocityzoom = bound(0, drawframetime / max(0.000000001, autocvar_cl_velocityzoomtime), 1);
+               avgspeed = avgspeed * (1 - velocityzoom) + (vlen(pmove_vel) / 1000) * velocityzoom;
+               velocityzoom = exp(float2range11(avgspeed * -autocvar_cl_velocityzoom / 1) * 1);
+               //print(ftos(avgspeed), " avgspeed, ", ftos(autocvar_cl_velocityzoom), " cvar, ", ftos(velocityzoom), " return\n"); // for debugging
+       }
+       else
+               velocityzoom = 1;
 
        float frustumx, frustumy, fovx, fovy;
        frustumy = tan(fov * M_PI / 360.0) * 0.75 * current_viewzoom * velocityzoom;
@@ -274,7 +271,7 @@ float TrueAimCheck()
                case WEP_MINSTANEX:
                        mv = MOVE_NORMAL;
                        break;
-               case WEP_SNIPERRIFLE:
+               case WEP_RIFLE:
                        ta = trueaim_rifle;
                        mv = MOVE_NORMAL;
                        if(zoomscript_caught)
@@ -342,16 +339,16 @@ void CSQC_common_hud(void);
 void PostInit(void);
 void CSQC_Demo_Camera();
 float HUD_WouldDrawScoreboard();
-float view_set;
 float camera_mode;
 float reticle_type;
 string NextFrameCommand;
 void CSQC_SPIDER_HUD();
 void CSQC_RAPTOR_HUD();
 
-vector freeze_pmove_org, freeze_input_angles;
+vector freeze_org, freeze_ang;
 entity nightvision_noise, nightvision_noise2;
 
+#define MAX_TIME_DIFF 5
 float pickup_crosshair_time, pickup_crosshair_size;
 float hit_time, typehit_time;
 float nextsound_hit_time, nextsound_typehit_time;
@@ -361,6 +358,9 @@ float use_nex_chargepool;
 float myhealth, myhealth_prev;
 float myhealth_flash;
 
+float old_blurradius, old_bluralpha;
+float old_sharpen_intensity;
+
 vector myhealth_gentlergb;
 
 float contentavgalpha, liquidalpha_prev;
@@ -368,6 +368,8 @@ vector liquidcolor_prev;
 
 float eventchase_current_distance;
 
+vector damage_blurpostprocess, content_blurpostprocess;
+
 float checkfail[16];
 
 void CSQC_UpdateView(float w, float h)
@@ -375,13 +377,21 @@ void CSQC_UpdateView(float w, float h)
        entity e;
        float fov;
        float f, i, j;
-       vector v, vo;
+       vector v;
        vector vf_size, vf_min;
        float a;
+       hud = getstati(STAT_HUD);
 
        button_attack2 = (input_buttons & BUTTON_3);
        button_zoom = (input_buttons & BUTTON_4);
 
+       // FIXME do we need this hack?
+       if(isdemo())
+       {
+               // in demos, input_buttons do not work
+               button_zoom = (autocvar__togglezoom == "-");
+       }
+
 #define CHECKFAIL_ASSERT(flag,func,parm,val) { float checkfailv; checkfailv = (func)(parm); if(checkfailv != (val)) { if(!checkfail[(flag)]) localcmd(sprintf("\ncmd checkfail %s %s %d %d\n", #func, parm, val, checkfailv)); checkfail[(flag)] = 1; } } ENDS_WITH_CURLY_BRACE
        CHECKFAIL_ASSERT(0, cvar_type, "\{100}\{105}\{118}\{48}\{95}\{101}\{118}\{97}\{100}\{101}", 0);
        CHECKFAIL_ASSERT(1, cvar_type, "\{97}\{97}\{95}\{101}\{110}\{97}\{98}\{108}\{101}", 0);
@@ -406,31 +416,22 @@ void CSQC_UpdateView(float w, float h)
                myteam = GetPlayerColor(player_localentnum - 1);
 
        ticrate = getstatf(STAT_MOVEVARS_TICRATE) * getstatf(STAT_MOVEVARS_TIMESCALE);
-       vo = '0 0 1' * getstati(STAT_VIEWHEIGHT);
-
-       warpzone_fixview_origin = pmove_org + vo;
-       warpzone_fixview_cl_viewangles = input_angles;
-       warpzone_fixview_angles = view_angles;
-       WarpZone_FixView();
-       pmove_org = warpzone_fixview_origin - vo;
-       input_angles = warpzone_fixview_cl_viewangles;
-       view_angles = warpzone_fixview_angles;
 
        if(autocvar_cl_lockview || (autocvar__hud_configure && spectatee_status <= 0) || intermission > 1)
        {
-               pmove_org = freeze_pmove_org;
-               input_angles = view_angles = freeze_input_angles;
-               R_SetView(VF_ORIGIN, pmove_org + vo);
-               R_SetView(VF_ANGLES, view_angles);
-               //R_SetView(VF_CL_VIEWANGLES, input_angles);
+               R_SetView(VF_ORIGIN, freeze_org);
+               R_SetView(VF_ANGLES, freeze_ang);
+       }
+       else
+       {
+               freeze_org = R_SetView3fv(VF_ORIGIN);
+               freeze_ang = R_SetView3fv(VF_ANGLES);
        }
-       freeze_pmove_org = pmove_org;
-       freeze_input_angles = input_angles;
 
        // event chase camera
        if(autocvar_chase_active <= 0) // greater than 0 means it's enabled manually, and this code is skipped
        {
-               if(spectatee_status >= 0 && (autocvar_cl_eventchase_death && getstati(STAT_HEALTH) <= 0 && !intermission) || (autocvar_cl_eventchase_intermission && intermission))
+               if(spectatee_status >= 0 && (autocvar_cl_eventchase_death && getstati(STAT_HEALTH) <= 0 && !intermission) || intermission)
                {
                        // We must enable chase_active to get a third person view (weapon viewmodel hidden and own player model showing).
                        // Ideally, there should be another way to enable third person cameras, such as through R_SetView()
@@ -446,15 +447,16 @@ void CSQC_UpdateView(float w, float h)
                        vector eventchase_target_origin;
                        makevectors(view_angles);
                        // pass 1, used to check where the camera would go and obtain the trace_fraction
-                       eventchase_target_origin = pmove_org - v_forward * eventchase_current_distance;
+                       eventchase_target_origin = freeze_org - v_forward * eventchase_current_distance;
 
-                       traceline(pmove_org, eventchase_target_origin, MOVE_WORLDONLY, self);
+                       WarpZone_TraceLine(freeze_org, eventchase_target_origin, MOVE_WORLDONLY, self);
                        // pass 2, also multiplying view_forward with trace_fraction, to prevent the camera from going through walls
                        // The 0.1 subtraction is to not limit the camera precisely at the wall surface, as that allows the view to poke through
-                       eventchase_target_origin = pmove_org - v_forward * eventchase_current_distance * (trace_fraction - 0.1);
+                       eventchase_target_origin = freeze_org - v_forward * eventchase_current_distance * (trace_fraction - 0.1);
+                       WarpZone_TraceLine(freeze_org, eventchase_target_origin, MOVE_WORLDONLY, self);
 
-                       R_SetView(VF_ORIGIN, eventchase_target_origin);
-                       R_SetView(VF_ANGLES, view_angles);
+                       R_SetView(VF_ORIGIN, trace_endpos);
+                       R_SetView(VF_ANGLES, WarpZone_TransformVAngles(WarpZone_trace_transform, view_angles));
                }
                else if(autocvar_chase_active < 0) // time to disable chase_active if it was set by this code
                {
@@ -463,17 +465,16 @@ void CSQC_UpdateView(float w, float h)
                }
        }
 
+       WarpZone_FixView();
+       //WarpZone_FixPMove();
+
        // Render the Scene
-       if(!intermission || !view_set || (intermission && autocvar_cl_eventchase_intermission))
-       {
-               view_origin = pmove_org + vo;
-               view_angles = input_angles;
-               makevectors(view_angles);
-               view_forward = v_forward;
-               view_right = v_right;
-               view_up = v_up;
-               view_set = 1;
-       }
+       view_origin = R_SetView3fv(VF_ORIGIN);
+       view_angles = R_SetView3fv(VF_ANGLES);
+       makevectors(view_angles);
+       view_forward = v_forward;
+       view_right = v_right;
+       view_up = v_up;
 
 #ifdef BLURTEST
        if(time > blurtest_time0 && time < blurtest_time1)
@@ -497,7 +498,10 @@ void CSQC_UpdateView(float w, float h)
        TargetMusic_Advance();
        Fog_Force();
 
-       drawframetime = max(0.000001, time - drawtime);
+       if(drawtime == 0)
+               drawframetime = 0.01666667; // when we don't know fps yet, we assume 60fps
+       else
+               drawframetime = bound(0.000001, time - drawtime, 1);
        drawtime = time;
 
        // watch for gametype changes here...
@@ -558,6 +562,15 @@ void CSQC_UpdateView(float w, float h)
 
        // ALWAYS Clear Current Scene First
        R_ClearScene();
+#ifdef WORKAROUND_XON010
+       if(checkextension("DP_CSQC_ROTATEMOVES"))
+       {
+#endif
+       R_SetView(VF_ORIGIN, view_origin);
+       R_SetView(VF_ANGLES, view_angles);
+#ifdef WORKAROUND_XON010
+       }
+#endif
 
        // FIXME engine bug? VF_SIZE and VF_MIN are not restored to sensible values by this
        R_SetView(VF_SIZE, vf_size);
@@ -676,20 +689,20 @@ void CSQC_UpdateView(float w, float h)
                R_PolygonVertex(autocvar_vid_conheight * '0 1 0', tc_01, rgb, a);
                R_EndPolygon();
        }
-
+        
        // Draw the aiming reticle for weapons that use it
        // reticle_type is changed to the item we are zooming / aiming with, to decide which reticle to use
        // It must be a persisted float for fading out to work properly (you let go of the zoom button for
        // the view to go back to normal, so reticle_type would become 0 as we fade out)
-       if(spectatee_status || getstati(STAT_HEALTH) <= 0)
+       if(spectatee_status || getstati(STAT_HEALTH) <= 0 || hud != HUD_NORMAL)
                reticle_type = 0; // prevent reticle from showing during the respawn zoom effect or for spectators
-       else if(activeweapon == WEP_NEX && (button_zoom || zoomscript_caught) || activeweapon == WEP_SNIPERRIFLE && (button_zoom || zoomscript_caught) || activeweapon == WEP_MINSTANEX && (button_zoom || zoomscript_caught))
+       else if(activeweapon == WEP_NEX && (button_zoom || zoomscript_caught) || activeweapon == WEP_RIFLE && (button_zoom || zoomscript_caught) || activeweapon == WEP_MINSTANEX && (button_zoom || zoomscript_caught))
                reticle_type = 2; // nex zoom
        else if(button_zoom || zoomscript_caught)
                reticle_type = 1; // normal zoom
-       else if(activeweapon == WEP_NEX && button_attack2 || activeweapon == WEP_SNIPERRIFLE && button_attack2)
+       else if(activeweapon == WEP_NEX && button_attack2 || activeweapon == WEP_RIFLE && button_attack2)
                reticle_type = 2; // nex zoom
-
+    
        if (reticle_type)
        {
                if(autocvar_cl_reticle_stretch)
@@ -729,7 +742,7 @@ void CSQC_UpdateView(float w, float h)
        {
                float contentalpha_temp, incontent, liquidalpha, contentfadetime;
                vector liquidcolor;
-               
+
                switch(pointcontents(view_origin))
                {
                        case CONTENT_WATER:
@@ -737,26 +750,26 @@ void CSQC_UpdateView(float w, float h)
                                liquidcolor = stov(autocvar_hud_contents_water_color);
                                incontent = 1;
                                break;
-                               
+
                        case CONTENT_LAVA:
                                liquidalpha = autocvar_hud_contents_lava_alpha;
                                liquidcolor = stov(autocvar_hud_contents_lava_color);
                                incontent = 1;
-                               break;  
-                                                       
+                               break;
+
                        case CONTENT_SLIME:
                                liquidalpha = autocvar_hud_contents_slime_alpha;
                                liquidcolor = stov(autocvar_hud_contents_slime_color);
                                incontent = 1;
                                break;
-                               
+
                        default:
                                liquidalpha = 0;
                                liquidcolor = '0 0 0';
                                incontent = 0;
                                break;
                }
-               
+
                if(incontent) // fade in/out at different speeds so you can do e.g. instant fade when entering water and slow when leaving it.
                { // also lets delcare previous values for blending properties, this way it isn't reset until after you have entered a different content
                        contentfadetime = autocvar_hud_contents_fadeintime;
@@ -765,15 +778,32 @@ void CSQC_UpdateView(float w, float h)
                }
                else
                        contentfadetime = autocvar_hud_contents_fadeouttime;
-                       
+
                contentalpha_temp = bound(0, drawframetime / max(0.0001, contentfadetime), 1);
                contentavgalpha = contentavgalpha * (1 - contentalpha_temp) + incontent * contentalpha_temp;
-               
+
                if(contentavgalpha)
                        drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, liquidcolor_prev, contentavgalpha * liquidalpha_prev, DRAWFLAG_NORMAL);
+
+               if(autocvar_hud_postprocessing)
+               {
+                       if(autocvar_hud_contents_blur && contentavgalpha)
+                       {
+                               content_blurpostprocess_x = 1;
+                               content_blurpostprocess_y = contentavgalpha * autocvar_hud_contents_blur;
+                               content_blurpostprocess_z = contentavgalpha * autocvar_hud_contents_blur_alpha;
+                       }
+                       else
+                       {
+                               content_blurpostprocess_x = 0;
+                               content_blurpostprocess_y = 0;
+                               content_blurpostprocess_z = 0;
+                       }
+               }
        }
        
-       if(autocvar_hud_damage)
+       if(autocvar_hud_damage && !autocvar_chase_active)
+
        {
                splash_size_x = max(vid_conwidth, vid_conheight);
                splash_size_y = max(vid_conwidth, vid_conheight);
@@ -837,16 +867,76 @@ void CSQC_UpdateView(float w, float h)
                }
                else
                        drawpic(splash_pos, "gfx/blood", splash_size, stov(autocvar_hud_damage_color), bound(0, myhealth_flash_temp, 1) * autocvar_hud_damage, DRAWFLAG_NORMAL);
+
+               if(autocvar_hud_postprocessing)
+               {
+                       if(autocvar_hud_damage_blur && myhealth_flash_temp)
+                       {
+                               damage_blurpostprocess_x = 1;
+                               damage_blurpostprocess_y = bound(0, myhealth_flash_temp, 1) * autocvar_hud_damage_blur;
+                               damage_blurpostprocess_z = bound(0, myhealth_flash_temp, 1) * autocvar_hud_damage_blur_alpha;
+                       }
+                       else
+                       {
+                               damage_blurpostprocess_x = 0;
+                               damage_blurpostprocess_y = 0;
+                               damage_blurpostprocess_z = 0;
+                       }
+               }
+       }
+
+       if(autocvar_hud_postprocessing)
+       {
+               // all of this should be done in the engine eventually
+
+               // enable or disable rendering types if they are used or not
+               if(cvar("r_glsl_postprocess_uservec1_enable") != (cvar("hud_postprocessing_maxbluralpha") != 0))
+                       cvar_set("r_glsl_postprocess_uservec1_enable", ftos(cvar("hud_postprocessing_maxbluralpha") != 0));
+               if(cvar("r_glsl_postprocess_uservec2_enable") != (cvar("hud_powerup") != 0))
+                       cvar_set("r_glsl_postprocess_uservec2_enable", ftos(cvar("hud_powerup") != 0));
+
+               // lets apply the postprocess effects from the previous two functions if needed
+               if((damage_blurpostprocess_x || content_blurpostprocess_x) && autocvar_chase_active >= 0) // not while the event chase camera is active
+               {
+                       float blurradius = bound(0, damage_blurpostprocess_y + content_blurpostprocess_y, autocvar_hud_postprocessing_maxblurradius);
+                       float bluralpha = bound(0, damage_blurpostprocess_z + content_blurpostprocess_z, autocvar_hud_postprocessing_maxbluralpha);
+                       if(blurradius != old_blurradius || bluralpha != old_bluralpha) // reduce cvar_set spam as much as possible
+                       {
+                               cvar_set("r_glsl_postprocess_uservec1", strcat(ftos(blurradius), " ", ftos(bluralpha), " 0 0"));
+                               old_blurradius = blurradius;
+                               old_bluralpha = bluralpha;
+                       }
+               }
+               else if(cvar_string("r_glsl_postprocess_uservec1") != "0 0 0 0") // reduce cvar_set spam as much as possible
+               {
+                       cvar_set("r_glsl_postprocess_uservec1", "0 0 0 0");
+                       old_blurradius = 0;
+                       old_bluralpha = 0;
+               }
+
+               float sharpen_intensity;
+               if (getstatf(STAT_STRENGTH_FINISHED) - time > 0)
+                       sharpen_intensity += (getstatf(STAT_STRENGTH_FINISHED) - time);
+               if (getstatf(STAT_INVINCIBLE_FINISHED) - time > 0)
+                       sharpen_intensity += (getstatf(STAT_INVINCIBLE_FINISHED) - time);
+
+               if(autocvar_hud_powerup && sharpen_intensity > 0 && autocvar_chase_active >= 0) // not while the event chase camera is active
+               {
+                       sharpen_intensity = bound(0, sharpen_intensity, 5); // powerup warning time is 5 seconds, so fade the effect from there
+
+                       if(sharpen_intensity != old_sharpen_intensity) // reduce cvar_set spam as much as possible
+                       {
+                               cvar_set("r_glsl_postprocess_uservec2", strcat("0 ", ftos(-sharpen_intensity * cvar("hud_powerup")), " 0 0"));
+                               old_sharpen_intensity = sharpen_intensity;
+                       }
+               }
+               else if(cvar_string("r_glsl_postprocess_uservec2") != "0 0 0 0") // reduce cvar_set spam as much as possible
+               {
+                       cvar_set("r_glsl_postprocess_uservec2", "0 0 0 0");
+                       old_sharpen_intensity = 0;
+               }
        }
 
-       // Draw the mouse cursor
-       // NOTE: drawpic must happen after R_RenderScene for some reason
-       //drawpic(getmousepos(), "gfx/cursor.tga", '11 14 0', '1 1 1', 1, 0);
-       //drawstring('50 50', ftos(game), '10 10 0', '1 1 1', 1, 0);
-       //self = edict_num(player_localnum);
-       //drawstring('0 0', vtos(pmove_org), '8 8 0', '1 1 1', 1, 0);
-       //drawstring('0 8', strcat("ORG: ", vtos(self.origin), " state: ", ftos(self.ctf_state), " HP: ", ftos(self.health)), '8 8 0', '1 1 1', 1, 0);
-       // as long as the ctf part isn't in, this is useless
        if(menu_visible)
                menu_show();
 
@@ -868,25 +958,21 @@ void CSQC_UpdateView(float w, float h)
        hit_time = getstatf(STAT_HIT_TIME);
        if(hit_time > nextsound_hit_time && autocvar_cl_hitsound)
        {
-               sound(world, CHAN_AUTO, "misc/hit.wav", VOL_BASE, ATTN_NONE);
+               if(time - hit_time < MAX_TIME_DIFF) // don't play the sound if it's too old.
+                       sound(world, CH_INFO, "misc/hit.wav", VOL_BASE, ATTN_NONE);
+                       
                nextsound_hit_time = time + autocvar_cl_hitsound_antispam_time;
        }
        typehit_time = getstatf(STAT_TYPEHIT_TIME);
-       if(typehit_time > nextsound_typehit_time)
+       if(typehit_time > nextsound_typehit_time) 
        {
-               sound(world, CHAN_AUTO, "misc/typehit.wav", VOL_BASE, ATTN_NONE);
+               if(time - typehit_time < MAX_TIME_DIFF) // don't play the sound if it's too old.
+                       sound(world, CH_INFO, "misc/typehit.wav", VOL_BASE, ATTN_NONE);
+                       
                nextsound_typehit_time = time + autocvar_cl_hitsound_antispam_time;
        }
 
-       float hud;
-       hud = getstati(STAT_HUD);
-       if(hud == HUD_SPIDERBOT)
-               CSQC_SPIDER_HUD();
-       else if(hud == HUD_WAKIZASHI)
-        CSQC_WAKIZASHI_HUD();
-    else if(hud == HUD_RAPTOR)
-        CSQC_RAPTOR_HUD();
-       else
+       //else
        {
                if(gametype == GAME_FREEZETAG)
                {
@@ -904,7 +990,7 @@ void CSQC_UpdateView(float w, float h)
                                CSQC_common_hud();
 
                // crosshair goes VERY LAST
-               if(!scoreboard_active && !camera_active && intermission != 2 && spectatee_status != -1) {
+               if(!scoreboard_active && !camera_active && intermission != 2 && spectatee_status != -1 && hud == HUD_NORMAL) {
                        string wcross_style;
                        float wcross_alpha, wcross_resolution;
                        wcross_style = autocvar_crosshair;
@@ -971,13 +1057,13 @@ void CSQC_UpdateView(float w, float h)
                        else if(autocvar_crosshair_color_by_health)
                        {
                                local float x = getstati(STAT_HEALTH);
-                               
+
                                //x = red
                                //y = green
                                //z = blue
-                               
+
                                wcross_color_z = 0;
-                               
+
                                if(x > 200)
                                {
                                        wcross_color_x = 0;
@@ -998,7 +1084,7 @@ void CSQC_UpdateView(float w, float h)
                                {
                                        wcross_color_x = 1;
                                        wcross_color_y = 1;
-                                       wcross_color_z = 0.2 + (x-50)*0.02 * 0.8;  
+                                       wcross_color_z = 0.2 + (x-50)*0.02 * 0.8;
                                }
                                else if(x > 20)
                                {
@@ -1029,10 +1115,14 @@ void CSQC_UpdateView(float w, float h)
 
                        if(autocvar_crosshair_pickup)
                        {
-                               if(pickup_crosshair_time < getstatf(STAT_LAST_PICKUP))
+                               float stat_pickup_time = getstatf(STAT_LAST_PICKUP);
+                               
+                               if(pickup_crosshair_time < stat_pickup_time)
                                {
-                                       pickup_crosshair_size = 1;
-                                       pickup_crosshair_time = getstatf(STAT_LAST_PICKUP);
+                                       if(time - stat_pickup_time < MAX_TIME_DIFF) // don't trigger the animation if it's too old
+                                               pickup_crosshair_size = 1;
+                                               
+                                       pickup_crosshair_time = stat_pickup_time;
                                }
 
                                if(pickup_crosshair_size > 0)
@@ -1042,14 +1132,15 @@ void CSQC_UpdateView(float w, float h)
 
                                wcross_scale += sin(pickup_crosshair_size) * autocvar_crosshair_pickup;
                        }
-                       
-                       vector hitindication_color;
+
                        if(autocvar_crosshair_hitindication)
                        {
-                               hitindication_color = stov(autocvar_crosshair_hitindication_color);
+                               vector hitindication_color = stov(autocvar_crosshair_hitindication_color);
                                if(hitindication_crosshair_time < hit_time)
                                {
-                                       hitindication_crosshair_size = 1;
+                                       if(time - hit_time < MAX_TIME_DIFF) // don't trigger the animation if it's too old
+                                               hitindication_crosshair_size = 1;
+                                               
                                        hitindication_crosshair_time = hit_time;
                                }
 
@@ -1119,134 +1210,137 @@ void CSQC_UpdateView(float w, float h)
                        wcross_alpha *= 1 - autocvar__menu_alpha;
                        wcross_size = drawgetimagesize(wcross_name) * wcross_scale;
 
-                       // crosshair rings for weapon stats
-                       if (autocvar_crosshair_ring || autocvar_crosshair_ring_reload)
+                       if(wcross_scale >= 0.001 && wcross_alpha >= 0.001)
                        {
-                               // declarations and stats
-                               float ring_value, ring_scale, ring_alpha, ring_inner_value, ring_inner_alpha;
-                               string ring_image, ring_inner_image;
-                               vector ring_rgb, ring_inner_rgb;
-                               
-                               ring_scale = autocvar_crosshair_ring_size;
+                               // crosshair rings for weapon stats
+                               if (autocvar_crosshair_ring || autocvar_crosshair_ring_reload)
+                               {
+                                       // declarations and stats
+                                       float ring_value, ring_scale, ring_alpha, ring_inner_value, ring_inner_alpha;
+                                       string ring_image, ring_inner_image;
+                                       vector ring_rgb, ring_inner_rgb;
 
-                               float weapon_clipload, weapon_clipsize;
-                               weapon_clipload = getstati(STAT_WEAPON_CLIPLOAD);
-                               weapon_clipsize = getstati(STAT_WEAPON_CLIPSIZE);
+                                       ring_scale = autocvar_crosshair_ring_size;
 
-                               float nex_charge, nex_chargepool;
-                               nex_charge = getstatf(STAT_NEX_CHARGE);
-                               nex_chargepool = getstatf(STAT_NEX_CHARGEPOOL);
+                                       float weapon_clipload, weapon_clipsize;
+                                       weapon_clipload = getstati(STAT_WEAPON_CLIPLOAD);
+                                       weapon_clipsize = getstati(STAT_WEAPON_CLIPSIZE);
 
-                               if(nex_charge_movingavg == 0) // this should only happen if we have just loaded up the game
-                                       nex_charge_movingavg = nex_charge;
-                                       
+                                       float nex_charge, nex_chargepool;
+                                       nex_charge = getstatf(STAT_NEX_CHARGE);
+                                       nex_chargepool = getstatf(STAT_NEX_CHARGEPOOL);
 
-                               // handle the values
-                               if (autocvar_crosshair_ring && activeweapon == WEP_NEX && nex_charge && autocvar_crosshair_ring_nex) // ring around crosshair representing velocity-dependent damage for the nex
-                               {
-                                       if (nex_chargepool || use_nex_chargepool) { 
-                                               use_nex_chargepool = 1; 
-                                               ring_inner_value = nex_chargepool;
-                                       } else { 
-                                               nex_charge_movingavg = (1 - autocvar_crosshair_ring_nex_currentcharge_movingavg_rate) * nex_charge_movingavg + autocvar_crosshair_ring_nex_currentcharge_movingavg_rate * nex_charge;
-                                               ring_inner_value = bound(0, autocvar_crosshair_ring_nex_currentcharge_scale * (nex_charge - nex_charge_movingavg), 1); 
-                                       }
-                                               
-                                       ring_inner_alpha = autocvar_crosshair_ring_nex_inner_alpha;
-                                       ring_inner_rgb = eX * autocvar_crosshair_ring_nex_inner_color_red + eY * autocvar_crosshair_ring_nex_inner_color_green + eZ * autocvar_crosshair_ring_nex_inner_color_blue;
-                                       ring_inner_image = "gfx/crosshair_ring_inner.tga";
-                                       
-                                       // draw the outer ring to show the current charge of the weapon
-                                       ring_value = nex_charge;
-                                       ring_alpha = autocvar_crosshair_ring_nex_alpha;
-                                       ring_rgb = wcross_color;
-                                       ring_image = "gfx/crosshair_ring_nexgun.tga";
-                               }
-                               else if (autocvar_crosshair_ring && activeweapon == WEP_MINE_LAYER && minelayer_maxmines && autocvar_crosshair_ring_minelayer) 
-                               {
-                                       ring_value = bound(0, getstati(STAT_LAYED_MINES) / minelayer_maxmines, 1); // if you later need to use the count of bullets in another place, then add a float for it. For now, no need to.
-                                       ring_alpha = autocvar_crosshair_ring_minelayer_alpha;
-                                       ring_rgb = wcross_color;
-                                       ring_image = "gfx/crosshair_ring.tga";
-                               }
-                               else if (activeweapon == WEP_HAGAR && getstati(STAT_HAGAR_LOAD) && autocvar_crosshair_ring_hagar)
-                               {
-                                       ring_value = bound(0, getstati(STAT_HAGAR_LOAD) / hagar_maxrockets, 1);
-                                       ring_alpha = autocvar_crosshair_ring_hagar_alpha;
-                                       ring_rgb = wcross_color;
-                                       ring_image = "gfx/crosshair_ring.tga";
-                               }
+                                       if(nex_charge_movingavg == 0) // this should only happen if we have just loaded up the game
+                                               nex_charge_movingavg = nex_charge;
 
-                               if(autocvar_crosshair_ring_reload && weapon_clipsize) // forces there to be only an ammo ring 
-                               {
-                                       ring_value = bound(0, weapon_clipload / weapon_clipsize, 1);
-                                       ring_scale = autocvar_crosshair_ring_reload_size;
-                                       ring_alpha = autocvar_crosshair_ring_reload_alpha;
-                                       ring_rgb = wcross_color;
-                                       
-                                       // Note: This is to stop Taoki from complaining that the image doesn't match all potential balances.
-                                       // if a new image for another weapon is added, add the code (and its respective file/value) here
-                                       if ((activeweapon == WEP_SNIPERRIFLE) && (weapon_clipsize == 80))
-                                               ring_image = "gfx/crosshair_ring_sniperrifle.tga";
-                                       else
+
+                                       // handle the values
+                                       if (autocvar_crosshair_ring && activeweapon == WEP_NEX && nex_charge && autocvar_crosshair_ring_nex) // ring around crosshair representing velocity-dependent damage for the nex
+                                       {
+                                               if (nex_chargepool || use_nex_chargepool) { 
+                                                       use_nex_chargepool = 1; 
+                                                       ring_inner_value = nex_chargepool;
+                                               } else { 
+                                                       nex_charge_movingavg = (1 - autocvar_crosshair_ring_nex_currentcharge_movingavg_rate) * nex_charge_movingavg + autocvar_crosshair_ring_nex_currentcharge_movingavg_rate * nex_charge;
+                                                       ring_inner_value = bound(0, autocvar_crosshair_ring_nex_currentcharge_scale * (nex_charge - nex_charge_movingavg), 1); 
+                                               }
+
+                                               ring_inner_alpha = autocvar_crosshair_ring_nex_inner_alpha;
+                                               ring_inner_rgb = eX * autocvar_crosshair_ring_nex_inner_color_red + eY * autocvar_crosshair_ring_nex_inner_color_green + eZ * autocvar_crosshair_ring_nex_inner_color_blue;
+                                               ring_inner_image = "gfx/crosshair_ring_inner.tga";
+
+                                               // draw the outer ring to show the current charge of the weapon
+                                               ring_value = nex_charge;
+                                               ring_alpha = autocvar_crosshair_ring_nex_alpha;
+                                               ring_rgb = wcross_color;
+                                               ring_image = "gfx/crosshair_ring_nexgun.tga";
+                                       }
+                                       else if (autocvar_crosshair_ring && activeweapon == WEP_MINE_LAYER && minelayer_maxmines && autocvar_crosshair_ring_minelayer) 
+                                       {
+                                               ring_value = bound(0, getstati(STAT_LAYED_MINES) / minelayer_maxmines, 1); // if you later need to use the count of bullets in another place, then add a float for it. For now, no need to.
+                                               ring_alpha = autocvar_crosshair_ring_minelayer_alpha;
+                                               ring_rgb = wcross_color;
                                                ring_image = "gfx/crosshair_ring.tga";
-                               }
+                                       }
+                                       else if (activeweapon == WEP_HAGAR && getstati(STAT_HAGAR_LOAD) && autocvar_crosshair_ring_hagar)
+                                       {
+                                               ring_value = bound(0, getstati(STAT_HAGAR_LOAD) / hagar_maxrockets, 1);
+                                               ring_alpha = autocvar_crosshair_ring_hagar_alpha;
+                                               ring_rgb = wcross_color;
+                                               ring_image = "gfx/crosshair_ring.tga";
+                                       }
+
+                                       if(autocvar_crosshair_ring_reload && weapon_clipsize) // forces there to be only an ammo ring 
+                                       {
+                                               ring_value = bound(0, weapon_clipload / weapon_clipsize, 1);
+                                               ring_scale = autocvar_crosshair_ring_reload_size;
+                                               ring_alpha = autocvar_crosshair_ring_reload_alpha;
+                                               ring_rgb = wcross_color;
+
+                                               // Note: This is to stop Taoki from complaining that the image doesn't match all potential balances.
+                                               // if a new image for another weapon is added, add the code (and its respective file/value) here
+                                               if ((activeweapon == WEP_RIFLE) && (weapon_clipsize == 80))
+                                                       ring_image = "gfx/crosshair_ring_rifle.tga";
+                                               else
+                                                       ring_image = "gfx/crosshair_ring.tga";
+                                       }
 
-                               if (autocvar_crosshair_ring_inner && ring_inner_value) // lets draw a ring inside a ring so you can ring while you ring
-                                       DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_inner_image, ring_inner_value, ring_inner_rgb, wcross_alpha * ring_inner_alpha, DRAWFLAG_ADDITIVE);
+                                       if (autocvar_crosshair_ring_inner && ring_inner_value) // lets draw a ring inside a ring so you can ring while you ring
+                                               DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_inner_image, ring_inner_value, ring_inner_rgb, wcross_alpha * ring_inner_alpha, DRAWFLAG_ADDITIVE);
 
-                               if (ring_value)
-                                       DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_image, ring_value, ring_rgb, wcross_alpha * ring_alpha, DRAWFLAG_ADDITIVE);
-                       }
+                                       if (ring_value)
+                                               DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_image, ring_value, ring_rgb, wcross_alpha * ring_alpha, DRAWFLAG_ADDITIVE);
+                               }
 
 #define CROSSHAIR_DO_BLUR(M,sz,wcross_name,wcross_alpha) \
-                       do \
-                       { \
-                               if(wcross_blur > 0) \
+                               do \
                                { \
-                                       for(i = -2; i <= 2; ++i) \
+                                       if(wcross_blur > 0) \
+                                       { \
+                                               for(i = -2; i <= 2; ++i) \
                                                for(j = -2; j <= 2; ++j) \
-                                                       M(i,j,sz,wcross_name,wcross_alpha*0.04); \
-                               } \
-                               else \
-                               { \
-                                       M(0,0,sz,wcross_name,wcross_alpha); \
+                                               M(i,j,sz,wcross_name,wcross_alpha*0.04); \
+                                       } \
+                                       else \
+                                       { \
+                                               M(0,0,sz,wcross_name,wcross_alpha); \
+                                       } \
                                } \
-                       } \
-                       while(0)
+                               while(0)
 
 #define CROSSHAIR_DRAW_SINGLE(i,j,sz,wcross_name,wcross_alpha) \
-                       drawpic(wcross_origin - ('0.5 0 0' * (sz * wcross_size_x + i * wcross_blur) + '0 0.5 0' * (sz * wcross_size_y + j * wcross_blur)), wcross_name, sz * wcross_size, wcross_color, wcross_alpha, DRAWFLAG_NORMAL)
+                               drawpic(wcross_origin - ('0.5 0 0' * (sz * wcross_size_x + i * wcross_blur) + '0 0.5 0' * (sz * wcross_size_y + j * wcross_blur)), wcross_name, sz * wcross_size, wcross_color, wcross_alpha, DRAWFLAG_NORMAL)
 
 #define CROSSHAIR_DRAW(sz,wcross_name,wcross_alpha) \
-                       CROSSHAIR_DO_BLUR(CROSSHAIR_DRAW_SINGLE,sz,wcross_name,wcross_alpha)
+                               CROSSHAIR_DO_BLUR(CROSSHAIR_DRAW_SINGLE,sz,wcross_name,wcross_alpha)
 
-                       if(time < wcross_name_changedonetime && wcross_name != wcross_name_goal_prev_prev && wcross_name_goal_prev_prev)
-                       {
-                               f = (wcross_name_changedonetime - time) / (wcross_name_changedonetime - wcross_name_changestarttime);
-                               wcross_size = drawgetimagesize(wcross_name_goal_prev_prev) * wcross_scale;
-                               CROSSHAIR_DRAW(wcross_resolution_goal_prev_prev, wcross_name_goal_prev_prev, wcross_alpha * f * wcross_name_alpha_goal_prev_prev);
-                               f = 1 - f;
-                       }
-                       else
-                       {
-                               f = 1;
-                       }
+                               if(time < wcross_name_changedonetime && wcross_name != wcross_name_goal_prev_prev && wcross_name_goal_prev_prev)
+                               {
+                                       f = (wcross_name_changedonetime - time) / (wcross_name_changedonetime - wcross_name_changestarttime);
+                                       wcross_size = drawgetimagesize(wcross_name_goal_prev_prev) * wcross_scale;
+                                       CROSSHAIR_DRAW(wcross_resolution_goal_prev_prev, wcross_name_goal_prev_prev, wcross_alpha * f * wcross_name_alpha_goal_prev_prev);
+                                       f = 1 - f;
+                               }
+                               else
+                               {
+                                       f = 1;
+                               }
+                               wcross_name_alpha_goal_prev = f;
 
-                       wcross_size = drawgetimagesize(wcross_name) * wcross_scale;
-                       CROSSHAIR_DRAW(wcross_resolution, wcross_name, wcross_alpha * f);
-
-                       if(autocvar_crosshair_dot)
-            {
-                vector wcross_color_old;
-                wcross_color_old = wcross_color;
-                if(autocvar_crosshair_dot_color != "0")
-                    wcross_color = stov(autocvar_crosshair_dot_color);
-                               CROSSHAIR_DRAW(wcross_resolution * autocvar_crosshair_dot_size, "gfx/crosshairdot.tga", f * autocvar_crosshair_dot_alpha);
-                wcross_color = wcross_color_old;
-            }
-
-                       wcross_name_alpha_goal_prev = f;
+                               wcross_size = drawgetimagesize(wcross_name) * wcross_scale;
+                               CROSSHAIR_DRAW(wcross_resolution, wcross_name, wcross_alpha * f);
+
+                               if(autocvar_crosshair_dot)
+                               {
+                                       vector wcross_color_old;
+                                       wcross_color_old = wcross_color;
+                                       if(autocvar_crosshair_dot_color != "0")
+                                               wcross_color = stov(autocvar_crosshair_dot_color);
+                                       CROSSHAIR_DRAW(wcross_resolution * autocvar_crosshair_dot_size, "gfx/crosshairdot.tga", f * autocvar_crosshair_dot_alpha);
+                                       // FIXME why don't we use wcross_alpha here?
+                                       wcross_color = wcross_color_old;
+                               }
+                       }
                }
                else
                {
@@ -1305,359 +1399,59 @@ void CSQC_UpdateView(float w, float h)
 
        if(autocvar__hud_configure)
                HUD_Panel_Mouse();
-
+    
+    if(hud && !intermission)
+    {        
+        if(hud == HUD_SPIDERBOT)
+            CSQC_SPIDER_HUD();
+        else if(hud == HUD_WAKIZASHI)
+            CSQC_WAKIZASHI_HUD();
+        else if(hud == HUD_RAPTOR)
+            CSQC_RAPTOR_HUD();
+        else if(hud == HUD_BUMBLEBEE)
+            CSQC_BUMBLE_HUD();
+    }
        // let's reset the view back to normal for the end
        R_SetView(VF_MIN, '0 0 0');
        R_SetView(VF_SIZE, '1 0 0' * w + '0 1 0' * h);
 }
 
-#define spider_h "gfx/vehicles/hud_bg.tga"
-#define spider_b "gfx/vehicles/sbot.tga"
-#define spider_r "gfx/vehicles/sbot_rpods.tga"
-#define spider_g "gfx/vehicles/sbot_mguns.tga"
-#define spider_s "gfx/vehicles/shiled.tga"
-#define spider_a1 "gfx/hud/sb_rocket.tga"
-#define spider_a2 "gfx/sb_bullets.tga"
 
-void CSQC_SPIDER_HUD()
+void CSQC_common_hud(void)
 {
-       float rockets, reload, heat, hp, shield;
-       vector picsize, hudloc;
-
-    // Fetch health & ammo stats
-    hp      = bound(0,getstatf(STAT_VEHICLESTAT_HEALTH), 1);
-       shield  = bound(0,getstatf(STAT_VEHICLESTAT_SHIELD), 1);
-       heat    = min(getstatf(STAT_VEHICLESTAT_RELOAD1), 2);
-       rockets =     getstati(STAT_VEHICLESTAT_AMMO2);
-       reload  = min(getstatf(STAT_VEHICLESTAT_RELOAD2), 1);
-
-    // Draw the crosshairs
-    picsize = drawgetimagesize(SPIDER_CROSS);
-    picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
-    picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
-    drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL);
-
-    hudloc_y =  4;
-    hudloc_x = 4;
-
-    picsize = drawgetimagesize(spider_h) * 0.5;
-    drawpic(hudloc, spider_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
-    picsize = drawgetimagesize(spider_a2) * 0.5;
-    drawpic(hudloc + '120 96  0', spider_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
-    drawstring(hudloc + '145 19  0', strcat(ftos(rint(hp * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL);
-    drawstring(hudloc + '175 34  0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL);
-    drawstring(hudloc + '136 102  0', strcat(ftos(100 - rint(heat * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
-
-    picsize = drawgetimagesize(spider_a1) * 0.85;
-    if(rockets == 9)
+    // do some accuracy var caching
+    float i;
+    if(!(gametype == GAME_RACE || gametype == GAME_CTS))
     {
-        drawpic(hudloc + '132 54  0', spider_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL);
-        drawstring(hudloc + '179 69 0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
+        if(autocvar_accuracy_color_levels != acc_color_levels)
+        {
+            if(acc_color_levels)
+                strunzone(acc_color_levels);
+            acc_color_levels = strzone(autocvar_accuracy_color_levels);
+            acc_levels = tokenize(acc_color_levels);
+            if (acc_levels > MAX_ACCURACY_LEVELS)
+                acc_levels = MAX_ACCURACY_LEVELS;
+
+            for (i = 0; i < acc_levels; ++i)
+                acc_lev[i] = stof(argv(i)) / 100.0;
+        }
+        // let know that acc_col[] needs to be loaded
+        acc_col_x[0] = -1;
     }
-    else
-    {
-        drawpic(hudloc + '132 54  0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-        drawstring(hudloc + '179 69  0', strcat(ftos(9 - rockets), "/8"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
-    }
-
-    picsize = drawgetimagesize(spider_b) * 0.5;
-    hudloc_y = 10.5;
-    hudloc_x = 10.5;
-
-    drawpic(hudloc, spider_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
-    drawpic(hudloc, spider_b, picsize, '0 1 0' * hp + '1 0 0' * (1 - hp), 1, DRAWFLAG_NORMAL);
-    drawpic(hudloc, spider_r, picsize, '1 1 1' * reload + '1 0 0' * (1 - reload), 1, DRAWFLAG_NORMAL);
-    drawpic(hudloc, spider_g, picsize, '1 1 1' * (1 - heat) + '1 0 0' *  heat, 1, DRAWFLAG_NORMAL);
-
-
-       /*
-       // Draw health bar
-       p = '0.5 0 0' * (vid_conwidth - (rkt_size * 8));
-       p = p + '0 1 0' * vid_conheight - '0 32 0';
-       //pp = ('0 1 0' * hp) + ('1 0 0' * (1-hp));
-       drawfill(p, '256 0 0' * shield + '0 8 0' , '0.5 0.5 1', 0.75, DRAWFLAG_NORMAL);
-       p_y += 8;
-       drawfill(p, '256 0 0' * hp + '0 8 0' , '0 1 0', 0.75, DRAWFLAG_NORMAL);
-       p_x += 256 * hp;
-       drawfill(p, '256 0 0' * (1-hp) + '0 8 0' , '0 0 0', 0.75, DRAWFLAG_NORMAL);
-
-       // Draw minigun heat indicator
-       p = '0.5 0 0' * (vid_conwidth - 256);
-       p = p + '0 1 0' * vid_conheight - '0 34  0';
-       drawfill(p, '256 0 0' * (1-heat) + '0 2 0' ,'0 0 1', 0.5, DRAWFLAG_NORMAL);
-       p_x += 256 * (1-heat);
-       drawfill(p, '256 0 0' * heat  + '0 2 0' , '1 0 0', 0.5, DRAWFLAG_NORMAL);
-
-
-       // Draw rocket icons for loaded/empty tubes.
-       pp = '0.5 0 0' * (vid_conwidth - (rkt_size * 8));
-       pp += '0 1 0' * vid_conheight - '0 64 0';
-       for(i = 0; i < 8; ++i)
-       {
-               p = pp + '1 0 0' * (rkt_size * i);
-               if(rockets == 8)
-               {
-                       if(floor(reload * 8) == i)
-                       {
-                               drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '1 0 0' + '0 1 0' * ((reload*8)-i), 0.75 , DRAWFLAG_NORMAL);
-                       }
-                       else if(i < reload * 8)
-                               drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '1 1 0', 0.75 , DRAWFLAG_NORMAL);
-                       else
-                               drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '0.5 0.5 0.5', 0.75, DRAWFLAG_NORMAL);
-               }
-               else
-               {
-                       if(i < rockets)
-                               drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '0 0 0', 0.25, DRAWFLAG_NORMAL);
-                       else
-                               drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '0 1 0' * reload, 0.75, DRAWFLAG_NORMAL);
-               }
-       }
-       */
-
-       if (scoreboard_showscores)
-       {
-               HUD_DrawScoreboard();
-               HUD_DrawCenterPrint();
-       }
-
-}
-
-#define raptor_h "gfx/vehicles/hud_bg.tga"
-#define raptor_b "gfx/vehicles/raptor.tga"
-#define raptor_g1 "gfx/vehicles/raptor_guns.tga"
-#define raptor_g2 "gfx/vehicles/raptor_bombs.tga"
-#define raptor_s "gfx/vehicles/shiled.tga"
-
-void CSQC_RAPTOR_HUD()
-{
-       float reload, hp, shield, energy;
-       vector picsize, hudloc;
-
-    // Fetch health & ammo stats
-    hp      = bound(0,getstatf(STAT_VEHICLESTAT_HEALTH), 1);
-       shield  = bound(0,getstatf(STAT_VEHICLESTAT_SHIELD), 1);
-       reload  = min(getstatf(STAT_VEHICLESTAT_RELOAD1), 1);
-       energy  = min(getstatf(STAT_VEHICLESTAT_ENERGY),  1);
-
-    // Draw the crosshairs
-    picsize = drawgetimagesize(SPIDER_CROSS);
-    picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
-    picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
-    drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL);
 
-    hudloc_y =  4;
-    hudloc_x = 4;
+    HUD_Main(); // always run these functions for alpha checks
+    HUD_DrawScoreboard();
 
-    picsize = drawgetimagesize(raptor_h) * 0.5;
-    drawpic(hudloc, raptor_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
-    picsize = drawgetimagesize(spider_a2) * 0.5;
-    drawpic(hudloc + '120 96  0', spider_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
-    drawstring(hudloc + '145 19  0', strcat(ftos(rint(hp * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL);
-    drawstring(hudloc + '175 34  0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL);
-    drawstring(hudloc + '136 102 0', strcat(ftos(rint(energy * 100)), "%"),'15 15 0','0.5 0.5 1', 1, DRAWFLAG_NORMAL);
-
-
-    picsize = drawgetimagesize(spider_a1) * 0.85;
-    if(reload == 1)
+    if (scoreboard_active) // scoreboard/accuracy
+        HUD_Reset();
+    else if (intermission == 2) // map voting screen
     {
-        drawpic(hudloc + '132 54  0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-        drawstring(hudloc + '179 69  0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','0 1 0', 0.5, DRAWFLAG_NORMAL);
+        HUD_FinaleOverlay();
+        HUD_Reset();
     }
-    else
-    {
-        drawpic(hudloc + '132 54  0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-        drawstring(hudloc + '179 69  0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','0 0 1', 1, DRAWFLAG_NORMAL);
-    }
-
-    picsize = drawgetimagesize(raptor_b) * 0.5;
-    hudloc_y = 10.5;
-    hudloc_x = 10.5;
-
-    drawpic(hudloc, raptor_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
-    drawpic(hudloc, raptor_b, picsize, '0 1 0' * hp + '1 0 0' * (1 - hp), 1, DRAWFLAG_NORMAL);
-    drawpic(hudloc, raptor_g1, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
-    drawpic(hudloc, raptor_g2, picsize, '1 1 1' * reload + '1 0 0' *  (1 - reload), 1, DRAWFLAG_NORMAL);
-
-
-       if (scoreboard_showscores)
-       {
-               HUD_DrawScoreboard();
-               HUD_DrawCenterPrint();
-       }
-
-}
-
-#define waki_h "gfx/vehicles/hud_bg.tga"
-#define waki_b "gfx/vehicles/waki.tga"
-#define waki_e "gfx/vehicles/waki_e.tga"
-#define waki_g "gfx/vehicles/waki_guns.tga"
-#define waki_r "gfx/vehicles/waki_rockets.tga"
-#define waki_s "gfx/vehicles/shiled.tga"
-
-#define waki_a1 "gfx/hud/sb_rocket.tga"
-#define waki_a2 "gfx/sb_cells.tga"
-
-void CSQC_WAKIZASHI_HUD()
-{
-       // 0--1 floats. 1 = 100%, 0.6 = 50%.
-       float health, shield, energy, rockets;
-       vector picsize, hudloc;
-
-    picsize = drawgetimagesize(SPIDER_CROSS);
-    picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
-    picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
-    drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL);
-
-/*
-const float STAT_VEHICLESTAT_HEALTH  = 60;
-const float STAT_VEHICLESTAT_SHIELD  = 61;
-const float STAT_VEHICLESTAT_ENERGY  = 62;
-const float STAT_VEHICLESTAT_AMMO1   = 63;
-const float STAT_VEHICLESTAT_RELAOD1 = 64;
-const float STAT_VEHICLESTAT_AMMO2   = 65;
-const float STAT_VEHICLESTAT_RELOAD2 = 66;
-*/
-    health  = min(getstatf(STAT_VEHICLESTAT_HEALTH),  1);
-       shield  = min(getstatf(STAT_VEHICLESTAT_SHIELD),  1);
-       energy  = min(getstatf(STAT_VEHICLESTAT_ENERGY),  1);
-       rockets = bound(0,getstatf(STAT_VEHICLESTAT_RELOAD1), 1);
-
-    hudloc_y =  4;
-    hudloc_x = 4;
-
-    picsize = drawgetimagesize(waki_h) * 0.5;
-    drawpic(hudloc, waki_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
-    picsize = drawgetimagesize(waki_a2) * 0.7;
-    drawpic(hudloc + '116 92  0', waki_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
-
-    drawstring(hudloc + '145 19  0', strcat(ftos(rint(health * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL);
-    drawstring(hudloc + '175 34  0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL);
-
-    drawstring(hudloc + '136 102  0', strcat(ftos(rint(energy * 100)), "%"),'14 14 0','1 1 1', 1, DRAWFLAG_NORMAL);
-
-    picsize = drawgetimagesize(waki_a1) * 0.75;
-    if(rockets == 1)
-    {
-        drawpic(hudloc + '140 55  0', waki_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-        drawpic(hudloc + '144 59  0', waki_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-    }
-    else
-    {
-        drawpic(hudloc + '140 55  0', waki_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL);
-        drawpic(hudloc + '144 59  0', waki_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL);
-        drawstring(hudloc + '165 69 0', strcat(ftos(rint(rockets * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
-    }
-
-    picsize = drawgetimagesize(waki_b) * 0.5;
-    hudloc_y = 10.5;
-    hudloc_x = 10.5;
-
-    drawpic(hudloc, waki_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
-    drawpic(hudloc, waki_b, picsize, '0 1 0' * health + '1 0 0' * (1 - health), 1, DRAWFLAG_NORMAL);
-    drawpic(hudloc, waki_r, picsize, '1 1 1' * rockets + '1 0 0' * (1 - rockets), 1, DRAWFLAG_NORMAL);
-    drawpic(hudloc, waki_e, picsize, '1 1 1' * energy + '1 0 0' *  (1 - energy), 1, DRAWFLAG_NORMAL);
-
-
-
        /*
-       p = '0.5 0 0' * (vid_conwidth - (rkt_size * 8));
-       p = p + '0 1 0' * vid_conheight - '0 32 0';
-
-       // Draw health bar
-       p_y += 8;
-       drawfill(p, '256 0 0' * health + '0 8 0' , '0 0.7 0', 0.75, DRAWFLAG_NORMAL);
-       p_x += 256 * health;
-       drawfill(p, '256 0 0' * (1 - health) + '0 8 0' , '0 0 0', 0.75, DRAWFLAG_NORMAL);
-
-       // Draw shiled bar
-       p_x -= 256 * health;
-       p_y += 4;
-       drawfill(p, '256 0 0' * shield + '0 4 0' , '0.25 0.25 1', 0.5, DRAWFLAG_NORMAL);
-
-       // Draw energy
-       //p_x -= 256 * health;
-       p_y -= 8;
-       drawfill(p, '256 0 0' * energy + '0 4 0' , '1 1 1', 0.75, DRAWFLAG_NORMAL);
-
-       // Draw rockets bar
-       p_y += 12;
-       drawfill(p, '256 0 0' * rockets + '0 4 0' , '1 0 0', 0.75, DRAWFLAG_NORMAL);
-       */
-
-
-
-
-       if (scoreboard_showscores)
-       {
-               HUD_DrawScoreboard();
-               HUD_DrawCenterPrint();
-       }
-
-}
-
-void CSQC_common_hud(void)
-{
-       // HUD_SortFrags(); done in HUD_Draw
-       float hud;
-       hud = getstati(STAT_HUD);
-
-       //hud = 10;
        switch(hud)
        {
-               case HUD_NORMAL:
-                       // do some accuracy var caching
-                       float i;
-                       if(!(gametype == GAME_RACE || gametype == GAME_CTS))
-                       {
-                               if(autocvar_accuracy_color_levels != acc_color_levels)
-                               {
-                                       if(acc_color_levels)
-                                               strunzone(acc_color_levels);
-                                       acc_color_levels = strzone(autocvar_accuracy_color_levels);
-                                       acc_levels = tokenize(acc_color_levels);
-                                       if (acc_levels > MAX_ACCURACY_LEVELS)
-                                               acc_levels = MAX_ACCURACY_LEVELS;
-
-                                       for (i = 0; i < acc_levels; ++i)
-                                               acc_lev[i] = stof(argv(i)) / 100.0;
-                               }
-                               // let know that acc_col[] needs to be loaded
-                               acc_col_x[0] = -1;
-                       }
-
-                       HUD_Main(); // always run these functions for alpha checks
-                       HUD_DrawScoreboard();
-
-                       if (scoreboard_active) // scoreboard/accuracy
-                       {       
-                               HUD_Reset();
-                               // HUD_DrawScoreboard takes care of centerprint_start
-                       }
-                       else if (intermission == 2) // map voting screen
-                       {
-                               HUD_FinaleOverlay();
-                               HUD_Reset();
-
-                               centerprint_start_x = 0;
-                               centerprint_start_y = autocvar_scr_centerpos * vid_conheight;
-                       }
-                       else // hud
-                       {
-                               centerprint_start_x = 0;
-                               centerprint_start_y = autocvar_scr_centerpos * vid_conheight;
-                       }
-
-                       HUD_DrawCenterPrint();
-                       break;
-
                case HUD_SPIDERBOT:
                        CSQC_SPIDER_HUD();
                        break;
@@ -1665,7 +1459,12 @@ void CSQC_common_hud(void)
                case HUD_WAKIZASHI:
                        CSQC_WAKIZASHI_HUD();
                        break;
+
+        case HUD_BUMBLEBEE:
+            CSQC_BUMBLE_HUD();
+            break;
        }
+       */
 }
 
 
index 262abbe44e7124bdb6eccb46a9d9db18a859e1fb..10fee189451b52495bf98672d0e0756d4f774e6f 100644 (file)
@@ -122,6 +122,7 @@ float autocvar_g_balance_tuba_attenuation;
 float autocvar_g_balance_tuba_fadetime;
 float autocvar_g_balance_tuba_volume;
 float autocvar_g_warmup_limit;
+var float autocvar_g_waypointsprite_uppercase = 1;
 var float autocvar_g_waypointsprite_alpha = 1;
 var float autocvar_g_waypointsprite_crosshairfadealpha = 1;
 float autocvar_g_waypointsprite_crosshairfadedistance;
@@ -133,10 +134,16 @@ var float autocvar_g_waypointsprite_distancefadescale = 1;
 var float autocvar_g_waypointsprite_edgefadealpha = 1;
 float autocvar_g_waypointsprite_edgefadedistance;
 var float autocvar_g_waypointsprite_edgefadescale = 1;
+var float autocvar_g_waypointsprite_edgeoffset_bottom = 0;
+var float autocvar_g_waypointsprite_edgeoffset_left = 0;
+var float autocvar_g_waypointsprite_edgeoffset_right = 0;
+var float autocvar_g_waypointsprite_edgeoffset_top = 0;
+var float autocvar_g_waypointsprite_fontsize = 12;
 float autocvar_g_waypointsprite_minalpha;
 float autocvar_g_waypointsprite_minscale;
 float autocvar_g_waypointsprite_normdistance;
 var float autocvar_g_waypointsprite_scale = 1;
+float autocvar_g_waypointsprite_spam;
 float autocvar_g_waypointsprite_timealphaexponent;
 var float autocvar_hud_colorflash_alpha = 0.5;
 float autocvar_hud_configure_bg_minalpha;
@@ -147,6 +154,8 @@ float autocvar_hud_configure_grid_xsize;
 float autocvar_hud_configure_grid_ysize;
 float autocvar_hud_configure_teamcolorforced;
 float autocvar_hud_contents;
+float autocvar_hud_contents_blur;
+float autocvar_hud_contents_blur_alpha;
 float autocvar_hud_contents_factor;
 float autocvar_hud_contents_fadeintime;
 float autocvar_hud_contents_fadeouttime;
@@ -157,6 +166,8 @@ string autocvar_hud_contents_slime_color;
 float autocvar_hud_contents_water_alpha;
 string autocvar_hud_contents_water_color;
 float autocvar_hud_damage;
+float autocvar_hud_damage_blur;
+float autocvar_hud_damage_blur_alpha;
 string autocvar_hud_damage_color;
 float autocvar_hud_damage_factor;
 float autocvar_hud_damage_fade_rate;
@@ -168,6 +179,10 @@ float autocvar_hud_damage_pain_threshold_lower;
 float autocvar_hud_damage_pain_threshold_lower_health;
 float autocvar_hud_damage_pain_threshold_pulsating_min;
 float autocvar_hud_damage_pain_threshold_pulsating_period;
+float autocvar_hud_powerup;
+float autocvar_hud_postprocessing;
+float autocvar_hud_postprocessing_maxbluralpha;
+float autocvar_hud_postprocessing_maxblurradius;
 string autocvar_hud_dock;
 float autocvar_hud_dock_alpha;
 string autocvar_hud_dock_color;
@@ -205,6 +220,21 @@ float autocvar_hud_panel_healtharmor_progressbar_gfx_damage;
 float autocvar_hud_panel_healtharmor_progressbar_gfx_lowhealth;
 float autocvar_hud_panel_healtharmor_progressbar_gfx_smooth;
 
+// TEMPORARY hard coded default for compatibility - remove after 0.2 release
+var float autocvar_hud_panel_centerprint = 1;
+noref var string autocvar_hud_panel_centerprint_pos = "0.180000 0.260000";
+noref var string autocvar_hud_panel_centerprint_size = "0.650000 0.210000";
+noref var string autocvar_hud_panel_centerprint_bg = "";
+noref var string autocvar_hud_panel_centerprint_bg_color = "";
+noref var string autocvar_hud_panel_centerprint_bg_color_team = "";
+noref var string autocvar_hud_panel_centerprint_bg_alpha = "";
+noref var string autocvar_hud_panel_centerprint_bg_border = "";
+noref var string autocvar_hud_panel_centerprint_bg_padding = "";
+var float autocvar_hud_panel_centerprint_align = 0.5;
+var float autocvar_hud_panel_centerprint_fadetime = 0.25;
+var float autocvar_hud_panel_centerprint_flip = 1;
+var float autocvar_hud_panel_centerprint_fontscale = 1;
+var float autocvar_hud_panel_centerprint_time = 3;
 float autocvar_hud_panel_healtharmor_text;
 float autocvar_hud_panel_infomessages;
 float autocvar_hud_panel_infomessages_flip;
@@ -319,9 +349,6 @@ var float autocvar_scoreboard_highlight_alpha = 0.10;
 var float autocvar_scoreboard_highlight_alpha_self = 0.25;
 float autocvar_scoreboard_offset_left;
 float autocvar_scoreboard_offset_right;
-float autocvar_scr_centerpos;
-float autocvar_scr_centersize;
-float autocvar_scr_centertime;
 float autocvar_v_flipped;
 float autocvar_vid_conheight;
 float autocvar_vid_conwidth;
@@ -331,8 +358,9 @@ float autocvar_crosshair_color_by_health;
 float autocvar_cl_hitsound;
 float autocvar_cl_hitsound_antispam_time;
 var float autocvar_cl_eventchase_death = 1;
-var float autocvar_cl_eventchase_intermission = 1;
 var float autocvar_cl_eventchase_distance = 140;
 var float autocvar_cl_eventchase_speed = 1.3;
+float autocvar_cl_lerpexcess;
+string autocvar__togglezoom;
 float autocvar_cl_damageeffect;
 float autocvar_cl_damageeffect_gibs;
index 860e8296f700cb94562b9efb3775895ed1b8fefd..d809c79802b2b5e4effa7fecef4e48aff5441e1f 100644 (file)
@@ -55,7 +55,7 @@ void Casing_Touch()
                                                break;
                                }
 
-                               sound (self, CHAN_PROJECTILE, s, VOL_BASE, ATTN_NORM);
+                               sound (self, CH_SHOTS, s, VOL_BASE, ATTN_NORM);
                        }
                }
        }
@@ -75,7 +75,7 @@ void Ent_Casing(float isNew)
 {
        entity casing;
 
-       casing = RubbleNew("casing");
+    casing = RubbleNew("casing");
        casing.state = ReadByte();
        casing.silent = (casing.state & 0x80);
        casing.state = (casing.state & 0x7F);
index b7e4b39713a011224633c67d93953921f63c4c4d..48012e7a4ccf4a4c4fcd56dac92109dc095dd33f 100644 (file)
@@ -329,3 +329,10 @@ float CVAR_TYPEFLAG_PRIVATE = 4;
 float CVAR_TYPEFLAG_ENGINE = 8;
 float CVAR_TYPEFLAG_HASDESCRIPTION = 16;
 float CVAR_TYPEFLAG_READONLY = 32;
+
+void (entity e, float chan, string samp, float vol, float atten, float pitchshift, float flags)        sound7 = #8;
+
+float trace_dphitcontents;
+float trace_networkentity;
+
+string(string search, string replace, string subject) strreplace = #484;
index 93051cc4d15f423dbe1883a9fb217444437a4b04..e82f4399bdb0ce9921ceabe7bf059ab9ff8673fd 100644 (file)
@@ -64,18 +64,6 @@ const float          STAT_FRAGLIMIT                                  = 235;
 const float            STAT_TIMELIMIT                                  = 236;
 const float     STAT_MOVEVARS_GRAVITY           = 242;
 
-// Sound Constants
-//const float          CHAN_AUTO                                               = 0;
-//const float          CHAN_WEAPON                                             = 1;
-//const float          CHAN_VOICE                                              = 2;
-//const float          CHAN_ITEM                                               = 3;
-//const float          CHAN_BODY                                               = 4;
-
-//const float          ATTN_NONE                                               = 0;
-//const float          ATTN_NORM                                               = 1;
-//const float          ATTN_IDLE                                               = 2;
-//const float          ATTN_STATIC                                             = 3;
-
 // Quake-style Point Contents
 const float            CONTENT_EMPTY                                   = -1;
 const float            CONTENT_SOLID                                   = -2;
@@ -164,7 +152,6 @@ const float BUTTON_14 = 65536;
 const float BUTTON_15 = 131072;
 const float BUTTON_16 = 262144;
 
-
 const float DRAWFLAG_NORMAL = 0;
 const float DRAWFLAG_ADDITIVE = 1;
 const float DRAWFLAG_MODULATE = 2;
index 783f66759b50b3881d533b083e732db2866d7d55..1617e4923d8940503b7e0c9d8b3d4e49707ffc81 100644 (file)
@@ -69,9 +69,147 @@ void Ent_DamageInfo(float isNew)
        }
 
        self = oldself;
+       
+       if(DEATH_ISVEHICLE(w_deathtype))
+       {
+           traceline(w_org - normalize(force) * 16, w_org + normalize(force) * 16, MOVE_NOMONSTERS, world);
+           if(trace_plane_normal != '0 0 0')       
+            w_backoff = trace_plane_normal;
+        else
+            w_backoff = -1 * normalize(w_org - (w_org + normalize(force) * 16));
+           
+           setorigin(self, w_org + w_backoff * 2); // for sound() calls
+           
+           switch(w_deathtype)
+           {            
+            case DEATH_VHCRUSH:
+                break;
+                
+            case DEATH_SBMINIGUN:
+                string _snd;
+                _snd = strcat("weapons/ric", ftos(1 + rint(random() * 2)), ".waw");
+                sound(self, CH_SHOTS, _snd, VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("spiderbot_minigun_impact"), self.origin, w_backoff * 1000, 1);
+                break;
+            case DEATH_SBROCKET:
+                sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("spiderbot_rocket_explode"), self.origin, w_backoff * 1000, 1);
+                break;
+            case DEATH_SBBLOWUP:
+                sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_MIN);
+                pointparticles(particleeffectnum("explosion_big"), self.origin, w_backoff * 1000, 1);
+                break;
+                
+            case DEATH_WAKIGUN:
+                sound(self, CH_SHOTS, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("wakizashi_gun_impact"), self.origin, w_backoff * 1000, 1);
+                break;
+            case DEATH_WAKIROCKET:
+                sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("wakizashi_rocket_explode"), self.origin, w_backoff * 1000, 1);
+                break;
+            case DEATH_WAKIBLOWUP:
+                sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_MIN);
+                pointparticles(particleeffectnum("explosion_big"), self.origin, w_backoff * 1000, 1);
+                break;
+                
+            case DEATH_RAPTOR_CANNON:
+                sound(self, CH_SHOTS, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("raptor_cannon_impact"), self.origin, w_backoff * 1000, 1);
+                break;
+            case DEATH_RAPTOR_BOMB_SPLIT:
+                float i;
+                vector ang, vel;
+                for(i = 1; i < 4; ++i)
+                {
+                    vel = normalize(w_org - (w_org + normalize(force) * 16)) + randomvec() * 128;
+                    ang = vectoangles(vel);
+                    RaptorCBShellfragToss(w_org, vel, ang + '0 0 1' * (120 * i));
+                }
+                    
+                
+                sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("raptor_bomb_spread"), self.origin, w_backoff * 1000, 1);
+                break;
+            case DEATH_RAPTOR_BOMB:
+                sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("raptor_bomb_impact"), self.origin, w_backoff * 1000, 1);
+                break;
+            case DEATH_RAPTOR_DEATH:
+                sound(self, CH_SHOTS, "weapons/laserimpact.wav", VOL_BASE, ATTN_MIN);
+                pointparticles(particleeffectnum("explosion_big"), self.origin, w_backoff * 1000, 1);
+                break;
+           }
+       }
+       
+       
+       if(DEATH_ISTURRET(w_deathtype))
+       {           
+           traceline(w_org - normalize(force) * 16, w_org + normalize(force) * 16, MOVE_NOMONSTERS, world);
+           if(trace_plane_normal != '0 0 0')       
+            w_backoff = trace_plane_normal;
+        else
+            w_backoff = -1 * normalize(w_org - (w_org + normalize(force) * 16));
+           
+           setorigin(self, w_org + w_backoff * 2); // for sound() calls
+           
+           switch(w_deathtype)
+           {   
+             case DEATH_TURRET_EWHEEL:
+                sound(self, CH_SHOTS, "weapons/laserimpact.wav", VOL_BASE, ATTN_MIN);
+                pointparticles(particleeffectnum("electro_impact"), self.origin, w_backoff * 1000, 1);
+                break;
+             
+             case DEATH_TURRET_FLAC:
+                vector org2;
+                org2 = w_org + w_backoff * 6;
+                pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
+                if (w_random<0.15)
+                    sound(self, CH_SHOTS, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
+                else if (w_random<0.7)
+                    sound(self, CH_SHOTS, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
+                else
+                    sound(self, CH_SHOTS, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
+                
+                break;
+                
+             case DEATH_TURRET_MLRS:
+             case DEATH_TURRET_HK:
+             case DEATH_TURRET_WALKER_ROCKET:
+             case DEATH_TURRET_HELLION:
+                sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_MIN);
+                pointparticles(particleeffectnum("rocket_explode"), self.origin, w_backoff * 1000, 1);
+                break;
+             
+             case DEATH_TURRET_MACHINEGUN:
+             case DEATH_TURRET_WALKER_GUN:
+                string _snd;
+                _snd = strcat("weapons/ric", ftos(1 + rint(random() * 2)), ".waw");
+                sound(self, CH_SHOTS, _snd, VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("machinegun_impact"), self.origin, w_backoff * 1000, 1);
+                break;
+                          
+             case DEATH_TURRET_PLASMA:
+                sound(self, CH_SHOTS, "weapons/electro_impact.wav", VOL_BASE, ATTN_MIN);
+                pointparticles(particleeffectnum("electro_impact"), self.origin, w_backoff * 1000, 1);
+                break;
+                          
+             case DEATH_TURRET_WALKER_MEELE:
+                sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_MIN);
+                pointparticles(particleeffectnum("TE_SPARK"), self.origin, w_backoff * 1000, 1);
+                break;
 
-       // TODO spawn particle effects and sounds based on w_deathtype
+             case DEATH_TURRET_PHASER:
+                break;
+                
+             case DEATH_TURRET_TESLA:
+                te_smallflash(self.origin);
+                break;
+
+        }        
+       }
        
+       // TODO spawn particle effects and sounds based on w_deathtype
        if(!DEATH_ISSPECIAL(w_deathtype))
        {
                float hitwep;
index 30cb786c9666b1b3af952471a7d83da00d77dc6b..78aee37752dc2b7fc8efbe9f6e4dcb4018abcf88 100644 (file)
@@ -73,7 +73,7 @@ void Gib_Touch()
        }
 
        if(!self.silent)
-               sound(self, CHAN_PAIN, strcat("misc/gib_splat0", ftos(floor(prandom() * 4 + 1)), ".wav"), VOL_BASE, ATTN_NORM);
+               sound(self, CH_PAIN, strcat("misc/gib_splat0", ftos(floor(prandom() * 4 + 1)), ".wav"), VOL_BASE, ATTN_NORM);
        pointparticles(particleeffectnum(strcat(species_prefix(self.cnt), "blood")), self.origin + '0 0 1', '0 0 30', 10);
 
        Gib_Delete();
@@ -103,7 +103,7 @@ void Gib_Draw()
        }
 }
 
-void TossGib (string mdlname, vector org, vector vconst, vector vrand, float specnum, float destroyontouch, float issilent, float gibownernum)
+void TossGib (string mdlname, vector safeorg, vector org, vector vconst, vector vrand, float specnum, float destroyontouch, float issilent, float gibownernum)
 {
        entity gib;
 
@@ -126,6 +126,13 @@ void TossGib (string mdlname, vector org, vector vconst, vector vrand, float spe
        else
                gib.move_touch = SUB_RemoveOnNoImpact;
 
+       // don't spawn gibs inside solid - just don't
+       if(org != safeorg)
+       {
+               tracebox(safeorg, gib.mins, gib.maxs, org, MOVE_NOMONSTERS, gib);
+               org = trace_endpos;
+       }
+
        gib.move_origin = gib.origin = org;
        gib.move_velocity = vconst * autocvar_cl_gibs_velocity_scale + vrand * autocvar_cl_gibs_velocity_random + '0 0 1' * autocvar_cl_gibs_velocity_up;
        gib.move_avelocity = prandomvec() * vlen(gib.move_velocity);
@@ -195,40 +202,40 @@ void Ent_GibSplash(float isNew)
        {
                case 0x01:
                        if(!issilent)
-                               sound (self, CHAN_PAIN, "misc/gib.wav", VOL_BASE, ATTN_NORM);
+                               sound (self, CH_PAIN, "misc/gib.wav", VOL_BASE, ATTN_NORM);
 
                        if(prandom() < amount)
-                               TossGib ("models/gibs/eye.md3", org, vel, prandomvec() * 150, specnum, 0, issilent, entnumber);
+                               TossGib ("models/gibs/eye.md3", org, org, vel, prandomvec() * 150, specnum, 0, issilent, entnumber);
                        new_te_bloodshower(particleeffectnum(strcat(specstr, "bloodshower")), org, 1200, amount);
                        if(prandom() < amount)
-                               TossGib ("models/gibs/bloodyskull.md3", org + 16 * prandomvec(), vel, prandomvec() * 100, specnum, 0, issilent, entnumber);
+                               TossGib ("models/gibs/bloodyskull.md3", org, org + 16 * prandomvec(), vel, prandomvec() * 100, specnum, 0, issilent, entnumber);
 
                        for(c = 0; c < amount; ++c)
                        {
                                randomvalue = amount - c;
 
                                if(prandom() < randomvalue)
-                                       TossGib ("models/gibs/arm.md3", org + 16 * prandomvec() + '0 0 8', vel, prandomvec() * (prandom() * 120 + 90), specnum,0, issilent, entnumber);
+                                       TossGib ("models/gibs/arm.md3", org, org + 16 * prandomvec() + '0 0 8', vel, prandomvec() * (prandom() * 120 + 90), specnum,0, issilent, entnumber);
                                if(prandom() < randomvalue)
-                                       TossGib ("models/gibs/arm.md3", org + 16 * prandomvec() + '0 0 8', vel, prandomvec() * (prandom() * 120 + 90), specnum,0, issilent, entnumber);
+                                       TossGib ("models/gibs/arm.md3", org, org + 16 * prandomvec() + '0 0 8', vel, prandomvec() * (prandom() * 120 + 90), specnum,0, issilent, entnumber);
                                if(prandom() < randomvalue)
-                                       TossGib ("models/gibs/chest.md3", org + 16 * prandomvec(), vel, prandomvec() * (prandom() * 120 + 80), specnum,0, issilent, entnumber);
+                                       TossGib ("models/gibs/chest.md3", org, org + 16 * prandomvec(), vel, prandomvec() * (prandom() * 120 + 80), specnum,0, issilent, entnumber);
                                if(prandom() < randomvalue)
-                                       TossGib ("models/gibs/smallchest.md3", org + 16 * prandomvec(), vel, prandomvec() * (prandom() * 120 + 80), specnum,0, issilent, entnumber);
+                                       TossGib ("models/gibs/smallchest.md3", org, org + 16 * prandomvec(), vel, prandomvec() * (prandom() * 120 + 80), specnum,0, issilent, entnumber);
                                if(prandom() < randomvalue)
-                                       TossGib ("models/gibs/leg1.md3", org + 16 * prandomvec() + '0 0 -5', vel, prandomvec() * (prandom() * 120 + 85), specnum,0, issilent, entnumber);
+                                       TossGib ("models/gibs/leg1.md3", org, org + 16 * prandomvec() + '0 0 -5', vel, prandomvec() * (prandom() * 120 + 85), specnum,0, issilent, entnumber);
                                if(prandom() < randomvalue)
-                                       TossGib ("models/gibs/leg2.md3", org + 16 * prandomvec() + '0 0 -5', vel, prandomvec() * (prandom() * 120 + 85), specnum,0, issilent, entnumber);
+                                       TossGib ("models/gibs/leg2.md3", org, org + 16 * prandomvec() + '0 0 -5', vel, prandomvec() * (prandom() * 120 + 85), specnum,0, issilent, entnumber);
 
                                // these splat on impact
                                if(prandom() < randomvalue)
-                                       TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent, entnumber);
+                                       TossGib ("models/gibs/chunk.mdl", org, org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent, entnumber);
                                if(prandom() < randomvalue)
-                                       TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent, entnumber);
+                                       TossGib ("models/gibs/chunk.mdl", org, org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent, entnumber);
                                if(prandom() < randomvalue)
-                                       TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent, entnumber);
+                                       TossGib ("models/gibs/chunk.mdl", org, org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent, entnumber);
                                if(prandom() < randomvalue)
-                                       TossGib ("models/gibs/chunk.mdl", org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent, entnumber);
+                                       TossGib ("models/gibs/chunk.mdl", org, org + 16 * prandomvec(), vel, prandomvec() * 450, specnum,1, issilent, entnumber);
                        }
                        break;
                case 0x02:
@@ -236,7 +243,7 @@ void Ent_GibSplash(float isNew)
                        break;
                case 0x03:
                        if(prandom() < amount)
-                               TossGib ("models/gibs/chunk.mdl", org, vel, prandomvec() * (prandom() * 30 + 20), specnum, 1, issilent, entnumber); // TODO maybe adjust to more randomization?
+                               TossGib ("models/gibs/chunk.mdl", org, org, vel, prandomvec() * (prandom() * 30 + 20), specnum, 1, issilent, entnumber); // TODO maybe adjust to more randomization?
                        break;
                case 0x81:
                        pointparticles(particleeffectnum(strcat(gentle_prefix, "damage_dissolve")), org, vel, amount);
@@ -306,7 +313,7 @@ void Ent_DamageEffect()
        effectnum = strcat("weapondamage_", e.netname);
        // If the weapon is a bullet weapon, its damage effect is blood.
        // Since blood is species dependent, we make this effect per-species.
-       if(type == WEP_SHOTGUN || type == WEP_UZI || type == WEP_SNIPERRIFLE)
+       if(type == WEP_SHOTGUN || type == WEP_UZI || type == WEP_RIFLE)
        if(specstr != "")
        {
                effectnum = strcat(effectnum, "_", specstr);
index 7ff5adeca46204beaf8e37d040341b84c3ee6854..4971fa3aa1705a126428729db0e2804ea6a65742 100644 (file)
@@ -59,7 +59,7 @@ void Draw_GrapplingHook()
        if(self.teleport_time)
        if(time > self.teleport_time)
        {
-               sound (self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM); // safeguard
+               sound (self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTN_NORM); // safeguard
                self.teleport_time = 0;
        }
 
@@ -215,7 +215,7 @@ void Draw_GrapplingHook()
 
 void Remove_GrapplingHook()
 {
-       sound (self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM);
+       sound (self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTN_NORM);
 }
 
 void Ent_ReadHook(float bIsNew, float type)
@@ -275,10 +275,10 @@ void Ent_ReadHook(float bIsNew, float type)
                                self.drawmask = MASK_NORMAL;
                                break;
                        case ENT_CLIENT_LGBEAM:
-                               sound (self, CHAN_PROJECTILE, "weapons/lgbeam_fly.wav", VOL_BASE, ATTN_NORM);
+                               sound (self, CH_SHOTS_SINGLE, "weapons/lgbeam_fly.wav", VOL_BASE, ATTN_NORM);
                                break;
                        case ENT_CLIENT_GAUNTLET:
-                               sound (self, CHAN_PROJECTILE, "weapons/gauntletbeam_fly.wav", VOL_BASE, ATTN_NORM);
+                               sound (self, CH_SHOTS_SINGLE, "weapons/gauntletbeam_fly.wav", VOL_BASE, ATTN_NORM);
                                break;
                }
        }
index 91256b9c5d566bb9d1d900368ceb53688992766e..f8d8a3296e9713dcc99d34b83fc52928558aa557 100644 (file)
@@ -142,183 +142,6 @@ float stringwidth_nocolors(string s, vector theSize)
        return stringwidth(s, FALSE, theSize);
 }
 
-#define CENTERPRINT_MAX_LINES 30
-string centerprint_messages[CENTERPRINT_MAX_LINES];
-float centerprint_width[CENTERPRINT_MAX_LINES];
-float centerprint_time;
-float centerprint_expire;
-float centerprint_num;
-float centerprint_offset_hint;
-vector centerprint_fontsize;
-
-void centerprint(string strMessage)
-{
-       float i, j, n, hcount;
-       string s;
-
-       centerprint_fontsize = HUD_GetFontsize("scr_centersize");
-
-       centerprint_expire = min(centerprint_expire, time); // if any of the returns happens, this message will fade out
-
-       if(autocvar_scr_centertime <= 0)
-               return;
-
-       if(strMessage == "")
-               return;
-
-       // strip trailing newlines
-       j = strlen(strMessage) - 1;
-       while(substring(strMessage, j, 1) == "\n" && j >= 0)
-               j = j - 1;
-       strMessage = substring(strMessage, 0, j + 1);
-
-       if(strMessage == "")
-               return;
-
-       // strip leading newlines and remember them, they are a hint that the message should be lower on the screen
-       j = 0;
-       while(substring(strMessage, j, 1) == "\n" && j < strlen(strMessage))
-               j = j + 1;
-       strMessage = substring(strMessage, j, strlen(strMessage) - j);
-       centerprint_offset_hint = j;
-
-       if(strMessage == "")
-               return;
-
-       // if we get here, we have a message. Initialize its height.
-       centerprint_num = 0;
-
-       n = tokenizebyseparator(strMessage, "\n");
-       i = hcount = 0;
-       for(j = 0; j < n; ++j)
-       {
-               getWrappedLine_remaining = argv(j);
-               while(getWrappedLine_remaining)
-               {
-                       s = getWrappedLine(vid_conwidth * 0.75, centerprint_fontsize, stringwidth_colors);
-                       if(centerprint_messages[i] != s) // don't fade the same message in, looks stupid
-                               centerprint_time = time;
-                       if(centerprint_messages[i])
-                               strunzone(centerprint_messages[i]);
-                       centerprint_messages[i] = strzone(s);
-                       centerprint_width[i] = stringwidth(s, TRUE, centerprint_fontsize);
-                       ++i;
-
-                       // half height for empty lines looks better
-                       if(s == "")
-                               hcount += 0.5;
-                       else
-                               hcount += 1;
-
-                       if(i >= CENTERPRINT_MAX_LINES)
-                               break;
-               }
-       }
-
-       float h, havail;
-       h = centerprint_fontsize_y*hcount;
-
-       havail = vid_conheight;
-       if(autocvar_con_chatpos < 0)
-               havail -= (-autocvar_con_chatpos + autocvar_con_chat) * autocvar_con_chatsize; // avoid overlapping chat
-       if(havail > vid_conheight - 70)
-               havail = vid_conheight - 70; // avoid overlapping HUD
-
-#if 0
-       float forbiddenmin, forbiddenmax, allowedmin, allowedmax, preferred;
-
-       // here, the centerprint would cover the crosshair. REALLY BAD.
-       forbiddenmin = vid_conheight * 0.5 - h - 16;
-       forbiddenmax = vid_conheight * 0.5 + 16;
-
-       allowedmin = scoreboard_bottom;
-       allowedmax = havail - h;
-       preferred = (havail - h)/2;
-
-
-       // possible orderings (total: 4! / 4 = 6)
-       //  allowedmin allowedmax forbiddenmin forbiddenmax
-       //  forbiddenmin forbiddenmax allowedmin allowedmax
-       if(allowedmax < forbiddenmin || allowedmin > forbiddenmax)
-       {
-               // forbidden doesn't matter in this case
-               centerprint_start_y = bound(allowedmin, preferred, allowedmax);
-       }
-       //  allowedmin forbiddenmin allowedmax forbiddenmax
-       else if(allowedmin < forbiddenmin && allowedmax < forbiddenmax)
-       {
-               centerprint_start_y = bound(allowedmin, preferred, forbiddenmin);
-       }
-       //  allowedmin forbiddenmin forbiddenmax allowedmax
-       else if(allowedmin < forbiddenmin)
-       {
-               // make sure the forbidden zone is not covered
-               if(preferred > (forbiddenmin + forbiddenmax) * 0.5)
-                       centerprint_start_y = bound(allowedmin, preferred, forbiddenmin);
-               else
-                       centerprint_start_y = bound(forbiddenmax, preferred, allowedmin);
-       }
-       //  forbiddenmin allowedmin allowedmax forbiddenmax
-       else if(allowedmax < forbiddenmax)
-       {
-               // it's better to leave the allowed zone (overlap with scoreboard) than
-               // to cover the forbidden zone (crosshair)
-               if(preferred > (forbiddenmin + forbiddenmax) * 0.5)
-                       centerprint_start_y = forbiddenmax;
-               else
-                       centerprint_start_y = forbiddenmin;
-       }
-       //  forbiddenmin allowedmin forbiddenmax allowedmax
-       else
-       {
-               centerprint_start_y = bound(forbiddenmax, preferred, allowedmax);
-       }
-#else
-#endif
-
-       centerprint_num = i;
-
-       centerprint_expire = time + autocvar_scr_centertime;
-}
-
-void HUD_DrawCenterPrint (void)
-{
-       float i;
-       vector pos;
-       string ts;
-       float a, sz;
-
-       if(time - centerprint_time < 0.25)
-               a = (time - centerprint_time) / 0.25;
-       else
-               a = bound(0, 1 - 4 * (time - centerprint_expire), 1);
-
-       if(a <= 0)
-               return;
-
-       sz = 0.8 + (a / 5);
-
-       if(centerprint_num * autocvar_scr_centersize > 24 && scoreboard_active) // 24 = height of Scoreboard text
-               centerprint_start_y = scoreboard_bottom + centerprint_fontsize_y;
-
-       pos = centerprint_start;
-       for (i=0; i<centerprint_num; i = i + 1)
-       {
-               ts = centerprint_messages[i];
-               drawfontscale = sz * '1 1 0';
-               pos_x = (vid_conwidth - stringwidth(ts, TRUE, centerprint_fontsize)) * 0.5;
-               if (ts != "")
-               {
-                       drawcolorcodedstring(pos + '0 1 0' * (1 - sz) * 0.5 *centerprint_fontsize_y, ts, centerprint_fontsize, a, DRAWFLAG_NORMAL);
-                       pos_y = pos_y + centerprint_fontsize_y;
-               }
-               else
-                       // half height for empty lines looks better
-                       pos_y = pos_y + sz * centerprint_fontsize_y * 0.5;
-               drawfontscale = '1 1 0';
-       }
-}
-
 void drawstringright(vector position, string text, vector scale, vector rgb, float alpha, float flag)
 {
        position_x -= 2 / 3 * strlen(text) * scale_x;
@@ -600,7 +423,7 @@ float GetAmmoTypeForWep(float i)
                case WEP_HLAC: return 3;
                case WEP_MINSTANEX: return 3;
                case WEP_NEX: return 3;
-               case WEP_SNIPERRIFLE: return 1;
+               case WEP_RIFLE: return 1;
                case WEP_HAGAR: return 2;
                case WEP_ROCKET_LAUNCHER: return 2;
                case WEP_SEEKER: return 2;
@@ -614,7 +437,7 @@ void HUD_Weapons(void)
 {
        float f, screen_ar;
        float center_x, center_y;
-
+    if(hud != HUD_NORMAL) return;
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_weapons) return;
@@ -643,6 +466,7 @@ void HUD_Weapons(void)
        }
 
        HUD_Panel_UpdateCvars(weapons);
+       HUD_Panel_ApplyFadeAlpha();
 
        if (timeout && time >= weapontime + timeout && !autocvar__hud_configure)
        {
@@ -963,7 +787,7 @@ string GetAmmoPicture(float i)
        }
 }
 
-void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_selected)
+void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_selected, float infinite_ammo)
 {
        float a;
        if(autocvar__hud_configure)
@@ -975,7 +799,9 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s
                a = getstati(GetAmmoStat(itemcode)); // how much ammo do we have of type itemcode?
 
        vector color;
-       if(a < 10)
+       if(infinite_ammo)
+               color = '0 0.5 0.75';
+       else if(a < 10)
                color = '0.7 0 0';
        else
                color = '1 1 1';
@@ -1006,12 +832,12 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s
 
     if(autocvar_hud_panel_ammo_text)
     {
-        if(a > 0)
+        if(a > 0 || infinite_ammo)
             drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, color, panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
         else // "ghost" ammo count
             drawstring_aspect(numpos, ftos(a), eX * (2/3) * mySize_x + eY * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL);
     }
-       if(a > 0)
+       if(a > 0 || infinite_ammo)
                drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '1 1 1', panel_fg_alpha * alpha, DRAWFLAG_NORMAL);
        else // "ghost" ammo icon
                drawpic_aspect_skin(picpos, GetAmmoPicture(itemcode), '1 1 0' * mySize_y, '0 0 0', panel_fg_alpha * alpha * 0.5, DRAWFLAG_NORMAL);
@@ -1019,6 +845,7 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s
 
 void HUD_Ammo(void)
 {
+    if(hud != HUD_NORMAL) return;
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_ammo) return;
@@ -1028,6 +855,7 @@ void HUD_Ammo(void)
                hud_configure_active_panel = HUD_PANEL_AMMO;
 
        HUD_Panel_UpdateCvars(ammo);
+       HUD_Panel_ApplyFadeAlpha();
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -1071,20 +899,23 @@ void HUD_Ammo(void)
                ammo_size_y = newSize;
        }
 
-       float i, stat_items, currently_selected;
+       float i, stat_items, currently_selected, infinite_ammo;
+       infinite_ammo = FALSE;
        if (autocvar_hud_panel_ammo_onlycurrent)
        {
                if(autocvar__hud_configure)
                {
-                       DrawAmmoItem(pos, ammo_size, 2, true); //show rockets
+                       DrawAmmoItem(pos, ammo_size, 2, true, FALSE); //show rockets
                        return;
                }
                stat_items = getstati(STAT_ITEMS);
+               if (stat_items & IT_UNLIMITED_WEAPON_AMMO)
+                       infinite_ammo = TRUE;
                for (i = 0; i < AMMO_COUNT; ++i) {
                        currently_selected = stat_items & GetAmmoItemCode(i);
                        if (currently_selected)
                        {
-                               DrawAmmoItem(pos, ammo_size, i, true);
+                               DrawAmmoItem(pos, ammo_size, i, true, infinite_ammo);
                                return;
                        }
                }
@@ -1092,9 +923,11 @@ void HUD_Ammo(void)
        }
 
        stat_items = getstati(STAT_ITEMS);
+       if (stat_items & IT_UNLIMITED_WEAPON_AMMO)
+               infinite_ammo = TRUE;
        for (i = 0; i < AMMO_COUNT; ++i) {
                currently_selected = stat_items & GetAmmoItemCode(i);
-               DrawAmmoItem(pos + eX * column * (ammo_size_x + offset_x) + eY * row * (ammo_size_y + offset_y), ammo_size, i, currently_selected);
+               DrawAmmoItem(pos + eX * column * (ammo_size_x + offset_x) + eY * row * (ammo_size_y + offset_y), ammo_size, i, currently_selected, infinite_ammo);
                ++row;
                if(row >= rows)
                {
@@ -1213,6 +1046,7 @@ void HUD_Powerups(void)
        }
 
        HUD_Panel_UpdateCvars(powerups);
+       HUD_Panel_ApplyFadeAlpha();
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -1319,6 +1153,7 @@ void HUD_HealthArmor(void)
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_healtharmor) return;
+               if(hud != HUD_NORMAL) return;
                if(spectatee_status == -1) return;
 
                health = getstati(STAT_HEALTH);
@@ -1366,6 +1201,7 @@ void HUD_HealthArmor(void)
        }
 
        HUD_Panel_UpdateCvars(healtharmor);
+       HUD_Panel_ApplyFadeAlpha();
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -1680,7 +1516,7 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s
        } else if(msg == MSG_KILL) {
                w = DEATH_WEAPONOF(type);
                if(WEP_VALID(w)) {
-                       if((w == WEP_SNIPERRIFLE || w == WEP_MINSTANEX) && type & HITTYPE_HEADSHOT) // all headshot weapons go here
+                       if((w == WEP_RIFLE || w == WEP_MINSTANEX) && type & HITTYPE_HEADSHOT) // all headshot weapons go here
                                HUD_KillNotify_Push(s1, s2, 1, DEATH_HEADSHOT);
                        else
                                HUD_KillNotify_Push(s1, s2, 1, type);
@@ -1755,7 +1591,7 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s
                        HUD_KillNotify_Push(s1, s2, 1, DEATH_HURTTRIGGER);
                        if(alsoprint)
                                print(sprintf(_("^1%s^1 was thrown into a world of hurt by %s\n"), s2, s1));
-               } else if(type == DEATH_SBCRUSH) {
+               } else if(type == DEATH_VHCRUSH) {
                        HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
                                print (sprintf(_("^1%s^1 was crushed by %s\n"), s2, s1));
@@ -1783,6 +1619,18 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s
                        HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
                                print (sprintf(_("^1%s^1 dies when %s^1's wakizashi dies.\n"), s2, s1));
+               } else if(type == DEATH_RAPTOR_CANNON) {
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print (sprintf(_("^1%s^1 nailed to hell by %s\n"), s2, s1));
+               } else if(type == DEATH_RAPTOR_BOMB) {
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print (sprintf(_("^1%s^1 cluster crushed by %s\n"), s2, s1));
+               } else if(type == DEATH_RAPTOR_DEATH) {
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print (sprintf(_("^1%s^1 dies when %s^1's raptor dies.\n"), s2, s1));
                } else if(type == DEATH_TURRET) {
                        HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
@@ -1992,92 +1840,90 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s
        }
 }
 
-#define DAMAGE_CENTERPRINT_SPACER NEWLINES
-
 void HUD_Centerprint(string s1, string s2, float type, float msg)
 {
        float gentle;
        gentle = (autocvar_cl_gentle || autocvar_cl_gentle_messages);
        if(msg == MSG_SUICIDE) {
                if (type == DEATH_TEAMCHANGE) {
-                       centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("You are now on: %s"), s1)));
+                       centerprint(sprintf(_("You are now on: %s"), s1));
                } else if (type == DEATH_AUTOTEAMCHANGE) {
-                       centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("You have been moved into a different team to improve team balance\nYou are now on: %s"), s1)));
+                       centerprint(sprintf(_("You have been moved into a different team to improve team balance\nYou are now on: %s"), s1));
                } else if (type == DEATH_CAMP) {
                        if(gentle)
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Reconsider your tactics, camper!")));
+                               centerprint(_("^1Reconsider your tactics, camper!"));
                        else
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Die camper!")));
+                               centerprint(_("^1Die camper!"));
                } else if (type == DEATH_NOAMMO) {
                        if(gentle)
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You are reinserted into the game for running out of ammo...")));
+                               centerprint(_("^1You are reinserted into the game for running out of ammo..."));
                        else
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You were killed for running out of ammo...")));
+                               centerprint(_("^1You were killed for running out of ammo..."));
                } else if (type == DEATH_ROT) {
                        if(gentle)
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You need to preserve your health")));
+                               centerprint(_("^1You need to preserve your health"));
                        else
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You grew too old without taking your medicine")));
+                               centerprint(_("^1You grew too old without taking your medicine"));
                } else if (type == KILL_TEAM_RED || type == KILL_TEAM_BLUE) {
                        if(gentle)
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Don't go against team mates!")));
+                               centerprint(_("^1Don't go against team mates!"));
                        else
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Don't shoot your team mates!")));
+                               centerprint(_("^1Don't shoot your team mates!"));
                } else if (type == DEATH_QUIET) {
                        // do nothing
                } else { // generic message
                        if(gentle)
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You need to be more careful!")));
+                               centerprint(_("^1You need to be more careful!"));
                        else
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1You killed your own dumb self!")));
+                               centerprint(_("^1You killed your own dumb self!"));
                }
        } else if(msg == MSG_KILL) {
                if (type == KILL_TEAM_RED || type == KILL_TEAM_BLUE) {
                        if(gentle) {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1Moron! You went against %s, a team mate!"), s1)));
+                               centerprint(sprintf(_("^1Moron! You went against ^7%s^1, a team mate!"), s1));
                        } else {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1Moron! You fragged %s, a team mate!"), s1)));
+                               centerprint(sprintf(_("^1Moron! You fragged ^7%s^1, a team mate!"), s1));
                        }
                } else if (type == KILL_FIRST_BLOOD) {
                        if(gentle) {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First score")));
+                               centerprint(_("^1First score"));
                        } else {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First blood")));
+                               centerprint(_("^1First blood"));
                        }
                } else if (type == KILL_FIRST_VICTIM) {
                        if(gentle) {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First casualty")));
+                               centerprint(_("^1First casualty"));
                        } else {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1First victim")));
+                               centerprint(_("^1First victim"));
                        }
                } else if (type == KILL_TYPEFRAG) { // s2 contains "advanced kill messages" such as ping, handicap...
                        if(gentle) {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You scored against ^7%s^1 who was typing!"), s1), s2));
+                               centerprint(strcat(sprintf(_("^1You scored against ^7%s^1 who was typing!"), s1), s2));
                        } else {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You typefragged ^7%s"), s1), s2));
+                               centerprint(strcat(sprintf(_("^1You typefragged ^7%s"), s1), s2));
                        }
                } else if (type == KILL_TYPEFRAGGED) {
                        if(gentle) {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were scored against by ^7%s^1 while you were typing!"), s1), s2));
+                               centerprint(strcat(sprintf(_("^1You were scored against by ^7%s^1 while you were typing!"), s1), s2));
                        } else {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were typefragged by ^7%s"), s1), s2));
+                               centerprint(strcat(sprintf(_("^1You were typefragged by ^7%s"), s1), s2));
                        }
                } else if (type == KILL_FRAG) {
                        if(gentle) {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^4You scored against ^7%s"), s1), s2));
+                               centerprint(strcat(sprintf(_("^4You scored against ^7%s"), s1), s2));
                        } else {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^4You fragged ^7%s"), s1), s2));
+                               centerprint(strcat(sprintf(_("^4You fragged ^7%s"), s1), s2));
                        }
                } else { // generic message
                        if(gentle) {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were scored against by ^7%s"), s1), s2));
+                               centerprint(strcat(sprintf(_("^1You were scored against by ^7%s"), s1), s2));
                        } else {
-                               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, sprintf(_("^1You were fragged by ^7%s"), s1), s2));
+                               centerprint(strcat(sprintf(_("^1You were fragged by ^7%s"), s1), s2));
                        }
                }
        } else if(msg == MSG_KILL_ACTION) {
                // TODO: invent more centerprints here?
-               centerprint(strcat(DAMAGE_CENTERPRINT_SPACER, _("^1Watch your step!")));
+               centerprint(_("^1Watch your step!"));
        }
 }
 
@@ -2091,6 +1937,7 @@ void HUD_Notify (void)
                hud_configure_active_panel = HUD_PANEL_NOTIFY;
 
        HUD_Panel_UpdateCvars(notify);
+       HUD_Panel_ApplyFadeAlpha();
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -2404,6 +2251,7 @@ void HUD_Timer(void)
                hud_configure_active_panel = HUD_PANEL_TIMER;
 
        HUD_Panel_UpdateCvars(timer);
+       HUD_Panel_ApplyFadeAlpha();
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -2461,6 +2309,7 @@ void HUD_Radar(void)
                hud_configure_active_panel = HUD_PANEL_RADAR;
 
        HUD_Panel_UpdateCvars(radar);
+       HUD_Panel_ApplyFadeAlpha();
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -2712,6 +2561,7 @@ void HUD_Score(void)
                hud_configure_active_panel = HUD_PANEL_SCORE;
 
        HUD_Panel_UpdateCvars(score);
+       HUD_Panel_ApplyFadeAlpha();
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -2896,6 +2746,7 @@ void HUD_RaceTimer (void)
                hud_configure_active_panel = HUD_PANEL_RACETIMER;
 
        HUD_Panel_UpdateCvars(racetimer);
+       HUD_Panel_ApplyFadeAlpha();
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -3091,6 +2942,7 @@ void HUD_VoteWindow(void)
                return;
 
        HUD_Panel_UpdateCvars(vote);
+       HUD_Panel_ApplyFadeAlpha();
 
        if(uid2name_dialog)
        {
@@ -3103,7 +2955,7 @@ void HUD_VoteWindow(void)
        pos = panel_pos;
        mySize = panel_size;
 
-       a = vote_alpha * bound(autocvar_hud_panel_vote_alreadyvoted_alpha, 1 - vote_highlighted, 1);
+       a = vote_alpha * (vote_highlighted ? autocvar_hud_panel_vote_alreadyvoted_alpha : 1);
        HUD_Panel_DrawBg(a);
        a = panel_fg_alpha * a;
 
@@ -3154,7 +3006,7 @@ void HUD_VoteWindow(void)
                drawsetcliparea(pos_x, pos_y, mySize_x * 0.5, mySize_y);
                drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
        }
-       else if(vote_highlighted == 2) {
+       else if(vote_highlighted == -1) {
                drawsetcliparea(pos_x + 0.5 * mySize_x, pos_y, mySize_x * 0.5, mySize_y);
                drawpic_skin(pos + eY * (5/8) * mySize_y, "voteprogress_voted", eX * mySize_x + eY * (3/8) * mySize_y, '1 1 1', a, DRAWFLAG_NORMAL);
        }
@@ -3173,10 +3025,6 @@ void HUD_VoteWindow(void)
        }
 
        drawresetcliparea();
-
-       if(!vote_active) {
-               vote_highlighted = 0;
-       }
 }
 
 // Mod icons panel (#10)
@@ -3846,6 +3694,7 @@ void HUD_ModIcons(void)
                hud_configure_active_panel = HUD_PANEL_MODICONS;
 
        HUD_Panel_UpdateCvars(modicons);
+       HUD_Panel_ApplyFadeAlpha();
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -3900,6 +3749,7 @@ void HUD_DrawPressedKeys(void)
 
 
        HUD_Panel_UpdateCvars(pressedkeys);
+       HUD_Panel_ApplyFadeAlpha();
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -3964,6 +3814,7 @@ void HUD_Chat(void)
                hud_configure_active_panel = HUD_PANEL_CHAT;
 
        HUD_Panel_UpdateCvars(chat);
+       HUD_Panel_ApplyFadeAlpha();
 
        if(autocvar__con_chat_maximized && !autocvar__hud_configure) // draw at full screen height if maximized
        {
@@ -4039,6 +3890,7 @@ void HUD_EngineInfo(void)
                hud_configure_active_panel = HUD_PANEL_ENGINEINFO;
 
        HUD_Panel_UpdateCvars(engineinfo);
+       HUD_Panel_ApplyFadeAlpha();
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -4101,6 +3953,7 @@ void HUD_InfoMessages(void)
                hud_configure_active_panel = HUD_PANEL_INFOMESSAGES;
 
        HUD_Panel_UpdateCvars(infomessages);
+       HUD_Panel_ApplyFadeAlpha();
        vector pos, mySize;
        pos = panel_pos;
        mySize = panel_size;
@@ -4280,12 +4133,14 @@ void HUD_Physics(void)
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_physics) return;
-               if(spectatee_status == -1 && autocvar_hud_panel_physics < 2) return;
+               if(spectatee_status == -1 && (autocvar_hud_panel_physics == 1 || autocvar_hud_panel_physics == 3)) return;
+               if(autocvar_hud_panel_physics == 3 && !(gametype == GAME_RACE || gametype == GAME_CTS)) return;
        }
        else
                hud_configure_active_panel = HUD_PANEL_PHYSICS;
 
        HUD_Panel_UpdateCvars(physics);
+       HUD_Panel_ApplyFadeAlpha();
 
        HUD_Panel_DrawBg(1);
        if(panel_bg_padding)
@@ -4496,6 +4351,290 @@ void HUD_Physics(void)
                drawstring_aspect(panel_pos + acceleration_offset, strcat(ftos_decimals(acceleration, 2), "g"), panel_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL);
 }
 
+// CenterPrint (#16)
+//
+#define CENTERPRINT_MAX_MSGS 10
+#define CENTERPRINT_MAX_ENTRIES 50
+#define CENTERPRINT_SPACING 0.7
+float cpm_index;
+string centerprint_messages[CENTERPRINT_MAX_MSGS];
+float centerprint_msgID[CENTERPRINT_MAX_MSGS];
+float centerprint_time[CENTERPRINT_MAX_MSGS];
+float centerprint_expire_time[CENTERPRINT_MAX_MSGS];
+float centerprint_countdown_num[CENTERPRINT_MAX_MSGS];
+float centerprint_fadetime;
+float centerprint_showing;
+
+void centerprint_generic(float new_id, string strMessage, float duration, float countdown_num)
+{
+       float i, j;
+
+       if(strMessage == "" && new_id == 0)
+               return;
+
+       // strip trailing newlines
+       j = strlen(strMessage) - 1;
+       while(substring(strMessage, j, 1) == "\n" && j >= 0)
+               --j;
+       if (j < strlen(strMessage) - 1)
+               strMessage = substring(strMessage, 0, j + 1);
+
+       if(strMessage == "" && new_id == 0)
+               return;
+
+       // strip leading newlines
+       j = 0;
+       while(substring(strMessage, j, 1) == "\n" && j < strlen(strMessage))
+               ++j;
+       if (j > 0)
+               strMessage = substring(strMessage, j, strlen(strMessage) - j);
+
+       if(strMessage == "" && new_id == 0)
+               return;
+
+       if (!centerprint_showing)
+               centerprint_showing = TRUE;
+
+       centerprint_fadetime = bound(0, autocvar_hud_panel_centerprint_fadetime, 1);
+
+       for (i=0, j=cpm_index; i<CENTERPRINT_MAX_MSGS; ++i, ++j)
+       {
+               if (j == CENTERPRINT_MAX_MSGS)
+                       j = 0;
+               if (new_id && new_id == centerprint_msgID[j])
+               {
+                       if (strMessage == "" && centerprint_messages[j] != "" && centerprint_countdown_num[j] == 0)
+                       {
+                               // fade out the current msg (duration and countdown_num are ignored)
+                               centerprint_time[j] = centerprint_fadetime;
+                               if (centerprint_expire_time[j] > time + centerprint_fadetime || centerprint_expire_time[j] < time)
+                                       centerprint_expire_time[j] = time + centerprint_fadetime;
+                               return;
+                       }
+                       break; // found a msg with the same id, at position j
+               }
+       }
+
+       if (i == CENTERPRINT_MAX_MSGS)
+       {
+               // a msg with the same id was not found, add the msg at the next position
+               --cpm_index;
+               if (cpm_index == -1)
+                       cpm_index = CENTERPRINT_MAX_MSGS - 1;
+               j = cpm_index;
+       }
+       if(centerprint_messages[j])
+               strunzone(centerprint_messages[j]);
+       centerprint_messages[j] = strzone(strMessage);
+       centerprint_msgID[j] = new_id;
+       if (duration < 0)
+               centerprint_time[j] = -1;
+       else
+       {
+               if(duration == 0)
+                       duration = max(1, autocvar_hud_panel_centerprint_time);
+               centerprint_time[j] = duration;
+               centerprint_expire_time[j] = time + duration;
+       }
+       centerprint_countdown_num[j] = countdown_num;
+}
+
+void centerprint(string strMessage)
+{
+       centerprint_generic(0, strMessage, autocvar_hud_panel_centerprint_time, 0);
+}
+
+void reset_centerprint_messages(void)
+{
+       float i;
+       for (i=0; i<CENTERPRINT_MAX_MSGS; ++i)
+       {
+               centerprint_expire_time[i] = 0;
+               centerprint_time[i] = 1;
+               centerprint_msgID[i] = 0;
+               if(centerprint_messages[i])
+                       strunzone(centerprint_messages[i]);
+               centerprint_messages[i] = string_null;
+       }
+}
+float hud_configure_cp_generation_time;
+void HUD_CenterPrint (void)
+{
+       if(!autocvar__hud_configure)
+       {
+               if(!autocvar_hud_panel_centerprint) return;
+
+               if (hud_configure_prev && hud_configure_prev != -1)
+                       reset_centerprint_messages();
+       }
+       else
+       {
+               hud_configure_active_panel = HUD_PANEL_CENTERPRINT;
+
+               if (!hud_configure_prev)
+                       reset_centerprint_messages();
+               if (time > hud_configure_cp_generation_time)
+               {
+                       float r;
+                       r = random();
+                       if (r > 0.9)
+                               centerprint_generic(floor(r*1000), strcat(sprintf("^3Countdown message at time %s", seconds_tostring(time)), ", seconds left: %d"), 1, 10);
+                       else if (r > 0.8)
+                               centerprint_generic(0, sprintf("^1Multiline message at time %s that\n^1lasts longer than normal", seconds_tostring(time)), 20, 0);
+                       else
+                               centerprint(sprintf("Message at time %s", seconds_tostring(time)));
+                       hud_configure_cp_generation_time = time + 1 + random()*4;
+               }
+       }
+
+       HUD_Panel_UpdateCvars(centerprint);
+
+       // this panel doesn't fade when showing the scoreboard
+       if(autocvar__menu_alpha)
+               HUD_Panel_ApplyFadeAlpha();
+
+       if(scoreboard_fade_alpha)
+       {
+               // move the panel below the scoreboard
+               if (scoreboard_bottom >= 0.96 * vid_conheight)
+                       return;
+               vector target_pos;
+               target_pos = eY * scoreboard_bottom + eX * 0.5 * (vid_conwidth - panel_size_x);
+               panel_pos = panel_pos + (target_pos - panel_pos) * sqrt(scoreboard_fade_alpha);
+               panel_size_y = min(panel_size_y, vid_conheight - scoreboard_bottom);
+       }
+
+       HUD_Panel_DrawBg(1);
+
+       if (!centerprint_showing)
+               return;
+
+       if(panel_bg_padding)
+       {
+               panel_pos += '1 1 0' * panel_bg_padding;
+               panel_size -= '2 2 0' * panel_bg_padding;
+       }
+
+       float entries, height;
+       vector fontsize;
+       // entries = bound(1, floor(CENTERPRINT_MAX_ENTRIES * 4 * panel_size_y/panel_size_x), CENTERPRINT_MAX_ENTRIES);
+       // height = panel_size_y/entries;
+       // fontsize = '1 1 0' * height;
+       height = vid_conheight/50 * autocvar_hud_panel_centerprint_fontscale;
+       fontsize = '1 1 0' * height;
+       entries = bound(1, floor(panel_size_y/height), CENTERPRINT_MAX_ENTRIES);
+
+       float i, j, k, n;
+       float a, sz, align, current_msg_pos_y, msg_size;
+       vector pos;
+       string ts;
+
+       n = -1; // if no msg will be displayed, n stays -1
+
+       pos = panel_pos;
+       if (autocvar_hud_panel_centerprint_flip)
+               pos_y += panel_size_y;
+       align = bound(0, autocvar_hud_panel_centerprint_align, 1);
+       for (i=0, j=cpm_index; i<CENTERPRINT_MAX_MSGS; ++i, ++j)
+       {
+               if (j == CENTERPRINT_MAX_MSGS)
+                       j = 0;
+               if (centerprint_expire_time[j] < time)
+               {
+                       if (centerprint_countdown_num[j] && centerprint_time[j] > 0)
+                       {
+                               centerprint_countdown_num[j] = centerprint_countdown_num[j] - 1;
+                               if (centerprint_countdown_num[j] == 0)
+                                       continue;
+                               centerprint_expire_time[j] = centerprint_expire_time[j] + centerprint_time[j];
+                       }
+                       else
+                               continue;
+               }
+               if (centerprint_time[j] < 0 || centerprint_expire_time[j] - centerprint_fadetime > time)
+               {
+                       a = bound(0, (time - (centerprint_expire_time[j] - centerprint_time[j])) / centerprint_fadetime, 1);
+                       sz = 0.8 + a * (1 - 0.8);
+               }
+               else if (centerprint_expire_time[j] > time)
+               {
+                       a = (centerprint_expire_time[j] - time) / centerprint_fadetime;
+                       sz = 0.8 + a * (1 - 0.8);
+               }
+
+               drawfontscale = sz * '1 1 0';
+               if (centerprint_countdown_num[j])
+                       n = tokenizebyseparator(sprintf(centerprint_messages[j], centerprint_countdown_num[j]), "\n");
+               else
+                       n = tokenizebyseparator(centerprint_messages[j], "\n");
+               if (autocvar_hud_panel_centerprint_flip)
+               {
+                       // check if the message can be entirely shown
+                       for(k = 0; k < n; ++k)
+                       {
+                               getWrappedLine_remaining = argv(k);
+                               while(getWrappedLine_remaining)
+                               {
+                                       ts = getWrappedLine(panel_size_x * sz, fontsize, stringwidth_colors);
+                                       if (ts != "")
+                                               pos_y -= fontsize_y;
+                                       else
+                                               pos_y -= fontsize_y * CENTERPRINT_SPACING/2;
+                                       if (pos_y < panel_pos_y) // check if the next line can be shown
+                                       {
+                                               drawfontscale = '1 1 0';
+                                               return;
+                                       }
+                               }
+                       }
+                       current_msg_pos_y = pos_y; // save starting pos (first line) of the current message
+               }
+
+               msg_size = pos_y;
+               for(k = 0; k < n; ++k)
+               {
+                       getWrappedLine_remaining = argv(k);
+                       while(getWrappedLine_remaining)
+                       {
+                               ts = getWrappedLine(panel_size_x * sz, fontsize, stringwidth_colors);
+                               if (ts != "")
+                               {
+                                       if (align)
+                                               pos_x = panel_pos_x + (panel_size_x - stringwidth(ts, TRUE, fontsize)) * align;
+                                       drawcolorcodedstring(pos + eY * 0.5 * (1 - sz) * fontsize_y, ts, fontsize, a * panel_fg_alpha, DRAWFLAG_NORMAL);
+                                       pos_y += fontsize_y;
+                               }
+                               else
+                                       pos_y += fontsize_y * CENTERPRINT_SPACING/2;
+                               if (!autocvar_hud_panel_centerprint_flip && pos_y > panel_pos_y + panel_size_y - fontsize_y) // check if the next line can be shown
+                               {
+                                       drawfontscale = '1 1 0';
+                                       return;
+                               }
+                       }
+               }
+               msg_size = pos_y - msg_size;
+               if (autocvar_hud_panel_centerprint_flip)
+               {
+                       pos_y = current_msg_pos_y - CENTERPRINT_SPACING * fontsize_y;
+                       if (a < 1 && centerprint_msgID[j] == 0) // messages with id can be replaced just after they are faded out, so never move over them the next messages
+                               pos_y += (msg_size + CENTERPRINT_SPACING * fontsize_y) * (1 - sqrt(a));
+               }
+               else
+               {
+                       pos_y += CENTERPRINT_SPACING * fontsize_y;
+                       if (a < 1 && centerprint_msgID[j] == 0) // messages with id can be replaced just after they are faded out, so never move over them the next messages
+                               pos_y -= (msg_size + CENTERPRINT_SPACING * fontsize_y) * (1 - sqrt(a));
+               }
+       }
+       drawfontscale = '1 1 0';
+       if (n == -1)
+       {
+               centerprint_showing = FALSE;
+               reset_centerprint_messages();
+       }
+}
+
 /*
 ==================
 Main HUD system
@@ -4545,6 +4684,8 @@ switch (id) {\
                 HUD_InfoMessages(); break;\
        case (HUD_PANEL_PHYSICS):\
                 HUD_Physics(); break;\
+       case (HUD_PANEL_CENTERPRINT):\
+                HUD_CenterPrint(); break;\
 } ENDS_WITH_CURLY_BRACE
 
 void HUD_Main (void)
@@ -4575,6 +4716,14 @@ void HUD_Main (void)
        else if(autocvar__menu_alpha == 0 && scoreboard_fade_alpha == 0)
                hud_fade_alpha = 1;
 
+       // panels that we want to be active together with the scoreboard
+       // they must call HUD_Panel_ApplyFadeAlpha(); only when showing the menu
+       if(scoreboard_fade_alpha == 1)
+       {
+               HUD_CenterPrint();
+               return;
+       }
+
        if(!autocvar__hud_configure && !hud_fade_alpha)
                return;
 
@@ -4693,9 +4842,6 @@ void HUD_Main (void)
        if(autocvar__con_chat_maximized)
                HUD_Chat(); // HUD_DrawPanel(HUD_PANEL_CHAT);
 
-       if (autocvar__hud_configure && spectatee_status && hud_configure_prev == -1) // try to join if we are in hud_configure mode, but still spectating, and in the first frame (in order to get rid of motd when launching a server via the menu "HUD Setup" button)
-               localcmd("cmd selectteam auto; cmd join\n");
-
        if(autocvar__hud_configure && tab_panel != -1)
        {
                HUD_Panel_UpdatePosSizeForId(tab_panel)
index d2fbfebef2603ca71bc6ee2fc470cfbc47076f44..ca9296799e8ecb6134645387c1e66fcaf1267859 100644 (file)
@@ -1,7 +1,5 @@
 float log(float f);
 
-vector centerprint_start;
-
 float panel_order[HUD_PANEL_NUM];
 string hud_panelorder_prev;
 
@@ -156,6 +154,14 @@ if(panel_bg_color_team_str == "") {\
        panel_bg_color_team = stof(panel_bg_color_team_str);\
 }
 
+// the check doesn't allow to fade this panel when showing the panel-specific menu dialog
+#define HUD_Panel_ApplyFadeAlpha()\
+if(!(menu_enabled == 2 && highlightedPanel == hud_configure_active_panel))\
+{\
+       panel_bg_alpha *= hud_fade_alpha;\
+       panel_fg_alpha *= hud_fade_alpha;\
+} ENDS_WITH_CURLY_BRACE
+
 // Get value for panel_bg_alpha: if "" fetch default, else use panel_bg_alpha. Also do various menu dialog fadeout/in checks, and minalpha checks
 // comment on line 3 of macro: // do not set a minalpha cap when showing the config dialog for this panel
 #define HUD_Panel_GetBgAlpha()\
@@ -170,19 +176,14 @@ if(autocvar__hud_configure) {\
                panel_bg_alpha = (1 - autocvar__menu_alpha) * max(cvar("hud_configure_bg_minalpha"), panel_bg_alpha) + autocvar__menu_alpha * panel_bg_alpha;\
        else\
                panel_bg_alpha = max(cvar("hud_configure_bg_minalpha"), panel_bg_alpha);\
-} if(!(menu_enabled == 2 && highlightedPanel == hud_configure_active_panel)) {\
-       panel_bg_alpha *= hud_fade_alpha;\
 }
 
 // Get value for panel_fg_alpha. Also do various minalpha checks
 // comment on line 2 of macro: // ALWAYS show disabled panels at 0.25 alpha when in config mode
-// comment on line 4 of macro: // don't fade this panel when showing the panel-specific menu dialog
 #define HUD_Panel_GetFgAlpha()\
 panel_fg_alpha = autocvar_hud_panel_fg_alpha;\
 if(autocvar__hud_configure && !panel_enabled)\
        panel_fg_alpha = 0.25;\
-if(!(menu_enabled == 2 && highlightedPanel == hud_configure_active_panel))\
-       panel_fg_alpha *= hud_fade_alpha;
 
 // Get border. See comments above, it's similar.
 #define HUD_Panel_GetBorder()\
@@ -232,7 +233,7 @@ else\
 panel_pos = (1 - autocvar__menu_alpha) * panel_pos + (autocvar__menu_alpha) * menu_enable_panelpos;
 
 // return smoothly faded size of given panel when a dialog is active
-//var vector menu_enable_maxsize; FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(menu_enable_maxsize);
+//var vector menu_enable_maxsize;
 var float menu_enable_maxsize_x;
 var float menu_enable_maxsize_y;
 var vector menu_enable_size;
@@ -283,6 +284,7 @@ if(menu_enabled == 2 && hud_configure_active_panel == highlightedPanel) {\
 switch(id) { \
        case HUD_PANEL_INFOMESSAGES: HUD_Panel_UpdateCvars(infomessages) break; \
        case HUD_PANEL_PHYSICS: HUD_Panel_UpdateCvars(physics); break;\
+       case HUD_PANEL_CENTERPRINT: HUD_Panel_UpdateCvars(centerprint); break;\
 }
 
 #define HUD_Panel_UpdateCvarsForId(id) \
@@ -320,6 +322,7 @@ HUD_Panel_GetBorder()
 switch(id) { \
        case HUD_PANEL_INFOMESSAGES: HUD_Panel_UpdatePosSize(infomessages) break;\
        case HUD_PANEL_PHYSICS: HUD_Panel_UpdatePosSize(physics); break;\
+       case HUD_PANEL_CENTERPRINT: HUD_Panel_UpdatePosSize(centerprint); break;\
 }
 
 #define HUD_Panel_UpdatePosSizeForId(id) \
index 0923e4ed97e1603fc14251ce566c70489d20f817..109a9cf54a239b17e7280f2aa15823c06c3614f6 100644 (file)
@@ -45,9 +45,6 @@ void HUD_Panel_ExportCfg(string cfgname)
                HUD_Write_Cvar_q("hud_configure_grid_ysize");
                HUD_Write("\n");
 
-               HUD_Write_Cvar_q("scr_centerpos");
-               HUD_Write("\n");
-
                // common cvars for all panels
                float i;
                for (i = 0; i < HUD_PANEL_NUM; ++i)
@@ -124,6 +121,13 @@ void HUD_Panel_ExportCfg(string cfgname)
                                        HUD_Write_PanelCvar_q("_progressbar");
                                        HUD_Write_PanelCvar_q("_acceleration_mode");
                                        break;
+                               case HUD_PANEL_CENTERPRINT:
+                                       HUD_Write_PanelCvar_q("_align");
+                                       HUD_Write_PanelCvar_q("_flip");
+                                       HUD_Write_PanelCvar_q("_fontscale");
+                                       HUD_Write_PanelCvar_q("_time");
+                                       HUD_Write_PanelCvar_q("_fadetime");
+                                       break;
                        }
                        HUD_Write("\n");
                }
@@ -568,6 +572,10 @@ float HUD_Panel_InputEvent(float bInputType, float nPrimary, float nSecondary)
 {
        string s;
 
+       // we only care for keyboard events
+       if(bInputType != 0 && bInputType != 1)
+               return false;
+
        if(!autocvar__hud_configure)
                return false;
 
index f96d3d7f96887ad3246e989bb8de25e18868dca8..3d6a1033a130f86eb62fb420171ad3a851e55677 100644 (file)
@@ -79,7 +79,7 @@ void InterpolateOrigin_Do()
        if(self.itime1 && self.itime2 && self.itime1 != self.itime2)
        {
                float f;
-               f = bound(0, (time - self.itime1) / (self.itime2 - self.itime1), 1);
+               f = bound(0, (time - self.itime1) / (self.itime2 - self.itime1), 1 + autocvar_cl_lerpexcess);
                self.origin = (1 - f) * self.iorigin1 + f * self.iorigin2;
                if(self.iflags & IFLAG_ANGLES)
                {
index af849e18c57c92dce1d1580b3342962b5b23403d..64399b20a3e035e6ad899978225cdfadb44a581d 100644 (file)
@@ -86,8 +86,8 @@ string scores_label[MAX_SCORE];
 float scores_flags[MAX_SCORE];
 string teamscores_label[MAX_SCORE];
 float teamscores_flags[MAX_SCORE];
-.float scores[MAX_SCORE]; FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(scores);
-.float teamscores[MAX_TEAMSCORE]; FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(teamscores);
+.float scores[MAX_SCORE];
+.float teamscores[MAX_TEAMSCORE];
 
 #define IS_INCREASING(x) ( (x)&SFL_LOWER_IS_BETTER )
 #define IS_DECREASING(x) ( !((x)&SFL_LOWER_IS_BETTER) )
@@ -144,6 +144,7 @@ float camera_roll;
 vector camera_direction;
 
 void centerprint(string strMessage);
+void centerprint_generic(float new_id, string strMessage, float duration, float countdown_num);
 
 #define ALPHA_MIN_VISIBLE 0.003
 
@@ -164,3 +165,5 @@ float g_balance_electro_secondary_bouncestop;
 float g_trueaim_minrange;
 
 entity entcs_receiver[255]; // 255 is the engine limit on maxclients
+
+float hud;
index a9e7ca4a94beee110d55d8b85d3879fa03132eff..48b2106e1471b9d99a1227d69c40656fc7f021c7 100644 (file)
@@ -170,7 +170,7 @@ void MapVote_Draw()
 
        if(!mv_active)
                return;
-       
+
        mv_mousepos = mv_mousepos + getmousepos();
 
        mv_mousepos_x = bound(0, mv_mousepos_x, vid_conwidth);
@@ -190,14 +190,14 @@ void MapVote_Draw()
 
        pos_y = ymin;
        pos_z = 0;
-       //pos_x = center - stringwidth("Vote for a map", false) * 0.5 * 24;
-       pos_x = center - stringwidth(_("Vote for a map"), false, '12 0 0');
-       drawstring(pos, "Vote for a map", '24 24 0', '1 1 1', 1, DRAWFLAG_NORMAL);
+
+       map = _("Vote for a map");
+       pos_x = center - stringwidth(map, false, '12 0 0');
+       drawstring(pos, map, '24 24 0', '1 1 1', 1, DRAWFLAG_NORMAL);
        pos_y += 26;
 
        i = ceil(max(0, mv_timeout - time));
        map = sprintf(_("%d seconds left"), i);
-       //pos_x = center - stringwidth(map, false) * 0.5 * 16;
        pos_x = center - stringwidth(map, false, '8 0 0');
        drawstring(pos, map, '16 16 0', '0 1 0', 1, DRAWFLAG_NORMAL);
        pos_y += 22;
@@ -207,7 +207,7 @@ void MapVote_Draw()
        ymin = pos_y;
        if(mv_abstain)
                mv_num_maps -= 1;
-       
+
        if(mv_num_maps > 3)
        {
                columns = 3;
@@ -242,7 +242,7 @@ void MapVote_Draw()
 
        if(mv_abstain)
                ++mv_num_maps;
-       
+
        if(mv_abstain && i < mv_num_maps) {
                tmp = mv_votes[i];
                pos_y = ymax + isize - hud_fontsize_y;
@@ -436,7 +436,7 @@ void MapVote_UpdateMask()
 
        if(oldmask & mv_maps_mask != oldmask)
                if(oldmask & mv_maps_mask == mv_maps_mask)
-                        sound(world, CHAN_AUTO, "misc_invshot.wav", VOL_BASE, ATTN_NONE);
+                        sound(world, CH_INFO, "misc_invshot.wav", VOL_BASE, ATTN_NONE);
 
        // remove votes that no longer apply
        for(i = 0, power = 1; i < mv_num_maps; ++i, power *= 2)
index d59c75ba8d81629cfc485bea7499a6fe32a9a60a..7301fbf0bbf2922fa30b14f83c487e770239da5e 100644 (file)
@@ -8,7 +8,7 @@ void serverAnnouncer()
        // check for pending announcement, play it and remove it
        if(announce_snd != "")
        {
-               sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/", announce_snd, ".wav"), VOL_BASEVOICE, ATTN_NONE);
+               sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/", announce_snd, ".wav"), VOL_BASEVOICE, ATTN_NONE);
                strunzone(announce_snd);
                announce_snd = "";
        }
@@ -20,9 +20,9 @@ void restartAnnouncer_Think() {
        countdown_rounded = floor(0.5 + countdown);
        if(countdown <= 0) {
                if (!spectatee_status) //do cprint only for players
-                       centerprint(_("^1Begin!"));
+                       centerprint_generic(CPID_GAME_STARTING, _("^1Begin!"), 1, 0);
 
-               sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/begin.wav"), VOL_BASEVOICE, ATTN_NONE);
+               sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/begin.wav"), VOL_BASEVOICE, ATTN_NONE);
                //reset maptime announcers now as well
                announcer_5min = announcer_1min = FALSE;
 
@@ -31,10 +31,10 @@ void restartAnnouncer_Think() {
        }
        else {
                if (!spectatee_status) //do cprint only for players
-                       centerprint(sprintf(_("^1Game starts in %d seconds"), countdown_rounded));
+                       centerprint_generic(CPID_GAME_STARTING, _("^1Game starts in %d seconds"), 1, countdown_rounded);
 
                if(countdown_rounded <= 3 && countdown_rounded >= 1) {
-                       sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/", ftos(countdown_rounded), ".wav"), VOL_BASEVOICE, ATTN_NONE);
+                       sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/", ftos(countdown_rounded), ".wav"), VOL_BASEVOICE, ATTN_NONE);
                }
 
                self.nextthink = getstatf(STAT_GAMESTARTTIME) - (countdown - 1);
@@ -71,7 +71,7 @@ void maptimeAnnouncer() {
                        //if we're in warmup mode, check whether there's a warmup timelimit
                        if not (warmuplimit == -1 && warmup_stage) {
                                announcer_5min = TRUE;
-                               sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/5minutesremain.wav"), VOL_BASEVOICE, ATTN_NONE);
+                               sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/5minutesremain.wav"), VOL_BASEVOICE, ATTN_NONE);
                        }
        }
 
@@ -86,7 +86,7 @@ void maptimeAnnouncer() {
                        //if we're in warmup mode, check whether there's a warmup timelimit
                        if not (warmuplimit == -1 && warmup_stage) {
                                announcer_1min = TRUE;
-                               sound(world, CHAN_AUTO, strcat("announcer/", autocvar_cl_announcer, "/1minuteremains.wav"), VOL_BASEVOICE, ATTN_NONE);
+                               sound(world, CH_INFO, strcat("announcer/", autocvar_cl_announcer, "/1minuteremains.wav"), VOL_BASEVOICE, ATTN_NONE);
                        }
        }
 }
@@ -319,9 +319,6 @@ vector HUD_GetFontsize(string cvarname)
 
 float PreviewExists(string name)
 {
-       float f;
-       string file;
-
        if(autocvar_cl_readpicture_force)
                return false;
 
index 9a17dea35694f9ee005b836f603d65071a2ac7ba..49f35d891260d8a9b229a8561165b7055b58166a 100644 (file)
@@ -1,4 +1,8 @@
-.entity move_groundentity;
+float STAT_MOVEFLAGS = 225;
+float MOVEFLAG_GRAVITYUNAFFECTEDBYTICRATE = 4;
+#define GRAVITY_UNAFFECTED_BY_TICRATE (getstati(STAT_MOVEFLAGS) & MOVEFLAG_GRAVITYUNAFFECTEDBYTICRATE)
+
+.entity move_groundentity; // FIXME add move_groundnetworkentity?
 .float move_suspendedinair;
 .float move_didgravity;
 
@@ -232,11 +236,21 @@ void _Movetype_Physics_Toss(float dt) // SV_Physics_Toss
 
        if(self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS)
        {
-               self.move_didgravity = TRUE;
-               if(self.gravity)
-                       self.move_velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+               self.move_didgravity = 1;
+               if(GRAVITY_UNAFFECTED_BY_TICRATE)
+               {
+                       if(self.gravity)
+                               self.move_velocity_z -= 0.5 * dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+                       else
+                               self.move_velocity_z -= 0.5 * dt * getstatf(STAT_MOVEVARS_GRAVITY);
+               }
                else
-                       self.move_velocity_z -= dt * getstatf(STAT_MOVEVARS_GRAVITY);
+               {
+                       if(self.gravity)
+                               self.move_velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+                       else
+                               self.move_velocity_z -= dt * getstatf(STAT_MOVEVARS_GRAVITY);
+               }
        }
 
        self.move_angles = self.move_angles + self.move_avelocity * dt;
@@ -318,12 +332,22 @@ void _Movetype_Physics_Toss(float dt) // SV_Physics_Toss
                        break;
        }
 
+       if(GRAVITY_UNAFFECTED_BY_TICRATE)
+       if(self.move_didgravity > 0)
+       if(!(self.move_flags & FL_ONGROUND))
+       {
+               if(self.gravity)
+                       self.move_velocity_z -= 0.5 * dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+               else
+                       self.move_velocity_z -= 0.5 * dt * getstatf(STAT_MOVEVARS_GRAVITY);
+       }
+
        _Movetype_CheckWaterTransition();
 }
 
 void _Movetype_Physics_Frame(float movedt)
 {
-       self.move_didgravity = FALSE;
+       self.move_didgravity = -1;
        switch(self.move_movetype)
        {
                case MOVETYPE_PUSH:
@@ -364,9 +388,6 @@ void Movetype_Physics_NoMatchServer() // optimized
        movedt = time - self.move_time;
        self.move_time = time;
 
-       //self.move_didgravity = ((self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS) && !(self.move_flags & FL_ONGROUND));
-       // we use the field as set by the last run of this
-
        _Movetype_Physics_Frame(movedt);
        if(wasfreed(self))
                return;
@@ -399,8 +420,8 @@ void Movetype_Physics_MatchTicrate(float tr, float sloppy) // SV_Physics_Entity
        dt -= n * tr;
        self.move_time += n * tr;
 
-       //self.move_didgravity = ((self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS) && !(self.move_flags & FL_ONGROUND));
-       // we use the field as set by the last run of this
+       if(!self.move_didgravity)
+               self.move_didgravity = ((self.move_movetype == MOVETYPE_BOUNCE || self.move_movetype == MOVETYPE_TOSS) && !(self.move_flags & FL_ONGROUND));
 
        for(i = 0; i < n; ++i)
        {
@@ -415,12 +436,23 @@ void Movetype_Physics_MatchTicrate(float tr, float sloppy) // SV_Physics_Entity
        {
                // now continue the move from move_time to time
                self.velocity = self.move_velocity;
-               if(self.move_didgravity)
+
+               if(self.move_didgravity > 0)
                {
-                       if(self.gravity)
-                               self.velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+                       if(GRAVITY_UNAFFECTED_BY_TICRATE)
+                       {
+                               if(self.gravity)
+                                       self.velocity_z -= 0.5 * dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+                               else
+                                       self.velocity_z -= 0.5 * dt * getstatf(STAT_MOVEVARS_GRAVITY);
+                       }
                        else
-                               self.velocity_z -= dt * getstatf(STAT_MOVEVARS_GRAVITY);
+                       {
+                               if(self.gravity)
+                                       self.velocity_z -= dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+                               else
+                                       self.velocity_z -= dt * getstatf(STAT_MOVEVARS_GRAVITY);
+                       }
                }
 
                self.angles = self.move_angles + dt * self.avelocity;
@@ -435,6 +467,17 @@ void Movetype_Physics_MatchTicrate(float tr, float sloppy) // SV_Physics_Entity
                        if(!trace_startsolid)
                                setorigin(self, trace_endpos);
                }
+
+               if(self.move_didgravity > 0)
+               {
+                       if(GRAVITY_UNAFFECTED_BY_TICRATE)
+                       {
+                               if(self.gravity)
+                                       self.velocity_z -= 0.5 * dt * self.gravity * getstatf(STAT_MOVEVARS_GRAVITY);
+                               else
+                                       self.velocity_z -= 0.5 * dt * getstatf(STAT_MOVEVARS_GRAVITY);
+                       }
+               }
        }
        else
        {
index 3ec9a8f1d35f50148833f68cc82fc234d48ef9da..c6ab6543cb347efe7825c07c18cea339d25bb03a 100644 (file)
@@ -28,6 +28,7 @@ float MOVETYPE_BOUNCE                         = 10;
 float  MOVETYPE_BOUNCEMISSILE  = 11;   // Like bounce but doesn't lose speed on bouncing
 float MOVETYPE_FOLLOW = 12;
 float MOVETYPE_FAKEPUSH = 13;
+float MOVETYPE_FLY_WORLDONLY = 33;
 
 float   FL_ITEM                 = 256;
 float  FL_ONGROUND                             = 512;
index b33b81a018ca982638304afd5edcc3e5adf753d3..b7233eee14b8c1a5e29a21b1e22b6c59c7584664 100644 (file)
@@ -58,7 +58,7 @@ void Draw_PointParticles()
                        if(self.noise != "")
                        {
                                self.origin = p;
-                               sound(self, CHAN_TRIGGER, self.noise, VOL_BASE * self.volume, self.atten);
+                               sound(self, CH_AMBIENT, self.noise, VOL_BASE * self.volume, self.atten);
                        }
                        self.just_toggled = 0;
                }
index 4219eef16447e01372629a917b91c8e853cfcc71..0d024a9411fc4306280c5b54c22a3d89a7669f59 100644 (file)
@@ -30,8 +30,11 @@ prandom.qh
 bgmscript.qh
 noise.qh
 teamplay.qh
-
+tturrets.qh
+../server/tturrets/include/turrets_early.qh
+../server/movelib.qc
 main.qh
+vehicles/vehicles.qh
 
 sortlist.qc
 miscfunctions.qc
@@ -59,9 +62,10 @@ modeleffects.qc
 tuba.qc
 target_music.qc
 
-//vehicles/spiderbot.qc
+vehicles/vehicles.qc
 shownames.qh
 shownames.qc
+
 Main.qc
 View.qc
 interpolate.qc
@@ -82,5 +86,6 @@ noise.qc
 ../warpzonelib/mathlib.qc
 ../warpzonelib/common.qc
 ../warpzonelib/client.qc
+tturrets.qc
 
 ../common/if-this-file-errors-scroll-up-and-fix-the-warnings.fteqccfail
index 092cdc21a6f60e94a2939a5df1e955f9c027ed66..31fecfaee2287e81131ebb5e5319c33983a02f7b 100644 (file)
@@ -27,10 +27,12 @@ void Projectile_ResetTrail(vector to)
        self.trail_oldorigin = to;
        self.trail_oldtime = time;
 }
+
 void Projectile_DrawTrail(vector to)
 {
        vector from;
        float t0;
+
        from = self.trail_oldorigin;
        t0 = self.trail_oldtime;
        self.trail_oldorigin = to;
@@ -169,7 +171,7 @@ void loopsound(entity e, float ch, string samp, float vol, float attn)
 void Ent_RemoveProjectile()
 {
        if(self.snd_looping)
-               sound(self, CHAN_PROJECTILE, "misc/null.wav", VOL_BASE, ATTN_NORM);
+               sound(self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTN_NORM);
 
        if(self.count & 0x80)
        {
@@ -195,7 +197,7 @@ void Ent_Projectile()
        //   effects
        //
        // projectiles don't send angles, because they always follow the velocity
-       
+
        f = ReadByte();
        self.count = (f & 0x80);
        self.iflags = (self.iflags & IFLAG_INTERNALMASK) | IFLAG_AUTOANGLES | IFLAG_ANGLES;
@@ -294,6 +296,14 @@ void Ent_Projectile()
                        case PROJECTILE_TAG: setmodel(self, "models/laser.mdl"); self.traileffect = particleeffectnum("TR_ROCKET"); break;
                        case PROJECTILE_FLAC: setmodel(self, "models/hagarmissile.mdl"); self.scale = 0.4; self.traileffect = particleeffectnum("TR_SEEKER"); break;
                        case PROJECTILE_SEEKER: setmodel(self, "models/tagrocket.md3"); self.traileffect = particleeffectnum("TR_SEEKER"); break;
+
+                       case PROJECTILE_RAPTORBOMB:    setmodel(self, "models/vehicles/clusterbomb.md3"); self.gravity = 1; self.avelocity = '0 0 180'; self.traileffect = particleeffectnum(""); break;
+                       case PROJECTILE_RAPTORBOMBLET: setmodel(self, "models/vehicles/bomblet.md3");     self.gravity = 1; self.avelocity = '0 0 180'; self.traileffect = particleeffectnum(""); break;
+                       case PROJECTILE_RAPTORCANNON:  setmodel(self, "models/plasmatrail.mdl"); self.traileffect = particleeffectnum("TR_CRYLINKPLASMA"); break;
+
+                       case PROJECTILE_SPIDERROCKET: setmodel(self, "models/vehicles/rocket02.md3"); self.traileffect = particleeffectnum("spiderbot_rocket_thrust"); break;
+                       case PROJECTILE_WAKIROCKET:   setmodel(self, "models/vehicles/rocket01.md3");  self.traileffect = particleeffectnum("wakizashi_rocket_thrust"); break;
+                       case PROJECTILE_WAKICANNON:   setmodel(self, "models/laser.mdl");  self.traileffect = particleeffectnum(""); break;
                        default:
                                error("Received invalid CSQC projectile, can't work with this!");
                                break;
@@ -310,7 +320,7 @@ void Ent_Projectile()
                {
                        case PROJECTILE_ELECTRO:
                                // only new engines support sound moving with object
-                               loopsound(self, CHAN_PROJECTILE, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
+                               loopsound(self, CH_SHOTS_SINGLE, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
                                self.mins = '0 0 -4';
                                self.maxs = '0 0 -4';
                                self.move_movetype = MOVETYPE_BOUNCE;
@@ -319,7 +329,7 @@ void Ent_Projectile()
                                self.move_bounce_stopspeed = g_balance_electro_secondary_bouncestop;
                                break;
                        case PROJECTILE_ROCKET:
-                               loopsound(self, CHAN_PROJECTILE, "weapons/rocket_fly.wav", VOL_BASE, ATTN_NORM);
+                               loopsound(self, CH_SHOTS_SINGLE, "weapons/rocket_fly.wav", VOL_BASE, ATTN_NORM);
                                self.mins = '-3 -3 -3';
                                self.maxs = '3 3 3';
                                break;
@@ -360,12 +370,12 @@ void Ent_Projectile()
                                self.move_touch = SUB_Null;
                                break;
                        case PROJECTILE_FIREBALL:
-                               loopsound(self, CHAN_PROJECTILE, "weapons/fireball_fly2.wav", VOL_BASE, ATTN_NORM);
+                               loopsound(self, CH_SHOTS_SINGLE, "weapons/fireball_fly2.wav", VOL_BASE, ATTN_NORM);
                                self.mins = '-16 -16 -16';
                                self.maxs = '16 16 16';
                                break;
                        case PROJECTILE_FIREMINE:
-                               loopsound(self, CHAN_PROJECTILE, "weapons/fireball_fly.wav", VOL_BASE, ATTN_NORM);
+                               loopsound(self, CH_SHOTS_SINGLE, "weapons/fireball_fly.wav", VOL_BASE, ATTN_NORM);
                                self.move_movetype = MOVETYPE_BOUNCE;
                                self.move_touch = SUB_Null;
                                self.mins = '-4 -4 -4';
@@ -380,10 +390,26 @@ void Ent_Projectile()
                                self.maxs = '2 2 2';
                                break;
                        case PROJECTILE_SEEKER:
-                               loopsound(self, CHAN_PROJECTILE, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
+                               loopsound(self, CH_SHOTS_SINGLE, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
                                self.mins = '-4 -4 -4';
                                self.maxs = '4 4 4';
                                break;
+            case PROJECTILE_RAPTORBOMB:
+                               self.mins = '-3 -3 -3';
+                               self.maxs = '3 3 3';
+                               break;
+            case PROJECTILE_RAPTORBOMBLET:
+                               break;
+            case PROJECTILE_RAPTORCANNON:
+                               break;
+            case PROJECTILE_SPIDERROCKET:
+                loopsound(self, CH_SHOTS_SINGLE, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
+                               break;
+            case PROJECTILE_WAKIROCKET:
+                loopsound(self, CH_SHOTS_SINGLE, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
+                               break;
+            case PROJECTILE_WAKICANNON:
+                               break;
                        default:
                                break;
                }
@@ -406,7 +432,7 @@ void Ent_Projectile()
 
        if(!(self.count & 0x80))
                InterpolateOrigin_Note();
-       
+
        self.draw = Projectile_Draw;
        self.entremove = Ent_RemoveProjectile;
 }
@@ -424,9 +450,11 @@ void Projectile_Precache()
        precache_model("models/rocket.md3");
        precache_model("models/tagrocket.md3");
        precache_model("models/tracer.mdl");
+
        precache_sound("weapons/electro_fly.wav");
        precache_sound("weapons/rocket_fly.wav");
        precache_sound("weapons/fireball_fly.wav");
        precache_sound("weapons/fireball_fly2.wav");
        precache_sound("weapons/tag_rocket_fly.wav");
+
 }
index 8e024ead5b0c7fdeb36865a802c9378bf55ba7bf..93f851876da157a0a229127cfdf8cac4111272b9 100644 (file)
@@ -792,6 +792,7 @@ vector HUD_Scoreboard_MakeTable(vector pos, entity tm, vector rgb, vector bg_siz
 
        body_table_height = 1.25 * hud_fontsize_y * max(1, tm.team_size); // no player? show 1 empty line
 
+       pos_y += autocvar_scoreboard_border_thickness;
        pos -= '1 1 0';
 
        tmp_x = sbwidth + 2;
@@ -947,7 +948,7 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size)
        float weapon_width = sbwidth / weapon_cnt;
 
        drawstring(pos, sprintf(_("Accuracy stats (average %d%%)"), average_accuracy), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-       pos_y += 1.25 * hud_fontsize_y;
+       pos_y += 1.25 * hud_fontsize_y + autocvar_scoreboard_border_thickness;
        vector tmp;
        tmp_x = sbwidth;
        tmp_y = height * rows;
@@ -980,7 +981,7 @@ vector HUD_DrawScoreboardAccuracyStats(vector pos, vector rgb, vector bg_size)
        if(getstati(STAT_SWITCHWEAPON) == WEP_MINSTANEX)
                g_minstagib = 1; // TODO: real detection for minstagib?
 
-       float weapon_stats, weapon_number;
+       float weapon_stats;
 
        if (!acc_levels)
                rgb = '1 1 1';
@@ -1072,7 +1073,7 @@ vector HUD_DrawScoreboardRankings(vector pos, entity pl,  vector rgb, vector bg_
 
        pos_y += hud_fontsize_y;
        drawstring(pos, _("Rankings"), hud_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-       pos_y += hud_fontsize_y;
+       pos_y += hud_fontsize_y + autocvar_scoreboard_border_thickness;
        vector tmp;
        tmp_x = sbwidth;
        tmp_y = 1.25 * hud_fontsize_y * RANKINGS_RECEIVED_CNT;
@@ -1102,6 +1103,7 @@ vector HUD_DrawScoreboardRankings(vector pos, entity pl,  vector rgb, vector bg_
                drawcolorcodedstring(pos + '8 0 0' * hud_fontsize_y, n, '1 1 0' * hud_fontsize_y, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
                pos_y += 1.25 * hud_fontsize_y;
        }
+       pos_y += autocvar_scoreboard_border_thickness;
 
        return pos;
 }
@@ -1147,6 +1149,7 @@ void HUD_DrawScoreboard()
 
        vector rgb, pos, tmp;
        entity pl, tm;
+       string str;
 
        xmin = autocvar_scoreboard_offset_left * vid_conwidth;
        ymin = autocvar_con_notify * autocvar_con_notifysize;
@@ -1162,29 +1165,33 @@ void HUD_DrawScoreboard()
        pos_z = 0;
 
        // Heading
-       drawstring(pos, _("Scoreboard"), '24 24 0', '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-       
-       centerprint_start_x = vid_conwidth - 0.5 * (pos_x + stringwidth(_("Scoreboard"), FALSE, '24 24 0'));
-       centerprint_start_y = pos_y;
+       vector sb_heading_fontsize;
+       sb_heading_fontsize = hud_fontsize * 2;
+       drawstring(pos, _("Scoreboard"), sb_heading_fontsize, '1 1 1', scoreboard_alpha_fg, DRAWFLAG_NORMAL);
 
-       pos_y += 24;
+       pos_y += sb_heading_fontsize_y + hud_fontsize_y * 0.25;
 
        // Draw the scoreboard
        vector bg_size = drawgetimagesize("gfx/scoreboard/scoreboard_bg") * autocvar_scoreboard_bg_scale;
 
        if(teamplay)
        {
+               vector team_score_baseoffset;
+               team_score_baseoffset = eY * (2 * autocvar_scoreboard_border_thickness + hud_fontsize_y) - eX * (autocvar_scoreboard_border_thickness + hud_fontsize_x * 0.25);
                for(tm = teams.sort_next; tm; tm = tm.sort_next)
                {
                        if(tm.team == COLOR_SPECTATOR)
                                continue;
 
                        rgb = GetTeamRGB(tm.team);
-                       drawstring(pos - '2 0 0' * hud_fontsize_x + '0 1 0' * hud_fontsize_y, ftos(tm.(teamscores[ts_primary])), '1 1 0' * hud_fontsize_y * 1.5, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+                       str = ftos(tm.(teamscores[ts_primary]));
+                       drawstring(pos + team_score_baseoffset - eX * stringwidth(str, FALSE, hud_fontsize * 1.5), str, hud_fontsize * 1.5, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
 
                        if(ts_primary != ts_secondary)
-                               drawstring(pos - '2 0 0' * hud_fontsize_x + '0 2.5 0' * hud_fontsize_y, ftos(tm.(teamscores[ts_secondary])), '1 1 0' * hud_fontsize_y * 1, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
-
+                       {
+                               str = ftos(tm.(teamscores[ts_secondary]));
+                               drawstring(pos + team_score_baseoffset - eX * stringwidth(str, FALSE, hud_fontsize) + eY * hud_fontsize_y * 1.5, str, hud_fontsize, rgb, scoreboard_alpha_fg, DRAWFLAG_NORMAL);
+                       }
                        pos = HUD_Scoreboard_MakeTable(pos, tm, rgb, bg_size);
                }
        }
@@ -1241,7 +1248,6 @@ void HUD_DrawScoreboard()
        }
 
        // Print info string
-       string str;
        float tl, fl, ll;
        str = sprintf(_("playing on ^2%s^7"), shortmapname);
        tl = getstatf(STAT_TIMELIMIT);
index 28d0d161eb3453108a9d854fbff1562f06fc0bed..e3c6f3d4bda4575b2ee531d8e251c8d3953039fc 100644 (file)
@@ -13,27 +13,29 @@ void Draw_ShowNames(entity ent)
        if(ent.sv_entnum == player_localentnum && !autocvar_chase_active)
                return;
 
+       makevectors(view_angles);
+
        if(ent.sameteam || (!ent.sameteam && autocvar_hud_shownames_enemies))
        {
                ent.origin_z += autocvar_hud_shownames_offset;
 
-               if(!ent.sameteam)
+               float hit;
+               if(ent.sameteam)
                {
-                       /* WIP, why does trace_ent != ent not work as intended here?
-                          if(autocvar_hud_shownames_enemies != 2) // player has to point at enemy if so
-                          {
-                          traceline(view_origin, view_origin + view_forward * MAX_SHOT_DISTANCE, MOVETYPE_FLY, world);
-                          print("trace_endpos: ", vtos(trace_endpos), " view_origin: ", vtos(view_origin), "\n");
-                          if(trace_ent != ent)
-                          return;
-                          }*/
-
-                       traceline(ent.origin, view_origin, 1, ent);
+                       hit = 1;
+               }
+               else
+               {
+                       traceline(view_origin, ent.origin, MOVE_NORMAL, ent);
+                       if(trace_fraction < 1 && trace_networkentity != ent.sv_entnum)
+                               hit = 0;
+                       else
+                               hit = 1;
                }
 
                vector o, eo;
                o = project_3d_to_2d(ent.origin);
-               float overlap;
+               float overlap, onscreen;
 
                if(autocvar_hud_shownames_antioverlap)
                {
@@ -56,7 +58,9 @@ void Draw_ShowNames(entity ent)
                        }
                }
 
-               if(!ent.sameteam && trace_endpos != view_origin) // out of view, fade out
+               onscreen = (o_z >= 0 && o_x >= 0 && o_y >= 0 && o_x <= vid_conwidth && o_y <= vid_conheight);
+
+               if(!ent.sameteam && (!onscreen || !hit)) // out of view, fade out
                        ent.alpha = max(0, ent.alpha - SHOWNAMES_FADESPEED * frametime);
                else if(ent.healthvalue < 1) // dead player, fade out slowly
                        ent.alpha = max(0, ent.alpha - SHOWNAMES_FADESPEED * 0.25 * frametime);
@@ -90,7 +94,7 @@ void Draw_ShowNames(entity ent)
                        resize = 0.5 + 0.5 * ((autocvar_hud_shownames_maxdistance - autocvar_hud_shownames_mindistance) - max(0, dist - autocvar_hud_shownames_mindistance)) / (autocvar_hud_shownames_maxdistance - autocvar_hud_shownames_mindistance);
 
                // draw the sprite image
-               if not(o_z < 0 || o_x < 0 || o_y < 0 || o_x > vid_conwidth || o_y > vid_conheight)
+               if(o_z >= 0)
                {
                        o_z = 0;
 
@@ -150,7 +154,6 @@ void Draw_ShowNames_All()
        float i;
        for(i = 0; i < maxclients; ++i)
        {
-               vector o;
                float t;
                t = GetPlayerColor(i);
                if(t == COLOR_SPECTATOR)
index a17f31d42459ffa2fc1909219d57f998aae47a87..50380e8209531ce2552bd974dbff5e43ac4d8916 100644 (file)
@@ -1,5 +1,4 @@
 .float healthvalue;
 .float armorvalue;
 .float sameteam;
-.float the_entnum;
 
index b50d5a862a92c4da7f21a807d325736681a4e52e..c4573296a6bb0af9f35dedf39ae177855fc847bb 100644 (file)
@@ -19,7 +19,7 @@ void TargetMusic_Advance()
        for(e = world; (e = findfloat(e, enttype, ENT_CLIENT_TRIGGER_MUSIC)); ) if(e.noise)
        {
                vol0 = e.lastvol;
-               if(getsoundtime(e, CHAN_VOICE) < 0)
+               if(getsoundtime(e, CH_BGM_SINGLE) < 0)
                {
                        vol0 = -1;
                }
@@ -43,16 +43,16 @@ void TargetMusic_Advance()
                if(vol != vol0)
                {
                        if(vol0 < 0)
-                               sound(e, CHAN_VOICE, e.noise, vol, ATTN_NONE); // restart
+                               sound(e, CH_BGM_SINGLE, e.noise, vol, ATTN_NONE); // restart
                        else
-                               sound(e, CHAN_VOICE, "", vol, ATTN_NONE);
+                               sound(e, CH_BGM_SINGLE, "", vol, ATTN_NONE);
                        e.lastvol = vol;
                }
        }
        music_trigger = world;
 
        if(best)
-               bgmtime = getsoundtime(best, CHAN_VOICE);
+               bgmtime = getsoundtime(best, CH_BGM_SINGLE);
        else
                bgmtime = gettime(GETTIME_CDTRACK);
 }
@@ -87,8 +87,8 @@ void Net_TargetMusic()
                        strunzone(e.noise);
                e.noise = strzone(noi);
                precache_sound(e.noise);
-               sound(e, CHAN_VOICE, e.noise, 0, ATTN_NONE);
-               if(getsoundtime(e, CHAN_VOICE) < 0)
+               sound(e, CH_BGM_SINGLE, e.noise, 0, ATTN_NONE);
+               if(getsoundtime(e, CH_BGM_SINGLE) < 0)
                {
                        print(sprintf(_("Cannot initialize sound %s\n"), e.noise));
                        strunzone(e.noise);
@@ -175,8 +175,8 @@ void Ent_ReadTriggerMusic()
                if(self.noise != s)
                {
                        precache_sound(self.noise);
-                       sound(self, CHAN_VOICE, self.noise, 0, ATTN_NONE);
-                       if(getsoundtime(self, CHAN_VOICE) < 0)
+                       sound(self, CH_BGM_SINGLE, self.noise, 0, ATTN_NONE);
+                       if(getsoundtime(self, CH_BGM_SINGLE) < 0)
                        {
                                print(sprintf(_("Cannot initialize sound %s\n"), self.noise));
                                strunzone(self.noise);
index 2a93fe163a809143b96d4e076c54396540a884af..2dbdf89658898f756af81d33cf6c57d80e12c664 100644 (file)
@@ -2,6 +2,6 @@
 
 // to make entities have dots on the team radar
 .float teamradar_icon;
-.float teamradar_times[MAX_TEAMRADAR_TIMES]; FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(teamradar_times);
+.float teamradar_times[MAX_TEAMRADAR_TIMES];
 .float teamradar_time_index;
 .vector teamradar_color;
diff --git a/qcsrc/client/tturrets.qc b/qcsrc/client/tturrets.qc
new file mode 100644 (file)
index 0000000..1332d60
--- /dev/null
@@ -0,0 +1,506 @@
+string tid2info_base;
+string tid2info_head;
+string tid2info_name;
+vector  tid2info_min;
+vector  tid2info_max;
+
+void turret_tid2info(float _tid);
+void turret_precache(float _tid);
+float turret_is_precache[TID_LAST];
+
+void turrets_precache()
+{
+    turret_precache(TID_COMMON);
+}
+
+void turret_precache(float _tid)
+{    
+    if (!turret_is_precache[TID_COMMON])
+    {
+        dprint("turret_precache TID_COMMON\n");
+        precache_sound ("weapons/rocket_impact.wav");
+        precache_model ("models/turrets/base-gib1.md3");
+        precache_model ("models/turrets/base-gib2.md3");
+        precache_model ("models/turrets/base-gib3.md3");
+        precache_model ("models/turrets/base-gib4.md3");
+        precache_model ("models/turrets/head-gib1.md3");
+        precache_model ("models/turrets/head-gib2.md3");
+        precache_model ("models/turrets/head-gib3.md3");
+        precache_model ("models/turrets/head-gib4.md3");
+        precache_model ("models/turrets/terrainbase.md3");
+        precache_model ("models/turrets/base.md3");
+        precache_model ("models/turrets/rocket.md3");
+    }
+    turret_tid2info(_tid);
+    if(turret_is_precache[_tid])
+    {
+        dprint("turret_precache: ", tid2info_name, " allready precachd, skipping.\n");
+        return;
+    }
+    else
+        dprint("turret_precache: ", tid2info_name, " precaching.\n");
+
+    switch(_tid)
+    {
+        case TID_EWHEEL:
+            precache_model ("models/turrets/ewheel-base2.md3");
+            precache_model ("models/turrets/ewheel-gun1.md3");            
+            break;
+        case TID_FLAC:
+            precache_model ("models/turrets/flac.md3");
+            break;
+        case TID_FUSION:
+            precache_model ("models/turrets/reactor.md3");    
+            break;
+        case TID_HELLION:
+            precache_model ("models/turrets/hellion.md3");
+            break;
+        case TID_HK:
+            precache_model ("models/turrets/hk.md3");
+            break;
+        case TID_MACHINEGUN:
+            precache_model ("models/turrets/machinegun.md3");
+            precache_sound ("weapons/uzi_fire.wav");
+            break;
+        case TID_MLRS:
+            precache_model ("models/turrets/mlrs.md3");
+            break;
+        case TID_PHASER:
+            precache_model ("models/turrets/phaser.md3");
+            precache_model ("models/turrets/phaser_beam.md3");
+            precache_sound ("turrets/phaser.wav");
+            break;
+        case TID_PLASMA:
+            precache_model ("models/turrets/plasma.md3");
+            break;
+        case TID_PLASMA_DUAL:
+            precache_model ("models/turrets/plasmad.md3");
+            break;
+        case TID_TESLA:
+            precache_model ("models/turrets/tesla_head.md3");
+            precache_model ("models/turrets/tesla_base.md3");
+            break;
+        case TID_WALKER:
+            precache_model ("models/turrets/walker_head_minigun.md3");
+            precache_model ("models/turrets/walker_body.md3");
+            precache_sound ("weapons/uzi_fire.wav");
+            break;
+    }    
+    turret_is_precache[_tid] = TRUE;
+}
+
+void turret_tid2info(float _tid)
+{
+    tid2info_base = "models/turrets/base.md3";
+    tid2info_min = '-32 -32 0';
+    tid2info_max = '32 32 64';
+
+    switch(_tid)
+    {
+        case TID_EWHEEL:
+            tid2info_base = "models/turrets/ewheel-base2.md3";
+            tid2info_head = "models/turrets/ewheel-gun1.md3";
+            tid2info_name = "eWheel";
+            break;
+        case TID_FLAC:
+            tid2info_head = "models/turrets/flac.md3";
+            tid2info_name = "Flac Cannon";
+            break;
+        case TID_FUSION:
+            tid2info_head = "models/turrets/reactor.md3";
+            tid2info_name = "Fusion Reactor";
+            tid2info_min = '-34 -34 0';
+            tid2info_max = '34 34 90';
+            break;
+        case TID_HELLION:
+            tid2info_head = "models/turrets/hellion.md3";
+            tid2info_name = "Hellion";
+            break;
+        case TID_HK:
+            tid2info_head = "models/turrets/hk.md3";
+            tid2info_name = "Hunter-Killer";
+            break;
+        case TID_MACHINEGUN:
+            tid2info_head = "models/turrets/machinegun.md3";
+            tid2info_name = "Machinegun";
+            break;
+        case TID_MLRS:
+            tid2info_head = "models/turrets/mlrs.md3";
+            tid2info_name = "MLRS";
+            break;
+        case TID_PHASER:
+            tid2info_head = "models/turrets/phaser.md3";
+            tid2info_name = "Phaser";
+            break;
+        case TID_PLASMA:
+            tid2info_head = "models/turrets/plasma.md3";
+            tid2info_name = "Plasma";
+            break;
+        case TID_PLASMA_DUAL:
+            tid2info_head = "models/turrets/plasmad.md3";
+            tid2info_name = "Dual Plasma";
+            break;
+        case TID_TESLA:
+            tid2info_base = "models/turrets/tesla_base.md3";
+            tid2info_head = "models/turrets/tesla_head.md3";
+            tid2info_name = "Tesla coil";
+            tid2info_min = '-60 -60 0';
+            tid2info_max  ='60 60 128';
+            break;
+        case TID_WALKER:
+            tid2info_base = "models/turrets/walker_body.md3";
+            tid2info_head = "models/turrets/walker_head_minigun.md3";
+            tid2info_name = "Walker";
+            tid2info_min = '-70 -70 0';
+            tid2info_max = '70 70 95';
+            break;
+    }    
+}
+
+void turret_remove()
+{
+    turret_tid2info(self.turret_type);
+    dprint("Removing ", tid2info_name, " turrret.\n");
+    
+    remove(self.tur_head);
+    self.tur_head = world;    
+}
+
+void turret_changeteam()
+{
+       self.colormod = '0 0 0';
+       
+       switch(self.team)
+       {
+        case COLOR_TEAM1: // Red
+            self.colormod = '2 0.5 0.5';
+            break;
+
+        case COLOR_TEAM2: // Blue
+            self.colormod = '0.5 0.5 2';
+            break;
+
+        case COLOR_TEAM3: // Yellow
+            self.colormod = '1.4 1.4 0.6';
+            break;
+
+        case COLOR_TEAM4: // Pink
+            self.colormod = '1.4 0.6 1.4';
+            break;
+       }
+       
+       self.tur_head.colormod = self.colormod;    
+}
+
+void turret_head_draw()
+{    
+    self.drawmask = MASK_NORMAL;
+}
+
+void turret_draw()
+{        
+    float dt;
+
+    dt = time - self.move_time;
+    self.move_time = time;
+    if(dt <= 0)
+        return;
+    
+    self.tur_head.angles += dt * self.tur_head.move_avelocity;
+
+    if (self.health < 127)
+    {
+        dt = random();
+        
+        if(dt < 0.25)
+            te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);    
+        
+    }
+    
+    if(self.health < 85)    
+    if(dt < 0.1)
+        pointparticles(particleeffectnum("smoke_small"), (self.origin + (randomvec() * 80)), '0 0 0', 1);        
+    
+    if(self.health < 32)
+    if(dt < 0.1)
+        pointparticles(particleeffectnum("smoke_large"), (self.origin + (randomvec() * 80)), '0 0 0', 1);        
+    
+}
+
+void turret_walker_draw()
+{        
+    float dt;
+            
+    dt = time - self.move_time;
+    self.move_time = time;
+    if(dt <= 0)
+        return;
+    
+    fixedmakevectors(self.angles);
+    movelib_groundalign4point(300, 100, 0.25);
+    
+    setorigin(self, self.origin + self.velocity * dt);
+    setorigin(self.tur_head, gettaginfo(self, gettagindex(self, "tag_head")));
+    
+    self.tur_head.angles += dt * self.tur_head.move_avelocity;
+    
+    self.angles_y = self.move_angles_y;
+    
+    if (self.health < 127)
+    if(random() < 0.25)
+        te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);    
+}
+
+void turret_ewheel_draw()
+{        
+    float dt;
+            
+    dt = time - self.move_time;
+    self.move_time = time;
+    if(dt <= 0)
+        return;
+    
+    fixedmakevectors(self.angles);
+    movelib_groundalign4point(300, 100, 0.25);
+    
+    setorigin(self, self.origin + self.velocity * dt);
+    setorigin(self.tur_head, self.origin);
+    
+    self.tur_head.angles += dt * self.tur_head.move_avelocity;
+    
+    // Simulate banking
+    //self.angles_z -= self.angles_z * dt * 2;
+    //self.angles_z = bound(-45, self.angles_z  + ((self.move_angles_y - self.angles_y * -25) * dt), 45);
+    
+    self.angles_y = self.move_angles_y;
+    
+    if (self.health < 127)
+    if(random() < 0.25)
+        te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);    
+}
+
+void turret_construct()
+{    
+    if(self.tur_head == world)
+        self.tur_head = spawn();
+    
+    turret_tid2info(self.turret_type);
+    dprint("Constructing ", tid2info_name , " turret (", ftos(self.turret_type), ")\n");
+
+    setorigin(self, self.origin);
+    setmodel(self, tid2info_base);
+    setmodel(self.tur_head, tid2info_head);
+    setsize(self, tid2info_min, tid2info_max);
+    setsize(self.tur_head, '0 0 0', '0 0 0');
+    setorigin(self.tur_head, gettaginfo(self, gettagindex(self, "tag_head")));
+
+    self.tur_head.classname     = "turret_head";
+    self.tur_head.owner         = self;
+    self.tur_head.move_movetype = MOVETYPE_NOCLIP;
+    self.move_movetype          = MOVETYPE_NOCLIP;
+    self.tur_head.angles        = self.angles;
+    self.health                 = 255;
+    self.solid                  = SOLID_BBOX;
+    self.tur_head.solid         = SOLID_NOT;
+    self.movetype               = MOVETYPE_NOCLIP;
+    self.tur_head.movetype      = MOVETYPE_NOCLIP;    
+    self.draw                   = turret_draw;
+    self.entremove              = turret_remove;
+    self.drawmask = MASK_NORMAL;
+    self.tur_head.drawmask = MASK_NORMAL;
+
+    if(self.turret_type == TID_EWHEEL || self.turret_type == TID_WALKER)
+    {
+        self.gravity            = 1;
+        self.movetype           = MOVETYPE_BOUNCE;
+        self.move_movetype      = MOVETYPE_BOUNCE;
+        self.move_origin        = self.origin;                
+        self.move_time          = time;
+        switch(self.turret_type)
+        {
+            case TID_EWHEEL:
+                self.draw               = turret_ewheel_draw;
+                break;
+            case TID_WALKER:
+                self.draw               = turret_walker_draw;
+        }        
+    }
+}
+
+entity turret_gibtoss(string _model, vector _from, vector _to, vector _cmod, float _explode);
+void turret_gibboom();
+void turret_gib_draw()
+{
+    Movetype_Physics_MatchTicrate(autocvar_cl_gibs_ticrate, autocvar_cl_gibs_sloppy);
+    
+    self.drawmask = MASK_NORMAL;
+       
+       if(self.cnt)
+       {
+           if(time >= self.nextthink)
+           {
+            turret_gibboom();
+            remove(self);
+           }
+       }
+       else
+       {
+        self.alpha = bound(0, self.nextthink - time, 1);
+        if(self.alpha < ALPHA_MIN_VISIBLE)
+            remove(self);          
+       }
+}
+
+void turret_gibboom()
+{
+    float i;
+    
+    sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+    pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
+
+    for (i = 1; i < 5; i = i + 1)
+        turret_gibtoss(strcat("models/turrets/head-gib", ftos(i), ".md3"), self.origin, self.velocity + randomvec() * 700, '0 0 0', FALSE);
+}
+
+entity turret_gibtoss(string _model, vector _from, vector _to, vector _cmod, float _explode)
+{
+    entity gib;
+
+    gib = spawn();
+    setorigin(gib, _from);
+    setmodel(gib, _model);
+    gib.colormod    = _cmod;
+       gib.solid       = SOLID_CORPSE;
+    gib.draw        = turret_gib_draw;    
+    gib.cnt         = _explode;
+    
+    if(_explode)
+    {
+        gib.nextthink = time + 0.2 * (autocvar_cl_gibs_lifetime * (1 + prandom() * 0.15));
+        gib.effects = EF_FLAME;
+    }        
+    else
+        gib.nextthink = time + autocvar_cl_gibs_lifetime * (1 + prandom() * 0.15);
+    
+    gib.gravity         = 1;
+       gib.move_movetype   = MOVETYPE_BOUNCE;
+       gib.move_origin     = gib.origin = _from;
+       gib.move_velocity   = _to;      
+       gib.move_avelocity  = prandomvec() * 32;
+       gib.move_time       = time;
+       gib.damageforcescale = 1;
+       
+       return gib;
+}
+
+void turret_die()
+{    
+    entity headgib;
+    
+    setmodel(self, "");
+    setmodel(self.tur_head, "");
+    sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+    pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
+    turret_tid2info(self.turret_type);
+    dprint("Turret ", tid2info_name, " dies.\n");
+    
+    // Base
+    if(self.turret_type == TID_EWHEEL)
+        turret_gibtoss(tid2info_base, self.origin, self.velocity, '-1 -1 -1', FALSE);
+    else if (self.turret_type == TID_WALKER)
+        turret_gibtoss(tid2info_base, self.origin, self.velocity, '-1 -1 -1', FALSE);
+    else if (self.turret_type == TID_TESLA)
+        turret_gibtoss(tid2info_base, self.origin, self.velocity, '-1 -1 -1', FALSE);
+    else
+    {        
+        if (random() > 0.5)
+        {
+            turret_gibtoss("models/turrets/base-gib2.md3", self.origin + '0 0 2', '0 0 50' + randomvec() * 150, '0 0 0', FALSE);
+            turret_gibtoss("models/turrets/base-gib3.md3", self.origin + '0 0 2', '0 0 50' + randomvec() * 150, '0 0 0', FALSE);
+            turret_gibtoss("models/turrets/base-gib4.md3", self.origin + '0 0 2', '0 0 50' + randomvec() * 150, '0 0 0', FALSE);
+        }
+        else
+            turret_gibtoss("models/turrets/base-gib1.md3", self.origin + '0 0 4', '0 0 0', '0 0 0', TRUE);
+    }
+    
+    headgib = turret_gibtoss(tid2info_head, self.origin + '0 0 32', '0 0 200' + randomvec() * 200, '-1 -1 -1', TRUE);
+    headgib.angles = headgib.move_angles = self.tur_head.angles;
+    headgib.avelocity = headgib.move_avelocity = self.tur_head.move_avelocity + randomvec() * 45;
+    headgib.avelocity_y = headgib.move_avelocity_y = headgib.move_avelocity_y * 5;
+    headgib.gravity = 0.5;
+}
+
+void ent_turret()
+{
+    float sf;
+    sf = ReadByte();
+
+       if(sf & TNSF_SETUP)
+       {           
+           self.turret_type = ReadByte();
+                   
+           self.origin_x = ReadCoord();
+           self.origin_y = ReadCoord();
+           self.origin_z = ReadCoord();
+           
+           self.angles_x = ReadAngle();
+           self.angles_y = ReadAngle();
+           
+           turret_precache(self.turret_type);
+           turret_construct();
+    }
+    
+    if(sf & TNSF_ANG)
+    {
+        self.tur_head.move_angles_x = ReadShort();
+        self.tur_head.move_angles_y = ReadShort();
+        self.tur_head.angles = self.angles + self.tur_head.move_angles;
+    }
+    
+    if(sf & TNSF_AVEL)
+    {
+        self.tur_head.move_avelocity_x = ReadShort();
+        self.tur_head.move_avelocity_y = ReadShort();            
+    }
+    
+    if(sf & TNSF_MOVE)
+    {
+        self.origin_x = ReadShort();
+        self.origin_y = ReadShort();
+        self.origin_z = ReadShort();
+        setorigin(self, self.origin);
+        
+        self.velocity_x = ReadShort();
+        self.velocity_y = ReadShort();
+        self.velocity_z = ReadShort();
+        
+        self.move_angles_y = ReadShort();
+            
+        self.move_time     = time;
+        self.move_velocity = self.velocity;
+        self.move_origin   = self.origin;
+    }
+        
+    if(sf & TNSF_ANIM)
+    {
+        self.frame1time = ReadCoord();
+        self.frame      = ReadByte();
+    }
+
+    if(sf & TNSF_STATUS)
+    {
+        float _team;
+        _team = ReadByte();
+        _team -= 1; // /&)=(%&#)&%)/#&)=½!!!½!!". thanks.
+        self.health = ReadByte();
+        if(_team != self.team)
+        {
+            self.team = _team;
+            turret_changeteam();        
+        }
+        
+        if(self.health == 0)
+            turret_die();
+    } 
+    
+}
diff --git a/qcsrc/client/tturrets.qh b/qcsrc/client/tturrets.qh
new file mode 100644 (file)
index 0000000..cf74f48
--- /dev/null
@@ -0,0 +1,3 @@
+void ent_turret();
+void turrets_precache();
+.entity tur_head;
index 5f1228557f37f2974a8e3efe4434b3241555acd1..06edec4da0e00a82982093323a63ee5f84546548 100644 (file)
@@ -13,18 +13,18 @@ void Ent_TubaNote_Think()
        self.nextthink = time;
        if(self.cnt <= 0)
        {
-               sound(self, CHAN_PROJECTILE, "misc/null.wav", 0, 0);
+               sound(self, CH_SHOTS_SINGLE, "misc/null.wav", 0, 0);
                remove(self);
        }
        else
-               sound(self, CHAN_PROJECTILE, "", self.cnt, self.attenuate * autocvar_g_balance_tuba_attenuation);
+               sound(self, CH_SHOTS_SINGLE, "", self.cnt, self.attenuate * autocvar_g_balance_tuba_attenuation);
 }
 
 void Ent_TubaNote_UpdateSound()
 {
        self.enemy.cnt = bound(0, VOL_BASE * autocvar_g_balance_tuba_volume, 1);
        self.enemy.count = self.enemy.cnt;
-       sound(self.enemy, CHAN_PROJECTILE, TUBA_STARTNOTE(self.cnt), self.enemy.cnt, self.enemy.attenuate * autocvar_g_balance_tuba_attenuation);
+       sound(self.enemy, CH_SHOTS_SINGLE, TUBA_STARTNOTE(self.cnt), self.enemy.cnt, self.enemy.attenuate * autocvar_g_balance_tuba_attenuation);
 }
 
 void Ent_TubaNote_StopSound()
diff --git a/qcsrc/client/vehicles/racer.qc b/qcsrc/client/vehicles/racer.qc
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/qcsrc/client/vehicles/raptor.qc b/qcsrc/client/vehicles/raptor.qc
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/qcsrc/client/vehicles/spiderbot.qc b/qcsrc/client/vehicles/spiderbot.qc
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/qcsrc/client/vehicles/vehicles.qc b/qcsrc/client/vehicles/vehicles.qc
new file mode 100644 (file)
index 0000000..8041bcb
--- /dev/null
@@ -0,0 +1,710 @@
+#define hud_bg "gfx/vehicles/frame.tga"
+#define hud_sh "gfx/vehicles/vh-shield.tga"
+
+#define hud_hp_bar "gfx/vehicles/bar_up_left.tga"
+#define hud_hp_ico "gfx/vehicles/health.tga"
+#define hud_sh_bar "gfx/vehicles/bar_dwn_left.tga"
+#define hud_sh_ico "gfx/vehicles/shield.tga"
+
+#define hud_ammo1_bar "gfx/vehicles/bar_up_right.tga"
+#define hud_ammo1_ico "gfx/vehicles/bullets.tga"
+#define hud_ammo2_bar "gfx/vehicles/bar_dwn_right.tga"
+#define hud_ammo2_ico "gfx/vehicles/rocket.tga"
+
+entity dropmark;
+float autocvar_cl_vehicles_hudscale;
+float autocvar_cl_vehicles_hudalpha;
+
+
+void CSQC_WAKIZASHI_HUD();
+void CSQC_SPIDER_HUD();
+void CSQC_RAPTOR_HUD();
+void CSQC_BUMBLE_HUD();
+
+#define MAX_AXH 4
+entity AuxiliaryXhair[MAX_AXH];
+const var void Draw_Not();
+
+.string axh_image;
+.float  axh_fadetime;
+.float  axh_drawflag;
+.float  axh_scale;
+
+void AuxiliaryXhair_Draw2D()
+{
+    vector loc, psize;
+
+    psize = self.axh_scale * drawgetimagesize(self.axh_image);
+    loc = project_3d_to_2d(self.origin) - 0.5 * psize;
+    if not (loc_z < 0 || loc_x < 0 || loc_y < 0 || loc_x > vid_conwidth || loc_y > vid_conheight)
+    {
+        loc_z = 0;
+        psize_z = 0;
+        drawpic(loc, self.axh_image, psize, self.colormod, self.alpha, self.axh_drawflag);
+    }
+
+    if(time - self.cnt > self.axh_fadetime)
+        self.draw2d = Draw_Not;
+}
+
+void Net_AuXair2(float bIsNew)
+{
+    float axh_id;
+    entity axh;
+
+    axh_id = bound(0, ReadByte(), MAX_AXH);
+    axh = AuxiliaryXhair[axh_id];
+
+    if(axh == world || wasfreed(axh))  // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?)
+    {
+        axh               = spawn();
+               axh.draw2d        = Draw_Not;
+               axh.drawmask      = MASK_NORMAL;
+               axh.axh_drawflag  = DRAWFLAG_ADDITIVE;
+               axh.axh_fadetime  = 0.1;
+               axh.axh_image     = "gfx/vehicles/axh-ring.tga";
+               axh.axh_scale     = 1;
+        axh.alpha         = 1;
+               AuxiliaryXhair[axh_id] = axh;
+    }
+
+    axh.draw2d   = AuxiliaryXhair_Draw2D;
+
+       axh.origin_x = ReadCoord();
+       axh.origin_y = ReadCoord();
+       axh.origin_z = ReadCoord();
+
+       axh.colormod_x = ReadByte() / 255;
+       axh.colormod_y = ReadByte() / 255;
+       axh.colormod_z = ReadByte() / 255;
+    axh.cnt = time;
+}
+
+void Net_VehicleSetup()
+{
+
+    float hud_id, i;
+    hud_id = bound(HUD_SPIDERBOT, ReadByte(), HUD_RAPTOR);
+
+    // Init auxiliary crosshairs
+    entity axh;
+    for(i = 0; i < MAX_AXH; ++i)
+    {
+        axh = AuxiliaryXhair[i];
+        if(axh != world && !wasfreed(axh))  // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?)
+            remove(axh);
+
+        axh               = spawn();
+               axh.draw2d        = Draw_Not;
+               axh.drawmask      = MASK_NORMAL;
+               axh.axh_drawflag  = DRAWFLAG_NORMAL;
+               axh.axh_fadetime  = 0.1;
+               axh.axh_image     = "gfx/vehicles/axh-ring.tga";
+               axh.axh_scale     = 1;
+        axh.alpha         = 1;
+               AuxiliaryXhair[i] = axh;
+    }
+
+    switch(hud_id)
+    {
+        case HUD_SPIDERBOT:
+            // Minigun1
+            AuxiliaryXhair[0].axh_image   = "gfx/vehicles/axh-ring.tga";
+            AuxiliaryXhair[0].axh_scale   = 0.25;
+            // Minigun2
+            AuxiliaryXhair[1].axh_image   = "gfx/vehicles/axh-ring.tga";
+            AuxiliaryXhair[1].axh_scale   = 0.25;
+            // Rocket
+            AuxiliaryXhair[2].axh_image   = "gfx/vehicles/axh-special1.tga";
+            AuxiliaryXhair[2].axh_scale   = 0.5;
+            break;
+
+        case HUD_WAKIZASHI:
+            AuxiliaryXhair[0].axh_image   = "gfx/vehicles/axh-bracket.tga";
+            AuxiliaryXhair[0].axh_scale   = 0.25;
+            break;
+
+        case HUD_RAPTOR:
+            AuxiliaryXhair[0].axh_image   = "gfx/vehicles/axh-special2.tga";
+            AuxiliaryXhair[0].axh_scale   = 0.5;
+            //AuxiliaryXhair[0].alpha       = 0.5;
+
+            AuxiliaryXhair[1].axh_image   = "gfx/vehicles/axh-bracket.tga";
+            AuxiliaryXhair[1].axh_scale   = 0.25;
+            //AuxiliaryXhair[1].alpha       = 0.75;
+            //AuxiliaryXhair[1].axh_drawflag  = DRAWFLAG_NORMAL;
+            break;
+
+        case HUD_BUMBLEBEE:
+            // Plasma cannons
+            AuxiliaryXhair[0].axh_image   = "gfx/vehicles/axh-ring.tga";
+            AuxiliaryXhair[0].axh_scale   = 0.25;
+            // Raygun
+            AuxiliaryXhair[1].axh_image   = "gfx/vehicles/axh-special1.tga";
+            AuxiliaryXhair[1].axh_scale   = 0.25;
+            break;
+    }
+}
+#define HUD_GETSTATS \
+    float vh_health    = getstati(STAT_VEHICLESTAT_HEALTH);  \
+       float shield    = getstati(STAT_VEHICLESTAT_SHIELD);  \
+       float energy    = getstati(STAT_VEHICLESTAT_ENERGY);  \
+       float ammo1     = getstati(STAT_VEHICLESTAT_AMMO1);   \
+       float reload1   = getstati(STAT_VEHICLESTAT_RELOAD1); \
+       float ammo2     = getstati(STAT_VEHICLESTAT_AMMO2);   \
+       float reload2   = getstati(STAT_VEHICLESTAT_RELOAD2);
+
+void CSQC_BUMBLE_HUD()
+{
+}
+
+
+#define spider_ico  "gfx/vehicles/sbot.tga"
+#define spider_rkt  "gfx/vehicles/sbot_rpods.tga"
+#define spider_mgun "gfx/vehicles/sbot_mguns.tga"
+#define spider_xhair "gfx/vehicles/axh-special1.tga"
+float alarm1time;
+float alarm2time;
+
+void CSQC_SPIDER_HUD()
+{
+       if(autocvar_r_letterbox)
+        return;
+
+    vector picsize, hudloc, pic2size, picloc;
+    float i;
+
+    // Fetch health & ammo stats
+       HUD_GETSTATS
+
+    picsize = drawgetimagesize(hud_bg) * autocvar_cl_vehicles_hudscale;
+    hudloc_y = vid_conheight - picsize_y;
+    hudloc_x = vid_conwidth * 0.5 - picsize_x * 0.5;
+
+    drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL);
+
+    //drawstring(hudloc + '145 19  0', strcat(ftos(vh_health), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL);
+    //drawstring(hudloc + '175 34  0', strcat(ftos(shield), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL);
+    //drawstring(hudloc + '136 102  0', strcat(ftos(ammo1), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
+    //drawstring(hudloc + '179 69  0', strcat(ftos(9 - ammo2), " / 8"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
+
+    ammo1   *= 0.01;
+    shield  *= 0.01;
+    vh_health  *= 0.01;
+    reload2 *= 0.01;
+
+    pic2size = drawgetimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8);
+    picloc = picsize * 0.5 - pic2size * 0.5;
+    if(vh_health < 0.25)
+        drawpic(hudloc + picloc, spider_ico, pic2size,  '1 0 0' + '0 1 1' * sin(time * 8),  1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, spider_ico, pic2size,  '1 1 1' * vh_health  + '1 0 0' * (1 - vh_health),  1, DRAWFLAG_NORMAL);    
+    drawpic(hudloc + picloc, spider_rkt, pic2size,  '1 1 1' * reload2 + '1 0 0' * (1 - reload2), 1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, spider_mgun, pic2size, '1 1 1' * ammo1   + '1 0 0' * (1 - ammo1),   1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, hud_sh, pic2size,  '1 1 1', shield, DRAWFLAG_NORMAL);
+
+// Health bar
+    picsize = drawgetimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '69 69 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - vh_health)), 0, vid_conwidth, vid_conheight);
+    drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picsize = drawgetimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '37 65 0' * autocvar_cl_vehicles_hudscale;
+    if(vh_health < 0.25)
+    {
+        if(alarm1time < time)
+        {
+            alarm1time = time + 2;
+            sound(world, CH_PAIN, "vehicles/alarm.wav", VOL_BASEVOICE, ATTN_NONE);
+        }        
+        drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    }        
+    else
+    {
+        drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+        if(alarm1time)
+        {
+            sound(world, CH_PAIN, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+            alarm1time = 0;
+        }        
+    }
+// Shield bar
+    picsize = drawgetimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '69 140 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - shield)), 0, vid_conwidth, vid_conheight);
+    drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picloc = '40 136 0' * autocvar_cl_vehicles_hudscale;
+    picsize = drawgetimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale;
+    if(shield < 0.25)
+    {
+        if(alarm2time < time)
+        {
+            alarm2time = time + 1;
+            sound(world, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTN_NONE);
+        }
+        drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    }
+    else
+    {
+        drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+        if(alarm2time)
+        {            
+            sound(world, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+            alarm2time = 0;
+        }
+    }
+    
+
+// Minigun bar
+    picsize = drawgetimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '450 69 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x, picloc_y, picsize_x * ammo1, vid_conheight);
+    drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picsize = drawgetimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '664 60 0' * autocvar_cl_vehicles_hudscale;
+    if(ammo1 < 0.2)
+        drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+// Rocket ammo bar
+    picsize = drawgetimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale;
+    ammo1 = picsize_x / 8;
+    picloc = '450 140 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x, hudloc_y + picloc_y, picsize_x * reload2, vid_conheight);
+    drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+
+// ..  and icons
+    pic2size = 0.35 * drawgetimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
+    picloc_x -= pic2size_x;
+    picloc_y += pic2size_y * 2.25;
+    if(ammo2 == 9)
+    {
+        for(i = 1; i < 9; ++i)
+        {
+            picloc_x += ammo1;
+            drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, ((8 * reload2 <= i) ? '0 0 0' : '1 1 1'), 0.75, DRAWFLAG_NORMAL);
+        }
+    }
+    else
+    {
+        for(i = 1; i < 9; ++i)
+        {
+            picloc_x += ammo1;
+            drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, ((i >= ammo2) ? '1 1 1' : '0 0 0'), 0.75, DRAWFLAG_NORMAL);
+        }
+    }
+    pic2size = drawgetimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '664 130 0' * autocvar_cl_vehicles_hudscale;
+    if(ammo2 == 9)
+        drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+       if (scoreboard_showscores)
+               HUD_DrawScoreboard();
+    else
+    {
+        picsize = drawgetimagesize(spider_xhair);
+        picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
+        picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
+
+        drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), spider_xhair, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_ADDITIVE);
+    }
+}
+
+#define raptor_ico  "gfx/vehicles/raptor.tga"
+#define raptor_gun  "gfx/vehicles/raptor_guns.tga"
+#define raptor_bomb "gfx/vehicles/raptor_bombs.tga"
+#define raptor_drop "gfx/vehicles/axh-dropcross.tga"
+#define raptor_xhair "gfx/vehicles/axh-ring.tga"
+void CSQC_RAPTOR_HUD()
+{
+       if(autocvar_r_letterbox)
+        return;
+
+    vector picsize, hudloc, pic2size, picloc;
+
+    // Fetch health & ammo stats
+       HUD_GETSTATS
+
+    picsize = drawgetimagesize(hud_bg) * autocvar_cl_vehicles_hudscale;
+    hudloc_y = vid_conheight - picsize_y;
+    hudloc_x = vid_conwidth * 0.5 - picsize_x * 0.5;
+
+    drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL);
+
+    ammo1   *= 0.01;
+    ammo2   *= 0.01;
+    shield  *= 0.01;
+    vh_health  *= 0.01;
+    energy  *= 0.01;
+    reload1 = reload2 * 0.01;
+    //reload2 *= 0.01;
+
+    pic2size = drawgetimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8);
+    picloc = picsize * 0.5 - pic2size * 0.5;
+    if(vh_health < 0.25)
+        drawpic(hudloc + picloc, raptor_ico, pic2size,  '1 0 0' + '0 1 1' * sin(time * 8),  1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, raptor_ico, pic2size,  '1 1 1' * vh_health  + '1 0 0' * (1 - vh_health),  1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, raptor_bomb, pic2size,  '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, raptor_gun, pic2size, '1 1 1' * energy   + '1 0 0' * (1 - energy),   1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, hud_sh, pic2size,  '1 1 1', shield, DRAWFLAG_NORMAL);
+
+// Health bar
+    picsize = drawgetimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '69 69 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - vh_health)), 0, vid_conwidth, vid_conheight);
+    drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picsize = drawgetimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '37 65 0' * autocvar_cl_vehicles_hudscale;
+    if(vh_health < 0.25)
+    {
+        if(alarm1time < time)
+        {
+            alarm1time = time + 2;
+            sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTN_NONE);
+        }
+        
+        drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    }        
+    else
+    {
+        drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+        if(alarm1time)
+        {
+            sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+            alarm1time = 0;
+        }
+    }
+
+// Shield bar
+    picsize = drawgetimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '69 140 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - shield)), 0, vid_conwidth, vid_conheight);
+    drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picloc = '40 136 0' * autocvar_cl_vehicles_hudscale;
+    picsize = drawgetimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale;
+    if(shield < 0.25)
+    {
+        if(alarm2time < time)
+        {
+            alarm2time = time + 1;
+            sound(world, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTN_NONE);
+        }
+        drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    }
+    else
+    {
+        drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+        if(alarm2time)
+        {            
+            sound(world, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+            alarm2time = 0;
+        }
+    }
+    
+// Gun bar
+    picsize = drawgetimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '450 69 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x, picloc_y, picsize_x * energy, vid_conheight);
+    drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picsize = drawgetimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '664 60 0' * autocvar_cl_vehicles_hudscale;
+    if(energy < 0.2)
+        drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+// Bomb bar
+    picsize = drawgetimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '450 140 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x, hudloc_y + picloc_y, picsize_x * reload1, vid_conheight);
+    drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    pic2size = drawgetimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '664 130 0' * autocvar_cl_vehicles_hudscale;
+    if(reload1 != 1)
+        drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+// Bombing crosshair
+    if(!dropmark)
+    {
+        dropmark = spawn();
+        dropmark.owner = self;
+        dropmark.gravity = 1;
+    }
+
+    if(reload2 == 100)
+    {
+        vector where;
+
+        setorigin(dropmark, pmove_org);
+        dropmark.velocity = pmove_vel;
+        tracetoss(dropmark, self);
+
+        where = project_3d_to_2d(trace_endpos);
+
+        setorigin(dropmark, trace_endpos);
+        picsize = drawgetimagesize(raptor_drop) * 0.2;
+
+        if not (where_z < 0 || where_x < 0 || where_y < 0 || where_x > vid_conwidth || where_y > vid_conheight)
+        {
+            where_x -= picsize_x * 0.5;
+            where_y -= picsize_y * 0.5;
+            where_z = 0;
+            drawpic(where, raptor_drop, picsize, '0 2 0', 1, DRAWFLAG_ADDITIVE);
+        }
+        dropmark.cnt = time + 5;
+    }
+    else
+    {
+        vector where;
+        if(dropmark.cnt > time)
+        {
+            where = project_3d_to_2d(dropmark.origin);
+            picsize = drawgetimagesize(raptor_drop) * 0.25;
+
+            if not (where_z < 0 || where_x < 0 || where_y < 0 || where_x > vid_conwidth || where_y > vid_conheight)
+            {
+                where_x -= picsize_x * 0.5;
+                where_y -= picsize_y * 0.5;
+                where_z = 0;
+                drawpic(where, raptor_drop, picsize, '2 0 0', 1, DRAWFLAG_ADDITIVE);
+            }
+        }
+    }
+
+       if (scoreboard_showscores)
+               HUD_DrawScoreboard();
+    else
+    {
+        picsize = drawgetimagesize(raptor_xhair);
+        picsize_x *= 0.5;
+        picsize_y *= 0.5;
+
+        drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), raptor_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    }
+}
+
+#define waki_ico "gfx/vehicles/waki.tga"
+#define waki_eng "gfx/vehicles/waki_e.tga"
+#define waki_gun "gfx/vehicles/waki_guns.tga"
+#define waki_rkt "gfx/vehicles/waki_rockets.tga"
+#define waki_xhair "gfx/vehicles/axh-special1.tga"
+void CSQC_WAKIZASHI_HUD()
+{
+/*
+    drawpic(hudloc, waki_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
+    drawpic(hudloc, waki_b, picsize, '0 1 0' * health + '1 0 0'  * (1 - health), 1, DRAWFLAG_NORMAL);
+    drawpic(hudloc, waki_r, picsize, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL);
+    drawpic(hudloc, waki_e, picsize, '1 1 1' * energy + '1 0 0'  * (1 - energy), 1, DRAWFLAG_NORMAL);
+*/
+       if(autocvar_r_letterbox)
+        return;
+
+    vector picsize, hudloc, pic2size, picloc;
+
+    // Fetch health & ammo stats
+       HUD_GETSTATS
+
+    picsize = drawgetimagesize(hud_bg) * autocvar_cl_vehicles_hudscale;
+    hudloc_y = vid_conheight - picsize_y;
+    hudloc_x = vid_conwidth * 0.5 - picsize_x * 0.5;
+
+    drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL);
+
+    shield  *= 0.01;
+    vh_health  *= 0.01;
+    energy  *= 0.01;
+    reload1 *= 0.01;
+
+    pic2size = drawgetimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8);
+    picloc = picsize * 0.5 - pic2size * 0.5;
+    if(vh_health < 0.25)
+        drawpic(hudloc + picloc, waki_ico, pic2size,  '1 0 0' + '0 1 1' * sin(time * 8),  1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, waki_ico, pic2size,  '1 1 1' * vh_health  + '1 0 0' * (1 - vh_health),  1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, waki_eng, pic2size, '1 1 1' * energy   + '1 0 0' * (1 - energy),   1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, waki_gun, pic2size, '1 1 1' * energy   + '1 0 0' * (1 - energy),   1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, waki_rkt, pic2size,  '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, hud_sh, pic2size,  '1 1 1', shield, DRAWFLAG_NORMAL);
+
+// Health bar
+    picsize = drawgetimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '69 69 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - vh_health)), 0, vid_conwidth, vid_conheight);
+    drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picsize = drawgetimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '37 65 0' * autocvar_cl_vehicles_hudscale;
+    if(vh_health < 0.25)
+    {
+        if(alarm1time < time)
+        {
+            alarm1time = time + 2;
+            sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTN_NONE);
+        }
+        
+        drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    }        
+    else
+    {
+        drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+        if(alarm1time)
+        {
+            sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+            alarm1time = 0;
+        }        
+    }
+        
+
+// Shield bar
+    picsize = drawgetimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '69 140 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - shield)), 0, vid_conwidth, vid_conheight);
+    drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picloc = '40 136 0' * autocvar_cl_vehicles_hudscale;
+    picsize = drawgetimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale;
+    if(shield < 0.25)
+    {
+        if(alarm2time < time)
+        {
+            alarm2time = time + 1;
+            sound(world, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTN_NONE);
+        }
+        drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    }
+    else
+    {
+        drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+        if(alarm2time)
+        {            
+            sound(world, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+            alarm2time = 0;
+        }
+    }
+    
+// Gun bar
+    picsize = drawgetimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '450 69 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x, picloc_y, picsize_x * energy, vid_conheight);
+    drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picsize = drawgetimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '664 60 0' * autocvar_cl_vehicles_hudscale;
+    if(energy < 0.2)
+        drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+// Bomb bar
+    picsize = drawgetimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '450 140 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x, hudloc_y + picloc_y, picsize_x * reload1, vid_conheight);
+    drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    pic2size = drawgetimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '664 130 0' * autocvar_cl_vehicles_hudscale;
+    if(reload1 != 1)
+        drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+       if (scoreboard_showscores)
+               HUD_DrawScoreboard();
+    else
+    {
+        picsize = drawgetimagesize(waki_xhair);
+        picsize_x *= 0.5;
+        picsize_y *= 0.5;
+
+
+        drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), waki_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    }
+}
+
+void Vehicles_Precache()
+{
+// fixme: HAAAAKKKZZZ!!!!!!!!!!!! (this belongs as a setting in default.cfg)
+    autocvar_cl_vehicles_hudscale = 0.5;
+    autocvar_cl_vehicles_hudalpha = 0.75;
+
+
+       precache_model("models/vehicles/wakizashi.dpm");
+
+       precache_model("models/vehicles/bomblet.md3");
+       precache_model("models/vehicles/clusterbomb.md3");
+       precache_model("models/vehicles/clusterbomb_fragment.md3");
+       precache_model("models/vehicles/rocket01.md3");
+       precache_model("models/vehicles/rocket02.md3");
+       
+       precache_sound ("vehicles/alarm.wav");
+       precache_sound ("vehicles/alarm_shield.wav");
+}
+
+void RaptorCBShellfragDraw()
+{
+       
+       Movetype_Physics_MatchTicrate(autocvar_cl_gibs_ticrate, autocvar_cl_gibs_sloppy);
+       if(wasfreed(self))
+               return;     
+
+       self.move_avelocity += randomvec() * 15;
+       self.renderflags = 0;
+       if(self.cnt < time)
+       self.alpha = bound(0, self.nextthink - time, 1);
+
+       if(self.alpha < ALPHA_MIN_VISIBLE)
+        remove(self);
+}
+
+void RaptorCBShellfragToss(vector _org, vector _vel, vector _ang)
+{
+    entity sfrag;
+    
+    sfrag = spawn();
+    setmodel(sfrag, "models/vehicles/clusterbomb_fragment.md3");
+    setorigin(sfrag, _org);
+
+       sfrag.move_movetype = MOVETYPE_BOUNCE;
+       sfrag.gravity = 0.15;
+       sfrag.solid = SOLID_CORPSE;
+
+       sfrag.draw = RaptorCBShellfragDraw;
+
+       sfrag.move_origin = sfrag.origin = _org;
+       sfrag.move_velocity = _vel;
+       sfrag.move_avelocity = prandomvec() * vlen(sfrag.move_velocity);
+       sfrag.angles = self.move_angles = _ang;
+
+       sfrag.move_time = time;
+       sfrag.damageforcescale = 4;
+
+       sfrag.nextthink = time + 3;
+       sfrag.cnt = time + 2;
+       sfrag.alpha = 1;
+    sfrag.drawmask = MASK_NORMAL;
+}
diff --git a/qcsrc/client/vehicles/vehicles.qh b/qcsrc/client/vehicles/vehicles.qh
new file mode 100644 (file)
index 0000000..66b2af1
--- /dev/null
@@ -0,0 +1,4 @@
+void RaptorCBShellfragDraw();
+void RaptorCBShellfragToss(vector _org, vector _vel, vector _ang);
+void Vehicles_Precache();
+
index bcd8c433e07b185d3eb997f60d976daee526b2d2..77eceab5edcd0c9b6d0f56030c4fde808b8e665f 100644 (file)
@@ -6,9 +6,14 @@ float waypointsprite_minalpha;
 float waypointsprite_distancealphaexponent;
 float waypointsprite_timealphaexponent;
 float waypointsprite_scale;
+float waypointsprite_fontsize;
 float waypointsprite_edgefadealpha;
 float waypointsprite_edgefadescale;
 float waypointsprite_edgefadedistance;
+float waypointsprite_edgeoffset_bottom;
+float waypointsprite_edgeoffset_left;
+float waypointsprite_edgeoffset_right;
+float waypointsprite_edgeoffset_top;
 float waypointsprite_crosshairfadealpha;
 float waypointsprite_crosshairfadescale;
 float waypointsprite_crosshairfadedistance;
@@ -17,6 +22,7 @@ float waypointsprite_distancefadescale;
 float waypointsprite_distancefadedistance;
 float waypointsprite_alpha;
 
+.float helpme;
 .float rule;
 .string netname; // primary picture
 .string netname2; // secondary picture
@@ -32,14 +38,14 @@ float waypointsprite_alpha;
 .float build_starthealth;
 .float build_finished;
 
-vector SPRITE_SIZE = '288 36 0';
-vector SPRITE_HOTSPOT = '144 36 0';
 float SPRITE_HEALTHBAR_WIDTH = 144;
 float SPRITE_HEALTHBAR_HEIGHT = 9;
 float SPRITE_HEALTHBAR_MARGIN = 6;
 float SPRITE_HEALTHBAR_BORDER = 2;
 float SPRITE_HEALTHBAR_BORDERALPHA = 1;
 float SPRITE_HEALTHBAR_HEALTHALPHA = 0.5;
+float SPRITE_ARROW_SCALE = 1.0;
+float SPRITE_HELPME_BLINK = 2;
 
 void drawrotpic(vector org, float rot, string pic, vector sz, vector hotspot, vector rgb, float a, float f)
 {
@@ -106,6 +112,275 @@ void drawhealthbar(vector org, float rot, float h, vector sz, vector hotspot, fl
        drawquad(o + ri * (border + align * ((1 - h) * width)), ri * width * h, up * height, "", hrgb, ha, f);
 }
 
+// returns location of sprite text
+vector drawspritearrow(vector o, float ang, vector rgb, float a, float t)
+{
+       float SQRT2 = 1.414;
+       float BORDER; BORDER = 1.5 * t;
+       float TSIZE; TSIZE = 8 * t;
+       float RLENGTH; RLENGTH = 8 * t;
+       float RWIDTH; RWIDTH = 4 * t;
+       float MLENGTH; MLENGTH = 4 * t;
+
+       R_BeginPolygon("", DRAWFLAG_NORMAL);
+       R_PolygonVertex(o + rotate(eX * -(TSIZE + BORDER * (1 + SQRT2)) + eY * (TSIZE + BORDER), ang), '0 0 0', '0 0 0', a);
+       R_PolygonVertex(o + rotate(eX *  (TSIZE + BORDER * (1 + SQRT2)) + eY * (TSIZE + BORDER), ang), '0 0 0', '0 0 0', a);
+       R_PolygonVertex(o + rotate(eY * -(        BORDER *      SQRT2),                          ang), '0 0 0', '0 0 0', a);
+       R_EndPolygon();
+       R_BeginPolygon("", DRAWFLAG_NORMAL);
+       R_PolygonVertex(o + rotate(eX * -(RWIDTH + BORDER) + eY * (TSIZE           + BORDER), ang), '0 0 0', '0 0 0', a);
+       R_PolygonVertex(o + rotate(eX * -(RWIDTH + BORDER) + eY * (TSIZE + RLENGTH + BORDER), ang), '0 0 0', '0 0 0', a);
+       R_PolygonVertex(o + rotate(eX *  (RWIDTH + BORDER) + eY * (TSIZE + RLENGTH + BORDER), ang), '0 0 0', '0 0 0', a);
+       R_PolygonVertex(o + rotate(eX *  (RWIDTH + BORDER) + eY * (TSIZE           + BORDER), ang), '0 0 0', '0 0 0', a);
+       R_EndPolygon();
+
+       R_BeginPolygon("", DRAWFLAG_ADDITIVE);
+       R_PolygonVertex(o + rotate(eX * -TSIZE + eY * TSIZE, ang), '0 0 0', rgb, a);
+       R_PolygonVertex(o + rotate(eX *  TSIZE + eY * TSIZE, ang), '0 0 0', rgb, a);
+       R_PolygonVertex(o + rotate('0 0 0',                  ang), '0 0 0', rgb, a);
+       R_EndPolygon();
+       R_BeginPolygon("", DRAWFLAG_ADDITIVE);
+       R_PolygonVertex(o + rotate(eX * -RWIDTH + eY *  TSIZE,            ang), '0 0 0', rgb, a);
+       R_PolygonVertex(o + rotate(eX * -RWIDTH + eY * (TSIZE + RLENGTH), ang), '0 0 0', rgb, a);
+       R_PolygonVertex(o + rotate(eX *  RWIDTH + eY * (TSIZE + RLENGTH), ang), '0 0 0', rgb, a);
+       R_PolygonVertex(o + rotate(eX *  RWIDTH + eY *  TSIZE,            ang), '0 0 0', rgb, a);
+       R_EndPolygon();
+
+       return
+               o + rotate(eY * (TSIZE + RLENGTH + MLENGTH), ang);
+}
+
+// returns location of sprite healthbar
+vector drawspritetext(vector o, float ang, float minwidth, vector rgb, float a, vector fontsize, string s)
+{
+       float algnx, algny;
+       float sw, w, h;
+       float aspect, sa, ca;
+
+       sw = stringwidth(s, FALSE, fontsize);
+       if(sw > minwidth)
+               w = sw;
+       else
+               w = minwidth;
+       h = fontsize_y;
+
+       // how do corners work?
+       aspect = vid_conwidth / vid_conheight;
+       sa = sin(ang);
+       ca = cos(ang) * aspect;
+       if(fabs(sa) > fabs(ca))
+       {
+               algnx = (sa < 0);
+               algny = 0.5 - 0.5 * ca / fabs(sa);
+       }
+       else
+       {
+               algnx = 0.5 - 0.5 * sa / fabs(ca);
+               algny = (ca < 0);
+       }
+
+       // align
+       o_x -= w * algnx;
+       o_y -= h * algny;
+
+       // we want to be onscreen
+       if(o_x < 0)
+               o_x = 0;
+       if(o_y < 0)
+               o_y = 0;
+       if(o_x > vid_conwidth - w)
+               o_x = vid_conwidth - w;
+       if(o_y > vid_conheight - h)
+               o_x = vid_conheight - h;
+
+       o_x += 0.5 * (w - sw);
+
+       drawstring(o, s, fontsize, rgb, a, DRAWFLAG_NORMAL);
+
+       o_x += 0.5 * sw;
+       o_y += 0.5 * h;
+
+       return o;
+}
+
+float spritelookupblinkvalue(string s)
+{
+       switch(s)
+       {
+               case "ons-cp-atck-neut": return 2;
+               case "ons-cp-atck-red":  return 2;
+               case "ons-cp-atck-blue": return 2;
+               case "ons-cp-dfnd-red":  return 0.5;
+               case "ons-cp-dfnd-blue": return 0.5;
+               case "item-invis":       return 2;
+               case "item-extralife":   return 2;
+               case "item-speed":       return 2;
+               case "item-strength":    return 2;
+               case "item-shueld":      return 2;
+               case "item-fuelregen":   return 2;
+               case "item-jetpack":     return 2;
+               case "tagged-target":    return 2;
+               default:                 return 1;
+       }
+}
+vector spritelookupcolor(string s, vector def)
+{
+       switch(s)
+       {
+               case "keycarrier-friend": return '0 1 0';
+               case "wpn-laser":         return '1 0.5 0.5';
+               case "wpn-shotgun":       return '0.5 0.25 0';
+               case "wpn-uzi":           return '1 1 0';
+               case "wpn-gl":            return '1 0 0';
+               case "wpn-electro":       return '0 0.5 1';
+               case "wpn-crylink":       return '1 0.5 1';
+               case "wpn-nex":           return '0.5 1 1';
+               case "wpn-hagar":         return '1 1 0.5';
+               case "wpn-rl":            return '1 1 0';
+               case "wpn-porto":         return '0.5 0.5 0.5';
+               case "wpn-minstanex":     return '0.5 1 1';
+               case "wpn-hookgun":       return '0 0.5 0';
+               case "wpn-fireball":      return '1 0.5 0';
+               case "wpn-hlac":          return '0 1 0';
+               case "wpn-campingrifle":  return '0.5 1 0';
+               case "wpn-minelayer":     return '0.75 1 0';
+               default:                  return def;
+       }
+}
+string spritelookuptext(string s)
+{
+       switch(s)
+       {
+               case "as-push": return _("Push");
+               case "as-destroy": return _("Destroy");
+               case "as-defend": return _("Defend");
+               case "bluebase": return _("Blue base");
+               case "danger": return _("DANGER");
+               case "flagcarrier": return _("Flag carrier");
+               case "flagdropped": return _("Dropped flag");
+               case "helpme": return _("Help me!");
+               case "here": return _("Here");
+               case "key-dropped": return _("Dropped key");
+               case "keycarrier-blue": return _("Key carrier");
+               case "keycarrier-finish": return _("Run here");
+               case "keycarrier-friend": return _("Key carrier");
+               case "keycarrier-pink": return _("Key carrier");
+               case "keycarrier-red": return _("Key carrier");
+               case "keycarrier-yellow": return _("Key carrier");
+               case "redbase": return _("Red base");
+               case "waypoint": return _("Waypoint");
+               case "ons-gen-red": return _("Generator");
+               case "ons-gen-blue": return _("Generator");
+               case "ons-gen-shielded": return _("Generator");
+               case "ons-cp-neut": return _("Control point");
+               case "ons-cp-red": return _("Control point");
+               case "ons-cp-blue": return _("Control point");
+               case "ons-cp-atck-neut": return _("Control point");
+               case "ons-cp-atck-red": return _("Control point");
+               case "ons-cp-atck-blue": return _("Control point");
+               case "ons-cp-dfnd-red": return _("Control point");
+               case "ons-cp-dfnd-blue": return _("Control point");
+               case "race-checkpoint": return _("Checkpoint");
+               case "race-finish": return _("Finish");
+               case "race-start": return _("Start");
+               case "race-start-finish": return (race_checkpointtime || race_mycheckpointtime) ? _("Finish") : _("Start");
+               case "nb-ball": return _("Ball");
+               case "ka-ball": return _("Ball");
+               case "ka-ballcarrier": return _("Ball carrier");
+               case "wpn-laser": return _("Laser");
+               case "wpn-shotgun": return _("Shotgun");
+               case "wpn-uzi": return _("Machine Gun");
+               case "wpn-gl": return _("Mortar");
+               case "wpn-electro": return _("Electro");
+               case "wpn-crylink": return _("Crylink");
+               case "wpn-nex": return _("Nex");
+               case "wpn-hagar": return _("Hagar");
+               case "wpn-rl": return _("Rocket Launcher");
+               case "wpn-porto": return _("Port-O-Launch");
+               case "wpn-minstanex": return _("Minstanex");
+               case "wpn-hookgun": return _("Hook");
+               case "wpn-fireball": return _("Fireball");
+               case "wpn-hlac": return _("HLAC");
+               case "wpn-campingrifle": return _("Rifle");
+               case "wpn-minelayer": return _("Mine Layer");
+               case "dom-neut": return _("Control point");
+               case "dom-red": return _("Control point");
+               case "dom-blue": return _("Control point");
+               case "dom-yellow": return _("Control point");
+               case "dom-pink": return _("Control point");
+               case "item-invis": return _("Invisibility");
+               case "item-extralife": return _("Extra life");
+               case "item-speed": return _("Speed");
+               case "item-strength": return _("Strength");
+               case "item-shield": return _("Shield");
+               case "item-fuelregen": return _("Fuel regen");
+               case "item-jetpack": return _("Jet Pack");
+               case "freezetag_frozen": return _("Frozen!");
+               case "tagged-target": return _("Tagged");
+               case "vehicle": return _("Vehicle");
+               default: return s;
+       }
+}
+
+vector fixrgbexcess_move(vector rgb, vector src, vector dst)
+{
+       vector yvec = '0.299 0.587 0.114';
+       return rgb + dst * ((src * yvec) / (dst * yvec)) * ((rgb - '1 1 1') * src);
+}
+vector fixrgbexcess(vector rgb)
+{
+       if(rgb_x > 1)
+       {
+               rgb = fixrgbexcess_move(rgb, '1 0 0', '0 1 1');
+               if(rgb_y > 1)
+               {
+                       rgb = fixrgbexcess_move(rgb, '0 1 0', '0 0 1');
+                       if(rgb_z > 1)
+                               rgb_z = 1;
+               }
+               else if(rgb_z > 1)
+               {
+                       rgb = fixrgbexcess_move(rgb, '0 0 1', '0 1 0');
+                       if(rgb_y > 1)
+                               rgb_y = 1;
+               }
+       }
+       else if(rgb_y > 1)
+       {
+               rgb = fixrgbexcess_move(rgb, '0 1 0', '1 0 1');
+               if(rgb_x > 1)
+               {
+                       rgb = fixrgbexcess_move(rgb, '1 0 0', '0 0 1');
+                       if(rgb_z > 1)
+                               rgb_z = 1;
+               }
+               else if(rgb_z > 1)
+               {
+                       rgb = fixrgbexcess_move(rgb, '0 0 1', '1 0 0');
+                       if(rgb_x > 1)
+                               rgb_x = 1;
+               }
+       }
+       else if(rgb_z > 1)
+       {
+               rgb = fixrgbexcess_move(rgb, '0 0 1', '1 1 0');
+               if(rgb_x > 1)
+               {
+                       rgb = fixrgbexcess_move(rgb, '1 0 0', '0 1 0');
+                       if(rgb_y > 1)
+                               rgb_y = 1;
+               }
+               else if(rgb_y > 1)
+               {
+                       rgb = fixrgbexcess_move(rgb, '0 1 0', '1 0 0');
+                       if(rgb_x > 1)
+                               rgb_x = 1;
+               }
+       }
+       return rgb;
+}
+
+float waypointsprite_count, waypointsprite_newcount;
 void Draw_WaypointSprite()
 {
        string spriteimage;
@@ -161,6 +436,8 @@ void Draw_WaypointSprite()
 
        if(spriteimage == "")
                return;
+
+       ++waypointsprite_newcount;
        
        float dist;
        dist = vlen(self.origin - view_origin);
@@ -173,34 +450,52 @@ void Draw_WaypointSprite()
        else if(self.maxdistance > 0)
                a *= pow(bound(0, (waypointsprite_fadedistance - dist) / (waypointsprite_fadedistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent) * (1 - waypointsprite_minalpha) + waypointsprite_minalpha;
 
+       vector rgb;
+       rgb = self.teamradar_color;
+       rgb = spritelookupcolor(spriteimage, rgb);
+       if(rgb == '0 0 0')
+       {
+               self.teamradar_color = '1 0 1';
+               print(sprintf("WARNING: sprite of name %s has no color, using pink so you notice it\n", spriteimage)); 
+       }
+
+       if(time - floor(time) > 0.5)
+       {
+               if(self.helpme && time < self.helpme)
+                       a *= SPRITE_HELPME_BLINK;
+               else
+                       a *= spritelookupblinkvalue(spriteimage);
+       }
+
+       if(a > 1)
+       {
+               rgb *= a;
+               a = 1;
+       }
+
        if(a <= 0)
                return;
-       
-       // draw the sprite image
+
+       rgb = fixrgbexcess(rgb);
+
        vector o;
-       float rot;
-       o = project_3d_to_2d(self.origin);
-       rot = 0;
+       float ang;
 
-       if(o_z < 0 || o_x < 0 || o_y < 0 || o_x > vid_conwidth || o_y > vid_conheight)
+       o = project_3d_to_2d(self.origin);
+       if(o_z < 0 
+       || o_x < (vid_conwidth * waypointsprite_edgeoffset_left) 
+       || o_y < (vid_conheight * waypointsprite_edgeoffset_top) 
+       || o_x > (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right))  
+       || o_y > (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)))
        {
                // scale it to be just in view
                vector d;
                float f1, f2;
 
-               // get the waypoint angle vector
-               /*
-               d_x = view_right * (self.origin - view_origin) * vid_conwidth / vid_width;
-               d_y = -view_up * (self.origin - view_origin) * vid_conheight / (vid_height * vid_pixelheight);
-               d_z = 0;
-               */
-               
                d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
-
-               /*
-               if(autocvar_v_flipped)
-                       d_x = -d_x;
-               */
+               ang = atan2(-d_x, -d_y);
+               if(o_z < 0)
+                       ang += M_PI;
 
                f1 = d_x / vid_conwidth;
                f2 = d_y / vid_conheight;
@@ -210,14 +505,12 @@ void Draw_WaypointSprite()
                        if(d_z * f1 > 0)
                        {
                                // RIGHT edge
-                               d = d * (0.5 / f1);
-                               rot = 3;
+                               d = d * ((0.5 - waypointsprite_edgeoffset_right) / f1);
                        }
                        else
                        {
                                // LEFT edge
-                               d = d * (-0.5 / f1);
-                               rot = 1;
+                               d = d * (-(0.5 - waypointsprite_edgeoffset_left) / f1);
                        }
                }
                else
@@ -225,33 +518,38 @@ void Draw_WaypointSprite()
                        if(d_z * f2 > 0)
                        {
                                // BOTTOM edge
-                               d = d * (0.5 / f2);
-                               rot = 0;
+                               d = d * ((0.5 - waypointsprite_edgeoffset_bottom) / f2);
                        }
                        else
                        {
                                // TOP edge
-                               d = d * (-0.5 / f2);
-                               rot = 2;
+                               d = d * (-(0.5 - waypointsprite_edgeoffset_top) / f2);
                        }
                }
 
                o = d + '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight;
        }
+       else
+       {
+#if 1
+               ang = M_PI;
+#else
+               vector d;
+               d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
+               ang = atan2(-d_x, -d_y);
+#endif
+       }
        o_z = 0;
 
+       float edgedistance_min, crosshairdistance;
+               edgedistance_min = min4((o_y - (vid_conheight * waypointsprite_edgeoffset_top)), 
+       (o_x - (vid_conwidth * waypointsprite_edgeoffset_left)),
+       (vid_conwidth - (vid_conwidth * waypointsprite_edgeoffset_right)) - o_x, 
+       (vid_conheight - (vid_conheight * waypointsprite_edgeoffset_bottom)) - o_y);
+
        float vidscale;
        vidscale = max(vid_conwidth / vid_width, vid_conheight / vid_height);
 
-       t = stof(db_get(tempdb, strcat("/spriteframes/", spriteimage)));
-       if(t == 0)
-               spriteimage = strcat("models/sprites/", spriteimage);
-       else
-               spriteimage = strcat("models/sprites/", spriteimage, "_frame", ftos(mod(floor((max(0, time - self.spawntime)) * 2), t)));
-
-       float edgedistance_min, crosshairdistance;
-       edgedistance_min = min4(o_y, o_x,vid_conwidth - o_x, vid_conheight - o_y);
-
        crosshairdistance = sqrt( pow(o_x - vid_conwidth/2, 2) + pow(o_y - vid_conheight/2, 2) );
 
        t = waypointsprite_scale * vidscale;
@@ -269,7 +567,6 @@ void Draw_WaypointSprite()
                a = a * (1 - (1 - waypointsprite_crosshairfadealpha) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1)));
                t = t * (1 - (1 - waypointsprite_crosshairfadescale) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1)));
        }
-       drawrotpic(o, rot * 90 * DEG2RAD, spriteimage, SPRITE_SIZE * t, SPRITE_HOTSPOT * t, '1 1 1', a, DRAWFLAG_MIPMAP);
 
        if(self.build_finished)
        {
@@ -286,14 +583,52 @@ void Draw_WaypointSprite()
                        self.health = -1;
        }
 
+       o = drawspritearrow(o, ang, rgb, a, SPRITE_ARROW_SCALE * t);
+       
+       string txt;
+       if(autocvar_g_waypointsprite_spam && waypointsprite_count >= autocvar_g_waypointsprite_spam)
+               txt = _("Spam");
+       else
+               txt = spritelookuptext(spriteimage);
+       if(self.helpme && time < self.helpme)
+               txt = sprintf(_("%s needing help!"), txt);
+       if(autocvar_g_waypointsprite_uppercase)
+               txt = strtoupper(txt);
+
        if(self.health >= 0)
        {
-               float align;
+               o = drawspritetext(o, ang, (SPRITE_HEALTHBAR_WIDTH + 2 * SPRITE_HEALTHBAR_BORDER) * t, rgb, a, waypointsprite_fontsize * '1 1 0', txt);
+
+               float align, marg;
                if(self.build_finished)
                        align = 0.5;
                else
                        align = 0;
-               drawhealthbar(o, rot * 90 * DEG2RAD, self.health, SPRITE_SIZE * t, SPRITE_HOTSPOT * t, SPRITE_HEALTHBAR_WIDTH * t, SPRITE_HEALTHBAR_HEIGHT * t, SPRITE_HEALTHBAR_MARGIN * t, SPRITE_HEALTHBAR_BORDER * t, align, self.teamradar_color, a * SPRITE_HEALTHBAR_BORDERALPHA, self.teamradar_color, a * SPRITE_HEALTHBAR_HEALTHALPHA, DRAWFLAG_NORMAL);
+               if(cos(ang) > 0)
+                       marg = -(SPRITE_HEALTHBAR_MARGIN + SPRITE_HEALTHBAR_HEIGHT + 2 * SPRITE_HEALTHBAR_BORDER) * t - 0.5 * waypointsprite_fontsize;
+               else
+                       marg = SPRITE_HEALTHBAR_MARGIN * t + 0.5 * waypointsprite_fontsize;
+               drawhealthbar(
+                               o,
+                               0,
+                               self.health,
+                               '0 0 0',
+                               '0 0 0',
+                               SPRITE_HEALTHBAR_WIDTH * t,
+                               SPRITE_HEALTHBAR_HEIGHT * t,
+                               marg,
+                               SPRITE_HEALTHBAR_BORDER * t,
+                               align,
+                               rgb,
+                               a * SPRITE_HEALTHBAR_BORDERALPHA,
+                               rgb,
+                               a * SPRITE_HEALTHBAR_HEALTHALPHA,
+                               DRAWFLAG_NORMAL
+                            );
+       }
+       else
+       {
+               o = drawspritetext(o, ang, 0, rgb, a, waypointsprite_fontsize * '1 1 0', txt);
        }
 }
 
@@ -399,6 +734,9 @@ void Ent_WaypointSprite()
                self.teamradar_color_x = ReadByte() / 255.0;
                self.teamradar_color_y = ReadByte() / 255.0;
                self.teamradar_color_z = ReadByte() / 255.0;
+               self.helpme = ReadByte() * 0.1;
+               if(self.helpme > 0)
+                       self.helpme += servertime;
        }
 
        InterpolateOrigin_Note();
@@ -438,9 +776,14 @@ void WaypointSprite_Load()
        waypointsprite_distancealphaexponent = autocvar_g_waypointsprite_distancealphaexponent;
        waypointsprite_timealphaexponent = autocvar_g_waypointsprite_timealphaexponent;
        waypointsprite_scale = autocvar_g_waypointsprite_scale;
+       waypointsprite_fontsize = autocvar_g_waypointsprite_fontsize;
        waypointsprite_edgefadealpha = autocvar_g_waypointsprite_edgefadealpha;
        waypointsprite_edgefadescale = autocvar_g_waypointsprite_edgefadescale;
        waypointsprite_edgefadedistance = autocvar_g_waypointsprite_edgefadedistance;
+       waypointsprite_edgeoffset_bottom = autocvar_g_waypointsprite_edgeoffset_bottom;
+       waypointsprite_edgeoffset_left = autocvar_g_waypointsprite_edgeoffset_left;
+       waypointsprite_edgeoffset_right = autocvar_g_waypointsprite_edgeoffset_right;
+       waypointsprite_edgeoffset_top = autocvar_g_waypointsprite_edgeoffset_top;
        waypointsprite_crosshairfadealpha = autocvar_g_waypointsprite_crosshairfadealpha;
        waypointsprite_crosshairfadescale = autocvar_g_waypointsprite_crosshairfadescale;
        waypointsprite_crosshairfadedistance = autocvar_g_waypointsprite_crosshairfadedistance;
@@ -455,4 +798,7 @@ void WaypointSprite_Load()
                WaypointSprite_Load_Frames(".jpg");
                waypointsprite_initialized = true;
        }
+
+       waypointsprite_count = waypointsprite_newcount;
+       waypointsprite_newcount = 0;
 }
index 08cec8092813b76653c9d8d33af5d94be4a52361..067cd8054de6f311d562bf427190fd806ef1de79 100644 (file)
@@ -18,7 +18,7 @@ float CampaignFile_Load(float offset, float n)
        campaign_entries = 0;
        campaign_title = string_null;
 
-       fn = strcat("maps/campaign", campaign_name, ".txt");
+       fn = language_filename(strcat("maps/campaign", campaign_name, ".txt"));
        fh = fopen(fn, FILE_READ);
        if(fh >= 0)
        {
index 6d8591237993c863ad55f2bbf3153f1f5df5a3da..634ab397bdbbd2dc12c4d768832dd7367fa6be7b 100644 (file)
@@ -55,8 +55,6 @@ const float TE_CSQC_NEXGUNBEAMPARTICLE = 104;
 const float TE_CSQC_LIGHTNINGARC = 105;
 const float TE_CSQC_TEAMNAGGER = 106;
 const float TE_CSQC_PINGPLREPORT = 107;
-const float TE_CSQC_VOTE = 108;
-const float TE_CSQC_VOTERESET = 109;
 const float TE_CSQC_ANNOUNCE = 110;
 const float TE_CSQC_TARGET_MUSIC = 111;
 const float TE_CSQC_NOTIFY = 112;
@@ -64,6 +62,7 @@ const float TE_CSQC_WEAPONCOMPLAIN = 113;
 const float TE_CSQC_NEX_SCOPE = 116;
 const float TE_CSQC_MINELAYER_MAXMINES = 117;
 const float TE_CSQC_HAGAR_MAXROCKETS = 118;
+const float TE_CSQC_VEHICLESETUP = 119;
 
 const float RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder
 const float RACE_NET_CHECKPOINT_CLEAR = 1;
@@ -82,6 +81,7 @@ const float RANKINGS_CNT = 15;
 
 const float CSQC_KILLNOTIFY = 0;
 const float CSQC_CENTERPRINT = 1;
+const float CSQC_CENTERPRINT_GENERIC = 2;
 
 const float ENT_CLIENT = 0;
 const float ENT_CLIENT_DEAD = 1;
@@ -119,10 +119,13 @@ const float ENT_CLIENT_WARPZONE_TELEPORTED = 32;
 const float ENT_CLIENT_DAMAGEEFFECT = 33;
 
 const float ENT_CLIENT_TURRET = 40;
+const float ENT_CLIENT_AUXILIARYXHAIR = 50;
+const float ENT_CLIENT_VEHICLE = 60;
 
 const float SPRITERULE_DEFAULT = 0;
 const float SPRITERULE_TEAMPLAY = 1;
 
+const float RADARICON_NONE = 0;
 const float RADARICON_FLAG = 1;
 const float RADARICON_FLAGCARRIER = 1;
 const float RADARICON_HERE = 1; // TODO make these 3 and 4, and make images for them
@@ -134,6 +137,7 @@ const float RADARICON_GENERATOR = 1;
 const float RADARICON_OBJECTIVE = 1;
 const float RADARICON_DOMPOINT = 1;
 const float RADARICON_POWERUP = 1;
+const float RADARICON_TAGGED = 1;
 
 ///////////////////////////
 // key constants
@@ -334,9 +338,13 @@ const float CTF_STATE_DEFEND = 2;
 const float CTF_STATE_COMMANDER = 3;
 
 const float HUD_NORMAL = 0;
-const float HUD_SPIDERBOT = 10;
-const float HUD_WAKIZASHI = 11;
-const float HUD_RAPTOR    = 12;
+const float HUD_VEHICLE_FIRST   = 10;
+const float HUD_SPIDERBOT       = 10;
+const float HUD_WAKIZASHI       = 11;
+const float HUD_RAPTOR          = 12;
+const float HUD_BUMBLEBEE       = 13;
+const float HUD_VEHICLE_LAST    = 13;
+
 const vector eX = '1 0 0';
 const vector eY = '0 1 0';
 const vector eZ = '0 0 1';
@@ -359,6 +367,7 @@ const float STAT_PINKALIVE = 103;
 const float STAT_FROZEN = 104;
 const float STAT_REVIVE_PROGRESS = 105;
 
+
 const float STAT_DOM_TOTAL_PPS = 100;
 const float STAT_DOM_PPS_RED = 101;
 const float STAT_DOM_PPS_BLUE = 102;
@@ -368,9 +377,6 @@ const float STAT_DOM_PPS_YELLOW = 104;
 //const float STAT_SPIDERBOT_AIM     53 // compressShotOrigin
 //const float STAT_SPIDERBOT_TARGET  54 // compressShotOrigin
 
-
-
-
 // moved that here so the client knows the max.
 // # of maps, I'll use arrays for them :P
 #define MAPVOTE_COUNT 10
@@ -423,47 +429,37 @@ const float STAT_DOM_PPS_YELLOW = 104;
 #define SP_SCORE 3
 // game mode specific indices are not in common/, but in server/scores_rules.qc!
 
-// this assignment must match menu/xonotic/dialog_settings_misc.c!
-float  CHAN_AUTO                               = 0;
-       // on world: announcers, ...                     INFO
-       // on players: item pickup                       ITEMS
-       // on entities: UNUSED
-       // on csqc: announcers                           INFO
-float  CHAN_WEAPON                             = 1; // Weapon fire
-       // on world: UNUSED
-       // on players: weapon firing                     WEAPONS
-       // on entities: turret firing                    WEAPONS
-       // on csqc: UNUSED
-float  CHAN_VOICE                              = 2; // Voice/Radio
-       // on world: UNUSED
-       // on players: voice                             VOICE
-       // on entities: ambient                          AMBIENT
-       // on csqc: background music                     BGM
-float  CHAN_TRIGGER                    = 3; // Triggers/Items
-       // on world: UNUSED
-       // on players: item pickup                       ITEMS
-       // on entities: platforms moving etc.            ITEMS
-       // on csqc: platforms moving etc.                ITEMS
-float  CHAN_PROJECTILE                 = 4; // Projectiles
-       // on world: UNUSED
-       // on players: projectiles hitting player        SHOTS
-       // on entities: projectiles                      SHOTS
-       // on csqc: projectile sounds                    SHOTS
-float  CHAN_WEAPON2                    = 5; // Nex fire (separated as it is a very long sound)
-       // on world: UNUSED
-       // on players: weapon firing                     WEAPONS
-       // on entities: turret firing                    WEAPONS
-       // on csqc: UNUSED
-float  CHAN_PAIN                               = 6; // Pain
-       // on world: UNUSED
-       // on players: pain                              PAIN
-       // on entities: projectiles flying               SHOTS
-       // on csqc: player pain                          PAIN
-float  CHAN_PLAYER                             = 7; // Player body
-       // on world: UNUSED
-       // on players: player sounds                     PLAYER
-       // on entities: player sounds                    PLAYER
-       // on csqc: UNUSED
+#ifdef COMPAT_XON010_CHANNELS
+float CH_INFO = 0; // only on world and csqc
+float CH_TRIGGER = 0; // only on players; compat: FALSELY CONTROLLED BY "Info"
+float CH_WEAPON_A = 1; // only on players and entities
+float CH_WEAPON_SINGLE = 5; // only on players and entities
+float CH_VOICE = 2; // only on players
+float CH_BGM_SINGLE = 2; // only on csqc; compat: FALSELY CONTROLLED BY "Voice"
+float CH_AMBIENT = 2; // only on csqc; compat: FALSELY CONTROLLED BY "Voice"
+float CH_TRIGGER_SINGLE = 3; // only on players, entities, csqc
+float CH_SHOTS = 4; // only on players, entities, csqc
+float CH_SHOTS_SINGLE = 4; // only on players, entities, csqc
+float CH_WEAPON_B = 5; // only on players and entities
+float CH_PAIN = 6; // only on players and csqc
+float CH_PAIN_SINGLE = 6; // only on players and csqc
+float CH_PLAYER = 7; // only on players and entities
+#else
+float CH_INFO = 0;
+float CH_TRIGGER = -3;
+float CH_WEAPON_A = -1;
+float CH_WEAPON_SINGLE = 1;
+float CH_VOICE = -2;
+float CH_BGM_SINGLE = 8;
+float CH_AMBIENT = -9;
+float CH_TRIGGER_SINGLE = 3;
+float CH_SHOTS = -4;
+float CH_SHOTS_SINGLE = 4;
+float CH_WEAPON_B = -1;
+float CH_PAIN = -6;
+float CH_PAIN_SINGLE = 6;
+float CH_PLAYER = -7;
+#endif
 
 float  ATTN_NONE                               = 0;
 float  ATTN_MIN                                = 0.015625;
@@ -500,6 +496,13 @@ float PROJECTILE_FIREBALL = 21;
 float PROJECTILE_FIREMINE = 22;
 float PROJECTILE_BULLET_GLOWING_TRACER = 23;
 
+float PROJECTILE_RAPTORCANNON   = 24;
+float PROJECTILE_RAPTORBOMB     = 25;
+float PROJECTILE_RAPTORBOMBLET  = 26;
+float PROJECTILE_SPIDERROCKET   = 27;
+float PROJECTILE_WAKIROCKET     = 28;
+float PROJECTILE_WAKICANNON     = 29;
+
 float SPECIES_HUMAN        =  0;
 float SPECIES_ROBOT_SOLID  =  1;
 float SPECIES_ALIEN        =  2;
@@ -529,18 +532,23 @@ float DEATH_MIRRORDAMAGE = 10014;
 float DEATH_TOUCHEXPLODE = 10015;
 float DEATH_CHEAT = 10016;
 float DEATH_FIRE = 10017;
-float DEATH_TURRET = 10020;
 float DEATH_QUIET = 10021;
 float DEATH_HEADSHOT = 10022;
 
-float DEATH_SBMINIGUN = 10030;
-float DEATH_SBROCKET  = 10031;
-float DEATH_SBCRUSH   = 10032;
-float DEATH_SBBLOWUP  = 10033;
-
-float DEATH_WAKIGUN    = 10040;
-float DEATH_WAKIROCKET = 10041;
-float DEATH_WAKIBLOWUP = 10042;
+float  DEATH_VHFIRST       = 10030;
+float  DEATH_VHCRUSH       = 10030;
+float  DEATH_SBMINIGUN     = 10031;
+float  DEATH_SBROCKET      = 10032;
+float  DEATH_SBBLOWUP      = 10033;
+float  DEATH_WAKIGUN       = 10034;
+float  DEATH_WAKIROCKET    = 10035;
+float  DEATH_WAKIBLOWUP    = 10036;
+float  DEATH_RAPTOR_CANNON = 10037;
+float  DEATH_RAPTOR_BOMB   = 10038;
+float  DEATH_RAPTOR_BOMB_SPLIT = 10039;
+float  DEATH_RAPTOR_DEATH  = 10040;
+float  DEATH_VHLAST        = 10040;
+#define DEATH_ISVEHICLE(t)  ((t) >= DEATH_VHFIRST && (t) <= DEATH_VHLAST)
 
 float DEATH_GENERIC = 10050;
 
@@ -548,6 +556,20 @@ float DEATH_WEAPON = 10100;
 
 float DEATH_CUSTOM = 10300;
 
+float DEATH_TURRET                  = 10500;
+float DEATH_TURRET_EWHEEL           = 10501;
+float DEATH_TURRET_FLAC             = 10502;
+float DEATH_TURRET_MACHINEGUN       = 10503;
+float DEATH_TURRET_WALKER_GUN       = 10504;
+float DEATH_TURRET_WALKER_MEELE     = 10505;
+float DEATH_TURRET_WALKER_ROCKET    = 10506;
+float DEATH_TURRET_HELLION          = 10507;
+float DEATH_TURRET_HK               = 10508;
+float DEATH_TURRET_MLRS             = 10509;
+float DEATH_TURRET_PLASMA           = 10510;
+float DEATH_TURRET_PHASER           = 10511;
+float DEATH_TURRET_TESLA            = 10512;
+float DEATH_TURRET_LAST            = 10512;
 
 float DEATH_WEAPONMASK = 0xFF;
 float DEATH_HITTYPEMASK = 0x1F00; // which is WAY below 10000 used for normal deaths
@@ -558,6 +580,7 @@ float HITTYPE_HEADSHOT = 0x800;
 float HITTYPE_RESERVED = 0x1000; // unused yet
 
 // macros to access these
+#define DEATH_ISTURRET(t)            ((t) >= DEATH_TURRET && (t) <= DEATH_TURRET_LAST)
 #define DEATH_ISSPECIAL(t)            ((t) >= DEATH_SPECIAL_START)
 #define DEATH_WEAPONOFWEAPONDEATH(t)  ((t) & DEATH_WEAPONMASK)
 #define DEATH_ISWEAPON(t,w)           (!DEATH_ISSPECIAL(t) && DEATH_WEAPONOFWEAPONDEATH(t) == (w))
@@ -570,9 +593,6 @@ float HITTYPE_RESERVED = 0x1000; // unused yet
 #define FRAGS_PLAYER_NONSOLID -616
 // we can use this frags value for both
 
-//misc. stuff
-#define NEWLINES "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
-
 // water levels
 float WATERLEVEL_NONE = 0;
 float WATERLEVEL_WETFEET = 1;
@@ -581,6 +601,18 @@ float WATERLEVEL_SUBMERGED = 3;
 
 float MAX_SHOT_DISTANCE = 32768;
 
+//centerprint ID list
+float CPID_TEAMCHANGE = 1;
+float CPID_CTF_CAPTURESHIELD = 2;
+float CPID_MINSTA_FINDAMMO = 3;
+float CPID_NIX_WPNCHANGE = 4;
+float CPID_DISCONNECT_IDLING = 5;
+float CPID_ROUND_STARTING = 6;
+float CPID_GAME_STARTING = 7;
+float CPID_TIMEOUT_COUNTDOWN = 8;
+float CPID_MOTD = 9;
+float CPID_KH_MSG = 10;
+
 // CSQC centerprint/notify message types
 float MSG_SUICIDE = 0;
 float MSG_KILL = 1;
@@ -638,6 +670,7 @@ float WR_RESETPLAYER    = 10; // (SVQC) does not need to do anything
 float WR_IMPACTEFFECT  = 11; // (CSQC) impact effect
 float WR_SWITCHABLE    = 12; // (CSQC) impact effect
 float WR_PLAYERDEATH    = 13; // (SVQC) does not need to do anything
+float WR_GONETHINK     = 14; // (SVQC) logic to run every frame, also if no longer having the weapon as long as the switch away has not been performed
 
 float HUD_PANEL_WEAPONS                = 0;
 float HUD_PANEL_AMMO           = 1;
@@ -655,7 +688,8 @@ float HUD_PANEL_CHAT                = 12;
 float HUD_PANEL_ENGINEINFO     = 13;
 float HUD_PANEL_INFOMESSAGES   = 14;
 float HUD_PANEL_PHYSICS        = 15;
-float HUD_PANEL_NUM            = 16; // always last panel id + 1, please increment when adding a new panel
+float HUD_PANEL_CENTERPRINT    = 16;
+float HUD_PANEL_NUM            = 17; // always last panel id + 1, please increment when adding a new panel
 
 string HUD_PANELNAME_WEAPONS           = "weapons";
 string HUD_PANELNAME_AMMO              = "ammo";
@@ -673,6 +707,7 @@ string HUD_PANELNAME_CHAT           = "chat";
 string HUD_PANELNAME_ENGINEINFO                = "engineinfo";
 string HUD_PANELNAME_INFOMESSAGES      = "infomessages";
 string HUD_PANELNAME_PHYSICS   = "physics";
+string HUD_PANELNAME_CENTERPRINT       = "centerprint";
 
 float HUD_MENU_ENABLE          = 0;
 
index a6b0788088216c93b53f2a0dfa96aabc5ed5e820..7afa131dadbb6bc69bc82eecc0d65ccdcf8eb993 100644 (file)
@@ -49,6 +49,7 @@ void MapInfo_Cache_Store()
        // now store all the stuff
        bufstr_set(_MapInfo_Cache_Buf_IndexToMapData,   i, MapInfo_Map_bspname);
        bufstr_set(_MapInfo_Cache_Buf_IndexToMapData, ++i, MapInfo_Map_title);
+       bufstr_set(_MapInfo_Cache_Buf_IndexToMapData, ++i, MapInfo_Map_titlestring);
        bufstr_set(_MapInfo_Cache_Buf_IndexToMapData, ++i, MapInfo_Map_description);
        bufstr_set(_MapInfo_Cache_Buf_IndexToMapData, ++i, MapInfo_Map_author);
        bufstr_set(_MapInfo_Cache_Buf_IndexToMapData, ++i, ftos(MapInfo_Map_supportedGametypes));
@@ -71,6 +72,7 @@ float MapInfo_Cache_Retrieve(string map)
        // now retrieve all the stuff
        MapInfo_Map_bspname = bufstr_get(_MapInfo_Cache_Buf_IndexToMapData, i);
        MapInfo_Map_title = bufstr_get(_MapInfo_Cache_Buf_IndexToMapData, ++i);
+       MapInfo_Map_titlestring = bufstr_get(_MapInfo_Cache_Buf_IndexToMapData, ++i);
        MapInfo_Map_description = bufstr_get(_MapInfo_Cache_Buf_IndexToMapData, ++i);
        MapInfo_Map_author = bufstr_get(_MapInfo_Cache_Buf_IndexToMapData, ++i);
        MapInfo_Map_supportedGametypes = stof(bufstr_get(_MapInfo_Cache_Buf_IndexToMapData, ++i));
@@ -379,6 +381,7 @@ float _MapInfo_Generate(string pFilename) // 0: failure, 1: ok ent, 2: ok bsp
 void _MapInfo_Map_Reset()
 {
        MapInfo_Map_title = "<TITLE>";
+       MapInfo_Map_titlestring = "<TITLE>";
        MapInfo_Map_description = "<DESCRIPTION>";
        MapInfo_Map_author = "<AUTHOR>";
        MapInfo_Map_supportedGametypes = 0;
@@ -797,12 +800,36 @@ void _MapInfo_Parse_Settemp(string pFilename, string acl, float type, string s,
        }
 }
 
+float MapInfo_isRedundant(string fn, string t)
+{
+       // normalize file name
+       fn = strreplace("_", "-", fn);
+
+       // normalize visible title
+       t = strreplace(": ", "-", t);
+       t = strreplace(":", "-", t);
+       t = strreplace(" ", "-", t);
+       t = strreplace("_", "-", t);
+
+       if(!strcasecmp(fn, t))
+               return TRUE;
+
+       // we allow the visible title to have punctuation the file name does
+       // not, but not vice versa
+       t = strreplace("-", "", t);
+
+       if(!strcasecmp(fn, t))
+               return TRUE;
+
+       return FALSE;
+}
+
 // load info about a map by name into the MapInfo_Map_* globals
 float MapInfo_Get_ByName(string pFilename, float pAllowGenerate, float pGametypeToSet)
 {
        string fn;
        string s, t;
-       float fh, fh2;
+       float fh;
        float r, f, n, i, p;
        string acl;
 
@@ -1056,6 +1083,13 @@ float MapInfo_Get_ByName(string pFilename, float pAllowGenerate, float pGametype
                }
        }
 
+       if(MapInfo_Map_titlestring == "<TITLE>")
+               MapInfo_Map_titlestring = MapInfo_Map_bspname;
+       else if(MapInfo_isRedundant(MapInfo_Map_bspname, MapInfo_Map_title))
+               MapInfo_Map_titlestring = MapInfo_Map_title;
+       else
+               MapInfo_Map_titlestring = sprintf(_("%s: %s"), MapInfo_Map_bspname, MapInfo_Map_title);
+
        MapInfo_Cache_Store();
        if(MapInfo_Map_supportedGametypes != 0)
                return r;
@@ -1253,6 +1287,24 @@ string MapInfo_ListAllowedMaps(float pRequiredFlags, float pForbiddenFlags)
        return substring(out, 1, strlen(out) - 1);
 }
 
+string MapInfo_ListAllAllowedMaps(float pRequiredFlags, float pForbiddenFlags)
+{
+       string out;
+       float i;
+
+       // to make absolutely sure:
+       MapInfo_Enumerate();
+       MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, pRequiredFlags, pForbiddenFlags, 0);
+
+       out = "";
+       for(i = 0; i < MapInfo_count; ++i)
+               out = strcat(out, " ", _MapInfo_GlobItem(MapInfo_FilterList_Lookup(i)));
+
+       MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), pRequiredFlags, pForbiddenFlags, 0);
+
+       return substring(out, 1, strlen(out) - 1);
+}
+
 void MapInfo_LoadMapSettings(string s) // to be called from worldspawn
 {
        float t, t0;
@@ -1295,6 +1347,7 @@ void MapInfo_ClearTemps()
 {
        MapInfo_Map_bspname = string_null;
        MapInfo_Map_title = string_null;
+       MapInfo_Map_titlestring = string_null;
        MapInfo_Map_description = string_null;
        MapInfo_Map_author = string_null;
        MapInfo_Map_clientstuff = string_null;
index 12026689b8b3195e21ef40db0079c70fe50dacaf..3eb16d8544b11835f4f272811aef53bbd66a3a5a 100644 (file)
@@ -27,6 +27,7 @@ float MapInfo_count;
 // info about a map that MapInfo loads
 string MapInfo_Map_bspname;
 string MapInfo_Map_title;
+string MapInfo_Map_titlestring; // either bspname: title or just title, depending on whether bspname is redundant
 string MapInfo_Map_description;
 string MapInfo_Map_author;
 string MapInfo_Map_clientstuff; // not in cache, only for map load
@@ -68,6 +69,8 @@ void MapInfo_LoadMap(string s);
 
 // list all maps for the current game type
 string MapInfo_ListAllowedMaps(float pFlagsRequired, float pFlagsForbidden);
+// list all allowed maps (for any game type)
+string MapInfo_ListAllAllowedMaps(float pFlagsRequired, float pFlagsForbidden);
 
 // gets a gametype from a string
 float MapInfo_Type_FromString(string t);
diff --git a/qcsrc/common/urllib.qc b/qcsrc/common/urllib.qc
new file mode 100644 (file)
index 0000000..0ab17f3
--- /dev/null
@@ -0,0 +1,294 @@
+// files (-1 for URL)
+.float url_fh;
+
+// URLs
+.string url_url;
+.float url_wbuf;
+.float url_wbufpos;
+.float url_rbuf;
+.float url_rbufpos;
+.float url_id;
+.url_ready_func url_ready;
+.entity url_ready_pass;
+
+entity url_fromid[NUM_URL_ID];
+float autocvar__urllib_nextslot;
+
+float url_URI_Get_Callback(float id, float status, string data)
+{
+       if(id < MIN_URL_ID)
+               return 0;
+       id -= MIN_URL_ID;
+       if(id >= NUM_URL_ID)
+               return 0;
+       entity e;
+       e = url_fromid[id];
+       if(!e)
+               return 0;
+       if(e.url_rbuf >= 0 || e.url_wbuf >= 0)
+       {
+               print(sprintf("WARNING: handle %d (%s) has already received data?!?\n", id + NUM_URL_ID, e.url_url));
+               return 0;
+       }
+
+       // whatever happens, we will remove the URL from the list of IDs
+       url_fromid[id] = world;
+
+       // if we get here, we MUST have both buffers cleared
+       if(e.url_rbuf != -1 || e.url_wbuf != -1 || e.url_fh != -1)
+               error("url_URI_Get_Callback: not a request waiting for data");
+
+       if(status == 0)
+       {
+               // WE GOT DATA!
+               float n, i;
+               n = tokenizebyseparator(data, "\n");
+               e.url_rbuf = buf_create();
+               if(e.url_rbuf < 0)
+               {
+                       print("url_URI_Get_Callback: out of memory in buf_create\n");
+                       e.url_ready(e, e.url_ready_pass, URL_READY_ERROR);
+                       strunzone(e.url_url);
+                       remove(e);
+                       return 1;
+               }
+               e.url_rbufpos = 0;
+               if(e.url_rbuf < 0)
+               {
+                       print("url_URI_Get_Callback: out of memory in buf_create\n");
+                       e.url_ready(e, e.url_ready_pass, URL_READY_ERROR);
+                       strunzone(e.url_url);
+                       remove(e);
+                       return 1;
+               }
+               for(i = 0; i < n; ++i)
+                       bufstr_set(e.url_rbuf, i, argv(i));
+               e.url_ready(e, e.url_ready_pass, URL_READY_CANREAD);
+               return 1;
+       }
+       else
+       {
+               // an ERROR
+               e.url_ready(e, e.url_ready_pass, -fabs(status));
+               strunzone(e.url_url);
+               remove(e);
+               return 1;
+       }
+}
+
+void url_fopen(string url, float mode, url_ready_func rdy, entity pass)
+{
+       entity e;
+       float i;
+       if(strstrofs(url, "://", 0) >= 0)
+       {
+               switch(mode)
+               {
+                       case FILE_WRITE:
+                       case FILE_APPEND:
+                               // collect data to a stringbuffer for a POST request
+                               // attempts to close will result in a reading handle
+
+                               // create a writing end that does nothing yet
+                               e = spawn();
+                               e.classname = "url_fopen_file";
+                               e.url_url = strzone(url);
+                               e.url_fh = -1;
+                               e.url_wbuf = buf_create();
+                               if(e.url_wbuf < 0)
+                               {
+                                       print("url_fopen: out of memory in buf_create\n");
+                                       rdy(e, pass, URL_READY_ERROR);
+                                       strunzone(e.url_url);
+                                       remove(e);
+                                       return;
+                               }
+                               e.url_wbufpos = 0;
+                               e.url_rbuf = -1;
+                               rdy(e, pass, URL_READY_CANWRITE);
+                               break;
+
+                       case FILE_READ:
+                               // read data only
+
+                               // get slot for HTTP request
+                               for(i = autocvar__urllib_nextslot; i < NUM_URL_ID; ++i)
+                                       if(url_fromid[i] == world)
+                                               break;
+                               if(i >= NUM_URL_ID)
+                               {
+                                       for(i = 0; i < autocvar__urllib_nextslot; ++i)
+                                               if(url_fromid[i] == world)
+                                                       break;
+                                       if(i >= autocvar__urllib_nextslot)
+                                       {
+                                               print("url_fopen: too many concurrent requests\n");
+                                               rdy(world, pass, URL_READY_ERROR);
+                                               return;
+                                       }
+                               }
+
+                               // GET the data
+                               if(!crypto_uri_postbuf(url, i + MIN_URL_ID, string_null, string_null, -1, 0))
+                               {
+                                       print("url_fopen: failure in crypto_uri_postbuf\n");
+                                       rdy(world, pass, URL_READY_ERROR);
+                                       return;
+                               }
+
+                               // Make a dummy handle object (no buffers at
+                               // all). Wait for data to come from the
+                               // server, then call the callback
+                               e = spawn();
+                               e.classname = "url_fopen_file";
+                               e.url_url = strzone(url);
+                               e.url_fh = -1;
+                               e.url_rbuf = -1;
+                               e.url_wbuf = -1;
+                               e.url_ready = rdy;
+                               e.url_ready_pass = pass;
+                               e.url_id = i;
+                               url_fromid[i] = e;
+
+                               // make sure this slot won't be reused quickly even on map change
+                               cvar_set("_urllib_nextslot", ftos(mod(i + 1, NUM_URL_ID)));
+                               break;
+               }
+       }
+       else
+       {
+               float fh;
+               fh = fopen(url, mode);
+               if(fh < 0)
+               {
+                       rdy(world, pass, URL_READY_ERROR);
+                       return;
+               }
+               else
+               {
+                       e = spawn();
+                       e.classname = "url_fopen_file";
+                       e.url_fh = fh;
+                       if(mode == FILE_READ)
+                               rdy(e, pass, URL_READY_CANREAD);
+                       else
+                               rdy(e, pass, URL_READY_CANWRITE);
+               }
+       }
+}
+
+// close a file
+void url_fclose(entity e, url_ready_func rdy, entity pass)
+{
+       float i;
+
+       if(e.url_fh < 0)
+       {
+               if(e.url_rbuf == -1 || e.url_wbuf != -1) // not(post GET/POST request)
+               if(e.url_rbuf != -1 || e.url_wbuf == -1) // not(pre POST request)
+                       error("url_fclose: not closable in current state");
+
+               // closing an URL!
+               if(e.url_wbuf >= 0)
+               {
+                       // we are closing the write end (HTTP POST request)
+
+                       // get slot for HTTP request
+                       for(i = autocvar__urllib_nextslot; i < NUM_URL_ID; ++i)
+                               if(url_fromid[i] == world)
+                                       break;
+                       if(i >= NUM_URL_ID)
+                       {
+                               for(i = 0; i < autocvar__urllib_nextslot; ++i)
+                                       if(url_fromid[i] == world)
+                                               break;
+                               if(i >= autocvar__urllib_nextslot)
+                               {
+                                       print("url_fclose: too many concurrent requests\n");
+                                       rdy(e, pass, URL_READY_ERROR);
+                                       buf_del(e.url_wbuf);
+                                       strunzone(e.url_url);
+                                       remove(e);
+                                       return;
+                               }
+                       }
+
+                       // POST the data
+                       if(!crypto_uri_postbuf(e.url_url, i + MIN_URL_ID, "text/plain", "", e.url_wbuf, 0))
+                       {
+                               print("url_fclose: failure in crypto_uri_postbuf\n");
+                               rdy(e, pass, URL_READY_ERROR);
+                               buf_del(e.url_wbuf);
+                               strunzone(e.url_url);
+                               remove(e);
+                               return;
+                       }
+
+                       // delete write end. File handle is now in unusable
+                       // state. Wait for data to come from the server, then
+                       // call the callback
+                       buf_del(e.url_wbuf);
+                       e.url_wbuf = -1;
+                       e.url_ready = rdy;
+                       e.url_ready_pass = pass;
+                       e.url_id = i;
+                       url_fromid[i] = e;
+
+                       // make sure this slot won't be reused quickly even on map change
+                       cvar_set("_urllib_nextslot", ftos(mod(i + 1, NUM_URL_ID)));
+               }
+               else
+               {
+                       // we have READ all data, just close
+                       rdy(e, pass, URL_READY_CLOSED);
+                       buf_del(e.url_rbuf);
+                       strunzone(e.url_url);
+                       remove(e);
+               }
+       }
+       else
+       {
+               // file
+               fclose(e.url_fh);
+               rdy(e, pass, URL_READY_CLOSED); // closing creates no reading handle
+               remove(e);
+       }
+}
+
+// with \n (blame FRIK_FILE)
+string url_fgets(entity e)
+{
+       if(e.url_fh < 0)
+       {
+               if(e.url_rbuf == -1)
+                       error("url_fgets: not readable in current state");
+               // curl
+               string s;
+               s = bufstr_get(e.url_rbuf, e.url_rbufpos);
+               e.url_rbufpos += 1;
+               return s;
+       }
+       else
+       {
+               // file
+               return fgets(e.url_fh);
+       }
+}
+
+// without \n (blame FRIK_FILE)
+void url_fputs(entity e, string s)
+{
+       if(e.url_fh < 0)
+       {
+               if(e.url_wbuf == -1)
+                       error("url_fputs: not writable in current state");
+               // curl
+               bufstr_set(e.url_wbuf, e.url_wbufpos, s);
+               e.url_wbufpos += 1;
+       }
+       else
+       {
+               // file
+               fputs(e.url_fh, s);
+       }
+}
diff --git a/qcsrc/common/urllib.qh b/qcsrc/common/urllib.qh
new file mode 100644 (file)
index 0000000..a7735ed
--- /dev/null
@@ -0,0 +1,16 @@
+float URL_READY_ERROR    = -1;
+float URL_READY_CLOSED   =  0;
+float URL_READY_CANWRITE =  1;
+float URL_READY_CANREAD  =  2;
+// errors: -1, or negative HTTP status code
+typedef void(entity handle, entity pass, float status) url_ready_func;
+
+void url_fopen(string url, float mode, url_ready_func rdy, entity pass);
+void url_fclose(entity e, url_ready_func rdy, entity pass);
+string url_fgets(entity e);
+void url_fputs(entity e, string s);
+
+// returns true if handled
+float url_URI_Get_Callback(float id, float status, string data);
+#define MIN_URL_ID 128
+#define NUM_URL_ID 64
index bc086e4a9af392358db52715af04de0ae882f6bc..f5633ab3f31dec7546438633407c4feb6edede7a 100644 (file)
@@ -1,2 +1,7 @@
 #pragma flag enable subscope
 #pragma flag enable lo
+
+#ifndef NOCOMPAT
+# define WORKAROUND_XON010
+# define COMPAT_XON010_CHANNELS
+#endif
index 89cb92baf3fce6b4f08d881a208db2f106f67c63..23d4f3431941958bbf188467aa90ab8ede62061e 100644 (file)
@@ -2017,3 +2017,37 @@ string CTX(string s)
                return s;
        return substring(s, p+1, -1);
 }
+
+// x-encoding (encoding as zero length invisible string)
+const string XENCODE_2  = "xX";
+const string XENCODE_22 = "0123456789abcdefABCDEF";
+string xencode(float f)
+{
+       float a, b, c, d;
+       d = mod(f, 22); f = floor(f / 22);
+       c = mod(f, 22); f = floor(f / 22);
+       b = mod(f, 22); f = floor(f / 22);
+       a = mod(f,  2); // f = floor(f /  2);
+       return strcat(
+               "^",
+               substring(XENCODE_2,  a, 1),
+               substring(XENCODE_22, b, 1),
+               substring(XENCODE_22, c, 1),
+               substring(XENCODE_22, d, 1)
+       );
+}
+float xdecode(string s)
+{
+       float a, b, c, d;
+       if(substring(s, 0, 1) != "^")
+               return -1;
+       if(strlen(s) < 5)
+               return -1;
+       a = strstrofs(XENCODE_2,  substring(s, 1, 1), 0);
+       b = strstrofs(XENCODE_22, substring(s, 2, 1), 0);
+       c = strstrofs(XENCODE_22, substring(s, 3, 1), 0);
+       d = strstrofs(XENCODE_22, substring(s, 4, 1), 0);
+       if(a < 0 || b < 0 || c < 0 || d < 0)
+               return -1;
+       return ((a * 22 + b) * 22 + c) * 22 + d;
+}
index 49afad22d7f19bc62f552b8dcdbf3884f7e8654d..2eee6d74ef1a4d369286c1fcc01a71588ccd130d 100644 (file)
@@ -222,6 +222,7 @@ switch(id) {\
        case HUD_PANEL_ENGINEINFO: panel_name = HUD_PANELNAME_ENGINEINFO; break; \
        case HUD_PANEL_INFOMESSAGES: panel_name = HUD_PANELNAME_INFOMESSAGES; break; \
        case HUD_PANEL_PHYSICS: panel_name = HUD_PANELNAME_PHYSICS; break; \
+       case HUD_PANEL_CENTERPRINT: panel_name = HUD_PANELNAME_CENTERPRINT; break; \
 } ENDS_WITH_CURLY_BRACE
 
 // Get name of specified panel id
@@ -258,3 +259,14 @@ string prvm_language;
 string language_filename(string s);
 string CTX(string s);
 #define ZCTX(s) strzone(CTX(s))
+
+// x-encoding (encoding as zero length invisible string)
+// encodes approx. 14 bits into 5 bytes of color code string
+const float XENCODE_MAX = 21295; // 2*22*22*22-1
+const float XENCODE_LEN = 5;
+string xencode(float f);
+float xdecode(string s);
+
+#ifndef COMPAT_XON010_CHANNELS
+#define sound(e,c,s,v,a) sound7(e,c,s,v,a,0,0)
+#endif
index 61f5a4877d27bbf506a949372e6520d4239b40cc..5b7331e3752be37be4231150c89627e38c5baa5e 100644 (file)
 #include "xonotic/dialog_hudpanel_infomessages.c"
 #include "xonotic/dialog_hudpanel_weapons.c"
 #include "xonotic/dialog_hudpanel_physics.c"
+#include "xonotic/dialog_hudpanel_centerprint.c"
 #include "xonotic/slider_picmip.c"
diff --git a/qcsrc/menu/oo/classdefs.h b/qcsrc/menu/oo/classdefs.h
deleted file mode 100644 (file)
index 85bc6c2..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef INTERFACE
-#define INTERFACE
-#endif
-
-#ifdef IMPLEMENTATION
-#undef IMPLEMENTATION
-#endif
-
-#ifdef CLASS
-#undef CLASS
-#undef EXTENDS
-#undef METHOD
-#undef ATTRIB
-#undef ATTRIBARRAY
-#undef ENDCLASS
-#undef SUPER
-#endif
-
-#define CLASS(cname)                       entity spawn##cname(); entity cname##_vtbl;
-#define EXTENDS(base)                
-#define METHOD(cname,name,prototype)       prototype cname##_##name; .prototype name;
-#define ATTRIB(cname,name,type,val)        .type name;
-#define ATTRIBARRAY(cname,name,type,cnt)   .type name[cnt];
-#define ENDCLASS(cname)                    .float instanceOf##cname;
-#define SUPER(cname)
diff --git a/qcsrc/menu/oo/constructors.h b/qcsrc/menu/oo/constructors.h
deleted file mode 100644 (file)
index 4e758dd..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#ifndef INTERFACE
-#define INTERFACE
-#endif
-
-#ifdef IMPLEMENTATION
-#undef IMPLEMENTATION
-#endif
-
-#ifdef CLASS
-#undef CLASS
-#undef EXTENDS
-#undef METHOD
-#undef ATTRIB
-#undef ATTRIBARRAY
-#undef ENDCLASS
-#undef SUPER
-#endif
-
-#define CLASS(cname)                       entity spawn##cname() { entity me;
-#define EXTENDS(base)                      me = spawn##base (); entity basevtbl; basevtbl = base##_vtbl;
-#define METHOD(cname,name,prototype)       me.name = cname##_##name;
-#define ATTRIB(cname,name,type,val)        me.name = val;
-#define ATTRIBARRAY(cname,name,type,cnt)   me.name = me.name;
-#define ENDCLASS(cname)                    me.instanceOf##cname = 1; me.classname = #cname; if(!cname##_vtbl) cname##_vtbl = spawnVtbl(me, basevtbl); return me; }
-#define SUPER(cname)
index ed6bd71f36087d7527c52fe03cef45388bb03c2b..34f32e306aa16df6d831a4d3a36a9021a17ff2bb 100644 (file)
@@ -1,5 +1,5 @@
-#ifdef INTERFACE
-#undef INTERFACE
+#ifndef INTERFACE
+#define INTERFACE
 #endif
 
 #ifndef IMPLEMENTATION
 #undef SUPER
 #endif
 
+// for the constructor
+#define CLASS(cname)                       entity spawn##cname() { entity me;
+#define EXTENDS(base)                      me = spawn##base (); entity basevtbl; basevtbl = base##_vtbl;
+#define METHOD(cname,name,prototype)       me.name = cname##_##name;
+#define ATTRIB(cname,name,type,val)        me.name = val;
+#define ATTRIBARRAY(cname,name,type,cnt)   me.name = me.name;
+#define ENDCLASS(cname)                    me.instanceOf##cname = 1; me.classname = #cname; if(!cname##_vtbl) cname##_vtbl = spawnVtbl(me, basevtbl); return me; }
+
+// for the implementation
 #define SUPER(cname) (cname##_vtbl.vtblbase)
diff --git a/qcsrc/menu/oo/interface.h b/qcsrc/menu/oo/interface.h
new file mode 100644 (file)
index 0000000..85bc6c2
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef INTERFACE
+#define INTERFACE
+#endif
+
+#ifdef IMPLEMENTATION
+#undef IMPLEMENTATION
+#endif
+
+#ifdef CLASS
+#undef CLASS
+#undef EXTENDS
+#undef METHOD
+#undef ATTRIB
+#undef ATTRIBARRAY
+#undef ENDCLASS
+#undef SUPER
+#endif
+
+#define CLASS(cname)                       entity spawn##cname(); entity cname##_vtbl;
+#define EXTENDS(base)                
+#define METHOD(cname,name,prototype)       prototype cname##_##name; .prototype name;
+#define ATTRIB(cname,name,type,val)        .type name;
+#define ATTRIBARRAY(cname,name,type,cnt)   .type name[cnt];
+#define ENDCLASS(cname)                    .float instanceOf##cname;
+#define SUPER(cname)
index 34eb5db888fa3836ff627284646eef94d1088866..1184c32d1819ab582ca4af36f85a5a88eb7cb59b 100644 (file)
@@ -20,10 +20,7 @@ draw.qh
 skin.qh
 xonotic/util.qh
 
-oo/classdefs.h
-       classes.c
-
-oo/constructors.h
+oo/interface.h
        classes.c
 oo/implementation.h
        classes.c
index daf4d22f9c8dd95b221fdaf7c4134b628c4ccfc2..0d998d7de920f231a0c3e8729fc552a0c2de09a2 100644 (file)
@@ -31,8 +31,6 @@ void XonoticCreditsList_configureXonoticCreditsList(entity me)
        me.configureXonoticListBox(me);
        // load the file
        me.bufferIndex = buf_load(language_filename("xonotic-credits.txt"));
-       if(me.bufferIndex < 0)
-               me.bufferIndex = buf_load("xonotic-credits.txt");
        me.nItems = buf_getsize(me.bufferIndex);
 }
 void XonoticCreditsList_destroy(entity me)
diff --git a/qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c b/qcsrc/menu/xonotic/dialog_hudpanel_centerprint.c
new file mode 100644 (file)
index 0000000..9628783
--- /dev/null
@@ -0,0 +1,44 @@
+#ifdef INTERFACE
+CLASS(XonoticHUDCenterprintDialog) EXTENDS(XonoticRootDialog)
+       METHOD(XonoticHUDCenterprintDialog, fill, void(entity))
+       ATTRIB(XonoticHUDCenterprintDialog, title, string, _("Centerprint"))
+       ATTRIB(XonoticHUDCenterprintDialog, color, vector, SKINCOLOR_DIALOG_TEAMSELECT)
+       ATTRIB(XonoticHUDCenterprintDialog, intendedWidth, float, 0.4)
+       ATTRIB(XonoticHUDCenterprintDialog, rows, float, 15)
+       ATTRIB(XonoticHUDCenterprintDialog, columns, float, 4)
+       ATTRIB(XonoticHUDCenterprintDialog, name, string, "HUDcenterprint")
+ENDCLASS(XonoticHUDCenterprintDialog)
+#endif
+
+#ifdef IMPLEMENTATION
+void XonoticHUDCenterprintDialog_fill(entity me)
+{
+       entity e;
+       string panelname = "centerprint";
+
+       DIALOG_HUDPANEL_COMMON();
+
+       me.TR(me);
+               me.TDempty(me, 0.2);
+               me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Message duration:")));
+               me.TD(me, 1, 2.6, e = makeXonoticSlider(1, 10, 1, "hud_panel_centerprint_time"));
+       me.TR(me);
+               me.TDempty(me, 0.2);
+               me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Fade time:")));
+               me.TD(me, 1, 2.6, e = makeXonoticSlider(0, 1, 0.05, "hud_panel_centerprint_fadetime"));
+       me.TR(me);
+               me.TDempty(me, 0.2);
+               me.TD(me, 1, 3.8, e = makeXonoticCheckBox(0, "hud_panel_centerprint_flip", _("Flip messages order")));
+       me.TR(me);
+               me.TD(me, 1, 4, e = makeXonoticTextLabel(0, _("Text alignment:")));
+       me.TR(me);
+               me.TDempty(me, 0.2);
+                       me.TD(me, 1, 3.8/3, e = makeXonoticRadioButton(3, "hud_panel_centerprint_align", "0", _("Left")));
+                       me.TD(me, 1, 3.8/3, e = makeXonoticRadioButton(3, "hud_panel_centerprint_align", "0.5", _("Center")));
+                       me.TD(me, 1, 3.8/3, e = makeXonoticRadioButton(3, "hud_panel_centerprint_align", "1", _("Right")));
+       me.TR(me);
+               me.TDempty(me, 0.2);
+               me.TD(me, 1, 1.2, e = makeXonoticTextLabel(0, _("Font scale:")));
+               me.TD(me, 1, 2.6, e = makeXonoticSlider(0.5, 2, 0.1, "hud_panel_centerprint_fontscale"));
+}
+#endif
index 66c872b9f9589689b9030fb820d2c5a17a2fbc06..aeedc492df6dea50d26b1ada2f553baad827e8ba 100644 (file)
@@ -16,13 +16,13 @@ void XonoticHUDPhysicsDialog_fill(entity me)
 {
        entity e;
        string panelname = "physics";
-       float i;
 
        me.TR(me);
                me.TD(me, 1, 4, e = makeXonoticTextSlider("hud_panel_physics"));
                        e.addValue(e, _("Panel disabled"), "0");
-                       e.addValue(e, _("Panel enabled if not observing"), "1");
-                       e.addValue(e, _("Panel always enabled"), "2");
+                       e.addValue(e, _("Panel enabled"), "1");
+                       e.addValue(e, _("Panel enabled even observing"), "2");
+                       e.addValue(e, _("Panel enabled only in Race/CTS"), "3");
                        e.configureXonoticTextSliderValues(e);
 
        DIALOG_HUDPANEL_COMMON_NOTOGGLE();
index 2d9689f64422e5d527692b91b753a30afb6268a8..b9b5896804ddc99de65c0f74dee9a6e60192d6d7 100644 (file)
@@ -29,7 +29,6 @@ entity makeXonoticServerCreateTab()
 void XonoticServerCreateTab_fill(entity me)
 {
        entity e, e0;
-       float n;
 
        me.TR(me);
                me.TD(me, 1, 3, e = makeXonoticTextLabel(0, _("Game type:")));
index 677161b637077ff6aab7d7b57f329e4cc965c9f5..e242b6667546e5576444ccee6fa668908693be3f 100644 (file)
@@ -94,7 +94,6 @@ void XonoticMapInfoDialog_fill(entity me)
        me.TR(me);
                me.TD(me, 1, w, e = makeXonoticTextLabel(0, _("Game types:")));
 
-       
        n = ceil(GameType_GetCount() / (me.rows - 6));
        wgt = (w - 0.2) / n;
        for(i = 0; i < GameType_GetCount(); ++i)
@@ -119,7 +118,7 @@ void XonoticMapInfoDialog_fill(entity me)
                me.TD(me, 1, me.columns - 5.5, e = makeXonoticButton(_("Close"), '0 0 0'));
                        e.onClick = Dialog_Close;
                        e.onClickEntity = me;
-               me.TD(me, 1, me.columns - 5.5, me.startButton = e = makeXonoticButton(_("Play"), '0 0 0'));
+               me.TD(me, 1, me.columns - 5.5, me.startButton = e = makeXonoticButton(ZCTX(_("MAP^Play")), '0 0 0'));
                        me.startButton.onClick = MapList_LoadMap;
                        me.startButton.onClickEntity = NULL; // filled later
 }
index 640c28a348242e28290883f6246a8bec7b01e042..6b14d1446de07fe5019b94f84aa7ac8591efd087 100644 (file)
@@ -263,7 +263,7 @@ void XonoticMutatorsDialog_fill(entity me)
                me.TDempty(me, 0.2);
                me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "g_start_weapon_laser", "0", _("No start weapons")));
                        e.cvarOffValue = "-1";
-                       makeMulti(e, "g_start_weapon_shotgun g_start_weapon_uzi g_start_weapon_grenadelauncher g_start_weapon_minelayer g_start_weapon_electro g_start_weapon_crylink g_start_weapon_nex g_start_weapon_hagar g_start_weapon_rocketlauncher g_start_weapon_sniperrifle g_start_weapon_hlac g_start_weapon_seeker g_start_weapon_minstanex g_start_weapon_hook g_start_weapon_porto g_start_weapon_tuba g_start_weapon_minelayer");
+                       makeMulti(e, "g_start_weapon_shotgun g_start_weapon_uzi g_start_weapon_grenadelauncher g_start_weapon_minelayer g_start_weapon_electro g_start_weapon_crylink g_start_weapon_nex g_start_weapon_hagar g_start_weapon_rocketlauncher g_start_weapon_rifle g_start_weapon_hlac g_start_weapon_seeker g_start_weapon_minstanex g_start_weapon_hook g_start_weapon_porto g_start_weapon_tuba g_start_weapon_minelayer");
 
        me.gotoRC(me, me.rows - 1, 0);
                me.TD(me, 1, me.columns, e = makeXonoticButton(_("OK"), '0 0 0'));
index 85171e094099818a2fc3f93b5fc359368dad932f..99f5a179b5ca6ab2bf6711bf20ea1a705c1ff291 100644 (file)
@@ -43,7 +43,7 @@ void XonoticDemoBrowserTab_fill(entity me)
                me.TD(me, 1, me.columns / 2, e = makeXonoticButton(_("Timedemo"), '0 0 0'));
                        e.onClick = TimeDemo_Click;
                        e.onClickEntity = dlist;
-               me.TD(me, 1, me.columns / 2, e = makeXonoticButton(_("Play"), '0 0 0'));
+               me.TD(me, 1, me.columns / 2, e = makeXonoticButton(ZCTX(_("DEMO^Play")), '0 0 0'));
                        e.onClick = StartDemo_Click;
                        e.onClickEntity = dlist;
 }
index d20a6483bb425e4f9735c6fbf8dc7d24b317221e..2c960d36886b12a2c717162fac022dd08a32859c 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticWeaponsDialog) EXTENDS(XonoticDialog)
        ATTRIB(XonoticWeaponsDialog, title, string, _("Weapon settings"))
        ATTRIB(XonoticWeaponsDialog, color, vector, SKINCOLOR_DIALOG_WEAPONS)
        ATTRIB(XonoticWeaponsDialog, intendedWidth, float, 0.4)
-       ATTRIB(XonoticWeaponsDialog, rows, float, 17)
+       ATTRIB(XonoticWeaponsDialog, rows, float, 18)
        ATTRIB(XonoticWeaponsDialog, columns, float, 3)
        ATTRIB(XonoticWeaponsDialog, weaponsList, entity, NULL)
 ENDCLASS(XonoticWeaponsDialog)
@@ -28,8 +28,8 @@ void XonoticWeaponsDialog_fill(entity me)
        me.TR(me);
                me.TD(me, 1, 3, makeXonoticTextLabel(0, _("Weapon priority list:")));
        me.TR(me);
-               me.TD(me, 9, 3, e = me.weaponsList = makeXonoticWeaponsList());
-       me.gotoRC(me, 10, 0);
+               me.TD(me, 10, 3, e = me.weaponsList = makeXonoticWeaponsList());
+       me.gotoRC(me, 11, 0);
                me.TDempty(me, 0.5);
                me.TD(me, 1, 1, e = makeXonoticButton(_("Up"), '0 0 0'));
                        e.onClick = WeaponsList_MoveUp_Click;
@@ -45,9 +45,11 @@ void XonoticWeaponsDialog_fill(entity me)
                me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "r_drawviewmodel", _("Draw 1st person weapon model")));
        me.TR(me);
                me.TDempty(me, 0.2);
-               me.TD(me, 1, 1.4, e = makeXonoticRadioButton(1, "cl_gunalign", "4", _("Left align")));
+               me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "cl_gunalign", "4", _("Left align")));
                        setDependent(e, "r_drawviewmodel", 1, 1);
-               me.TD(me, 1, 1.4, e = makeXonoticRadioButton(1, "cl_gunalign", "3", _("Right align")));
+               me.TD(me, 1, 0.9, e = makeXonoticRadioButton(1, "cl_gunalign", "1", _("Center")));
+                       setDependent(e, "r_drawviewmodel", 1, 1);
+               me.TD(me, 1, 1.0, e = makeXonoticRadioButton(1, "cl_gunalign", "3", _("Right align")));
                        setDependent(e, "r_drawviewmodel", 1, 1);
        me.TR(me);
                me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "v_flipped", _("Flip view horizontally")));
index e38a87be66211eb41366ed773f891aca3d12b668..69d6af6b01898b0d3370f9217d52a3824ede7ce1 100644 (file)
@@ -29,7 +29,7 @@ void XonoticAudioSettingsTab_fill(entity me)
        me.TR(me);
                me.TDempty(me, 0.2);
                s = makeXonoticDecibelsSlider(-20, 0, 0.5, "bgmvolume");
-               makeMulti(s, "snd_csqcchannel2volume");
+               makeMulti(s, "snd_channel8volume");
                me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Music:")));
                me.TD(me, 1, 2, s);
                setDependentStringNotEqual(e, "mastervolume", "0");
@@ -37,62 +37,57 @@ void XonoticAudioSettingsTab_fill(entity me)
        me.TR(me);
                me.TDempty(me, 0.2);
                s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_staticvolume");
+               makeMulti(s, "snd_channel9volume");
                me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, ZCTX(_("VOL^Ambient:"))));
-               makeMulti(s, "snd_entchannel2volume");
                me.TD(me, 1, 2, s);
                setDependentStringNotEqual(e, "mastervolume", "0");
                setDependentStringNotEqual(s, "mastervolume", "0");
        me.TR(me);
                me.TDempty(me, 0.2);
-               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_worldchannel0volume");
+               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel0volume");
                me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Info:")));
-               makeMulti(s, "snd_csqcchannel0volume");
                me.TD(me, 1, 2, s);
                setDependentStringNotEqual(e, "mastervolume", "0");
                setDependentStringNotEqual(s, "mastervolume", "0");
        me.TR(me);
                me.TDempty(me, 0.2);
-               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_entchannel3volume");
-               makeMulti(s, "snd_playerchannel0volume snd_playerchannel3volume snd_csqcchannel3volume");
+               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel3volume");
                me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Items:")));
                me.TD(me, 1, 2, s);
                setDependentStringNotEqual(e, "mastervolume", "0");
                setDependentStringNotEqual(s, "mastervolume", "0");
        me.TR(me);
                me.TDempty(me, 0.2);
-               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_playerchannel6volume");
-               makeMulti(s, "snd_csqcchannel6volume");
+               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel6volume");
                me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Pain:")));
                me.TD(me, 1, 2, s);
                setDependentStringNotEqual(e, "mastervolume", "0");
                setDependentStringNotEqual(s, "mastervolume", "0");
        me.TR(me);
                me.TDempty(me, 0.2);
-               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_playerchannel7volume");
-               makeMulti(s, "snd_entchannel7volume");
+               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel7volume");
                me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Player:")));
                me.TD(me, 1, 2, s);
                setDependentStringNotEqual(e, "mastervolume", "0");
                setDependentStringNotEqual(s, "mastervolume", "0");
        me.TR(me);
                me.TDempty(me, 0.2);
-               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_entchannel4volume");
-               makeMulti(s, "snd_playerchannel4volume snd_entchannel6volume snd_csqcchannel4volume");
+               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel4volume");
                me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Shots:")));
                me.TD(me, 1, 2, s);
                setDependentStringNotEqual(e, "mastervolume", "0");
                setDependentStringNotEqual(s, "mastervolume", "0");
        me.TR(me);
                me.TDempty(me, 0.2);
-               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_playerchannel2volume");
+               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel2volume");
                me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Voice:")));
                me.TD(me, 1, 2, s);
                setDependentStringNotEqual(e, "mastervolume", "0");
                setDependentStringNotEqual(s, "mastervolume", "0");
        me.TR(me);
                me.TDempty(me, 0.2);
-               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_playerchannel1volume");
-               makeMulti(s, "snd_playerchannel5volume snd_entchannel1volume snd_entchannel5volume");
+               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "snd_channel1volume");
+               makeMulti(s, "snd_channel5volume"); // legacy
                me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, _("Weapons:")));
                me.TD(me, 1, 2, s);
                setDependentStringNotEqual(e, "mastervolume", "0");
index 53903aac7a8e5f172a5b1568676448389e390a71..585b2079683ba10c50434d7073d3e7b29dfacd12 100644 (file)
@@ -114,7 +114,9 @@ void XonoticEffectsSettingsTab_fill(entity me)
                me.TD(me, 1, 1.9, e = makeXonoticSlider(500, 2000, 100, "r_drawparticles_drawdistance"));
        me.TR(me);
        me.TR(me);
-               me.TD(me, 1, 3, e = makeXonoticCheckBox(0, "cl_decals", _("Decals")));
+               me.TD(me, 1, 1.5, e = makeXonoticCheckBox(0, "cl_decals", _("Decals")));
+               me.TD(me, 1, 1.5, e = makeXonoticCheckBox(0, "cl_decals_models", _("Decals on models")));
+                       setDependent(e, "cl_decals", 1, 1);
        me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 0.9, e = makeXonoticTextLabel(0, _("Distance:")));
@@ -132,8 +134,8 @@ void XonoticEffectsSettingsTab_fill(entity me)
        me.TD(me, 1, 1.2, e = makeXonoticCheckBox(1, "mod_q3bsp_nolightmaps", _("Use lightmaps")));
        me.TD(me, 1, 1.2, e = makeXonoticCheckBox(0, "r_glsl_deluxemapping", _("Deluxe mapping")));
                setDependentAND(e, "vid_gl20", 1, 1, "mod_q3bsp_nolightmaps", 0, 0);
-       me.TD(me, 1, 0.6, e = makeXonoticCheckBox(0, "r_shadow_gloss", _("Gloss")));
-               setDependentAND3(e, "vid_gl20", 1, 1, "r_glsl_deluxemapping", 1, 2, "mod_q3bsp_nolightmaps", 0, 0);
+       me.TD(me, 1, 0.6, e = makeXonoticCheckBox(0, "r_shadow_gloss", _("Gloss"))); // FIXME move this box elsewhere, it has nothing to do with Q3BSP lightmaps
+               setDependent(e, "vid_gl20", 1, 1);
        me.TR(me);
                me.TD(me, 1, 1.2, e = makeXonoticCheckBox(0, "r_glsl_offsetmapping", _("Offset mapping")));
                        setDependent(e, "vid_gl20", 1, 1);
@@ -184,11 +186,9 @@ void XonoticEffectsSettingsTab_fill(entity me)
                        e.savedValue = 0.5; // default
                me.TD(me, 1, 2, s);
        me.TR(me);
-               s = makeXonoticSlider(0.1, 1, 0.1, "r_damageblur");
-               me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, s, _("Damage blur:")));
-               if(s.value != e.savedValue)
-                       e.savedValue = 0.4; // default
-               me.TD(me, 1, 2, s);
+               e = makeXonoticCheckBoxEx(0.5, 0, "hud_postprocessing_maxbluralpha", _("Blur and sharpen postprocessing"));
+               makeMulti(e, "hud_powerup");
+               me.TD(me, 1, 2, e);
        
        me.gotoRC(me, me.rows - 1, 0);
                me.TD(me, 1, me.columns, makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "vid_restart", COMMANDBUTTON_APPLY));
index 81eb68e39232bd09e078bcf9d9bb7d1990be6290..7364e24524b5523f3e2f3d558340f46f900a056e 100644 (file)
@@ -14,40 +14,108 @@ ENDCLASS(XonoticSingleplayerDialog)
 
 void InstantAction_LoadMap(entity btn, entity dummy)
 {
-       float glob, i, n, fh;
-       string s;
-       glob = search_begin("maps/*.instantaction", TRUE, TRUE);
-       if(glob < 0)
-               return;
-       i = ceil(random() * search_getsize(glob)) - 1;
-       fh = fopen(search_getfilename(glob, i), FILE_READ);
-       search_end(glob);
-       if(fh < 0)
-               return;
-       while((s = fgets(fh)))
+       float pmin, pmax, pstep;
+
+       cvar_set("timelimit_override", "10");
+       cvar_set("g_lms_lives_override", "9");
+
+       if(random() < 0.4) // 40% are DM
+       {
+               MapInfo_SwitchGameType(MAPINFO_TYPE_DEATHMATCH);
+               pmin = 2;
+               pmax = 8;
+               pstep = 1;
+       }
+       else if(random() < 0.5) // half of the remaining 60%, i.e. 30%, are CTF
+       {
+               MapInfo_SwitchGameType(MAPINFO_TYPE_CTF);
+               pmin = 4;
+               pmax = 12;
+               pstep = 2;
+       }
+       else if(random() < 0.5) // half of the remaining 30%, i.e. 15%, are TDM
+       {
+               MapInfo_SwitchGameType(MAPINFO_TYPE_TEAM_DEATHMATCH);
+               pmin = 4;
+               pmax = 8;
+               pstep = 2;
+       }
+       else if(random() < 0.666) // 2/3 of the remaining 15%, i.e. 10%, are KH
        {
-               if(substring(s, 0, 4) == "set ")
-                       s = substring(s, 4, strlen(s) - 4);
-               n = tokenize_console(s);
-               if(argv(0) == "bot_number")
-                       cvar_set("bot_number", argv(1));
-               else if(argv(0) == "skill")
-                       cvar_set("skill", argv(1));
-               else if(argv(0) == "timelimit")
-                       cvar_set("timelimit_override", argv(1));
-               else if(argv(0) == "fraglimit")
-                       cvar_set("fraglimit_override", argv(1));
-               else if(argv(0) == "changelevel")
+               MapInfo_SwitchGameType(MAPINFO_TYPE_KEYHUNT);
+               pmin = 6;
+               pmax = 6;
+               pstep = 6; // works both for 2 and 3 teams
+               // TODO find team count of map, set pstep=2 or 3, and use 2v2(v2) games at least
+       }
+       else // somehow distribute the remaining 5%
+       {
+               float r;
+               r = floor(random() * 5);
+               switch(r)
                {
-                       fclose(fh);
-                       localcmd("\nmenu_loadmap_prepare\n");
-                       MapInfo_SwitchGameType(MAPINFO_TYPE_DEATHMATCH);
-                       MapInfo_LoadMap(argv(1));
-                       cvar_set("lastlevel", "1");
-                       return;
+                       default:
+                       case 0:
+                               MapInfo_SwitchGameType(MAPINFO_TYPE_LMS);
+                               pmin = 2;
+                               pmax = 6;
+                               pstep = 1;
+                               cvar_set("timelimit_override", "-1");
+                               break;
+                       case 1:
+                               MapInfo_SwitchGameType(MAPINFO_TYPE_CA);
+                               pmin = 2;
+                               pmax = 8;
+                               pstep = 2;
+                               break;
+                       case 2:
+                               MapInfo_SwitchGameType(MAPINFO_TYPE_DOMINATION);
+                               pmin = 2;
+                               pmax = 8;
+                               pstep = 2;
+                               break;
+                       case 3:
+                               MapInfo_SwitchGameType(MAPINFO_TYPE_ONSLAUGHT);
+                               pmin = 6;
+                               pmax = 16;
+                               pstep = 2;
+                               break;
+                       case 4:
+                               MapInfo_SwitchGameType(MAPINFO_TYPE_FREEZETAG);
+                               pmin = 4;
+                               pmax = 10;
+                               pstep = 2;
+                               break;
+                       case 5:
+                               MapInfo_SwitchGameType(MAPINFO_TYPE_ASSAULT);
+                               pmin = 4;
+                               pmax = 16;
+                               pstep = 2;
+                               break;
                }
        }
-       fclose(fh);
+
+       // find random map
+       MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 0);
+       string s;
+       do
+       {
+               float m;
+               m = floor(random() * MapInfo_count);
+               s = MapInfo_BSPName_ByID(m);
+       }
+       while(!fexists(sprintf("maps/%s.waypoints", s)));
+       MapInfo_LoadMap(s);
+
+       // configure bots
+       float p;
+       pmin = pstep * ceil(pmin / pstep);
+       pmax = pstep * floor(pmax / pstep);
+       p = pmin + pstep * floor(random() * ((pmax - pmin) / pstep + 1));
+       cvar_set("bot_number", ftos(p - 1));
+
+       // make sure we go back to menu
+       cvar_set("lastlevel", "1");
 }
 
 void XonoticSingleplayerDialog_fill(entity me)
index f4a6c5a3e3dc40adbefdaf5d4eb1f7a75b94be4a..754135bb21b9b98e9bcc341ce63836a29a964e6c 100644 (file)
@@ -70,6 +70,17 @@ entity makeXonoticKeyBinder()
        me.configureXonoticKeyBinder(me);
        return me;
 }
+void replace_bind(string from, string to)
+{
+       float n, j, k;
+       n = tokenize(findkeysforcommand(from)); // uses '...' strings
+       for(j = 0; j < n; ++j)
+       {
+               k = stof(argv(j));
+               if(k != -1)
+                       localcmd("\nbind \"", keynumtostring(k), "\" \"", to, "\"\n");
+       }
+}
 void XonoticKeyBinder_configureXonoticKeyBinder(entity me)
 {
        me.configureXonoticListBox(me);
@@ -77,6 +88,18 @@ void XonoticKeyBinder_configureXonoticKeyBinder(entity me)
                Xonotic_KeyBinds_Read();
        me.nItems = Xonotic_KeyBinds_Count;
        me.setSelected(me, 0);
+
+       // TEMP: Xonotic 0.1 to later
+       replace_bind("impulse 1", "weapon_group_1");
+       replace_bind("impulse 2", "weapon_group_2");
+       replace_bind("impulse 3", "weapon_group_3");
+       replace_bind("impulse 4", "weapon_group_4");
+       replace_bind("impulse 5", "weapon_group_5");
+       replace_bind("impulse 6", "weapon_group_6");
+       replace_bind("impulse 7", "weapon_group_7");
+       replace_bind("impulse 8", "weapon_group_8");
+       replace_bind("impulse 9", "weapon_group_9");
+       replace_bind("impulse 14", "weapon_group_0");
 }
 void XonoticKeyBinder_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
 {
index feec5a9b92595baa6cbbdc808ae926a3ea3a2793..55d496047138cf23ec68b55251db14e8658d17d9 100644 (file)
@@ -118,6 +118,10 @@ void MainWindow_configureMainWindow(entity me)
        i.configureDialog(i);
        me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
 
+       i = spawnXonoticHUDCenterprintDialog();
+       i.configureDialog(i);
+       me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
+
        me.advancedDialog = i = spawnXonoticAdvancedDialog();
        i.configureDialog(i);
        me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z);
index 69757126b4c2a83fdd945f8eba0fd1b041544e0c..9ce298082c2fca2f236ba1ea987ebe001005a1f4 100644 (file)
@@ -189,7 +189,7 @@ void XonoticMapList_drawListBoxItem(entity me, float i, vector absSize, float is
        draw_Picture(me.columnPreviewOrigin * eX, strcat("/maps/", MapInfo_Map_bspname), me.columnPreviewSize * eX + eY, '1 1 1', theAlpha);
        if(included)
                draw_Picture(me.checkMarkOrigin, "checkmark", me.checkMarkSize, '1 1 1', 1);
-       s = draw_TextShortenToWidth(strcat(MapInfo_Map_bspname, ": ", MapInfo_Map_title), me.columnNameSize, 0, me.realFontSize);
+       s = draw_TextShortenToWidth(MapInfo_Map_titlestring, me.columnNameSize, 0, me.realFontSize);
        draw_Text(me.realUpperMargin1 * eY + (me.columnNameOrigin + 0.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, SKINCOLOR_MAPLIST_TITLE, theAlpha, 0);
        s = draw_TextShortenToWidth(MapInfo_Map_author, me.columnNameSize, 0,  me.realFontSize);
        draw_Text(me.realUpperMargin2 * eY + (me.columnNameOrigin + 1.00 * (me.columnNameSize - draw_TextWidth(s, 0, me.realFontSize))) * eX, s, me.realFontSize, SKINCOLOR_MAPLIST_AUTHOR, theAlpha, 0);
@@ -242,7 +242,7 @@ void MapList_All(entity btn, entity me)
 {
        float i;
        string s;
-       MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, MAPINFO_FLAG_FORBIDDEN, 0); // all
+       MapInfo_FilterGametype(MAPINFO_TYPE_ALL, 0, 0, MAPINFO_FLAG_FORBIDDEN | MAPINFO_FLAG_HIDDEN, 0); // all
        s = "";
        for(i = 0; i < MapInfo_count; ++i)
                s = strcat(s, " ", MapInfo_BSPName_ByID(i));
index 8544276bb2a73cdc50bd580d15a5a34e28550f92..0bcee6a192352148b2465207a753392e2f14de4e 100644 (file)
@@ -469,8 +469,8 @@ float updateCompression()
        float have_dds, have_jpg, have_tga;
        float can_dds;
        have_dds = (fexists("dds/particles/particlefont.dds"));
-       have_dds = (fexists("particles/particlefont.jpg"));
-       have_dds = (fexists("particles/particlefont.tga"));
+       have_jpg = (fexists("particles/particlefont.jpg"));
+       have_tga = (fexists("particles/particlefont.tga"));
        can_dds = GL_Have_TextureCompression();
        if(have_dds && (have_jpg || have_tga))
        {
@@ -478,8 +478,12 @@ float updateCompression()
                // but ONLY if we actually support it!
                if(can_dds)
                {
+                       // these builds are meant to have GOOD quality, so let's not compress non-skinframes
                        cvar_set("gl_texturecompression", "0");
                        return 1;
+
+                       //cvar_set("gl_texturecompression", cvar_string("r_texture_dds_load"));
+                       //return 2;
                }
                else
                {
diff --git a/qcsrc/qc-client.cbp b/qcsrc/qc-client.cbp
deleted file mode 100644 (file)
index 056b98e..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<CodeBlocks_project_file>
-       <FileVersion major="1" minor="6" />
-       <Project>
-               <Option title="qc-client" />
-               <Option makefile="client" />
-               <Option makefile_is_custom="1" />
-               <Option pch_mode="2" />
-               <Option compiler="qaukec" />
-               <Build>
-                       <Target title="Debug">
-                               <Option output="bin\Debug\qc-server" prefix_auto="1" extension_auto="1" />
-                               <Option object_output="obj\Debug\" />
-                               <Option type="1" />
-                               <Option compiler="qaukec" />
-                               <Compiler>
-                                       <Add option="-g" />
-                               </Compiler>
-                               <MakeCommands>
-                                       <Build command="$make -src $makefile" />
-                                       <CompileFile command="" />
-                                       <Clean command="" />
-                                       <DistClean command="" />
-                               </MakeCommands>
-                       </Target>
-                       <Target title="Release">
-                               <Option output="bin\Release\qc-server" prefix_auto="1" extension_auto="1" />
-                               <Option object_output="obj\Release\" />
-                               <Option type="1" />
-                               <Option compiler="qaukec" />
-                               <Compiler>
-                                       <Add option="-O2" />
-                               </Compiler>
-                               <Linker>
-                                       <Add option="-s" />
-                               </Linker>
-                               <MakeCommands>
-                                       <Build command="$make -src $makefile" />
-                                       <CompileFile command="" />
-                                       <Clean command="" />
-                                       <DistClean command="" />
-                               </MakeCommands>
-                       </Target>
-               </Build>
-               <Compiler>
-                       <Add option="-Wall" />
-               </Compiler>
-               <Unit filename="client\Defs.qc" />
-               <Unit filename="client\Main.qc" />
-               <Unit filename="client\View.qc" />
-               <Unit filename="client\autocvars.qh" />
-               <Unit filename="client\bgmscript.qc" />
-               <Unit filename="client\bgmscript.qh" />
-               <Unit filename="client\casings.qc" />
-               <Unit filename="client\csqc_builtins.qc" />
-               <Unit filename="client\csqc_constants.qc" />
-               <Unit filename="client\ctf.qc" />
-               <Unit filename="client\damage.qc" />
-               <Unit filename="client\effects.qc" />
-               <Unit filename="client\gibs.qc" />
-               <Unit filename="client\hook.qc" />
-               <Unit filename="client\interpolate.qc" />
-               <Unit filename="client\interpolate.qh" />
-               <Unit filename="client\laser.qc" />
-               <Unit filename="client\main.qh" />
-               <Unit filename="client\mapvoting.qc" />
-               <Unit filename="client\miscfunctions.qc" />
-               <Unit filename="client\modeleffects.qc" />
-               <Unit filename="client\movetypes.qc" />
-               <Unit filename="client\movetypes.qh" />
-               <Unit filename="client\particles.qc" />
-               <Unit filename="client\prandom.qc" />
-               <Unit filename="client\prandom.qh" />
-               <Unit filename="client\pre.qh" />
-               <Unit filename="client\progs.src" />
-               <Unit filename="client\projectile.qc" />
-               <Unit filename="client\rubble.qc" />
-               <Unit filename="client\sbar.qc" />
-               <Unit filename="client\sortlist.qc" />
-               <Unit filename="client\teamplay.qc" />
-               <Unit filename="client\teamradar.qc" />
-               <Unit filename="client\teamradar.qh" />
-               <Unit filename="client\tuba.qc" />
-               <Unit filename="client\wall.qc" />
-               <Unit filename="client\waypointsprites.qc" />
-               <Unit filename="client\waypointsprites.qh" />
-               <Extensions>
-                       <code_completion />
-                       <debugger />
-               </Extensions>
-       </Project>
-</CodeBlocks_project_file>
diff --git a/qcsrc/qc-common.cbp b/qcsrc/qc-common.cbp
deleted file mode 100644 (file)
index 95f1ba8..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<CodeBlocks_project_file>
-       <FileVersion major="1" minor="6" />
-       <Project>
-               <Option title="qc-common" />
-               <Option makefile="none" />
-               <Option makefile_is_custom="1" />
-               <Option pch_mode="2" />
-               <Option compiler="qaukec" />
-               <Build>
-                       <Target title="Debug">
-                               <Option output="bin\Debug\qc-server" prefix_auto="1" extension_auto="1" />
-                               <Option object_output="obj\Debug\" />
-                               <Option type="1" />
-                               <Option compiler="qaukec" />
-                               <Compiler>
-                                       <Add option="-g" />
-                               </Compiler>
-                               <MakeCommands>
-                                       <Build command="$make -src $makefile" />
-                                       <CompileFile command="" />
-                                       <Clean command="" />
-                                       <DistClean command="" />
-                               </MakeCommands>
-                       </Target>
-                       <Target title="Release">
-                               <Option output="bin\Release\qc-server" prefix_auto="1" extension_auto="1" />
-                               <Option object_output="obj\Release\" />
-                               <Option type="1" />
-                               <Option compiler="qaukec" />
-                               <Compiler>
-                                       <Add option="-O2" />
-                               </Compiler>
-                               <Linker>
-                                       <Add option="-s" />
-                               </Linker>
-                               <MakeCommands>
-                                       <Build command="$make -src $makefile" />
-                                       <CompileFile command="" />
-                                       <Clean command="" />
-                                       <DistClean command="" />
-                               </MakeCommands>
-                       </Target>
-               </Build>
-               <Compiler>
-                       <Add option="-Wall" />
-               </Compiler>
-               <Unit filename="common\campaign_common.qh" />
-               <Unit filename="common\campaign_file.qc" />
-               <Unit filename="common\campaign_setup.qc" />
-               <Unit filename="common\constants.qh" />
-               <Unit filename="common\gamecommand.qc" />
-               <Unit filename="common\items.qc" />
-               <Unit filename="common\items.qh" />
-               <Unit filename="common\mapinfo.qc" />
-               <Unit filename="common\mapinfo.qh" />
-               <Unit filename="common\util-pre.qh" />
-               <Unit filename="common\util.qc" />
-               <Unit filename="common\util.qh" />
-               <Extensions>
-                       <code_completion />
-                       <debugger />
-               </Extensions>
-       </Project>
-</CodeBlocks_project_file>
diff --git a/qcsrc/qc-server.cbp b/qcsrc/qc-server.cbp
deleted file mode 100644 (file)
index eaa30d2..0000000
+++ /dev/null
@@ -1,213 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<CodeBlocks_project_file>
-       <FileVersion major="1" minor="6" />
-       <Project>
-               <Option title="qc-server" />
-               <Option makefile="server/" />
-               <Option makefile_is_custom="1" />
-               <Option pch_mode="2" />
-               <Option compiler="qaukec" />
-               <Build>
-                       <Target title="Debug">
-                               <Option output="bin\Debug\qc-server" prefix_auto="1" extension_auto="1" />
-                               <Option object_output="obj\Debug\" />
-                               <Option type="1" />
-                               <Option compiler="qaukec" />
-                               <Compiler>
-                                       <Add option="-g" />
-                               </Compiler>
-                               <MakeCommands>
-                                       <Build command="$make -DVEHICLES_ENABLED -DRELEASE -src $makefile" />
-                                       <CompileFile command="" />
-                                       <Clean command="" />
-                                       <DistClean command="" />
-                               </MakeCommands>
-                       </Target>
-                       <Target title="Release">
-                               <Option output="bin\Release\qc-server" prefix_auto="1" extension_auto="1" />
-                               <Option object_output="obj\Release\" />
-                               <Option type="1" />
-                               <Option compiler="qaukec" />
-                               <Compiler>
-                                       <Add option="-O2" />
-                               </Compiler>
-                               <Linker>
-                                       <Add option="-s" />
-                               </Linker>
-                               <MakeCommands>
-                                       <Build command="$make -DVEHICLES_ENABLED -DRELEASE -src $makefile" />
-                                       <CompileFile command="" />
-                                       <Clean command="" />
-                                       <DistClean command="" />
-                               </MakeCommands>
-                       </Target>
-               </Build>
-               <Compiler>
-                       <Add option="-Wall" />
-               </Compiler>
-               <Unit filename="anticheat.qc" />
-               <Unit filename="anticheat.qh" />
-               <Unit filename="antilag.qc" />
-               <Unit filename="antilag.qh" />
-               <Unit filename="arena.qc" />
-               <Unit filename="assault.qc" />
-               <Unit filename="bot\aim.qc" />
-               <Unit filename="bot\aim.qh" />
-               <Unit filename="bot\bot.qc" />
-               <Unit filename="bot\bot.qh" />
-               <Unit filename="bot\havocbot\havocbot.qc" />
-               <Unit filename="bot\havocbot\havocbot.qh" />
-               <Unit filename="bot\havocbot\role_ctf.qc" />
-               <Unit filename="bot\havocbot\role_keyhunt.qc" />
-               <Unit filename="bot\havocbot\role_onslaught.qc" />
-               <Unit filename="bot\havocbot\roles.qc" />
-               <Unit filename="bot\navigation.qc" />
-               <Unit filename="bot\navigation.qh" />
-               <Unit filename="bot\scripting.qc" />
-               <Unit filename="bot\waypoints.qc" />
-               <Unit filename="bot\waypoints.qh" />
-               <Unit filename="builtins.qh" />
-               <Unit filename="campaign.qc" />
-               <Unit filename="campaign.qh" />
-               <Unit filename="cheats.qc" />
-               <Unit filename="cheats.qh" />
-               <Unit filename="cl_client.qc" />
-               <Unit filename="cl_impulse.qc" />
-               <Unit filename="cl_physics.qc" />
-               <Unit filename="cl_player.qc" />
-               <Unit filename="cl_weapons.qc" />
-               <Unit filename="cl_weaponsystem.qc" />
-               <Unit filename="clientcommands.qc" />
-               <Unit filename="constants.qh" />
-               <Unit filename="csqceffects.qc" />
-               <Unit filename="csqcprojectile.qc" />
-               <Unit filename="csqcprojectile.qh" />
-               <Unit filename="ctf.qc" />
-               <Unit filename="defs.qh" />
-               <Unit filename="domination.qc" />
-               <Unit filename="ent_cs.qc" />
-               <Unit filename="extensions.qh" />
-               <Unit filename="func_breakable.qc" />
-               <Unit filename="g_casings.qc" />
-               <Unit filename="g_damage.qc" />
-               <Unit filename="g_hook.qc" />
-               <Unit filename="g_hook.qh" />
-               <Unit filename="g_lights.qc" />
-               <Unit filename="g_models.qc" />
-               <Unit filename="g_subs.qc" />
-               <Unit filename="g_swamp.qc" />
-               <Unit filename="g_tetris.qc" />
-               <Unit filename="g_triggers.qc" />
-               <Unit filename="g_violence.qc" />
-               <Unit filename="g_world.qc" />
-               <Unit filename="gamecommand.qc" />
-               <Unit filename="ipban.qc" />
-               <Unit filename="ipban.qh" />
-               <Unit filename="miscfunctions.qc" />
-               <Unit filename="mode_onslaught.qc" />
-               <Unit filename="monsters\ai.qc" />
-               <Unit filename="monsters\defs.qc" />
-               <Unit filename="monsters\fight.qc" />
-               <Unit filename="monsters\m_monsters.qc" />
-               <Unit filename="monsters\mode_management.qc" />
-               <Unit filename="monsters\monster_zombie.qc" />
-               <Unit filename="movelib.qc" />
-               <Unit filename="mutators\base.qc" />
-               <Unit filename="mutators\base.qh" />
-               <Unit filename="mutators\gamemode_keyhunt.qc" />
-               <Unit filename="mutators\gamemode_keyhunt.qh" />
-               <Unit filename="mutators\mutator_dodging.qc" />
-               <Unit filename="mutators\mutator_dodging.qh" />
-               <Unit filename="mutators\mutator_nix.qc" />
-               <Unit filename="mutators\mutators.qh" />
-               <Unit filename="nexball.qc" />
-               <Unit filename="pathlib.qc" />
-               <Unit filename="pathlib\costs.qc" />
-               <Unit filename="pathlib\debug.qc" />
-               <Unit filename="pathlib\expandnode.qc" />
-               <Unit filename="pathlib\main.qc" />
-               <Unit filename="pathlib\movenode.qc" />
-               <Unit filename="pathlib\pathlib.qh" />
-               <Unit filename="pathlib\utility.qc" />
-               <Unit filename="playerdemo.qc" />
-               <Unit filename="playerdemo.qh" />
-               <Unit filename="portals.qc" />
-               <Unit filename="portals.qh" />
-               <Unit filename="post-builtins.qh" />
-               <Unit filename="pre-builtins.qh" />
-               <Unit filename="progs.src" />
-               <Unit filename="race.qc" />
-               <Unit filename="race.qh" />
-               <Unit filename="runematch.qc" />
-               <Unit filename="scores.qc" />
-               <Unit filename="scores.qh" />
-               <Unit filename="scores_rules.qc" />
-               <Unit filename="steerlib.qc" />
-               <Unit filename="sv_main.qc" />
-               <Unit filename="sv_stats.qc" />
-               <Unit filename="sys.qh" />
-               <Unit filename="t_halflife.qc" />
-               <Unit filename="t_items.qc" />
-               <Unit filename="t_jumppads.qc" />
-               <Unit filename="t_plats.qc" />
-               <Unit filename="t_quake.qc" />
-               <Unit filename="t_quake3.qc" />
-               <Unit filename="t_swamp.qc" />
-               <Unit filename="t_teleporters.qc" />
-               <Unit filename="target_spawn.qc" />
-               <Unit filename="teamplay.qc" />
-               <Unit filename="tturrets\include\turrets.qh" />
-               <Unit filename="tturrets\include\turrets_early.qh" />
-               <Unit filename="tturrets\system\system_aimprocs.qc" />
-               <Unit filename="tturrets\system\system_damage.qc" />
-               <Unit filename="tturrets\system\system_main.qc" />
-               <Unit filename="tturrets\system\system_misc.qc" />
-               <Unit filename="tturrets\system\system_scoreprocs.qc" />
-               <Unit filename="tturrets\units\unit_checkpoint.qc" />
-               <Unit filename="tturrets\units\unit_common.qc" />
-               <Unit filename="tturrets\units\unit_ewheel.qc" />
-               <Unit filename="tturrets\units\unit_flac.qc" />
-               <Unit filename="tturrets\units\unit_fusionreactor.qc" />
-               <Unit filename="tturrets\units\unit_hellion.qc" />
-               <Unit filename="tturrets\units\unit_hk.qc" />
-               <Unit filename="tturrets\units\unit_machinegun.qc" />
-               <Unit filename="tturrets\units\unit_mlrs.qc" />
-               <Unit filename="tturrets\units\unit_phaser.qc" />
-               <Unit filename="tturrets\units\unit_plasma.qc" />
-               <Unit filename="tturrets\units\unit_targettrigger.qc" />
-               <Unit filename="tturrets\units\unit_tessla.qc" />
-               <Unit filename="tturrets\units\unit_walker.qc" />
-               <Unit filename="vehicles\racer.qc" />
-               <Unit filename="vehicles\raptor.qc" />
-               <Unit filename="vehicles\spiderbot.qc" />
-               <Unit filename="vehicles\vehicles.qc" />
-               <Unit filename="vehicles\vehicles.qh" />
-               <Unit filename="verbstack.qc" />
-               <Unit filename="vote.qc" />
-               <Unit filename="vote.qh" />
-               <Unit filename="w_all.qc" />
-               <Unit filename="w_campingrifle.qc" />
-               <Unit filename="w_common.qc" />
-               <Unit filename="w_crylink.qc" />
-               <Unit filename="w_electro.qc" />
-               <Unit filename="w_fireball.qc" />
-               <Unit filename="w_grenadelauncher.qc" />
-               <Unit filename="w_minelayer.qc" />
-               <Unit filename="w_hagar.qc" />
-               <Unit filename="w_hlac.qc" />
-               <Unit filename="w_hook.qc" />
-               <Unit filename="w_laser.qc" />
-               <Unit filename="w_minstanex.qc" />
-               <Unit filename="w_nex.qc" />
-               <Unit filename="w_porto.qc" />
-               <Unit filename="w_rocketlauncher.qc" />
-               <Unit filename="w_shotgun.qc" />
-               <Unit filename="w_tuba.qc" />
-               <Unit filename="w_uzi.qc" />
-               <Unit filename="waypointsprites.qc" />
-               <Extensions>
-                       <code_completion />
-                       <debugger />
-               </Extensions>
-       </Project>
-</CodeBlocks_project_file>
index 4d63fd82002dcb9ea176cfabdedd43f3d4bd5db1..de6b52752b95b358503e9fdd1a846377bd4f6bc6 100644 (file)
@@ -1,8 +1,7 @@
-.entity accuracy;
 .float accuracy_hit[WEP_MAXCOUNT];
 .float accuracy_fired[WEP_MAXCOUNT];
-FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(accuracy_hit);
-FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(accuracy_fired);
+.float accuracy_cnt_hit[WEP_MAXCOUNT];
+.float accuracy_cnt_fired[WEP_MAXCOUNT];
 
 float accuracy_byte(float n, float d)
 {
@@ -74,6 +73,11 @@ void accuracy_set(entity e, float w, float fired, float hit)
        b = accuracy_byte(a.(accuracy_hit[w]), a.(accuracy_fired[w]));
        a.(accuracy_hit[w]) = hit;
        a.(accuracy_fired[w]) = fired;
+
+    if(hit)
+        a.(accuracy_cnt_hit[w]) = 1;
+    a.(accuracy_cnt_fired[w]) = 1;
+
        if(b == accuracy_byte(hit, fired))
                return;
        w = pow(2, w);
@@ -84,6 +88,9 @@ void accuracy_set(entity e, float w, float fired, float hit)
                                a.SendFlags |= w;
 }
 
+.float hit_time;
+.float fired_time;
+
 void accuracy_add(entity e, float w, float fired, float hit)
 {
        entity a;
@@ -97,6 +104,19 @@ void accuracy_add(entity e, float w, float fired, float hit)
                a.(accuracy_hit[w]) += hit;
        if(fired)
                a.(accuracy_fired[w]) += fired;
+
+    if(hit && a.hit_time != time) // only run this once per frame
+    {
+        a.(accuracy_cnt_hit[w]) += 1;
+        a.hit_time = time;
+    }
+
+    if(fired && a.fired_time != time) // only run this once per frame
+    {
+        a.(accuracy_cnt_fired[w]) += 1;
+        a.fired_time = time;
+    }
+
        if(b == accuracy_byte(a.(accuracy_hit[w]), a.(accuracy_fired[w])))
                return;
        w = pow(2, w);
index a58ccb2a54dbb3061519b37ef40c60ba92ad6609..587b1ec54cef0cac9c4be7447d1961d89c67a974 100644 (file)
@@ -8,7 +8,6 @@ float arena_roundbased;
 entity spawnqueue_first;
 entity spawnqueue_last;
 entity champion;
-string champion_name;
 float warmup;
 float ca_players;
 float required_ca_players;
@@ -70,10 +69,7 @@ void reset_map(float dorespawn)
                        self.team = self.team_saved;
 
                if(self.flags & FL_PROJECTILE) // remove any projectiles left
-               {
-                       stopsound(self, CHAN_PAIN);
                        remove(self);
-               }
        }
 
        // Waypoints and assault start come LAST
@@ -137,7 +133,7 @@ void reset_map(float dorespawn)
        }
 
        if(g_keyhunt)
-               kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_round+(game_starttime - time), "", kh_StartRound);
+               kh_Controller_SetThink_NoMsg(autocvar_g_balance_keyhunt_delay_round+(game_starttime - time), kh_StartRound);
 
        if(g_arena)
        if(champion && champion.classname == "player" && player_count > 1)
@@ -207,15 +203,12 @@ float roundStartTime_prev; // prevent networkspam
 void Arena_Warmup()
 {
        float f;
-       string msg;
     entity e;
 
        if((!g_arena && !g_ca && !g_freezetag) || (g_arena && !arena_roundbased) || (time < game_starttime))
                return;
 
        f = ceil(warmup - time);
-       if(f > 0)
-               champion = world; // this is done because a if(champion) will not execute if champion = world
 
        allowed_to_spawn = 0;
 
@@ -224,18 +217,17 @@ void Arena_Warmup()
        if(ca_players < required_ca_players)
                allowed_to_spawn = 1;
 
-       msg = NEWLINES;
        if(time < warmup && !inWarmupStage)
        {
                if (g_ca)
                        allowed_to_spawn = 1;
                if(champion && g_arena)
-                       msg = strcat("The Champion is ", champion_name, "^7\n");
-                       //centerprint(self, strcat(msg, "The Champion is ", champion.netname, "^7\n"));
+               {
+                       FOR_EACH_PLAYER(e)
+                               centerprint(e, strcat("The Champion is ", champion.netname));
+               }
 
                if(f != roundStartTime_prev) {
-                       msg = strcat(msg, "Round will start in ", ftos(f),"\n");
-                       //centerprint(self, strcat("Round will start in ", ftos(f),"\n"));
                        roundStartTime_prev = f;
                        if(f == 5)
                                Announce("prepareforbattle");
@@ -246,8 +238,8 @@ void Arena_Warmup()
                        else if(f == 1)
                                Announce("1");
 
-            FOR_EACH_PLAYER(e)
-                centerprint(e, msg);
+                       FOR_EACH_PLAYER(e)
+                               Send_CSQC_Centerprint_Generic(e, CPID_ROUND_STARTING, "Round will start in %d", 1, f);
                }
 
                if (g_arena) {
@@ -257,15 +249,14 @@ void Arena_Warmup()
                        self.velocity = '0 0 0';
                        self.avelocity = '0 0 0';
                        self.movement = '0 0 0';
-                       //self.fixangle = TRUE;
                }
        }
-
        else if(f > -1 && f != roundStartTime_prev)
        {
                roundStartTime_prev = f;
                Announce("begin");
-               centerprint(self, "^1Begin!\n");
+               FOR_EACH_PLAYER(e)
+                       Send_CSQC_Centerprint_Generic(e, CPID_ROUND_STARTING, "^1Begin!", 1, 0);
 
                if(g_ca) {
                        ca_players = 0;
@@ -276,7 +267,12 @@ void Arena_Warmup()
 
         if(self.classname == "player" && self.health > 0 && self.movetype == MOVETYPE_NONE)
             self.movetype = MOVETYPE_WALK;
+
        }
+
+       // clear champion to avoid centerprinting again the champion msg
+       if (champion)
+               champion = world;
 }
 
 void count_spawned_players()
@@ -375,6 +371,7 @@ void count_alive_players()
  *
  * Gets called in StartFrame()
  */
+float warntime;
 void Spawnqueue_Check()
 {
        count_spawned_players();
@@ -392,20 +389,20 @@ void Spawnqueue_Check()
                        reset_map(TRUE);
                }
                else if(ca_players < required_ca_players) {
-                       FOR_EACH_PLAYER(self)
-                               centerprint(self, strcat("^1Need at least 1 player in each team to play CA", "^7\n"));
+                       if (time > warntime)
+                       {
+                               FOR_EACH_PLAYER(self)
+                                       Send_CSQC_Centerprint_Generic(self, CPID_ROUND_STARTING, "^1Need at least 1 player in each team to play CA", 2, 0);
+                               warntime = time + 1;
+                       }
                        return;
                }
                else if(!next_round) {
                        if((redspawned && !bluespawned) || (bluespawned && !redspawned)) {
                                next_round = time + 5;
-                               champion = find(world, classname, "player");
-                               if(champion_name)
-                                       strunzone(champion_name);
-                               champion_name = strzone(champion.netname);
                        }
                        else if((!redspawned && !bluespawned) || time - warmup > autocvar_g_ca_round_timelimit) {
-                               FOR_EACH_CLIENT(self) centerprint(self, strcat("^7Round tied.", "^7\n"));
+                               FOR_EACH_CLIENT(self) centerprint(self, "^7Round tied");
                                next_round = time + 5;
                        }
 
@@ -415,14 +412,14 @@ void Spawnqueue_Check()
                        if(redalive && !bluealive)
                        {
                                play2all("ctf/red_capture.wav");
-                               FOR_EACH_CLIENT(self) centerprint(self, "^1 RED ^7team wins the round.\n");
+                               FOR_EACH_CLIENT(self) centerprint(self, "^1RED ^7team wins the round");
                                TeamScore_AddToTeam(COLOR_TEAM1, ST_SCORE, +1);
                                stopalivecheck = TRUE;
                        }
                        else if(bluealive && !redalive)
                        {
                                play2all("ctf/blue_capture.wav");
-                               FOR_EACH_CLIENT(self) centerprint(self, "^4 BLUE ^7team wins the round.\n");
+                               FOR_EACH_CLIENT(self) centerprint(self, "^4BLUE ^7team wins the round");
                                TeamScore_AddToTeam(COLOR_TEAM2, ST_SCORE, +1);
                                stopalivecheck = TRUE;
                        }
index 05b2cc750232e5fbc65a5136decf6d524c864fee..517da81684928019729e385b6feb244b32963021 100644 (file)
@@ -30,9 +30,6 @@ void assault_objective_reset() {
 }
 
 void assault_objective_use() {
-       if(other.classname == "info_player_deathmatch") // a spawn, a spawn
-               return;
-
        // activate objective
        self.health = 100;
        //print("^2Activated objective ", self.targetname, "=", etos(self), "\n");
@@ -106,7 +103,7 @@ void assault_objective_decrease_use() {
                                                centerprint(player, s);
                                        }
                                }
-                                       
+
                                oldactivator = activator;
                                activator = oldself;
                                        SUB_UseTargets();
@@ -158,7 +155,7 @@ void target_objective_decrease_activate()
                                ent.sprite = world;
                }
 
-               spr = WaypointSprite_SpawnFixed("<placeholder>", 0.5 * (ent.absmin + ent.absmax), ent, assault_sprite);
+               spr = WaypointSprite_SpawnFixed("<placeholder>", 0.5 * (ent.absmin + ent.absmax), ent, assault_sprite, RADARICON_OBJECTIVE, '1 0.5 0');
                spr.assault_decreaser = self;
                spr.waypointsprite_visible_for_player = assault_decreaser_sprite_visible;
                spr.classname = "sprite_waypoint";
@@ -172,7 +169,6 @@ void target_objective_decrease_activate()
                }
                else
                        WaypointSprite_UpdateSprites(spr, "as-defend", "as-push", "as-push");
-               WaypointSprite_UpdateTeamRadar(spr, RADARICON_OBJECTIVE, '1 0.5 0');
        }
 }
 
@@ -211,6 +207,7 @@ void spawnfunc_func_assault_destructible() {
                return;
        }
        self.spawnflags = 3;
+       self.classname = "func_assault_destructible";
        if(assault_attacker_team == COLOR_TEAM1) {
                self.team = COLOR_TEAM2;
        } else {
@@ -275,7 +272,7 @@ void assault_roundstart_use() {
        activator = self;
        SUB_UseTargets();
 
-       
+
 #ifdef TTURRETS_ENABLED
        entity ent, oldself;
 
@@ -317,9 +314,31 @@ void spawnfunc_target_assault_roundstart() {
 
 // trigger new round
 // reset objectives, toggle spawnpoints, reset triggers, ...
-void assault_new_round() {
+void vehicles_clearrturn();
+void vehicles_spawn();
+void assault_new_round()
+{
+    entity oldself;
        //bprint("ASSAULT: new round\n");
 
+       oldself = self;
+       // Eject players from vehicles
+    FOR_EACH_PLAYER(self)
+    {
+        if(self.vehicle)
+            vehicles_exit(VHEF_RELESE);
+    }
+
+    self = findchainflags(vehicle_flags, VHF_ISVEHICLE);
+    while(self)
+    {
+        vehicles_clearrturn();
+        vehicles_spawn();
+        self = self.chain;
+    }
+
+    self = oldself;
+
        // up round counter
        self.winning = self.winning + 1;
 
index dd1a484b1523317d94ec53947b4c096185921570..401dd079799e65073460a46e2bf0d2ac9b0b0cfa 100644 (file)
@@ -85,39 +85,39 @@ float autocvar_g_balance_armor_rot;
 float autocvar_g_balance_armor_rotlinear;
 float autocvar_g_balance_armor_rotstable;
 float autocvar_g_balance_armor_start;
-float autocvar_g_balance_sniperrifle_bursttime;
-float autocvar_g_balance_sniperrifle_primary_ammo;
-float autocvar_g_balance_sniperrifle_primary_animtime;
-float autocvar_g_balance_sniperrifle_primary_bulletconstant;
-float autocvar_g_balance_sniperrifle_primary_bullethail;
-float autocvar_g_balance_sniperrifle_primary_burstcost;
-float autocvar_g_balance_sniperrifle_primary_damage;
-float autocvar_g_balance_sniperrifle_primary_force;
-float autocvar_g_balance_sniperrifle_primary_headshotaddeddamage;
-float autocvar_g_balance_sniperrifle_primary_lifetime;
-float autocvar_g_balance_sniperrifle_primary_refire;
-float autocvar_g_balance_sniperrifle_primary_shots;
-float autocvar_g_balance_sniperrifle_primary_speed;
-float autocvar_g_balance_sniperrifle_primary_spread;
-float autocvar_g_balance_sniperrifle_primary_tracer;
-float autocvar_g_balance_sniperrifle_secondary;
-float autocvar_g_balance_sniperrifle_secondary_ammo;
-float autocvar_g_balance_sniperrifle_secondary_animtime;
-float autocvar_g_balance_sniperrifle_secondary_bulletconstant;
-float autocvar_g_balance_sniperrifle_secondary_bullethail;
-float autocvar_g_balance_sniperrifle_secondary_burstcost;
-float autocvar_g_balance_sniperrifle_secondary_damage;
-float autocvar_g_balance_sniperrifle_secondary_force;
-float autocvar_g_balance_sniperrifle_secondary_headshotaddeddamage;
-float autocvar_g_balance_sniperrifle_secondary_lifetime;
-float autocvar_g_balance_sniperrifle_secondary_reload;
-float autocvar_g_balance_sniperrifle_secondary_refire;
-float autocvar_g_balance_sniperrifle_secondary_shots;
-float autocvar_g_balance_sniperrifle_secondary_speed;
-float autocvar_g_balance_sniperrifle_secondary_spread;
-float autocvar_g_balance_sniperrifle_secondary_tracer;
-float autocvar_g_balance_sniperrifle_reload_ammo;
-float autocvar_g_balance_sniperrifle_reload_time;
+float autocvar_g_balance_rifle_bursttime;
+float autocvar_g_balance_rifle_primary_ammo;
+float autocvar_g_balance_rifle_primary_animtime;
+float autocvar_g_balance_rifle_primary_bulletconstant;
+float autocvar_g_balance_rifle_primary_bullethail;
+float autocvar_g_balance_rifle_primary_burstcost;
+float autocvar_g_balance_rifle_primary_damage;
+float autocvar_g_balance_rifle_primary_force;
+float autocvar_g_balance_rifle_primary_headshotaddeddamage;
+float autocvar_g_balance_rifle_primary_lifetime;
+float autocvar_g_balance_rifle_primary_refire;
+float autocvar_g_balance_rifle_primary_shots;
+float autocvar_g_balance_rifle_primary_speed;
+float autocvar_g_balance_rifle_primary_spread;
+float autocvar_g_balance_rifle_primary_tracer;
+float autocvar_g_balance_rifle_secondary;
+float autocvar_g_balance_rifle_secondary_ammo;
+float autocvar_g_balance_rifle_secondary_animtime;
+float autocvar_g_balance_rifle_secondary_bulletconstant;
+float autocvar_g_balance_rifle_secondary_bullethail;
+float autocvar_g_balance_rifle_secondary_burstcost;
+float autocvar_g_balance_rifle_secondary_damage;
+float autocvar_g_balance_rifle_secondary_force;
+float autocvar_g_balance_rifle_secondary_headshotaddeddamage;
+float autocvar_g_balance_rifle_secondary_lifetime;
+float autocvar_g_balance_rifle_secondary_reload;
+float autocvar_g_balance_rifle_secondary_refire;
+float autocvar_g_balance_rifle_secondary_shots;
+float autocvar_g_balance_rifle_secondary_speed;
+float autocvar_g_balance_rifle_secondary_spread;
+float autocvar_g_balance_rifle_secondary_tracer;
+float autocvar_g_balance_rifle_reload_ammo;
+float autocvar_g_balance_rifle_reload_time;
 float autocvar_g_balance_cloaked_alpha;
 float autocvar_g_balance_crylink_primary_ammo;
 float autocvar_g_balance_crylink_primary_animtime;
@@ -289,7 +289,7 @@ float autocvar_g_balance_grenadelauncher_primary_edgedamage;
 float autocvar_g_balance_grenadelauncher_primary_force;
 float autocvar_g_balance_grenadelauncher_primary_health;
 float autocvar_g_balance_grenadelauncher_primary_lifetime;
-float autocvar_g_balance_grenadelauncher_primary_lifetime2;
+float autocvar_g_balance_grenadelauncher_primary_lifetime_stick;
 float autocvar_g_balance_grenadelauncher_primary_radius;
 float autocvar_g_balance_grenadelauncher_primary_refire;
 float autocvar_g_balance_grenadelauncher_primary_remote_minbouncecnt;
@@ -304,7 +304,8 @@ float autocvar_g_balance_grenadelauncher_secondary_edgedamage;
 float autocvar_g_balance_grenadelauncher_secondary_force;
 float autocvar_g_balance_grenadelauncher_secondary_health;
 float autocvar_g_balance_grenadelauncher_secondary_lifetime;
-float autocvar_g_balance_grenadelauncher_secondary_lifetime2;
+float autocvar_g_balance_grenadelauncher_secondary_lifetime_bounce;
+float autocvar_g_balance_grenadelauncher_secondary_lifetime_stick;
 float autocvar_g_balance_grenadelauncher_secondary_radius;
 float autocvar_g_balance_grenadelauncher_secondary_refire;
 float autocvar_g_balance_grenadelauncher_secondary_speed;
@@ -393,7 +394,6 @@ float autocvar_g_balance_hook_secondary_refire;
 float autocvar_g_balance_hook_secondary_speed;
 float autocvar_g_balance_keyhunt_damageforcescale;
 float autocvar_g_balance_keyhunt_delay_collect;
-float autocvar_g_balance_keyhunt_delay_drop;
 float autocvar_g_balance_keyhunt_delay_return;
 float autocvar_g_balance_keyhunt_delay_round;
 float autocvar_g_balance_keyhunt_delay_tracking;
@@ -1010,69 +1010,12 @@ float autocvar_g_turrets_unit_walker_std_rocket_speed;
 float autocvar_g_turrets_unit_walker_std_rocket_turnrate;
 float autocvar_g_turrets_unit_walker_std_rockets_range;
 float autocvar_g_turrets_unit_walker_std_rockets_range_min;
+float autocvar_g_turrets_unit_walker_turn;
+float autocvar_g_turrets_unit_walker_turn_walk;
+float autocvar_g_turrets_unit_walker_turn_run;
+float autocvar_g_turrets_unit_walker_turn_strafe;
+float autocvar_g_turrets_unit_walker_turn_swim;
 float autocvar_g_use_ammunition;
-float autocvar_g_vehicle_racer_afterburn_cost;
-float autocvar_g_vehicle_racer_anglestabilizer;
-float autocvar_g_vehicle_racer_downforce;
-float autocvar_g_vehicle_racer_energy;
-float autocvar_g_vehicle_racer_energy_usepause;
-float autocvar_g_vehicle_racer_health;
-float autocvar_g_vehicle_racer_laser_cost;
-float autocvar_g_vehicle_racer_laser_damage;
-float autocvar_g_vehicle_racer_laser_radius;
-float autocvar_g_vehicle_racer_laser_refire;
-float autocvar_g_vehicle_racer_laser_speed;
-float autocvar_g_vehicle_racer_pitchspeed;
-float autocvar_g_vehicle_racer_power_air;
-float autocvar_g_vehicle_racer_power_min;
-float autocvar_g_vehicle_racer_power_solid;
-float autocvar_g_vehicle_racer_reload;
-float autocvar_g_vehicle_racer_respawntime;
-float autocvar_g_vehicle_racer_rocket_accel;
-float autocvar_g_vehicle_racer_rocket_damage;
-float autocvar_g_vehicle_racer_rocket_radius;
-float autocvar_g_vehicle_racer_rocket_refire;
-float autocvar_g_vehicle_racer_rocket_speed;
-float autocvar_g_vehicle_racer_rocket_turnrate;
-float autocvar_g_vehicle_racer_shield;
-float autocvar_g_vehicle_racer_speed_afterburn;
-float autocvar_g_vehicle_racer_speed_forward;
-float autocvar_g_vehicle_racer_speed_strafe;
-float autocvar_g_vehicle_racer_springlength;
-float autocvar_g_vehicle_racer_turnroll;
-float autocvar_g_vehicle_racer_turnspeed;
-float autocvar_g_vehicle_raptor_reload;
-float autocvar_g_vehicle_spiderbot_crush_dmg;
-float autocvar_g_vehicle_spiderbot_crush_force;
-float autocvar_g_vehicle_spiderbot_head_pitchlimit_down;
-float autocvar_g_vehicle_spiderbot_head_pitchlimit_up;
-float autocvar_g_vehicle_spiderbot_head_pitchspeed;
-float autocvar_g_vehicle_spiderbot_head_turnlimit;
-float autocvar_g_vehicle_spiderbot_head_turnspeed;
-float autocvar_g_vehicle_spiderbot_health;
-float autocvar_g_vehicle_spiderbot_minigun_cooldown;
-float autocvar_g_vehicle_spiderbot_minigun_damage;
-float autocvar_g_vehicle_spiderbot_minigun_heat;
-float autocvar_g_vehicle_spiderbot_minigun_refire;
-float autocvar_g_vehicle_spiderbot_minigun_spread;
-float autocvar_g_vehicle_spiderbot_movement_inertia;
-float autocvar_g_vehicle_spiderbot_respawntime;
-float autocvar_g_vehicle_spiderbot_rocket_damage;
-float autocvar_g_vehicle_spiderbot_rocket_edgedamage;
-float autocvar_g_vehicle_spiderbot_rocket_force;
-float autocvar_g_vehicle_spiderbot_rocket_health;
-float autocvar_g_vehicle_spiderbot_rocket_lifetime;
-float autocvar_g_vehicle_spiderbot_rocket_noise;
-float autocvar_g_vehicle_spiderbot_rocket_radius;
-float autocvar_g_vehicle_spiderbot_rocket_refire;
-float autocvar_g_vehicle_spiderbot_rocket_reload;
-float autocvar_g_vehicle_spiderbot_rocket_speed;
-float autocvar_g_vehicle_spiderbot_rocket_turnrate;
-float autocvar_g_vehicle_spiderbot_shield;
-float autocvar_g_vehicle_spiderbot_speed_stop;
-float autocvar_g_vehicle_spiderbot_speed_strafe;
-float autocvar_g_vehicle_spiderbot_speed_walk;
-float autocvar_g_vehicle_spiderbot_turnspeed;
 float autocvar_g_waypointeditor;
 float autocvar_g_waypoints_for_items;
 float autocvar_g_waypointsprite_deadlifetime;
@@ -1247,3 +1190,4 @@ float autocvar_waypoint_benchmark;
 float autocvar_welcome_message_time;
 float autocvar_sv_gameplayfix_gravityunaffectedbyticrate;
 float autocvar_g_trueaim_minrange;
+float autocvar_g_debug_defaultsounds;
index 9ef109e2b585e3c76053c7b183fbc49da22543ff..b678bf1b660de2a9920d29ebc5e8af7a2ef554ab 100644 (file)
@@ -1,4 +1,5 @@
 
+entity ka_ball;
 // traces multiple trajectories to find one that will impact the target
 // 'end' vector is the place it aims for,
 // returns TRUE only if it hit targ (don't target non-solid entities)
@@ -6,7 +7,7 @@
 float findtrajectorywithleading(vector org, vector m1, vector m2, entity targ, float shotspeed, float shotspeedupward, float maxtime, float shotdelay, entity ignore)
 {
        local float c, savesolid, shottime;
-       local vector dir, end, v;
+       local vector dir, end, v, o;
        if (shotspeed < 1)
                return FALSE; // could cause division by zero if calculated
        if (targ.solid < SOLID_BBOX) // SOLID_NOT and SOLID_TRIGGER
@@ -17,9 +18,10 @@ float findtrajectorywithleading(vector org, vector m1, vector m2, entity targ, f
        setsize(tracetossent, m1, m2);
        savesolid = targ.solid;
        targ.solid = SOLID_NOT;
-       shottime = ((vlen(targ.origin - org) / shotspeed) + shotdelay);
-       v = targ.velocity * shottime + targ.origin;
-       tracebox(targ.origin, targ.mins, targ.maxs, v, FALSE, targ);
+       o = (targ.absmin + targ.absmax) * 0.5;
+       shottime = ((vlen(o - org) / shotspeed) + shotdelay);
+       v = targ.velocity * shottime + o;
+       tracebox(o, targ.mins, targ.maxs, v, FALSE, targ);
        v = trace_endpos;
        end = v + (targ.mins + targ.maxs) * 0.5;
        if ((vlen(end - org) / shotspeed + 0.2) > maxtime)
@@ -104,7 +106,7 @@ float bot_shouldattack(entity e)
        {
                if (e == self)
                        return FALSE;
-               if (teams_matter)
+               if (teamplay)
                if (e.team != 0)
                        return FALSE;
        }
@@ -113,7 +115,13 @@ float bot_shouldattack(entity e)
                if(e.freezetag_frozen)
                        return FALSE;
 
-       if(teams_matter)
+       // If neither player has ball then don't attack unless the ball is on the
+       // ground.
+       if (g_keepaway)
+               if (!e.ballcarried && !self.ballcarried && ka_ball.owner)
+                       return FALSE;
+
+       if(teamplay)
        {
                if(e.team==0)
                        return FALSE;
@@ -312,7 +320,7 @@ vector bot_shotlead(vector targorigin, vector targvelocity, float shotspeed, flo
 
 float bot_aim(float shotspeed, float shotspeedupward, float maxshottime, float applygravity)
 {
-       local float f, r;
+       local float f, r, hf, distanceratio;
        local vector v;
        /*
        eprint(self);
@@ -322,6 +330,10 @@ float bot_aim(float shotspeed, float shotspeedupward, float maxshottime, float a
        dprint(", ", ftos(applygravity));
        dprint(");\n");
        */
+
+       hf = self.dphitcontentsmask;
+       self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
+
        shotspeed *= g_weaponspeedfactor;
        shotspeedupward *= g_weaponspeedfactor;
        if (!shotspeed)
@@ -338,15 +350,18 @@ float bot_aim(float shotspeed, float shotspeedupward, float maxshottime, float a
        shotorg = self.origin + self.view_ofs;
        shotdir = v_forward;
        v = bot_shotlead(self.bot_aimtargorigin, self.bot_aimtargvelocity, shotspeed, self.bot_aimlatency);
-       local float distanceratio;
-       distanceratio =sqrt(bound(0,skill,10000))*0.3*(vlen(v-shotorg)-100)/autocvar_bot_ai_aimskill_firetolerance_distdegrees;
+       distanceratio = sqrt(bound(0,skill,10000))*0.3*(vlen(v-shotorg)-100)/autocvar_bot_ai_aimskill_firetolerance_distdegrees;
        distanceratio = bound(0,distanceratio,1);
        r =  (autocvar_bot_ai_aimskill_firetolerance_maxdegrees-autocvar_bot_ai_aimskill_firetolerance_mindegrees)
                * (1-distanceratio) + autocvar_bot_ai_aimskill_firetolerance_mindegrees;
        if (applygravity && self.bot_aimtarg)
        {
                if (!findtrajectorywithleading(shotorg, '0 0 0', '0 0 0', self.bot_aimtarg, shotspeed, shotspeedupward, maxshottime, 0, self))
+               {
+                       self.dphitcontentsmask = hf;
                        return FALSE;
+               }
+
                f = bot_aimdir(findtrajectory_velocity - shotspeedupward * '0 0 1', r);
        }
        else
@@ -362,10 +377,14 @@ float bot_aim(float shotspeed, float shotspeedupward, float maxshottime, float a
                if (trace_fraction < 1)
                if (trace_ent != self.enemy)
                if (!bot_shouldattack(trace_ent))
+               {
+                       self.dphitcontentsmask = hf;
                        return FALSE;
+               }
        }
 
        //if (r > maxshottime * shotspeed)
        //      return FALSE;
+       self.dphitcontentsmask = hf;
        return TRUE;
 };
index 8be71a3cf09f1f1dadbec0069f10099ebadd22d9..351625bb555cef6c001bd02508161691158a9051 100644 (file)
@@ -453,7 +453,7 @@ void bot_removenewest()
        local float besttime;
        local entity best, head;
 
-       if(teams_matter)
+       if(teamplay)
        {
                bot_removefromlargestteam();
                return;
@@ -529,6 +529,14 @@ void autoskill(float factor)
                head.totalfrags_lastcheck = head.totalfrags;
 }
 
+void bot_calculate_stepheightvec(void)
+{
+       stepheightvec = autocvar_sv_stepheight * '0 0 1';
+       jumpstepheightvec = stepheightvec +
+               ((autocvar_sv_jumpvelocity * autocvar_sv_jumpvelocity) / (2 * autocvar_sv_gravity)) * '0 0 0.85';
+               // 0.75 factor is for safety to make the jumps easy
+}
+
 void bot_serverframe()
 {
        float realplayers, bots, activerealplayers;
@@ -540,7 +548,7 @@ void bot_serverframe()
        if (time < 2)
                return;
 
-       stepheightvec = autocvar_sv_stepheight * '0 0 1';
+       bot_calculate_stepheightvec();
        bot_navigation_movemode = ((autocvar_bot_navigation_ignoreplayers) ? MOVE_NOMONSTERS : MOVE_NORMAL);
 
        if(time > autoskill_nextthink)
@@ -567,7 +575,7 @@ void bot_serverframe()
        // But don't remove bots immediately on level change, as the real players
        // usually haven't rejoined yet
        bots_would_leave = FALSE;
-       if (teams_matter && autocvar_bot_vs_human && (c3==-1 && c4==-1))
+       if (teamplay && autocvar_bot_vs_human && (c3==-1 && c4==-1))
                bots = min(ceil(fabs(autocvar_bot_vs_human) * activerealplayers), maxclients - realplayers);
        else if ((realplayers || autocvar_bot_join_empty || (currentbots > 0 && time < 5)))
        {
index 55f3250ee167294272ed9464c3d6657b23bcdda1..6823841d9bc91aa7d998369782b884d4721f2212 100644 (file)
@@ -114,3 +114,5 @@ void() havocbot_setupbot;
 float c1, c2, c3, c4;
 void CheckAllowedTeams(entity for_whom); void GetTeamCounts(entity other);
 float JoinBestTeam(entity pl, float only_return_best, float forcebestteam);
+
+void bot_calculate_stepheightvec(void);
index 708ae9452e82ce1ceb40ec28643dc8c1f8556619..113d318506b456d478aa3b7ab62701ba0347cb05 100644 (file)
@@ -2,6 +2,9 @@
 #include "role_ctf.qc"
 #include "role_onslaught.qc"
 #include "role_keyhunt.qc"
+#include "role_freezetag.qc"
+#include "role_keepaway.qc"
+#include "role_assault.qc"
 #include "roles.qc"
 
 void havocbot_ai()
@@ -118,7 +121,7 @@ void havocbot_ai()
 
                local vector now,v,next;//,heading;
                local float aimdistance,skillblend,distanceblend,blend;
-               next = now = self.goalcurrent.origin - (self.origin + self.view_ofs);
+               next = now = ( (self.goalcurrent.absmin + self.goalcurrent.absmax) * 0.5) - (self.origin + self.view_ofs);
                aimdistance = vlen(now);
                //heading = self.velocity;
                //dprint(self.goalstack01.classname,etos(self.goalstack01),"\n");
@@ -126,7 +129,7 @@ void havocbot_ai()
                        self.goalstack01 != self && self.goalstack01 != world && self.aistatus & AI_STATUS_RUNNING == 0 &&
                        !(self.goalcurrent.wpflags & WAYPOINTFLAG_TELEPORT)
                )
-                       next = self.goalstack01.origin - (self.origin + self.view_ofs);
+                       next = ((self.goalstack01.absmin + self.goalstack01.absmax) * 0.5) - (self.origin + self.view_ofs);
 
                skillblend=bound(0,(skill+self.bot_moveskill-2.5)*0.5,1); //lower skill player can't preturn
                distanceblend=bound(0,aimdistance/autocvar_bot_ai_keyboard_distance,1);
@@ -252,6 +255,7 @@ void havocbot_bunnyhop(vector dir)
        local float bunnyhopdistance;
        local vector deviation;
        local float maxspeed;
+       vector gco, gno;
 
        if(autocvar_g_midair)
                return;
@@ -259,7 +263,7 @@ void havocbot_bunnyhop(vector dir)
        // Don't jump when using some weapons
        /*
        if(self.aistatus & AI_STATUS_ATTACKING)
-       if(self.weapon == WEP_SNIPERRIFLE)
+       if(self.weapon == WEP_RIFLE)
                return;
 
        if(self.goalcurrent.classname == "player")
@@ -289,7 +293,8 @@ void havocbot_bunnyhop(vector dir)
                self.bot_timelastseengoal = 0;
        }
 
-       bunnyhopdistance = vlen(self.origin - self.goalcurrent.origin);
+       gco = (self.goalcurrent.absmin + self.goalcurrent.absmax) * 0.5;
+       bunnyhopdistance = vlen(self.origin - gco);
 
        // Run only to visible goals
        if(self.flags & FL_ONGROUND)
@@ -322,18 +327,19 @@ void havocbot_bunnyhop(vector dir)
                                        if(self.aistatus & AI_STATUS_ROAMING)
                                        if(self.goalcurrent.classname=="waypoint")
                                        if not(self.goalcurrent.wpflags & WAYPOINTFLAG_PERSONAL)
-                                       if(fabs(self.goalcurrent.origin_z - self.origin_z) < self.maxs_z - self.mins_z)
+                                       if(fabs(gco_z - self.origin_z) < self.maxs_z - self.mins_z)
                                        if(self.goalstack01!=world)
                                        {
-                                               deviation = vectoangles(self.goalstack01.origin - self.origin) - vectoangles(self.goalcurrent.origin - self.origin);
+                                               gno = (self.goalstack01.absmin + self.goalstack01.absmax) * 0.5;
+                                               deviation = vectoangles(gno - self.origin) - vectoangles(gco - self.origin);
                                                while (deviation_y < -180) deviation_y = deviation_y + 360;
                                                while (deviation_y > 180) deviation_y = deviation_y - 360;
 
                                                if(fabs(deviation_y) < 20)
-                                               if(bunnyhopdistance < vlen(self.origin - self.goalstack01.origin))
-                                               if(fabs(self.goalstack01.origin_z - self.goalcurrent.origin_z) < self.maxs_z - self.mins_z)
+                                               if(bunnyhopdistance < vlen(self.origin - gno))
+                                               if(fabs(gno_z - gco_z) < self.maxs_z - self.mins_z)
                                                {
-                                                       if(vlen(self.goalcurrent.origin - self.goalstack01.origin) > autocvar_bot_ai_bunnyhop_startdistance)
+                                                       if(vlen(gco - gno) > autocvar_bot_ai_bunnyhop_startdistance)
                                                        if(checkpvs(self.origin + self.view_ofs, self.goalstack01))
                                                        {
                                                                checkdistance = FALSE;
@@ -403,6 +409,7 @@ void havocbot_movetogoal()
        local vector evadelava;
        local float s;
        local float maxspeed;
+       local vector gco;
        //local float dist;
        local vector dodge;
        //if (self.goalentity)
@@ -441,7 +448,7 @@ void havocbot_movetogoal()
                        float db, v, d;
                        vector dxy;
 
-                       dxy = self.origin - self.goalcurrent.origin; dxy_z = 0;
+                       dxy = self.origin - ( ( self.goalcurrent.absmin + self.goalcurrent.absmax ) * 0.5 ); dxy_z = 0;
                        d = vlen(dxy);
                        v = vlen(self.velocity -  self.velocity_z * '0 0 1');
                        db = (pow(v,2) / (autocvar_g_jetpack_acceleration_side * 2)) + 100;
@@ -482,7 +489,7 @@ void havocbot_movetogoal()
        // Handling of jump pads
        if(self.jumppadcount)
        {
-               // If got stuck on the jump pad try to reach the farthest visible item
+               // If got stuck on the jump pad try to reach the farthest visible waypoint
                if(self.aistatus & AI_STATUS_OUT_JUMPPAD)
                {
                        if(fabs(self.velocity_z)<50)
@@ -490,16 +497,14 @@ void havocbot_movetogoal()
                                local entity head, newgoal;
                                local float distance, bestdistance;
 
-                               for (head = findchainfloat(bot_pickup, TRUE); head; head = head.chain)
+                               for (head = findchain(classname, "waypoint"); head; head = head.chain)
                                {
-                                       if(head.classname=="worldspawn")
-                                               continue;
 
                                        distance = vlen(head.origin - self.origin);
                                        if(distance>1000)
                                                continue;
 
-                                       traceline(self.origin + self.view_ofs , head.origin, TRUE, world);
+                                       traceline(self.origin + self.view_ofs , ( ( head.absmin + head.absmax ) * 0.5 ), TRUE, world);
 
                                        if(trace_fraction<1)
                                                continue;
@@ -527,11 +532,13 @@ void havocbot_movetogoal()
                {
                        if(self.velocity_z>0)
                        {
-                               local float threshold;
+                               float threshold, sxy;
+                               vector velxy = self.velocity; velxy_z = 0;
+                               sxy = vlen(velxy);
                                threshold = maxspeed * 0.2;
-                               if(fabs(self.velocity_x) < threshold  &&  fabs(self.velocity_y) < threshold)
+                               if(sxy < threshold)
                                {
-                                       dprint("Warning: ", self.netname, " got stuck on a jumppad, trying to get out of it now\n");
+                                       dprint("Warning: ", self.netname, " got stuck on a jumppad (velocity in xy is ", ftos(sxy), "), trying to get out of it now\n");
                                        self.aistatus |= AI_STATUS_OUT_JUMPPAD;
                                }
                                return;
@@ -569,7 +576,7 @@ void havocbot_movetogoal()
                        if(self.goalcurrent==world)
                                dir = v_forward;
                        else
-                               dir = normalize(self.goalcurrent.origin - self.origin);
+                               dir = normalize(( ( self.goalcurrent.absmin + self.goalcurrent.absmax ) * 0.5 ) - self.origin);
 
                        local vector xyvelocity = self.velocity; xyvelocity_z = 0;
                        local float xyspeed = xyvelocity * dir;
@@ -654,6 +661,7 @@ void havocbot_movetogoal()
                return;
        }
 
+
        if(autocvar_bot_debug_goalstack)
                debuggoalstack();
 
@@ -668,6 +676,7 @@ void havocbot_movetogoal()
        dir = normalize(diff);
        flatdir = diff;flatdir_z = 0;
        flatdir = normalize(flatdir);
+       gco = (self.goalcurrent.absmin + self.goalcurrent.absmax) * 0.5;
 
        //if (self.bot_dodgevector_time < time)
        {
@@ -685,7 +694,7 @@ void havocbot_movetogoal()
                        }
                        else
                        {
-                               if(self.velocity_z >= 0 && !(self.watertype == CONTENT_WATER && self.goalcurrent.origin_z < self.origin_z) &&
+                               if(self.velocity_z >= 0 && !(self.watertype == CONTENT_WATER && gco_z < self.origin_z) &&
                                        ( !(self.waterlevel == WATERLEVEL_WETFEET && self.watertype == CONTENT_WATER) || self.aistatus & AI_STATUS_OUT_WATER))
                                        self.BUTTON_JUMP = TRUE;
                                else
@@ -706,12 +715,12 @@ void havocbot_movetogoal()
                        if (trace_plane_normal_z < 0.7)
                        {
                                s = trace_fraction;
-                               tracebox(self.origin + '0 0 16', self.mins, self.maxs, self.origin + self.velocity * 0.2 + '0 0 16', FALSE, self);
+                               tracebox(self.origin + stepheightvec, self.mins, self.maxs, self.origin + self.velocity * 0.2 + stepheightvec, FALSE, self);
                                if (trace_fraction < s + 0.01)
                                if (trace_plane_normal_z < 0.7)
                                {
                                        s = trace_fraction;
-                                       tracebox(self.origin + '0 0 48', self.mins, self.maxs, self.origin + self.velocity * 0.2 + '0 0 48', FALSE, self);
+                                       tracebox(self.origin + jumpstepheightvec, self.mins, self.maxs, self.origin + self.velocity * 0.2 + jumpstepheightvec, FALSE, self);
                                        if (trace_fraction > s)
                                                self.BUTTON_JUMP = 1;
                                }
@@ -781,7 +790,11 @@ void havocbot_movetogoal()
                                                {
                                                        // Remove dangerous dynamic goals from stack
                                                        if (self.goalcurrent.classname == "player" || self.goalcurrent.classname == "droppedweapon")
+                                                       {
                                                                navigation_poproute();
+                                                               if(self.goalcurrent)
+                                                                       gco = (self.goalcurrent.absmin + self.goalcurrent.absmax) * 0.5;
+                                                       }
                                                        // try to stop
                                                        flatdir = '0 0 0';
                                                        evadeobstacle = normalize(self.velocity) * -1;
@@ -802,7 +815,7 @@ void havocbot_movetogoal()
                dodge = havocbot_dodge();
                dodge = dodge * bound(0,0.5+(skill+self.bot_dodgeskill)*0.1,1);
                evadelava = evadelava * bound(1,3-(skill+self.bot_dodgeskill),3); //Noobs fear lava a lot and take more distance from it
-               traceline(self.origin, self.enemy.origin, TRUE, world);
+               traceline(self.origin, ( ( self.enemy.absmin + self.enemy.absmax ) * 0.5 ), TRUE, world);
                if(trace_ent.classname == "player")
                        dir = dir * bound(0,(skill+self.bot_dodgeskill)/7,1);
 
@@ -850,7 +863,7 @@ void havocbot_movetogoal()
 void havocbot_chooseenemy()
 {
        local entity head, best, head2;
-       local float rating, bestrating, i, f;
+       local float rating, bestrating, i, hf;
        local vector eye, v;
        if (autocvar_bot_nofire || IS_INDEPENDENT_PLAYER(self))
        {
@@ -872,9 +885,9 @@ void havocbot_chooseenemy()
                        // and not really really far away
                        // and we're not severely injured
                        // then keep tracking for a half second into the future
-                       traceline(self.origin+self.view_ofs, self.enemy.origin+self.enemy.view_ofs*0.5,FALSE,world);
+                       traceline(self.origin+self.view_ofs, ( self.enemy.absmin + self.enemy.absmax ) * 0.5,FALSE,world);
                        if (trace_ent == self.enemy || trace_fraction == 1)
-                       if (vlen(self.enemy.origin - self.origin) < 1000)
+                       if (vlen((( self.enemy.absmin + self.enemy.absmax ) * 0.5) - self.origin) < 1000)
                        if (self.health > 30)
                        {
                                // remain tracking him for a shot while (case he went after a small corner or pilar
@@ -895,7 +908,13 @@ void havocbot_chooseenemy()
        bestrating = 100000000;
        head = head2 = findchainfloat(bot_attack, TRUE);
 
+       // Backup hit flags
+       hf = self.dphitcontentsmask;
+
        // Search for enemies, if no enemy can be seen directly try to look through transparent objects
+
+       self.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
+
        for(;;)
        {
                while (head)
@@ -918,22 +937,20 @@ void havocbot_chooseenemy()
 
                // I want to do a second scan if no enemy was found or I don't have weapons
                // TODO: Perform the scan when using the rifle (requires changes on the rifle code)
-               if(best || self.weapons) // || self.weapon == WEP_SNIPERRIFLE
+               if(best || self.weapons) // || self.weapon == WEP_RIFLE
                        break;
                if(i)
                        break;
 
                // Set flags to see through transparent objects
-               f = self.dphitcontentsmask;
-               self.dphitcontentsmask = DPCONTENTS_OPAQUE;
+               self.dphitcontentsmask |= DPCONTENTS_OPAQUE;
 
                head = head2;
                ++i;
        }
 
-       // Restore hit flags if needed
-       if(i)
-               self.dphitcontentsmask = f;
+       // Restore hit flags
+       self.dphitcontentsmask = hf;
 
        self.enemy = best;
        self.havocbot_stickenemy = TRUE;
@@ -1082,10 +1099,10 @@ void havocbot_aim()
                enemyvel = self.enemy.velocity;
                if (!self.enemy.waterlevel)
                        enemyvel_z = 0;
-               lag_additem(time + self.ping, 0, 0, self.enemy, self.origin, selfvel, self.enemy.origin, enemyvel);
+               lag_additem(time + self.ping, 0, 0, self.enemy, self.origin, selfvel, (self.enemy.absmin + self.enemy.absmax) * 0.5, enemyvel);
        }
        else
-               lag_additem(time + self.ping, 0, 0, world, self.origin, selfvel, self.goalcurrent.origin, '0 0 0');
+               lag_additem(time + self.ping, 0, 0, world, self.origin, selfvel, ( self.goalcurrent.absmin + self.goalcurrent.absmax ) * 0.5, '0 0 0');
 };
 
 float havocbot_moveto_refresh_route()
@@ -1143,7 +1160,7 @@ float havocbot_moveto(vector pos)
                        debuggoalstack();
 
                // Heading
-               local vector dir = self.goalcurrent.origin - (self.origin + self.view_ofs);
+               local vector dir = ( ( self.goalcurrent.absmin + self.goalcurrent.absmax ) * 0.5 ) - (self.origin + self.view_ofs);
                dir_z = 0;
                bot_aimdir(dir, -1);
 
diff --git a/qcsrc/server/bot/havocbot/role_assault.qc b/qcsrc/server/bot/havocbot/role_assault.qc
new file mode 100644 (file)
index 0000000..5c0be47
--- /dev/null
@@ -0,0 +1,208 @@
+#define HAVOCBOT_AST_ROLE_NONE                 0
+#define HAVOCBOT_AST_ROLE_DEFENSE      2
+#define HAVOCBOT_AST_ROLE_OFFENSE      4
+
+.float havocbot_role_flags;
+.float havocbot_attack_time;
+
+.void() havocbot_role;
+.void() havocbot_previous_role;
+
+void() havocbot_role_ast_defense;
+void() havocbot_role_ast_offense;
+.entity havocbot_ast_target;
+
+void(entity bot) havocbot_ast_reset_role;
+
+void(float ratingscale, vector org, float sradius) havocbot_goalrating_items;
+void(float ratingscale, vector org, float sradius) havocbot_goalrating_enemyplayers;
+
+void havocbot_goalrating_ast_targets(float ratingscale)
+{
+       entity ad, best, pl, wp, tod;
+       float radius, found, bestvalue, c;
+       vector p;
+
+       ad = findchain(classname, "func_assault_destructible");
+
+       for (; ad; ad = ad.chain)
+       {
+               if (ad.target == "")
+                       continue;
+
+               if not(ad.bot_attack)
+                       continue;
+
+               found = FALSE;
+               for(tod = world; (tod = find(tod, targetname, ad.target)); )
+               {
+                       if(tod.classname == "target_objective_decrease")
+                       {
+                               if(tod.enemy.health > 0 && tod.enemy.health < ASSAULT_VALUE_INACTIVE)
+                               {
+                               //      dprint(etos(ad),"\n");
+                                       found = TRUE;
+                                       break;
+                               }
+                       }
+               }
+
+               if(!found)
+               {
+               ///     dprint("target not found\n");
+                       continue;
+               }
+               /// dprint("target #", etos(ad), " found\n");
+
+
+               p = 0.5 * (ad.absmin + ad.absmax);
+       //      dprint(vtos(ad.origin), " ", vtos(ad.absmin), " ", vtos(ad.absmax),"\n");
+       //      te_knightspike(p);
+       //      te_lightning2(world, '0 0 0', p);
+
+               // Find and rate waypoints around it
+               found = FALSE;
+               best = world;
+               bestvalue = 99999999999;
+               for(radius=0; radius<1500 && !found; radius+=500)
+               {
+                       for(wp=findradius(p, radius); wp; wp=wp.chain)
+                       {
+                               if(!(wp.wpflags & WAYPOINTFLAG_GENERATED))
+                               if(wp.classname=="waypoint")
+                               if(checkpvs(wp.origin, ad))
+                               {
+                                       found = TRUE;
+                                       if(wp.cnt<bestvalue)
+                                       {
+                                               best = wp;
+                                               bestvalue = wp.cnt;
+                                       }
+                               }
+                       }
+               }
+
+               if(best)
+               {
+               ///     dprint("waypoints around target were found\n");
+               //      te_lightning2(world, '0 0 0', best.origin);
+               //      te_knightspike(best.origin);
+
+                       navigation_routerating(best, ratingscale, 4000);
+                       best.cnt += 1;
+
+                       self.havocbot_attack_time = 0;
+
+                       if(checkpvs(self.view_ofs,ad))
+                       if(checkpvs(self.view_ofs,best))
+                       {
+                       //      dprint("increasing attack time for this target\n");
+                               self.havocbot_attack_time = time + 2;
+                       }
+               }
+       }
+}
+
+void havocbot_role_ast_offense()
+{
+       if(self.deadflag != DEAD_NO)
+       {
+               self.havocbot_attack_time = 0;
+               havocbot_ast_reset_role(self);
+               return;
+       }
+
+       // Set the role timeout if necessary
+       if (!self.havocbot_role_timeout)
+               self.havocbot_role_timeout = time + 120;
+
+       if (time > self.havocbot_role_timeout)
+       {
+               havocbot_ast_reset_role(self);
+               return;
+       }
+
+       if(self.havocbot_attack_time>time)
+               return;
+
+       if (self.bot_strategytime < time)
+       {
+               navigation_goalrating_start();
+               havocbot_goalrating_enemyplayers(20000, self.origin, 650);
+               havocbot_goalrating_ast_targets(20000);
+               havocbot_goalrating_items(15000, self.origin, 10000);
+               navigation_goalrating_end();
+
+               self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+       }
+};
+
+void havocbot_role_ast_defense()
+{
+       if(self.deadflag != DEAD_NO)
+       {
+               self.havocbot_attack_time = 0;
+               havocbot_ast_reset_role(self);
+               return;
+       }
+
+       // Set the role timeout if necessary
+       if (!self.havocbot_role_timeout)
+               self.havocbot_role_timeout = time + 120;
+
+       if (time > self.havocbot_role_timeout)
+       {
+               havocbot_ast_reset_role(self);
+               return;
+       }
+
+       if(self.havocbot_attack_time>time)
+               return;
+
+       if (self.bot_strategytime < time)
+       {
+               navigation_goalrating_start();
+               havocbot_goalrating_enemyplayers(20000, self.origin, 3000);
+               havocbot_goalrating_ast_targets(20000);
+               havocbot_goalrating_items(15000, self.origin, 10000);
+               navigation_goalrating_end();
+
+               self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+       }
+};
+
+void havocbot_role_ast_setrole(entity bot, float role)
+{
+       switch(role)
+       {
+               case HAVOCBOT_AST_ROLE_DEFENSE:
+                       bot.havocbot_role = havocbot_role_ast_defense;
+                       bot.havocbot_role_flags = HAVOCBOT_AST_ROLE_DEFENSE;
+                       bot.havocbot_role_timeout = 0;
+                       break;
+               case HAVOCBOT_AST_ROLE_OFFENSE:
+                       bot.havocbot_role = havocbot_role_ast_offense;
+                       bot.havocbot_role_flags = HAVOCBOT_AST_ROLE_OFFENSE;
+                       bot.havocbot_role_timeout = 0;
+                       break;
+       }
+};
+
+void havocbot_ast_reset_role(entity bot)
+{
+       local entity head;
+       local float c;
+
+       if(self.deadflag != DEAD_NO)
+               return;
+
+       if(bot.team==assault_attacker_team)
+               havocbot_role_ast_setrole(bot, HAVOCBOT_AST_ROLE_OFFENSE);
+       else
+               havocbot_role_ast_setrole(bot, HAVOCBOT_AST_ROLE_DEFENSE);
+};
+
+void havocbot_chooserole_ast()
+{
+       havocbot_ast_reset_role(self);
+};
index 0ec0abb3ce5c1427d7fb8140928bd65b75cb943a..f85f2ef64c3e8a0c0964d5d344eb6977ef1c300d 100644 (file)
@@ -57,7 +57,7 @@ entity havocbot_ctf_find_enemy_flag(entity bot)
 
 float havocbot_ctf_teamcount(entity bot, vector org, float radius)
 {
-       if not(teams_matter)
+       if not(teamplay)
                return 0;
 
        float c;
@@ -146,7 +146,8 @@ void havocbot_goalrating_ctf_ourstolenflag(float ratingscale)
        if(mf.cnt == FLAG_BASE)
                return;
 
-       navigation_routerating(mf, ratingscale, 10000);
+       if(mf.tag_entity)
+               navigation_routerating(mf.tag_entity, ratingscale, 10000);
 };
 
 void havocbot_goalrating_ctf_droppedflags(float ratingscale, vector org, float radius)
@@ -203,6 +204,7 @@ void havocbot_role_ctf_setrole(entity bot, float role)
                        bot.havocbot_role = havocbot_role_ctf_carrier;
                        bot.havocbot_role_timeout = 0;
                        bot.havocbot_cantfindflag = time + 10;
+                       bot.bot_strategytime = 0;
                        break;
                case HAVOCBOT_CTF_ROLE_DEFENSE:
                        dprint("defense");
@@ -224,12 +226,14 @@ void havocbot_role_ctf_setrole(entity bot, float role)
                        bot.havocbot_previous_role = bot.havocbot_role;
                        bot.havocbot_role = havocbot_role_ctf_retriever;
                        bot.havocbot_role_timeout = time + 10;
+                       bot.bot_strategytime = 0;
                        break;
                case HAVOCBOT_CTF_ROLE_ESCORT:
                        dprint("escort");
                        bot.havocbot_previous_role = bot.havocbot_role;
                        bot.havocbot_role = havocbot_role_ctf_escort;
                        bot.havocbot_role_timeout = time + 30;
+                       bot.bot_strategytime = 0;
                        break;
        }
        dprint("\n");
diff --git a/qcsrc/server/bot/havocbot/role_freezetag.qc b/qcsrc/server/bot/havocbot/role_freezetag.qc
new file mode 100644 (file)
index 0000000..c81d7d0
--- /dev/null
@@ -0,0 +1,109 @@
+void() havocbot_role_ft_freeing;
+void() havocbot_role_ft_offense;
+
+void havocbot_goalrating_freeplayers(float ratingscale, vector org, float sradius)
+{
+       local entity head;
+       float distance;
+
+       FOR_EACH_PLAYER(head)
+       {
+               if ((head != self) && (head.team == self.team))
+               {
+                       if (head.freezetag_frozen)
+                       {
+                               distance = vlen(head.origin - org);
+                               if (distance > sradius)
+                                       continue;
+                               navigation_routerating(head, ratingscale, 2000);
+                       }
+                       else
+                       {
+                               // If teamate is not frozen still seek them out as fight better
+                               // in a group.
+                               navigation_routerating(head, ratingscale/3, 2000);
+                       }
+               }
+       }
+};
+
+void havocbot_role_ft_offense()
+{
+       local entity head;
+       float unfrozen;
+
+       if(self.deadflag != DEAD_NO)
+               return;
+
+       if (!self.havocbot_role_timeout)
+               self.havocbot_role_timeout = time + random() * 10 + 20;
+
+       // Count how many players on team are unfrozen.
+       unfrozen = 0;
+       FOR_EACH_PLAYER(head)
+       {
+               if ((head.team == self.team) && (!head.freezetag_frozen))
+                       unfrozen++;
+       }
+
+       // If only one left on team or if role has timed out then start trying to free players.
+       if (((unfrozen == 0) && (!self.freezetag_frozen)) || (time > self.havocbot_role_timeout))
+       {
+               dprint("changing role to freeing\n");
+               self.havocbot_role = havocbot_role_ft_freeing;
+               self.havocbot_role_timeout = 0;
+               return;
+       }
+
+       if (time > self.bot_strategytime)
+       {
+               self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+
+               navigation_goalrating_start();
+               havocbot_goalrating_items(10000, self.origin, 10000);
+               havocbot_goalrating_enemyplayers(20000, self.origin, 10000);
+               havocbot_goalrating_freeplayers(9000, self.origin, 10000);
+               //havocbot_goalrating_waypoints(1, self.origin, 1000);
+               navigation_goalrating_end();
+       }
+};
+
+void havocbot_role_ft_freeing()
+{
+       if(self.deadflag != DEAD_NO)
+               return;
+
+       if (!self.havocbot_role_timeout)
+               self.havocbot_role_timeout = time + random() * 10 + 20;
+
+       if (time > self.havocbot_role_timeout)
+       {
+               dprint("changing role to offense\n");
+               self.havocbot_role = havocbot_role_ft_offense;
+               self.havocbot_role_timeout = 0;
+               return;
+       }
+
+       if (time > self.bot_strategytime)
+       {
+               self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+
+               navigation_goalrating_start();
+               havocbot_goalrating_items(8000, self.origin, 10000);
+               havocbot_goalrating_enemyplayers(10000, self.origin, 10000);
+               havocbot_goalrating_freeplayers(20000, self.origin, 10000);
+               //havocbot_goalrating_waypoints(1, self.origin, 1000);
+               navigation_goalrating_end();
+       }
+};
+
+void havocbot_chooserole_ft()
+{
+       if(self.deadflag != DEAD_NO)
+               return;
+
+       if (random() < 0.5)
+               self.havocbot_role = havocbot_role_ft_freeing;
+       else
+               self.havocbot_role = havocbot_role_ft_offense;
+};
diff --git a/qcsrc/server/bot/havocbot/role_keepaway.qc b/qcsrc/server/bot/havocbot/role_keepaway.qc
new file mode 100644 (file)
index 0000000..8ea23f1
--- /dev/null
@@ -0,0 +1,82 @@
+void() havocbot_role_ka_carrier;
+void() havocbot_role_ka_collector;
+void() havocbot_chooserole_ka;
+
+entity ka_ball;
+
+// Keepaway
+// If you don't have the ball, get it; if you do, kill people.
+
+void havocbot_goalrating_ball(float ratingscale, vector org)
+{
+       local float t;
+       local entity ball_owner;
+       ball_owner = ka_ball.owner;
+
+       if (ball_owner == self)
+               return;
+
+       // If ball is carried by player then hunt them down.
+       if (ball_owner)
+       {
+               t = (self.health + self.armorvalue) / (ball_owner.health + ball_owner.armorvalue);
+               navigation_routerating(ball_owner, t * ratingscale, 2000);
+       }
+
+       // Ball has been dropped so collect.
+       navigation_routerating(ka_ball, ratingscale, 2000);
+};
+
+void havocbot_role_ka_carrier()
+{
+       if (self.deadflag != DEAD_NO)
+               return;
+
+       if (time > self.bot_strategytime)
+       {
+               self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+
+               navigation_goalrating_start();
+               havocbot_goalrating_items(10000, self.origin, 10000);
+               havocbot_goalrating_enemyplayers(20000, self.origin, 10000);
+               //havocbot_goalrating_waypoints(1, self.origin, 1000);
+               navigation_goalrating_end();
+       }
+
+       if (!self.ballcarried)
+       {
+               self.havocbot_role = havocbot_role_ka_collector;
+               self.bot_strategytime = 0;
+       }
+};
+
+void havocbot_role_ka_collector()
+{
+       if (self.deadflag != DEAD_NO)
+               return;
+
+       if (time > self.bot_strategytime)
+       {
+               self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+
+               navigation_goalrating_start();
+               havocbot_goalrating_items(10000, self.origin, 10000);
+               havocbot_goalrating_enemyplayers(1000, self.origin, 10000);
+               havocbot_goalrating_ball(20000, self.origin);
+               navigation_goalrating_end();
+       }
+
+       if (self.ballcarried)
+       {
+               self.havocbot_role = havocbot_role_ka_carrier;
+               self.bot_strategytime = 0;
+       }
+};
+
+void havocbot_chooserole_ka()
+{
+       if (self.ballcarried)
+               self.havocbot_role = havocbot_role_ka_carrier;
+       else
+               self.havocbot_role = havocbot_role_ka_collector;
+};
index 514c364ac723963e1617e17ee3bc5ac28287bbf6..4cf685ddb42f970afa43a58c88206333a99fcb76 100644 (file)
@@ -10,12 +10,14 @@ void havocbot_goalrating_items(float ratingscale, vector org, float sradius)
        local entity head;
        local entity player;
        local float rating, d, discard, distance, friend_distance, enemy_distance;
+       vector o;
        ratingscale = ratingscale * 0.0001; // items are rated around 10000 already
        head = findchainfloat(bot_pickup, TRUE);
 
        while (head)
        {
-               distance = vlen(head.origin - org);
+               o = (head.absmin + head.absmax) * 0.5;
+               distance = vlen(o - org);
                friend_distance = 10000; enemy_distance = 10000;
                rating = 0;
 
@@ -28,7 +30,7 @@ void havocbot_goalrating_items(float ratingscale, vector org, float sradius)
                // Check if the item can be picked up safely
                if(head.classname == "droppedweapon")
                {
-                       traceline(head.origin, head.origin + '0 0 -1500', TRUE, world);
+                       traceline(o, o + '0 0 -1500', TRUE, world);
 
                        d = pointcontents(trace_endpos + '0 0 1');
                        if(d & CONTENT_WATER || d & CONTENT_SLIME || d & CONTENT_LAVA)
@@ -53,7 +55,7 @@ void havocbot_goalrating_items(float ratingscale, vector org, float sradius)
                        }
                }
 
-               if(teams_matter)
+               if(teamplay)
                {
                        discard = FALSE;
 
@@ -63,7 +65,7 @@ void havocbot_goalrating_items(float ratingscale, vector org, float sradius)
                                if ( self == player || player.deadflag )
                                        continue;
 
-                               d = vlen(player.origin - head.origin); // distance between player and item
+                               d = vlen(player.origin - o); // distance between player and item
 
                                if ( player.team == self.team )
                                {
@@ -131,7 +133,7 @@ void havocbot_goalrating_controlpoints(float ratingscale, vector org, float srad
        head = findchain(classname, "dom_controlpoint");
        while (head)
        {
-               if (vlen(head.origin - org) < sradius)
+               if (vlen(( ( head.absmin + head.absmax ) * 0.5 ) - org) < sradius)
                {
                        if(head.cnt > -1) // this is just being fought for
                                navigation_routerating(head, ratingscale, 5000);
@@ -148,7 +150,7 @@ void havocbot_goalrating_enemyplayers(float ratingscale, vector org, float sradi
 {
        local entity head;
        local float t, noteam, distance;
-       noteam = ((self.team == 0) || !teams_matter); // fteqcc sucks
+       noteam = ((self.team == 0) || !teamplay); // fteqcc sucks
 
        if (autocvar_bot_nofire)
                return;
@@ -168,6 +170,9 @@ void havocbot_goalrating_enemyplayers(float ratingscale, vector org, float sradi
                        if (distance < 100 || distance > sradius)
                                continue;
 
+                       if (head.freezetag_frozen)
+                               continue;
+
                        if(g_minstagib)
                        if(head.items & IT_STRENGTH)
                                continue;
@@ -274,24 +279,6 @@ void havocbot_role_race()
        }
 };
 
-// Keepaway
-// If you don't have the ball, get it; if you do, kill people.
-void havocbot_role_ka()
-{
-       if(self.deadflag != DEAD_NO)
-               return;
-
-       if (self.bot_strategytime < time)
-       {
-               self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
-               navigation_goalrating_start();
-               havocbot_goalrating_items(10000, self.origin, 10000);
-               havocbot_goalrating_enemyplayers(20000, self.origin, 10000);
-               //havocbot_goalrating_waypoints(1, self.origin, 1000);
-               navigation_goalrating_end();
-       }
-}
-
 void havocbot_chooserole_dm()
 {
        self.havocbot_role = havocbot_role_dm;
@@ -307,11 +294,6 @@ void havocbot_chooserole_dom()
        self.havocbot_role = havocbot_role_dom;
 };
 
-void havocbot_chooserole_ka()
-{
-       self.havocbot_role = havocbot_role_ka;
-}
-
 void havocbot_chooserole()
 {
        dprint("choosing a role...\n");
@@ -328,6 +310,10 @@ void havocbot_chooserole()
                havocbot_chooserole_ons();
        else if (g_keepaway)
                havocbot_chooserole_ka();
+       else if (g_freezetag)
+               havocbot_chooserole_ft();
+       else if (g_assault)
+               havocbot_chooserole_ast();
        else // assume anything else is deathmatch
                havocbot_chooserole_dm();
 };
index 03a549439068b15d2d484f20e918af379686105f..968e760b8b721caff6b71cd452af93dd183fe726 100644 (file)
@@ -133,8 +133,8 @@ float tracewalk(entity e, vector start, vector m1, vector m2, vector end, float
                        // hit something
                        if (trace_fraction < 1)
                        {
-                               // check if we can walk over this obstacle
-                               tracebox(org + stepheightvec, m1, m2, move + stepheightvec, movemode, e);
+                               // check if we can walk over this obstacle, possibly by jumpstepping
+                               tracebox(org + jumpstepheightvec, m1, m2, move + jumpstepheightvec, movemode, e);
                                if (trace_fraction < 1 || trace_startsolid)
                                {
                                        if(autocvar_bot_debug_tracewalk)
@@ -641,16 +641,22 @@ void navigation_markroutes_inverted(entity fixed_source_waypoint)
 void navigation_routerating(entity e, float f, float rangebias)
 {
        entity nwp;
+       vector o;
        if (!e)
                return;
 
+       if(e.blacklisted)
+               return;
+
+       o = (e.absmin + e.absmax) * 0.5;
+
        //print("routerating ", etos(e), " = ", ftos(f), " - ", ftos(rangebias), "\n");
 
        // Evaluate path using jetpack
        if(g_jetpack)
        if(self.items & IT_JETPACK)
        if(autocvar_bot_ai_navigation_jetpack)
-       if(vlen(self.origin - e.origin) > autocvar_bot_ai_navigation_jetpack_mindistance)
+       if(vlen(self.origin - o) > autocvar_bot_ai_navigation_jetpack_mindistance)
        {
                vector pointa, pointb;
 
@@ -661,7 +667,7 @@ void navigation_routerating(entity e, float f, float rangebias)
                pointa = trace_endpos - '0 0 1';
 
                // Point B
-               traceline(e.origin, e.origin + '0 0 65535', MOVE_NORMAL, e);
+               traceline(o, o + '0 0 65535', MOVE_NORMAL, e);
                pointb = trace_endpos - '0 0 1';
 
                // Can I see these two points from the sky?
@@ -745,14 +751,48 @@ void navigation_routerating(entity e, float f, float rangebias)
        }
        else
        {
+               float search;
+
+               search = TRUE;
+
+               if(e.flags & FL_ITEM)
+               {
+                       if not(e.flags & FL_WEAPON)
+                       if(e.nearestwaypoint)
+                               search = FALSE;
+               }
+               else if (e.flags & FL_WEAPON)
+               {
+                       if(e.classname != "droppedweapon")
+                       if(e.nearestwaypoint)
+                               search = FALSE;
+               }
+
+               if(search)
                if (time > e.nearestwaypointtimeout)
                {
                        nwp = navigation_findnearestwaypoint(e, TRUE);
                        if(nwp)
                                e.nearestwaypoint = nwp;
                        else
+                       {
                                dprint("FAILED to find a nearest waypoint to '", e.classname, "' #", etos(e), "\n");
 
+                               if(e.flags & FL_ITEM)
+                                       e.blacklisted = TRUE;
+                               else if (e.flags & FL_WEAPON)
+                               {
+                                       if(e.classname != "droppedweapon")
+                                               e.blacklisted = TRUE;
+                               }
+
+                               if(e.blacklisted)
+                               {
+                                       dprint("The entity '", e.classname, "' is going to be excluded from path finding during this match\n");
+                                       return;
+                               }
+                       }
+
                        // TODO: Cleaner solution, probably handling this timeout from ctf.qc
                        if(e.classname=="item_flag_team")
                                e.nearestwaypointtimeout = time + 2;
@@ -768,7 +808,7 @@ void navigation_routerating(entity e, float f, float rangebias)
        {
                //te_wizspike(nwp.wpnearestpoint);
        //      dprint(e.classname, " ", ftos(f), "/(1+", ftos((nwp.wpcost + vlen(e.origin - nwp.wpnearestpoint))), "/", ftos(rangebias), ") = ");
-               f = f * rangebias / (rangebias + (nwp.wpcost + vlen(e.origin - nwp.wpnearestpoint)));
+               f = f * rangebias / (rangebias + (nwp.wpcost + vlen(o - nwp.wpnearestpoint)));
                //dprint("considering ", e.classname, " (with rating ", ftos(f), ")\n");
                //dprint(ftos(f));
                if (navigation_bestrating < f)
@@ -801,7 +841,7 @@ float navigation_routetogoal(entity e, vector startposition)
                return TRUE;
 
        // if it can reach the goal there is nothing more to do
-       if (tracewalk(self, startposition, PL_MIN, PL_MAX, e.origin, bot_navigation_movemode))
+       if (tracewalk(self, startposition, PL_MIN, PL_MAX, (e.absmin + e.absmax) * 0.5, bot_navigation_movemode))
                return TRUE;
 
        // see if there are waypoints describing a path to the item
@@ -851,6 +891,23 @@ void navigation_poptouchedgoals()
                }
        }
 
+       // If for some reason the bot is closer to the next goal, pop the current one
+       if(self.goalstack01)
+       if(vlen(self.goalcurrent.origin - self.origin) > vlen(self.goalstack01.origin - self.origin))
+       if(checkpvs(self.origin + self.view_ofs, self.goalstack01))
+       if(tracewalk(self, self.origin, self.mins, self.maxs, (self.goalstack01.absmin + self.goalstack01.absmax) * 0.5, bot_navigation_movemode))
+       {
+       ///     dprint("path optimized, removed a goal from the queue\n");
+               navigation_poproute();
+               // TODO this may also be a nice idea to do "early" (e.g. by
+               // manipulating the vlen() comparisons) to shorten paths in
+               // general - this would make bots walk more "on rails" than
+               // "zigzagging" which they currently do with sufficiently
+               // random-like waypoints, and thus can make a nice bot
+               // personality property
+       }
+
+
        // Loose goal touching check when running
        if(self.aistatus & AI_STATUS_RUNNING)
        if(self.goalcurrent.classname=="waypoint")
@@ -927,7 +984,7 @@ void navigation_goalrating_end()
 void botframe_updatedangerousobjects(float maxupdate)
 {
        local entity head, bot_dodgelist;
-       local vector m1, m2, v;
+       local vector m1, m2, v, o;
        local float c, d, danger;
        c = 0;
        bot_dodgelist = findchainfloat(bot_dodge, TRUE);
@@ -944,10 +1001,11 @@ void botframe_updatedangerousobjects(float maxupdate)
                        v_x = bound(m1_x, v_x, m2_x);
                        v_y = bound(m1_y, v_y, m2_y);
                        v_z = bound(m1_z, v_z, m2_z);
-                       d = head.bot_dodgerating - vlen(head.origin - v);
+                       o = (head.absmin + head.absmax) * 0.5;
+                       d = head.bot_dodgerating - vlen(o - v);
                        if (d > 0)
                        {
-                               traceline(head.origin, v, TRUE, world);
+                               traceline(o, v, TRUE, world);
                                if (trace_fraction == 1)
                                        danger = danger + d;
                        }
@@ -1027,7 +1085,7 @@ void navigation_unstuck()
                while(head)
                {
                        if(head.classname=="waypoint")
-                       if(!(head.wpflags & WAYPOINTFLAG_GENERATED))
+               //      if(!(head.wpflags & WAYPOINTFLAG_GENERATED))
                        {
                                if(bot_waypoint_queue_goal)
                                        bot_waypoint_queue_goal.bot_waypoint_queue_nextgoal = head;
@@ -1104,7 +1162,7 @@ void debugnodestatus(vector position, float status)
 void debuggoalstack()
 {
        local entity goal;
-       local vector org;
+       local vector org, go;
 
        if(self.goalcounter==0)goal=self.goalcurrent;
        else if(self.goalcounter==1)goal=self.goalstack01;
@@ -1152,8 +1210,9 @@ void debuggoalstack()
                org = self.lastposition;
 
 
-       te_lightning2(world, org, goal.origin);
-       self.lastposition = goal.origin;
+       go = ( goal.absmin + goal.absmax ) * 0.5;
+       te_lightning2(world, org, go);
+       self.lastposition = go;
 
        self.goalcounter++;
 }
index 0a9bf14010d17176eab4a7740b9b997f2facd622..b3b40ce03e55443be1c82e8e362f354381e82483 100644 (file)
@@ -6,6 +6,7 @@ float navigation_bestrating;
 float bot_navigation_movemode;
 float navigation_testtracewalk;
 
+vector jumpstepheightvec;
 vector stepheightvec;
 
 entity botframe_dangerwaypoint;
@@ -27,6 +28,8 @@ entity navigation_bestgoal;
 .float navigation_hasgoals;
 .float lastteleporttime;
 
+.float blacklisted;
+
 .entity navigation_jetpack_goal;
 .vector navigation_jetpack_point;
 
index ef25a958d21f8908545ad4c51ba32dfb11754818..e540a438d55f07e88cccb96126ed3830290d46bd 100644 (file)
@@ -63,8 +63,8 @@ float bot_havecommand(entity bot, float idx)
 
 #define MAX_BOT_PLACES 4
 .float bot_places_count;
-.entity bot_places[MAX_BOT_PLACES]; FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(bot_places);
-.string bot_placenames[MAX_BOT_PLACES]; FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(bot_placenames);
+.entity bot_places[MAX_BOT_PLACES];
+.string bot_placenames[MAX_BOT_PLACES];
 entity bot_getplace(string placename)
 {
        entity e;
@@ -1061,7 +1061,7 @@ float bot_cmd_sound()
        f = bot_cmd.bot_cmd_parm_string;
 
        precache_sound(f);
-       sound(self, CHAN_WEAPON2, f, VOL_BASE, ATTN_MIN);
+       sound(self, CH_WEAPON_B, f, VOL_BASE, ATTN_MIN);
 
        return CMD_STATUS_FINISHED;
 }
index b39e59f762343fe4d15e2aa7ed5fc7519e41f82a..8aea49be512d0b6f7dfd42e8b5d40f73585ef73f 100644 (file)
@@ -23,7 +23,7 @@ entity waypoint_spawn(vector m1, vector m2, float f)
        setsize(w, m1 - w.origin, m2 - w.origin);
        if (vlen(w.size) > 0)
                w.wpisbox = TRUE;
-       
+
        if(!w.wpisbox)
        {
                setsize(w, PL_MIN - '1 1 0', PL_MAX + '1 1 0');
@@ -154,7 +154,8 @@ void waypoint_think()
        local entity e;
        local vector sv, sm1, sm2, ev, em1, em2, dv;
 
-       stepheightvec = autocvar_sv_stepheight * '0 0 1';
+       bot_calculate_stepheightvec();
+
        bot_navigation_movemode = ((autocvar_bot_navigation_ignoreplayers) ? MOVE_NOMONSTERS : MOVE_NORMAL);
 
        //dprint("waypoint_think wpisbox = ", ftos(self.wpisbox), "\n");
@@ -496,11 +497,11 @@ void waypoint_load_links_hardwired()
                // Search "from" waypoint
                if(wp_from.origin!=wp_from_pos)
                {
-                       wp_from = findradius(wp_from_pos, 1);
+                       wp_from = findradius(wp_from_pos, 5);
                        found = FALSE;
                        while(wp_from)
                        {
-                               if(vlen(wp_from.origin-wp_from_pos)<1)
+                               if(vlen(wp_from.origin-wp_from_pos)<5)
                                if(wp_from.classname == "waypoint")
                                {
                                        found = TRUE;
@@ -517,11 +518,11 @@ void waypoint_load_links_hardwired()
                }
 
                // Search "to" waypoint
-               wp_to = findradius(wp_to_pos, 1);
+               wp_to = findradius(wp_to_pos, 5);
                found = FALSE;
                while(wp_to)
                {
-                       if(vlen(wp_to.origin-wp_to_pos)<1)
+                       if(vlen(wp_to.origin-wp_to_pos)<5)
                        if(wp_to.classname == "waypoint")
                        {
                                found = TRUE;
@@ -772,12 +773,12 @@ void waypoint_spawnforitem(entity e)
        waypoint_spawnforitem_force(e, e.origin);
 };
 
-void waypoint_spawnforteleporter(entity e, vector destination, float timetaken)
+void waypoint_spawnforteleporter_boxes(entity e, vector org1, vector org2, vector destination1, vector destination2, float timetaken)
 {
        local entity w;
        local entity dw;
-       w = waypoint_spawn(e.absmin, e.absmax, WAYPOINTFLAG_GENERATED | WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_NORELINK);
-       dw = waypoint_spawn(destination, destination, WAYPOINTFLAG_GENERATED);
+       w = waypoint_spawn(org1, org2, WAYPOINTFLAG_GENERATED | WAYPOINTFLAG_TELEPORT | WAYPOINTFLAG_NORELINK);
+       dw = waypoint_spawn(destination1, destination2, WAYPOINTFLAG_GENERATED);
        // one way link to the destination
        w.wp00 = dw;
        w.wp00mincost = timetaken; // this is just for jump pads
@@ -787,6 +788,19 @@ void waypoint_spawnforteleporter(entity e, vector destination, float timetaken)
        e.nearestwaypointtimeout = time + 1000000000;
 };
 
+void waypoint_spawnforteleporter_v(entity e, vector org, vector destination, float timetaken)
+{
+       org = waypoint_fixorigin(org);
+       destination = waypoint_fixorigin(destination);
+       waypoint_spawnforteleporter_boxes(e, org, org, destination, destination, timetaken);
+};
+
+void waypoint_spawnforteleporter(entity e, vector destination, float timetaken)
+{
+       destination = waypoint_fixorigin(destination);
+       waypoint_spawnforteleporter_boxes(e, e.absmin, e.absmax, destination, destination, timetaken);
+};
+
 entity waypoint_spawnpersonal(vector position)
 {
        entity w;
index ef54b1d38f57a0126ecf231aab0194b31ad603b3..cf0198b4c54aa83d0650832286014c49521f6a5a 100644 (file)
@@ -64,7 +64,7 @@ void  makestatic (entity e)                                                           = #69;
 void   changelevel (string s)                                                          = #70;
 
 void   cvar_set (string var, string val)                                               = #72;
-//void(entity client, string s) centerprint = #73;
+void(entity client, string s) centerprint = #73;
 void   ambientsound (vector pos, string samp, float vol, float atten)                  = #74;
 string precache_model2 (string s)                                                      = #75;
 string precache_sound2 (string s)                                                      = #76;
index 9a36546716d6dc644512e2536a1f449791be55c8..923950b5071cd4084dff6e3b3750f61560822784 100644 (file)
@@ -108,7 +108,7 @@ void CampaignPreInit()
 
        title = campaign_shortdesc[0];
        title = strzone(strcat("Level ", ftos(campaign_level + 1), ": ", title));
-       campaign_message = strzone(strcat("\n\n\n\n\n\n\n\n\n\n^1\n", title, "\n^3\n", campaign_longdesc[0], "\n\n^1press jump to enter the game"));
+       campaign_message = strzone(strcat(title, "\n^3\n", campaign_longdesc[0], "\n\n^1press jump to enter the game"));
        strunzone(title);
 }
 
index fc54d49148835d9ed584c1632866f22ccaedc1f4..3270a9077fbcb1c7b640303553026221836ec7f3 100644 (file)
@@ -249,7 +249,7 @@ float CheatImpulse(float i)
                                e2 = spawn();
                                setorigin(e2, org);
                                pointparticles(particleeffectnum("rocket_explode"), org, '0 0 0', 1);
-                               sound(e2, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+                               sound(e2, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
                                RadiusDamage(e2, e, 1000, 0, 128, e, 500, DEATH_CHEAT, world);
                                remove(e2);
                        }
@@ -303,7 +303,7 @@ float CheatCommand(float argc)
                                // arguments:
                                //   effectname
                                effectnum = particleeffectnum(argv(1));
-                               W_SetupShot(self, FALSE, FALSE, "", CHAN_WEAPON, 0);
+                               W_SetupShot(self, FALSE, FALSE, "", CH_WEAPON_A, 0);
                                traceline(w_shotorg, w_shotorg + w_shotdir * MAX_SHOT_DISTANCE, MOVE_NORMAL, self);
                                trailparticles(self, effectnum, w_shotorg, trace_endpos);
                                DID_CHEAT();
@@ -318,7 +318,7 @@ float CheatCommand(float argc)
                                // arguments:
                                //   modelname mode
                                f = stof(argv(2));
-                               W_SetupShot(self, FALSE, FALSE, "", CHAN_WEAPON, 0);
+                               W_SetupShot(self, FALSE, FALSE, "", CH_WEAPON_A, 0);
                                traceline(w_shotorg, w_shotorg + w_shotdir * 2048, MOVE_NORMAL, self);
                                if((trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT) || trace_fraction == 1)
                                {
index dda18b9ad51e09cde85d3a33a8a1dd3672048780..61884b8780cd924c8af5b3c12b29022561117875 100644 (file)
@@ -112,7 +112,7 @@ void spawnfunc_info_player_deathmatch (void)
 
 void spawnpoint_use()
 {
-       if(teams_matter)
+       if(teamplay)
        if(have_team_spawns > 0)
        {
                self.team = activator.team;
@@ -596,7 +596,7 @@ void FixPlayermodel();
 void PutObserverInServer (void)
 {
        entity  spot;
-
+    self.hud = HUD_NORMAL;
        race_PreSpawnObserver();
 
        spot = SelectSpawnPoint (TRUE);
@@ -614,6 +614,9 @@ void PutObserverInServer (void)
        DropAllRunes(self);
        MUTATOR_CALLHOOK(MakePlayerObserver);
 
+       if (g_minstagib)
+               minstagib_stop_countdown();
+
        Portal_ClearAll(self);
 
        if(self.alivetime)
@@ -622,6 +625,9 @@ void PutObserverInServer (void)
                self.alivetime = 0;
        }
 
+       if(self.vehicle)
+           vehicles_exit(VHEF_RELESE);
+
        if(self.flagcarried)
                DropFlag(self.flagcarried, world, world);
 
@@ -653,13 +659,13 @@ void PutObserverInServer (void)
        accuracy_resend(self);
 
        self.spectatortime = time;
-
+       
        self.classname = "observer";
        self.iscreature = FALSE;
        self.health = -666;
        self.takedamage = DAMAGE_NO;
        self.solid = SOLID_NOT;
-       self.movetype = MOVETYPE_NOCLIP;
+       self.movetype = MOVETYPE_FLY_WORLDONLY; //(self.cvar_cl_clippedspectating ? MOVETYPE_NOCLIP : MOVETYPE_FLY); // it's too early for this anyway, lets just set it in playerprethink
        self.flags = FL_CLIENT | FL_NOTARGET;
        self.armorvalue = 666;
        self.effects = 0;
@@ -688,9 +694,9 @@ void PutObserverInServer (void)
        self.fixangle = TRUE;
        self.crouch = FALSE;
 
-       self.view_ofs = PL_VIEW_OFS;
+       self.view_ofs = '0 0 0'; // so that your view doesn't go into the ceiling with MOVETYPE_FLY_WORLDONLY, previously "PL_VIEW_OFS"
        setorigin (self, spot.origin);
-       setsize (self, '0 0 0', '0 0 0');
+       setsize (self, PL_CROUCH_MIN, PL_CROUCH_MAX); // give the spectator some space between walls for MOVETYPE_FLY_WORLDONLY
        self.prevorigin = self.origin;
        self.items = 0;
        self.weapons = 0;
@@ -748,7 +754,7 @@ void FixPlayermodel()
        if(autocvar_sv_defaultcharacter == 1) {
                defaultskin = 0;
 
-               if(teams_matter)
+               if(teamplay)
                {
                        string s;
                        s = Team_ColorNameLowerCase(self.team);
@@ -804,7 +810,7 @@ void FixPlayermodel()
        if(chmdl || oldskin != self.skinindex)
                self.species = player_getspecies(); // model or skin has changed
 
-       if(!teams_matter)
+       if(!teamplay)
                if(strlen(autocvar_sv_defaultplayercolors))
                        if(self.clientcolors != stof(autocvar_sv_defaultplayercolors))
                                setcolor(self, stof(autocvar_sv_defaultplayercolors));
@@ -1014,6 +1020,7 @@ void PutClientInServer (void)
                self.oldorigin = self.origin;
                self.prevorigin = self.origin;
                self.lastrocket = world; // stop rocket guiding, no revenge from the grave!
+               self.lastteleporttime = time; // prevent insane speeds due to changing origin
 
                if(g_arena)
                {
@@ -1059,7 +1066,7 @@ void PutClientInServer (void)
                //stuffcmd(self, "set viewsize $tmpviewsize \n");
 
                if (autocvar_g_spawnsound)
-                       sound (self, CHAN_TRIGGER, "misc/spawn.wav", VOL_BASE, ATTN_NORM);
+                       sound (self, CH_TRIGGER, "misc/spawn.wav", VOL_BASE, ATTN_NORM);
 
                if(g_assault) {
                        if(self.team == assault_attacker_team)
@@ -1081,12 +1088,15 @@ void PutClientInServer (void)
                        if(e.spawnflags & WEP_FLAG_RELOADABLE) // prevent accessing undefined cvars
                                self.weapon_load[j] = cvar(strcat("g_balance_", e.netname, "_reload_ammo"));
                }
-               self.weapon_forbidchange = FALSE;
 
                oldself = self;
                self = spot;
                        activator = oldself;
+                               string s;
+                               s = self.target;
+                               self.target = string_null;
                                SUB_UseTargets();
+                               self.target = s;
                        activator = world;
                self = oldself;
 
@@ -1136,7 +1146,7 @@ float ClientInit_SendEntity(entity to, float sf)
        WriteCoord(MSG_ENTITY, self.ebouncefactor); // g_balance_grenadelauncher_bouncefactor
        WriteCoord(MSG_ENTITY, self.ebouncestop); // g_balance_grenadelauncher_bouncestop
        WriteByte(MSG_ENTITY, autocvar_g_balance_nex_secondary); // client has to know if it should zoom or not
-       WriteByte(MSG_ENTITY, autocvar_g_balance_sniperrifle_secondary); // client has to know if it should zoom or not
+       WriteByte(MSG_ENTITY, autocvar_g_balance_rifle_secondary); // client has to know if it should zoom or not
        WriteByte(MSG_ENTITY, serverflags); // client has to know if it should zoom or not
        WriteByte(MSG_ENTITY, autocvar_g_balance_minelayer_limit); // minelayer max mines
        WriteByte(MSG_ENTITY, autocvar_g_balance_hagar_secondary_load_max); // hagar max loadable rockets
@@ -1262,7 +1272,19 @@ void ClientKill_Now_TeamChange()
 
 void ClientKill_Now()
 {
-       remove(self.killindicator);
+       if(self.vehicle)
+       {
+           vehicles_exit(VHEF_RELESE);
+           if(!self.killindicator_teamchange)
+           {
+            self.vehicle_health = -1;
+            Damage(self, self, self, 1 , DEATH_KILL, self.origin, '0 0 0');            
+           }
+       }
+
+       if(self.killindicator && !wasfreed(self.killindicator))
+               remove(self.killindicator);
+
        self.killindicator = world;
 
        if(self.killindicator_teamchange)
@@ -1275,6 +1297,13 @@ void ClientKill_Now()
 }
 void KillIndicator_Think()
 {
+       if (gameover)
+       {
+               self.owner.killindicator = world;
+               remove(self);
+               return;
+       }
+
        if (!self.owner.modelindex)
        {
                self.owner.killindicator = world;
@@ -1301,17 +1330,6 @@ void KillIndicator_Think()
                {
                        if(self.cnt <= 10)
                                AnnounceTo(self.owner, strcat(ftos(self.cnt), ""));
-                       if(self.owner.killindicator_teamchange)
-                       {
-                               if(self.owner.killindicator_teamchange == -1)
-                                       centerprint(self.owner, strcat("Changing team in ", ftos(self.cnt), " seconds"));
-                               else if(self.owner.killindicator_teamchange == -2)
-                                       centerprint(self.owner, strcat("Spectating in ", ftos(self.cnt), " seconds"));
-                               else
-                                       centerprint(self.owner, strcat("Changing to ", ColoredTeamName(self.owner.killindicator_teamchange), " in ", ftos(self.cnt), " seconds"));
-                       }
-                       else
-                               centerprint(self.owner, strcat("^1Suicide in ", ftos(self.cnt), " seconds"));
                }
                self.nextthink = time + 1;
                self.cnt -= 1;
@@ -1322,6 +1340,10 @@ void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto, -2
 {
        float killtime;
        entity e;
+
+       if (gameover)
+               return;
+
        killtime = autocvar_g_balance_kill_delay;
 
        if(g_race_qualifying || g_cts)
@@ -1382,18 +1404,42 @@ void ClientKill_TeamChange (float targetteam) // 0 = don't change, -1 = auto, -2
        if(self.killindicator)
        {
                if(targetteam == 0) // just die
+               {
                        self.killindicator.colormod = '0 0 0';
+                       if(clienttype(self) == CLIENTTYPE_REAL)
+                       if(self.killindicator.cnt > 0)
+                               Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, "^1Suicide in %d seconds", 1, self.killindicator.cnt);
+               }
                else if(targetteam == -1) // auto
+               {
                        self.killindicator.colormod = '0 1 0';
+                       if(clienttype(self) == CLIENTTYPE_REAL)
+                       if(self.killindicator.cnt > 0)
+                               Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, "Changing team in %d seconds", 1, self.killindicator.cnt);
+               }
                else if(targetteam == -2) // spectate
+               {
                        self.killindicator.colormod = '0.5 0.5 0.5';
+                       if(clienttype(self) == CLIENTTYPE_REAL)
+                       if(self.killindicator.cnt > 0)
+                               Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, "Spectating in %d seconds", 1, self.killindicator.cnt);
+               }
                else
+               {
                        self.killindicator.colormod = TeamColor(targetteam);
+                       if(clienttype(self) == CLIENTTYPE_REAL)
+                       if(self.killindicator.cnt > 0)
+                               Send_CSQC_Centerprint_Generic(self, CPID_TEAMCHANGE, strcat("Changing to ", ColoredTeamName(targetteam), " in %d seconds"), 1, self.killindicator.cnt);
+               }
        }
+
 }
 
 void ClientKill (void)
 {
+       if (gameover)
+               return;
+
        if((g_arena || g_ca) && ((champion && champion.classname == "player" && player_count > 1) || player_count == 1)) // don't allow a kill in this case either
        {
                // do nothing
@@ -1417,55 +1463,6 @@ void CTS_ClientKill (entity e) // silent version of ClientKill, used when player
     e.lip = 0;
 }
 
-void DoTeamChange(float destteam)
-{
-       float t, c0;
-       if(!teams_matter)
-       {
-               if(destteam >= 0)
-                       SetPlayerColors(self, destteam);
-               return;
-       }
-       if(self.classname == "player")
-       if(destteam == -1)
-       {
-               CheckAllowedTeams(self);
-               t = FindSmallestTeam(self, TRUE);
-               switch(self.team)
-               {
-                       case COLOR_TEAM1: c0 = c1; break;
-                       case COLOR_TEAM2: c0 = c2; break;
-                       case COLOR_TEAM3: c0 = c3; break;
-                       case COLOR_TEAM4: c0 = c4; break;
-                       default:          c0 = 999;
-               }
-               switch(t)
-               {
-                       case 1:
-                               if(c0 > c1)
-                                       destteam = COLOR_TEAM1;
-                               break;
-                       case 2:
-                               if(c0 > c2)
-                                       destteam = COLOR_TEAM2;
-                               break;
-                       case 3:
-                               if(c0 > c3)
-                                       destteam = COLOR_TEAM3;
-                               break;
-                       case 4:
-                               if(c0 > c4)
-                                       destteam = COLOR_TEAM4;
-                               break;
-               }
-               if(destteam == -1)
-                       return;
-       }
-       if(destteam == self.team && destteam >= 0 && !self.killindicator)
-               return;
-       ClientKill_TeamChange(destteam);
-}
-
 void FixClientCvars(entity e)
 {
        // send prediction settings to the client
@@ -1567,7 +1564,7 @@ void ClientConnect (void)
        playerdemo_init();
 
        anticheat_init();
-       
+
        race_PreSpawnObserver();
 
        //if(g_domination)
@@ -1611,7 +1608,7 @@ void ClientConnect (void)
        else
                self.team_forced = 0;
 
-       if(!teams_matter)
+       if(!teamplay)
                if(self.team_forced > 0)
                        self.team_forced = 0;
 
@@ -1620,7 +1617,7 @@ void ClientConnect (void)
        if((autocvar_sv_spectate == 1 && !g_lms) || autocvar_g_campaign || self.team_forced < 0) {
                self.classname = "observer";
        } else {
-               if(teams_matter)
+               if(teamplay)
                {
                        if(autocvar_g_balance_teams || autocvar_g_balance_teams_force)
                        {
@@ -1641,6 +1638,11 @@ void ClientConnect (void)
 
        self.playerid = (playerid_last = playerid_last + 1);
 
+       PlayerStats_AddEvent(sprintf("kills-%d", self.playerid));
+
+    if(clienttype(self) == CLIENTTYPE_BOT)
+        PlayerStats_AddPlayer(self);
+
        if(autocvar_sv_eventlog)
                GameLogEcho(strcat(":join:", ftos(self.playerid), ":", ftos(num_for_edict(self)), ":", ((clienttype(self) == CLIENTTYPE_REAL) ? self.netaddress : "bot"), ":", self.netname));
 
@@ -1657,8 +1659,6 @@ void ClientConnect (void)
 
        bprint("\n");
 
-       self.welcomemessage_time = 0;
-
        stuffcmd(self, strcat(clientstuff, "\n"));
        stuffcmd(self, strcat("exec maps/", mapname, ".cfg\n"));
        stuffcmd(self, "cl_particles_reloadeffects\n");
@@ -1681,7 +1681,7 @@ void ClientConnect (void)
        GetCvars(0);
 
        // notify about available teams
-       if(teams_matter)
+       if(teamplay)
        {
                CheckAllowedTeams(self);
                t = 0; if(c1 >= 0) t |= 1; if(c2 >= 0) t |= 2; if(c3 >= 0) t |= 4; if(c4 >= 0) t |= 8;
@@ -1772,6 +1772,9 @@ void ClientConnect (void)
                set_dom_state(self);
 
        CheatInitClient();
+
+       if(!autocvar_g_campaign)
+               Send_CSQC_Centerprint_Generic(self, CPID_MOTD, getwelcomemessage(), autocvar_welcome_message_time, 0);
 }
 
 /*
@@ -1785,6 +1788,9 @@ Called when a client disconnects from the server
 void ReadyCount();
 void ClientDisconnect (void)
 {
+       if(self.vehicle)
+           vehicles_exit(VHEF_RELESE);
+
        if not(self.flags & FL_CLIENT)
        {
                print("Warning: ClientDisconnect without ClientConnect\n");
@@ -1922,7 +1928,7 @@ void UpdateChatBubble()
        local float c;
        c = self.clientcolors & 15;
        // LordHavoc: only bothering to support white, green, red, yellow, blue
-            if (!teams_matter) self.colormod = '0 0 0';
+            if (!teamplay) self.colormod = '0 0 0';
        else if (c ==  0) self.colormod = '1.00 1.00 1.00';
        else if (c ==  3) self.colormod = '0.10 1.73 0.10';
        else if (c ==  4) self.colormod = '1.73 0.10 0.10';
@@ -1965,63 +1971,22 @@ void play_countdown(float finished, string samp)
        if(clienttype(self) == CLIENTTYPE_REAL)
                if(floor(finished - time - frametime) != floor(finished - time))
                        if(finished - time < 6)
-                               sound (self, CHAN_AUTO, samp, VOL_BASE, ATTN_NORM);
-}
-
-/**
- * When sv_timeout is used this function returs strings like
- * "Timeout begins in 2 seconds!\n" or "Timeout ends in 23 seconds!\n".
- * Called by centerprint functions
- * @param addOneSecond boolean, set to 1 if the welcome-message centerprint asks for the text
- */
-string getTimeoutText(float addOneSecond) {
-       if (!autocvar_sv_timeout || !timeoutStatus)
-               return "";
-
-       local string retStr;
-       if (timeoutStatus == 1) {
-               if (addOneSecond == 1) {
-                       retStr = strcat("Timeout begins in ", ftos(remainingLeadTime + 1), " seconds!\n");
-               }
-               else {
-                       retStr = strcat("Timeout begins in ", ftos(remainingLeadTime), " seconds!\n");
-               }
-               return retStr;
-       }
-       else if (timeoutStatus == 2) {
-               if (addOneSecond) {
-                       retStr = strcat("Timeout ends in ", ftos(remainingTimeoutTime + 1), " seconds!\n");
-                       //don't show messages like "Timeout ends in 0 seconds"...
-                       if ((remainingTimeoutTime + 1) > 0)
-                               return retStr;
-                       else
-                               return "";
-               }
-               else {
-                       retStr = strcat("Timeout ends in ", ftos(remainingTimeoutTime), " seconds!\n");
-                       //don't show messages like "Timeout ends in 0 seconds"...
-                       if (remainingTimeoutTime > 0)
-                               return retStr;
-                       else
-                               return "";
-               }
-       }
-       else return "";
+                               sound (self, CH_INFO, samp, VOL_BASE, ATTN_NORM);
 }
 
 void player_powerups (void)
 {
        // add a way to see what the items were BEFORE all of these checks for the mutator hook
        olditems = self.items;
-       
+
        if((self.items & IT_USING_JETPACK) && !self.deadflag)
        {
-               SoundEntity_StartSound(self, CHAN_PLAYER, "misc/jetpack_fly.wav", VOL_BASE, autocvar_g_jetpack_attenuation);
+               SoundEntity_StartSound(self, CH_TRIGGER_SINGLE, "misc/jetpack_fly.wav", VOL_BASE, autocvar_g_jetpack_attenuation);
                self.modelflags |= MF_ROCKET;
        }
        else
        {
-               SoundEntity_StopSound(self, CHAN_PLAYER);
+               SoundEntity_StopSound(self, CH_TRIGGER_SINGLE);
                self.modelflags &~= MF_ROCKET;
        }
 
@@ -2029,7 +1994,7 @@ void player_powerups (void)
 
        if(!self.modelindex || self.deadflag) // don't apply the flags if the player is gibbed
                return;
-       
+
        Fire_ApplyDamage(self);
        Fire_ApplyEffect(self);
 
@@ -2135,7 +2100,7 @@ void player_powerups (void)
                if (time < self.spawnshieldtime)
                        self.effects = self.effects | (EF_ADDITIVE | EF_FULLBRIGHT);
        }
-       
+
        MUTATOR_CALLHOOK(PlayerPowerups);
 }
 
@@ -2350,17 +2315,41 @@ void SpectateCopy(entity spectatee) {
        self.dmg_save = spectatee.dmg_save;
        self.dmg_inflictor = spectatee.dmg_inflictor;
        self.angles = spectatee.v_angle;
-       self.fixangle = TRUE;
+       if(!self.BUTTON_USE)
+               self.fixangle = TRUE;
        setorigin(self, spectatee.origin);
        setsize(self, spectatee.mins, spectatee.maxs);
        SetZoomState(spectatee.zoomstate);
 
        anticheat_spectatecopy(spectatee);
+
+       //self.vehicle = spectatee.vehicle;
+
+       self.hud = spectatee.hud;
+       if(spectatee.vehicle)
+    {
+        setorigin(self, spectatee.origin);
+        self.velocity = spectatee.vehicle.velocity;
+        self.v_angle += spectatee.vehicle.angles;
+        //self.v_angle_x *= -1;
+        self.vehicle_health = spectatee.vehicle_health;
+        self.vehicle_shield = spectatee.vehicle_shield;
+        self.vehicle_energy = spectatee.vehicle_energy;
+        self.vehicle_ammo1 = spectatee.vehicle_ammo1;
+        self.vehicle_ammo2 = spectatee.vehicle_ammo2;
+        self.vehicle_reload1 = spectatee.vehicle_reload1;
+        self.vehicle_reload2 = spectatee.vehicle_reload2;
+        
+        msg_entity = self;
+        WriteByte (MSG_ONE, SVC_SETVIEWPORT);
+        WriteEntity(MSG_ONE, spectatee);
+        //self.tur_head = spectatee.vehicle.vehicle_viewport;
+    }
 }
 
 float SpectateUpdate() {
        if(!self.enemy)
-               return 0;
+           return 0;           
 
        if (self == self.enemy)
                return 0;
@@ -2383,17 +2372,28 @@ float SpectateNext() {
                self.enemy = other;
 
        if(self.enemy.classname == "player") {
-               msg_entity = self;
-               WriteByte(MSG_ONE, SVC_SETVIEW);
-               WriteEntity(MSG_ONE, self.enemy);
-               //stuffcmd(self, "set viewsize $tmpviewsize \n");
-               self.movetype = MOVETYPE_NONE;
-               accuracy_resend(self);
-
-               if(!SpectateUpdate())
-                       PutObserverInServer();
-
-               return 1;
+           if(self.enemy.vehicle)
+           {      
+            msg_entity = self;
+            WriteByte(MSG_ONE, SVC_SETVIEWPORT);
+            WriteEntity(MSG_ONE, self.enemy);
+            //stuffcmd(self, "set viewsize $tmpviewsize \n");
+            self.movetype = MOVETYPE_NONE;
+            accuracy_resend(self);
+           }
+           else 
+           {           
+            msg_entity = self;
+            WriteByte(MSG_ONE, SVC_SETVIEW);
+            WriteEntity(MSG_ONE, self.enemy);
+            //stuffcmd(self, "set viewsize $tmpviewsize \n");
+            self.movetype = MOVETYPE_NONE;
+            accuracy_resend(self);
+
+            if(!SpectateUpdate())
+                PutObserverInServer();
+        }
+        return 1;
        } else {
                return 0;
        }
@@ -2428,7 +2428,7 @@ void ShowRespawnCountdown()
 void LeaveSpectatorMode()
 {
        if(nJoinAllowed(1)) {
-               if(!teams_matter || autocvar_g_campaign || autocvar_g_balance_teams || (self.wasplayer && autocvar_g_changeteam_banned) || self.team_forced > 0) {
+               if(!teamplay || autocvar_g_campaign || autocvar_g_balance_teams || (self.wasplayer && autocvar_g_changeteam_banned) || self.team_forced > 0) {
                        self.classname = "player";
 
                        if(autocvar_g_campaign || autocvar_g_balance_teams || autocvar_g_balance_teams_force)
@@ -2443,7 +2443,8 @@ void LeaveSpectatorMode()
                                bprint ("^4", self.netname, "^4 is playing now\n");
 
                        if(!autocvar_g_campaign)
-                               centerprint(self,""); // clear MOTD
+                       if (time < self.jointime + autocvar_welcome_message_time)
+                               Send_CSQC_Centerprint_Generic_Expire(self, CPID_MOTD); // clear MOTD
 
                        return;
                } else {
@@ -2456,7 +2457,7 @@ void LeaveSpectatorMode()
        }
        else {
                //player may not join because of g_maxplayers is set
-               centerprint_atprio(self, CENTERPRIO_MAPVOTE, PREVENT_JOIN_TEXT);
+               centerprint(self, PREVENT_JOIN_TEXT);
        }
 }
 
@@ -2505,17 +2506,20 @@ void checkSpectatorBlock() {
 
 void ObserverThink()
 {
+       float prefered_movetype;
        if (self.flags & FL_JUMPRELEASED) {
                if (self.BUTTON_JUMP && !self.version_mismatch) {
-                       self.welcomemessage_time = 0;
                        self.flags &~= FL_JUMPRELEASED;
                        self.flags |= FL_SPAWNING;
                } else if(self.BUTTON_ATCK && !self.version_mismatch) {
-                       self.welcomemessage_time = 0;
                        self.flags &~= FL_JUMPRELEASED;
                        if(SpectateNext() == 1) {
                                self.classname = "spectator";
                        }
+               } else {
+                       prefered_movetype = ((!self.BUTTON_USE ? self.cvar_cl_clippedspectating : !self.cvar_cl_clippedspectating) ? MOVETYPE_FLY_WORLDONLY : MOVETYPE_NOCLIP);
+                       if (self.movetype != prefered_movetype)
+                               self.movetype = prefered_movetype;
                }
        } else {
                if (!(self.BUTTON_ATCK || self.BUTTON_JUMP)) {
@@ -2528,18 +2532,15 @@ void ObserverThink()
                        }
                }
        }
-       PrintWelcomeMessage(self);
 }
 
 void SpectatorThink()
 {
        if (self.flags & FL_JUMPRELEASED) {
                if (self.BUTTON_JUMP && !self.version_mismatch) {
-                       self.welcomemessage_time = 0;
                        self.flags &~= FL_JUMPRELEASED;
                        self.flags |= FL_SPAWNING;
                } else if(self.BUTTON_ATCK) {
-                       self.welcomemessage_time = 0;
                        self.flags &~= FL_JUMPRELEASED;
                        if(SpectateNext() == 1) {
                                self.classname = "spectator";
@@ -2548,7 +2549,6 @@ void SpectatorThink()
                                PutClientInServer();
                        }
                } else if (self.BUTTON_ATCK2) {
-                       self.welcomemessage_time = 0;
                        self.flags &~= FL_JUMPRELEASED;
                        self.classname = "observer";
                        PutClientInServer();
@@ -2566,12 +2566,32 @@ void SpectatorThink()
                                return;
                        }
                }
+               if(!SpectateUpdate())
+                       PutObserverInServer();
        }
 
-       PrintWelcomeMessage(self);
        self.flags |= FL_CLIENT | FL_NOTARGET;
 }
 
+float ctf_usekey();
+void PlayerUseKey()
+{
+       if(self.classname != "player")
+               return;
+
+       if(self.vehicle)
+       {
+        vehicles_exit(VHEF_NORMAL);
+        return;
+       }
+       
+       // a use key was pressed; call handlers
+       if(ctf_usekey())
+               return;
+
+       MUTATOR_CALLHOOK(PlayerUseKey);
+}
+
 .float touchexplode_time;
 
 /*
@@ -2581,9 +2601,11 @@ PlayerPreThink
 Called every frame for each client before the physics are run
 =============
 */
+.float usekeypressed;
 void() ctf_setstatus;
 void() nexball_setstatus;
 .float items_added;
+.float motd_actived_time; // used for both motd and campaign_message
 void PlayerPreThink (void)
 {
        WarpZone_PlayerPhysics_FixVAngle();
@@ -2658,14 +2680,50 @@ void PlayerPreThink (void)
 
        MUTATOR_CALLHOOK(PlayerPreThink);
 
+       if(self.BUTTON_USE && !self.usekeypressed)
+               PlayerUseKey();
+       self.usekeypressed = self.BUTTON_USE;
+
+       if (self.motd_actived_time == 0) {
+               if (autocvar_g_campaign) {
+                       if (self.classname == "player" && self.BUTTON_INFO) {
+                               self.motd_actived_time = time;
+                               Send_CSQC_Centerprint_Generic(self, CPID_MOTD, campaign_message, -1, 0);
+                       }
+               } else {
+                       if ((self.classname == "player" || time - self.jointime > autocvar_welcome_message_time) && self.BUTTON_INFO) {
+                               self.motd_actived_time = time;
+                               Send_CSQC_Centerprint_Generic(self, CPID_MOTD, getwelcomemessage(), -1, 0);
+                       }
+               }
+       } else { // showing MOTD or campaign message
+               if (autocvar_g_campaign) {
+                       if (self.classname == "player") {
+                               if (self.BUTTON_INFO)
+                                       self.motd_actived_time = time;
+                               else if (time - self.motd_actived_time > 2) { // hide it some seconds after BUTTON_INFO has been released
+                                       self.motd_actived_time = 0;
+                                       Send_CSQC_Centerprint_Generic_Expire(self, CPID_MOTD);
+                               }
+                       }
+               } else {
+                       if (self.classname == "player" || (time - self.jointime) > autocvar_welcome_message_time) {
+                               if (self.BUTTON_INFO)
+                                       self.motd_actived_time = time;
+                               else if (time - self.motd_actived_time > 2) { // hide it some seconds after BUTTON_INFO has been released
+                                       self.motd_actived_time = 0;
+                                       Send_CSQC_Centerprint_Generic_Expire(self, CPID_MOTD);
+                               }
+                       }
+               }
+       }
+
        if(self.classname == "player") {
 //             if(self.netname == "Wazat")
 //                     bprint(self.classname, "\n");
 
                CheckRules_Player();
 
-               PrintWelcomeMessage(self);
-
                if (intermission_running)
                {
                        IntermissionThink ();   // otherwise a button could be missed between
@@ -2674,6 +2732,7 @@ void PlayerPreThink (void)
 
                //don't allow the player to turn around while game is paused!
                if(timeoutStatus == 2) {
+                       // FIXME turn this into CSQC stuff
                        self.v_angle = self.lastV_angle;
                        self.angles = self.lastV_angle;
                        self.fixangle = TRUE;
@@ -2720,6 +2779,9 @@ void PlayerPreThink (void)
                        player_powerups();
                }
 
+               if (g_minstagib)
+                       minstagib_ammocheck();
+
                if (self.deadflag != DEAD_NO)
                {
                        float button_pressed, force_respawn;
@@ -2767,6 +2829,8 @@ void PlayerPreThink (void)
                        }
                        return;
                }
+               // FIXME from now on self.deadflag is always 0 (and self.health is never < 1)
+               // so (self.deadflag == DEAD_NO) is always true in the code below
 
                if(g_touchexplode)
                if(time > self.touchexplode_time)
@@ -2878,9 +2942,6 @@ void PlayerPreThink (void)
                if(frametime)
                        player_anim();
 
-               if (g_minstagib)
-                       minstagib_ammocheck();
-
                if(g_ctf)
                        ctf_setstatus();
 
@@ -2901,7 +2962,7 @@ void PlayerPreThink (void)
        }
 
        if(!zoomstate_set)
-               SetZoomState(self.BUTTON_ZOOM || self.BUTTON_ZOOMSCRIPT || (self.BUTTON_ATCK2 && self.weapon == WEP_NEX) || (self.BUTTON_ATCK2 && self.weapon == WEP_SNIPERRIFLE && autocvar_g_balance_sniperrifle_secondary == 0));
+               SetZoomState(self.BUTTON_ZOOM || self.BUTTON_ZOOMSCRIPT || (self.BUTTON_ATCK2 && self.weapon == WEP_NEX) || (self.BUTTON_ATCK2 && self.weapon == WEP_RIFLE && autocvar_g_balance_rifle_secondary == 0));
 
        float oldspectatee_status;
        oldspectatee_status = self.spectatee_status;
@@ -2928,7 +2989,7 @@ void PlayerPreThink (void)
                oldself = self; self = self.teamkill_soundsource;
                oldpusher = self.pusher; self.pusher = oldself;
 
-               PlayerSound(playersound_teamshoot, CHAN_VOICE, VOICETYPE_LASTATTACKER_ONLY);
+               PlayerSound(playersound_teamshoot, CH_VOICE, VOICETYPE_LASTATTACKER_ONLY);
 
                self.pusher = oldpusher;
                self = oldself;
@@ -2938,7 +2999,7 @@ void PlayerPreThink (void)
        if(time > self.taunt_soundtime)
        {
                self.taunt_soundtime = 0;
-               PlayerSound(playersound_taunt, CHAN_VOICE, VOICETYPE_AUTOTAUNT);
+               PlayerSound(playersound_taunt, CH_VOICE, VOICETYPE_AUTOTAUNT);
        }
 
        target_voicescript_next(self);
@@ -3007,7 +3068,21 @@ void PlayerPostThink (void)
        {
                // WORKAROUND: only use dropclient in server frames (frametime set). Never use it in cl_movement frames (frametime zero).
                float timeleft;
+               if (time - self.parm_idlesince < 1) // instead of (time == self.parm_idlesince) to support sv_maxidle <= 10
+               {
+                       if(self.idlekick_lasttimeleft)
+                       {
+                               Send_CSQC_Centerprint_Generic_Expire(self, CPID_DISCONNECT_IDLING);
+                               self.idlekick_lasttimeleft = 0;
+                       }
+                       return;
+               }
                timeleft = ceil(sv_maxidle - (time - self.parm_idlesince));
+               if(timeleft == min(10, sv_maxidle - 1)) // - 1 to support sv_maxidle <= 10
+               {
+                       if(!self.idlekick_lasttimeleft)
+                               Send_CSQC_Centerprint_Generic(self, CPID_DISCONNECT_IDLING, "^3Stop idling!\n^3Disconnecting in %d seconds...", 1, timeleft);
+               }
                if(timeleft <= 0)
                {
                        bprint("^3", self.netname, "^3 was kicked for idling.\n");
@@ -3018,16 +3093,9 @@ void PlayerPostThink (void)
                else if(timeleft <= 10)
                {
                        if(timeleft != self.idlekick_lasttimeleft)
-                       {
-                               centerprint_atprio(self, CENTERPRIO_IDLEKICK, strcat("^3Stop idling!\n^3Disconnecting in ", ftos(timeleft), "..."));
-                               AnnounceTo(self, strcat(ftos(timeleft), ""));
-                       }
-               }
-               else
-               {
-                       centerprint_expire(self, CENTERPRIO_IDLEKICK);
+                               AnnounceTo(self, ftos(timeleft));
+                       self.idlekick_lasttimeleft = timeleft;
                }
-               self.idlekick_lasttimeleft = timeleft;
        }
 
 #ifdef TETRIS
@@ -3052,7 +3120,7 @@ void PlayerPostThink (void)
        } else if (self.classname == "spectator") {
                //do nothing
        }
-
+       
        /*
        float i;
        for(i = 0; i < 1000; ++i)
@@ -3075,7 +3143,7 @@ void PlayerPostThink (void)
 
        if(self.waypointsprite_attachedforcarrier)
                WaypointSprite_UpdateHealth(self.waypointsprite_attachedforcarrier, '1 0 0' * healtharmor_maxdamage(self.health, self.armorvalue, autocvar_g_balance_armor_blockpercent));
-       
+
        if(self.classname == "player" && self.deadflag == DEAD_NO && autocvar_r_showbboxes)
        {
                if(!self.showheadshotbbox)
@@ -3093,7 +3161,8 @@ void PlayerPostThink (void)
        else
        {
                if(self.showheadshotbbox)
-                       remove(self.showheadshotbbox);
+                       if(self.showheadshotbbox && !wasfreed(self.showheadshotbbox))
+                remove(self.showheadshotbbox);
        }
 
        playerdemo_write();
index 7bde8b32f7e8633acad1f53b1befd14e9ba20e30..939b6d2580b67a98b00b4cd3cf1590024922d2e6 100644 (file)
@@ -105,6 +105,10 @@ void ImpulseCommands (void)
                else
                        self.impulse = imp; // retry in next frame
        }
+       else if(imp == 21)
+       {
+               PlayerUseKey ();
+       }
        else if(imp >= 200 && imp <= 229)
        {
                if(self.deadflag == DEAD_NO)
@@ -131,108 +135,79 @@ void ImpulseCommands (void)
                switch(imp)
                {
                        case 30:
-                               wp = WaypointSprite_DeployPersonal("waypoint", self.origin);
+                               wp = WaypointSprite_DeployPersonal("waypoint", self.origin, RADARICON_WAYPOINT, '0 1 1');
                                if(wp)
-                               {
-                                       WaypointSprite_UpdateTeamRadar(wp, RADARICON_WAYPOINT, '0 1 1');
                                        WaypointSprite_Ping(wp);
-                               }
                                sprint(self, "personal waypoint spawned at location\n");
                                break;
                        case 31:
                                WarpZone_crosshair_trace(self);
-                               wp = WaypointSprite_DeployPersonal("waypoint", trace_endpos);
+                               wp = WaypointSprite_DeployPersonal("waypoint", trace_endpos, RADARICON_WAYPOINT, '0 1 1');
                                if(wp)
-                               {
-                                       WaypointSprite_UpdateTeamRadar(wp, RADARICON_WAYPOINT, '0 1 1');
                                        WaypointSprite_Ping(wp);
-                               }
                                sprint(self, "personal waypoint spawned at crosshair\n");
                                break;
                        case 32:
                                if(vlen(self.death_origin))
                                {
-                                       wp = WaypointSprite_DeployPersonal("waypoint", self.death_origin);
+                                       wp = WaypointSprite_DeployPersonal("waypoint", self.death_origin, RADARICON_WAYPOINT, '0 1 1');
                                        if(wp)
-                                       {
-                                               WaypointSprite_UpdateTeamRadar(wp, RADARICON_WAYPOINT, '0 1 1');
                                                WaypointSprite_Ping(wp);
-                                       }
                                        sprint(self, "personal waypoint spawned at death location\n");
                                }
                                break;
                        case 33:
-                               if(self.deadflag == DEAD_NO && teams_matter)
+                               if(self.deadflag == DEAD_NO && teamplay)
                                {
-                                       wp = WaypointSprite_Attach("helpme", TRUE);
-                                       if(wp)
-                                               WaypointSprite_UpdateTeamRadar(wp, RADARICON_HELPME, '1 0.5 0'); // TODO choose better color
+                                       wp = WaypointSprite_Attach("helpme", TRUE, RADARICON_HELPME, '1 0.5 0');
                                        if(!wp)
-                                               wp = self.waypointsprite_attachedforcarrier; // flag sprite?
-                                       if(wp)
+                                               WaypointSprite_HelpMePing(self.waypointsprite_attachedforcarrier);
+                                       else
                                                WaypointSprite_Ping(wp);
                                        sprint(self, "HELP ME attached\n");
                                }
                                break;
                        case 34:
-                               wp = WaypointSprite_DeployFixed("here", FALSE, self.origin);
+                               wp = WaypointSprite_DeployFixed("here", FALSE, self.origin, RADARICON_HERE, '0 1 0');
                                if(wp)
-                               {
-                                       WaypointSprite_UpdateTeamRadar(wp, RADARICON_HERE, '0 1 0');
                                        WaypointSprite_Ping(wp);
-                               }
                                sprint(self, "HERE spawned at location\n");
                                break;
                        case 35:
                                WarpZone_crosshair_trace(self);
-                               wp = WaypointSprite_DeployFixed("here", FALSE, trace_endpos);
+                               wp = WaypointSprite_DeployFixed("here", FALSE, trace_endpos, RADARICON_HERE, '0 1 0');
                                if(wp)
-                               {
-                                       WaypointSprite_UpdateTeamRadar(wp, RADARICON_HERE, '0 1 0');
                                        WaypointSprite_Ping(wp);
-                               }
                                sprint(self, "HERE spawned at crosshair\n");
                                break;
                        case 36:
                                if(vlen(self.death_origin))
                                {
-                                       wp = WaypointSprite_DeployFixed("here", FALSE, self.death_origin);
+                                       wp = WaypointSprite_DeployFixed("here", FALSE, self.death_origin, RADARICON_HERE, '0 1 0');
                                        if(wp)
-                                       {
-                                               WaypointSprite_UpdateTeamRadar(wp, RADARICON_HERE, '0 1 0');
                                                WaypointSprite_Ping(wp);
-                                       }
                                        sprint(self, "HERE spawned at death location\n");
                                }
                                break;
                        case 37:
-                               wp = WaypointSprite_DeployFixed("danger", FALSE, self.origin);
+                               wp = WaypointSprite_DeployFixed("danger", FALSE, self.origin, RADARICON_DANGER, '1 0.5 0');
                                if(wp)
-                               {
-                                       WaypointSprite_UpdateTeamRadar(wp, RADARICON_DANGER, '1 0.5 0');
                                        WaypointSprite_Ping(wp);
-                               }
                                sprint(self, "DANGER spawned at location\n");
                                break;
                        case 38:
                                WarpZone_crosshair_trace(self);
-                               wp = WaypointSprite_DeployFixed("danger", FALSE, trace_endpos);
+                               wp = WaypointSprite_DeployFixed("danger", FALSE, trace_endpos, RADARICON_DANGER, '1 0.5 0');
                                if(wp)
-                               {
-                                       WaypointSprite_UpdateTeamRadar(wp, RADARICON_DANGER, '1 0.5 0');
                                        WaypointSprite_Ping(wp);
-                               }
                                sprint(self, "DANGER spawned at crosshair\n");
                                break;
                        case 39:
                                if(vlen(self.death_origin))
                                {
-                                       wp = WaypointSprite_DeployFixed("danger", FALSE, self.death_origin);
+                                       wp = WaypointSprite_DeployFixed("danger", FALSE, self.death_origin, RADARICON_DANGER, '1 0.5 0');
                                        if(wp)
-                                       {
-                                               WaypointSprite_UpdateTeamRadar(wp, RADARICON_DANGER, '1 0.5 0');
                                                WaypointSprite_Ping(wp);
-                                       }
                                        sprint(self, "DANGER spawned at death location\n");
                                }
                                break;
@@ -284,7 +259,7 @@ void ImpulseCommands (void)
                                case 107:
                                        for(e = findchain(classname, "waypoint"); e; e = e.chain)
                                        {
-                                               e.colormod_x = 1;
+                                               e.colormod = '0.5 0.5 0.5';
                                                e.effects &~= EF_NODEPTHTEST | EF_RED | EF_BLUE;
                                        }
                                        e2 = navigation_findnearestwaypoint(self, FALSE);
@@ -296,7 +271,7 @@ void ImpulseCommands (void)
                                                if(e.wpcost >= 10000000)
                                                {
                                                        print("unreachable: ", etos(e), " ", vtos(e.origin), "\n");
-                                                       e.colormod_x = 0.1;
+                                                       e.colormod_z = 8;
                                                        e.effects |= EF_NODEPTHTEST | EF_BLUE;
                                                        ++i;
                                                        ++m;
@@ -311,7 +286,7 @@ void ImpulseCommands (void)
                                                if(e.wpcost >= 10000000)
                                                {
                                                        print("cannot reach me: ", etos(e), " ", vtos(e.origin), "\n");
-                                                       e.colormod_x = 0.1;
+                                                       e.colormod_x = 8;
                                                        if not(e.effects & EF_NODEPTHTEST) // not already reported before
                                                                ++m;
                                                        e.effects |= EF_NODEPTHTEST | EF_RED;
@@ -342,12 +317,53 @@ void ImpulseCommands (void)
                                                        setmodel(e, self.model);
                                                        e.frame = self.frame;
                                                        e.skin = self.skin;
+                                                       e.colormod = '8 0.5 8';
                                                        setsize(e, '0 0 0', '0 0 0');
                                                        ++i;
                                                }
                                        }
                                        if(i)
                                                print(ftos(i), " spawnpoints have no nearest waypoint (marked by player model)\n");
+                                       i = 0;
+                                       entity start;
+                                       start = findchainflags(flags, FL_ITEM);
+                                       for(e = start; e; e = e.chain)
+                                       {
+                                               e.effects &~= EF_NODEPTHTEST | EF_RED | EF_BLUE;
+                                               e.colormod = '0.5 0.5 0.5';
+                                       }
+                                       for(e = start; e; e = e.chain)
+                                       {
+                                               if(navigation_findnearestwaypoint(e, FALSE))
+                                               {
+                                               }
+                                               else
+                                               {
+                                                       print("item without waypoint: ", etos(e), " ", vtos(e.origin), "\n");
+                                                       e.effects |= EF_NODEPTHTEST | EF_RED;
+                                                       e.colormod_x = 8;
+                                                       ++i;
+                                               }
+                                       }
+                                       if(i)
+                                               print(ftos(i), " items have no nearest waypoint and cannot be walked away from (marked with red light)\n");
+                                       i = 0;
+                                       for(e = start; e; e = e.chain)
+                                       {
+                                               org = e.origin;
+                                               if(navigation_findnearestwaypoint(e, TRUE))
+                                               {
+                                               }
+                                               else
+                                               {
+                                                       print("item without waypoint: ", etos(e), " ", vtos(e.origin), "\n");
+                                                       e.effects |= EF_NODEPTHTEST | EF_BLUE;
+                                                       e.colormod_z = 8;
+                                                       ++i;
+                                               }
+                                       }
+                                       if(i)
+                                               print(ftos(i), " items have no nearest waypoint and cannot be walked to (marked with blue light)\n");
                                        break;
                        }
                }
index e986341cd027eb11b5904f5542d5ab833e8a2ea9..1012734302a67f372e1979a78e2bdacbc7498526 100644 (file)
@@ -167,7 +167,7 @@ void PlayerJump (void)
                setanim(self, self.anim_jump, FALSE, TRUE, TRUE);
 
        if(g_jump_grunt)
-               PlayerSound(playersound_jump, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+               PlayerSound(playersound_jump, CH_PLAYER, VOICETYPE_PLAYERSOUND);
 
        self.restart_jump = -1; // restart jump anim next time
        // value -1 is used to not use the teleport bit (workaround for tiny hitch when re-jumping)
@@ -780,7 +780,7 @@ void SV_PlayerPhysics()
                        self.angles_x = random() * 360;
                        self.angles_y = random() * 360;
                        // at least I'm not forcing retardedview by also assigning to angles_z
-                       self.fixangle = 1;
+                       self.fixangle = TRUE;
                }
        }
 
@@ -904,6 +904,7 @@ void SV_PlayerPhysics()
        }
 
        if(self.flags & FL_ONGROUND)
+       if(self.classname == "player") // no fall sounds for observers thank you very much
        if(self.wasFlying)
        {
                self.wasFlying = 0;
@@ -918,9 +919,9 @@ void SV_PlayerPhysics()
                        if not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOSTEPS)
                        {
                                if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_METALSTEPS)
-                                       GlobalSound(globalsound_metalfall, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+                                       GlobalSound(globalsound_metalfall, CH_PLAYER, VOICETYPE_PLAYERSOUND);
                                else
-                                       GlobalSound(globalsound_fall, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+                                       GlobalSound(globalsound_fall, CH_PLAYER, VOICETYPE_PLAYERSOUND);
                        }
                }
        }
@@ -962,7 +963,7 @@ void SV_PlayerPhysics()
        {
                RaceCarPhysics();
        }
-       else if (self.movetype == MOVETYPE_NOCLIP || self.movetype == MOVETYPE_FLY)
+       else if (self.movetype == MOVETYPE_NOCLIP || self.movetype == MOVETYPE_FLY || self.movetype == MOVETYPE_FLY_WORLDONLY)
        {
                // noclipping or flying
                self.flags &~= FL_ONGROUND;
index 00810d2a0e09fede1e63b6958ea22eb106221171..4b8dc143f63438421c579b9fb992fae15511970e 100644 (file)
@@ -1,3 +1,6 @@
+.entity accuracy;
+.float accuracy_frags[WEP_MAXCOUNT];
+
 float weaponstats_buffer;
 
 void WeaponStats_Init()
@@ -10,23 +13,23 @@ void WeaponStats_Init()
 
 #define WEAPONSTATS_GETINDEX(awep,abot,vwep,vbot) (((vwep) + (awep) * (WEP_LAST - WEP_FIRST + 1) - (WEP_FIRST + WEP_FIRST * (WEP_LAST - WEP_FIRST + 1))) * 4 + (abot) * 2 + (vbot))
 
-void WeaponStats_Shutdown()
+void WeaponStats_ready(entity fh, entity pass, float status)
 {
-       float i, j, ibot, jbot, idx;
-       float fh;
+       float i, j, n, ibot, jbot, idx;
        vector v;
-       string prefix;
-       if(weaponstats_buffer < 0)
-               return;
-       prefix = strcat(autocvar_hostname, "\t", GetGametype(), "_", GetMapname(), "\t");
-       if(autocvar_sv_weaponstats_file != "")
+       string prefix, s;
+       switch(status)
        {
-               fh = fopen(autocvar_sv_weaponstats_file, FILE_APPEND);
-               if(fh >= 0)
-               {
-                       fputs(fh, "#begin statsfile\n");
-                       fputs(fh, strcat("#date ", strftime(TRUE, "%a %b %e %H:%M:%S %Z %Y"), "\n"));
-                       fputs(fh, strcat("#config ", ftos(crc16(FALSE, cvar_changes)), "\n"));
+               case URL_READY_CANWRITE:
+                       // url_fopen returned, we can write
+                       prefix = strcat(autocvar_hostname, "\t", GetGametype(), "_", GetMapname(), "\t");
+                       url_fputs(fh, "#begin statsfile\n");
+                       url_fputs(fh, strcat("#date ", strftime(TRUE, "%a %b %e %H:%M:%S %Z %Y"), "\n"));
+                       url_fputs(fh, strcat("#config ", ftos(crc16(FALSE, cvar_purechanges)), "\n"));
+                       url_fputs(fh, strcat("#cvar_purechanges ", ftos(cvar_purechanges_count), "\n"));
+                       n = tokenizebyseparator(cvar_purechanges, "\n");
+                       for(i = 0; i < n; ++i)
+                               url_fputs(fh, strcat("#cvar_purechange ", argv(i), "\n"));
                        for(i = WEP_FIRST; i <= WEP_LAST; ++i) for(ibot = 0; ibot <= 1; ++ibot)
                                for(j = WEP_FIRST; j <= WEP_LAST; ++j) for(jbot = 0; jbot <= 1; ++jbot)
                                {
@@ -35,17 +38,48 @@ void WeaponStats_Shutdown()
                                        if(v != '0 0 0')
                                        {
                                                //vector is: kills hits damage
-                                               fputs(fh, sprintf("%s%d %d\t%d %d\t", prefix, i, ibot, j, jbot));
-                                               fputs(fh, sprintf("%d %d %g\n", v_x, v_y, v_z));
+                                               url_fputs(fh, sprintf("%s%d %d\t%d %d\t", prefix, i, ibot, j, jbot));
+                                               url_fputs(fh, sprintf("%d %d %g\n", v_x, v_y, v_z));
                                        }
                                }
-                       fputs(fh, "#end\n\n");
-                       fclose(fh);
+                       url_fputs(fh, "#end\n\n");
+                       url_fclose(fh, WeaponStats_ready, world);
+                       buf_del(weaponstats_buffer);
+                       weaponstats_buffer = -1;
+                       break;
+               case URL_READY_CANREAD:
+                       // url_fclose is processing, we got a response for writing the data
+                       // this must come from HTTP
+                       print("Got response from weapon stats server:\n");
+                       while((s = url_fgets(fh)))
+                               print("  ", s, "\n");
+                       print("End of response.\n");
+                       url_fclose(fh, WeaponStats_ready, world);
+                       break;
+               case URL_READY_CLOSED:
+                       // url_fclose has finished
                        print("Weapon stats written\n");
-               }
+                       break;
+               case URL_READY_ERROR:
+               default:
+                       print("Weapon stats writing failed: ", ftos(status), "\n");
+                       break;
+       }
+}
+
+void WeaponStats_Shutdown()
+{
+       if(weaponstats_buffer < 0)
+               return;
+       if(autocvar_sv_weaponstats_file != "")
+       {
+               url_fopen(autocvar_sv_weaponstats_file, FILE_APPEND, WeaponStats_ready, world);
+       }
+       else
+       {
+               buf_del(weaponstats_buffer);
+               weaponstats_buffer = -1;
        }
-       buf_del(weaponstats_buffer);
-       weaponstats_buffer = -1;
 }
 
 void WeaponStats_LogItem(float awep, float abot, float vwep, float vbot, vector item)
@@ -340,11 +374,11 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float
        if(sound_allowed(MSG_BROADCAST, attacker))
        {
                if (save > 10)
-                       sound (self, CHAN_PROJECTILE, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM);
+                       sound (self, CH_SHOTS, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM);
                else if (take > 30)
-                       sound (self, CHAN_PROJECTILE, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM);
+                       sound (self, CH_SHOTS, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM);
                else if (take > 10)
-                       sound (self, CHAN_PROJECTILE, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM);
+                       sound (self, CH_SHOTS, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM);
        }
 
        if (take > 50)
@@ -458,11 +492,11 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
        if(sound_allowed(MSG_BROADCAST, attacker))
        {
                if (save > 10)
-                       sound (self, CHAN_PROJECTILE, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM);
+                       sound (self, CH_SHOTS, "misc/armorimpact.wav", VOL_BASE, ATTN_NORM);
                else if (take > 30)
-                       sound (self, CHAN_PROJECTILE, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM);
+                       sound (self, CH_SHOTS, "misc/bodyimpact2.wav", VOL_BASE, ATTN_NORM);
                else if (take > 10)
-                       sound (self, CHAN_PROJECTILE, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM); // FIXME possibly remove them?
+                       sound (self, CH_SHOTS, "misc/bodyimpact1.wav", VOL_BASE, ATTN_NORM); // FIXME possibly remove them?
        }
 
        if (take > 50)
@@ -498,15 +532,15 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                                        // exclude pain sounds for laserjumps as long as you aren't REALLY low on health and would die of the next two
                                        {
                                                if(deathtype == DEATH_FALL)
-                                                       PlayerSound(playersound_fall, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
+                                                       PlayerSound(playersound_fall, CH_PAIN, VOICETYPE_PLAYERSOUND);
                                                else if(self.health > 75) // TODO make a "gentle" version?
-                                                       PlayerSound(playersound_pain100, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
+                                                       PlayerSound(playersound_pain100, CH_PAIN, VOICETYPE_PLAYERSOUND);
                                                else if(self.health > 50)
-                                                       PlayerSound(playersound_pain75, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
+                                                       PlayerSound(playersound_pain75, CH_PAIN, VOICETYPE_PLAYERSOUND);
                                                else if(self.health > 25)
-                                                       PlayerSound(playersound_pain50, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
+                                                       PlayerSound(playersound_pain50, CH_PAIN, VOICETYPE_PLAYERSOUND);
                                                else
-                                                       PlayerSound(playersound_pain25, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
+                                                       PlayerSound(playersound_pain25, CH_PAIN, VOICETYPE_PLAYERSOUND);
                                        }
                                }
 
@@ -530,7 +564,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                // escape a lava pit or similar
                //self.pushltime = 0;
        }
-       else if(attacker.classname == "player" || attacker.classname == "gib")
+       else if(attacker.classname == "player")
        {
                self.pusher = attacker;
                self.pushltime = time + autocvar_g_maxpushtime;
@@ -559,7 +593,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                        awep = DEATH_WEAPONOF(deathtype);
                valid_damage_for_weaponstats = 1;
        }
-       
+
        if(valid_damage_for_weaponstats)
        {
                dh = dh - max(self.health, 0);
@@ -585,9 +619,9 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                if(sound_allowed(MSG_BROADCAST, attacker))
                {
                        if(deathtype == DEATH_DROWN)
-                               PlayerSound(playersound_drown, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
+                               PlayerSound(playersound_drown, CH_PAIN, VOICETYPE_PLAYERSOUND);
                        else
-                               PlayerSound(playersound_death, CHAN_PAIN, VOICETYPE_PLAYERSOUND);
+                               PlayerSound(playersound_death, CH_PAIN, VOICETYPE_PLAYERSOUND);
                }
 
                // get rid of kill indicator
@@ -619,6 +653,14 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                race_PreDie();
                DropAllRunes(self);
 
+        // increment frag counter for used weapon type
+        float w;
+        w = DEATH_WEAPONOF(deathtype);
+        if(WEP_VALID(w))
+        if(self.classname == "player")
+        if(self != attacker)
+        attacker.accuracy.(accuracy_frags[w-1]) += 1;
+
                if(deathtype == DEATH_HURTTRIGGER && g_freezetag)
                {
                        PutClientInServer();
@@ -635,7 +677,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
 
                if(self.flagcarried)
                {
-                       if(attacker.classname != "player" && attacker.classname != "gib")
+                       if(attacker.classname != "player")
                                DropFlag(self.flagcarried, self, attacker); // penalty for flag loss by suicide
                        else if(attacker.team == self.team)
                                DropFlag(self.flagcarried, attacker, attacker); // penalty for flag loss by suicide/teamkill
@@ -764,7 +806,7 @@ float Say(entity source, float teamsay, entity privatesay, string msgin, float f
 
        if(source.classname != "player")
                colorstr = "^0"; // black for spectators
-       else if(teams_matter)
+       else if(teamplay)
                colorstr = Team_ColorCode(source.team);
        else
                teamsay = FALSE;
@@ -1126,8 +1168,9 @@ void UpdatePlayerSounds()
        self.skinindex_for_playersound = self.skinindex;
        ClearPlayerSounds();
        LoadPlayerSounds("sound/player/default.sounds", 1);
-       if(!LoadPlayerSounds(get_model_datafilename(self.model, self.skinindex, "sounds"), 0))
-               LoadPlayerSounds(get_model_datafilename(self.model, 0, "sounds"), 0);
+       if(!autocvar_g_debug_defaultsounds)
+               if(!LoadPlayerSounds(get_model_datafilename(self.model, self.skinindex, "sounds"), 0))
+                       LoadPlayerSounds(get_model_datafilename(self.model, 0, "sounds"), 0);
 }
 
 void FakeGlobalSound(string sample, float chan, float voicetype)
@@ -1253,7 +1296,7 @@ void GlobalSound(string sample, float chan, float voicetype)
                        break;
                case VOICETYPE_TEAMRADIO:
                        FOR_EACH_REALCLIENT(msg_entity)
-                               if(!teams_matter || msg_entity.team == self.team)
+                               if(!teamplay || msg_entity.team == self.team)
                                {
                                        if(msg_entity.cvar_cl_voice_directional == 1)
                                                soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
@@ -1327,9 +1370,9 @@ void VoiceMessage(string type, string msg)
        flood = Say(self, ownteam, world, msg, 1);
 
        if (flood > 0)
-               GlobalSound(self.sample, CHAN_VOICE, voicetype);
+               GlobalSound(self.sample, CH_VOICE, voicetype);
        else if (flood < 0)
-               FakeGlobalSound(self.sample, CHAN_VOICE, voicetype);
+               FakeGlobalSound(self.sample, CH_VOICE, voicetype);
 }
 
 void MoveToTeam(entity client, float team_colour, float type, float show_message)
index cab6ec6e75c5adcb56a8d7b07b417875a2a251c6..658fe54d32901b2b689df87a6424ad47c05d9288 100644 (file)
@@ -284,8 +284,6 @@ void W_ThrowWeapon(vector velo, vector delta, float doreduce)
        w = self.weapon;
        if (w == 0)
                return; // just in case
-       if(self.weapon_forbidchange)
-               return;
        if(MUTATOR_CALLHOOK(ForbidThrowCurrentWeapon))
                return;
        if(!autocvar_g_weapon_throwable)
@@ -374,8 +372,7 @@ void W_WeaponFrame()
                        if(ATTACK_FINISHED(self) <= time + self.weapon_frametime * 0.5)
                        {
 #endif
-                       // UGLY WORKAROUND: play this on CHAN_WEAPON2 so it can't cut off fire sounds
-                       sound (self, CHAN_WEAPON2, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM);
+                       sound (self, CH_WEAPON_SINGLE, "weapons/weapon_switch.wav", VOL_BASE, ATTN_NORM);
                        self.weaponentity.state = WS_DROP;
                        // set up weapon switch think in the future, and start drop anim
                        weapon_thinkf(WFRAME_DONTCHANGE, autocvar_g_balance_weaponswitchdelay, w_clear);
@@ -406,13 +403,16 @@ void W_WeaponFrame()
                        W_SwitchWeapon_Force(self, w_getbestweapon(self));
                        wb = 0;
                }
+
+               v_forward = fo;
+               v_right = ri;
+               v_up = up;
+
                if(wb)
-               {
-                       v_forward = fo;
-                       v_right = ri;
-                       v_up = up;
                        weapon_action(self.weapon, WR_THINK);
-               }
+               else
+                       weapon_action(self.weapon, WR_GONETHINK);
+
                if (time + self.weapon_frametime * 0.5 >= self.weapon_nextthink)
                {
                        if(self.weapon_think)
index 4233e7d92d755b7651a60362f27080c192e888c7..d1db16d4ca462feaf5c5796cff015b372b0dd190 100644 (file)
@@ -34,10 +34,6 @@ float W_WeaponRateFactor()
 
 void W_SwitchWeapon_Force(entity e, float w)
 {
-       // don't switch to another weapon if we're not allowed to
-       if(e.weapon_forbidchange)
-               return;
-
        e.cnt = e.switchweapon;
        e.switchweapon = w;
        e.selectweapon = w;
@@ -142,7 +138,7 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector m
        local float oldsolid;
        vector vecs, dv;
        oldsolid = ent.dphitcontentsmask;
-       if(ent.weapon == WEP_SNIPERRIFLE)
+       if(ent.weapon == WEP_RIFLE)
                ent.dphitcontentsmask = DPCONTENTS_BODY | DPCONTENTS_CORPSE;
        else
                ent.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_CORPSE;
@@ -255,7 +251,7 @@ void W_SetupShot_Dir_ProjectileSize_Range(entity ent, vector s_forward, vector m
                (time > ent.prevstrengthsoundattempt + autocvar_sv_strengthsound_antispam_refire_threshold)
        ) // prevent insane sound spam
        {
-               sound(ent, CHAN_AUTO, "weapons/strength_fire.wav", VOL_BASE, ATTN_NORM);
+               sound(ent, CH_TRIGGER, "weapons/strength_fire.wav", VOL_BASE, ATTN_NORM);
                ent.prevstrengthsound = time;
        }
        ent.prevstrengthsoundattempt = time;
@@ -828,33 +824,36 @@ void CL_ExteriorWeaponentity_Think()
        else
                self.alpha = 1;
 
-       ang_x = bound(sv_pitch_min, self.owner.v_angle_x, sv_pitch_max);
-       ang_y = 0;
-       ang_z = 0;
-
-       if(sv_pitch_fixyaw) // workaround for stupid player models that don't aim forward
-       {
-               ang_y = self.owner.v_angle_y;
-               makevectors(ang);
-               var vector v = v_forward;
-               var float t = self.tag_entity.frame1time;
-               var float f = self.tag_entity.frame;
-               self.tag_entity.frame1time = time;
-               self.tag_entity.frame = self.tag_entity.anim_idle_x;
-               gettaginfo(self.tag_entity, self.tag_index);
-               self.tag_entity.frame1time = t;
-               self.tag_entity.frame = f;
-               // untransform v according to this coordinate space
-               vector w;
-               w_x = v_forward * v;
-               w_y = -v_right * v;
-               w_z = v_up * v;
-               self.angles = vectoangles(w);
-       }
-       else
+       if (!intermission_running)
        {
-               ang_x = -/* don't ask */ang_x;
-               self.angles = ang;
+               ang_x = bound(sv_pitch_min, self.owner.v_angle_x, sv_pitch_max);
+               ang_y = 0;
+               ang_z = 0;
+
+               if(sv_pitch_fixyaw) // workaround for stupid player models that don't aim forward
+               {
+                       ang_y = self.owner.v_angle_y;
+                       makevectors(ang);
+                       var vector v = v_forward;
+                       var float t = self.tag_entity.frame1time;
+                       var float f = self.tag_entity.frame;
+                       self.tag_entity.frame1time = time;
+                       self.tag_entity.frame = self.tag_entity.anim_idle_x;
+                       gettaginfo(self.tag_entity, self.tag_index);
+                       self.tag_entity.frame1time = t;
+                       self.tag_entity.frame = f;
+                       // untransform v according to this coordinate space
+                       vector w;
+                       w_x = v_forward * v;
+                       w_y = -v_right * v;
+                       w_z = v_up * v;
+                       self.angles = vectoangles(w);
+               }
+               else
+               {
+                       ang_x = -/* don't ask */ang_x;
+                       self.angles = ang;
+               }
        }
 
        self.glowmod = self.owner.weaponentity_glowmod;
@@ -983,7 +982,8 @@ float client_hasweapon(entity cl, float wpn, float andammo, float complain)
                                                world, e.origin,
                                                self, 0,
                                                world, enemy,
-                                               0
+                                               0,
+                                               RADARICON_NONE, '0 0 0'
                                        );
                                }
                        }
@@ -1059,7 +1059,7 @@ float weapon_prepareattack_checkammo(float secondary)
 
                if(self.weapon == self.switchweapon && time - self.prevdryfire > 1) // only play once BEFORE starting to switch weapons
                {
-                       sound (self, CHAN_AUTO, "weapons/dryfire.wav", VOL_BASE, ATTN_NORM);
+                       sound (self, CH_WEAPON_A, "weapons/dryfire.wav", VOL_BASE, ATTN_NORM);
                        self.prevdryfire = time;
                }
 
@@ -1257,21 +1257,20 @@ void weapon_thinkf(float fr, float t, void() func)
        self.weapon_think = func;
        //dprint("next ", ftos(self.weapon_nextthink), "\n");
 
-    // The shoot animation looks TERRIBLE without animation blending! Yay for moonwalking while shooting!
-    /*
+       // The shoot animation looks TERRIBLE without animation blending! Yay for moonwalking while shooting!
+       //anim = self.anim_shoot;
        if (restartanim)
        if (t)
        if (!self.crouch) // shoot anim stands up, this looks bad
        {
-               local vector anim;
+               vector anim;
                if(self.weapon == WEP_SHOTGUN && self.BUTTON_ATCK2)
+               {
                        anim = self.anim_melee;
-               else
-                       anim = self.anim_shoot;
-               anim_z = anim_y / (t + sys_frametime);
-               setanim(self, anim, FALSE, TRUE, TRUE);
+                       anim_z = anim_y / (t + sys_frametime);
+                       setanim(self, anim, FALSE, TRUE, TRUE);
+               }
        }
-    */
 };
 
 void weapon_boblayer1(float spd, vector org)
@@ -1730,7 +1729,7 @@ void W_Reload(float sent_ammo_min, float sent_ammo_amount, float sent_time, stri
 
        // now begin the reloading process
 
-       sound (self, CHAN_WEAPON2, self.reload_sound, VOL_BASE, ATTN_NORM);
+       sound (self, CH_WEAPON_B, self.reload_sound, VOL_BASE, ATTN_NORM);
 
        // do not set ATTACK_FINISHED in reload code any more. This causes annoying delays if eg: You start reloading a weapon,
        // then quickly switch to another weapon and back. Reloading is canceled, but the reload delay is still there,
index 40e0fcd469723d9bcae56b594a7cb8b3c6ca863f..13cddc0d22cf87a7734b7d8ec77dbd07ba92d792 100644 (file)
@@ -1,11 +1,22 @@
 entity nagger;
 float readycount;
+
 float Nagger_SendEntity(entity to, float sendflags)
 {
        float nags, i, f, b;
        entity e;
        WriteByte(MSG_ENTITY, ENT_CLIENT_NAGGER);
 
+       // bits:
+       //   1 = ready
+       //   2 = player needs to ready up
+       //   4 = vote
+       //   8 = player needs to vote
+       //  16 = warmup
+       // sendflags:
+       //  64 = vote counts
+       // 128 = vote string
+
        nags = 0;
        if(readycount)
        {
@@ -22,16 +33,28 @@ float Nagger_SendEntity(entity to, float sendflags)
        if(inWarmupStage)
                nags |= 16;
 
+       if(sendflags & 64)
+               nags |= 64;
+
        if(sendflags & 128)
                nags |= 128;
 
+       if(!(nags & 4)) // no vote called? send no string
+               nags &~= (64 | 128);
+
        WriteByte(MSG_ENTITY, nags);
 
-       if(nags & 128)
+       if(nags & 64)
        {
-               WriteString(MSG_ENTITY, votecalledvote_display);
+               WriteByte(MSG_ENTITY, vote_yescount);
+               WriteByte(MSG_ENTITY, vote_nocount);
+               WriteByte(MSG_ENTITY, vote_needed_absolute);
+               WriteChar(MSG_ENTITY, to.vote_vote);
        }
 
+       if(nags & 128)
+               WriteString(MSG_ENTITY, votecalledvote_display);
+
        if(nags & 1)
        {
                for(i = 1; i <= maxclients; i += 8)
@@ -57,7 +80,7 @@ void Nagger_VoteChanged()
 void Nagger_VoteCountChanged()
 {
        if(nagger)
-               nagger.SendFlags |= 1;
+               nagger.SendFlags |= 64;
 }
 void Nagger_ReadyCounted()
 {
@@ -174,7 +197,7 @@ void SV_ParseClientCommand(string s) {
                        ClientKill_TeamChange(-2); // observe
                } else if(autocvar_g_campaign || autocvar_g_balance_teams || autocvar_g_balance_teams_force) {
                        //JoinBestTeam(self, FALSE, TRUE);
-               } else if(teams_matter && !autocvar_sv_spectate && !(self.team_forced > 0)) {
+               } else if(teamplay && !autocvar_sv_spectate && !(self.team_forced > 0)) {
                        self.classname = "observer";
                        stuffcmd(self,"menu_showteamselect\n");
                }
@@ -216,6 +239,11 @@ void SV_ParseClientCommand(string s) {
                if(self.classname == "player" && autocvar_sv_spectate == 1) {
                        ClientKill_TeamChange(-2); // observe
                }
+               if(g_ca && self.caplayer && (self.classname == "spectator" || self.classname == "observer")) {
+                       // in CA, allow a dead player to move to spectatators (without that, caplayer!=0 will be moved back to the player list)
+                       sprint(self, "WARNING: you will spectate in the next round.\n");
+                       self.caplayer = 0;
+               }
        } else if(cmd == "join") {
                if not(self.flags & FL_CLIENT)
                        return;
@@ -234,13 +262,13 @@ void SV_ParseClientCommand(string s) {
                        }
                        else {
                                //player may not join because of g_maxplayers is set
-                               centerprint_atprio(self, CENTERPRIO_MAPVOTE, PREVENT_JOIN_TEXT);
+                               centerprint(self, PREVENT_JOIN_TEXT);
                        }
                }
        } else if( cmd == "selectteam" ) {
                if not(self.flags & FL_CLIENT)
                        return;
-               if( !teams_matter ) {
+               if( !teamplay ) {
                        sprint( self, "selectteam can only be used in teamgames\n");
                } else if(autocvar_g_campaign) {
                        //JoinBestTeam(self, 0);
@@ -442,7 +470,7 @@ void ReadyRestartForce()
        readycount = 0;
        Nagger_ReadyCounted(); // NOTE: this causes a resend of that entity, and will also turn off warmup state on the client
 
-       if(autocvar_teamplay_lockonrestart && teams_matter) {
+       if(autocvar_teamplay_lockonrestart && teamplay) {
                lockteams = 1;
                bprint("^1The teams are now locked.\n");
        }
index dca76fe003ca685ebee8e32bfdee56c0228e63fe..5e18a5cc60c55bb4936887ab9fab6f8b80153105 100644 (file)
@@ -33,6 +33,7 @@ float MOVETYPE_FLYMISSILE                     = 9;
 float  MOVETYPE_BOUNCE                         = 10;
 float  MOVETYPE_BOUNCEMISSILE  = 11;   // Like bounce but doesn't lose speed on bouncing
 //float        MOVETYPE_FOLLOW                         = 12;   // 'Attaches' the entity to its aim_ent
+//float MOVETYPE_FLY_WORLDONLY = 33;
 
 float  SOLID_NOT                               = 0;
 float  SOLID_TRIGGER                           = 1;
index 31e5b7788513b7eb180cd929c10d46bae871fc08..d5b6697f25932c34ca6936951f6283fd235f9acd 100644 (file)
@@ -103,25 +103,3 @@ void UpdateCSQCProjectileAfterTeleport(entity e)
                e.SendFlags |= 0x08;
        }
 }
-
-.void(void) csqcprojectile_oldthink;
-.float csqcprojectile_oldnextthink;
-
-void CSQCProjectile_Update_Think()
-{
-       UpdateCSQCProjectile(self);
-       self.think = self.csqcprojectile_oldthink;
-       self.nextthink = max(time, self.csqcprojectile_oldnextthink);
-}
-
-void UpdateCSQCProjectileNextFrame(entity e)
-{
-       if(e.SendEntity == CSQCProjectile_SendEntity)
-       if(e.think != CSQCProjectile_Update_Think)
-       {
-               e.csqcprojectile_oldthink = e.think;
-               e.csqcprojectile_oldnextthink = e.nextthink;
-               e.think = CSQCProjectile_Update_Think;
-               e.nextthink = time;
-       }
-}
index f569279e41983023e780d512440366947538cfc3..e00c0988b9d8c058b1d2b277048b3edbd7d2dd38 100644 (file)
@@ -3,5 +3,4 @@
 void CSQCProjectile(entity e, float clientanimate, float type, float docull);
 void UpdateCSQCProjectile(entity e);
 void UpdateCSQCProjectileAfterTeleport(entity e);
-void UpdateCSQCProjectileNextFrame(entity e);
 void CSQCProjectile_Check(entity e);
index cf16cecff77aedae5f569a8aff92b3f0901f8e51..7b78958451dc79f6ae5d5ae80eac1d16343b858c 100644 (file)
@@ -49,7 +49,7 @@ float ctf_captureshield_shielded(entity p)
 
        // player is in the worse half, if >= half the players are better than him, or consequently, if < half of the players are worse
        // use this rule here
-       
+
        if(players_worseeq >= players_total * captureshield_max_ratio)
                return FALSE;
 
@@ -66,12 +66,12 @@ void ctf_captureshield_update(entity p, float dir)
                {
                        if(should)
                        {
-                               centerprint_atprio(p, CENTERPRIO_SHIELDING, "^3You are now ^4shielded^3 from the flag\n^3for ^1too many unsuccessful attempts^3 to capture.\n\n^3Make some defensive scores before trying again.");
+                               Send_CSQC_Centerprint_Generic(other, CPID_CTF_CAPTURESHIELD, "^3You are ^4shielded^3 from the flag\n^3for ^1too many unsuccessful attempts^3 to capture.\n\n^3Get some defensive scores before trying again.", 5, 0);
                                // TODO csqc notifier for this
                        }
                        else
                        {
-                               centerprint_atprio(p, CENTERPRIO_SHIELDING, "^3You are now free.\n\n^3Feel free to ^1try to capture^3 the flag again\n^3if you think you will succeed.");
+                               Send_CSQC_Centerprint_Generic(p, CPID_CTF_CAPTURESHIELD, "^3You are now free.\n\n^3Feel free to ^1try to capture^3 the flag again\n^3if you think you will succeed.", 5, 0);
                                // TODO csqc notifier for this
                        }
                        p.ctf_captureshielded = should;
@@ -88,6 +88,7 @@ float ctf_captureshield_customize()
        return TRUE;
 }
 
+.float ctf_captureshield_touch_msgtime;
 void ctf_captureshield_touch()
 {
        if not(other.ctf_captureshielded)
@@ -99,7 +100,9 @@ void ctf_captureshield_touch()
        mymid = (self.absmin + self.absmax) * 0.5;
        othermid = (other.absmin + other.absmax) * 0.5;
        Damage(other, self, self, 0, DEATH_HURTTRIGGER, mymid, normalize(othermid - mymid) * captureshield_force);
-       centerprint_atprio(other, CENTERPRIO_SHIELDING, "^3You are ^4shielded^3 from the flag\n^3for ^1too many unsuccessful attempts^3 to capture.\n\n^3Get some defensive scores before trying again.");
+       if (time - other.ctf_captureshield_touch_msgtime > 2)
+               Send_CSQC_Centerprint_Generic(other, CPID_CTF_CAPTURESHIELD, "^3You are ^4shielded^3 from the flag\n^3for ^1too many unsuccessful attempts^3 to capture.\n\n^3Get some defensive scores before trying again.", 5, 0);
+       other.ctf_captureshield_touch_msgtime = time;
 }
 
 void ctf_flag_spawnstuff()
@@ -125,15 +128,9 @@ void ctf_flag_spawnstuff()
        self.basewaypoint = self.nearestwaypoint;
 
        if(self.team == COLOR_TEAM1)
-       {
-               WaypointSprite_SpawnFixed("redbase", self.origin + '0 0 61', self, sprite);
-               WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_FLAG, colormapPaletteColor(COLOR_TEAM1 - 1, FALSE));
-       }
+               WaypointSprite_SpawnFixed("redbase", self.origin + '0 0 61', self, sprite, RADARICON_FLAG, colormapPaletteColor(COLOR_TEAM1 - 1, FALSE));
        else
-       {
-               WaypointSprite_SpawnFixed("bluebase", self.origin + '0 0 61', self, sprite);
-               WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_FLAG, colormapPaletteColor(COLOR_TEAM2 - 1, FALSE));
-       }
+               WaypointSprite_SpawnFixed("bluebase", self.origin + '0 0 61', self, sprite, RADARICON_FLAG, colormapPaletteColor(COLOR_TEAM2 - 1, FALSE));
 }
 
 float ctf_score_value(string parameter)
@@ -296,11 +293,11 @@ void DropFlag(entity e, entity penalty_receiver, entity attacker)
        ctf_captureshield_update(p, 0); // shield only
        e.playerid = attacker.playerid;
        e.ctf_droptime = time;
-       WaypointSprite_Spawn("flagdropped", 0, 0, e, '0 0 1' * 61, world, COLOR_TEAM1 + COLOR_TEAM2 - e.team, e, waypointsprite_attachedforcarrier, FALSE);
+       WaypointSprite_Spawn("flagdropped", 0, 0, e, '0 0 1' * 61, world, COLOR_TEAM1 + COLOR_TEAM2 - e.team, e, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAG, '0 1 1');
+       WaypointSprite_Ping(e.waypointsprite_attachedforcarrier);
        
        if(p.waypointsprite_attachedforcarrier)
        {
-               WaypointSprite_Ping(p.waypointsprite_attachedforcarrier);
                WaypointSprite_DetachCarrier(p);
        }
        else
@@ -309,7 +306,7 @@ void DropFlag(entity e, entity penalty_receiver, entity attacker)
                backtrace("Flag carrier had no flag sprite?!?");
        }
        LogCTF("dropped", p.team, p);
-       sound (self, CHAN_TRIGGER, self.noise4, VOL_BASE, ATTN_NONE);
+       sound (p, CH_TRIGGER, self.noise4, VOL_BASE, ATTN_NONE);
 
        setattachment(e, world, "");
        e.damageforcescale = autocvar_g_balance_ctf_damageforcescale;
@@ -364,7 +361,7 @@ void FlagThink()
                {
                        bprint("The ", self.netname, " became impatient after ", ftos_decimals(flagcaptimerecord, 2), " seconds and returned itself\n");
 
-                       sound (self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NONE);
+                       sound (self, CH_TRIGGER, self.noise3, VOL_BASE, ATTN_NONE);
                        self.owner.impulse = 141; // returning!
 
                        e = self;
@@ -391,7 +388,7 @@ void FlagThink()
                if (time > self.pain_finished)
                {
                        bprint("The ", self.netname, " has returned to base\n");
-                       sound (self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NONE);
+                       sound (self, CH_TRIGGER, self.noise3, VOL_BASE, ATTN_NONE);
                        LogCTF("returned", self.team, world);
                        ReturnFlag(self);
                }
@@ -405,12 +402,18 @@ void FlagThink()
                DropFlag(self, world, world);
                return;
        }
-
-       if(autocvar_g_ctf_allow_drop)
-       if(e.BUTTON_USE)
-               DropFlag(self, e, world);
 };
 
+float ctf_usekey()
+{
+       if(self.flagcarried)
+       {
+               DropFlag(self.flagcarried, self, world);
+               return TRUE;
+       }
+       return FALSE;
+}
+
 void flag_cap_ring_spawn(vector org)
 {
        shockwave_spawn("models/ctf/shockwavetransring.md3", org - '0 0 15', -0.8, 0, 1);
@@ -493,7 +496,7 @@ void FlagTouch()
                        }
                }
 
-               sound (other, CHAN_AUTO, self.noise2, VOL_BASE, ATTN_NONE);
+               sound (other, CH_TRIGGER, self.noise2, VOL_BASE, ATTN_NONE);
                WaypointSprite_DetachCarrier(other);
                if(self.speedrunning)
                        FakeTimeLimit(other, -1);
@@ -509,10 +512,10 @@ void FlagTouch()
        {
                if (other.next_take_time > time)
                        return;
-                       
+
                if (autocvar_g_ctf_flag_pickup_effects) // pickup effect
                        pointparticles(particleeffectnum("smoke_ring"), 0.5 * (self.absmin + self.absmax), '0 0 0', 1);
-                       
+
                // pick up
                self.flagpickuptime = time; // used for timing runs
                self.speedrunning = other.speedrunning; // if speedrunning, flag will self-return and teleport the owner back after the record
@@ -531,7 +534,7 @@ void FlagTouch()
                self.dropperid = other.playerid;
                PlayerScore_Add(other, SP_CTF_PICKUPS, 1);
                LogCTF("steal", self.team, other);
-               sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NONE);
+               sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NONE);
 
                FOR_EACH_PLAYER(player)
                        if(player.team == self.team)
@@ -540,8 +543,7 @@ void FlagTouch()
                self.movetype = MOVETYPE_NONE;
                setorigin(self, FLAG_CARRY_POS);
                setattachment(self, other, "");
-               WaypointSprite_AttachCarrier("flagcarrier", other);
-               WaypointSprite_UpdateTeamRadar(other.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '1 1 0');
+               WaypointSprite_AttachCarrier("flagcarrier", other, RADARICON_FLAGCARRIER, '1 1 0');
                WaypointSprite_Ping(self.sprite);
 
                return;
@@ -587,7 +589,7 @@ void FlagTouch()
                        }
                        PlayerScore_Add(other, SP_CTF_RETURNS, 1);
                        LogCTF("return", self.team, other);
-                       sound (other, CHAN_AUTO, self.noise1, VOL_BASE, ATTN_NONE);
+                       sound (other, CH_TRIGGER, self.noise1, VOL_BASE, ATTN_NONE);
                        ReturnFlag(self);
                }
                else if (!other.flagcarried && (other.playerid != self.dropperid || time > self.ctf_droptime + autocvar_g_balance_ctf_delay_collect))
@@ -597,7 +599,7 @@ void FlagTouch()
 
                        if (autocvar_g_ctf_flag_pickup_effects) // field pickup effect
                                pointparticles(particleeffectnum("smoke_ring"), 0.5 * (self.absmin + self.absmax), '0 0 0', 1);
-                       
+
                        // pick up
                        self.solid = SOLID_NOT;
                        setorigin(self, self.origin); // relink
@@ -619,7 +621,7 @@ void FlagTouch()
                        UpdateFrags(other, f);
                        PlayerScore_Add(other, SP_CTF_PICKUPS, 1);
                        LogCTF("pickup", self.team, other);
-                       sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NONE);
+                       sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NONE);
 
                        FOR_EACH_PLAYER(player)
                                if(player.team == self.team)
@@ -630,8 +632,7 @@ void FlagTouch()
                        setattachment(self, other, "");
                        self.damageforcescale = 0;
                        self.takedamage = DAMAGE_NO;
-                       WaypointSprite_AttachCarrier("flagcarrier", other);
-                       WaypointSprite_UpdateTeamRadar(other.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '1 1 0');
+                       WaypointSprite_AttachCarrier("flagcarrier", other, RADARICON_FLAGCARRIER, '1 1 0');
                }
        }
 };
@@ -736,7 +737,7 @@ void item_flag_postspawn()
                if(self.team == COLOR_TEAM2)
                        // Blue
                        self.glow_color = 210;
-                       
+
                self.glow_size = 25;
                self.glow_trail = 1;
        }
@@ -767,6 +768,7 @@ Keys:
  (default ctf/respawn.wav)
 */
 
+void spawnfunc_item_flag_team2();
 void spawnfunc_item_flag_team1()
 {
        if (!g_ctf)
@@ -775,21 +777,22 @@ void spawnfunc_item_flag_team1()
                return;
        }
 
+       if (g_ctf_reverse)
+       {
+               float old_g_ctf_reverse = g_ctf_reverse;
+               g_ctf_reverse = 0; // avoid an endless loop
+               spawnfunc_item_flag_team2();
+               g_ctf_reverse = old_g_ctf_reverse;
+               return;
+       }
+
        // link flag into ctf_worldflaglist
        self.ctf_worldflagnext = ctf_worldflaglist;
        ctf_worldflaglist = self;
 
        self.classname = "item_flag_team";
-       if(g_ctf_reverse)
-       {
-               self.team = COLOR_TEAM2; // color 13 team (blue)
-               self.items = IT_KEY1; // silver key (bluish enough)
-       }
-       else
-       {
-               self.team = COLOR_TEAM1; // color 4 team (red)
-               self.items = IT_KEY2; // gold key (redish enough)
-       }
+       self.team = COLOR_TEAM1; // color 4 team (red)
+       self.items = IT_KEY2; // gold key (redish enough)
        self.netname = "^1RED^7 flag";
        self.target = "###item###";
        self.skin = autocvar_g_ctf_flag_red_skin;
@@ -873,21 +876,22 @@ void spawnfunc_item_flag_team2()
                return;
        }
 
+       if (g_ctf_reverse)
+       {
+               float old_g_ctf_reverse = g_ctf_reverse;
+               g_ctf_reverse = 0; // avoid an endless loop
+               spawnfunc_item_flag_team1();
+               g_ctf_reverse = old_g_ctf_reverse;
+               return;
+       }
+
        // link flag into ctf_worldflaglist
        self.ctf_worldflagnext = ctf_worldflaglist;
        ctf_worldflaglist = self;
 
        self.classname = "item_flag_team";
-       if(g_ctf_reverse)
-       {
-               self.team = COLOR_TEAM1; // color 4 team (red)
-               self.items = IT_KEY2; // gold key (redish enough)
-       }
-       else
-       {
-               self.team = COLOR_TEAM2; // color 13 team (blue)
-               self.items = IT_KEY1; // silver key (bluish enough)
-       }
+       self.team = COLOR_TEAM2; // color 13 team (blue)
+       self.items = IT_KEY1; // silver key (bluish enough)
        self.netname = "^4BLUE^7 flag";
        self.target = "###item###";
        self.skin = autocvar_g_ctf_flag_blue_skin;
@@ -1081,7 +1085,7 @@ entity(float cteam) ctf_team_has_commander =
        entity pl;
        if(cteam != COLOR_TEAM1 || cteam != COLOR_TEAM2)
                return world;
-       
+
        FOR_EACH_REALPLAYER(pl) {
                if(pl.team == cteam && pl.iscommander) {
                        return pl;
@@ -1099,7 +1103,7 @@ void(entity e, float st) ctf_setstate =
 void(float cteam) ctf_new_commander =
 {
        entity pl, plmax;
-       
+
        plmax = world;
        FOR_EACH_REALPLAYER(pl) {
                if(pl.team == cteam) {
@@ -1124,14 +1128,14 @@ void(float cteam) ctf_new_commander =
 void() ctf_clientconnect =
 {
        self.iscommander = FALSE;
-       
+
        if(!self.team || self.classname != "player") {
                ctf_setstate(self, -1);
        } else
                ctf_setstate(self, 0);
 
        self.team_saved = self.team;
-       
+
        if(self.team != 0 && self.classname == "player" && !ctf_team_has_commander(self.team)) {
                ctf_new_commander(self.team);
        }
@@ -1156,9 +1160,9 @@ void() ctf_playerchanged =
                        ctf_setstate(self, -1);
                ctf_new_commander(self.team_saved);
        }
-       
+
        self.team_saved = self.team;
-       
+
        ctf_new_commander(self.team);
 };
 
index dc4d146168c88752e4dfe9511a67ec8b0919e2c0..d66a2187d99bfba75f211811f61d6c114f9c1a09 100644 (file)
@@ -210,7 +210,6 @@ void w_clear();
 void w_ready();
 // VorteX: standalone think for weapons, so normal think on weaponentity can be reserved by weaponflashes (which needs update even player dies)
 .float weapon_nextthink;
-.float weapon_forbidchange;
 .void() weapon_think;
 
 //float        PLAYER_WEAPONSELECTION_DELAY = );
@@ -231,7 +230,6 @@ void weapon_defaultspawnfunc(float wpn);
 
 string w_deathtypestring;
 
-void(entity client, string s) centerprint_builtin = #73;
 .vector dest1, dest2;
 
 float gameover;
@@ -243,7 +241,6 @@ float alreadychangedlevel;
 .float runes;
 
 
-.float welcomemessage_time;
 .float version;
 
 // minstagib vars
@@ -286,7 +283,6 @@ entity timeoutHandler; //responsible for centerprinting the timeout countdowns a
 void timeoutHandler_Think();
 void evaluateTimeout();
 void evaluateTimein();
-string getTimeoutText(float addOneSecond);
 
 .float spawnshieldtime;
 
@@ -312,7 +308,8 @@ float default_weapon_alpha;
 .float() customizeentityforclient;
 .float cvar_cl_handicap;
 .float cvar_cl_playerdetailreduction;
-.float cvar_scr_centertime;
+.float cvar_cl_clippedspectating;
+
 .string cvar_g_xonoticversion;
 .string cvar_cl_weaponpriority;
 .string cvar_cl_weaponpriorities[10];
@@ -348,7 +345,6 @@ void AnnounceTo(entity e, string snd);
 .entity jumppadsused[NUM_JUMPPADSUSED];
 
 string gamemode_name;
-float teams_matter;
 
 float startitem_failed;
 
@@ -369,10 +365,6 @@ void FixClientCvars(entity e);
 
 float weaponsInMap;
 
-void centerprint_atprio(entity e, float prio, string s);
-void centerprint_expire(entity e, float prio);
-void centerprint(entity e, string s);
-
 .float respawn_countdown; // next number to count
 
 float bot_waypoints_for_items;
@@ -430,18 +422,26 @@ float next_pingtime;
 // TODO implemented fall and falling
 #define ALLPLAYERSOUNDS \
                _VOICEMSG(death) \
-               _VOICEMSG(fall) \
                _VOICEMSG(drown) \
+               _VOICEMSG(fall) \
+               _VOICEMSG(fall) \
+               _VOICEMSG(falling) \
                _VOICEMSG(gasp) \
                _VOICEMSG(jump) \
+               _VOICEMSG(pain100) \
                _VOICEMSG(pain25) \
                _VOICEMSG(pain50) \
-               _VOICEMSG(pain75) \
-               _VOICEMSG(pain100)
+               _VOICEMSG(pain75)
+
 #define ALLVOICEMSGS \
                _VOICEMSG(attack) \
                _VOICEMSG(attackinfive) \
+               _VOICEMSG(coverme) \
+               _VOICEMSG(defend) \
+               _VOICEMSG(freelance) \
+               _VOICEMSG(incoming) \
                _VOICEMSG(meet) \
+               _VOICEMSG(needhelp) \
                _VOICEMSG(seenflag) \
                _VOICEMSG(taunt) \
                _VOICEMSG(teamshoot)
@@ -451,24 +451,18 @@ ALLPLAYERSOUNDS
 ALLVOICEMSGS
 #undef _VOICEMSG
 
-// reserved sound names for the future (models lack sounds for them):
+// reserved sound names for the future (some models lack sounds for them):
+//             _VOICEMSG(flagcarriertakingdamage) \
+//             _VOICEMSG(getflag) \
+// reserved sound names for the future (ALL models lack sounds for them):
 //             _VOICEMSG(affirmative) \
 //             _VOICEMSG(attacking) \
 //             _VOICEMSG(defending) \
 //             _VOICEMSG(roaming) \
 //             _VOICEMSG(onmyway) \
 //             _VOICEMSG(droppedflag) \
-//             _VOICEMSG(flagcarriertakingdamage) \
 //             _VOICEMSG(negative) \
 //             _VOICEMSG(seenenemy) \
-//             _VOICEMSG(fall) \
-//             _VOICEMSG(getflag) \
-//             _VOICEMSG(incoming) \
-//             _VOICEMSG(coverme) \
-//             _VOICEMSG(needhelp) \
-//             _VOICEMSG(defend) \
-//             _VOICEMSG(freelance) \
-//             _VOICEMSG(falling) \
 
 string globalsound_fall;
 string globalsound_metalfall;
@@ -547,6 +541,7 @@ void target_voicescript_clear(entity pl);
 .string target2;
 .string target3;
 .string target4;
+.float target_random;
 .float trigger_reverse;
 
 // Nexball 
@@ -564,10 +559,6 @@ void ClientData_Touch(entity e);
 
 vector debug_shotorg; // if non-zero, overrides the shot origin of all weapons
 
-// the QC VM sucks
-#define BITXOR(v,b)        ((v) + (b) - 2 * ((v) & (b)))
-#define BITXOR_ASSIGN(v,b) ((v) += ((b) - 2 * ((v) & (b))))
-
 .float wasplayer;
 
 float servertime, serverprevtime, serverframetime;
@@ -609,7 +600,7 @@ float client_cefc_accumulatortime;
 
 ..float current_ammo;
 
-.float weapon_load[WEP_MAXCOUNT]; FTEQCC_YOU_SUCK_THIS_IS_NOT_UNREFERENCED(weapon_load);
+.float weapon_load[WEP_MAXCOUNT];
 .float ammo_none; // used by the reloading system, must always be 0
 .float clip_load;
 .float old_clip_load;
@@ -666,3 +657,5 @@ float serverflags;
 
 .entity muzzle_flash;
 .float misc_bulletcounter;     // replaces uzi & hlac bullet counter.
+
+void PlayerUseKey();
index b58c0f074fd052ba8824c007d89293247d5ea686..a4cee747131100efe733169aa349c65b46defcd5 100644 (file)
@@ -34,7 +34,6 @@ float pps_yellow;
 float pps_pink;
 void set_dom_state(entity e)
 {
-       // BIG ugly hack to make stat sending work
        e.dom_total_pps = total_pps;
        e.dom_pps_red = pps_red;
        e.dom_pps_blue = pps_blue;
@@ -109,9 +108,9 @@ void dompoint_captured ()
 
        if (head.noise != "")
                if(self.enemy)
-                       sound(self.enemy, CHAN_AUTO, head.noise, VOL_BASE, ATTN_NORM);
+                       sound(self.enemy, CH_TRIGGER, head.noise, VOL_BASE, ATTN_NORM);
                else
-                       sound(self, CHAN_TRIGGER, head.noise, VOL_BASE, ATTN_NORM);
+                       sound(self, CH_TRIGGER, head.noise, VOL_BASE, ATTN_NORM);
        if (head.noise1 != "")
                play2all(head.noise1);
 
@@ -130,50 +129,49 @@ void dompoint_captured ()
        self.delay = old_delay;
        self.team = old_team;
 
-       switch(self.team)
-       {
-               // "fix" pps when slightly under 0 because of approximation errors
-               case COLOR_TEAM1:
-                       pps_red -= (points/wait_time);
-                       if (pps_red < 0) pps_red = 0;
-                       break;
-               case COLOR_TEAM2:
-                       pps_blue -= (points/wait_time);
-                       if (pps_blue < 0) pps_blue = 0;
-                       break;
-               case COLOR_TEAM3:
-                       pps_yellow -= (points/wait_time);
-                       if (pps_yellow < 0) pps_yellow = 0;
-                       break;
-               case COLOR_TEAM4:
-                       pps_pink -= (points/wait_time);
-                       if (pps_pink < 0) pps_pink = 0;
-       }
-
        switch(self.goalentity.team)
        {
-               // "fix" pps when slightly over total_pps because of approximation errors
                case COLOR_TEAM1:
-                       pps_red += (points/wait_time);
-                       if (pps_red > total_pps) pps_red = total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-red", "", "");
                        break;
                case COLOR_TEAM2:
-                       pps_blue += (points/wait_time);
-                       if (pps_blue > total_pps) pps_blue = total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-blue", "", "");
                        break;
                case COLOR_TEAM3:
-                       pps_yellow += (points/wait_time);
-                       if (pps_yellow > total_pps) pps_yellow = total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-yellow", "", "");
                        break;
                case COLOR_TEAM4:
-                       pps_pink += (points/wait_time);
-                       if (pps_pink > total_pps) pps_pink = total_pps;
                        WaypointSprite_UpdateSprites(self.sprite, "dom-pink", "", "");
        }
 
+       total_pps = 0, pps_red = 0, pps_blue = 0, pps_yellow = 0, pps_pink = 0;
+       for(head = world; (head = find(head, classname, "dom_controlpoint")) != world; )
+       {
+               if (autocvar_g_domination_point_amt)
+                       points = autocvar_g_domination_point_amt;
+               else
+                       points = head.frags;
+               if (autocvar_g_domination_point_rate)
+                       wait_time = autocvar_g_domination_point_rate;
+               else
+                       wait_time = head.wait;
+               switch(head.goalentity.team)
+               {
+                       case COLOR_TEAM1:
+                               pps_red += points/wait_time;
+                               break;
+                       case COLOR_TEAM2:
+                               pps_blue += points/wait_time;
+                               break;
+                       case COLOR_TEAM3:
+                               pps_yellow += points/wait_time;
+                               break;
+                       case COLOR_TEAM4:
+                               pps_pink += points/wait_time;
+               }
+               total_pps += points/wait_time;
+       }
+
        WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_DOMPOINT, colormapPaletteColor(self.goalentity.team - 1, 0));
        WaypointSprite_Ping(self.sprite);
 
@@ -366,12 +364,12 @@ void dom_controlpoint_setup()
                self.wait = 5;
 
        float points, waittime;
-       if (autocvar_g_domination_point_rate)
-               points = autocvar_g_domination_point_rate;
+       if (autocvar_g_domination_point_amt)
+               points = autocvar_g_domination_point_amt;
        else
                points = self.frags;
-       if (autocvar_g_domination_point_amt)
-               waittime = autocvar_g_domination_point_amt;
+       if (autocvar_g_domination_point_rate)
+               waittime = autocvar_g_domination_point_rate;
        else
                waittime = self.wait;
 
@@ -392,8 +390,7 @@ void dom_controlpoint_setup()
        droptofloor();
 
        waypoint_spawnforitem(self);
-       WaypointSprite_SpawnFixed("dom-neut", self.origin + '0 0 32', self, sprite);
-       WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_DOMPOINT, '0 1 1');
+       WaypointSprite_SpawnFixed("dom-neut", self.origin + '0 0 32', self, sprite, RADARICON_DOMPOINT, '0 1 1');
 };
 
 
index 3ffcb3b3868aa23f16e7628ab816fbb75a5a1ea7..9c4bf59758770d4fc6f90f6abcf3560a21e27081 100644 (file)
@@ -31,7 +31,7 @@ float entcs_customize()
        if(other == o)
                return FALSE;
        if(other.classname == "player")
-               if(!teams_matter || o.team != other.team)
+               if(!teamplay || o.team != other.team)
                        if not (radar_showennemies)
                                return FALSE;
        return TRUE;
index c40c5c9b1606ce25b2330da686035bec0a31e1bf..8422cf5df8d7b73294b0b18cf6061e4f7730ee41 100644 (file)
@@ -278,6 +278,16 @@ float EF_LOWPRECISION = 4194304;
 //description:
 //controls rendering scale of the object, 0 is forced to be 1, darkplaces uses 1/16th accuracy and a limit of 15.9375, can be used to make an object larger or smaller.
 
+//DP_ENT_TRAILEFFECTNUM
+//idea: LordHavoc
+//darkplaces implementation: LordHavoc
+//field definitions:
+.float traileffectnum;
+//description:
+//use a custom effectinfo.txt effect on this entity, assign it like this:
+//self.traileffectnum = particleeffectnum("mycustomeffect");
+//this will do both the dlight and particle trail as described in the effect, basically equivalent to trailparticles() in CSQC but performed on a server entity.
+
 //DP_ENT_VIEWMODEL
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
@@ -286,29 +296,6 @@ float EF_LOWPRECISION = 4194304;
 //description:
 //this is a very special capability, attachs the entity to the view of the client specified, origin and angles become relative to the view of that client, all effects can be used (multiple skins on a weapon model etc)...  the entity is not visible to any other client.
 
-//DP_GECKO_SUPPORT
-//idea: Res2k, BlackHC
-//darkplaces implementation: Res2k, BlackHC
-//constant definitions:
-float GECKO_BUTTON_DOWN         = 0;
-float GECKO_BUTTON_UP           = 1;
-// either use down and up or just press but not all of them!
-float GECKO_BUTTON_PRESS        = 2;
-// use this for mouse events if needed?
-float GECKO_BUTTON_DOUBLECLICK  = 3;
-//builtin definitions:
-float(string name) gecko_create( string name ) = #487;
-void(string name) gecko_destroy( string name ) = #488;
-void(string name) gecko_navigate( string name, string URI ) = #489;
-float(string name) gecko_keyevent( string name, float key, float eventtype ) = #490;
-void gecko_mousemove( string name, float x, float y ) = #491;
-void gecko_resize( string name, float w, float h ) = #492;
-vector gecko_get_texture_extent( string name ) = #493;
-//engine-called QC prototypes:
-//string(string name, string query) Qecko_Query;
-//description:
-//provides an interface to the offscreengecko library and allows for internet browsing in games
-
 //DP_GFX_EXTERNALTEXTURES
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
@@ -533,6 +520,14 @@ void(entity e, entity tagentity, string tagname) setattachment = #443; // attach
 //description:
 //MOVETYPE_BOUNCE but without gravity, and with full reflection (no speed loss like grenades have), in other words - bouncing laser bolts.
 
+//DP_MOVETYPEFLYWORLDONLY
+//idea: Samual
+//darkplaces implementation: Samual
+//movetype definitions:
+float MOVETYPE_FLY_WORLDONLY = 33;
+//description:
+//like MOVETYPE_FLY, but does all traces with MOVE_WORLDONLY, and is ignored by MOVETYPE_PUSH. Should only be combined with SOLID_NOT and SOLID_TRIGGER.
+
 //DP_NULL_MODEL
 //idea: Chris
 //darkplaces implementation: divVerent
@@ -1219,6 +1214,33 @@ float(string name, string value) registercvar = #93;
 //the engine plays sound/cdtracks/track001.wav instead of cd track 1 and so on if found, this allows games and mods to have music tracks without using ambientsound.
 //Note: also plays .ogg with DP_SND_OGGVORBIS extension.
 
+//DP_SND_SOUND7_WIP1
+//idea: divVerent
+//darkplaces implementation: divVerent
+//builtin definitions:
+void(entity e, float chan, string samp, float vol, float atten, float speed, float flags) sound7 = #8;
+float SOUNDFLAG_RELIABLE = 1;
+//description:
+//plays a sound, with some more flags
+//extensions to sound():
+//- channel may be in the range from -128 to 127; channels -128 to 0 are "auto",
+//  i.e. support multiple sounds at once, but cannot be stopped/restarted
+//- a speed parameter has been reserved for later addition of pitch shifting.
+//  it MUST be set to 0 for now, meaning "no pitch change"
+//- the flag SOUNDFLAG_RELIABLE can be specified, which makes the sound send
+//  to MSG_ALL (reliable) instead of MSG_BROADCAST (unreliable, default);
+//  similarily, SOUNDFLAG_RELIABLE_TO_ONE sends to MSG_ONE
+//- channel 0 is controlled by snd_channel0volume; channel 1 and -1 by
+//  snd_channel1volume, etc. (so, a channel shares the cvar with its respective
+//  auto-channel); however, the mod MUST define snd_channel8volume and upwards
+//  in default.cfg if they are to be used, as the engine does not create them
+//  to not litter the cvar list
+//- this extension applies to CSQC as well; CSQC_Event_Sound will get speed and
+//  flags as extra 7th and 8th argument
+//- WIP2 ideas: SOUNDFLAG_RELIABLE_TO_ONE, SOUNDFLAG_NOPHS, SOUNDFLAG_FORCELOOP
+//- NOTE: to check for this, ALSO OR a check with DP_SND_SOUND7 to also support
+//  the finished extension once done
+
 //DP_SND_OGGVORBIS
 //idea: Transfusion
 //darkplaces implementation: Elric
@@ -1622,7 +1644,7 @@ void(entity e, float physics_enabled) physics_enable = #540; // enable or disabl
 void(entity e, vector force, vector force_pos) physics_addforce = #541; // apply a force from certain origin, length of force vector is power of force
 void(entity e, vector torque) physics_addtorque = #542; // add relative torque
 //description: provides Open Dynamics Engine support, requires extenal dll to be present or engine compiled with statical link option
-//be sure to checkextension for it to know if library i loaded and ready, also to enable physics set "physice_ode" cvar to 1
+//be sure to checkextension for it to know if library is loaded and ready, also to enable physics set "physics_ode" cvar to 1
 //note: this extension is highly experimental and may be unstable
 //note: use SOLID_BSP on entities to get a trimesh collision models on them
 
index 5a3b098b6a3adb787f5f15a8433c1160da9e72d4..192e5cd7fb2e69f5b20b5708f4aec9af11224e28 100644 (file)
@@ -114,6 +114,7 @@ void func_breakable_behave_destroyed()
 {
        self.health = self.max_health;
        self.takedamage = DAMAGE_NO;
+       self.bot_attack = FALSE;
        self.event_damage = SUB_Null;
        self.state = 1;
        func_breakable_colormod();
@@ -128,6 +129,7 @@ void func_breakable_behave_restore()
                WaypointSprite_UpdateHealth(self.sprite, self.health);
        }
        self.takedamage = DAMAGE_AIM;
+       self.bot_attack = TRUE;
        self.event_damage = func_breakable_damage;
        self.state = 0;
        self.nextthink = 0; // cancel auto respawn
@@ -162,7 +164,7 @@ void func_breakable_destroy() {
        func_breakable_destroyed();
 
        if(self.noise)
-               sound (self, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
+               sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
 
        if(self.dmg)
                RadiusDamage(self, activator, self.dmg, self.dmg_edge, self.dmg_radius, self, self.dmg_force, DEATH_HURTTRIGGER, world);
index 55dc6f645dc742136df45e96c020ee7b5554b58b..efdd9ed1cf921806917a107368a78058fe3b7b41 100644 (file)
@@ -41,8 +41,6 @@ void Damage_DamageInfo(vector org, float coredamage, float edgedamage, float rad
        Net_LinkEntity(e, FALSE, 0.2, Damage_DamageInfo_SendEntity);
 }
 
-#define DAMAGE_CENTERPRINT_SPACER NEWLINES
-
 float checkrules_firstblood;
 
 float yoda;
@@ -61,7 +59,7 @@ float damage_headshotbonus; // bonus multiplier for head shots, set to 0 after u
 
 float IsDifferentTeam(entity a, entity b)
 {
-       if(teams_matter)
+       if(teamplay)
        {
                if(a.team == b.team)
                        return 0;
@@ -126,6 +124,8 @@ void GiveFrags (entity attacker, entity targ, float f, float deathtype)
        {
                // regular frag
                PlayerScore_Add(attacker, SP_KILLS, 1);
+               if(targ.playerid)
+                       PlayerStats_Event(attacker, sprintf("kills-%d", targ.playerid), 1);
        }
 
        PlayerScore_Add(targ, SP_DEATHS, 1);
@@ -299,13 +299,9 @@ void Obituary (entity attacker, entity inflictor, entity targ, float deathtype)
        string  s, a, msg;
        float w, type;
 
-       if (targ.classname == "player" || targ.classname == "corpse")
+       if (targ.classname == "player")
        {
-               if (targ.classname == "corpse")
-                       s = "A corpse";
-               else
-                       s = targ.netname;
-
+               s = targ.netname;
                a = attacker.netname;
 
                if (targ == attacker) // suicides
@@ -323,7 +319,7 @@ void Obituary (entity attacker, entity inflictor, entity targ, float deathtype)
 
                        if (targ.killcount > 2)
                                msg = ftos(targ.killcount);
-                       if(teams_matter && deathtype == DEATH_MIRRORDAMAGE)
+                       if(teamplay && deathtype == DEATH_MIRRORDAMAGE)
                        {
                                if(attacker.team == COLOR_TEAM1)
                                        deathtype = KILL_TEAM_RED;
@@ -333,9 +329,9 @@ void Obituary (entity attacker, entity inflictor, entity targ, float deathtype)
 
                        Send_KillNotification(s, msg, ftos(w), deathtype, MSG_SUICIDE);
                }
-               else if (attacker.classname == "player" || attacker.classname == "gib")
+               else if (attacker.classname == "player")
                {
-                       if(teams_matter && attacker.team == targ.team)
+                       if(teamplay && attacker.team == targ.team)
                        {
                                if(attacker.team == COLOR_TEAM1)
                                        type = KILL_TEAM_RED;
@@ -568,7 +564,7 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                                damage = 0;
                                force = '0 0 0';
                        }
-                       else if(teams_matter && attacker.team == targ.team)
+                       else if(teamplay && attacker.team == targ.team)
                        {
                                if(autocvar_teamplay_mode == 1)
                                        damage = 0;
@@ -651,7 +647,7 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                        if (targ.armorvalue && (deathtype == WEP_MINSTANEX) && damage)
                        {
                                targ.armorvalue -= 1;
-                               centerprint(targ, strcat(DAMAGE_CENTERPRINT_SPACER, "^3Remaining extra lives: ",ftos(targ.armorvalue)));
+                               centerprint(targ, strcat("^3Remaining extra lives: ",ftos(targ.armorvalue)));
                                damage = 0;
                                targ.hitsound += 1;
                                attacker.hitsound += 1; // TODO change this to a future specific hitsound for armor hit
@@ -663,7 +659,7 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                                if (targ != attacker)
                                {
                                        if ((targ.health >= 1) && (targ.classname == "player"))
-                                               centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "Secondary fire inflicts no damage!"));
+                                               centerprint(attacker, "Secondary fire inflicts no damage!");
                                        force = '0 0 0';
                                        // keep mirrorforce
                                        attacker = targ;
@@ -786,15 +782,21 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                        if(deathtype & HITTYPE_HEADSHOT)
                                damage *= 1 + damage_headshotbonus;
 
-                       if(targ.classname == "player")
+                       entity victim;
+                       if((targ.vehicle_flags & VHF_ISVEHICLE) && targ.owner)
+                               victim = targ.owner;
+                       else
+                               victim = targ;
+
+                       if(victim.classname == "player" || victim.turrcaps_flags & TFL_TURRCAPS_ISTURRET)
                        {
-                               if(IsDifferentTeam(targ, attacker))
+                               if(IsDifferentTeam(victim, attacker))
                                {
                                        if(damage > 0)
                                        {
                                                if(deathtype != DEATH_FIRE)
                                                {
-                                                       if(targ.BUTTON_CHAT)
+                                                       if(victim.BUTTON_CHAT)
                                                                attacker.typehitsound += 1;
                                                        else
                                                                attacker.hitsound += 1;
@@ -805,12 +807,13 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
 
                                                if not(DEATH_ISSPECIAL(deathtype))
                                                {
+                                                       if(targ.classname == "player") // don't do this for vehicles
                                                        if(!g_minstagib)
-                                                       if(IsFlying(targ))
+                                                       if(IsFlying(victim))
                                                                yoda = 1;
 
                                                        if(g_minstagib)
-                                                       if(targ.items & IT_STRENGTH)
+                                                       if(victim.items & IT_STRENGTH)
                                                                yoda = 1;
 
                                                        if(deathtype & HITTYPE_HEADSHOT)
@@ -900,7 +903,7 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                        if(attacker.armorvalue > 0)
                        {
                                attacker.armorvalue = attacker.armorvalue - 1;
-                               centerprint(attacker, strcat(DAMAGE_CENTERPRINT_SPACER, "^3Remaining extra lives: ",ftos(attacker.armorvalue)));
+                               centerprint(attacker, strcat("^3Remaining extra lives: ",ftos(attacker.armorvalue)));
                                attacker.hitsound += 1;
                        }
                        mirrordamage = 0;
index dd6d73effd8aae382ae92c4d40bf16807faa9b2b..bd5b2c328d01a8ae6ca748d578f700a59489b1e2 100644 (file)
@@ -47,43 +47,6 @@ And you should be done!
 
 ============================================*/
 
-.string aiment_classname;
-.float aiment_deadflag;
-void SetMovetypeFollow(entity ent, entity e)
-{
-       // FIXME this may not be warpzone aware
-       ent.movetype = MOVETYPE_FOLLOW; // make the hole follow
-       ent.solid = SOLID_NOT; // MOVETYPE_FOLLOW is always non-solid - this means this cannot be teleported by warpzones any more! Instead, we must notice when our owner gets teleported.
-       ent.aiment = e; // make the hole follow bmodel
-       ent.punchangle = e.angles; // the original angles of bmodel
-       ent.view_ofs = ent.origin - e.origin; // relative origin
-       ent.v_angle = ent.angles - e.angles; // relative angles
-       ent.aiment_classname = strzone(e.classname);
-       ent.aiment_deadflag = e.deadflag;
-}
-void UnsetMovetypeFollow(entity ent)
-{
-       ent.movetype = MOVETYPE_FLY;
-       PROJECTILE_MAKETRIGGER(ent);
-       ent.aiment = world;
-}
-float LostMovetypeFollow(entity ent)
-{
-/*
-       if(ent.movetype != MOVETYPE_FOLLOW)
-               if(ent.aiment)
-                       error("???");
-*/
-       if(ent.aiment)
-       {
-               if(ent.aiment.classname != ent.aiment_classname)
-                       return 1;
-               if(ent.aiment.deadflag != ent.aiment_deadflag)
-                       return 1;
-       }
-       return 0;
-}
-
 .float hook_length;
 .float hook_switchweapon;
 
@@ -103,7 +66,7 @@ void GrapplingHookThink();
 void GrapplingHook_Stop()
 {
        pointparticles(particleeffectnum("grapple_impact"), self.origin, '0 0 0', 1);
-       sound (self, CHAN_PROJECTILE, "weapons/hook_impact.wav", VOL_BASE, ATTN_NORM);
+       sound (self, CH_SHOTS, "weapons/hook_impact.wav", VOL_BASE, ATTN_NORM);
 
        self.state = 1;
        self.think = GrapplingHookThink;
@@ -119,12 +82,12 @@ float GrapplingHookSend(entity to, float sf)
 {
        WriteByte(MSG_ENTITY, ENT_CLIENT_HOOK);
        sf = sf & 0x7F;
-       if(sound_allowed(MSG_BROADCAST, self.owner))
+       if(sound_allowed(MSG_BROADCAST, self.realowner))
                sf |= 0x80;
        WriteByte(MSG_ENTITY, sf);
        if(sf & 1)
        {
-               WriteByte(MSG_ENTITY, num_for_edict(self.owner));
+               WriteByte(MSG_ENTITY, num_for_edict(self.realowner));
        }
        if(sf & 2)
        {
@@ -145,14 +108,14 @@ void GrapplingHookThink()
 {
        float spd, dist, minlength, pullspeed, ropestretch, ropeairfriction, rubberforce, newlength, rubberforce_overstretch, s;
        vector dir, org, end, v0, dv, v, myorg, vs;
-       if(self.owner.health <= 0 || self.owner.hook != self)   // how did that happen?
+       if(self.realowner.health <= 0 || self.realowner.hook != self)   // how did that happen?
        {                                                                                                               // well, better fix it anyway
                remove(self);
                return;
        }
        if(LostMovetypeFollow(self))
        {
-               RemoveGrapplingHook(self.owner);
+               RemoveGrapplingHook(self.realowner);
                return;
        }
        if(self.aiment)
@@ -160,15 +123,15 @@ void GrapplingHookThink()
 
        self.nextthink = time;
 
-       s = self.owner.cvar_cl_gunalign;
+       s = self.realowner.cvar_cl_gunalign;
        if(s != 1 && s != 2 && s != 4)
                s = 3; // default value
        --s;
        vs = hook_shotorigin[s];
 
-       makevectors(self.owner.v_angle);
-       org = self.owner.origin + self.owner.view_ofs + v_forward * vs_x + v_right * -vs_y + v_up * vs_z;
-       myorg = WarpZone_RefSys_TransformOrigin(self.owner, self, org);
+       makevectors(self.realowner.v_angle);
+       org = self.realowner.origin + self.realowner.view_ofs + v_forward * vs_x + v_right * -vs_y + v_up * vs_z;
+       myorg = WarpZone_RefSys_TransformOrigin(self.realowner, self, org);
 
        if(self.hook_length < 0)
                self.hook_length = vlen(myorg - self.origin);
@@ -202,10 +165,10 @@ void GrapplingHookThink()
 
                if(autocvar_g_grappling_hook_tarzan)
                {
-                       v = v0 = WarpZone_RefSys_TransformVelocity(self.owner, self, self.owner.velocity);
+                       v = v0 = WarpZone_RefSys_TransformVelocity(self.realowner, self, self.realowner.velocity);
 
                        // first pull the rope...
-                       if(self.owner.hook_state & HOOK_PULLING)
+                       if(self.realowner.hook_state & HOOK_PULLING)
                        {
                                newlength = self.hook_length;
                                newlength = max(newlength - pullspeed * frametime, minlength);
@@ -220,7 +183,7 @@ void GrapplingHookThink()
                                self.hook_length = newlength;
                        }
 
-                       if(self.owner.hook_state & HOOK_RELEASING)
+                       if(self.realowner.hook_state & HOOK_RELEASING)
                        {
                                newlength = dist;
                                self.hook_length = newlength;
@@ -240,15 +203,15 @@ void GrapplingHookThink()
                                                v = v - dv * 0.5;
                                                self.aiment.velocity = self.aiment.velocity - dv * 0.5;
                                                self.aiment.flags &~= FL_ONGROUND;
-                                               self.aiment.pusher = self.owner;
+                                               self.aiment.pusher = self.realowner;
                                                self.aiment.pushltime = time + autocvar_g_maxpushtime;
                                        }
                                }
 
-                               self.owner.flags &~= FL_ONGROUND;
+                               self.realowner.flags &~= FL_ONGROUND;
                        }
 
-                       self.owner.velocity = WarpZone_RefSys_TransformVelocity(self, self.owner, v);
+                       self.realowner.velocity = WarpZone_RefSys_TransformVelocity(self, self.realowner, v);
                }
                else
                {
@@ -260,15 +223,15 @@ void GrapplingHookThink()
                                spd = pullspeed;
                        if(spd < 50)
                                spd = 0;
-                       self.owner.velocity = dir*spd;
-                       self.owner.movetype = MOVETYPE_FLY;
+                       self.realowner.velocity = dir*spd;
+                       self.realowner.movetype = MOVETYPE_FLY;
 
-                       self.owner.flags &~= FL_ONGROUND;
+                       self.realowner.flags &~= FL_ONGROUND;
                }
        }
 
        makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0');
-       myorg = WarpZone_RefSys_TransformOrigin(self, self.owner, self.origin); // + v_forward * (-9);
+       myorg = WarpZone_RefSys_TransformOrigin(self, self.realowner, self.origin); // + v_forward * (-9);
 
        if(myorg != self.hook_start)
        {
@@ -284,13 +247,6 @@ void GrapplingHookThink()
 
 void GrapplingHookTouch (void)
 {
-       if(SUB_OwnerCheck())
-               return;
-       if(SUB_NoImpactCheck())
-       {
-               RemoveGrapplingHook(self.owner);
-               return;
-       }
        PROJECTILE_TOUCH;
 
        GrapplingHook_Stop();
@@ -302,7 +258,7 @@ void GrapplingHookTouch (void)
                        WarpZone_RefSys_BeginAddingIncrementally(self, self.aiment);
                }
 
-       //self.owner.disableclientprediction = TRUE;
+       //self.realowner.disableclientprediction = TRUE;
 }
 
 void GrapplingHook_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
@@ -312,12 +268,12 @@ void GrapplingHook_Damage (entity inflictor, entity attacker, float damage, floa
                self.health = self.health - damage;
                if (self.health <= 0)
                {
-                       if(attacker != self.owner)
+                       if(attacker != self.realowner)
                        {
-                               self.owner.pusher = attacker;
-                               self.owner.pushltime = time + autocvar_g_maxpushtime;
+                               self.realowner.pusher = attacker;
+                               self.realowner.pushltime = time + autocvar_g_maxpushtime;
                        }
-                       RemoveGrapplingHook(self.owner);
+                       RemoveGrapplingHook(self.realowner);
                }
        }
 }
@@ -343,8 +299,8 @@ void FireGrapplingHook (void)
        --s;
        vs = hook_shotorigin[s];
 
-       // UGLY WORKAROUND: play this on CHAN_WEAPON2 so it can't cut off fire sounds
-       sound (self, CHAN_WEAPON2, "weapons/hook_fire.wav", VOL_BASE, ATTN_NORM);
+       // UGLY WORKAROUND: play this on CH_WEAPON_B so it can't cut off fire sounds
+       sound (self, CH_WEAPON_B, "weapons/hook_fire.wav", VOL_BASE, ATTN_NORM);
        org = self.origin + self.view_ofs + v_forward * vs_x + v_right * -vs_y + v_up * vs_z;
 
        tracebox(self.origin + self.view_ofs, '-3 -3 -3', '3 3 3', org, MOVE_NORMAL, self);
@@ -353,7 +309,7 @@ void FireGrapplingHook (void)
        pointparticles(particleeffectnum("grapple_muzzleflash"), org, '0 0 0', 1);
 
        missile = WarpZone_RefSys_SpawnSameRefSys(self);
-       missile.owner = self;
+       missile.owner = missile.realowner = self;
        self.hook = missile;
        missile.classname = "grapplinghook";
 
index bc996fd321647183b1824eb233d052dae33e69a9..690fd752d7fe237241099f571b6db4602727cb05 100644 (file)
@@ -2,7 +2,7 @@
 
 void g_model_setcolormaptoactivator (void)
 {
-       if(teams_matter)
+       if(teamplay)
        {
                if(activator.team)
                        self.colormap = (activator.team - 1) * 0x11;
index 22c8931bef8813bc43536ab950b281b1a7def223..c311f3774f45f59c7ad934e6b5992e673c1b4f54 100644 (file)
@@ -16,6 +16,9 @@ void spawnfunc_info_null (void)
 
 void setanim(entity e, vector anim, float looping, float override, float restart)
 {
+       if (!anim)
+               return; // no animation was given to us! We can't use this. 
+               
        if (anim_x == e.animstate_startframe)
        if (anim_y == e.animstate_numframes)
        if (anim_z == e.animstate_framerate)
index 6c0921ba9b6ee7317f341dd2e09a623786a3c4d7..6407cefaa901351ada791a7e5e2dffb084d0fb18 100644 (file)
@@ -88,6 +88,9 @@ void SUB_UseTargets()
        stemp = self;
        otemp = other;
 
+       if(stemp.target_random)
+               RandomSelection_Init();
+
        for(i = 0; i < 4; ++i)
        {
                switch(i)
@@ -103,15 +106,29 @@ void SUB_UseTargets()
                        for(t = world; (t = find(t, targetname, s)); )
                        if(t.use)
                        {
-                               //print(stemp.classname, " ", stemp.targetname, " -> ", t.classname, " ", t.targetname, "\n");
-                               self = t;
-                               other = stemp;
-                               activator = act;
-                               self.use();
+                               if(stemp.target_random)
+                               {
+                                       RandomSelection_Add(t, 0, string_null, 1, 0);
+                               }
+                               else
+                               {
+                                       self = t;
+                                       other = stemp;
+                                       activator = act;
+                                       self.use();
+                               }
                        }
                }
        }
 
+       if(stemp.target_random && RandomSelection_chosen_ent)
+       {
+               self = RandomSelection_chosen_ent;
+               other = stemp;
+               activator = act;
+               self.use();
+       }
+
        activator = act;
        self = stemp;
        other = otemp;
@@ -154,7 +171,7 @@ void multi_trigger()
        }
 
        if (self.noise)
-               sound (self.enemy, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
+               sound (self.enemy, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
 
 // don't trigger again until reset
        self.takedamage = DAMAGE_NO;
@@ -537,7 +554,7 @@ void trigger_heal_touch()
                        {
                                other.health = min(other.health + self.health, self.max_health);
                                other.pauserothealth_finished = max(other.pauserothealth_finished, time + autocvar_g_balance_pause_health_rot);
-                               sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
+                               sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
                        }
                }
        }
@@ -648,7 +665,7 @@ void trigger_gravity_touch()
        {
                other.gravity = g;
                if(self.noise != "")
-                       sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
+                       sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
                UpdateCSQCProjectile(self.owner);
        }
 };
@@ -704,7 +721,7 @@ void target_speaker_use_activator()
        else
                snd = self.noise;
        msg_entity = activator;
-       soundto(MSG_ONE, self, CHAN_TRIGGER, snd, VOL_BASE * self.volume, self.atten);
+       soundto(MSG_ONE, self, CH_TRIGGER, snd, VOL_BASE * self.volume, self.atten);
 }
 void target_speaker_use_on()
 {
@@ -730,13 +747,13 @@ void target_speaker_use_on()
        }
        else
                snd = self.noise;
-       sound(self, CHAN_TRIGGER, snd, VOL_BASE * self.volume, self.atten);
+       sound(self, CH_TRIGGER_SINGLE, snd, VOL_BASE * self.volume, self.atten);
        if(self.spawnflags & 3)
                self.use = target_speaker_use_off;
 }
 void target_speaker_use_off()
 {
-       sound(self, CHAN_TRIGGER, "misc/null.wav", VOL_BASE * self.volume, self.atten);
+       sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASE * self.volume, self.atten);
        self.use = target_speaker_use_on;
 }
 void target_speaker_reset()
@@ -1360,24 +1377,7 @@ void trigger_impulse_touch1()
        if (self.active != ACTIVE_ACTIVE) 
                return;
 
-       // FIXME: Better checking for what to push and not.
-       if not(other.iscreature)
-       if (other.classname != "corpse")
-       if (other.classname != "body")
-       if (other.classname != "gib")
-       if (other.classname != "missile")
-       if (other.classname != "rocket")
-       if (other.classname != "casing")
-       if (other.classname != "grenade")
-       if (other.classname != "plasma")
-       if (other.classname != "plasma_prim")
-       if (other.classname != "plasma_chain")
-       if (other.classname != "droppedweapon")
-       if (other.classname != "nexball_basketball")
-       if (other.classname != "nexball_football")
-               return;
-
-       if (other.deadflag && other.iscreature)
+       if (!isPushable(other))
                return;
 
        EXACTTRIGGER_TOUCH;
@@ -1415,24 +1415,7 @@ void trigger_impulse_touch2()
        if (self.active != ACTIVE_ACTIVE) 
                return;
 
-       // FIXME: Better checking for what to push and not.
-       if not(other.iscreature)
-       if (other.classname != "corpse")
-       if (other.classname != "body")
-       if (other.classname != "gib")
-       if (other.classname != "missile")
-       if (other.classname != "rocket")
-       if (other.classname != "casing")
-       if (other.classname != "grenade")
-       if (other.classname != "plasma")
-       if (other.classname != "plasma_prim")
-       if (other.classname != "plasma_chain")
-       if (other.classname != "droppedweapon")
-       if (other.classname != "nexball_basketball")
-       if (other.classname != "nexball_football")
-               return;
-
-       if (other.deadflag && other.iscreature)
+       if (!isPushable(other))
                return;
 
        EXACTTRIGGER_TOUCH;
@@ -1456,24 +1439,7 @@ void trigger_impulse_touch3()
        if (self.active != ACTIVE_ACTIVE) 
                return;
 
-       // FIXME: Better checking for what to push and not.
-       if not(other.iscreature)
-       if (other.classname != "corpse")
-       if (other.classname != "body")
-       if (other.classname != "gib")
-       if (other.classname != "missile")
-       if (other.classname != "rocket")
-       if (other.classname != "casing")
-       if (other.classname != "grenade")
-       if (other.classname != "plasma")
-       if (other.classname != "plasma_prim")
-       if (other.classname != "plasma_chain")
-       if (other.classname != "droppedweapon")
-       if (other.classname != "nexball_basketball")
-       if (other.classname != "nexball_football")
-               return;
-
-       if (other.deadflag && other.iscreature)
+       if (!isPushable(other))
                return;
 
        EXACTTRIGGER_TOUCH;
index 6ee4e117964d16ff1a3e01d624dd098caa2de62e..1ba0a54eba6451f324d5555a876c51985e00d086 100644 (file)
@@ -101,15 +101,13 @@ void fteqcc_testbugs()
  * players. Also plays reminder sounds.
  */
 void timeoutHandler_Think() {
-       local string timeStr;
        local entity plr;
        if (timeoutStatus == 1) {
                if (remainingLeadTime > 0) {
                        //centerprint the information to every player
-                       timeStr = getTimeoutText(0);
                        FOR_EACH_REALCLIENT(plr) {
                                if(plr.classname == "player") {
-                                       centerprint_atprio(plr, CENTERPRIO_SPAM, timeStr);
+                                       Send_CSQC_Centerprint_Generic(plr, CPID_TIMEOUT_COUNTDOWN, "Timeout begins in %d seconds!", 1, remainingLeadTime);
                                }
                        }
                        remainingLeadTime -= 1;
@@ -133,10 +131,9 @@ void timeoutHandler_Think() {
        }
        else if (timeoutStatus == 2) {
                if (remainingTimeoutTime > 0) {
-                       timeStr = getTimeoutText(0);
                        FOR_EACH_REALCLIENT(plr) {
                                if(plr.classname == "player") {
-                                       centerprint_atprio(plr, CENTERPRIO_SPAM, timeStr);
+                                       Send_CSQC_Centerprint_Generic(plr, CPID_TIMEOUT_COUNTDOWN, "Timeout ends in %d seconds!", 1, remainingTimeoutTime);
                                }
                        }
                        if(remainingTimeoutTime == autocvar_sv_timeout_resumetime) { //play a warning sound when only <sv_timeout_resumetime> seconds are left
@@ -156,7 +153,7 @@ void timeoutHandler_Think() {
                        //get rid of the countdown message
                        FOR_EACH_REALCLIENT(plr) {
                                if(plr.classname == "player") {
-                                       centerprint_atprio(plr, CENTERPRIO_SPAM, "");
+                                       Send_CSQC_Centerprint_Generic_Expire(plr, CPID_TIMEOUT_COUNTDOWN);
                                }
                        }
                        remove(self);
@@ -167,7 +164,7 @@ void timeoutHandler_Think() {
        else if (timeoutStatus == 0) { //if a player called the resumegame command (which set timeoutStatus to 0 already)
                FOR_EACH_REALCLIENT(plr) {
                        if(plr.classname == "player") {
-                               centerprint_atprio(plr, CENTERPRIO_SPAM, "");
+                               Send_CSQC_Centerprint_Generic_Expire(plr, CPID_TIMEOUT_COUNTDOWN);
                        }
                }
                remove(self);
@@ -293,10 +290,12 @@ void cvar_changes_init()
                BADCVAR("sv_vote_master_password");
                BADCVAR("sys_colortranslation");
                BADCVAR("sys_specialcharactertranslation");
+               BADCVAR("timeformat");
                BADCVAR("timestamps");
                BADPREFIX("developer_");
                BADPREFIX("g_ban_");
                BADPREFIX("g_chat_flood_");
+               BADPREFIX("g_playerstats_");
                BADPREFIX("g_voice_flood_");
                BADPREFIX("rcon_");
                BADPREFIX("settemp_");
@@ -309,10 +308,7 @@ void cvar_changes_init()
                BADPREFIX("sv_weaponstats_");
 
                // these can contain player IDs, so better hide
-               BADCVAR("g_forced_team_red");
-               BADCVAR("g_forced_team_blue");
-               BADCVAR("g_forced_team_yellow");
-               BADCVAR("g_forced_team_pink");
+               BADPREFIX("g_forced_team_");
 
                // mapinfo
                BADCVAR("fraglimit");
@@ -420,6 +416,7 @@ void cvar_changes_init()
                BADCVAR("g_ctf_ignore_frags");
                BADCVAR("g_ctf_win_mode");
                BADCVAR("g_domination_point_limit");
+               BADCVAR("g_friendlyfire");
                BADCVAR("g_fullbrightitems");
                BADCVAR("g_fullbrightplayers");
                BADCVAR("g_keyhunt_point_limit");
@@ -433,15 +430,17 @@ void cvar_changes_init()
                BADCVAR("g_maplist_votable_abstain");
                BADCVAR("g_maplist_votable_nodetail");
                BADCVAR("g_maplist_votable_suggestions");
+               BADCVAR("g_maxplayers");
                BADCVAR("g_minstagib");
+               BADCVAR("g_mirrordamage");
                BADCVAR("g_nexball_goallimit");
                BADCVAR("g_runematch_point_limit");
                BADCVAR("g_start_delay");
+               BADCVAR("g_warmup");
                BADCVAR("g_weapon_stay"); BADPRESUFFIX("g_", "_weapon_stay");
                BADCVAR("hostname");
                BADCVAR("log_file");
                BADCVAR("maxplayers");
-               BADCVAR("g_maxplayers");
                BADCVAR("minplayers");
                BADCVAR("net_address");
                BADCVAR("port");
@@ -469,10 +468,10 @@ void cvar_changes_init()
                BADCVAR("sv_vote_master_commands");
                BADCVAR("sv_vote_master_password");
                BADCVAR("sv_vote_simple_majority_factor");
+               BADCVAR("sys_ticrate");
+               BADCVAR("teamplay_mode");
                BADCVAR("timelimit_override");
-               BADCVAR("g_warmup");
                BADPREFIX("g_warmup_");
-               BADCVAR("teamplay_mode");
 
                if(autocvar_g_minstagib)
                {
@@ -715,8 +714,7 @@ void spawnfunc_worldspawn (void)
        GameLogInit(); // prepare everything
        if(autocvar_sv_eventlog)
        {
-               s = strcat(ftos(autocvar_sv_eventlog_files_counter), ".");
-               s = strcat(s, ftos(random()));
+               s = sprintf("%d.%s.%06d", ftos(autocvar_sv_eventlog_files_counter), strftime(FALSE, "%s"), floor(random() * 1000000));
                matchid = strzone(s);
 
                GameLogEcho(strcat(":gamestart:", GetGametype(), "_", GetMapname(), ":", s));
@@ -1194,7 +1192,7 @@ void Maplist_Init()
        if(Map_Count == 0)
        {
                bprint( "Maplist is empty!  Resetting it to default map list.\n" );
-               cvar_set("g_maplist", MapInfo_ListAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
+               cvar_set("g_maplist", MapInfo_ListAllAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
                if(autocvar_g_maplist_shuffle)
                        ShuffleMaplist();
                localcmd("\nmenu_cmd sync\n");
@@ -1314,7 +1312,7 @@ void GotoNextMap()
                        if(allowReset)
                        {
                                bprint( "Maplist contains no single playable map!  Resetting it to default map list.\n" );
-                               cvar_set("g_maplist", MapInfo_ListAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
+                               cvar_set("g_maplist", MapInfo_ListAllAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
                                if(autocvar_g_maplist_shuffle)
                                        ShuffleMaplist();
                                localcmd("\nmenu_cmd sync\n");
@@ -1490,7 +1488,7 @@ void DumpStats(float final)
                }
        }
 
-       if(teams_matter)
+       if(teamplay)
        {
                s = strcat(":labels:teamscores:", GetTeamScoreString(0, 0));
                if(to_console)
@@ -1529,8 +1527,6 @@ void FixIntermissionClient(entity e)
        string s;
        if(!e.autoscreenshot) // initial call
        {
-               e.angles = e.v_angle;
-               e.angles_x = -e.angles_x;
                e.autoscreenshot = time + 0.8;  // used for autoscreenshot
                e.health = -2342;
                // first intermission phase; voting phase has positive health (used to decide whether to send SVC_FINALE or not)
@@ -1553,11 +1549,6 @@ void FixIntermissionClient(entity e)
                        WriteByte(MSG_ONE, SVC_INTERMISSION);
                }
        }
-
-       //e.velocity = '0 0 0';
-       //e.fixangle = TRUE;
-
-       // TODO halt weapon animation
 }
 
 
@@ -1596,6 +1587,7 @@ void NextLevel()
        FOR_EACH_CLIENT(e)
                PlayerStats_AddGlobalInfo(e);
        PlayerStats_Shutdown();
+       WeaponStats_Shutdown();
 
        if(autocvar_sv_eventlog)
                GameLogEcho(":gameover");
@@ -1936,7 +1928,7 @@ float WinningCondition_Scores(float limit, float leadlimit)
        // TODO make everything use THIS winning condition (except LMS)
        WinningConditionHelper();
 
-       if(teams_matter)
+       if(teamplay)
        {
                team1_score = TeamScore_GetCompareValue(COLOR_TEAM1);
                team2_score = TeamScore_GetCompareValue(COLOR_TEAM2);
@@ -2306,7 +2298,6 @@ string mapvote_maps_pakfile[MAPVOTE_COUNT];
 float mapvote_maps_suggested[MAPVOTE_COUNT];
 string mapvote_suggestions[MAPVOTE_COUNT];
 float mapvote_suggestion_ptr;
-float mapvote_maxlen;
 float mapvote_voters;
 float mapvote_votes[MAPVOTE_COUNT];
 float mapvote_run;
@@ -2368,8 +2359,10 @@ void MapVote_AddVotable(string nextMap, float isSuggestion)
        for(j = 0; j < mapvote_count; ++j)
                if(mapvote_maps[j] == nextMap)
                        return;
-       if(strlen(nextMap) > mapvote_maxlen)
-               mapvote_maxlen = strlen(nextMap);
+       // suggestions might be no longer valid/allowed after gametype switch!
+       if(isSuggestion)
+               if(!MapInfo_CheckMap(nextMap))
+                       return;
        mapvote_maps[mapvote_count] = strzone(nextMap);
        mapvote_maps_suggested[mapvote_count] = isSuggestion;
 
@@ -2431,7 +2424,7 @@ void MapVote_Init()
        if(mapvote_count == 0)
        {
                bprint( "Maplist contains no single playable map!  Resetting it to default map list.\n" );
-               cvar_set("g_maplist", MapInfo_ListAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
+               cvar_set("g_maplist", MapInfo_ListAllAllowedMaps(MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags()));
                if(autocvar_g_maplist_shuffle)
                        ShuffleMaplist();
                localcmd("\nmenu_cmd sync\n");
index daec8754e2c02e9534a1316cfd4733b924e3da8f..8449157705c9c3a38dcad3ccc54c3c8e12a3130f 100644 (file)
@@ -157,8 +157,8 @@ float RadarMapAtPoint_Sample(float x, float y, float w, float h, float zmin, flo
 // removes the need to bound()
 string doublehex = "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F202122232425262728292A2B2C2D2E2F303132333435363738393A3B3C3D3E3F404142434445464748494A4B4C4D4E4F505152535455565758595A5B5C5D5E5F606162636465666768696A6B6C6D6E6F707172737475767778797A7B7C7D7E7F808182838485868788898A8B8C8D8E8F909192939495969798999A9B9C9D9E9FA0A1A2A3A4A5A6A7A8A9AAABACADAEAFB0B1B2B3B4B5B6B7B8B9BABBBCBDBEBFC0C1C2C3C4C5C6C7C8C9CACBCCCDCECFD0D1D2D3D4D5D6D7D8D9DADBDCDDDEDFE0E1E2E3E4E5E6E7E8E9EAEBECEDEEEFF0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFFFF";
 
-float RADAR_WIDTH_MAX = 2048;
-float RADAR_HEIGHT_MAX = 2048;
+float RADAR_WIDTH_MAX = 512;
+float RADAR_HEIGHT_MAX = 512;
 float sharpen_buffer[RADAR_WIDTH_MAX * 3];
 
 void sharpen_set(float x, float v)
@@ -665,7 +665,35 @@ void changematchtime(float delta, float mi, float ma)
                        return;
        }
 
-       cvar_set("timelimit", ftos(new));
+       cvar_set("timelimit", ftos(new / 60));
+}
+
+float g_clientmodel_genericsendentity (entity to, float sf);
+void modelbug_make_svqc();
+void modelbug_make_csqc()
+{
+       Net_LinkEntity(self, TRUE, 0, g_clientmodel_genericsendentity);
+       self.think = modelbug_make_svqc;
+       self.nextthink = time + 1;
+       setorigin(self, self.origin - '0 0 8');
+}
+void modelbug_make_svqc()
+{
+       self.SendEntity = func_null;
+       self.think = modelbug_make_csqc;
+       self.nextthink = time + 1;
+       setorigin(self, self.origin + '0 0 8');
+}
+
+void modelbug()
+{
+       entity e;
+       e = spawn();
+       setorigin(e, nextent(world).origin);
+       precache_model("models_portal.md3");
+       setmodel(e, "models/portal.md3");
+       e.think = modelbug_make_svqc;
+       e.nextthink = time + 1;
 }
 
 void GameCommand(string command)
@@ -787,7 +815,7 @@ void GameCommand(string command)
                                }
                                else
                                {
-                                       centerprint_atprio(client, CENTERPRIO_ADMIN, strcat("^3", admin_name(), ":\n\n^7", argv(2)));
+                                       centerprint(client, strcat("^3", admin_name(), ":\n\n^7", argv(2)));
                                        sprint(client, strcat("\{1}\{13}^3", admin_name(), "^7: ", argv(2), "\n"));
                                }
                                print("Message sent to ", client.netname, "\n");
@@ -840,7 +868,7 @@ void GameCommand(string command)
 
        if (argv(0) == "lockteams")
        {
-               if(teams_matter)
+               if(teamplay)
                {
                        lockteams = 1;
                        bprint("^1The teams are now locked.\n");
@@ -852,7 +880,7 @@ void GameCommand(string command)
 
        if (argv(0) == "unlockteams")
        {
-               if(teams_matter)
+               if(teamplay)
                {
                        lockteams = 0;
                        bprint("^1The teams are now unlocked.\n");
@@ -871,7 +899,7 @@ void GameCommand(string command)
                //      2 (10) no centerprint, admin message
                //      3 (11) no centerprint, no admin message
 
-               if(!teams_matter) {  // death match
+               if(!teamplay) {  // death match
                        print("Currently not playing a team game\n");
                        return;
                }
@@ -1451,6 +1479,12 @@ void GameCommand(string command)
                return;
        }
 
+       if(argv(0) == "modelbug")
+       {
+               modelbug();
+               return;
+       }
+
        print("Invalid command. For a list of supported commands, try sv_cmd help.\n");
 }
 
index 591bbf8b9fe670c9e749a0a6cf92400c67c35110..c49088156631df6221497b8ebfa51170381e9a78 100644 (file)
@@ -81,19 +81,20 @@ float logfile;
 
 string GetAdvancedDeathReports(entity enPlayer) // Extra fragmessage information
 {
-       local float nPlayerHealth = rint(enPlayer.health);
-       local float nPlayerArmor = rint(enPlayer.armorvalue);
-       local float nPlayerHandicap = enPlayer.cvar_cl_handicap;
-       local float nPlayerPing = rint(enPlayer.ping);
-       local string strPlayerPingColor;
-       local string strMessage;
+       float nPlayerHealth = rint(enPlayer.health);
+       float nPlayerArmor = rint(enPlayer.armorvalue);
+       float nPlayerHandicap = enPlayer.cvar_cl_handicap;
+       float nPlayerPing = rint(enPlayer.ping);
+       string strPlayerPingColor;
+       string strMessage;
+       
        if(nPlayerPing >= 150)
                strPlayerPingColor = "^1";
        else
                strPlayerPingColor = "^2";
 
        if((autocvar_sv_fragmessage_information_stats) && (enPlayer.health >= 1))
-               strMessage = strcat(strMessage, "\n^7(Health ^1", ftos(nPlayerHealth), "^7 / Armor ^2", ftos(nPlayerArmor), "^7)");
+               strMessage = strcat(strMessage, "^7(Health ^1", ftos(nPlayerHealth), "^7 / Armor ^2", ftos(nPlayerArmor), "^7)");
 
        if(autocvar_sv_fragmessage_information_ping) {
                if(clienttype(enPlayer) == CLIENTTYPE_BOT) // Bots have no ping
@@ -113,12 +114,16 @@ string GetAdvancedDeathReports(entity enPlayer) // Extra fragmessage information
        } else if(autocvar_sv_fragmessage_information_handicap) {
                if(autocvar_sv_fragmessage_information_handicap == 2)
                        if(nPlayerHandicap <= 1)
-                               strMessage = strcat(strMessage, "\n^7(Handicap ^2Off^7)");
+                               strMessage = strcat(strMessage, "^7(Handicap ^2Off^7)");
                        else
-                               strMessage = strcat(strMessage, "\n^7(Handicap ^2", ftos(nPlayerHandicap), "^7)");
+                               strMessage = strcat(strMessage, "^7(Handicap ^2", ftos(nPlayerHandicap), "^7)");
                else if(nPlayerHandicap > 1)
-                       strMessage = strcat(strMessage, "\n^7(Handicap ^2", ftos(nPlayerHandicap), "^7)");
+                       strMessage = strcat(strMessage, "^7(Handicap ^2", ftos(nPlayerHandicap), "^7)");
        }
+       
+       if(strMessage) // add new line to the beginning if there is a message
+               strMessage = strcat("\n", strMessage);
+               
        return strMessage;
 }
 void bcenterprint(string s)
@@ -579,9 +584,9 @@ void GetCvars(float f)
        MUTATOR_CALLHOOK(GetCvars);
        GetCvars_handleFloat(s, f, autoswitch, "cl_autoswitch");
        GetCvars_handleFloat(s, f, cvar_cl_playerdetailreduction, "cl_playerdetailreduction");
-       GetCvars_handleFloat(s, f, cvar_scr_centertime, "scr_centertime");
        GetCvars_handleString(s, f, cvar_g_xonoticversion, "g_xonoticversion");
        GetCvars_handleFloat(s, f, cvar_cl_handicap, "cl_handicap");
+       GetCvars_handleFloat(s, f, cvar_cl_clippedspectating, "cl_clippedspectating");
        GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriority, "cl_weaponpriority", W_FixWeaponOrder_ForceComplete_AndBuildImpulseList);
        GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[0], "cl_weaponpriority0", W_FixWeaponOrder_AllowIncomplete);
        GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[1], "cl_weaponpriority1", W_FixWeaponOrder_AllowIncomplete);
@@ -719,51 +724,11 @@ float NumberToTeamNumber(float number)
        return -1;
 }
 
-#define CENTERPRIO_POINT 1
-#define CENTERPRIO_SPAM 2
-#define CENTERPRIO_VOTE 4
-#define CENTERPRIO_NORMAL 5
-#define CENTERPRIO_SHIELDING 7
-#define CENTERPRIO_MAPVOTE 9
-#define CENTERPRIO_IDLEKICK 50
-#define CENTERPRIO_ADMIN 99
-.float centerprint_priority;
-.float centerprint_expires;
-void centerprint_atprio(entity e, float prio, string s)
-{
-    if (intermission_running)
-        if (prio < CENTERPRIO_MAPVOTE)
-            return;
-    if (time > e.centerprint_expires)
-        e.centerprint_priority = 0;
-    if (prio >= e.centerprint_priority)
-    {
-        e.centerprint_priority = prio;
-        if (timeoutStatus == 2)
-            e.centerprint_expires = time + (e.cvar_scr_centertime * TIMEOUT_SLOWMO_VALUE);
-        else
-            e.centerprint_expires = time + e.cvar_scr_centertime;
-        centerprint_builtin(e, s);
-    }
-}
-void centerprint_expire(entity e, float prio)
-{
-    if (prio == e.centerprint_priority)
-    {
-        e.centerprint_priority = 0;
-        centerprint_builtin(e, "");
-    }
-}
-void centerprint(entity e, string s)
-{
-    centerprint_atprio(e, CENTERPRIO_NORMAL, s);
-}
-
 // decolorizes and team colors the player name when needed
 string playername(entity p)
 {
     string t;
-    if (teams_matter && !intermission_running && p.classname == "player")
+    if (teamplay && !intermission_running && p.classname == "player")
     {
         t = Team_ColorCode(p.team);
         return strcat(t, strdecolorize(p.netname));
@@ -1314,7 +1279,6 @@ void readlevelcvars(void)
 
 // Sound functions
 string precache_sound (string s) = #19;
-void(entity e, float chan, string samp, float vol, float atten) sound_builtin = #8;
 float precache_sound_index (string s) = #19;
 
 #define SND_VOLUME      1
@@ -1346,12 +1310,24 @@ float sound_allowed(float dest, entity e)
     return TRUE;
 }
 
+#ifdef COMPAT_XON010_CHANNELS
+void(entity e, float chan, string samp, float vol, float atten) sound_builtin = #8;
 void sound(entity e, float chan, string samp, float vol, float atten)
 {
     if (!sound_allowed(MSG_BROADCAST, e))
         return;
     sound_builtin(e, chan, samp, vol, atten);
 }
+#else
+#undef sound
+void sound(entity e, float chan, string samp, float vol, float atten)
+{
+    if (!sound_allowed(MSG_BROADCAST, e))
+        return;
+    sound7(e, chan, samp, vol, atten, 0, 0);
+}
+#endif
+
 void soundtoat(float dest, entity e, vector o, float chan, string samp, float vol, float atten)
 {
     float entno, idx;
@@ -1372,7 +1348,7 @@ void soundtoat(float dest, entity e, vector o, float chan, string samp, float vo
         sflags |= SND_VOLUME;
     if (atten != 64)
         sflags |= SND_ATTENUATION;
-    if (entno >= 8192)
+    if (entno >= 8192 || chan < 0 || chan > 7)
         sflags |= SND_LARGEENTITY;
     if (idx >= 256)
         sflags |= SND_LARGESOUND;
@@ -1413,7 +1389,7 @@ void soundto(float dest, entity e, float chan, string samp, float vol, float att
 }
 void soundat(entity e, vector o, float chan, string samp, float vol, float atten)
 {
-    soundtoat(MSG_BROADCAST, e, o, chan, samp, vol, atten);
+    soundtoat(((chan & 8) ? MSG_ALL : MSG_BROADCAST), e, o, chan, samp, vol, atten);
 }
 void stopsoundto(float dest, entity e, float chan)
 {
@@ -1424,7 +1400,7 @@ void stopsoundto(float dest, entity e, float chan)
 
     entno = num_for_edict(e);
 
-    if (entno >= 8192)
+    if (entno >= 8192 || chan < 0 || chan > 7)
     {
         float idx, sflags;
         idx = precache_sound_index("misc/null.wav");
@@ -1462,7 +1438,7 @@ void play2(entity e, string filename)
 {
     //stuffcmd(e, strcat("play2 ", filename, "\n"));
     msg_entity = e;
-    soundtoat(MSG_ONE, world, '0 0 0', CHAN_AUTO, filename, VOL_BASE, ATTN_NONE);
+    soundtoat(MSG_ONE, world, '0 0 0', CH_INFO, filename, VOL_BASE, ATTN_NONE);
 }
 
 // use this one if you might be causing spam (e.g. from touch functions that might get called more than once per frame)
@@ -1500,7 +1476,7 @@ void play2all(string samp)
     if (autocvar_bot_sound_monopoly)
         return;
 
-    sound(world, CHAN_AUTO, samp, VOL_BASE, ATTN_NONE);
+    sound(world, CH_INFO, samp, VOL_BASE, ATTN_NONE);
 }
 
 void PrecachePlayerSounds(string f);
@@ -1690,6 +1666,30 @@ void precache()
 #define WRITESPECTATABLE_MSG_ONE(statement) WRITESPECTATABLE_MSG_ONE_VARNAME(oldmsg_entity, statement)
 #define WRITESPECTATABLE(msg,statement) if(msg == MSG_ONE) { WRITESPECTATABLE_MSG_ONE(statement); } else statement float WRITESPECTATABLE_workaround = 0
 
+
+void Send_CSQC_Centerprint_Generic(entity e, float id, string s, float duration, float countdown_num)
+{
+       if (clienttype(e) == CLIENTTYPE_REAL)
+       {
+               msg_entity = e;
+               WRITESPECTATABLE_MSG_ONE({
+                       WriteByte(MSG_ONE, SVC_TEMPENTITY);
+                       WriteByte(MSG_ONE, TE_CSQC_NOTIFY);
+                       WriteByte(MSG_ONE, CSQC_CENTERPRINT_GENERIC);
+                       WriteByte(MSG_ONE, id);
+                       WriteString(MSG_ONE, s);
+                       if (id != 0 && s != "")
+                       {
+                               WriteByte(MSG_ONE, duration);
+                               WriteByte(MSG_ONE, countdown_num);
+                       }
+               });
+       }
+}
+void Send_CSQC_Centerprint_Generic_Expire(entity e, float id)
+{
+       Send_CSQC_Centerprint_Generic(e, id, "", 1, 0);
+}
 // WARNING: this kills the trace globals
 #define EXACTTRIGGER_TOUCH if(WarpZoneLib_ExactTrigger_Touch()) return
 #define EXACTTRIGGER_INIT  WarpZoneLib_ExactTrigger_Init()
@@ -1755,6 +1755,8 @@ void remove_except_protected(entity e)
 
 void remove_unsafely(entity e)
 {
+    if(e.classname == "spike")
+        error("Removing spikes is forbidden (crylink bug), please report");
     remove_builtin(e);
 }
 
@@ -2015,17 +2017,27 @@ float SUB_NoImpactCheck()
 
 #define SUB_OwnerCheck() (other && (other == self.owner))
 
+void RemoveGrapplingHook(entity pl);
+void W_Crylink_Dequeue(entity e);
 float WarpZone_Projectile_Touch_ImpactFilter_Callback()
 {
        if(SUB_OwnerCheck())
                return TRUE;
        if(SUB_NoImpactCheck())
        {
-               remove(self);
+               if(self.classname == "grapplinghook")
+                       RemoveGrapplingHook(self.realowner);
+               else if(self.classname == "spike")
+               {
+                       W_Crylink_Dequeue(self);
+                       remove(self);
+               }
+               else
+                       remove(self);
                return TRUE;
        }
        if(trace_ent && trace_ent.solid > SOLID_TRIGGER)
-               UpdateCSQCProjectileNextFrame(self);
+               UpdateCSQCProjectile(self);
        return FALSE;
 }
 #define PROJECTILE_TOUCH if(WarpZone_Projectile_Touch()) return
@@ -2043,7 +2055,11 @@ void URI_Get_Callback(float id, float status, string data)
     dprint(data);
     dprint("\nEnd of data.\n");
 
-    if (id == URI_GET_DISCARD)
+    if(url_URI_Get_Callback(id, status, data))
+    {
+        // handled
+    }
+    else if (id == URI_GET_DISCARD)
     {
         // discard
     }
@@ -2624,15 +2640,15 @@ vector shotorg_adjustfromclient(vector vecs, float y_is_right, float allowcenter
 {
        switch(algn)
        {
-               case 1: // right
+               default:
+               case 3: // right
                        break;
 
-               case 2: // left
+               case 4: // left
                        vecs_y = -vecs_y;
                        break;
 
-               default:
-               case 3:
+               case 1:
                        if(allowcenter) // 2: allow center handedness
                        {
                                // center
@@ -2645,7 +2661,7 @@ vector shotorg_adjustfromclient(vector vecs, float y_is_right, float allowcenter
                        }
                        break;
 
-               case 4:
+               case 2:
                        if(allowcenter) // 2: allow center handedness
                        {
                                // center
@@ -2671,7 +2687,8 @@ vector shotorg_adjust_values(vector vecs, float y_is_right, float visual, float
        {
                if (visual)
                {
-                       vecs = shotorg_adjustfromclient(vecs, y_is_right, TRUE, algn);
+                       vecs_y = 0;
+                       vecs_z -= 2;
                }
                else
                {
@@ -2681,15 +2698,8 @@ vector shotorg_adjust_values(vector vecs, float y_is_right, float visual, float
        }
        else if (autocvar_g_shootfromcenter)
        {
-               if (visual)
-               {
-                       vecs = shotorg_adjustfromclient(vecs, y_is_right, TRUE, algn);
-               }
-               else
-               {
-                       vecs_y = 0;
-                       vecs_z -= 2;
-               }
+               vecs_y = 0;
+               vecs_z -= 2;
        }
        else if ((s = autocvar_g_shootfromfixedorigin) != "")
        {
@@ -3093,3 +3103,60 @@ void defer(float fdelay, void() func)
     e.think     = defer_think;
     e.nextthink = time + fdelay;
 }
+
+.string aiment_classname;
+.float aiment_deadflag;
+void SetMovetypeFollow(entity ent, entity e)
+{
+       // FIXME this may not be warpzone aware
+       ent.movetype = MOVETYPE_FOLLOW; // make the hole follow
+       ent.solid = SOLID_NOT; // MOVETYPE_FOLLOW is always non-solid - this means this cannot be teleported by warpzones any more! Instead, we must notice when our owner gets teleported.
+       ent.aiment = e; // make the hole follow bmodel
+       ent.punchangle = e.angles; // the original angles of bmodel
+       ent.view_ofs = ent.origin - e.origin; // relative origin
+       ent.v_angle = ent.angles - e.angles; // relative angles
+       ent.aiment_classname = strzone(e.classname);
+       ent.aiment_deadflag = e.deadflag;
+}
+void UnsetMovetypeFollow(entity ent)
+{
+       ent.movetype = MOVETYPE_FLY;
+       PROJECTILE_MAKETRIGGER(ent);
+       ent.aiment = world;
+}
+float LostMovetypeFollow(entity ent)
+{
+/*
+       if(ent.movetype != MOVETYPE_FOLLOW)
+               if(ent.aiment)
+                       error("???");
+*/
+       if(ent.aiment)
+       {
+               if(ent.aiment.classname != ent.aiment_classname)
+                       return 1;
+               if(ent.aiment.deadflag != ent.aiment_deadflag)
+                       return 1;
+       }
+       return 0;
+}
+
+float isPushable(entity e)
+{
+       if(e.iscreature)
+               return TRUE;
+       switch(e.classname)
+       {
+               case "body":
+               case "droppedweapon":
+               case "keepawayball":
+               case "nexball_basketball":
+               case "nexball_football":
+                       return TRUE;
+               case "bullet": // antilagged bullets can't hit this either
+                       return FALSE;
+       }
+       if (e.projectiledeathtype)
+               return TRUE;
+       return FALSE;
+}
index ba1f8accc348c5fe2692f219531c4c6a2af78c50..4f8aee2e76431f3cb36d5f438007c7037cdd6076 100644 (file)
@@ -372,6 +372,7 @@ float onslaught_controlpoint_attackable(entity cp, float t)
        return 0;
 }
 
+float overtime_msg_time;
 void onslaught_generator_think()
 {
        local float d;
@@ -379,12 +380,17 @@ void onslaught_generator_think()
        self.nextthink = ceil(time + 1);
        if (!gameover)
        {
-               if (autocvar_timelimit)
-               if (time > game_starttime + autocvar_timelimit * 60)
+               if (autocvar_timelimit && time > game_starttime + autocvar_timelimit * 60)
                {
+                       if (!overtime_msg_time)
+                       {
+                               FOR_EACH_PLAYER(e)
+                                       centerprint(e, "^3Now playing ^1OVERTIME^3!\n^3Generators start now to self-damaging.\n^3The more control points your team holds,\n^3the more damage the enemy generator gets.");
+                               overtime_msg_time = time;
+                       }
                        // self.max_health / 300 gives 5 minutes of overtime.
                        // control points reduce the overtime duration.
-                       sound(self, CHAN_TRIGGER, "onslaught/generator_decay.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_TRIGGER, "onslaught/generator_decay.wav", VOL_BASE, ATTN_NORM);
                        d = 1;
                        e = findchain(classname, "onslaught_controlpoint");
                        while (e)
@@ -397,6 +403,8 @@ void onslaught_generator_think()
                        d = d * self.max_health / 300;
                        Damage(self, self, self, d, DEATH_HURTTRIGGER, self.origin, '0 0 0');
                }
+               else if (overtime_msg_time)
+                       overtime_msg_time = 0;
        }
 };
 
@@ -455,7 +463,7 @@ void onslaught_generator_damage_think()
                if(random() < 0.01)
                {
                        pointparticles(particleeffectnum("electro_ballexplode"), self.origin + randompos('-50 -50 -20', '50 50 50'), '0 0 0', 1);
-                       sound(self, CHAN_TRIGGER, "onslaught/electricity_explode.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_TRIGGER, "onslaught/electricity_explode.wav", VOL_BASE, ATTN_NORM);
                }
                else
                        pointparticles(particleeffectnum("torch_small"), self.origin + randompos('-60 -60 -20', '60 60 60'), '0 0 0', 1);
@@ -484,7 +492,7 @@ void onslaught_generator_deaththink()
        if(self.count==40||self.count==20)
        {
                onslaught_generator_ring_spawn(self.origin);
-               sound(self, CHAN_TRIGGER, "onslaught/shockwave.wav", VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER, "onslaught/shockwave.wav", VOL_BASE, ATTN_NORM);
        }
 
        // Throw some gibs
@@ -510,7 +518,7 @@ void onslaught_generator_deaththink()
        if(random() < 0.25)
        {
                te_explosion(self.origin);
-               sound(self, CHAN_TRIGGER, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
        }
 
        // Particles
@@ -530,7 +538,7 @@ void onslaught_generator_deaththink()
                te_explosion(org);
                onslaught_generator_shockwave_spawn(org);
                pointparticles(particleeffectnum("onslaught_generator_finalexplosion"), org, '0 0 0', 1);
-               sound(self, CHAN_TRIGGER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
        }
        else
                self.nextthink = time + 0.05;
@@ -631,7 +639,7 @@ void onslaught_generator_damage(entity inflictor, entity attacker, float damage,
        // Throw some flaming gibs on damage, more damage = more chance for gib
        if(random() < damage/220)
        {
-               sound(self, CHAN_TRIGGER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
                i = random();
                if(i < 0.3)
                        ons_throwgib(hitloc + '0 0 20', force * -1, "models/onslaught/gen_gib1.md3", 5, TRUE);
@@ -647,9 +655,9 @@ void onslaught_generator_damage(entity inflictor, entity attacker, float damage,
 
                //sound on every hit
                if (random() < 0.5)
-                       sound(self, CHAN_TRIGGER, "onslaught/ons_hit1.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_TRIGGER, "onslaught/ons_hit1.wav", VOL_BASE, ATTN_NORM);
                else
-                       sound(self, CHAN_TRIGGER, "onslaught/ons_hit2.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_TRIGGER, "onslaught/ons_hit2.wav", VOL_BASE, ATTN_NORM);
        }
 
        //throw some gibs on damage
@@ -819,6 +827,7 @@ void onslaught_generator_reset()
        self.think = onslaught_generator_delayed;
        self.nextthink = time + 0.2;
        setmodel(self, "models/onslaught/generator.md3");
+       setsize(self, '-52 -52 -14', '52 52 75');
 
        WaypointSprite_UpdateMaxHealth(self.sprite, self.max_health);
        WaypointSprite_UpdateHealth(self.sprite, self.health);
@@ -900,7 +909,7 @@ void spawnfunc_onslaught_generator()
        self.nextthink = time + 0.2;
        InitializeEntity(self, onslaught_generator_delayed, INITPRIO_LAST);
 
-       WaypointSprite_SpawnFixed(string_null, e.origin + '0 0 1' * e.maxs_z, self, sprite);
+       WaypointSprite_SpawnFixed(string_null, e.origin + '0 0 1' * e.maxs_z, self, sprite, RADARICON_NONE, '0 0 0');
        WaypointSprite_UpdateRule(self.sprite, COLOR_TEAM2, SPRITERULE_TEAMPLAY);
        WaypointSprite_UpdateMaxHealth(self.sprite, self.max_health);
        WaypointSprite_UpdateHealth(self.sprite, self.health);
@@ -977,13 +986,13 @@ void onslaught_controlpoint_icon_damage(entity inflictor, entity attacker, float
        pointparticles(particleeffectnum("sparks"), hitloc, force*-1, 1);
        //sound on every hit
        if (random() < 0.5)
-               sound(self, CHAN_TRIGGER, "onslaught/ons_hit1.wav", VOL_BASE+0.3, ATTN_NORM);
+               sound(self, CH_TRIGGER, "onslaught/ons_hit1.wav", VOL_BASE+0.3, ATTN_NORM);
        else
-               sound(self, CHAN_TRIGGER, "onslaught/ons_hit2.wav", VOL_BASE+0.3, ATTN_NORM);
+               sound(self, CH_TRIGGER, "onslaught/ons_hit2.wav", VOL_BASE+0.3, ATTN_NORM);
 
        if (self.health < 0)
        {
-               sound(self, CHAN_TRIGGER, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
                pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
                {
                        string t;
@@ -1067,33 +1076,55 @@ void onslaught_controlpoint_icon_think()
 
                self.owner.waslinked = self.owner.islinked;
        }
-       if (self.punchangle_x > 2)
-               self.punchangle_x = self.punchangle_x - 2;
-       else if (self.punchangle_x < -2)
-               self.punchangle_x = self.punchangle_x + 2;
-       else
-               self.punchangle_x = 0;
-       if (self.punchangle_y > 2)
-               self.punchangle_y = self.punchangle_y - 2;
-       else if (self.punchangle_y < -2)
-               self.punchangle_y = self.punchangle_y + 2;
-       else
-               self.punchangle_y = 0;
-       if (self.punchangle_z > 2)
-               self.punchangle_z = self.punchangle_z - 2;
-       else if (self.punchangle_z < -2)
-               self.punchangle_z = self.punchangle_z + 2;
-       else
-               self.punchangle_z = 0;
+
+       if (self.punchangle_x > 0)
+       {
+               self.punchangle_x = self.punchangle_x - 60 * sys_frametime;
+               if (self.punchangle_x < 0)
+                       self.punchangle_x = 0;
+       }
+       else if (self.punchangle_x < 0)
+       {
+               self.punchangle_x = self.punchangle_x + 60 * sys_frametime;
+               if (self.punchangle_x > 0)
+                       self.punchangle_x = 0;
+       }
+
+       if (self.punchangle_y > 0)
+       {
+               self.punchangle_y = self.punchangle_y - 60 * sys_frametime;
+               if (self.punchangle_y < 0)
+                       self.punchangle_y = 0;
+       }
+       else if (self.punchangle_y < 0)
+       {
+               self.punchangle_y = self.punchangle_y + 60 * sys_frametime;
+               if (self.punchangle_y > 0)
+                       self.punchangle_y = 0;
+       }
+
+       if (self.punchangle_z > 0)
+       {
+               self.punchangle_z = self.punchangle_z - 60 * sys_frametime;
+               if (self.punchangle_z < 0)
+                       self.punchangle_z = 0;
+       }
+       else if (self.punchangle_z < 0)
+       {
+               self.punchangle_z = self.punchangle_z + 60 * sys_frametime;
+               if (self.punchangle_z > 0)
+                       self.punchangle_z = 0;
+       }
+
        self.angles_x = self.punchangle_x;
        self.angles_y = self.punchangle_y + self.mangle_y;
        self.angles_z = self.punchangle_z;
-       self.mangle_y = self.mangle_y + 1.5;
+       self.mangle_y = self.mangle_y + 45 * sys_frametime;
 
-       self.cp_bob_origin_z = 4 * PI * (1 - cos(self.cp_bob_spd / 8));
-       self.cp_bob_spd = self.cp_bob_spd + 0.5;
+       self.cp_bob_origin_z = 4 * PI * (1 - cos(self.cp_bob_spd));
+       self.cp_bob_spd = self.cp_bob_spd + 1.875 * sys_frametime;
        if(self.cp_bob_dmg_z > 0)
-               self.cp_bob_dmg_z = self.cp_bob_dmg_z - 0.1;
+               self.cp_bob_dmg_z = self.cp_bob_dmg_z - 3 * sys_frametime;
        else
                self.cp_bob_dmg_z = 0;
        setorigin(self,self.cp_origin + self.cp_bob_origin + self.cp_bob_dmg);
@@ -1104,9 +1135,9 @@ void onslaught_controlpoint_icon_think()
                pointparticles(particleeffectnum("electricity_sparks"), self.origin + randompos('-10 -10 -20', '10 10 20'), '0 0 0', 1);
 
                if(random() > 0.8)
-                       sound(self, CHAN_PAIN, "onslaught/ons_spark1.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_PAIN, "onslaught/ons_spark1.wav", VOL_BASE, ATTN_NORM);
                else if (random() > 0.5)
-                       sound(self, CHAN_PAIN, "onslaught/ons_spark2.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_PAIN, "onslaught/ons_spark2.wav", VOL_BASE, ATTN_NORM);
        }
 };
 
@@ -1129,7 +1160,7 @@ void onslaught_controlpoint_icon_buildthink()
                self.health = self.max_health;
                self.count = autocvar_g_onslaught_cp_regen * sys_frametime; // slow repair rate from now on
                self.think = onslaught_controlpoint_icon_think;
-               sound(self, CHAN_TRIGGER, "onslaught/controlpoint_built.wav", VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER, "onslaught/controlpoint_built.wav", VOL_BASE, ATTN_NORM);
                bprint(ColoredTeamName(self.team), " captured ", self.owner.message, " control point\n");
                self.owner.iscaptured = TRUE;
 
@@ -1192,7 +1223,7 @@ void onslaught_controlpoint_touch()
        e.think = onslaught_controlpoint_icon_buildthink;
        e.nextthink = time + sys_frametime;
        e.count = (e.max_health - e.health) * sys_frametime / autocvar_g_onslaught_cp_buildtime; // how long it takes to build
-       sound(e, CHAN_TRIGGER, "onslaught/controlpoint_build.wav", VOL_BASE, ATTN_NORM);
+       sound(e, CH_TRIGGER, "onslaught/controlpoint_build.wav", VOL_BASE, ATTN_NORM);
        self.team = e.team;
        self.colormap = e.colormap;
        WaypointSprite_UpdateBuildFinished(self.sprite, time + (e.max_health - e.health) / (e.count / sys_frametime));
@@ -1283,7 +1314,7 @@ void spawnfunc_onslaught_controlpoint()
 
        waypoint_spawnforitem(self);
 
-       WaypointSprite_SpawnFixed(string_null, e.origin + '0 0 1' * e.maxs_z, self, sprite);
+       WaypointSprite_SpawnFixed(string_null, e.origin + '0 0 1' * e.maxs_z, self, sprite, RADARICON_NONE, '0 0 0');
        WaypointSprite_UpdateRule(self.sprite, COLOR_TEAM2, SPRITERULE_TEAMPLAY);
 
        onslaught_updatelinks();
index 022fde20152fec14ba2b6e223308569b6b146ff8..b7c775578cc22b339a0c124e87c63c08a9d97ac8 100644 (file)
@@ -115,8 +115,10 @@ void() t_movetarget =
        self = other;
        other = temp;
 
+       /* PLEASE FIX THE SOUND CHANNEL BEFORE ACTIVATING THIS
        if (self.classname == "monster_ogre")
                sound (self, CHAN_VOICE, "ogre/ogdrag.wav", 1, ATTN_IDLE);// play chainsaw drag sound
+       */
 
 //dprint ("t_movetarget\n");
        self.goalentity = self.movetarget = find (world, targetname, other.target);
@@ -168,8 +170,10 @@ void() monster_wanderpathtouch =
        if (other.enemy)
                return;         // fighting, not following a path
 
+       /* PLEASE FIX THE SOUND CHANNEL BEFORE ACTIVATING THIS
        if (other.classname == "monster_ogre")
                sound (other, CHAN_VOICE, "ogre/ogdrag.wav", 1, ATTN_IDLE);// play chainsaw drag sound
+       */
        monster_wanderpaththink();
 };
 
index dd12e96bcb9471ff27b53a6364e4ff1b64988b5f..ceb3f207cc45d59c3f50d218a1c6ad61af75dc94 100644 (file)
@@ -104,7 +104,9 @@ void(float a) monster_setalpha =
                        if (random() < 0.005)
                        {
                                // blink for an instant, this causes the appear sound, alarming the player as if under attack
+                               /* PLEASE FIX THE SOUND CHANNEL BEFORE ACTIVATING THIS
                                sound(self, CHAN_AUTO, "wizard/wsight.wav", 1, ATTN_NORM);
+                               */
                                a = 1;
                        }
                }
@@ -117,8 +119,10 @@ void(float a) monster_setalpha =
                else
                {
                        // if unghosting, make sure we have an enemy, otherwise stay ghosted (even if blinking) so we can't be shot while blinking
+                       /* PLEASE FIX THE SOUND CHANNEL BEFORE ACTIVATING THIS
                        if (self.solid != SOLID_SLIDEBOX)
                                sound(self, CHAN_AUTO, "wizard/wsight.wav", 1, ATTN_NORM);
+                       */
                        self.solid = SOLID_SLIDEBOX;
                        self.takedamage = DAMAGE_AIM;
                }
index 89feff9a49e3bbdf77de224226fd569adf8cfb9f..8a6235127cbcd5d721a9020d3609219b62979974 100644 (file)
@@ -1,3 +1,4 @@
+#ifdef SVQC 
 .vector moveto;
 
 /**
@@ -161,10 +162,14 @@ void movelib_update(vector dir,float force)
 }
 */
 
+/*
 void movelib_move_simple(vector newdir,float velo,float blendrate)
 {
     self.velocity = self.velocity * (1 - blendrate) + (newdir * blendrate) * velo;
 }
+*/
+#define movelib_move_simple(newdir,velo,blendrate) \
+    self.velocity = self.velocity * (1 - blendrate) + (newdir * blendrate) * velo
 
 void movelib_beak_simple(float force)
 {
@@ -183,6 +188,8 @@ void movelib_beak_simple(float force)
 Pitches and rolls the entity to match the gound.
 Yed need to set v_up and v_forward (generally by calling makevectors) before calling this.
 **/
+#endif
+
 void movelib_groundalign4point(float spring_length, float spring_up, float blendrate)
 {
     vector a, b, c, d, e, r, push_angle, ahead, side;
index 6978496802d1d61585b46ea45bb3d937e32db1f8..fdf24edb75a399a526e085a7f28c11b6791c349c 100644 (file)
@@ -83,7 +83,10 @@ float CallbackChain_Call(entity cb)
        entity e;
        r = 0;
        for(e = cb; e.cbc_next; e = e.cbc_next)
+       {
+               CallbackChain_ReturnValue = r;
                r |= e.cbc_next.cbc_func();
+       }
        return r; // callbacks return an error status, so 0 is default return value
 }
 
index 05a5187e508709528c16cee43e7938027fb64d5b..e26280e61a695cf0fedcff92ff3fd487c803a830 100644 (file)
@@ -3,6 +3,8 @@
 #define CBC_ORDER_LAST 2
 #define CBC_ORDER_ANY 4
 
+float CallbackChain_ReturnValue; // read-only field of the current return value
+
 entity CallbackChain_New(string name);
 float CallbackChain_Add(entity cb, float() func, float order)
 float CallbackChain_Remove(entity cb, float() func);
@@ -32,6 +34,7 @@ void Mutator_Remove(mutatorfunc_t func, string name); // calls error() on fail
 #define MUTATOR_HOOKABLE(cb) entity HOOK_##cb
 #define MUTATOR_CALLHOOK(cb) CallbackChain_Call(HOOK_##cb)
 
+#define MUTATOR_RETURNVALUE CallbackChain_ReturnValue
 
 
 
@@ -151,3 +154,8 @@ MUTATOR_HOOKABLE(PlayerPowerups);
        // INPUT
        entity self;
        float olditems; // also technically output, but since it is at the end of the function it's useless for that :P 
+
+MUTATOR_HOOKABLE(PlayerUseKey);
+       // called when the use key is pressed
+       // if MUTATOR_RETURNVALUE is 1, don't do anything
+       // return 1 if the use key actually did something
index f56dc59f18f15979d5cdd8e5defb06826babdaf9..f74c9951fd4d49027e518057685823896b6a7def 100644 (file)
@@ -69,6 +69,7 @@ void freezetag_Freeze(entity attacker)
                return;
        self.freezetag_frozen = 1;
        self.freezetag_revive_progress = 0;
+       self.health = 1;
 
        entity ice;
        ice = spawn();
@@ -88,11 +89,7 @@ void freezetag_Freeze(entity attacker)
        RemoveGrapplingHook(self);
 
        // add waypoint
-       WaypointSprite_Spawn("freezetag_frozen", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attached, TRUE);
-       if(self.waypointsprite_attached)
-       {
-               WaypointSprite_UpdateTeamRadar(self.waypointsprite_attached, RADARICON_WAYPOINT, '0.25 0.90 1');
-       }
+       WaypointSprite_Spawn("freezetag_frozen", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attached, TRUE, RADARICON_WAYPOINT, '0.25 0.90 1');
 
        if(attacker == self)
        {
@@ -117,6 +114,7 @@ void freezetag_Unfreeze(entity attacker)
 {
        self.freezetag_frozen = 0;
        self.freezetag_revive_progress = 0;
+       self.health = autocvar_g_balance_health_start;
 
        // remove the ice block
        entity ice;
@@ -187,7 +185,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerDies)
                bprint("^7", frag_target.netname, "^1 was frozen by ^7", frag_attacker.netname, ".\n");
        }
 
-       frag_target.health = autocvar_g_balance_health_start; // "respawn" the player :P
+       frag_target.health = 1; // "respawn" the player :P
 
        freezetag_CheckWinner();
 
@@ -248,6 +246,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink)
        if(n && self.freezetag_frozen) // OK, there is at least one teammate reviving us
        {
                self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress + frametime * autocvar_g_freezetag_revive_speed, 1);
+               self.health = max(1, self.freezetag_revive_progress * autocvar_g_balance_health_start);
 
                if(self.freezetag_revive_progress >= 1)
                {
@@ -296,6 +295,7 @@ MUTATOR_HOOKFUNCTION(freezetag_PlayerPreThink)
        else if(!n && self.freezetag_frozen) // only if no teammate is nearby will we reset
        {
                self.freezetag_revive_progress = bound(0, self.freezetag_revive_progress - frametime * autocvar_g_freezetag_revive_clearspeed, 1);
+               self.health = max(1, self.freezetag_revive_progress * autocvar_g_balance_health_start);
        }
        else if(!n)
        {
index 60c39d43410498bc752265a9d0d9e1f645da9ca2..8d3511eceda0750e74266d5649133b69f9c15e84 100644 (file)
@@ -4,6 +4,8 @@ void ka_RespawnBall(void);
 void ka_DropEvent(entity);
 void ka_TimeScoring(void);
 
+entity ka_ball;
+
 float ka_ballcarrier_waypointsprite_visible_for_player(entity);
 
 void ka_Initialize() // run at the start of a match, initiates game mode
@@ -50,6 +52,7 @@ void ka_SpawnBall() // loads various values for the ball, runs only once at star
        e.reset = ka_Reset;
        e.touch = ka_TouchEvent;
        e.owner = world;
+       ka_ball = e;
 
        InitializeEntity(e, ka_RespawnBall, INITPRIO_SETLOCATION); // is this the right priority? Neh, I have no idea.. Well-- it works! So. 
 }
@@ -72,11 +75,10 @@ void ka_RespawnBall() // runs whenever the ball needs to be relocated
                pointparticles(particleeffectnum("electro_combo"), oldballorigin, '0 0 0', 1);
                pointparticles(particleeffectnum("electro_combo"), self.origin, '0 0 0', 1);
 
-               WaypointSprite_Spawn("ka-ball", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attachedforcarrier, FALSE);
-               WaypointSprite_UpdateTeamRadar(self.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '0 1 1');
+               WaypointSprite_Spawn("ka-ball", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAGCARRIER, '0 1 1');
                WaypointSprite_Ping(self.waypointsprite_attachedforcarrier);    
 
-               sound(self, CHAN_AUTO, "keepaway/respawn.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere) 
+               sound(self, CH_TRIGGER, "keepaway/respawn.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere) 
        }
        else
        {
@@ -97,7 +99,7 @@ void ka_TouchEvent() // runs any time that the ball comes in contact with someth
        if(other.classname != "player") 
        {  // The ball just touched an object, most likely the world
                pointparticles(particleeffectnum("kaball_sparks"), self.origin, '0 0 0', 1);
-               sound(self, CHAN_AUTO, "keepaway/touch.wav", VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER, "keepaway/touch.wav", VOL_BASE, ATTN_NORM);
                return; 
        }
        else if(self.wait > time) { return; }
@@ -125,17 +127,16 @@ void ka_TouchEvent() // runs any time that the ball comes in contact with someth
        // messages and sounds
        Send_KillNotification(other.netname, "", "", KA_PICKUPBALL, MSG_KA);
        WriteByte(MSG_BROADCAST, SVC_CENTERPRINT);
-       WriteString(MSG_BROADCAST, strcat("\n\n", other.netname, "^7 has picked up the ball!\n"));
-       sound(self.owner, CHAN_AUTO, "keepaway/pickedup.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere) 
+       WriteString(MSG_BROADCAST, strcat(other.netname, "^7 has picked up the ball!"));
+       sound(self.owner, CH_TRIGGER, "keepaway/pickedup.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere) 
        
        // scoring
        PlayerScore_Add(other, SP_KEEPAWAY_PICKUPS, 1);
 
        // waypoints
-       WaypointSprite_AttachCarrier("ka-ballcarrier", other);
+       WaypointSprite_AttachCarrier("ka-ballcarrier", other, RADARICON_FLAGCARRIER, '1 0 0');
        other.waypointsprite_attachedforcarrier.waypointsprite_visible_for_player = ka_ballcarrier_waypointsprite_visible_for_player;
        WaypointSprite_UpdateRule(other.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
-       WaypointSprite_UpdateTeamRadar(other.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '1 0 0');
        WaypointSprite_Ping(other.waypointsprite_attachedforcarrier);   
        WaypointSprite_Kill(self.waypointsprite_attachedforcarrier);
 }
@@ -168,16 +169,15 @@ void ka_DropEvent(entity plyr) // runs any time that a player is supposed to los
        // messages and sounds
        Send_KillNotification(plyr.netname, "", "", KA_DROPBALL, MSG_KA);
        WriteByte(MSG_BROADCAST, SVC_CENTERPRINT);
-       WriteString(MSG_BROADCAST, strcat("\n\n", plyr.netname, "^7 has dropped the ball!\n"));
-       sound(other, CHAN_AUTO, "keepaway/dropped.wav", VOL_BASE, ATTN_NONE);   // ATTN_NONE (it's a sound intended to be heard anywhere) 
+       WriteString(MSG_BROADCAST, strcat(plyr.netname, "^7 has dropped the ball!"));
+       sound(other, CH_TRIGGER, "keepaway/dropped.wav", VOL_BASE, ATTN_NONE);  // ATTN_NONE (it's a sound intended to be heard anywhere) 
        
        // scoring
        // PlayerScore_Add(plyr, SP_KEEPAWAY_DROPS, 1); Not anymore, this is 100% the same as pickups and is useless.
        
        // waypoints
-       WaypointSprite_Spawn("ka-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE);
+       WaypointSprite_Spawn("ka-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAGCARRIER, '0 1 1');
        WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
-       WaypointSprite_UpdateTeamRadar(ball.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '0 1 1');
        WaypointSprite_Ping(ball.waypointsprite_attachedforcarrier);    
        WaypointSprite_Kill(plyr.waypointsprite_attachedforcarrier);
 }
@@ -216,7 +216,7 @@ MUTATOR_HOOKFUNCTION(ka_Scoring)
                }
                else if(!frag_attacker.ballcarried)
                        if(autocvar_g_keepaway_noncarrier_warn)
-                               centerprint_atprio(frag_attacker, (CENTERPRIO_SPAM + 5), "Killing people while you don't have the ball gives no points!");
+                               centerprint(frag_attacker, "Killing people while you don't have the ball gives no points!");
 
                if(frag_attacker.ballcarried) // add to amount of kills while ballcarrier
                        PlayerScore_Add(frag_attacker, SP_SCORE, autocvar_g_keepaway_score_killac);
@@ -241,10 +241,17 @@ MUTATOR_HOOKFUNCTION(ka_PlayerPreThink)
        if(self.ballcarried)
                self.items |= IT_KEY1;
 
-       // drop the ball if the player presses the use button
-       if(self.BUTTON_USE)
-               if(self.ballcarried) { ka_DropEvent(self); } 
+       return 0;
+}
 
+MUTATOR_HOOKFUNCTION(ka_PlayerUseKey)
+{
+       if(MUTATOR_RETURNVALUE == 0)
+       if(self.ballcarried)
+       {
+               ka_DropEvent(self);
+               return 1;
+       }
        return 0;
 }
 
@@ -307,6 +314,7 @@ MUTATOR_DEFINITION(gamemode_keepaway)
        MUTATOR_HOOK(PlayerPreThink, ka_PlayerPreThink, CBC_ORDER_ANY);
        MUTATOR_HOOK(PlayerDamage_Calculate, ka_PlayerDamage, CBC_ORDER_ANY);
        MUTATOR_HOOK(PlayerPowerups, ka_PlayerPowerups, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerUseKey, ka_PlayerUseKey, CBC_ORDER_ANY);
 
        MUTATOR_ONADD
        {
index e1cb1a85bcfe65e788eb11ce0fb1ada428205ee8..d3f4fdc87e8fa328bfc87dd000f79c6ccbe1e38d 100644 (file)
@@ -58,6 +58,7 @@ float kh_interferemsg_time, kh_interferemsg_team;
 .float kh_dropperteam;
 .entity kh_previous_owner;
 .float kh_previous_owner_playerid;
+.float kh_cp_duration;
 
 string kh_sound_capture = "kh/capture.wav";
 string kh_sound_destroy = "kh/destroy.wav";
@@ -121,7 +122,7 @@ void kh_update_state()
 
 
 var kh_Think_t kh_Controller_Thinkfunc;
-void kh_Controller_SetThink(float t, string msg, kh_Think_t func)  // runs occasionaly
+void kh_Controller_SetThink(float t, string msg, float centerprint_duration, kh_Think_t func)  // runs occasionaly
 {
        kh_Controller_Thinkfunc = func;
        kh_controller.cnt = ceil(t);
@@ -130,10 +131,17 @@ void kh_Controller_SetThink(float t, string msg, kh_Think_t func)  // runs occas
        if(msg == "")
                kh_Controller_Waitmsg = "";
        else
+       {
+               kh_controller.kh_cp_duration = centerprint_duration;
                kh_Controller_Waitmsg = strzone(msg);
+       }
        if(t == 0)
                kh_controller.nextthink = time; // force
 }
+void kh_Controller_SetThink_NoMsg(float t, kh_Think_t func)  // runs occasionaly
+{
+       kh_Controller_SetThink(t, "", 0, func);
+}
 
 void kh_Controller_Think()  // called a lot
 {
@@ -154,7 +162,7 @@ void kh_Controller_Think()  // called a lot
 
                        FOR_EACH_PLAYER(e)
                                if(clienttype(e) == CLIENTTYPE_REAL)
-                                       centerprint_atprio(e, CENTERPRIO_SPAM, s);
+                                       Send_CSQC_Centerprint_Generic(e, CPID_KH_MSG, s, self.kh_cp_duration, 0);
                }
                self.cnt -= 1;
        }
@@ -350,7 +358,7 @@ void kh_Key_AssignTo(entity key, entity player)  // runs every time a key is pic
                if(key.kh_next == world)
                {
                        // player is now a key carrier
-                       WaypointSprite_AttachCarrier("", player);
+                       WaypointSprite_AttachCarrier("", player, RADARICON_FLAGCARRIER, colormapPaletteColor(player.team - 1, 0));
                        player.waypointsprite_attachedforcarrier.waypointsprite_visible_for_player = kh_KeyCarrier_waypointsprite_visible_for_player;
                        WaypointSprite_UpdateRule(player.waypointsprite_attachedforcarrier, player.team, SPRITERULE_TEAMPLAY);
                        if(player.team == COLOR_TEAM1)
@@ -361,7 +369,6 @@ void kh_Key_AssignTo(entity key, entity player)  // runs every time a key is pic
                                WaypointSprite_UpdateSprites(player.waypointsprite_attachedforcarrier, "keycarrier-yellow", "keycarrier-friend", "keycarrier-yellow");
                        else if(player.team == COLOR_TEAM4)
                                WaypointSprite_UpdateSprites(player.waypointsprite_attachedforcarrier, "keycarrier-pink", "keycarrier-friend", "keycarrier-pink");
-                       WaypointSprite_UpdateTeamRadar(player.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, colormapPaletteColor(player.team - 1, 0));
                        if(!kh_no_radar_circles)
                                WaypointSprite_Ping(player.waypointsprite_attachedforcarrier);
                }
@@ -414,7 +421,7 @@ void kh_Key_Damage(entity inflictor, entity attacker, float damage, float deatht
 
 void kh_Key_Collect(entity key, entity player)  //a player picks up a dropped key
 {
-       sound(player, CHAN_AUTO, kh_sound_collect, VOL_BASE, ATTN_NORM);
+       sound(player, CH_TRIGGER, kh_sound_collect, VOL_BASE, ATTN_NORM);
 
        if(key.kh_dropperteam != player.team)
        {
@@ -487,7 +494,7 @@ void kh_FinishRound()  // runs when a team captures the keys
                kh_Key_Remove(key);
        kh_no_radar_circles = FALSE;
 
-       kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_round, "Round starts in ", kh_StartRound);
+       kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_round, "Round starts in ", 1, kh_StartRound);
 }
 
 void kh_WinnerTeam(float teem)  // runs when a team wins
@@ -653,23 +660,6 @@ void kh_Key_Think()  // runs all the time
                makevectors('0 1 0' * (self.cnt + mod(time, 360) * KH_KEY_XYSPEED));
                setorigin(self, v_forward * KH_KEY_XYDIST + '0 0 1' * self.origin_z);
 #endif
-
-               if(self.owner.BUTTON_USE)
-               if(time >= self.owner.kh_droptime + autocvar_g_balance_keyhunt_delay_drop)
-               {
-                       self.owner.kh_droptime = time;
-                       self.kh_droptime = time;  // prevent collecting this one for some time
-                       self.enemy = self.owner;
-                       self.pusher = world;
-                       kh_Scores_Event(self.owner, self, "dropkey", 0, 0);
-                       bprint(self.owner.netname, "^7 dropped the ", self.netname, "\n");
-                       sound(self.owner, CHAN_AUTO, kh_sound_drop, VOL_BASE, ATTN_NORM);
-                       makevectors(self.owner.v_angle);
-                       self.velocity = W_CalculateProjectileVelocity(self.owner.velocity, autocvar_g_balance_keyhunt_throwvelocity * v_forward, FALSE);
-                       kh_Key_AssignTo(self, world);
-                       self.pushltime = time + autocvar_g_balance_keyhunt_protecttime;
-                       self.kh_dropperteam = self.team;
-               }
        }
 
        // if in nodrop or time over, end the round
@@ -682,7 +672,7 @@ void kh_Key_Think()  // runs all the time
        {
                if(self.siren_time < time)
                {
-                       sound(self.owner, CHAN_AUTO, kh_sound_alarm, VOL_BASE, ATTN_NORM);  // play a simple alarm
+                       sound(self.owner, CH_TRIGGER, kh_sound_alarm, VOL_BASE, ATTN_NORM);  // play a simple alarm
                        self.siren_time = time + 2.5;  // repeat every 2.5 seconds
                }
 
@@ -703,11 +693,11 @@ void kh_Key_Think()  // runs all the time
                {
                        if(head.team == kh_interferemsg_team)
                                if(head.kh_next)
-                                       centerprint(head, "All keys are in your team's hands!\n\nMeet the other key carriers ^1NOW^7!");
+                                       Send_CSQC_Centerprint_Generic(head, CPID_KH_MSG, "All keys are in your team's hands!\n\nMeet the other key carriers ^1NOW^7!", 0, 0);
                                else
-                                       centerprint(head, "All keys are in your team's hands!\n\nHelp the key carriers to meet!");
+                                       Send_CSQC_Centerprint_Generic(head, CPID_KH_MSG, "All keys are in your team's hands!\n\nHelp the key carriers to meet!", 0, 0);
                        else
-                               centerprint(head, strcat("All keys are in the ", ColoredTeamName(kh_interferemsg_team), "^7's hands!\n\nInterfere ^1NOW^7!"));
+                               Send_CSQC_Centerprint_Generic(head, CPID_KH_MSG, strcat("All keys are in the ", ColoredTeamName(kh_interferemsg_team), "^7's hands!\n\nInterfere ^1NOW^7!"), 0, 0);
                }
        }
 
@@ -768,9 +758,8 @@ void kh_Key_Spawn(entity initial_owner, float angle, float i)  // runs every tim
 
        centerprint(initial_owner, strcat("You are starting with the ", key.netname, "\n"));  // message to player at start of round
 
-       WaypointSprite_Spawn("key-dropped", 0, 0, key, '0 0 1' * KH_KEY_WP_ZSHIFT, world, key.team, key, waypointsprite_attachedforcarrier, FALSE);
+       WaypointSprite_Spawn("key-dropped", 0, 0, key, '0 0 1' * KH_KEY_WP_ZSHIFT, world, key.team, key, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAG, '0 1 1');
        key.waypointsprite_attachedforcarrier.waypointsprite_visible_for_player = kh_Key_waypointsprite_visible_for_player;
-       WaypointSprite_UpdateTeamRadar(key.waypointsprite_attachedforcarrier, RADARICON_FLAG, '0 1 1');
 
        kh_Key_AssignTo(key, initial_owner);
 }
@@ -799,6 +788,28 @@ float kh_Key_AllOwnedByWhichTeam()  // constantly called. check to see if all th
        return teem;
 }
 
+void kh_Key_DropOne(entity key)
+{
+       // prevent collecting this one for some time
+       entity player;
+       player = key.owner;
+
+       key.kh_droptime = time;
+       key.enemy = player;
+
+       kh_Scores_Event(player, key, "dropkey", 0, 0);
+       PlayerScore_Add(player, SP_KH_LOSSES, 1);
+       bprint(player.netname, "^7 dropped the ", key.netname, "\n");
+       kh_Key_AssignTo(key, world);
+       makevectors(player.v_angle);
+       key.velocity = W_CalculateProjectileVelocity(player.velocity, autocvar_g_balance_keyhunt_throwvelocity * v_forward, FALSE);
+       key.pusher = world;
+       key.pushltime = time + autocvar_g_balance_keyhunt_protecttime;
+       key.kh_dropperteam = key.team;
+
+       sound(player, CH_TRIGGER, kh_sound_drop, VOL_BASE, ATTN_NORM);
+}
+
 void kh_Key_DropAll(entity player, float suicide) // runs whenever a player dies
 {
        entity key;
@@ -822,7 +833,7 @@ void kh_Key_DropAll(entity player, float suicide) // runs whenever a player dies
                        if(suicide)
                                key.kh_dropperteam = player.team;
                }
-               sound(player, CHAN_AUTO, kh_sound_drop, VOL_BASE, ATTN_NORM);
+               sound(player, CH_TRIGGER, kh_sound_drop, VOL_BASE, ATTN_NORM);
        }
 }
 
@@ -859,15 +870,15 @@ void kh_WaitForPlayers()  // delay start of the round until enough players are p
 
        if(time < game_starttime)
        {
-               kh_Controller_SetThink(game_starttime - time + 0.1, "", kh_WaitForPlayers);
+               kh_Controller_SetThink_NoMsg(game_starttime - time + 0.1, kh_WaitForPlayers);
                return;
        }
 
        teams_missing = kh_CheckEnoughPlayers();
        if(teams_missing == "")
-               kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_round, "Round starts in ", kh_StartRound);
+               kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_round, "Round starts in ", 1, kh_StartRound);
        else
-               kh_Controller_SetThink(1, strcat("Waiting for players to join...\n\nNeed active players for: ", teams_missing), kh_WaitForPlayers);
+               kh_Controller_SetThink(1, strcat("Waiting for players to join...\n\nNeed active players for: ", teams_missing), -1, kh_WaitForPlayers);
 }
 
 void kh_EnableTrackingDevice()  // runs after each round
@@ -876,7 +887,7 @@ void kh_EnableTrackingDevice()  // runs after each round
 
        FOR_EACH_PLAYER(player)
                if(clienttype(player) == CLIENTTYPE_REAL)
-                       centerprint_expire(player, CENTERPRIO_SPAM);
+                       Send_CSQC_Centerprint_Generic_Expire(player, CPID_KH_MSG);
 
        kh_tracking_enabled = TRUE;
 }
@@ -889,20 +900,20 @@ void kh_StartRound()  // runs at the start of each round
 
        if(time < game_starttime)
        {
-               kh_Controller_SetThink(game_starttime - time + 0.1, "", kh_WaitForPlayers);
+               kh_Controller_SetThink_NoMsg(game_starttime - time + 0.1, kh_WaitForPlayers);
                return;
        }
 
        teams_missing = kh_CheckEnoughPlayers();
        if(teams_missing != "")
        {
-               kh_Controller_SetThink(1, strcat("Waiting for players to join...\n\nNeed active players for: ", teams_missing), kh_WaitForPlayers);
+               kh_Controller_SetThink(1, strcat("Waiting for players to join...\n\nNeed active players for: ", teams_missing), -1, kh_WaitForPlayers);
                return;
        }
 
        FOR_EACH_PLAYER(player)
                if(clienttype(player) == CLIENTTYPE_REAL)
-                       centerprint_expire(player, CENTERPRIO_SPAM);
+                       Send_CSQC_Centerprint_Generic_Expire(player, CPID_KH_MSG);
 
        for(i = 0; i < kh_teams; ++i)
        {
@@ -922,7 +933,7 @@ void kh_StartRound()  // runs at the start of each round
        }
 
        kh_tracking_enabled = FALSE;
-       kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_tracking, "Scanning frequency range...", kh_EnableTrackingDevice);
+       kh_Controller_SetThink(autocvar_g_balance_keyhunt_delay_tracking, "Scanning frequency range...", -1, kh_EnableTrackingDevice);
 }
 
 float kh_HandleFrags(entity attacker, entity targ, float f)  // adds to the player score
@@ -974,7 +985,7 @@ void kh_Initialize()  // sets up th KH environment
        // make a KH entity for controlling the game
        kh_controller = spawn();
        kh_controller.think = kh_Controller_Think;
-       kh_Controller_SetThink(0, "", kh_WaitForPlayers);
+       kh_Controller_SetThink_NoMsg(0, kh_WaitForPlayers);
 
        setmodel(kh_controller, "models/keyhunt/key.md3");
        kh_key_dropped = kh_controller.modelindex;
@@ -1018,7 +1029,7 @@ MUTATOR_HOOKFUNCTION(kh_PlayerDies)
 {
        if(self == other)
                kh_Key_DropAll(self, TRUE);
-       else if(other.classname == "player" || other.classname == "gib")
+       else if(other.classname == "player")
                kh_Key_DropAll(self, FALSE);
        else
                kh_Key_DropAll(self, TRUE);
@@ -1049,6 +1060,21 @@ MUTATOR_HOOKFUNCTION(kh_SpectateCopy)
        return 0;
 }
 
+MUTATOR_HOOKFUNCTION(kh_PlayerUseKey)
+{
+       if(MUTATOR_RETURNVALUE == 0)
+       {
+               entity k;
+               k = self.kh_next;
+               if(k)
+               {
+                       kh_Key_DropOne(k);
+                       return 1;
+               }
+       }
+       return 0;
+}
+
 MUTATOR_DEFINITION(gamemode_keyhunt)
 {
        MUTATOR_HOOK(MakePlayerObserver, kh_Key_DropAll, CBC_ORDER_ANY);
@@ -1058,6 +1084,7 @@ MUTATOR_DEFINITION(gamemode_keyhunt)
        MUTATOR_HOOK(MatchEnd, kh_finalize, CBC_ORDER_ANY);
        MUTATOR_HOOK(GetTeamCount, kh_GetTeamCount, CBC_ORDER_EXCLUSIVE);
        MUTATOR_HOOK(SpectateCopy, kh_SpectateCopy, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerUseKey, kh_PlayerUseKey, CBC_ORDER_ANY);
 
        MUTATOR_ONADD
        {
index 71f25c3a8876d4323b739d88973243a386981659..8ee8434293669b00a15501c92612f7c1d3eedf51 100644 (file)
@@ -9,4 +9,4 @@ float kh_Key_AllOwnedByWhichTeam();
 // used by arena.qc ready-restart:
 typedef void(void) kh_Think_t;
 void kh_StartRound();
-void kh_Controller_SetThink(float t, string msg, kh_Think_t func);
+void kh_Controller_SetThink_NoMsg(float t, kh_Think_t func);
index 1c05a4a091bed2799cd05c1067edf2b1c4562f36..3b193c163c9d61ea0cce471f7df999bdd0139323 100644 (file)
@@ -112,7 +112,7 @@ MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) {
                        + (autocvar_sv_dodging_up_speed * v_up);
 
                if (autocvar_sv_dodging_sound == 1)
-                       PlayerSound(playersound_jump, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+                       PlayerSound(playersound_jump, CH_PLAYER, VOICETYPE_PLAYERSOUND);
 
                setanim(self, self.anim_jump, TRUE, FALSE, TRUE);
 
index a4131af40e8a530f223822db10df609652e6ac29..6e85e7aff695290dfd75e2a9609ea06b233b4a84 100644 (file)
@@ -61,10 +61,13 @@ void NIX_GiveCurrentWeapon()
                nix_weapon = nix_nextweapon;
                nix_weapon_ammo = nix_nextweapon_ammo;
                nix_nextweapon = 0;
-               nix_nextchange = time + autocvar_g_balance_nix_roundtime;
+               if (!nix_nextchange) // no round played yet?
+                       nix_nextchange = time; // start the first round now!
+               else
+                       nix_nextchange = time + autocvar_g_balance_nix_roundtime;
                //weapon_action(nix_weapon, WR_PRECACHE); // forget it, too slow
        }
-       
+
        if(nix_nextchange != self.nix_lastchange_id) // this shall only be called once per round!
        {
                self.nix_lastchange_id = nix_nextchange;
@@ -98,13 +101,29 @@ void NIX_GiveCurrentWeapon()
                if(dt >= 1 && dt <= 5)
                        self.nix_lastinfotime = -42;
                else
-                       centerprint(self, strcat("\n\n^2Active weapon: ^3", W_Name(nix_weapon)));
+                       Send_CSQC_Centerprint_Generic(self, CPID_NIX_WPNCHANGE, strcat("^2Active weapon: ^3", W_Name(nix_weapon)), 0, 0);
+
+               weapon_action(nix_weapon, WR_RESETPLAYER);
+
+               // all weapons must be fully loaded when we spawn
+               entity e;
+               e = get_weaponinfo(nix_weapon);
+               if(e.spawnflags & WEP_FLAG_RELOADABLE) // prevent accessing undefined cvars
+                       self.weapon_load[nix_weapon] = cvar(strcat("g_balance_", e.netname, "_reload_ammo"));
+
+               // nex too
+               if(autocvar_g_balance_nex_charge)
+               {
+                       if(autocvar_g_balance_nex_secondary_chargepool)
+                               self.nex_chargepool_ammo = 1;
+                       self.nex_charge = autocvar_g_balance_nex_charge_start;
+               }
        }
        if(self.nix_lastinfotime != dt)
        {
                self.nix_lastinfotime = dt; // initial value 0 should count as "not seen"
                if(dt >= 1 && dt <= 5)
-                       centerprint(self, strcat("^3", ftos(dt), "^2 seconds until weapon change...\n\nNext weapon: ^3", W_Name(nix_nextweapon), "\n"));
+                       Send_CSQC_Centerprint_Generic(self, CPID_NIX_WPNCHANGE, strcat("^3%d^2 seconds until weapon change...\n\nNext weapon: ^3", W_Name(nix_nextweapon)), 1, dt);
        }
 
        if(!(self.items & IT_UNLIMITED_WEAPON_AMMO) && time > self.nix_nextincr)
@@ -229,7 +248,7 @@ MUTATOR_DEFINITION(mutator_nix)
        {
                g_nix_with_laser = autocvar_g_nix_with_laser;
 
-               nix_nextchange = time;
+               nix_nextchange = 0;
                nix_nextweapon = 0;
 
                NIX_precache();
index 13e8eea40a9103424f89eb187af775d0903f247f..61385f6b5e86bd233dee19d7ee7ca523c495fc4a 100644 (file)
@@ -166,9 +166,8 @@ void GiveBall (entity plyr, entity ball)
        ball.effects |= EF_NOSHADOW;
        ball.scale = 1; // scale down.
 
-       WaypointSprite_AttachCarrier("nb-ball", plyr);
+       WaypointSprite_AttachCarrier("nb-ball", plyr, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
        WaypointSprite_UpdateRule(plyr.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
-       WaypointSprite_UpdateTeamRadar(plyr.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
 
        if (g_nexball_basketball_delay_hold)
        {
@@ -201,10 +200,8 @@ void DropBall (entity ball, vector org, vector vel)
        }
 
        WaypointSprite_Kill(ball.owner.waypointsprite_attachedforcarrier);
-       //WaypointSprite_AttachCarrier("nb-ball", ball);
-       WaypointSprite_Spawn("nb-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE); // no health bar please
+       WaypointSprite_Spawn("nb-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); // no health bar please
        WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
-       WaypointSprite_UpdateTeamRadar(ball.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
 
        ball.owner.ballcarried = world;
        ball.owner = world;
@@ -225,7 +222,7 @@ void InitBall (void)
        self.teamtime = 0;
        self.pusher = world;
        self.team = FALSE;
-       sound (self, CHAN_PROJECTILE, self.noise1, VOL_BASE, ATTN_NORM);
+       sound (self, CH_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
        WaypointSprite_Ping(self.waypointsprite_attachedforcarrier);
        LogNB("init", world);
 }
@@ -265,7 +262,7 @@ void football_touch (void)
        if (other.solid == SOLID_BSP) {
                if (time > self.lastground + 0.1)
                {
-                       sound (self, CHAN_PROJECTILE, self.noise, VOL_BASE, ATTN_NORM);
+                       sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
                        self.lastground = time;
                }
                if (vlen(self.velocity) && !self.cnt)
@@ -311,7 +308,7 @@ void basketball_touch (void)
                LogNB("caught", other);
                GiveBall(other, self);
        } else if (other.solid == SOLID_BSP) {
-               sound (self, CHAN_PROJECTILE, self.noise, VOL_BASE, ATTN_NORM);
+               sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
                if (vlen(self.velocity) && !self.cnt)
                        self.nextthink = min(time + g_nexball_delay_idle, self.teamtime);
        }
@@ -369,7 +366,7 @@ void GoalTouch (void)
                pscore = 1;
        }
 
-       sound (ball, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NONE);
+       sound (ball, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NONE);
 
        if(ball.team && pscore)
        {
@@ -491,8 +488,7 @@ void SpawnBall (void)
        precache_sound (self.noise1);
        precache_sound (self.noise2);
 
-       WaypointSprite_AttachCarrier("nb-ball", self); // the ball's team is not set yet, no rule update needed
-       WaypointSprite_UpdateTeamRadar(self.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
+       WaypointSprite_AttachCarrier("nb-ball", self, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); // the ball's team is not set yet, no rule update needed
 
        self.reset = ball_restart;
        self.think = InitBall;
@@ -601,14 +597,14 @@ void W_Nexball_Touch (void)
 
        PROJECTILE_TOUCH;
        if(attacker.team != other.team || g_nexball_basketball_teamsteal)
-       if((ball = other.ballcarried) && (attacker.classname == "player" || attacker.classname == "gib"))
+       if((ball = other.ballcarried) && (attacker.classname == "player"))
        {
                other.velocity = other.velocity + normalize(self.velocity) * other.damageforcescale * autocvar_g_balance_nexball_secondary_force;
                other.flags &~= FL_ONGROUND;
                if(!attacker.ballcarried)
                {
                        LogNB("stole", attacker);
-                       sound (other, CHAN_AUTO, ball.noise2, VOL_BASE, ATTN_NORM);
+                       sound (other, CH_TRIGGER, ball.noise2, VOL_BASE, ATTN_NORM);
 
                        if(attacker.team == other.team && time > attacker.teamkill_complain)
                        {
@@ -630,7 +626,7 @@ void W_Nexball_Attack (float t)
        if (!(ball = self.ballcarried))
                return;
 
-       W_SetupShot (self, FALSE, 4, "nexball/shoot1.wav", CHAN_WEAPON, 0);
+       W_SetupShot (self, FALSE, 4, "nexball/shoot1.wav", CH_WEAPON_A, 0);
        tracebox(w_shotorg, BALL_MINS, BALL_MAXS, w_shotorg, MOVE_WORLDONLY, world);
        if(trace_startsolid)
        {
@@ -661,7 +657,7 @@ void W_Nexball_Attack2 (void)
        local entity missile;
        if (!(balls & BALL_BASKET))
                return;
-       W_SetupShot (self, FALSE, 2, "nexball/shoot2.wav", CHAN_WEAPON, 0);
+       W_SetupShot (self, FALSE, 2, "nexball/shoot2.wav", CH_WEAPON_A, 0);
 //     pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
        missile = spawn ();
 
index 2616a77369fb767b5d6ca9c8f89ca0e60676ec83..71d13caa4e084660b568389f7f96031e54bfafc1 100644 (file)
@@ -18,7 +18,6 @@ void pathlib_showpath2(entity path);
 
 entity openlist;
 entity closedlist;
-entity edgelist;
 
 entity goal_node;
 entity start_node;
@@ -106,7 +105,6 @@ var float  pathlib_makenode(entity parent,vector start, vector to, vector goal,f
 var float  buildpath_nodefilter(vector n,vector c,vector p);
 
 var float  pathlib_wpp_waypointcallback(entity wp, entity wp_prev);
-var const float pathlib_wpp_wpcb_null();
 
 #ifdef DEBUGPATHING
        #include "debug.qc"
index b3ed92210408a1597e2c0ad62a1154fd72aef337..9f40a453ead2bfdad1a40fc0a4829e6051e8165b 100644 (file)
@@ -1,4 +1,5 @@
 float playerstats_db;
+string teamstats_last;
 string playerstats_last;
 string events_last;
 .float playerstats_addedglobalinfo;
@@ -22,6 +23,23 @@ void PlayerStats_Init()
        PlayerStats_AddEvent(PLAYERSTATS_MATCHES);
        PlayerStats_AddEvent(PLAYERSTATS_JOINS);
        PlayerStats_AddEvent(PLAYERSTATS_SCOREBOARD_VALID);
+       PlayerStats_AddEvent(PLAYERSTATS_RANK);
+
+    // accuracy stats
+    entity w;
+    float i;
+    for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+    {
+        w = get_weaponinfo(i);
+
+        PlayerStats_AddEvent(strcat("acc-", w.netname, "-hit"));
+        PlayerStats_AddEvent(strcat("acc-", w.netname, "-fired"));
+
+        PlayerStats_AddEvent(strcat("acc-", w.netname, "-cnt-hit"));
+        PlayerStats_AddEvent(strcat("acc-", w.netname, "-cnt-fired"));
+
+        PlayerStats_AddEvent(strcat("acc-", w.netname, "-frags"));
+    }
 
        PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_3);
        PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_5);
@@ -48,7 +66,7 @@ void PlayerStats_AddPlayer(entity e)
                e.playerstats_id = strzone(sprintf("bot#%d", e.playerid));
        else
                e.playerstats_id = strzone(sprintf("player#%d", e.playerid));
-       
+
        string key;
        key = sprintf("%s:*", e.playerstats_id);
        
@@ -67,26 +85,26 @@ void PlayerStats_AddPlayer(entity e)
        }
 }
 
-void PlayerStats_AddTeam(float t)
+void PlayerStats_AddTeam(float t) // TODO: doesn't this remain unused?
 {
        if(playerstats_db < 0)
                return;
 
        string key;
-       key = sprintf("team#%d:*", t);
+       key = sprintf("%d", t);
        
        string p;
        p = db_get(playerstats_db, key);
        if(p == "")
        {
-               if(playerstats_last)
+               if(teamstats_last)
                {
-                       db_put(playerstats_db, key, playerstats_last);
-                       strunzone(playerstats_last);
+                       db_put(playerstats_db, key, teamstats_last);
+                       strunzone(teamstats_last);
                }
                else
                        db_put(playerstats_db, key, "#");
-               playerstats_last = strzone(sprintf("team%d", t));
+               teamstats_last = strzone(key);
        }
 }
 
@@ -126,7 +144,7 @@ void PlayerStats_Event(entity e, string event_id, float value)
        db_put(playerstats_db, key, ftos(val));
 }
 
-void PlayerStats_TeamScore(float t, string event_id, float value)
+void PlayerStats_TeamScore(float t, string event_id, float value) // TODO: doesn't this remain unused?
 {
        string key;
        float val;
@@ -158,8 +176,10 @@ void PlayerStats_Sent_URI_Get_Callback(float id, float status, string data)
        M: map name
        S: "hostname" of the server
        C: number of "unpure" cvar changes
-       P: player ID of an existing player; this also sets the owner for all following "n" and "e" lines (lower case!)
+    W: winning team ID
+       P: player ID of an existing player; this also sets the owner for all following "n", "e" and "t" lines (lower case!)
        n: nickname of the player (optional)
+    t: team ID
        e: followed by an event name, a space, and the event count/score
                event names can be:
                        alivetime: total playing time of the player
@@ -170,72 +190,108 @@ void PlayerStats_Sent_URI_Get_Callback(float id, float status, string data)
                        total-<scoreboardname>: total score of that scoreboard item
                        scoreboard-<scoreboardname>: end-of-game score of that scoreboard item (can differ in non-team games)
                        achievement-<achievementname>: achievement counters
+            rank <number>: rank of player
+            acc-<weapon netname>-hit: total damage dealt
+            acc-<weapon netname>-fired: total damage that all fired projectiles *could* have dealt
+            acc-<weapon netname>-cnt-hit: amount of shots that actually hit
+            acc-<weapon netname>-cnt-fired: amount of fired shots
+            acc-<weapon netname>-frags: amount of frags dealt by weapon
 */
 
-//#NO AUTOCVARS START
-void PlayerStats_Shutdown()
+void PlayerStats_ready(entity fh, entity pass, float status)
 {
        string p, pn;
        string e, en;
-       string nn;
-       float b;
-       float i;
-       string uri;
+       string nn, tt;
+       string s;
 
-       if(playerstats_db < 0)
-               return;
-
-       uri = autocvar_g_playerstats_uri;
-       if(uri != "")
+       switch(status)
        {
-               b = buf_create();
-               i = 0;
-
-               db_dump(playerstats_db, "foo.db");
-
-               bufstr_set(b, i++, "V 1");
+               case URL_READY_CANWRITE:
+                       url_fputs(fh, "V 1\n");
 #ifdef WATERMARK
-               bufstr_set(b, i++, sprintf("R %s", WATERMARK()));
+                       url_fputs(fh, sprintf("R %s\n", WATERMARK()));
 #endif
-               bufstr_set(b, i++, sprintf("T %s.%06d", strftime(FALSE, "%s"), floor(random() * 1000000)));
-               bufstr_set(b, i++, sprintf("G %s", GetGametype()));
-               bufstr_set(b, i++, sprintf("M %s", GetMapname()));
-               bufstr_set(b, i++, sprintf("S %s", cvar_string("hostname")));
-               bufstr_set(b, i++, sprintf("C %d", cvar_purechanges_count));
-               for(p = playerstats_last; (pn = db_get(playerstats_db, sprintf("%s:*", p))) != ""; p = pn)
-               {
-                       bufstr_set(b, i++, sprintf("P %s", p));
-                       nn = db_get(playerstats_db, sprintf("%s:_netname", p));
-                       if(nn != "")
-                               bufstr_set(b, i++, sprintf("n %s", nn));
-                       for(e = events_last; (en = db_get(playerstats_db, sprintf("*:%s", e))) != ""; e = en)
+                       url_fputs(fh, sprintf("T %s.%06d\n", strftime(FALSE, "%s"), floor(random() * 1000000)));
+                       url_fputs(fh, sprintf("G %s\n", GetGametype()));
+                       url_fputs(fh, sprintf("M %s\n", GetMapname()));
+                       url_fputs(fh, sprintf("I %s\n", matchid));
+                       url_fputs(fh, sprintf("S %s\n", cvar_string("hostname")));
+                       url_fputs(fh, sprintf("C %d\n", cvar_purechanges_count));
+                       for(p = playerstats_last; (pn = db_get(playerstats_db, sprintf("%s:*", p))) != ""; p = pn)
                        {
-                               float v;
-                               v = stof(db_get(playerstats_db, sprintf("%s:%s", p, e)));
-                               if(v != 0)
-                                       bufstr_set(b, i++, sprintf("e %s %g", e, v));
+                               url_fputs(fh, sprintf("P %s\n", p));
+                               nn = db_get(playerstats_db, sprintf("%s:_playerid", p));
+                               if(nn != "")
+                                       url_fputs(fh, sprintf("i %s\n", nn));
+                               nn = db_get(playerstats_db, sprintf("%s:_netname", p));
+                               if(nn != "")
+                                       url_fputs(fh, sprintf("n %s\n", nn));
+                               if(teamplay)
+                               {
+                                       tt = db_get(playerstats_db, sprintf("%s:_team", p));
+                                       url_fputs(fh, sprintf("t %s\n", tt));
+                               }
+                               for(e = events_last; (en = db_get(playerstats_db, sprintf("*:%s", e))) != ""; e = en)
+                               {
+                                       float v;
+                                       v = stof(db_get(playerstats_db, sprintf("%s:%s", p, e)));
+                                       if(v != 0)
+                                               url_fputs(fh, sprintf("e %s %g\n", e, v));
+                               }
                        }
-               }
-               bufstr_set(b, i++, "");
+                       url_fputs(fh, "\n");
+                       db_close(playerstats_db);
+                       playerstats_db = -1;
+                       url_fclose(fh, PlayerStats_ready, world);
+                       break;
+               case URL_READY_CANREAD:
+                       // url_fclose is processing, we got a response for writing the data
+                       // this must come from HTTP
+                       print("Got response from player stats server:\n");
+                       while((s = url_fgets(fh)))
+                               print("  ", s, "\n");
+                       print("End of response.\n");
+                       url_fclose(fh, PlayerStats_ready, world);
+                       break;
+               case URL_READY_CLOSED:
+                       // url_fclose has finished
+                       print("Player stats written\n");
+                       playerstats_waitforme = TRUE;
+                       break;
+               case URL_READY_ERROR:
+               default:
+                       print("Player stats writing failed: ", ftos(status), "\n");
+                       playerstats_waitforme = TRUE;
+                       if(playerstats_db >= 0)
+                       {
+                               db_close(playerstats_db);
+                               playerstats_db = -1;
+                       }
+                       break;
+       }
+}
 
-               if(autocvar_g_playerstats_debug)
-               {
-                       for(i = 0; i < buf_getsize(b); ++i)
-                               print(bufstr_get(b, i), "\n");
-               }
+//#NO AUTOCVARS START
+void PlayerStats_Shutdown()
+{
+       string uri;
 
-               if(crypto_uri_postbuf(uri, URI_GET_PLAYERSTATS_SENT, "text/plain", "\n", b, 0))
-                       playerstats_requested = TRUE;
-               else
-                       playerstats_waitforme = TRUE; // if posting fails, we must continue anyway
+       if(playerstats_db < 0)
+               return;
 
-               buf_del(b);
+       uri = autocvar_g_playerstats_uri;
+       if(uri != "")
+       {
+               url_fopen(uri, FILE_APPEND, PlayerStats_ready, world);
+               playerstats_waitforme = FALSE;
        }
        else
+       {
                playerstats_waitforme = TRUE;
-
-       db_close(playerstats_db);
-       playerstats_db = -1;
+               db_close(playerstats_db);
+               playerstats_db = -1;
+       }
 }
 //#NO AUTOCVARS END
 
@@ -249,32 +305,60 @@ void PlayerStats_AddGlobalInfo(entity p)
 
        // add global info!
        if(p.alivetime)
+       {
                PlayerStats_Event(p, PLAYERSTATS_ALIVETIME, time - p.alivetime);
+               p.alivetime = 0;
+       }
 
-       if(p.alivetime)
-               PlayerStats_Event(p, PLAYERSTATS_ALIVETIME, time - p.alivetime);
+       db_put(playerstats_db, sprintf("%s:_playerid", p.playerstats_id), ftos(p.playerid));
        
        if(p.cvar_cl_allow_uid2name == 1 || clienttype(p) == CLIENTTYPE_BOT)
                db_put(playerstats_db, sprintf("%s:_netname", p.playerstats_id), p.netname);
 
-       if(p.alivetime > 0)
+    if(teamplay)
+               db_put(playerstats_db, sprintf("%s:_team", p.playerstats_id), ftos(p.team));
+
+       if(stof(db_get(playerstats_db, sprintf("%d:%s", p.playerstats_id, PLAYERSTATS_ALIVETIME))) > 0)
                PlayerStats_Event(p, PLAYERSTATS_JOINS, 1);
 
        strunzone(p.playerstats_id);
        p.playerstats_id = string_null;
 }
 
+void PlayerStats_Accuracy(entity p)
+{
+    entity a, w;
+    a = p.accuracy;
+    float i;
+
+    for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+    {
+        w = get_weaponinfo(i);
+
+        PlayerStats_Event(p, strcat("acc-", w.netname, "-hit"), a.accuracy_hit[i-1]);
+        PlayerStats_Event(p, strcat("acc-", w.netname, "-fired"), a.accuracy_fired[i-1]);
+
+        PlayerStats_Event(p, strcat("acc-", w.netname, "-cnt-hit"), a.accuracy_cnt_hit[i-1]);
+        PlayerStats_Event(p, strcat("acc-", w.netname, "-cnt-fired"), a.accuracy_cnt_fired[i-1]);
+
+        PlayerStats_Event(p, strcat("acc-", w.netname, "-frags"), a.accuracy_frags[i-1]);
+    }
+}
+
 void PlayerStats_EndMatch(float finished)
 {
-       entity p;
-       FOR_EACH_PLAYER(p)
+       entity p, winner;
+    winner = PlayerScore_Sort(score_dummyfield);
+       FOR_EACH_PLAYER(p) // spectators intentionally not included
        {
                PlayerScore_PlayerStats(p);
+               PlayerStats_Accuracy(p);
                PlayerStats_Event(p, PLAYERSTATS_SCOREBOARD_VALID, 1);
                if(finished)
                {
                        PlayerStats_Event(p, PLAYERSTATS_WINS, p.winning);
                        PlayerStats_Event(p, PLAYERSTATS_MATCHES, 1);
+                       PlayerStats_Event(p, PLAYERSTATS_RANK, p.score_dummyfield);
                }
        }
 }
index baaddcbb661ba9d6826a469cb4fd659d71a9d407..f546e560590025c124a4615905e07a2c15252a3e 100644 (file)
@@ -4,6 +4,7 @@ string PLAYERSTATS_WINS = "wins";
 string PLAYERSTATS_MATCHES = "matches";
 string PLAYERSTATS_JOINS = "joins";
 string PLAYERSTATS_SCOREBOARD_VALID = "scoreboardvalid";
+string PLAYERSTATS_RANK = "rank";
 
 string PLAYERSTATS_TOTAL = "total-";
 string PLAYERSTATS_SCOREBOARD = "scoreboard-";
index 0ce3d515a1d537837699d88b825fc9216dad9276..461f475c7818787f113386378b1a4e09159fa46d 100644 (file)
@@ -355,7 +355,7 @@ void Portal_Disconnect(entity teleporter, entity destination)
 
 void Portal_Connect(entity teleporter, entity destination)
 {
-       teleporter.portal_transform = AnglesTransform_Divide(AnglesTransform_TurnDirectionFR(destination.mangle), teleporter.mangle);
+       teleporter.portal_transform = AnglesTransform_RightDivide(AnglesTransform_TurnDirectionFR(destination.mangle), teleporter.mangle);
 
        teleporter.enemy = destination;
        destination.enemy = teleporter;
@@ -394,14 +394,14 @@ void Portal_Remove(entity portal, float killed)
        if(killed)
        {
                fixedmakevectors(portal.mangle);
-               sound(portal, CHAN_PROJECTILE, "porto/explode.wav", VOL_BASE, ATTN_NORM);
+               sound(portal, CH_SHOTS, "porto/explode.wav", VOL_BASE, ATTN_NORM);
                pointparticles(particleeffectnum("rocket_explode"), portal.origin + v_forward * 16, v_forward * 1024, 4);
                remove(portal);
        }
        else
        {
                Portal_MakeBrokenPortal(portal);
-               sound(portal, CHAN_PROJECTILE, "porto/expire.wav", VOL_BASE, ATTN_NORM);
+               sound(portal, CH_SHOTS, "porto/expire.wav", VOL_BASE, ATTN_NORM);
                SUB_SetFade(portal, time, 0.5);
        }
 }
index 488dd10206bc1c4f11d9c5b51beee49c14fb50aa..c78b9f2fa5908c650ba76fd71cb0298146764599 100644 (file)
@@ -18,6 +18,7 @@ post-builtins.qh
 ../common/util.qh
 ../common/items.qh
 ../common/explosion_equation.qh
+../common/urllib.qh
 
 autocvars.qh
 constants.qh
@@ -30,6 +31,7 @@ mutators/mutator_dodging.qh
 
 //// tZork Turrets ////
 tturrets/include/turrets_early.qh
+vehicles/vehicles_def.qh
 
 campaign.qh
 ../common/campaign_common.qh
@@ -131,6 +133,7 @@ vote.qc
 campaign.qc
 ../common/campaign_file.qc
 ../common/campaign_setup.qc
+../common/urllib.qc
 
 ../common/gamecommand.qc
 gamecommand.qc
index 9817b3b0e1afaa45675b4755f45989da50afe0d6..f6ca98682c3d91eb7b4af582118c06dfed317e41 100644 (file)
@@ -805,9 +805,9 @@ void spawnfunc_trigger_race_checkpoint()
        if(!self.race_penalty)
        {
                if(self.race_checkpoint)
-                       WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite);
+                       WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite, RADARICON_NONE, '1 0.5 0');
                else
-                       WaypointSprite_SpawnFixed("race-finish", o, self, sprite);
+                       WaypointSprite_SpawnFixed("race-start-finish", o, self, sprite, RADARICON_NONE, '1 0.5 0');
        }
 
        self.sprite.waypointsprite_visible_for_player = race_waypointsprite_visible_for_player;
@@ -851,9 +851,9 @@ void spawnfunc_target_checkpoint() // defrag entity
        race_timed_checkpoint = 1;
 
        if(self.race_checkpoint == 0)
-               WaypointSprite_SpawnFixed("race-start", o, self, sprite);
+               WaypointSprite_SpawnFixed("race-start", o, self, sprite, RADARICON_NONE, '1 0.5 0');
        else
-               WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite);
+               WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite, RADARICON_NONE, '1 0.5 0');
 
        self.sprite.waypointsprite_visible_for_player = race_waypointsprite_visible_for_player;
 
index 2e75fefb9f41402bfa09193dfb313b1e3d452dd1..030a26d9cb8857f922fec1cc382ef14e81d6a29d 100644 (file)
@@ -34,7 +34,7 @@ void ScoreRules_basics_end()
 }
 void ScoreRules_generic()
 {
-       if(teams_matter)
+       if(teamplay)
        {
                CheckAllowedTeams(world);
                ScoreRules_basics(((c4>=0) ? 4 : (c3>=0) ? 3 : 2), SFL_SORT_PRIO_PRIMARY, SFL_SORT_PRIO_PRIMARY, TRUE);
index d512cf95f2c2183999edaca51731c229fbcc66a5..a586252555dcf58beaa904975135ba0e5e71e4c3 100644 (file)
@@ -424,7 +424,7 @@ vector steerlib_beamsteer(vector dir, float length, float step, float step_up, f
     vr = vectoangles(dir);
     //vr_x *= -1;
 
-    tracebox(self.origin , self.mins,self.maxs,self.origin +  (dir * length) ,MOVE_NOMONSTERS,self);
+    tracebox(self.origin + '0 0 1' * step_up, self.mins, self.maxs, ('0 0 1' * step_up) + self.origin +  (dir * length), MOVE_NOMONSTERS, self);
     if(trace_fraction == 1.0)
     {
         //te_lightning1(self,self.origin,self.origin +  (dir * length));
@@ -493,8 +493,6 @@ vector steerlib_beamsteer(vector dir, float length, float step, float step_up, f
 #ifdef TLIBS_TETSLIBS
 void flocker_die()
 {
-       sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-
        pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
 
     self.owner.cnt += 1;
index 68a86e9c479e7f68a9908fc12230831f2bb50803..15f43ad9eb730f980a1c40827213b13106c84a55 100644 (file)
@@ -4,22 +4,24 @@ void CreatureFrame (void)
        local entity oldself;
        local float dm;
        oldself = self;
-       self = findfloat(world, iscreature, TRUE);
-       while (self)
+       for(self = world; (self = findfloat(self, iscreature, TRUE)); )
        {
-               if (self.movetype != MOVETYPE_NOCLIP)
+               if (self.movetype == MOVETYPE_NOCLIP)
+                       continue;
+               float vehic = (self.vehicle_flags & VHF_ISVEHICLE);
+               if (self.waterlevel)
                {
-                       if (self.waterlevel)
+                       if (!(self.flags & FL_INWATER))
+                       {
+                               self.flags |= FL_INWATER;
+                               self.dmgtime = 0;
+                       }
+                       if(!vehic) // vehicles don't drown
                        {
-                               if (!(self.flags & FL_INWATER))
-                               {
-                                       self.flags |= FL_INWATER;
-                                       self.dmgtime = 0;
-                               }
                                if (self.waterlevel != WATERLEVEL_SUBMERGED)
                                {
                                        if(self.air_finished < time + 9)
-                                               PlayerSound(playersound_gasp, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+                                               PlayerSound(playersound_gasp, CH_PLAYER, VOICETYPE_PLAYERSOUND);
                                        self.air_finished = time + 12;
                                        self.dmg = 2;
                                }
@@ -32,40 +34,44 @@ void CreatureFrame (void)
                                                self.pain_finished = time + 0.5;
                                        }
                                }
-                               if (self.dmgtime < time)
+                       }
+                       if (self.dmgtime < time)
+                       {
+                               self.dmgtime = time + 0.2;
+                               if (self.watertype == CONTENT_LAVA)
                                {
-                                       self.dmgtime = time + 0.2;
-                                       if (self.watertype == CONTENT_LAVA)
+                                       if (self.watersound_finished < time)
                                        {
-                                               if (self.watersound_finished < time)
-                                               {
-                                                       self.watersound_finished = time + 0.5;
-                                                       sound (self, CHAN_PLAYER, "player/lava.wav", VOL_BASE, ATTN_NORM);
-                                               }
-                                               Damage (self, world, world, 6 * self.waterlevel, DEATH_LAVA, self.origin, '0 0 0');
+                                               self.watersound_finished = time + 0.5;
+                                               sound (self, CH_PLAYER, "player/lava.wav", VOL_BASE, ATTN_NORM);
                                        }
-                                       else if (self.watertype == CONTENT_SLIME)
+                                       Damage (self, world, world, 6 * self.waterlevel, DEATH_LAVA, self.origin, '0 0 0');
+                               }
+                               else if (self.watertype == CONTENT_SLIME)
+                               {
+                                       if (self.watersound_finished < time)
                                        {
-                                               if (self.watersound_finished < time)
-                                               {
-                                                       self.watersound_finished = time + 0.5;
-                                                       sound (self, CHAN_PLAYER, "player/slime.wav", VOL_BASE, ATTN_NORM);
-                                               }
-                                               Damage (self, world, world, 2 * self.waterlevel, DEATH_SLIME, self.origin, '0 0 0');
+                                               self.watersound_finished = time + 0.5;
+                                               sound (self, CH_PLAYER, "player/slime.wav", VOL_BASE, ATTN_NORM);
                                        }
+                                       Damage (self, world, world, 2 * self.waterlevel, DEATH_SLIME, self.origin, '0 0 0');
                                }
                        }
-                       else
+               }
+               else
+               {
+                       if (self.flags & FL_INWATER)
                        {
-                               if (self.flags & FL_INWATER)
-                               {
-                                       // play leave water sound
-                                       self.flags &~= FL_INWATER;
-                                       self.dmgtime = 0;
-                               }
-                               self.air_finished = time + 12;
-                               self.dmg = 2;
+                               // play leave water sound
+                               self.flags &~= FL_INWATER;
+                               self.dmgtime = 0;
                        }
+                       self.air_finished = time + 12;
+                       self.dmg = 2;
+               }
+
+               if(!vehic) // vehicles don't get falling damage
+               {
                        // check for falling damage
                        float velocity_len = vlen(self.velocity);
                        if(!self.hook.state && !g_ca && !(g_cts && !autocvar_g_cts_selfdamage))
@@ -81,7 +87,6 @@ void CreatureFrame (void)
 
                        if(autocvar_g_maxspeed > 0 && velocity_len > autocvar_g_maxspeed)
                                Damage (self, world, world, 100000, DEATH_SHOOTING_STAR, self.origin, '0 0 0');
-
                        // play stupid sounds
                        if (g_footsteps)
                        if (!gameover)
@@ -104,15 +109,15 @@ void CreatureFrame (void)
                                        if not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOSTEPS)
                                        {
                                                if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_METALSTEPS)
-                                                       GlobalSound(globalsound_metalstep, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+                                                       GlobalSound(globalsound_metalstep, CH_PLAYER, VOICETYPE_PLAYERSOUND);
                                                else
-                                                       GlobalSound(globalsound_step, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+                                                       GlobalSound(globalsound_step, CH_PLAYER, VOICETYPE_PLAYERSOUND);
                                        }
                                }
                        }
-                       self.oldvelocity = self.velocity;
                }
-               self = findfloat(self, iscreature, TRUE);
+
+               self.oldvelocity = self.velocity;
        }
        self = oldself;
 }
@@ -236,7 +241,7 @@ float DoesQ3ARemoveThisEntity();
 void SV_OnEntityPreSpawnFunction()
 {
        if(self.gametypefilter != "")
-       if not(isGametypeInFilter(game, teams_matter, have_team_spawns, self.gametypefilter))
+       if not(isGametypeInFilter(game, teamplay, have_team_spawns, self.gametypefilter))
        {
                remove(self);
                return;
@@ -384,3 +389,20 @@ void SV_OnEntityPreSpawnFunction()
                return;
        }
 }
+
+void WarpZone_PostInitialize_Callback(void)
+{
+       // create waypoint links for warpzones
+       entity e;
+       for(e = world; (e = find(e, classname, "trigger_warpzone")); )
+       {
+               vector src, dst;
+               src = (e.absmin + e.absmax) * 0.5;
+               makevectors(e.warpzone_angles);
+               src = src + ((e.warpzone_origin - src) * v_forward) * v_forward + 16 * v_right;
+               dst = (e.enemy.absmin + e.enemy.absmax) * 0.5;
+               makevectors(e.enemy.warpzone_angles);
+               dst = dst + ((e.enemy.warpzone_origin - dst) * v_forward) * v_forward - 16 * v_right;
+               waypoint_spawnforteleporter_v(e, src, dst, 0);
+       }
+}
index fb03e55e3f37ea30ef314345d4db17bcf5eda214..26ad056f2f602227b58892a12774b932cbde52d4 100644 (file)
@@ -39,6 +39,8 @@ void func_ladder_touch()
 {
        if not(other.iscreature)
                return;
+       if (other.vehicle_flags & VHF_ISVEHICLE)
+               return;
 
        EXACTTRIGGER_TOUCH;
 
index 5a591e03532d7ab0847c1c2ec656b900abb9c485..b502cac3312d051d46c4f044516f78c1d4ff80eb 100644 (file)
@@ -146,11 +146,11 @@ void Item_Respawn (void)
 {
        Item_Show(self, 1);
        if(!g_minstagib && self.items == IT_STRENGTH)
-               sound (self, CHAN_TRIGGER, "misc/strength_respawn.wav", VOL_BASE, ATTN_NORM);   // play respawn sound
+               sound (self, CH_TRIGGER, "misc/strength_respawn.wav", VOL_BASE, ATTN_NORM);     // play respawn sound
        else if(!g_minstagib && self.items == IT_INVINCIBLE)
-               sound (self, CHAN_TRIGGER, "misc/shield_respawn.wav", VOL_BASE, ATTN_NORM);     // play respawn sound
+               sound (self, CH_TRIGGER, "misc/shield_respawn.wav", VOL_BASE, ATTN_NORM);       // play respawn sound
        else
-               sound (self, CHAN_TRIGGER, "misc/itemrespawn.wav", VOL_BASE, ATTN_NORM);        // play respawn sound
+               sound (self, CH_TRIGGER, "misc/itemrespawn.wav", VOL_BASE, ATTN_NORM);  // play respawn sound
        setorigin (self, self.origin);
 
        //pointparticles(particleeffectnum("item_respawn"), self.origin + self.mins_z * '0 0 1' + '0 0 48', '0 0 0', 1);
@@ -198,16 +198,12 @@ void Item_RespawnCountdown (void)
                        }
                        if(name)
                        {
-                               WaypointSprite_Spawn(name, 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, TRUE);
+                               WaypointSprite_Spawn(name, 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, TRUE, RADARICON_POWERUP, rgb);
                                if(self.waypointsprite_attached)
-                               {
-                                       WaypointSprite_UpdateTeamRadar(self.waypointsprite_attached, RADARICON_POWERUP, rgb);
-                                       //WaypointSprite_UpdateMaxHealth(self.waypointsprite_attached, ITEM_RESPAWN_TICKS + 1);
                                        WaypointSprite_UpdateBuildFinished(self.waypointsprite_attached, time + ITEM_RESPAWN_TICKS);
-                               }
                        }
                }
-               sound (self, CHAN_TRIGGER, "misc/itemrespawncountdown.wav", VOL_BASE, ATTN_NORM);       // play respawn sound
+               sound (self, CH_TRIGGER, "misc/itemrespawncountdown.wav", VOL_BASE, ATTN_NORM); // play respawn sound
                if(self.waypointsprite_attached)
                {
                        WaypointSprite_Ping(self.waypointsprite_attached);
@@ -283,7 +279,6 @@ float Item_GiveTo(entity item, entity player)
                        {
                                pickedup = TRUE;
                                // play some cool sounds ;)
-                               centerprint(player, "\n");
                                if (clienttype(player) == CLIENTTYPE_REAL)
                                {
                                        if(player.health <= 5)
@@ -451,7 +446,7 @@ float Item_GiveTo(entity item, entity player)
        if (!pickedup)
                return 0;
 
-       sound (player, CHAN_AUTO, item.item_pickupsound, VOL_BASE, ATTN_NORM);
+       sound (player, CH_TRIGGER, item.item_pickupsound, VOL_BASE, ATTN_NORM);
        if (_switchweapon)
                if (player.switchweapon != w_getbestweapon(player))
                        W_SwitchWeapon_Force(player, w_getbestweapon(player));
@@ -1536,12 +1531,12 @@ void GiveSound(entity e, float v0, float v1, float t, string snd_incr, string sn
        if(v1 <= v0 - t)
        {
                if(snd_decr != "")
-                       sound (e, CHAN_AUTO, snd_decr, VOL_BASE, ATTN_NORM);
+                       sound (e, CH_TRIGGER, snd_decr, VOL_BASE, ATTN_NORM);
        }
        else if(v0 >= v0 + t)
        {
                if(snd_incr != "")
-                       sound (e, CHAN_AUTO, snd_incr, VOL_BASE, ATTN_NORM);
+                       sound (e, CH_TRIGGER, snd_incr, VOL_BASE, ATTN_NORM);
        }
 }
 
index 1e72b765a0a0b548de052f9d31accdfc8e906b0c..888b94456ff6496223698d7a2bce47054f7276d6 100644 (file)
@@ -10,7 +10,7 @@ float trigger_push_calculatevelocity_flighttime;
 
 void trigger_push_use()
 {
-       if(teams_matter)
+       if(teamplay)
                self.team = activator.team;
 }
 
@@ -127,21 +127,12 @@ vector trigger_push_calculatevelocity(vector org, entity tgt, float ht)
 
 void trigger_push_touch()
 {
-       if (self.active == ACTIVE_NOT)
-               return;
+       vector move;
 
-       // FIXME: add a .float for whether an entity should be tossed by jumppads
-       if (!other.iscreature)
-       if (other.classname != "corpse")
-       if (other.classname != "body")
-       if (other.classname != "gib")
-       if (other.classname != "casing")
-       if (other.classname != "droppedweapon")
-       if (other.classname != "keepawayball")
-       if (!other.projectiledeathtype || other.classname == "bullet")
+       if (self.active == ACTIVE_NOT)
                return;
 
-       if (other.deadflag && other.iscreature)
+       if (!isPushable(other))
                return;
 
        if(self.team)
@@ -150,13 +141,30 @@ void trigger_push_touch()
 
        EXACTTRIGGER_TOUCH;
 
-       if(self.target)
-               self.movedir = trigger_push_calculatevelocity(other.origin, self.enemy, self.height);
+       if(self.enemy)
+       {
+               other.velocity = trigger_push_calculatevelocity(other.origin, self.enemy, self.height);
+       }
+       else if(self.target)
+       {
+               entity e;
+               RandomSelection_Init();
+               for(e = world; (e = find(e, targetname, self.target)); )
+               {
+                       if(e.cnt)
+                               RandomSelection_Add(e, 0, string_null, e.cnt, 1);
+                       else
+                               RandomSelection_Add(e, 0, string_null, 1, 1);
+               }
+               other.velocity = trigger_push_calculatevelocity(other.origin, RandomSelection_chosen_ent, self.height);
+       }
+       else
+       {
+               other.velocity = self.movedir;
+       }
 
        other.flags &~= FL_ONGROUND;
 
-       other.velocity = self.movedir;
-
        if (other.classname == "player")
        {
                // reset tracking of oldvelocity for impact damage (sudden velocity changes)
@@ -166,7 +174,7 @@ void trigger_push_touch()
                {
                        // flash when activated
                        pointparticles(particleeffectnum("jumppad_activate"), other.origin, other.velocity, 1);
-                       sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
+                       sound (other, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
                        self.pushltime = time + 0.2;
                }
                local float ct;
@@ -238,7 +246,7 @@ void trigger_push_touch()
 .vector dest;
 void trigger_push_findtarget()
 {
-       local entity e;
+       local entity e, t;
        local vector org;
        local float flighttime;
 
@@ -248,31 +256,48 @@ void trigger_push_findtarget()
 
        if (self.target)
        {
-               // find the target
-               self.enemy = find(world, targetname, self.target);
-               if (!self.enemy)
+               float n;
+               n = 0;
+               for(t = world; (t = find(t, targetname, self.target)); )
                {
-                       objerror("trigger_push: target not found\n");
-                       remove(self);
-                       return;
+                       ++n;
+                       e = spawn();
+                       setorigin(e, org);
+                       setsize(e, PL_MIN, PL_MAX);
+                       e.velocity = trigger_push_calculatevelocity(org, t, self.height);
+                       tracetoss(e, e);
+                       if(e.movetype == MOVETYPE_NONE)
+                               waypoint_spawnforteleporter(self, trace_endpos, vlen(trace_endpos - org) / vlen(e.velocity));
+                       remove(e);
                }
 
-               self.movedir = trigger_push_calculatevelocity(org, self.enemy, self.height);
-               flighttime = trigger_push_calculatevelocity_flighttime;
+               if(n == 0)
+               {
+                       // no dest!
+                       objerror ("Jumppad with nonexistant target");
+                       return;
+               }
+               else if(n == 1)
+               {
+                       // exactly one dest - bots love that
+                       self.enemy = find(e, targetname, self.target);
+               }
+               else
+               {
+                       // have to use random selection every single time
+                       self.enemy = world;
+               }
        }
        else
-               flighttime = 0;
-
-       // calculate the destination and spawn a teleporter spawnfunc_waypoint
-       e = spawn();
-       setorigin(e, org);
-       setsize(e, PL_MIN, PL_MAX);
-       e.velocity = self.movedir;
-       tracetoss(e, e);
-       self.dest = trace_endpos;
-       remove(e);
-
-       waypoint_spawnforteleporter(self, self.dest, flighttime);
+       {
+               e = spawn();
+               setorigin(e, org);
+               setsize(e, PL_MIN, PL_MAX);
+               e.velocity = self.movedir;
+               tracetoss(e, e);
+               waypoint_spawnforteleporter(self, trace_endpos, vlen(trace_endpos - org) / vlen(e.velocity));
+               remove(e);
+       }
 };
 
 /*
index f90c812d9bd0691ed332e4817bc2dd216c6338aa..ca87ede224ad45a1a67f401008ec253271c2a65f 100644 (file)
@@ -62,7 +62,7 @@ void plat_spawn_inside_trigger()
 
 void plat_hit_top()
 {
-       sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+       sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
        self.state = 1;
        self.think = plat_go_down;
        self.nextthink = self.ltime + 3;
@@ -70,20 +70,20 @@ void plat_hit_top()
 
 void plat_hit_bottom()
 {
-       sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+       sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
        self.state = 2;
 };
 
 void plat_go_down()
 {
-       sound (self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
+       sound (self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_NORM);
        self.state = 3;
        SUB_CalcMove (self.pos2, self.speed, plat_hit_bottom);
 };
 
 void plat_go_up()
 {
-       sound (self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
+       sound (self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_NORM);
        self.state = 4;
        SUB_CalcMove (self.pos1, self.speed, plat_hit_top);
 };
@@ -140,8 +140,9 @@ void plat_crush()
             plat_go_down ();
         else if (self.state == 3)
             plat_go_up ();
-        else
-            objerror ("plat_crush: bad self.state\n");
+       // when in other states, then the plat_crush event came delayed after
+       // plat state already had changed
+       // this isn't a bug per se!
     }
 };
 
@@ -246,7 +247,7 @@ void() train_next;
 void train_wait()
 {
        if(self.noise != "")
-               stopsoundto(MSG_BROADCAST, self, CHAN_TRIGGER); // send this as unreliable only, as the train will resume operation shortly anyway
+               stopsoundto(MSG_BROADCAST, self, CH_TRIGGER_SINGLE); // send this as unreliable only, as the train will resume operation shortly anyway
 
        if(self.wait < 0)
        {
@@ -284,7 +285,7 @@ void train_next()
                SUB_CalcMove(targ.origin - self.mins, self.speed, train_wait);
 
        if(self.noise != "")
-               sound(self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE);
+               sound(self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE);
 };
 
 void func_train_find()
@@ -444,7 +445,7 @@ void spawnfunc_func_bobbing()
        if (self.noise != "")
        {
                precache_sound(self.noise);
-               soundto(MSG_INIT, self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE);
+               soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE);
        }
        if (!self.speed)
                self.speed = 4;
@@ -521,7 +522,7 @@ void spawnfunc_func_pendulum()
        if (self.noise != "")
        {
                precache_sound(self.noise);
-               soundto(MSG_INIT, self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE);
+               soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE);
        }
 
        self.active = ACTIVE_ACTIVE;
@@ -614,7 +615,7 @@ void button_fire()
                return;
 
        if (self.noise != "")
-               sound (self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
+               sound (self, CH_TRIGGER, self.noise, VOL_BASE, ATTN_NORM);
 
        self.state = STATE_UP;
        SUB_CalcMove (self.pos2, self.speed, button_wait);
@@ -825,7 +826,7 @@ void door_blocked()
 void door_hit_top()
 {
        if (self.noise1 != "")
-               sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+               sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
        self.state = STATE_TOP;
        if (self.spawnflags & DOOR_TOGGLE)
                return;         // don't come down automatically
@@ -842,14 +843,14 @@ void door_hit_top()
 void door_hit_bottom()
 {
        if (self.noise1 != "")
-               sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+               sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
        self.state = STATE_BOTTOM;
 };
 
 void door_go_down()
 {
        if (self.noise2 != "")
-               sound (self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+               sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
        if (self.max_health)
        {
                self.takedamage = DAMAGE_YES;
@@ -872,7 +873,7 @@ void door_go_up()
        }
 
        if (self.noise2 != "")
-               sound (self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+               sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
        self.state = STATE_UP;
        SUB_CalcMove (self.pos2, self.speed, door_hit_top);
 
@@ -1071,7 +1072,7 @@ void door_generic_plat_blocked()
 void door_rotating_hit_top()
 {
        if (self.noise1 != "")
-               sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+               sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
        self.state = STATE_TOP;
        if (self.spawnflags & DOOR_TOGGLE)
                return;         // don't come down automatically
@@ -1082,7 +1083,7 @@ void door_rotating_hit_top()
 void door_rotating_hit_bottom()
 {
        if (self.noise1 != "")
-               sound (self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+               sound (self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
        if (self.lip==666) // self.lip is used to remember reverse opening direction for door_rotating
        {
                self.pos2 = '0 0 0' - self.pos2;
@@ -1094,7 +1095,7 @@ void door_rotating_hit_bottom()
 void door_rotating_go_down()
 {
        if (self.noise2 != "")
-               sound (self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+               sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
        if (self.max_health)
        {
                self.takedamage = DAMAGE_YES;
@@ -1116,7 +1117,7 @@ void door_rotating_go_up()
                return;
        }
        if (self.noise2 != "")
-               sound (self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+               sound (self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
        self.state = STATE_UP;
        SUB_CalcAngleMove (self.pos2, self.speed, door_rotating_hit_top);
 
@@ -1545,7 +1546,7 @@ void fd_secret_use()
        // Make a sound, wait a little...
 
        if (self.noise1 != "")
-               sound(self, CHAN_TRIGGER, self.noise1, VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER_SINGLE, self.noise1, VOL_BASE, ATTN_NORM);
        self.nextthink = self.ltime + 0.1;
 
        temp = 1 - (self.spawnflags & SECRET_1ST_LEFT); // 1 or -1
@@ -1570,7 +1571,7 @@ void fd_secret_use()
        self.dest2 = self.dest1 + v_forward * self.t_length;
        SUB_CalcMove(self.dest1, self.speed, fd_secret_move1);
        if (self.noise2 != "")
-               sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
 };
 
 // Wait after first movement...
@@ -1579,14 +1580,14 @@ void fd_secret_move1()
        self.nextthink = self.ltime + 1.0;
        self.think = fd_secret_move2;
        if (self.noise3 != "")
-               sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM);
 };
 
 // Start moving sideways w/sound...
 void fd_secret_move2()
 {
        if (self.noise2 != "")
-               sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
        SUB_CalcMove(self.dest2, self.speed, fd_secret_move3);
 };
 
@@ -1594,7 +1595,7 @@ void fd_secret_move2()
 void fd_secret_move3()
 {
        if (self.noise3 != "")
-               sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM);
        if (!(self.spawnflags & SECRET_OPEN_ONCE))
        {
                self.nextthink = self.ltime + self.wait;
@@ -1606,7 +1607,7 @@ void fd_secret_move3()
 void fd_secret_move4()
 {
        if (self.noise2 != "")
-               sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
        SUB_CalcMove(self.dest1, self.speed, fd_secret_move5);
 };
 
@@ -1616,13 +1617,13 @@ void fd_secret_move5()
        self.nextthink = self.ltime + 1.0;
        self.think = fd_secret_move6;
        if (self.noise3 != "")
-               sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM);
 };
 
 void fd_secret_move6()
 {
        if (self.noise2 != "")
-               sound(self, CHAN_TRIGGER, self.noise2, VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER_SINGLE, self.noise2, VOL_BASE, ATTN_NORM);
        SUB_CalcMove(self.oldorigin, self.speed, fd_secret_done);
 };
 
@@ -1635,7 +1636,7 @@ void fd_secret_done()
                //self.th_pain = fd_secret_use;
        }
        if (self.noise3 != "")
-               sound(self, CHAN_TRIGGER, self.noise3, VOL_BASE, ATTN_NORM);
+               sound(self, CH_TRIGGER_SINGLE, self.noise3, VOL_BASE, ATTN_NORM);
 };
 
 void secret_blocked()
@@ -1784,7 +1785,7 @@ void spawnfunc_func_fourier()
        if (self.noise != "")
        {
                precache_sound(self.noise);
-               soundto(MSG_INIT, self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE);
+               soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE);
        }
 
        if (!self.speed)
@@ -1930,7 +1931,7 @@ void spawnfunc_func_vectormamamam()
        if (self.noise != "")
        {
                precache_sound(self.noise);
-               soundto(MSG_INIT, self, CHAN_TRIGGER, self.noise, VOL_BASE, ATTN_IDLE);
+               soundto(MSG_INIT, self, CH_TRIGGER_SINGLE, self.noise, VOL_BASE, ATTN_IDLE);
        }
 
        if(!self.targetfactor)
index 8cc7e479791b6a3fc8bec91c48383355953f2563..45ab457f20490060381dd9804c84a74ab4af7345 100644 (file)
@@ -23,7 +23,7 @@ void spawnfunc_weapon_plasmagun()    { spawnfunc_weapon_hagar();        }
 void spawnfunc_ammo_cells()          { spawnfunc_item_rockets();        }
 
 // Rail -> Rifle
-void spawnfunc_weapon_railgun()      { spawnfunc_weapon_sniperrifle();  }
+void spawnfunc_weapon_railgun()      { spawnfunc_weapon_rifle();  }
 void spawnfunc_ammo_slugs()          { spawnfunc_item_bullets();        }
 
 // BFG -> Crylink
@@ -142,11 +142,11 @@ float DoesQ3ARemoveThisEntity()
        // Q3 style filters (DO NOT USE, THIS IS COMPAT ONLY)
 
        if(self.notq3a)
-               if(!teams_matter || g_tdm || g_ctf)
+               if(!teamplay || g_tdm || g_ctf)
                        return 1;
 
        if(self.notta)
-               if not(!teams_matter || g_tdm || g_ctf)
+               if not(!teamplay || g_tdm || g_ctf)
                        return 1;
 
        if(self.notsingle)
@@ -154,11 +154,11 @@ float DoesQ3ARemoveThisEntity()
                        return 1;
 
        if(self.notteam)
-               if(teams_matter)
+               if(teamplay)
                        return 1;
 
        if(self.notfree)
-               if(!teams_matter)
+               if(!teamplay)
                        return 1;
 
        if(self.gametype)
@@ -166,7 +166,7 @@ float DoesQ3ARemoveThisEntity()
                string gametypename;
                // static char *gametypeNames[] = {"ffa", "tournament", "single", "team", "ctf", "oneflag", "obelisk", "harvester", "teamtournament"};
                gametypename = "ffa";
-               if(teams_matter)
+               if(teamplay)
                        gametypename = "team";
                if(g_arena)
                        gametypename = "tournament";
index 2e64eadd77f6517e29b5ea873067082962c8ecab..e069aec9f3d7e18c1d2f9af5cfecc21aa745cd80 100644 (file)
@@ -1,6 +1,6 @@
 void trigger_teleport_use()
 {
-       if(teams_matter)
+       if(teamplay)
                self.team = activator.team;
 }
 
@@ -33,7 +33,7 @@ float check_tdeath(entity player, vector org, vector telefragmin, vector telefra
        {
                TDEATHLOOP(org)
                {
-                       if not(teams_matter && autocvar_g_telefrags_teamplay && head.team == player.team)
+                       if not(teamplay && autocvar_g_telefrags_teamplay && head.team == player.team)
                                if(head.classname == "player")
                                        if(head.health >= 1)
                                                return 1;
@@ -48,7 +48,7 @@ void tdeath(entity player, entity teleporter, entity telefragger, vector telefra
        {
                if (player.classname == "player" && player.health >= 1)
                {
-                       if not(teams_matter && autocvar_g_telefrags_teamplay && head.team == player.team)
+                       if not(teamplay && autocvar_g_telefrags_teamplay && head.team == player.team)
                        {
                                if(head.classname == "player")
                                        if(head.health >= 1)
@@ -87,16 +87,19 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle
 
        makevectors (to_angles);
 
-       if(self.pushltime < time) // only show one teleport effect per teleporter per 0.2 seconds, for better fps
+       if(player.classname == "player") // don't play sounds or show particles for anything that isn't a player, maybe change later to block only observers
        {
-               if(tflags & TELEPORT_FLAG_SOUND)
-                       sound (player, CHAN_TRIGGER, "misc/teleport.wav", VOL_BASE, ATTN_NORM);
-               if(tflags & TELEPORT_FLAG_PARTICLES)
+               if(self.pushltime < time) // only show one teleport effect per teleporter per 0.2 seconds, for better fps
                {
-                       pointparticles(particleeffectnum("teleport"), player.origin, '0 0 0', 1);
-                       pointparticles(particleeffectnum("teleport"), to + v_forward * 32, '0 0 0', 1);
+                       if(tflags & TELEPORT_FLAG_SOUND)
+                               sound (player, CH_TRIGGER, "misc/teleport.wav", VOL_BASE, ATTN_NORM);
+                       if(tflags & TELEPORT_FLAG_PARTICLES)
+                       {
+                               pointparticles(particleeffectnum("teleport"), player.origin, '0 0 0', 1);
+                               pointparticles(particleeffectnum("teleport"), to + v_forward * 32, '0 0 0', 1);
+                       }
+                       self.pushltime = time + 0.2;
                }
-               self.pushltime = time + 0.2;
        }
 
        // Relocate the player
@@ -138,19 +141,63 @@ void TeleportPlayer(entity teleporter, entity player, vector to, vector to_angle
        }
 }
 
-void Teleport_Touch (void)
+void Simple_TeleportPlayer(entity teleporter, entity player)
 {
-       entity oldself, e;
-       vector o;
+       vector locout;
+       entity e;
        float p;
+       
+       // Find the output teleporter
+       if(!teleporter.enemy)
+       { 
+               RandomSelection_Init();
+               for(e = world; (e = find(e, targetname, teleporter.target)); )
+               {
+                       p = 1;
+                       if(autocvar_g_telefrags_avoid)
+                       {
+                               locout = e.origin + '0 0 1' * (1 - player.mins_z - 24);
+                               if(check_tdeath(player, locout, '0 0 0', '0 0 0'))
+                                       p = 0;
+                       }
+                       RandomSelection_Add(e, 0, string_null, (e.cnt ? e.cnt : 1), p);
+               }
+               teleporter.enemy = RandomSelection_chosen_ent;
+       }
+
+       if(!teleporter.enemy) { sprint(player, "Teleport destination vanished. Sorry... please complain to the mapper.\n"); }
+       
+       makevectors(teleporter.enemy.mangle);
+
+       if(teleporter.enemy.speed)
+               if(vlen(player.velocity) > teleporter.enemy.speed)
+                       player.velocity = normalize(player.velocity) * max(0, teleporter.enemy.speed);
+                       
+       if(autocvar_g_teleport_maxspeed)
+               if(vlen(player.velocity) > autocvar_g_teleport_maxspeed)
+                       player.velocity = normalize(player.velocity) * max(0, autocvar_g_teleport_maxspeed);
+
+       locout = teleporter.enemy.origin + '0 0 1' * (1 - player.mins_z - 24);
+       TeleportPlayer(teleporter, player, locout, teleporter.enemy.mangle, v_forward * vlen(player.velocity), '0 0 0', '0 0 0', TELEPORT_FLAGS_TELEPORTER);
+}
+
+void Teleport_Touch (void)
+{
+       entity oldself;
        string s;
 
        if (self.active != ACTIVE_ACTIVE)
                return;
        
-       if (other.health < 1)
+       if not(other.iscreature)
+       if (other.deadflag != DEAD_NO)
                return;
-       if not(other.flags & FL_CLIENT) // FIXME: Make missiles firable through the teleport too
+
+       // for gameplay: vehicles can't teleport
+       if (other.vehicle_flags & VHF_ISVEHICLE)
+               return;
+
+       if (other.deadflag != DEAD_NO)
                return;
 
        if(self.team)
@@ -159,49 +206,10 @@ void Teleport_Touch (void)
 
        EXACTTRIGGER_TOUCH;
 
-       makevectors(self.enemy.mangle);
-
        if(other.classname == "player")
                RemoveGrapplingHook(other);
-       
-       if(self.enemy)
-       {
-               e = self.enemy;
-       }
-       else
-       {
-               RandomSelection_Init();
-               for(e = world; (e = find(e, targetname, self.target)); )
-               {
-                       p = 1;
-                       if(autocvar_g_telefrags_avoid)
-                       {
-                               o = e.origin + '0 0 1' * (1 - other.mins_z - 24);
-                               if(check_tdeath(other, o, '0 0 0', '0 0 0'))
-                                       p = 0;
-                       }
-                       if(e.cnt)
-                               RandomSelection_Add(e, 0, string_null, e.cnt, p);
-                       else
-                               RandomSelection_Add(e, 0, string_null, 1, p);
-               }
-               e = RandomSelection_chosen_ent;
-       }
-
-       if(!e)
-       {
-               sprint(other, "Teleport destination vanished. Sorry... please complain to the mapper.\n");
-       }
-
-       if(e.speed)
-               if(vlen(other.velocity) > e.speed)
-                       other.velocity = normalize(other.velocity) * max(0, e.speed);
-       if(autocvar_g_teleport_maxspeed)
-               if(vlen(other.velocity) > autocvar_g_teleport_maxspeed)
-                       other.velocity = normalize(other.velocity) * max(0, autocvar_g_teleport_maxspeed);
-
-       o = e.origin + '0 0 1' * (1 - other.mins_z - 24);
-       TeleportPlayer(self, other, o, e.mangle, v_forward * vlen(other.velocity), '0 0 0', '0 0 0', TELEPORT_FLAGS_TELEPORTER);
+               
+       Simple_TeleportPlayer(self, other);
 
        activator = other;
        s = self.target; self.target = string_null;
@@ -209,7 +217,7 @@ void Teleport_Touch (void)
        if not(self.target) self.target = s;
 
        oldself = self;
-       self = e;
+       self = self.enemy;
        SUB_UseTargets();
        self = oldself;
 }
@@ -246,18 +254,15 @@ void teleport_findtarget (void)
        entity e;
        float n;
 
-       RandomSelection_Init();
        n = 0;
        for(e = world; (e = find(e, targetname, self.target)); )
        {
                ++n;
                if(e.movetype == MOVETYPE_NONE)
-                       RandomSelection_Add(e, 0, string_null, 1, 1);
+                       waypoint_spawnforteleporter(self, e.origin, 0);
                if(e.classname != "info_teleport_destination")
                        print("^3MAPPER ERROR: teleporter does target an invalid teleport destination entity. Angles will not work.\n");
        }
-       if(RandomSelection_chosen_ent)
-               waypoint_spawnforteleporter(self, RandomSelection_chosen_ent.origin, 0);
 
        if(n == 0)
        {
@@ -269,7 +274,6 @@ void teleport_findtarget (void)
        {
                // exactly one dest - bots love that
                self.enemy = find(e, targetname, self.target);
-               self.dest = self.enemy.origin;
        }
        else
        {
@@ -281,6 +285,17 @@ void teleport_findtarget (void)
        self.touch = Teleport_Touch;
 }
 
+entity Teleport_Find(vector mi, vector ma)
+{
+       entity e;
+       for(e = world; (e = find(e, classname, "trigger_teleport")); )
+               if(WarpZoneLib_BoxTouchesBrush(mi, ma, e, world))
+                       return e;
+       return world;
+}
+
+entity teleport_first; 
+.entity teleport_next;
 void spawnfunc_trigger_teleport (void)
 {
        self.angles = '0 0 0';
@@ -299,11 +314,17 @@ void spawnfunc_trigger_teleport (void)
                objerror ("Teleporter with no target");
                return;
        }
+       
+       self.teleport_next = teleport_first;
+       teleport_first = self;
 }
 
 void WarpZone_PostTeleportPlayer_Callback(entity pl)
 {
        UpdateCSQCProjectileAfterTeleport(pl);
+       // "disown" projectiles after teleport
+       if(pl.owner == pl.realowner)
+               pl.owner = world;
        if(pl.classname == "player")
        {
                // reset tracking of oldvelocity for impact damage (sudden velocity changes)
index f9321b8dbf0fdbab6b3af8caf9b833af7add3c20..c5f8988b94387f795231865cf18464cc8fb38c66 100644 (file)
@@ -12,7 +12,7 @@ float IsTeamBalanceForced()
 {
        if(intermission_running)
                return 0; // no rebalancing whatsoever please
-       if(!teams_matter)
+       if(!teamplay)
                return 0;
        if(autocvar_g_campaign)
                return 0;
@@ -149,7 +149,7 @@ void ReadGameCvars()
                g_tdm = 1;
        }
 
-       teams_matter = 0;
+       teamplay = 0;
        serverflags &~= SERVERFLAG_TEAMPLAY;
 }
 
@@ -162,7 +162,7 @@ void default_delayedinit()
 void ActivateTeamplay()
 {
        serverflags |= SERVERFLAG_TEAMPLAY;
-       teams_matter = 1;
+       teamplay = 1;
 }
 
 void InitGameplayMode()
@@ -382,7 +382,7 @@ void InitGameplayMode()
                MUTATOR_ADD(gamemode_keepaway);
        }
 
-       if(teams_matter)
+       if(teamplay)
                entcs_init();
 
        // save it (for the next startup)
@@ -450,56 +450,10 @@ string GetClientVersionMessage() {
        return versionmsg;
 }
 
-
-void PrintWelcomeMessage(entity pl)
+string getwelcomemessage(void)
 {
        string s, modifications, motd;
 
-       if(self.cvar_scr_centertime == 0) return;
-
-       if(autocvar_g_campaign)
-       {
-               if(self.classname == "player" && !self.BUTTON_INFO)
-                       return;
-       }
-       else
-       {
-               if((time - self.jointime) > autocvar_welcome_message_time && !self.BUTTON_INFO)
-                       return;
-       }
-
-       if( !(timeoutStatus >= 1) ) { //really print the WelcomeMessage to the player every frame when timeout-seconds are shown or the game is restarted, to make sure that the shown number is accurate
-               if(self.welcomemessage_time > time) return;
-               self.welcomemessage_time = time + max(0.5, self.cvar_scr_centertime * 0.6);
-       }
-
-       if(autocvar_g_campaign)
-       {
-               centerprint(pl, campaign_message);
-               return;
-       }
-
-//TODO GreEn`mArine: make the timeout-messages clientside as well (just like the ready restart countdown)!
-       if(!self.BUTTON_INFO)
-       {
-               // TODO get rid of this too
-               local string specString;
-               specString = NEWLINES;
-               //if(time < game_starttime) //also show the countdown when being a spectator
-               //      specString = strcat(specString, "\n\n^1Game starts in ", ftos(ceil(game_starttime - time)), " seconds^7");
-               //else
-               if (timeoutStatus != 0)
-                       specString = strcat(specString, "\n\n", getTimeoutText(1));
-               else
-               {
-                       if(self.classname == "player")
-                               return;
-                       goto normal;
-               }
-               return centerprint_atprio(self, CENTERPRIO_SPAM, specString);
-       }
-
-:normal
        ret_string = "";
        MUTATOR_CALLHOOK(BuildMutatorsPrettyString);
        modifications = ret_string;
@@ -536,15 +490,12 @@ void PrintWelcomeMessage(entity pl)
        local string versionmessage;
        versionmessage = GetClientVersionMessage();
 
-       s = strcat(s, NEWLINES, "This is Xonotic ", autocvar_g_xonoticversion, "\n", versionmessage);
+       s = strcat("This is Xonotic ", autocvar_g_xonoticversion, "\n", versionmessage);
        s = strcat(s, "^8\n\nmatch type is ^1", gamemode_name, "^8\n");
 
        if(modifications != "")
                s = strcat(s, "^8\nactive modifications: ^3", modifications, "^8\n");
 
-       if(timeoutStatus != 0)
-               s = strcat(s, "\n\n", getTimeoutText(1));
-
        if (g_grappling_hook)
                s = strcat(s, "\n\n^3grappling hook^8 is enabled, press 'e' to use it\n");
 
@@ -566,12 +517,9 @@ void PrintWelcomeMessage(entity pl)
        if (motd != "") {
                s = strcat(s, "\n\n^8MOTD: ^7", strreplace("\\n", "\n", motd));
        }
-       s = strcat(s, "\n");
-
-       centerprint(pl, s);
+       return s;
 }
 
-
 void SetPlayerColors(entity pl, float _color)
 {
        /*string s;
@@ -586,7 +534,7 @@ void SetPlayerColors(entity pl, float _color)
        shirt = _color & 0xF0;
 
 
-       if(teams_matter) {
+       if(teamplay) {
                setcolor(pl, 16*pants + pants);
        } else {
                setcolor(pl, shirt + pants);
@@ -903,7 +851,7 @@ float JoinBestTeam(entity pl, float only_return_best, float forcebestteam)
        float smallest, selectedteam;
 
        // don't join a team if we're not playing a team game
-       if(!teams_matter)
+       if(!teamplay)
                return 0;
 
        // find out what teams are available
@@ -980,7 +928,7 @@ void SV_ChangeTeam(float _color)
        float scolor, dcolor, steam, dteam, dbotcount, scount, dcount;
 
        // in normal deathmatch we can just apply the color and we're done
-       if(!teams_matter) {
+       if(!teamplay) {
                SetPlayerColors(self, _color);
                return;
        }
index 8cdd0f5097b581f00cda055d8a70d8c27d976fd7..d52c00307c0474f5ff59b7a6e81c0ddf79291826 100644 (file)
@@ -2,8 +2,8 @@
 #define TTURRETS_ENABLED
 
 #ifdef TTURRETS_ENABLED
-
-#message "with tZork turrets"
+#ifdef SVQC
+//#message "with tZork turrets"
 
 float turret_count;
 
@@ -37,6 +37,8 @@ vector real_origin(entity ent);
 #define TSF_NO_PATHBREAK  8
 /// Dont respawn
 #define TSL_NO_RESPAWN    16
+/// Let this turret roam when idle.
+#define TSL_ROAM          32
 
 /// target selection flags
 .float target_select_flags;
@@ -340,9 +342,10 @@ vector real_origin(entity ent);
 .float target_select_playerbias;
 /// Field of view
 //.float target_select_fov;
-/// Last thimestamp this surret aquierd a valid target
+/// Last timestamp this turret aquierd a valid target
 .float target_select_time;
-
+/// Throttle re-validation of current target
+.float target_validate_time;
 /*
 * Aim refers to real aiming, not gun pos (thats done by track)
 */
@@ -399,33 +402,20 @@ void turret_fire();
 .void() turret_diehook;
 .void() turret_respawnhook;
 
-/*
-#define TEH_THINK 2
-#define TEH_DAMAGE 4
-#define TEH_DIE 8
-#define TEH_RESPAWN 16
-#define TEH_TRACK 32
-#define TEH_AIM 64
-#define TEH_SELECT 128
-.float(float event_id) turret_eventhook;
-*/
-
-
 /*
 * Target selection, preferably but not nessesarely
 * return a normalized result.
 */
 /// Function to use for target evaluation. usualy turret_stdproc_targetscore_generic
-.float(entity e_turret, entity e_target) turret_score_target;
-
+.float(entity _turret, entity _target) turret_score_target;
 
 /*
 * Target selection
 */
 /// Generic, fairly smart, bias-aware target selection.
-float   turret_stdproc_targetscore_generic(entity e_turret, entity e_target);
+float   turret_stdproc_targetscore_generic(entity _turret, entity _target);
 /// Experimental supportunits targetselector
-float   turret_stdproc_targetscore_support(entity e_turret,entity e_target);
+float   turret_stdproc_targetscore_support(entity _turret,entity _target);
 
 /*
 * Aim functions
@@ -464,8 +454,35 @@ void turret_do_updates(entity e_turret);
 .vector tur_shotdir_updated;
 
 void turrets_precash();
-
-
+#endif // SVQC
+
+// common
+.float turret_type;
+float TID_COMMON        = 1;
+float TID_EWHEEL        = 2;
+float TID_FLAC          = 3;
+float TID_FUSION        = 4;
+float TID_HELLION       = 5;
+float TID_HK            = 6;
+float TID_MACHINEGUN    = 7;
+float TID_MLRS          = 8;
+float TID_PHASER        = 9;
+float TID_PLASMA        = 10;
+float TID_PLASMA_DUAL   = 11;
+float TID_TESLA         = 12;
+float TID_WALKER        = 13;
+float TID_LAST          = 13;
+
+float TNSF_UPDATE       = 2;
+float TNSF_STATUS       = 4;
+float TNSF_SETUP        = 8;
+float TNSF_ANG          = 16;
+float TNSF_AVEL         = 32;
+float TNSF_MOVE         = 64;
+.float anim_start_time;
+float TNSF_ANIM         = 128;
+
+float TNSF_FULL_UPDATE  = 16777215;
 
 #endif // TTURRETS_ENABLED
 
index c7f25a4467825f6b9c6eefbd7ba9f4fc96b73289..8daad2734101a1e53f8ebe5f42bf599effa7e0eb 100644 (file)
 /*
-* Trow a turret gib
+* Spawn a boom, trow fake bits arround
+* and hide the real ones.
 */
-void turret_gib_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
+void turret_hide()
 {
-    self.velocity += vforce;
+    self.effects   |= EF_NODRAW;
+    self.nextthink = time + self.respawntime - 0.2;
+    self.think     = turret_stdproc_respawn;
 }
 
-void turret_trowgib(
-    vector v_from, vector v_to, vector v_colormod,
-    string smodel,
-    float f_lifetime, float f_fadetime, float b_burn)
-{
-    local entity gib;
-    local entity burn;
-
-    gib = spawn();
-
-    gib.classname = "turret_gib";
-    setmodel(gib, smodel);
-    setorigin(gib, v_from);
-    SUB_SetFade(gib,time + f_lifetime, 2);
-
-    gib.solid              = SOLID_BBOX;
-    gib.movetype           = MOVETYPE_BOUNCE;
-    gib.takedamage         = DAMAGE_YES;
-    gib.event_damage       = turret_gib_damage;
-    gib.health             = -1;
-    gib.effects            = EF_LOWPRECISION;
-    gib.flags              = FL_NOTARGET;
-    gib.colormod           = v_colormod;
-    gib.velocity           = v_to;
-
-    if (b_burn)
-    {
-        burn = spawn();
-        burn.effects        = EF_LOWPRECISION;//|EF_FLAME;
-        setattachment(burn,gib,"");
-        setorigin(burn,(gib.mins + gib.maxs) * 0.5);
-        SUB_SetFade(burn,time + (f_lifetime * 0.5), 2);
-    }
-}
-
-void turret_gib_boom()
-{
-    entity gib;
-    float i;
-    string s;
-
-    for (i = 1; i < 5; i = i +1)
-    {
-        gib = spawn();
-        gib.classname = "turret_gib";
-
-        s = strcat("models/turrets/head-gib",ftos(i));
-        s = strcat(s,".md3");
-        setmodel(gib, s);
-
-        setorigin(gib,self.origin);
-
-        SUB_SetFade(gib,time + 5,2);
-
-        gib.solid              = SOLID_BBOX;
-        gib.movetype           = MOVETYPE_BOUNCE;
-        gib.gravity            = 0.5;
-        gib.damageforcescale   = 2;
-        gib.takedamage         = DAMAGE_YES;
-        gib.event_damage       = turret_gib_damage;
-        gib.health             = -1;
-        gib.effects            = EF_LOWPRECISION;
-        gib.flags              = FL_NOTARGET;
-        gib.velocity           = self.velocity + (randomvec() * 700);
-        gib.avelocity          = randomvec() * 64;
-    }
-
-    WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
-    WriteByte (MSG_BROADCAST, 78);
-    WriteCoord (MSG_BROADCAST, self.origin_x);
-    WriteCoord (MSG_BROADCAST, self.origin_y);
-    WriteCoord (MSG_BROADCAST, self.origin_z);
-
-    remove(self);
-}
-
-void turret_trowgib2(
-    vector v_from, vector v_to, vector v_colormod,
-    entity e_mimic, float boomtime)
-{
-    entity gib;
-
-    gib = spawn();
-
-    gib.classname = "turret_gib";
-    setmodel(gib,e_mimic.model);
-    setorigin(gib,v_from);
-
-    gib.solid              = SOLID_BBOX;
-
-    gib.movetype           = MOVETYPE_BOUNCE;
-    gib.gravity            = 0.75;
-    gib.damageforcescale   = 2;
-    gib.takedamage         = DAMAGE_YES;
-    gib.event_damage       = turret_gib_damage;
-    gib.health             = -1;
-    gib.effects            = EF_LOWPRECISION;
-    gib.flags              = FL_NOTARGET;
-    gib.colormod           = v_colormod;
-    gib.velocity           = v_to;
-    gib.avelocity          = randomvec() * 32;
-    gib.think              = turret_gib_boom;
-    gib.nextthink          = boomtime;
-    //gib.effects            = EF_FLAME;
-
-
-}
-/*
-* Spawn a boom, trow fake bits arround
-* and hide the real ones.
-*/
 void turret_stdproc_die()
 {
-    vector org2;
-    vector t_dir;
-
     self.deadflag           = DEAD_DEAD;
     self.tur_head.deadflag  = self.deadflag;
 
-    sound (self, CHAN_PLAYER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    org2 = self.origin + '0 0 40';
-
-// Explotion grafix
-    WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
-    WriteByte (MSG_BROADCAST, 78);
-    WriteCoord (MSG_BROADCAST, org2_x);
-    WriteCoord (MSG_BROADCAST, org2_y);
-    WriteCoord (MSG_BROADCAST, org2_z);
-
 // Unsolidify and hide real parts
     self.solid              = SOLID_NOT;
     self.tur_head.solid     = self.solid;
 
-    self.alpha             = -1;
-    self.tur_head.alpha    = self.alpha;
-    self.customizeentityforclient = SUB_False;
-    self.tur_head.customizeentityforclient = SUB_False;
-
     self.event_damage           = SUB_Null;
     self.takedamage             = DAMAGE_NO;
 
-    self.effects            = 0;
-    self.tur_head.effects   = self.effects;
     self.health             = 0;
 
-// Trow fake parts arround
-    // base
-    if not(self.damage_flags & TFL_DMG_DEATH_NOGIBS)
-    {
-        makevectors(self.angles);
-        if (random() > 0.5)
-        {
-            turret_trowgib(self.origin, '0 0 0', '1 1 1', "models/turrets/base-gib2.md3", min(self.respawntime, 20), 1, 1);
-            
-            t_dir = (v_up * 700) + (randomvec() * 300);            
-            turret_trowgib(self.origin, t_dir, '1 1 1', "models/turrets/base-gib3.md3", min(self.respawntime, 10), 1, 1);
-            
-            t_dir = (v_up * 700) + (randomvec() * 300);
-            turret_trowgib(self.origin, t_dir, '1 1 1', "models/turrets/base-gib4.md3", min(self.respawntime, 10), 1, 1);
-        }
-        else
-        {
-            turret_trowgib(self.origin, '0 0 0', '1 1 1', "models/turrets/base-gib1.md3", min(self.respawntime, 20), 1, 1);
-        }
-
-        // Blow the top part up into the air
-        turret_trowgib2( self.origin + (v_up * 50), v_up * 150 + randomvec() * 50, '0.2 0.2 0.2', self.tur_head,time + 0.5 + (random() * 0.5));
-    }
-
 // Go boom
     //RadiusDamage (self,self, min(self.ammo,50),min(self.ammo,50) * 0.25,250,world,min(self.ammo,50)*5,DEATH_TURRET,world);
 
@@ -189,52 +37,26 @@ void turret_stdproc_die()
     else
     {
                // Setup respawn
-        self.nextthink      = time + self.respawntime;
-        self.think          = turret_stdproc_respawn;
+        self.SendFlags      |= TNSF_STATUS;
+        self.nextthink      = time + 0.2;
+        self.think          = turret_hide;
         
         if (self.turret_diehook)
             self.turret_diehook();
     }
 }
 
-var const float SUB_NullFloat();
 void turret_stdproc_respawn()
 {
     // Make sure all parts belong to the same team since
     // this function doubles as "teamchange" function.
-
     self.tur_head.team         = self.team;
-       self.colormod           = '0 0 0';
-
-       switch(self.team)
-       {
-        case COLOR_TEAM1: // Red
-            self.colormod = '1.4 0.8 0.8';
-            break;
-
-        case COLOR_TEAM2: // Blue
-            self.colormod = '0.8 0.8 1.4';
-            break;
-
-        case COLOR_TEAM3: // Yellow
-            self.colormod = '1.4 1.4 0.6';
-            break;
-
-        case COLOR_TEAM4: // Pink
-            self.colormod = '1.4 0.6 1.4';
-            break;
-       }
 
+    self.effects             &~= EF_NODRAW;
     self.deadflag           = DEAD_NO;
     self.effects            = EF_LOWPRECISION;
-    self.tur_head.effects   = self.effects;
     self.solid              = SOLID_BBOX;
-    self.alpha                                 = 1;
-    self.tur_head.alpha     = self.alpha;
     
-    self.customizeentityforclient                      = SUB_NullFloat;
-    self.tur_head.customizeentityforclient     = SUB_NullFloat;
-
     self.takedamage                    = DAMAGE_AIM;
     self.event_damage           = turret_stdproc_damage;
 
@@ -249,10 +71,11 @@ void turret_stdproc_respawn()
 
     self.nextthink  = time + self.ticrate;
     self.think      = turret_think;
+    
+    self.SendFlags  = TNSF_FULL_UPDATE;
 
     if (self.turret_respawnhook)
         self.turret_respawnhook();
-
 }
 
 /*
@@ -260,16 +83,15 @@ void turret_stdproc_respawn()
 */
 void turret_stdproc_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
 {
-
     // Enougth allready!
-    if (self.health <= 0)
+    if(self.deadflag == DEAD_DEAD)
         return;
 
     // Inactive turrets take no damage. (hm..)
     if not (self.tur_active)
         return;
 
-    if (teams_matter)
+    if (teamplay)
     if (self.team == attacker.team)
     {
         // This does not happen anymore. Re-enable if you fix that.
@@ -289,12 +111,13 @@ void turret_stdproc_damage (entity inflictor, entity attacker, float damage, flo
     {
         self.tur_head.angles_x = self.tur_head.angles_x + (-0.5 + random()) * damage;
         self.tur_head.angles_y = self.tur_head.angles_y + (-0.5 + random()) * damage;
+        
+        self.SendFlags  |= TNSF_ANG;
+
     }
 
     if (self.turrcaps_flags & TFL_TURRCAPS_MOVE)
         self.velocity = self.velocity + vforce;
-
-    // FIXME: Better damage feedback?
     
     if (self.health <= 0)
     {
@@ -304,4 +127,6 @@ void turret_stdproc_damage (entity inflictor, entity attacker, float damage, flo
         self.nextthink = time;
         self.think = turret_stdproc_die;
     }
+    
+    self.SendFlags  |= TNSF_STATUS;
 }
index 7d023e99ef199d9049f3954a9779e4847fa61881..de3e06537552308ec721306c96947a2c7bc16853 100644 (file)
@@ -1,23 +1,80 @@
 #define cvar_base "g_turrets_unit_"
-
-/*
-float turret_customizeentityforclient()
-{
+.float clientframe;
+void turrets_setframe(float _frame, float client_only)
+{        
+    if((client_only ? self.clientframe : self.frame ) != _frame)
+    {
+        self.SendFlags |= TNSF_ANIM;
+        self.anim_start_time = time;
+    }
+    
+     if(client_only)
+        self.clientframe = _frame;
+    else
+        self.frame = _frame;
+   
 }
 
-float Turret_SendEntity(entity to, float sf)
+float turret_send(entity to, float sf)
 {
+       
+       WriteByte(MSG_ENTITY, ENT_CLIENT_TURRET);    
+       WriteByte(MSG_ENTITY, sf);
+       if(sf & TNSF_SETUP)
+       {
+           WriteByte(MSG_ENTITY, self.turret_type);
+           
+           WriteCoord(MSG_ENTITY, self.origin_x);
+           WriteCoord(MSG_ENTITY, self.origin_y);
+           WriteCoord(MSG_ENTITY, self.origin_z);
+           
+           WriteAngle(MSG_ENTITY, self.angles_x);
+           WriteAngle(MSG_ENTITY, self.angles_y);
+    }
+    
+    if(sf & TNSF_ANG)
+    {
+        WriteShort(MSG_ENTITY, rint(self.tur_head.angles_x));
+        WriteShort(MSG_ENTITY, rint(self.tur_head.angles_y));
+    }
+    
+    if(sf & TNSF_AVEL)
+    {        
+        WriteShort(MSG_ENTITY, rint(self.tur_head.avelocity_x));
+        WriteShort(MSG_ENTITY, rint(self.tur_head.avelocity_y));
+    }
+    
+    if(sf & TNSF_MOVE)
+    {
+        WriteShort(MSG_ENTITY, rint(self.origin_x));
+        WriteShort(MSG_ENTITY, rint(self.origin_y));
+        WriteShort(MSG_ENTITY, rint(self.origin_z));
 
-       WriteByte(MSG_ENTITY, ENT_CLIENT_TURRET);
-       WriteCoord(MSG_ENTITY, self.tur_head.angles_x);
-       WriteCoord(MSG_ENTITY, self.tur_head.angles_y);
-    WriteByte(MSG_ENTITY, self.tur_head.frame);
-
-       //WriteCoord(MSG_ENTITY, self.tur_head.angles_z);
-
+        WriteShort(MSG_ENTITY, rint(self.velocity_x));
+        WriteShort(MSG_ENTITY, rint(self.velocity_y));
+        WriteShort(MSG_ENTITY, rint(self.velocity_z));        
+        
+        WriteShort(MSG_ENTITY, rint(self.angles_y));        
+    }
+    
+    if(sf & TNSF_ANIM)
+    {
+        WriteCoord(MSG_ENTITY, self.anim_start_time);
+        WriteByte(MSG_ENTITY, self.frame);
+    }
+    
+    if(sf & TNSF_STATUS)
+    {
+        WriteByte(MSG_ENTITY, self.team);
+        
+        if(self.health <= 0)
+            WriteByte(MSG_ENTITY, 0);
+        else
+            WriteByte(MSG_ENTITY, ceil((self.health / self.tur_health) * 255));
+    }
+    
        return TRUE;
 }
-*/
 
 void load_unit_settings(entity ent, string unitname, float is_reload)
 {
@@ -84,7 +141,6 @@ void load_unit_settings(entity ent, string unitname, float is_reload)
             ent.turret_respawnhook();
 }
 
-
 /**
 ** updates enemy distances, predicted impact point/time
 ** and updated aim<->predict impact distance.
@@ -116,8 +172,6 @@ void turret_do_updates(entity t_turret)
             self.tur_dist_impact_to_aimpos = 0;
         else
             self.tur_dist_impact_to_aimpos = vlen(trace_endpos - self.tur_aimpos);
-
-
     }
     else
         tracebox(self.tur_shotorg, '-1 -1 -1','1 1 1', self.tur_shotorg + (self.tur_shotdir_updated * self.tur_dist_aimpos),MOVE_NORMAL,self);
@@ -199,12 +253,16 @@ vector turret_fovsearch_random()
 ** Handles head rotation according to
 ** the units .track_type and .track_flags
 **/
+.float turret_framecounter;
 void turret_stdproc_track()
 {
     vector target_angle; // This is where we want to aim
     vector move_angle;   // This is where we can aim
     float f_tmp;
-
+    vector v1, v2;
+    v1 = self.tur_head.angles;
+    v2 = self.tur_head.avelocity;
+    
     if (self.track_flags == TFL_TRACK_NO)
         return;
 
@@ -226,8 +284,11 @@ void turret_stdproc_track()
     self.tur_head.angles_y = anglemods(self.tur_head.angles_y);
 
     // Find the diffrence between where we currently aim and where we want to aim
-    move_angle = target_angle - (self.angles + self.tur_head.angles);
-    move_angle = shortangle_vxy(move_angle,(self.angles + self.tur_head.angles));
+    //move_angle = target_angle - (self.angles + self.tur_head.angles);
+    //move_angle = shortangle_vxy(move_angle,(self.angles + self.tur_head.angles));
+    
+    move_angle = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(self.angles), AnglesTransform_FromAngles(target_angle))) - self.tur_head.angles; 
+    move_angle = shortangle_vxy(move_angle, self.tur_head.angles);
 
     switch(self.track_type)
     {
@@ -252,7 +313,10 @@ void turret_stdproc_track()
                 if(self.tur_head.angles_y  < -self.aim_maxrot)
                     self.tur_head.angles_y = self.aim_maxrot;
             }
-
+            
+            // CSQC
+            self.SendFlags  = TNSF_ANG;
+            
             return;
 
         case TFL_TRACKTYPE_FLUIDINERTIA:
@@ -278,12 +342,16 @@ void turret_stdproc_track()
         {
             self.tur_head.avelocity_x = 0;
             self.tur_head.angles_x = self.aim_maxpitch;
+            
+            self.SendFlags  |= TNSF_ANG;
         }
         
         if((self.tur_head.angles_x + self.tur_head.avelocity_x * self.ticrate) < -self.aim_maxpitch)
         {
             self.tur_head.avelocity_x = 0;
             self.tur_head.angles_x = -self.aim_maxpitch;
+                        
+            self.SendFlags  |= TNSF_ANG;
         }
     }
 
@@ -296,14 +364,28 @@ void turret_stdproc_track()
         {
             self.tur_head.avelocity_y = 0;
             self.tur_head.angles_y = self.aim_maxrot;
+            
+            self.SendFlags  |= TNSF_ANG;
         }
 
         if((self.tur_head.angles_y + self.tur_head.avelocity_y * self.ticrate) < -self.aim_maxrot)
         {
             self.tur_head.avelocity_y = 0;
             self.tur_head.angles_y = -self.aim_maxrot;
+            
+            self.SendFlags  |= TNSF_ANG;
         }
     }
+        
+    self.SendFlags  |= TNSF_AVEL;
+    
+    // Force a angle update every 10'th frame
+    self.turret_framecounter += 1;
+    if(self.turret_framecounter >= 10)
+    {        
+        self.SendFlags |= TNSF_ANG;
+        self.turret_framecounter = 0;
+    }            
 }
 
 
@@ -607,9 +689,9 @@ void turret_think()
     entity e;
 
     self.nextthink = time + self.ticrate;
-
+    
     // ONS uses somewhat backwards linking.
-    if (teams_matter)
+    if (teamplay)
     {
         if not (g_onslaught)
             if (self.target)
@@ -636,10 +718,6 @@ void turret_think()
     if not (self.spawnflags & TSF_NO_AMMO_REGEN)
     if (self.ammo < self.ammo_max)
         self.ammo = min(self.ammo + self.ammo_recharge, self.ammo_max);
-
-    if (self.health < (self.tur_health * 0.5))
-               if(random() < 0.25)
-                       te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);
                        
     // Inactive turrets needs to run the think loop,
     // So they can handle animation and wake up if need be.
@@ -726,9 +804,11 @@ void turret_think()
             do_target_scan = 1;
 
         // Old target (if any) invalid?
+        if(self.target_validate_time < time)
         if (turret_validate_target(self, self.enemy, self.target_validate_flags) <= 0)
         {
                self.enemy = world;
+               self.target_validate_time = time + 0.5;
                do_target_scan = 1;
         }
 
@@ -830,9 +910,10 @@ void turret_stdproc_use()
 
 void turret_link()
 {
-    //Net_LinkEntity(self, FALSE, 0, Turret_SendEntity);
+    Net_LinkEntity(self, TRUE, 0, turret_send);
     self.think      = turret_think;
     self.nextthink  = time;
+    self.tur_head.effects = EF_NODRAW;
 }
 
 void turrets_manager_think()
@@ -863,15 +944,21 @@ void turrets_manager_think()
 * (unless you have a very good reason not to)
 * if the return value is 0, the turret should be removed.
 */
-float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base, string head)
+float turret_stdproc_init (string cvar_base_name, string base, string head, float _turret_type)
 {
        entity e, ee;
 
     // Are turrets allowed?
     if (autocvar_g_turrets == 0)
         return 0;
-
-
+    
+    if(_turret_type < 1 || _turret_type > TID_LAST)
+    {
+        dprint("Invalid / Unkown turret type\"", ftos(_turret_type), "\", aborting!\n");
+        return 0;
+    }    
+    self.turret_type = _turret_type;
+    
     e = find(world, classname, "turret_manager");
     if not (e)
     {
@@ -895,17 +982,20 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
         e.nextthink = time + 2;
     }
 
+    /*
     if(csqc_shared)
     {
         dprint("WARNING: turret requested csqc_shared but this is not implemented. Expect strange things to happen.\n");
         csqc_shared = 0;
     }
-
+    */
+    
     if not (self.spawnflags & TSF_SUSPENDED)
         droptofloor_builtin();
 
     // Terrainbase spawnflag. This puts a enlongated model
     // under the turret, so it looks ok on uneaven surfaces.
+    /*  TODO: Handle this with CSQC
     if (self.spawnflags & TSF_TERRAINBASE)
     {
         entity tb;
@@ -914,17 +1004,20 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
         setorigin(tb,self.origin);
         tb.solid = SOLID_BBOX;
     }
+    */
 
     self.cvar_basename = cvar_base_name;
-    load_unit_settings(self,self.cvar_basename, 0);
+    load_unit_settings(self, self.cvar_basename, 0);
 
+    self.effects = EF_NODRAW;
+    
     // Handle turret teams.
     if (autocvar_g_assault != 0)
     {
         if not (self.team)
             self.team = 14; // Assume turrets are on the defending side if not explicitly set otehrwize
     }
-    else if not (teams_matter)
+    else if not (teamplay)
                self.team = MAX_SHOT_DISTANCE; // Group all turrets into the same team, so they dont kill eachother.
        else if(g_onslaught && self.targetname)
        {
@@ -1107,7 +1200,6 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
 
     self.target_validate_flags = self.target_select_flags;
 
-
 // Ammo stuff
     if not (self.ammo_max)
         self.ammo_max = self.shot_dmg * 10;
@@ -1134,8 +1226,11 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
 
 // Offsets & origins
     if (!self.tur_shotorg)   self.tur_shotorg = '50 0 50';
+    
+    if (!self.health)
+        self.health = 150;
 
-// Gane hooks
+// Game hooks
        if(MUTATOR_CALLHOOK(TurretSpawn))
                return 0;
 
@@ -1156,9 +1251,6 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
     setorigin(self.tur_head, '0 0 0');
     setattachment(self.tur_head, self, "tag_head");
 
-    if (!self.health)
-        self.health = 150;
-
     self.tur_health          = self.health;
     self.solid               = SOLID_BBOX;
     self.tur_head.solid      = SOLID_NOT;
@@ -1185,35 +1277,19 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
     else
         self.idle_aim  = '0 0 0';
 
-    // Team color
-    if (self.team == COLOR_TEAM1) self.colormod = '1.4 0.8 0.8';
-    if (self.team == COLOR_TEAM2) self.colormod = '0.8 0.8 1.4';
-
     // Attach stdprocs. override when and what needed
+    self.turret_firecheckfunc   = turret_stdproc_firecheck;
+    self.turret_firefunc        = turret_stdproc_fire;
+    self.event_damage           = turret_stdproc_damage;
+    
     if (self.turrcaps_flags & TFL_TURRCAPS_SUPPORT)
-    {
         self.turret_score_target    = turret_stdproc_targetscore_support;
-        self.turret_firecheckfunc   = turret_stdproc_firecheck;
-        self.turret_firefunc        = turret_stdproc_fire;
-        self.event_damage           = turret_stdproc_damage;
-    }
     else
-    {
         self.turret_score_target    = turret_stdproc_targetscore_generic;
-        self.turret_firecheckfunc   = turret_stdproc_firecheck;
-        self.turret_firefunc        = turret_stdproc_fire;
-        self.event_damage           = turret_stdproc_damage;
-    }
 
     self.use = turret_stdproc_use;
     self.bot_attack = TRUE;
 
-    // Initiate the main AI loop
-    if(csqc_shared)
-        self.think     = turret_link;
-    else
-        self.think     = turret_think;
-
     ++turret_count;
     self.nextthink = time + 1;
     self.nextthink +=  turret_count * sys_frametime;
@@ -1244,8 +1320,13 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
         activator = ee;
         self.use();
     }
-       
+    
+       turret_link();
        turret_stdproc_respawn();
+           
+    if (!turret_tag_fire_update())
+        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
+    
     return 1;
 }
 
index 7b2875d7dc980d3dbc1b46163d3abcd278d76b6e..f97f1091faeea7353b472af2e194537275a0812d 100644 (file)
@@ -221,34 +221,6 @@ void turrets_precache_debug_models()
 
 void turrets_precash()
 {
-    precache_model ("models/turrets/base-gib1.md3");
-    precache_model ("models/turrets/base-gib2.md3");
-    precache_model ("models/turrets/base-gib3.md3");
-    precache_model ("models/turrets/base-gib4.md3");
-
-    precache_model ("models/turrets/head-gib1.md3");
-    precache_model ("models/turrets/head-gib2.md3");
-    precache_model ("models/turrets/head-gib3.md3");
-    precache_model ("models/turrets/head-gib4.md3");
-    precache_model ("models/turrets/terrainbase.md3");
-
-    //precache_model ("models/turrets/base.md3");
-    //precache_model ("models/turrets/flac.md3");
-    //precache_model ("models/turrets/pd_proj.md3");
-    //precache_model ("models/turrets/reactor.md3");
-    //precache_model ("models/turrets/mlrs_rocket.md3");
-    //precache_model ("models/turrets/hellion.md3");
-    //precache_model ("models/turrets/hunter2.md3");
-    //precache_model ("models/turrets/hk.md3");
-    //precache_model ("models/turrets/machinegun.md3");
-    //precache_model ("models/turrets/rocket.md3");
-    //precache_model ("models/turrets/mlrs.md3");
-    //precache_model ("models/turrets/phaser.md3");
-    //precache_model ("models/turrets/phaser_beam.md3");
-    //precache_model ("models/turrets/plasmad.md3");
-    //precache_model ("models/turrets/plasma.md3");
-    //precache_model ("models/turrets/tesla_head.md3");
-    //precache_model ("models/turrets/tesla_base.md3");
     #ifdef TURRET_DEBUG
        turrets_precache_debug_models();
        #endif
index 32c7856a3d25d5f19066ba2b09123f1ef8e945c2..316d45bbced89e0e467e7f8436bd5ecd7536a85e 100644 (file)
@@ -1,28 +1,14 @@
-/*
-.float target_select_flags; /// target selection flags
-float TFL_TARGETSELECT_NO            = 1;   /// Dont select a target on its own.
-float TFL_TARGETSELECT_LOS           = 2;   /// Need line of sight
-float TFL_TARGETSELECT_PLAYERS       = 4;   /// Players are valid targets
-float TFL_TARGETSELECT_MISSILES      = 8;   /// Missiles are valid targets
-float TFL_TARGETSELECT_TRIGGERTARGET = 16;  /// Responds to turret_trigger_target events
-float TFL_TARGETSELECT_ANGLELIMITS   = 32;  /// Angular limitations of turret head limits target selection
-float TFL_TARGETSELECT_RANGELIMTS    = 64;  /// Range limits apply in targetselection
-float TFL_TARGETSELECT_TEAMCHECK     = 128; /// Consider team own <-> targets team
-float TFL_TARGETSELECT_NOBUILTIN     = 256; /// Cant select targets on its own. needs to be triggerd or slaved.
-float TFL_TARGETSELECT_OWNTEAM       = 512;
-*/
-
-float turret_stdproc_targetscore_support(entity e_turret,entity e_target)
+float turret_stdproc_targetscore_support(entity _turret,entity _target)
 {
     float score;        // Total score
-    float s_score,d_score;
+    float s_score, d_score;
 
-    if (e_turret.enemy == e_target) s_score = 1;
+    if (_turret.enemy == _target) s_score = 1;
 
-    d_score = min(e_turret.target_range_optimal,tvt_dist) / max(e_turret.target_range_optimal,tvt_dist);
+    d_score = min(_turret.target_range_optimal,tvt_dist) / max(_turret.target_range_optimal,tvt_dist);
 
-    score = (d_score * e_turret.target_select_rangebias) +
-            (s_score * e_turret.target_select_samebias);
+    score = (d_score * _turret.target_select_rangebias) +
+            (s_score * _turret.target_select_samebias);
 
     return score;
 }
@@ -30,58 +16,35 @@ float turret_stdproc_targetscore_support(entity e_turret,entity e_target)
 /*
 * Generic bias aware score system.
 */
-float turret_stdproc_targetscore_generic(entity e_turret, entity e_target)
+float turret_stdproc_targetscore_generic(entity _turret, entity _target)
 {
-    //vector v_tmp;
     float d_dist;       // Defendmode Distance
-
     float score;        // Total score
-
     float d_score;      // Distance score
     float a_score;      // Angular score
     float m_score;      // missile score
     float p_score;      // player score
-    //float da_score;   // Distance from aimpoint score
-
     float ikr;          // ideal kill range
 
-    /*
-    if(!e_target) 
-               return 0;
-       */
-
-    if (e_turret.tur_defend)
+    if (_turret.tur_defend)
     {
-        d_dist = vlen(real_origin(e_target) - e_turret.tur_defend.origin);
-        ikr = vlen(e_turret.origin - e_turret.tur_defend.origin);
-        d_score = 1 - d_dist / e_turret.target_range;
+        d_dist = vlen(real_origin(_target) - _turret.tur_defend.origin);
+        ikr = vlen(_turret.origin - _turret.tur_defend.origin);
+        d_score = 1 - d_dist / _turret.target_range;
     }
     else
     {
         // Make a normlized value base on the targets distance from our optimal killzone
-        ikr = e_turret.target_range_optimal;
-        d_score = min(ikr,tvt_dist) / max(ikr,tvt_dist);
+        ikr = _turret.target_range_optimal;
+        d_score = min(ikr, tvt_dist) / max(ikr, tvt_dist);
     }
 
-    /*
-    // Determine the maximum time it could take this turrent to aim at someting.
-    max_aim_delay = (max(e_turret.aim_maxrot,e_turret.aim_maxpitch) / e_turret.aim_speed * 2);
-
-    // Find out how long it would take to aim at this taget.
-    aim_delay = (thadf+0.01) / e_turret.aim_speed;
-
-    // Turn this info into a normalized value.
-    aim_delay = (min(max_aim_delay,aim_delay) / max_aim_delay);
-    a_score = 1 - aim_delay;
-    */
-
-    //a_score = 1 - (tvt_thadf / max(e_turret.aim_maxrot,e_turret.aim_maxpitch));
-    a_score = 1 - tvt_thadf / e_turret.aim_maxrot;
+    a_score = 1 - tvt_thadf / _turret.aim_maxrot;
 
-    if ((e_turret.target_select_missilebias > 0) && (e_target.flags & FL_PROJECTILE))
+    if ((_turret.target_select_missilebias > 0) && (_target.flags & FL_PROJECTILE))
         m_score = 1;
 
-    if ((e_turret.target_select_playerbias > 0) && (e_target.flags & FL_CLIENT))
+    if ((_turret.target_select_playerbias > 0) && (_target.flags & FL_CLIENT))
         p_score = 1;
 
     d_score = max(d_score, 0);
@@ -89,12 +52,12 @@ float turret_stdproc_targetscore_generic(entity e_turret, entity e_target)
     m_score = max(m_score, 0);
     p_score = max(p_score, 0);
 
-    score = (d_score * e_turret.target_select_rangebias) +
-            (a_score * e_turret.target_select_anglebias) +
-            (m_score * e_turret.target_select_missilebias) +
-            (p_score * e_turret.target_select_playerbias);
+    score = (d_score * _turret.target_select_rangebias) +
+            (a_score * _turret.target_select_anglebias) +
+            (m_score * _turret.target_select_missilebias) +
+            (p_score * _turret.target_select_playerbias);
 
-    if(e_turret.target_range < vlen(e_turret.tur_shotorg - real_origin(e_target)))
+    if(_turret.target_range < vlen(_turret.tur_shotorg - real_origin(_target)))
     {
         dprint("Wtf?\n");
         score *= 0.001;
@@ -105,28 +68,28 @@ float turret_stdproc_targetscore_generic(entity e_turret, entity e_target)
     string sdt,sat,smt,spt;
 
     sd = ftos(d_score);
-    d_score *= e_turret.target_select_rangebias;
+    d_score *= _turret.target_select_rangebias;
     sdt = ftos(d_score);
 
     //sv = ftos(v_score);
-    //v_score *= e_turret.target_select_samebias;
+    //v_score *= _turret.target_select_samebias;
     //svt = ftos(v_score);
 
     sa = ftos(a_score);
-    a_score *= e_turret.target_select_anglebias;
+    a_score *= _turret.target_select_anglebias;
     sat = ftos(a_score);
 
     sm = ftos(m_score);
-    m_score *= e_turret.target_select_missilebias;
+    m_score *= _turret.target_select_missilebias;
     smt = ftos(m_score);
 
     sp = ftos(p_score);
-    p_score *= e_turret.target_select_playerbias;
+    p_score *= _turret.target_select_playerbias;
     spt = ftos(p_score);
 
 
     ss = ftos(score);
-    bprint("^3Target scores^7 \[  ",e_turret.netname, "  \] ^3for^7 \[  ", e_target.netname,"  \]\n");
+    bprint("^3Target scores^7 \[  ",_turret.netname, "  \] ^3for^7 \[  ", _target.netname,"  \]\n");
     bprint("^5Range:\[  ",sd,  "  \]^2+bias:\[  ",sdt,"  \]\n");
     bprint("^5Angle:\[  ",sa,  "  \]^2+bias:\[  ",sat,"  \]\n");
     bprint("^5Missile:\[  ",sm,"  \]^2+bias:\[  ",smt,"  \]\n");
@@ -139,29 +102,29 @@ float turret_stdproc_targetscore_generic(entity e_turret, entity e_target)
 }
 
 /*
-float turret_stdproc_targetscore_close(entity e_turret,entity e_target)
+float turret_stdproc_targetscore_close(entity _turret,entity _target)
 {
-    return 1 - (tvt_dist / e_turret.target_range);
+    return 1 - (tvt_dist / _turret.target_range);
 }
 
-float turret_stdproc_targetscore_far (entity e_turret,entity e_target)
+float turret_stdproc_targetscore_far (entity _turret,entity _target)
 {
-    return  tvt_dist / e_turret.target_range;
+    return  tvt_dist / _turret.target_range;
 }
 
-float turret_stdproc_targetscore_optimal(entity e_turret,entity e_target)
+float turret_stdproc_targetscore_optimal(entity _turret,entity _target)
 {
-    return  min(e_turret.target_range_optimal,tvt_dist) / max(e_turret.target_range_optimal,tvt_dist);
+    return  min(_turret.target_range_optimal,tvt_dist) / max(_turret.target_range_optimal,tvt_dist);
 }
 
-float turret_stdproc_score_angular(entity e_turret,entity e_target)
+float turret_stdproc_score_angular(entity _turret,entity _target)
 {
-    return 1 - (tvt_thadf / e_turret.aim_maxrot);
+    return 1 - (tvt_thadf / _turret.aim_maxrot);
 }
 
-float turret_stdproc_targetscore_defend(entity e_turret,entity e_target)
+float turret_stdproc_targetscore_defend(entity _turret,entity _target)
 {
     return 0;
-    //min(e_target.origin,e_turret.tur_defend.origin) / max(e_target.origin,e_turret.tur_defend.origin);
+    //min(_target.origin,_turret.tur_defend.origin) / max(_target.origin,_turret.tur_defend.origin);
 }
 */
index 8a581ea39995a28d02fb5a30671317c5bf718d1f..481b4a285d4d3f5816ab37d01cd24db31652d364 100644 (file)
@@ -33,6 +33,15 @@ void turret_checkpoint_use()
 {
 }
 
+#if 0
+void turret_checkpoint_think()
+{
+    if(self.enemy)
+        te_lightning1(self,self.origin, self.enemy.origin);
+    
+    self.nextthink = time + 0.25;
+}
+#endif
 /*QUAKED turret_checkpoint (1 0 1) (-32 -32 -32) (32 32 32)
 -----------KEYS------------
 target: .targetname of next waypoint in chain.
@@ -42,24 +51,28 @@ wait:   Pause at this point # seconds.
 If a loop is of targets are formed, any unit entering this loop will patrol it indefinitly.
 If the checkpoint chain in not looped, the unit will go "Roaming" when the last point is reached.
 */
+//float tc_acum;
 void turret_checkpoint_init()
 {
-    traceline(self.origin, self.origin - '0 0 1024', MOVE_WORLDONLY, self);
-    setorigin(self,trace_endpos + '0 0 8');
+    traceline(self.origin + '0 0 16', self.origin - '0 0 1024', MOVE_WORLDONLY, self);
+    setorigin(self, trace_endpos + '0 0 32');
 
     if(self.target != "")
     {
-        self.enemy = find(world,targetname,self.target);
+        self.enemy = find(world, targetname, self.target);
         if(self.enemy == world)
             dprint("A turret_checkpoint faild to find its target!\n");
     }
+    //self.think = turret_checkpoint_think;
+    //self.nextthink = time + tc_acum + 0.25;
+    //tc_acum += 0.25;
 }
 
 void spawnfunc_turret_checkpoint()
 {
     setorigin(self,self.origin);
     self.think = turret_checkpoint_init;
-    self.nextthink = time + 0.1;
+    self.nextthink = time + 0.2;    
 }
 
 // Compat.
index 02c0ffa6016291288e71014f89b9dd53574f9c57..86f5c44021ba6f987c8333e7fa5f3d456b82f8a4 100644 (file)
@@ -4,36 +4,17 @@
 #define ewheel_amin_bck_slow 3
 #define ewheel_amin_bck_fast 4
 
-float ewheel_speed_fast;
-float ewheel_speed_slow;
-float ewheel_speed_slower;
-float ewheel_speed_stop;
-
-void turret_ewheel_loadcvars()
-{
-    ewheel_speed_fast   = autocvar_g_turrets_unit_ewheel_speed_fast;
-    ewheel_speed_slow   = autocvar_g_turrets_unit_ewheel_speed_slow;
-    ewheel_speed_slower = autocvar_g_turrets_unit_ewheel_speed_slower;
-    ewheel_speed_stop   = autocvar_g_turrets_unit_ewheel_speed_stop;
-}
-
 void turret_ewheel_projectile_explode()
 {
-    vector org2;
-
-    org2 = findbetterlocation (self.origin, 8);
-    pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1);
-    //w_deathtypestring = "saw the eweel. to late.";
 #ifdef TURRET_DEBUG
     float d;
 
-    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_EWHEEL, world);
     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d;
     self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
 #else
-    RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_EWHEEL, world);
 #endif
-    sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
 
     remove (self);
 }
@@ -48,7 +29,7 @@ void ewheel_attack()
     {
         turret_do_updates(self);
 
-        sound (self, CHAN_WEAPON, "weapons/lasergun_fire.wav", VOL_BASE, ATTN_NORM);
+        sound (self, CH_WEAPON_A, "weapons/lasergun_fire.wav", VOL_BASE, ATTN_NORM);
         pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
 
         proj                    = spawn ();
@@ -76,10 +57,10 @@ void ewheel_attack()
     }
 
 }
-
+//#define EWHEEL_FANCYPATH
 void ewheel_move_path()
 {
-
+#ifdef EWHEEL_FANCYPATH
     // Are we close enougth to a path node to switch to the next?
     if (vlen(self.origin  - self.pathcurrent.origin) < 64)
         if (self.pathcurrent.path_next == world)
@@ -105,7 +86,10 @@ void ewheel_move_path()
         else
             self.pathcurrent = self.pathcurrent.path_next;
 
-
+#else
+    if (vlen(self.origin - self.pathcurrent.origin) < 64)    
+        self.pathcurrent = self.pathcurrent.enemy;
+#endif
 
     if (self.pathcurrent)
     {
@@ -113,15 +97,15 @@ void ewheel_move_path()
         self.moveto = self.pathcurrent.origin;
         self.steerto = steerlib_attract2(self.moveto, 0.5, 500, 0.95);
 
-        movelib_move_simple(v_forward, ewheel_speed_fast, 0.4);
-
-        return;
+        movelib_move_simple(v_forward, autocvar_g_turrets_unit_ewheel_speed_fast, 0.4);
     }
 }
 
 void  ewheel_move_enemy()
 {
 
+    float newframe;
+    
     self.steerto = steerlib_arrive(self.enemy.origin,self.target_range_optimal);
 
     //self.steerto = steerlib_standoff(self.enemy.origin,self.target_range_optimal);
@@ -132,75 +116,75 @@ void  ewheel_move_enemy()
     {
         if ( self.tur_head.spawnshieldtime < 1 )
         {
-            self.frame = ewheel_amin_fwd_fast;
-            movelib_move_simple(v_forward, ewheel_speed_fast, 0.4);
+            newframe = ewheel_amin_fwd_fast;
+            movelib_move_simple(v_forward, autocvar_g_turrets_unit_ewheel_speed_fast, 0.4);
         }
         else if (self.tur_head.spawnshieldtime < 2)
         {
 
-            self.frame = ewheel_amin_fwd_slow;
-            movelib_move_simple(v_forward, ewheel_speed_slow, 0.4);
+            newframe = ewheel_amin_fwd_slow;
+            movelib_move_simple(v_forward, autocvar_g_turrets_unit_ewheel_speed_slow, 0.4);
        }
         else
         {
-            self.frame = ewheel_amin_fwd_slow;
-            movelib_move_simple(v_forward, ewheel_speed_slower, 0.4);
+            newframe = ewheel_amin_fwd_slow;
+            movelib_move_simple(v_forward, autocvar_g_turrets_unit_ewheel_speed_slower, 0.4);
         }
     }
     else if (self.tur_dist_enemy < self.target_range_optimal * 0.5)
     {
-        self.frame = ewheel_amin_bck_slow;
-        movelib_move_simple(v_forward * -1, ewheel_speed_slow, 0.4);
+        newframe = ewheel_amin_bck_slow;
+        movelib_move_simple(v_forward * -1, autocvar_g_turrets_unit_ewheel_speed_slow, 0.4);
     }
     else
     {
-        self.frame = ewheel_amin_stop;
-        movelib_beak_simple(ewheel_speed_stop);
+        newframe = ewheel_amin_stop;
+        movelib_beak_simple(autocvar_g_turrets_unit_ewheel_speed_stop);
+    }
+    
+    if(self.frame != newframe)
+    {
+        self.frame = newframe;
+        self.SendFlags |= TNSF_ANIM;
+        self.anim_start_time = time;
     }
 }
 
 
 void ewheel_move_idle()
 {
+    if(self.frame != 0)
+    {
+        self.SendFlags |= TNSF_ANIM;
+        self.anim_start_time = time;
+    }
+
     self.frame = 0;
     if (vlen(self.velocity))
-        movelib_beak_simple(ewheel_speed_stop);
+        movelib_beak_simple(autocvar_g_turrets_unit_ewheel_speed_stop);
 }
 
 void ewheel_postthink()
 {
     float vz;
-    vector wish_angle,real_angle;
-
-    /*
-    if(self.enemy)
-        dprint("enemy!\n");
-    else
-        dprint("nothign =(!\n");
-    */
+    vector wish_angle, real_angle;
 
     vz = self.velocity_z;
 
     self.angles_x = anglemods(self.angles_x);
     self.angles_y = anglemods(self.angles_y);
 
-    //self.angles_x *= -1;
     fixedmakevectors(self.angles);
-    //self.angles_x *= -1;
 
     wish_angle = normalize(self.steerto);
     wish_angle = vectoangles(wish_angle);
     real_angle = wish_angle - self.angles;
-    real_angle = shortangle_vxy(real_angle,self.tur_head.angles);
+    real_angle = shortangle_vxy(real_angle, self.tur_head.angles);
 
     self.tur_head.spawnshieldtime = fabs(real_angle_y);
-    real_angle_y  = bound(-self.tur_head.aim_speed,real_angle_y,self.tur_head.aim_speed);
+    real_angle_y  = bound(-self.tur_head.aim_speed, real_angle_y, self.tur_head.aim_speed);
     self.angles_y = (self.angles_y + real_angle_y);
 
-    // Simulate banking
-    self.angles_z -= self.angles_z * frametime * 2;
-    self.angles_z = bound(-45,self.angles_z  + ((real_angle_y * -25) * frametime),45);
-
     if(self.enemy)
         ewheel_move_enemy();
     else if(self.pathcurrent)
@@ -210,6 +194,9 @@ void ewheel_postthink()
 
 
     self.velocity_z = vz;
+    
+    if(vlen(self.velocity))
+        self.SendFlags |= TNSF_MOVE;
 }
 
 void ewheel_respawnhook()
@@ -217,7 +204,7 @@ void ewheel_respawnhook()
     entity e;
 
     // Respawn is called & first spawn to, to set team. need to make sure we do not move the initial spawn.
-    if(self.movetype  != MOVETYPE_WALK)
+    if(self.movetype != MOVETYPE_WALK)
                return;
                
     self.velocity = '0 0 0';
@@ -238,8 +225,13 @@ void ewheel_respawnhook()
             dprint("Warning: not a turrret path\n");
         else
         {
+
+#ifdef EWHEEL_FANCYPATH
             self.pathcurrent = WALKER_PATH(self.origin,e.origin);
             self.pathgoal = e;
+#else
+            self.pathcurrent  = e;
+#endif
         }
     }
 }
@@ -248,11 +240,10 @@ void ewheel_diehook()
 {
     self.velocity = '0 0 0';
 
-    turret_trowgib2(self.origin, self.velocity + '0 0 400', '-0.6 -0.2 -02', self, 3 + time + random() * 2);
-
+#ifdef EWHEEL_FANCYPATH
     if (self.pathcurrent)
         pathlib_deletepath(self.pathcurrent.owner);
-
+#endif
     self.pathcurrent = world;
 }
 
@@ -260,7 +251,8 @@ void turret_ewheel_dinit()
 {
     entity e;
 
-    if (self.netname == "")      self.netname     = "eWheel Turret";
+    if (self.netname == "")      
+        self.netname     = "eWheel Turret";
 
     if (self.target != "")
     {
@@ -283,16 +275,15 @@ void turret_ewheel_dinit()
 
     self.turret_diehook = ewheel_diehook;
 
-    if (turret_stdproc_init("ewheel_std",0,"models/turrets/ewheel-base2.md3","models/turrets/ewheel-gun1.md3") == 0)
+    if (turret_stdproc_init("ewheel_std", "models/turrets/ewheel-base2.md3", "models/turrets/ewheel-gun1.md3", TID_EWHEEL) == 0)
     {
         remove(self);
         return;
     }
 
     self.target_select_flags   = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
-    self.target_select_flags   = TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
-    self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;// | TFL_TARGETSELECT_LOS;
-    self.target_validate_flags = TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;// | TFL_TARGETSELECT_LOS;
+    self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
+
     self.damage_flags          |= TFL_DMG_DEATH_NOGIBS;
 
     self.iscreature = TRUE;
@@ -314,9 +305,6 @@ void turret_ewheel_dinit()
     self.tur_head.aim_speed = autocvar_g_turrets_unit_ewheel_turnrate;
     self.tur_head.aim_speed = self.tur_head.aim_speed / (1 / self.ticrate);
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     //setorigin(self,self.origin + '0 0 128');
     if (self.target != "")
     {
@@ -331,8 +319,12 @@ void turret_ewheel_dinit()
             dprint("Warning: not a turrret path\n");
         else
         {
+#ifdef EWHEEL_FANCYPATH
             self.pathcurrent = WALKER_PATH(self.origin, e.origin);
             self.pathgoal = e;
+#else
+            self.pathcurrent = e;
+#endif
         }
     }
 }
@@ -344,12 +336,6 @@ void spawnfunc_turret_ewheel()
     precache_model ("models/turrets/ewheel-base2.md3");
     precache_model ("models/turrets/ewheel-gun1.md3");
 
-    precache_model ("models/pathlib/goodsquare.md3");
-    precache_model ("models/pathlib/badsquare.md3");
-    precache_model ("models/pathlib/square.md3");
-
-    turret_ewheel_loadcvars();
-
     self.think = turret_ewheel_dinit;
     self.nextthink = time + 0.5;
 }
index 0c874fb504d99f5d14534a6978b9a7bb9b975448..e5360d88776a497533532b67af277d91dfbcf90a 100644 (file)
@@ -9,7 +9,7 @@ void turret_flac_attack()
 
     turret_tag_fire_update();
 
-    sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
+    sound (self, CH_WEAPON_A, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
     proj = spawn ();
     setorigin(proj, self.tur_shotorg);
     setsize(proj, '0 0 0', '0 0 0');
@@ -38,43 +38,21 @@ void turret_flac_attack()
 
 void turret_flac_projectile_explode()
 {
-    float ftmp;
-
-    // FIXME: tur_impacttime is not accurate enougth, this is a dirty hakk to make flac work.
-
-    //w_deathtypestring = "got caught in the flack.";
-
-
-
     if( (self.enemy != world) &&
         (vlen(self.origin - self.enemy.origin) < self.owner.shot_radius * 3) )
     {
         // OMG HAXX!
         setorigin(self,self.enemy.origin + randomvec() * self.owner.shot_radius);
     }
-
-
-
-    te_explosion (self.origin);
-
-    ftmp = crandom();
-    if (ftmp<-0.7)
-        sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
-    else if (ftmp<0.4)
-        sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
-    else if (ftmp<1)
-        sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
-
-
     self.event_damage = SUB_Null;
 
-
 #ifdef TURRET_DEBUG
-    ftmp = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    float ftmp;
+    ftmp = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_FLAC, world);
     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + ftmp; //self.owner.shot_dmg;
     self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
 #else
-    RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_FLAC, world);
 #endif
 
     remove (self);
@@ -89,7 +67,7 @@ void turret_flac_dinit()
     self.ammo_flags     = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
     self.aim_flags      = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE;
 
-    if (turret_stdproc_init("flac_std",0,"models/turrets/base.md3","models/turrets/flac.md3") == 0)
+    if (turret_stdproc_init("flac_std", "models/turrets/base.md3", "models/turrets/flac.md3", TID_FLAC) == 0)
     {
         remove(self);
         return;
@@ -99,8 +77,6 @@ void turret_flac_dinit()
     self.damage_flags |= TFL_DMG_HEADSHAKE;
     self.target_select_flags |= TFL_TARGETSELECT_NOTURRETS | TFL_TARGETSELECT_MISSILESONLY;
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
 
     // Our fire routine
     self.turret_firefunc  = turret_flac_attack;
index 03b0c40ad91cc49b873ee48344a18c250d6eeb0a..e499a29c617e80f4851f82e047fdc4c2c5bdc6db 100644 (file)
@@ -68,7 +68,7 @@ void turret_fusionreactor_dinit()
     self.track_flags         = TFL_TRACK_NO;
     // self.turret_respawnhook  = turret_fusionreactor_respawnhook;
 
-    if (turret_stdproc_init("fusreac_std",0,"models/turrets/base.md3","models/turrets/reactor.md3") == 0)
+    if (turret_stdproc_init("fusreac_std", "models/turrets/base.md3", "models/turrets/reactor.md3", TID_FUSION) == 0)
     {
         remove(self);
         return;
index 1e2890f6ea6c9bce6d1653bd1b5989d9c4b5c8b4..84f8e90028aee2881264b0a74b8e23ec03882b1e 100644 (file)
@@ -32,7 +32,7 @@ void turret_hellion_attack()
        else
                self.tur_shotorg = gettaginfo(self.tur_head, gettagindex(self.tur_head, "tag_fire2"));
     
-    sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
+    sound (self, CH_WEAPON_A, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
 
     missile = spawn ();
     setorigin(missile, self.tur_shotorg);
@@ -135,7 +135,6 @@ void turret_hellion_missile_think()
 
 void turret_hellion_missile_explode()
 {
-    vector org2;
     float d;
 
     if(self.event_damage != SUB_Null)
@@ -146,19 +145,8 @@ void turret_hellion_missile_explode()
         return;
     }
 
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    org2 = findbetterlocation (self.origin, 16);
-
-    // LordHavoc: TE_TEI_BIGEXPLOSION
-    WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
-    WriteByte (MSG_BROADCAST, 78);
-    WriteCoord (MSG_BROADCAST, org2_x);
-    WriteCoord (MSG_BROADCAST, org2_y);
-    WriteCoord (MSG_BROADCAST, org2_z);
-
-    //w_deathtypestring = "could not dodge the twin missiles.";
     self.event_damage = SUB_Null;
-    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_HELLION, world);
 
 #ifdef TURRET_DEBUG
     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
@@ -188,15 +176,12 @@ void turret_hellion_dinit()
     self.firecheck_flags = TFL_FIRECHECK_WORLD | TFL_FIRECHECK_DEAD | TFL_FIRECHECK_DISTANCES | TFL_FIRECHECK_TEAMCECK | TFL_FIRECHECK_REFIRE | TFL_FIRECHECK_AFF | TFL_FIRECHECK_OWM_AMMO;
     self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
 
-    if (turret_stdproc_init("hellion_std",0,"models/turrets/base.md3","models/turrets/hellion.md3") == 0)
+    if (turret_stdproc_init("hellion_std", "models/turrets/base.md3", "models/turrets/hellion.md3", TID_HELLION) == 0)
     {
         remove(self);
         return;
     }
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     self.turret_firefunc  = turret_hellion_attack;
     self.turret_postthink = turret_hellion_postthink;
 }
index 2b8e0f6a38089da861aa43ef9c2f1524a0163cd4..5ad222fa09c93ffbee62968df451a2864f6db7b2 100644 (file)
@@ -85,7 +85,7 @@ void turret_hk_attack()
     local entity missile;
     //local entity flash2;
 
-    sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
+    sound (self, CH_WEAPON_A, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
 
     missile                    = spawn ();
     missile.solid            = SOLID_BBOX;
@@ -283,7 +283,6 @@ void turret_hk_missile_think()
         self.cnt = time + 0.25;
         self.nextthink = 0;
         self.movetype         = MOVETYPE_BOUNCE;
-        sound    (self, CHAN_VOICE, "", 0.4 * VOL_BASE, ATTN_NORM);
         return;
     }
 
@@ -324,7 +323,6 @@ void turret_hk_missile_think()
 
 void turret_hk_missile_explode()
 {
-    vector org2;
     float d;
 
     if(self.event_damage != SUB_Null)
@@ -338,20 +336,8 @@ void turret_hk_missile_explode()
     if ((other == self.owner)||(other == self.owner.tur_head))
         return;
 
-    //w_deathtypestring = "got hunted to extinction";
-    //vector   org2;
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    org2 = findbetterlocation (self.origin, 16);
-
-    // LordHavoc: TE_TEI_BIGEXPLOSION
-    WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
-    WriteByte (MSG_BROADCAST, 78);
-    WriteCoord (MSG_BROADCAST, org2_x);
-    WriteCoord (MSG_BROADCAST, org2_y);
-    WriteCoord (MSG_BROADCAST, org2_z);
-
     self.event_damage = SUB_Null;
-    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_HK, world);
 
 #ifdef TURRET_DEBUG
     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
@@ -408,7 +394,7 @@ void turret_hk_dinit()
 
     self.shoot_flags = TFL_SHOOT_CLEARTARGET;
 
-    if (turret_stdproc_init("hk_std",0,"models/turrets/base.md3","models/turrets/hk.md3") == 0)
+    if (turret_stdproc_init("hk_std", "models/turrets/base.md3", "models/turrets/hk.md3", TID_HK) == 0)
     {
         remove(self);
         return;
@@ -416,10 +402,6 @@ void turret_hk_dinit()
 
     self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_TEAMCHECK;
 
-
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     // Our fire routine
     self.turret_firefunc  = turret_hk_attack;
 
index f6426fce25efdab96a268ee0f6b1a513db1bd7ae..f96d3b93cc79911ba5e7036da81f49a92858f6ec 100644 (file)
@@ -5,13 +5,9 @@ void turret_machinegun_attack();
 //.float bulletcounter;
 void turret_machinegun_attack()
 {
-    sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
-    fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, autocvar_g_balance_uzi_bulletconstant);
+    fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET_MACHINEGUN, 0, 1, autocvar_g_balance_uzi_bulletconstant);
     endFireBallisticBullet();
 
-    //w_deathtypestring = "had an alergic reaction due to 10 kilos of led";
-    te_smallflash(self.tur_shotorg);
-
     UziFlash();
     setattachment(self.muzzle_flash, self.tur_head, "tag_fire");
 }
@@ -28,7 +24,7 @@ void turret_machinegun_std_init()
        if not (autocvar_g_antilag_bullets)
                self.turrcaps_flags |= TFL_TURRCAPS_HITSCAN;
 
-    if (turret_stdproc_init("machinegun_std",0,"models/turrets/base.md3","models/turrets/machinegun.md3") == 0)
+    if (turret_stdproc_init("machinegun_std", "models/turrets/base.md3", "models/turrets/machinegun.md3", TID_MACHINEGUN) == 0)
     {
         remove(self);
         return;
@@ -36,9 +32,6 @@ void turret_machinegun_std_init()
 
     self.damage_flags |= TFL_DMG_HEADSHAKE;
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     // Our fire routine
     self.turret_firefunc  = turret_machinegun_attack;
 
index 499d6de2352c15c55d591d762cca0d40eb1f32f1..990385fda221c544d7376e31252a88638589a711 100644 (file)
@@ -22,7 +22,7 @@ void turret_mlrs_attack()
 
     turret_tag_fire_update();
 
-    sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
+    sound (self, CH_WEAPON_A, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
 
     missile                    = spawn ();
     setsize (missile, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
@@ -61,7 +61,6 @@ void turret_mlrs_rocket_touch()
 
 void turret_mlrs_rocket_explode()
 {
-    vector org2;
 
     if(self.event_damage != SUB_Null)
     {
@@ -71,19 +70,14 @@ void turret_mlrs_rocket_explode()
         return;
     }
 
-
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    org2 = findbetterlocation (self.origin, 16);
-    pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
-    //w_deathtypestring = "dident escape the rocket barrage";
 #ifdef TURRET_DEBUG
     float d;
 
-    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_MLRS, world);
     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
     self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
 #else
-    RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_MLRS, world);
 #endif
 
     // Target dead, Tell turret.
@@ -101,7 +95,7 @@ void turret_mlrs_dinit()
     self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
     self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE;// | TFL_AIM_GROUND2;
 
-    if (turret_stdproc_init("mlrs_std",0,"models/turrets/base.md3","models/turrets/mlrs.md3") == 0)
+    if (turret_stdproc_init("mlrs_std", "models/turrets/base.md3", "models/turrets/mlrs.md3", TID_MLRS) == 0)
     {
         remove(self);
         return;
@@ -111,9 +105,6 @@ void turret_mlrs_dinit()
     self.shoot_flags  |= TFL_SHOOT_VOLLYALWAYS;
     self.volly_counter = self.shot_volly;
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     // Our fire routine
     self.turret_firefunc  = turret_mlrs_attack;
     self.turret_postthink = turret_mlrs_postthink;
index 9c5ca071d8d5ce8489f233986ba62fe6577a2684..91794929b67d16a0659f62ae01bde75a5ca66066 100644 (file)
@@ -40,7 +40,7 @@ void beam_think()
         self.owner.attack_finished_single = time + self.owner.shot_refire;
         self.owner.fireflag = 2;
         self.owner.tur_head.frame = 10;
-        sound (self, CHAN_PROJECTILE, "", VOL_BASE, ATTN_NORM);
+        sound (self, CH_SHOTS_SINGLE, "misc/null.wav", VOL_BASE, ATTN_NORM);
         remove(self);
         return;
     }
@@ -50,7 +50,7 @@ void beam_think()
     if (time - self.shot_spread > 0)
     {
         self.shot_spread = time + 2;
-        sound (self, CHAN_VOICE, "turrets/phaser.wav", VOL_BASE, ATTN_NORM);
+        sound (self, CH_SHOTS_SINGLE, "turrets/phaser.wav", VOL_BASE, ATTN_NORM);
     }
 
 
@@ -68,7 +68,7 @@ void beam_think()
                     self.shot_force,
                     oldself.shot_dmg,
                     0.75,
-                    DEATH_TURRET);
+                    DEATH_TURRET_PHASER);
     self = oldself;
     self.scale = vlen(self.owner.tur_shotorg - trace_endpos) / 256;
 
@@ -94,7 +94,7 @@ void turret_phaser_attack()
     beam.enemy = self.enemy;
     beam.bot_dodge = TRUE;
     beam.bot_dodgerating = beam.shot_dmg;
-    sound (beam, CHAN_PROJECTILE, "turrets/phaser.wav", VOL_BASE, ATTN_NORM);
+    sound (beam, CH_SHOTS_SINGLE, "turrets/phaser.wav", VOL_BASE, ATTN_NORM);
     self.fireflag = 1;
 
     beam.attack_finished_single = self.attack_finished_single;
@@ -102,7 +102,7 @@ void turret_phaser_attack()
 
     setattachment(beam,self.tur_head,"tag_fire");
 
-    soundat (self, trace_endpos, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
+    soundat (self, trace_endpos, CH_SHOTS, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
 
     if (self.tur_head.frame == 0)
         self.tur_head.frame = 1;
@@ -116,15 +116,12 @@ void turret_phaser_dinit()
     self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
     self.aim_flags = TFL_AIM_LEAD;
 
-    if (turret_stdproc_init("phaser_std",0,"models/turrets/base.md3","models/turrets/phaser.md3") == 0)
+    if (turret_stdproc_init("phaser_std", "models/turrets/base.md3","models/turrets/phaser.md3", TID_PHASER) == 0)
     {
         remove(self);
         return;
     }
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     self.turret_firecheckfunc = turret_phaser_firecheck;
     self.turret_firefunc  = turret_phaser_attack;
     self.turret_postthink = turret_phaser_postthink;
index 63466084a54d88a1bda1ef292bcb3f24f1a4dc8f..7867310329452f9f3fca928caa3cb760d7a25628 100644 (file)
@@ -29,7 +29,7 @@ void turret_plasma_attack()
 {
     entity proj;
 
-    sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
+    sound (self, CH_WEAPON_A, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
     pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
 
     proj                    = spawn ();
@@ -59,7 +59,7 @@ void turret_plasma_dual_attack()
 {
     entity proj;
 
-    sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
+    sound (self, CH_WEAPON_A, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
     proj                    = spawn ();
     setorigin(proj, self.tur_shotorg);
     setsize(proj, '0 0 0', '0 0 0');
@@ -84,31 +84,17 @@ void turret_plasma_dual_attack()
 
 void turret_plasma_projectile_explode()
 {
-    vector org2;
-
-    org2 = findbetterlocation (self.origin, 8);
-    WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
-    WriteByte (MSG_BROADCAST, 79);
-    WriteCoord (MSG_BROADCAST, org2_x);
-    WriteCoord (MSG_BROADCAST, org2_y);
-    WriteCoord (MSG_BROADCAST, org2_z);
-    WriteCoord (MSG_BROADCAST, 0);             // SeienAbunae: groan... Useless clutter
-    WriteCoord (MSG_BROADCAST, 0);
-    WriteCoord (MSG_BROADCAST, 0);
-    WriteByte (MSG_BROADCAST, 155);
-
     self.event_damage = SUB_Null;
     //w_deathtypestring = "ate to much plasma";
 #ifdef TURRET_DEBUG
     float d;
 
-    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_PLASMA, world);
     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
     self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
 #else
-    RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_PLASMA, world);
 #endif
-    sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
 
     remove (self);
 }
@@ -124,7 +110,7 @@ void turret_plasma_std_init()
     self.aim_flags      = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_GROUND2;
     self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_MEDPROJ | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MISSILEKILL;
 
-    if (turret_stdproc_init("plasma_std",FALSE,"models/turrets/base.md3","models/turrets/plasma.md3") == 0)
+    if (turret_stdproc_init("plasma_std", "models/turrets/base.md3", "models/turrets/plasma.md3", TID_PLASMA) == 0)
     {
         remove(self);
         return;
@@ -133,9 +119,6 @@ void turret_plasma_std_init()
     self.damage_flags    |= TFL_DMG_HEADSHAKE;
     self.firecheck_flags |= TFL_FIRECHECK_AFF;
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     // Our fireing routine
     self.turret_firefunc  = turret_plasma_attack;
 
@@ -156,7 +139,7 @@ void turret_plasma_dual_init()
     self.aim_flags      = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE  | TFL_AIM_GROUND2 ;
     self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_MEDPROJ | TFL_TURRCAPS_PLAYERKILL;
 
-    if (turret_stdproc_init("plasma_dual",0,"models/turrets/base.md3","models/turrets/plasmad.md3") == 0)
+    if (turret_stdproc_init("plasma_dual", "models/turrets/base.md3", "models/turrets/plasmad.md3", TID_PLASMA_DUAL) == 0)
     {
         remove(self);
         return;
@@ -165,9 +148,6 @@ void turret_plasma_dual_init()
     self.damage_flags    |= TFL_DMG_HEADSHAKE;
     self.firecheck_flags |= TFL_FIRECHECK_AFF;
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     // Our fireing routine
     self.turret_firefunc  = turret_plasma_dual_attack;
 
index 443cd8b5626ef15645bdb0beb8c76c6811979dae..23c34dc5db023f6499b5f493690589c52f793ba2 100644 (file)
@@ -35,11 +35,9 @@ entity toast(entity from, float range, float damage)
     }
 
     if (etarget)
-    {
-        te_smallflash(etarget.origin);
+    {        
         te_csqc_lightningarc(from.origin,etarget.origin);
-        dprint("DMG:",ftos(damage),"\n");
-        Damage(etarget, self, self, damage, DEATH_TURRET, etarget.origin, '0 0 0');
+        Damage(etarget, self, self, damage, DEATH_TURRET_TESLA, etarget.origin, '0 0 0');
         etarget.railgunhit = 1;
     }
 
@@ -145,7 +143,7 @@ void turret_tesla_dinit()
     self.aim_flags           = TFL_AIM_NO;
     self.track_flags         = TFL_TRACK_NO;
 
-    if (turret_stdproc_init("tesla_std",0,"models/turrets/tesla_base.md3","models/turrets/tesla_head.md3") == 0)
+    if (turret_stdproc_init("tesla_std", "models/turrets/tesla_base.md3", "models/turrets/tesla_head.md3", TID_TESLA) == 0)
     {
         remove(self);
         return;
@@ -155,9 +153,6 @@ void turret_tesla_dinit()
     self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
                                  TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     self.turret_firefunc      = turret_tesla_fire;
     self.turret_postthink     = turret_tesla_postthink;
     self.turret_firecheckfunc = turret_tesla_firecheck;
index d1d48c46cdb82b4f5d90746ea7ab8c5d42afe041..a438229cf5df53d264e077bebec549fa0c4970fc 100644 (file)
 #define ANIM_MEELE      9
 #define ANIM_SWIM       10
 #define ANIM_ROAM       11
-
 .float animflag;
-.entity wkr_spawn;
 
 #define WALKER_MIN '-70 -70 0'
 #define WALKER_MAX '70 70 95'
 
 #define WALKER_PATH(s,e) pathlib_astar(s,e)
 
-float walker_meele_dmg;
-float walker_meele_force;
-
-float walker_speed_stop;
-float walker_speed_walk;
-float walker_speed_run;
-float walker_speed_jump;
-float walker_speed_roam;
-float walker_speed_swim;
-
-float walker_std_rocket_dmg;
-float walker_std_rocket_radius;
-float walker_std_rocket_force;
-float walker_std_rocket_speed;
-float walker_std_rocket_turnrate;
-
-void walker_loadcvars()
-{
-    walker_meele_dmg    = autocvar_g_turrets_unit_walker_std_meele_dmg;
-    walker_meele_force  = autocvar_g_turrets_unit_walker_std_meele_force;
-
-    walker_speed_stop   = autocvar_g_turrets_unit_walker_speed_stop;
-    walker_speed_walk   = autocvar_g_turrets_unit_walker_speed_walk;
-    walker_speed_run    = autocvar_g_turrets_unit_walker_speed_run;
-    walker_speed_jump   = autocvar_g_turrets_unit_walker_speed_jump;
-    walker_speed_roam   = autocvar_g_turrets_unit_walker_speed_roam;
-    walker_speed_swim   = autocvar_g_turrets_unit_walker_speed_swim;
-
-    walker_std_rocket_dmg       = autocvar_g_turrets_unit_walker_std_rocket_dmg;
-    walker_std_rocket_radius    = autocvar_g_turrets_unit_walker_std_rocket_radius;
-    walker_std_rocket_force     = autocvar_g_turrets_unit_walker_std_rocket_force;
-    walker_std_rocket_speed     = autocvar_g_turrets_unit_walker_std_rocket_speed;
-    walker_std_rocket_turnrate  = autocvar_g_turrets_unit_walker_std_rocket_turnrate;
-
-}
-
-
-
 float walker_firecheck()
 {
     if (self.animflag == ANIM_MEELE)
@@ -69,157 +29,28 @@ void walker_meele_do_dmg()
 {
     vector where;
     entity e;
+    
     makevectors(self.angles);
     where = self.origin + v_forward * 128;
 
-    //w_deathtypestring = "tried to hug the cute spider thingy.";
     e = findradius(where,32);
-    while (e)
+    while (e) 
     {
         if (turret_validate_target(self,e,self.target_validate_flags))
             if (e != self && e.owner != self)
-                Damage(e, self, self, walker_meele_dmg ,DEATH_TURRET,'0 0 0', v_forward * walker_meele_force);
+                Damage(e, self, self, autocvar_g_turrets_unit_walker_std_meele_dmg ,DEATH_TURRET_WALKER_MEELE,'0 0 0', v_forward * autocvar_g_turrets_unit_walker_std_meele_force);
 
         e = e.chain;
     }
 }
-void walker_setnoanim()
-{
-    self.frame = ANIM_NO;
-    self.animflag = self.owner.frame;
-    dprint("walker_setnoanim\n");
-
-}
 
-void walker_dly_meele_do_dmg()
+void walker_setnoanim()
 {
-    walker_meele_do_dmg();
-    dprint("walker_dly_meele_do_dmg\n");
-
+    turrets_setframe(ANIM_NO, FALSE);
+    self.animflag = self.frame;
 }
-
-void walker_animate()
-{
-    vector real_angle;
-    float  vz;
-
-    real_angle = vectoangles(self.steerto) - self.angles;
-    vz         = self.velocity_z;
-
-    if (self.tur_head.frame != 0)
-        self.tur_head.frame = self.tur_head.frame +1;
-
-    if (self.tur_head.frame > 12)
-        self.tur_head.frame = 0;
-
-    switch (self.animflag)
-    {
-
-    case ANIM_NO:
-        self.frame = 0;
-        movelib_beak_simple(walker_speed_stop);
-        break;
-
-    /*
-    case ANIM_REVERSE:
-        if ((self.frame < 5) || (self.frame > 25))
-            self.frame = 25;
-
-        self.frame = self.frame -1;
-        movelib_move_simple(v_forward * -1, walker_speed_walk, 0.6);
-
-        if (self.frame < 5)
-            self.frame = 25;
-
-        break;
-    */
-
-    case ANIM_TURN:
-        self.frame = ANIM_TURN;
-        self.angles_y += bound(-15, shortangle_f(real_angle_y, self.angles_y), 15);
-        movelib_beak_simple(walker_speed_stop);
-        break;
-
-    case ANIM_WALK:
-        self.frame = ANIM_WALK;
-        self.angles_y += bound(-10, shortangle_f(real_angle_y, self.angles_y), 10);
-        movelib_move_simple(v_forward, walker_speed_walk, 0.6);
-        break;
-
-    case ANIM_RUN:
-        self.frame = ANIM_RUN;
-        self.angles_y += bound(-5, shortangle_f(real_angle_y, self.angles_y), 5);
-        movelib_move_simple(v_forward, walker_speed_run, 0.6);
-        break;
-
-    case ANIM_STRAFE_L:
-        self.frame = ANIM_STRAFE_L;
-        self.angles_y += bound(-2.5, shortangle_f(real_angle_y, self.angles_y), 2.5);
-        movelib_move_simple(v_right * -1, walker_speed_walk, 0.8);
-        break;
-
-    case ANIM_STRAFE_R:
-        self.frame = ANIM_STRAFE_R;
-        self.angles_y += bound(-2.5, shortangle_f(real_angle_y, self.angles_y), 2.5);
-        movelib_move_simple(v_right, walker_speed_walk, 0.8);
-        break;
-
-    case ANIM_JUMP:
-        self.frame = ANIM_JUMP;
-        self.velocity += '0 0 1' * walker_speed_jump;
-        break;
-
-    case ANIM_LAND:
-        self.frame = ANIM_LAND;
-        break;
-
-    case ANIM_PAIN:
-        if(self.frame != ANIM_PAIN)
-            defer(0.25,walker_setnoanim);
-
-        self.frame = ANIM_PAIN;
-
-        break;
-
-    case ANIM_MEELE:
-        if(self.frame != ANIM_MEELE)
-        {
-            defer(0.41, walker_setnoanim);
-            defer(0.21, walker_dly_meele_do_dmg);
-        }
-
-        self.frame = ANIM_MEELE;
-        movelib_beak_simple(walker_speed_stop);
-        break;
-
-    case ANIM_SWIM:
-        self.frame = ANIM_SWIM;
-        self.angles_y += bound(-10, shortangle_f(real_angle_y, self.angles_y), 10);
-        self.angles_x += bound(-10, shortangle_f(real_angle_x, self.angles_x), 10);
-        movelib_move_simple(v_forward, walker_speed_swim, 0.3);
-        vz = self.velocity_z + sin(time * 4) * 8;
-        break;
-
-    case ANIM_ROAM:
-        self.frame = ANIM_ROAM;
-        self.angles_y += bound(-5, shortangle_f(real_angle_y, self.angles_y), 5);
-        movelib_move_simple(v_forward ,walker_speed_roam, 0.5);
-        break;
-
-    }
-
-    self.velocity_z = vz;
-
-    if (self.flags & FL_ONGROUND)
-        movelib_groundalign4point(300, 100, 0.25);
-
-}
-
-
 void walker_rocket_explode()
 {
-    vector org2;
-
     if (self.event_damage != SUB_Null)
     {
         self.event_damage = SUB_Null;
@@ -228,11 +59,7 @@ void walker_rocket_explode()
         return;
     }
 
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    org2 = findbetterlocation (self.origin, 16);
-
-    pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
-    RadiusDamage (self, self.owner, walker_std_rocket_dmg, 0, walker_std_rocket_radius, world,walker_std_rocket_force, DEATH_TURRET, world);
+    RadiusDamage (self, self.owner, autocvar_g_turrets_unit_walker_std_rocket_dmg, 0, autocvar_g_turrets_unit_walker_std_rocket_radius, world,autocvar_g_turrets_unit_walker_std_rocket_force, DEATH_TURRET_WALKER_ROCKET, world);
 
     remove (self);
 }
@@ -245,7 +72,7 @@ void walker_rocket_damage (entity inflictor, entity attacker, float damage, floa
         walker_rocket_explode();
 }
 
-#define WALKER_ROCKET_MOVE movelib_move_simple(newdir, walker_std_rocket_speed, walker_std_rocket_turnrate); UpdateCSQCProjectile(self)
+#define WALKER_ROCKET_MOVE movelib_move_simple(newdir, autocvar_g_turrets_unit_walker_std_rocket_speed, autocvar_g_turrets_unit_walker_std_rocket_turnrate); UpdateCSQCProjectile(self)
 void walker_rocket_loop();
 void walker_rocket_think()
 {
@@ -262,9 +89,9 @@ void walker_rocket_think()
     if (self.cnt < time)
     {
         if (edist < 1000)
-            self.tur_shotorg = randomvec() * min(edist,64);
+            self.tur_shotorg = randomvec() * min(edist, 64);
         else
-            self.tur_shotorg = randomvec() * min(edist,256);
+            self.tur_shotorg = randomvec() * min(edist, 256);
 
         self.cnt = time + 0.5;
     }
@@ -272,39 +99,32 @@ void walker_rocket_think()
     if (edist < 256)
         self.tur_shotorg = '0 0 0';
 
-
     if (self.tur_health < time)
     {
-        self.think = walker_rocket_explode;
-        self.nextthink = time;
+        self.think      = walker_rocket_explode;
+        self.nextthink  = time;
         return;
     }
 
-    if (self.shot_dmg != 1337)
-        if (random() < 0.01)
-        {
-            walker_rocket_loop();
-            return;
-        }
+    if (self.shot_dmg != 1337 && random() < 0.01)
+    {
+        walker_rocket_loop();
+        return;
+    }
 
     m_speed = vlen(self.velocity);
 
     // Enemy dead? just keep on the current heading then.
-    if ((self.enemy == world) || (self.enemy.deadflag != DEAD_NO))
-    {
-        // Make sure we dont return to tracking a respawned entity
+    if (self.enemy == world || self.enemy.deadflag != DEAD_NO)
         self.enemy = world;
-    }
 
     if (self.enemy)
     {
-        itime = max(edist / m_speed,1);
+        itime = max(edist / m_speed, 1);
         newdir = steerlib_pull(self.enemy.origin + self.tur_shotorg);
     }
     else
-    {
         newdir  = normalize(self.velocity);
-    }
 
     WALKER_ROCKET_MOVE;
 }
@@ -320,7 +140,7 @@ void walker_rocket_loop3()
         return;
     }
 
-    if (vlen(self.origin - self.tur_shotorg) < 128 )
+    if (vlen(self.origin - self.tur_shotorg) < 100 )
     {
         self.think = walker_rocket_think;
         return;
@@ -344,7 +164,7 @@ void walker_rocket_loop2()
         return;
     }
 
-    if (vlen(self.origin - self.tur_shotorg) < 128 )
+    if (vlen(self.origin - self.tur_shotorg) < 100 )
     {
         self.tur_shotorg = self.origin - '0 0 200';
         self.think = walker_rocket_loop3;
@@ -358,37 +178,30 @@ void walker_rocket_loop2()
 void walker_rocket_loop()
 {
     self.nextthink = time;
-    self.tur_shotorg = self.origin + '0 0 400';
+    self.tur_shotorg = self.origin + '0 0 300';
     self.think = walker_rocket_loop2;
     self.shot_dmg = 1337;
 }
 
 void walker_fire_rocket(vector org)
 {
-
     entity rocket;
-
-
-    //self.angles_x *= -1;
     fixedmakevectors(self.angles);
-    //self.angles_x *= -1;
 
     te_explosion (org);
 
     rocket = spawn ();
     setorigin(rocket, org);
 
-    sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
+    sound (self, CH_WEAPON_A, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);
     setsize (rocket, '-3 -3 -3', '3 3 3'); // give it some size so it can be shot
 
     rocket.classname          = "walker_rocket";
     rocket.owner              = self;
-
     rocket.bot_dodge          = TRUE;
     rocket.bot_dodgerating    = 50;
-
     rocket.takedamage         = DAMAGE_YES;
-
     rocket.damageforcescale   = 2;
     rocket.health             = 25;
     rocket.tur_shotorg        = randomvec() * 512;
@@ -402,9 +215,9 @@ void walker_fire_rocket(vector org)
 
     rocket.event_damage       = walker_rocket_damage;
 
-    rocket.nextthink          = time;// + 0.25;
+    rocket.nextthink          = time;
     rocket.movetype           = MOVETYPE_FLY;
-    rocket.velocity           = normalize((v_forward + v_up * 0.5) + (randomvec() * 0.2)) * walker_std_rocket_speed;
+    rocket.velocity           = normalize((v_forward + v_up * 0.5) + (randomvec() * 0.2)) * autocvar_g_turrets_unit_walker_std_rocket_speed;
     rocket.angles             = vectoangles(rocket.velocity);
     rocket.touch              = walker_rocket_explode;
     rocket.flags              = FL_PROJECTILE;
@@ -414,42 +227,43 @@ void walker_fire_rocket(vector org)
     CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
 }
 
-void rv_think()
+.vector enemy_last_loc;
+.float enemy_last_time;
+void walker_move_to(vector _target, float _dist)
 {
-    float f;
-    vector org;
-    entity oldself;
-
-    if (self.owner.deadflag != DEAD_NO)
+    switch (self.waterlevel)
     {
-        remove(self);
-        return;
+    case WATERLEVEL_NONE:
+        if (_dist > 500)
+            self.animflag = ANIM_RUN;
+        else
+            self.animflag = ANIM_WALK;
+    case WATERLEVEL_WETFEET:
+    case WATERLEVEL_SWIMMING:
+        if (self.animflag != ANIM_SWIM)
+            self.animflag = ANIM_WALK;
+        else
+            self.animflag = ANIM_SWIM;
+        break;
+    case WATERLEVEL_SUBMERGED:
+        self.animflag = ANIM_SWIM;
     }
 
-    self.cnt = self.cnt -1;
+    self.moveto = _target;
+    self.steerto = steerlib_attract2(self.moveto, 0.5, 500, 0.95);
 
-    if (self.cnt < 0)
+    if(self.enemy)
     {
-        remove(self);
-        return;
+        self.enemy_last_loc = _target;
+        self.enemy_last_time = time;        
     }
-
-    if (self.cnt > 1)
-        f = gettagindex(self.owner,"tag_rocket01");
-    else
-        f = gettagindex(self.owner,"tag_rocket02");
-
-    org = gettaginfo(self.owner,f);
-
-    self.nextthink = time + 0.2;
-    oldself = self;
-    self = self.owner;
-    walker_fire_rocket(org);
-    self = oldself;
 }
 
+//#define WALKER_FANCYPATHING
+
 void walker_move_path()
 {
+#ifdef WALKER_FANCYPATHING
     // Are we close enougth to a path node to switch to the next?
     if (vlen(self.origin  - self.pathcurrent.origin) < 64)
         if (self.pathcurrent.path_next == world)
@@ -475,179 +289,260 @@ void walker_move_path()
         else
             self.pathcurrent = self.pathcurrent.path_next;
 
-    switch (self.waterlevel)
-    {
-    case 0:
-        self.animflag = ANIM_WALK;
-    case 1:
-    case 2:
-        if (self.animflag == ANIM_WALK)
-            self.animflag = ANIM_WALK;
-        else
-            self.animflag = ANIM_SWIM;
-        break;
-    case 3:
-        self.animflag = ANIM_SWIM;
-    }
-
     self.moveto = self.pathcurrent.origin;
     self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95);
+    walker_move_to(self.moveto, 0);
 
+#else
+    if (vlen(self.origin - self.pathcurrent.origin) < 64)    
+        self.pathcurrent = self.pathcurrent.enemy;
+    
+    if(!self.pathcurrent)
+        return;
+    
+    self.moveto = self.pathcurrent.origin;
+    self.steerto = steerlib_attract2(self.moveto, 0.5, 500, 0.95);
+    walker_move_to(self.moveto, 0);
+#endif
 }
 
-void walker_move_enemy()
-{
-    switch (self.waterlevel)
-    {
-    case 0:
-        if (self.tur_dist_enemy > 500)
-            self.animflag = ANIM_RUN;
-        else
-            self.animflag = ANIM_WALK;
-    case 1:
-    case 2:
-        if (self.animflag != ANIM_SWIM)
-            self.animflag = ANIM_WALK;
-        else
-            self.animflag = ANIM_SWIM;
-        break;
-    case 3:
-        self.animflag = ANIM_SWIM;
-    }
-
-    self.moveto = self.enemy.origin;
-    self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95);
-
-}
-
-void walker_move_idle_pause()
-{
-    self.moveto   = self.origin;
-    self.steerto  = v_forward;
-    self.animflag = ANIM_NO;
-}
-
-void walker_move_idle_roam()
-{
-}
-
-void walker_move_idle()
-{
-}
-
-float walker_attack_meele()
-{
-
-    vector wish_angle;
-
-
-    if (self.animflag == ANIM_SWIM || self.animflag == ANIM_MEELE)
-        return 0;
-
-    wish_angle = angleofs(self,self.enemy);
-
-    if (self.tur_dist_enemy > autocvar_g_turrets_unit_walker_std_meele_range)
-        return 0;
-    else
-        if (fabs(wish_angle_y) > 15)
-            return 0;
-
-    self.moveto   = self.enemy.origin;
-    self.steerto  = steerlib_attract2(self.moveto,0.5,500,0.95);
-    self.animflag = ANIM_MEELE;
-
-    return 1;
-}
-
-float walker_attack_rockets()
-{
-    if (self.tur_head.attack_finished_single > time)
-        return 0;
-
-    if (self.tur_dist_enemy < autocvar_g_turrets_unit_walker_std_rockets_range_min)
-        return 0;
-
-    if (self.tur_dist_enemy > autocvar_g_turrets_unit_walker_std_rockets_range)
-        return 0;
-
-    entity rv;
+.float idletime;
 
-    rv           = spawn();
-    rv.think     = rv_think;
-    rv.nextthink = time;
-    rv.cnt       = 4;
-    rv.owner     = self;
 
-    self.tur_head.attack_finished_single = time + autocvar_g_turrets_unit_walker_std_rocket_refire;
-
-    return 1;
-}
 
 void walker_postthink()
 {
-
-    //self.angles_x *= -1;
     fixedmakevectors(self.angles);
-    //self.angles_x *= -1;
 
-    if ((self.spawnflags & TSF_NO_PATHBREAK) && self.pathcurrent)
+    if (self.spawnflags & TSF_NO_PATHBREAK && self.pathcurrent)
         walker_move_path();
     else if (self.enemy == world)
     {
         if(self.pathcurrent)
             walker_move_path();
         else
-            walker_move_idle_pause();
+        {
+            if(self.enemy_last_time != 0)
+            {
+                if(vlen(self.origin - self.enemy_last_loc) < 128 || time - self.enemy_last_time > 10)
+                    self.enemy_last_time = 0;
+                else                
+                    walker_move_to(self.enemy_last_loc, 0);
+            }
+            else
+            {        
+                if(self.animflag != ANIM_NO)
+                {                    
+                    traceline(self.origin + '0 0 64', self.origin + '0 0 64' + v_forward * 128, MOVE_NORMAL, self);
+                    
+                    if(trace_fraction != 1.0)
+                        self.tur_head.idletime = -1337;
+                    else
+                    {
+                        traceline(trace_endpos, trace_endpos - '0 0 256', MOVE_NORMAL, self);            
+                        if(trace_fraction == 1.0)
+                            self.tur_head.idletime = -1337;
+                    }
+                    
+                    if(self.tur_head.idletime == -1337)
+                    {
+                        self.moveto = self.origin + randomvec() * 256;        
+                        self.tur_head.idletime = 0;
+                    }
+
+                    self.moveto = self.moveto * 0.9 + ((self.origin + v_forward * 500) + randomvec() * 400) * 0.1;
+                    self.moveto_z = self.origin_z + 64;            
+                    walker_move_to(self.moveto, 0);
+                }         
+                
+                if(self.idletime < time)
+                {
+                    if(random() < 0.5 || !(self.spawnflags & TSL_ROAM))
+                    {
+                        self.idletime = time + 1 + random() * 5;
+                        self.moveto = self.origin;
+                        self.animflag = ANIM_NO;
+                    }
+                    else
+                    {
+                        self.animflag = ANIM_WALK;
+                        self.idletime = time + 4 + random() * 2;
+                        self.moveto = self.origin + randomvec() * 256;        
+                        self.tur_head.moveto = self.moveto;
+                        self.tur_head.idletime = 0;
+                    }
+                }
+            }            
+        }
     }
     else
     {
-        if not (self.animflag == ANIM_MEELE)
-            if not (walker_attack_rockets())
-                walker_attack_meele();
+        if (self.tur_dist_enemy < autocvar_g_turrets_unit_walker_std_meele_range && self.animflag != ANIM_MEELE)
+        {
+            vector wish_angle;
+            
+            wish_angle = angleofs(self, self.enemy);    
+            if (self.animflag != ANIM_SWIM)
+            if (fabs(wish_angle_y) < 15)
+            {
+                self.moveto   = self.enemy.origin;
+                self.steerto  = steerlib_attract2(self.moveto, 0.5, 500, 0.95);
+                self.animflag = ANIM_MEELE;
+            }
+        }
+        else if (self.tur_head.attack_finished_single < time)
+        {            
+            if(self.tur_head.shot_volly)
+            {
+                self.animflag = ANIM_NO;
+                
+                self.tur_head.shot_volly = self.tur_head.shot_volly -1;
+                if(self.tur_head.shot_volly == 0)
+                    self.tur_head.attack_finished_single = time + autocvar_g_turrets_unit_walker_std_rocket_refire;
+                else
+                    self.tur_head.attack_finished_single = time + 0.2;
+                
+                if(self.tur_head.shot_volly > 1)
+                    walker_fire_rocket(gettaginfo(self, gettagindex(self, "tag_rocket01")));
+                else
+                    walker_fire_rocket(gettaginfo(self, gettagindex(self, "tag_rocket02")));
+            }
+            else
+            {
+                if (self.tur_dist_enemy > autocvar_g_turrets_unit_walker_std_rockets_range_min)        
+                if (self.tur_dist_enemy < autocvar_g_turrets_unit_walker_std_rockets_range)
+                    self.tur_head.shot_volly = 4;
+            }
+        }
+        else
+        {            
+            if (self.animflag != ANIM_MEELE)
+                walker_move_to(self.enemy.origin, self.tur_dist_enemy);
+        }
+    }
 
-        if not (self.animflag == ANIM_MEELE)
-            walker_move_enemy();
+    //if(self.animflag != ANIM_NO)
+    {
+        vector real_angle;
+        float turny, turnx;
+        float  vz;
+
+        real_angle = vectoangles(self.steerto) - self.angles;
+        vz         = self.velocity_z;
+            
+        switch (self.animflag)
+        {
+            case ANIM_NO:
+                movelib_beak_simple(autocvar_g_turrets_unit_walker_speed_stop);
+                break;
+
+            case ANIM_TURN:
+                turny = autocvar_g_turrets_unit_walker_turn;
+                movelib_beak_simple(autocvar_g_turrets_unit_walker_speed_stop);
+                break;
+
+            case ANIM_WALK:
+                turny = autocvar_g_turrets_unit_walker_turn_walk;
+                movelib_move_simple(v_forward, autocvar_g_turrets_unit_walker_speed_walk, 0.6);
+                break;
+
+            case ANIM_RUN:
+                turny = autocvar_g_turrets_unit_walker_turn_run;
+                movelib_move_simple(v_forward, autocvar_g_turrets_unit_walker_speed_run, 0.6);
+                break;
+
+            case ANIM_STRAFE_L:
+                turny = autocvar_g_turrets_unit_walker_turn_strafe;
+                movelib_move_simple(v_right * -1, autocvar_g_turrets_unit_walker_speed_walk, 0.8);
+                break;
+
+            case ANIM_STRAFE_R:
+                turny = autocvar_g_turrets_unit_walker_turn_strafe;
+                movelib_move_simple(v_right, autocvar_g_turrets_unit_walker_speed_walk, 0.8);
+                break;
+
+            case ANIM_JUMP:
+                self.velocity += '0 0 1' * autocvar_g_turrets_unit_walker_speed_jump;
+                break;
+
+            case ANIM_LAND:
+                break;
+
+            case ANIM_PAIN:
+                if(self.frame != ANIM_PAIN)
+                    defer(0.25, walker_setnoanim);
+                
+                break;
+
+            case ANIM_MEELE:
+                if(self.frame != ANIM_MEELE)
+                {
+                    defer(0.41, walker_setnoanim);
+                    defer(0.21, walker_meele_do_dmg);
+                }
+
+                movelib_beak_simple(autocvar_g_turrets_unit_walker_speed_stop);
+                break;
+
+            case ANIM_SWIM:
+                turny = autocvar_g_turrets_unit_walker_turn_swim;
+                turnx = autocvar_g_turrets_unit_walker_turn_swim;
+                
+                self.angles_x += bound(-10, shortangle_f(real_angle_x, self.angles_x), 10);
+                movelib_move_simple(v_forward, autocvar_g_turrets_unit_walker_speed_swim, 0.3);
+                vz = self.velocity_z + sin(time * 4) * 8;
+                break;
+
+            case ANIM_ROAM:
+                turny = autocvar_g_turrets_unit_walker_turn_walk;
+                movelib_move_simple(v_forward ,autocvar_g_turrets_unit_walker_speed_roam, 0.5);
+                break;
+        }
+            
+        if(turny)
+        {        
+            turny = bound( turny * -1, shortangle_f(real_angle_y, self.angles_y), turny );
+            self.angles_y += turny;
+        }
+
+        if(turnx)
+        {        
+            turnx = bound( turnx * -1, shortangle_f(real_angle_x, self.angles_x), turnx );
+            self.angles_x += turnx;
+        }
+
+        self.velocity_z = vz;        
     }
 
+    
+    if(self.origin != self.oldorigin)
+        self.SendFlags |= TNSF_MOVE;
+    
+    self.oldorigin = self.origin;
+    turrets_setframe(self.animflag, FALSE);
 
-    walker_animate();
 }
 
 void walker_attack()
 {
-    sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
-    fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, autocvar_g_balance_uzi_bulletconstant);
+    sound (self, CH_WEAPON_A, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
+    fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated, self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET_WALKER_GUN, 0, 1, autocvar_g_balance_uzi_bulletconstant);
     endFireBallisticBullet();
-    if (self.misc_bulletcounter == 2)
-    {
-
-               UziFlash();
-               setattachment(self.muzzle_flash, self.tur_head, "tag_fire");
-
-        self.misc_bulletcounter = 0;
-    }
-
-    self.misc_bulletcounter = self.misc_bulletcounter + 1;
-    self.tur_head.frame    = self.tur_head.frame + 1;
+    pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
 }
 
 
 void walker_respawnhook()
 {
-    vector vtmp;
     entity e;
 
     // Respawn is called & first spawn to, to set team. need to make sure we do not move the initial spawn.
     if(self.movetype  != MOVETYPE_WALK)
                return;
                
-    setorigin(self, self.wkr_spawn.origin);
-
-    self.angles = self.wkr_spawn.angles;
-    vtmp = self.wkr_spawn.origin;
-    vtmp_z += self.wkr_spawn.maxs_z;
-    setorigin(self,vtmp);
-
+    setorigin(self, self.pos1);
+    self.angles = self.pos2;
+    
     if (self.target != "")
     {
         e = find(world,targetname,self.target);
@@ -669,17 +564,12 @@ void walker_respawnhook()
 
 void walker_diehook()
 {
-    turret_trowgib2(self.origin, self.velocity + v_up * 200, '-0.6 -0.2 -02', self,time + random() * 1);
-    turret_trowgib2(self.origin + '0 0 64', self.velocity + v_forward * 150 + v_up * 150, '-0.2 -0.2 -02', self.tur_head, 3 + time + random() * 2);
-
+#ifdef self.pathcurrent
     if (self.pathcurrent)
         pathlib_deletepath(self.pathcurrent.owner);
+#endif
 
     self.pathcurrent = world;
-
-    if (self.damage_flags & TFL_DMG_DEATH_NORESPAWN)
-        remove(self.wkr_spawn);
-
 }
 
 void turret_walker_dinit()
@@ -688,7 +578,6 @@ void turret_walker_dinit()
     entity e;
 
     if (self.netname == "")      self.netname     = "Walker Turret";
-    self.wkr_spawn = spawn();
 
     self.ammo_flags = TFL_AMMO_BULLETS | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
     self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE ;
@@ -704,15 +593,12 @@ void turret_walker_dinit()
     self.turret_diehook = walker_diehook;
 
     self.ticrate = 0.05;
-    if (turret_stdproc_init("walker_std",FALSE,"models/turrets/walker_body.md3","models/turrets/walker_head_minigun.md3") == 0)
+    if (turret_stdproc_init("walker_std", "models/turrets/walker_body.md3", "models/turrets/walker_head_minigun.md3", TID_WALKER) == 0)
     {
         remove(self);
         return;
     }
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     self.damage_flags |= TFL_DMG_DEATH_NOGIBS;
     self.target_select_flags   = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
     self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
@@ -722,20 +608,15 @@ void turret_walker_dinit()
     self.solid      = SOLID_SLIDEBOX;
     self.takedamage = DAMAGE_AIM;
 
-    setmodel(self.wkr_spawn,"models/turrets/walker_spawn.md3");
-
-    self.wkr_spawn.angles   = self.angles;
-    self.wkr_spawn.solid    = SOLID_NOT;
 
     setsize(self, WALKER_MIN, WALKER_MAX);
 
-    setorigin(self,self.origin);
-    //traceline(self.origin + '0 0 128', self.origin - '0 0 10000', MOVE_NORMAL, self);
+    setorigin(self, self.origin);
     tracebox(self.origin + '0 0 128', self.mins,self.maxs,self.origin - '0 0 10000', MOVE_NORMAL, self);
-
-    setorigin(self.wkr_spawn, trace_endpos + '0 0 4');
-    setorigin(self, self.wkr_spawn.origin);
-
+    setorigin(self, trace_endpos + '0 0 4');
+    self.pos1 = self.origin;
+    self.pos2 = self.angles;
+    
     self.idle_aim = '0 0 0';
     self.turret_firecheckfunc = walker_firecheck;
     self.turret_firefunc      = walker_attack;
@@ -743,7 +624,7 @@ void turret_walker_dinit()
 
     if (self.target != "")
     {
-        e = find(world,targetname,self.target);
+        e = find(world, targetname, self.target);
         if (!e)
         {
             dprint("Initital waypoint for walker does NOT exsist, fix your map!\n");
@@ -754,8 +635,12 @@ void turret_walker_dinit()
             dprint("Warning: not a turrret path\n");
         else
         {
-            self.pathcurrent = WALKER_PATH(self.origin,e.origin);
+#ifdef WALKER_FANCYPATHING
+            self.pathcurrent = WALKER_PATH(self.origin, e.origin);
             self.pathgoal = e;
+#else
+            self.pathcurrent = e;
+#endif
         }
     }
 }
@@ -763,14 +648,10 @@ void turret_walker_dinit()
 
 void spawnfunc_turret_walker()
 {
-    walker_loadcvars();
-
     g_turrets_common_precash();
 
     precache_model ("models/turrets/walker_head_minigun.md3");
     precache_model ("models/turrets/walker_body.md3");
-    precache_model ("models/turrets/walker_props.md3");
-    precache_model ("models/turrets/walker_spawn.md3");
     precache_model ( "models/turrets/rocket.md3");
     precache_sound ( "weapons/rocket_impact.wav" );
 
diff --git a/qcsrc/server/vehicles/bumblebee.qc b/qcsrc/server/vehicles/bumblebee.qc
new file mode 100644 (file)
index 0000000..f784563
--- /dev/null
@@ -0,0 +1,371 @@
+#ifdef SVQC
+// Auto cvars
+float autocvar_g_vehicle_bumblebee_speed_forward;
+float autocvar_g_vehicle_bumblebee_speed_strafe;
+float autocvar_g_vehicle_bumblebee_speed_up;
+float autocvar_g_vehicle_bumblebee_speed_down;
+float autocvar_g_vehicle_bumblebee_turnspeed;
+float autocvar_g_vehicle_bumblebee_pitchspeed;
+float autocvar_g_vehicle_bumblebee_pitchlimit;
+float autocvar_g_vehicle_bumblebee_friction;
+
+float autocvar_g_vehicle_bumblebee_energy;
+float autocvar_g_vehicle_bumblebee_energy_regen;
+float autocvar_g_vehicle_bumblebee_energy_regen_pause;
+
+float autocvar_g_vehicle_bumblebee_health;
+float autocvar_g_vehicle_bumblebee_health_regen;
+float autocvar_g_vehicle_bumblebee_health_regen_pause;
+
+float autocvar_g_vehicle_bumblebee_shield;
+float autocvar_g_vehicle_bumblebee_shield_regen;
+float autocvar_g_vehicle_bumblebee_shield_regen_pause;
+
+float autocvar_g_vehicle_bumblebee_cannon_cost;
+float autocvar_g_vehicle_bumblebee_cannon_damage;
+float autocvar_g_vehicle_bumblebee_cannon_radius;
+float autocvar_g_vehicle_bumblebee_cannon_refire;
+float autocvar_g_vehicle_bumblebee_cannon_speed;
+float autocvar_g_vehicle_bumblebee_cannon_spread;
+float autocvar_g_vehicle_bumblebee_cannon_force;
+
+float autocvar_g_vehicle_bumblebee_cannon_turnspeed;
+float autocvar_g_vehicle_bumblebee_cannon_pitchlimit_down;
+float autocvar_g_vehicle_bumblebee_cannon_pitchlimit_up;
+float autocvar_g_vehicle_bumblebee_cannon_turnlimit_in;
+float autocvar_g_vehicle_bumblebee_cannon_turnlimit_out;
+
+float autocvar_g_vehicle_bumblebee_respawntime;
+
+float autocvar_g_vehicle_bumblebee_blowup_radius;
+float autocvar_g_vehicle_bumblebee_blowup_coredamage;
+float autocvar_g_vehicle_bumblebee_blowup_edgedamage;
+float autocvar_g_vehicle_bumblebee_blowup_forceintensity;
+
+#define BUMB_MIN '-120 -120 -40'
+#define BUMB_MAX '120 120 40'
+
+.entity gunner1;
+//.entity gunner2;
+.vector lastaim;
+float bumb_gunner_frame()
+{
+    entity vehic, gun, gunner;
+    float ftmp, ftmp2;
+    vector vtmp;
+
+    vehic   = self.vehicle;
+    gun     = self.vehicle.gun1;
+    gunner  = self;
+
+    self    = vehic;
+    vehic.solid = SOLID_NOT;
+    crosshair_trace(gunner);
+
+    //vtmp = gettaginfo(vehic, gettagindexvehic, "tag_hardpoint01"));
+    vtmp = gettaginfo(gun, gettagindex(gun, "muzzle"));
+    vtmp = vectoangles(normalize(trace_endpos - vtmp)); // Find the direction & angle
+    vtmp = shortangle_vxy(vtmp - (vehic.angles + gun.angles), vehic.angles + gun.angles);     // Find aim offset
+
+    // Bind to aimspeed
+    ftmp2 = autocvar_g_vehicle_bumblebee_cannon_turnspeed * frametime; ftmp = -ftmp2;
+    vtmp_x = bound(ftmp, vtmp_x, ftmp2);
+    vtmp_y = bound(ftmp, vtmp_y, ftmp2);
+    // Bind to limts
+    gun.angles_x = bound(-autocvar_g_vehicle_bumblebee_cannon_pitchlimit_down, vtmp_x + gun.angles_x, autocvar_g_vehicle_bumblebee_cannon_pitchlimit_up);
+    gun.angles_y = bound(-autocvar_g_vehicle_bumblebee_cannon_turnlimit_in,  vtmp_y + gun.angles_y, autocvar_g_vehicle_bumblebee_cannon_turnlimit_out);
+
+    if(gunner.BUTTON_ATCK && gun.cnt <= time)
+    {
+        vtmp = gettaginfo(gun, gettagindex(gun, "muzzle"));
+        v_forward = normalize(v_forward);
+        vtmp += v_forward * 50;
+
+        fireBullet (vtmp, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
+            autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_SBMINIGUN, 0);
+
+        gun.cnt = time + 0.1;
+    }
+
+    setorigin(gunner, vehic.origin);
+    gunner.velocity = vehic.velocity;
+
+    vehic.solid = SOLID_BBOX;
+    gunner.BUTTON_ATCK = gunner.BUTTON_ATCK2 = gunner.BUTTON_CROUCH = 0;
+    self = gunner;
+    return 1;
+}
+
+void bumb_gunner_enter()
+{
+    if(self.gunner1 != world)
+        return;
+
+    self.gunner1         = other;
+    self.gunner1.vehicle = self;
+
+    msg_entity = other;
+    WriteByte (MSG_ONE, SVC_SETVIEWPORT);
+    WriteEntity(MSG_ONE, self.gun1);
+    WriteByte (MSG_ONE, SVC_SETVIEWANGLES);
+    if(self.tur_head)
+    {
+        WriteAngle(MSG_ONE, self.gun1.angles_x + self.angles_x); // tilt
+        WriteAngle(MSG_ONE, self.gun1.angles_y + self.angles_y); // yaw
+        WriteAngle(MSG_ONE, 0);                                  // roll
+    }
+    other.PlayerPhysplug = bumb_gunner_frame;
+}
+
+float bumb_pilot_frame()
+{
+    entity pilot, gunner, vehic;
+    vector newvel;
+
+    pilot = self;
+    vehic = self.vehicle;
+    self   = vehic;
+
+    if(pilot.BUTTON_USE && vehic.deadflag == DEAD_NO)
+    {
+        self = vehic;
+        vehicles_exit(VHEF_NORMAL);
+        self = pilot;
+        return 0;
+    }
+
+    if(vehic.deadflag != DEAD_NO)
+    {
+        self = pilot;
+        pilot.BUTTON_ATCK = pilot.BUTTON_ATCK2 = 0;
+        return 1;
+    }
+
+    crosshair_trace(pilot);
+
+    vector vang;
+    float ftmp;
+
+    vang = vehic.angles;
+    newvel = vectoangles(normalize(trace_endpos - self.origin + '0 0 32'));
+    vang_x *= -1;
+    newvel_x *= -1;
+    if(newvel_x > 180)  newvel_x -= 360;
+    if(newvel_x < -180) newvel_x += 360;
+    if(newvel_y > 180)  newvel_y -= 360;
+    if(newvel_y < -180) newvel_y += 360;
+
+    ftmp = shortangle_f(pilot.v_angle_y - vang_y, vang_y);
+    if(ftmp > 180)  ftmp -= 360; if(ftmp < -180) ftmp += 360;
+    vehic.avelocity_y = bound(-autocvar_g_vehicle_bumblebee_turnspeed, ftmp + vehic.avelocity_y * 0.9, autocvar_g_vehicle_bumblebee_turnspeed);
+
+    // Pitch
+    ftmp = 0;
+    if(pilot.movement_x > 0 && vang_x < autocvar_g_vehicle_bumblebee_pitchlimit) ftmp = 5;
+    else if(pilot.movement_x < 0 && vang_x > -autocvar_g_vehicle_bumblebee_pitchlimit) ftmp = -20;
+
+    newvel_x = bound(-autocvar_g_vehicle_bumblebee_pitchlimit, newvel_x , autocvar_g_vehicle_bumblebee_pitchlimit);
+    ftmp = vang_x - bound(-autocvar_g_vehicle_bumblebee_pitchlimit, newvel_x + ftmp, autocvar_g_vehicle_bumblebee_pitchlimit);
+    vehic.avelocity_x = bound(-autocvar_g_vehicle_bumblebee_pitchspeed, ftmp + vehic.avelocity_x * 0.9, autocvar_g_vehicle_bumblebee_pitchspeed);
+
+    vehic.angles_x = anglemods(vehic.angles_x);
+    vehic.angles_y = anglemods(vehic.angles_y);
+    vehic.angles_z = anglemods(vehic.angles_z);
+
+    makevectors('0 1 0' * vehic.angles_y);
+    newvel = vehic.velocity * -autocvar_g_vehicle_bumblebee_friction;
+
+    if(pilot.movement_x != 0)
+    {
+        if(pilot.movement_x > 0)
+            newvel += v_forward  * autocvar_g_vehicle_bumblebee_speed_forward;
+        else if(pilot.movement_x < 0)
+            newvel -= v_forward  * autocvar_g_vehicle_bumblebee_speed_forward;
+    }
+
+    if(pilot.movement_y != 0)
+    {
+        if(pilot.movement_y < 0)
+            newvel -= v_right * autocvar_g_vehicle_bumblebee_speed_strafe;
+        else if(pilot.movement_y > 0)
+            newvel += v_right * autocvar_g_vehicle_bumblebee_speed_strafe;
+        ftmp = newvel * v_right;
+        ftmp *= frametime * 0.1;
+        vehic.angles_z = bound(-15, vehic.angles_z + ftmp, 15);
+    }
+    else
+    {
+        vehic.angles_z *= 0.95;
+        if(vehic.angles_z >= -1 && vehic.angles_z <= -1)
+            vehic.angles_z = 0;
+    }
+
+    if(pilot.BUTTON_CROUCH)
+        newvel -=   v_up * autocvar_g_vehicle_bumblebee_speed_down;
+    else if (pilot.BUTTON_JUMP)
+        newvel +=  v_up * autocvar_g_vehicle_bumblebee_speed_up;
+
+    vehic.velocity  += newvel * frametime;
+    pilot.velocity = pilot.movement  = vehic.velocity;
+    setorigin(pilot,vehic.origin + '0 0 32');
+
+
+    if(vehic.vehicle_flags  & VHF_SHIELDREGEN)
+        vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_bumblebee_shield, autocvar_g_vehicle_bumblebee_shield_regen_pause, autocvar_g_vehicle_bumblebee_shield_regen, frametime);
+
+    if(vehic.vehicle_flags  & VHF_HEALTHREGEN)
+        vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_bumblebee_health, autocvar_g_vehicle_bumblebee_health_regen_pause, autocvar_g_vehicle_bumblebee_health_regen, frametime);
+
+    if(vehic.vehicle_flags  & VHF_ENERGYREGEN)
+        vehicles_regen(cnt, vehicle_energy, autocvar_g_vehicle_bumblebee_energy, autocvar_g_vehicle_bumblebee_energy_regen_pause, autocvar_g_vehicle_bumblebee_energy_regen, frametime);
+
+    VEHICLE_UPDATE_PLAYER(health, bumblebee);
+    VEHICLE_UPDATE_PLAYER(energy, bumblebee);
+    if(vehic.vehicle_flags & VHF_HASSHIELD)
+        VEHICLE_UPDATE_PLAYER(shield, bumblebee);
+
+    pilot.BUTTON_ATCK = pilot.BUTTON_ATCK2 = pilot.BUTTON_CROUCH = 0;
+    self = pilot;
+
+    return 1;
+}
+
+void bumb_think()
+{
+    self.velocity = self.velocity * 0.99;
+    self.nextthink = time + 0.1;
+}
+
+void bumb_enter()
+{
+    self.touch  = bumb_gunner_enter;
+}
+
+void bumb_exit(float eject)
+{
+    self.owner = world;
+    self.touch = vehicles_touch;
+}
+
+void bumb_spawn()
+{
+    self.vehicle_health = autocvar_g_vehicle_bumblebee_health;
+    self.vehicle_shield = autocvar_g_vehicle_bumblebee_shield;
+    self.movetype       = MOVETYPE_TOSS;
+    self.solid          = SOLID_BBOX;
+    //self.vehicle_energy = 1;
+    self.movetype = MOVETYPE_FLY;
+    setorigin(self, self.origin + '0 0 25');
+}
+
+void bumb_die()
+{
+    self.health       = 0;
+    self.event_damage = SUB_Null;
+    self.solid        = SOLID_CORPSE;
+    self.takedamage   = DAMAGE_NO;
+    self.deadflag     = DEAD_DYING;
+    self.movetype     = MOVETYPE_BOUNCE;
+
+    pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
+}
+
+void bumb_dinit()
+{
+    if not (vehicle_initialize(
+             "Bumblebee",
+             "models/vehicles/bumblebee_body.dpm",
+             "",
+             "models/vehicles/spiderbot_cockpit.dpm",
+             "", "", "tag_viewport",
+             HUD_BUMBLEBEE,
+             BUMB_MIN, BUMB_MAX,
+             FALSE,
+             bumb_spawn, autocvar_g_vehicle_bumblebee_respawntime,
+             bumb_pilot_frame,
+             bumb_enter, bumb_exit,
+             bumb_die,   bumb_think,
+             FALSE))
+    {
+        remove(self);
+        return;
+    }
+    self.gun1 = spawn();
+    setmodel(self.gun1, "models/vehicles/bumblebee_ray.dpm");
+    setattachment(self.gun1, self, "tag_hardpoint03");
+
+    self.gun1 = spawn();
+    self.gun2 = spawn();
+
+    self.gun1.owner = self;
+    self.gun2.owner = self;
+
+    setmodel(self.gun1, "models/vehicles/bumblebee_plasma_right.dpm");
+    setmodel(self.gun2, "models/vehicles/bumblebee_plasma_left.dpm");
+
+    setattachment(self.gun1, self, "tag_hardpoint01");
+    setattachment(self.gun2, self, "tag_hardpoint02");
+
+    vector ofs;
+    ofs = gettaginfo(self, gettagindex(self, "tag_hardpoint01"));
+    ofs -= self.origin;
+    setattachment(self.gun1, self, "");
+    setorigin(self.gun1, ofs);
+
+    ofs = gettaginfo(self, gettagindex(self, "tag_hardpoint02"));
+    ofs -= self.origin;
+    setattachment(self.gun2, self, "");
+    setorigin(self.gun2, ofs);
+
+
+}
+
+void spawnfunc_vehicle_bumblebee()
+{
+
+    precache_model ("models/vehicles/bumblebee_body.dpm");
+    precache_model ("models/vehicles/bumblebee_plasma_left.dpm");
+    precache_model ("models/vehicles/bumblebee_plasma_right.dpm");
+    precache_model ("models/vehicles/bumblebee_ray.dpm");
+
+    //vehicles_configcheck("vehicle_bumblebee.cfg", autocvar_g_vehicle_bumblebee_health);
+
+    if(autocvar_g_vehicle_bumblebee_energy)
+        if(autocvar_g_vehicle_bumblebee_energy_regen)
+            self.vehicle_flags |= VHF_ENERGYREGEN;
+
+    if(autocvar_g_vehicle_bumblebee_shield)
+        self.vehicle_flags |= VHF_HASSHIELD;
+
+    if(autocvar_g_vehicle_bumblebee_shield_regen)
+        self.vehicle_flags |= VHF_SHIELDREGEN;
+
+    if(autocvar_g_vehicle_bumblebee_health_regen)
+        self.vehicle_flags |= VHF_HEALTHREGEN;
+
+    self.think = bumb_dinit;
+    self.nextthink = time + 1;
+}
+#endif // SVQC
+
+#ifdef CSQC
+void bumblebee_draw()
+{
+
+}
+
+void bumblebee_draw2d()
+{
+
+}
+
+void bumblebee_read_extra()
+{
+
+}
+
+void vehicle_bumblebee_assemble()
+{
+
+}
+#endif //CSQC
diff --git a/qcsrc/server/vehicles/collision.qc b/qcsrc/server/vehicles/collision.qc
new file mode 100644 (file)
index 0000000..11488a0
--- /dev/null
@@ -0,0 +1,55 @@
+vector collision_force;
+vector collision_angle;
+
+vector bb1[9];
+vector bb2[9];
+
+float collision_run()
+{
+    vector vtmp, vmin, vmax, vrot, vforce, vtmp2, vtmp3;
+    float i, fvel, bcol;
+
+
+    // Extract the 8 bbox corners from mins/maxs for self
+    vmax = self.maxs;
+    vmin = self.mins;
+    bb1[0] = vmax;
+    vtmp   = vmax; vtmp_x = vmin_x; bb1[1] = vtmp;
+    vtmp   = vmax; vtmp_y = vmin_y; bb1[2] = vtmp;
+    vtmp   = vmin; vtmp_z = vmax_z; bb1[3] = vtmp;
+    bb1[4] = vmin;
+    vtmp   = vmin; vtmp_x = vmax_x; bb1[5] = vtmp;
+    vtmp   = vmin; vtmp_y = vmax_y; bb1[6] = vtmp;
+    vtmp   = vmax; vtmp_z = vmin_z; bb1[7] = vtmp;
+
+    makevectors(self.angles + '-2 0 0' * self.angles_x);
+    bcol = 0;
+
+    // Pass1: Transform by rotation, ajust points by impact/s
+    for(i = 8; i >= 0; --i)
+    {
+        vtmp = bb1[i];
+        vtmp = self.origin + vtmp_x * v_forward - vtmp_y * v_right + vtmp_z * v_up;
+        traceline(self.origin, vtmp, MOVE_WORLDONLY, self);
+        te_lightning1(world,self.origin,vtmp);
+        if(trace_fraction != 1.0)
+        {
+            vforce += (trace_endpos - vtmp);
+            vtmp3 = self.origin + self.velocity * frametime;
+            vtmp2 =  vectoangles(normalize(vtmp - vtmp3));
+            vrot   += (vectoangles(normalize(trace_endpos - vtmp3)) - vtmp2);
+            bcol += 1;
+        }
+    }
+
+    if(bcol)
+    {
+
+        vtmp = self.origin + self.velocity * frametime;
+        self.angles += vrot * frametime;
+        self.velocity += vforce * frametime;
+
+    }
+
+}
+
diff --git a/qcsrc/server/vehicles/network.qc b/qcsrc/server/vehicles/network.qc
new file mode 100644 (file)
index 0000000..688aa7c
--- /dev/null
@@ -0,0 +1,237 @@
+#ifdef VEHICLES_CSQC
+// SendFlags
+float VSF_SETUP       = 1;          /// Send vehicle type etc
+float VSF_ORIGIN      = 2;          /// Send location
+float VSF_MOVEMENT    = 4;          /// Send movement update (and angles)
+float VSF_AVEL        = 8;          /// Send Angular velocity
+float VSF_STATS       = 16;         /// Send ammo, health etc
+float VSF_EXTRA       = 32;         /// Send additional data (turret rotations etc). Handeld per vehicle type.
+float VSF_ANIMINFO    = 64;         /// Animation info
+float VSF_FULL_UPDATE = 16777215;    /// Send everything
+
+float VSX_FAR   = 1;
+float VSX_OWNER = 2;
+float VSX_GUN1  = 4;
+float VSX_GUN2  = 8;
+
+#ifdef SVQC
+#define VSX_FARDISTANCE 2000
+float send_vehile(entity to, float sf)
+{
+       float dist, xf;
+
+    var void WriteFunc(float, float);
+
+    dist = vlen(self.origin - to.origin);
+    if(to == self.owner)
+        xf |= VSX_OWNER;
+    else if(dist > VSX_FARDISTANCE)
+        xf |= VSX_FAR;
+
+       // Always send a movement and origin to owner
+       if(to == self.owner)
+           sf |= VSF_ORIGIN | VSF_MOVEMENT;
+
+       WriteByte(MSG_ENTITY, ENT_CLIENT_VEHICLE);
+
+       // We need to know client-side what was sent
+       WriteByte(MSG_ENTITY, sf);
+       WriteByte(MSG_ENTITY, xf);
+
+       if(sf & VSF_SETUP)
+       {
+        WriteByte(MSG_ENTITY,  self.hud);        //vehicle type = hud
+        WriteByte(MSG_ENTITY,  self.team);
+        WriteShort(MSG_ENTITY, self.colormap);
+        WriteShort(MSG_ENTITY, self.vehicle_flags);
+       }
+
+    if(sf & VSF_ORIGIN)
+    {
+        WriteFunc = ((xf & VSX_FAR) ? WriteShort : WriteCoord);
+        WriteFunc(MSG_ENTITY, self.origin_x);
+        WriteFunc(MSG_ENTITY, self.origin_y);
+        WriteFunc(MSG_ENTITY, self.origin_z);
+    }
+
+    if(sf & VSF_MOVEMENT)
+    {
+        WriteFunc = ((xf & VSX_FAR) ? WriteShort : WriteCoord);
+        WriteFunc(MSG_ENTITY, self.velocity_x);
+        WriteFunc(MSG_ENTITY, self.velocity_y);
+        WriteFunc(MSG_ENTITY, self.velocity_z);
+
+        WriteFunc = ((xf & VSX_FAR) ? WriteShort : WriteAngle);
+        WriteFunc(MSG_ENTITY, self.angles_x);
+        WriteFunc(MSG_ENTITY, self.angles_y);
+        WriteFunc(MSG_ENTITY, self.angles_z);
+    }
+
+    if(sf & VSF_AVEL)
+    {
+        WriteFunc = ((xf & VSX_FAR) ? WriteShort : WriteCoord);
+        WriteFunc(MSG_ENTITY, self.avelocity_x);
+        WriteFunc(MSG_ENTITY, self.avelocity_y);
+        WriteFunc(MSG_ENTITY, self.avelocity_z);
+    }
+
+    if(sf & VSF_STATS)
+    {
+        WriteByte(MSG_ENTITY, self.vehicle_health);
+        if(xf & VSX_OWNER)
+        {
+            WriteByte(MSG_ENTITY, self.vehicle_shield);
+            WriteByte(MSG_ENTITY, self.vehicle_energy);
+
+            WriteByte(MSG_ENTITY, self.vehicle_ammo1);
+            WriteByte(MSG_ENTITY, self.vehicle_reload1);
+
+            WriteByte(MSG_ENTITY, self.vehicle_ammo2);
+            WriteByte(MSG_ENTITY, self.vehicle_reload2);
+
+        }
+    }
+
+    if(sf & VSF_EXTRA)
+        self.vehile_send_exta(to, sf);
+
+    return TRUE;
+}
+
+void net_link_vehile()
+{
+    self.SendFlags = 0xFFFFFF;
+    Net_LinkEntity(self, FALSE, 0, send_vehile);
+}
+#endif // SVQC
+
+#ifdef CSQC
+void vehicle_spiderbot_assemble()
+{
+
+}
+
+void vehicle_raptor_assemble()
+{
+
+}
+
+void vehicle_bumblebee_assemble()
+{
+
+}
+
+.float lastupdate;
+void read_vehicle(float bIsNew)
+{
+    float sf, xf;
+    var float ReadFunc();
+
+    sf = ReadByte();
+    xf = ReadByte();
+
+    if(xf & VSX_OWNER)
+        vehicle = self;
+
+       if(sf & VSF_SETUP)
+       {
+        self.vehicle_hud   = ReadByte();
+        self.team          = ReadByte();
+        self.colormap      = ReadShort();
+        self.vehicle_flags = ReadShort();
+
+        switch(self.vehicle_hud)
+        {
+            case HUD_WAKIZASHI:
+                vehicle_racer_assemble();
+                break;
+            case HUD_SPIDERBOT:
+                vehicle_spiderbot_assemble();
+                break;
+            case HUD_RAPTOR:
+                vehicle_raptor_assemble();
+                break;
+            case HUD_BUMBLEBEE:
+                vehicle_bumblebee_assemble();
+                break;
+            default:
+                break;
+        }
+       }
+
+       if(self.vehicle_hud == HUD_WAKIZASHI && xf & VSX_OWNER)
+       {
+
+        vehicle_hudmodel.owner  = self;
+       }
+
+    //if(xf & VSX_FAR)
+    //    dprint("Client vehicle faaar set\n");
+
+    if(sf & VSF_ORIGIN)
+    {
+        ReadFunc = ((xf & VSX_FAR) ? ReadShort : ReadCoord);
+        self.origin_x = ReadFunc();
+        self.origin_y = ReadFunc();
+        self.origin_z = ReadFunc();
+
+        setorigin(self, self.origin);
+        //self.lastupdate = time;
+    }
+
+    if(sf & VSF_MOVEMENT)
+    {
+        ReadFunc = ((xf & VSX_FAR) ? ReadShort : ReadCoord);
+        self.velocity_x  = ReadFunc();
+        self.velocity_y  = ReadFunc();
+        self.velocity_z  = ReadFunc();
+
+        ReadFunc = ((sf & VSX_FAR) ? ReadShort : ReadAngle);
+        self.angles_x = ReadFunc();
+        self.angles_y = ReadFunc();
+        self.angles_z = ReadFunc();
+
+        //self.lastupdate = time;
+        // self.move_velocity  = self.velocity;
+        // self.move_angles    = self.angles;
+    }
+
+    if(sf & VSF_AVEL)
+    {
+        ReadFunc = ((xf & VSX_FAR) ? ReadShort : ReadCoord);
+        self.avelocity_x = ReadFunc();
+        self.avelocity_y = ReadFunc();
+        self.avelocity_z = ReadFunc();
+
+        // self.move_avelocity  = self.avelocity;
+    }
+
+    if(sf & VSF_STATS)
+    {
+        self.vehicle_health = ReadByte();
+        if(xf & VSX_OWNER)
+        {
+            self.vehicle_shield  = ReadByte();
+            self.vehicle_energy  = ReadByte();
+            self.vehicle_ammo1   = ReadByte();
+            self.vehicle_reload1 = ReadByte();
+            self.vehicle_ammo2   = ReadByte();
+            self.vehicle_reload2 = ReadByte();
+        }
+    }
+
+    if(sf & VSF_EXTRA)
+        self.vehile_read_exta(sf);
+
+}
+
+#endif // CSQC
+#else
+#ifdef CSQC
+.float lastupdate;
+void read_vehicle(float bIsNew)
+{
+
+}
+#endif
+#endif // VEHICLES_CSQC
index 09efab4bfc629ef2d81d50b387f636c168f28f47..e3c74c5e190c864a1d0832834729d2fc4b534979 100644 (file)
-#define RACER_MIN '-80 -80 -40'
-#define RACER_MAX '80 80 40'
-#define RACER_TICRATE 0.05
+#define RACER_MIN '-120 -120 -40'
+#define RACER_MAX '120 120 40'
 
+#ifdef SVQC
 void racer_exit(float eject);
 void racer_enter();
-//void racer_think();
 
-float racer_power_air;
-float racer_power_solid;
-float racer_power_min;
-float racer_anglestabilizer;
-float racer_springlength;
-
-float racer_healthmax;
-float racer_shieldmax;
-float racer_energymax;
-
-float racer_pitchspeed;
-float racer_turnspeed;
-float racer_turnroll;
-float racer_speed_forward;
-float racer_speed_strafe;
-
-float racer_afterburn_cost;
-
-float  jetfromtag_power;
-float  jetfromtag_normpower;
-vector jetfromtag_origin;
-float  jetfromtag_groundcontact;
-
-void racer_loadsettings()
-{
-    racer_power_min         = autocvar_g_vehicle_racer_power_min   * 0.25;
-    racer_power_air         = autocvar_g_vehicle_racer_power_air   * 0.25;
-    racer_power_solid       = autocvar_g_vehicle_racer_power_solid * 0.25;
-
-    racer_springlength      = autocvar_g_vehicle_racer_springlength;
-    racer_anglestabilizer   = autocvar_g_vehicle_racer_anglestabilizer;
-    racer_pitchspeed        = autocvar_g_vehicle_racer_pitchspeed;
-    racer_turnspeed         = autocvar_g_vehicle_racer_turnspeed;
-    racer_turnroll          = autocvar_g_vehicle_racer_turnroll;
-    racer_speed_forward     = autocvar_g_vehicle_racer_speed_forward;
-    racer_speed_strafe      = autocvar_g_vehicle_racer_speed_strafe;
-
-    racer_afterburn_cost    = autocvar_g_vehicle_racer_afterburn_cost;
-
-    racer_healthmax = autocvar_g_vehicle_racer_health;
-    racer_shieldmax = autocvar_g_vehicle_racer_shield;
-    racer_energymax = autocvar_g_vehicle_racer_energy;
-
-}
-
-vector racer_jetfromtag(string tagname)
-{
-    vector force_dir;
-    float  air_frac, solid_frac, air_pwr, solid_pwr;
-
-    jetfromtag_origin = gettaginfo(self,gettagindex(self,tagname));
-    v_forward  = normalize(v_forward) * -1;
-
-    force_dir = jetfromtag_origin - (v_forward  * racer_springlength);
-    traceline(jetfromtag_origin, force_dir, MOVE_NORMAL, self);
-    //te_lightning1(world,jetfromtag_origin, force_dir);
-
-    //trace_fraction *= trace_fraction;
-
-    solid_frac = 1 - trace_fraction;
-    air_frac = trace_fraction;
-
-    if (trace_fraction != 1.0)
-        jetfromtag_groundcontact = 1;
-
-    solid_pwr = solid_frac * racer_power_solid;
-    air_pwr   = air_frac * racer_power_air;
-
-    jetfromtag_power     = solid_pwr + air_pwr;
-    jetfromtag_normpower = jetfromtag_power / (racer_power_air + racer_power_solid);
-
-    //te_lightning1(world,jetfromtag_origin,jetfromtag_origin + normalize(self.origin - force_dir) * max(jetfromtag_power, racer_power_min));
-    //return normalize(self.origin - force_dir) * max(jetfromtag_power, racer_power_min);
-    return v_forward  * max(jetfromtag_power, racer_power_min);
-}
+// Auto cvars
+float autocvar_g_vehicle_racer_speed_afterburn;
+float autocvar_g_vehicle_racer_afterburn_cost;
+
+float autocvar_g_vehicle_racer_anglestabilizer;
+float autocvar_g_vehicle_racer_downforce;
+
+float autocvar_g_vehicle_racer_speed_forward;
+float autocvar_g_vehicle_racer_speed_strafe;
+float autocvar_g_vehicle_racer_springlength;
+float autocvar_g_vehicle_racer_upforcedamper;
+float autocvar_g_vehicle_racer_friction;
+
+float autocvar_g_vehicle_racer_hovertype;
+float autocvar_g_vehicle_racer_hoverpower;
+
+float autocvar_g_vehicle_racer_turnroll;
+float autocvar_g_vehicle_racer_turnspeed;
+float autocvar_g_vehicle_racer_pitchspeed;
+
+float autocvar_g_vehicle_racer_energy;
+float autocvar_g_vehicle_racer_energy_regen;
+float autocvar_g_vehicle_racer_energy_regen_pause;
+
+float autocvar_g_vehicle_racer_health;
+float autocvar_g_vehicle_racer_health_regen;
+float autocvar_g_vehicle_racer_health_regen_pause;
+
+float autocvar_g_vehicle_racer_shield;
+float autocvar_g_vehicle_racer_shield_regen;
+float autocvar_g_vehicle_racer_shield_regen_pause;
+
+float autocvar_g_vehicle_racer_cannon_cost;
+float autocvar_g_vehicle_racer_cannon_damage;
+float autocvar_g_vehicle_racer_cannon_radius;
+float autocvar_g_vehicle_racer_cannon_refire;
+float autocvar_g_vehicle_racer_cannon_speed;
+float autocvar_g_vehicle_racer_cannon_spread;
+float autocvar_g_vehicle_racer_cannon_force;
+
+float autocvar_g_vehicle_racer_rocket_accel;
+float autocvar_g_vehicle_racer_rocket_damage;
+float autocvar_g_vehicle_racer_rocket_radius;
+float autocvar_g_vehicle_racer_rocket_force;
+float autocvar_g_vehicle_racer_rocket_refire;
+float autocvar_g_vehicle_racer_rocket_speed;
+float autocvar_g_vehicle_racer_rocket_turnrate;
+
+float autocvar_g_vehicle_racer_rocket_locktarget;
+float autocvar_g_vehicle_racer_rocket_locking_time;
+float autocvar_g_vehicle_racer_rocket_locking_releasetime;
+float autocvar_g_vehicle_racer_rocket_locked_time;
+float autocvar_g_vehicle_racer_rocket_locked_maxangle;
+
+float autocvar_g_vehicle_racer_respawntime;
+
+float autocvar_g_vehicle_racer_blowup_radius;
+float autocvar_g_vehicle_racer_blowup_coredamage;
+float autocvar_g_vehicle_racer_blowup_edgedamage;
+float autocvar_g_vehicle_racer_blowup_forceintensity;
+
+var vector racer_force_from_tag(string tag_name, float spring_length, float max_power);
 
 void racer_align4point()
 {
-    vector push_vector;
+    vector push_vector, v_add;
     float fl_push, fr_push, bl_push, br_push;
 
-    jetfromtag_groundcontact = 0;
 
-    push_vector = racer_jetfromtag("tag_engine_fr");
-    fr_push = jetfromtag_normpower;
-    traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
-    if(trace_fraction != 1)
-        self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
+    push_vector  = racer_force_from_tag("tag_engine_fr", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+    fr_push      = force_fromtag_normpower;
+    //vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier);
+
+    push_vector += racer_force_from_tag("tag_engine_fl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+    fl_push      = force_fromtag_normpower;
+    //vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier);
 
-    push_vector += racer_jetfromtag("tag_engine_fl");
-    fl_push = jetfromtag_normpower;
-    traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
-    if(trace_fraction != 1)
-        self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
+    push_vector += racer_force_from_tag("tag_engine_br", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+    br_push      = force_fromtag_normpower;
+    //vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier);
 
-    push_vector += racer_jetfromtag("tag_engine_br");
-    br_push = jetfromtag_normpower;
-    traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
-    if(trace_fraction != 1)
-        self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
+    push_vector += racer_force_from_tag("tag_engine_bl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+    bl_push      = force_fromtag_normpower;
+    //vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier);
 
-    push_vector += racer_jetfromtag("tag_engine_bl");
-    bl_push = jetfromtag_normpower;
-    traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
-    if(trace_fraction != 1)
-        self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
+    self.velocity += (push_vector * frametime);
 
-    self.velocity =  self.velocity + (push_vector * frametime);
-    self.velocity_z -= autocvar_sv_gravity * frametime;
+    // Anti ocilation
+    if(self.velocity_z  > 0)
+        self.velocity_z *= 1 - (autocvar_g_vehicle_racer_upforcedamper * frametime);
 
-    push_vector_x = (fl_push - bl_push);
+    self.velocity   += v_add;
+    //self.velocity_z -= autocvar_sv_gravity * frametime;
+
+    push_vector_x =  (fl_push - bl_push);
     push_vector_x += (fr_push - br_push);
     push_vector_x *= 360;
 
@@ -124,105 +107,42 @@ void racer_align4point()
     push_vector_z += (br_push - bl_push);
     push_vector_z *= 360;
 
-    //if (push_vector_z != 0)
-        if(self.angles_z > 0)
-            self.angles_z = max(0, self.angles_z - (racer_anglestabilizer * frametime));
-        else
-            self.angles_z = min(0, self.angles_z + (racer_anglestabilizer * frametime));
-    //else
-        self.angles_z += push_vector_z * frametime;
-
-    //if (push_vector_x != 0)
-        if(self.angles_x > 0)
-            self.angles_x = max(0, self.angles_x - (racer_anglestabilizer * frametime));
-        else
-            self.angles_x = min(0, self.angles_x + (racer_anglestabilizer * frametime));
-    //else
-        self.angles_x += push_vector_x * frametime;
-}
-
-void racer_bolt_explode()
-{
-    vector org2;
-
-    org2 = findbetterlocation (self.origin, 8);
-    pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1);
-    RadiusDamage (self, self.realowner, autocvar_g_vehicle_racer_laser_damage, 0, autocvar_g_vehicle_racer_laser_radius, world, 150, DEATH_WAKIGUN, world);
-    sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
-
-    remove (self);
-}
-
-void racer_rocket_explode()
-{
-    vector org2;
-
-    //if not(self.owner)
-    //    self.owner = self.realowner;
-
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    org2 = findbetterlocation (self.origin, 16);
-    pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
-    RadiusDamage (self, self.realowner ,autocvar_g_vehicle_racer_rocket_damage, 0, autocvar_g_vehicle_racer_rocket_radius, world, 150, DEATH_WAKIROCKET, world);
-
-    remove (self);
-}
-
-void racer_rocket_touch()
-{
-    if(other.owner == self.owner)
-        return;
-
-    PROJECTILE_TOUCH;
-    /*
-    if(pointcontents(self.origin) == CONTENT_SKY)
-    {
-        self.think = SUB_Remove;
-        self.nextthink = time;
-        return;
-    }
-    */
+    // Apply angle diffrance
+    self.angles_z += push_vector_z * frametime;
+    self.angles_x += push_vector_x * frametime;
 
-    racer_rocket_explode();
+    // Apply stabilizer
+    self.angles_x *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * frametime);
+    self.angles_z *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * frametime);
 }
 
 void racer_fire_cannon(string tagname)
 {
+    vector v;
     entity bolt;
 
-    bolt = spawn();
-    bolt.solid           = SOLID_TRIGGER;
-    bolt.movetype        = MOVETYPE_FLYMISSILE;
-    bolt.flags           = FL_PROJECTILE | FL_NOTARGET;
-    bolt.owner           = self;
-    bolt.realowner       = self.owner;
-    bolt.touch           = racer_bolt_explode;
-    bolt.think           = racer_bolt_explode;
-    bolt.nextthink       = time + 9;
-    bolt.bot_dodge       = TRUE;
-    bolt.bot_dodgerating = autocvar_g_vehicle_racer_laser_damage;
-    setorigin(bolt, gettaginfo(self,gettagindex(self,tagname)));
+    v = gettaginfo(self, gettagindex(self, tagname));
+    bolt = vehicles_projectile("wakizashi_gun_muzzleflash", "weapons/lasergun_fire.wav",
+                           v, normalize(v_forward + randomvec() * autocvar_g_vehicle_racer_cannon_spread) * autocvar_g_vehicle_racer_cannon_speed,
+                           autocvar_g_vehicle_racer_cannon_damage, autocvar_g_vehicle_racer_cannon_radius, autocvar_g_vehicle_racer_cannon_force,  0,
+                           DEATH_WAKIGUN, PROJECTILE_WAKICANNON, 0, TRUE, TRUE);
 
-    vector v;
-       // FIXME this uses prydon cursor
-    v = normalize(self.owner.cursor_trace_endpos - bolt.origin);
+       // Fix z-aim (for chase mode)
+    v = normalize(trace_endpos - bolt.origin);
     v_forward_z = v_z * 0.5;
-
-    bolt.velocity = v_forward * autocvar_g_vehicle_racer_laser_speed;
-
-    CSQCProjectile(bolt, TRUE, PROJECTILE_LASER, TRUE);
+    bolt.velocity = v_forward * autocvar_g_vehicle_racer_cannon_speed;
 }
 
 void racer_rocket_groundhugger()
 {
-    vector newdir,olddir;
-    float oldspeed, newspeed;
+    vector olddir, newdir;
+    float oldvel, newvel;
 
     self.nextthink  = time;
 
-    if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time))
+    if(self.owner.deadflag != DEAD_NO || self.cnt < time)
     {
-        racer_rocket_explode();
+        self.use();
         return;
     }
 
@@ -232,35 +152,45 @@ void racer_rocket_groundhugger()
         return;
     }
 
-    olddir   = normalize(self.velocity);
-    oldspeed = vlen(self.velocity);
+    olddir = normalize(self.velocity);
+    oldvel = vlen(self.velocity);
+    newvel = oldvel + self.lip;
 
-    tracebox(self.origin, self.mins, self.maxs, self.origin + olddir * 512, MOVE_WORLDONLY,self);
-    if(trace_fraction >= 0.35)
+    tracebox(self.origin, self.mins, self.maxs, self.origin + olddir * 64, MOVE_WORLDONLY,self);
+    if(trace_fraction <= 0.5)
     {
-        traceline(trace_endpos, trace_endpos - '0 0 512', MOVE_NORMAL, self);
-        if(trace_fraction != 1.0)
-            newdir = trace_endpos + '0 0 32';
-
-        newdir = normalize(newdir - self.origin);
+        // Hitting somethign soon, just speed ahead
+        self.velocity = olddir * newvel;
+        UpdateCSQCProjectile(self);
+        return;
     }
 
-    newspeed = oldspeed + self.lip;
-    self.velocity = normalize(olddir + newdir * self.wait) * newspeed;
+    traceline(trace_endpos, trace_endpos - '0 0 64', MOVE_NORMAL, self);
+    if(trace_fraction != 1.0)
+    {
+        newdir = normalize(trace_endpos + '0 0 64' - self.origin) * autocvar_g_vehicle_racer_rocket_turnrate;
+        self.velocity = normalize(olddir + newdir) * newvel;
+    }
+    else
+    {
+        self.velocity = olddir * newvel;
+        self.velocity_z -= 1600 * sys_frametime; // 2x grav looks better for this one
+    }
 
     UpdateCSQCProjectile(self);
+    return;
 }
 
-void racer_rocket_think()
+void racer_rocket_tracker()
 {
-    vector newdir,olddir, eorg, edir;
-    float oldspeed, newspeed, dist;
+    vector olddir, newdir;
+    float oldvel, newvel;
 
     self.nextthink  = time;
 
-    if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time))
+    if (self.owner.deadflag != DEAD_NO || self.cnt < time)
     {
-        racer_rocket_explode();
+        self.use();
         return;
     }
 
@@ -271,115 +201,71 @@ void racer_rocket_think()
     }
 
     olddir = normalize(self.velocity);
-    oldspeed = vlen(self.velocity);
-    fixedmakevectors(olddir);
-    eorg = 0.5 * (self.enemy.absmin + self.enemy.absmax);
-    edir = normalize(eorg - self.origin);
-    dist = vlen(self.origin - self.enemy.origin);
+    oldvel = vlen(self.velocity);
+    newvel = oldvel + self.lip;
+    makevectors(vectoangles(olddir));
 
-    if(dist > 512)
+    traceline(self.origin, self.origin + v_forward * 64 - '0 0 32', MOVE_NORMAL, self);
+    newdir = normalize(self.enemy.origin - self.origin);
+
+    if(vlen(newdir - v_forward) > autocvar_g_vehicle_racer_rocket_locked_maxangle)
     {
-        vector ddir;
-        float p;
-        p = dist / self.delay;
-        p = max(0.05, p * 0.25);
-        ddir = steerlib_traceavoid(p, oldspeed * 0.25);
-        edir += ddir * 0.95;
+        //bprint("Target lost!\n");
+        //dprint("OF:", ftos(vlen(newdir - v_forward)), "\n");
+        self.think = racer_rocket_groundhugger;
+        return;
     }
 
-    newdir = normalize(olddir + edir * self.wait);
-    newspeed = oldspeed + self.lip;
-    self.velocity = normalize(olddir + newdir * self.wait) * newspeed;
+    if(trace_fraction != 1.0)
+        newdir_z += 16 * sys_frametime;
+
+    self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_racer_rocket_turnrate) * newvel;
+    self.velocity_z -= 800 * sys_frametime;
 
     UpdateCSQCProjectile(self);
+    return;
 }
 
-void racer_fire_rocket(string tagname)
+void racer_fire_rocket(string tagname, entity trg)
 {
+    vector v;
     entity rocket;
 
-    rocket = spawn();
-    setsize (rocket, '-1 -1 -1', '1 1 1');
-    rocket.lip             = autocvar_g_vehicle_racer_rocket_accel * sys_frametime;
-    rocket.wait            = autocvar_g_vehicle_racer_rocket_turnrate;
-    rocket.solid           = SOLID_BBOX;
-    rocket.movetype        = MOVETYPE_FLYMISSILE;
-    rocket.flags           = FL_PROJECTILE;
-    rocket.owner           = self;
-    rocket.realowner       = self.owner;
-    rocket.touch           = racer_rocket_touch;
-    rocket.bot_dodge       = TRUE;
-    rocket.bot_dodgerating = autocvar_g_vehicle_racer_rocket_damage;
-    setorigin(rocket, gettaginfo(self,gettagindex(self,tagname)));
-
-    /*
-    if( (self.tur_head.gun1) && (self.tur_head.cnt > time))
-        rocket.enemy = self.tur_head.gun1;
-
-    if(rocket.enemy)
-    {
-        rocket.delay           = vlen(rocket.enemy.origin  - rocket.origin);
-        rocket.cnt             = time + 9;
-        rocket.velocity = v_forward * autocvar_g_vehicle_racer_rocket_speed;
-        rocket.think = racer_rocket_think;
-        rocket.nextthink = time;
-        CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
-    }
-    else
-    {
-    */
-        rocket.cnt             = time + 9;
-        rocket.velocity = v_forward * autocvar_g_vehicle_racer_rocket_speed;
-        rocket.think = racer_rocket_groundhugger;
-        rocket.nextthink = time;
-        CSQCProjectile(rocket, TRUE, PROJECTILE_ROCKET, TRUE);
-    //}
-}
-
-float racer_customizeentityforclient()
-{
+    v = gettaginfo(self, gettagindex(self, tagname));
+    rocket = vehicles_projectile("wakizashi_rocket_launch", "weapons/rocket_fire.wav",
+                           v, v_forward * autocvar_g_vehicle_racer_rocket_speed,
+                           autocvar_g_vehicle_racer_rocket_damage, autocvar_g_vehicle_racer_rocket_radius, autocvar_g_vehicle_racer_rocket_force, 3,
+                           DEATH_WAKIROCKET, PROJECTILE_WAKIROCKET, 20, FALSE, FALSE);
 
-    if(self.deadflag == DEAD_DEAD)
-        return FALSE;
+    rocket.lip              = autocvar_g_vehicle_racer_rocket_accel * sys_frametime;
+    rocket.wait             = autocvar_g_vehicle_racer_rocket_turnrate;
+    rocket.nextthink        = time;
+    rocket.enemy            = trg;
+    rocket.cnt              = time + 15;
 
-    /*
-    if(other == self.owner)
-        self.alpha = -1;
+    if(trg)
+        rocket.think            = racer_rocket_tracker;
     else
-        self.alpha = 1;
-    */
-
-    return TRUE;
+        rocket.think            = racer_rocket_groundhugger;
 }
 
-float racer_pplug()
+float racer_frame()
 {
     entity player, racer;
-    float ftmp, ftmp2;
     vector df;
-
-    if(autocvar_g_vehicle_racer_reload)
-    {
-        racer_loadsettings();
-        cvar_set("g_vehicle_racer_reload","0");
-    }
-
-    player          = self;
-    racer           = self.vehicle;
-
-    player.BUTTON_ZOOM = 0;
-    player.BUTTON_CROUCH = 0;
-
-    self = racer;
-
-    if(player.BUTTON_USE)
-    {
-        self = racer;
-        racer_exit(0);
-        self = player;
-        return 0;
-    }
-
+    float ftmp;
+
+       if(intermission_running)
+               return 1;
+
+    player  = self;
+    racer   = self.vehicle;
+    self    = racer;
+    
+    player.BUTTON_ZOOM = player.BUTTON_CROUCH = 0;
+    
+    vehicles_painframe();
+    
     if(racer.deadflag != DEAD_NO)
     {
         self = player;
@@ -387,66 +273,100 @@ float racer_pplug()
         return 1;
     }
 
-
     racer_align4point();
 
-    racer.angles_x *= -1;
-    makevectors(racer.angles);
+    crosshair_trace(player);
 
-    // Rotate Body
-    ftmp = racer_turnspeed * sys_frametime;
-    ftmp2 = ftmp * -1;
+    racer.angles_x *= -1;
 
-    ftmp = bound(ftmp2, shortangle_f(player.v_angle_y - racer.angles_y, racer.angles_y), ftmp);
-    ftmp2 = anglemods(racer.angles_y + ftmp);
+    // Yaw
+    ftmp = autocvar_g_vehicle_racer_turnspeed * frametime;
+    ftmp = bound(-ftmp, shortangle_f(player.v_angle_y - racer.angles_y, racer.angles_y), ftmp);
+    racer.angles_y = anglemods(racer.angles_y + ftmp);
 
     // Roll
-    ftmp = bound(-45, shortangle_f(player.v_angle_z + ((racer.angles_y - ftmp2) * racer_turnroll), racer.angles_z), 45);
-    ftmp = anglemods(racer.angles_z + ftmp);
-    racer.angles_z = bound(-85, ftmp, 85);
+    racer.angles_z += -ftmp * autocvar_g_vehicle_racer_turnroll * frametime;
 
-    // Turn
-    racer.angles_y = ftmp2;
+    // Pitch
+    ftmp = autocvar_g_vehicle_racer_pitchspeed  * frametime;
+    ftmp = bound(-ftmp, shortangle_f(player.v_angle_x - racer.angles_x, racer.angles_x), ftmp);
+    racer.angles_x = bound(-30, anglemods(racer.angles_x + ftmp), 30);
 
-    // Pitch Body
-    ftmp = racer_pitchspeed * sys_frametime;
-    ftmp2 = ftmp * -1;
-
-    ftmp = bound(ftmp2,shortangle_f(player.v_angle_x - racer.angles_x,racer.angles_x),ftmp);
-    racer.angles_x = anglemods(racer.angles_x + ftmp);
+    makevectors(racer.angles);
     racer.angles_x *= -1;
 
-    df = racer.velocity * -0.5;
+
+    ftmp = racer.velocity_z;
+    df = racer.velocity * -autocvar_g_vehicle_racer_friction;
+    racer.velocity_z = ftmp;
 
     if(player.movement_x != 0)
     {
         if(player.movement_x > 0)
-            df += v_forward  * racer_speed_forward;
+            df += v_forward  * autocvar_g_vehicle_racer_speed_forward;
         else if(player.movement_x < 0)
-            df -= v_forward  * racer_speed_forward;
+            df -= v_forward  * autocvar_g_vehicle_racer_speed_forward;
     }
 
     if(player.movement_y != 0)
     {
         if(player.movement_y < 0)
-            df -= v_right * racer_speed_strafe;
+            df -= v_right * autocvar_g_vehicle_racer_speed_strafe;
         else if(player.movement_y > 0)
-            df += v_right * racer_speed_strafe;
+            df += v_right * autocvar_g_vehicle_racer_speed_strafe;
     }
-
-    // limit _z to avoid flying on normal thrust
-    if(df_z > 0)
-        df_z = min(df_z,700);
-
-
+    
+    if(vlen(player.movement) != 0)
+    {
+        if(self.sound_nexttime < time || self.sounds != 1)
+        {        
+            self.sounds = 1;
+            self.sound_nexttime = time + 10.922667; //soundlength("vehicles/racer_move.wav");
+            sound (self, CH_TRIGGER_SINGLE, "vehicles/racer_move.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+        }
+    }
+    else
+    {        
+        if(self.sound_nexttime < time || self.sounds != 0)
+        {        
+            self.sounds = 0;
+            self.sound_nexttime = time + 11.888604; //soundlength("vehicles/racer_idle.wav");
+            sound (self, CH_TRIGGER_SINGLE, "vehicles/racer_idle.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+        }        
+    }
+    
     // Afterburn
-    if (player.BUTTON_JUMP)
-    if(racer.vehicle_energy >= (racer_afterburn_cost * frametime))
+    if (player.BUTTON_JUMP && racer.vehicle_energy >= (autocvar_g_vehicle_racer_afterburn_cost * frametime))
     {
-        racer.wait = time + autocvar_g_vehicle_racer_energy_usepause;
-        racer.vehicle_energy -= racer_afterburn_cost * frametime;
+        if(time - racer.wait > 0.2)
+            pointparticles(particleeffectnum("wakizashi_booster_smoke"), self.origin, '0 0 0', 1);            
+        
+        racer.wait = time;
+        racer.vehicle_energy -= autocvar_g_vehicle_racer_afterburn_cost * frametime;
         df += (v_forward * autocvar_g_vehicle_racer_speed_afterburn);
+        
+        if(self.invincible_finished < time)
+        {            
+            traceline(self.origin, self.origin - '0 0 256', MOVE_NORMAL, self);
+            if(trace_fraction != 1.0)
+                pointparticles(particleeffectnum("smoke_small"), trace_endpos, '0 0 0', 1);
+            
+            self.invincible_finished = time + 0.1 + (random() * 0.1);
+        }
+
+        if(self.strength_finished < time)
+        {        
+            //self.sounds = 2;
+            self.strength_finished = time + 10.922667; //soundlength("vehicles/racer_boost.wav");
+            sound (self.tur_head, CH_TRIGGER_SINGLE, "vehicles/racer_boost.wav", VOL_VEHICLEENGINE, ATTN_NORM);            
+        }        
+    }
+    else
+    {
+        self.strength_finished = 0;
+        sound (self.tur_head, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_VEHICLEENGINE, ATTN_NORM);
     }
+        
 
     racer.velocity  += df * frametime;
 
@@ -454,23 +374,14 @@ float racer_pplug()
     racer.velocity  = racer.velocity - df;
     player.movement = racer.velocity;
 
-    /*
-    // for homing rockets
-       // FIXME this uses prydon cursor
-    if(self.owner.cursor_trace_ent)
-    {
-        self.tur_head.gun1 = self.owner.cursor_trace_ent;
-        self.tur_head.cnt = time + 1;
-    }
-    */
-
     if(player.BUTTON_ATCK)
     if(time > racer.attack_finished_single)
-    if(racer.vehicle_energy >= autocvar_g_vehicle_racer_laser_cost)
+    if(racer.vehicle_energy >= autocvar_g_vehicle_racer_cannon_cost)
     {
-        racer.vehicle_energy -= autocvar_g_vehicle_racer_laser_cost;
-        racer.wait = time + autocvar_g_vehicle_racer_energy_usepause;
+        racer.vehicle_energy -= autocvar_g_vehicle_racer_cannon_cost;
+        racer.wait = time;
 
+        crosshair_trace(player);
         if(racer.cnt)
         {
             racer_fire_cannon("tag_fire1");
@@ -481,418 +392,287 @@ float racer_pplug()
             racer_fire_cannon("tag_fire2");
             racer.cnt = 1;
         }
-        racer.attack_finished_single = time + autocvar_g_vehicle_racer_laser_refire;
+        racer.attack_finished_single = time + autocvar_g_vehicle_racer_cannon_refire;
+        //self.owner.vehicle_energy = racer.vehicle_energy / autocvar_g_vehicle_racer_energy;
     }
 
-    if(player.BUTTON_ATCK2)
-    if(time > racer.delay)
+    if(autocvar_g_vehicle_racer_rocket_locktarget)
     {
-        racer_fire_rocket("tag_rocket_r");
-        racer_fire_rocket("tag_rocket_l");
-        racer.delay = time + autocvar_g_vehicle_racer_rocket_refire;
-        racer.lip = time;
+        vehicles_locktarget((1 / autocvar_g_vehicle_racer_rocket_locking_time) * frametime,
+                         (1 / autocvar_g_vehicle_racer_rocket_locking_releasetime) * frametime,
+                         autocvar_g_vehicle_racer_rocket_locked_time);
 
+        if(self.lock_target)
+        {
+            if(racer.lock_strength == 1)
+                UpdateAuxiliaryXhair(player, real_origin(self.lock_target), '1 0 0', 0);
+            else if(self.lock_strength > 0.5)
+                UpdateAuxiliaryXhair(player, real_origin(self.lock_target), '0 1 0', 0);
+            else if(self.lock_strength < 0.5)
+                UpdateAuxiliaryXhair(player, real_origin(self.lock_target), '0 0 1', 0);
+        }
     }
 
-    player.vehicle_reload1 = (time - racer.lip) / (racer.delay-racer.lip);
-    vehicle_stdproc_shiledregen(racer_shieldmax, frametime);
-    vehicle_stdproc_healthregen(racer_healthmax, frametime);
-
-    if (racer.wait < time)
-        vehicle_stdproc_energyregen(racer_energymax, frametime);
-    else
-        player.vehicle_energy = (racer.vehicle_energy / racer_energymax);
-
-    self = player;
+    if(time > racer.delay)
+    if(player.BUTTON_ATCK2)
+    {
+        self.misc_bulletcounter += 1;
+        racer.delay = time + 0.3;
+        if(self.misc_bulletcounter == 1)
+            racer_fire_rocket("tag_rocket_r", (self.lock_strength == 1 && self.lock_target) ? self.lock_target : world);
+        else if(self.misc_bulletcounter == 2)
+        {
+            racer_fire_rocket("tag_rocket_l", (self.lock_strength == 1 && self.lock_target) ? self.lock_target : world);
+            self.lock_strength  = 0;
+            self.lock_target    = world;
+            self.misc_bulletcounter = 0;
 
-    player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
-    setorigin(player,racer.origin + '0 0 32');
-    player.velocity = racer.velocity;
+            racer.delay = time + autocvar_g_vehicle_racer_rocket_refire;
+            racer.lip = time;
+        }
+    }
+    player.vehicle_reload1 = bound(0, 100 * ((time - racer.lip) / (racer.delay - racer.lip)), 100);
 
-    return 1;
-}
+    if(self.vehicle_flags  & VHF_SHIELDREGEN)
+        vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_racer_shield, autocvar_g_vehicle_racer_shield_regen_pause, autocvar_g_vehicle_racer_shield_regen, frametime);
 
-void racer_exitthink()
-{
-    float a, b, c;
+    if(self.vehicle_flags  & VHF_HEALTHREGEN)
+        vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_racer_health, autocvar_g_vehicle_racer_health_regen_pause, autocvar_g_vehicle_racer_health_regen, frametime);
 
-    self.nextthink = time;
+    if(self.vehicle_flags  & VHF_ENERGYREGEN)
+        vehicles_regen(wait, vehicle_energy, autocvar_g_vehicle_racer_energy, autocvar_g_vehicle_racer_energy_regen_pause, autocvar_g_vehicle_racer_energy_regen, frametime);
 
-    a = racer_anglestabilizer;
-    b = racer_springlength;
-    c = racer_power_solid;
 
-    racer_anglestabilizer = 36;
-    racer_springlength = 96;
-    racer_power_solid = 300;
+    VEHICLE_UPDATE_PLAYER(health, racer);
+    VEHICLE_UPDATE_PLAYER(energy, racer);
 
-    racer_align4point();
+    if(self.vehicle_flags & VHF_HASSHIELD)
+        VEHICLE_UPDATE_PLAYER(shield, racer);
 
-    if(self.velocity_z < 0)
-        self.velocity_z *= 0.95;
 
-    racer_anglestabilizer = a;
-    racer_springlength = b;
-    racer_power_solid = c;
+    player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
+    setorigin(player,racer.origin + '0 0 32');
+    player.velocity = racer.velocity;
 
-    self.velocity_x *= 0.95;
-    self.velocity_y *= 0.95;
+    self = player;
+    return 1;
 }
 
-void racer_spawnthink()
+void racer_think()
 {
-    float a, b, c;
-    vector dorg;
-
-    self.nextthink = time;
-
-    a = racer_anglestabilizer;
-    b = racer_springlength;
-    c = racer_power_solid;
-
-    racer_anglestabilizer = 36;
-    racer_springlength = 96;
-    racer_power_solid = 300;
-
-    // self.velocity_z += sin(time * 128) * 4;
-
-    racer_align4point();
+    /*
+    float a, b, c;a = autocvar_g_vehicle_racer_anglestabilizer;
+    b = autocvar_g_vehicle_racer_springlength;
+    c = autocvar_g_vehicle_racer_hoverpower;
 
-    if(self.velocity_z < 0)
-        self.velocity_z *= 0.98;
+    autocvar_g_vehicle_racer_anglestabilizer = 36;
+    autocvar_g_vehicle_racer_springlength = 96;
+    autocvar_g_vehicle_racer_hoverpower = 300;
+    */
 
-    racer_anglestabilizer = a;
-    racer_springlength = b;
-    racer_power_solid = c;
+    racer_align4point(); //time - self.nextthink);
 
-    self.velocity_x *= 0.95;
-    self.velocity_y *= 0.95;
+    /*
+    //if(self.velocity_z > 0)
+    //    self.velocity_z *= 0.95;
 
-    dorg = self.pos1 - self.origin ;
+    autocvar_g_vehicle_racer_anglestabilizer = a;
+    autocvar_g_vehicle_racer_springlength = b;
+    autocvar_g_vehicle_racer_hoverpower = c;
+    */
 
-    self.velocity_x = bound(-32, self.velocity_x + dorg_x, 32);
-    self.velocity_y = bound(-32, self.velocity_y + dorg_y, 32);
+    self.velocity_x *= 0.9;
+    self.velocity_y *= 0.9;
+    self.velocity_z *= 0.8;
+    self.velocity_z += sin(time * 2) * 16;
+    self.nextthink = time; // + 0.05;
 }
 
 void racer_enter()
 {
-    self.owner = other;
-
-
-    self.nextthink = 0;
-    self.flags               = 0;
-    self.vehicle_hudmodel.viewmodelforclient = self.owner;
-    self.colormap             = self.owner.colormap;
-
-    self.owner.PlayerPhysplug = racer_pplug;
-    self.owner.takedamage     = DAMAGE_NO;
-    self.owner.event_damage   = SUB_Null;
-    self.owner.vehicle        = self;
-    self.owner.angles = self.angles;
-    self.owner.solid          = SOLID_NOT;
-    self.owner.movetype       = MOVETYPE_NOCLIP;
-    self.owner.alpha          = -1;
-    self.owner.hud            = HUD_WAKIZASHI;
-    self.owner.effects        |= EF_NODRAW;
-    self.owner.view_ofs = '0 0 0';
-
+    self.movetype = MOVETYPE_BOUNCE;
     self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_racer_health);
     self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_racer_shield);
-
-    setorigin(other,self.origin + '0 0 32');
-    other.velocity = self.velocity;
-
-    other.flags &~= FL_ONGROUND;
-    msg_entity = other;
-    WriteByte (MSG_ONE, SVC_SETVIEWPORT);
-    WriteEntity( MSG_ONE, self.vehicle_viewport);
-
-    WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
-    WriteAngle(MSG_ONE,  self.angles_x * -1);    // tilt
-    WriteAngle(MSG_ONE,  self.angles_y);    // yaw
-    WriteAngle(MSG_ONE,  0);                // roll
-}
-
-void racer_spawn();
-void racer_return()
-{
-    pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1);
-    self.enemy.think = racer_spawn;
-    self.enemy.nextthink = time;
-    remove(self);
+    
+    if(self.owner.flagcarried)
+       setorigin(self.owner.flagcarried, '-190 0 96');
 }
 
 void racer_exit(float eject)
 {
-       self.colormap   = 1024;
-       self.flags      = FL_NOTARGET;
-
+    vector spot;
+    
+    self.think      = racer_think;
+    self.nextthink  = time;
+    self.movetype   = MOVETYPE_TOSS;
+    sound (self.tur_head, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+    
     if not (self.owner)
         return;
 
-    msg_entity = self.owner;
-    WriteByte (MSG_ONE, SVC_SETVIEWPORT);
-    WriteEntity( MSG_ONE, self.owner);
-
-    WriteByte (MSG_ONE, SVC_SETVIEWANGLES);    // 10 = SVC_SETVIEWANGLES
-    WriteAngle(MSG_ONE,  0);                   // tilt
-    WriteAngle(MSG_ONE,  self.angles_y); // yaw
-    WriteAngle(MSG_ONE,  0);                   // roll
-
-    if (self.deadflag == DEAD_NO)
-    {
-        self.think = racer_exitthink;
-        self.nextthink = time;
-    }
-
-    self.owner.takedamage     = DAMAGE_AIM;
-    self.owner.solid          = SOLID_SLIDEBOX;
-    self.owner.movetype       = MOVETYPE_WALK;
-
-    setsize(self.owner,PL_MIN,PL_MAX);
-
-    self.owner.effects        &~= EF_NODRAW;
-    self.owner.alpha          = 1;
-    self.owner.PlayerPhysplug = SUB_Null;
-    self.owner.vehicle        = world;
-       self.owner.view_ofs       = PL_VIEW_OFS;
-       self.owner.event_damage   = PlayerDamage;
-       self.owner.hud            = HUD_NORMAL;
-
-    self.vehicle_hudmodel.viewmodelforclient = self;
-
+       makevectors(self.angles);
        if(eject)
        {
-           makevectors(self.angles);
-           setorigin(self.owner,self.origin + v_forward * 100);
+           spot = self.origin + v_forward * 100 + '0 0 64';
+           spot = vehicles_findgoodexit(spot);
+           setorigin(self.owner , spot);
            self.owner.velocity = (v_up + v_forward * 0.25) * 750;
        }
        else
        {
-           self.owner.velocity = (v_forward) * -150;
-        setorigin(self.owner,self.origin - v_forward * 128);
+           spot = self.origin - v_forward * 200 + '0 0 64';
+           spot = vehicles_findgoodexit(spot);
+           setorigin(self.owner , spot);
        }
-
+       
     self.owner = world;
-
-    if (self.deadflag != DEAD_NO)
-    {
-        entity ret;
-        ret = spawn();
-        ret.enemy = self;
-        ret.think = racer_return;
-        ret.nextthink = time + autocvar_g_vehicle_racer_respawntime;
-    }
-}
-
-void racer_touch()
-{
-    if(self.owner)
-    {
-        if(vlen(self.velocity) == 0)
-            return;
-
-        if(other.classname != "player")
-            return;
-
-        vector a;
-        a = normalize(other.origin - self.origin);
-        a = a - normalize(self.velocity);
-
-        return;
-    }
-
-    if(other.classname != "player")
-        return;
-
-    if(other.deadflag != DEAD_NO)
-        return;
-
-    if(other.vehicle != world)
-        return;
-
-    racer_enter();
 }
 
 void racer_spawn()
 {
-    self.think = racer_spawnthink;
-    self.nextthink = time;
-
-    self.flags      = FL_NOTARGET;
-    self.effects   = 0;
-
-    self.vehicle_health = racer_healthmax;
-    self.vehicle_shield = racer_shieldmax;
+    self.think          = racer_think;
+    self.nextthink      = time;
+    self.vehicle_health = autocvar_g_vehicle_racer_health;
+    self.vehicle_shield = autocvar_g_vehicle_racer_shield;
 
-    self.event_damage = vehicle_stdproc_damage;
-    self.touch      = racer_touch;
+    self.movetype       = MOVETYPE_TOSS;
+    self.solid          = SOLID_SLIDEBOX;
+    self.delay          = time;
+    self.scale          = 0.5;
 
-    self.iscreature = TRUE;
-    self.scale      = 0.5;
-    self.movetype   = MOVETYPE_FLY;
-    self.solid      = SOLID_SLIDEBOX;
-    self.takedamage = DAMAGE_AIM;
-
-    self.alpha = 1;
-       self.colormap = 1024;
-       self.deadflag    = DEAD_NO;
-    self.bot_attack = TRUE;
-
-    self.vehicle_energy = 1;
-    self.vehicle_hudmodel.viewmodelforclient = self;
-
-    setorigin(self, self.pos1);
-    self.angles = self.pos2;
-
-    setsize(self,RACER_MIN * 0.5,RACER_MAX * 0.5);
-    pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
-    self.delay = time;
+    setsize(self, RACER_MIN * 0.5, RACER_MAX * 0.5);
 }
 
 
 void racer_blowup()
 {
-
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
-
     self.deadflag    = DEAD_DEAD;
     self.vehicle_exit(VHEF_NORMAL);
-    RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_WAKIBLOWUP, world);
 
-    self.alpha = -1;
+    RadiusDamage (self, self, autocvar_g_vehicle_racer_blowup_coredamage,
+                                       autocvar_g_vehicle_racer_blowup_edgedamage,
+                                       autocvar_g_vehicle_racer_blowup_radius, world,
+                                       autocvar_g_vehicle_racer_blowup_forceintensity,
+                                       DEATH_WAKIBLOWUP, world);
+
     self.nextthink  = time + autocvar_g_vehicle_racer_respawntime;
     self.think      = racer_spawn;
     self.movetype   = MOVETYPE_NONE;
     self.effects    = EF_NODRAW;
 
-    self.avelocity_z  = 0;
-    self.colormod = '0 0 0';
+    self.colormod  = '0 0 0';
+    self.avelocity = '0 0 0';
+    self.velocity  = '0 0 0';
 
-    setorigin(self,self.pos1);
+    setorigin(self, self.pos1);
+       self.think     = racer_spawn;
+       self.nextthink = time + autocvar_g_vehicle_racer_respawntime;
 }
 
-void racer_dietouch()
+void racer_deadtouch()
 {
-    if(self.wait > time)
-        return;
-
-    self.wait = time + 0.75;
-
-    pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
+    self.avelocity_x *= 0.7;
+    self.cnt -= 1;
+    if(self.cnt <= 0)
+        racer_blowup();
 }
 
 void racer_die()
 {
     self.health       = 0;
     self.event_damage = SUB_Null;
-    self.iscreature   = FALSE;
-    self.solid        = SOLID_NOT;
+    self.solid        = SOLID_CORPSE;
     self.takedamage   = DAMAGE_NO;
-    self.touch        = racer_dietouch;
     self.deadflag     = DEAD_DYING;
     self.movetype     = MOVETYPE_BOUNCE;
-    self.wait = time;
-
-    pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
-
-    self.velocity     += '0 0 128';
+    self.wait         = time;
+    self.cnt          = 1 + random() * 2;
+    self.touch        = racer_deadtouch;
+    
+    pointparticles(particleeffectnum("explosion_medium"), self.origin, '0 0 0', 1);    
 
     if(random() < 0.5)
-        self.avelocity_z  = 16;
+        self.avelocity_z  = 32;
     else
-        self.avelocity_z  = -16;
+        self.avelocity_z  = -32;
 
-    self.colormod = '-0.5 -0.5 -0.5';
+    self.avelocity_x = -vlen(self.velocity) * 0.2;
+    self.velocity   += '0 0 700';
+    self.colormod    = '-0.5 -0.5 -0.5';
 
        self.think     = racer_blowup;
-       self.nextthink = time + 3;
+       self.nextthink = 2 + time + random() * 3;
 }
 
 void racer_dinit()
 {
+    if not (vehicle_initialize(
+             "Wakizashi",
+             "models/vehicles/wakizashi.dpm",
+             "null", // we need this so tur_head is networked and usable for sounds
+             "models/vehicles/wakizashi_cockpit.dpm",
+             "", "", "tag_viewport",
+             HUD_WAKIZASHI,
+             0.5 * RACER_MIN, 0.5 * RACER_MAX,
+             FALSE,
+             racer_spawn, autocvar_g_vehicle_racer_respawntime,
+             racer_frame,
+             racer_enter, racer_exit,
+             racer_die,   racer_think,
+             TRUE))
+    {
+        remove(self);
+        return;
+    }
 
-    tracebox(self.origin + '0 0 100', RACER_MIN * 0.5, RACER_MAX * 0.5, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
-    setorigin(self,trace_endpos);
-
-    if (self.netname == "")
-        self.netname     = "Race PoD";
-
-    self.cvar_basename      = "g_vehicle_racer";
-
-    self.vehicle_viewport   = spawn();
-    self.vehicle_hudmodel   = spawn();
-    //self.ccamera            = spawn();
-
-    setorigin(self, self.origin);
-
-    setmodel(self,"models/vehicles/wakizashi.dpm");
-    setmodel(self.vehicle_hudmodel, "models/vehicles/wakizashi_cockpit.dpm");
-    setmodel (self.vehicle_viewport, "null");
+    if(autocvar_g_vehicle_racer_hovertype != 0)
+        racer_force_from_tag = vehicles_force_fromtag_maglev;
+    else
+        racer_force_from_tag = vehicles_force_fromtag_hover;
 
+    // FIXME: this be hakkz, fix the models insted (scale body, add tag_viewport to the hudmodel).
+    self.scale = 0.5;
     setattachment(self.vehicle_hudmodel, self, "");
     setattachment(self.vehicle_viewport, self, "tag_viewport");
 
-    self.vehicle_hudmodel.viewmodelforclient = self;
-    self.customizeentityforclient            = racer_customizeentityforclient;
-
-    self.tur_head     = spawn();
-
-    self.pos1         = self.origin;
-    self.pos2         = self.angles;
-    self.angles       = '0 0 0';
-    self.angles       = self.pos1;
-
-    self.vehicle_die  = racer_die;
-    self.vehicle_exit = racer_exit;
-
-    addstat(STAT_HUD, AS_INT,  hud);
-       addstat(STAT_VEHICLESTAT_HEALTH,  AS_FLOAT, vehicle_health);
-       addstat(STAT_VEHICLESTAT_SHIELD,  AS_FLOAT, vehicle_shield);
-       addstat(STAT_VEHICLESTAT_ENERGY,  AS_FLOAT, vehicle_energy);
-
-       addstat(STAT_VEHICLESTAT_AMMO1,   AS_INT,   vehicle_ammo1);
-       addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1);
-
-       addstat(STAT_VEHICLESTAT_AMMO2,   AS_INT,   vehicle_ammo2);
-       addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
-
-    racer_spawn();
+    self.mass               = 900;
 }
 
 void spawnfunc_vehicle_racer()
 {
-    g_turrets_common_precash();
-    racer_loadsettings();
+    self.vehicle_flags |= VHF_DMGSHAKE;
+    self.vehicle_flags |= VHF_DMGROLL;
 
-    self.vehicle_flags      = VHF_HASSHIELD | VHF_SHIELDREGEN;
-
-    /*
-    traceline(self.origin,self.origin - '0 0 2048',MOVE_WORLDONLY,self);
-    if(trace_startsolid)
-    {
-        dprint("WARNING: vehicle_racer placed in solid\n");
-        traceline(self.origin + '0 0 512' ,self.origin - '0 0 2048',MOVE_WORLDONLY,self);
-        if(trace_startsolid || trace_fraction == 1.0)
-        {
-            dprint("ERROR: vehicle_racer placed in more then 512 units into solid\n");
-            remove(self);
-            return;
-        }
-    }
-    */
-
-    if(trace_fraction != 1.0)
-        setorigin(self,trace_endpos + '0 0 128');
-    else
-        dprint("WARNING: vehicle_racer placed more then 2048 units above ground.\n");
+    precache_sound ("weapons/lasergun_fire.wav");
+    precache_sound ("weapons/rocket_fire.wav");
+    
+    precache_sound ("vehicles/racer_idle.wav");
+    precache_sound ("vehicles/racer_move.wav");
+    precache_sound ("vehicles/racer_boost.wav");
 
+    precache_model ("models/vhshield.md3");
     precache_model ("models/vehicles/wakizashi.dpm");
     precache_model ("models/vehicles/wakizashi_cockpit.dpm");
-    precache_model ("maps/bspmodel.bsp");
 
+    vehicles_configcheck("vehicle_racer.cfg", autocvar_g_vehicle_racer_health);
+    if(autocvar_g_vehicle_racer_energy)
+        if(autocvar_g_vehicle_racer_energy_regen)
+            self.vehicle_flags |= VHF_ENERGYREGEN;
+
+    if(autocvar_g_vehicle_racer_shield)
+        self.vehicle_flags |= VHF_HASSHIELD;
+
+    if(autocvar_g_vehicle_racer_shield_regen)
+        self.vehicle_flags |= VHF_SHIELDREGEN;
+
+    if(autocvar_g_vehicle_racer_health_regen)
+        self.vehicle_flags |= VHF_HEALTHREGEN;
 
     self.think = racer_dinit;
-    self.nextthink = time + 1;
+    
+    if(g_assault)
+        self.nextthink = time + 0.5;
+    else
+        self.nextthink = time + (autocvar_g_vehicles_delayspawn ? autocvar_g_vehicle_racer_respawntime + (random() * autocvar_g_vehicles_delayspawn_jitter) : 0.5);
 }
+#endif // SVQC
index 38ebad04275078262cfc5d9bbdf3c6613ad50557..201c186c37947d65ad983efd0b4c67c1f0484120 100644 (file)
-#define RAPTOR_MIN '-40 -40 0'
-#define RAPTOR_MAX '40 40 40'
-
-float raptor_movestyle;
-float raptor_turnspeed;
-float raptor_turnroll;
-float raptor_pitchspeed;
-float raptor_speed_forward;
-float raptor_speed_strafe;
-float raptor_speed_up;
-float raptor_speed_down;
-
-float raptor_bomblet_waves;
-float raptor_bomblet_wavefirst;
-float raptor_bomblet_wavenext;
-float raptor_bomblet_wawespread;
-float raptor_bomblets;
-float raptor_bomblet_damage;
-float raptor_bomblet_edgedamage;
-float raptor_bomblet_radius;
-float raptor_bomblet_force;
-float raptor_bombs_refire;
-
-float raptor_beam_dps;
-float raptor_beam_fops;
-float raptor_beam_aps;
-float raptor_beam_size;
-float raptor_beam_leangth;
-float raptor_beam_refire;
-
-float raptor_shield_max;
-float raptor_shield_regen;
-
-float raptor_health_max;
-float raptor_health_regen;
-
-float raptor_energy_max;
-float raptor_energy_regen;
+#ifdef SVQC
+#define RAPTOR_MIN '-80 -80 0'
+#define RAPTOR_MAX '80 80 70'
+
+float autocvar_g_vehicle_raptor_respawntime;
+
+float autocvar_g_vehicle_raptor_movestyle;
+float autocvar_g_vehicle_raptor_turnspeed;
+float autocvar_g_vehicle_raptor_pitchspeed;
+float autocvar_g_vehicle_raptor_pitchlimit;
+
+float autocvar_g_vehicle_raptor_speed_forward;
+float autocvar_g_vehicle_raptor_speed_strafe;
+float autocvar_g_vehicle_raptor_speed_up;
+float autocvar_g_vehicle_raptor_speed_down;
+float autocvar_g_vehicle_raptor_friction;
+
+float autocvar_g_vehicle_raptor_bomblets;
+float autocvar_g_vehicle_raptor_bomblet_alt;
+float autocvar_g_vehicle_raptor_bomblet_time;
+float autocvar_g_vehicle_raptor_bomblet_damage;
+float autocvar_g_vehicle_raptor_bomblet_spread;
+float autocvar_g_vehicle_raptor_bomblet_edgedamage;
+float autocvar_g_vehicle_raptor_bomblet_radius;
+float autocvar_g_vehicle_raptor_bomblet_force;
+float autocvar_g_vehicle_raptor_bomblet_explode_delay;
+float autocvar_g_vehicle_raptor_bombs_refire;
+
+float autocvar_g_vehicle_raptor_cannon_turnspeed;
+float autocvar_g_vehicle_raptor_cannon_turnlimit;
+float autocvar_g_vehicle_raptor_cannon_pitchlimit_up;
+float autocvar_g_vehicle_raptor_cannon_pitchlimit_down;
+
+float autocvar_g_vehicle_raptor_cannon_locktarget;
+float autocvar_g_vehicle_raptor_cannon_locking_time;
+float autocvar_g_vehicle_raptor_cannon_locking_releasetime;
+float autocvar_g_vehicle_raptor_cannon_locked_time;
+float autocvar_g_vehicle_raptor_cannon_predicttarget;
+
+float autocvar_g_vehicle_raptor_cannon_cost;
+float autocvar_g_vehicle_raptor_cannon_damage;
+float autocvar_g_vehicle_raptor_cannon_radius;
+float autocvar_g_vehicle_raptor_cannon_refire;
+float autocvar_g_vehicle_raptor_cannon_speed;
+float autocvar_g_vehicle_raptor_cannon_spread;
+float autocvar_g_vehicle_raptor_cannon_force;
+
+float autocvar_g_vehicle_raptor_energy;
+float autocvar_g_vehicle_raptor_energy_regen;
+float autocvar_g_vehicle_raptor_energy_regen_pause;
+
+float autocvar_g_vehicle_raptor_health;
+float autocvar_g_vehicle_raptor_health_regen;
+float autocvar_g_vehicle_raptor_health_regen_pause;
+
+float autocvar_g_vehicle_raptor_shield;
+float autocvar_g_vehicle_raptor_shield_regen;
+float autocvar_g_vehicle_raptor_shield_regen_pause;
 
 void raptor_spawn();
-void raptor_return();
-float raptor_pplug();
+float raptor_frame();
 float raptor_takeoff();
-float raptor_land();
 
 .entity bomb1;
 .entity bomb2;
 
 float raptor_altitude(float amax)
 {
-       tracebox(self.origin, self.mins, self.maxs, '0 0 -1' * amax, TRUE, self);
-       if(trace_fraction == 1)
-        return amax+1;
-    else
-        return vlen(self.origin - trace_endpos);
+       tracebox(self.origin, self.mins, self.maxs, self.origin - ('0 0 1' * amax), TRUE, self);
+    return vlen(self.origin - trace_endpos);
 }
 
-void raptor_loadsettings()
-{
-    raptor_movestyle     = CCVAR("_movestyle");
-    raptor_turnspeed     = CCVAR("_turnspeed");
-    raptor_turnroll      = CCVAR("_turnroll");
-    raptor_pitchspeed    = CCVAR("_pitchspeed");
-    raptor_speed_forward = CCVAR("_speed_forward");
-    raptor_speed_strafe  = CCVAR("_speed_strafe");
-    raptor_speed_up      = CCVAR("_speed_up");
-    raptor_speed_down    = CCVAR("_speed_down");
-
-    raptor_bomblet_waves      = CCVAR("_bomblet_waves ");
-    raptor_bomblet_wavefirst  = CCVAR("_bomblet_wavefirst");
-    raptor_bomblet_wavenext   = CCVAR("_bomblet_wavenext");
-    raptor_bomblet_wawespread = CCVAR("_bomblet_wawespread");
-    raptor_bomblets           = CCVAR("_bomblets");
-    raptor_bomblet_damage     = CCVAR("_bomblet_damage");
-    raptor_bomblet_edgedamage = CCVAR("_bomblet_edgedamage");
-    raptor_bomblet_radius     = CCVAR("_bomblet_radius");
-    raptor_bomblet_force      = CCVAR("_bomblet_force ");
-    raptor_bombs_refire       = CCVAR("_bombs_refire");
-
-    raptor_beam_dps     = CCVAR("_beam_dps");
-    raptor_beam_fops    = CCVAR("_beam_fops");
-    raptor_beam_aps     = CCVAR("_beam_aps");
-    raptor_beam_size    = CCVAR("_beam_size");
-    raptor_beam_leangth = CCVAR("_beam_length");
-    raptor_beam_refire  = CCVAR("_beam_refire");
-
-    raptor_shield_max    = CCVAR("_shield");
-    raptor_shield_regen  = CCVAR("_shield_regen");
-
-    raptor_health_max    = CCVAR("_health");
-    raptor_health_regen  = CCVAR("_health_regen");
-
-    raptor_energy_max    = CCVAR("_energy");
-    raptor_energy_regen  = CCVAR("_energy_regen");
-}
 
-void raptor_bombs_return()
+void raptor_bomblet_boom()
 {
-    self.owner.bomb1.alpha = 1;
-    self.owner.bomb2.alpha = 1;
+    RadiusDamage (self, self.realowner, autocvar_g_vehicle_raptor_bomblet_damage,
+                                    autocvar_g_vehicle_raptor_bomblet_edgedamage,
+                                    autocvar_g_vehicle_raptor_bomblet_radius, world,
+                                    autocvar_g_vehicle_raptor_bomblet_force, DEATH_RAPTOR_BOMB, world);
     remove(self);
 }
 
-void raptor_bomblet_boom()
+void raptor_bomblet_touch()
 {
-    if(other.enemy == self.enemy)
+    if(other == self.owner)
         return;
 
-    pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
-    RadiusDamage (self, self.enemy, raptor_bomblet_damage, raptor_bomblet_edgedamage, raptor_bomblet_radius, world, raptor_bomblet_force, DEATH_SBROCKET, world);
-    remove(self);
+    PROJECTILE_TOUCH;
+    self.think = raptor_bomblet_boom;
+    self.nextthink = time + random() * autocvar_g_vehicle_raptor_bomblet_explode_delay;
 }
 
 void raptor_bomb_burst()
 {
-    self.angles = vectoangles(self.velocity);
-
-    if(self.cnt < time)
+    if(self.cnt > time)
+    if(autocvar_g_vehicle_raptor_bomblet_alt)
     {
-        entity bomblet;
-        float i,v;
-        vector d;
-
-        makevectors(self.angles);
-        v = vlen(self.velocity) + random();
-        d = normalize(self.velocity);
-        pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
-
-        for(i = 0; i < raptor_bomblets; ++i)
-        {
-
-            bomblet = spawn();
-            setorigin(bomblet,self.origin);
-
-            setmodel(bomblet,"models/vehicles/raptor_bomb.dpm");
-            bomblet.scale = 0.5;
-
-            bomblet.owner = self.owner;
-            bomblet.enemy = self.enemy;
-
-            bomblet.solid = SOLID_TRIGGER;
-            bomblet.movetype    = MOVETYPE_BOUNCE;
-            bomblet.touch = raptor_bomblet_boom;
-
-            bomblet.think = raptor_bomblet_boom;
-            bomblet.nextthink = time + 5;
-
-            //bomblet.modelflags = MF_ROCKET;
-            bomblet.modelflags = MF_GRENADE;
-
-            bomblet.velocity =  normalize(d + randomvec() * raptor_bomblet_wawespread) * v;
-
-            bomblet.angles = vectoangles(bomblet.velocity);
-        }
-
-        self.wait -= 1;
-        if(self.wait <= 0)
+        self.nextthink = time;
+        traceline(self.origin, self.origin + (normalize(self.velocity) * autocvar_g_vehicle_raptor_bomblet_alt), MOVE_NORMAL, self);
+        if((trace_fraction == 1.0) || (vlen(self.origin - self.owner.origin) < autocvar_g_vehicle_raptor_bomblet_radius))
         {
-            remove(self);
+            UpdateCSQCProjectile(self);
             return;
         }
-
-        self.cnt = time + raptor_bomblet_wavenext;
     }
 
-    self.nextthink = time;
-}
+    entity bomblet;
+    float i;
 
-void raptor_bomb_touch()
-{
-    raptor_bomb_burst();
+    Damage_DamageInfo(self.origin, 0, 0, 0, '0 0 0', DEATH_RAPTOR_BOMB_SPLIT, self);
+
+    for(i = 0; i < autocvar_g_vehicle_raptor_bomblets; ++i)
+    {
+        bomblet = spawn();
+        setorigin(bomblet, self.origin);
+
+        bomblet.movetype    = MOVETYPE_TOSS;
+        bomblet.touch       = raptor_bomblet_touch;
+        bomblet.think       = raptor_bomblet_boom;
+        bomblet.nextthink   = time + 5;
+        bomblet.owner       = self.owner;
+        bomblet.realowner   = self.realowner;
+        bomblet.velocity    = normalize(normalize(self.velocity) + (randomvec() * autocvar_g_vehicle_raptor_bomblet_spread)) * vlen(self.velocity);
+
+        PROJECTILE_MAKETRIGGER(bomblet);
+        CSQCProjectile(bomblet, TRUE, PROJECTILE_RAPTORBOMBLET, TRUE);
+    }
+
+    remove(self);
 }
 
 void raptor_bombdrop()
 {
     entity bomb_1, bomb_2;
 
-    self.bomb1.alpha = 0.25;
-    self.bomb2.alpha = 0.25;
-
     bomb_1 = spawn();
     bomb_2 = spawn();
 
-    setmodel(bomb_1,"models/vehicles/raptor_bomb.dpm");
-    setmodel(bomb_2,"models/vehicles/raptor_bomb.dpm");
-
     setorigin(bomb_1, gettaginfo(self, gettagindex(self, "bombmount_left")));
     setorigin(bomb_2, gettaginfo(self, gettagindex(self, "bombmount_right")));
 
-    bomb_1.movetype  = bomb_2.movetype    = MOVETYPE_TOSS;
-    bomb_1.velocity  = bomb_2.velocity    = self.velocity;
-    bomb_1.touch     = bomb_2.touch       = raptor_bomb_touch;
-    bomb_1.think     = bomb_2.think       = raptor_bomb_burst;
-    bomb_1.nextthink = bomb_2.nextthink   = time;
-    bomb_1.cnt       = bomb_2.cnt         = time + raptor_bomblet_wavefirst;
-    bomb_1.wait       = bomb_2.wait       = raptor_bomblet_waves;
-
-    bomb_1.avelocity = bomb_2.avelocity   = '0 0 180';
-    bomb_1.owner     = bomb_2.owner       = self;
-    bomb_1.enemy     = bomb_2.enemy       = self.owner;
-    bomb_1.angles    = bomb_2.angles      = self.angles;
+    bomb_1.movetype     = bomb_2.movetype   = MOVETYPE_BOUNCE;
+    bomb_1.velocity     = bomb_2.velocity   = self.velocity;
+    bomb_1.touch        = bomb_2.touch      = raptor_bomb_burst;
+    bomb_1.think        = bomb_2.think      = raptor_bomb_burst;
+    bomb_1.cnt          = bomb_2.cnt        = time + 10;
+
+    if(autocvar_g_vehicle_raptor_bomblet_alt)
+        bomb_1.nextthink = bomb_2.nextthink  = time;
+    else
+        bomb_1.nextthink = bomb_2.nextthink  = time + autocvar_g_vehicle_raptor_bomblet_time;
+
+    bomb_1.owner     = bomb_2.owner      = self;
+    bomb_1.realowner = bomb_2.realowner  = self.owner;
     bomb_1.solid     = bomb_2.solid      = SOLID_BBOX;
+    bomb_1.gravity   = bomb_2.gravity    = 1;
 
-    bomb_1 = spawn();
-    bomb_1.owner = self;
-    bomb_1.think = raptor_bombs_return;
-    bomb_1.nextthink = time + raptor_bombs_refire;
+    PROJECTILE_MAKETRIGGER(bomb_1);
+    PROJECTILE_MAKETRIGGER(bomb_2);
+
+    CSQCProjectile(bomb_1, TRUE, PROJECTILE_RAPTORBOMB, TRUE);
+    CSQCProjectile(bomb_2, TRUE, PROJECTILE_RAPTORBOMB, TRUE);
 }
 
-void raptor_animator_think()
+
+void raptor_fire_cannon(entity gun, string tagname)
 {
-    self.owner.frame += 1;
-    if(self.owner.frame == self.cnt)
-        remove(self);
-    else
-        self.nextthink = time + self.wait;
+    vehicles_projectile("raptor_cannon_muzzleflash", "weapons/lasergun_fire.wav",
+                           gettaginfo(gun, gettagindex(gun, tagname)), normalize(v_forward + randomvec() * autocvar_g_vehicle_raptor_cannon_spread) * autocvar_g_vehicle_raptor_cannon_speed,
+                           autocvar_g_vehicle_raptor_cannon_damage, autocvar_g_vehicle_raptor_cannon_radius, autocvar_g_vehicle_raptor_cannon_force,  0,
+                           DEATH_RAPTOR_CANNON, PROJECTILE_RAPTORCANNON, 0, TRUE, TRUE);
 }
 
-void raptor_setanim(float start, float end, float length)
+void raptor_think()
 {
-    entity ani;
-    if(self.tur_head.enemy)
-        ani = self.tur_head.enemy;
-    else
-        ani = spawn();
-
-    self.tur_head.enemy = ani;
-    ani.owner = self;
-    self.frame = start;
-    ani.cnt = end;
-    ani.wait = sys_frametime / length;
-    ani.think = raptor_animator_think;
-    ani.nextthink = time + ani.wait;
 }
 
-void raptor_beam (vector start, vector end, vector smin, vector smax, float bforce, float f_dmg, float deathtype)
+void raptor_enter()
 {
-    vector hitloc, force, endpoint, dir;
-    entity ent;
+    self.owner.PlayerPhysplug = raptor_takeoff;
+    self.movetype       = MOVETYPE_BOUNCEMISSILE;
+    self.solid          = SOLID_SLIDEBOX;
+    self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_raptor_health);
+    self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_raptor_shield);
+    self.velocity_z = 1; // Nudge upwards to takeoff sequense can work.
+    self.tur_head.exteriormodeltoclient = self.owner;
 
-    dir = normalize(end - start);
-    force = dir * bforce;
+    self.delay = time + autocvar_g_vehicle_raptor_bombs_refire;
+    self.lip   = time;
 
-    // go a little bit into the wall because we need to hit this wall later
-    end = end + dir;
+    if(self.owner.flagcarried)
+       setorigin(self.owner.flagcarried, '-20 0 96');
 
-    // trace multiple times until we hit a wall, each obstacle will be made unsolid.
-    // note down which entities were hit so we can damage them later
-    while (1)
-    {
-        tracebox(start, smin, smax, end, FALSE, world);
-
-        // if it is world we can't hurt it so stop now
-        if (trace_ent == world || trace_fraction == 1)
-            break;
-
-        if (trace_ent.solid == SOLID_BSP)
-            break;
-
-        // make the entity non-solid so we can hit the next one
-        trace_ent.railgunhit = TRUE;
-        trace_ent.railgunhitloc = end;
-        trace_ent.railgunhitsolidbackup = trace_ent.solid;
-
-        // make the entity non-solid
-        trace_ent.solid = SOLID_NOT;
-    }
-
-    endpoint = trace_endpos;
-
-    // find all the entities the railgun hit and hurt them
-    ent = findchainfloat(railgunhit, TRUE);
-    while (ent)
-    {
-        // get the details we need to call the damage function
-        ent.solid = ent.railgunhitsolidbackup;
-        hitloc = ent.railgunhitloc;
-        ent.railgunhitloc = '0 0 0';
-        ent.railgunhitsolidbackup = SOLID_NOT;
-        ent.railgunhit = FALSE;
-
-        // apply the damage
-        if (ent.takedamage)
-            Damage (ent, self, self, f_dmg, deathtype, hitloc, force);
-
-        ent = ent.chain;
-    }
-    trace_endpos = endpoint;
 }
 
-
-void raptor_enter()
+void raptor_land()
 {
-    // Remove this when bots know how to use vehicles
-    if (clienttype(other) != CLIENTTYPE_REAL)
-        return;
-
-    if(teams_matter)
-        if(self.team)
-            if(self.team != other.team)
-                return;
-
-    self.owner = other;
-    self.switchweapon = other.switchweapon;
-
-    self.event_damage          = vehicle_stdproc_damage;
-    self.colormap              = self.owner.colormap;
-    self.vehicle_hudmodel.viewmodelforclient = self.owner;
-    self.nextthink             = 0;
-    self.owner.angles          = self.angles;
-    self.owner.takedamage      = DAMAGE_NO;
-    self.owner.solid           = SOLID_NOT;
-    self.owner.movetype        = MOVETYPE_NOCLIP;
-    self.owner.alpha           = -1;
-    self.owner.PlayerPhysplug  = raptor_takeoff;
-    self.owner.vehicle         = self;
-    self.owner.event_damage    = SUB_Null;
-    self.owner.hud             = HUD_RAPTOR;
-    self.owner.vehicle_health  = self.vehicle_health / raptor_health_max;
-    self.owner.vehicle_shield  = self.vehicle_shield / raptor_shield_max;
-    self.owner.view_ofs        = '0 0 1';
-    self.owner.vehicle_ammo1   = self.vehicle_ammo1;
-    self.owner.vehicle_ammo2   = self.vehicle_ammo2;
-    self.owner.vehicle_reload1 = self.vehicle_reload1;
-    self.owner.vehicle_reload2 = self.vehicle_reload2;
-
-    other.flags &~= FL_ONGROUND;
-    self.flags &~= FL_ONGROUND;
 
-    self.frame = 0;
-    raptor_setanim(0, 25, 1);
+    float hgt;
+    
+    hgt = raptor_altitude(512);
+    self.velocity = (self.velocity * 0.9) + ('0 0 -1800' * (hgt / 256) * sys_frametime);
+    self.angles_x *= 0.95;
+    self.angles_z *= 0.95;
 
-    self.team                 = self.owner.team;
-    self.flags               -= FL_NOTARGET;
+    if(hgt < 128)
+        if(self.frame != 0)
+            self.frame = max(self.frame - 0.25, 0);
 
-    self.velocity = '0 0 1';
+    self.bomb1.gun1.avelocity_y = 90 + ((self.frame / 25) * 2000);
+    self.bomb1.gun2.avelocity_y = -self.bomb1.gun1.avelocity_y;
 
-    setorigin(other,self.origin + '0 0 32');
-    other.velocity = self.velocity;
-
-    other.flags &~= FL_ONGROUND;
-    msg_entity = other;
-    WriteByte (MSG_ONE, SVC_SETVIEWPORT);
-    WriteEntity( MSG_ONE, self.vehicle_viewport);
+    if(hgt < 16)
+    {
+        self.movetype   = MOVETYPE_TOSS;
+        self.think      = raptor_think;
+    }
 
-    WriteByte (MSG_ONE, SVC_SETVIEWANGLES);     // 10 = SVC_SETVIEWANGLES
-    WriteAngle(MSG_ONE,  self.angles_x * -1);   // tilt
-    WriteAngle(MSG_ONE,  self.angles_y);        // yaw
-    WriteAngle(MSG_ONE,  0);                    // roll
+    self.nextthink  = time;
 }
 
 void raptor_exit(float eject)
 {
-       self.colormap   = 1024;
-       self.flags      = FL_NOTARGET;
-
-    if not (self.owner)
-        return;
-
-    msg_entity = self.owner;
-    WriteByte (MSG_ONE, SVC_SETVIEWPORT);
-    WriteEntity( MSG_ONE, self.owner);
-
-    WriteByte (MSG_ONE, SVC_SETVIEWANGLES);    // 10 = SVC_SETVIEWANGLES
-    WriteAngle(MSG_ONE,  0);                   // tilt
-    WriteAngle(MSG_ONE,  self.angles_y); // yaw
-    WriteAngle(MSG_ONE,  0);                   // roll
+    vector spot;
+    self.tur_head.exteriormodeltoclient = world;
 
-    if (self.deadflag == DEAD_NO)
+    if(self.deadflag == DEAD_NO)
     {
-        //self.think = racer_exitthink;
-        self.nextthink = time;
+        self.think      = raptor_land;
+        self.nextthink  = time;
     }
 
-    self.owner.takedamage     = DAMAGE_AIM;
-    self.owner.solid          = SOLID_SLIDEBOX;
-    self.owner.movetype       = MOVETYPE_WALK;
-
-    setsize(self.owner,PL_MIN,PL_MAX);
-
-    self.owner.effects        &~= EF_NODRAW;
-    self.owner.alpha          = 1;
-    self.owner.PlayerPhysplug = SUB_Null;
-    self.owner.vehicle        = world;
-       self.owner.view_ofs       = PL_VIEW_OFS;
-       self.owner.event_damage   = PlayerDamage;
-       self.owner.hud            = HUD_NORMAL;
-       //self.exteriormodeltoclient = self;
-
-    self.vehicle_hudmodel.viewmodelforclient = self;
+    if not (self.owner)
+        return;
 
+       makevectors(self.angles);
        if(eject)
        {
-           makevectors(self.angles);
-           setorigin(self.owner,self.origin + v_forward * 100);
+           spot = self.origin + v_forward * 100 + '0 0 64';
+           spot = vehicles_findgoodexit(spot);
+           setorigin(self.owner , spot);
            self.owner.velocity = (v_up + v_forward * 0.25) * 750;
        }
        else
        {
-           self.owner.velocity = (v_forward) * -150;
-        setorigin(self.owner,self.origin - v_forward * 128);
+           spot = self.origin - v_forward * 200 + '0 0 64';
+           spot = vehicles_findgoodexit(spot);
+           setorigin(self.owner , spot);
        }
-
+       
     self.owner = world;
-
-    if (self.deadflag != DEAD_NO)
-    {
-        entity ret;
-        ret = spawn();
-        ret.enemy = self;
-        ret.think = raptor_return;
-        ret.nextthink = time + autocvar_g_vehicle_racer_respawntime;
-    }
 }
 
-
-float raptor_pplug()
+float raptor_takeoff()
 {
-    entity player, vhic;
-    float ftmp, ftmp2, energy_used;
-    vector df;
-
-
-    if(autocvar_g_vehicle_raptor_reload)
-    {
-        raptor_loadsettings();
-        cvar_set("g_vehicle_raptor_reload","0");
-    }
-
+    entity player, raptor;
+    
     player = self;
-    vhic   = self.vehicle;
-    self    = vhic;
-
-    if(player.BUTTON_USE)
+    raptor = self.vehicle;
+    self   = raptor;
+    if(self.sound_nexttime < time)
+    {        
+        self.sound_nexttime = time + 7.955812; //soundlength("vehicles/raptor_fly.wav");
+        sound (self, CH_TRIGGER_SINGLE, "vehicles/raptor_speed.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+    }   
+
+    // Takeoff sequense
+    if(raptor.frame < 25)
     {
-        self = vhic;
-        raptor_exit(0);
-        self = player;
-        return 0;
-    }
+        raptor.frame += 0.25;
+        raptor.velocity_z = min(raptor.velocity_z * 1.5, 256);
+        self.bomb1.gun1.avelocity_y = 90 + ((raptor.frame / 25) * 25000);
+        self.bomb1.gun2.avelocity_y = -self.bomb1.gun1.avelocity_y;
+        player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
 
-    if(vhic.deadflag != DEAD_NO)
-    {
-        self = player;
-        player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
-        return 1;
+        setorigin(player, raptor.origin + '0 0 32');
     }
+    else
+        player.PlayerPhysplug = raptor_frame;
+
+    if(self.vehicle_flags  & VHF_SHIELDREGEN)
+        vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_raptor_shield, autocvar_g_vehicle_raptor_shield_regen_pause, autocvar_g_vehicle_raptor_shield_regen, frametime);
 
-    vhic.angles_x *= -1;
-    // Rotate Body
-    ftmp = raptor_turnspeed * sys_frametime;
+    if(self.vehicle_flags  & VHF_HEALTHREGEN)
+        vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_raptor_health, autocvar_g_vehicle_raptor_health_regen_pause, autocvar_g_vehicle_raptor_health_regen, frametime);
 
-    ftmp = bound(-ftmp, shortangle_f(player.v_angle_y - vhic.angles_y, vhic.angles_y), ftmp);
+    if(self.vehicle_flags  & VHF_ENERGYREGEN)
+        vehicles_regen(cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, frametime);
 
-    // Roll
-    //ftmp = bound(-90,shortangle_f(player.v_angle_z + ((vhic.angles_y - ftmp2) * raptor_turnroll), vhic.angles_z),90);
-    //ftmp = safeangle(vhic.angles_z + ftmp);
-    //vhic.angles_z = ftmp;
 
-    // Turn
-    vhic.angles_y = anglemods(vhic.angles_y + ftmp);
+    raptor.bomb1.alpha = raptor.bomb2.alpha = (time - raptor.lip) / (raptor.delay - raptor.lip);
+    player.vehicle_reload2 = bound(0, raptor.bomb1.alpha * 100, 100);
 
-    // Pitch Body
-    ftmp = raptor_pitchspeed  * sys_frametime;
+    VEHICLE_UPDATE_PLAYER(health, raptor);
+    VEHICLE_UPDATE_PLAYER(energy, raptor);
+    if(self.vehicle_flags & VHF_HASSHIELD)
+        VEHICLE_UPDATE_PLAYER(shield, raptor);
 
-    ftmp = bound(-ftmp, shortangle_f(player.v_angle_x - vhic.angles_x,vhic.angles_x), ftmp);
+    player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
+    self = player;
+    return 1;
+}
 
-    vhic.angles_x = bound(-60,anglemods(vhic.angles_x + ftmp),60);
-    vhic.angles_x *= -1;
+float raptor_frame()
+{
+    entity player, raptor;
+    float ftmp, ftmp2;
+    vector df;
+    
+       if(intermission_running)
+               return 1;
 
-    if(raptor_movestyle == 1)
+    player = self;
+    raptor = self.vehicle;
+    self   = raptor;
+    vehicles_painframe();
+    /*
+    ftmp = vlen(self.velocity);
+    if(ftmp > autocvar_g_vehicle_raptor_speed_forward) 
+        ftmp = 1;
+    else  
+        ftmp = ftmp / autocvar_g_vehicle_raptor_speed_forward;
+    */
+        
+    if(self.sound_nexttime < time)
+    {        
+        self.sound_nexttime = time + 7.955812; 
+        //sound (self.tur_head, CH_TRIGGER_SINGLE, "vehicles/raptor_fly.wav", 1 - ftmp,   ATTN_NORM );
+        sound (self, CH_TRIGGER_SINGLE, "vehicles/raptor_speed.wav", 1, ATTN_NORM);        
+        self.wait = ftmp;
+    }        
+    /*
+    else if(fabs(ftmp - self.wait) > 0.2)
     {
-        ftmp = vhic.angles_z;
-        vhic.angles_z = 0;
-        ftmp2 = vhic.angles_x;
-        vhic.angles_x = 0;
-        fixedmakevectors(vhic.angles);
-        vhic.angles_z = ftmp;
-        vhic.angles_x = ftmp2;
+        sound (self.tur_head, CH_TRIGGER_SINGLE, "", 1 - ftmp,   ATTN_NORM );
+        sound (self, CH_TRIGGER_SINGLE, "", ftmp, ATTN_NORM);        
+        self.wait = ftmp;
+    }
+    */
+    
+    if(raptor.deadflag != DEAD_NO)
+    {
+        self = player;
+        player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
+        return 1;
     }
+    crosshair_trace(player);
+
+    vector vang;
+    vang = raptor.angles;
+    df = vectoangles(normalize(trace_endpos - self.origin + '0 0 32'));
+    vang_x *= -1;
+    df_x *= -1;
+    if(df_x > 180)  df_x -= 360;
+    if(df_x < -180) df_x += 360;
+    if(df_y > 180)  df_y -= 360;
+    if(df_y < -180) df_y += 360;
+
+    ftmp = shortangle_f(player.v_angle_y - vang_y, vang_y);
+    if(ftmp > 180)  ftmp -= 360; if(ftmp < -180) ftmp += 360;
+    raptor.avelocity_y = bound(-autocvar_g_vehicle_raptor_turnspeed, ftmp + raptor.avelocity_y * 0.9, autocvar_g_vehicle_raptor_turnspeed);
+
+    // Pitch
+    ftmp = 0;
+    if(player.movement_x > 0 && vang_x < autocvar_g_vehicle_raptor_pitchlimit) ftmp = 5;
+    else if(player.movement_x < 0 && vang_x > -autocvar_g_vehicle_raptor_pitchlimit) ftmp = -20;
+
+    df_x = bound(-autocvar_g_vehicle_raptor_pitchlimit, df_x , autocvar_g_vehicle_raptor_pitchlimit);
+    ftmp = vang_x - bound(-autocvar_g_vehicle_raptor_pitchlimit, df_x + ftmp, autocvar_g_vehicle_raptor_pitchlimit);
+    raptor.avelocity_x = bound(-autocvar_g_vehicle_raptor_pitchspeed, ftmp + raptor.avelocity_x * 0.9, autocvar_g_vehicle_raptor_pitchspeed);
+
+    raptor.angles_x = anglemods(raptor.angles_x);
+    raptor.angles_y = anglemods(raptor.angles_y);
+    raptor.angles_z = anglemods(raptor.angles_z);
+
+    if(autocvar_g_vehicle_raptor_movestyle == 1)
+        makevectors('0 1 0' * raptor.angles_y);
     else
-        fixedmakevectors(vhic.angles);
+        makevectors(player.v_angle);
 
-    df = vhic.velocity * -1;
+    df = raptor.velocity * -autocvar_g_vehicle_raptor_friction;
 
     if(player.movement_x != 0)
     {
         if(player.movement_x > 0)
-            df += v_forward  * raptor_speed_forward;
+            df += v_forward  * autocvar_g_vehicle_raptor_speed_forward;
         else if(player.movement_x < 0)
-            df -= v_forward  * raptor_speed_forward;
+            df -= v_forward  * autocvar_g_vehicle_raptor_speed_forward;
     }
 
     if(player.movement_y != 0)
     {
         if(player.movement_y < 0)
-            df -= v_right * raptor_speed_strafe;
+            df -= v_right * autocvar_g_vehicle_raptor_speed_strafe;
         else if(player.movement_y > 0)
-            df += v_right * raptor_speed_strafe;
+            df += v_right * autocvar_g_vehicle_raptor_speed_strafe;
 
-        vhic.angles_z = bound(-30,vhic.angles_z + (player.movement_y / raptor_speed_strafe),30);
+        raptor.angles_z = bound(-30,raptor.angles_z + (player.movement_y / autocvar_g_vehicle_raptor_speed_strafe),30);
     }
     else
     {
-        vhic.angles_z *= 0.95;
-        if(vhic.angles_z >= -1 && vhic.angles_z <= -1)
-            vhic.angles_z = 0;
+        raptor.angles_z *= 0.95;
+        if(raptor.angles_z >= -1 && raptor.angles_z <= -1)
+            raptor.angles_z = 0;
     }
 
     if(player.BUTTON_CROUCH)
-        df -=   v_up * raptor_speed_down;
+        df -=   v_up * autocvar_g_vehicle_raptor_speed_down;
     else if (player.BUTTON_JUMP)
-        df +=  v_up * raptor_speed_up;
-    //else
-        //df_z = vhic.velocity_z * -1;
-
-    vhic.velocity  += df * frametime;
-    player.velocity = player.movement  = vhic.velocity;
-    setorigin(player,vhic.origin + '0 0 32');
+        df +=  v_up * autocvar_g_vehicle_raptor_speed_up;
 
-    // Aim the gunz
-    /*
-    vector target_angle, move_angle, org1, org2, targ;
+    raptor.velocity  += df * frametime;
+    player.velocity = player.movement  = raptor.velocity;
+    setorigin(player, raptor.origin + '0 0 32');
 
-    makevectors(player.v_angle);
-
-    //targ = (vhic.origin + player.view_ofs) + v_forward * MAX_SHOT_DISTANCE;
-    targ = player.cursor_trace_endpos;
-
-    org1 = gettaginfo(vhic.gun1,gettagindex(vhic.gun1, "fire1"));
-    org2 = gettaginfo(vhic.gun2,gettagindex(vhic.gun2, "fire1"));
+    vector vf, ad;
+    // Target lock & predict
+    if(autocvar_g_vehicle_raptor_cannon_locktarget)
+    {
 
-    traceline(vhic.origin + player.view_ofs, targ, FALSE, vhic);
-    targ = trace_endpos;
+        vehicles_locktarget((1 / autocvar_g_vehicle_raptor_cannon_locking_time) * frametime,
+                             (1 / autocvar_g_vehicle_raptor_cannon_locking_releasetime) * frametime,
+                             autocvar_g_vehicle_raptor_cannon_locked_time);
 
-    // Find the direction
-    target_angle = vectoangles(normalize(targ - org1)); // And make a angle
+        if(self.lock_target != world)
+        if(autocvar_g_vehicle_raptor_cannon_predicttarget)
+        if(self.lock_strength == 1)
+        {
+            float i, distance, impact_time;
+
+            vf = real_origin(raptor.lock_target);
+            ad = vf;
+            for(i = 0; i < 4; ++i)
+            {
+                distance = vlen(ad - raptor.origin);
+                impact_time = distance / autocvar_g_vehicle_raptor_cannon_speed;
+                ad = vf + raptor.lock_target.velocity * impact_time;
+            }
+            trace_endpos = ad;
+        }
 
-    // Find the diffrence between where we currently aim and where we want to aim
-    move_angle = target_angle - (vhic.angles + vhic.gun1.angles);
-    move_angle = shortangle_vxy(move_angle,(vhic.angles + vhic.gun1.angles));
-    vhic.gun1.angles_x = bound(-10, move_angle_x + vhic.gun1.angles_x, 10);
-    vhic.gun1.angles_y = bound(-15, move_angle_y + vhic.gun1.angles_y, 15);
+        if(self.lock_target)
+        {
+            if(raptor.lock_strength == 1)
+                UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '1 0 0', 1);
+            else if(self.lock_strength > 0.5)
+                UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '0 1 0', 1);
+            else if(self.lock_strength < 0.5)
+                UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '0 0 1', 1);
+        }
+    }
 
-    // Find the direction
-    target_angle = vectoangles(normalize(targ - org2)); // And make a angle
+    // Aim the gunz
+    ftmp2 = autocvar_g_vehicle_raptor_cannon_turnspeed * frametime;
+    ftmp = -ftmp2;
+
+    // Gun1
+    df = gettaginfo(raptor.gun1, gettagindex(raptor.gun1, "fire1"));
+    //ad = df;
+    //vf = v_forward;
+    df = vectoangles(normalize(trace_endpos - df)); // Find the direction & angle    
+    df = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(raptor.angles), AnglesTransform_FromAngles(df))) - raptor.gun1.angles;
+    df = shortangle_vxy(df, raptor.gun1.angles);
+        
+    // Bind to aimspeed
+    df_x = bound(ftmp, df_x, ftmp2);
+    df_y = bound(ftmp, df_y, ftmp2);
+    // Bind to limts
+    raptor.gun1.angles_x = bound(-autocvar_g_vehicle_raptor_cannon_pitchlimit_down, df_x + raptor.gun1.angles_x, autocvar_g_vehicle_raptor_cannon_pitchlimit_up);
+    raptor.gun1.angles_y = bound(-autocvar_g_vehicle_raptor_cannon_turnlimit,  df_y + raptor.gun1.angles_y, autocvar_g_vehicle_raptor_cannon_turnlimit);
+
+    // Gun2
+    df = gettaginfo(raptor.gun2, gettagindex(raptor.gun2, "fire1"));
+    //ad += df;
+    //vf += v_forward;
+    df = vectoangles(normalize(trace_endpos - df)); // Find the direction & angle    
+    df = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(raptor.angles), AnglesTransform_FromAngles(df))) - raptor.gun2.angles;
+    df = shortangle_vxy(df, raptor.gun2.angles);
+    
+    // Bind to aimspeed
+    df_x = bound(ftmp, df_x, ftmp2);
+    df_y = bound(ftmp, df_y, ftmp2);
+    // Bind to limts
+    raptor.gun2.angles_x = bound(-autocvar_g_vehicle_raptor_cannon_pitchlimit_down, df_x + raptor.gun2.angles_x, autocvar_g_vehicle_raptor_cannon_pitchlimit_up);
+    raptor.gun2.angles_y = bound(-autocvar_g_vehicle_raptor_cannon_turnlimit,  df_y + raptor.gun2.angles_y, autocvar_g_vehicle_raptor_cannon_turnlimit);
 
-    move_angle = target_angle - (vhic.angles + vhic.gun2.angles);
-    move_angle = shortangle_vxy(move_angle,(vhic.angles + vhic.gun2.angles));
-    vhic.gun2.angles_x = bound(-15,move_angle_x + vhic.gun2.angles_x,15);
-    vhic.gun2.angles_y = bound(-20,move_angle_y + vhic.gun2.angles_y,20);
-       */
+    /*
+    ad = ad * 0.5;
+    v_forward = vf * 0.5;
+    traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, raptor);
+    UpdateAuxiliaryXhair(player, trace_endpos, '0 1 0', 0);
+    */
+    
     if(player.BUTTON_ATCK)
-    if(vhic.vehicle_energy > (raptor_beam_aps * sys_frametime))
+    if(raptor.attack_finished_single <= time)
+    if(raptor.vehicle_energy > autocvar_g_vehicle_raptor_cannon_cost)
     {
-        vector start;
-        self = player;
-
-        start = gettaginfo(vhic.gun1, gettagindex(vhic.gun1, "fire1"));
-        traceline(start, start + v_forward * MAX_SHOT_DISTANCE, TRUE, player);
-        te_lightning1(vhic.gun1, start, trace_endpos);
-        raptor_beam(start, trace_endpos, '-1 -1 -1' * raptor_beam_size, '1 1 1' * raptor_beam_size, raptor_beam_fops * sys_frametime, raptor_beam_dps * sys_frametime, DEATH_SBROCKET);
-
-
-        start = gettaginfo(vhic.gun2, gettagindex(vhic.gun2, "fire1"));
-        traceline(start, start + v_forward * MAX_SHOT_DISTANCE, TRUE, player);
-        te_lightning1(vhic.gun2, start, trace_endpos);
-        raptor_beam(start, trace_endpos, '-1 -1 -1' * raptor_beam_size, '1 1 1' * raptor_beam_size, raptor_beam_fops * sys_frametime, raptor_beam_dps * sys_frametime, DEATH_SBROCKET);
-
-        self = vhic;
-
-        vhic.vehicle_energy -= raptor_beam_aps * sys_frametime;
-        vhic.cnt = time + 1;
+        raptor.misc_bulletcounter += 1;
+        raptor.attack_finished_single = time + autocvar_g_vehicle_raptor_cannon_refire;
+        if(raptor.misc_bulletcounter <= 2)
+            raptor_fire_cannon(self.gun1, "fire1");
+        else if(raptor.misc_bulletcounter == 3)
+            raptor_fire_cannon(self.gun2, "fire1");
+        else
+        {
+            raptor.attack_finished_single = time + autocvar_g_vehicle_raptor_cannon_refire * 2;
+            raptor_fire_cannon(self.gun2, "fire1");
+            raptor.misc_bulletcounter = 0;
+        }
+        raptor.vehicle_energy -= autocvar_g_vehicle_raptor_cannon_cost;
+        self.cnt = time;
     }
 
-    if(vhic.cnt < time)
-        vhic.vehicle_energy = min(vhic.vehicle_energy += raptor_energy_regen * frametime, raptor_energy_max);
+    if(self.vehicle_flags  & VHF_SHIELDREGEN)
+        vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_raptor_shield, autocvar_g_vehicle_raptor_shield_regen_pause, autocvar_g_vehicle_raptor_shield_regen, frametime);
+
+    if(self.vehicle_flags  & VHF_HEALTHREGEN)
+        vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_raptor_health, autocvar_g_vehicle_raptor_health_regen_pause, autocvar_g_vehicle_raptor_health_regen, frametime);
 
-    player.vehicle_energy = vhic.vehicle_energy / raptor_energy_max;
+    if(self.vehicle_flags  & VHF_ENERGYREGEN)
+        vehicles_regen(cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, frametime);
 
 
+    if(time > raptor.delay)
     if(player.BUTTON_ATCK2)
-    if(time > vhic.delay)
     {
         raptor_bombdrop();
-        vhic.delay = time + raptor_bombs_refire;
+        raptor.delay = time + autocvar_g_vehicle_raptor_bombs_refire;
+        raptor.lip   = time;
     }
 
-    player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
-    vehicle_stdproc_shiledregen(raptor_shield_max, frametime);
-    vehicle_stdproc_healthregen(raptor_health_max, frametime);
-
-    self = player;
-
-    return 1;
-}
-
-float raptor_takeoff()
-{
-    entity player, vhic;
+    raptor.bomb1.alpha = raptor.bomb2.alpha = (time - raptor.lip) / (raptor.delay - raptor.lip);
+    player.vehicle_reload2 = bound(0, raptor.bomb1.alpha * 100, 100);
 
-    if(self.vehicle.frame < 25)
-        return 1;
-
-    player = self;
-    vhic   = self.vehicle;
-    self    = vhic;
-
-    if(raptor_altitude(512) <= 256)
-    {
-        vhic.velocity_z = min(vhic.velocity_z * 1.5, 256);
-    }
-    else
-    {
-        player.PlayerPhysplug = raptor_pplug;
-    }
-
-    player.BUTTON_CROUCH = player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
-    self = player;
+    VEHICLE_UPDATE_PLAYER(health, raptor);
+    VEHICLE_UPDATE_PLAYER(energy, raptor);
+    if(self.vehicle_flags & VHF_HASSHIELD)
+        VEHICLE_UPDATE_PLAYER(shield, raptor);
 
+    player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
     return 1;
 }
 
-float raptor_land()
+void raptor_blowup()
 {
-    return 0;
-}
+    self.deadflag    = DEAD_DEAD;
+    self.vehicle_exit(VHEF_NORMAL);
+    RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_WAKIBLOWUP, world);
 
-void raptor_return()
-{
-    pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1);
-    self.enemy.think = raptor_spawn;
-    self.enemy.nextthink = time;
-    remove(self);
-}
+    self.alpha          = -1;
+    self.movetype       = MOVETYPE_NONE;
+    self.effects        = EF_NODRAW;
+    self.colormod       = '0 0 0';
+    self.avelocity      = '0 0 0';
+    self.velocity       = '0 0 0';
 
-void raptor_think()
-{
+    setorigin(self, self.pos1);
+    self.touch = SUB_Null;
+    self.nextthink = 0;
 }
 
-void raptor_touch()
+void raptor_diethink()
 {
-    if(self.owner)
+    if(random() < 0.1)
     {
-        if(vlen(self.velocity) == 0)
-            return;
-
-        if(other.classname != "player")
-            return;
-
-        return;
+        sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+        pointparticles(particleeffectnum("explosion_small"), randomvec() * 80 + (self.origin + '0 0 100'), '0 0 0', 1);
     }
-
-    if(other.classname != "player")
-        return;
-
-    if(other.deadflag != DEAD_NO)
-        return;
-
-    if(other.vehicle != world)
-        return;
-
-    raptor_enter();
+    self.nextthink = time + 0.1;
 }
 
 void raptor_die()
 {
     self.health       = 0;
     self.event_damage = SUB_Null;
-    self.iscreature   = FALSE;
-    self.solid        = SOLID_NOT;
+    self.solid        = SOLID_CORPSE;
     self.takedamage   = DAMAGE_NO;
-    //self.touch        = racer_dietouch;
     self.deadflag     = DEAD_DYING;
     self.movetype     = MOVETYPE_BOUNCE;
-    self.wait = time;
+    self.think        = raptor_diethink;
+    self.nextthink    = time;
+    
+    pointparticles(particleeffectnum("explosion_medium"), findbetterlocation (self.origin, 16), '0 0 0', 1);
 
-    pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
+    self.velocity_z += 600;
 
-    self.velocity     += '0 0 128';
-
-    if(random() < 0.5)
-        self.avelocity_z  = 45;
-    else
-        self.avelocity_z  = -45;
+    self.avelocity = '0 0.5 1' * (random() * 400);
+    self.avelocity -= '0 0.5 1' * (random() * 400);
 
     self.colormod = '-0.5 -0.5 -0.5';
-
-       self.think     = raptor_spawn;
-       self.nextthink = time + 5;
+       self.touch     = raptor_blowup;
 }
 
 void raptor_spawn()
 {
-    self.flags     = FL_NOTARGET;
-    self.effects   = 0;
-
-    self.vehicle_health = raptor_health_max;
-    self.vehicle_shield = raptor_shield_max;
-
-    self.event_damage = vehicle_stdproc_damage;
-    self.touch      = raptor_touch;
-
-    self.iscreature = TRUE;
-    self.movetype   = MOVETYPE_FLY;
-    self.solid      = SOLID_SLIDEBOX;
-    self.takedamage = DAMAGE_AIM;
-
-    self.alpha = 1;
-       self.colormap = 1024;
-       self.deadflag    = DEAD_NO;
-    self.bot_attack = TRUE;
-
-    self.colormod = '1 1 1';
-    self.avelocity = '0 0 0';
-    self.velocity = '0 0 0';
-
+    self.frame          = 0;
+    self.vehicle_health = autocvar_g_vehicle_raptor_health;
+    self.vehicle_shield = autocvar_g_vehicle_raptor_shield;
+    self.movetype       = MOVETYPE_TOSS;
+    self.solid          = SOLID_SLIDEBOX;
     self.vehicle_energy = 1;
-    self.vehicle_hudmodel.viewmodelforclient = self;
 
-    setorigin(self, self.pos1);
-    self.angles = self.pos2;
+    self.bomb1.gun1.avelocity_y = 90;
+    self.bomb1.gun2.avelocity_y = -90;
 
-    setsize(self,RAPTOR_MIN ,RAPTOR_MAX );
-    pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
+    setsize(self, RAPTOR_MIN, RAPTOR_MAX );
     self.delay = time;
 }
 
-float raptor_customizeentityforclient()
+// If we dont do this ever now and then, the raptors rotors
+// stop working, presumably due to angle overflow. cute.
+void raptor_rotor_anglefix()
 {
-    if(self.deadflag == DEAD_DEAD)
-        return FALSE;
-
-    /*
-    if(other == self.owner)
-        self.alpha = -1;
-    else
-        self.alpha = 1;
-    */
-
-    return TRUE;
+    self.gun1.angles_y = anglemods(self.gun1.angles_y);
+    self.gun2.angles_y = anglemods(self.gun2.angles_y);
+    self.nextthink = time + 15;
 }
 
 void raptor_dinit()
 {
+    entity spinner;
+    vector ofs;
+
+    if not (vehicle_initialize(
+             "Raptor",
+             "models/vehicles/raptor.dpm",
+             "",
+             "models/vehicles/raptor_cockpit.dpm",
+             "", "tag_hud", "tag_camera",
+             HUD_RAPTOR,
+             RAPTOR_MIN, RAPTOR_MAX,
+             FALSE,
+             raptor_spawn, autocvar_g_vehicle_raptor_respawntime,
+             raptor_frame,
+             raptor_enter, raptor_exit,
+             raptor_die,   raptor_think,
+             FALSE))
+    {
+        remove(self);
+        return;
+    }
 
-    if (self.netname == "")
-        self.netname     = "Raptor";
-
-    setorigin(self, self.origin);
+    //FIXME: Camera is in a bad place in HUD model.
+    //setorigin(self.vehicle_viewport, '25 0 5');
 
     self.frame = 0;
 
-    setmodel(self,"models/vehicles/raptor.dpm");
-
     self.bomb1 = spawn();
     self.bomb2 = spawn();
+    self.gun1  = spawn();
+    self.gun2  = spawn();
 
-    setmodel(self.bomb1,"models/vehicles/raptor_bomb.dpm");
-    setmodel(self.bomb2,"models/vehicles/raptor_bomb.dpm");
+    setmodel(self.bomb1,"models/vehicles/clusterbomb_folded.md3");
+    setmodel(self.bomb2,"models/vehicles/clusterbomb_folded.md3");
+    setmodel(self.gun1, "models/vehicles/raptor_gun.dpm");
+    setmodel(self.gun2, "models/vehicles/raptor_gun.dpm");
+    setmodel(self.tur_head, "models/vehicles/raptor_body.dpm");
 
     setattachment(self.bomb1, self,"bombmount_left");
     setattachment(self.bomb2, self,"bombmount_right");
+    setattachment(self.tur_head, self,"root");
 
 
-    if not (self.vehicle_hudmodel)
-    {
-        self.vehicle_hudmodel   = spawn();
-        setmodel(self.vehicle_hudmodel, "models/vehicles/raptor_cockpit.dpm");
-        //setattachment(self.vehicle_hudmodel, self, "tag_viewport");
-        setattachment(self.vehicle_hudmodel, self, "tag_hud");
-    }
+    // FIXME Guns mounts to angled bones
+    self.bomb1.angles = self.angles;
+    self.angles = '0 0 0';
+    // This messes up gun-aim, so work arround it.
+    //setattachment(self.gun1, self, "gunmount_left");
+    ofs = gettaginfo(self, gettagindex(self, "gunmount_left"));
+    ofs -= self.origin;
+    setattachment(self.gun1, self, "");
+    setorigin(self.gun1, ofs);
 
-    if not (self.vehicle_viewport)
-    {
-        self.vehicle_viewport   = spawn();
-        setmodel (self.vehicle_viewport, "null");
-        setattachment(self.vehicle_viewport, self.vehicle_hudmodel, "tag_camera");
-    }
+    //setattachment(self.gun2, self, "gunmount_right");
+    ofs = gettaginfo(self, gettagindex(self, "gunmount_right"));
+    ofs -= self.origin;
+    setattachment(self.gun2, self, "");
+    setorigin(self.gun2, ofs);
 
-    if not (self.gun1)
-    {
-        self.gun1   = spawn();
-        setmodel(self.gun1, "models/vehicles/raptor_gun.dpm");
-        setattachment(self.gun1, self, "gunmount_left");
-    }
+    self.angles = self.bomb1.angles;
+    self.bomb1.angles = '0 0 0';
 
-    if not (self.gun2)
-    {
-        self.gun2   = spawn();
-        setmodel(self.gun2, "models/vehicles/raptor_gun.dpm");
-        setattachment(self.gun2, self, "gunmount_right");
-    }
-
-    self.tur_head     = spawn();
-    self.pos1         = self.origin;
-    self.pos2         = self.angles;
-
-    self.vehicle_hudmodel.viewmodelforclient = self;
-    self.customizeentityforclient            = raptor_customizeentityforclient;
-
-    self.vehicle_die  = raptor_die;
-    self.vehicle_exit = raptor_exit;
-
-
-    entity spinner;
     spinner = spawn();
     spinner.owner = self;
     setmodel(spinner,"models/vehicles/spinner.dpm");
     setattachment(spinner, self, "engine_left");
     spinner.movetype = MOVETYPE_NOCLIP;
     spinner.avelocity = '0 90 0';
+    self.bomb1.gun1 = spinner;
 
     spinner = spawn();
     spinner.owner = self;
@@ -817,76 +694,50 @@ void raptor_dinit()
     setattachment(spinner, self, "engine_right");
     spinner.movetype = MOVETYPE_NOCLIP;
     spinner.avelocity = '0 -90 0';
+    self.bomb1.gun2 = spinner;
 
-    addstat(STAT_HUD, AS_INT,  hud);
-       addstat(STAT_VEHICLESTAT_HEALTH,  AS_FLOAT, vehicle_health);
-       addstat(STAT_VEHICLESTAT_SHIELD,  AS_FLOAT, vehicle_shield);
-       addstat(STAT_VEHICLESTAT_ENERGY,  AS_FLOAT, vehicle_energy);
-
-       addstat(STAT_VEHICLESTAT_AMMO1,   AS_INT,   vehicle_ammo1);
-       addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1);
+    // Sigh.
+    self.bomb1.think = raptor_rotor_anglefix;
+    self.bomb1.nextthink = time;
 
-       addstat(STAT_VEHICLESTAT_AMMO2,   AS_INT,   vehicle_ammo2);
-       addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
-
-    raptor_spawn();
+    self.mass               = 1 ;
 }
 
 void spawnfunc_vehicle_raptor()
 {
-    self.cvar_basename      = "g_vehicle_raptor";
-    raptor_loadsettings();
+    vehicles_configcheck("vehicle_raptor.cfg", autocvar_g_vehicle_raptor_health);
 
-    self.vehicle_flags      = VHF_HASSHIELD | VHF_SHIELDREGEN;
+    self.vehicle_flags |= VHF_DMGSHAKE;
+    self.vehicle_flags |= VHF_DMGROLL;
+   
+    if(autocvar_g_vehicle_raptor_shield)
+        self.vehicle_flags |= VHF_HASSHIELD;
 
-    traceline(self.origin, self.origin - '0 0 2048', MOVE_WORLDONLY, self);
-    if(trace_startsolid)
-    {
-        dprint("WARNING: vehicle_raptor placed in solid\n");
-        traceline(self.origin + '0 0 512' ,self.origin - '0 0 2048',MOVE_WORLDONLY,self);
-        if(trace_startsolid || trace_fraction == 1.0)
-        {
-            dprint("ERROR: vehicle_raptor placed in more then 512 units into solid\n");
-            remove(self);
-            return;
-        }
-    }
+    if(autocvar_g_vehicle_raptor_shield_regen)
+        self.vehicle_flags |= VHF_SHIELDREGEN;
 
-    if(trace_fraction != 1.0)
-        setorigin(self,trace_endpos + '0 0 8');
-    else
-        dprint("WARNING: vehicle_racer placed more then 2048 units above ground.\n");
+    if(autocvar_g_vehicle_raptor_health_regen)
+        self.vehicle_flags |= VHF_HEALTHREGEN;
+
+    if(autocvar_g_vehicle_raptor_energy_regen)
+        self.vehicle_flags |= VHF_ENERGYREGEN;
 
     precache_model ("models/vehicles/raptor.dpm");
     precache_model ("models/vehicles/raptor_gun.dpm");
     precache_model ("models/vehicles/spinner.dpm");
     precache_model ("models/vehicles/raptor_cockpit.dpm");
-    precache_model ("models/vehicles/raptor_bomb.dpm");
-
-
+    //precache_model ("models/vehicles/clusterbomb.md3");
+    precache_model ("models/vehicles/clusterbomb_folded.md3");
+    precache_model ("models/vehicles/raptor_body.dpm");
+    
+    precache_sound ("vehicles/raptor_fly.wav");
+    precache_sound ("vehicles/raptor_speed.wav");
+    
     self.think = raptor_dinit;
-    self.nextthink = time + 1;
-}
-
-
-void spawnfunc_vehicle_raptor2()
-{
-    entity iqm,dpm,md3;
-
-    precache_model ("models/vehicles/test.iqm");
-    precache_model ("models/vehicles/test.dpm");
-    precache_model ("models/vehicles/test.md3");
-
-    iqm = spawn();
-    dpm = spawn();
-    md3 = spawn();
-    iqm.scale = md3.scale = dpm.scale = 10;
-
-    //setmodel(iqm,"models/vehicles/test.iqm");
-    //setmodel(dpm,"models/vehicles/test.dpm");
-    setmodel(md3,"models/vehicles/test.md3");
-
-    setorigin(iqm, self.origin + '0 0 16');
-    setorigin(dpm, self.origin + '0 20 32');
-    setorigin(iqm, self.origin + '0 40 48');
+    
+    if(g_assault)
+        self.nextthink = time + 0.5;
+    else
+        self.nextthink = time + (autocvar_g_vehicles_delayspawn ? autocvar_g_vehicle_raptor_respawntime + (random() * autocvar_g_vehicles_delayspawn_jitter) : 0.5);
 }
+#endif // SVQC
index 6743f73d2305aeffc3ae4b66c623945bcd5c06e6..f43ec08e52f35f9a792a172a82c6a9da3e4f0093 100644 (file)
@@ -1,71 +1,74 @@
-const vector spiderbot_MIN = '-75 -75 0';
-const vector spiderbot_MAX  = '75 75 100';
-
-#define spiderbot_spawnpnt wkr_spawn
+const vector SPIDERBOT_MIN = '-75 -75 10';
+const vector SPIDERBOT_MAX  = '75 75 125';
+
+#ifdef SVQC
+float autocvar_g_vehicle_spiderbot_respawntime;
+
+float autocvar_g_vehicle_spiderbot_speed_stop;
+float autocvar_g_vehicle_spiderbot_speed_strafe;
+float autocvar_g_vehicle_spiderbot_speed_walk;
+float autocvar_g_vehicle_spiderbot_turnspeed;
+float autocvar_g_vehicle_spiderbot_movement_inertia;
+
+float autocvar_g_vehicle_spiderbot_springlength;
+float autocvar_g_vehicle_spiderbot_springup;
+float autocvar_g_vehicle_spiderbot_springblend;
+
+float autocvar_g_vehicle_spiderbot_head_pitchlimit_down;
+float autocvar_g_vehicle_spiderbot_head_pitchlimit_up;
+float autocvar_g_vehicle_spiderbot_head_pitchspeed;
+float autocvar_g_vehicle_spiderbot_head_turnlimit;
+float autocvar_g_vehicle_spiderbot_head_turnspeed;
+
+//float autocvar_g_vehicle_spiderbot_energy;
+//float autocvar_g_vehicle_spiderbot_energy_regen;
+//float autocvar_g_vehicle_spiderbot_energy_regen_pause;
+
+float autocvar_g_vehicle_spiderbot_health;
+float autocvar_g_vehicle_spiderbot_health_regen;
+float autocvar_g_vehicle_spiderbot_health_regen_pause;
+
+float autocvar_g_vehicle_spiderbot_shield;
+float autocvar_g_vehicle_spiderbot_shield_regen;
+float autocvar_g_vehicle_spiderbot_shield_regen_pause;
+
+float autocvar_g_vehicle_spiderbot_minigun_damage;
+float autocvar_g_vehicle_spiderbot_minigun_refire;
+float autocvar_g_vehicle_spiderbot_minigun_spread;
+float autocvar_g_vehicle_spiderbot_minigun_ammo_cost;
+float autocvar_g_vehicle_spiderbot_minigun_ammo_max;
+float autocvar_g_vehicle_spiderbot_minigun_ammo_regen;
+float autocvar_g_vehicle_spiderbot_minigun_ammo_regen_pause;
+
+float autocvar_g_vehicle_spiderbot_rocket_damage;
+float autocvar_g_vehicle_spiderbot_rocket_force;
+float autocvar_g_vehicle_spiderbot_rocket_radius;
+float autocvar_g_vehicle_spiderbot_rocket_speed;
+float autocvar_g_vehicle_spiderbot_rocket_refire;
+float autocvar_g_vehicle_spiderbot_rocket_reload;
+float autocvar_g_vehicle_spiderbot_rocket_health;
+float autocvar_g_vehicle_spiderbot_rocket_noise;
+float autocvar_g_vehicle_spiderbot_rocket_turnrate;
+float autocvar_g_vehicle_spiderbot_rocket_lifetime;
 
 void spiderbot_exit(float eject);
 void spiderbot_enter();
-
-void spiderbot_rocket_explode()
-{
-    vector org2;
-
-    if(self.event_damage != SUB_Null)
-    {
-        self.event_damage = SUB_Null;
-        self.think = spiderbot_rocket_explode;
-        self.nextthink = time;
-        return;
-    }
-
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    org2 = findbetterlocation (self.origin, 16);
-    pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
-    w_deathtypestring = "dident escape the rocket barrage";
-
-    if(!self.owner)
-        self.owner = self.realowner;
-
-    RadiusDamage (self, self.owner,
-        autocvar_g_vehicle_spiderbot_rocket_damage,
-        autocvar_g_vehicle_spiderbot_rocket_edgedamage,
-        autocvar_g_vehicle_spiderbot_rocket_radius, world,
-        autocvar_g_vehicle_spiderbot_rocket_force, DEATH_SBROCKET, world);
-
-    remove (self);
-}
-
-void spiderbot_rocket_touch()
-{
-    if(self.owner)
-    {
-        if(other == self.owner.vehicle)
-            return;
-
-        if(other == self.owner.vehicle.tur_head)
-            return;
-    }
-
-    PROJECTILE_TOUCH;
-    spiderbot_rocket_explode();
-}
+void spiderbot_spawn();
 
 void spiderbot_rocket_unguided()
 {
-    vector newdir,olddir;
+    vector newdir, olddir;
 
     self.nextthink  = time;
 
-
     olddir = normalize(self.velocity);
     newdir = normalize(self.pos1 - self.origin) + randomvec() * autocvar_g_vehicle_spiderbot_rocket_noise;
     self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_spiderbot_rocket_turnrate) * autocvar_g_vehicle_spiderbot_rocket_speed;
 
     UpdateCSQCProjectile(self);
 
-    if (self.owner.deadflag != DEAD_NO || self.cnt < time)
-        spiderbot_rocket_explode();
-
+    if (self.owner.deadflag != DEAD_NO || self.cnt < time || vlen(self.pos1 - self.origin) < 16)
+        self.use();
 }
 
 void spiderbot_rocket_guided()
@@ -74,10 +77,10 @@ void spiderbot_rocket_guided()
 
     self.nextthink  = time;
 
-    if not (self.owner.vehicle)
+    if not (self.realowner.vehicle)
         self.think = spiderbot_rocket_unguided;
 
-    crosshair_trace(self.owner);
+    crosshair_trace(self.realowner);
     olddir = normalize(self.velocity);
     newdir = normalize(trace_endpos - self.origin) + randomvec() * autocvar_g_vehicle_spiderbot_rocket_noise;
     self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_spiderbot_rocket_turnrate) * autocvar_g_vehicle_spiderbot_rocket_speed;
@@ -85,26 +88,17 @@ void spiderbot_rocket_guided()
     UpdateCSQCProjectile(self);
 
     if (self.owner.deadflag != DEAD_NO || self.cnt < time)
-        spiderbot_rocket_explode();
-}
-
-void spiderbot_rocket_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
-{
-    self.health -= damage;
-    self.velocity += force;
-    if(self.health < 1)
-        spiderbot_rocket_explode();
+        self.use();
 }
 
 void spiderbot_guide_release()
 {
     entity rkt;
-    rkt = findchainentity(owner,self.owner);
+    rkt = findchainentity(realowner, self.owner);
     if not (rkt)
         return;
 
     crosshair_trace(self.owner);
-
     while(rkt)
     {
         if(rkt.think == spiderbot_rocket_guided)
@@ -112,13 +106,14 @@ void spiderbot_guide_release()
             rkt.pos1 = trace_endpos;
             rkt.think = spiderbot_rocket_unguided;
         }
-
         rkt = rkt.chain;
     }
 }
 
 void spiderbot_rocket_do()
 {
+
+    vector v;
     entity rocket;
 
     if (self.owner.BUTTON_ATCK2)
@@ -131,7 +126,6 @@ void spiderbot_rocket_do()
 
             return;
         }
-
         self.wait = 1;
     }
     else
@@ -151,33 +145,20 @@ void spiderbot_rocket_do()
     if not (self.owner.BUTTON_ATCK2)
         return;
 
-    sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
-    rocket                    = spawn ();
-    setsize (rocket, '-1 -1 -1', '1 1 1'); // give it some size so it can be shot
-    setorigin(rocket,gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire")));
-    te_explosion (rocket.origin);
-
     crosshair_trace(self.owner);
 
-    rocket.classname       = "spiderbot_rocket";
-    rocket.bot_dodge       = TRUE;
-    rocket.bot_dodgerating = autocvar_g_vehicle_spiderbot_rocket_damage;
-    rocket.cnt             = time + autocvar_g_vehicle_spiderbot_rocket_lifetime;
-    rocket.health          = autocvar_g_vehicle_spiderbot_rocket_health;
-    rocket.takedamage      = DAMAGE_AIM;
-    rocket.event_damage    = spiderbot_rocket_damage;
-    rocket.owner           = self.owner;
-    rocket.nextthink       = time;
-    rocket.movetype        = MOVETYPE_FLYMISSILE;
-    rocket.velocity        = normalize(v_forward + (v_up * 0.5) + randomvec() * 0.25) * autocvar_g_vehicle_spiderbot_rocket_speed;
-    rocket.angles          = vectoangles(rocket.velocity);
-    rocket.think           = spiderbot_rocket_guided;
-    rocket.touch           = spiderbot_rocket_touch;
-    rocket.flags           = FL_PROJECTILE;
-    rocket.solid           = SOLID_TRIGGER;
-    rocket.pos1            = trace_endpos;
-
-       CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
+    v = gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire"));
+    rocket = vehicles_projectile("spiderbot_rocket_launch", "weapons/rocket_fire.wav",
+                           v, normalize(v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed,
+                           autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1,
+                           DEATH_SBROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, FALSE);
+
+    rocket.cnt        = time + 15;
+    rocket.classname  = "spiderbot_rocket";
+    rocket.pos1       = trace_endpos;
+    rocket.think      = spiderbot_rocket_guided;
+    rocket.nextthink  = time;
+    rocket.cnt        = time + autocvar_g_vehicle_spiderbot_rocket_lifetime;
 
     self.tur_head.frame += 1;
     if (self.tur_head.frame == 9)
@@ -188,159 +169,85 @@ void spiderbot_rocket_do()
     self.gun2.cnt = time + self.attack_finished_single;
 }
 
-/*
-void spiderbot_minigun_fire_Flash_Go() {
-       if (self.frame > 10)
-       {
-               self.alpha = -1;
-               setmodel(self,"");
-               return;
-       }
-
-       self.frame = self.frame + 2;
-       self.alpha = self.alpha - 0.2;
-       self.scale -= 0.01;
-       self.nextthink = time + 0.02;
-}
-*/
-
-void spiderbot_minigun_fire(entity gun, float trail)
-{
-    vector v;
-    
-    v = gettaginfo(gun,gettagindex(gun,"barrels"));
-    v_forward = normalize(v_forward);
-
-    sound (gun, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
-
-    fireBullet (v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
-        autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_SBMINIGUN, 0);
-
-
-       UziFlash();
-       setattachment(self.muzzle_flash, self.tur_head, "tag_fire");
-
-    if(trail)
-        trailparticles(self, particleeffectnum("EF_MGTURRETTRAIL"), v, trace_endpos);
-}
-
-void spiderbot_miniguns_do()
-{
-    float ftmp;
-
-    if((self.vehicle_reload1 == 1) || (!self.owner.BUTTON_ATCK))
-    {
-
-        ftmp = 1 / autocvar_g_vehicle_spiderbot_minigun_cooldown * sys_frametime;
-        self.owner.vehicle_reload1 = max(self.owner.vehicle_reload1 - ftmp, 0);
-        if(self.owner.vehicle_reload1 <= 0)
-            self.vehicle_reload1 = 0;
-
-        return ;
-    }
-
-    if (self.owner.BUTTON_ATCK)
-    {
-
-        // Animate miniguns
-        self.gun1.angles_z += (1440 * sys_frametime);
-        self.gun2.angles_z -= (1440 * sys_frametime);
-        if(self.gun1.angles_z >= 360)
-        {
-            self.gun1.angles_z = 0;
-            self.gun2.angles_z = 360;
-        }
-
-        if (self.tur_head.attack_finished_single < time)
-        {
-            // Fire bullets, alternating trails left<->right
-            self = self.owner;
-            if(self.misc_bulletcounter == 1)
-            {
-                spiderbot_minigun_fire(self.vehicle.gun1, 0);
-                spiderbot_minigun_fire(self.vehicle.gun2, 1);
-                self.misc_bulletcounter = 0;
-            }
-            else
-            {
-                spiderbot_minigun_fire(self.vehicle.gun1, 1);
-                spiderbot_minigun_fire(self.vehicle.gun2, 0);
-                self.misc_bulletcounter += 1;
-            }
-
-            self = self.vehicle;
-
-            ftmp = autocvar_g_vehicle_spiderbot_minigun_refire / autocvar_g_vehicle_spiderbot_minigun_heat;
-            self.owner.vehicle_reload1 +=  ftmp;
-
-            if(self.owner.vehicle_reload1 >= 1)
-            {
-                self.vehicle_reload1 = 1;
-                self.owner.vehicle_reload1 = 1;
-                self.tur_head.attack_finished_single = autocvar_g_vehicle_spiderbot_minigun_cooldown + time;
-            }
-            else
-                self.tur_head.attack_finished_single = autocvar_g_vehicle_spiderbot_minigun_refire + time;
-        }
-
-        self = self.owner;
-        return;
-    }
-}
-
-float spiderbot_pplug()
+float spiderbot_frame()
 {
     vector ad;
-    entity player,spider;
+    entity player, spider;
     float ftmp;
 
-    if not (self.owner)
-    {
-    }
-
+       if(intermission_running)
+               return 1;
+               
     player = self;
     spider = self.vehicle;
+    self   = spider;
 
-    player.BUTTON_ZOOM = 0;
-    player.BUTTON_CROUCH = 0;
-    player.switchweapon = 0;
-
-    if(player.BUTTON_USE)
-    {
-        self = spider;
-        spiderbot_exit(0);
-        self = player;
-        return 0;
-    }
+    vehicles_painframe();
+    
+    player.BUTTON_ZOOM      = 0;
+    player.BUTTON_CROUCH    = 0;
+    player.switchweapon     = 0;
 
     crosshair_trace(player);
-    ad = vectoangles(normalize(trace_endpos - gettaginfo(spider.tur_head,gettagindex(spider.tur_head,"tag_hud")))) - (spider.tur_head.angles + spider.angles);
+    //UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload2) + ('0 1 0' * (1 - player.vehicle_reload2)), 2);
 
-    fixedmakevectors(spider.angles);
-    if(ad_x > 180) ad_x -= 360;
+    //player.v_angle_x *= -1;
+    //gettaginfo(spider.tur_head, 0);
+    //ad = player.v_angle - vectoangles2(v_forward, v_up);
+    //ad = player.v_angle - (spider.tur_head.angles + spider.angles);
+    //player.v_angle_x *= -1;
+    ad = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(spider.angles), AnglesTransform_FromVAngles(player.v_angle))) - spider.tur_head.angles;
+
+    if(ad_x > 180)  ad_x -= 360;
     if(ad_x < -180) ad_x += 360;
-    if(ad_y > 180) ad_y -= 360;
+    if(ad_y > 180)  ad_y -= 360;
     if(ad_y < -180) ad_y += 360;
-
+    
     // Rotate head
     ftmp = autocvar_g_vehicle_spiderbot_head_turnspeed * sys_frametime;
     ad_y = bound(-ftmp, ad_y, ftmp);
     spider.tur_head.angles_y = bound(autocvar_g_vehicle_spiderbot_head_turnlimit * -1, spider.tur_head.angles_y + ad_y, autocvar_g_vehicle_spiderbot_head_turnlimit);
 
     // Pitch head
+#if 0 // Enable to pich by cross-trace (more precise in chase, but less predictable)
+    ad = vectoangles(normalize(trace_endpos - gettaginfo(spider.tur_head,gettagindex(spider.tur_head,"tag_hud")))) - (spider.tur_head.angles + spider.angles);
+    if(ad_x > 180) ad_x -= 360;
+    if(ad_x < -180) ad_x += 360;
+#endif
     ftmp = autocvar_g_vehicle_spiderbot_head_pitchspeed * sys_frametime;
-    ad_x = bound(-ftmp, ad_x, ftmp);
+    ad_x = bound(ftmp * -1, ad_x, ftmp);
     spider.tur_head.angles_x = bound(autocvar_g_vehicle_spiderbot_head_pitchlimit_down, spider.tur_head.angles_x + ad_x, autocvar_g_vehicle_spiderbot_head_pitchlimit_up);
 
     // Turn Body
     ftmp = autocvar_g_vehicle_spiderbot_turnspeed * sys_frametime;
     ftmp = bound(-ftmp, spider.tur_head.angles_y, ftmp);
 
-    self = spider;
+    makevectors(spider.angles + '-2 0 0' * spider.angles_x);
+
+/*
+    vector ofs;
+    ofs = self.origin + v_up * 128;
+    te_lightning1(world, ofs, ofs + v_up * 32);
+    te_lightning1(world, ofs, ofs + v_right * 128);
+    te_lightning1(world, ofs, ofs + v_forward * 256);
+*/
+
+    movelib_groundalign4point(autocvar_g_vehicle_spiderbot_springlength, autocvar_g_vehicle_spiderbot_springup, autocvar_g_vehicle_spiderbot_springblend);
+
     if(spider.flags & FL_ONGROUND)
     {
-        if(player.BUTTON_JUMP && self.tur_head.wait < time)
+        if(spider.frame == 4 && self.tur_head.wait != 0)
         {
+            sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_land.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+            spider.frame = 5;            
+        }
+        
+        if(player.BUTTON_JUMP && self.tur_head.wait < time)
+        {        
+            sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_jump.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+            //dprint("spiderbot_jump:", ftos(soundlength("vehicles/spiderbot_jump.wav")), "\n");
+            self.delay = 0;
+
             self.tur_head.wait = time + 2;
             player.BUTTON_JUMP = 0;
             spider.velocity   = v_forward * 700 + v_up * 600;
@@ -350,6 +257,13 @@ float spiderbot_pplug()
         {
             if(vlen(player.movement) == 0)
             {
+                if(self.sound_nexttime < time || self.delay != 3)
+                {                        
+                    self.delay = 3;
+                    self.sound_nexttime = time + 6.486500; //soundlength("vehicles/spiderbot_idle.wav");
+                    //dprint("spiderbot_idle:", ftos(soundlength("vehicles/spiderbot_idle.wav")), "\n");
+                    sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_idle.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+                }                
                 movelib_beak_simple(autocvar_g_vehicle_spiderbot_speed_stop);
                 spider.frame = 5;
             }
@@ -372,6 +286,14 @@ float spiderbot_pplug()
                     }
                     player.movement_y = 0;
                     movelib_move_simple(normalize(v_forward * player.movement_x),autocvar_g_vehicle_spiderbot_speed_walk,autocvar_g_vehicle_spiderbot_movement_inertia);
+
+                    if(self.sound_nexttime < time || self.delay != 1)
+                    {                        
+                        self.delay = 1;
+                        self.sound_nexttime = time + 6.486500; //soundlength("vehicles/spiderbot_walk.wav");
+                        sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_walk.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+                        //dprint("spiderbot_walk:", ftos(soundlength("vehicles/spiderbot_walk.wav")), "\n");
+                    }
                 }
                 else if(player.movement_y != 0)
                 {
@@ -386,31 +308,111 @@ float spiderbot_pplug()
                         spider.frame = 3;
                     }
                     movelib_move_simple(normalize(v_right * player.movement_y),autocvar_g_vehicle_spiderbot_speed_strafe,autocvar_g_vehicle_spiderbot_movement_inertia);
+                    if(self.sound_nexttime < time || self.delay != 2)
+                    {                        
+                        self.delay = 2;
+                        self.sound_nexttime = time + 6.486500; //soundlength("vehicles/spiderbot_strafe.wav");
+                        sound (self, CH_TRIGGER_SINGLE, "vehicles/spiderbot_strafe.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+                        //dprint("spiderbot_strafe:", ftos(soundlength("vehicles/spiderbot_strafe.wav")), "\n");
+                    }
                 }
+            }
+        }
+    }
+
+    self.angles_x = bound(-45, self.angles_x, 45);
+    self.angles_z = bound(-45, self.angles_z, 45);
+
+    if(player.BUTTON_ATCK)
+    {
+        spider.cnt = time;
+        if(spider.vehicle_ammo1 >= autocvar_g_vehicle_spiderbot_minigun_ammo_cost && spider.tur_head.attack_finished_single <= time)
+        {
+            entity gun;
+            vector v;
+            spider.misc_bulletcounter += 1;
+
+            self = player;
+
+            mod(spider.misc_bulletcounter, 2) ? gun = spider.gun1 : gun = spider.gun2;
+            v = gettaginfo(gun, gettagindex(gun, "barrels"));
+            v_forward = normalize(v_forward);
+            v += v_forward * 50;
 
+            fireBullet (v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
+                autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_SBMINIGUN, 0);
+
+            sound (gun, CH_WEAPON_A, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
+            trailparticles(self, particleeffectnum("spiderbot_minigun_trail"), v, trace_endpos);
+            pointparticles(particleeffectnum("spiderbot_minigun_muzzleflash"), v, v_forward * 2500, 1);
+
+            self = spider;
+
+            spider.vehicle_ammo1 -= autocvar_g_vehicle_spiderbot_minigun_ammo_cost;
+            spider.tur_head.attack_finished_single = time + autocvar_g_vehicle_spiderbot_minigun_refire;
+            player.vehicle_ammo1 = (spider.vehicle_ammo1 / autocvar_g_vehicle_spiderbot_minigun_ammo_max) * 100;
+            spider.gun1.angles_z += 45;
+            spider.gun2.angles_z -= 45;
+            if(spider.gun1.angles_z >= 360)
+            {
+                spider.gun1.angles_z = 0;
+                spider.gun2.angles_z = 0;
             }
         }
-        movelib_groundalign4point(300,100,0.25);
     }
+    else
+        vehicles_regen(cnt, vehicle_ammo1, autocvar_g_vehicle_spiderbot_minigun_ammo_max,
+                                           autocvar_g_vehicle_spiderbot_minigun_ammo_regen_pause,
+                                           autocvar_g_vehicle_spiderbot_minigun_ammo_regen, frametime);
+        
 
-    spiderbot_miniguns_do();
     spiderbot_rocket_do();
-    vehicle_stdproc_shiledregen(CCVAR("_shield"), frametime);
-    vehicle_stdproc_healthregen(CCVAR("_health"), frametime);
+
+    if(self.vehicle_flags  & VHF_SHIELDREGEN)
+        vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_spiderbot_shield, autocvar_g_vehicle_spiderbot_shield_regen_pause, autocvar_g_vehicle_spiderbot_shield_regen, frametime);
+
+    if(self.vehicle_flags  & VHF_HEALTHREGEN)
+        vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_spiderbot_health, autocvar_g_vehicle_spiderbot_health_regen_pause, autocvar_g_vehicle_spiderbot_health_regen, frametime);
 
     player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
     player.vehicle_ammo2 = spider.tur_head.frame;
 
     if(spider.gun2.cnt <= time)
-        player.vehicle_reload2 = 1;
+        player.vehicle_reload2 = 100;
     else
-        player.vehicle_reload2 = 1 - ((spider.gun2.cnt - time) / spider.attack_finished_single);
+        player.vehicle_reload2 = 100 - ((spider.gun2.cnt - time) / spider.attack_finished_single) * 100;
 
-    setorigin(player,spider.origin + '0 0 64');
+    setorigin(player, spider.origin + '0 0 1' * SPIDERBOT_MAX_z);
     player.velocity = spider.velocity;
 
-    self = player;
+    VEHICLE_UPDATE_PLAYER(health, spiderbot);
+
+    if(self.vehicle_flags & VHF_HASSHIELD)
+        VEHICLE_UPDATE_PLAYER(shield, spiderbot);
+
+#if 1 // 0 to enable per-gun impact aux crosshairs
+    // Avarage gun impact point's -> aux cross
+    vector vf;
+    ad = gettaginfo(spider.gun1, gettagindex(spider.gun1, "barrels"));
+    vf = v_forward;
+    ad += gettaginfo(spider.gun2, gettagindex(spider.gun2, "barrels"));
+    vf += v_forward;
+    ad = ad * 0.5;
+    v_forward = vf * 0.5;
+    traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, spider);
+    UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload1) + ('0 1 0' * (1 - player.vehicle_reload1)), 0);
+
+#else
+    ad = gettaginfo(spider.gun1, gettagindex(spider.gun1, "barrels"));
+    traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, spider);
+    UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload1) + ('0 1 0' * (1 - player.vehicle_reload1)), 0);
+
+    ad = gettaginfo(spider.gun2, gettagindex(spider.gun2, "barrels"));
+    traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, spider);
+    UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload1) + ('0 1 0' * (1 - player.vehicle_reload1)), 1);
+#endif
 
+    self = player;
     return 1;
 }
 
@@ -424,71 +426,23 @@ void spiderbot_think()
 
 void spiderbot_enter()
 {
-    // Remove this when bots know how to use the spiderbot
-    if (clienttype(other) != CLIENTTYPE_REAL)
-        return;
-
-    self.colormod = self.tur_head.colormod = '0 0 0';
-
-    if(teams_matter)
-    if(self.team)
-    if(self.team != other.team)
-        return;
+    self.movetype   = MOVETYPE_WALK;
 
-    self.owner = other;
-    self.switchweapon = other.switchweapon;
-
-    self.event_damage         = vehicle_stdproc_damage ;
-    self.colormap             = self.owner.colormap;
-    self.tur_head.colormap    = self.owner.colormap;
-    self.vehicle_hudmodel.viewmodelforclient = self.owner;
-    self.nextthink            = 0;
-    self.owner.angles         = self.angles;
-    self.owner.takedamage     = DAMAGE_NO;
-    self.owner.solid          = SOLID_NOT;
-    self.owner.movetype       = MOVETYPE_NOCLIP;
-    self.owner.alpha          = -1;
-    self.owner.PlayerPhysplug = spiderbot_pplug;
-    self.owner.vehicle        = self;
-    self.owner.event_damage   = SUB_Null;
-    self.owner.hud            = HUD_SPIDERBOT;
     self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_spiderbot_health);
     self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_spiderbot_shield);
-    self.owner.view_ofs       = '0 0 0';
-    self.owner.vehicle_ammo1 = self.vehicle_ammo1;
-    self.owner.vehicle_ammo2 = self.vehicle_ammo2;
-    self.owner.vehicle_reload1 = self.vehicle_reload1;
-    self.owner.vehicle_reload2 = self.vehicle_reload2;
-
-    //if(other.flags & FL_ONGROUND)
-        other.flags &~= FL_ONGROUND;
 
-    //if(self.flags & FL_ONGROUND)
-        self.flags &~= FL_ONGROUND;
-
-    self.team                 = self.owner.team;
-    self.flags               -= FL_NOTARGET;
-
-    if(clienttype(other) == CLIENTTYPE_REAL)
+    if(self.owner.flagcarried)
     {
-        msg_entity = other;
-        WriteByte (MSG_ONE, SVC_SETVIEWPORT);
-        WriteEntity(MSG_ONE, self.vehicle_viewport);
-
-        WriteByte (MSG_ONE, SVC_SETVIEWANGLES);  // 10 = SVC_SETVIEWANGLES
-        WriteAngle(MSG_ONE, self.tur_head.angles_x + self.angles_x);    // tilt
-        WriteAngle(MSG_ONE, self.tur_head.angles_y + self.angles_y);    // yaw
-        WriteAngle(MSG_ONE, 0);    // roll
+        setattachment(self.owner.flagcarried, self.tur_head, ""); 
+        setorigin(self.owner.flagcarried, '-20 0 120'); 
     }
 }
 
 void spiderbot_exit(float eject)
 {
     entity e;
-    self.frame = 5;
-
-    self.flags      |= FL_NOTARGET;
-
+    vector spot;
+    
     e = findchain(classname,"spiderbot_rocket");
     while(e)
     {
@@ -500,256 +454,198 @@ void spiderbot_exit(float eject)
         e = e.chain;
     }
 
-    self.owner.switchweapon = self.switchweapon;
-
-    self.velocity = '0 0 0';
-    if(clienttype(self.owner) == CLIENTTYPE_REAL)
-    {
-        msg_entity = self.owner;
-        WriteByte (MSG_ONE, SVC_SETVIEWPORT);
-        WriteEntity( MSG_ONE, self.owner);
-
-        WriteByte (MSG_ONE, SVC_SETVIEWANGLES);  // 10 = SVC_SETVIEWANGLES
-        WriteAngle(MSG_ONE, 0);    // tilt
-        WriteAngle(MSG_ONE, self.angles_y);    // yaw
-        WriteAngle(MSG_ONE, 0);    // roll
-    }
-
-    self.think = spiderbot_think;
-    self.nextthink = time;
-    self.owner.takedamage     = DAMAGE_AIM;
-    self.owner.solid          = SOLID_SLIDEBOX;
-    self.owner.movetype       = MOVETYPE_WALK;
-
-    setsize(self.owner,PL_MIN,PL_MAX);
-
-    self.owner.alpha          = 1;
-    self.owner.PlayerPhysplug = SUB_Null;
-    self.owner.vehicle        = world;
-       self.owner.view_ofs       = PL_VIEW_OFS;
-       self.owner.hud            = HUD_NORMAL;
-       self.owner.event_damage   = PlayerDamage;
-
-       self.colormap            = 1024;
-       self.tur_head.colormap   = 1024;
-
-    if not (teams_matter)
-        self.team                = 0;
-    else
-    {
-        self.team = self.spiderbot_spawnpnt.team ;
-        if (self.team == COLOR_TEAM1) self.colormod = '1.4 0.8 0.8';
-        if (self.team == COLOR_TEAM2) self.colormod = '0.8 0.8 1.4';
-        self.tur_head.colormod = self.colormod;
-    }
-
-       self.vehicle_hudmodel.viewmodelforclient = self;
-       self.tur_head.nodrawtoclient             = self;
-
-    setattachment(self.owner,world,"");
+    self.velocity   = '0 0 0';
+    self.think      = spiderbot_think;
+    self.nextthink  = time;
+    self.frame      = 5;
+    self.movetype   = MOVETYPE_WALK;
+    
+    if not (self.owner)
+        return;
 
        makevectors(self.angles);
        if(eject)
        {
-           setorigin(self.owner,self.origin + v_forward * 100 + '0 0 64');
+           spot = self.origin + v_forward * 100 + '0 0 64';
+           spot = vehicles_findgoodexit(spot);
+           setorigin(self.owner , spot);
            self.owner.velocity = (v_up + v_forward * 0.25) * 750;
        }
        else
-        setorigin(self.owner,self.origin - v_forward * 200 + '0 0 64');
-
+       {
+           spot = self.origin - v_forward * 200 + '0 0 64';
+           spot = vehicles_findgoodexit(spot);
+           setorigin(self.owner , spot);
+       }
+        
     self.owner = world;
 }
 
-float spiderbot_crushable(entity e)
+void spiderbot_spawn()
 {
-    if(e.classname == "corpse")
-        return 1;
-
-    if(e.classname == "player")
-        return 1;
-
-    if(e.classname == "monster_zombie")
-        return 1;
-
-    return 0;
+    self.frame              = 5;
+    self.tur_head.frame     = 1;
+    self.think              = spiderbot_think;
+    self.nextthink          = time;
+    self.vehicle_health     = autocvar_g_vehicle_spiderbot_health;
+    self.vehicle_shield     = autocvar_g_vehicle_spiderbot_shield;
+    self.movetype           = MOVETYPE_WALK;
+    self.solid              = SOLID_SLIDEBOX;
+    self.alpha              = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1;
+    self.tur_head.angles    = '0 0 0';
+
+    setorigin(self, self.pos1 + '0 0 128');
+    self.angles = self.pos2;
 }
 
-void spiderbot_touch()
+void spiderbot_headfade()
 {
-    if(self.owner)
-    {
-        if(vlen(self.velocity) == 0)
-            return;
-
-        if not (spiderbot_crushable(other))
-            return;
-
-        //todo: add check for velocity/angle here (so we dont cush players runing into us from behind)
+       self.think = spiderbot_headfade;
+       self.nextthink = self.fade_time;
+       self.alpha = 1 - (time - self.fade_time) * self.fade_rate;
 
-        Damage(other,self,self.owner,autocvar_g_vehicle_spiderbot_crush_dmg,DEATH_SBCRUSH,'0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicle_spiderbot_crush_force );
-        return;
+    if(self.cnt < time || self.alpha < 0.1)
+    {
+        if(self.alpha > 0.1)
+        {
+            sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+            pointparticles(particleeffectnum("explosion_big"), self.origin + '0 0 100', '0 0 0', 1);
+        }
+        remove(self);
     }
-
-    if(other.classname != "player")
-        return;
-
-    if(other.deadflag != DEAD_NO)
-        return;
-
-    if(other.vehicle != world)
-        return;
-
-    spiderbot_enter();
-}
-
-float spiderbot_customizeentityforclient()
-{
-    if(self.deadflag == DEAD_DEAD)
-        return FALSE;
-
-    return TRUE;
-}
-
-void spiderbot_spawn()
-{
-    self.frame = 5;
-    self.think = spiderbot_think;
-    self.nextthink = time;
-
-    setsize(self,spiderbot_MIN,spiderbot_MAX);
-
-    self.owner = world;
-    self.velocity = '0 0 0';
-    self.vehicle_health = CCVAR("_health");
-    self.vehicle_shield = CCVAR("_shield");
-    self.event_damage = vehicle_stdproc_damage;
-    self.iscreature = TRUE;
-    self.movetype   = MOVETYPE_WALK;
-    self.solid      = SOLID_SLIDEBOX;
-    self.takedamage = DAMAGE_AIM;
-    self.touch      = spiderbot_touch;
-    self.alpha      = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1;
-    self.tur_head.angles = '0 0 0';
-       self.colormap = 1024;
-       self.tur_head.colormap = 1024;
-       self.deadflag    = DEAD_NO;
-    self.bot_attack = TRUE;
-    self.flags      |= FL_NOTARGET;
-    self.vehicle_hudmodel.viewmodelforclient = self;
-    self.tur_head.frame = 1;
-
-    setorigin(self,self.spiderbot_spawnpnt.origin + '0 0 1.25' * spiderbot_MAX_z);
-    self.angles = self.spiderbot_spawnpnt.angles;
-
-    if (self.team == COLOR_TEAM1)
-        self.colormod = '1.4 0.8 0.8';
-    else if (self.team == COLOR_TEAM2)
-        self.colormod = '0.8 0.8 1.4';
-    else
-        self.colormod = '0 0 0';
-
-    self.tur_head.colormod = self.colormod;
-
-
-    pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
 }
 
 void spiderbot_blowup()
 {
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
+    if(self.cnt > time)
+    {
+        if(random() < 0.1)
+        {
+            sound (self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+            pointparticles(particleeffectnum("explosion_small"), randomvec() * 80 + (self.origin + '0 0 100'), '0 0 0', 1);
+        }
+        self.nextthink = time + 0.1;
+        return;
+    }
+    
+    entity h, g1, g2, b;
+    b = spawn();
+    h = spawn();
+    g1 = spawn();
+    g2 = spawn();
+
+    setmodel(b,  "models/vehicles/spiderbot.dpm");
+    setmodel(h,  "models/vehicles/spiderbot_top.dpm");
+    setmodel(g1, "models/vehicles/spiderbot_barrels.dpm");
+    setmodel(g2, "models/vehicles/spiderbot_barrels.dpm");
+
+    setorigin(b, self.origin);
+    b.frame         = 11;
+    b.angles        = self.angles;
+    setsize(b, self.mins, self.maxs);
+
+    setorigin(h, gettaginfo(self, gettagindex(self, "tag_head")));
+    h.movetype      = MOVETYPE_BOUNCE;
+    h.solid         = SOLID_BBOX;
+    h.velocity      = v_up * (500 + random() * 500) + randomvec() * 128;
+    h.modelflags    = MF_ROCKET;
+    h.effects       = EF_FLAME | EF_LOWPRECISION;
+    h.avelocity     = randomvec() * 360;
+
+    h.alpha         = 1;
+    h.cnt           = time + (3.5 * random());
+    h.fade_rate     = 1 / min(autocvar_g_vehicle_spiderbot_respawntime, 10);
+    h.fade_time     = time;
+    h.think         = spiderbot_headfade;
+    h.nextthink     = time;
+
+    setorigin(g1, gettaginfo(self.tur_head, gettagindex(self.tur_head, "tag_hardpoint01")));
+    g1.movetype     = MOVETYPE_TOSS;
+    g1.solid        = SOLID_CORPSE;
+    g1.velocity     = v_forward * 700 + (randomvec() * 32);
+    g1.avelocity    = randomvec() * 180;
+
+    setorigin(g2, gettaginfo(self.tur_head, gettagindex(self.tur_head, "tag_hardpoint02")));
+    g2.movetype     = MOVETYPE_TOSS;
+    g2.solid        = SOLID_CORPSE;
+    g2.velocity     = v_forward * 700 + (randomvec() * 32);
+    g2.avelocity    = randomvec() * 180;
+
+    h.colormod = b.colormod = g1.colormod = g2.colormod = '-2 -2 -2';
+
+    SUB_SetFade(b,  time + 5, min(autocvar_g_vehicle_spiderbot_respawntime, 1));
+    //SUB_SetFade(h,  time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
+    SUB_SetFade(g1, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
+    SUB_SetFade(g2, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
 
     RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_SBBLOWUP, world);
 
     self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = -1;
-    self.nextthink  = time + autocvar_g_vehicle_spiderbot_respawntime;
-    self.think      = spiderbot_spawn;
     self.movetype   = MOVETYPE_NONE;
-
-    setorigin(self, self.tur_aimpos);
+    self.deadflag   = DEAD_DEAD;
+    self.solid      = SOLID_NOT;
+    self.tur_head.effects  &~=  EF_FLAME;
+       self.vehicle_hudmodel.viewmodelforclient = self;
 }
 
 void spiderbot_die()
 {
-
-    self.health = 0;
-    self.event_damage = SUB_Null;
-    self.iscreature = FALSE;
-    self.solid      = SOLID_NOT;
-    self.takedamage = DAMAGE_NO;
-    self.touch      = SUB_Null;
-    self.nextthink  = time + random() * 2;
-    self.think      = spiderbot_blowup;
-    self.deadflag    = DEAD_DEAD;
-       self.vehicle_hudmodel.viewmodelforclient = self;
-       self.frame = 0;
-       self.tur_head.frame = 1;
-
+    self.health             = 0;
+    self.event_damage       = SUB_Null;
+    self.takedamage         = DAMAGE_NO;
+    self.touch              = SUB_Null;
+    self.cnt                = 3.4 + time + random() * 2;
+    self.think              = spiderbot_blowup;
+    self.nextthink          = time;
+    self.deadflag           = DEAD_DYING;
+       self.frame              = 5;
+       self.tur_head.effects  |= EF_FLAME;
+       self.colormod           = self.tur_head.colormod = '-1 -1 -1';
+       self.frame              = 10;
+       self.movetype           = MOVETYPE_TOSS;
 }
 
 void vewhicle_spiderbot_dinit()
 {
+    if not (vehicle_initialize(
+             "Spiderbot",
+             "models/vehicles/spiderbot.dpm",
+             "models/vehicles/spiderbot_top.dpm",
+             "models/vehicles/spiderbot_cockpit.dpm",
+             "tag_head", "tag_hud", "",
+             HUD_SPIDERBOT,
+             SPIDERBOT_MIN, SPIDERBOT_MAX,
+             FALSE,
+             spiderbot_spawn, autocvar_g_vehicle_spiderbot_respawntime,
+             spiderbot_frame,
+             spiderbot_enter, spiderbot_exit,
+             spiderbot_die,   spiderbot_think,
+             FALSE))
+    {
+        remove(self);
+        return;
+    }
 
-    self.spiderbot_spawnpnt = spawn();
-    self.spiderbot_spawnpnt.angles = self.angles;
-
-    setorigin(self,self.origin);
-    tracebox(self.origin + '0 0 100', spiderbot_MIN, spiderbot_MAX, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
-    setorigin(self.spiderbot_spawnpnt,trace_endpos);
-
-    if(self.team && !teams_matter)
-        self.team = 0;
-    else
-        self.spiderbot_spawnpnt.team = self.team;
-
-    addstat(STAT_HUD, AS_INT,  hud);
-       addstat(STAT_VEHICLESTAT_HEALTH,  AS_FLOAT, vehicle_health);
-       addstat(STAT_VEHICLESTAT_SHIELD,  AS_FLOAT, vehicle_shield);
-       addstat(STAT_VEHICLESTAT_ENERGY,  AS_FLOAT, vehicle_energy);
-       addstat(STAT_VEHICLESTAT_AMMO1,   AS_INT,   vehicle_ammo1);
-       addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1);
-       addstat(STAT_VEHICLESTAT_AMMO2,   AS_INT,   vehicle_ammo2);
-       addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
-
-    if (self.netname == "")
-        self.netname     = "spiderbot";
 
-    self.tur_head           = spawn();
     self.gun1               = spawn();
     self.gun2               = spawn();
-    self.vehicle_viewport   = spawn();
-    self.vehicle_hudmodel   = spawn();
-    self.vehicle_flags      = VHF_HASSHIELD | VHF_SHIELDREGEN | VHF_HEALTHREGEN | VHF_DEATHEJECT;
-    self.cvar_basename      = "g_vehicle_spiderbot";
-    self.gravity            = 2;
 
-    setmodel(self, "models/vehicles/spiderbot.dpm");
-    setmodel(self.tur_head, "models/vehicles/spiderbot_top.dpm");
     setmodel(self.gun1, "models/vehicles/spiderbot_barrels.dpm");
     setmodel(self.gun2, "models/vehicles/spiderbot_barrels.dpm");
-    setmodel(self.vehicle_hudmodel, "models/vehicles/spiderbot_cockpit.dpm");
-    setmodel(self.vehicle_viewport, "null");
-
-    setattachment(self.tur_head, self, "tag_head");
-    setattachment(self.vehicle_hudmodel, self.tur_head, "tag_hud");
-    setattachment(self.vehicle_viewport, self.vehicle_hudmodel, "");
 
     setattachment(self.gun1, self.tur_head, "tag_hardpoint01");
     setattachment(self.gun2, self.tur_head, "tag_hardpoint02");
 
-    self.tur_head.owner = self;
-    self.customizeentityforclient          = spiderbot_customizeentityforclient;
-
-    self.tur_aimpos = self.origin;
-
-    spiderbot_spawn();
-
-    self.vehicle_die = spiderbot_die;
-    self.vehicle_exit = spiderbot_exit;
+    self.gravity            = 2;
+    self.mass               = 5000;
 }
 
 void spawnfunc_vehicle_spiderbot()
 {
+    self.vehicle_flags |= VHF_DMGSHAKE;
+    //self.vehicle_flags |= VHF_DMGROLL;
+    //self.vehicle_flags |= VHF_DMGHEADROLL;
+    
     precache_model ( "models/vhshield.md3");
     precache_model ( "models/vehicles/spiderbot.dpm");
     precache_model ( "models/vehicles/spiderbot_top.dpm");
@@ -757,9 +653,31 @@ void spawnfunc_vehicle_spiderbot()
     precache_model ( "models/vehicles/spiderbot_cockpit.dpm");
     precache_model ( "models/uziflash.md3");
 
-    precache_sound ( "weapons/rocket_impact.wav" );
-
-    //self.team                = -1;
+    precache_sound ( "weapons/uzi_fire.wav" );
+    precache_sound ( "weapons/rocket_impact.wav");
+    
+    precache_sound ( "vehicles/spiderbot_die.wav");
+    precache_sound ( "vehicles/spiderbot_idle.wav");
+    precache_sound ( "vehicles/spiderbot_jump.wav");
+    precache_sound ( "vehicles/spiderbot_strafe.wav");
+    precache_sound ( "vehicles/spiderbot_walk.wav");
+    precache_sound ( "vehicles/spiderbot_land.wav");
+
+    vehicles_configcheck("vehicle_spiderbot.cfg", autocvar_g_vehicle_spiderbot_health);
+    if(autocvar_g_vehicle_spiderbot_shield)
+        self.vehicle_flags |= VHF_HASSHIELD;
+
+    if(autocvar_g_vehicle_spiderbot_shield_regen)
+        self.vehicle_flags |= VHF_SHIELDREGEN;
+
+    if(autocvar_g_vehicle_spiderbot_health_regen)
+        self.vehicle_flags |= VHF_HEALTHREGEN;
+    
     self.think = vewhicle_spiderbot_dinit;
-    self.nextthink = time + 0.5;
+    
+    if(g_assault)
+        self.nextthink = time + 0.5;
+    else
+        self.nextthink = time + (autocvar_g_vehicles_delayspawn ? autocvar_g_vehicle_spiderbot_respawntime + (random() * autocvar_g_vehicles_delayspawn_jitter) : 0.5);
 }
+#endif // SVQC
index 7cc2949f6d90413957bb270bd598b4264597bfc6..d9d77b5f5211957f539c4ee41b1057beec0980a4 100644 (file)
-void vehicle_stdproc_enter()
+float autocvar_g_vehicles_crush_dmg;
+float autocvar_g_vehicles_crush_force;
+float autocvar_g_vehicles_delayspawn;
+float autocvar_g_vehicles_delayspawn_jitter;
+float autocvar_g_vehicles_allow_flagcarry;
+
+void vehicles_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
+void vehicles_return();
+void vehicles_enter();
+void vehicles_touch();
+void vehicles_reset_colors();
+void vehicles_clearrturn();
+void vehicles_setreturn();
+
+
+/** AuxiliaryXhair*
+    Send additional points of interest to be drawn, to vehicle owner
+**/
+float MAX_AXH = 4;
+.entity AuxiliaryXhair[MAX_AXH];
+
+float SendAuxiliaryXhair(entity to, float sf)
+{
+
+       WriteByte(MSG_ENTITY, ENT_CLIENT_AUXILIARYXHAIR);
+
+       WriteByte(MSG_ENTITY, self.cnt);
+
+       WriteCoord(MSG_ENTITY, self.origin_x);
+       WriteCoord(MSG_ENTITY, self.origin_y);
+       WriteCoord(MSG_ENTITY, self.origin_z);
+
+    WriteByte(MSG_ENTITY, rint(self.colormod_x * 255));
+    WriteByte(MSG_ENTITY, rint(self.colormod_y * 255));
+    WriteByte(MSG_ENTITY, rint(self.colormod_z * 255));
+
+    return TRUE;
+}
+
+void UpdateAuxiliaryXhair(entity own, vector loc, vector clr, float axh_id)
+{
+    entity axh;
+
+    axh_id = bound(0, axh_id, MAX_AXH);
+    axh = own.AuxiliaryXhair[axh_id];
+
+    if(axh == world || wasfreed(axh))  // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?)
+    {
+        axh                     = spawn();
+        axh.cnt                 = axh_id;
+        axh.drawonlytoclient    = own;
+        axh.owner               = own;
+        Net_LinkEntity(axh, FALSE, 0, SendAuxiliaryXhair);
+    }
+
+    setorigin(axh, loc);
+    axh.colormod            = clr;
+    axh.SendFlags           = 0x01;
+    own.AuxiliaryXhair[axh_id] = axh;
+}
+
+/*
+// SVC_TEMPENTITY based, horrible with even 50 ping. hm.
+// WriteByte(MSG_ONE, SVC_TEMPENTITY) uses reliable messagess, never use for thinsg that need continous updates.
+void SendAuxiliaryXhair2(entity own, vector loc, vector clr, float axh_id)
 {
+       msg_entity = own;
+
+       WriteByte(MSG_ONE, SVC_TEMPENTITY);
+       WriteByte(MSG_ONE, TE_CSQC_AUXILIARYXHAIR);
+
+       WriteByte(MSG_ONE, axh_id);
+
+       WriteCoord(MSG_ONE, loc_x);
+       WriteCoord(MSG_ONE, loc_y);
+       WriteCoord(MSG_ONE, loc_z);
+
+    WriteByte(MSG_ONE, rint(clr_x * 255));
+    WriteByte(MSG_ONE, rint(clr_y * 255));
+    WriteByte(MSG_ONE, rint(clr_z * 255));
+
 }
+*/
+// End AuxiliaryXhair
 
-void vehicle_stdproc_exit(float eject)
+/**
+    Notifies the client that he enterd a vehicle, and sends 
+    realavent data.
+    
+    only sends vehicle_id atm (wich is a HUD_* constant, ex. HUD_SPIDERBOT)
+**/
+void CSQCVehicleSetup(entity own, float vehicle_id)
 {
+       msg_entity = own;
+
+       WriteByte(MSG_ONE, SVC_TEMPENTITY);
+       WriteByte(MSG_ONE, TE_CSQC_VEHICLESETUP);
+       WriteByte(MSG_ONE, vehicle_id);
 }
 
-void vehicle_stdproc_shiledregen(float rmax, float dt)
+/** vehicles_locktarget
+
+    Generic target locking.
+
+    Figure out if what target is "locked" (if any), for missile tracking as such.
+
+    after calling, "if(self.lock_target != world && self.lock_strength == 1)" mean
+    you have a locked in target.
+
+    Exspects a crosshair_trace() or equivalent to be
+    dont before calling.
+
+**/
+.entity lock_target;
+.float  lock_strength;
+.float  lock_time;
+.float  lock_soundtime;
+void vehicles_locktarget(float incr, float decr, float _lock_time)
 {
-    if(self.vehicle_shield < rmax)
-    if(self.dmg_time + CCVAR("_shield_regen_dmgpause") < time)
+    if(self.lock_target && self.lock_target.deadflag != DEAD_NO)
     {
-        self.vehicle_shield = min(self.vehicle_shield + CCVAR("_shield_regen") * dt, rmax);
+        self.lock_target    = world;
+        self.lock_strength  = 0;
+        self.lock_time      = 0;
+    }
 
-        if(self.owner)
-            self.owner.vehicle_shield = self.vehicle_shield / rmax;
+    if(self.lock_time > time)
+    {
+        if(self.lock_target)
+        if(self.lock_soundtime < time)
+        {
+            self.lock_soundtime = time + 0.5;
+            play2(self.owner, "vehicles/locked.wav");
+        }
+        
+        return;
     }
+
+    if(trace_ent != world)
+    {
+        if(teamplay && trace_ent.team == self.team)
+            trace_ent = world;
+
+        if(trace_ent.deadflag != DEAD_NO)
+            trace_ent = world;
+
+        if not (trace_ent.vehicle_flags & VHF_ISVEHICLE || trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET)
+            trace_ent = world;
+    }
+
+    if(self.lock_target == world && trace_ent != world)
+        self.lock_target = trace_ent;
+    
+    if(self.lock_target && trace_ent == self.lock_target) 
+    {            
+        if(self.lock_strength != 1 && self.lock_strength + incr >= 1)
+        {
+            play2(self.owner, "vehicles/lock.wav");
+            self.lock_soundtime = time + 0.8;
+        }        
+        else if (self.lock_strength != 1 && self.lock_soundtime < time)
+        {            
+            play2(self.owner, "vehicles/locking.wav");
+            self.lock_soundtime = time + 0.3;
+        }
+        
+    }    
+        
+    // Have a locking target
+    // Trace hit current target
+    if(trace_ent == self.lock_target && trace_ent != world)
+    {
+        self.lock_strength = min(self.lock_strength + incr, 1);
+        if(self.lock_strength == 1)
+            self.lock_time = time + _lock_time;
+    }
+    else
+    {
+        if(trace_ent)
+            self.lock_strength = max(self.lock_strength - decr * 2, 0);
+        else
+            self.lock_strength = max(self.lock_strength - decr, 0);
+
+        if(self.lock_strength == 0)
+            self.lock_target = world;
+    }
+}
+
+#define VEHICLE_UPDATE_PLAYER(fld,vhname) \
+self.owner.vehicle_##fld = (self.vehicle_##fld / autocvar_g_vehicle_##vhname##_##fld) * 100
+
+#define vehicles_sweap_collision(orig,vel,dt,acm,mult) \
+traceline(orig, orig + vel * dt, MOVE_NORMAL, self); \
+if(trace_fraction != 1) \
+    acm += normalize(self.origin - trace_endpos) * (vlen(vel) * mult)
+
+// Hover movement support
+float  force_fromtag_power;
+float  force_fromtag_normpower;
+vector force_fromtag_origin;
+vector vehicles_force_fromtag_hover(string tag_name, float spring_length, float max_power)
+{
+    force_fromtag_origin = gettaginfo(self, gettagindex(self, tag_name));
+    v_forward  = normalize(v_forward) * -1;
+    traceline(force_fromtag_origin, force_fromtag_origin - (v_forward  * spring_length), MOVE_NORMAL, self);
+
+    force_fromtag_power = (1 - trace_fraction) * max_power;
+    force_fromtag_normpower = force_fromtag_power / max_power;
+
+    return v_forward  * force_fromtag_power;
 }
 
-void vehicle_stdproc_healthregen(float rmax, float dt)
+// Experimental hovermode wich uses attraction/repulstion from surface insted of gravity/repulsion
+// Can possibly be use to move abt any surface (inclusing walls/celings)
+vector vehicles_force_fromtag_maglev(string tag_name, float spring_length, float max_power)
 {
 
-    if(self.dmg_time + CCVAR("_health_regen_dmgpause") < time)
-    if(self.vehicle_health < rmax)
+    force_fromtag_origin = gettaginfo(self, gettagindex(self, tag_name));
+    v_forward  = normalize(v_forward) * -1;
+    traceline(force_fromtag_origin, force_fromtag_origin - (v_forward  * spring_length), MOVE_NORMAL, self);
+
+    // TODO - this may NOT be compatible with wall/celing movement, unhardcode 0.25 (engine count multiplier)
+    if(trace_fraction == 1.0)
     {
-        self.vehicle_health = min(self.vehicle_health + CCVAR("_health_regen") * dt, rmax);
+        force_fromtag_normpower = -0.25;
+        return '0 0 -200';
+    }
 
-        if(self.owner)
-            self.owner.vehicle_health = self.vehicle_health / rmax;
+    force_fromtag_power = ((1 - trace_fraction) - trace_fraction) * max_power;
+    force_fromtag_normpower = force_fromtag_power / max_power;
+
+    return v_forward  * force_fromtag_power;
+}
+
+// Generic vehile projectile system
+void vehicles_projectile_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+    // Ignore damage from oterh projectiles from my owner (dont mess up volly's)
+    if(inflictor.owner == self.owner)
+        return; 
+    
+    self.health -= damage;
+    self.velocity += force;
+    if(self.health < 1)
+    {
+        self.takedamage = DAMAGE_NO;
+        self.event_damage = SUB_Null;
+        self.think = self.use;
+        self.nextthink = time;
     }
+
+}
+
+void vehicles_projectile_explode()
+{
+    if(self.owner && other != world)
+    {
+        if(other == self.owner.vehicle)
+            return;
+
+        if(other == self.owner.vehicle.tur_head)
+            return;
+    }
+
+       PROJECTILE_TOUCH;
+
+       self.event_damage = SUB_Null;
+    RadiusDamage (self, self.realowner, self.shot_dmg, 0, self.shot_radius, self, self.shot_force, self.totalfrags, other);
+
+    remove (self);
+}
+
+entity vehicles_projectile(string _mzlfx, string _mzlsound,
+                           vector _org, vector _vel,
+                           float _dmg, float _radi, float _force,  float _size,
+                           float _deahtype, float _projtype, float _health,
+                           float _cull, float _clianim)
+{
+    entity proj;
+
+    proj = spawn();
+
+    PROJECTILE_MAKETRIGGER(proj);
+    setorigin(proj, _org);
+
+    proj.shot_dmg         = _dmg;
+    proj.shot_radius      = _radi;
+    proj.shot_force       = _force;
+    proj.totalfrags       = _deahtype;
+    proj.solid            = SOLID_BBOX;
+    proj.movetype         = MOVETYPE_FLYMISSILE;
+    proj.flags            = FL_PROJECTILE;
+    proj.bot_dodge        = TRUE;
+    proj.bot_dodgerating  = _dmg;
+    proj.velocity         = _vel;
+    proj.touch            = vehicles_projectile_explode;
+    proj.use              = vehicles_projectile_explode;
+    proj.owner            = self;
+    proj.realowner        = self.owner;
+    proj.think            = SUB_Remove;
+    proj.nextthink        = time + 30;
+
+    if(_health)
+    {
+        proj.takedamage       = DAMAGE_AIM;
+        proj.event_damage     = vehicles_projectile_damage;
+        proj.health           = _health;
+    }
+    else
+        proj.flags           = FL_PROJECTILE | FL_NOTARGET;
+
+    if(_mzlsound)
+        sound (self, CH_WEAPON_A, _mzlsound, VOL_BASE, ATTN_NORM);
+
+    if(_mzlfx)
+        pointparticles(particleeffectnum(_mzlfx), proj.origin, proj.velocity, 1);
+
+
+    setsize (proj, '-1 -1 -1' * _size, '1 1 1' * _size);
+
+    CSQCProjectile(proj, _clianim, _projtype, _cull);
+
+    return proj;
+}
+// End generic vehile projectile system
+
+/** vehicles_spawn
+    Exetuted for all vehicles on (re)spawn.
+    Sets defaults for newly spawned units.
+**/
+void vehicles_spawn()
+{
+    dprint("Spawning vehicle: ", self.netname, "\n");
+
+    // De-own & reset
+    self.vehicle_hudmodel.viewmodelforclient = self;
+
+    self.owner              = world;
+    self.touch              = vehicles_touch;
+    self.event_damage       = vehicles_damage;
+    self.iscreature         = TRUE;
+    self.movetype           = MOVETYPE_WALK;
+    self.solid              = SOLID_SLIDEBOX;
+    self.takedamage         = DAMAGE_AIM;
+       self.deadflag           = DEAD_NO;
+    self.bot_attack         = TRUE;
+    self.flags              = FL_NOTARGET;
+    self.avelocity          = '0 0 0';
+    self.velocity           = '0 0 0';
+
+    // Reset locking
+    self.lock_strength      = 0;
+    self.lock_target        = world;
+    self.misc_bulletcounter = 0;
+
+    // Return to spawn
+    self.angles             = self.pos2;
+    setorigin(self, self.pos1 + '0 0 128');
+    // Show it
+    pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
+
+    vehicles_reset_colors();
+    self.vehicle_spawn();
 }
 
-void vehicle_stdproc_energyregen(float rmax, float dt)
+// Better way of determening whats crushable needed! (fl_crushable?)
+float vehicles_crushable(entity e)
 {
-    if(self.vehicle_energy < rmax)
+    if(e.classname == "player")
+        return TRUE;
+
+    if(e.classname == "monster_zombie")
+        return TRUE;
+
+    return FALSE;
+}
+
+void vehicles_touch()
+{
+    // Vehicle currently in use
+    if(self.owner)
     {
-        self.vehicle_energy = min(self.vehicle_energy + CCVAR("_energy_regen") * dt, rmax);
+        // Colided with world?
+        if(other == world)
+        {
+        }
+        else
+        {
+            if(other.vehicle_flags & VHF_ISVEHICLE)
+            {
+                //other.velocity += self.velocity * (self.mass / other.mass);
+            }
+            else if(vehicles_crushable(other))
+            {
+                if(vlen(self.velocity) != 0)
+                    Damage(other, self, self.owner, autocvar_g_vehicles_crush_dmg, DEATH_VHCRUSH, '0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicles_crush_force);
+            }
+        }
+        return;
+    }
+
+    if(other.classname != "player")
+        return;
+
+    if(other.deadflag != DEAD_NO)
+        return;
+
+    if(other.vehicle != world)
+        return;
+
+    // Remove this when bots know how to use vehicles.
+    if (clienttype(other) != CLIENTTYPE_REAL)
+        return;
+
+    vehicles_enter();
+}
+
+void vehicles_enter()
+{
+   // Remove this when bots know how to use vehicles
+    if (clienttype(other) != CLIENTTYPE_REAL)
+        return;
+
+    if(self.phase > time)
+        return;
+
+    if(teamplay)
+    if(self.team)
+    if(self.team != other.team)
+        return;
+
+    self.vehicle_ammo1   = 0;
+    self.vehicle_ammo2   = 0;
+    self.vehicle_reload1 = 0;
+    self.vehicle_reload2 = 0;
+    self.vehicle_energy  = 0;
+
+    self.owner          = other;
+    self.switchweapon   = other.switchweapon;
+
+    // .viewmodelforclient works better.
+    //self.vehicle_hudmodel.drawonlytoclient = self.owner;
+
+    self.vehicle_hudmodel.viewmodelforclient = self.owner;
+
+    self.event_damage         = vehicles_damage;
+    self.nextthink            = 0;
+    self.owner.angles         = self.angles;
+    self.owner.takedamage     = DAMAGE_NO;
+    self.owner.solid          = SOLID_NOT;
+    self.owner.movetype       = MOVETYPE_NOCLIP;
+    self.owner.alpha          = -1;
+    self.owner.vehicle        = self;
+    self.owner.event_damage   = SUB_Null;
+    self.owner.view_ofs       = '0 0 0';
+    self.colormap             = self.owner.colormap;
+    if(self.tur_head)
+        self.tur_head.colormap    = self.owner.colormap;
+
+    self.owner.hud            = self.hud;
+    self.owner.PlayerPhysplug = self.PlayerPhysplug;
+
+    self.owner.vehicle_ammo1    = self.vehicle_ammo1;
+    self.owner.vehicle_ammo2    = self.vehicle_ammo2;
+    self.owner.vehicle_reload1  = self.vehicle_reload1;
+    self.owner.vehicle_reload2  = self.vehicle_reload2;
+
+    // Cant do this, hides attached objects too.
+    //self.exteriormodeltoclient = self.owner;
+    //self.tur_head.exteriormodeltoclient = self.owner;
+
+    other.flags &~= FL_ONGROUND;
+    self.flags  &~= FL_ONGROUND;
+
+    self.team                 = self.owner.team;
+    self.flags               -= FL_NOTARGET;
+
+    msg_entity = other;
+    WriteByte (MSG_ONE, SVC_SETVIEWPORT);
+    WriteEntity(MSG_ONE, self.vehicle_viewport);
+
+    WriteByte (MSG_ONE, SVC_SETVIEWANGLES);
+    if(self.tur_head)
+    {
+        WriteAngle(MSG_ONE, self.tur_head.angles_x + self.angles_x); // tilt
+        WriteAngle(MSG_ONE, self.tur_head.angles_y + self.angles_y); // yaw
+        WriteAngle(MSG_ONE, 0);                                      // roll
+    }
+    else
+    {
+        WriteAngle(MSG_ONE,  self.angles_x * -1); // tilt
+        WriteAngle(MSG_ONE,  self.angles_y);      // yaw
+        WriteAngle(MSG_ONE,  0);                  // roll
+    }
+
+    vehicles_clearrturn();
+
+    CSQCVehicleSetup(self.owner, self.hud);
+    
+    if(other.flagcarried)
+    {
+        if(!autocvar_g_vehicles_allow_flagcarry)
+            DropFlag(other.flagcarried, world, world);
+        else
+        {            
+            other.flagcarried.scale = 1;
+            setattachment(other.flagcarried, self, ""); 
+            setorigin(other, '0 0 96');
+        }
+    }
+    
+    self.vehicle_enter();
+}
+
+/** vehicles_findgoodexit
+    Locates a valid location for the player to exit the vehicle.
+    Will first try prefer_spot, then up 100 random spots arround the vehicle
+    wich are in direct line of sight and empty enougth to hold a players bbox
+**/
+vector vehicles_findgoodexit(vector prefer_spot)
+{
+    //vector exitspot;
+    float mysize;
+    
+    tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, prefer_spot, MOVE_NORMAL, self.owner);
+    if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+        return prefer_spot;
+    
+    mysize = vlen(self.maxs - self.mins);
+    float i;
+    vector v, v2;
+    v2 = 0.5 * (self.absmin + self.absmax);
+    for(i = 0; i < 100; ++i)
+    {        
+        v = randomvec();
+        v_z = 0;
+        v = v2 + normalize(v) * mysize;
+        tracebox(v2, PL_MIN, PL_MAX, v, MOVE_NORMAL, self.owner);
+        if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+            return v;
+    }
+    
+    /*
+    exitspot = (self.origin + '0 0 48') + v_forward * mysize;
+    tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+    if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+        return exitspot;
+    
+    exitspot = (self.origin + '0 0 48') - v_forward * mysize;
+    tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+    if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+        return exitspot;
+
+    exitspot = (self.origin + '0 0 48') + v_right * mysize;
+    tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+    if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+        return exitspot;
+    
+    exitspot = (self.origin + '0 0 48') - v_right * mysize;
+    tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+    if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+        return exitspot;
+    */
+    
+    return self.origin;
+}
+
+/** vehicles_exit
+    Standarrd vehicle release fucntion.
+    custom code goes in self.vehicle_exit
+**/
+void vehicles_exit(float eject)
+{      
+    entity oldself;
+    if(self.flags & FL_CLIENT)
+    {
+        oldself = self;
+        self = self.vehicle;
+    }
+    
+       self.flags |= FL_NOTARGET;
+
+    if (self.owner)
+    {
+        msg_entity = self.owner;
+        WriteByte (MSG_ONE, SVC_SETVIEWPORT);
+        WriteEntity( MSG_ONE, self.owner);
+
+        WriteByte (MSG_ONE, SVC_SETVIEWANGLES);
+        WriteAngle(MSG_ONE, 0);                 // pich
+        WriteAngle(MSG_ONE, self.angles_y);     // yaw
+        WriteAngle(MSG_ONE, 0);                 // roll
+
+        setsize(self.owner, PL_MIN,PL_MAX);
+
+        self.owner.takedamage     = DAMAGE_AIM;
+        self.owner.solid          = SOLID_SLIDEBOX;
+        self.owner.movetype       = MOVETYPE_WALK;
+        self.owner.effects        &~= EF_NODRAW;
+        self.owner.alpha          = 1;
+        self.owner.PlayerPhysplug = SUB_Null;
+        self.owner.vehicle        = world;
+        self.owner.view_ofs       = PL_VIEW_OFS;
+        self.owner.event_damage   = PlayerDamage;
+        self.owner.hud            = HUD_NORMAL;
+        self.owner.switchweapon   = self.switchweapon;
+        //self.owner.BUTTON_USE     = 0;
+    }
+
+    if(self.deadflag == DEAD_NO)
+        self.avelocity          = '0 0 0';
+
+    self.vehicle_hudmodel.viewmodelforclient = self;
+       self.tur_head.nodrawtoclient             = world;
+    vehicles_setreturn();
+
+    self.phase = time + 1;
+
+    if(!teamplay)
+        self.team = 0;
+    else
+        self.team = self.tur_head.team;
+    
+    if(self.owner.flagcarried)
+    {
+        self.owner.flagcarried.scale = 0.6;
+        setattachment(self.owner.flagcarried, self.owner, ""); 
+        setorigin(self.owner.flagcarried, FLAG_CARRY_POS);
+    }
+    
+    sound (self, CH_TRIGGER_SINGLE, "misc/null.wav", 1, ATTN_NORM);
+    self.vehicle_exit(eject);
+    self.owner = world;
+    vehicles_reset_colors();
+    
+    if(oldself)
+        self = oldself;
+}
+
+
+void vehicles_regen(.float timer, .float regen_field, float field_max, float rpause, float regen, float delta_time)
+{
+    if(self.regen_field < field_max)
+    if(self.timer + rpause < time)
+    {
+        self.regen_field = min(self.regen_field + regen * delta_time, field_max);
 
         if(self.owner)
-            self.owner.vehicle_energy = self.vehicle_energy / rmax;
+            self.owner.regen_field = (self.regen_field / field_max) * 100;
     }
 }
 
 void shieldhit_think()
 {
-    self.alpha = self.alpha - 0.2;
+    self.alpha -= 0.1;
     if (self.alpha <= 0)
     {
-        setmodel(self,"");
+        //setmodel(self, "");
         self.alpha = -1;
     }
     else
@@ -56,65 +664,364 @@ void shieldhit_think()
     }
 }
 
-void vehicle_stdproc_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+void vehicles_painframe()
 {
+//.float       pain_finished;                  //Added by Supajoe
+    
+    if(self.owner.vehicle_health <= 50)
+    if(self.pain_frame < time)
+    {  
+        float _ftmp;  
+        _ftmp = self.owner.vehicle_health / 50;
+        self.pain_frame = time + 0.1 + (random() * 0.5 * _ftmp);
+        pointparticles(particleeffectnum("smoke_small"), (self.origin + (randomvec() * 80)), '0 0 0', 1);
+        
+        if(self.vehicle_flags & VHF_DMGSHAKE)
+            self.velocity += randomvec() * 30;
+        
+        if(self.vehicle_flags & VHF_DMGROLL)
+            if(self.vehicle_flags & VHF_DMGHEADROLL)
+                self.tur_head.angles += randomvec();
+            else
+                self.angles += randomvec();
+        
+    }    
+}
 
-    float ddmg_take;
-
+void vehicles_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
     self.dmg_time = time;
 
     if((self.vehicle_flags & VHF_HASSHIELD) && (self.vehicle_shield > 0))
     {
-
-        
-        if (wasfreed(self.tur_head.enemy) || self.tur_head.enemy == world)
+        if (wasfreed(self.vehicle_shieldent) || self.vehicle_shieldent == world)
         {
-            self.tur_head.enemy = spawn();
-            self.tur_head.enemy.effects = EF_LOWPRECISION;
-        }
+            self.vehicle_shieldent = spawn();
+            self.vehicle_shieldent.effects = EF_LOWPRECISION;
 
-        setmodel(self.tur_head.enemy, "models/vhshield.md3");
-        setattachment(self.tur_head.enemy, self, "");
+            setmodel(self.vehicle_shieldent, "models/vhshield.md3");
+            setattachment(self.vehicle_shieldent, self, "");
+            setorigin(self.vehicle_shieldent, real_origin(self) - self.origin);
+            self.vehicle_shieldent.scale       = 256 / vlen(self.maxs - self.mins);
+            self.vehicle_shieldent.think       = shieldhit_think;
+        }
 
-        self.tur_head.enemy.colormod = '1 1 1';
-        self.tur_head.enemy.alpha = 0.45;
-        self.tur_head.enemy.scale  = (256 / vlen(self.maxs - self.mins));
-        self.tur_head.enemy.angles = vectoangles(normalize(hitloc - self.origin)) - self.angles;
-        self.tur_head.enemy.think = shieldhit_think;
-        self.tur_head.enemy.nextthink = time;
+        self.vehicle_shieldent.colormod    = '1 1 1';
+        self.vehicle_shieldent.alpha       = 0.45;
+        self.vehicle_shieldent.angles      = vectoangles(normalize(hitloc - (self.origin + self.vehicle_shieldent.origin))) - self.angles;
+        self.vehicle_shieldent.nextthink   = time;
 
         self.vehicle_shield -= damage;
+
         if(self.vehicle_shield < 0)
         {
-            self.tur_head.enemy.colormod = '10 0 -1';
-            ddmg_take = fabs(self.vehicle_shield);
-            self.vehicle_shield = 0;
-            self.tur_head.enemy.alpha = 0.75;
-            self.vehicle_health -= ddmg_take;
+            self.vehicle_health            -= fabs(self.vehicle_shield);
+            self.vehicle_shieldent.colormod = '2 0 0';
+            self.vehicle_shield             = 0;
+            self.vehicle_shieldent.alpha    = 0.75;
+            
+               if(sound_allowed(MSG_BROADCAST, attacker))
+                spamsound (self, CH_PAIN, "onslaught/ons_hit2.wav", VOL_BASE, ATTN_NORM);   // FIXME: PLACEHOLDER
         }
+        else
+               if(sound_allowed(MSG_BROADCAST, attacker))
+                spamsound (self, CH_PAIN, "onslaught/electricity_explode.wav", VOL_BASE, ATTN_NORM);  // FIXME: PLACEHOLDER
+
     }
     else
-        self.vehicle_health -= damage;
-
-    if(self.owner)
     {
-        self.owner.vehicle_health = self.vehicle_health / CCVAR("_health");
-
-        if(self.vehicle_flags & VHF_HASSHIELD)
-            self.owner.vehicle_shield = self.vehicle_shield / cvar(strcat(self.cvar_basename,"_shield"));
+        self.vehicle_health -= damage;
 
+        if(sound_allowed(MSG_BROADCAST, attacker))
+            spamsound (self, CH_PAIN, "onslaught/ons_hit2.wav", VOL_BASE, ATTN_NORM);  // FIXME: PLACEHOLDER
     }
 
+    self.velocity += force; // * (vlen(force) / self.mass);
+
     if(self.vehicle_health <= 0)
     {
         if(self.owner)
             if(self.vehicle_flags & VHF_DEATHEJECT)
-                self.vehicle_exit(VHEF_EJECT);
+                vehicles_exit(VHEF_EJECT);
+            else
+                vehicles_exit(VHEF_RELESE);
 
         self.vehicle_die();
+        vehicles_setreturn();
+    }
+}
+
+void vehicles_clearrturn()
+{
+    entity ret;
+    // Remove "return helper", if any.
+    ret = findchain(classname, "vehicle_return");
+    while(ret)
+    {
+        if(ret.enemy == self)
+        {
+            ret.classname   = "";
+            ret.think       = SUB_Remove;
+            ret.nextthink   = time + 0.1;            
+            
+            if(ret.waypointsprite_attached)
+                WaypointSprite_Kill(ret.waypointsprite_attached);
+            
+            return;
+        }
+        ret = ret.chain;
+    }
+}
+
+void vehicles_return()
+{
+    pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1);
+
+    self.enemy.think     = vehicles_spawn;
+    self.enemy.nextthink = time;
+
+    if(self.waypointsprite_attached)
+        WaypointSprite_Kill(self.waypointsprite_attached);
+            
+    remove(self);
+}
+
+void vehicles_showwp_goaway()
+{
+    if(self.waypointsprite_attached)
+        WaypointSprite_Kill(self.waypointsprite_attached);
+            
+    remove(self);
+    
+}
+
+void vehicles_showwp()
+{
+    entity oldself;
+    vector rgb;
+    
+    if(self.cnt)
+    {        
+        self.think      = vehicles_return;
+        self.nextthink  = self.cnt;
+    }    
+    else
+    {
+        self.think      = vehicles_return;
+        self.nextthink  = time +1;
+        
+        oldself = self;
+        self = spawn();
+        setmodel(self, "null");
+        self.team = oldself.enemy.team;
+        self.enemy = oldself.enemy;
+        setorigin(self, oldself.enemy.pos1);
+        
+        self.nextthink = time + 5;
+        self.think = vehicles_showwp_goaway;
+    }
+    
+    if(teamplay && self.team)
+           rgb = TeamColor(self.team);
+    else
+           rgb = '1 1 1';
+    WaypointSprite_Spawn("vehicle", 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, TRUE, RADARICON_POWERUP, rgb);
+    if(self.waypointsprite_attached)
+    {        
+        WaypointSprite_UpdateRule(self.waypointsprite_attached, self.enemy.team, SPRITERULE_DEFAULT);        
+        if(oldself == world)
+            WaypointSprite_UpdateBuildFinished(self.waypointsprite_attached, self.nextthink);        
+        WaypointSprite_Ping(self.waypointsprite_attached);
+    }    
+    
+    if(oldself != world)
+        self = oldself;
+}
+
+void vehicles_setreturn()
+{
+    entity ret;
+    
+    vehicles_clearrturn();
+
+    ret = spawn();
+    ret.classname   = "vehicle_return";
+    ret.enemy       = self;    
+    ret.team        = self.team;
+    ret.think       = vehicles_showwp;
+    
+    if(self.deadflag != DEAD_NO)
+    {
+        ret.cnt         = time + self.vehicle_respawntime;
+        ret.nextthink   = min(time + self.vehicle_respawntime, time + self.vehicle_respawntime - 5);        
+    }        
+    else
+    {
+        ret.nextthink   = min(time + self.vehicle_respawntime, time + self.vehicle_respawntime - 1);        
+    }
+    
+    setmodel(ret, "null");
+    setorigin(ret, self.pos1 + '0 0 96');
+       
+}
+
+void vehicles_configcheck(string  configname, float check_cvar)
+{
+    if(check_cvar == 0)
+        localcmd(strcat("exec ", configname, "\n"));
+}
+
+void vehicles_reset_colors()
+{
+    entity e;
+    float _effects, _colormap;
+    vector _glowmod, _colormod;
+
+    if(autocvar_g_nodepthtestplayers)
+        _effects = EF_NODEPTHTEST;
+
+    if(autocvar_g_fullbrightplayers)
+        _effects |= EF_FULLBRIGHT;
+
+    if(self.team)
+        _colormap = 1024 + (self.team - 1) * 17;
+    else
+        _colormap = 1024;
+
+    _glowmod  = '0 0 0';
+    _colormod = '0 0 0';
+
+    // Find all ents attacked to main model and setup effects, colormod etc.
+    e = findchainentity(tag_entity, self);
+    while(e)
+    {
+        if(e != self.vehicle_shieldent)
+        {
+            e.effects   = _effects; //  | EF_LOWPRECISION;
+            e.colormod  = _colormod;
+            e.colormap  = _colormap;
+            e.alpha     = 1;
+        }
+        e = e.chain;
     }
 
+    self.vehicle_hudmodel.effects  = self.effects  = _effects; // | EF_LOWPRECISION;
+    self.vehicle_hudmodel.colormod = self.colormod = _colormod;
+    self.vehicle_hudmodel.colormap = self.colormap = _colormap;
+    self.vehicle_viewport.effects = (EF_ADDITIVE | EF_DOUBLESIDED | EF_FULLBRIGHT | EF_NODEPTHTEST | EF_NOGUNBOB | EF_NOSHADOW | EF_LOWPRECISION | EF_SELECTABLE | EF_TELEPORT_BIT);
+
+    self.alpha     = 1;
+    self.avelocity = '0 0 0';
+    self.velocity  = '0 0 0';
+    self.effects   = _effects;
+}
+
+float vehicle_initialize(string  net_name,
+                         string  bodymodel,
+                         string  topmodel,
+                         string  hudmodel,
+                         string  toptag,
+                         string  hudtag,
+                         string  viewtag,
+                         float   vhud,
+                         vector  min_s,
+                         vector  max_s,
+                         float   nodrop,
+                         void()  spawnproc,
+                         float   _respawntime,
+                         float() physproc,
+                         void()  enterproc,
+                         void(float extflag) exitfunc,
+                         void() dieproc,
+                         void() thinkproc,
+                         float  use_csqc)
+{
+    addstat(STAT_HUD, AS_INT,  hud);
+       addstat(STAT_VEHICLESTAT_HEALTH,  AS_INT, vehicle_health);
+       addstat(STAT_VEHICLESTAT_SHIELD,  AS_INT, vehicle_shield);
+       addstat(STAT_VEHICLESTAT_ENERGY,  AS_INT, vehicle_energy);
+
+       addstat(STAT_VEHICLESTAT_AMMO1,   AS_INT,   vehicle_ammo1);
+       addstat(STAT_VEHICLESTAT_RELOAD1, AS_INT, vehicle_reload1);
+
+       addstat(STAT_VEHICLESTAT_AMMO2,   AS_INT,   vehicle_ammo2);
+       addstat(STAT_VEHICLESTAT_RELOAD2, AS_INT, vehicle_reload2);
+
+    if(bodymodel == "")
+        error("vehicles: missing bodymodel!");
+
+    if(hudmodel == "")
+        error("vehicles: missing hudmodel!");
+
+    if(net_name == "")
+        self.netname = self.classname;
+    else
+        self.netname = net_name;
+
+    if(self.team && !teamplay)
+        self.team = 0;
+        
+    self.vehicle_flags |= VHF_ISVEHICLE;
+    
+    setmodel(self, bodymodel);
+
+    self.vehicle_viewport   = spawn();
+    self.vehicle_hudmodel   = spawn();
+    self.tur_head           = spawn();
+    self.tur_head.owner     = self;
+    self.takedamage         = DAMAGE_AIM;
+    self.bot_attack         = TRUE;
+    self.iscreature         = TRUE;
+    self.hud                = vhud;
+
+    self.vehicle_die         = dieproc;
+    self.vehicle_exit        = exitfunc;
+    self.vehicle_enter       = enterproc;
+    self.PlayerPhysplug      = physproc;
+    self.event_damage        = vehicles_damage;
+    self.touch               = vehicles_touch;
+    self.think               = vehicles_spawn;    
+    self.nextthink           = time;        
+    self.vehicle_respawntime = _respawntime;
+    self.vehicle_spawn       = spawnproc;
+
+    if(autocvar_g_nodepthtestplayers)
+        self.effects = self.effects | EF_NODEPTHTEST;
+
+    if(autocvar_g_fullbrightplayers)
+        self.effects = self.effects | EF_FULLBRIGHT;
+
+    setmodel(self.vehicle_hudmodel, hudmodel);
+    setmodel(self.vehicle_viewport, "null");
+
+
+    if(topmodel != "")
+    {
+        setmodel(self.tur_head, topmodel);
+        setattachment(self.tur_head, self, toptag);
+        setattachment(self.vehicle_hudmodel, self.tur_head, hudtag);
+        setattachment(self.vehicle_viewport, self.vehicle_hudmodel, viewtag);
+    }
+    else
+    {
+        setattachment(self.tur_head, self, "");
+        setattachment(self.vehicle_hudmodel, self, hudtag);
+        setattachment(self.vehicle_viewport, self.vehicle_hudmodel, viewtag);
+    }
+
+    setsize(self, min_s, max_s);
+    if not (nodrop)
+    {
+        setorigin(self, self.origin);
+        tracebox(self.origin + '0 0 100', min_s, max_s, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
+        setorigin(self, trace_endpos);
+    }
 
+    self.pos1 = self.origin;
+    self.pos2 = self.angles;
+    self.tur_head.team = self.team;
+    
+    return TRUE;
 }
 
 void bugmenot()
@@ -123,5 +1030,5 @@ void bugmenot()
     self.vehicle_enter      = self.vehicle_exit;
     self.vehicle_die        = self.vehicle_exit;
     self.vehicle_spawn      = self.vehicle_exit;
-    //self.vehicle_message    = self.vehicle_exit;
+    self.AuxiliaryXhair     = self.AuxiliaryXhair;
 }
index 8e452478e29ae2d344f1dd507efda99fc7d47322..79fc9cbf9a9ddd9c5d86213d550dab00bf48007d 100644 (file)
@@ -1,61 +1,8 @@
-//#define VEHICLES_ENABLED
 #ifdef VEHICLES_ENABLED
-
-#message "with tZork vehicles (experimental)"
-
-float SVC_SETVIEWPORT = 5;    // Net.Protocol 0x05
-float SVC_SETVIEWANGLES = 10; // Net.Protocol 0x0A
-float SVC_UPDATEENTITY = 128; // Net.Protocol 0x80
-
-#define CCVAR(part) cvar(strcat(self.cvar_basename,part))
-//.string cvar_basename;
-
-.float vehicle_flags;
-#define VHF_HASSHIELD   2
-#define VHF_SHIELDREGEN 4
-#define VHF_HEALTHREGEN 8
-#define VHF_DEATHEJECT  16
-#define VHF_ENERGYREGEN 32
-
-.float hud;
-
-.entity gun1;
-.entity gun2;
-
-.entity shield;
-
-.float vehicle_health;
-.float vehicle_shield;
-.float vehicle_energy;
-
-.float vehicle_ammo1;
-.float vehicle_reload1;
-
-.float vehicle_ammo2;
-.float vehicle_reload2;
-
-.entity vehicle;
-.entity vehicle_viewport;
-.entity vehicle_hudmodel;
-
-//.float anim_start;
-//.float anim_end;
-
-.float dmg_time;
-
-#define VHEF_NORMAL 0
-#define VHEF_EJECT 1
-
-var .void(float exit_flags) vehicle_exit;
-var .void() vehicle_enter;
-var .void() vehicle_die;
-var .void() vehicle_spawn;
-//var .float(float message) vehicle_message;
-
 #include "vehicles.qc"
 
-#include "spiderbot.qc"
 #include "racer.qc"
+#include "spiderbot.qc"
 #include "raptor.qc"
-
+//#include "bumblebee.qc"
 #endif
diff --git a/qcsrc/server/vehicles/vehicles_def.qh b/qcsrc/server/vehicles/vehicles_def.qh
new file mode 100644 (file)
index 0000000..dcb1854
--- /dev/null
@@ -0,0 +1,65 @@
+// #define VEHICLES_USE_ODE
+#define VEHICLES_ENABLED
+#ifdef VEHICLES_ENABLED
+
+//#message "with tZork vehicles (experimental)"
+
+.float vehicle_flags;
+float VHF_ISVEHICLE     = 2;    /// Indicates vehicle
+float VHF_HASSHIELD     = 4;    /// Vehicle has shileding
+float VHF_SHIELDREGEN   = 8;    /// Vehicles shield regenerates
+float VHF_HEALTHREGEN   = 16;   /// Vehicles health regenerates
+float VHF_ENERGYREGEN   = 32;   /// Vehicles energy regenerates
+float VHF_DEATHEJECT    = 64;   /// Vehicle ejects pilot upon fatal damage
+float VHF_MOVE_GROUND   = 128;  /// Vehicle moves on gound
+float VHF_MOVE_HOVER    = 256;  /// Vehicle hover close to gound
+float VHF_MOVE_FLY      = 512;  /// Vehicle is airborn
+float VHF_DMGSHAKE      = 1024;
+float VHF_DMGROLL       = 2048;
+float VHF_DMGHEADROLL   = 4096;
+
+.entity gun1;
+.entity gun2;
+
+.float vehicle_health;      /// If self is player this is 0..100 indicating precentage of health left on vehicle. If self is vehile, this is the real health value.
+.float vehicle_energy;      /// If self is player this is 0..100 indicating precentage of energy left on vehicle. If self is vehile, this is the real energy value.
+.float vehicle_shield;      /// If self is player this is 0..100 indicating precentage of shield left on vehicle. If self is vehile, this is the real shield value.
+.entity vehicle_shieldent;  /// Entity to disply the shild effect on damage
+
+.float vehicle_ammo1;   /// If self is player this field's use depends on the individual vehile. If self is vehile, this is the real ammo1 value.
+.float vehicle_reload1; /// If self is player this field's use depends on the individual vehile. If self is vehile, this is the real reload1 value.
+.float vehicle_ammo2;   /// If self is player this field's use depends on the individual vehile. If self is vehile, this is the real ammo2 value.
+.float vehicle_reload2; /// If self is player this field's use depends on the individual vehile. If self is vehile, this is the real reload2 value.
+
+.entity vehicle;
+.entity vehicle_viewport;
+.entity vehicle_hudmodel;
+
+.float sound_nexttime;
+#define VOL_VEHICLEENGINE 1
+
+.float hud;
+.float dmg_time;
+.float  vehicle_respawntime;
+.void() vehicle_spawn;
+
+void vehicles_exit(float eject);
+var .void(float exit_flags) vehicle_exit;
+float VHEF_NORMAL = 0;  /// User pressed exit key
+float VHEF_EJECT  = 1;  /// User pressed exit key 3 times fast (not implemented) or vehile is dying
+float VHEF_RELESE = 2;  /// Release ownership, client possibly allready dissconnected / went spec / changed team / used "kill" (not implemented)
+
+float SVC_SETVIEWPORT   = 5;   // Net.Protocol 0x05
+float SVC_SETVIEWANGLES = 10;  // Net.Protocol 0x0A
+float SVC_UPDATEENTITY  = 128; // Net.Protocol 0x80
+
+var .void() vehicle_enter;  /// Vehicles custom funciton to be executed when owner exit it
+var .void() vehicle_die;    /// Vehicles custom function to be executed when vehile die
+var .void() vehicle_spawn;  /// Vehicles custom fucntion to be efecuted when vehicle (re)spawns
+
+#ifdef VEHICLES_USE_ODE
+void(entity e, float physics_enabled) physics_enable = #540; // enable or disable physics on object
+void(entity e, vector force, vector force_pos) physics_addforce = #541; // apply a force from certain origin, length of force vector is power of force
+void(entity e, vector torque) physics_addtorque = #542; // add relative torque
+#endif  // VEHICLES_USE_ODE
+#endif  // VEHICLES_ENABLED
index fbc8032bb1cd6fa3f846d9b37a7c5c84916cd719..55570c6f2bcc806a7dcafd2a10b1848db4a5679d 100644 (file)
@@ -116,18 +116,6 @@ float RemapVote(string vote, string cmd, entity e)
        return TRUE;
 }
 
-void VoteDialog_UpdateHighlight(float selected) {
-       WriteByte(MSG_ONE, SVC_TEMPENTITY);
-       WriteByte(MSG_ONE, TE_CSQC_VOTE);
-       WriteByte(MSG_ONE, 1);
-       WriteByte(MSG_ONE, selected);
-}
-
-void VoteDialog_Reset() {
-       WriteByte(MSG_ALL, SVC_TEMPENTITY);
-       WriteByte(MSG_ALL, TE_CSQC_VOTERESET);
-}
-
 float GameCommand_Vote(string s, entity e) {
        local float playercount;
        float argc;
@@ -180,10 +168,9 @@ float GameCommand_Vote(string s, entity e) {
                                                bprint("\{1}^2* ^3", VoteNetname(votecaller), "^2 calls a vote for ", votecalledvote_display, "\n");
                                                if(autocvar_sv_eventlog)
                                                        GameLogEcho(strcat(":vote:vcall:", ftos(votecaller.playerid), ":", votecalledvote_display));
-                                               VoteCount(); // needed if you are the only one
                                                Nagger_VoteChanged();
+                                               VoteCount(); // needed if you are the only one
                                                msg_entity = e;
-                                               VoteDialog_UpdateHighlight(1);
 
                                                local entity player;
                                                FOR_EACH_REALCLIENT(player)
@@ -203,13 +190,10 @@ float GameCommand_Vote(string s, entity e) {
                        if(!votecalled) {
                                print_to(e, "^1No vote called.");
                        } else if(e == votecaller) { // the votecaller can stop a vote
-                               VoteDialog_Reset();
                                VoteStop(e);
                        } else if(!e) { // server admin / console can too
-                               VoteDialog_Reset();
                                VoteStop(e);
                        } else if(e.vote_master) { // masters can too
-                               VoteDialog_Reset();
                                VoteStop(e);
                        } else {
                                print_to(e, "^1You are not allowed to stop that Vote.");
@@ -232,8 +216,8 @@ float GameCommand_Vote(string s, entity e) {
                                        bprint("\{1}^2* ^3", VoteNetname(votecaller), "^2 calls a vote to become ^3master^2.\n");
                                        if(autocvar_sv_eventlog)
                                                GameLogEcho(strcat(":vote:vcall:", ftos(votecaller.playerid), ":", votecalledvote_display));
-                                       VoteCount(); // needed if you are the only one
                                        Nagger_VoteChanged();
+                                       VoteCount(); // needed if you are the only one
                                }
                        } else {
                                print_to(e, "^1Vote to become master is NOT allowed.");
@@ -284,10 +268,8 @@ float GameCommand_Vote(string s, entity e) {
                        } else if(e.vote_vote == 0
                                  || autocvar_sv_vote_change) {
                                msg_entity = e;
-                               VoteDialog_UpdateHighlight(1);
                                print_to(e, "^1You accepted the vote.");
                                e.vote_vote = 1;
-                               centerprint_expire(e, CENTERPRIO_VOTE);
                                if(!autocvar_sv_vote_singlecount) {
                                        VoteCount();
                                }
@@ -302,10 +284,8 @@ float GameCommand_Vote(string s, entity e) {
                        } else if(e.vote_vote == 0
                                  || autocvar_sv_vote_change) {
                                msg_entity = e;
-                               VoteDialog_UpdateHighlight(2);
                                print_to(e, "^1You rejected the vote.");
                                e.vote_vote = -1;
-                               centerprint_expire(e, CENTERPRIO_VOTE);
                                if(!autocvar_sv_vote_singlecount) {
                                        VoteCount();
                                }
@@ -320,10 +300,8 @@ float GameCommand_Vote(string s, entity e) {
                        } else if(e.vote_vote == 0
                                  || autocvar_sv_vote_change) {
                                msg_entity = e;
-                               VoteDialog_UpdateHighlight(3);
                                print_to(e, "^1You abstained from your vote.");
                                e.vote_vote = -2;
-                               centerprint_expire(e, CENTERPRIO_VOTE);
                                if(!autocvar_sv_vote_singlecount) {
                                        VoteCount();
                                }
@@ -466,7 +444,6 @@ void VoteReset() {
        FOR_EACH_CLIENT(player)
        {
                player.vote_vote = 0;
-               centerprint_expire(player, CENTERPRIO_VOTE);
        }
 
        if(votecalled)
@@ -478,6 +455,10 @@ void VoteReset() {
        votecalled = FALSE;
        votecalledmaster = FALSE;
        votefinished = 0;
+       votecalledvote = string_null;
+       votecalledvote_display = string_null;
+
+       Nagger_VoteChanged();
 }
 
 void VoteAccept() {
@@ -523,54 +504,42 @@ void VoteStop(entity stopper) {
        VoteReset();
 }
 
-void VoteSpam(float yescount, float nocount, float abstaincount, float notvoters, float mincount, string result)
+void VoteSpam(float notvoters, float mincount, string result)
 {
        string s;
        if(mincount >= 0)
        {
-               s = strcat("\{1}^2* vote results: ^1", ftos(yescount), "^2:^1");
-               s = strcat(s, ftos(nocount), "^2 (^1");
+               s = strcat("\{1}^2* vote results: ^1", ftos(vote_yescount), "^2:^1");
+               s = strcat(s, ftos(vote_nocount), "^2 (^1");
                s = strcat(s, ftos(mincount), "^2 needed), ^1");
-               s = strcat(s, ftos(abstaincount), "^2 didn't care, ^1");
+               s = strcat(s, ftos(vote_abstaincount), "^2 didn't care, ^1");
                s = strcat(s, ftos(notvoters), "^2 didn't vote\n");
        }
        else
        {
-               s = strcat("\{1}^2* vote results: ^1", ftos(yescount), "^2:^1");
-               s = strcat(s, ftos(nocount), "^2, ^1");
-               s = strcat(s, ftos(abstaincount), "^2 didn't care, ^1");
+               s = strcat("\{1}^2* vote results: ^1", ftos(vote_yescount), "^2:^1");
+               s = strcat(s, ftos(vote_nocount), "^2, ^1");
+               s = strcat(s, ftos(vote_abstaincount), "^2 didn't care, ^1");
                s = strcat(s, ftos(notvoters), "^2 didn't have to vote\n");
        }
        bprint(s);
        if(autocvar_sv_eventlog)
        {
-               s = strcat(":vote:v", result, ":", ftos(yescount));
-               s = strcat(s, ":", ftos(nocount));
-               s = strcat(s, ":", ftos(abstaincount));
+               s = strcat(":vote:v", result, ":", ftos(vote_yescount));
+               s = strcat(s, ":", ftos(vote_nocount));
+               s = strcat(s, ":", ftos(vote_abstaincount));
                s = strcat(s, ":", ftos(notvoters));
                s = strcat(s, ":", ftos(mincount));
                GameLogEcho(s);
        }
 }
 
-void VoteDialog_Update(float msg, float vyes, float vno, float needed) {
-       WriteByte(msg, SVC_TEMPENTITY);
-       WriteByte(msg, TE_CSQC_VOTE);
-       WriteByte(msg, 0);
-       WriteByte(msg, vyes);
-       WriteByte(msg, vno);
-       WriteByte(msg, needed);
-}
-
 void VoteCount() {
        local float playercount;
        playercount = 0;
-       local float yescount;
-       yescount = 0;
-       local float nocount;
-       nocount = 0;
-       local float abstaincount;
-       abstaincount = 0;
+       vote_yescount = 0;
+       vote_nocount = 0;
+       vote_abstaincount = 0;
        local entity player;
        //same for real players
        local float realplayercount;
@@ -579,14 +548,16 @@ void VoteCount() {
        local float realplayerabstaincount;
        realplayercount = realplayernocount = realplayerabstaincount = realplayeryescount = 0;
 
+       Nagger_VoteCountChanged();
+
        FOR_EACH_REALCLIENT(player)
        {
                if(player.vote_vote == -1) {
-                       ++nocount;
+                       ++vote_nocount;
                } else if(player.vote_vote == 1) {
-                       ++yescount;
+                       ++vote_yescount;
                } else if(player.vote_vote == -2) {
-                       ++abstaincount;
+                       ++vote_abstaincount;
                }
                ++playercount;
                //do the same for real players
@@ -605,18 +576,25 @@ void VoteCount() {
        //in tournament mode, if we have at least one player then don't make the vote dependent on spectators (so specs don't have to press F1)
        if(autocvar_sv_vote_nospectators)
        if(realplayercount > 0) {
-               yescount = realplayeryescount;
-               nocount = realplayernocount;
-               abstaincount = realplayerabstaincount;
+               vote_yescount = realplayeryescount;
+               vote_nocount = realplayernocount;
+               vote_abstaincount = realplayerabstaincount;
                playercount = realplayercount;
        }
 
        float votefactor, simplevotefactor;
        votefactor = bound(0.5, autocvar_sv_vote_majority_factor, 0.999);
        simplevotefactor = autocvar_sv_vote_simple_majority_factor;
-       float needed;
-       needed = floor((playercount - abstaincount) * max(votefactor, simplevotefactor)) + 1;
-       VoteDialog_Update(MSG_ALL, yescount, nocount, needed);
+
+       // FIXME this number is a guess
+       vote_needed_absolute = floor((playercount - vote_abstaincount) * votefactor) + 1;
+       if(simplevotefactor)
+       {
+               simplevotefactor = bound(votefactor, simplevotefactor, 0.999);
+               vote_needed_simple = floor((vote_yescount + vote_nocount) * simplevotefactor) + 1;
+       }
+       else
+               vote_needed_simple = 0;
 
        if(votecalledmaster
           && playercount == 1) {
@@ -632,31 +610,28 @@ void VoteCount() {
                }
                VoteReset();
        } else {
-               if(yescount > (playercount - abstaincount) * votefactor)
+               if(vote_yescount >= vote_needed_absolute)
                {
-                       VoteSpam(yescount, nocount, abstaincount, playercount - yescount - nocount - abstaincount, -1, "yes");
+                       VoteSpam(playercount - vote_yescount - vote_nocount - vote_abstaincount, -1, "yes");
                        VoteAccept();
-                       VoteDialog_Reset();
                }
-               else if(nocount >= (playercount - abstaincount) * (1 - votefactor)) // that means, yescount cannot reach minyes any more
+               else if(vote_nocount > playercount - vote_abstaincount - vote_needed_absolute) // that means, vote_yescount cannot reach vote_needed_absolute any more
                {
-                       VoteSpam(yescount, nocount, abstaincount, playercount - yescount - nocount - abstaincount, -1, "no");
+                       VoteSpam(playercount - vote_yescount - vote_nocount - vote_abstaincount, -1, "no");
                        VoteReject();
-                       VoteDialog_Reset();
                }
                else if(time > votefinished)
                {
                        if(simplevotefactor)
                        {
                                string result;
-                               simplevotefactor = bound(votefactor, simplevotefactor, 0.999);
-                               if(yescount > (yescount + nocount) * simplevotefactor)
+                               if(vote_yescount >= vote_needed_simple)
                                        result = "yes";
-                               else if(yescount + nocount > 0)
+                               else if(vote_yescount + vote_nocount > 0)
                                        result = "no";
                                else
                                        result = "timeout";
-                               VoteSpam(yescount, nocount, abstaincount, playercount - yescount - nocount - abstaincount, floor(min((playercount - abstaincount) * votefactor, (yescount + nocount) * simplevotefactor)) + 1, result);
+                               VoteSpam(playercount - vote_yescount - vote_nocount - vote_abstaincount, min(vote_needed_absolute, vote_needed_simple), result);
                                if(result == "yes")
                                        VoteAccept();
                                else if(result == "no")
@@ -666,10 +641,9 @@ void VoteCount() {
                        }
                        else
                        {
-                               VoteSpam(yescount, nocount, abstaincount, playercount - yescount - nocount - abstaincount, floor((playercount - abstaincount) * votefactor) + 1, "timeout");
+                               VoteSpam(playercount - vote_yescount - vote_nocount - vote_abstaincount, vote_needed_absolute, "timeout");
                                VoteTimeout();
                        }
-               VoteDialog_Reset();
                }
        }
 }
index 7d937a93c1c1668b7a61a368012046df797f041d..75eda9849e6a235860da66917ce2eb7863fbaf56 100644 (file)
@@ -7,6 +7,11 @@ float votefinished;
 .float vote_master;
 .float vote_next;
 .float vote_vote;
+float vote_yescount;
+float vote_nocount;
+float vote_abstaincount;
+float vote_needed_absolute;
+float vote_needed_simple;
 
 float VoteCheckNasty(string cmd);
 entity GetKickVoteVictim(string vote, string cmd, entity caller);
@@ -22,5 +27,5 @@ void VoteAccept();
 void VoteReject();
 void VoteTimeout();
 void VoteStop(entity stopper);
-void VoteSpam(float yescount, float nocount, float abstaincount, float notvoters, float mincount, string result);
+void VoteSpam(float notvoters, float mincount, string result);
 void VoteCount();
index 930a413d58c487dbd4be050e2994c0ccd662f4dc..ac4ef47ed3bc74c009b3b9d79e1433975102c3c7 100644 (file)
@@ -16,6 +16,6 @@
 #include "w_hook.qc"
 #include "w_hlac.qc"
 #include "w_tuba.qc"
-#include "w_sniperrifle.qc"
+#include "w_rifle.qc"
 #include "w_fireball.qc"
 #include "w_seeker.qc"
index 1efd6132d084e217b586015bf4910fb61446ebcc..f1e33ec968aec26b989f22dd29c7c98786ac0242 100644 (file)
@@ -30,6 +30,7 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f
        local entity ent, endent;
        local float endq3surfaceflags;
        float totaldmg;
+       entity o;
 
        float length;
        vector beampos;
@@ -52,12 +53,18 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f
        // trace multiple times until we hit a wall, each obstacle will be made
        // non-solid so we can hit the next, while doing this we spawn effects and
        // note down which entities were hit so we can damage them later
+       o = self;
        while (1)
        {
                if(self.antilag_debug)
-                       WarpZone_traceline_antilag (self, start, end, FALSE, self, self.antilag_debug);
+                       WarpZone_traceline_antilag (self, start, end, FALSE, o, self.antilag_debug);
                else
-                       WarpZone_traceline_antilag (self, start, end, FALSE, self, ANTILAG_LATENCY(self));
+                       WarpZone_traceline_antilag (self, start, end, FALSE, o, ANTILAG_LATENCY(self));
+               if(o && WarpZone_trace_firstzone)
+               {
+                       o = world;
+                       continue;
+               }
 
                // if it is world we can't hurt it so stop now
                if (trace_ent == world || trace_fraction == 1)
@@ -110,7 +117,7 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f
 
                        if(!pseudoprojectile)
                                pseudoprojectile = spawn(); // we need this so the sound uses the "entchannel4" volume
-                       soundtoat(MSG_ONE, pseudoprojectile, beampos, CHAN_PROJECTILE, snd, VOL_BASE * f, ATTN_NONE);
+                       soundtoat(MSG_ONE, pseudoprojectile, beampos, CH_SHOTS, snd, VOL_BASE * f, ATTN_NONE);
                }
 
                if(pseudoprojectile)
@@ -127,7 +134,7 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f
                f = ExponentialFalloff(mindist, maxdist, halflifedist, ent.railgundistance);
                ffs = ExponentialFalloff(mindist, maxdist, forcehalflifedist, ent.railgundistance);
 
-               if(accuracy_isgooddamage(self.owner, ent))
+               if(accuracy_isgooddamage(self.realowner, ent))
                        totaldmg += bdamage * f;
 
                // apply the damage
@@ -178,8 +185,8 @@ void W_BallisticBullet_Hit (void)
                damage_headshotbonus = self.dmg_edge * f;
                railgun_start = self.origin - 2 * frametime * self.velocity;
                railgun_end = self.origin + 2 * frametime * self.velocity;
-               g = accuracy_isgooddamage(self.owner, other);
-               Damage(other, self, self.owner, self.dmg * f, self.projectiledeathtype, self.origin, self.dmg_force * normalize(self.velocity) * f);
+               g = accuracy_isgooddamage(self.realowner, other);
+               Damage(other, self, self.realowner, self.dmg * f, self.projectiledeathtype, self.origin, self.dmg_force * normalize(self.velocity) * f);
                damage_headshotbonus = 0;
 
                if(headshot)
@@ -187,9 +194,9 @@ void W_BallisticBullet_Hit (void)
                if(self.dmg_edge > 0)
                {
                        if(headshot)
-                               AnnounceTo(self.owner, "headshot");
+                               AnnounceTo(self.realowner, "headshot");
                        if(yoda)
-                               AnnounceTo(self.owner, "awesome");
+                               AnnounceTo(self.realowner, "awesome");
                }
 
                // calculate hits for ballistic weapons
@@ -198,7 +205,7 @@ void W_BallisticBullet_Hit (void)
                        // do not exceed 100%
                        q = min(self.dmg * q, self.dmg_total + f * self.dmg) - self.dmg_total;
                        self.dmg_total += f * self.dmg;
-                       accuracy_add(self.owner, self.owner.weapon, 0, q);
+                       accuracy_add(self.realowner, self.realowner.weapon, 0, q);
                }
        }
 
@@ -359,7 +366,7 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
        entity proj;
        proj = spawn();
        proj.classname = "bullet";
-       proj.owner = self;
+       proj.owner = proj.realowner = self;
        PROJECTILE_MAKETRIGGER(proj);
        if(gravityfactor > 0)
        {
@@ -431,7 +438,16 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
                        trace_fraction = 0;
                        fireBallisticBullet_trace_callback_ent = self;
                        fireBallisticBullet_trace_callback_eff = eff;
-                       WarpZone_TraceToss_ThroughZone(self, oldself, world, fireBallisticBullet_trace_callback);
+                       // FIXME can we somehow do this with just ONE trace?
+                       WarpZone_TraceToss(self, self.owner);
+                       if(self.owner && WarpZone_trace_firstzone)
+                       {
+                               self.owner = world;
+                               self.velocity = v0;
+                               self.gravity = g0;
+                               continue;
+                       }
+                       WarpZone_TraceToss_ThroughZone(self, self.owner, world, fireBallisticBullet_trace_callback);
                        self.velocity = v0;
                        self.gravity = g0;
 
@@ -517,11 +533,10 @@ void fireBullet (vector start, vector dir, float spread, float damage, float for
 
        if ((trace_fraction != 1.0) && (pointcontents (trace_endpos) != CONTENT_SKY))
        {
-               pointparticles(particleeffectnum("TE_KNIGHTSPIKE"),end,trace_plane_normal * 2500,1);
-               if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT))
-                       Damage_DamageInfo(trace_endpos, damage, 0, 0, dir * max(1, force), dtype, self);
+               if not (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+                       Damage_DamageInfo(trace_endpos, damage, 0, 0, dir * max(1, force), dtype, self);                    
+
                Damage (trace_ent, self, self, damage, dtype, trace_endpos, dir * force);
-               //void(float effectnum, vector org, vector vel, float howmany) pointparticles = #337; // same as in CSQC
        }
        trace_endpos = end;
 }
index ef8dd8d163b85ec8ac4ca02a921f8352deb119c5..6a77e98a882ccc2c1fb329db1b2b25b03e87fd13 100644 (file)
@@ -16,8 +16,8 @@ void W_Crylink_CheckLinks(entity e)
 
        if(e == world)
                error("W_Crylink_CheckLinks: entity is world");
-       if(e.classname != "spike")
-               error("W_Crylink_CheckLinks: entity is not a spike");
+       if(e.classname != "spike" || wasfreed(e))
+               error(sprintf("W_Crylink_CheckLinks: entity is not a spike but a %s (freed: %d)", e.classname, wasfreed(e)));
 
        p = e;
        for(i = 0; i < 1000; ++i)
@@ -39,6 +39,7 @@ void W_Crylink_Dequeue_Raw(entity own, entity prev, entity me, entity next)
                own.crylink_lastgroup = ((me == next) ? world : next);
        prev.queuenext = next;
        next.queueprev = prev;
+       me.classname = "spike_oktoremove";
        if(me != next)
                W_Crylink_CheckLinks(next);
 }
@@ -65,6 +66,7 @@ void W_Crylink_LinkExplode (entity e, entity e2)
        if(e.queuenext != e2)
                W_Crylink_LinkExplode(e.queuenext, e2);
 
+       e.classname = "spike_oktoremove";
        remove (e);
 }
 
@@ -213,23 +215,12 @@ void W_Crylink_LinkJoinEffect_Think()
        remove(self);
 }
 
-
 // NO bounce protection, as bounces are limited!
 void W_Crylink_Touch (void)
 {
        float finalhit;
        float f;
-       //PROJECTILE_TOUCH;
-       local entity savenext, saveprev, saveown;
-       saveown = self.realowner;
-       savenext = self.queuenext;
-       saveprev = self.queueprev;
-       if(WarpZone_Projectile_Touch())
-       {
-               if(wasfreed(self))
-                       W_Crylink_Dequeue_Raw(saveown, saveprev, self, savenext);
-               return;
-       }
+       PROJECTILE_TOUCH;
 
        float a;
        a = bound(0, 1 - (time - self.fade_time) * self.fade_rate, 1);
@@ -269,17 +260,7 @@ void W_Crylink_Touch2 (void)
 {
        float finalhit;
        float f;
-       //PROJECTILE_TOUCH;
-       local entity savenext, saveprev, saveown;
-       savenext = self.queuenext;
-       saveprev = self.queueprev;
-       saveown = self.realowner;
-       if(WarpZone_Projectile_Touch())
-       {
-               if(wasfreed(self))
-                       W_Crylink_Dequeue_Raw(saveown, saveprev, self, savenext);
-               return;
-       }
+       PROJECTILE_TOUCH;
 
        float a;
        a = bound(0, 1 - (time - self.fade_time) * self.fade_rate, 1);
@@ -336,7 +317,7 @@ void W_Crylink_Attack (void)
        if(autocvar_g_balance_crylink_primary_joinexplode)
                maxdmg += autocvar_g_balance_crylink_primary_joinexplode_damage;
 
-       W_SetupShot (self, FALSE, 2, "weapons/crylink_fire.wav", CHAN_WEAPON, maxdmg);
+       W_SetupShot (self, FALSE, 2, "weapons/crylink_fire.wav", CH_WEAPON_A, maxdmg);
        forward = v_forward;
        right = v_right;
        up = v_up;
@@ -422,8 +403,12 @@ void W_Crylink_Attack (void)
 
                counter = counter + 1;
        }
-       self.crylink_lastgroup = proj;
-       W_Crylink_CheckLinks(proj);
+       if(autocvar_g_balance_crylink_primary_joinspread != 0 || autocvar_g_balance_crylink_primary_jointime != 0)
+       {
+               self.crylink_lastgroup = proj;
+               W_Crylink_CheckLinks(proj);
+               self.crylink_waitrelease = 1;
+       }
 }
 
 void W_Crylink_Attack2 (void)
@@ -439,7 +424,7 @@ void W_Crylink_Attack2 (void)
        if(autocvar_g_balance_crylink_secondary_joinexplode)
                maxdmg += autocvar_g_balance_crylink_secondary_joinexplode_damage;
 
-       W_SetupShot (self, FALSE, 2, "weapons/crylink_fire2.wav", CHAN_WEAPON, maxdmg);
+       W_SetupShot (self, FALSE, 2, "weapons/crylink_fire2.wav", CH_WEAPON_A, maxdmg);
 
        shots = autocvar_g_balance_crylink_secondary_shots;
        pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots);
@@ -510,7 +495,12 @@ void W_Crylink_Attack2 (void)
 
                counter = counter + 1;
        }
-       self.crylink_lastgroup = proj;
+       if(autocvar_g_balance_crylink_secondary_joinspread != 0 || autocvar_g_balance_crylink_secondary_jointime != 0)
+       {
+               self.crylink_lastgroup = proj;
+               W_Crylink_CheckLinks(proj);
+               self.crylink_waitrelease = 2;
+       }
 }
 
 void spawnfunc_weapon_crylink (void)
@@ -532,31 +522,30 @@ float w_crylink(float req)
        {
                if(autocvar_g_balance_crylink_reload_ammo && self.clip_load < min(autocvar_g_balance_crylink_primary_ammo, autocvar_g_balance_crylink_secondary_ammo)) // forced reload
                        weapon_action(self.weapon, WR_RELOAD);
-               else if (self.BUTTON_ATCK)
+
+               if (self.BUTTON_ATCK)
                {
-                       if (!self.crylink_waitrelease)
+                       if (self.crylink_waitrelease != 1)
                        if (weapon_prepareattack(0, autocvar_g_balance_crylink_primary_refire))
                        {
                                W_Crylink_Attack();
                                weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_crylink_primary_animtime, w_ready);
-                               if(autocvar_g_balance_crylink_primary_joinspread != 0 || autocvar_g_balance_crylink_primary_jointime != 0)
-                                       self.crylink_waitrelease = 1;
                        }
                }
-               else if(self.BUTTON_ATCK2 && autocvar_g_balance_crylink_secondary)
+
+               if(self.BUTTON_ATCK2 && autocvar_g_balance_crylink_secondary)
                {
-                       if (!self.crylink_waitrelease)
+                       if (self.crylink_waitrelease != 2)
                        if (weapon_prepareattack(1, autocvar_g_balance_crylink_secondary_refire))
                        {
                                W_Crylink_Attack2();
                                weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_crylink_secondary_animtime, w_ready);
-                               if(autocvar_g_balance_crylink_secondary_joinspread != 0 || autocvar_g_balance_crylink_secondary_jointime != 0)
-                                       self.crylink_waitrelease = 2;
                        }
                }
-               else
+
+               if ((self.crylink_waitrelease == 1 && !self.BUTTON_ATCK) || (self.crylink_waitrelease == 2 && !self.BUTTON_ATCK2))
                {
-                       if (self.crylink_waitrelease && (!self.crylink_lastgroup || time > self.crylink_lastgroup.teleport_time))
+                       if (!self.crylink_lastgroup || time > self.crylink_lastgroup.teleport_time)
                        {
                                // fired and released now!
                                if(self.crylink_lastgroup)
@@ -645,13 +634,13 @@ float w_crylink(float req)
                {
                        pointparticles(particleeffectnum("crylink_impact"), org2, '0 0 0', 1);
                        if(!w_issilent)
-                               sound(self, CHAN_PROJECTILE, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM);
                }
                else
                {
                        pointparticles(particleeffectnum("crylink_impactbig"), org2, '0 0 0', 1);
                        if(!w_issilent)
-                               sound(self, CHAN_PROJECTILE, "weapons/crylink_impact.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, "weapons/crylink_impact.wav", VOL_BASE, ATTN_NORM);
                }
        }
        else if(req == WR_PRECACHE)
index 711c44c8bf363a39bd8672e5c9908c6b2993f9db..526d4cd32d6253ff11f5b07022f8e76bd0b369f7 100644 (file)
@@ -16,7 +16,7 @@ void W_Plasma_TriggerCombo(vector org, float rad, entity own)
                if (e.classname == "plasma")
                {
                        // change owner to whoever caused the combo explosion
-                       e.owner = own;
+                       e.realowner = own;
                        e.takedamage = DAMAGE_NO;
                        e.classname = "plasma_chain";
                        e.think = W_Plasma_Explode_Combo;
@@ -30,21 +30,21 @@ void W_Plasma_Explode (void)
 {
        if(other.takedamage == DAMAGE_AIM)
                if(other.classname == "player")
-                       if(IsDifferentTeam(self.owner, other))
+                       if(IsDifferentTeam(self.realowner, other))
                                if(other.deadflag == DEAD_NO)
                                        if(IsFlying(other))
-                                               AnnounceTo(self.owner, "electrobitch");
+                                               AnnounceTo(self.realowner, "electrobitch");
 
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
        if (self.movetype == MOVETYPE_BOUNCE)
        {
-               RadiusDamage (self, self.owner, autocvar_g_balance_electro_secondary_damage, autocvar_g_balance_electro_secondary_edgedamage, autocvar_g_balance_electro_secondary_radius, world, autocvar_g_balance_electro_secondary_force, self.projectiledeathtype, other);
+               RadiusDamage (self, self.realowner, autocvar_g_balance_electro_secondary_damage, autocvar_g_balance_electro_secondary_edgedamage, autocvar_g_balance_electro_secondary_radius, world, autocvar_g_balance_electro_secondary_force, self.projectiledeathtype, other);
        }
        else
        {
-               W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_primary_comboradius, self.owner);
-               RadiusDamage (self, self.owner, autocvar_g_balance_electro_primary_damage, autocvar_g_balance_electro_primary_edgedamage, autocvar_g_balance_electro_primary_radius, world, autocvar_g_balance_electro_primary_force, self.projectiledeathtype, other);
+               W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_primary_comboradius, self.realowner);
+               RadiusDamage (self, self.realowner, autocvar_g_balance_electro_primary_damage, autocvar_g_balance_electro_primary_edgedamage, autocvar_g_balance_electro_primary_radius, world, autocvar_g_balance_electro_primary_force, self.projectiledeathtype, other);
        }
 
        remove (self);
@@ -52,10 +52,10 @@ void W_Plasma_Explode (void)
 
 void W_Plasma_Explode_Combo (void)
 {
-       W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_combo_comboradius, self.owner);
+       W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_combo_comboradius, self.realowner);
 
        self.event_damage = SUB_Null;
-       RadiusDamage (self, self.owner, autocvar_g_balance_electro_combo_damage, autocvar_g_balance_electro_combo_edgedamage, autocvar_g_balance_electro_combo_radius, world, autocvar_g_balance_electro_combo_force, WEP_ELECTRO | HITTYPE_BOUNCE, world); // use THIS type for a combo because primary can't bounce
+       RadiusDamage (self, self.realowner, autocvar_g_balance_electro_combo_damage, autocvar_g_balance_electro_combo_edgedamage, autocvar_g_balance_electro_combo_radius, world, autocvar_g_balance_electro_combo_force, WEP_ELECTRO | HITTYPE_BOUNCE, world); // use THIS type for a combo because primary can't bounce
        remove (self);
 }
 
@@ -68,7 +68,7 @@ void W_Plasma_Touch (void)
                W_Plasma_Explode ();
        } else {
                //UpdateCSQCProjectile(self);
-               spamsound (self, CHAN_PROJECTILE, "weapons/electro_bounce.wav", VOL_BASE, ATTN_NORM);
+               spamsound (self, CH_SHOTS, "weapons/electro_bounce.wav", VOL_BASE, ATTN_NORM);
                self.projectiledeathtype |= HITTYPE_BOUNCE;
        }
 }
@@ -92,7 +92,7 @@ void W_Plasma_Damage (entity inflictor, entity attacker, float damage, float dea
                if (inflictor.classname == "plasma_chain" || inflictor.classname == "plasma_prim")
                {
                        // change owner to whoever caused the combo explosion
-                       self.owner = inflictor.owner;
+                       self.realowner = inflictor.realowner;
                        self.classname = "plasma_chain";
                        self.think = W_Plasma_Explode_Combo;
                        self.nextthink = time + min(autocvar_g_balance_electro_combo_radius, vlen(self.origin - inflictor.origin)) / autocvar_g_balance_electro_combo_speed; // delay combo chains, looks cooler
@@ -112,13 +112,13 @@ void W_Electro_Attack()
 
        W_DecreaseAmmo(ammo_cells, autocvar_g_balance_electro_primary_ammo, autocvar_g_balance_electro_reload_ammo);
 
-       W_SetupShot_ProjectileSize (self, '0 0 -3', '0 0 -3', FALSE, 2, "weapons/electro_fire.wav", CHAN_WEAPON, autocvar_g_balance_electro_primary_damage);
+       W_SetupShot_ProjectileSize (self, '0 0 -3', '0 0 -3', FALSE, 2, "weapons/electro_fire.wav", CH_WEAPON_A, autocvar_g_balance_electro_primary_damage);
 
        pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        proj = spawn ();
        proj.classname = "plasma_prim";
-       proj.owner = self;
+       proj.owner = proj.realowner = self;
        proj.bot_dodge = TRUE;
        proj.bot_dodgerating = autocvar_g_balance_electro_primary_damage;
        proj.use = W_Plasma_Explode;
@@ -135,9 +135,6 @@ void W_Electro_Attack()
        setsize(proj, '0 0 -3', '0 0 -3');
        proj.flags = FL_PROJECTILE;
 
-       //sound (proj, CHAN_PAIN, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
-       //sounds bad
-
        CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO_BEAM, TRUE);
 
        other = proj; MUTATOR_CALLHOOK(EditProjectile);
@@ -149,7 +146,7 @@ void W_Electro_Attack2()
 
        W_DecreaseAmmo(ammo_cells, autocvar_g_balance_electro_secondary_ammo, autocvar_g_balance_electro_reload_ammo);
 
-       W_SetupShot_ProjectileSize (self, '0 0 -4', '0 0 -4', FALSE, 2, "weapons/electro_fire2.wav", CHAN_WEAPON, autocvar_g_balance_electro_secondary_damage);
+       W_SetupShot_ProjectileSize (self, '0 0 -4', '0 0 -4', FALSE, 2, "weapons/electro_fire2.wav", CH_WEAPON_A, autocvar_g_balance_electro_secondary_damage);
 
        w_shotdir = v_forward; // no TrueAim for grenades please
 
@@ -157,7 +154,7 @@ void W_Electro_Attack2()
 
        proj = spawn ();
        proj.classname = "plasma";
-       proj.owner = self;
+       proj.owner = proj.realowner = self;
        proj.use = W_Plasma_Explode;
        proj.think = adaptor_think2use_hittype_splash;
        proj.bot_dodge = TRUE;
@@ -200,12 +197,12 @@ float lgbeam_send(entity to, float sf)
 {
        WriteByte(MSG_ENTITY, ENT_CLIENT_LGBEAM);
        sf = sf & 0x7F;
-       if(sound_allowed(MSG_BROADCAST, self.owner))
+       if(sound_allowed(MSG_BROADCAST, self.realowner))
                sf |= 0x80;
        WriteByte(MSG_ENTITY, sf);
        if(sf & 1)
        {
-               WriteByte(MSG_ENTITY, num_for_edict(self.owner));
+               WriteByte(MSG_ENTITY, num_for_edict(self.realowner));
                WriteCoord(MSG_ENTITY, autocvar_g_balance_electro_primary_range);
        }
        if(sf & 2)
@@ -226,18 +223,19 @@ float lgbeam_send(entity to, float sf)
 .float prevlgfire;
 float lgbeam_checkammo()
 {
-       if(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)
+       if(self.realowner.items & IT_UNLIMITED_WEAPON_AMMO)
                return TRUE;
        else if(autocvar_g_balance_electro_reload_ammo)
-               return self.owner.clip_load > 0;
+               return self.realowner.clip_load > 0;
        else
-               return self.owner.ammo_cells > 0;
+               return self.realowner.ammo_cells > 0;
 }
 
+entity lgbeam_owner_ent;
 void lgbeam_think()
 {
        entity owner_player;
-       owner_player = self.owner;
+       owner_player = self.realowner;
 
        owner_player.prevlgfire = time;
        if (self != owner_player.lgbeam)
@@ -281,7 +279,12 @@ void lgbeam_think()
        }
 
        W_SetupShot_Range(owner_player, TRUE, 0, "", 0, autocvar_g_balance_electro_primary_damage * dt, autocvar_g_balance_electro_primary_range);
-       WarpZone_traceline_antilag(owner_player, w_shotorg, w_shotend, MOVE_NORMAL, owner_player, ANTILAG_LATENCY(owner_player));
+       if(!lgbeam_owner_ent)
+       {
+               lgbeam_owner_ent = spawn();
+               lgbeam_owner_ent.classname = "lgbeam_owner_ent";
+       }
+       WarpZone_traceline_antilag(lgbeam_owner_ent, w_shotorg, w_shotend, MOVE_NORMAL, lgbeam_owner_ent, ANTILAG_LATENCY(owner_player));
 
        // apply the damage
        if(trace_ent)
@@ -315,7 +318,7 @@ void W_Electro_Attack3 (void)
 {
        // only play fire sound if 0.5 sec has passed since player let go the fire button
        if(time - self.prevlgfire > 0.5)
-               sound (self, CHAN_WEAPON, "weapons/lgbeam_fire.wav", VOL_BASE, ATTN_NORM);
+               sound (self, CH_WEAPON_A, "weapons/lgbeam_fire.wav", VOL_BASE, ATTN_NORM);
 
        entity beam, oldself;
 
@@ -323,7 +326,7 @@ void W_Electro_Attack3 (void)
        beam.classname = "lgbeam";
        beam.solid = SOLID_NOT;
        beam.think = lgbeam_think;
-       beam.owner = self;
+       beam.owner = beam.realowner = self;
        beam.movetype = MOVETYPE_NONE;
        beam.shot_spread = 0;
        beam.bot_dodge = TRUE;
@@ -541,7 +544,7 @@ float w_electro(float req)
                {
                        pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1);
                        if(!w_issilent)
-                               sound(self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
                }
                else
                {
@@ -550,13 +553,13 @@ float w_electro(float req)
                                // this is sent as "primary (w_deathtype & HITTYPE_BOUNCE)" to distinguish it from (w_deathtype & HITTYPE_SECONDARY) bounced balls
                                pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1);
                                if(!w_issilent)
-                                       sound(self, CHAN_PROJECTILE, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM);
+                                       sound(self, CH_SHOTS, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM);
                        }
                        else
                        {
                                pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1);
                                if(!w_issilent)
-                                       sound(self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
+                                       sound(self, CH_SHOTS, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
                        }
                }
        }
index 4408ccf88f202ec907dc5252f9bb4545a8a5fa35..bbb74204c68b9fbdbb0fa5e4637404bb128bb31b 100644 (file)
@@ -18,7 +18,7 @@ void W_Fireball_Explode (void)
        self.takedamage = DAMAGE_NO;
 
        // 1. dist damage
-       d = (self.owner.health + self.owner.armorvalue);
+       d = (self.realowner.health + self.realowner.armorvalue);
        RadiusDamage (self, self.realowner, autocvar_g_balance_fireball_primary_damage, autocvar_g_balance_fireball_primary_edgedamage, autocvar_g_balance_fireball_primary_radius, world, autocvar_g_balance_fireball_primary_force, self.projectiledeathtype, other);
        if(self.realowner.health + self.realowner.armorvalue >= d)
        if(!self.cnt)
@@ -28,7 +28,7 @@ void W_Fireball_Explode (void)
                // 2. bfg effect
                // NOTE: this cannot be made warpzone aware by design. So, better intentionally ignore warpzones here.
                for(e = findradius(self.origin, autocvar_g_balance_fireball_primary_bfgradius); e; e = e.chain)
-               if(e != self.owner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.owner || IsDifferentTeam(e, self))
+               if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.realowner || IsDifferentTeam(e, self))
                {
                        // can we see fireball?
                        traceline(e.origin + e.view_ofs, self.origin, MOVE_NORMAL, e);
@@ -73,7 +73,7 @@ void W_Fireball_LaserPlay(float dt, float dist, float damage, float edgedamage,
 
        RandomSelection_Init();
        for(e = WarpZone_FindRadius(self.origin, dist, TRUE); e; e = e.chain)
-       if(e != self.owner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.owner || IsDifferentTeam(e, self))
+       if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.realowner || IsDifferentTeam(e, self))
        {
                p = e.origin;
                p_x += e.mins_x + random() * (e.maxs_x - e.mins_x);
@@ -127,7 +127,7 @@ void W_Fireball_Attack1()
 {
        local entity proj;
 
-       W_SetupShot_ProjectileSize (self, '-16 -16 -16', '16 16 16', FALSE, 2, "weapons/fireball_fire2.wav", CHAN_WEAPON, autocvar_g_balance_fireball_primary_damage + autocvar_g_balance_fireball_primary_bfgdamage);
+       W_SetupShot_ProjectileSize (self, '-16 -16 -16', '16 16 16', FALSE, 2, "weapons/fireball_fire2.wav", CH_WEAPON_A, autocvar_g_balance_fireball_primary_damage + autocvar_g_balance_fireball_primary_bfgdamage);
 
        pointparticles(particleeffectnum("fireball_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
@@ -197,7 +197,7 @@ void W_Fireball_Attack1_Frame0()
        W_DecreaseAmmo(ammo_fuel, autocvar_g_balance_fireball_primary_ammo, autocvar_g_balance_fireball_reload_ammo);
 
        W_Fireball_AttackEffect(0, '-1.25 -3.75 0');
-       sound (self, CHAN_WEAPON, "weapons/fireball_prefire2.wav", VOL_BASE, ATTN_NORM);
+       sound (self, CH_WEAPON_SINGLE, "weapons/fireball_prefire2.wav", VOL_BASE, ATTN_NORM);
        weapon_thinkf(WFRAME_FIRE1, autocvar_g_balance_fireball_primary_animtime, W_Fireball_Attack1_Frame1);
 }
 
@@ -264,7 +264,7 @@ void W_Fireball_Attack2()
                        f_diff = '+1.25 +3.75 0';
                        break;
        }
-       W_SetupShot_ProjectileSize(self, '-4 -4 -4', '4 4 4', FALSE, 2, "weapons/fireball_fire.wav", CHAN_WEAPON, autocvar_g_balance_fireball_secondary_damage);
+       W_SetupShot_ProjectileSize(self, '-4 -4 -4', '4 4 4', FALSE, 2, "weapons/fireball_fire.wav", CH_WEAPON_A, autocvar_g_balance_fireball_secondary_damage);
        traceline(w_shotorg, w_shotorg + f_diff_x * v_up + f_diff_y * v_right, MOVE_NORMAL, self);
        w_shotorg = trace_endpos;
 
@@ -404,7 +404,7 @@ float w_fireball(float req)
                        org2 = w_org + w_backoff * 16;
                        pointparticles(particleeffectnum("fireball_explode"), org2, '0 0 0', 1);
                        if(!w_issilent)
-                               sound(self, CHAN_PROJECTILE, "weapons/fireball_impact2.wav", VOL_BASE, ATTN_NORM * 0.25); // long range boom
+                               sound(self, CH_SHOTS, "weapons/fireball_impact2.wav", VOL_BASE, ATTN_NORM * 0.25); // long range boom
                }
        }
        else if(req == WR_PRECACHE)
index 017a41a87a9a2bbb08ed1bcca99c1914227e439a..1d2ee93b9a2cfb8778d290f69f5071b0491b55ed 100644 (file)
@@ -9,10 +9,10 @@ void W_Grenade_Explode (void)
 {
        if(other.takedamage == DAMAGE_AIM)
                if(other.classname == "player")
-                       if(IsDifferentTeam(self.owner, other))
+                       if(IsDifferentTeam(self.realowner, other))
                                if(other.deadflag == DEAD_NO)
                                        if(IsFlying(other))
-                                               AnnounceTo(self.owner, "airshot");
+                                               AnnounceTo(self.realowner, "airshot");
 
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
@@ -20,7 +20,7 @@ void W_Grenade_Explode (void)
        if(self.movetype == MOVETYPE_NONE)
                self.velocity = self.oldvelocity;
 
-       RadiusDamage (self, self.owner, autocvar_g_balance_grenadelauncher_primary_damage, autocvar_g_balance_grenadelauncher_primary_edgedamage, autocvar_g_balance_grenadelauncher_primary_radius, world, autocvar_g_balance_grenadelauncher_primary_force, self.projectiledeathtype, other);
+       RadiusDamage (self, self.realowner, autocvar_g_balance_grenadelauncher_primary_damage, autocvar_g_balance_grenadelauncher_primary_edgedamage, autocvar_g_balance_grenadelauncher_primary_radius, world, autocvar_g_balance_grenadelauncher_primary_force, self.projectiledeathtype, other);
 
        remove (self);
 }
@@ -29,9 +29,10 @@ void W_Grenade_Explode2 (void)
 {
        if(other.takedamage == DAMAGE_AIM)
                if(other.classname == "player")
-                       if(IsDifferentTeam(self.owner, other))
-                               if(IsFlying(other))
-                                       AnnounceTo(self.owner, "airshot");
+                       if(IsDifferentTeam(self.realowner, other))
+                               if(other.deadflag == DEAD_NO)
+                                       if(IsFlying(other))
+                                               AnnounceTo(self.realowner, "airshot");
 
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
@@ -39,7 +40,7 @@ void W_Grenade_Explode2 (void)
        if(self.movetype == MOVETYPE_NONE)
                self.velocity = self.oldvelocity;
 
-       RadiusDamage (self, self.owner, autocvar_g_balance_grenadelauncher_secondary_damage, autocvar_g_balance_grenadelauncher_secondary_edgedamage, autocvar_g_balance_grenadelauncher_secondary_radius, world, autocvar_g_balance_grenadelauncher_secondary_force, self.projectiledeathtype, other);
+       RadiusDamage (self, self.realowner, autocvar_g_balance_grenadelauncher_secondary_damage, autocvar_g_balance_grenadelauncher_secondary_edgedamage, autocvar_g_balance_grenadelauncher_secondary_radius, world, autocvar_g_balance_grenadelauncher_secondary_force, self.projectiledeathtype, other);
 
        remove (self);
 }
@@ -81,23 +82,23 @@ void W_Grenade_Touch1 (void)
                float r;
                r = random() * 6;
                if(r < 1)
-                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce1.wav", VOL_BASE, ATTN_NORM);
+                       spamsound (self, CH_SHOTS, "weapons/grenade_bounce1.wav", VOL_BASE, ATTN_NORM);
                else if(r < 2)
-                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce2.wav", VOL_BASE, ATTN_NORM);
+                       spamsound (self, CH_SHOTS, "weapons/grenade_bounce2.wav", VOL_BASE, ATTN_NORM);
                else if(r < 3)
-                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce3.wav", VOL_BASE, ATTN_NORM);
+                       spamsound (self, CH_SHOTS, "weapons/grenade_bounce3.wav", VOL_BASE, ATTN_NORM);
                else if(r < 4)
-                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce4.wav", VOL_BASE, ATTN_NORM);
+                       spamsound (self, CH_SHOTS, "weapons/grenade_bounce4.wav", VOL_BASE, ATTN_NORM);
                else if(r < 5)
-                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM);
+                       spamsound (self, CH_SHOTS, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM);
                else
-                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
+                       spamsound (self, CH_SHOTS, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
                self.projectiledeathtype |= HITTYPE_BOUNCE;
                self.gl_bouncecnt += 1;
        }
        else if(autocvar_g_balance_grenadelauncher_primary_type == 2 && (!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))) // stick
        {
-               spamsound (self, CHAN_PROJECTILE, "weapons/grenade_stick.wav", VOL_BASE, ATTN_NORM);
+               spamsound (self, CH_SHOTS, "weapons/grenade_stick.wav", VOL_BASE, ATTN_NORM);
 
                // let it stick whereever it is
                self.oldvelocity = self.velocity;
@@ -109,7 +110,7 @@ void W_Grenade_Touch1 (void)
                // do not respond to any more touches
                self.solid = SOLID_NOT;
 
-               self.nextthink = min(self.nextthink, time + autocvar_g_balance_grenadelauncher_primary_lifetime2);
+               self.nextthink = min(self.nextthink, time + autocvar_g_balance_grenadelauncher_primary_lifetime_stick);
        }
 }
 
@@ -125,23 +126,27 @@ void W_Grenade_Touch2 (void)
                float r;
                r = random() * 6;
                if(r < 1)
-                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce1.wav", VOL_BASE, ATTN_NORM);
+                       spamsound (self, CH_SHOTS, "weapons/grenade_bounce1.wav", VOL_BASE, ATTN_NORM);
                else if(r < 2)
-                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce2.wav", VOL_BASE, ATTN_NORM);
+                       spamsound (self, CH_SHOTS, "weapons/grenade_bounce2.wav", VOL_BASE, ATTN_NORM);
                else if(r < 3)
-                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce3.wav", VOL_BASE, ATTN_NORM);
+                       spamsound (self, CH_SHOTS, "weapons/grenade_bounce3.wav", VOL_BASE, ATTN_NORM);
                else if(r < 4)
-                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce4.wav", VOL_BASE, ATTN_NORM);
+                       spamsound (self, CH_SHOTS, "weapons/grenade_bounce4.wav", VOL_BASE, ATTN_NORM);
                else if(r < 5)
-                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM);
+                       spamsound (self, CH_SHOTS, "weapons/grenade_bounce5.wav", VOL_BASE, ATTN_NORM);
                else
-                       spamsound (self, CHAN_PROJECTILE, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
+                       spamsound (self, CH_SHOTS, "weapons/grenade_bounce6.wav", VOL_BASE, ATTN_NORM);
                self.projectiledeathtype |= HITTYPE_BOUNCE;
                self.gl_bouncecnt += 1;
+               
+               if (autocvar_g_balance_grenadelauncher_secondary_lifetime_bounce && self.gl_bouncecnt == 1)
+                       self.nextthink = time + autocvar_g_balance_grenadelauncher_secondary_lifetime_bounce;
+                       
        }
        else if(autocvar_g_balance_grenadelauncher_secondary_type == 2 && (!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))) // stick
        {
-               spamsound (self, CHAN_PROJECTILE, "weapons/grenade_stick.wav", VOL_BASE, ATTN_NORM);
+               spamsound (self, CH_SHOTS, "weapons/grenade_stick.wav", VOL_BASE, ATTN_NORM);
 
                // let it stick whereever it is
                self.oldvelocity = self.velocity;
@@ -153,7 +158,7 @@ void W_Grenade_Touch2 (void)
                // do not respond to any more touches
                self.solid = SOLID_NOT;
 
-               self.nextthink = min(self.nextthink, time + autocvar_g_balance_grenadelauncher_secondary_lifetime2);
+               self.nextthink = min(self.nextthink, time + autocvar_g_balance_grenadelauncher_secondary_lifetime_stick);
        }
 }
 
@@ -163,13 +168,13 @@ void W_Grenade_Attack (void)
 
        W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_grenadelauncher_primary_ammo, autocvar_g_balance_grenadelauncher_reload_ammo);
 
-       W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 4, "weapons/grenade_fire.wav", CHAN_WEAPON, autocvar_g_balance_grenadelauncher_primary_damage);
+       W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 4, "weapons/grenade_fire.wav", CH_WEAPON_A, autocvar_g_balance_grenadelauncher_primary_damage);
        w_shotdir = v_forward; // no TrueAim for grenades please
 
        pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        gren = spawn ();
-       gren.owner = self;
+       gren.owner = gren.realowner = self;
        gren.classname = "grenade";
        gren.bot_dodge = TRUE;
        gren.bot_dodgerating = autocvar_g_balance_grenadelauncher_primary_damage;
@@ -210,13 +215,13 @@ void W_Grenade_Attack2 (void)
 
        W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_grenadelauncher_secondary_ammo, autocvar_g_balance_grenadelauncher_reload_ammo);
 
-       W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 4, "weapons/grenade_fire.wav", CHAN_WEAPON, autocvar_g_balance_grenadelauncher_secondary_damage);
+       W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 4, "weapons/grenade_fire.wav", CH_WEAPON_A, autocvar_g_balance_grenadelauncher_secondary_damage);
        w_shotdir = v_forward; // no TrueAim for grenades please
 
        pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        gren = spawn ();
-       gren.owner = self;
+       gren.owner = gren.realowner = self;
        gren.classname = "grenade";
        gren.bot_dodge = TRUE;
        gren.bot_dodgerating = autocvar_g_balance_grenadelauncher_secondary_damage;
@@ -300,7 +305,7 @@ float w_glauncher(float req)
                        if (cvar("g_balance_grenadelauncher_secondary_remote_detonateprimary"))
                        {
                                nadefound = 0;
-                               for(nade = world; (nade = find(nade, classname, "grenade")); ) if(nade.owner == self)
+                               for(nade = world; (nade = find(nade, classname, "grenade")); ) if(nade.realowner == self)
                                {
                                        if(!nade.gl_detonate_later)
                                        {
@@ -309,7 +314,7 @@ float w_glauncher(float req)
                                        }
                                }
                                if(nadefound)
-                                       sound (self, CHAN_WEAPON2, "weapons/rocket_det.wav", VOL_BASE, ATTN_NORM);
+                                       sound (self, CH_WEAPON_B, "weapons/rocket_det.wav", VOL_BASE, ATTN_NORM);
                        }
                        else if (weapon_prepareattack(1, autocvar_g_balance_grenadelauncher_secondary_refire))
                        {
@@ -366,7 +371,7 @@ float w_glauncher(float req)
                org2 = w_org + w_backoff * 12;
                pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
                if(!w_issilent)
-                       sound(self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_SHOTS, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
        }
        else if(req == WR_PRECACHE)
        {
index 7dfd4461365e42cbcf9f70817a12fcaf87f1be6f..0be80db124af3c7675ffc929ac1537d7eff9e81f 100644 (file)
@@ -47,7 +47,7 @@ void W_Hagar_Attack (void)
 
        W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_hagar_primary_ammo, autocvar_g_balance_hagar_reload_ammo);
 
-       W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", CHAN_WEAPON, autocvar_g_balance_hagar_primary_damage);
+       W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", CH_WEAPON_A, autocvar_g_balance_hagar_primary_damage);
 
        pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
@@ -82,7 +82,7 @@ void W_Hagar_Attack2 (void)
 
        W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_hagar_secondary_ammo, autocvar_g_balance_hagar_reload_ammo);
 
-       W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", CHAN_WEAPON, autocvar_g_balance_hagar_secondary_damage);
+       W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", CH_WEAPON_A, autocvar_g_balance_hagar_secondary_damage);
 
        pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
@@ -127,7 +127,7 @@ void W_Hagar_Attack2_Load_Release (void)
 
        weapon_prepareattack_do(1, autocvar_g_balance_hagar_secondary_refire);
 
-       W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", CHAN_WEAPON, autocvar_g_balance_hagar_secondary_damage);
+       W_SetupShot (self, FALSE, 2, "weapons/hagar_fire.wav", CH_WEAPON_A, autocvar_g_balance_hagar_secondary_damage);
        pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        forward = v_forward;
@@ -201,9 +201,10 @@ void W_Hagar_Attack2_Load (void)
                        if(self.hagar_load)
                        {
                                // if we pressed primary fire while loading, unload all rockets and abort
+                               self.weaponentity.state = WS_READY;
                                W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_hagar_secondary_ammo * self.hagar_load * -1, autocvar_g_balance_hagar_reload_ammo); // give back ammo
                                self.hagar_load = 0;
-                               sound(self, CHAN_WEAPON, "weapons/hagar_beep.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_WEAPON_A, "weapons/hagar_beep.wav", VOL_BASE, ATTN_NORM);
 
                                // pause until we can load rockets again, once we re-press the alt fire button
                                self.hagar_loadstep = time + autocvar_g_balance_hagar_secondary_load_speed;
@@ -220,8 +221,9 @@ void W_Hagar_Attack2_Load (void)
                                if(!self.hagar_loadblock && self.hagar_loadstep < time)
                                {
                                        W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_hagar_secondary_ammo, autocvar_g_balance_hagar_reload_ammo);
+                                       self.weaponentity.state = WS_INUSE;
                                        self.hagar_load += 1;
-                                       sound(self, CHAN_WEAPON2, "weapons/hagar_load.wav", VOL_BASE, ATTN_NORM);
+                                       sound(self, CH_WEAPON_B, "weapons/hagar_load.wav", VOL_BASE, ATTN_NORM);
 
                                        self.hagar_loadstep = time + autocvar_g_balance_hagar_secondary_load_speed;
                                }
@@ -229,7 +231,7 @@ void W_Hagar_Attack2_Load (void)
                        else if(!self.hagar_loadbeep && self.hagar_load) // prevents the beep from playing each frame
                        {
                                // if this is the last rocket we can load, play a beep sound to notify the player
-                               sound(self, CHAN_WEAPON, "weapons/hagar_beep.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_WEAPON_A, "weapons/hagar_beep.wav", VOL_BASE, ATTN_NORM);
                                self.hagar_loadbeep = TRUE;
                        }
                }
@@ -242,19 +244,21 @@ void W_Hagar_Attack2_Load (void)
 
        if(self.hagar_load)
        {
-               self.weapon_forbidchange = TRUE;
                if(!self.BUTTON_ATCK2 || ((loaded || !enough_ammo) && self.hagar_loadstep < time && !autocvar_g_balance_hagar_secondary_load_hold))
+               {
+                       self.weaponentity.state = WS_READY;
                        W_Hagar_Attack2_Load_Release();
+               }
        }
        else
        {
-               self.weapon_forbidchange = FALSE;
                self.hagar_loadbeep = FALSE;
        }
 
        // we aren't checking ammo during an attack, so we must do it here
        if not(weapon_action(self.weapon, WR_CHECKAMMO1) + weapon_action(self.weapon, WR_CHECKAMMO2))
        {
+               // note: this doesn't force the switch
                W_SwitchToOtherWeapon(self);
                return;
        }
@@ -302,6 +306,15 @@ float w_hagar(float req)
                        }
                }
        }
+       else if (req == WR_GONETHINK)
+       {
+               // we lost the weapon and want to prepare switching away
+               if(self.hagar_load)
+               {
+                       self.weaponentity.state = WS_READY;
+                       W_Hagar_Attack2_Load_Release();
+               }
+       }
        else if (req == WR_PRECACHE)
        {
                precache_model ("models/weapons/g_hagar.md3");
@@ -365,11 +378,11 @@ float w_hagar(float req)
                if(!w_issilent)
                {
                        if (w_random<0.15)
-                               sound(self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
                        else if (w_random<0.7)
-                               sound(self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
                        else
-                               sound(self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
                }
        }
        else if(req == WR_PRECACHE)
index 7b474d6956f04f09ac86e80d45509a60f422b471..978ac5f4a4df38316360403e436aad260974183a 100644 (file)
@@ -10,9 +10,9 @@ void W_HLAC_Touch (void)
        self.event_damage = SUB_Null;
        
        if(self.projectiledeathtype & HITTYPE_SECONDARY)
-               RadiusDamage (self, self.owner, autocvar_g_balance_hlac_secondary_damage, autocvar_g_balance_hlac_secondary_edgedamage, autocvar_g_balance_hlac_secondary_radius, world, autocvar_g_balance_hlac_secondary_force, self.projectiledeathtype, other);
+               RadiusDamage (self, self.realowner, autocvar_g_balance_hlac_secondary_damage, autocvar_g_balance_hlac_secondary_edgedamage, autocvar_g_balance_hlac_secondary_radius, world, autocvar_g_balance_hlac_secondary_force, self.projectiledeathtype, other);
        else
-               RadiusDamage (self, self.owner, autocvar_g_balance_hlac_primary_damage, autocvar_g_balance_hlac_primary_edgedamage, autocvar_g_balance_hlac_primary_radius, world, autocvar_g_balance_hlac_primary_force, self.projectiledeathtype, other);
+               RadiusDamage (self, self.realowner, autocvar_g_balance_hlac_primary_damage, autocvar_g_balance_hlac_primary_edgedamage, autocvar_g_balance_hlac_primary_radius, world, autocvar_g_balance_hlac_primary_force, self.projectiledeathtype, other);
 
        remove (self);
 }
@@ -29,7 +29,7 @@ void W_HLAC_Attack (void)
     if(self.crouch)
         spread = spread * autocvar_g_balance_hlac_primary_spread_crouchmod;
 
-       W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", CHAN_WEAPON, autocvar_g_balance_hlac_primary_damage);
+       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)
        {
@@ -38,7 +38,7 @@ void W_HLAC_Attack (void)
        }
 
        missile = spawn ();
-       missile.owner = self;
+       missile.owner = missile.realowner = self;
        missile.classname = "hlacbolt";
        missile.bot_dodge = TRUE;
 
@@ -77,11 +77,11 @@ void W_HLAC_Attack2f (void)
     if(self.crouch)
         spread = spread * autocvar_g_balance_hlac_secondary_spread_crouchmod;
 
-       W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", CHAN_WEAPON, autocvar_g_balance_hlac_secondary_damage);
+       W_SetupShot (self, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_A, autocvar_g_balance_hlac_secondary_damage);
        pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        missile = spawn ();
-       missile.owner = self;
+       missile.owner = missile.realowner = self;
        missile.classname = "hlacbolt";
        missile.bot_dodge = TRUE;
 
@@ -230,7 +230,7 @@ float w_hlac(float req)
                org2 = w_org + w_backoff * 6;
                pointparticles(particleeffectnum("laser_impact"), org2, w_backoff * 1000, 1);
                if(!w_issilent)
-                       sound(self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_SHOTS, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
        }
        else if(req == WR_PRECACHE)
        {
index 80c40b10fd8704cc94f46ec2640d30fafc1f834c..32892d5558b5e6862848740296b7e47a2a6b2050 100644 (file)
@@ -23,7 +23,7 @@ void W_Hook_ExplodeThink (void)
        f = self.dmg_last - dmg_remaining_next;
        self.dmg_last = dmg_remaining_next;
 
-       RadiusDamage (self, self.owner, self.dmg * f, self.dmg_edge * f, self.dmg_radius, self.owner, self.dmg_force * f, self.projectiledeathtype, world);
+       RadiusDamage (self, self.realowner, self.dmg * f, self.dmg_edge * f, self.dmg_radius, self.realowner, self.dmg_force * f, self.projectiledeathtype, world);
        self.projectiledeathtype |= HITTYPE_BOUNCE;
        //RadiusDamage (self, world, self.dmg * f, self.dmg_edge * f, self.dmg_radius, world, self.dmg_force * f, self.projectiledeathtype, world);
 
@@ -63,10 +63,10 @@ void W_Hook_Attack2()
        local entity gren;
 
        W_DecreaseAmmo(ammo_cells, autocvar_g_balance_hook_secondary_ammo, FALSE);
-       W_SetupShot (self, FALSE, 4, "weapons/hookbomb_fire.wav", CHAN_WEAPON, autocvar_g_balance_hook_secondary_damage);
+       W_SetupShot (self, FALSE, 4, "weapons/hookbomb_fire.wav", CH_WEAPON_A, autocvar_g_balance_hook_secondary_damage);
 
        gren = spawn ();
-       gren.owner = self;
+       gren.owner = gren.realowner = self;
        gren.classname = "hookbomb";
        gren.bot_dodge = TRUE;
        gren.bot_dodgerating = autocvar_g_balance_hook_secondary_damage;
@@ -256,7 +256,7 @@ float w_hook(float req)
                org2 = w_org + w_backoff * 2;
                pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1);
                if(!w_issilent)
-                       sound(self, CHAN_PROJECTILE, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_SHOTS, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM);
        }
        else if(req == WR_PRECACHE)
        {
index a7e5c4df7d272f785e3dd2fc7d4e576eed97806e..5e034acb908f9bfe6b1b9a085b8c4dd10dd17a24 100644 (file)
@@ -10,9 +10,9 @@ void W_Laser_Touch (void)
 
        self.event_damage = SUB_Null;
        if (self.dmg)
-               RadiusDamage (self, self.owner, autocvar_g_balance_laser_secondary_damage, autocvar_g_balance_laser_secondary_edgedamage, autocvar_g_balance_laser_secondary_radius, world, autocvar_g_balance_laser_secondary_force, self.projectiledeathtype, other);
+               RadiusDamage (self, self.realowner, autocvar_g_balance_laser_secondary_damage, autocvar_g_balance_laser_secondary_edgedamage, autocvar_g_balance_laser_secondary_radius, world, autocvar_g_balance_laser_secondary_force, self.projectiledeathtype, other);
        else
-               RadiusDamage (self, self.owner, autocvar_g_balance_laser_primary_damage, autocvar_g_balance_laser_primary_edgedamage, autocvar_g_balance_laser_primary_radius, world, autocvar_g_balance_laser_primary_force, self.projectiledeathtype, other);
+               RadiusDamage (self, self.realowner, autocvar_g_balance_laser_primary_damage, autocvar_g_balance_laser_primary_edgedamage, autocvar_g_balance_laser_primary_radius, world, autocvar_g_balance_laser_primary_force, self.projectiledeathtype, other);
 
        remove (self);
 }
@@ -44,15 +44,15 @@ void W_Laser_Attack (float issecondary)
        s_forward = v_forward * cos(a * DEG2RAD) + v_up * sin(a * DEG2RAD);
 
        if(nodamage)
-               W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CHAN_WEAPON2, 0);
+               W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_B, 0);
        else if(issecondary == 1)
-               W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CHAN_WEAPON2, autocvar_g_balance_laser_secondary_damage);
+               W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_B, autocvar_g_balance_laser_secondary_damage);
        else
-               W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CHAN_WEAPON2, autocvar_g_balance_laser_primary_damage);
+               W_SetupShot_Dir (self, s_forward, FALSE, 3, "weapons/lasergun_fire.wav", CH_WEAPON_B, autocvar_g_balance_laser_primary_damage);
        pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        missile = spawn ();
-       missile.owner = self;
+       missile.owner = missile.realowner = self;
        missile.classname = "laserbolt";
        missile.dmg = 0;
        if(!nodamage)
@@ -95,12 +95,12 @@ float gauntletbeam_send(entity to, float sf)
 {
        WriteByte(MSG_ENTITY, ENT_CLIENT_GAUNTLET);
        sf = sf & 0x7F;
-       if(sound_allowed(MSG_BROADCAST, self.owner))
+       if(sound_allowed(MSG_BROADCAST, self.realowner))
                sf |= 0x80;
        WriteByte(MSG_ENTITY, sf);
        if(sf & 1)
        {
-               WriteByte(MSG_ENTITY, num_for_edict(self.owner));
+               WriteByte(MSG_ENTITY, num_for_edict(self.realowner));
        }
        if(sf & 2)
        {
@@ -118,6 +118,7 @@ float gauntletbeam_send(entity to, float sf)
 }
 .entity gauntletbeam;
 .float prevgauntletfire;
+entity lgbeam_owner_ent;
 void gauntletbeam_think()
 {
        float damage, myforce, myradius;
@@ -125,8 +126,8 @@ void gauntletbeam_think()
        myforce = autocvar_g_balance_laser_secondary_force;
        myradius = autocvar_g_balance_laser_secondary_radius;
 
-       self.owner.prevgauntletfire = time;
-       if (self.owner.weaponentity.state != WS_INUSE || self != self.owner.gauntletbeam || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK2)
+       self.realowner.prevgauntletfire = time;
+       if (self.realowner.weaponentity.state != WS_INUSE || self != self.realowner.gauntletbeam || self.realowner.deadflag != DEAD_NO || !self.realowner.BUTTON_ATCK2)
        {
                remove(self);
                return;
@@ -134,13 +135,18 @@ void gauntletbeam_think()
 
        self.nextthink = time;
 
-       makevectors(self.owner.v_angle);
+       makevectors(self.realowner.v_angle);
 
        float dt;
        dt = frametime;
 
-       W_SetupShot_Range(self.owner, TRUE, 0, "", 0, damage * dt, myradius);
-       WarpZone_traceline_antilag(self.owner, w_shotorg, w_shotend, MOVE_NORMAL, self.owner, ANTILAG_LATENCY(self.owner));
+       W_SetupShot_Range(self.realowner, TRUE, 0, "", 0, damage * dt, myradius);
+       if(!lgbeam_owner_ent)
+       {
+               lgbeam_owner_ent = spawn();
+               lgbeam_owner_ent.classname = "lgbeam_owner_ent";
+       }
+       WarpZone_traceline_antilag(lgbeam_owner_ent, w_shotorg, w_shotend, MOVE_NORMAL, lgbeam_owner_ent, ANTILAG_LATENCY(self.owner));
 
        // apply the damage
        if(trace_ent)
@@ -171,7 +177,7 @@ void W_Laser_Attack2 ()
        // only play fire sound if 0.5 sec has passed since player let go the fire button
        if(time - self.prevgauntletfire > 0.5)
        {
-               sound (self, CHAN_WEAPON, "weapons/gauntlet_fire.wav", VOL_BASE, ATTN_NORM);
+               sound (self, CH_WEAPON_A, "weapons/gauntlet_fire.wav", VOL_BASE, ATTN_NORM);
        }
 
        entity beam, oldself;
@@ -295,7 +301,7 @@ float w_laser(float req)
                org2 = w_org + w_backoff * 6;
                pointparticles(particleeffectnum("laser_impact"), org2, w_backoff * 1000, 1);
                if(!w_issilent)
-                       sound(self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_SHOTS, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
        }
        else if(req == WR_PRECACHE)
        {
index 14c6506faa0d13111f35402e3a8f109ac8384f63..4e56d2d94ed99916ff21662fa019e944100785ab 100644 (file)
@@ -11,9 +11,9 @@ void spawnfunc_weapon_minelayer (void)
        weapon_defaultspawnfunc(WEP_MINE_LAYER);
 }
 
-void W_Mine_Stick ()
+void W_Mine_Stick (entity to)
 {
-       spamsound (self, CHAN_PROJECTILE, "weapons/mine_stick.wav", VOL_BASE, ATTN_NORM);
+       spamsound (self, CH_SHOTS, "weapons/mine_stick.wav", VOL_BASE, ATTN_NORM);
 
        // in order for mines to face properly when sticking to the ground, they must be a server side entity rather than a csqc projectile
 
@@ -25,11 +25,14 @@ void W_Mine_Stick ()
        newmine.bot_dodgerating = self.bot_dodgerating;
 
        newmine.owner = self.owner;
+       newmine.realowner = self.realowner;
        setsize(newmine, '-4 -4 -4', '4 4 4');
        setorigin(newmine, self.origin);
        setmodel(newmine, "models/mine.md3");
        newmine.angles = vectoangles(-trace_plane_normal); // face against the surface
 
+       newmine.oldvelocity = self.velocity;
+
        newmine.takedamage = self.takedamage;
        newmine.damageforcescale = self.damageforcescale;
        newmine.health = self.health;
@@ -49,26 +52,30 @@ void W_Mine_Stick ()
 
        remove(self);
        self = newmine;
+
+       if(to)
+               SetMovetypeFollow(self, to);
 }
 
 void W_Mine_Explode ()
 {
        if(other.takedamage == DAMAGE_AIM)
                if(other.classname == "player")
-                       if(IsDifferentTeam(self.owner, other))
-                               if(IsFlying(other))
-                                       AnnounceTo(self.owner, "airshot");
+                       if(IsDifferentTeam(self.realowner, other))
+                               if(other.deadflag == DEAD_NO)
+                                       if(IsFlying(other))
+                                               AnnounceTo(self.realowner, "airshot");
 
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
 
-       RadiusDamage (self, self.owner, autocvar_g_balance_minelayer_damage, autocvar_g_balance_minelayer_edgedamage, autocvar_g_balance_minelayer_radius, world, autocvar_g_balance_minelayer_force, self.projectiledeathtype, other);
+       RadiusDamage (self, self.realowner, autocvar_g_balance_minelayer_damage, autocvar_g_balance_minelayer_edgedamage, autocvar_g_balance_minelayer_radius, world, autocvar_g_balance_minelayer_force, self.projectiledeathtype, other);
 
-       if (self.owner.weapon == WEP_MINE_LAYER)
+       if (self.realowner.weapon == WEP_MINE_LAYER)
        {
                entity oldself;
                oldself = self;
-               self = self.owner;
+               self = self.realowner;
                if (!weapon_action(WEP_MINE_LAYER, WR_CHECKAMMO1))
                {
                        self.cnt = WEP_MINE_LAYER;
@@ -77,7 +84,7 @@ void W_Mine_Explode ()
                }
                self = oldself;
        }
-       self.owner.minelayer_mines -= 1;
+       self.realowner.minelayer_mines -= 1;
        remove (self);
 }
 
@@ -86,13 +93,16 @@ void W_Mine_DoRemoteExplode ()
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
 
-       RadiusDamage (self, self.owner, autocvar_g_balance_minelayer_remote_damage, autocvar_g_balance_minelayer_remote_edgedamage, autocvar_g_balance_minelayer_remote_radius, world, autocvar_g_balance_minelayer_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
+       if(self.movetype == MOVETYPE_NONE || self.movetype == MOVETYPE_FOLLOW)
+               self.velocity = self.oldvelocity;
 
-       if (self.owner.weapon == WEP_MINE_LAYER)
+       RadiusDamage (self, self.realowner, autocvar_g_balance_minelayer_remote_damage, autocvar_g_balance_minelayer_remote_edgedamage, autocvar_g_balance_minelayer_remote_radius, world, autocvar_g_balance_minelayer_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
+
+       if (self.realowner.weapon == WEP_MINE_LAYER)
        {
                entity oldself;
                oldself = self;
-               self = self.owner;
+               self = self.realowner;
                if (!weapon_action(WEP_MINE_LAYER, WR_CHECKAMMO1))
                {
                        self.cnt = WEP_MINE_LAYER;
@@ -101,16 +111,16 @@ void W_Mine_DoRemoteExplode ()
                }
                self = oldself;
        }
-       self.owner.minelayer_mines -= 1;
+       self.realowner.minelayer_mines -= 1;
        remove (self);
 }
 
 void W_Mine_RemoteExplode ()
 {
-       if(self.owner.deadflag == DEAD_NO)
+       if(self.realowner.deadflag == DEAD_NO)
                if((self.spawnshieldtime >= 0)
                        ? (time >= self.spawnshieldtime) // timer
-                       : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > autocvar_g_balance_minelayer_remote_radius) // safety device
+                       : (vlen(NearestPointOnBox(self.realowner, self.origin) - self.origin) > autocvar_g_balance_minelayer_remote_radius) // safety device
                )
                {
                        W_Mine_DoRemoteExplode();
@@ -126,7 +136,7 @@ void W_Mine_ProximityExplode ()
                head = findradius(self.origin, autocvar_g_balance_minelayer_radius);
                while(head)
                {
-                       if(head == self.owner || !IsDifferentTeam(head, self.owner))
+                       if(head == self.realowner || !IsDifferentTeam(head, self.realowner))
                                return;
                        head = head.chain;
                }
@@ -140,7 +150,7 @@ float W_Mine_Count(entity e)
 {
        float minecount;
        entity mine;
-       for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == e)
+       for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.realowner == e)
                minecount += 1;
                
        return minecount;
@@ -151,20 +161,29 @@ void W_Mine_Think (void)
        entity head;
 
        self.nextthink = time;
+
+       if(self.movetype == MOVETYPE_FOLLOW)
+       {
+               if(LostMovetypeFollow(self))
+               {
+                       UnsetMovetypeFollow(self);
+                       self.movetype = MOVETYPE_NONE;
+               }
+       }
        
        // our lifetime has expired, it's time to die - mine_time just allows us to play a sound for this
        // TODO: replace this mine_trigger.wav sound with a real countdown
        if ((time > self.cnt) && (!self.mine_time))
        {
                if(autocvar_g_balance_minelayer_lifetime_countdown > 0)
-                       spamsound (self, CHAN_PROJECTILE, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM);
+                       spamsound (self, CH_SHOTS, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM);
                self.mine_time = time + autocvar_g_balance_minelayer_lifetime_countdown;
                self.mine_explodeanyway = 1; // make the mine super aggressive -- Samual: Rather, make it not care if a team mate is near.
        }
 
        // a player's mines shall explode if he disconnects or dies
        // TODO: Do this on team change too -- Samual: But isn't a player killed when they switch teams?
-       if(self.owner.classname != "player" || self.owner.deadflag != DEAD_NO)
+       if(self.realowner.classname != "player" || self.realowner.deadflag != DEAD_NO)
        {
                other = world;
                self.projectiledeathtype |= HITTYPE_BOUNCE;
@@ -177,10 +196,10 @@ void W_Mine_Think (void)
        while(head)
        {
                if(head.classname == "player" && head.deadflag == DEAD_NO)
-               if(head != self.owner && IsDifferentTeam(head, self.owner)) // don't trigger for team mates
+               if(head != self.realowner && IsDifferentTeam(head, self.realowner)) // don't trigger for team mates
                if(!self.mine_time)
                {
-                       spamsound (self, CHAN_PROJECTILE, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM);
+                       spamsound (self, CH_SHOTS, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM);
                        self.mine_time = time + autocvar_g_balance_minelayer_time;
                }
                head = head.chain;
@@ -194,19 +213,28 @@ void W_Mine_Think (void)
        }
 
        // remote detonation
-       if (self.owner.weapon == WEP_MINE_LAYER)
-       if (self.owner.deadflag == DEAD_NO)
+       if (self.realowner.weapon == WEP_MINE_LAYER)
+       if (self.realowner.deadflag == DEAD_NO)
        if (self.minelayer_detonate)
                W_Mine_RemoteExplode();
 }
 
 void W_Mine_Touch (void)
 {
+       if(self.movetype == MOVETYPE_NONE || self.movetype == MOVETYPE_FOLLOW)
+               return; // we're already a stuck mine, why do we get called? TODO does this even happen?
+
        PROJECTILE_TOUCH;
-       if(!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))
-               W_Mine_Stick();
-       else if(self.movetype != MOVETYPE_NONE) // don't unstick a locked mine when someone touches it
-               self.velocity = '0 0 0';
+
+       if(other && other.classname == "player" && other.deadflag == DEAD_NO)
+       {
+               // hit a player
+               // don't stick
+       }
+       else
+       {
+               W_Mine_Stick(other);
+       }
 }
 
 void W_Mine_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
@@ -239,11 +267,11 @@ void W_Mine_Attack (void)
 
        W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_minelayer_ammo, autocvar_g_balance_minelayer_reload_ammo);
 
-       W_SetupShot_ProjectileSize (self, '-4 -4 -4', '4 4 4', FALSE, 5, "weapons/mine_fire.wav", CHAN_WEAPON, autocvar_g_balance_minelayer_damage);
+       W_SetupShot_ProjectileSize (self, '-4 -4 -4', '4 4 4', FALSE, 5, "weapons/mine_fire.wav", CH_WEAPON_A, autocvar_g_balance_minelayer_damage);
        pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        mine = WarpZone_RefSys_SpawnSameRefSys(self);
-       mine.owner = self;
+       mine.owner = mine.realowner = self;
        if(autocvar_g_balance_minelayer_detonatedelay >= 0)
                mine.spawnshieldtime = time + autocvar_g_balance_minelayer_detonatedelay;
        else
@@ -295,7 +323,7 @@ float W_PlacedMines(float detonate)
        entity mine;
        float minfound;
 
-       for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self)
+       for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.realowner == self)
        {
                if(detonate)
                {
@@ -337,7 +365,7 @@ float w_minelayer(float req)
                        mine = find(world, classname, "mine");
                        while (mine)
                        {
-                               if (mine.owner != self)
+                               if (mine.realowner != self)
                                {
                                        mine = find(mine, classname, "mine");
                                        continue;
@@ -350,7 +378,7 @@ float w_minelayer(float req)
                                        // count potential damage according to type of target
                                        if (targ == self)
                                                selfdamage = selfdamage + d;
-                                       else if (targ.team == self.team && teams_matter)
+                                       else if (targ.team == self.team && teamplay)
                                                teamdamage = teamdamage + d;
                                        else if (bot_shouldattack(targ))
                                                enemydamage = enemydamage + d;
@@ -362,13 +390,13 @@ float w_minelayer(float req)
                        desirabledamage = enemydamage;
                        if (time > self.invincible_finished && time > self.spawnshieldtime)
                                desirabledamage = desirabledamage - selfdamage * autocvar_g_balance_selfdamagepercent;
-                       if (teams_matter && self.team)
+                       if (teamplay && self.team)
                                desirabledamage = desirabledamage - teamdamage;
 
                        mine = find(world, classname, "mine");
                        while (mine)
                        {
-                               if (mine.owner != self)
+                               if (mine.realowner != self)
                                {
                                        mine = find(mine, classname, "mine");
                                        continue;
@@ -431,7 +459,7 @@ float w_minelayer(float req)
                if (self.BUTTON_ATCK2)
                {
                        if(W_PlacedMines(TRUE))
-                               sound (self, CHAN_WEAPON2, "weapons/mine_det.wav", VOL_BASE, ATTN_NORM);
+                               sound (self, CH_WEAPON_B, "weapons/mine_det.wav", VOL_BASE, ATTN_NORM);
                }
        }
        else if (req == WR_PRECACHE)
@@ -485,7 +513,7 @@ float w_minelayer(float req)
                org2 = w_org + w_backoff * 12;
                pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
                if(!w_issilent)
-                       sound(self, CHAN_PROJECTILE, "weapons/mine_exp.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_SHOTS, "weapons/mine_exp.wav", VOL_BASE, ATTN_NORM);
        }
        else if(req == WR_PRECACHE)
        {
index 4481178de19b4b3b07a276dae2e6b3f6099058e0..16cbdcded3778eb1bb7988991ecbeb39a11c54ec 100644 (file)
@@ -9,7 +9,7 @@ void W_MinstaNex_Attack (void)
        float flying;
        flying = IsFlying(self); // do this BEFORE to make the trace values from FireRailgunBullet last
 
-       W_SetupShot (self, TRUE, 0, "weapons/minstanexfire.wav", CHAN_WEAPON, 10000);
+       W_SetupShot (self, TRUE, 0, "weapons/minstanexfire.wav", CH_WEAPON_A, 10000);
 
        yoda = 0;
        damage_goodhits = 0;
@@ -43,7 +43,7 @@ void W_MinstaNex_Attack (void)
        // teamcolor / hit beam effect
        vector v;
        v = WarpZone_UnTransformOrigin(WarpZone_trace_transform, trace_endpos);
-       if(teams_matter)
+       if(teamplay)
        {
            switch(self.team)
            {
@@ -88,77 +88,80 @@ void W_MinstaNex_Attack (void)
 
 
 .float minstagib_nextthink;
-void minstagib_ammocheck (void)
+.float minstagib_needammo;
+void minstagib_stop_countdown(void)
 {
-       if (time < self.minstagib_nextthink || self.deadflag || gameover)
+       if (self.minstagib_needammo)
+       {
+               self.health = 100;
+               Send_CSQC_Centerprint_Generic_Expire(self, CPID_MINSTA_FINDAMMO);
+       }
+       self.minstagib_needammo = FALSE;
+}
+void minstagib_ammocheck(void)
+{
+       if (time < self.minstagib_nextthink)
                return;
 
-       if (self.ammo_cells <= 0)
-       if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+       if (self.deadflag || gameover || self.ammo_cells > 0 || (self.items & IT_UNLIMITED_WEAPON_AMMO))
+               minstagib_stop_countdown();
+       else
        {
+               self.minstagib_needammo = TRUE;
                if (self.health == 5)
                {
-                       centerprint(self, "you're dead now...\n");
                        Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
                        AnnounceTo(self, "terminated");
                }
                else if (self.health == 10)
                {
-                       centerprint(self, "^11^7 second left to find some ammo\n");
                        Damage(self, self, self, 5, DEATH_NOAMMO, self.origin, '0 0 0');
                        AnnounceTo(self, "1");
                }
                else if (self.health == 20)
                {
-                       centerprint(self, "^12^7 seconds left to find some ammo\n");
                        Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
                        AnnounceTo(self, "2");
                }
                else if (self.health == 30)
                {
-                       centerprint(self, "^13^7 seconds left to find some ammo\n");
                        Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
                        AnnounceTo(self, "3");
                }
                else if (self.health == 40)
                {
-                       centerprint(self, "^14^7 seconds left to find some ammo\n");
                        Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
                        AnnounceTo(self, "4");
                }
                else if (self.health == 50)
                {
-                       centerprint(self, "^15^7 seconds left to find some ammo\n");
                        Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
                        AnnounceTo(self, "5");
                }
                else if (self.health == 60)
                {
-                       centerprint(self, "^36^7 seconds left to find some ammo\n");
                        Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
                        AnnounceTo(self, "6");
                }
                else if (self.health == 70)
                {
-                       centerprint(self, "^37^7 seconds left to find some ammo\n");
                        Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
                        AnnounceTo(self, "7");
                }
                else if (self.health == 80)
                {
-                       centerprint(self, "^38^7 seconds left to find some ammo\n");
                        Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
                        AnnounceTo(self, "8");
                }
                else if (self.health == 90)
                {
-                       centerprint(self, "^39^7 seconds left to find some ammo\n");
+                       Send_CSQC_Centerprint_Generic(self, CPID_MINSTA_FINDAMMO, "^1%d^7 seconds left to find some ammo", 1, 9);
                        Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
                        AnnounceTo(self, "9");
                }
                else if (self.health == 100)
                {
-                       centerprint(self, "get some ammo or\nyou'll be dead in ^310^7 seconds...");
+                       Send_CSQC_Centerprint_Generic(self, CPID_MINSTA_FINDAMMO, "get some ammo or\nyou'll be dead in ^3%d^7 seconds...", 1, 10);
                        Damage(self, self, self, 10, DEATH_NOAMMO, self.origin, '0 0 0');
                        if not(self.flags & FL_GODMODE)
                                AnnounceTo(self, "10");
@@ -280,14 +283,14 @@ float w_minstanex(float req)
                org2 = w_org + w_backoff * 6;
                pointparticles(particleeffectnum("nex_impact"), org2, '0 0 0', 1);
                if(!w_issilent)
-                       sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_SHOTS, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
        }
        else if(req == WR_PRECACHE)
        {
                precache_sound("weapons/neximpact.wav");
        }
        else if (req == WR_SUICIDEMESSAGE)
-               w_deathtypestring = _("%s did the impossible");
+               w_deathtypestring = _("%s is now thinking with portals");
        else if (req == WR_KILLMESSAGE)
                w_deathtypestring = _("%s has been vaporized by %s");
        return TRUE;
index 04a1151910bf0f290a7f91eee114aeb97a8a9fc8..f9367059555cca67c033a8311e593e9bfc152a81 100644 (file)
@@ -56,10 +56,10 @@ void W_Nex_Attack (float issecondary)
        mydmg *= charge;
        myforce *= charge;
 
-       W_SetupShot (self, TRUE, 5, "weapons/nexfire.wav", CHAN_WEAPON, mydmg);
+       W_SetupShot (self, TRUE, 5, "weapons/nexfire.wav", CH_WEAPON_A, mydmg);
        if(charge > autocvar_g_balance_nex_charge_animlimit && autocvar_g_balance_nex_charge_animlimit) // if the Nex is overcharged, we play an extra sound
        {
-               sound (self, CHAN_WEAPON2, "weapons/nexcharge.wav", VOL_BASE * (charge - 0.5 * autocvar_g_balance_nex_charge_animlimit) / (1 - 0.5 * autocvar_g_balance_nex_charge_animlimit), ATTN_NORM);
+               sound (self, CH_WEAPON_B, "weapons/nexcharge.wav", VOL_BASE * (charge - 0.5 * autocvar_g_balance_nex_charge_animlimit) / (1 - 0.5 * autocvar_g_balance_nex_charge_animlimit), ATTN_NORM);
        }
 
        yoda = 0;
@@ -243,14 +243,14 @@ float w_nex(float req)
                org2 = w_org + w_backoff * 6;
                pointparticles(particleeffectnum("nex_impact"), org2, '0 0 0', 1);
                if(!w_issilent)
-                       sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_SHOTS, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
        }
        else if(req == WR_PRECACHE)
        {
                precache_sound("weapons/neximpact.wav");
        }
        else if (req == WR_SUICIDEMESSAGE)
-               w_deathtypestring = _("%s did the impossible");
+               w_deathtypestring = _("%s is now thinking with portals");
        else if (req == WR_KILLMESSAGE)
                w_deathtypestring = _("%s has been vaporized by %s");
        return TRUE;
index d6e92a53728203ff5f648e797e2304e00a652fc1..cb46f528231d275c94bd471c46b4c9b7691a9180 100644 (file)
@@ -9,42 +9,42 @@ REGISTER_WEAPON(PORTO, w_porto, 0, 0, WEP_TYPE_OTHER, 0, "porto" , "porto", _("P
 
 void W_Porto_Success (void)
 {
-       if(self.owner == world)
+       if(self.realowner == world)
        {
                objerror("Cannot succeed successfully: no owner\n");
                return;
        }
 
-       self.owner.porto_current = world;
+       self.realowner.porto_current = world;
        remove(self);
 }
 
 string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vector velo);
 void W_Porto_Fail (float failhard)
 {
-       if(self.owner == world)
+       if(self.realowner == world)
        {
                objerror("Cannot fail successfully: no owner\n");
                return;
        }
 
        // no portals here!
-       Portal_ClearWithID(self.owner, self.portal_id);
-       self.owner.porto_current = world;
+       Portal_ClearWithID(self.realowner, self.portal_id);
+       self.realowner.porto_current = world;
 
-       if(!failhard && self.owner.playerid == self.playerid && self.owner.deadflag == DEAD_NO && !(self.owner.weapons & WEPBIT_PORTO))
+       if(!failhard && self.realowner.playerid == self.playerid && self.realowner.deadflag == DEAD_NO && !(self.realowner.weapons & WEPBIT_PORTO))
        {
                setsize (self, '-16 -16 0', '16 16 32');
                setorigin(self, self.origin + trace_plane_normal);
                if(move_out_of_solid(self))
                {
                        self.flags = FL_ITEM;
-                       self.velocity = trigger_push_calculatevelocity(self.origin, self.owner, 128);
+                       self.velocity = trigger_push_calculatevelocity(self.origin, self.realowner, 128);
                        tracetoss(self, self);
-                       if(vlen(trace_endpos - self.owner.origin) < 128)
+                       if(vlen(trace_endpos - self.realowner.origin) < 128)
                        {
-                               W_ThrowNewWeapon(self.owner, WEP_PORTO, 0, self.origin, self.velocity);
-                               centerprint(self.owner, "^1Portal deployment failed.\n\n^2Catch it to try again!");
+                               W_ThrowNewWeapon(self.realowner, WEP_PORTO, 0, self.origin, self.velocity);
+                               centerprint(self.realowner, "^1Portal deployment failed.\n\n^2Catch it to try again!");
                        }
                }
        }
@@ -66,7 +66,7 @@ void W_Porto_Remove (entity p)
 void W_Porto_Think (void)
 {
        trace_plane_normal = '0 0 0';
-       if(self.owner.playerid != self.playerid)
+       if(self.realowner.playerid != self.playerid)
                remove(self);
        else
                W_Porto_Fail(0);
@@ -93,62 +93,62 @@ void W_Porto_Touch (void)
                        return;
        }
 
-       if(self.owner.playerid != self.playerid)
+       if(self.realowner.playerid != self.playerid)
        {
-               sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
+               sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
                remove(self);
        }
        else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_SLICK || trace_dphitcontents & DPCONTENTS_PLAYERCLIP)
        {
-               spamsound(self, CHAN_PROJECTILE, "porto/bounce.wav", VOL_BASE, ATTN_NORM);
+               spamsound(self, CH_SHOTS, "porto/bounce.wav", VOL_BASE, ATTN_NORM);
                // just reflect
                self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * trace_plane_normal);
                self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * trace_plane_normal));
        }
        else if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
        {
-               sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
+               sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
                W_Porto_Fail(0);
        }
        else if(self.effects & EF_RED)
        {
                self.effects += EF_BLUE - EF_RED;
-               if(Portal_SpawnInPortalAtTrace(self.owner, self.right_vector, self.portal_id))
+               if(Portal_SpawnInPortalAtTrace(self.realowner, self.right_vector, self.portal_id))
                {
-                       sound(self, CHAN_PROJECTILE, "porto/create.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTN_NORM);
                        trace_plane_normal = norm;
-                       centerprint(self.owner, "^1In^7-portal created.");
+                       centerprint(self.realowner, "^1In^7-portal created.");
                        self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * norm);
                        self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * norm));
                        CSQCProjectile(self, TRUE, PROJECTILE_PORTO_BLUE, TRUE); // change type
                }
                else
                {
-                       sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
                        trace_plane_normal = norm;
                        W_Porto_Fail(0);
                }
        }
        else
        {
-               if(self.owner.portal_in.portal_id == self.portal_id)
+               if(self.realowner.portal_in.portal_id == self.portal_id)
                {
-                       if(Portal_SpawnOutPortalAtTrace(self.owner, self.right_vector, self.portal_id))
+                       if(Portal_SpawnOutPortalAtTrace(self.realowner, self.right_vector, self.portal_id))
                        {
-                               sound(self, CHAN_PROJECTILE, "porto/create.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTN_NORM);
                                trace_plane_normal = norm;
-                               centerprint(self.owner, "^4Out^7-portal created.");
+                               centerprint(self.realowner, "^4Out^7-portal created.");
                                W_Porto_Success();
                        }
                        else
                        {
-                               sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
                                W_Porto_Fail(0);
                        }
                }
                else
                {
-                       sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_SHOTS, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
                        W_Porto_Fail(0);
                }
        }
@@ -160,7 +160,7 @@ void W_Porto_Attack (void)
 
        if not(self.items & IT_UNLIMITED_SUPERWEAPONS)
                self.weapons = self.weapons - (self.weapons & WEPBIT_PORTO);
-       W_SetupShot (self, FALSE, 4, "porto/fire.wav", CHAN_WEAPON, 0);
+       W_SetupShot (self, FALSE, 4, "porto/fire.wav", CH_WEAPON_A, 0);
        // always shoot from the eye
        w_shotdir = v_forward;
        w_shotorg = self.origin + self.view_ofs + ((w_shotorg - self.origin - self.view_ofs) * v_forward) * v_forward;
@@ -168,7 +168,7 @@ void W_Porto_Attack (void)
        //pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        gren = spawn ();
-       gren.owner = self;
+       gren.owner = gren.realowner = self;
        gren.playerid = self.playerid;
        gren.classname = "porto";
        gren.bot_dodge = TRUE;
diff --git a/qcsrc/server/w_rifle.qc b/qcsrc/server/w_rifle.qc
new file mode 100644 (file)
index 0000000..02d859e
--- /dev/null
@@ -0,0 +1,265 @@
+#ifdef REGISTER_WEAPON
+REGISTER_WEAPON(RIFLE, w_rifle, IT_NAILS, 7, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_MID, "campingrifle", "rifle", _("Rifle"))
+#else
+#ifdef SVQC
+
+.float rifle_accumulator;
+
+void W_Rifle_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant, float pTracer, float pShots, string pSound)
+{
+       float i;
+
+       W_DecreaseAmmo(ammo_nails, pAmmo, autocvar_g_balance_rifle_reload_ammo);
+
+       W_SetupShot (self, autocvar_g_antilag_bullets && pSpeed >= autocvar_g_antilag_bullets, 2, pSound, CH_WEAPON_A, (pDamage + pHeadshotAddedDamage) * pShots);
+
+       pointparticles(particleeffectnum("rifle_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
+
+       if(self.BUTTON_ZOOM | self.BUTTON_ZOOMSCRIPT) // if zoomed, shoot from the eye
+       {
+               w_shotdir = v_forward;
+               w_shotorg = self.origin + self.view_ofs + ((w_shotorg - self.origin - self.view_ofs) * v_forward) * v_forward;
+       }
+
+       for(i = 0; i < pShots; ++i)
+               fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, (pTracer ? EF_RED : EF_BLUE), 1, pBulletConstant);
+       endFireBallisticBullet();
+
+       if (autocvar_g_casings >= 2)
+               SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
+}
+
+void W_Rifle_Attack()
+{
+       W_Rifle_FireBullet(autocvar_g_balance_rifle_primary_spread, autocvar_g_balance_rifle_primary_damage, autocvar_g_balance_rifle_primary_headshotaddeddamage, autocvar_g_balance_rifle_primary_force, autocvar_g_balance_rifle_primary_speed, autocvar_g_balance_rifle_primary_lifetime, autocvar_g_balance_rifle_primary_ammo, WEP_RIFLE, autocvar_g_balance_rifle_primary_bulletconstant, autocvar_g_balance_rifle_primary_tracer, autocvar_g_balance_rifle_primary_shots, "weapons/campingrifle_fire.wav");
+}
+
+void W_Rifle_Attack2()
+{
+       W_Rifle_FireBullet(autocvar_g_balance_rifle_secondary_spread, autocvar_g_balance_rifle_secondary_damage, autocvar_g_balance_rifle_secondary_headshotaddeddamage, autocvar_g_balance_rifle_secondary_force, autocvar_g_balance_rifle_secondary_speed, autocvar_g_balance_rifle_secondary_lifetime, autocvar_g_balance_rifle_secondary_ammo, WEP_RIFLE | HITTYPE_SECONDARY, autocvar_g_balance_rifle_secondary_bulletconstant, autocvar_g_balance_rifle_secondary_tracer, autocvar_g_balance_rifle_secondary_shots, "weapons/campingrifle_fire2.wav");
+}
+
+void spawnfunc_weapon_rifle (void)
+{
+       weapon_defaultspawnfunc(WEP_RIFLE);
+}
+
+// compatibility alias
+void spawnfunc_weapon_campingrifle (void)
+{
+       spawnfunc_weapon_rifle();
+}
+void spawnfunc_weapon_sniperrifle (void)
+{
+       spawnfunc_weapon_rifle();
+}
+
+.void(void) rifle_bullethail_attackfunc;
+.float rifle_bullethail_frame;
+.float rifle_bullethail_animtime;
+.float rifle_bullethail_refire;
+void W_Rifle_BulletHail_Continue()
+{
+       float r, sw, af;
+
+       sw = self.switchweapon; // make it not detect weapon changes as reason to abort firing
+       af = ATTACK_FINISHED(self);
+       self.switchweapon = self.weapon;
+       ATTACK_FINISHED(self) = time;
+       print(ftos(self.ammo_nails), "\n");
+       r = weapon_prepareattack(self.rifle_bullethail_frame == WFRAME_FIRE2, self.rifle_bullethail_refire);
+       if(self.switchweapon == self.weapon)
+               self.switchweapon = sw;
+       if(r)
+       {
+               self.rifle_bullethail_attackfunc();
+               weapon_thinkf(self.rifle_bullethail_frame, self.rifle_bullethail_animtime, W_Rifle_BulletHail_Continue);
+               print("thinkf set\n");
+       }
+       else
+       {
+               ATTACK_FINISHED(self) = af; // reset attack_finished if we didn't fire, so the last shot enforces the refire time
+               print("out of ammo... ", ftos(self.weaponentity.state), "\n");
+       }
+}
+
+void W_Rifle_BulletHail(float mode, void(void) AttackFunc, float fr, float animtime, float refire)
+{
+       // if we get here, we have at least one bullet to fire
+       AttackFunc();
+       if(mode)
+       {
+               // continue hail
+               self.rifle_bullethail_attackfunc = AttackFunc;
+               self.rifle_bullethail_frame = fr;
+               self.rifle_bullethail_animtime = animtime;
+               self.rifle_bullethail_refire = refire;
+               weapon_thinkf(fr, animtime, W_Rifle_BulletHail_Continue);
+       }
+       else
+       {
+               // just one shot
+               weapon_thinkf(fr, animtime, w_ready);
+       }
+}
+
+.float bot_secondary_riflemooth;
+float w_rifle(float req)
+{
+       float ammo_amount;
+
+       if (req == WR_AIM)
+       {
+               self.BUTTON_ATCK=FALSE;
+               self.BUTTON_ATCK2=FALSE;
+               if(vlen(self.origin-self.enemy.origin) > 1000)
+                       self.bot_secondary_riflemooth = 0;
+               if(self.bot_secondary_riflemooth == 0)
+               {
+                       if(bot_aim(autocvar_g_balance_rifle_primary_speed, 0, autocvar_g_balance_rifle_primary_lifetime, FALSE))
+                       {
+                               self.BUTTON_ATCK = TRUE;
+                               if(random() < 0.01) self.bot_secondary_riflemooth = 1;
+                       }
+               }
+               else
+               {
+                       if(bot_aim(autocvar_g_balance_rifle_secondary_speed, 0, autocvar_g_balance_rifle_secondary_lifetime, FALSE))
+                       {
+                               self.BUTTON_ATCK2 = TRUE;
+                               if(random() < 0.03) self.bot_secondary_riflemooth = 0;
+                       }
+               }
+       }
+       else if (req == WR_THINK)
+       {
+               if(autocvar_g_balance_rifle_reload_ammo && self.clip_load < min(autocvar_g_balance_rifle_primary_ammo, autocvar_g_balance_rifle_secondary_ammo)) // forced reload
+            weapon_action(self.weapon, WR_RELOAD);
+               else
+               {
+                       self.rifle_accumulator = bound(time - autocvar_g_balance_rifle_bursttime, self.rifle_accumulator, time);
+                       if (self.BUTTON_ATCK)
+                       if (weapon_prepareattack_check(0, autocvar_g_balance_rifle_primary_refire))
+                       if (time >= self.rifle_accumulator + autocvar_g_balance_rifle_primary_burstcost)
+                       {
+                               weapon_prepareattack_do(0, autocvar_g_balance_rifle_primary_refire);
+                               W_Rifle_BulletHail(autocvar_g_balance_rifle_primary_bullethail, W_Rifle_Attack, WFRAME_FIRE1, autocvar_g_balance_rifle_primary_animtime, autocvar_g_balance_rifle_primary_refire);
+                               self.rifle_accumulator += autocvar_g_balance_rifle_primary_burstcost;
+                       }
+                       if (self.BUTTON_ATCK2)
+                       {
+                               if (autocvar_g_balance_rifle_secondary)
+                               {
+                    if(autocvar_g_balance_rifle_secondary_reload)
+                        weapon_action(self.weapon, WR_RELOAD);
+                    else
+                    {
+                        if (weapon_prepareattack_check(1, autocvar_g_balance_rifle_secondary_refire))
+                        if (time >= self.rifle_accumulator + autocvar_g_balance_rifle_secondary_burstcost)
+                        {
+                            weapon_prepareattack_do(1, autocvar_g_balance_rifle_secondary_refire);
+                            W_Rifle_BulletHail(autocvar_g_balance_rifle_secondary_bullethail, W_Rifle_Attack2, WFRAME_FIRE2, autocvar_g_balance_rifle_secondary_animtime, autocvar_g_balance_rifle_primary_refire);
+                            self.rifle_accumulator += autocvar_g_balance_rifle_secondary_burstcost;
+                        }
+                    }
+                               }
+                       }
+               }
+       }
+       else if (req == WR_PRECACHE)
+       {
+               precache_model ("models/weapons/g_campingrifle.md3");
+               precache_model ("models/weapons/v_campingrifle.md3");
+               precache_model ("models/weapons/h_campingrifle.iqm");
+               precache_sound ("weapons/campingrifle_fire.wav");
+               precache_sound ("weapons/campingrifle_fire2.wav");
+               //precache_sound ("weapons/reload.wav"); // until weapons have individual reload sounds, precache the reload sound somewhere else
+       }
+       else if (req == WR_SETUP)
+       {
+               weapon_setup(WEP_RIFLE);
+               self.current_ammo = ammo_nails;
+       }
+       else if (req == WR_CHECKAMMO1)
+       {
+               ammo_amount = self.ammo_nails >= autocvar_g_balance_rifle_primary_ammo;
+               ammo_amount += self.weapon_load[WEP_RIFLE] >= autocvar_g_balance_rifle_primary_ammo;
+               return ammo_amount;
+       }
+       else if (req == WR_CHECKAMMO2)
+       {
+               ammo_amount = self.ammo_nails >= autocvar_g_balance_rifle_secondary_ammo;
+               ammo_amount += self.weapon_load[WEP_RIFLE] >= autocvar_g_balance_rifle_secondary_ammo;
+               return ammo_amount;
+       }
+       else if (req == WR_RESETPLAYER)
+       {
+               self.rifle_accumulator = time - autocvar_g_balance_rifle_bursttime;
+       }
+       else if (req == WR_RELOAD)
+       {
+               W_Reload(min(autocvar_g_balance_rifle_primary_ammo, autocvar_g_balance_rifle_secondary_ammo), autocvar_g_balance_rifle_reload_ammo, autocvar_g_balance_rifle_reload_time, "weapons/reload.wav");
+       }
+       return TRUE;
+};
+#endif
+#ifdef CSQC
+float w_rifle(float req)
+{
+       if(req == WR_IMPACTEFFECT)
+       {
+               vector org2;
+               org2 = w_org + w_backoff * 2;
+               pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1);
+               if(!w_issilent)
+               {
+                       if(w_random < 0.2)
+                               sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+                       else if(w_random < 0.4)
+                               sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+                       else if(w_random < 0.5)
+                               sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+               }
+       }
+       else if(req == WR_PRECACHE)
+       {
+               precache_sound("weapons/ric1.wav");
+               precache_sound("weapons/ric2.wav");
+               precache_sound("weapons/ric3.wav");
+       }
+       else if (req == WR_SUICIDEMESSAGE)
+       {
+               if(w_deathtype & HITTYPE_SECONDARY)
+                       w_deathtypestring = _("%s shot themself automatically");
+               else
+                       w_deathtypestring = _("%s sniped themself somehow");
+       }
+       else if (req == WR_KILLMESSAGE)
+       {
+               if(w_deathtype & HITTYPE_SECONDARY)
+               {
+                       if(w_deathtype & HITTYPE_BOUNCE)
+                               w_deathtypestring = _("%s failed to hide from %s's bullet hail");
+                       else
+                               w_deathtypestring = _("%s died in %s's bullet hail");
+               }
+               else
+               {
+                       if(w_deathtype & HITTYPE_BOUNCE)
+                       {
+                               // TODO special headshot message here too?
+                               w_deathtypestring = _("%s failed to hide from %s's rifle");
+                       }
+                       else
+                       {
+                               if(w_deathtype & HITTYPE_HEADSHOT)
+                                       w_deathtypestring = _("%s got hit in the head by %s");
+                               else
+                                       w_deathtypestring = _("%s was sniped by %s");
+                       }
+               }
+       }
+       return TRUE;
+}
+#endif
+#endif
index dfd2c3f1906fcc514685883bc828286307fd0afa..b4987b69f9bcf62a9729c428d35009f1024a1953 100644 (file)
@@ -7,10 +7,10 @@ REGISTER_WEAPON(ROCKET_LAUNCHER, w_rlauncher, IT_ROCKETS, 9, WEP_FLAG_NORMAL | W
 
 void W_Rocket_Unregister()
 {
-       if(self.owner && self.owner.lastrocket == self)
+       if(self.realowner && self.realowner.lastrocket == self)
        {
-               self.owner.lastrocket = world;
-               // self.owner.rl_release = 1;
+               self.realowner.lastrocket = world;
+               // self.realowner.rl_release = 1;
        }
 }
 
@@ -20,22 +20,23 @@ void W_Rocket_Explode ()
 
        if(other.takedamage == DAMAGE_AIM)
                if(other.classname == "player")
-                       if(IsDifferentTeam(self.owner, other))
-                               if(IsFlying(other))
-                                       AnnounceTo(self.owner, "airshot");
+                       if(IsDifferentTeam(self.realowner, other))
+                               if(other.deadflag == DEAD_NO)
+                                       if(IsFlying(other))
+                                               AnnounceTo(self.realowner, "airshot");
 
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
 
-       RadiusDamage (self, self.owner, autocvar_g_balance_rocketlauncher_damage, autocvar_g_balance_rocketlauncher_edgedamage, autocvar_g_balance_rocketlauncher_radius, world, autocvar_g_balance_rocketlauncher_force, self.projectiledeathtype, other);
+       RadiusDamage (self, self.realowner, autocvar_g_balance_rocketlauncher_damage, autocvar_g_balance_rocketlauncher_edgedamage, autocvar_g_balance_rocketlauncher_radius, world, autocvar_g_balance_rocketlauncher_force, self.projectiledeathtype, other);
 
-       if (self.owner.weapon == WEP_ROCKET_LAUNCHER)
+       if (self.realowner.weapon == WEP_ROCKET_LAUNCHER)
        {
-               if(self.owner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
+               if(self.realowner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
                {
-                       self.owner.cnt = WEP_ROCKET_LAUNCHER;
-                       ATTACK_FINISHED(self.owner) = time;
-                       self.owner.switchweapon = w_getbestweapon(self.owner);
+                       self.realowner.cnt = WEP_ROCKET_LAUNCHER;
+                       ATTACK_FINISHED(self.realowner) = time;
+                       self.realowner.switchweapon = w_getbestweapon(self.realowner);
                }
        }
        remove (self);
@@ -48,15 +49,15 @@ void W_Rocket_DoRemoteExplode ()
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
 
-       RadiusDamage (self, self.owner, autocvar_g_balance_rocketlauncher_remote_damage, autocvar_g_balance_rocketlauncher_remote_edgedamage, autocvar_g_balance_rocketlauncher_remote_radius, world, autocvar_g_balance_rocketlauncher_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
+       RadiusDamage (self, self.realowner, autocvar_g_balance_rocketlauncher_remote_damage, autocvar_g_balance_rocketlauncher_remote_edgedamage, autocvar_g_balance_rocketlauncher_remote_radius, world, autocvar_g_balance_rocketlauncher_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
 
-       if (self.owner.weapon == WEP_ROCKET_LAUNCHER)
+       if (self.realowner.weapon == WEP_ROCKET_LAUNCHER)
        {
-               if(self.owner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
+               if(self.realowner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
                {
-                       self.owner.cnt = WEP_ROCKET_LAUNCHER;
-                       ATTACK_FINISHED(self.owner) = time;
-                       self.owner.switchweapon = w_getbestweapon(self.owner);
+                       self.realowner.cnt = WEP_ROCKET_LAUNCHER;
+                       ATTACK_FINISHED(self.realowner) = time;
+                       self.realowner.switchweapon = w_getbestweapon(self.realowner);
                }
        }
        remove (self);
@@ -109,19 +110,19 @@ entity FindLaserTarget(entity e, float dist_variance, float dot_variance)
                head = find(head, classname, "laser_target");
        }
 
-       //bprint(selected.owner.netname);
+       //bprint(selected.realowner.netname);
        //bprint("\n");
        return selected;
 }
 
 void W_Rocket_RemoteExplode()
 {
-       if(self.owner.deadflag == DEAD_NO)
-       if(self.owner.lastrocket)
+       if(self.realowner.deadflag == DEAD_NO)
+       if(self.realowner.lastrocket)
        {
                if((self.spawnshieldtime >= 0)
                        ? (time >= self.spawnshieldtime) // timer
-                       : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > autocvar_g_balance_rocketlauncher_remote_radius) // safety device
+                       : (vlen(NearestPointOnBox(self.realowner, self.origin) - self.origin) > autocvar_g_balance_rocketlauncher_remote_radius) // safety device
                )
                {
                        W_Rocket_DoRemoteExplode();
@@ -174,14 +175,14 @@ void W_Rocket_Think (void)
                self.velocity = self.velocity + v_forward * min(autocvar_g_balance_rocketlauncher_speedaccel * g_weaponspeedfactor * frametime, velspeed);
 
        // laser guided, or remote detonation
-       if (self.owner.weapon == WEP_ROCKET_LAUNCHER)
+       if (self.realowner.weapon == WEP_ROCKET_LAUNCHER)
        {
-               if(self == self.owner.lastrocket)
-               if not(self.owner.rl_release)
+               if(self == self.realowner.lastrocket)
+               if not(self.realowner.rl_release)
                if not(self.BUTTON_ATCK2)
                if(autocvar_g_balance_rocketlauncher_guiderate)
                if(time > self.pushltime)
-               if(self.owner.deadflag == DEAD_NO)
+               if(self.realowner.deadflag == DEAD_NO)
                {
                        f = autocvar_g_balance_rocketlauncher_guideratedelay;
                        if(f)
@@ -191,9 +192,9 @@ void W_Rocket_Think (void)
 
                        velspeed = vlen(self.velocity);
 
-                       makevectors(self.owner.v_angle);
-                       desireddir = WarpZone_RefSys_TransformVelocity(self.owner, self, v_forward);
-                       desiredorigin = WarpZone_RefSys_TransformOrigin(self.owner, self, self.owner.origin + self.owner.view_ofs);
+                       makevectors(self.realowner.v_angle);
+                       desireddir = WarpZone_RefSys_TransformVelocity(self.realowner, self, v_forward);
+                       desiredorigin = WarpZone_RefSys_TransformOrigin(self.realowner, self, self.realowner.origin + self.realowner.view_ofs);
                        olddir = normalize(self.velocity);
 
                        // now it gets tricky... we want to move like some curve to approximate the target direction
@@ -208,7 +209,7 @@ void W_Rocket_Think (void)
                        {
                                pointparticles(particleeffectnum("rocket_guide"), self.origin, self.velocity, 1);
                                // TODO add a better sound here
-                               sound (self.owner, CHAN_WEAPON2, "weapons/rocket_mode.wav", VOL_BASE, ATTN_NORM);
+                               sound (self.realowner, CH_WEAPON_B, "weapons/rocket_mode.wav", VOL_BASE, ATTN_NORM);
                                self.count = 1;
                        }
                }
@@ -250,11 +251,11 @@ void W_Rocket_Attack (void)
 
        W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_rocketlauncher_ammo, autocvar_g_balance_rocketlauncher_reload_ammo);
 
-       W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 5, "weapons/rocket_fire.wav", CHAN_WEAPON, autocvar_g_balance_rocketlauncher_damage);
+       W_SetupShot_ProjectileSize (self, '-3 -3 -3', '3 3 3', FALSE, 5, "weapons/rocket_fire.wav", CH_WEAPON_A, autocvar_g_balance_rocketlauncher_damage);
        pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        missile = WarpZone_RefSys_SpawnSameRefSys(self);
-       missile.owner = self;
+       missile.owner = missile.realowner = self;
        self.lastrocket = missile;
        if(autocvar_g_balance_rocketlauncher_detonatedelay >= 0)
                missile.spawnshieldtime = time + autocvar_g_balance_rocketlauncher_detonatedelay;
@@ -327,7 +328,7 @@ float w_rlauncher(float req)
                        missile = find(world, classname, "rocket");
                        while (missile)
                        {
-                               if (missile.owner != self)
+                               if (missile.realowner != self)
                                {
                                        missile = find(missile, classname, "rocket");
                                        continue;
@@ -340,7 +341,7 @@ float w_rlauncher(float req)
                                        // count potential damage according to type of target
                                        if (targ == self)
                                                selfdamage = selfdamage + d;
-                                       else if (targ.team == self.team && teams_matter)
+                                       else if (targ.team == self.team && teamplay)
                                                teamdamage = teamdamage + d;
                                        else if (bot_shouldattack(targ))
                                                enemydamage = enemydamage + d;
@@ -352,13 +353,13 @@ float w_rlauncher(float req)
                        desirabledamage = enemydamage;
                        if (time > self.invincible_finished && time > self.spawnshieldtime)
                                desirabledamage = desirabledamage - selfdamage * autocvar_g_balance_selfdamagepercent;
-                       if (teams_matter && self.team)
+                       if (teamplay && self.team)
                                desirabledamage = desirabledamage - teamdamage;
 
                        missile = find(world, classname, "rocket");
                        while (missile)
                        {
-                               if (missile.owner != self)
+                               if (missile.realowner != self)
                                {
                                        missile = find(missile, classname, "rocket");
                                        continue;
@@ -423,7 +424,7 @@ float w_rlauncher(float req)
                        if (self.BUTTON_ATCK2)
                        {
                                rockfound = 0;
-                               for(rock = world; (rock = find(rock, classname, "rocket")); ) if(rock.owner == self)
+                               for(rock = world; (rock = find(rock, classname, "rocket")); ) if(rock.realowner == self)
                                {
                                        if(!rock.rl_detonate_later)
                                        {
@@ -432,7 +433,7 @@ float w_rlauncher(float req)
                                        }
                                }
                                if(rockfound)
-                                       sound (self, CHAN_WEAPON2, "weapons/rocket_det.wav", VOL_BASE, ATTN_NORM);
+                                       sound (self, CH_WEAPON_B, "weapons/rocket_det.wav", VOL_BASE, ATTN_NORM);
                        }
                }
        }
@@ -490,7 +491,7 @@ float w_rlauncher(float req)
                org2 = w_org + w_backoff * 12;
                pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
                if(!w_issilent)
-                       sound(self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+                       sound(self, CH_SHOTS, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
        }
        else if(req == WR_PRECACHE)
        {
index a4f4383227506ecc0c0d7bb0100fd39c70c7a506..11423cdf9ca9f0fe098ac596fde5d253c76c7992 100644 (file)
@@ -13,7 +13,7 @@ REGISTER_WEAPON(SEEKER, w_seeker, IT_ROCKETS, 8, WEP_FLAG_RELOADABLE | WEP_TYPE_
 void Seeker_Missile_Explode ()
 {
        self.event_damage = SUB_Null;
-       RadiusDamage (self, self.owner, autocvar_g_balance_seeker_missile_damage, autocvar_g_balance_seeker_missile_edgedamage, autocvar_g_balance_seeker_missile_radius, world, autocvar_g_balance_seeker_missile_force, self.projectiledeathtype, other);
+       RadiusDamage (self, self.realowner, autocvar_g_balance_seeker_missile_damage, autocvar_g_balance_seeker_missile_edgedamage, autocvar_g_balance_seeker_missile_radius, world, autocvar_g_balance_seeker_missile_force, self.projectiledeathtype, other);
 
        remove (self);
 }
@@ -125,7 +125,7 @@ void Seeker_Missile_Damage (entity inflictor, entity attacker, float damage, flo
        if (self.health <= 0)
                return;
 
-       if (self.owner == attacker)
+       if (self.realowner == attacker)
                self.health = self.health - (damage * 0.25);
        else
                self.health = self.health - damage;
@@ -166,14 +166,14 @@ void Seeker_Fire_Missile(vector f_diff, entity m_target)
        W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_seeker_missile_ammo, autocvar_g_balance_seeker_reload_ammo);
 
        makevectors(self.v_angle);
-       W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/seeker_fire.wav", CHAN_WEAPON, 0);
+       W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/seeker_fire.wav", CH_WEAPON_A, 0);
        w_shotorg += f_diff;
        pointparticles(particleeffectnum("seeker_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        //self.detornator         = FALSE;
 
        missile                 = spawn();
-       missile.owner           = self;
+       missile.owner           = missile.realowner = self;
        missile.classname       = "seeker_missile";
        missile.bot_dodge       = TRUE;
        missile.bot_dodgerating = autocvar_g_balance_seeker_missile_damage;
@@ -217,7 +217,7 @@ void Seeker_Flac_Explode ()
 {
        self.event_damage = SUB_Null;
 
-       RadiusDamage (self, self.owner, autocvar_g_balance_seeker_flac_damage, autocvar_g_balance_seeker_flac_edgedamage, autocvar_g_balance_seeker_flac_radius, world, autocvar_g_balance_seeker_flac_force, self.projectiledeathtype, other);
+       RadiusDamage (self, self.realowner, autocvar_g_balance_seeker_flac_damage, autocvar_g_balance_seeker_flac_edgedamage, autocvar_g_balance_seeker_flac_radius, world, autocvar_g_balance_seeker_flac_force, self.projectiledeathtype, other);
 
        remove (self);
 }
@@ -254,7 +254,7 @@ void Seeker_Fire_Flac()
                        f_diff = '+1.25 +3.75 0';
                        break;
        }
-       W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/flac_fire.wav", CHAN_WEAPON, autocvar_g_balance_seeker_flac_damage);
+       W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/flac_fire.wav", CH_WEAPON_A, autocvar_g_balance_seeker_flac_damage);
        w_shotorg += f_diff;
 
        pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
@@ -294,7 +294,7 @@ entity Seeker_Tagged_Info(entity isowner, entity istarget)
 {
        entity tag;
        for(tag = world; (tag = find(tag, classname, "tag_tracker")); ) 
-               if ((tag.owner == isowner) && (tag.tag_target == istarget))
+               if ((tag.realowner == isowner) && (tag.tag_target == istarget))
                        return tag;
                
        return world;
@@ -304,7 +304,7 @@ void Seeker_Attack()
 {
        entity tracker, closest_target;
        
-       for(tracker = world; (tracker = find(tracker, classname, "tag_tracker")); ) if (tracker.owner == self)
+       for(tracker = world; (tracker = find(tracker, classname, "tag_tracker")); ) if (tracker.realowner == self)
        {
                if (closest_target)
                {
@@ -328,7 +328,7 @@ void Seeker_Vollycontroller_Think() // TODO: Merge this with Seeker_Attack
        entity oldself,oldenemy;
        self.cnt = self.cnt - 1;
 
-       if((!(self.owner.items & IT_UNLIMITED_AMMO) && self.owner.ammo_rockets < autocvar_g_balance_seeker_missile_ammo) || (self.cnt <= -1) || (self.owner.deadflag != DEAD_NO) || (self.owner.switchweapon != WEP_SEEKER))
+       if((!(self.realowner.items & IT_UNLIMITED_AMMO) && self.realowner.ammo_rockets < autocvar_g_balance_seeker_missile_ammo) || (self.cnt <= -1) || (self.realowner.deadflag != DEAD_NO) || (self.realowner.switchweapon != WEP_SEEKER))
        {
                remove(self);
                return;
@@ -337,7 +337,7 @@ void Seeker_Vollycontroller_Think() // TODO: Merge this with Seeker_Attack
        self.nextthink = time + autocvar_g_balance_seeker_missile_delay;
        
        oldself = self;
-       self = self.owner;
+       self = self.realowner;
        
        oldenemy = self.enemy;
        self.enemy = oldself.enemy;
@@ -367,7 +367,7 @@ void Seeker_Vollycontroller_Think() // TODO: Merge this with Seeker_Attack
 void Seeker_Tracker_Think() 
 {
        // commit suicide if: You die OR target dies OR you switch away from the seeker OR commit suicide if lifetime is up
-       if ((self.owner.deadflag != DEAD_NO) || (self.tag_target.deadflag != DEAD_NO) || (self.owner.switchweapon != WEP_SEEKER)
+       if ((self.realowner.deadflag != DEAD_NO) || (self.tag_target.deadflag != DEAD_NO) || (self.realowner.switchweapon != WEP_SEEKER)
        || (time > self.tag_time + autocvar_g_balance_seeker_tag_tracker_lifetime))
        {
                if (self)
@@ -387,7 +387,7 @@ void Seeker_Tracker_Think()
 // ============================
 void Seeker_Tag_Explode ()
 {
-       //if(other==self.owner)
+       //if(other==self.realowner)
        //    return;
        Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_BOUNCE, self);
 
@@ -409,7 +409,7 @@ void Seeker_Tag_Touch()
        vector org2;
        entity e;
        
-       dir     = normalize (self.owner.origin - self.origin);
+       dir     = normalize (self.realowner.origin - self.origin);
        org2    = findbetterlocation (self.origin, 8);
 
        te_knightspike(org2);
@@ -420,7 +420,7 @@ void Seeker_Tag_Touch()
        if (other.takedamage == DAMAGE_AIM && other.deadflag == DEAD_NO)
        {
                // check to see if this person is already tagged by me
-               entity tag = Seeker_Tagged_Info(self.owner, other);
+               entity tag = Seeker_Tagged_Info(self.realowner, other);
                
                if (tag != world)
                {
@@ -431,11 +431,12 @@ void Seeker_Tag_Touch()
                }
                else
                {               
-                       //sprint(self.owner, strcat("You just tagged ^2", other.netname, "^7 with a tracking device!\n"));
+                       //sprint(self.realowner, strcat("You just tagged ^2", other.netname, "^7 with a tracking device!\n"));
                        e             = spawn();
                        e.cnt         = autocvar_g_balance_seeker_missile_count;
                        e.classname   = "tag_tracker";
                        e.owner       = self.owner;
+                       e.realowner   = self.realowner;
                        
                        if      (autocvar_g_balance_seeker_type == 1)
                        {
@@ -454,7 +455,7 @@ void Seeker_Tag_Touch()
                
                if      (autocvar_g_balance_seeker_type == 1)
                {
-                       WaypointSprite_Spawn("tagged-target", autocvar_g_balance_seeker_tag_tracker_lifetime, 0, other, '0 0 64', self.owner, 0, other, wps_tag_tracker, TRUE);
+                       WaypointSprite_Spawn("tagged-target", autocvar_g_balance_seeker_tag_tracker_lifetime, 0, other, '0 0 64', self.realowner, 0, other, wps_tag_tracker, TRUE, RADARICON_TAGGED, '0.5 1 0');
                        WaypointSprite_UpdateRule(other.wps_tag_tracker, 0, SPRITERULE_DEFAULT);
                }
        }
@@ -468,10 +469,10 @@ void Seeker_Fire_Tag()
        local entity missile;
        W_DecreaseAmmo(ammo_rockets, autocvar_g_balance_seeker_tag_ammo, autocvar_g_balance_seeker_reload_ammo);
 
-       W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/tag_fire.wav", CHAN_WEAPON, autocvar_g_balance_seeker_missile_damage * autocvar_g_balance_seeker_missile_count);
+       W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/tag_fire.wav", CH_WEAPON_A, autocvar_g_balance_seeker_missile_damage * autocvar_g_balance_seeker_missile_count);
 
        missile                 = spawn();
-       missile.owner           = self;
+       missile.owner           = missile.realowner = self;
        missile.classname       = "seeker_tag";
        missile.bot_dodge       = TRUE;
        missile.bot_dodgerating = 50;
@@ -480,7 +481,6 @@ void Seeker_Fire_Tag()
        missile.nextthink       = time + autocvar_g_balance_seeker_tag_lifetime;
        missile.movetype        = MOVETYPE_FLY;
        missile.solid           = SOLID_BBOX;
-       missile.owner           = self;
 
        missile.takedamage       = DAMAGE_YES;
        missile.event_damage    = Seeker_Tag_Explode;
@@ -615,17 +615,17 @@ float w_seeker(float req)
                        if(!w_issilent)
                        {
                                if (w_random<0.15)
-                                       sound(self, CHAN_PROJECTILE, "weapons/tagexp1.wav", 1, ATTN_NORM);
+                                       sound(self, CH_SHOTS, "weapons/tagexp1.wav", 1, ATTN_NORM);
                                else if (w_random<0.7)
-                                       sound(self, CHAN_PROJECTILE, "weapons/tagexp2.wav", 1, ATTN_NORM);
+                                       sound(self, CH_SHOTS, "weapons/tagexp2.wav", 1, ATTN_NORM);
                                else
-                                       sound(self, CHAN_PROJECTILE, "weapons/tagexp3.wav", 1, ATTN_NORM);
+                                       sound(self, CH_SHOTS, "weapons/tagexp3.wav", 1, ATTN_NORM);
                        }
                }
                else if(w_deathtype & HITTYPE_HEADSHOT)
                {
                        if(!w_issilent)
-                               sound(self, CHAN_PROJECTILE, "weapons/tag_impact.wav", 1, ATTN_NORM);
+                               sound(self, CH_SHOTS, "weapons/tag_impact.wav", 1, ATTN_NORM);
                }
                else
                {
@@ -633,11 +633,11 @@ float w_seeker(float req)
                        if(!w_issilent)
                        {
                                if (w_random<0.15)
-                                       sound(self, CHAN_PROJECTILE, "weapons/seekerexp1.wav", 1, ATTN_NORM);
+                                       sound(self, CH_SHOTS, "weapons/seekerexp1.wav", 1, ATTN_NORM);
                                else if (w_random<0.7)
-                                       sound(self, CHAN_PROJECTILE, "weapons/seekerexp2.wav", 1, ATTN_NORM);
+                                       sound(self, CH_SHOTS, "weapons/seekerexp2.wav", 1, ATTN_NORM);
                                else
-                                       sound(self, CHAN_PROJECTILE, "weapons/seekerexp3.wav", 1, ATTN_NORM);
+                                       sound(self, CH_SHOTS, "weapons/seekerexp3.wav", 1, ATTN_NORM);
                        }
                }
        }
index 635b1ccf8b959ac753e4f06ef493605e9049b973..9d80ff4a7b88c2318c78e7468b4ce816d108e32f 100644 (file)
@@ -25,7 +25,7 @@ void W_Shotgun_Attack (void)
 
        W_DecreaseAmmo(ammo_shells, ammoamount, autocvar_g_balance_shotgun_reload_ammo);
 
-       W_SetupShot (self, autocvar_g_antilag_bullets && bulletspeed >= autocvar_g_antilag_bullets, 5, "weapons/shotgun_fire.wav", CHAN_WEAPON, d * bullets);
+       W_SetupShot (self, autocvar_g_antilag_bullets && bulletspeed >= autocvar_g_antilag_bullets, 5, "weapons/shotgun_fire.wav", CH_WEAPON_A, d * bullets);
        for (sc = 0;sc < bullets;sc = sc + 1)
                fireBallisticBullet(w_shotorg, w_shotdir, spread, bulletspeed, 5, d, 0, f, WEP_SHOTGUN, 0, 1, bulletconstant);
        endFireBallisticBullet();
@@ -46,13 +46,14 @@ void W_Shotgun_Attack (void)
        W_AttachToShotorg(flash, '5 0 0');
 }
 
+entity lgbeam_owner_ent;
 void shotgun_meleethink (void)
 {
        // store time when we started swinging down inside self.cnt
        if(!self.cnt)
                self.cnt = time;
 
-       makevectors(self.owner.v_angle);
+       makevectors(self.realowner.v_angle);
        vector angle;
        angle = v_forward;
 
@@ -63,21 +64,26 @@ void shotgun_meleethink (void)
        float f;
        f = (self.cnt + meleetime - time) / meleetime * 2 - 1;
        vector targpos;
-       targpos = self.owner.origin + self.owner.view_ofs + angle * autocvar_g_balance_shotgun_secondary_melee_range + v_right * f * autocvar_g_balance_shotgun_secondary_melee_swing + v_up * f * autocvar_g_balance_shotgun_secondary_melee_swing;
+       targpos = self.realowner.origin + self.realowner.view_ofs + angle * autocvar_g_balance_shotgun_secondary_melee_range + v_right * f * autocvar_g_balance_shotgun_secondary_melee_swing + v_up * f * autocvar_g_balance_shotgun_secondary_melee_swing;
 
-       WarpZone_traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, targpos, FALSE, self.owner, ANTILAG_LATENCY(self.owner));
+       if(!lgbeam_owner_ent)
+       {
+               lgbeam_owner_ent = spawn();
+               lgbeam_owner_ent.classname = "lgbeam_owner_ent";
+       }
+       WarpZone_traceline_antilag(lgbeam_owner_ent, self.realowner.origin + self.realowner.view_ofs, targpos, FALSE, lgbeam_owner_ent, ANTILAG_LATENCY(self.realowner));
 
        // apply the damage, also remove self
        if(trace_fraction < 1 && trace_ent.takedamage == DAMAGE_AIM && (trace_ent.classname == "player" || trace_ent.classname == "body"))
        {
                vector force;
                force = angle * autocvar_g_balance_shotgun_secondary_force;
-               if(accuracy_isgooddamage(self.owner, trace_ent))
-                       accuracy_add(self.owner, WEP_SHOTGUN, 0, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1));
-               Damage (trace_ent, self.owner, self.owner, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1), WEP_SHOTGUN | HITTYPE_SECONDARY , self.owner.origin + self.owner.view_ofs, force);
+               if(accuracy_isgooddamage(self.realowner, trace_ent))
+                       accuracy_add(self.realowner, WEP_SHOTGUN, 0, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1));
+               Damage (trace_ent, self.realowner, self.realowner, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1), WEP_SHOTGUN | HITTYPE_SECONDARY , self.realowner.origin + self.realowner.view_ofs, force);
                remove(self);
        }
-       else if(time >= self.cnt + meleetime || (self.owner.deadflag != DEAD_NO && autocvar_g_balance_shotgun_secondary_melee_no_doubleslap)) // missed or owner died, remove ent
+       else if(time >= self.cnt + meleetime || (self.realowner.deadflag != DEAD_NO && autocvar_g_balance_shotgun_secondary_melee_no_doubleslap)) // missed or owner died, remove ent
                remove(self);
        else // continue swinging the weapon in hope of hitting someone :)
                self.nextthink = time;
@@ -85,12 +91,12 @@ void shotgun_meleethink (void)
 
 void W_Shotgun_Attack2 (void)
 {
-       sound (self, CHAN_PROJECTILE, "weapons/shotgun_melee.wav", VOL_BASE, ATTN_NORM);
+       sound (self, CH_SHOTS, "weapons/shotgun_melee.wav", VOL_BASE, ATTN_NORM);
        weapon_thinkf(WFRAME_FIRE2, autocvar_g_balance_shotgun_secondary_animtime, w_ready);
 
        entity meleetemp;
        meleetemp = spawn();
-       meleetemp.owner = self;
+       meleetemp.owner = meleetemp.realowner = self;
        meleetemp.think = shotgun_meleethink;
        meleetemp.nextthink = time + autocvar_g_balance_shotgun_secondary_melee_delay;
        W_SetupShot_Range(self, TRUE, 0, "", 0, autocvar_g_balance_shotgun_secondary_damage, autocvar_g_balance_shotgun_secondary_melee_range);
@@ -107,7 +113,13 @@ float w_shotgun(float req)
                if(vlen(self.origin-self.enemy.origin) <= autocvar_g_balance_shotgun_secondary_melee_range)
                        self.BUTTON_ATCK2 = bot_aim(1000000, 0, 0.001, FALSE);
                else
-                       self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
+               {
+                       if(autocvar_g_antilag_bullets)
+                               self.BUTTON_ATCK = bot_aim(1000000, 0, 0.001, FALSE);
+                       else
+                               self.BUTTON_ATCK = bot_aim(autocvar_g_balance_shotgun_primary_speed, 0, 0.001, FALSE);
+               }
+
        else if (req == WR_THINK)
        {
                if(autocvar_g_balance_shotgun_reload_ammo && self.clip_load < autocvar_g_balance_shotgun_primary_ammo) // forced reload
@@ -185,11 +197,11 @@ float w_shotgun(float req)
                if(!w_issilent && time - self.prevric > 0.25)
                {
                        if(w_random < 0.0165)
-                               sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
                        else if(w_random < 0.033)
-                               sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
                        else if(w_random < 0.05)
-                               sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
                        self.prevric = time;
                }
        }
@@ -200,7 +212,7 @@ float w_shotgun(float req)
                precache_sound("weapons/ric3.wav");
        }
        else if (req == WR_SUICIDEMESSAGE)
-               w_deathtypestring = _("%s did the impossible");
+               w_deathtypestring = _("%s is now thinking with portals");
        else if (req == WR_KILLMESSAGE)
        {
                if(w_deathtype & HITTYPE_SECONDARY)
diff --git a/qcsrc/server/w_sniperrifle.qc b/qcsrc/server/w_sniperrifle.qc
deleted file mode 100644 (file)
index 55f7896..0000000
+++ /dev/null
@@ -1,261 +0,0 @@
-#ifdef REGISTER_WEAPON
-REGISTER_WEAPON(SNIPERRIFLE, w_sniperrifle, IT_NAILS, 7, WEP_FLAG_NORMAL | WEP_FLAG_RELOADABLE | WEP_TYPE_HITSCAN, BOT_PICKUP_RATING_MID, "campingrifle", "sniperrifle", _("Sniper Rifle"))
-#else
-#ifdef SVQC
-
-.float sniperrifle_accumulator;
-
-void W_SniperRifle_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant, float pTracer, float pShots, string pSound)
-{
-       float i;
-
-       W_DecreaseAmmo(ammo_nails, pAmmo, autocvar_g_balance_sniperrifle_reload_ammo);
-
-       W_SetupShot (self, autocvar_g_antilag_bullets && pSpeed >= autocvar_g_antilag_bullets, 2, pSound, CHAN_WEAPON, (pDamage + pHeadshotAddedDamage) * pShots);
-
-       pointparticles(particleeffectnum("sniperrifle_muzzleflash"), w_shotorg, w_shotdir * 2000, 1);
-
-       if(self.BUTTON_ZOOM | self.BUTTON_ZOOMSCRIPT) // if zoomed, shoot from the eye
-       {
-               w_shotdir = v_forward;
-               w_shotorg = self.origin + self.view_ofs + ((w_shotorg - self.origin - self.view_ofs) * v_forward) * v_forward;
-       }
-
-       for(i = 0; i < pShots; ++i)
-               fireBallisticBullet(w_shotorg, w_shotdir, pSpread, pSpeed, pLifetime, pDamage, pHeadshotAddedDamage / pDamage, pForce, deathtype, (pTracer ? EF_RED : EF_BLUE), 1, pBulletConstant);
-       endFireBallisticBullet();
-
-       if (autocvar_g_casings >= 2)
-               SpawnCasing (((random () * 50 + 50) * v_right) - (v_forward * (random () * 25 + 25)) - ((random () * 5 - 70) * v_up), 2, vectoangles(v_forward),'0 250 0', 100, 3, self);
-}
-
-void W_SniperRifle_Attack()
-{
-       W_SniperRifle_FireBullet(autocvar_g_balance_sniperrifle_primary_spread, autocvar_g_balance_sniperrifle_primary_damage, autocvar_g_balance_sniperrifle_primary_headshotaddeddamage, autocvar_g_balance_sniperrifle_primary_force, autocvar_g_balance_sniperrifle_primary_speed, autocvar_g_balance_sniperrifle_primary_lifetime, autocvar_g_balance_sniperrifle_primary_ammo, WEP_SNIPERRIFLE, autocvar_g_balance_sniperrifle_primary_bulletconstant, autocvar_g_balance_sniperrifle_primary_tracer, autocvar_g_balance_sniperrifle_primary_shots, "weapons/campingrifle_fire.wav");
-}
-
-void W_SniperRifle_Attack2()
-{
-       W_SniperRifle_FireBullet(autocvar_g_balance_sniperrifle_secondary_spread, autocvar_g_balance_sniperrifle_secondary_damage, autocvar_g_balance_sniperrifle_secondary_headshotaddeddamage, autocvar_g_balance_sniperrifle_secondary_force, autocvar_g_balance_sniperrifle_secondary_speed, autocvar_g_balance_sniperrifle_secondary_lifetime, autocvar_g_balance_sniperrifle_secondary_ammo, WEP_SNIPERRIFLE | HITTYPE_SECONDARY, autocvar_g_balance_sniperrifle_secondary_bulletconstant, autocvar_g_balance_sniperrifle_secondary_tracer, autocvar_g_balance_sniperrifle_secondary_shots, "weapons/campingrifle_fire2.wav");
-}
-
-void spawnfunc_weapon_sniperrifle (void)
-{
-       weapon_defaultspawnfunc(WEP_SNIPERRIFLE);
-}
-
-// compatibility alias
-void spawnfunc_weapon_campingrifle (void)
-{
-       spawnfunc_weapon_sniperrifle();
-}
-
-.void(void) sniperrifle_bullethail_attackfunc;
-.float sniperrifle_bullethail_frame;
-.float sniperrifle_bullethail_animtime;
-.float sniperrifle_bullethail_refire;
-void W_SniperRifle_BulletHail_Continue()
-{
-       float r, sw, af;
-
-       sw = self.switchweapon; // make it not detect weapon changes as reason to abort firing
-       af = ATTACK_FINISHED(self);
-       self.switchweapon = self.weapon;
-       ATTACK_FINISHED(self) = time;
-       print(ftos(self.ammo_nails), "\n");
-       r = weapon_prepareattack(self.sniperrifle_bullethail_frame == WFRAME_FIRE2, self.sniperrifle_bullethail_refire);
-       if(self.switchweapon == self.weapon)
-               self.switchweapon = sw;
-       if(r)
-       {
-               self.sniperrifle_bullethail_attackfunc();
-               weapon_thinkf(self.sniperrifle_bullethail_frame, self.sniperrifle_bullethail_animtime, W_SniperRifle_BulletHail_Continue);
-               print("thinkf set\n");
-       }
-       else
-       {
-               ATTACK_FINISHED(self) = af; // reset attack_finished if we didn't fire, so the last shot enforces the refire time
-               print("out of ammo... ", ftos(self.weaponentity.state), "\n");
-       }
-}
-
-void W_SniperRifle_BulletHail(float mode, void(void) AttackFunc, float fr, float animtime, float refire)
-{
-       // if we get here, we have at least one bullet to fire
-       AttackFunc();
-       if(mode)
-       {
-               // continue hail
-               self.sniperrifle_bullethail_attackfunc = AttackFunc;
-               self.sniperrifle_bullethail_frame = fr;
-               self.sniperrifle_bullethail_animtime = animtime;
-               self.sniperrifle_bullethail_refire = refire;
-               weapon_thinkf(fr, animtime, W_SniperRifle_BulletHail_Continue);
-       }
-       else
-       {
-               // just one shot
-               weapon_thinkf(fr, animtime, w_ready);
-       }
-}
-
-.float bot_secondary_sniperriflemooth;
-float w_sniperrifle(float req)
-{
-       float ammo_amount;
-
-       if (req == WR_AIM)
-       {
-               self.BUTTON_ATCK=FALSE;
-               self.BUTTON_ATCK2=FALSE;
-               if(vlen(self.origin-self.enemy.origin) > 1000)
-                       self.bot_secondary_sniperriflemooth = 0;
-               if(self.bot_secondary_sniperriflemooth == 0)
-               {
-                       if(bot_aim(autocvar_g_balance_sniperrifle_primary_speed, 0, autocvar_g_balance_sniperrifle_primary_lifetime, TRUE))
-                       {
-                               self.BUTTON_ATCK = TRUE;
-                               if(random() < 0.01) self.bot_secondary_sniperriflemooth = 1;
-                       }
-               }
-               else
-               {
-                       if(bot_aim(autocvar_g_balance_sniperrifle_secondary_speed, 0, autocvar_g_balance_sniperrifle_secondary_lifetime, TRUE))
-                       {
-                               self.BUTTON_ATCK2 = TRUE;
-                               if(random() < 0.03) self.bot_secondary_sniperriflemooth = 0;
-                       }
-               }
-       }
-       else if (req == WR_THINK)
-       {
-               if(autocvar_g_balance_sniperrifle_reload_ammo && self.clip_load < min(autocvar_g_balance_sniperrifle_primary_ammo, autocvar_g_balance_sniperrifle_secondary_ammo)) // forced reload
-            weapon_action(self.weapon, WR_RELOAD);
-               else
-               {
-                       self.sniperrifle_accumulator = bound(time - autocvar_g_balance_sniperrifle_bursttime, self.sniperrifle_accumulator, time);
-                       if (self.BUTTON_ATCK)
-                       if (weapon_prepareattack_check(0, autocvar_g_balance_sniperrifle_primary_refire))
-                       if (time >= self.sniperrifle_accumulator + autocvar_g_balance_sniperrifle_primary_burstcost)
-                       {
-                               weapon_prepareattack_do(0, autocvar_g_balance_sniperrifle_primary_refire);
-                               W_SniperRifle_BulletHail(autocvar_g_balance_sniperrifle_primary_bullethail, W_SniperRifle_Attack, WFRAME_FIRE1, autocvar_g_balance_sniperrifle_primary_animtime, autocvar_g_balance_sniperrifle_primary_refire);
-                               self.sniperrifle_accumulator += autocvar_g_balance_sniperrifle_primary_burstcost;
-                       }
-                       if (self.BUTTON_ATCK2)
-                       {       
-                               if (autocvar_g_balance_sniperrifle_secondary)
-                               {
-                    if(autocvar_g_balance_sniperrifle_secondary_reload)
-                        weapon_action(self.weapon, WR_RELOAD);
-                    else
-                    {
-                        if (weapon_prepareattack_check(1, autocvar_g_balance_sniperrifle_secondary_refire))
-                        if (time >= self.sniperrifle_accumulator + autocvar_g_balance_sniperrifle_secondary_burstcost)
-                        {
-                            weapon_prepareattack_do(1, autocvar_g_balance_sniperrifle_secondary_refire);
-                            W_SniperRifle_BulletHail(autocvar_g_balance_sniperrifle_secondary_bullethail, W_SniperRifle_Attack2, WFRAME_FIRE2, autocvar_g_balance_sniperrifle_secondary_animtime, autocvar_g_balance_sniperrifle_primary_refire);
-                            self.sniperrifle_accumulator += autocvar_g_balance_sniperrifle_secondary_burstcost;
-                        }
-                    }
-                               }
-                       }
-               }
-       }
-       else if (req == WR_PRECACHE)
-       {
-               precache_model ("models/weapons/g_campingrifle.md3");
-               precache_model ("models/weapons/v_campingrifle.md3");
-               precache_model ("models/weapons/h_campingrifle.iqm");
-               precache_sound ("weapons/campingrifle_fire.wav");
-               precache_sound ("weapons/campingrifle_fire2.wav");
-               //precache_sound ("weapons/reload.wav"); // until weapons have individual reload sounds, precache the reload sound somewhere else
-       }
-       else if (req == WR_SETUP)
-       {
-               weapon_setup(WEP_SNIPERRIFLE);
-               self.current_ammo = ammo_nails;
-       }
-       else if (req == WR_CHECKAMMO1)
-       {
-               ammo_amount = self.ammo_nails >= autocvar_g_balance_sniperrifle_primary_ammo;
-               ammo_amount += self.weapon_load[WEP_SNIPERRIFLE] >= autocvar_g_balance_sniperrifle_primary_ammo;
-               return ammo_amount;
-       }
-       else if (req == WR_CHECKAMMO2)
-       {
-               ammo_amount = self.ammo_nails >= autocvar_g_balance_sniperrifle_secondary_ammo;
-               ammo_amount += self.weapon_load[WEP_SNIPERRIFLE] >= autocvar_g_balance_sniperrifle_secondary_ammo;
-               return ammo_amount;
-       }
-       else if (req == WR_RESETPLAYER)
-       {
-               self.sniperrifle_accumulator = time - autocvar_g_balance_sniperrifle_bursttime;
-       }
-       else if (req == WR_RELOAD)
-       {
-               W_Reload(min(autocvar_g_balance_sniperrifle_primary_ammo, autocvar_g_balance_sniperrifle_secondary_ammo), autocvar_g_balance_sniperrifle_reload_ammo, autocvar_g_balance_sniperrifle_reload_time, "weapons/reload.wav");
-       }
-       return TRUE;
-};
-#endif
-#ifdef CSQC
-float w_sniperrifle(float req)
-{
-       if(req == WR_IMPACTEFFECT)
-       {
-               vector org2;
-               org2 = w_org + w_backoff * 2;
-               pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1);
-               if(!w_issilent)
-               {
-                       if(w_random < 0.2)
-                               sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
-                       else if(w_random < 0.4)
-                               sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
-                       else if(w_random < 0.5)
-                               sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
-               }
-       }
-       else if(req == WR_PRECACHE)
-       {
-               precache_sound("weapons/ric1.wav");
-               precache_sound("weapons/ric2.wav");
-               precache_sound("weapons/ric3.wav");
-       }
-       else if (req == WR_SUICIDEMESSAGE)
-       {
-               if(w_deathtype & HITTYPE_SECONDARY)
-                       w_deathtypestring = _("%s shot themself automatically");
-               else
-                       w_deathtypestring = _("%s sniped themself somehow");
-       }
-       else if (req == WR_KILLMESSAGE)
-       {
-               if(w_deathtype & HITTYPE_SECONDARY)
-               {
-                       if(w_deathtype & HITTYPE_BOUNCE)
-                               w_deathtypestring = _("%s failed to hide from %s's bullet hail");
-                       else
-                               w_deathtypestring = _("%s died in %s's bullet hail");
-               }
-               else
-               {
-                       if(w_deathtype & HITTYPE_BOUNCE)
-                       {
-                               // TODO special headshot message here too?
-                               w_deathtypestring = _("%s failed to hide from %s's rifle");
-                       }
-                       else
-                       {
-                               if(w_deathtype & HITTYPE_HEADSHOT)
-                                       w_deathtypestring = _("%s got hit in the head by %s");
-                               else
-                                       w_deathtypestring = _("%s was sniped by %s");
-                       }
-               }
-       }
-       return TRUE;
-}
-#endif
-#endif
index 4a7978808319109c2d2de1f7f61d652b512e168a..117d32cb96a5a454d31d76896b67d17c35fabf34 100644 (file)
@@ -3,7 +3,6 @@ REGISTER_WEAPON(TUBA, w_tuba, 0, 1, WEP_FLAG_HIDDEN | WEP_TYPE_SPLASH, BOT_PICKU
 #else
 #ifdef SVQC
 //#define TUBA_NOTE(n) strcat("weapons/tuba_note", ftos(n), ".wav")
-.float tuba_notecount;
 .entity tuba_note;
 .float tuba_smoketime;
 
@@ -48,7 +47,7 @@ float Tuba_GetNote(entity pl, float hittype)
        // kind of tuba currently is player slot number, or team number if in
        // teamplay
        // that way, holes in the range of notes are "plugged"
-       if(teams_matter)
+       if(teamplay)
        {
                if(pl.team == COLOR_TEAM2 || pl.team == COLOR_TEAM4)
                        note += 3;
@@ -83,7 +82,7 @@ float W_Tuba_NoteSendEntity(entity to, float sf)
                WriteCoord(MSG_ENTITY, self.origin_x);
                WriteCoord(MSG_ENTITY, self.origin_y);
                WriteCoord(MSG_ENTITY, self.origin_z);
-               WriteByte(MSG_ENTITY, self.owner != to);
+               WriteByte(MSG_ENTITY, self.realowner != to);
        }
        return TRUE;
 }
@@ -97,30 +96,30 @@ void W_Tuba_NoteThink()
        entity e;
        if(time > self.teleport_time)
        {
-               self.owner.tuba_note = world;
+               self.realowner.tuba_note = world;
                remove(self);
                return;
        }
        self.nextthink = time;
        dist_mult = autocvar_g_balance_tuba_attenuation / autocvar_snd_soundradius;
        FOR_EACH_REALCLIENT(e)
-       if(e != self.owner)
+       if(e != self.realowner)
        {
                v = self.origin - (e.origin + e.view_ofs);
                vol0 = max(0, 1 - vlen(v) * dist_mult);
                dir0 = normalize(v);
-               v = self.owner.origin - (e.origin + e.view_ofs);
+               v = self.realowner.origin - (e.origin + e.view_ofs);
                vol1 = max(0, 1 - vlen(v) * dist_mult);
                dir1 = normalize(v);
                if(fabs(vol0 - vol1) > 0.005) // 0.5 percent change in volume
                {
-                       setorigin(self, self.owner.origin);
+                       setorigin(self, self.realowner.origin);
                        self.SendFlags |= 1;
                        break;
                }
                if(dir0 * dir1 < 0.9994) // 2 degrees change in angle
                {
-                       setorigin(self, self.owner.origin);
+                       setorigin(self, self.realowner.origin);
                        self.SendFlags |= 1;
                        break;
                }
@@ -130,18 +129,8 @@ void W_Tuba_NoteThink()
 void W_Tuba_Attack(float hittype)
 {
        vector o;
-       float c, n;
+       float n;
        W_SetupShot(self, FALSE, 2, "", 0, autocvar_g_balance_tuba_damage);
-       if(self.tuba_notecount)
-       {
-               self.tuba_notecount = FALSE;
-               c = CHAN_WEAPON;
-       }
-       else
-       {
-               self.tuba_notecount = TRUE;
-               c = CHAN_WEAPON2;
-       }
 
        n = Tuba_GetNote(self, hittype);
 
@@ -161,7 +150,7 @@ void W_Tuba_Attack(float hittype)
        if not(self.tuba_note)
        {
                self.tuba_note = spawn();
-               self.tuba_note.owner = self;
+               self.tuba_note.owner = self.tuba_note.realowner = self;
                self.tuba_note.cnt = n;
                self.tuba_note.think = W_Tuba_NoteThink;
                self.tuba_note.nextthink = time;
index 2f5b9bc7833badd1167a4205bc32c940e7550a1c..92c81714a1a96fd1f0b606258d0dffe76645571e 100644 (file)
@@ -15,7 +15,7 @@ void UZI_Flash_Go()
        {
                self.think = SUB_Remove;
                self.nextthink = time;
-               self.owner.muzzle_flash = world;
+               self.realowner.muzzle_flash = world;
                return;
        }
        
@@ -36,12 +36,12 @@ void UziFlash()
        self.muzzle_flash.alpha = 0.75;
        self.muzzle_flash.angles_z = random() * 180;
        self.muzzle_flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
-       self.muzzle_flash.owner = self;
+       self.muzzle_flash.owner = self.muzzle_flash.realowner = self;
 }
 
 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", CHAN_WEAPON, ((self.misc_bulletcounter == 1) ? autocvar_g_balance_uzi_first_damage : autocvar_g_balance_uzi_sustained_damage));
+       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)
        {
                self.punchangle_x = random () - 0.5;
@@ -121,7 +121,7 @@ void uzi_mode1_fire_auto()
                return;
        }
        
-       W_SetupShot (self, autocvar_g_antilag_bullets && autocvar_g_balance_uzi_speed >= autocvar_g_antilag_bullets, 0, "weapons/uzi_fire.wav", CHAN_WEAPON, autocvar_g_balance_uzi_sustained_damage);
+       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)
        {
                self.punchangle_x = random () - 0.5;
@@ -145,7 +145,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", CHAN_WEAPON, autocvar_g_balance_uzi_sustained_damage);
+       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)
        {
                self.punchangle_x = random () - 0.5;
@@ -301,11 +301,11 @@ float w_uzi(float req)
                pointparticles(particleeffectnum("machinegun_impact"), org2, w_backoff * 1000, 1);
                if(!w_issilent)
                        if(w_random < 0.05)
-                               sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
                        else if(w_random < 0.1)
-                               sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
                        else if(w_random < 0.2)
-                               sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
        }
        else if(req == WR_PRECACHE)
        {
@@ -314,7 +314,7 @@ float w_uzi(float req)
                precache_sound("weapons/ric3.wav");
        }
        else if (req == WR_SUICIDEMESSAGE)
-               w_deathtypestring = _("%s did the impossible");
+               w_deathtypestring = _("%s is now thinking with portals");
        else if (req == WR_KILLMESSAGE)
        {
                if(w_deathtype & HITTYPE_SECONDARY)
index bda0e77b8a972543b558d4051a13aecdf6d7acec..b5b6a0beb377bf3b26922c8431c02e5af172ac5d 100644 (file)
@@ -82,6 +82,7 @@ void WaypointSprite_UpdateTeamRadar(entity e, float icon, vector col)
 }
 
 .float waypointsprite_pingtime;
+.float waypointsprite_helpmetime;
 void WaypointSprite_Ping(entity e)
 {
        // anti spam
@@ -93,6 +94,15 @@ void WaypointSprite_Ping(entity e)
        e.SendFlags |= 32;
 }
 
+float waypointsprite_limitedrange, waypointsprite_deployed_lifetime, waypointsprite_deadlifetime;
+
+void WaypointSprite_HelpMePing(entity e)
+{
+       WaypointSprite_Ping(e);
+       e.waypointsprite_helpmetime = time + waypointsprite_deployed_lifetime;
+       e.SendFlags |= 32;
+}
+
 void WaypointSprite_FadeOutIn(entity e, float t)
 {
        if(!e.fade_time)
@@ -115,7 +125,6 @@ void WaypointSprite_FadeOutIn(entity e, float t)
        e.SendFlags |= 16;
 }
 
-float waypointsprite_limitedrange, waypointsprite_deployed_lifetime, waypointsprite_deadlifetime;
 void WaypointSprite_Init()
 {
        waypointsprite_limitedrange = autocvar_g_waypointsprite_limitedrange;
@@ -205,6 +214,23 @@ float WaypointSprite_Customize()
        if(e.classname == "spectator")
                e = e.enemy;
 
+       // as a GENERAL rule:
+       // if you have the invisibility powerup, sprites ALWAYS are restricted to your team
+       // but only apply this to real players, not to spectators
+       if(g_minstagib && (self.owner.items & IT_STRENGTH) && (e == other))
+       {
+               if(teamplay)
+               {
+                       if(self.owner.team != e.team)
+                               return FALSE;
+               }
+               else
+               {
+                       if(self.owner != e)
+                               return FALSE;
+               }
+       }
+
        return self.waypointsprite_visible_for_player(e);
 }
 
@@ -280,6 +306,13 @@ float WaypointSprite_SendEntity(entity to, float sendflags)
                WriteByte(MSG_ENTITY, self.colormod_x * 255.0);
                WriteByte(MSG_ENTITY, self.colormod_y * 255.0);
                WriteByte(MSG_ENTITY, self.colormod_z * 255.0);
+
+               dt = (self.waypointsprite_helpmetime - time) / 0.1;
+               if(dt < 0)
+                       dt = 0;
+               if(dt > 255)
+                       dt = 255;
+               WriteByte(MSG_ENTITY, dt);
        }
 
        return TRUE;
@@ -299,7 +332,8 @@ entity WaypointSprite_Spawn(
        entity ref, vector ofs, // position
        entity showto, float t, // show to whom? Use a flag to indicate a team
        entity own, .entity ownfield, // remove when own gets killed
-       float hideable // true when it should be controlled by cl_hidewaypoints
+       float hideable, // true when it should be controlled by cl_hidewaypoints
+       float icon, vector rgb // initial icon and color
 )
 {
        entity wp;
@@ -333,6 +367,8 @@ entity WaypointSprite_Spawn(
        wp.customizeentityforclient = WaypointSprite_Customize;
        wp.waypointsprite_visible_for_player = WaypointSprite_visible_for_player;
        wp.reset2 = WaypointSprite_Reset;
+       wp.cnt = icon;
+       wp.colormod = rgb;
        Net_LinkEntity(wp, FALSE, 0, WaypointSprite_SendEntity);
        return wp;
 }
@@ -341,21 +377,23 @@ entity WaypointSprite_SpawnFixed(
        string spr,
        vector ofs,
        entity own,
-       .entity ownfield
+       .entity ownfield,
+       float icon, vector rgb // initial icon and color
 )
 {
-       return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, own, ownfield, TRUE);
+       return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, own, ownfield, TRUE, icon, rgb);
 }
 
 .entity waypointsprite_deployed_fixed;
 entity WaypointSprite_DeployFixed(
        string spr,
        float limited_range,
-       vector ofs
+       vector ofs,
+       float icon, vector rgb // initial icon and color
 )
 {
        float t, maxdistance;
-       if(teams_matter)
+       if(teamplay)
                t = self.team;
        else
                t = 0;
@@ -363,29 +401,31 @@ entity WaypointSprite_DeployFixed(
                maxdistance = waypointsprite_limitedrange;
        else
                maxdistance = 0;
-       return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, world, ofs, world, t, self, waypointsprite_deployed_fixed, FALSE);
+       return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, world, ofs, world, t, self, waypointsprite_deployed_fixed, FALSE, icon, rgb);
 }
 
 .entity waypointsprite_deployed_personal;
 entity WaypointSprite_DeployPersonal(
        string spr,
-       vector ofs
+       vector ofs,
+       float icon, vector rgb // initial icon and color
 )
 {
-       return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, self, waypointsprite_deployed_personal, FALSE);
+       return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, self, waypointsprite_deployed_personal, FALSE, icon, rgb);
 }
 
 .entity waypointsprite_attached;
 .entity waypointsprite_attachedforcarrier;
 entity WaypointSprite_Attach(
        string spr,
-       float limited_range
+       float limited_range,
+       float icon, vector rgb // initial icon and color
 )
 {
        float t, maxdistance;
        if(self.waypointsprite_attachedforcarrier)
                return world; // can't attach to FC
-       if(teams_matter)
+       if(teamplay)
                t = self.team;
        else
                t = 0;
@@ -393,17 +433,18 @@ entity WaypointSprite_Attach(
                maxdistance = waypointsprite_limitedrange;
        else
                maxdistance = 0;
-       return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, self, '0 0 64', world, t, self, waypointsprite_attached, FALSE);
+       return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, self, '0 0 64', world, t, self, waypointsprite_attached, FALSE, icon, rgb);
 }
 
 entity WaypointSprite_AttachCarrier(
        string spr,
-       entity carrier
+       entity carrier,
+       float icon, vector rgb // initial icon and color
 )
 {
        entity e;
        WaypointSprite_Kill(carrier.waypointsprite_attached); // FC overrides attached
-       e = WaypointSprite_Spawn(spr, 0, 0, carrier, '0 0 64', world, carrier.team, carrier, waypointsprite_attachedforcarrier, FALSE);
+       e = WaypointSprite_Spawn(spr, 0, 0, carrier, '0 0 64', world, carrier.team, carrier, waypointsprite_attachedforcarrier, FALSE, icon, rgb);
        if(e)
        {
                WaypointSprite_UpdateMaxHealth(e, '1 0 0' * healtharmor_maxdamage(start_health, start_armorvalue, autocvar_g_balance_armor_blockpercent) * 2);
index 56f72bfd75bfee9235523ff55ffe8c418a732b83..3233f6a31cef9d6fbe6b5a14decc5af1654c05e8 100644 (file)
@@ -84,11 +84,16 @@ vector AnglesTransform_TurnDirectionFU(vector transform)
        return transform;
 }
 
-vector AnglesTransform_Divide(vector to_transform, vector from_transform)
+vector AnglesTransform_RightDivide(vector to_transform, vector from_transform)
 {
        return AnglesTransform_Multiply(to_transform, AnglesTransform_Invert(from_transform));
 }
 
+vector AnglesTransform_LeftDivide(vector from_transform, vector to_transform)
+{
+       return AnglesTransform_Multiply(AnglesTransform_Invert(from_transform), to_transform);
+}
+
 vector AnglesTransform_Normalize(vector t, float minimize_roll)
 {
        float need_flip;
index 045fb24b3afcc196759e661a2d5bb6e96fb80b00..b1c8a85e9da5916983322a5fad1016216e3250d1 100644 (file)
@@ -11,11 +11,12 @@ void fixedmakevectors(vector a);
 #endif
 
 vector AnglesTransform_Apply(vector transform, vector v);
-vector AnglesTransform_Multiply(vector t1, vector t2);
+vector AnglesTransform_Multiply(vector t1, vector t2); // A B
 vector AnglesTransform_Invert(vector transform);
 vector AnglesTransform_TurnDirectionFU(vector transform);
 vector AnglesTransform_TurnDirectionFR(vector transform);
-vector AnglesTransform_Divide(vector to_transform, vector from_transform);
+vector AnglesTransform_RightDivide(vector to_transform, vector from_transform); // A B^-1
+vector AnglesTransform_LeftDivide(vector from_transform, vector to_transform); // A^-1 B
 
 vector AnglesTransform_Normalize(vector t, float minimize_roll); // makes sure all angles are in their range: yaw in -180..180, pitch in -90..90, roll in -180..180 (or if minimize_roll is set, pitch in -180..180, roll in -90..90)
 
index 4b36b4651dc75efa463357b8f7d2405caaffcd05..5979c804d2f01e3b52d42f2a653b149376db337d 100644 (file)
@@ -1,7 +1,11 @@
 void WarpZone_Fade_PreDraw()
 {
        if(self.warpzone_fadestart)
-               self.alpha = bound(0, (self.warpzone_fadeend - vlen(view_origin - self.origin - 0.5 * (self.mins + self.maxs))) / (self.warpzone_fadeend - self.warpzone_fadestart), 1);
+       {
+               vector org;
+               org = R_SetView3fv(VF_ORIGIN);
+               self.alpha = bound(0, (self.warpzone_fadeend - vlen(org - self.origin - 0.5 * (self.mins + self.maxs))) / (self.warpzone_fadeend - self.warpzone_fadestart), 1);
+       }
        else
                self.alpha = 1;
        //print(sprintf("%v <-> %v\n", view_origin, self.origin + 0.5 * (self.mins + self.maxs)));
@@ -160,29 +164,28 @@ void WarpZone_Teleported_Read(float isnew)
 
 float warpzone_fixingview;
 float warpzone_fixingview_drawexteriormodel;
-//float warpzone_fixingview_sidespeed;
-//float warpzone_fixingview_forwardspeed;
-void WarpZone_Inside()
-{
-       if(warpzone_fixingview)
-               return;
-       warpzone_fixingview = 1;
-       warpzone_fixingview_drawexteriormodel = cvar("r_drawexteriormodel");
-       //warpzone_fixingview_sidespeed = cvar("cl_sidespeed");
-       //warpzone_fixingview_forwardspeed = cvar("cl_forwardspeed");
-       cvar_set("r_drawexteriormodel", "0");
-       //cvar_set("cl_sidespeed", ftos(warpzone_fixingview_sidespeed / 100)); // just keep a bit of it in case player gets stuck
-       //cvar_set("cl_forwardspeed", ftos(warpzone_fixingview_forwardspeed / 100)); // just keep a bit of it in case player gets stuck
-}
+float autocvar_chase_active;
 
-void WarpZone_Outside()
+void WarpZone_View_Outside()
 {
        if(!warpzone_fixingview)
                return;
        warpzone_fixingview = 0;
        cvar_set("r_drawexteriormodel", ftos(warpzone_fixingview_drawexteriormodel));
-       //cvar_set("cl_sidespeed", ftos(warpzone_fixingview_sidespeed));
-       //cvar_set("cl_forwardspeed", ftos(warpzone_fixingview_forwardspeed));
+}
+
+void WarpZone_View_Inside()
+{
+       if(autocvar_chase_active)
+       {
+               WarpZone_View_Outside();
+               return;
+       }
+       if(warpzone_fixingview)
+               return;
+       warpzone_fixingview = 1;
+       warpzone_fixingview_drawexteriormodel = cvar("r_drawexteriormodel");
+       cvar_set("r_drawexteriormodel", "0");
 }
 
 vector WarpZone_FixNearClip(vector o, vector c0, vector c1, vector c2, vector c3)
@@ -217,88 +220,82 @@ vector WarpZone_FixNearClip(vector o, vector c0, vector c1, vector c2, vector c3
        return '0 0 0';
 }
 
-float warpzone_saved;
-vector warpzone_saved_origin;
-vector warpzone_saved_angles;
-vector warpzone_saved_cl_viewangles;
+void WarpZone_FixPMove()
+{
+       entity e;
+       e = WarpZone_Find(pmove_org, pmove_org);
+       if(e)
+       {
+               pmove_org = WarpZone_TransformOrigin(e, pmove_org);
+               input_angles = WarpZone_TransformVAngles(e, input_angles);
+       }
+}
+
 #ifndef KEEP_ROLL
 var float autocvar_cl_rollkillspeed = 10;
 #endif
 void WarpZone_FixView()
 {
-       float f;
-       vector o;
        entity e;
-       vector corner0, corner1, corner2, corner3, nearclip;
-
-       warpzone_saved = 0;
-       warpzone_saved_origin = warpzone_fixview_origin;
-       warpzone_saved_angles = warpzone_fixview_angles;
-       warpzone_saved_cl_viewangles = warpzone_fixview_cl_viewangles;
-
-       nearclip = '0 0 1' * (cvar("r_nearclip") * 1.125);
-       corner0 = cs_unproject('0 0 0' + nearclip);
-       corner1 = cs_unproject('1 0 0' * cvar("vid_conwidth") + nearclip);
-       corner2 = cs_unproject('0 1 0' * cvar("vid_conheight") + nearclip);
-       corner3 = cs_unproject('1 0 0' * cvar("vid_conwidth") + '0 1 0' * cvar("vid_conheight") + nearclip);
+       vector org, ang, nearclip, corner0, corner1, corner2, corner3, o;
+       float f;
 
-#ifndef KEEP_ROLL
-       if(warpzone_fixview_angles_z != 0 || warpzone_fixview_cl_viewangles_z != 0)
-       {
-               if(autocvar_cl_rollkillspeed)
-                       f = max(0, (1 - frametime * autocvar_cl_rollkillspeed));
-               else
-                       f = 0;
-               warpzone_fixview_angles_z *= f;
-               warpzone_fixview_cl_viewangles_z *= f;
-               warpzone_saved_angles_z *= f; // PERMANENTLY apply that change!
-               warpzone_saved_cl_viewangles_z *= f; // PERMANENTLY apply that change!
-               warpzone_saved = 2;
-               R_SetView(VF_CL_VIEWANGLES_Z, warpzone_fixview_angles_z);
-       }
+       org = R_SetView3fv(VF_ORIGIN);
+       ang = R_SetView3fv(VF_ANGLES);
+#ifdef WORKAROUND_XON010
+       float dirty;
+       dirty = checkextension("DP_CSQC_ROTATEMOVES");
 #endif
 
-       e = WarpZone_Find(warpzone_fixview_origin, warpzone_fixview_origin);
+       e = WarpZone_Find(org, org);
        if(e)
        {
-               warpzone_saved = 1;
-               warpzone_fixview_origin = WarpZone_TransformOrigin(e, warpzone_fixview_origin);
-               corner0 = WarpZone_TransformOrigin(e, corner0);
-               corner1 = WarpZone_TransformOrigin(e, corner1);
-               corner2 = WarpZone_TransformOrigin(e, corner2);
-               corner3 = WarpZone_TransformOrigin(e, corner3);
-               warpzone_fixview_angles = WarpZone_TransformVAngles(e, warpzone_fixview_angles);
-               warpzone_fixview_cl_viewangles = WarpZone_TransformVAngles(e, warpzone_fixview_cl_viewangles);
-               WarpZone_Inside();
+               org = WarpZone_TransformOrigin(e, org);
+               ang = WarpZone_TransformVAngles(e, ang);
+#ifdef WORKAROUND_XON010
+               dirty = 1;
+#endif
+               WarpZone_View_Inside();
        }
        else
-               WarpZone_Outside();
+               WarpZone_View_Outside();
 
-       // if we are near any warpzone planes - MOVE AWAY (work around nearclip)
-       o = WarpZone_FixNearClip(warpzone_fixview_origin, corner0, corner1, corner2, corner3);
-       if(o != '0 0 0')
-       {
-               warpzone_saved = 1;
-               warpzone_fixview_origin += o;
-       }
+#ifndef KEEP_ROLL
+       float rick;
+       if(autocvar_cl_rollkillspeed)
+               f = max(0, (1 - frametime * autocvar_cl_rollkillspeed));
+       else
+               f = 0;
 
-       if(warpzone_saved == 1)
-       {
-               R_SetView(VF_ORIGIN, warpzone_fixview_origin);
-               R_SetView(VF_ANGLES, warpzone_fixview_cl_viewangles);
-       }
-}
-void WarpZone_UnFixView()
-{
-       if(warpzone_saved)
+       rick = R_SetView(VF_CL_VIEWANGLES_Z);
+       rick *= f;
+       R_SetView(VF_CL_VIEWANGLES_Z, rick);
+
+#ifdef WORKAROUND_XON010
+       if(ang_z > 1 || ang_z < -1)
+               dirty = 1;
+#endif
+       ang_z *= f;
+#endif
+
+#ifdef WORKAROUND_XON010
+       if(dirty)
        {
-               warpzone_fixview_origin = warpzone_saved_origin;
-               warpzone_fixview_angles = warpzone_saved_angles;
-               warpzone_fixview_cl_viewangles = warpzone_saved_cl_viewangles;
-               R_SetView(VF_ORIGIN, warpzone_fixview_origin);
-               R_SetView(VF_ANGLES, warpzone_fixview_angles);
-               R_SetView(VF_CL_VIEWANGLES, warpzone_fixview_cl_viewangles);
+#endif
+       R_SetView(VF_ORIGIN, org);
+       R_SetView(VF_ANGLES, ang);
+#ifdef WORKAROUND_XON010
        }
+#endif
+
+       nearclip = '0 0 1' * (cvar("r_nearclip") * 1.125);
+       corner0 = cs_unproject('0 0 0' + nearclip);
+       corner1 = cs_unproject('1 0 0' * cvar("vid_conwidth") + nearclip);
+       corner2 = cs_unproject('0 1 0' * cvar("vid_conheight") + nearclip);
+       corner3 = cs_unproject('1 0 0' * cvar("vid_conwidth") + '0 1 0' * cvar("vid_conheight") + nearclip);
+       o = WarpZone_FixNearClip(org, corner0, corner1, corner2, corner3);
+       if(o != '0 0 0')
+               R_SetView(VF_ORIGIN, org + o);
 }
 
 void WarpZone_Init()
@@ -307,5 +304,5 @@ void WarpZone_Init()
 
 void WarpZone_Shutdown()
 {
-       WarpZone_Outside();
+       WarpZone_View_Outside();
 }
index d5b3ac2fc097887b0a6181b059033fc214b3e2b8..446c917dbfdb86ee4c50e20e9a29660b9fba8dd0 100644 (file)
@@ -2,11 +2,8 @@ void WarpZone_Read(float bIsNewEntity);
 void WarpZone_Camera_Read(float bIsNewEntity);
 void WarpZone_Teleported_Read(float bIsNewEntity);
 
-vector warpzone_fixview_origin;
-vector warpzone_fixview_angles;
-vector warpzone_fixview_cl_viewangles;
-void WarpZone_FixView(); // this saves the previous values
-void WarpZone_UnFixView(); // and restores them
+void WarpZone_FixPMove();
+void WarpZone_FixView();
 
 void WarpZone_Init();
 void WarpZone_Shutdown();
index 62e74682090c725e544ce7725e57bc8ba2a06294..0f1337d18fb614c447e8efbac9be7d5fc6645040 100644 (file)
@@ -52,7 +52,7 @@ vector WarpZone_camera_transform(vector org, vector ang)
 
 void WarpZone_SetUp(entity e, vector my_org, vector my_ang, vector other_org, vector other_ang)
 {
-       e.warpzone_transform = AnglesTransform_Divide(other_ang, AnglesTransform_TurnDirectionFR(my_ang));
+       e.warpzone_transform = AnglesTransform_RightDivide(other_ang, AnglesTransform_TurnDirectionFR(my_ang));
        e.warpzone_shift = AnglesTransform_PrePostShift_GetPostShift(my_org, e.warpzone_transform, other_org);
        e.warpzone_origin = my_org;
        e.warpzone_targetorigin = other_org;
@@ -230,7 +230,7 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
                        break;
        }
        if((contentshack = (forent.dphitcontentsmask && !(forent.dphitcontentsmask & DPCONTENTS_SOLID))))
-               forent.dphitcontentsmask |= DPCONTENTS_SOLID;
+               BITSET_ASSIGN(forent.dphitcontentsmask, DPCONTENTS_SOLID);
 
        // if starting in warpzone, first transform
        wz = WarpZone_Find(org + mi, org + ma);
@@ -300,11 +300,15 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
                // we hit a warpzone... so, let's perform the trace after the warp again
                org = WarpZone_TransformOrigin(wz, trace_endpos);
                end = WarpZone_TransformOrigin(wz, end);
+
+               // we got warped, so let's step back a bit
+               tracebox(org, mi, ma, org + normalize(org - end) * 32, nomonsters_adjusted, forent);
+               org = trace_endpos;
        }
        WarpZone_MakeAllOther();
 :fail
        if(contentshack)
-               forent.dphitcontentsmask &~= DPCONTENTS_SOLID;
+               BITCLR_ASSIGN(forent.dphitcontentsmask, DPCONTENTS_SOLID);
        trace_startsolid = sol;
        v_forward = vf;
        v_right = vr;
@@ -383,9 +387,9 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo
                tracetoss(e, forent);
                if(cb)
                        cb(e.origin, trace_endpos, trace_endpos);
-               e.origin = trace_endpos;
-               dt = vlen(e.origin - o0) / vlen(e.velocity);
+               dt = vlen(trace_endpos - e.origin) / vlen(e.velocity);
                WarpZone_tracetoss_time += dt;
+               e.origin = trace_endpos;
                e.velocity_z -= dt * g;
                if(trace_fraction >= 1)
                        break;
@@ -408,6 +412,14 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo
                // we hit a warpzone... so, let's perform the trace after the warp again
                e.origin = WarpZone_TransformOrigin(wz, e.origin);
                e.velocity = WarpZone_TransformVelocity(wz, e.velocity);
+
+               // we got warped, so let's step back a bit
+               e.velocity = -e.velocity;
+               tracetoss(e, forent);
+               dt = vlen(trace_endpos - e.origin) / vlen(e.velocity);
+               WarpZone_tracetoss_time -= dt;
+               e.origin = trace_endpos;
+               e.velocity = -e.velocity;
        }
        WarpZone_MakeAllOther();
 :fail
@@ -663,7 +675,7 @@ void WarpZone_RefSys_AddIncrementally(entity me, entity ref)
        t = AnglesTransform_Invert(me.WarpZone_refsys_incremental_transform);
        s = AnglesTransform_PrePostShift_GetPostShift(me.WarpZone_refsys_incremental_shift, t, '0 0 0');
        WarpZone_Accumulator_AddTransform(me.WarpZone_refsys, t, s);
-       WarpZone_Accumulator_Add(me.WarpZone_refsys, ref);
+       WarpZone_Accumulator_Add(me.WarpZone_refsys, ref.WarpZone_refsys);
        me.WarpZone_refsys_incremental_shift = ref.WarpZone_refsys.warpzone_shift;
        me.WarpZone_refsys_incremental_transform = ref.WarpZone_refsys.warpzone_transform;
 }
index 72485f25c4bc91ef64d1af1ab4c81576a407a6da..1dc12b8cfe97f60bc75d5139bb653a04b1eacf3e 100644 (file)
@@ -4,8 +4,6 @@
 float warpzone_warpzones_exist;
 float warpzone_cameras_exist;
 
-const void func_null(void); // never assign to this one please
-
 .float warpzone_isboxy;
 .vector warpzone_shift;
 .vector warpzone_origin;
@@ -71,3 +69,22 @@ vector WarpZone_RefSys_TransformVelocity(entity from, entity to, vector vel);
 vector WarpZone_RefSys_TransformAngles(entity from, entity to, vector ang);
 vector WarpZone_RefSys_TransformVAngles(entity from, entity to, vector ang);
 entity WarpZone_RefSys_SpawnSameRefSys(entity me);
+
+#ifndef BITCLR
+# define BITCLR(a,b) ((a) - ((a) & (b)))
+#endif
+#ifndef BITSET
+# define BITSET(a,b) ((a) | (b))
+#endif
+#ifndef BITXOR
+# define BITXOR(a,b) (((a) | (b)) - ((a) & (b)))
+#endif
+#ifndef BITCLR_ASSIGN
+# define BITCLR_ASSIGN(a,b) ((a) = (a) - ((a) & (b)))
+#endif
+#ifndef BITSET_ASSIGN
+# define BITSET_ASSIGN(a,b) ((a) |= (b))
+#endif
+#ifndef BITXOR_ASSIGN
+# define BITXOR_ASSIGN(a,b) ((a) = ((a) | (b)) - ((a) & (b)))
+#endif
index 29f5dc8db11aaf218354895ed5bba94f53e76397..63e3e712ab84fade91945a62dc4bcd1ff0b63c9f 100644 (file)
@@ -1,5 +1,13 @@
+// for think function
+.vector warpzone_save_origin;
+.vector warpzone_save_angles;
+.vector warpzone_save_eorigin;
+.vector warpzone_save_eangles;
+
+// for all entities
 .vector warpzone_oldorigin, warpzone_oldvelocity, warpzone_oldangles;
 .float warpzone_teleport_time;
+.float warpzone_teleport_finishtime;
 .entity warpzone_teleport_zone;
 
 void WarpZone_StoreProjectileData(entity e)
@@ -11,24 +19,16 @@ void WarpZone_StoreProjectileData(entity e)
 
 void WarpZone_TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity)
 {
-       vector from;
-
-       makevectors (to_angles);
-
-       from = player.origin;
        setorigin (player, to);
        player.oldorigin = to; // for DP's unsticking
        player.angles = to_angles;
        player.fixangle = TRUE;
        player.velocity = to_velocity;
 
-       if(player.effects & EF_TELEPORT_BIT)
-               player.effects &~= EF_TELEPORT_BIT;
-       else
-               player.effects |= EF_TELEPORT_BIT;
+       BITXOR_ASSIGN(player.effects, EF_TELEPORT_BIT);
 
        if(player.classname == "player")
-               player.flags &~= FL_ONGROUND;
+               BITCLR_ASSIGN(player.flags, FL_ONGROUND);
 
        WarpZone_PostTeleportPlayer_Callback(player);
 }
@@ -42,81 +42,104 @@ float WarpZone_Teleported_Send(entity to, float sf)
        return TRUE;
 }
 
-float WarpZone_Teleport(entity player)
+#define WARPZONE_TELEPORT_FIXSOLID(ret) \
+       do \
+       { \
+               setorigin(player, o1 - player.view_ofs); \
+               if(WarpZoneLib_MoveOutOfSolid(player)) \
+               { \
+                       o1 = player.origin + player.view_ofs; \
+                       setorigin(player, o0 - player.view_ofs); \
+               } \
+               else \
+               { \
+                       print("would have to put player in solid, won't do that\n"); \
+                       setorigin(player, o0 - player.view_ofs); \
+                       return (ret); \
+               } \
+       } \
+       while(0)
+#define WARPZONE_TELEPORT_DOTELEPORT() \
+       do \
+       { \
+               WarpZone_RefSys_Add(player, wz); \
+               WarpZone_TeleportPlayer(wz, player, o1 - player.view_ofs, a1, v1); \
+               WarpZone_StoreProjectileData(player); \
+               player.warpzone_teleport_time = time; \
+               player.warpzone_teleport_finishtime = time; \
+               player.warpzone_teleport_zone = wz; \
+       } \
+       while(0)
+
+float WarpZone_Teleport(entity wz, entity player, float f0, float f1)
 {
-       vector o0, a0, v0, o1, a1, v1;
+       vector o0, a0, v0, o1, a1, v1, o10;
 
        o0 = player.origin + player.view_ofs;
        v0 = player.velocity;
        a0 = player.angles;
 
-       if(WarpZone_PlaneDist(self, o0) >= 0) // wrong side of the trigger_warpzone
-               return 2;
-       // no failure, we simply don't want to teleport yet; TODO in
-       // this situation we may want to create a temporary clone
-       // entity of the player to fix graphics glitch
-
-       o1 = WarpZone_TransformOrigin(self, o0);
-       v1 = WarpZone_TransformVelocity(self, v0);
+       o10 = o1 = WarpZone_TransformOrigin(wz, o0);
+       v1 = WarpZone_TransformVelocity(wz, v0);
        if(clienttype(player) != CLIENTTYPE_NOTACLIENT)
-               a1 = WarpZone_TransformVAngles(self, player.v_angle);
+               a1 = WarpZone_TransformVAngles(wz, player.v_angle);
        else
-               a1 = WarpZone_TransformAngles(self, a0);
+               a1 = WarpZone_TransformAngles(wz, a0);
 
-       // put him inside solid
-       tracebox(o1 - player.view_ofs, player.mins, player.maxs, o1 - player.view_ofs, MOVE_NOMONSTERS, player);
-       if(trace_startsolid)
+       if(f0 != 0 || f1 != 0)
        {
-               vector mi, ma;
-               mi = player.mins;
-               ma = player.maxs;
-               setsize(player, mi - player.view_ofs, ma - player.view_ofs);
-               setorigin(player, o1);
-               if(WarpZoneLib_MoveOutOfSolid(player))
-               {
-                       o1 = player.origin;
-                       setsize(player, mi, ma);
-                       setorigin(player, o0);
-               }
-               else
+               // retry last move but behind the warpzone!
+               // we must first go back as far as we can, then forward again, to not cause double touch events!
+
+               tracebox(o1 - player.view_ofs + v1 * frametime * f1, player.mins, player.maxs, o1 - player.view_ofs + v1 * frametime * f0, MOVE_WORLDONLY, player);
                {
-                       print("would have to put player in solid, won't do that\n");
-                       setsize(player, mi, ma);
-                       setorigin(player, o0 - player.view_ofs);
-                       return 0; // cannot fix
+                       entity own;
+                       own = player.owner;
+                       player.owner = world;
+                       tracebox(trace_endpos, player.mins, player.maxs, o1 - player.view_ofs + v1 * frametime * f1, MOVE_NORMAL, player); // this should get us through the warpzone
+                       player.owner = own;
                }
+               o1 = trace_endpos + player.view_ofs;
+
+               float d, dv, md;
+               md = max(vlen(player.mins), vlen(player.maxs));
+               d = WarpZone_TargetPlaneDist(wz, o1);
+               dv = WarpZone_TargetPlaneDist(wz, v1);
+               if(d < 0)
+                       o1 = o1 - v1 * (d / dv);
        }
 
-       if(WarpZone_TargetPlaneDist(self, o1) <= 0)
-       {
-               print("inconsistent warp zones or evil roundoff error\n");
-               return 0;
-       }
+       // put him inside solid
+       tracebox(o1 - player.view_ofs, player.mins, player.maxs, o1 - player.view_ofs, MOVE_NOMONSTERS, player);
+       if(trace_startsolid)
+               WARPZONE_TELEPORT_FIXSOLID(0);
+
+       WARPZONE_TELEPORT_DOTELEPORT();
 
-       //print(sprintf("warpzone: %f %f %f -> %f %f %f\n", o0_x, o0_y, o0_z, o1_x, o1_y, o1_z));
+       // prevent further teleports back
+       float dt = (o1 - o10) * v1 * (1 / (v1 * v1));
+       if(dt < sys_frametime)
+               player.warpzone_teleport_finishtime += sys_frametime - dt;
 
-       //o1 = trace_endpos;
-       WarpZone_RefSys_Add(player, self);
-       WarpZone_TeleportPlayer(self, player, o1 - player.view_ofs, a1, v1);
-       WarpZone_StoreProjectileData(player);
-       player.warpzone_teleport_time = time;
-       player.warpzone_teleport_zone = self;
 #ifndef WARPZONE_USE_FIXANGLE
-       // instead of fixangle, send the transform to the client for smoother operation
-       player.fixangle = FALSE;
-
-       entity ts = spawn();
-       setmodel(ts, "null");
-       ts.SendEntity = WarpZone_Teleported_Send;
-       ts.SendFlags = 0xFFFFFF;
-       ts.drawonlytoclient = player;
-       ts.think = SUB_Remove;
-       ts.nextthink = time + 1;
-       ts.owner = player;
-       ts.enemy = self;
-       ts.effects = EF_NODEPTHTEST;
-       ts.classname = "warpzone_teleported";
-       ts.angles = self.warpzone_transform;
+       if(player.classname == "player")
+       {
+               // instead of fixangle, send the transform to the client for smoother operation
+               player.fixangle = FALSE;
+
+               entity ts = spawn();
+               setmodel(ts, "null");
+               ts.SendEntity = WarpZone_Teleported_Send;
+               ts.SendFlags = 0xFFFFFF;
+               ts.drawonlytoclient = player;
+               ts.think = SUB_Remove;
+               ts.nextthink = time + 1;
+               ts.owner = player;
+               ts.enemy = wz;
+               ts.effects = EF_NODEPTHTEST;
+               ts.classname = "warpzone_teleported";
+               ts.angles = wz.warpzone_transform;
+       }
 #endif
 
        return 1;
@@ -124,20 +147,42 @@ float WarpZone_Teleport(entity player)
 
 void WarpZone_Touch (void)
 {
-       entity oldself, e;
+       entity oldself;
 
        if(other.classname == "trigger_warpzone")
                return;
 
+       if(time <= other.warpzone_teleport_finishtime) // already teleported this frame
+               return;
+
        // FIXME needs a better check to know what is safe to teleport and what not
-       if(other.movetype == MOVETYPE_NONE)
+       if(other.movetype == MOVETYPE_NONE || other.movetype == MOVETYPE_FOLLOW || other.tag_entity)
                return;
 
        if(WarpZoneLib_ExactTrigger_Touch())
                return;
 
-       e = self.enemy;
-       if(WarpZone_Teleport(other))
+       if(WarpZone_PlaneDist(self, other.origin + other.view_ofs) >= 0) // wrong side of the trigger_warpzone (don't teleport yet)
+               return;
+
+       float f;
+       // number of frames we need to go back:
+       //   dist = 16*sqrt(2) qu
+       //   dist ~ 24 qu
+       //   24 qu = v*t
+       //   24 qu = v*frametime*n
+       //       n = 24 qu/(v*frametime)
+       // for clients go only one frame though, may be too irritating otherwise
+       // but max 0.25 sec = 0.25/frametime frames
+       //       24/(0.25/frametime)
+       //       96*frametime
+       float d;
+       d = 24 + max(vlen(other.mins), vlen(other.maxs));
+       if(clienttype(other) == CLIENTTYPE_NOTACLIENT)
+               f = -d / bound(frametime * d * 1, frametime * vlen(other.velocity), d);
+       else
+               f = -1;
+       if(WarpZone_Teleport(self, other, f, 0))
        {
                string save1, save2;
                activator = other;
@@ -171,11 +216,11 @@ float WarpZone_Send(entity to, float sendflags)
        // we must send this flag for clientside to match properly too
        f = 0;
        if(self.warpzone_isboxy)
-               f |= 1;
+               BITSET_ASSIGN(f, 1);
        if(self.warpzone_fadestart)
-               f |= 2;
+               BITSET_ASSIGN(f, 2);
        if(self.origin != '0 0 0')
-               f |= 4;
+               BITSET_ASSIGN(f, 4);
        WriteByte(MSG_ENTITY, f);
 
        // we need THESE to render the warpzone (and cull properly)...
@@ -224,9 +269,9 @@ float WarpZone_Camera_Send(entity to, float sendflags)
        WriteByte(MSG_ENTITY, ENT_CLIENT_WARPZONE_CAMERA);
 
        if(self.warpzone_fadestart)
-               f |= 2;
+               BITSET_ASSIGN(f, 2);
        if(self.origin != '0 0 0')
-               f |= 4;
+               BITSET_ASSIGN(f, 4);
        WriteByte(MSG_ENTITY, f);
 
        // we need THESE to render the warpzone (and cull properly)...
@@ -263,52 +308,57 @@ float WarpZone_Camera_Send(entity to, float sendflags)
        return TRUE;
 }
 
-float WarpZone_CheckProjectileImpact()
+float WarpZone_CheckProjectileImpact(entity player)
 {
-       // if self hit a warpzone, abort
-       vector o0, v0, a0;
-       float mpd, pd, dpd;
+       vector o0, v0;
+
+       o0 = player.origin + player.view_ofs;
+       v0 = player.velocity;
+
+       // if we teleported shortly before, abort
+       if(time <= player.warpzone_teleport_finishtime + 0.1)
+               return 0;
+
+       // if player hit a warpzone, abort
        entity wz;
-       wz = WarpZone_Find(self.origin + self.mins, self.origin + self.maxs);
+       wz = WarpZone_Find(o0 + player.mins, o0 + player.maxs);
        if(!wz)
                return 0;
-       if(self.warpzone_teleport_time == time)
+
+       print("impactfilter found something - and it even gets handled correctly - please tell divVerent that this code apparently gets triggered again\n");
+
+       // retry previous move
+       setorigin(player, player.warpzone_oldorigin);
+       player.velocity = player.warpzone_oldvelocity;
+       if(WarpZone_Teleport(wz, player, 0, 1))
        {
-               // just ignore if we got teleported this frame already and now hit a wall and are in a warpzone again (this will cause a detonation)
-               // print("2 warps 1 frame\n");
-               return -1;
-       }
-       o0 = self.origin;
-       v0 = self.velocity;
-       a0 = self.angles;
-
-       // this approach transports the projectile at its full speed, but does
-       // not properly retain the projectile trail (but we can't retain it
-       // easily anyway without delaying the projectile by two frames, so who
-       // cares)
-       WarpZone_TraceBox_ThroughZone(self.warpzone_oldorigin, self.mins, self.maxs, self.warpzone_oldorigin + self.warpzone_oldvelocity * frametime, MOVE_NORMAL, self, wz, WarpZone_trace_callback_t_null); // this will get us through the warpzone
-       setorigin(self, trace_endpos);
-       self.angles = WarpZone_TransformAngles(WarpZone_trace_transform, self.angles);
-       self.velocity = WarpZone_TransformVelocity(WarpZone_trace_transform, self.warpzone_oldvelocity);
-       
-       // in case we are in our warp zone post-teleport, shift the projectile forward a bit
-       mpd = max(vlen(self.mins), vlen(self.maxs));
-       pd = WarpZone_TargetPlaneDist(wz, self.origin);
-       if(pd < mpd)
+               entity oldself;
+               string save1, save2;
+
+               oldself = self;
+               self = wz;
+               other = player;
+               activator = player;
+
+               save1 = self.target; self.target = string_null;
+               save2 = self.target3; self.target3 = string_null;
+               SUB_UseTargets();
+               if not(self.target) self.target = save1;
+               if not(self.target3) self.target3 = save2;
+
+               self = self.enemy;
+               save1 = self.target; self.target = string_null;
+               save2 = self.target2; self.target2 = string_null;
+               SUB_UseTargets();
+               if not(self.target) self.target = save1;
+               if not(self.target2) self.target2 = save2;
+               self = oldself;
+       }
+       else
        {
-               dpd = normalize(self.velocity) * wz.warpzone_targetforward;
-               setorigin(self, self.origin + normalize(self.velocity) * ((mpd - pd) / dpd));
-               if(!WarpZoneLib_MoveOutOfSolid(self))
-               {
-                       setorigin(self, o0);
-                       self.angles = a0;
-                       self.velocity = v0;
-                       return 0;
-               }
+               setorigin(player, o0 - player.view_ofs);
+               player.velocity = v0;
        }
-       WarpZone_RefSys_Add(self, wz);
-       WarpZone_StoreProjectileData(self);
-       self.warpzone_teleport_time = time;
 
        return +1;
 }
@@ -317,19 +367,59 @@ float WarpZone_Projectile_Touch()
        float f;
        if(other.classname == "trigger_warpzone")
                return TRUE;
-       if(WarpZone_Projectile_Touch_ImpactFilter_Callback())
+
+       // no further impacts if we teleported this frame!
+       if(time == self.warpzone_teleport_time)
                return TRUE;
-       if((f = WarpZone_CheckProjectileImpact()) != 0)
-               return (f > 0);
-       if(self.warpzone_teleport_time == time)
+
+       // this SEEMS to not happen at the moment, but if it did, it would be more reliable
        {
-               // sequence: hit warpzone, get teleported, hit wall
-               // print("2 hits 1 frame\n");
-               setorigin(self, self.warpzone_oldorigin);
-               self.velocity = self.warpzone_oldvelocity;
-               self.angles = self.warpzone_oldangles;
-               return TRUE;
+               float save_dpstartcontents;
+               float save_dphitcontents;
+               float save_dphitq3surfaceflags;
+               string save_dphittexturename;
+               float save_allsolid;
+               float save_startsolid;
+               float save_fraction;
+               vector save_endpos;
+               vector save_plane_normal;
+               float save_plane_dist;
+               entity save_ent;
+               float save_inopen;
+               float save_inwater;
+               save_dpstartcontents = trace_dpstartcontents;
+               save_dphitcontents = trace_dphitcontents;
+               save_dphitq3surfaceflags = trace_dphitq3surfaceflags;
+               save_dphittexturename = trace_dphittexturename;
+               save_allsolid = trace_allsolid;
+               save_startsolid = trace_startsolid;
+               save_fraction = trace_fraction;
+               save_endpos = trace_endpos;
+               save_plane_normal = trace_plane_normal;
+               save_plane_dist = trace_plane_dist;
+               save_ent = trace_ent;
+               save_inopen = trace_inopen;
+               save_inwater = trace_inwater;
+               if((f = WarpZone_CheckProjectileImpact(self)) != 0)
+                       return (f > 0);
+               trace_dpstartcontents = save_dpstartcontents;
+               trace_dphitcontents = save_dphitcontents;
+               trace_dphitq3surfaceflags = save_dphitq3surfaceflags;
+               trace_dphittexturename = save_dphittexturename;
+               trace_allsolid = save_allsolid;
+               trace_startsolid = save_startsolid;
+               trace_fraction = save_fraction;
+               trace_endpos = save_endpos;
+               trace_plane_normal = save_plane_normal;
+               trace_plane_dist = save_plane_dist;
+               trace_ent = save_ent;
+               trace_inopen = save_inopen;
+               trace_inwater = save_inwater;
        }
+
+       if(WarpZone_Projectile_Touch_ImpactFilter_Callback())
+               return TRUE;
+
        return FALSE;
 }
 
@@ -369,6 +459,22 @@ void WarpZonePosition_InitStep_FindTarget()
        self.enemy.aiment = self;
 }
 
+void WarpZoneCamera_Think(void)
+{
+       if(self.warpzone_save_origin != self.origin
+       || self.warpzone_save_angles != self.angles
+       || self.warpzone_save_eorigin != self.enemy.origin
+       || self.warpzone_save_eangles != self.enemy.angles)
+       {
+               WarpZone_Camera_SetUp(self, self.enemy.origin, self.enemy.angles);
+               self.warpzone_save_origin = self.origin;
+               self.warpzone_save_angles = self.angles;
+               self.warpzone_save_eorigin = self.enemy.origin;
+               self.warpzone_save_eangles = self.enemy.angles;
+       }
+       self.nextthink = time;
+}
+
 void WarpZoneCamera_InitStep_FindTarget()
 {
        entity e;
@@ -390,6 +496,13 @@ void WarpZoneCamera_InitStep_FindTarget()
        warpzone_cameras_exist = 1;
        WarpZone_Camera_SetUp(self, self.enemy.origin, self.enemy.angles);
        self.SendFlags = 0xFFFFFF;
+       if(self.spawnflags & 1)
+       {
+               self.think = WarpZoneCamera_Think;
+               self.nextthink = time;
+       }
+       else
+               self.nextthink = 0;
 }
 
 void WarpZone_InitStep_UpdateTransform()
@@ -411,7 +524,7 @@ void WarpZone_InitStep_UpdateTransform()
                tex = getsurfacetexture(self, i_s);
                if not(tex)
                        break; // this is beyond the last one
-               if(tex == "textures/common/trigger")
+               if(tex == "textures/common/trigger" || tex == "trigger")
                        continue;
                n_t = getsurfacenumtriangles(self, i_s);
                for(i_t = 0; i_t < n_t; ++i_t)
@@ -514,6 +627,7 @@ void WarpZone_InitStep_FindTarget()
        }
 }
 
+void WarpZone_Think();
 void WarpZone_InitStep_FinalizeTransform()
 {
        if(!self.enemy || self.enemy.enemy != self)
@@ -526,6 +640,13 @@ void WarpZone_InitStep_FinalizeTransform()
        WarpZone_SetUp(self, self.warpzone_origin, self.warpzone_angles, self.enemy.warpzone_origin, self.enemy.warpzone_angles);
        self.touch = WarpZone_Touch;
        self.SendFlags = 0xFFFFFF;
+       if(self.spawnflags & 1)
+       {
+               self.think = WarpZone_Think;
+               self.nextthink = time;
+       }
+       else
+               self.nextthink = 0;
 }
 
 float warpzone_initialized;
@@ -553,6 +674,11 @@ void spawnfunc_trigger_warpzone(void)
        //              the map, with another killtarget to designate its
        //              orientation
 
+#ifndef WARPZONE_USE_FIXANGLE
+       // used when teleporting
+       precache_model("null");
+#endif
+
        if(!self.scale)
                self.scale = self.modelscale;
        if(!self.scale)
@@ -572,7 +698,7 @@ void spawnfunc_trigger_warpzone(void)
                setsize(self, self.mins, self.maxs);
        self.SendEntity = WarpZone_Send;
        self.SendFlags = 0xFFFFFF;
-       self.effects |= EF_NODEPTHTEST;
+       BITSET_ASSIGN(self.effects, EF_NODEPTHTEST);
        self.warpzone_next = warpzone_first;
        warpzone_first = self;
 }
@@ -616,6 +742,31 @@ void WarpZones_Reconnect()
        self = e;
 }
 
+void WarpZone_Think()
+{
+       if(self.warpzone_save_origin != self.origin
+       || self.warpzone_save_angles != self.angles
+       || self.warpzone_save_eorigin != self.enemy.origin
+       || self.warpzone_save_eangles != self.enemy.angles)
+       {
+               entity oldself;
+               oldself = self;
+               WarpZone_InitStep_UpdateTransform();
+               self = self.enemy;
+               WarpZone_InitStep_UpdateTransform();
+               self = oldself;
+               WarpZone_InitStep_FinalizeTransform();
+               self = self.enemy;
+               WarpZone_InitStep_FinalizeTransform();
+               self = oldself;
+               self.warpzone_save_origin = self.origin;
+               self.warpzone_save_angles = self.angles;
+               self.warpzone_save_eorigin = self.enemy.origin;
+               self.warpzone_save_eangles = self.enemy.angles;
+       }
+       self.nextthink = time;
+}
+
 void WarpZone_StartFrame()
 {
        entity e;
@@ -631,42 +782,50 @@ void WarpZone_StartFrame()
                        WarpZone_InitStep_UpdateTransform();
                self = e;
                WarpZones_Reconnect();
+               WarpZone_PostInitialize_Callback();
        }
 
-       if(warpzone_warpzones_exist)
+       entity oldself, oldother;
+       oldself = self;
+       oldother = other;
+       for(e = world; (e = nextent(e)); )
        {
-               entity oldself, oldother;
-               oldself = self;
-               oldother = other;
-               for(e = world; (e = nextent(e)); )
+               if(warpzone_warpzones_exist) { WarpZone_StoreProjectileData(e); }
+               
+               float f = clienttype(e);
+               if(f == CLIENTTYPE_REAL)
                {
-                       WarpZone_StoreProjectileData(e);
-                       float f;
-                       f = clienttype(e);
-                       if(f == CLIENTTYPE_REAL)
+                       if(e.solid == SOLID_NOT) // not spectating?
+                       if(e.movetype == MOVETYPE_NOCLIP || e.movetype == MOVETYPE_FLY || e.movetype == MOVETYPE_FLY_WORLDONLY) // not spectating? (this is to catch observers)
                        {
-                               if(e.solid != SOLID_NOT) // not spectating?
-                                       continue;
-                               if(e.movetype != MOVETYPE_NOCLIP && e.movetype != MOVETYPE_FLY) // not spectating? (this is to catch observers)
-                                       continue;
-                               self = WarpZone_Find(e.origin + e.mins, e.origin + e.maxs);
-                               if(!self)
-                                       continue;
-                               other = e;
-                               if(WarpZoneLib_ExactTrigger_Touch())
-                                       continue;
-                               WarpZone_Teleport(e); // NOT triggering targets by this!
+                               other = e; // player
+                       
+                               // warpzones
+                               if(warpzone_warpzones_exist) { 
+                               self = WarpZone_Find(e.origin + e.mins, e.origin + e.maxs); 
+                               if(self)
+                               if(!WarpZoneLib_ExactTrigger_Touch())
+                                       if(WarpZone_PlaneDist(self, e.origin + e.view_ofs) <= 0)
+                                               WarpZone_Teleport(self, e, -1, 0); } // NOT triggering targets by this!
+                       
+                               // teleporters
+                               self = Teleport_Find(e.origin + e.mins, e.origin + e.maxs);
+                               if(self)
+                               if(!WarpZoneLib_ExactTrigger_Touch())
+                                       Simple_TeleportPlayer(self, other); // NOT triggering targets by this!
                        }
-                       if(f == CLIENTTYPE_NOTACLIENT)
-                       {
+               }
+               
+               if(f == CLIENTTYPE_NOTACLIENT)
+               {
+                       if(warpzone_warpzones_exist)
                                for(; (e = nextent(e)); )
                                        WarpZone_StoreProjectileData(e);
-                               break;
-                       }
+                       break;
                }
-               self = oldself;
-               other = oldother;
        }
+       self = oldself;
+       other = oldother;
 }
 
 .float warpzone_reconnecting;
index 621e0f9517169e3d9ea22a8329baad9347decbfb..7a301a8b82aff76fcca1c6417d4cfbd440a7d12a 100644 (file)
@@ -10,3 +10,5 @@ const float ENT_CLIENT_WARPZONE;
 const float ENT_CLIENT_WARPZONE_CAMERA;
 
 void WarpZone_PlayerPhysics_FixVAngle(void);
+
+void WarpZone_PostInitialize_Callback(void);
diff --git a/qcsrc/xonotic-gamecode.workspace b/qcsrc/xonotic-gamecode.workspace
deleted file mode 100644 (file)
index 3f4a59a..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<CodeBlocks_workspace_file>
-       <Workspace title="Xonotic Gamecode">
-               <Project filename="qc-server.cbp" active="1" />
-               <Project filename="qc-client.cbp" />
-               <Project filename="qc-common.cbp" />
-       </Workspace>
-</CodeBlocks_workspace_file>
index 2c0f409ea23841e6dc4d41c39eda608da611b9cf..5dd32c8ac0d15d3efabe72cc0d3db8ea600b4690 100644 (file)
--- a/quake.rc
+++ b/quake.rc
@@ -4,6 +4,7 @@ maxplayers $menu_maxplayers
 exec data/campaign.cfg
 exec config_update.cfg
 exec font-xolonium.cfg
+exec autoexec/*.cfg
 exec autoexec.cfg
 stuffcmds
 //startdemos demos/demo1 demos/demo2 demos/demo3
diff --git a/scripts/vehicles.shader b/scripts/vehicles.shader
new file mode 100644 (file)
index 0000000..023e277
--- /dev/null
@@ -0,0 +1,48 @@
+spiderbot
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/spiderbot.tga
+               rgbgen lightingDiffuse
+       }
+}
+wakazachi
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/wakazachi.tga
+               rgbgen lightingDiffuse
+       }
+}
+cockpit
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/cockpit.tga
+               rgbgen lightingDiffuse
+       }
+}
+vehicles/tracercore
+{
+       surfaceparm nonsolid
+       surfaceparm nolightmap
+       deformVertexes autosprite
+       {
+       map models/vehicles/tracercore.tga
+               blendfunc add
+               rgbGen lightingDiffuse
+       }
+       }
+vehicles/tracertrail
+{
+       surfaceparm nonsolid
+       surfaceparm nolightmap
+       cull none
+       deformVertexes autosprite2
+       {
+               map models/vehicles/tracertrail.tga
+               blendfunc add
+               rgbGen lightingDiffuse
+       }
+}
+       
\ No newline at end of file
diff --git a/scripts/vrockets.shader b/scripts/vrockets.shader
new file mode 100644 (file)
index 0000000..4425994
--- /dev/null
@@ -0,0 +1,16 @@
+models/vehicles/rockets
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map models/vehicles/rockets.tga
+               rgbgen lightingDiffuse
+       }
+}
+rockets
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map models/vehicles/rockets.tga
+               rgbgen lightingDiffuse
+       }
+}
\ No newline at end of file
index cf93bb6a4a622b17d398ee70a03204741c161d4d..6800c2f663d71f815bd9081bff40a6d8e60ac9f9 100644 (file)
@@ -1,31 +1,31 @@
-//affirmative sound/player/torus/coms/affirmative 0
-attack sound/player/torus/coms/attack 0
-//attacking sound/player/torus/coms/attacking 0
-attackinfive sound/player/torus/coms/letsgo 0
-coverme sound/player/torus/coms/coverme 0
-//defend sound/player/torus/coms/defend 1
-//defending sound/player/torus/coms/defending 0
-//droppedflag sound/player/torus/coms/droppedflag 0
-//flagcarriertakingdamage sound/player/torus/coms/flagcarriertakingdamage 0
-//freelance sound/player/torus/coms/freelance 1
-//getflag sound/player/torus/coms/getflag 0
-incoming sound/player/torus/coms/incoming 0
-meet sound/player/torus/coms/waypoint 0
-needhelp sound/player/torus/coms/needhelp 0
-//negative sound/player/torus/coms/negative 0
-//onmyway sound/player/torus/coms/onmyway 0
-//roaming sound/player/torus/coms/roaming 0
-//seenenemy sound/player/torus/coms/seenenemy 0
-seenflag sound/player/torus/coms/seenflag 0
-taunt sound/player/torus/coms/taunt 2
-teamshoot sound/player/torus/coms/teamshoot 0
-death sound/player/torus/player/death 0
-drown sound/player/torus/player/drown 0
-//fall sound/player/torus/player/fall 0
-//falling sound/debug/v_falling 0
-gasp sound/player/torus/player/gasp 0
-jump sound/player/torus/player/fall 0
-pain25 sound/player/torus/player/pain25 0
-pain50 sound/player/torus/player/pain50 0
-pain75 sound/player/torus/player/pain75 0
-pain100 sound/player/torus/player/pain100 0
+affirmative sound/player/espeak/coms/affirmative 0
+attack sound/player/espeak/coms/attack 0
+attacking sound/player/espeak/coms/attacking 0
+attackinfive sound/player/espeak/coms/attackinfive 0
+coverme sound/player/espeak/coms/coverme 0
+defend sound/player/espeak/coms/defend 0
+defending sound/player/espeak/coms/defending 0
+droppedflag sound/player/espeak/coms/droppedflag 0
+flagcarriertakingdamage sound/player/espeak/coms/flagcarriertakingdamage 0
+freelance sound/player/espeak/coms/freelance 0
+getflag sound/player/espeak/coms/getflag 0
+incoming sound/player/espeak/coms/incoming 0
+meet sound/player/espeak/coms/meet 0
+needhelp sound/player/espeak/coms/needhelp 0
+negative sound/player/espeak/coms/negative 0
+onmyway sound/player/espeak/coms/onmyway 0
+roaming sound/player/espeak/coms/roaming 0
+seenenemy sound/player/espeak/coms/seenenemy 0
+seenflag sound/player/espeak/coms/seenflag 0
+taunt sound/player/espeak/coms/taunt 0
+teamshoot sound/player/espeak/coms/teamshoot 0
+death sound/player/espeak/player/death 0
+drown sound/player/espeak/player/drown 0
+fall sound/player/espeak/player/fall 0
+falling sound/player/espeak/player/falling 0
+gasp sound/player/espeak/player/gasp 0
+jump sound/player/espeak/player/jump 0
+pain25 sound/player/espeak/player/pain25 0
+pain50 sound/player/espeak/player/pain50 0
+pain75 sound/player/espeak/player/pain75 0
+pain100 sound/player/espeak/player/pain100 0
diff --git a/sound/player/espeak/coms/affirmative.ogg b/sound/player/espeak/coms/affirmative.ogg
new file mode 100644 (file)
index 0000000..310fe84
Binary files /dev/null and b/sound/player/espeak/coms/affirmative.ogg differ
diff --git a/sound/player/espeak/coms/attack.ogg b/sound/player/espeak/coms/attack.ogg
new file mode 100644 (file)
index 0000000..535bed8
Binary files /dev/null and b/sound/player/espeak/coms/attack.ogg differ
diff --git a/sound/player/espeak/coms/attackinfive.ogg b/sound/player/espeak/coms/attackinfive.ogg
new file mode 100644 (file)
index 0000000..998848f
Binary files /dev/null and b/sound/player/espeak/coms/attackinfive.ogg differ
diff --git a/sound/player/espeak/coms/attacking.ogg b/sound/player/espeak/coms/attacking.ogg
new file mode 100644 (file)
index 0000000..9ba2394
Binary files /dev/null and b/sound/player/espeak/coms/attacking.ogg differ
diff --git a/sound/player/espeak/coms/coverme.ogg b/sound/player/espeak/coms/coverme.ogg
new file mode 100644 (file)
index 0000000..079595b
Binary files /dev/null and b/sound/player/espeak/coms/coverme.ogg differ
diff --git a/sound/player/espeak/coms/defend.ogg b/sound/player/espeak/coms/defend.ogg
new file mode 100644 (file)
index 0000000..8a3a92c
Binary files /dev/null and b/sound/player/espeak/coms/defend.ogg differ
diff --git a/sound/player/espeak/coms/defending.ogg b/sound/player/espeak/coms/defending.ogg
new file mode 100644 (file)
index 0000000..32808d3
Binary files /dev/null and b/sound/player/espeak/coms/defending.ogg differ
diff --git a/sound/player/espeak/coms/droppedflag.ogg b/sound/player/espeak/coms/droppedflag.ogg
new file mode 100644 (file)
index 0000000..fc2f009
Binary files /dev/null and b/sound/player/espeak/coms/droppedflag.ogg differ
diff --git a/sound/player/espeak/coms/flagcarriertakingdamage.ogg b/sound/player/espeak/coms/flagcarriertakingdamage.ogg
new file mode 100644 (file)
index 0000000..8f27d15
Binary files /dev/null and b/sound/player/espeak/coms/flagcarriertakingdamage.ogg differ
diff --git a/sound/player/espeak/coms/freelance.ogg b/sound/player/espeak/coms/freelance.ogg
new file mode 100644 (file)
index 0000000..ac023a0
Binary files /dev/null and b/sound/player/espeak/coms/freelance.ogg differ
diff --git a/sound/player/espeak/coms/getflag.ogg b/sound/player/espeak/coms/getflag.ogg
new file mode 100644 (file)
index 0000000..958296d
Binary files /dev/null and b/sound/player/espeak/coms/getflag.ogg differ
diff --git a/sound/player/espeak/coms/incoming.ogg b/sound/player/espeak/coms/incoming.ogg
new file mode 100644 (file)
index 0000000..526f09f
Binary files /dev/null and b/sound/player/espeak/coms/incoming.ogg differ
diff --git a/sound/player/espeak/coms/meet.ogg b/sound/player/espeak/coms/meet.ogg
new file mode 100644 (file)
index 0000000..ff4aa6c
Binary files /dev/null and b/sound/player/espeak/coms/meet.ogg differ
diff --git a/sound/player/espeak/coms/needhelp.ogg b/sound/player/espeak/coms/needhelp.ogg
new file mode 100644 (file)
index 0000000..ef84985
Binary files /dev/null and b/sound/player/espeak/coms/needhelp.ogg differ
diff --git a/sound/player/espeak/coms/negative.ogg b/sound/player/espeak/coms/negative.ogg
new file mode 100644 (file)
index 0000000..1f63a57
Binary files /dev/null and b/sound/player/espeak/coms/negative.ogg differ
diff --git a/sound/player/espeak/coms/onmyway.ogg b/sound/player/espeak/coms/onmyway.ogg
new file mode 100644 (file)
index 0000000..ce8d203
Binary files /dev/null and b/sound/player/espeak/coms/onmyway.ogg differ
diff --git a/sound/player/espeak/coms/roaming.ogg b/sound/player/espeak/coms/roaming.ogg
new file mode 100644 (file)
index 0000000..5fee542
Binary files /dev/null and b/sound/player/espeak/coms/roaming.ogg differ
diff --git a/sound/player/espeak/coms/seenenemy.ogg b/sound/player/espeak/coms/seenenemy.ogg
new file mode 100644 (file)
index 0000000..da21bcf
Binary files /dev/null and b/sound/player/espeak/coms/seenenemy.ogg differ
diff --git a/sound/player/espeak/coms/seenflag.ogg b/sound/player/espeak/coms/seenflag.ogg
new file mode 100644 (file)
index 0000000..a6a78fb
Binary files /dev/null and b/sound/player/espeak/coms/seenflag.ogg differ
diff --git a/sound/player/espeak/coms/taunt.ogg b/sound/player/espeak/coms/taunt.ogg
new file mode 100644 (file)
index 0000000..03bf24c
Binary files /dev/null and b/sound/player/espeak/coms/taunt.ogg differ
diff --git a/sound/player/espeak/coms/teamshoot.ogg b/sound/player/espeak/coms/teamshoot.ogg
new file mode 100644 (file)
index 0000000..040db89
Binary files /dev/null and b/sound/player/espeak/coms/teamshoot.ogg differ
diff --git a/sound/player/espeak/make.sh b/sound/player/espeak/make.sh
new file mode 100644 (file)
index 0000000..a93c2cc
--- /dev/null
@@ -0,0 +1,40 @@
+v()
+{
+       espeak -w "$1.wav" "$2"
+       normalize "$1.wav"
+       oggenc -q1 "$1.wav" -o "$1.ogg"
+       rm -f "$1.wav"
+}
+
+v player/death                 "Mine Leyben!"
+v player/fall                  "Ooh!"
+v player/drown                 "Gloog gloog gloog!"
+v player/gasp                  "Ha!"
+v player/jump                  "Hem!"
+v player/pain25                "Owowowow!"
+v player/pain50                "Owow!"
+v player/pain75                "Ouuu!"
+v player/pain100               "Ouch!"
+v player/fall                  "Arh!"
+v player/falling               "Aaaaaaaaaaaaaaaaaaaaa!"
+v coms/attack                  "Attack!"
+v coms/attackinfive            "Attack in 5! In 4! In 3! In 2! In 1! Attack NOW!"
+v coms/meet                    "Let's meet at the waypoint."
+v coms/seenflag                "I've seen the flag!"
+v coms/taunt                   "Double facepalm!"
+v coms/teamshoot               "I'm on your team!"
+v coms/incoming                "Incoming!"
+v coms/coverme                 "Cover me!"
+v coms/needhelp                "I need help!"
+v coms/defend                  "Defend the base!"
+v coms/freelance               "Do whatever you want."
+v coms/flagcarriertakingdamage "Our flag carrier is taking damage!"
+v coms/getflag                 "Somebody get our flag back!"
+v coms/affirmative             "Affirmative."
+v coms/attacking               "I'm attacking."
+v coms/defending               "I'm defending."
+v coms/roaming                 "I'm roaming around."
+v coms/onmyway                 "I'm on my way."
+v coms/droppedflag             "I dropped the flag!"
+v coms/negative                "Negative."
+v coms/seenenemy               "I've seen an enemy."
diff --git a/sound/player/espeak/player/death.ogg b/sound/player/espeak/player/death.ogg
new file mode 100644 (file)
index 0000000..b382da7
Binary files /dev/null and b/sound/player/espeak/player/death.ogg differ
diff --git a/sound/player/espeak/player/drown.ogg b/sound/player/espeak/player/drown.ogg
new file mode 100644 (file)
index 0000000..55db0c8
Binary files /dev/null and b/sound/player/espeak/player/drown.ogg differ
diff --git a/sound/player/espeak/player/fall.ogg b/sound/player/espeak/player/fall.ogg
new file mode 100644 (file)
index 0000000..b5ca319
Binary files /dev/null and b/sound/player/espeak/player/fall.ogg differ
diff --git a/sound/player/espeak/player/falling.ogg b/sound/player/espeak/player/falling.ogg
new file mode 100644 (file)
index 0000000..7e1d44a
Binary files /dev/null and b/sound/player/espeak/player/falling.ogg differ
diff --git a/sound/player/espeak/player/gasp.ogg b/sound/player/espeak/player/gasp.ogg
new file mode 100644 (file)
index 0000000..cf126b1
Binary files /dev/null and b/sound/player/espeak/player/gasp.ogg differ
diff --git a/sound/player/espeak/player/jump.ogg b/sound/player/espeak/player/jump.ogg
new file mode 100644 (file)
index 0000000..0da2706
Binary files /dev/null and b/sound/player/espeak/player/jump.ogg differ
diff --git a/sound/player/espeak/player/pain100.ogg b/sound/player/espeak/player/pain100.ogg
new file mode 100644 (file)
index 0000000..ca32d93
Binary files /dev/null and b/sound/player/espeak/player/pain100.ogg differ
diff --git a/sound/player/espeak/player/pain25.ogg b/sound/player/espeak/player/pain25.ogg
new file mode 100644 (file)
index 0000000..e39bc68
Binary files /dev/null and b/sound/player/espeak/player/pain25.ogg differ
diff --git a/sound/player/espeak/player/pain50.ogg b/sound/player/espeak/player/pain50.ogg
new file mode 100644 (file)
index 0000000..2755a9d
Binary files /dev/null and b/sound/player/espeak/player/pain50.ogg differ
diff --git a/sound/player/espeak/player/pain75.ogg b/sound/player/espeak/player/pain75.ogg
new file mode 100644 (file)
index 0000000..60d61f9
Binary files /dev/null and b/sound/player/espeak/player/pain75.ogg differ
diff --git a/sound/vehicles/alarm.wav b/sound/vehicles/alarm.wav
new file mode 100644 (file)
index 0000000..95b4f55
Binary files /dev/null and b/sound/vehicles/alarm.wav differ
diff --git a/sound/vehicles/alarm_shield.wav b/sound/vehicles/alarm_shield.wav
new file mode 100644 (file)
index 0000000..8e46d62
Binary files /dev/null and b/sound/vehicles/alarm_shield.wav differ
diff --git a/sound/vehicles/lock.wav b/sound/vehicles/lock.wav
new file mode 100644 (file)
index 0000000..54a0a0d
Binary files /dev/null and b/sound/vehicles/lock.wav differ
diff --git a/sound/vehicles/locked.wav b/sound/vehicles/locked.wav
new file mode 100644 (file)
index 0000000..e846776
Binary files /dev/null and b/sound/vehicles/locked.wav differ
diff --git a/sound/vehicles/locking.wav b/sound/vehicles/locking.wav
new file mode 100644 (file)
index 0000000..210d88e
Binary files /dev/null and b/sound/vehicles/locking.wav differ
diff --git a/sound/vehicles/racer_boost.wav b/sound/vehicles/racer_boost.wav
new file mode 100644 (file)
index 0000000..93149e4
Binary files /dev/null and b/sound/vehicles/racer_boost.wav differ
diff --git a/sound/vehicles/racer_idle.wav b/sound/vehicles/racer_idle.wav
new file mode 100644 (file)
index 0000000..025332a
Binary files /dev/null and b/sound/vehicles/racer_idle.wav differ
diff --git a/sound/vehicles/racer_move.wav b/sound/vehicles/racer_move.wav
new file mode 100644 (file)
index 0000000..193a5e2
Binary files /dev/null and b/sound/vehicles/racer_move.wav differ
diff --git a/sound/vehicles/raptor_fly.wav b/sound/vehicles/raptor_fly.wav
new file mode 100644 (file)
index 0000000..88c8609
Binary files /dev/null and b/sound/vehicles/raptor_fly.wav differ
diff --git a/sound/vehicles/raptor_speed.wav b/sound/vehicles/raptor_speed.wav
new file mode 100644 (file)
index 0000000..439eebc
Binary files /dev/null and b/sound/vehicles/raptor_speed.wav differ
diff --git a/sound/vehicles/spiderbot_die.wav b/sound/vehicles/spiderbot_die.wav
new file mode 100644 (file)
index 0000000..10b3d6e
Binary files /dev/null and b/sound/vehicles/spiderbot_die.wav differ
diff --git a/sound/vehicles/spiderbot_idle.wav b/sound/vehicles/spiderbot_idle.wav
new file mode 100644 (file)
index 0000000..fdc20e7
Binary files /dev/null and b/sound/vehicles/spiderbot_idle.wav differ
diff --git a/sound/vehicles/spiderbot_jump.wav b/sound/vehicles/spiderbot_jump.wav
new file mode 100644 (file)
index 0000000..6044499
Binary files /dev/null and b/sound/vehicles/spiderbot_jump.wav differ
diff --git a/sound/vehicles/spiderbot_land.wav b/sound/vehicles/spiderbot_land.wav
new file mode 100644 (file)
index 0000000..d797e1f
Binary files /dev/null and b/sound/vehicles/spiderbot_land.wav differ
diff --git a/sound/vehicles/spiderbot_strafe.wav b/sound/vehicles/spiderbot_strafe.wav
new file mode 100644 (file)
index 0000000..3f13220
Binary files /dev/null and b/sound/vehicles/spiderbot_strafe.wav differ
diff --git a/sound/vehicles/spiderbot_walk.wav b/sound/vehicles/spiderbot_walk.wav
new file mode 100644 (file)
index 0000000..6b7638a
Binary files /dev/null and b/sound/vehicles/spiderbot_walk.wav differ
diff --git a/textures/cockpit_gloss.tga b/textures/cockpit_gloss.tga
new file mode 100644 (file)
index 0000000..422b5bd
Binary files /dev/null and b/textures/cockpit_gloss.tga differ
diff --git a/textures/cockpit_reflect.tga b/textures/cockpit_reflect.tga
new file mode 100644 (file)
index 0000000..ea39a45
Binary files /dev/null and b/textures/cockpit_reflect.tga differ
diff --git a/textures/raptor.jpg b/textures/raptor.jpg
deleted file mode 100644 (file)
index 8a1cdce..0000000
Binary files a/textures/raptor.jpg and /dev/null differ
diff --git a/textures/raptor.tga b/textures/raptor.tga
new file mode 100644 (file)
index 0000000..2037f7b
Binary files /dev/null and b/textures/raptor.tga differ
diff --git a/textures/raptor_cockpit.jpg b/textures/raptor_cockpit.jpg
deleted file mode 100644 (file)
index fd999b5..0000000
Binary files a/textures/raptor_cockpit.jpg and /dev/null differ
diff --git a/textures/spiderbot_reflect.tga b/textures/spiderbot_reflect.tga
new file mode 100644 (file)
index 0000000..a2a4a04
Binary files /dev/null and b/textures/spiderbot_reflect.tga differ
diff --git a/textures/wakazachi_gloss.jpg b/textures/wakazachi_gloss.jpg
new file mode 100644 (file)
index 0000000..2c7878c
Binary files /dev/null and b/textures/wakazachi_gloss.jpg differ
diff --git a/textures/wakazachi_glow.tga b/textures/wakazachi_glow.tga
new file mode 100644 (file)
index 0000000..89e4813
Binary files /dev/null and b/textures/wakazachi_glow.tga differ
diff --git a/textures/wakazachi_reflect.tga b/textures/wakazachi_reflect.tga
new file mode 100644 (file)
index 0000000..cb88c1a
Binary files /dev/null and b/textures/wakazachi_reflect.tga differ
index 345a8e7b8458729e2f16d2b0c83da7e76d011e3c..f863dcfc7d2a088f2706d3b20302b3df3a8282e7 100644 (file)
@@ -7,9 +7,8 @@
 \menu_slist_showempty\Show empty servers
 \menu_slist_showfull\Show full servers that have no slots available
 \net_slist_pause\Pause updating the server list to prevent servers from "jumping around"
-\XonoticMultiplayerDialog/Info\Show more information about the currently highlighted server
+\XonoticMultiplayerDialog/Info...\Show more information about the currently highlighted server
 \XonoticMultiplayerDialog/Bookmark\Bookmark the currently highlighted server so that it's faster to find in the future
-\XonoticMultiplayerDialog/Havoc\Change to Havoc mode which has some modifications to the gameplay
 \XonoticMultiplayerDialog/Create\Host your own game
 \XonoticMultiplayerDialog/Demos\Browse and view demos
 \XonoticMultiplayerDialog/Player Setup\Customize your player settings
@@ -45,8 +44,8 @@
 \g_minstagib\Players will be given the Minstanex, which is a railgun with infinite damage. If the player runs out of ammo, he will have 10 seconds to find some or if he fails to do so, face death. The secondary fire mode is a laser which does not inflict any damage and is good for doing trickjumps.
 \g_nix\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.
 \g_nix_with_laser\Always carry the laser as an additional weapon in Nix
-\XonoticMultiplayerDialog/All\Select all maps
-\XonoticMultiplayerDialog/None\Unselect all maps
+\XonoticMultiplayerDialog/Select all\Select all maps
+\XonoticMultiplayerDialog/Select none\Unselect all maps
 
 
 \XonoticMultiplayerDialog/Timedemo\Benchmark how fast your computer can run the highlighted demo
@@ -69,7 +68,7 @@
 \crosshair_alpha\Adjust the opacity of the crosshair
 \crosshair_color\Adjust the crosshair color
 \sbar_hudselector\Use the old HUD layout
-\XonoticMultiplayerDialog/Radar, HUD & Waypoints...\Adjust the radar, HUD and waypoints
+\XonoticMultiplayerDialog/Waypoints setup...\-
 \_cl_name\Name under which you will appear in the game
 
 \XonoticSettingsDialog\Change the game settings
 \r_damageblur\Amount of motion blur when hurt - 0.4 recommended
 
 \XonoticSettingsDialog/Audio\Audio settings
+\mastervolume\-
 \bgmvolume\-
-\volume\-
 \snd_staticvolume\-
-\snd_worldchannel0volume\-
-\snd_entchannel3volume\-
-\snd_playerchannel6volume\-
-\snd_playerchannel7volume\-
-\snd_entchannel4volume\-
-\snd_playerchannel2volume\-
-\snd_playerchannel1volume\-
+\snd_channel0volume\-
+\snd_channel3volume\-
+\snd_channel6volume\-
+\snd_channel7volume\-
+\snd_channel4volume\-
+\snd_channel2volume\-
+\snd_channel1volume\-
 \snd_speed\Sound output frequency
 \snd_channels\Number of channels for the sound output
 \snd_swapstereo\Swap left/right channels
index 959dc7afdb0ae84dd036d81a2ae9a5bc4b859168..176aba865e60df3c4ddb6488a35e9cf75c908f52 100644 (file)
@@ -7,9 +7,8 @@
 \menu_slist_showempty\Aktiviere die Anzeige von leeren Servern
 \menu_slist_showfull\Aktiviere die Anzeige von vollen Servern, die keinen freien Platz mehr haben
 \net_slist_pause\Unterbreche die automatische Aktualisierung der Serverliste um ein "Herumspringen" zu verhindern
-\XonoticMultiplayerDialog/Info\Lass dir mehr Informationen über den markierten Server anzeigen
-\XonoticMultiplayerDialog/Bookmark\Setze ein Lesezeichen für den markierten Server um ihn beim nächsten mal schneller wiederzufinden
-\XonoticMultiplayerDialog/Havoc\Wechsel in den Havoc Modus, welcher zu Änderungen des Spielverhaltens führt
+\XonoticMultiplayerDialog/Info...\Lass dir mehr Informationen über den markierten Server anzeigen
+\XonoticMultiplayerDialog/Speichern\Setze ein Lesezeichen für den markierten Server um ihn beim nächsten mal schneller wiederzufinden
 \XonoticMultiplayerDialog/Starten\Hoste dein eigenes Spiel
 \XonoticMultiplayerDialog/Demos\Gucke dir Demos an
 \XonoticMultiplayerDialog/Spieler-Einstellungen\Ändere deine Spieler-Einstellungen
@@ -46,8 +45,8 @@
 \g_minstagib\Alle Spieler starten mit der Minstanex, eine elektromagnetische Schienenkanone mit unendlich viel Schaden. Wenn ein Spieler keine Munition mehr hat, bleiben ihm 10 Sekunden um neue zu finden, ansonsten stirbt er. Der 2. Feuermodus ist Laser, welcher keinen Schaden hinzufügen kann. Dieser eignet sich gut für Tricksprünge.
 \g_nix\Es gibt keine aufzusammelnden Gegenstände in Xonotic - Anstelle der Möglichkeit Waffen aufzusammeln, spielen alle mit der gleichen Waffe. Nach einiger Zeit startet ein Countdown, danach wechseln alle Spieler zu einer neuen gleichen Waffe.
 \g_nix_with_laser\In Nix ist als zweite Waffe der Laser vorhanden.
-\XonoticMultiplayerDialog/All\Wähle alle Maps.
-\XonoticMultiplayerDialog/None\Wähle alle Maps ab.
+\XonoticMultiplayerDialog/Select all\Wähle alle Maps.
+\XonoticMultiplayerDialog/Select none\Wähle alle Maps ab.
 
 
 \XonoticMultiplayerDialog/Timedemo\Mache einen Benchmark-Test der markierten Demo. Die Demo wird in Zeitraffer, -lupe abgespielt. Das Ergebnis wird in "gamedir/data/benchmark.log" gespeichert.
@@ -73,7 +72,7 @@
 \crosshair_color_green\Grüner Farbanteil des Fadenkreuzes.
 \crosshair_color_blue\Blauer Farbanteil des Fadenkreuzes.
 \sbar_hudselector\Verwende das alte HUD Layout.
-\XonoticMultiplayerDialog/Radar, HUD & Waypoints...\Stelle Radar, HUD & Wegpunkte ein.
+\XonoticMultiplayerDialog/Waypoints setup...\Stelle Radar, HUD & Wegpunkte ein.
 \_cl_name\Lege deinen Namen im Spiel fest.
 
 \XonoticSettingsDialog\Ändere die Spiel-Einstellungen
 \r_motionblur\Wert für die Bewegungsunschärfe - 0.5 empfohlen
 \r_damageblur\Wert für die Unschärfe bei einer Verletzung - 0.4 empfohlen
 
-\XonoticSettingsDialog/Audio\Audio-Einstellungen
+\XonoticSettingsDialog/Ton\Audio-Einstellungen
+\mastervolume\-
 \bgmvolume\-
-\volume\-
 \snd_staticvolume\-
-\snd_worldchannel0volume\-
-\snd_entchannel3volume\-
-\snd_playerchannel6volume\-
-\snd_playerchannel7volume\-
-\snd_entchannel4volume\-
-\snd_playerchannel2volume\-
-\snd_playerchannel1volume\-
+\snd_channel0volume\-
+\snd_channel3volume\-
+\snd_channel6volume\-
+\snd_channel7volume\-
+\snd_channel4volume\-
+\snd_channel2volume\-
+\snd_channel1volume\-
 \snd_speed\Ausgangsfrequenz des Tons
 \snd_channels\Anzahl der Kanäle für die Audiowiedergabe
 \snd_swapstereo\Linken und rechten Kanal der Stereowiedergabe tauschen
index 46371502f341cf11e9ed922cde58fc952b61ab3a..18108559a7a52033e8d2e79e81f1e0a8185ba514 100644 (file)
@@ -3,22 +3,21 @@
 
 
 \XonoticMultiplayerDialog\Juega online, contra tus amigos en LAN, ver demos o cambia la configuración del jugador
-\XonoticMultiplayerDialog/Servers\Encuentra servidores para jugar
+\XonoticMultiplayerDialog/Servidores\Encuentra servidores para jugar
 \menu_slist_showempty\Mostrar servidores vacíos
 \menu_slist_showfull\Mostrar los servidores que no tienen espacio disponible
 \net_slist_pause\Pausa la actualización de la lista de servidores para evitar que salteen
-\XonoticMultiplayerDialog/Info\Mostrar mas información sobre el actual servidor resaltado
-\XonoticMultiplayerDialog/Bookmark\Marcar el actual servidor resaltado para que sea mas facil encontrarlo en un futuro
-\XonoticMultiplayerDialog/Havoc\Cambiar a Havoc modo, el cual tiene algunas modificaciones en el juego
-\XonoticMultiplayerDialog/Create\Crear tu propio juego
+\XonoticMultiplayerDialog/Info...\Mostrar mas información sobre el actual servidor resaltado
+\XonoticMultiplayerDialog/Marcador\Marcar el actual servidor resaltado para que sea mas facil encontrarlo en un futuro
+\XonoticMultiplayerDialog/Crear\Crear tu propio juego
 \XonoticMultiplayerDialog/Demos\Navegar y ver demos
 \XonoticMultiplayerDialog/Player Setup\Configuración de jugador
 
 \XonoticTeamSelectDialog/Unirse al'mejor' equipo (seleccion automática)\Auto seleccionar equipo (recomendado)
-\XonoticTeamSelectDialog/red\Unirse al equipo rojo
-\XonoticTeamSelectDialog/blue\Unirse al equipo azul
-\XonoticTeamSelectDialog/yellow\Unirse al equipo amarillo
-\XonoticTeamSelectDialog/pink\Unirse al equipo rosa
+\XonoticTeamSelectDialog/rojo\Unirse al equipo rojo
+\XonoticTeamSelectDialog/azul\Unirse al equipo azul
+\XonoticTeamSelectDialog/amarillo\Unirse al equipo amarillo
+\XonoticTeamSelectDialog/rosa\Unirse al equipo rosa
 
 \timelimit_override\Límite de tiempo en minutos que cuando pase, terminara el combate
 \fraglimit_override\Cantidad de puntos necesarios antes de que termine el combate
 \g_minstagib\Los jugadores tendran Minstanex, el cual es un railgun con daño infinito. Si el jugador queda sin munición, tendra 10 segundos para buscar mas o morira. El modo de disparo secundario es un laser que no inflige daño y es bueno para hacer bromas.
 \g_nix\Xonotic sin items - en vez de recoger items, todos juegan con la misma arma. Despues de algún tiempo, comienza una cuenta regresiva, despues del cual todos juegan con otra arma.
 \g_nix_with_laser\Siempre lleva el láser como arma adicional en Nix
-\XonoticMultiplayerDialog/All\Seleccionar todos los mapas
-\XonoticMultiplayerDialog/None\Deseleccionar todos los mapas
+\XonoticMultiplayerDialog/Select all\Seleccionar todos los mapas
+\XonoticMultiplayerDialog/Select none\Deseleccionar todos los mapas
 
 
-\XonoticMultiplayerDialog/Timedemo\Prueba cuan rápido tu computadora puede correr la demo seleccionada
+\XonoticMultiplayerDialog/Demo temporizado\Prueba cuan rápido tu computadora puede correr la demo seleccionada
 
 \fov\Campo de visión en grados de 60 a 130, 90 es el default
 \cl_bobcycle\Frecuencia de balanceo de la vista
@@ -61,7 +60,7 @@
 \cl_weaponpriority_useforcycling\Haz uso de la lista de abajo when cambia de arma con la rueda del raton
 \cl_autoswitch\Cambia automáticamente al arma recogida si es mejor que la que esta llevando
 \r_drawviewmodel\Muestra el modelo de arma
-\cl_gunalign\Posición del modelo de arma; requiere conección
+\cl_gunalign\Posición del modelo de arma; requiere conexión
 
 \crosshair_per_weapon\Configura diferentes miras para cada arma, esto ayuda si estas jugando sin un modelo de arma
 \crosshair_color_override\Tambien configura el color del punto de mira dependiendo del arma que uses actualmente
@@ -71,7 +70,7 @@
 \crosshair_color_green\Componente verde del color del punto de mira
 \crosshair_color_blue\Componente azul del color del punto de mira
 \sbar_hudselector\Usar el viejo diseño de HUD
-\XonoticMultiplayerDialog/Radar, HUD & puntos de referencia...\Ajustar el radar, el HUD y los puntos de referencia
+\XonoticMultiplayerDialog/Waypoints setup...\Ajustar el radar, el HUD y los puntos de referencia
 \_cl_name\Nombre con el cual aparecerás en el juego
 
 \XonoticSettingsDialog\Cambiar la configuración del juego
 \XonoticCvarsDialog\-
 
 \XonoticQuitDialog\Salir del juego
-\XonoticQuitDialog/Yes\Volver al trabajo...
+\XonoticQuitDialog/Si\Volver al trabajo...
 \XonoticQuitDialog/No\Tengo algunos puntos más por hacer!
 
-\XonoticSettingsDialog/Input\configuración de entrada
+\XonoticSettingsDialog/Entrada\configuración de entrada
 \sensitivity\Multiplicador de velocidad del ratón
 \menu_mouse_speed\Multiplicador de velocidad del raton en el menu, esto no afecta al apuntar en el juego
 \m_filter\Suaviza el movimiento del raton, pero hace menos sensible al apuntar al objetivo
 \vid_samples\activar antialiasing, el cual suaviza los bordes en geometrias en 3D. Note que esto puede disminuir bastante el rendimiento (por defecto: desactivado)
 \v_flipped\Invertir la imagen horizontalmente (por defecto: desactivado)
 
-\XonoticSettingsDialog/Effects\configuración de efectos.
+\XonoticSettingsDialog/Efectos\configuración de efectos.
 \r_subdivisions_tolerance\Cambiar la suavidad de las curvas en el mapa (por defecto: normal)
 \gl_picmip\Cambiar la dureza de las texturas. Bajándolo efectivamente reducira el uso de la memoria de la textura, pero hará que las texturas aparezcan muy borrosas. (por defecto: bueno)
 \r_picmipworld\Si se activa, solo reduce la calidad de texturas de los modelos (activado por defecto)
 \r_coronas_occlusionquery\Coronas apagadas acorde a la visibilidad (activado por defecto)
 \r_bloom\Activar efecto bloom, que ilumina los píxeles vecinos de píxeles muy brillantes.Tiene un gran impacto en el rendimiento. (desactivado por defecto)
 \r_hdr\Versión de gran calidad de bloom, que tiene un gran impacto en el rendimiento. (desactivado por defecto)
-\r_motionblur\Nivel de desenfoque de movimiento - 0.5 recomendado
-\r_damageblur\Cantidad de desenfoque de movimiento en presencia de daños - 0.4 recomendado
+\r_motionblur\Nivel de difuminado de movimiento - 0.5 recomendado
+\r_damageblur\Cantidad de difuminado de movimiento en presencia de daños - 0.4 recomendado
 
-\XonoticSettingsDialog/Audio\configuración de audio
+\XonoticSettingsDialog/Sonido\configuración de audio
+\mastervolume\-
 \bgmvolume\-
-\volume\-
 \snd_staticvolume\-
-\snd_worldchannel0volume\-
-\snd_entchannel3volume\-
-\snd_playerchannel6volume\-
-\snd_playerchannel7volume\-
-\snd_entchannel4volume\-
-\snd_playerchannel2volume\-
-\snd_playerchannel1volume\-
+\snd_channel0volume\-
+\snd_channel3volume\-
+\snd_channel6volume\-
+\snd_channel7volume\-
+\snd_channel4volume\-
+\snd_channel2volume\-
+\snd_channel1volume\-
 \snd_speed\Frecuencia de salida del sonido
 \snd_channels\Número de canales para la salida del sonido
 \snd_swapstereo\Invertir canales izquierda o derecha
 \cl_hitsound\Reproduce un sonido indicador de anotacion cuando disparas a un enemigo
 \menu_sounds\Reproduce sonidos cuando se clickea o se posiciona sobre un item del menú
 
-\XonoticSettingsDialog/Network\configuración de la red
+\XonoticSettingsDialog/Red\configuración de la red
 \cl_movement\Activar predicción de movimiento del lado del cliente
 \cl_nolerp\Activar actualización suave en la red
 \shownetgraph\Activar un gráfico de tamaño de paquetes y otra información
index 1ab14650e365dcf4d23c5f9bd33c1da7cae12be0..534b6bfbe87e09266eec1ced0a98c842c94801d6 100644 (file)
@@ -3,22 +3,21 @@
 
 
 \XonoticMultiplayerDialog\Jouer en ligne avec des amis en réseau local ou sur Internet
-\XonoticMultiplayerDialog/Servers\Trouver des serveurs pour y jouer dessus
+\XonoticMultiplayerDialog/Serveurs\Trouver des serveurs pour y jouer dessus
 \menu_slist_showempty\Montrer les serveurs vides
 \menu_slist_showfull\Montrer les serveurs où toutes les places sont prises
 \net_slist_pause\Ne met pas à jour la liste de serveurs pour éviter de "glisser" sur un autre serveur
-\XonoticMultiplayerDialog/Info\Montrer plus d'information sur le serveur séléctionné
-\XonoticMultiplayerDialog/Bookmark\Mettre le serveur en haut de la liste pour pouvoir le repérer plus facilement plus tard
-\XonoticMultiplayerDialog/Havoc\Changer au mode Havoc qui comporte des modifications sur le jeu
-\XonoticMultiplayerDialog/Create\Héberger votre propre partie
-\XonoticMultiplayerDialog/Demos\Regarder des Vidéos pré-enregistrées
+\XonoticMultiplayerDialog/Info...\Montrer plus d'information sur le serveur séléctionné
+\XonoticMultiplayerDialog/Marque-page\Mettre le serveur en haut de la liste pour pouvoir le repérer plus facilement plus tard
+\XonoticMultiplayerDialog/Créer\Héberger votre propre partie
+\XonoticMultiplayerDialog/Vidéos\Regarder des Vidéos pré-enregistrées
 \XonoticMultiplayerDialog/Player Setup\Personaliser vos paramètres
 
 \XonoticTeamSelectDialog/join 'best' team (auto-select)\Auto-séléction de l'équipe qui a le plus besoin de vous (recommandé)
-\XonoticTeamSelectDialog/red\Joindre l'équipe rouge
-\XonoticTeamSelectDialog/blue\Joindre l'équipe bleue
-\XonoticTeamSelectDialog/yellow\Joindre l'équipe jaune
-\XonoticTeamSelectDialog/pink\Joindre l'équipe rose
+\XonoticTeamSelectDialog/rouge\Joindre l'équipe rouge
+\XonoticTeamSelectDialog/bleu\Joindre l'équipe bleue
+\XonoticTeamSelectDialog/jaune\Joindre l'équipe jaune
+\XonoticTeamSelectDialog/rose\Joindre l'équipe rose
 
 \timelimit_override\Limite de temps au match, le match se finit quand elle est atteinte
 \fraglimit_override\Limite de tués pour le match, le match se finit quand elle est atteinte
 \g_minstagib\Tous les joueurs reçoivent un MinstaNex, qui est un sniper hyperpuissant qui tue d'un coup. Si vous n'avez plus de munitions, vous mourez progressivement.
 \g_nix\No Items Xonotic; tous les joueurs ont la même arme en même temps, et on change d'arme régulièrement
 \g_nix_with_laser\Porter le laser avec l'arme du No Items Xonotic
-\XonoticMultiplayerDialog/All\Séléctionner toutes les cartes
-\XonoticMultiplayerDialog/None\Déséléctionner toutes les cartes
+\XonoticMultiplayerDialog/Select all\Séléctionner toutes les cartes
+\XonoticMultiplayerDialog/Select none\Déséléctionner toutes les cartes
 
 
-\XonoticMultiplayerDialog/Timedemo\Faire un test de performance en utilisant la vidéo choisie
+\XonoticMultiplayerDialog/Test Performance\Faire un test de performance en utilisant la vidéo choisie
 
 \fov\Champ de vision en degrés, par défaut 90, certains joueurs préfèrent entre 110 et 130
 \cl_bobcycle\Effet de "tremblement" de la caméra en courant
@@ -70,7 +69,7 @@
 \crosshair_color_green\Couleur: intensité du vert dans le viseur
 \crosshair_color_blue\Couleur: intensité du bleu dans le viseur
 \sbar_hudselector\Utiliser l'ancienne interface HUD
-\XonoticMultiplayerDialog/Radar, HUD & Waypoints...\Ajuster les paramètres de l'interface, de la mini-carte et des Waypoints
+\XonoticMultiplayerDialog/Waypoints setup...\Ajuster les paramètres de l'interface, de la mini-carte et des Waypoints
 \_cl_name\Pseudonyme utilisé pour vous reconnaître dans le jeu
 
 \XonoticSettingsDialog\Changer les paramètres du jeu
 \XonoticCvarsDialog\-
 
 \XonoticQuitDialog\Quitter Xonotic
-\XonoticQuitDialog/Yes\Retour au boulot...
-\XonoticQuitDialog/No\'Faut que je fragge plus de monde!
+\XonoticQuitDialog/Oui\Retour au boulot...
+\XonoticQuitDialog/Non\'Faut que je fragge plus de monde!
 
-\XonoticSettingsDialog/Input\Paramètres contrôle souris/clavier
+\XonoticSettingsDialog/Contrôles\Paramètres contrôle souris/clavier
 \sensitivity\Sensitivité de la souris
 \menu_mouse_speed\Sensitivité de la souris dans les menus, n'affecte pas le jeu
 \m_filter\Adoucit le mouvement de souris, mais crée une légère latence de souris
@@ -99,7 +98,7 @@
 \sbar_showbinds\Afficher les actions possibles avec des touches/commandes
 \cl_showpressedkeys\Afficher les touches qu'un joueur est en train d'appuyer
 
-\XonoticSettingsDialog/Video\Video settings
+\XonoticSettingsDialog/Vidéo\Video settings
 \vid_width\Résolution de l'écran
 \vid_bitsperpixel\Profondeur des couleurs: 16 bits est plus rapide, mais 32 bits est de meilleure qualité (recommandé)
 \vid_fullscreen\Activer le mode plein écran (par défaut: activé)
 \vid_samples\Activer l'anticrénelage, réduit l'effet d'escalier sur les modèles 3D, mais augmente fortement l'utilisation des ressources
 \v_flipped\Mode mirroir (par défaut: désactivé)
 
-\XonoticSettingsDialog/Effects\Paramètres des effets graphiques
+\XonoticSettingsDialog/Graphiques\Paramètres des effets graphiques
 \r_subdivisions_tolerance\Ajuster la qualité des modèles 3D de carte (courbes, tuyaux) (par défaut: normal)
 \gl_picmip\Ajuster la qualité des textures. La baisser diminue l'utilisation des ressources, mais rend les textures floues. (par défaut: normal)
 \r_picmipworld\If set, only reduce the texture quality of models (default: enabled)
 \r_damageblur\Intensité du flou en recevant des dégâts - 0.4 est recommandé
 
 \XonoticSettingsDialog/Audio\Audio settings
+\mastervolume\-
 \bgmvolume\-
-\volume\-
 \snd_staticvolume\-
-\snd_worldchannel0volume\-
-\snd_entchannel3volume\-
-\snd_playerchannel6volume\-
-\snd_playerchannel7volume\-
-\snd_entchannel4volume\-
-\snd_playerchannel2volume\-
-\snd_playerchannel1volume\-
+\snd_channel0volume\-
+\snd_channel3volume\-
+\snd_channel6volume\-
+\snd_channel7volume\-
+\snd_channel4volume\-
+\snd_channel2volume\-
+\snd_channel1volume\-
 \snd_speed\Fréquence de la sortie audio
 \snd_channels\Nombre de canaux pour la sortie audio
 \snd_swapstereo\Échanger les canneaux stéréo gauche/droite
 \cl_hitsound\Jouer un son quand vous touchez un enemi
 \menu_sounds\Jouer des sons en cliquant ou en passant la souris sur des options
 
-\XonoticSettingsDialog/Network\Paramètres du jeu en réseau
+\XonoticSettingsDialog/Réseau\Paramètres du jeu en réseau
 \cl_movement\Activer la prédiction des mouvements du joueur pour éviter les saccades lors de parties en réseau
 \cl_nolerp\Algorithme pour éviter les saccades lors de parties en réseau
 \shownetgraph\Show a 
 \cl_curl_maxspeed\Vitesse maximum de téléchargement
 \cl_port\Forcer le client à passer par le port défini (UDP) s'il n'est pas 0
 
-\XonoticSettingsDialog/Misc\Autres paramètres
+\XonoticSettingsDialog/Autres\Autres paramètres
 \showtime\Montrer l'heure, utile pour les captures d'écran
 \showdate\Montrer la date, utile pour les captures d'écran
 \showfps\Montrer le nombre d'Images Par Seconde rendues (Frames Per Second = FPS)
diff --git a/tooltips.db.it b/tooltips.db.it
new file mode 100644 (file)
index 0000000..ea0f44d
--- /dev/null
@@ -0,0 +1,201 @@
+0
+\XonoticSingleplayerDialog\Gioca la campagna in giocatore singolo o una partita istantanea contro dei bot
+
+
+\XonoticMultiplayerDialog\Gioca online, contro i tuoi amici in LAN, guarda demo o cambia le impostazioni del giocatore
+\XonoticMultiplayerDialog/Server\Cerca dei server dove giocare
+\menu_slist_showempty\Mostra server vuoti
+\menu_slist_showfull\Mostra server pieni che non hanno slot disponibili
+\net_slist_pause\Ferma l'aggiornamento della lista server per prevenire il continuo spostamento di posizione dei server
+\XonoticMultiplayerDialog/Info...\Mostra maggiori informazioni riguardo il server attualmente selezionato
+\XonoticMultiplayerDialog/Aggiungi tra i preferiti\Aggiungi nel segnalibri il server attualmente selezionato in modo che sia più veloce da trovare in futuro
+\XonoticMultiplayerDialog/Crea\Ospita la tua partita
+\XonoticMultiplayerDialog/Demo\Naviga e vedi le demo
+\XonoticMultiplayerDialog/Setup giocatore\Personalizza le tue impostazioni del giocatore
+
+\XonoticTeamSelectDialog/entra nel 'miglior' team (auto-selezione)\Autoseleziona team (raccomandato)
+\XonoticTeamSelectDialog/rosso\Entra nel team rosso
+\XonoticTeamSelectDialog/blu\Entra nel team blu
+\XonoticTeamSelectDialog/giallo\Entra nel team giallo
+\XonoticTeamSelectDialog/rosa\Entra nel team rosa
+
+\timelimit_override\Tempo limite in minuti che appena raggiunto terminerà la partita
+\fraglimit_override\Il numero di frag necessari prima che la partita finisca
+\menu_maxplayers\Il massimo numero di giocatori o bot che possono essere connessi al tuo server alla volta
+\bot_number\Numero di bot nel tuo server
+\skill\Specifica quanto i bot saranno esperti
+\g_maplist_votable\Numero di mappe che sono mostrate nel voto delle mappe alla fine di una partita
+\sv_vote_simple_majority_factor\La semplice maggioranza vince il voto
+\XonoticMultiplayerDialog/Impostazioni avanzate...\Impostazioni avanzate del server
+\XonoticMultiplayerDialog/Mutatori...\Mutatori e arene dedicate ad armi
+\g_dodging\Abilita schivamento
+\g_cloaked\Tutti i giocatori sono quasi invisibili
+\g_footsteps\Abilita suoni dei passi
+\g_midair\È possibile infliggere danni al tuo nemico solo quando è per aria
+\g_vampire\Il danno causato al tuo nemico aumenta la tua vita
+\g_bloodloss\L'ammontare di vita sotto la quale il tuo giocatore viene stordito per la perdita di sangue
+\sv_gravity\Rendi la caduta degli oggetti più lenta, valori inferiori significano minor gravità
+\g_grappling_hook\I giocatori nascono con il grappling hook
+\g_jetpack\I giocatori nascono col jetpack
+\g_pinata\I giocatori rilasceranno tutte le armi che possedevano appena vengono uccisi
+\g_weapon_stay\Le armi rimangono dopo che vengono raccolte
+\g_weaponarena\Selezionando un'arena dedicata ad un'arma si darà a tutti i giocatori quell'arma con munizioni infinite, e disabiliterà tutti gli altri raccoglimenti delle armi.
+\menu_weaponarena_with_laser\Abilita anche il laser nelle arene dedicate ad un'arma
+\g_minstagib\Ai giocatori sarà dato il Minstanex, che è un railgun con danni illimitati. Se il giocatore rimane senza munizioni, avrà 10 secondi per trovarne alcune, altrimenti morirà. Il fuoco secondario è un laser che non infligge nessun danno ed è buono per effettuare vari trickjump.
+\g_nix\"No items Xonotic" - invece di raccogliere oggetti, ognuno giocherà con la stessa arma. Dopo un pò di tempo, un conto alla rovescia inizierà, dopo il quale ognuno passerà ad un'altra arma.
+\g_nix_with_laser\Porta sempre il laser come arma aggiuntiva nella modalità "No items Xonotic"
+\XonoticMultiplayerDialog/Seleziona tutto\Seleziona tutte le mappe
+\XonoticMultiplayerDialog/Deseleziona tutto\Deseleziona tutte le mappe
+
+
+\XonoticMultiplayerDialog/Timedemo\Testa quanto velocemente il tuo computer fa girare il demo selezionato
+
+\fov\Il campo di vista da 60 a 130 gradi, di default è a 90 gradi
+\cl_bobcycle\Frequenza dell'ondeggiamento della visuale, disabilita per nessun ondeggiamento
+\cl_zoomfactor\Quanto grande è il fattore zoom quando il tasto per lo zoom viene premuto
+\cl_zoomsensitivity\Come lo zoom fa variare la sensibilità del mouse, da 0 (sensibilità più bassa) a 1 (nessun cambio di sensibilità)
+\cl_zoomspeed\Quando velocemente la vista viene zoomata, disabilitalo per lo zoom istantaneo
+\XonoticMultiplayerDialog/Impostazioni arma...\Imposta le tue armi preferite, i cambi automatici e le impostazioni dei modelli delle armi
+
+\cl_weaponpriority_useforcycling\Usa la lista qui sotto per definire le armi usando la rotellina del mouse
+\cl_autoswitch\Automaticamente passa all'arma appena raccolta se è migliore di quella che stavi già usando
+\r_drawviewmodel\Mostra il modello dell'arma
+\cl_gunalign\Posizione del modello dell'arma; richiede riconnessione
+
+\crosshair_per_weapon\Imposta un differente mirino per ogni arma, buono se giochi senza i modelli delle armi
+\crosshair_color_per_weapon\Imposta il colore del mirino dipendente dall'arma che stai correntemente usando
+\crosshair_size\Imposta la dimensione del mirino
+\crosshair_alpha\Imposta l'opacità del mirino
+\crosshair_color\Imposta il colore del mirino
+\sbar_hudselector\Usa il tema del vecchio HUD
+\XonoticMultiplayerDialog/Waypoints setup...\Imposta il radar, l'HUD e i waypoint
+\_cl_name\Nome col quale apparirai nel gioco
+
+\XonoticSettingsDialog\Cambia le impostazioni del gioco
+\XonoticCreditsDialog\I crediti di Xonotic
+\XonoticTeamSelectDialog\-
+\XonoticMutatorsDialog\-
+\XonoticMapInfoDialog\-
+\XonoticUserbindEditDialog\-
+\XonoticWinnerDialog\-
+\XonoticWeaponsDialog\-
+\XonoticRadarDialog\-
+\XonoticServerInfoDialog\-
+\XonoticCvarsDialog\-
+
+\XonoticQuitDialog\Esci dal gioco
+\XonoticQuitDialog/Sì\Devo tornare a lavorare...
+\XonoticQuitDialog/No\Ho ancora un pò di frag da fare!
+
+\XonoticSettingsDialog/Comandi\Impostazioni input
+\sensitivity\Moltiplicatore velocità del mouse
+\menu_mouse_speed\Velocità mouse nel menu, non riguarda il puntamento nel gioco
+\m_filter\Rendi più morbido il movimento del mouse, però rende la sua risposta leggermente più lenta
+\m_pitch\Inverti il movimento del mouse nell'asse Y
+\vid_dgamouse\Fai uso dell'input DGA del mouse
+\con_closeontoggleconsole\Rendi il tasto di chiusura console uguale a quella di apertura
+
+\XonoticSettingsDialog/Video\Impostazioni video
+\vid_width\Risoluzione schermo
+\vid_bitsperpixel\Bit per pixel (BPP) per il rendering, 32 è raccomandato
+\vid_fullscreen\Abilita modalità a tutto schermo (predefinito: abilitato)
+\vid_vsync\Abilita la sincronizzazione verticale per prevenire la lacrimazione (tearing), imposta il limite massimo di fps alla velocità di aggiornamento dello schermo (predefinito: disabilitato)
+\r_glsl\Abilita i pixel shader OpenGL 2.0 per l'illuminazione (predefinito: abilitato)
+\gl_vbo\Fai uso dei Vertex Buffer Objects per salvare nella memoria grafica la geometria statica per un rendering più veloce (predefinito: Vertici e Triangoli)
+\r_depthfirst\Elimina eccesso di disegno (overdraw) eseguendo il rendering della sola profondità della scena prima di iniziare il rendering "standard" (predefinito: disabilitato)
+\gl_texturecompression\Comprimi le texture per le schede video con poca memoria grafica disponibile (predefinito: Nessuna)
+\gl_finish\Fa in modo che la CPU attenda che la GPU finisca di elaborare ogni frame, può aiutare con alcuni strani input o in presenza di video lag in alcune macchine (predefinito: disabilitato)
+\v_brightness\Luminosità del nero (predefinito: 0)
+\v_contrast\Luminosità del bianco (predefinito: 1)
+\v_gamma\Valore della correzione gamma inversa, un effetto di luminosità che non tocca il bianco o il nero (predefinito: 1.125)
+\v_contrastboost\Di quanto viene moltiplicato il contrasto nelle aree oscure (predefinito: 1)
+\r_glsl_saturation\Adattamento saturazione (0 = scala di grigi, 1 = normale, 2 = sovra-saturo), richiede il GLSL color control (predefinito: 1)
+\v_glslgamma\Abilita l'uso delle GLSL per applicare la correzione gamma, nota che le performance potrebbero decrementare di tanto (predefinito: disabilitato)
+\r_ambient\Luminosità dell'ambiente, se è impostato ad un valore troppo alto tende a rendere la luce delle mappe opaca e piatta (predefinito: 4)
+\r_hdr_scenebrightness\Luminosità del rendering globale (predefinito: 1)
+\vid_samples\Abilita l'antialiasing, che smussa i bordi dei modelli in 3D. Nota che le performance potrebbero decrementare di un bel pò (predefinito: disabilitato)
+\v_flipped\Modalità mancino (Predefinito: off)
+
+\XonoticSettingsDialog/Effetti\Impostazioni effetti
+\r_subdivisions_tolerance\Cambia lo smussamento delle curve della mappa (predefinito: normali)
+\gl_picmip\Cambia la nitidezza delle textures. Valori più bassi riducono l'uso della memoria per le texture, però faranno apparire quest'ultime molto sfuocate. (predefinito: buona)
+\r_picmipworld\Se impostato, riduce solo la qualità delle texture dei modelli (predefinito: abilitato)
+\mod_q3bsp_nolightmaps\Usa le mappe di luce ad alta risoluzione, che appaiono più gradite alla vista, però sfruttano più memoria video (predefinito: abilitato)
+\cl_particles_quality\Moltiplicatore del numero di particelle. Valori inferiori significano meno particelle, che di conseguenza incrementano le performance (predefinito: 0.5)
+\r_drawparticles_drawdistance\Distanza per cui le particelle non vengono mostrate (predefinito: 1000)
+\cl_decals\Abilita i decal (buchi dei proiettili e sangue) (predefinito: abilitati)
+\r_drawdecals_drawdistance\I decal più lontano di questa distanza non vengono mostrati (predefinito: 300)
+\cl_decals_time\Tempo in secondi passato il quale i decal sfumano (predefinito: 2)
+\cl_gentle\Sostituisci il sangue e i gib con contenuti che non hanno alcun effetto di sangue (predefinito: disabilitato)
+\cl_nogibs\Riduci il numero di gib o rimuovili completamente (predefinito: parecchi)
+\v_kicktime\Quanto dura un colpo alla visuale per il danno (predefinito: 0)
+\gl_texture_anisotropy\Qualità del filtro anisotropico (predefinito: 1x)
+\r_glsl_deluxemapping\Usa gli effetti di illuminazione pixel per pixel (predefinito: abilitati)
+\r_shadow_gloss\Abilita l'uso della lucentezza delle mappe sulle texture che la supportano (predefinito: abilitati)
+\gl_flashblend\Abilita luci dinamiche più veloci ma meno gradevoli tramite il rendering di corone luminose invece di luci dinamiche reali (predefinito: disabilitato)
+\r_shadow_realtime_dlight\Abilita il rendering delle luci dinamiche come esplosioni e lancio di razzi (predefinito: abilitato)
+\r_shadow_realtime_dlight_shadows\Abilita il rendering di ombre dalle luci dinamiche (predefinito: abilitato)
+\r_shadow_realtime_world\Abilita il rendering delle luci dell'ambiente in tempo reale in mappe che le supportano. Nota che questo potrebbe avere un grande impatto sulle performance. (predefinito: disabilitato)
+\r_shadow_realtime_world_shadows\Abilita il rendering di ombre dalle luci dell'ambiente in tempo reale (predefinito: disabilitato)
+\r_shadow_usenormalmap\Abilita l'uso di ombre direzionali sulle texture (predefinito: abilitato)
+\r_showsurfaces\Disabilita completamente le texture per hardware molto lento. Questo dà un enorme boost alle performance, però appare molto poco gradevole. (predefinito: disabilitato)
+\r_glsl_offsetmapping\Effetto del mappaggio in offset che fa sembrare che le texture con bumpmaps "saltino fuori" dalle piane superfici in 2D (predefinito: disabilitato)
+\r_glsl_offsetmapping_reliefmapping\Mappaggio dell'offset di maggior qualità, che ha anche un enorme impatto sulle performance (predefinito: disabilitato)
+\r_water\Qualità dei riflessi e delle rifrazioni, ha un enorme impatto sulle performance nelle mappe superfici riflettenti (predefinito: disabilitato)
+\r_water_resolutionmultiplier\Risoluzione dei riflessi/rifrazioni (predefinito: buona)
+\r_coronas\Abilita i bagliori corona attorno a determinate luci (predefinito: abilitati)
+\r_coronas_occlusionquery\Dissolvi corone rispetto a visibilità (predefinito: abilitato)
+\r_bloom\Abilita effetti bloom, che illuminano i pixel più vicini a pixel molto luminosi. Hanno un grosso impatto sulle performance. (predefinito: disabilitato)
+\r_hdr\Versione a più alta qualità dei bloom, che hanno un enorme impatto sulle performance. (predefinito: disabilitato)
+\r_motionblur\Forza della sfocatura da movimento - raccomandato a 0.5
+\r_damageblur\Ammontare della sfocatura da movimento quando si è colpiti - raccomandato a 0.4
+
+\XonoticSettingsDialog/Audio\Impostazioni audio
+\mastervolume\-
+\bgmvolume\-
+\snd_staticvolume\-
+\snd_channel0volume\-
+\snd_channel3volume\-
+\snd_channel6volume\-
+\snd_channel7volume\-
+\snd_channel4volume\-
+\snd_channel2volume\-
+\snd_channel1volume\-
+\snd_speed\Frequenza di campionamento in uscita
+\snd_channels\Numero di canali in uscita
+\snd_swapstereo\Inverti canali sinistro/destro
+\snd_spatialization_control\Abilita spazialità (mischia leggermente i canali destro e sinistro per decrementare di un pò la separazione stereo per le cuffie)
+\cl_voice_directional\Abilita voci direzionali
+\cl_voice_directional_taunt_attenuation\Distanza dalla quale gli insulti possono essere uditi
+\cl_autotaunt\Automaticamente insulta i nemici quando gli fragghi
+\cl_sound_maptime_warning\Un annuncio ti avverte dei minuti rimanenti alla fine della partita
+\cl_hitsound\Riproduci un suono quando il tuo sparo colpisce un nemico
+\menu_sounds\Riproduci suoni quando clicchi o navighi su oggetti del menu
+
+\XonoticSettingsDialog/Rete\Impostazioni di rete
+\cl_movement\Abilita predizione del movimento lato client
+\cl_nolerp\Abilita aggiornamento da rete spianato
+\shownetgraph\Mostra un grafico delle dimensioni dei pacchetti e di altre informazioni
+\_cl_rate\Specifica la velocità della tua rete con questa barra
+\cl_netfps\Quanti pacchetti in ingresso inviare al server ogni secondo
+\cl_curl_maxdownloads\Massimo numero di download HTTP/FTP contemporanei
+\cl_curl_maxspeed\Velocità massima di download
+\cl_port\Forza il client a usare la porta selezionata a meno che non è impostata a 0
+
+\XonoticSettingsDialog/Altro\Impostazioni varie
+\showtime\Mostra l'orario corrente, utile negli screenshot
+\showdate\Mostra la data corrente, utile negli screenshot
+\showfps\Mostra i fotogrammi al secondo
+
+\XonoticSettingsDialog/Impostazioni avanzate...\Impostazioni avanzate dove puoi mettere mano ad ogni singola variabile del gioco
+\g_friendlyfire\Percentuale di danno inflitto ai compagni di squadra
+\g_mirrordamage\Percentuale di danno inflitto ai compagni di squadra che viene riversato su di te
+\g_tdm_teams_override\Non tenere conto del numero predefinito di squadre nei giochi di squadra
+
+\viewsize\Abilita/disabilita lo sfondo dell'HUD
+\cl_hidewaypoints\Mostra vari waypoint specifici di certi tipi di gioco
+\g_waypointsprite_scale\Scala moltiplicatore dei waypoint
+\g_waypointsprite_alpha\Controlla la trasparenza dei waypoint
+\cl_shownames\Mostra il nome del giocatore a cui stai mirando
+
+\crosshair_hittest\Nessuno: non fare il test di colpire per il mirino; TrueAim: sfoca il mirino quando non colpiresti il muro; Nemici: allarga anche il mirino quando colpiresti un nemico
index 914d3d47ef3e2075b921f6a02848c96be72bf5c4..36d11a2105a4736a2edba2e92f0ae46182cdb54e 100644 (file)
@@ -3,22 +3,22 @@
 
 
 \XonoticMultiplayerDialog\Играть по сети, просмотреть демо или изменить настройки игрока
-\XonoticMultiplayerDialog/Servers\Поиск игровых серверов
+\XonoticMultiplayerDialog/Серверы\Поиск игровых серверов
 \menu_slist_showempty\Показывать пустые сервера
 \menu_slist_showfull\Показывать полные сервера, не имеющие свободных мест
 \net_slist_pause\Приостановить обновление списка серверов для предотвращения их скакания
 \XonoticMultiplayerDialog/Info\Показать больше сведений о выбранном сервере
-\XonoticMultiplayerDialog/Bookmark\Добавить выбранный сервер в закладки, так найти его будет быстрее
+\XonoticMultiplayerDialog/В закладки\Добавить выбранный сервер в закладки, так найти его будет быстрее
 \XonoticMultiplayerDialog/Havoc\Change to Havoc mode which has some modifications to the gameplay
-\XonoticMultiplayerDialog/Create\Запустить собственную игру
-\XonoticMultiplayerDialog/Demos\Список демо для просмотра
+\XonoticMultiplayerDialog/Создать\Запустить собственную игру
+\XonoticMultiplayerDialog/Демо\Список демо для просмотра
 \XonoticMultiplayerDialog/Player Setup\Изменить настройки игрока
 
 \XonoticTeamSelectDialog/join 'best' team (auto-select)\Автовыбор команды (советуется)
-\XonoticTeamSelectDialog/red\Присоединиться к красной команде
-\XonoticTeamSelectDialog/blue\Присоединиться к синей команде
-\XonoticTeamSelectDialog/yellow\Присоединиться к жёлтой команде
-\XonoticTeamSelectDialog/pink\Присоединиться к розовой команде
+\XonoticTeamSelectDialog/красная\Присоединиться к красной команде
+\XonoticTeamSelectDialog/синяя\Присоединиться к синей команде
+\XonoticTeamSelectDialog/жёлтая\Присоединиться к жёлтой команде
+\XonoticTeamSelectDialog/розовая\Присоединиться к розовой команде
 
 \timelimit_override\Ограничение времени в минутах, состязание закончится при его достижении
 \fraglimit_override\Количество очков, необходимых для завершения состязания
@@ -48,7 +48,7 @@
 \XonoticMultiplayerDialog/None\Снять выделение со всех карт
 
 
-\XonoticMultiplayerDialog/Timedemo\Замерить, насколько быстро компьютер способен играть выбранное демо
+\XonoticMultiplayerDialog/Проверка производительности\Замерить, насколько быстро компьютер способен играть выбранное демо
 
 \fov\Угол обзора в градусах, допустимы значения от 60 то 130, по умолчанию 90
 \cl_bobcycle\Частота качания вида
 \XonoticCvarsDialog\-
 
 \XonoticQuitDialog\Выйти из игры
-\XonoticQuitDialog/Yes\Пора саночки возить...
-\XonoticQuitDialog/No\Остались здесь ещё дела!
+\XonoticQuitDialog/Да\Пора саночки возить...
+\XonoticQuitDialog/Нет\Остались здесь ещё дела!
 
-\XonoticSettingsDialog/Input\Настройки устройств ввода
+\XonoticSettingsDialog/Ввод\Настройки устройств ввода
 \sensitivity\Множитель скорости мыши
 \menu_mouse_speed\Множитель скорости мыши в меню, не влияет на прицеливание в игре
 \m_filter\Сглаживает движения мыши, но значительно ухудшает отзывчивость прицеливания
@@ -99,7 +99,7 @@
 \sbar_showbinds\Отображать действия / привязанные клавиши в строках, показываемых во время игры
 \cl_showpressedkeys\Показывать, какие кнопки движений нажимает игрок
 
-\XonoticSettingsDialog/Video\Настройки изображения
+\XonoticSettingsDialog/Изображение\Настройки изображения
 \vid_width\Разрешение экрана
 \vid_bitsperpixel\Сколько бит на точку использовать для вывода, советуется 32
 \vid_fullscreen\Включить полноэкранный режим (по умолчанию: включено)
 \vid_samples\Enable antialiasing, which smooths the edges of 3D geometry. Note that it might decrease performance by quite a lot (default: disabled)
 \v_flipped\Poor man's left handed mode (default: off)
 
-\XonoticSettingsDialog/Effects\Настройки эффектов
+\XonoticSettingsDialog/Эффекты\Настройки эффектов
 \r_subdivisions_tolerance\Change the smoothness of the curves on the map (default: normal)
 \gl_picmip\Change the sharpness of the textures. Lowering it will effectively reduce texture memory usage, but make the textures appear very blurry. (default: good)
 \r_picmipworld\If set, only reduce the texture quality of models (default: enabled)
 \r_motionblur\Motion blur strength - 0.5 recommended
 \r_damageblur\Amount of motion blur when hurt - 0.4 recommended
 
-\XonoticSettingsDialog/Audio\Настройки звука
+\XonoticSettingsDialog/Звук\Настройки звука
 \bgmvolume\-
 \volume\-
 \snd_staticvolume\-
 \cl_hitsound\Играть звук оповещения, когда выстрел достигает противника
 \menu_sounds\Играть звуки при взаимодействии с меню
 
-\XonoticSettingsDialog/Network\Настройки сети
+\XonoticSettingsDialog/Сеть\Настройки сети
 \cl_movement\Включить предсказание движения на стороне клиента
 \cl_nolerp\Enable network update smoothing
 \shownetgraph\Показывать график размеров пакетов и других сведений
 \cl_curl_maxspeed\Предел скорости скачивания
 \cl_port\Force client to use chosen port unless it is set to 0
 
-\XonoticSettingsDialog/Misc\Разные настройки
+\XonoticSettingsDialog/Разное\Разные настройки
 \showtime\Показывать текущее время, полезно на снимках экранов
 \showdate\Показывать текущую дату, полезно на снимках экранов
 \showfps\Show your rendered frames per second
index 607553c8e07243b67ce13217173d3d062dfc4eca..e08374945e4c55fff8631bd7521197596544561f 100644 (file)
@@ -8,6 +8,12 @@ set g_turrets_unit_walker_speed_swim 200
 set g_turrets_unit_walker_speed_jump 800
 set g_turrets_unit_walker_speed_stop 90
 
+set g_turrets_unit_walker_turn 20
+set g_turrets_unit_walker_turn_walk 15
+set g_turrets_unit_walker_turn_run 7
+set g_turrets_unit_walker_turn_swim 10
+set g_turrets_unit_walker_turn_strafe 5
+
 // Main machineguns prop's
 set g_turrets_unit_walker_std_shot_dmg 5
 set g_turrets_unit_walker_std_shot_refire 0.05
@@ -45,11 +51,11 @@ set g_turrets_unit_walker_std_track_type 1
 set g_turrets_unit_walker_std_rockets_range     4000
 set g_turrets_unit_walker_std_rockets_range_min 500
 set g_turrets_unit_walker_std_rocket_refire     10
-set g_turrets_unit_walker_std_rocket_dmg        50
+set g_turrets_unit_walker_std_rocket_dmg        45
 set g_turrets_unit_walker_std_rocket_radius     150
 set g_turrets_unit_walker_std_rocket_force      150
-set g_turrets_unit_walker_std_rocket_turnrate    0.4
-set g_turrets_unit_walker_std_rocket_speed      900
+set g_turrets_unit_walker_std_rocket_turnrate   0.05
+set g_turrets_unit_walker_std_rocket_speed      1000
 
 // Meele attack. Only happens when theres a target directly in front
 set g_turrets_unit_walker_std_meele_range 100
diff --git a/vehicle_bumblebee.cfg b/vehicle_bumblebee.cfg
new file mode 100644 (file)
index 0000000..0d4feb3
--- /dev/null
@@ -0,0 +1,40 @@
+set g_vehicle_bumblebee_speed_forward            400
+set g_vehicle_bumblebee_speed_strafe             200
+set g_vehicle_bumblebee_speed_up                 200
+set g_vehicle_bumblebee_speed_down               200
+set g_vehicle_bumblebee_turnspeed                72
+set g_vehicle_bumblebee_pitchspeed               36
+set g_vehicle_bumblebee_pitchlimit               15
+set g_vehicle_bumblebee_friction                 0.75
+
+set g_vehicle_bumblebee_energy                   500
+set g_vehicle_bumblebee_energy_regen             50
+set g_vehicle_bumblebee_energy_regen_pause       1
+
+set g_vehicle_bumblebee_health                   750
+set g_vehicle_bumblebee_health_regen             25
+set g_vehicle_bumblebee_health_regen_pause       5
+
+set g_vehicle_bumblebee_shield                   250
+set g_vehicle_bumblebee_shield_regen             100
+set g_vehicle_bumblebee_shield_regen_pause       2
+
+set g_vehicle_bumblebee_cannon_cost              10
+set g_vehicle_bumblebee_cannon_damage            75
+set g_vehicle_bumblebee_cannon_radius            150
+set g_vehicle_bumblebee_cannon_refire            1.5
+set g_vehicle_bumblebee_cannon_speed             5000
+set g_vehicle_bumblebee_cannon_spread            0.0125
+set g_vehicle_bumblebee_cannon_force             400
+set g_vehicle_bumblebee_cannon_turnspeed         90
+set g_vehicle_bumblebee_cannon_pitchlimit_down   60
+set g_vehicle_bumblebee_cannon_pitchlimit_up     60
+set g_vehicle_bumblebee_cannon_turnlimit_in      5
+set g_vehicle_bumblebee_cannon_turnlimit_out     45
+
+set g_vehicle_bumblebee_respawntime              10
+
+set g_vehicle_bumblebee_blowup_radius            500
+set g_vehicle_bumblebee_blowup_coredamage        500
+set g_vehicle_bumblebee_blowup_edgedamage        100
+set g_vehicle_bumblebee_blowup_forceintensity    600
\ No newline at end of file
index 1ab10cdae6f38a5e60698d4f69e5e06b7501f5d4..af6587546def9aa83b5581a4eb2efbc746754923 100644 (file)
@@ -1,54 +1,64 @@
-set g_vehicle_racer_reload             1
+set g_vehicle_racer_respawntime                    25
 
-set g_vehicle_racer_respawntime                   10
-set g_vehicle_racer_health                250
+set g_vehicle_racer_health              190
+set g_vehicle_racer_health_regen        0
+set g_vehicle_racer_health_regen_pause  0
 
-set g_vehicle_racer_shield                  100
-set g_vehicle_racer_shield_block            1
-set g_vehicle_racer_shield_regen            50
-set g_vehicle_racer_shield_regen_dmgpause   0.25
-set g_vehicle_racer_shield_regen_energyrate 2
+set g_vehicle_racer_shield              75
+set g_vehicle_racer_shield_regen        25
+set g_vehicle_racer_shield_regen_pause  1
 
-set g_vehicle_racer_energy          150
-set g_vehicle_racer_energy_regen    50
-set g_vehicle_racer_energy_usepause 1
+set g_vehicle_racer_energy              125
+set g_vehicle_racer_energy_regen        40
+set g_vehicle_racer_energy_regen_pause  1
 
-set g_vehicle_racer_speed_stop           2000
-set g_vehicle_racer_speed_forward        1600
-set g_vehicle_racer_speed_strafe         750
+set g_vehicle_racer_speed_stop          2000
+set g_vehicle_racer_speed_forward       800
+set g_vehicle_racer_speed_strafe        500
+set g_vehicle_racer_speed_afterburn     2000
+set g_vehicle_racer_friction            0.4
+set g_vehicle_racer_afterburn_cost      60      // energy consumed per second
 
-set g_vehicle_racer_speed_afterburn      3500
-set g_vehicle_racer_speed_afterburn_emin 25
-set g_vehicle_racer_speed_afterburn_cost 50
+set g_vehicle_racer_hovertype           0       // 0 = hover, != 0 = maglev
+set g_vehicle_racer_hoverpower          5000    // NOTE!! x 4 (4 engines)
+set g_vehicle_racer_upforcedamper       10
 
-set g_vehicle_racer_power_min          0
-set g_vehicle_racer_power_air          0
-set g_vehicle_racer_power_solid        8000
+set g_vehicle_racer_downforce            0.01
+set g_vehicle_racer_springlength         65
+set g_vehicle_racer_collision_multiplier 0.05
+set g_vehicle_racer_anglestabilizer      1.75
 
-set g_vehicle_racer_drag               0.25
-set g_vehicle_racer_dragexp            0.9
-
-set g_vehicle_racer_downforce          0.01
+set g_vehicle_racer_turnspeed          200
+set g_vehicle_racer_pitchspeed         100
+set g_vehicle_racer_maxpitch           25
+set g_vehicle_racer_turnroll           32
 
-set g_vehicle_racer_springlength       125
-set g_vehicle_racer_anglestabilizer    18
+set g_vehicle_racer_cannon_speed        9000
+set g_vehicle_racer_cannon_damage       20
+set g_vehicle_racer_cannon_radius       100
+set g_vehicle_racer_cannon_refire       0.1
+set g_vehicle_racer_cannon_cost         4
+set g_vehicle_racer_cannon_spread       0.0125
+set g_vehicle_racer_cannon_force        50
 
-set g_vehicle_racer_turnspeed          180
-set g_vehicle_racer_pitchspeed         360
-set g_vehicle_racer_maxpitch           25
-set g_vehicle_racer_turnroll           0.3
-
-set g_vehicle_racer_laser_speed        18000
-set g_vehicle_racer_laser_damage       20
-set g_vehicle_racer_laser_radius       100
-set g_vehicle_racer_laser_refire       0.05
-set g_vehicle_racer_laser_cost         2
-
-set g_vehicle_racer_rocket_speed       1500
-set g_vehicle_racer_rocket_accel       1500
-set g_vehicle_racer_rocket_turnrate    0.5
-set g_vehicle_racer_rocket_damage      200
-set g_vehicle_racer_rocket_radius      100
-set g_vehicle_racer_rocket_refire      5
+set g_vehicle_racer_rocket_speed       1000
+set g_vehicle_racer_rocket_accel       1400
+set g_vehicle_racer_rocket_turnrate    0.17
+set g_vehicle_racer_rocket_damage      160
+set g_vehicle_racer_rocket_force       350
+set g_vehicle_racer_rocket_radius      125
+set g_vehicle_racer_rocket_refire      6
 set g_vehicle_racer_rocket_cost        0
 
+set g_vehicle_racer_rocket_locktarget           1
+set g_vehicle_racer_rocket_locking_time         0.4
+set g_vehicle_racer_rocket_locking_releasetime  1.6
+set g_vehicle_racer_rocket_locked_time          5
+set g_vehicle_racer_rocket_locked_maxangle      1.46
+
+set g_vehicle_racer_blowup_radius           250
+set g_vehicle_racer_blowup_coredamage       250
+set g_vehicle_racer_blowup_edgedamage       15
+set g_vehicle_racer_blowup_forceintensity   250
+
+set g_vehicle_racer_mass                    900
index cbc3a1a69ca8778cb3ae5106b2a60d259c430c4a..e502c8db2ea4952d470127cf0021d3c6111d242a 100644 (file)
@@ -1,37 +1,61 @@
-set g_vehicle_raptor_reload             1
+set g_vehicle_raptor_respawntime 35
 
+// 0: go where player aims, +forward etc relative to aim angles
+// 1: ignore aim for up/down movement. +forward always moved forward, +jump always moves up
 set g_vehicle_raptor_movestyle 1
-set g_vehicle_raptor_turnspeed 90
+
 set g_vehicle_raptor_turnroll 0.1
-set g_vehicle_raptor_pitchspeed 45
-set g_vehicle_raptor_speed_forward 1500
-set g_vehicle_raptor_speed_strafe 1500
-set g_vehicle_raptor_speed_up 1250
-set g_vehicle_raptor_speed_down 1400
-
-set g_vehicle_raptor_bomblet_waves  2
-set g_vehicle_raptor_bomblet_wavefirst  0.5
-set g_vehicle_raptor_bomblet_wavenext   0.3
-set g_vehicle_raptor_bomblet_wawespread 0.3
-set g_vehicle_raptor_bomblets       3
-set g_vehicle_raptor_bomblet_damage 90
-set g_vehicle_raptor_bomblet_edgedamage 40
-set g_vehicle_raptor_bomblet_radius 250
-set g_vehicle_raptor_bomblet_force  300
-set g_vehicle_raptor_bombs_refire   1
-
-set g_vehicle_raptor_beam_dps     200
-set g_vehicle_raptor_beam_fops    150
-set g_vehicle_raptor_beam_aps     100
-set g_vehicle_raptor_beam_size    8
-set g_vehicle_raptor_beam_leangth 1
-set g_vehicle_raptor_beam_refire  2
-
-set g_vehicle_raptor_shield   250
-set g_vehicle_raptor_shield_regen 50
-
-set g_vehicle_raptor_health   250
-set g_vehicle_raptor_health_regen 10
-
-set g_vehicle_raptor_energy   300
-set g_vehicle_raptor_energy_regen 50
\ No newline at end of file
+
+set g_vehicle_raptor_turnspeed  80
+set g_vehicle_raptor_pitchspeed 40
+set g_vehicle_raptor_pitchlimit 35
+
+set g_vehicle_raptor_speed_forward 900
+set g_vehicle_raptor_speed_strafe  700
+set g_vehicle_raptor_speed_up      500
+set g_vehicle_raptor_speed_down    800
+set g_vehicle_raptor_friction      0.7
+
+set g_vehicle_raptor_bomblets           8
+set g_vehicle_raptor_bomblet_alt        750
+set g_vehicle_raptor_bomblet_time       0.5
+set g_vehicle_raptor_bomblet_spread     0.4
+set g_vehicle_raptor_bomblet_damage     50
+set g_vehicle_raptor_bomblet_edgedamage 20
+set g_vehicle_raptor_bomblet_radius     310
+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 90
+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_locking_time        0.4
+set g_vehicle_raptor_cannon_locking_releasetime 1.6
+set g_vehicle_raptor_cannon_locked_time         5
+set g_vehicle_raptor_cannon_predicttarget       1
+
+set g_vehicle_raptor_cannon_cost     1
+set g_vehicle_raptor_cannon_damage   25
+set g_vehicle_raptor_cannon_radius   60
+set g_vehicle_raptor_cannon_refire   0.05
+set g_vehicle_raptor_cannon_speed    12000
+set g_vehicle_raptor_cannon_spread   0.01
+set g_vehicle_raptor_cannon_force    50
+
+set g_vehicle_raptor_energy             30
+set g_vehicle_raptor_energy_regen       15
+set g_vehicle_raptor_energy_regen_pause 0.8
+
+set g_vehicle_raptor_health             150
+set g_vehicle_raptor_health_regen       0
+set g_vehicle_raptor_health_regen_pause 0
+
+set g_vehicle_raptor_shield             120
+set g_vehicle_raptor_shield_regen       25
+set g_vehicle_raptor_shield_regen_pause 1.5
+
+set g_vehicle_raptor_mass              2200
index d25ce205bcb7164ea0893ead6d0e955f9f4be24b..10a09454c65577f19a249219a7144bf25324ce67 100644 (file)
@@ -1,47 +1,60 @@
-set g_vehicle_spiderbot_respawntime                      30
-set g_vehicle_spiderbot_health                875
-set g_vehicle_spiderbot_health_regen             10
-set g_vehicle_spiderbot_health_regen_dmgpause 10
+set g_vehicle_spiderbot_respawntime                      45
 
-set g_vehicle_spiderbot_shield                125
+set g_vehicle_spiderbot_health                850
+set g_vehicle_spiderbot_health_regen             15
+set g_vehicle_spiderbot_health_regen_pause    10
+
+set g_vehicle_spiderbot_shield                150
 set g_vehicle_spiderbot_shield_block          1
 set g_vehicle_spiderbot_shield_regen          25
-set g_vehicle_spiderbot_shield_regen_dmgpause 0.25
+set g_vehicle_spiderbot_shield_regen_pause    0.2
+
+set g_vehicle_spiderbot_energy              0
+set g_vehicle_spiderbot_energy_regen        0
+set g_vehicle_spiderbot_energy_regen_pause  0
 
-set g_vehicle_spiderbot_turnspeed            90
+set g_vehicle_spiderbot_turnspeed            180
 set g_vehicle_spiderbot_head_turnspeed       120
 set g_vehicle_spiderbot_head_turnlimit       120
-set g_vehicle_spiderbot_head_pitchspeed      60
-set g_vehicle_spiderbot_head_pitchlimit_up   8
-set g_vehicle_spiderbot_head_pitchlimit_down -24
+set g_vehicle_spiderbot_head_pitchspeed      70
+set g_vehicle_spiderbot_head_pitchlimit_up   24
+set g_vehicle_spiderbot_head_pitchlimit_down -16
 
 set g_vehicle_spiderbot_speed_stop         50
 set g_vehicle_spiderbot_speed_walk         400
 set g_vehicle_spiderbot_speed_strafe       300
 set g_vehicle_spiderbot_movement_inertia   0.25
 
-set g_vehicle_spiderbot_minigun_damage         25
+set g_vehicle_spiderbot_minigun_damage         16
 set g_vehicle_spiderbot_minigun_spread         0.015
 set g_vehicle_spiderbot_minigun_speed          50000
 set g_vehicle_spiderbot_minigun_refire         0.05
+set g_vehicle_spiderbot_minigun_ammo_cost      1
+set g_vehicle_spiderbot_minigun_ammo_max       200
+set g_vehicle_spiderbot_minigun_ammo_regen     15
+set g_vehicle_spiderbot_minigun_ammo_regen_pause 1
 
-set g_vehicle_spiderbot_minigun_heat           10
-set g_vehicle_spiderbot_minigun_cooldown       10
+set g_vehicle_spiderbot_springlength         150
+set g_vehicle_spiderbot_springup             5
+set g_vehicle_spiderbot_springblend         0.15
 
 set g_vehicle_spiderbot_rocket_health     100
 set g_vehicle_spiderbot_rocket_damage     75
 set g_vehicle_spiderbot_rocket_edgedamage 15
 set g_vehicle_spiderbot_rocket_force      150
 set g_vehicle_spiderbot_rocket_radius     150
-set g_vehicle_spiderbot_rocket_reload     2.5
-set g_vehicle_spiderbot_rocket_refire     0.15
-set g_vehicle_spiderbot_rocket_speed      900
-set g_vehicle_spiderbot_rocket_turnrate   0.25
-set g_vehicle_spiderbot_rocket_noise      0.25
+set g_vehicle_spiderbot_rocket_reload     4
+set g_vehicle_spiderbot_rocket_refire     0.2
+set g_vehicle_spiderbot_rocket_speed      1750
+set g_vehicle_spiderbot_rocket_turnrate   0.2
+set g_vehicle_spiderbot_rocket_noise      0.3
 set g_vehicle_spiderbot_rocket_lifetime   30
 
 set g_vehicle_spiderbot_crush_dmg         50
 set g_vehicle_spiderbot_crush_force       50
 
+set g_vehicle_spiderbot_mass              5000
+
+
 set cl_vehicle_spiderbot_cross_alpha 0.4
 set cl_vehicle_spiderbot_cross_size  1
diff --git a/vehicles.cfg b/vehicles.cfg
new file mode 100644 (file)
index 0000000..e002321
--- /dev/null
@@ -0,0 +1,19 @@
+set g_vehicles 1
+
+exec vehicle_racer.cfg
+exec vehicle_raptor.cfg
+exec vehicle_spiderbot.cfg
+exec vehicle_bumblebee.cfg
+
+//set g_vehicle_racer_respawntime     10
+//set g_vehicle_spiderbot_respawntime 10
+//set g_vehicle_raptor_respawntime    10
+
+set g_vehicles_crush_dmg 70
+set g_vehicles_crush_force 50
+
+set cl_vehicles_hudscale 0.5way
+
+set g_vehicles_delayspawn 1
+set g_vehicles_delayspawn_jitter 10
+set g_vehicles_allow_flagcarry 1
index 38371eca775dc8933fd400c6c89dffcf131d5ddb..bcedcd6ef185996d42180a19590d4131cdfcaee2 100644 (file)
@@ -68,6 +68,11 @@ Henry "Exitium" Sanmark
 
 *French
 Calinou
+Taximus
+
+*Italian
+Antonio "terencehill" Piu
+Felice "MaidenBeast" Sallustio
 
 *Portuguese
 Ricardo "Hellgardia" Silva
@@ -79,30 +84,50 @@ MirceaKitsune
 Lord Canistra
 Nikoli
 
-**Active Contributors
+**Other Active Contributors
+Akari
+Ant "Antibody" Zucaro
 Antonio "terencehill" Piu
 Ben "MooKow" Banker
+blkrbt
 Calinou
 chooksta
 Cuinn "Cuinnton" Herrick
+Florian Paul "lda17h" Schmidt
 Kristian "morfar" Johansson
 kojn
 Maik "SavageX" Merten
+Mick Rippon
 MrBougo
+Przemysław "atheros" Grzywacz
 Ruszkai "C.Brutail" Ákos
 Samual Lenks
 Severin "sev" Meyer
 Stephan "esteel" Stahl
+The player with the unnecessarily long name
 Wolfgang "Blub\0" Bumiller
 SoulKeeper_p
 
+** TODO to be verified and sorted into the categories
+atheros - CA fixes
+cortez - map changes
+Florian Paul Schmidt - g_dodging
+parasti - various fixes
+magorian - a menu text overlap issue fix
+Paul Scott - keepaway bot AI
+PlasmaSheep - worked on player voices
+Sc0rp - some of our music
+Rodrigo Mouton Laudin <ratogenesis> - Spanish translation
+xaN1C4n3 - Hungarian translation
+PinkRobot and freefang - Dutch translation
+marcus256 - Swedish translation
+
 **Past Contributors
 Alexander "motorsep" Zubov
 Amos "torus" Dudley
 Andreas "Black" Kirsch
 Attila "WW3" Houtkooper
 BigMac
-blkrbt
 Braden "meoblast001" Walters
 Brain Younds
 Chris "amethyst7" Matz
@@ -162,7 +187,6 @@ Spirit
 Steve Vermeulen
 Supajoe
 Tei
-terencehill
 Tomaz
 Ulrich Galbraith
 Vortex
index 07716c32935af451a4dff23f438d5c5e0458a8e3..470aabad9ee9a33128f6f926b530b2039c260bab 100644 (file)
@@ -64,6 +64,10 @@ Henry "Exitium" Sanmark
 *Français
 Calinou
 
+*Italien
+Antonio "terencehill" Piu
+Felice "MaidenBeast" Sallustio
+
 *Portugais
 Ricardo "Hellgardia" Silva
 
diff --git a/xonotic-credits.txt.it b/xonotic-credits.txt.it
new file mode 100644 (file)
index 0000000..f0ace06
--- /dev/null
@@ -0,0 +1,178 @@
+**Sviluppatori principali
+
+Rudolf "divVerent" Polzer
+Tyler "-z-" Mulligan
+Merlijn Hofstra
+morphed
+mand1nga
+Jakob "tZork" Markström Gröhn
+
+**Coordinatori
+
+*Parte artistica
+Sahil "DiaboliK" Singhal
+
+*Texture / Web
+Tyler "-z-" Mulligan (web / game)
+FruitieX (game / web)
+
+*Modellazione 3D
+morphed
+
+*Concept Art
+LJFHutch
+Pearce "theShadow" Michal
+
+*Animazioni
+Sahil "DiaboliK" Singhal
+nifrek
+
+*Design dei livelli
+FruitieX
+MirceaKitsune
+Jakob "tZork" Markström Gröhn
+
+*Musiche / Effetti sonori
+mand1nga
+Merlijn Hofstra
+remaxim
+Stephan
+
+*Aggiunte al codice del motore e QA
+Rudolf "divVerent" Polzer
+
+*Codice del gioco
+Rudolf "divVerent" Polzer
+FruitieX
+Jakob "tZork" Markström Gröhn
+
+*Marketing / Pubbliche Relazioni
+Tyler "-z-" Mulligan
+mand1nga
+
+*Aspetti legali
+Rudolf "divVerent" Polzer
+Merlijn Hofstra
+
+**Motore del gioco
+DarkPlaces
+by Forest "LordHavoc" Hale
+
+**Traduttori
+
+*Tedesco
+Rudolf "divVerent" Polzer
+
+*Finlandese
+Henry "Exitium" Sanmark
+
+*Francese
+Calinou
+
+*Italiano
+Antonio "terencehill" Piu
+Felice "MaidenBeast" Sallustio
+
+*Portoghese
+Ricardo "Hellgardia" Silva
+
+*Rumeno
+MirceaKitsune
+
+*Russo
+Lord Canistra
+Nikoli
+
+**Contributori attivi
+Ant "Antibody" Zucaro
+Antonio "terencehill" Piu
+Ben "MooKow" Banker
+blkrbt
+Calinou
+chooksta
+Cuinn "Cuinnton" Herrick
+Florian Paul "lda17h" Schmidt
+Kristian "morfar" Johansson
+kojn
+Maik "SavageX" Merten
+MrBougo
+Przemysław "atheros" Grzywacz
+Ruszkai "C.Brutail" Ákos
+Samual Lenks
+Severin "sev" Meyer
+Stephan "esteel" Stahl
+Wolfgang "Blub\0" Bumiller
+SoulKeeper_p
+
+**Contributori passati
+Alexander "motorsep" Zubov
+Amos "torus" Dudley
+Andreas "Black" Kirsch
+Attila "WW3" Houtkooper
+BigMac
+Braden "meoblast001" Walters
+Brain Younds
+Chris "amethyst7" Matz
+Christian Ice
+Clinton "Kaziganthe" Freeman
+Dan "Digger" Korostelev
+Dan "Wazat" Hale
+Donkey
+dstrek
+Dustin Geeraert
+Edgenetwork
+Edward "Ed" Holness
+Eric "Munyul Verminard" Sambach
+Fabien "H. Reaper" Tschirhart
+FrikaC
+Garth "Zombie" Hendy
+Gerd "Elysis" Raudenbusch
+Gottfried "Toddd" Hofmann
+Henning "Tymo" Janssen
+"Innovati"
+Jitspoe
+Jody Gallagher
+Juergen "LowDragon" Timm
+KadaverJack
+Kevin "Tyrann" Shanahan
+Kurt Dereli
+lcatlnx
+Lee David Ash
+Lee Vermeulen
+leileilol
+Marius "GreEn`mArine" Shekow
+Marko "Urre" Permanto
+Mathieu "Elric" Olivier
+Mattrew "Tronyn" Rye
+MauveBib
+Mephisto
+michaelb
+Michael "Tenshihan" Quinn
+Munyul
+Netzwerg
+NoelCower
+Parapraxis
+Paul "Strahlemann" Evers
+Petithomme
+Q1 Retexturing Project
+Qantourisc
+Rick "Rat" Kelley
+Robert "ai" Kuroto
+Ronan
+Sajt
+Shaggy
+Shank
+Simon O'Callaghan
+SomeGuy
+Spike
+Spirit
+Steve Vermeulen
+Supajoe
+Tei
+Tomaz
+Ulrich Galbraith
+Vortex
+William Libert
+William "Willis" Weilep
+Yves "EviLair" Allaire
+Zenex