]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'mand1nga/rebrand' of ssh://git.xonotic.org/xonotic-data.pk3dir into...
authormand1nga <saulo_gil@argentina.com>
Sun, 6 Jun 2010 02:13:18 +0000 (23:13 -0300)
committermand1nga <saulo_gil@argentina.com>
Sun, 6 Jun 2010 02:13:18 +0000 (23:13 -0300)
1024 files changed:
.gitattributes [new file with mode: 0644]
.gitignore [new file with mode: 0644]
Makefile
balance.cfg
balance25.cfg
balanceNexrun.cfg [deleted file]
balanceSamual.cfg
balanceXPM.cfg [new file with mode: 0644]
bots.txt
common-spog.pk3 [deleted file]
config_update.cfg
cubemaps/default/skynx.png [new file with mode: 0644]
cubemaps/default/skyny.png [new file with mode: 0644]
cubemaps/default/skynz.png [new file with mode: 0644]
cubemaps/default/skypx.png [new file with mode: 0644]
cubemaps/default/skypy.png [new file with mode: 0644]
cubemaps/default/skypz.png [new file with mode: 0644]
default.cfg
default25.cfg [deleted file]
default26.cfg [deleted file]
defaultSamual.cfg [new file with mode: 0644]
defaultXPM.cfg [new file with mode: 0644]
defaultXonotic.cfg
effectinfo.txt
effects-high.cfg
effects-low.cfg
effects-med.cfg
effects-normal.cfg
effects-omg.cfg
effects-ultimate.cfg
font-dejavu.pk3dir/font-dejavu.cfg [deleted file]
font-dejavu.pk3dir/fonts/DejaVuSans-Bold.ttf [deleted file]
font-dejavu.pk3dir/fonts/DejaVuSansMono.ttf [deleted file]
gfx/brand.tga [deleted file]
gfx/crosshairseeker.tga [new file with mode: 0644]
gfx/hud/inv_weapon13.tga
gfx/hud/inv_weaponseeker.tga [new file with mode: 0644]
gfx/menu/wickedx/background.tga [new file with mode: 0644]
gfx/menu/wickedx/background_ingame.tga [new file with mode: 0644]
gfx/menu/wickedx/background_l2.tga [new file with mode: 0644]
gfx/menu/wickedx/bigbutton_c.tga [new file with mode: 0644]
gfx/menu/wickedx/bigbutton_d.tga [new file with mode: 0644]
gfx/menu/wickedx/bigbutton_f.tga [new file with mode: 0644]
gfx/menu/wickedx/bigbutton_n.tga [new file with mode: 0644]
gfx/menu/wickedx/bigbuttongray_c.tga [new file with mode: 0644]
gfx/menu/wickedx/bigbuttongray_d.tga [new file with mode: 0644]
gfx/menu/wickedx/bigbuttongray_f.tga [new file with mode: 0644]
gfx/menu/wickedx/bigbuttongray_n.tga [new file with mode: 0644]
gfx/menu/wickedx/border.tga [new file with mode: 0644]
gfx/menu/wickedx/button_c.tga [new file with mode: 0644]
gfx/menu/wickedx/button_d.tga [new file with mode: 0644]
gfx/menu/wickedx/button_f.tga [new file with mode: 0644]
gfx/menu/wickedx/button_n.tga [new file with mode: 0644]
gfx/menu/wickedx/buttongray_c.tga [new file with mode: 0644]
gfx/menu/wickedx/buttongray_d.tga [new file with mode: 0644]
gfx/menu/wickedx/buttongray_f.tga [new file with mode: 0644]
gfx/menu/wickedx/buttongray_n.tga [new file with mode: 0644]
gfx/menu/wickedx/charmap.tga [new file with mode: 0755]
gfx/menu/wickedx/charmapbutton.tga [new file with mode: 0644]
gfx/menu/wickedx/checkbox_c0.tga [new file with mode: 0644]
gfx/menu/wickedx/checkbox_c1.tga [new file with mode: 0644]
gfx/menu/wickedx/checkbox_d0.tga [new file with mode: 0644]
gfx/menu/wickedx/checkbox_d1.tga [new file with mode: 0644]
gfx/menu/wickedx/checkbox_f0.tga [new file with mode: 0644]
gfx/menu/wickedx/checkbox_f1.tga [new file with mode: 0644]
gfx/menu/wickedx/checkbox_n0.tga [new file with mode: 0644]
gfx/menu/wickedx/checkbox_n1.tga [new file with mode: 0644]
gfx/menu/wickedx/checkmark.tga [new file with mode: 0644]
gfx/menu/wickedx/closebutton_c.tga [new file with mode: 0644]
gfx/menu/wickedx/closebutton_f.tga [new file with mode: 0644]
gfx/menu/wickedx/closebutton_n.tga [new file with mode: 0644]
gfx/menu/wickedx/color.tga [new file with mode: 0755]
gfx/menu/wickedx/colorbutton_c.tga [new file with mode: 0644]
gfx/menu/wickedx/colorbutton_f.tga [new file with mode: 0644]
gfx/menu/wickedx/colorbutton_n.tga [new file with mode: 0755]
gfx/menu/wickedx/colorpicker.tga [new file with mode: 0755]
gfx/menu/wickedx/colorpicker_m.tga [new file with mode: 0755]
gfx/menu/wickedx/crosshairbutton_c.tga [new file with mode: 0644]
gfx/menu/wickedx/crosshairbutton_d.tga [new file with mode: 0755]
gfx/menu/wickedx/crosshairbutton_f.tga [new file with mode: 0644]
gfx/menu/wickedx/crosshairbutton_n.tga [new file with mode: 0755]
gfx/menu/wickedx/cursor.tga [new file with mode: 0644]
gfx/menu/wickedx/inputbox_f.tga [new file with mode: 0644]
gfx/menu/wickedx/inputbox_n.tga [new file with mode: 0644]
gfx/menu/wickedx/radiobutton_c0.tga [new file with mode: 0644]
gfx/menu/wickedx/radiobutton_c1.tga [new file with mode: 0644]
gfx/menu/wickedx/radiobutton_d0.tga [new file with mode: 0644]
gfx/menu/wickedx/radiobutton_d1.tga [new file with mode: 0644]
gfx/menu/wickedx/radiobutton_f0.tga [new file with mode: 0644]
gfx/menu/wickedx/radiobutton_f1.tga [new file with mode: 0644]
gfx/menu/wickedx/radiobutton_n0.tga [new file with mode: 0644]
gfx/menu/wickedx/radiobutton_n1.tga [new file with mode: 0644]
gfx/menu/wickedx/scrollbar_c.tga [new file with mode: 0644]
gfx/menu/wickedx/scrollbar_f.tga [new file with mode: 0644]
gfx/menu/wickedx/scrollbar_n.tga [new file with mode: 0644]
gfx/menu/wickedx/scrollbar_s.tga [new file with mode: 0644]
gfx/menu/wickedx/skinpreview.jpg [new file with mode: 0755]
gfx/menu/wickedx/skinvalues.txt [new file with mode: 0755]
gfx/menu/wickedx/slider_c.tga [new file with mode: 0644]
gfx/menu/wickedx/slider_d.tga [new file with mode: 0644]
gfx/menu/wickedx/slider_f.tga [new file with mode: 0644]
gfx/menu/wickedx/slider_n.tga [new file with mode: 0644]
gfx/menu/wickedx/slider_s.tga [new file with mode: 0644]
gfx/menu/wickedx/tooltip.tga [new file with mode: 0644]
models/ctf/flag_blue.md3
models/ctf/flag_red.md3
models/ctf/flags.md3_0.skin
models/ctf/flags.md3_1.skin
models/ctf/radiant/flag_blue_radiant.md3
models/ctf/radiant/flag_red_radiant.md3
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/final_rage/gspawn.md3
models/final_rage/lamp2.md3
models/final_rage/pspawn1.md3
models/gibs/arm.md3
models/gibs/arm.md3_0.skin
models/gibs/arm.md3_1.skin
models/gibs/arm.md3_2.skin
models/gibs/bloodyskull.md3
models/gibs/bloodyskull.md3_0.skin
models/gibs/bloodyskull.md3_1.skin
models/gibs/bloodyskull.md3_2.skin
models/gibs/chest.md3
models/gibs/chest.md3_0.skin
models/gibs/chest.md3_1.skin
models/gibs/chest.md3_2.skin
models/gibs/eye.md3
models/gibs/gib1.md3
models/gibs/gib2.md3
models/gibs/gib3.md3
models/gibs/gib4.md3
models/gibs/gib5.md3
models/gibs/gib6.md3
models/gibs/leg1.md3
models/gibs/leg1.md3_0.skin
models/gibs/leg1.md3_1.skin
models/gibs/leg1.md3_2.skin
models/gibs/leg2.md3
models/gibs/leg2.md3_0.skin
models/gibs/leg2.md3_1.skin
models/gibs/leg2.md3_2.skin
models/gibs/smallchest.md3
models/gibs/smallchest.md3_0.skin
models/gibs/smallchest.md3_1.skin
models/gibs/smallchest.md3_2.skin
models/grenademodel.md3
models/hook.md3
models/it/chair.md3
models/it/keyboard.md3
models/it/lcd.md3
models/it/pc.md3
models/items/a_cells.md3
models/items/a_shells.md3
models/items/g_a1.md3
models/items/g_a25.md3
models/items/g_a50.md3
models/items/g_armormedium.md3
models/items/g_h1.md3
models/items/g_h100.md3
models/items/g_h25.md3
models/items/g_h50.md3
models/items/g_invincible.md3
models/items/g_rl.md3
models/items/g_strength.md3
models/keyhunt/key.md3
models/map/forklift.md3
models/marker.md3
models/monsters/zombie.dpm.framegroups
models/mtree01.md3
models/mtree02.md3
models/mtree03.md3
models/nexball/ball.md3
models/nexflash.md3
models/onslaught/controlpoint_icon.md3
models/onslaught/controlpoint_icon_dmg1.md3
models/onslaught/controlpoint_icon_dmg2.md3
models/onslaught/controlpoint_icon_dmg3.md3
models/onslaught/controlpoint_icon_gib1.md3
models/onslaught/controlpoint_icon_gib2.md3
models/onslaught/controlpoint_icon_gib4.md3
models/onslaught/controlpoint_pad.md3
models/onslaught/controlpoint_pad2.md3
models/onslaught/gen_gib1.md3
models/onslaught/gen_gib2.md3
models/onslaught/gen_gib3.md3
models/onslaught/generator.md3
models/onslaught/generator_dead.md3
models/onslaught/generator_dmg1.md3
models/onslaught/generator_dmg2.md3
models/onslaught/generator_dmg3.md3
models/onslaught/generator_dmg4.md3
models/onslaught/generator_dmg5.md3
models/onslaught/generator_dmg6.md3
models/onslaught/generator_dmg7.md3
models/onslaught/generator_dmg8.md3
models/onslaught/generator_dmg9.md3
models/player/carni.tga [deleted file]
models/player/carni.txt [deleted file]
models/player/carni.zym [deleted file]
models/player/carni.zym.sounds [deleted file]
models/player/carni.zym_0.skin [deleted file]
models/player/carni.zym_1.skin [deleted file]
models/player/carni_lod1.zym [deleted file]
models/player/carni_lod1.zym_0.skin [deleted file]
models/player/carni_lod1.zym_1.skin [deleted file]
models/player/carni_lod2.zym [deleted file]
models/player/carni_lod2.zym_0.skin [deleted file]
models/player/carni_lod2.zym_1.skin [deleted file]
models/player/carniarmor.tga [deleted file]
models/player/carniarmor.txt [deleted file]
models/player/crash.zym [deleted file]
models/player/crash.zym.sounds [deleted file]
models/player/crash.zym_0.skin [deleted file]
models/player/crash_lod1.zym [deleted file]
models/player/crash_lod1.zym_0.skin [deleted file]
models/player/crash_lod2.zym [deleted file]
models/player/crash_lod2.zym_0.skin [deleted file]
models/player/fricka.tga [deleted file]
models/player/fricka.txt [deleted file]
models/player/gak.iqm [new file with mode: 0644]
models/player/gak.iqm.framegroups [new file with mode: 0644]
models/player/gak.iqm_0.tga [new file with mode: 0644]
models/player/gak.iqm_0.txt [new file with mode: 0644]
models/player/gakarmored.iqm [new file with mode: 0644]
models/player/gakarmored.iqm.framegroups [new file with mode: 0644]
models/player/gakarmored.iqm_0.tga [new file with mode: 0644]
models/player/gakarmored.iqm_0.txt [new file with mode: 0644]
models/player/gakmasked.iqm [new file with mode: 0644]
models/player/gakmasked.iqm.framegroups [new file with mode: 0644]
models/player/gakmasked.iqm_0.tga [new file with mode: 0644]
models/player/gakmasked.iqm_0.txt [new file with mode: 0644]
models/player/grunt.tga [deleted file]
models/player/grunt.txt [deleted file]
models/player/grunt.zym [deleted file]
models/player/grunt.zym.sounds [deleted file]
models/player/grunt.zym_0.skin [deleted file]
models/player/grunt_lod1.zym [deleted file]
models/player/grunt_lod1.zym_0.skin [deleted file]
models/player/grunt_lod2.zym [deleted file]
models/player/grunt_lod2.zym_0.skin [deleted file]
models/player/headhunter.tga [deleted file]
models/player/headhunter.txt [deleted file]
models/player/headhunter.zym [deleted file]
models/player/headhunter.zym.sounds [deleted file]
models/player/headhunter.zym_0.skin [deleted file]
models/player/headhunter_lod1.zym [deleted file]
models/player/headhunter_lod1.zym_0.skin [deleted file]
models/player/headhunter_lod2.zym [deleted file]
models/player/headhunter_lod2.zym_0.skin [deleted file]
models/player/heroine.tga [deleted file]
models/player/heroine.txt [deleted file]
models/player/ignis.iqm [new file with mode: 0644]
models/player/ignis.iqm.framegroups [new file with mode: 0644]
models/player/ignis.iqm_0.tga [new file with mode: 0644]
models/player/ignis.iqm_0.txt [new file with mode: 0644]
models/player/ignishalfmasked.iqm [new file with mode: 0644]
models/player/ignishalfmasked.iqm.framegroups [new file with mode: 0644]
models/player/ignishalfmasked.iqm_0.tga [new file with mode: 0644]
models/player/ignishalfmasked.iqm_0.txt [new file with mode: 0644]
models/player/ignishalfmasked_lod1.iqm [new file with mode: 0644]
models/player/ignishalfmasked_lod2.iqm [new file with mode: 0644]
models/player/ignismasked.iqm [new file with mode: 0644]
models/player/ignismasked.iqm.framegroups [new file with mode: 0644]
models/player/ignismasked.iqm_0.tga [new file with mode: 0644]
models/player/ignismasked.iqm_0.txt [new file with mode: 0644]
models/player/insurrectionist.tga [deleted file]
models/player/insurrectionist.txt [deleted file]
models/player/insurrectionist.zym [deleted file]
models/player/insurrectionist.zym.sounds [deleted file]
models/player/insurrectionist.zym_0.skin [deleted file]
models/player/insurrectionist_lod1.zym [deleted file]
models/player/insurrectionist_lod1.zym_0.skin [deleted file]
models/player/insurrectionist_lod2.zym [deleted file]
models/player/insurrectionist_lod2.zym_0.skin [deleted file]
models/player/jeandarc.zym [deleted file]
models/player/jeandarc.zym_0.skin [deleted file]
models/player/jeandarc_lod1.zym [deleted file]
models/player/jeandarc_lod1.zym_0.skin [deleted file]
models/player/jeandarc_lod2.zym [deleted file]
models/player/jeandarc_lod2.zym_0.skin [deleted file]
models/player/lurk.tga [deleted file]
models/player/lurk.txt [deleted file]
models/player/lurk.zym [deleted file]
models/player/lurk.zym.sounds [deleted file]
models/player/lurk.zym_0.skin [deleted file]
models/player/lurk.zym_1.skin [deleted file]
models/player/lurk_lod1.zym [deleted file]
models/player/lurk_lod1.zym_0.skin [deleted file]
models/player/lurk_lod1.zym_1.skin [deleted file]
models/player/lurk_lod2.zym [deleted file]
models/player/lurk_lod2.zym_0.skin [deleted file]
models/player/lurk_lod2.zym_1.skin [deleted file]
models/player/lycanthrope.tga [deleted file]
models/player/lycanthrope.txt [deleted file]
models/player/lycanthrope.zym [deleted file]
models/player/lycanthrope.zym.sounds [deleted file]
models/player/lycanthrope.zym_0.skin [deleted file]
models/player/lycanthrope_lod1.zym [deleted file]
models/player/lycanthrope_lod1.zym_0.skin [deleted file]
models/player/lycanthrope_lod2.zym [deleted file]
models/player/lycanthrope_lod2.zym_0.skin [deleted file]
models/player/marine.tga [deleted file]
models/player/marine.txt [deleted file]
models/player/marine.zym [deleted file]
models/player/marine.zym.sounds [deleted file]
models/player/marine.zym_0.skin [deleted file]
models/player/marine_lod1.zym [deleted file]
models/player/marine_lod1.zym_0.skin [deleted file]
models/player/marine_lod2.zym [deleted file]
models/player/marine_lod2.zym_0.skin [deleted file]
models/player/mulder.tga [deleted file]
models/player/mulder.txt [deleted file]
models/player/nexus.tga [deleted file]
models/player/nexus.txt [deleted file]
models/player/nexus.zym [deleted file]
models/player/nexus.zym.sounds [deleted file]
models/player/nexus.zym_0.skin [deleted file]
models/player/nexus.zym_1.skin [deleted file]
models/player/nexus.zym_2.skin [deleted file]
models/player/nexus.zym_3.skin [deleted file]
models/player/nexus.zym_4.skin [deleted file]
models/player/nexus.zym_5.skin [deleted file]
models/player/nexus.zym_6.skin [deleted file]
models/player/nexus_lod1.zym [deleted file]
models/player/nexus_lod1.zym_0.skin [deleted file]
models/player/nexus_lod1.zym_1.skin [deleted file]
models/player/nexus_lod1.zym_2.skin [deleted file]
models/player/nexus_lod1.zym_3.skin [deleted file]
models/player/nexus_lod1.zym_4.skin [deleted file]
models/player/nexus_lod1.zym_5.skin [deleted file]
models/player/nexus_lod1.zym_6.skin [deleted file]
models/player/nexus_lod2.zym [deleted file]
models/player/nexus_lod2.zym_0.skin [deleted file]
models/player/nexus_lod2.zym_1.skin [deleted file]
models/player/nexus_lod2.zym_2.skin [deleted file]
models/player/nexus_lod2.zym_3.skin [deleted file]
models/player/nexus_lod2.zym_4.skin [deleted file]
models/player/nexus_lod2.zym_5.skin [deleted file]
models/player/nexus_lod2.zym_6.skin [deleted file]
models/player/pyria.iqm [new file with mode: 0644]
models/player/pyria.iqm.framegroups [new file with mode: 0644]
models/player/pyria.iqm_0.sounds [new file with mode: 0644]
models/player/pyria.iqm_0.tga [new file with mode: 0644]
models/player/pyria.iqm_0.txt [new file with mode: 0644]
models/player/pyria.tga [deleted file]
models/player/pyria.txt [deleted file]
models/player/pyria.zym [deleted file]
models/player/pyria.zym.sounds [deleted file]
models/player/pyria.zym_0.skin [deleted file]
models/player/pyria_lod1.iqm [new file with mode: 0644]
models/player/pyria_lod1.zym [deleted file]
models/player/pyria_lod1.zym_0.skin [deleted file]
models/player/pyria_lod2.iqm [new file with mode: 0644]
models/player/pyria_lod2.zym [deleted file]
models/player/pyria_lod2.zym_0.skin [deleted file]
models/player/quark.tga [deleted file]
models/player/quark.txt [deleted file]
models/player/reptile.tga [deleted file]
models/player/reptile.txt [deleted file]
models/player/shock.tga [deleted file]
models/player/shock.txt [deleted file]
models/player/shock.zym [deleted file]
models/player/shock.zym.sounds [deleted file]
models/player/shock.zym_0.skin [deleted file]
models/player/shock_lod1.zym [deleted file]
models/player/shock_lod1.zym_0.skin [deleted file]
models/player/shock_lod2.zym [deleted file]
models/player/shock_lod2.zym_0.skin [deleted file]
models/player/skadi.tga [deleted file]
models/player/skadi.txt [deleted file]
models/player/skadi.zym [deleted file]
models/player/skadi.zym.sounds [deleted file]
models/player/skadi.zym_0.skin [deleted file]
models/player/skadi_lod1.zym [deleted file]
models/player/skadi_lod1.zym_0.skin [deleted file]
models/player/skadi_lod2.zym [deleted file]
models/player/skadi_lod2.zym_0.skin [deleted file]
models/player/specop.tga [deleted file]
models/player/specop.txt [deleted file]
models/player/specop.zym [deleted file]
models/player/specop.zym.sounds [deleted file]
models/player/specop.zym_0.skin [deleted file]
models/player/specop_lod1.zym [deleted file]
models/player/specop_lod1.zym_0.skin [deleted file]
models/player/specop_lod2.zym [deleted file]
models/player/specop_lod2.zym_0.skin [deleted file]
models/player/umbra.iqm [new file with mode: 0644]
models/player/umbra.iqm.framegroups [new file with mode: 0644]
models/player/umbra.iqm_0.tga [new file with mode: 0644]
models/player/umbra.iqm_0.txt [new file with mode: 0644]
models/player/visitant.zym [deleted file]
models/player/visitant.zym.sounds [deleted file]
models/player/visitant.zym_0.skin [deleted file]
models/player/visitant_lod1.zym [deleted file]
models/player/visitant_lod1.zym_0.skin [deleted file]
models/player/visitant_lod2.zym [deleted file]
models/player/visitant_lod2.zym_0.skin [deleted file]
models/player/xolar.dpm [deleted file]
models/player/xolar.dpm.framegroups [deleted file]
models/player/xolar.dpm.sounds [deleted file]
models/player/xolar.tga [deleted file]
models/player/xolar.txt [deleted file]
models/player/xolar.zym.sounds [deleted file]
models/player/xolar_lod1.dpm [deleted file]
models/player/xolar_lod1.dpm.framegroups [deleted file]
models/player/xolar_lod2.dpm [deleted file]
models/player/xolar_lod2.dpm.animinfo [deleted file]
models/player/xolar_lod2.dpm.framegroups [deleted file]
models/portal.md3
models/portal.md3_0.skin
models/portal.md3_1.skin
models/portal.md3_2.skin
models/race/checkpoint/checkpoint.md3
models/race/checkpoint/checkpoint_half.md3
models/rocket.md3
models/sprites/defend.sp2
models/sprites/destroy.sp2
models/sprites/push.sp2
models/tagrocket.md3 [new file with mode: 0644]
models/tagrocket.tga [new file with mode: 0644]
models/turrets/c512.md3
models/turrets/hunter2.md3
models/turrets/radiant/walker.md3
models/turrets/terrainbase.md3
models/turrets/walker_body.md3
models/turrets/walker_body.md3.framegroups
models/turrets/walker_mghead.md3
models/turrets/walker_spawn.md3
models/uziflash.md3
models/vehicles/raptor.dpm [new file with mode: 0644]
models/vehicles/raptor_bomb.dpm [new file with mode: 0644]
models/vehicles/raptor_cockpit.dpm [new file with mode: 0644]
models/vehicles/raptor_gun.dpm [new file with mode: 0644]
models/vehicles/spiderbot.dpm.framegroups
models/weapons/g_campingrifle.md3
models/weapons/g_crylink.md3
models/weapons/g_electro.md3
models/weapons/g_fireball.md3
models/weapons/g_gl.md3
models/weapons/g_hagar.md3
models/weapons/g_hlac.md3
models/weapons/g_hookgun.md3
models/weapons/g_laser.md3
models/weapons/g_minstanex.md3
models/weapons/g_nex.md3
models/weapons/g_porto.md3
models/weapons/g_rl.md3
models/weapons/g_seeker.md3 [new file with mode: 0644]
models/weapons/g_shotgun.md3
models/weapons/g_tuba.md3
models/weapons/g_uzi.md3
models/weapons/h_campingrifle.dpm [deleted file]
models/weapons/h_campingrifle.dpm.framegroups [deleted file]
models/weapons/h_campingrifle.iqm [new file with mode: 0644]
models/weapons/h_campingrifle.iqm.framegroups [new file with mode: 0644]
models/weapons/h_crylink.dpm [deleted file]
models/weapons/h_crylink.dpm.framegroups [deleted file]
models/weapons/h_crylink.iqm [new file with mode: 0644]
models/weapons/h_crylink.iqm.framegroups [new file with mode: 0644]
models/weapons/h_electro.dpm [deleted file]
models/weapons/h_electro.dpm.framegroups [deleted file]
models/weapons/h_electro.iqm [new file with mode: 0644]
models/weapons/h_electro.iqm.framegroups [new file with mode: 0644]
models/weapons/h_fireball.dpm [deleted file]
models/weapons/h_fireball.dpm.framegroups [deleted file]
models/weapons/h_fireball.iqm [new file with mode: 0644]
models/weapons/h_fireball.iqm.framegroups [new file with mode: 0644]
models/weapons/h_gl.dpm [deleted file]
models/weapons/h_gl.dpm.framegroups [deleted file]
models/weapons/h_gl.iqm [new file with mode: 0644]
models/weapons/h_gl.iqm.framegroups [new file with mode: 0644]
models/weapons/h_hagar.dpm [deleted file]
models/weapons/h_hagar.dpm.framegroups [deleted file]
models/weapons/h_hagar.iqm [new file with mode: 0644]
models/weapons/h_hagar.iqm.framegroups [new file with mode: 0644]
models/weapons/h_hlac.dpm [deleted file]
models/weapons/h_hlac.dpm.framegroups [deleted file]
models/weapons/h_hlac.iqm [new file with mode: 0644]
models/weapons/h_hlac.iqm.framegroups [new file with mode: 0644]
models/weapons/h_hookgun.dpm [deleted file]
models/weapons/h_hookgun.dpm.framegroups [deleted file]
models/weapons/h_hookgun.iqm [new file with mode: 0644]
models/weapons/h_hookgun.iqm.framegroups [new file with mode: 0644]
models/weapons/h_laser.dpm [deleted file]
models/weapons/h_laser.dpm.framegroups [deleted file]
models/weapons/h_laser.iqm [new file with mode: 0644]
models/weapons/h_laser.iqm.framegroups [new file with mode: 0644]
models/weapons/h_minstanex.dpm [deleted file]
models/weapons/h_minstanex.dpm.framegroups [deleted file]
models/weapons/h_minstanex.iqm [new file with mode: 0644]
models/weapons/h_minstanex.iqm.framegroups [new file with mode: 0644]
models/weapons/h_nex.dpm [deleted file]
models/weapons/h_nex.dpm.framegroups [deleted file]
models/weapons/h_nex.iqm [new file with mode: 0644]
models/weapons/h_nex.iqm.framegroups [new file with mode: 0644]
models/weapons/h_porto.dpm [deleted file]
models/weapons/h_porto.dpm.framegroups [deleted file]
models/weapons/h_porto.iqm [new file with mode: 0644]
models/weapons/h_porto.iqm.framegroups [new file with mode: 0644]
models/weapons/h_rl.dpm [deleted file]
models/weapons/h_rl.dpm.framegroups [deleted file]
models/weapons/h_rl.iqm [new file with mode: 0644]
models/weapons/h_rl.iqm.framegroups [new file with mode: 0644]
models/weapons/h_seeker.iqm [new file with mode: 0644]
models/weapons/h_seeker.iqm.framegroups [new file with mode: 0644]
models/weapons/h_shotgun.dpm [deleted file]
models/weapons/h_shotgun.dpm.framegroups [deleted file]
models/weapons/h_shotgun.iqm [new file with mode: 0644]
models/weapons/h_shotgun.iqm.framegroups [new file with mode: 0644]
models/weapons/h_tuba.dpm [deleted file]
models/weapons/h_tuba.dpm.framegroups [deleted file]
models/weapons/h_tuba.iqm [new file with mode: 0644]
models/weapons/h_tuba.iqm.framegroups [new file with mode: 0644]
models/weapons/h_uzi.dpm [deleted file]
models/weapons/h_uzi.dpm.framegroups [deleted file]
models/weapons/h_uzi.iqm [new file with mode: 0644]
models/weapons/h_uzi.iqm.framegroups [new file with mode: 0644]
models/weapons/v_campingrifle.md3
models/weapons/v_crylink.md3
models/weapons/v_electro.md3
models/weapons/v_fireball.md3
models/weapons/v_gl.md3
models/weapons/v_hagar.md3
models/weapons/v_hlac.md3
models/weapons/v_hookgun.md3
models/weapons/v_laser.md3
models/weapons/v_minstanex.md3
models/weapons/v_nex.md3
models/weapons/v_porto.md3
models/weapons/v_rl.md3
models/weapons/v_seeker.md3 [new file with mode: 0644]
models/weapons/v_shotgun.md3
models/weapons/v_tuba.md3
models/weapons/v_uzi.md3
models/weapons/w_electro.zym
models/weapons/w_gl.zym
models/weapons/w_shotgun.zym
monster_zombie.cfg
particles/particlefont-template.png
particles/particlefont-template.txt [new file with mode: 0644]
particles/particlefont.tga
particles/particlefont.txt
physics10.cfg
physics11.cfg
physics151.cfg
physics151b.cfg
physics16rc1.cfg
physics20.cfg
physics25.cfg
physics26.cfg
physicsCPMA.cfg
physicsHavoc.cfg
physicsLeeStricklin.cfg [new file with mode: 0644]
physicsLzd.cfg
physicsNexrun.cfg [deleted file]
physicsNexrun_old.cfg [deleted file]
physicsNoQWBunny.cfg
physicsQ.cfg
physicsQ2.cfg
physicsQ2a.cfg
physicsQ3.cfg
physicsQBF.cfg
physicsQBFplus.cfg
physicsSamual.cfg
physicsWarsow.cfg
physicsWarsowClassicBunny.cfg
physicsWarsowDev.cfg
physicsXPM.cfg [new file with mode: 0644]
qcsrc/client/Main.qc
qcsrc/client/View.qc
qcsrc/client/csqc_builtins.qc
qcsrc/client/damage.qc
qcsrc/client/gibs.qc
qcsrc/client/hook.qc
qcsrc/client/hud.qc.orig [new file with mode: 0644]
qcsrc/client/main.qh
qcsrc/client/progs.src
qcsrc/client/projectile.qc
qcsrc/client/sbar.qc
qcsrc/client/target_music.qc [new file with mode: 0644]
qcsrc/common/constants.qh
qcsrc/common/mapinfo.qc
qcsrc/common/util.qc
qcsrc/common/util.qh
qcsrc/menu/anim/animation.c
qcsrc/menu/anim/animhost.c
qcsrc/menu/anim/easing.c
qcsrc/menu/anim/keyframe.c
qcsrc/menu/item/image.c
qcsrc/menu/item/listbox.c
qcsrc/menu/item/slider.c
qcsrc/menu/item/textslider.c
qcsrc/menu/mbuiltin.qh
qcsrc/menu/menu.qc
qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c
qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c
qcsrc/menu/xonotic/dialog_settings_audio.c
qcsrc/menu/xonotic/dialog_settings_effects.c
qcsrc/menu/xonotic/image.c
qcsrc/menu/xonotic/playermodel.c
qcsrc/menu/xonotic/slider.c
qcsrc/menu/xonotic/slider_decibels.c
qcsrc/menu/xonotic/textslider.c
qcsrc/menu/xonotic/util.qc
qcsrc/qc-client.cbp [new file with mode: 0644]
qcsrc/qc-common.cbp [new file with mode: 0644]
qcsrc/qc-server.cbp [new file with mode: 0644]
qcsrc/server/bot/bot.qc
qcsrc/server/bot/bot.qh
qcsrc/server/bot/havocbot/havocbot.qc
qcsrc/server/bot/havocbot/role_onslaught.qc
qcsrc/server/cheats.qc
qcsrc/server/cl_client.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/csqcprojectile.qc
qcsrc/server/defs.qh
qcsrc/server/extensions.qh
qcsrc/server/g_damage.qc
qcsrc/server/g_models.qc
qcsrc/server/g_tetris.qc
qcsrc/server/g_triggers.qc
qcsrc/server/g_world.qc
qcsrc/server/gamecommand.qc
qcsrc/server/keyhunt.qc [deleted file]
qcsrc/server/keyhunt.qh [deleted file]
qcsrc/server/miscfunctions.qc
qcsrc/server/monsters/monster_zombie.qc
qcsrc/server/mutators/base.qc [new file with mode: 0644]
qcsrc/server/mutators/base.qh [new file with mode: 0644]
qcsrc/server/mutators/gamemode_keyhunt.qc [new file with mode: 0644]
qcsrc/server/mutators/gamemode_keyhunt.qh [new file with mode: 0644]
qcsrc/server/mutators/mutator_dodging.qc [new file with mode: 0644]
qcsrc/server/mutators/mutator_dodging.qh [new file with mode: 0644]
qcsrc/server/mutators/mutator_nix.qc [new file with mode: 0644]
qcsrc/server/mutators/mutators.qh [new file with mode: 0644]
qcsrc/server/pathlib/debug.qc
qcsrc/server/pathlib/expandnode.qc
qcsrc/server/pathlib/main.qc
qcsrc/server/pathlib/movenode.qc
qcsrc/server/pathlib/path_waypoint.qc [new file with mode: 0644]
qcsrc/server/pathlib/pathlib.qh
qcsrc/server/pathlib/utility.qc
qcsrc/server/progs.src
qcsrc/server/scores.qc
qcsrc/server/sv_main.qc
qcsrc/server/t_items.qc
qcsrc/server/t_jumppads.qc
qcsrc/server/target_music.qc [new file with mode: 0644]
qcsrc/server/target_spawn.qc
qcsrc/server/teamplay.qc
qcsrc/server/tturrets/include/turrets_early.qh
qcsrc/server/tturrets/system/system_main.qc
qcsrc/server/tturrets/units/unit_ewheel.qc
qcsrc/server/tturrets/units/unit_walker.qc
qcsrc/server/vehicles/racer.qc
qcsrc/server/vehicles/raptor.qc [new file with mode: 0644]
qcsrc/server/vehicles/spiderbot.qc
qcsrc/server/vehicles/vehicles.qh
qcsrc/server/w_all.qc
qcsrc/server/w_campingrifle.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_minstanex.qc
qcsrc/server/w_nex.qc
qcsrc/server/w_porto.qc
qcsrc/server/w_rocketlauncher.qc
qcsrc/server/w_seeker.qc [new file with mode: 0644]
qcsrc/server/w_shotgun.qc
qcsrc/server/w_tuba.qc
qcsrc/server/w_uzi.qc
qcsrc/warpzonelib/client.qc
qcsrc/warpzonelib/client.qh
qcsrc/warpzonelib/common.qc
qcsrc/warpzonelib/server.qc
qcsrc/xonotic-gamecode.workspace [new file with mode: 0644]
scripts/electro.shader [new file with mode: 0644]
scripts/fireball.shader [new file with mode: 0644]
scripts/flags.shader [new file with mode: 0644]
scripts/hlac.shader [new file with mode: 0644]
scripts/model-common.shader [new file with mode: 0644]
scripts/onslaught.shader [new file with mode: 0644]
scripts/portals.shader [new file with mode: 0644]
scripts/pyria.shader [new file with mode: 0644]
scripts/shotgun.shader [new file with mode: 0644]
scripts/spiderbot.shader [new file with mode: 0644]
scripts/teamfx.shader [new file with mode: 0644]
scripts/tuba.shader [new file with mode: 0644]
scripts/turrets.shader [new file with mode: 0644]
scripts/weapons.shader [new file with mode: 0644]
serverbench.cfg
sound/weapons/fireball_fly.ogg [new file with mode: 0644]
sound/weapons/fireball_fly.wav [deleted file]
sound/weapons/fireball_fly2.ogg [new file with mode: 0644]
sound/weapons/fireball_fly2.wav [deleted file]
sound/weapons/flac_fire.ogg [new file with mode: 0644]
sound/weapons/flacexp1.ogg [new file with mode: 0644]
sound/weapons/flacexp2.ogg [new file with mode: 0644]
sound/weapons/flacexp3.ogg [new file with mode: 0644]
sound/weapons/seeker_fire.ogg [new file with mode: 0644]
sound/weapons/seekerexp1.ogg [new file with mode: 0644]
sound/weapons/seekerexp2.ogg [new file with mode: 0644]
sound/weapons/seekerexp3.ogg [new file with mode: 0644]
sound/weapons/tag_fire.ogg [new file with mode: 0644]
sound/weapons/tag_impact.ogg [new file with mode: 0644]
sound/weapons/tag_rocket_fly.ogg [new file with mode: 0644]
sound/weapons/tagexp1.ogg [new file with mode: 0644]
sound/weapons/tagexp2.ogg [new file with mode: 0644]
sound/weapons/tagexp3.ogg [new file with mode: 0644]
sync-extensions.sh [new file with mode: 0755]
textures/bloodyskull.jpg [new file with mode: 0644]
textures/bloodyskull_alien.tga [new file with mode: 0644]
textures/bloodyskull_alien_glow.tga [new file with mode: 0644]
textures/bloodyskull_robot.tga [new file with mode: 0644]
textures/bloodyskull_robot_gloss.tga [new file with mode: 0644]
textures/bloodyskull_robot_glow.tga [new file with mode: 0644]
textures/campingrifle.tga [new file with mode: 0644]
textures/campingrifle_bump.tga [new file with mode: 0644]
textures/campingrifle_gloss.tga [new file with mode: 0644]
textures/campingrifle_glow.tga [new file with mode: 0644]
textures/campingrifle_pants.tga [new file with mode: 0644]
textures/campingrifle_screen.tga [new file with mode: 0644]
textures/campingrifle_shirt.tga [new file with mode: 0644]
textures/cellammoskin.jpg [new file with mode: 0644]
textures/cellammoskin_glow.jpg [new file with mode: 0644]
textures/cleanskull.jpg [new file with mode: 0644]
textures/cockpit.tga [new file with mode: 0644]
textures/cockpit_glow.tga [new file with mode: 0644]
textures/cp.tga [new file with mode: 0644]
textures/cp_gloss.tga [new file with mode: 0644]
textures/cp_glow.tga [new file with mode: 0644]
textures/cp_norm.tga [new file with mode: 0644]
textures/crylink.tga [new file with mode: 0644]
textures/crylink_bump.tga [new file with mode: 0644]
textures/crylink_gloss.tga [new file with mode: 0644]
textures/crylink_glow.jpg [new file with mode: 0644]
textures/crylink_pants.tga [new file with mode: 0644]
textures/crylink_reflect.tga [new file with mode: 0644]
textures/crylink_shirt.tga [new file with mode: 0644]
textures/darkvisor.tga [new file with mode: 0644]
textures/electro.tga [new file with mode: 0644]
textures/electro_gloss.tga [new file with mode: 0644]
textures/electro_glow.tga [new file with mode: 0644]
textures/electro_norm.tga [new file with mode: 0644]
textures/electro_pants.tga [new file with mode: 0644]
textures/electro_plasma.tga [new file with mode: 0644]
textures/electro_plasma_glow.tga [new file with mode: 0644]
textures/electro_plasma_hull.tga [new file with mode: 0644]
textures/electro_reflect.tga [new file with mode: 0644]
textures/eye.jpg [new file with mode: 0644]
textures/eyeblood.jpg [new file with mode: 0644]
textures/fireball.tga [new file with mode: 0644]
textures/fireball_gloss.tga [new file with mode: 0644]
textures/fireball_glow.tga [new file with mode: 0644]
textures/flesh1.tga [new file with mode: 0644]
textures/gak.tga [new file with mode: 0644]
textures/gak_gloss.tga [new file with mode: 0644]
textures/gak_norm.tga [new file with mode: 0644]
textures/gak_shirt.tga [new file with mode: 0644]
textures/gakarmor.tga [new file with mode: 0644]
textures/gakarmor_gloss.tga [new file with mode: 0644]
textures/gakarmor_norm.tga [new file with mode: 0644]
textures/gakarmor_pants.tga [new file with mode: 0644]
textures/gakarmor_shirt.tga [new file with mode: 0644]
textures/generator.tga [new file with mode: 0644]
textures/generator_destroyed.tga [new file with mode: 0644]
textures/generator_gloss.tga [new file with mode: 0644]
textures/generator_glow.tga [new file with mode: 0644]
textures/generator_lightning.tga [new file with mode: 0644]
textures/generator_lightning2.tga [new file with mode: 0644]
textures/generator_norm.tga [new file with mode: 0644]
textures/generator_pants.tga [new file with mode: 0644]
textures/generator_shield.tga [new file with mode: 0644]
textures/gib1.tga [new file with mode: 0644]
textures/gib2.jpg [new file with mode: 0644]
textures/gib2_norm.tga [new file with mode: 0644]
textures/gib2_spec.tga [new file with mode: 0644]
textures/gib3.jpg [new file with mode: 0644]
textures/gib3_norm.tga [new file with mode: 0644]
textures/gib3_spec.tga [new file with mode: 0644]
textures/gib4.jpg [new file with mode: 0644]
textures/gib4_norm.tga [new file with mode: 0644]
textures/gib4_spec.tga [new file with mode: 0644]
textures/glauncher.tga [new file with mode: 0644]
textures/glauncher_gloss.tga [new file with mode: 0644]
textures/glauncher_norm.tga [new file with mode: 0644]
textures/glauncher_pants.tga [new file with mode: 0644]
textures/glauncher_reflect.tga [new file with mode: 0644]
textures/glauncher_shirt.tga [new file with mode: 0644]
textures/glscope.tga [new file with mode: 0644]
textures/glscope_glow.tga [new file with mode: 0644]
textures/grenademodelskin.jpg [new file with mode: 0644]
textures/grenademodelskin_glow.jpg [new file with mode: 0644]
textures/hagar2.tga [new file with mode: 0644]
textures/hagar2_gloss.tga [new file with mode: 0644]
textures/hagar2_glow.tga [new file with mode: 0644]
textures/hagar2_norm.tga [new file with mode: 0644]
textures/hagar2_pants.tga [new file with mode: 0644]
textures/hagar2_reflect.tga [new file with mode: 0644]
textures/hagar2_shirt.tga [new file with mode: 0644]
textures/hlac_accessory.tga [new file with mode: 0644]
textures/hlac_accessory_gloss.tga [new file with mode: 0644]
textures/hlac_accessory_norm.tga [new file with mode: 0644]
textures/hlac_accessory_pants.tga [new file with mode: 0644]
textures/hlac_accessory_reflect.tga [new file with mode: 0644]
textures/hlac_accessory_shirt.tga [new file with mode: 0644]
textures/hlac_body.tga [new file with mode: 0644]
textures/hlac_body_gloss.tga [new file with mode: 0644]
textures/hlac_body_glow.tga [new file with mode: 0644]
textures/hlac_body_norm.tga [new file with mode: 0644]
textures/hlac_body_pants.tga [new file with mode: 0644]
textures/hlac_body_reflect.tga [new file with mode: 0644]
textures/hlac_body_shirt.tga [new file with mode: 0644]
textures/hlac_metal.tga [new file with mode: 0644]
textures/hlac_metal_glow.tga [new file with mode: 0644]
textures/hook.tga [new file with mode: 0644]
textures/hook_gloss.tga [new file with mode: 0644]
textures/hook_glow.tga [new file with mode: 0644]
textures/hook_norm.tga [new file with mode: 0644]
textures/hookgun.tga [new file with mode: 0644]
textures/hookgun_gloss.tga [new file with mode: 0644]
textures/hookgun_norm.tga [new file with mode: 0644]
textures/hookgun_pants.tga [new file with mode: 0644]
textures/ignis.tga [new file with mode: 0644]
textures/ignis_gloss.tga [new file with mode: 0644]
textures/ignis_glow.tga [new file with mode: 0644]
textures/ignis_norm.tga [new file with mode: 0644]
textures/ignis_shirt.tga [new file with mode: 0644]
textures/ignishead.tga [new file with mode: 0644]
textures/ignishead_gloss.tga [new file with mode: 0644]
textures/ignishead_glow.tga [new file with mode: 0644]
textures/ignishead_norm.tga [new file with mode: 0644]
textures/ignishead_shirt.tga [new file with mode: 0644]
textures/invincible.jpg [new file with mode: 0644]
textures/invincible_glow.jpg [new file with mode: 0644]
textures/items/a_bullets.jpg [new file with mode: 0644]
textures/items/a_rocket_box.jpg [new file with mode: 0644]
textures/items/a_rocket_gre.jpg [new file with mode: 0644]
textures/items/a_rocket_gre_glow.jpg [new file with mode: 0644]
textures/items/a_rocket_roc.jpg [new file with mode: 0644]
textures/items/a_rocket_roc_gloss.jpg [new file with mode: 0644]
textures/items/a_rocket_roc_glow.jpg [new file with mode: 0644]
textures/items/a_rocket_roc_norm.jpg [new file with mode: 0644]
textures/items/a_rocket_tag.jpg [new file with mode: 0644]
textures/laser.tga [new file with mode: 0644]
textures/laser_bump.tga [new file with mode: 0644]
textures/laser_gloss.tga [new file with mode: 0644]
textures/laser_glow.tga [new file with mode: 0644]
textures/laser_pants.tga [new file with mode: 0644]
textures/laser_shirt.tga [new file with mode: 0644]
textures/meat.tga [new file with mode: 0644]
textures/meat_alien.tga [new file with mode: 0644]
textures/meat_alien_gloss.tga [new file with mode: 0644]
textures/meat_alien_glow.tga [new file with mode: 0644]
textures/meat_alien_norm.tga [new file with mode: 0644]
textures/meat_gloss.tga [new file with mode: 0644]
textures/meat_norm.tga [new file with mode: 0644]
textures/meat_robot.tga [new file with mode: 0644]
textures/meat_robot_gloss.tga [new file with mode: 0644]
textures/meat_robot_glow.tga [new file with mode: 0644]
textures/meat_robot_norm.tga [new file with mode: 0644]
textures/muzzle1.tga [new file with mode: 0644]
textures/muzzle2.tga [new file with mode: 0644]
textures/nex.tga [new file with mode: 0644]
textures/nex_bump.tga [new file with mode: 0644]
textures/nex_gloss.tga [new file with mode: 0644]
textures/nex_glow.tga [new file with mode: 0644]
textures/nex_pants.tga [new file with mode: 0644]
textures/nex_reflect.tga [new file with mode: 0644]
textures/nex_shirt.tga [new file with mode: 0644]
textures/nexflash.tga [new file with mode: 0644]
textures/nexgun.tga [new file with mode: 0644]
textures/nexgun_gloss.tga [new file with mode: 0644]
textures/nexgun_glow.tga [new file with mode: 0644]
textures/nexgun_norm.tga [new file with mode: 0644]
textures/nexgun_pants.tga [new file with mode: 0644]
textures/nexgun_reflect.tga [new file with mode: 0644]
textures/nexgun_shirt.tga [new file with mode: 0644]
textures/nutsandbolts1.tga [new file with mode: 0644]
textures/nutsandbolts1_gloss.tga [new file with mode: 0644]
textures/nutsandbolts3.tga [new file with mode: 0644]
textures/nutsandbolts3_gloss.tga [new file with mode: 0644]
textures/nutsandbolts4.tga [new file with mode: 0644]
textures/nutsandbolts4_gloss.tga [new file with mode: 0644]
textures/nutsandbolts5.tga [new file with mode: 0644]
textures/nutsandbolts5_gloss.tga [new file with mode: 0644]
textures/ons_boom1.tga [new file with mode: 0644]
textures/ons_gengib.tga [new file with mode: 0644]
textures/ons_icon.tga [new file with mode: 0644]
textures/ons_icon_gloss.tga [new file with mode: 0644]
textures/ons_icon_glow.tga [new file with mode: 0644]
textures/ons_icon_norm.tga [new file with mode: 0644]
textures/ons_icon_pants.tga [new file with mode: 0644]
textures/ons_icon_thrust.tga [new file with mode: 0644]
textures/ons_icon_thrust_glow.tga [new file with mode: 0644]
textures/ons_pad.tga [new file with mode: 0644]
textures/ons_pad_gloss.tga [new file with mode: 0644]
textures/ons_pad_glow.tga [new file with mode: 0644]
textures/ons_pad_norm.tga [new file with mode: 0644]
textures/ons_pad_pants.tga [new file with mode: 0644]
textures/ons_pad_screen.tga [new file with mode: 0644]
textures/ons_ray.tga [new file with mode: 0644]
textures/ons_shield.tga [new file with mode: 0644]
textures/ons_shockwave1.tga [new file with mode: 0644]
textures/ons_shockwave2.tga [new file with mode: 0644]
textures/ons_smoke1.tga [new file with mode: 0644]
textures/ons_text.tga [new file with mode: 0644]
textures/ons_text_glow.tga [new file with mode: 0644]
textures/pickups.tga [new file with mode: 0644]
textures/pickups_bump.tga [new file with mode: 0644]
textures/pickups_gloss.tga [new file with mode: 0644]
textures/pickups_glow.tga [new file with mode: 0644]
textures/portalgun.tga [new file with mode: 0644]
textures/portalgun_gloss.tga [new file with mode: 0644]
textures/portalgun_glow.tga [new file with mode: 0644]
textures/portalgun_norm.tga [new file with mode: 0644]
textures/portals/portals_blue.tga [new file with mode: 0644]
textures/portals/portals_blue_gloss.tga [new file with mode: 0644]
textures/portals/portals_blue_glow.tga [new file with mode: 0644]
textures/portals/portals_blue_norm.tga [new file with mode: 0644]
textures/portals/portals_blue_vortex.tga [new file with mode: 0644]
textures/portals/portals_inactive.tga [new file with mode: 0644]
textures/portals/portals_inactive_vortex.tga [new file with mode: 0644]
textures/portals/portals_red.tga [new file with mode: 0644]
textures/portals/portals_red_gloss.tga [new file with mode: 0644]
textures/portals/portals_red_glow.tga [new file with mode: 0644]
textures/portals/portals_red_norm.tga [new file with mode: 0644]
textures/portals/portals_red_vortex.tga [new file with mode: 0644]
textures/pyria.tga [new file with mode: 0644]
textures/pyria_gloss.jpg [new file with mode: 0644]
textures/pyria_glow.jpg [new file with mode: 0644]
textures/pyria_glow.tga [new file with mode: 0644]
textures/pyria_norm.tga [new file with mode: 0644]
textures/pyria_pants.tga [new file with mode: 0644]
textures/pyria_shirt.tga [new file with mode: 0644]
textures/pyriahair.jpg [new file with mode: 0644]
textures/pyriahair_alpha.jpg [new file with mode: 0644]
textures/pyriahair_gloss.jpg [new file with mode: 0644]
textures/pyriahair_norm.jpg [new file with mode: 0644]
textures/raptor.jpg [new file with mode: 0644]
textures/raptor_bump.jpg [new file with mode: 0644]
textures/raptor_cockpit.jpg [new file with mode: 0644]
textures/raptor_gloss.jpg [new file with mode: 0644]
textures/raptor_pants.jpg [new file with mode: 0644]
textures/raptor_shirt.jpg [new file with mode: 0644]
textures/reptile.tga [new file with mode: 0644]
textures/reptile_bump.tga [new file with mode: 0644]
textures/reptile_gloss.tga [new file with mode: 0644]
textures/reptile_glow.tga [new file with mode: 0644]
textures/reptile_pants.tga [new file with mode: 0644]
textures/reptile_shirt.tga [new file with mode: 0644]
textures/rl.tga [new file with mode: 0644]
textures/rl2.tga [new file with mode: 0644]
textures/rl2_gloss.tga [new file with mode: 0644]
textures/rl2_glow.tga [new file with mode: 0644]
textures/rl2_norm.tga [new file with mode: 0644]
textures/rl_gloss.jpg [new file with mode: 0644]
textures/rl_norm.tga [new file with mode: 0644]
textures/rl_pants.tga [new file with mode: 0644]
textures/rl_reflect.tga [new file with mode: 0644]
textures/rl_shirt.tga [new file with mode: 0644]
textures/sb_shield.tga [new file with mode: 0644]
textures/seeker.tga [new file with mode: 0644]
textures/seeker_gloss.tga [new file with mode: 0644]
textures/seeker_glow.tga [new file with mode: 0644]
textures/seeker_norm.tga [new file with mode: 0644]
textures/seeker_pants.tga [new file with mode: 0644]
textures/shellsammo.tga [new file with mode: 0644]
textures/shellsammo_gloss.tga [new file with mode: 0644]
textures/shellsammo_norm.tga [new file with mode: 0644]
textures/shotgun2.tga [new file with mode: 0644]
textures/shotgun2_gloss.tga [new file with mode: 0644]
textures/shotgun2_glow.tga [new file with mode: 0644]
textures/shotgun2_norm.tga [new file with mode: 0644]
textures/shotgun2_shirt.tga [new file with mode: 0644]
textures/shotgun_sight.tga [new file with mode: 0644]
textures/spawn.jpg [new file with mode: 0644]
textures/spiderbot.tga [new file with mode: 0644]
textures/spiderbot_gloss.tga [new file with mode: 0644]
textures/spiderbot_glow.tga [new file with mode: 0644]
textures/spiderbot_norm.tga [new file with mode: 0644]
textures/spiderbot_pants.tga [new file with mode: 0644]
textures/strength.jpg [new file with mode: 0644]
textures/strength_glow.jpg [new file with mode: 0644]
textures/thrust.tga [new file with mode: 0644]
textures/thrust_glow.tga [new file with mode: 0644]
textures/thrustc1.tga [new file with mode: 0644]
textures/tuba.tga [new file with mode: 0644]
textures/tuba_gloss.tga [new file with mode: 0644]
textures/tuba_glow.tga [new file with mode: 0644]
textures/umbra.tga [new file with mode: 0644]
textures/umbra_gloss.jpg [new file with mode: 0644]
textures/umbra_glow.jpg [new file with mode: 0644]
textures/umbra_norm.tga [new file with mode: 0644]
textures/umbra_pants.tga [new file with mode: 0644]
textures/umbra_shirt.tga [new file with mode: 0644]
textures/uzi.tga [new file with mode: 0644]
textures/uzi_gloss.tga [new file with mode: 0644]
textures/uzi_glow.tga [new file with mode: 0644]
textures/uzi_norm.tga [new file with mode: 0644]
textures/uzi_pants.tga [new file with mode: 0644]
textures/uzi_reflect.tga [new file with mode: 0644]
textures/uzi_shirt.tga [new file with mode: 0644]
textures/uziflash.jpg [new file with mode: 0644]
textures/wakazachi.tga [new file with mode: 0644]
textures/wakazachi_gloss.tga [new file with mode: 0644]
textures/wakazachi_norm.tga [new file with mode: 0644]
textures/wakazachi_pants.tga [new file with mode: 0644]
update-cvarcount.sh
xonotic-credits.txt

diff --git a/.gitattributes b/.gitattributes
new file mode 100644 (file)
index 0000000..fb9e9b1
--- /dev/null
@@ -0,0 +1,179 @@
+*.7z -crlf -diff
+*.aft crlf=input
+*.aliases crlf=input
+all crlf=input
+*.animinfo crlf=input
+*.aps -crlf -diff
+*.ase -crlf
+*.bat -crlf
+*.bgs crlf=input
+*.blend -crlf -diff
+*.bmp -crlf -diff
+branch-manager crlf=input
+BSDmakefile crlf=input
+bsp2ent crlf=input
+*.bsp -crlf -diff
+*.cache -crlf -diff
+*.cbp -crlf
+*.cbp -crlf -diff
+*.c crlf=input
+*.cfg crlf=input
+*.cg crlf=input
+ChangeLog crlf=input
+CHANGES crlf=input
+COMPILING crlf=input
+*.conf crlf=input
+CONTRIBUTORS crlf=input
+COPYING crlf=input
+*.cpp crlf=input
+*.css crlf=input
+Current -crlf -diff
+*.cvsignore crlf=input
+*.cvswrappers crlf=input
+*.db -crlf -diff
+*.default crlf=input
+*.def crlf=input
+*.dem -crlf -diff
+*.dev -crlf
+*.dll -crlf -diff
+DOCS -crlf -diff
+*.dot crlf=input
+DoxyConfig crlf=input
+Doxyfile crlf=input
+*.doxygen crlf=input
+*.dpm -crlf -diff
+*.dsp -crlf
+*.dsw -crlf
+*.dtd crlf=input
+*.dylib -crlf -diff
+*.EncoderPlugin crlf=input
+*.ent -crlf
+*.form crlf=input
+*.framegroups crlf=input
+*.game crlf=input
+gendox crlf=input
+gendoxfunctions crlf=input
+genDoxyfile crlf=input
+*.gif -crlf -diff
+*.gitattributes crlf=input
+git-branch-manager crlf=input
+git-filter-index crlf=input
+git-filter-repository crlf=input
+*.gitignore crlf=input
+git-pullall crlf=input
+git-split-repository crlf=input
+git-svn-checkout crlf=input
+git-svn-update crlf=input
+git-update-octopus crlf=input
+*.glp crlf=input
+*.glsl crlf=input
+GPL crlf=input
+*.hardwired crlf=input
+*.h crlf=input
+*.hs crlf=input
+*.html crlf=input
+*.html-part crlf=input
+*.icns -crlf -diff
+*.ico -crlf -diff
+*.idsoftware crlf=input
+*.inc crlf=input
+*.instantaction crlf=input
+*.java crlf=input
+*.jhm crlf=input
+*.jnlp crlf=input
+*.jpg -crlf -diff
+*.jsmooth crlf=input
+LGPL crlf=input
+LICENSE crlf=input
+*.lmp -crlf -diff
+*.loaders crlf=input
+*.lso -crlf -diff
+makefile crlf=input
+Makefile crlf=input
+*.makespr32 crlf=input
+makespr32 crlf=input
+*.map -crlf
+*.mapinfo crlf=input
+*.m crlf=input
+*.md3 -crlf -diff
+*.md5anim -crlf
+*.md5mesh -crlf
+*.mdl -crlf -diff
+*.med crlf=input
+*.mf crlf=input
+*.mid -crlf -diff
+*.mk crlf=input
+*.mmpz -crlf -diff
+*.modinfo crlf=input
+*.modules crlf=input
+nexuiz-map-compiler crlf=input
+nexuiz-osx-agl crlf=input
+nexuiz-osx-sdl crlf=input
+*.nib -crlf
+*.obj -crlf
+OFFSETS -crlf -diff
+*.ogg -crlf -diff
+*.options crlf=input
+pangorc crlf=input
+*.patch crlf=input
+*.patchsets crlf=input
+*.pcx -crlf -diff
+*.pk3 -crlf -diff
+PkgInfo crlf=input
+*.pl crlf=input
+*.plist crlf=input
+*.pm crlf=input
+*.png -crlf -diff
+POSITIONS -crlf -diff
+*.proj -crlf
+*.properties crlf=input
+*.psd -crlf -diff
+*.py crlf=input
+*.q3map1 crlf=input
+*.qc crlf=input
+*.qdt crlf=input
+*.qh crlf=input
+*.rb crlf=input
+*.rc2 crlf=input
+*.rc -crlf
+*.readme crlf=input
+README crlf=input
+*.rtlights -crlf -diff
+SCHEMA crlf=input
+*.scm crlf=input
+SDL -crlf -diff
+SDLMain.m crlf=input
+*.shader crlf=input
+*.sh crlf=input
+*.skin crlf=input
+*.sln -crlf
+*.sounds crlf=input
+*.sp2 -crlf -diff
+*.spr32 -crlf -diff
+*.spr -crlf -diff
+*.src crlf=input
+*.strings crlf=input
+*.strip crlf=input
+strip crlf=input
+*.svg -crlf -diff
+*.TAB -crlf -diff
+*.tga -crlf -diff
+TMAP -crlf -diff
+todo crlf=input
+TODO crlf=input
+*.ttf -crlf -diff
+*.TTF -crlf -diff
+*.txt crlf=input
+*.TXT crlf=input
+*.vcproj -crlf
+*.wav -crlf -diff
+*.waypoints -crlf -diff
+*.width crlf=input
+*.workspace -crlf
+*.xcf -crlf -diff
+*.xlink crlf=input
+*.xml crlf=input
+*.xpm crlf=input
+*.zip -crlf -diff
+zipdiff crlf=input
+*.zym -crlf -diff
diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..c3e14d3
--- /dev/null
@@ -0,0 +1,6 @@
+csprogs.dat
+menu.dat
+progs.dat
+qcsrc/client/fteqcc.log
+qcsrc/menu/fteqcc.log
+qcsrc/server/fteqcc.log
index 7128da2d683edadfd6d829cdc585b831a0b31689..313fb840289013183ec5a9524394a1f5ca773cdd 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,8 @@ ZIP ?= 7za a -tzip -mx=9
 ZIPEXCLUDE ?= -x\!*.pk3 -xr\!\.svn -x\!qcsrc
 DIFF ?= diff
 
-FTEQCCFLAGS ?= -Werror -Wall -Wno-mundane -O3 -Ono-c -Ono-cs -flo
+FTEQCCFLAGS_WATERMARK ?= -DWATERMARK='"^1$(shell git describe) TEST BUILD"'
+FTEQCCFLAGS ?= -Werror -Wall -Wno-mundane -O3 -Ono-c -Ono-cs -flo $(FTEQCCFLAGS_EXTRA) $(FTEQCCFLAGS_WATERMARK)
 FTEQCCFLAGS_PROGS ?= 
 FTEQCCFLAGS_MENU ?= 
 
@@ -57,12 +58,15 @@ clean:
        rm -f progs.dat menu.dat csprogs.dat
 
 csprogs.dat: qcsrc/client/*.* qcsrc/common/*.* qcsrc/warpzonelib/*.*
+       @echo make[1]: Entering directory \`$(PWD)/qcsrc/client\'
        cd qcsrc/client && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_CSPROGS)
 
 progs.dat: qcsrc/server/*.* qcsrc/common/*.* qcsrc/server/*/*.* qcsrc/server/*/*/*.* qcsrc/warpzonelib/*.*
+       @echo make[1]: Entering directory \`$(PWD)/qcsrc/server\'
        cd qcsrc/server && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_PROGS)
 
 menu.dat: qcsrc/menu/*.* qcsrc/menu/*/*.* qcsrc/common/*.*
+       @echo make[1]: Entering directory \`$(PWD)/qcsrc/menu\'
        cd qcsrc/menu && $(FTEQCC) $(FTEQCCFLAGS) $(FTEQCCFLAGS_MENU)
 
 gfx/menu/default/skinvalues.txt: qcsrc/menu/skin-customizables.inc
index 73ecd16ab133cdbaebe4c95dead7ab5339d72188..cb58e9a14e563876567ed9accf0ebb85b4e2b5c3 100644 (file)
@@ -1,28 +1,3 @@
-// {{{ weapon replacement
-// NOTE: this only replaces weapons on the map
-// use g_start_weapon_* to also replace the on-startup weapons!
-// example: g_weaponreplace_nex "nex minstanex", then Nexes become MinstaNexes 50% of the times
-// set the cvars to "0" to totally disable a weapon
-set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun"
-set g_weaponreplace_laser ""
-set g_weaponreplace_shotgun ""
-set g_weaponreplace_uzi ""
-set g_weaponreplace_grenadelauncher ""
-set g_weaponreplace_electro ""
-set g_weaponreplace_crylink ""
-set g_weaponreplace_nex ""
-set g_weaponreplace_hagar ""
-set g_weaponreplace_rocketlauncher ""
-set g_weaponreplace_porto ""
-set g_weaponreplace_minstanex ""
-set g_weaponreplace_hook ""
-set g_weaponreplace_hlac ""
-set g_weaponreplace_campingrifle ""
-set g_weaponreplace_tuba ""
-set g_weaponreplace_fireball ""
-set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun (for Q3A map compatibility)"
-// }}}
-
 // {{{ 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"
@@ -36,10 +11,11 @@ set g_start_weapon_rocketlauncher -1 "0 = never provide the weapon, 1 = always p
 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 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_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_campingrifle -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_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 45
@@ -61,21 +37,23 @@ set g_lms_start_ammo_nails 150
 set g_lms_start_ammo_rockets 50
 set g_lms_start_ammo_cells 50
 set g_lms_start_ammo_fuel 0
-set g_balance_nixnex_roundtime 25
-set g_balance_nixnex_incrtime 1.6
-set g_balance_nixnex_ammo_shells 15
-set g_balance_nixnex_ammo_nails 45
-set g_balance_nixnex_ammo_rockets 15
-set g_balance_nixnex_ammo_cells 15
-set g_balance_nixnex_ammo_fuel 0
-set g_balance_nixnex_ammoincr_shells 2
-set g_balance_nixnex_ammoincr_nails 6
-set g_balance_nixnex_ammoincr_rockets 2
-set g_balance_nixnex_ammoincr_cells 2
-set g_balance_nixnex_ammoincr_fuel 2
+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 0
+set g_pickup_weapons_anyway 0
 set g_pickup_shells 30
 set g_pickup_shells_max 120
 set g_pickup_nails 80
@@ -89,20 +67,28 @@ set g_pickup_fuel_jetpack 50
 set g_pickup_fuel_max 999
 set g_pickup_armorsmall 10
 set g_pickup_armorsmall_max 100
+set g_pickup_armorsmall_anyway 0
 set g_pickup_armormedium 25
 set g_pickup_armormedium_max 100
+set g_pickup_armormedium_anyway 0
 set g_pickup_armorbig 50
 set g_pickup_armorbig_max 100
+set g_pickup_armorbig_anyway 0
 set g_pickup_armorlarge 100
 set g_pickup_armorlarge_max 100
+set g_pickup_armorlarge_anyway 0
 set g_pickup_healthsmall 10
 set g_pickup_healthsmall_max 200
+set g_pickup_healthsmall_anyway 0
 set g_pickup_healthmedium 25
 set g_pickup_healthmedium_max 200
+set g_pickup_healthmedium_anyway 0
 set g_pickup_healthlarge 50
 set g_pickup_healthlarge_max 200
+set g_pickup_healthlarge_anyway 0
 set g_pickup_healthmega 100
 set g_pickup_healthmega_max 200
+set g_pickup_healthmega_anyway 0
 set g_pickup_respawntime_short 15
 set g_pickup_respawntime_medium 20
 set g_pickup_respawntime_long 30
@@ -309,6 +295,8 @@ set g_balance_grenadelauncher_secondary_animtime 0.3
 set g_balance_grenadelauncher_secondary_ammo 2
 set g_balance_grenadelauncher_secondary_health 70
 set g_balance_grenadelauncher_secondary_damageforcescale 4
+set g_balance_grenadelauncher_secondary_bouncefactor 0.5
+set g_balance_grenadelauncher_secondary_bouncestop 0.075
 // }}}
 // {{{ electro
 set g_balance_electro_lightning 0
@@ -529,6 +517,7 @@ set g_balance_campingrifle_primary_animtime 0.3
 set g_balance_campingrifle_primary_ammo 10
 set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
 set g_balance_campingrifle_primary_burstcost 0.35 // require same cooldown as secondary, note it's smaller than primary refire time
+set g_balance_campingrifle_primary_bullethail 0
 set g_balance_campingrifle_secondary_damage 15
 set g_balance_campingrifle_secondary_headshotaddeddamage 25
 set g_balance_campingrifle_secondary_spread 0.02
@@ -540,6 +529,7 @@ set g_balance_campingrifle_secondary_animtime 0.1
 set g_balance_campingrifle_secondary_ammo 4
 set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu
 set g_balance_campingrifle_secondary_burstcost 0.35
+set g_balance_campingrifle_secondary_bullethail 0
 // }}}
 // {{{ tuba
 set g_balance_tuba_refire 0.05
@@ -553,40 +543,91 @@ set g_balance_tuba_radius 200
 set g_balance_tuba_force 40
 // }}}
 // {{{ fireball
-set g_balance_fireball_primary_ammo 5
-set g_balance_fireball_primary_animtime 0.3
-set g_balance_fireball_primary_damage 40
+set g_balance_fireball_primary_ammo 40
+set g_balance_fireball_primary_animtime 0.15
+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_damagetime 5
-set g_balance_fireball_primary_force 100
+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 30
+set g_balance_fireball_primary_laserdamage 80
 set g_balance_fireball_primary_laseredgedamage 20
-set g_balance_fireball_primary_laserradius 110
-set g_balance_fireball_primary_lifetime 7
-set g_balance_fireball_primary_refire 2
-set g_balance_fireball_primary_speed 900
-set g_balance_fireball_primary_speed_up 100
-set g_balance_fireball_primary_speed_z 0
+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 25
-set g_balance_fireball_secondary_animtime 0.15
-set g_balance_fireball_secondary_bfgdamage 100
-set g_balance_fireball_secondary_bfgforce 500
-set g_balance_fireball_secondary_bfgradius 750
-set g_balance_fireball_secondary_damage 150
+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_edgedamage 0
-set g_balance_fireball_secondary_force 700
-set g_balance_fireball_secondary_health 50
+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 30
 set g_balance_fireball_secondary_laseredgedamage 20
-set g_balance_fireball_secondary_laserradius 256
-set g_balance_fireball_secondary_lifetime 15
-set g_balance_fireball_secondary_radius 200
-set g_balance_fireball_secondary_refire 0
-set g_balance_fireball_secondary_refire2 4
-set g_balance_fireball_secondary_speed 650
+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
 // }}}
+// {{{ seeker
+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 1.05
+set g_balance_seeker_missile_ammo 2
+set g_balance_seeker_missile_animtime 0.3
+set g_balance_seeker_missile_count 4
+set g_balance_seeker_missile_damage 40
+set g_balance_seeker_missile_damageforcescale 4
+set g_balance_seeker_missile_decel 0.9
+set g_balance_seeker_missile_delay 0.25
+set g_balance_seeker_missile_edgedamage 10
+set g_balance_seeker_missile_force 250
+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_accel 0
+set g_balance_seeker_missile_speed_up 300
+set g_balance_seeker_missile_speed_z 0
+set g_balance_seeker_missile_speed_max 1250
+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.3
+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.7
+set g_balance_seeker_tag_speed 9000
+set g_balance_seeker_tag_spread 0
+// End new seeker
index 9cee6d5765e270bf71b36579351666ec78e7851d..a4369249fad75c47203fb17c752354c91dcf8677 100644 (file)
@@ -1,27 +1,3 @@
-// {{{ weapon replacement
-// NOTE: this only replaces weapons on the map
-// use g_start_weapon_* to also replace the on-startup weapons!
-// example: g_weaponreplace_nex "nex minstanex", then Nexes become MinstaNexes 50% of the times
-// set the cvars to "0" to totally disable a weapon
-set g_weaponreplace_laser ""
-set g_weaponreplace_shotgun ""
-set g_weaponreplace_uzi ""
-set g_weaponreplace_grenadelauncher ""
-set g_weaponreplace_electro ""
-set g_weaponreplace_crylink ""
-set g_weaponreplace_nex ""
-set g_weaponreplace_hagar ""
-set g_weaponreplace_rocketlauncher ""
-set g_weaponreplace_porto ""
-set g_weaponreplace_minstanex ""
-set g_weaponreplace_hook ""
-set g_weaponreplace_hlac ""
-set g_weaponreplace_campingrifle ""
-set g_weaponreplace_tuba ""
-set g_weaponreplace_fireball ""
-set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun (for Q3A map compatibility)"
-// }}}
-
 // {{{ 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"
@@ -39,6 +15,7 @@ set g_start_weapon_hlac -1 "0 = never provide the weapon, 1 = always provide the
 set g_start_weapon_campingrifle -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 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_balance_health_start 150
 set g_balance_armor_start 0
 set g_start_ammo_shells 40
@@ -60,21 +37,23 @@ set g_lms_start_ammo_nails 150
 set g_lms_start_ammo_rockets 50
 set g_lms_start_ammo_cells 50
 set g_lms_start_ammo_fuel 0
-set g_balance_nixnex_roundtime 25
-set g_balance_nixnex_incrtime 1.6
-set g_balance_nixnex_ammo_shells 15
-set g_balance_nixnex_ammo_nails 45
-set g_balance_nixnex_ammo_rockets 15
-set g_balance_nixnex_ammo_cells 15
-set g_balance_nixnex_ammo_fuel 0
-set g_balance_nixnex_ammoincr_shells 2
-set g_balance_nixnex_ammoincr_nails 6
-set g_balance_nixnex_ammoincr_rockets 2
-set g_balance_nixnex_ammoincr_cells 2
-set g_balance_nixnex_ammoincr_fuel 2
+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 0
+set g_pickup_weapons_anyway 0
 set g_pickup_shells 15
 set g_pickup_shells_max 999
 set g_pickup_nails 80
@@ -88,20 +67,28 @@ set g_pickup_fuel_jetpack 50
 set g_pickup_fuel_max 999
 set g_pickup_armorsmall 5
 set g_pickup_armorsmall_max 999
+set g_pickup_armorsmall_anyway 0
 set g_pickup_armormedium 25
 set g_pickup_armormedium_max 999
+set g_pickup_armormedium_anyway 0
 set g_pickup_armorbig 50
 set g_pickup_armorbig_max 999
+set g_pickup_armorbig_anyway 0
 set g_pickup_armorlarge 100
 set g_pickup_armorlarge_max 999
+set g_pickup_armorlarge_anyway 0
 set g_pickup_healthsmall 5
 set g_pickup_healthsmall_max 999
+set g_pickup_healthsmall_anyway 0
 set g_pickup_healthmedium 25
 set g_pickup_healthmedium_max 999
+set g_pickup_healthmedium_anyway 0
 set g_pickup_healthlarge 50
 set g_pickup_healthlarge_max 999
+set g_pickup_healthlarge_anyway 0
 set g_pickup_healthmega 100
 set g_pickup_healthmega_max 999
+set g_pickup_healthmega_anyway 0
 set g_pickup_respawntime_short 15
 set g_pickup_respawntime_medium 20
 set g_pickup_respawntime_long 30
@@ -308,6 +295,8 @@ set g_balance_grenadelauncher_secondary_animtime 0.3
 set g_balance_grenadelauncher_secondary_ammo 2
 set g_balance_grenadelauncher_secondary_health 10
 set g_balance_grenadelauncher_secondary_damageforcescale 4
+set g_balance_grenadelauncher_secondary_bouncefactor 0.5
+set g_balance_grenadelauncher_secondary_bouncestop 0.075
 // }}}
 // {{{ electro
 set g_balance_electro_lightning 0
@@ -528,6 +517,7 @@ set g_balance_campingrifle_primary_animtime 0.3
 set g_balance_campingrifle_primary_ammo 10
 set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
 set g_balance_campingrifle_primary_burstcost 0
+set g_balance_campingrifle_primary_bullethail 0 // empty magazine on shot
 set g_balance_campingrifle_secondary_damage 35
 set g_balance_campingrifle_secondary_headshotaddeddamage 15 // 50 damage only on head
 set g_balance_campingrifle_secondary_spread 0.008
@@ -539,6 +529,7 @@ set g_balance_campingrifle_secondary_animtime 0.1
 set g_balance_campingrifle_secondary_ammo 10
 set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu
 set g_balance_campingrifle_secondary_burstcost 0
+set g_balance_campingrifle_secondary_bullethail 0 // empty magazine on shot
 // }}}
 // {{{ tuba
 set g_balance_tuba_refire 0.05
@@ -552,40 +543,91 @@ set g_balance_tuba_radius 200
 set g_balance_tuba_force 40
 // }}}
 // {{{ fireball
-set g_balance_fireball_primary_ammo 5
-set g_balance_fireball_primary_animtime 0.3
-set g_balance_fireball_primary_damage 100
+set g_balance_fireball_primary_ammo 40
+set g_balance_fireball_primary_animtime 0.15
+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_damagetime 5
-set g_balance_fireball_primary_force 100
+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 128
-set g_balance_fireball_primary_lifetime 7
-set g_balance_fireball_primary_refire 1.5
-set g_balance_fireball_primary_speed 700
-set g_balance_fireball_primary_speed_up 100
-set g_balance_fireball_primary_speed_z 0
+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 15
-set g_balance_fireball_secondary_animtime 0.15
-set g_balance_fireball_secondary_bfgdamage 200
-set g_balance_fireball_secondary_bfgforce 0
-set g_balance_fireball_secondary_bfgradius 1500
-set g_balance_fireball_secondary_damage 150
+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_edgedamage 0
-set g_balance_fireball_secondary_force 700
-set g_balance_fireball_secondary_health 50
+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 80
+set g_balance_fireball_secondary_laserdamage 50
 set g_balance_fireball_secondary_laseredgedamage 20
-set g_balance_fireball_secondary_laserradius 256
-set g_balance_fireball_secondary_lifetime 15
-set g_balance_fireball_secondary_radius 200
+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_refire2 0
-set g_balance_fireball_secondary_speed 650
+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
 // }}}
+// {{{ seeker
+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 1.05
+set g_balance_seeker_missile_ammo 2
+set g_balance_seeker_missile_animtime 0.3
+set g_balance_seeker_missile_count 4
+set g_balance_seeker_missile_damage 40
+set g_balance_seeker_missile_damageforcescale 4
+set g_balance_seeker_missile_decel 0.9
+set g_balance_seeker_missile_delay 0.25
+set g_balance_seeker_missile_edgedamage 10
+set g_balance_seeker_missile_force 250
+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_accel 0
+set g_balance_seeker_missile_speed_up 300
+set g_balance_seeker_missile_speed_z 0
+set g_balance_seeker_missile_speed_max 1250
+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.3
+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.7
+set g_balance_seeker_tag_speed 9000
+set g_balance_seeker_tag_spread 0
+// End new seeker
diff --git a/balanceNexrun.cfg b/balanceNexrun.cfg
deleted file mode 100644 (file)
index 52e3463..0000000
+++ /dev/null
@@ -1,592 +0,0 @@
-// {{{ weapon replacement
-// NOTE: this only replaces weapons on the map
-// use g_start_weapon_* to also replace the on-startup weapons!
-// example: g_weaponreplace_nex "nex minstanex", then Nexes become MinstaNexes 50% of the times
-// set the cvars to "0" to totally disable a weapon
-set g_weaponreplace_laser ""
-set g_weaponreplace_shotgun "uzi"
-set g_weaponreplace_uzi "shotgun"
-set g_weaponreplace_grenadelauncher ""
-set g_weaponreplace_electro ""
-set g_weaponreplace_crylink ""
-set g_weaponreplace_nex ""
-set g_weaponreplace_hagar ""
-set g_weaponreplace_rocketlauncher ""
-set g_weaponreplace_porto ""
-set g_weaponreplace_minstanex ""
-set g_weaponreplace_hook 0
-set g_weaponreplace_hlac 0
-set g_weaponreplace_campingrifle 0
-set g_weaponreplace_tuba ""
-set g_weaponreplace_fireball 0
-set sv_q3acompat_machineshotgunswap 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 -2 "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_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 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_campingrifle 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_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_balance_health_start 125
-set g_balance_armor_start 0
-set g_start_ammo_shells 0
-set g_start_ammo_nails 100
-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 210
-set g_lms_start_ammo_rockets 150
-set g_lms_start_ammo_cells 150
-set g_lms_start_ammo_fuel 0
-set g_balance_nixnex_roundtime 25
-set g_balance_nixnex_incrtime 1.6
-set g_balance_nixnex_ammo_shells 15
-set g_balance_nixnex_ammo_nails 45
-set g_balance_nixnex_ammo_rockets 15
-set g_balance_nixnex_ammo_cells 15
-set g_balance_nixnex_ammo_fuel 0
-set g_balance_nixnex_ammoincr_shells 2
-set g_balance_nixnex_ammoincr_nails 6
-set g_balance_nixnex_ammoincr_rockets 2
-set g_balance_nixnex_ammoincr_cells 2
-set g_balance_nixnex_ammoincr_fuel 2
-// }}}
-
-// {{{ pickup items
-set g_pickup_shells 10
-set g_pickup_shells_max 30
-set g_pickup_nails 30
-set g_pickup_nails_max 210
-set g_pickup_rockets 20
-set g_pickup_rockets_max 150
-set g_pickup_cells 50
-set g_pickup_cells_max 150
-set g_pickup_fuel 25
-set g_pickup_fuel_jetpack 50
-set g_pickup_fuel_max 999
-set g_pickup_armorsmall 5
-set g_pickup_armorsmall_max 200
-set g_pickup_armormedium 25
-set g_pickup_armormedium_max 200
-set g_pickup_armorbig 50
-set g_pickup_armorbig_max 200
-set g_pickup_armorlarge 100
-set g_pickup_armorlarge_max 200
-set g_pickup_healthsmall 5
-set g_pickup_healthsmall_max 200
-set g_pickup_healthmedium 25
-set g_pickup_healthmedium_max 100
-set g_pickup_healthlarge 50
-set g_pickup_healthlarge_max 100
-set g_pickup_healthmega 100
-set g_pickup_healthmega_max 200
-set g_pickup_respawntime_short 30
-set g_pickup_respawntime_medium 30
-set g_pickup_respawntime_long 30
-set g_pickup_respawntime_powerup 90
-set g_pickup_respawntime_weapon 5
-set g_pickup_respawntime_ammo 30
-set g_pickup_respawntimejitter_short 0
-set g_pickup_respawntimejitter_medium 0
-set g_pickup_respawntimejitter_long 0
-set g_pickup_respawntimejitter_powerup 15
-set g_pickup_respawntimejitter_weapon 0
-set g_pickup_respawntimejitter_ammo 0
-// }}}
-
-// {{{ regen/rot
-set g_balance_health_regen 0
-set g_balance_health_regenlinear 0
-set g_balance_pause_health_regen 0
-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.66
-
-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.1
-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.5
-set g_throughfloor_force 0.7
-set g_projectiles_newton_style 0
-// 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 4
-// 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 675
-set g_balance_falldamage_factor 0.25
-set g_balance_falldamage_maxdamage 10
-// }}}
-
-// {{{ powerups
-set g_balance_powerup_invincible_takedamage 0.25
-set g_balance_powerup_invincible_time 30
-set g_balance_powerup_strength_damage 4
-set g_balance_powerup_strength_force 4
-set g_balance_powerup_strength_time 30
-set g_balance_powerup_strength_selfdamage 2
-set g_balance_powerup_strength_selfforce 2
-// }}}
-
-// {{{ 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 22
-set g_balance_laser_primary_edgedamage 0
-set g_balance_laser_primary_force 200
-set g_balance_laser_primary_radius 52
-set g_balance_laser_primary_speed 0
-set g_balance_laser_primary_spread 0
-set g_balance_laser_primary_refire 0.1
-set g_balance_laser_primary_animtime 0.1
-set g_balance_laser_primary_lifetime 0
-set g_balance_laser_primary_shotangle 0
-set g_balance_laser_primary_delay 0
-set g_balance_laser_gauntlet 1
-set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
-set g_balance_laser_secondary_damage 30
-set g_balance_laser_secondary_edgedamage 0
-set g_balance_laser_secondary_force 100
-set g_balance_laser_secondary_radius 3
-set g_balance_laser_secondary_speed 1500
-set g_balance_laser_secondary_spread 0
-set g_balance_laser_secondary_refire 0
-set g_balance_laser_secondary_animtime 0.15
-set g_balance_laser_secondary_lifetime 0.066
-set g_balance_laser_secondary_shotangle 0
-set g_balance_laser_secondary_delay 0
-// }}}
-// {{{ shotgun
-set g_balance_shotgun_primary_bullets 36
-set g_balance_shotgun_primary_damage 3
-set g_balance_shotgun_primary_force 10
-set g_balance_shotgun_primary_spread 0.18
-set g_balance_shotgun_primary_refire 1
-set g_balance_shotgun_primary_animtime 0.7
-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 0
-set g_balance_shotgun_secondary_bullets 22
-set g_balance_shotgun_secondary_damage 2
-set g_balance_shotgun_secondary_force 12
-set g_balance_shotgun_secondary_spread 0.25
-set g_balance_shotgun_secondary_refire 1.5
-set g_balance_shotgun_secondary_animtime 0.2
-set g_balance_shotgun_secondary_ammo 0.5
-set g_balance_shotgun_secondary_speed 12000
-set g_balance_shotgun_secondary_bulletconstant 75 // 3.8qu
-// }}}
-// {{{ uzi
-set g_balance_uzi_first 0
-set g_balance_uzi_first_damage 10
-set g_balance_uzi_first_force 50
-set g_balance_uzi_first_spread 0.007
-set g_balance_uzi_first_refire 0.15
-set g_balance_uzi_first_ammo 1
-set g_balance_uzi_sustained_damage 7
-set g_balance_uzi_sustained_force 30
-set g_balance_uzi_sustained_spread 0.02
-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
-// }}}
-// {{{ mortar
-set g_balance_grenadelauncher_primary2secondary 1
-set g_balance_grenadelauncher_primary_damage 60
-set g_balance_grenadelauncher_primary_edgedamage 10
-set g_balance_grenadelauncher_primary_force 250
-set g_balance_grenadelauncher_primary_radius 100
-set g_balance_grenadelauncher_primary_speed 2000
-set g_balance_grenadelauncher_primary_speed_up 200
-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_refire 0.7
-set g_balance_grenadelauncher_primary_animtime 0.3
-set g_balance_grenadelauncher_primary_ammo 2
-set g_balance_grenadelauncher_secondary_damage 65
-set g_balance_grenadelauncher_secondary_edgedamage 10
-set g_balance_grenadelauncher_secondary_force 300
-set g_balance_grenadelauncher_secondary_radius 200
-set g_balance_grenadelauncher_secondary_speed 800
-set g_balance_grenadelauncher_secondary_speed_up 0
-set g_balance_grenadelauncher_secondary_speed_z 200
-set g_balance_grenadelauncher_secondary_spread 0
-set g_balance_grenadelauncher_secondary_lifetime 2
-set g_balance_grenadelauncher_secondary_refire 0.8
-set g_balance_grenadelauncher_secondary_animtime 0.5
-set g_balance_grenadelauncher_secondary_ammo 2
-set g_balance_grenadelauncher_secondary_health 0
-set g_balance_grenadelauncher_secondary_damageforcescale 0
-// }}}
-// {{{ electro
-set g_balance_electro_lightning 1
-set g_balance_electro_primary_damage 6
-set g_balance_electro_primary_edgedamage 0
-set g_balance_electro_primary_force 60 // todo: probaby needs movement nerfing code when hit?
-set g_balance_electro_primary_radius 850
-set g_balance_electro_primary_comboradius 0
-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.066
-set g_balance_electro_primary_animtime 0.066
-set g_balance_electro_primary_ammo 0.66
-set g_balance_electro_secondary_damage 45
-set g_balance_electro_secondary_spread 0.10
-set g_balance_electro_secondary_edgedamage 10
-set g_balance_electro_secondary_force 100
-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 2.5
-set g_balance_electro_secondary_refire 0.1
-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 5
-set g_balance_electro_secondary_damageforcescale 4
-set g_balance_electro_secondary_count 3
-set g_balance_electro_combo_damage 50
-set g_balance_electro_combo_edgedamage 0
-set g_balance_electro_combo_force 100
-set g_balance_electro_combo_radius 250
-set g_balance_electro_combo_comboradius 0
-set g_balance_electro_combo_speed 2000
-// }}}
-// {{{ crylink
-set g_balance_crylink_primary_damage 18
-set g_balance_crylink_primary_edgedamage 18
-set g_balance_crylink_primary_force 40
-set g_balance_crylink_primary_radius 110
-set g_balance_crylink_primary_speed 1800
-set g_balance_crylink_primary_spread 0.01
-set g_balance_crylink_primary_shots 4
-set g_balance_crylink_primary_bounces 0
-set g_balance_crylink_primary_refire 0.4
-set g_balance_crylink_primary_animtime 0.4
-set g_balance_crylink_primary_ammo 2
-set g_balance_crylink_primary_bouncedamagefactor 0.5
-
-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_star_lifetime 0.1 // range: 700 full, fades to 2450
-set g_balance_crylink_primary_star_fadetime 0.25
-set g_balance_crylink_primary_other_lifetime 0.1 // range: 700 full, fades to 2450
-set g_balance_crylink_primary_other_fadetime 0.25
-
-set g_balance_crylink_secondary 0
-set g_balance_crylink_secondary_damage 8
-set g_balance_crylink_secondary_edgedamage 8
-set g_balance_crylink_secondary_force -40
-set g_balance_crylink_secondary_radius 10
-set g_balance_crylink_secondary_speed 4000
-set g_balance_crylink_secondary_spread 0.01
-set g_balance_crylink_secondary_shots 3
-set g_balance_crylink_secondary_bounces 0
-set g_balance_crylink_secondary_refire 0.1
-set g_balance_crylink_secondary_animtime 0.1
-set g_balance_crylink_secondary_ammo 1
-set g_balance_crylink_secondary_bouncedamagefactor 0.5
-
-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: 35000 full, fades to 70000
-set g_balance_crylink_secondary_line_fadetime 2
-// }}}
-// {{{ nex
-set g_balance_nex_damage 100
-set g_balance_nex_force 200
-set g_balance_nex_refire 1.25
-set g_balance_nex_animtime 0.8
-set g_balance_nex_ammo 5
-set g_balance_nex_damagefalloff_mindist 1000
-set g_balance_nex_damagefalloff_maxdist 3000
-set g_balance_nex_damagefalloff_halflife 1500
-set g_balance_nex_damagefalloff_forcehalflife 1500
-// }}}
-// {{{ minstanex
-set g_balance_minstanex_refire 1
-set g_balance_minstanex_animtime 1
-set g_balance_minstanex_ammo 10
-// }}}
-// {{{ hagar
-set g_balance_hagar_primary_damage 12
-set g_balance_hagar_primary_edgedamage 5
-set g_balance_hagar_primary_force 70
-set g_balance_hagar_primary_radius 50
-set g_balance_hagar_primary_spread 0
-set g_balance_hagar_primary_speed 1800
-set g_balance_hagar_primary_lifetime 5
-set g_balance_hagar_primary_refire 0.1
-set g_balance_hagar_primary_ammo 1
-set g_balance_hagar_secondary 0
-set g_balance_hagar_secondary_damage 11
-set g_balance_hagar_secondary_edgedamage 4
-set g_balance_hagar_secondary_force 60
-set g_balance_hagar_secondary_radius 70
-set g_balance_hagar_secondary_spread 0.05
-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.1
-set g_balance_hagar_secondary_ammo 1
-// }}}
-// {{{ rocketlauncher
-set g_balance_rocketlauncher_damage 90
-set g_balance_rocketlauncher_edgedamage 30
-set g_balance_rocketlauncher_force 350
-set g_balance_rocketlauncher_radius 110
-set g_balance_rocketlauncher_speed 1000
-set g_balance_rocketlauncher_speedaccel 0
-set g_balance_rocketlauncher_speedstart 1000
-set g_balance_rocketlauncher_lifetime 10
-set g_balance_rocketlauncher_refire 0.9
-set g_balance_rocketlauncher_animtime 0.7
-set g_balance_rocketlauncher_ammo 3
-set g_balance_rocketlauncher_health 0
-set g_balance_rocketlauncher_damageforcescale 0
-set g_balance_rocketlauncher_detonatedelay 9999 // 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 0 // 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 1 // stop guiding when firing again
-set g_balance_rocketlauncher_laserguided_speed 1000 //650
-set g_balance_rocketlauncher_laserguided_speedaccel 0
-set g_balance_rocketlauncher_laserguided_speedstart 1000
-set g_balance_rocketlauncher_laserguided_turnrate 0.75 //0.5
-set g_balance_rocketlauncher_laserguided_allow_steal 1
-// }}}
-// {{{ 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 30
-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 2 // 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 3 // 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 10 // 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
-set g_balance_hlac_primary_spread_min 0.01
-set g_balance_hlac_primary_spread_max 0.03
-set g_balance_hlac_primary_spread_add 0.002
-set g_balance_hlac_primary_spread_crouchmod 0.5
-
-set g_balance_hlac_primary_damage 6
-set g_balance_hlac_primary_edgedamage 0
-set g_balance_hlac_primary_force 60 // todo: probably needs movement nerfing code when hit
-set g_balance_hlac_primary_radius 850
-set g_balance_hlac_primary_speed 0
-set g_balance_hlac_primary_lifetime 0
-
-set g_balance_hlac_primary_refire 0.066
-set g_balance_hlac_primary_animtime 0.066
-set g_balance_hlac_primary_ammo 0.066
-
-set g_balance_hlac_secondary 0
-set g_balance_hlac_secondary_spread 0.06
-set g_balance_hlac_secondary_spread_crouchmod 0.5
-
-set g_balance_hlac_secondary_damage 11
-set g_balance_hlac_secondary_edgedamage 10
-set g_balance_hlac_secondary_force 60
-set g_balance_hlac_secondary_radius 70
-set g_balance_hlac_secondary_speed 20000
-set g_balance_hlac_secondary_lifetime 5
-
-set g_balance_hlac_secondary_refire 0.6
-set g_balance_hlac_secondary_animtime 0.6
-set g_balance_hlac_secondary_ammo 10
-set g_balance_hlac_secondary_shots 5
-// }}}
-// {{{ campingrifle
-set g_balance_campingrifle_magazinecapacity 0
-set g_balance_campingrifle_reloadtime 2 // matches reload anim
-set g_balance_campingrifle_auto_reload_after_changing_weapons 0
-set g_balance_campingrifle_bursttime 0.85 // 0.35 - 0.1 + 0.35 - 0.1 + 0.35 = three secondaries
-set g_balance_campingrifle_tracer 1
-set g_balance_campingrifle_primary_damage 50
-set g_balance_campingrifle_primary_headshotaddeddamage 80
-set g_balance_campingrifle_primary_spread 0
-set g_balance_campingrifle_primary_force 0
-set g_balance_campingrifle_primary_speed 35000
-set g_balance_campingrifle_primary_lifetime 5
-set g_balance_campingrifle_primary_refire 0.7
-set g_balance_campingrifle_primary_animtime 0.7
-set g_balance_campingrifle_primary_ammo 10
-set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
-set g_balance_campingrifle_primary_burstcost 0.35 // require same cooldown as secondary, note it's smaller than primary refire time
-set g_balance_campingrifle_secondary_damage 15
-set g_balance_campingrifle_secondary_headshotaddeddamage 25
-set g_balance_campingrifle_secondary_spread 0.02
-set g_balance_campingrifle_secondary_force 0
-set g_balance_campingrifle_secondary_speed 20000
-set g_balance_campingrifle_secondary_lifetime 5
-set g_balance_campingrifle_secondary_refire 0.1
-set g_balance_campingrifle_secondary_animtime 0.1
-set g_balance_campingrifle_secondary_ammo 4
-set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu
-set g_balance_campingrifle_secondary_burstcost 0.35
-// }}}
-// {{{ 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 5
-set g_balance_fireball_primary_animtime 0.3
-set g_balance_fireball_primary_damage 40
-set g_balance_fireball_primary_damageforcescale 4
-set g_balance_fireball_primary_damagetime 5
-set g_balance_fireball_primary_force 100
-set g_balance_fireball_primary_laserburntime 0.5
-set g_balance_fireball_primary_laserdamage 30
-set g_balance_fireball_primary_laseredgedamage 20
-set g_balance_fireball_primary_laserradius 110
-set g_balance_fireball_primary_lifetime 7
-set g_balance_fireball_primary_refire 2
-set g_balance_fireball_primary_speed 900
-set g_balance_fireball_primary_spread 0
-set g_balance_fireball_primary_speed_up 100
-set g_balance_fireball_primary_speed_z 0
-set g_balance_fireball_secondary_ammo 25
-set g_balance_fireball_secondary_animtime 0.15
-set g_balance_fireball_secondary_bfgdamage 100
-set g_balance_fireball_secondary_bfgforce 500
-set g_balance_fireball_secondary_bfgradius 750
-set g_balance_fireball_secondary_damage 150
-set g_balance_fireball_secondary_damageforcescale 4
-set g_balance_fireball_secondary_edgedamage 0
-set g_balance_fireball_secondary_force 700
-set g_balance_fireball_secondary_health 50
-set g_balance_fireball_secondary_laserburntime 0.5
-set g_balance_fireball_secondary_laserdamage 30
-set g_balance_fireball_secondary_laseredgedamage 20
-set g_balance_fireball_secondary_laserradius 256
-set g_balance_fireball_secondary_lifetime 15
-set g_balance_fireball_secondary_radius 200
-set g_balance_fireball_secondary_refire 0
-set g_balance_fireball_secondary_refire2 4
-set g_balance_fireball_secondary_speed 650
-set g_balance_fireball_secondary_spread 0
-// }}}
index 747a9db1f0e019dda6a3b9c3fd2d447bcf74fdcc..21242f16f0364632fbd0eaeb42bf0fba6d854283 100644 (file)
@@ -1,28 +1,3 @@
-// {{{ weapon replacement
-// NOTE: this only replaces weapons on the map
-// use g_start_weapon_* to also replace the on-startup weapons!
-// example: g_weaponreplace_nex "nex minstanex", then Nexes become MinstaNexes 50% of the times
-// set the cvars to "0" to totally disable a weapon
-set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun"
-set g_weaponreplace_laser ""
-set g_weaponreplace_shotgun ""
-set g_weaponreplace_uzi ""
-set g_weaponreplace_grenadelauncher ""
-set g_weaponreplace_electro ""
-set g_weaponreplace_crylink ""
-set g_weaponreplace_nex ""
-set g_weaponreplace_hagar ""
-set g_weaponreplace_rocketlauncher ""
-set g_weaponreplace_porto ""
-set g_weaponreplace_minstanex ""
-set g_weaponreplace_hook ""
-set g_weaponreplace_hlac 0 // I don't particularly like this weapon.
-set g_weaponreplace_campingrifle ""
-set g_weaponreplace_tuba ""
-set g_weaponreplace_fireball 0 // Don't kill me div0, just for now until I figure out a good balance for it.
-set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun (for Q3A map compatibility)"
-// }}}
-
 // {{{ 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"
@@ -40,9 +15,10 @@ set g_start_weapon_hlac 0 "0 = never provide the weapon, 1 = always provide the
 set g_start_weapon_campingrifle -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_balance_health_start 100
+set g_start_weapon_seeker 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_balance_health_start 125
 set g_balance_armor_start 0
-set g_start_ammo_shells 45
+set g_start_ammo_shells 30
 set g_start_ammo_nails 0
 set g_start_ammo_rockets 0
 set g_start_ammo_cells 0
@@ -55,27 +31,29 @@ 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 50
-set g_lms_start_ammo_nails 150
-set g_lms_start_ammo_rockets 50
-set g_lms_start_ammo_cells 50
+set g_lms_start_armor 200
+set g_lms_start_ammo_shells 120
+set g_lms_start_ammo_nails 400
+set g_lms_start_ammo_rockets 120
+set g_lms_start_ammo_cells 200
 set g_lms_start_ammo_fuel 0
-set g_balance_nixnex_roundtime 25
-set g_balance_nixnex_incrtime 1.6
-set g_balance_nixnex_ammo_shells 15
-set g_balance_nixnex_ammo_nails 45
-set g_balance_nixnex_ammo_rockets 15
-set g_balance_nixnex_ammo_cells 15
-set g_balance_nixnex_ammo_fuel 0
-set g_balance_nixnex_ammoincr_shells 2
-set g_balance_nixnex_ammoincr_nails 6
-set g_balance_nixnex_ammoincr_rockets 2
-set g_balance_nixnex_ammoincr_cells 2
-set g_balance_nixnex_ammoincr_fuel 2
+set g_balance_nix_roundtime 25
+set g_balance_nix_incrtime 1.6
+set g_balance_nix_ammo_shells 120
+set g_balance_nix_ammo_nails 400
+set g_balance_nix_ammo_rockets 120
+set g_balance_nix_ammo_cells 200
+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 30
 set g_pickup_shells_max 120
 set g_pickup_nails 80
@@ -88,21 +66,29 @@ set g_pickup_fuel 25
 set g_pickup_fuel_jetpack 50
 set g_pickup_fuel_max 999
 set g_pickup_armorsmall 10
-set g_pickup_armorsmall_max 100
+set g_pickup_armorsmall_max 200
+set g_pickup_armorsmall_anyway 1
 set g_pickup_armormedium 25
-set g_pickup_armormedium_max 100
+set g_pickup_armormedium_max 200
+set g_pickup_armormedium_anyway 1
 set g_pickup_armorbig 50
-set g_pickup_armorbig_max 100
+set g_pickup_armorbig_max 200
+set g_pickup_armorbig_anyway 1
 set g_pickup_armorlarge 100
-set g_pickup_armorlarge_max 100
+set g_pickup_armorlarge_max 200
+set g_pickup_armorlarge_anyway 1
 set g_pickup_healthsmall 10
 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
@@ -132,7 +118,7 @@ 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 0
+set g_balance_armor_rotlinear 3
 set g_balance_pause_armor_rot 1
 set g_balance_pause_armor_rot_spawn 1
 set g_balance_armor_regenstable 100
@@ -152,7 +138,7 @@ set g_balance_fuel_limit 999
 // }}}
 
 // {{{ misc
-set g_balance_selfdamagepercent 0.6
+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"
@@ -248,7 +234,7 @@ set g_balance_laser_secondary_delay 0
 // {{{ shotgun
 set g_balance_shotgun_primary_bullets 6
 set g_balance_shotgun_primary_damage 8
-set g_balance_shotgun_primary_force 0
+set g_balance_shotgun_primary_force 15
 set g_balance_shotgun_primary_spread 0.11
 set g_balance_shotgun_primary_refire 0.5
 set g_balance_shotgun_primary_animtime 0.2
@@ -258,7 +244,7 @@ set g_balance_shotgun_primary_bulletconstant 75 // 3.8qu
 set g_balance_shotgun_secondary 1
 set g_balance_shotgun_secondary_bullets 6
 set g_balance_shotgun_secondary_damage 8
-set g_balance_shotgun_secondary_force 0
+set g_balance_shotgun_secondary_force 15
 set g_balance_shotgun_secondary_spread 0.17
 set g_balance_shotgun_secondary_refire 1.35
 set g_balance_shotgun_secondary_animtime 0.2
@@ -269,12 +255,12 @@ set g_balance_shotgun_secondary_bulletconstant 75 // 3.8qu
 // {{{ uzi
 set g_balance_uzi_first 1
 set g_balance_uzi_first_damage 12
-set g_balance_uzi_first_force 0
+set g_balance_uzi_first_force 5
 set g_balance_uzi_first_spread 0.015
 set g_balance_uzi_first_refire 0.15
 set g_balance_uzi_first_ammo 1
 set g_balance_uzi_sustained_damage 7
-set g_balance_uzi_sustained_force 0
+set g_balance_uzi_sustained_force 5
 set g_balance_uzi_sustained_spread 0.05
 set g_balance_uzi_sustained_refire 0.075
 set g_balance_uzi_sustained_ammo 1
@@ -309,6 +295,8 @@ set g_balance_grenadelauncher_secondary_animtime 0.3
 set g_balance_grenadelauncher_secondary_ammo 2
 set g_balance_grenadelauncher_secondary_health 70
 set g_balance_grenadelauncher_secondary_damageforcescale 4
+set g_balance_grenadelauncher_secondary_bouncefactor 0.5
+set g_balance_grenadelauncher_secondary_bouncestop 0.075
 // }}}
 // {{{ electro
 set g_balance_electro_lightning 0
@@ -351,9 +339,9 @@ set g_balance_electro_combo_speed 2000
 set g_balance_crylink_primary_damage 14
 set g_balance_crylink_primary_edgedamage 0
 set g_balance_crylink_primary_force -55
-set g_balance_crylink_primary_radius 80
+set g_balance_crylink_primary_radius 50
 set g_balance_crylink_primary_speed 7000
-set g_balance_crylink_primary_spread 0.01
+set g_balance_crylink_primary_spread 0.02
 set g_balance_crylink_primary_shots 4
 set g_balance_crylink_primary_bounces 1
 set g_balance_crylink_primary_refire 0.4
@@ -379,7 +367,7 @@ set g_balance_crylink_secondary_shots 3
 set g_balance_crylink_secondary_bounces 0
 set g_balance_crylink_secondary_refire 0.1
 set g_balance_crylink_secondary_animtime 0.1
-set g_balance_crylink_secondary_ammo 1
+set g_balance_crylink_secondary_ammo 2
 set g_balance_crylink_secondary_bouncedamagefactor 0.5
 
 set g_balance_crylink_secondary_middle_lifetime 5 // range: 35000 full, fades to 70000
@@ -389,7 +377,7 @@ set g_balance_crylink_secondary_line_fadetime 2
 // }}}
 // {{{ nex
 set g_balance_nex_damage 90
-set g_balance_nex_force 200
+set g_balance_nex_force 300
 set g_balance_nex_refire 1.5
 set g_balance_nex_animtime 0.3
 set g_balance_nex_ammo 5
@@ -439,7 +427,7 @@ set g_balance_rocketlauncher_animtime 0.3
 set g_balance_rocketlauncher_ammo 3
 set g_balance_rocketlauncher_health 40
 set g_balance_rocketlauncher_damageforcescale 4
-set g_balance_rocketlauncher_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_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 140 // 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)
@@ -521,7 +509,7 @@ set g_balance_campingrifle_tracer 1
 set g_balance_campingrifle_primary_damage 50
 set g_balance_campingrifle_primary_headshotaddeddamage 50
 set g_balance_campingrifle_primary_spread 0
-set g_balance_campingrifle_primary_force 0
+set g_balance_campingrifle_primary_force 50
 set g_balance_campingrifle_primary_speed 35000
 set g_balance_campingrifle_primary_lifetime 5
 set g_balance_campingrifle_primary_refire 0.7
@@ -529,10 +517,11 @@ set g_balance_campingrifle_primary_animtime 0.3
 set g_balance_campingrifle_primary_ammo 10
 set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
 set g_balance_campingrifle_primary_burstcost 0.35 // require same cooldown as secondary, note it's smaller than primary refire time
+set g_balance_campingrifle_primary_bullethail 0
 set g_balance_campingrifle_secondary_damage 15
 set g_balance_campingrifle_secondary_headshotaddeddamage 25
 set g_balance_campingrifle_secondary_spread 0.02
-set g_balance_campingrifle_secondary_force 0
+set g_balance_campingrifle_secondary_force 30
 set g_balance_campingrifle_secondary_speed 20000
 set g_balance_campingrifle_secondary_lifetime 5
 set g_balance_campingrifle_secondary_refire 0.1
@@ -540,6 +529,7 @@ set g_balance_campingrifle_secondary_animtime 0.1
 set g_balance_campingrifle_secondary_ammo 4
 set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu
 set g_balance_campingrifle_secondary_burstcost 0.35
+set g_balance_campingrifle_secondary_bullethail 0
 // }}}
 // {{{ tuba
 set g_balance_tuba_refire 0.05
@@ -553,40 +543,91 @@ set g_balance_tuba_radius 200
 set g_balance_tuba_force 40
 // }}}
 // {{{ fireball
-set g_balance_fireball_primary_ammo 5
-set g_balance_fireball_primary_animtime 0.3
-set g_balance_fireball_primary_damage 40
+set g_balance_fireball_primary_ammo 40
+set g_balance_fireball_primary_animtime 0.15
+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_damagetime 5
-set g_balance_fireball_primary_force 100
+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 30
+set g_balance_fireball_primary_laserdamage 80
 set g_balance_fireball_primary_laseredgedamage 20
-set g_balance_fireball_primary_laserradius 110
-set g_balance_fireball_primary_lifetime 7
-set g_balance_fireball_primary_refire 2
-set g_balance_fireball_primary_speed 900
-set g_balance_fireball_primary_speed_up 100
-set g_balance_fireball_primary_speed_z 0
+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 25
-set g_balance_fireball_secondary_animtime 0.15
-set g_balance_fireball_secondary_bfgdamage 100
-set g_balance_fireball_secondary_bfgforce 500
-set g_balance_fireball_secondary_bfgradius 750
-set g_balance_fireball_secondary_damage 150
+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_edgedamage 0
-set g_balance_fireball_secondary_force 700
-set g_balance_fireball_secondary_health 50
+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 30
+set g_balance_fireball_secondary_laserdamage 50
 set g_balance_fireball_secondary_laseredgedamage 20
-set g_balance_fireball_secondary_laserradius 256
-set g_balance_fireball_secondary_lifetime 15
-set g_balance_fireball_secondary_radius 200
-set g_balance_fireball_secondary_refire 0
-set g_balance_fireball_secondary_refire2 4
-set g_balance_fireball_secondary_speed 650
+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
 // }}}
+// {{{ seeker
+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 1.05
+set g_balance_seeker_missile_ammo 2
+set g_balance_seeker_missile_animtime 0.3
+set g_balance_seeker_missile_count 4
+set g_balance_seeker_missile_damage 40
+set g_balance_seeker_missile_damageforcescale 4
+set g_balance_seeker_missile_decel 0.9
+set g_balance_seeker_missile_delay 0.25
+set g_balance_seeker_missile_edgedamage 10
+set g_balance_seeker_missile_force 250
+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_accel 0
+set g_balance_seeker_missile_speed_up 300
+set g_balance_seeker_missile_speed_z 0
+set g_balance_seeker_missile_speed_max 1250
+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.3
+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.7
+set g_balance_seeker_tag_speed 9000
+set g_balance_seeker_tag_spread 0
+// End new seeker
diff --git a/balanceXPM.cfg b/balanceXPM.cfg
new file mode 100644 (file)
index 0000000..bb0416a
--- /dev/null
@@ -0,0 +1,634 @@
+// {{{ 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 -2 "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_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 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_campingrifle 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_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 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_balance_health_start 125
+set g_balance_armor_start 0
+set g_start_ammo_shells 0
+set g_start_ammo_nails 100
+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 210
+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 0
+set g_pickup_weapons_anyway 0
+set g_pickup_shells 10
+set g_pickup_shells_max 30
+set g_pickup_nails 30
+set g_pickup_nails_max 210
+set g_pickup_rockets 20
+set g_pickup_rockets_max 150
+set g_pickup_cells 50
+set g_pickup_cells_max 150
+set g_pickup_fuel 25
+set g_pickup_fuel_jetpack 50
+set g_pickup_fuel_max 999
+set g_pickup_armorsmall 5
+set g_pickup_armorsmall_max 200
+set g_pickup_armorsmall_anyway 0
+set g_pickup_armormedium 25
+set g_pickup_armormedium_max 200
+set g_pickup_armormedium_anyway 0
+set g_pickup_armorbig 50
+set g_pickup_armorbig_max 200
+set g_pickup_armorbig_anyway 0
+set g_pickup_armorlarge 100
+set g_pickup_armorlarge_max 200
+set g_pickup_armorlarge_anyway 0
+set g_pickup_healthsmall 5
+set g_pickup_healthsmall_max 200
+set g_pickup_healthsmall_anyway 0
+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 100
+set g_pickup_healthlarge_anyway 0
+set g_pickup_healthmega 100
+set g_pickup_healthmega_max 200
+set g_pickup_healthmega_anyway 0
+set g_pickup_respawntime_short 30
+set g_pickup_respawntime_medium 30
+set g_pickup_respawntime_long 30
+set g_pickup_respawntime_powerup 90
+set g_pickup_respawntime_weapon 5
+set g_pickup_respawntime_ammo 30
+set g_pickup_respawntimejitter_short 0
+set g_pickup_respawntimejitter_medium 0
+set g_pickup_respawntimejitter_long 0
+set g_pickup_respawntimejitter_powerup 15
+set g_pickup_respawntimejitter_weapon 0
+set g_pickup_respawntimejitter_ammo 0
+// }}}
+
+// {{{ regen/rot
+set g_balance_health_regen 0
+set g_balance_health_regenlinear 0
+set g_balance_pause_health_regen 0
+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.66
+
+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.05
+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.5
+set g_throughfloor_force 0.7
+set g_projectiles_newton_style 0
+// 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 4
+// 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 675
+set g_balance_falldamage_factor 0.25
+set g_balance_falldamage_maxdamage 10
+// }}}
+
+// {{{ powerups
+set g_balance_powerup_invincible_takedamage 0.25
+set g_balance_powerup_invincible_time 30
+set g_balance_powerup_strength_damage 4
+set g_balance_powerup_strength_force 4
+set g_balance_powerup_strength_time 30
+set g_balance_powerup_strength_selfdamage 2
+set g_balance_powerup_strength_selfforce 2
+// }}}
+
+// {{{ 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 22
+set g_balance_laser_primary_edgedamage 0
+set g_balance_laser_primary_force 200
+set g_balance_laser_primary_radius 52
+set g_balance_laser_primary_speed 0
+set g_balance_laser_primary_spread 0
+set g_balance_laser_primary_refire 0.1
+set g_balance_laser_primary_animtime 0.1
+set g_balance_laser_primary_lifetime 0
+set g_balance_laser_primary_shotangle 0
+set g_balance_laser_primary_delay 0
+set g_balance_laser_gauntlet 1
+set g_balance_laser_secondary 0 // when 1, a secondary laser mode exists
+set g_balance_laser_secondary_damage 30
+set g_balance_laser_secondary_edgedamage 0
+set g_balance_laser_secondary_force 100
+set g_balance_laser_secondary_radius 3
+set g_balance_laser_secondary_speed 1500
+set g_balance_laser_secondary_spread 0
+set g_balance_laser_secondary_refire 0
+set g_balance_laser_secondary_animtime 0.15
+set g_balance_laser_secondary_lifetime 0.066
+set g_balance_laser_secondary_shotangle 0
+set g_balance_laser_secondary_delay 0
+// }}}
+// {{{ shotgun
+set g_balance_shotgun_primary_bullets 25
+set g_balance_shotgun_primary_damage 4
+set g_balance_shotgun_primary_force 10
+set g_balance_shotgun_primary_spread 0.18
+set g_balance_shotgun_primary_refire 1
+set g_balance_shotgun_primary_animtime 0.7
+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 0
+set g_balance_shotgun_secondary_bullets 22
+set g_balance_shotgun_secondary_damage 2
+set g_balance_shotgun_secondary_force 12
+set g_balance_shotgun_secondary_spread 0.25
+set g_balance_shotgun_secondary_refire 1.5
+set g_balance_shotgun_secondary_animtime 0.2
+set g_balance_shotgun_secondary_ammo 0.5
+set g_balance_shotgun_secondary_speed 12000
+set g_balance_shotgun_secondary_bulletconstant 75 // 3.8qu
+// }}}
+// {{{ uzi
+set g_balance_uzi_first 0
+set g_balance_uzi_first_damage 10
+set g_balance_uzi_first_force 50
+set g_balance_uzi_first_spread 0.007
+set g_balance_uzi_first_refire 0.15
+set g_balance_uzi_first_ammo 1
+set g_balance_uzi_sustained_damage 5
+set g_balance_uzi_sustained_force 10
+set g_balance_uzi_sustained_spread 0.02
+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
+// }}}
+// {{{ mortar
+set g_balance_grenadelauncher_primary2secondary 1
+set g_balance_grenadelauncher_primary_damage 60
+set g_balance_grenadelauncher_primary_edgedamage 10
+set g_balance_grenadelauncher_primary_force 250
+set g_balance_grenadelauncher_primary_radius 100
+set g_balance_grenadelauncher_primary_speed 2000
+set g_balance_grenadelauncher_primary_speed_up 200
+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_refire 0.7
+set g_balance_grenadelauncher_primary_animtime 0.3
+set g_balance_grenadelauncher_primary_ammo 2
+set g_balance_grenadelauncher_secondary_damage 65
+set g_balance_grenadelauncher_secondary_edgedamage 10
+set g_balance_grenadelauncher_secondary_force 300
+set g_balance_grenadelauncher_secondary_radius 200
+set g_balance_grenadelauncher_secondary_speed 800
+set g_balance_grenadelauncher_secondary_speed_up 0
+set g_balance_grenadelauncher_secondary_speed_z 200
+set g_balance_grenadelauncher_secondary_spread 0
+set g_balance_grenadelauncher_secondary_lifetime 2
+set g_balance_grenadelauncher_secondary_refire 0.8
+set g_balance_grenadelauncher_secondary_animtime 0.5
+set g_balance_grenadelauncher_secondary_ammo 2
+set g_balance_grenadelauncher_secondary_health 0
+set g_balance_grenadelauncher_secondary_damageforcescale 0
+set g_balance_grenadelauncher_secondary_bouncefactor 0.5
+set g_balance_grenadelauncher_secondary_bouncestop 0.075
+// }}}
+// {{{ electro
+set g_balance_electro_lightning 1
+set g_balance_electro_primary_damage 6
+set g_balance_electro_primary_edgedamage 0
+set g_balance_electro_primary_force 60 // todo: probaby needs movement nerfing code when hit?
+set g_balance_electro_primary_radius 850
+set g_balance_electro_primary_comboradius 0
+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.066
+set g_balance_electro_primary_animtime 0.066
+set g_balance_electro_primary_ammo 0.66
+set g_balance_electro_secondary_damage 45
+set g_balance_electro_secondary_spread 0.10
+set g_balance_electro_secondary_edgedamage 10
+set g_balance_electro_secondary_force 100
+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 2.5
+set g_balance_electro_secondary_refire 0.1
+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 5
+set g_balance_electro_secondary_damageforcescale 4
+set g_balance_electro_secondary_count 3
+set g_balance_electro_combo_damage 50
+set g_balance_electro_combo_edgedamage 0
+set g_balance_electro_combo_force 100
+set g_balance_electro_combo_radius 250
+set g_balance_electro_combo_comboradius 0
+set g_balance_electro_combo_speed 2000
+// }}}
+// {{{ crylink
+set g_balance_crylink_primary_damage 18
+set g_balance_crylink_primary_edgedamage 18
+set g_balance_crylink_primary_force 50
+set g_balance_crylink_primary_radius 100
+set g_balance_crylink_primary_speed 1100
+set g_balance_crylink_primary_spread 0.01
+set g_balance_crylink_primary_shots 4
+set g_balance_crylink_primary_bounces 0
+set g_balance_crylink_primary_refire 0.4
+set g_balance_crylink_primary_animtime 0.4
+set g_balance_crylink_primary_ammo 2
+set g_balance_crylink_primary_bouncedamagefactor 0.5
+
+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_star_lifetime 3 // range: 700 full, fades to 2450
+set g_balance_crylink_primary_star_fadetime 5
+set g_balance_crylink_primary_other_lifetime 3 // range: 700 full, fades to 2450
+set g_balance_crylink_primary_other_fadetime 5
+
+set g_balance_crylink_secondary 0
+set g_balance_crylink_secondary_damage 8
+set g_balance_crylink_secondary_edgedamage 8
+set g_balance_crylink_secondary_force -40
+set g_balance_crylink_secondary_radius 10
+set g_balance_crylink_secondary_speed 4000
+set g_balance_crylink_secondary_spread 0.01
+set g_balance_crylink_secondary_shots 3
+set g_balance_crylink_secondary_bounces 0
+set g_balance_crylink_secondary_refire 0.1
+set g_balance_crylink_secondary_animtime 0.1
+set g_balance_crylink_secondary_ammo 1
+set g_balance_crylink_secondary_bouncedamagefactor 0.5
+
+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: 35000 full, fades to 70000
+set g_balance_crylink_secondary_line_fadetime 2
+// }}}
+// {{{ nex
+set g_balance_nex_damage 80
+set g_balance_nex_force 200
+set g_balance_nex_refire 1.25
+set g_balance_nex_animtime 1.25
+set g_balance_nex_ammo 5
+set g_balance_nex_damagefalloff_mindist 1000
+set g_balance_nex_damagefalloff_maxdist 3000
+set g_balance_nex_damagefalloff_halflife 1500
+set g_balance_nex_damagefalloff_forcehalflife 1500
+// }}}
+// {{{ minstanex
+set g_balance_minstanex_refire 1
+set g_balance_minstanex_animtime 1
+set g_balance_minstanex_ammo 10
+// }}}
+// {{{ hagar
+set g_balance_hagar_primary_damage 12
+set g_balance_hagar_primary_edgedamage 5
+set g_balance_hagar_primary_force 70
+set g_balance_hagar_primary_radius 50
+set g_balance_hagar_primary_spread 0
+set g_balance_hagar_primary_speed 1800
+set g_balance_hagar_primary_lifetime 5
+set g_balance_hagar_primary_refire 0.1
+set g_balance_hagar_primary_ammo 1
+set g_balance_hagar_secondary 0
+set g_balance_hagar_secondary_damage 11
+set g_balance_hagar_secondary_edgedamage 4
+set g_balance_hagar_secondary_force 60
+set g_balance_hagar_secondary_radius 70
+set g_balance_hagar_secondary_spread 0.05
+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.1
+set g_balance_hagar_secondary_ammo 1
+// }}}
+// {{{ rocketlauncher
+set g_balance_rocketlauncher_damage 90
+set g_balance_rocketlauncher_edgedamage 30
+set g_balance_rocketlauncher_force 350
+set g_balance_rocketlauncher_radius 110
+set g_balance_rocketlauncher_speed 1000
+set g_balance_rocketlauncher_speedaccel 0
+set g_balance_rocketlauncher_speedstart 1000
+set g_balance_rocketlauncher_lifetime 10
+set g_balance_rocketlauncher_refire 0.9
+set g_balance_rocketlauncher_animtime 0.7
+set g_balance_rocketlauncher_ammo 3
+set g_balance_rocketlauncher_health 0
+set g_balance_rocketlauncher_damageforcescale 0
+set g_balance_rocketlauncher_detonatedelay 9999 // 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 0 // 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 1 // stop guiding when firing again
+set g_balance_rocketlauncher_laserguided_speed 1000 //650
+set g_balance_rocketlauncher_laserguided_speedaccel 0
+set g_balance_rocketlauncher_laserguided_speedstart 1000
+set g_balance_rocketlauncher_laserguided_turnrate 0.75 //0.5
+set g_balance_rocketlauncher_laserguided_allow_steal 1
+// }}}
+// {{{ 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 30
+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 2 // 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 3 // 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 10 // 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
+set g_balance_hlac_primary_spread_min 0.01
+set g_balance_hlac_primary_spread_max 0.03
+set g_balance_hlac_primary_spread_add 0.002
+set g_balance_hlac_primary_spread_crouchmod 0.5
+
+set g_balance_hlac_primary_damage 6
+set g_balance_hlac_primary_edgedamage 0
+set g_balance_hlac_primary_force 60 // todo: probably needs movement nerfing code when hit
+set g_balance_hlac_primary_radius 850
+set g_balance_hlac_primary_speed 0
+set g_balance_hlac_primary_lifetime 0
+
+set g_balance_hlac_primary_refire 0.066
+set g_balance_hlac_primary_animtime 0.066
+set g_balance_hlac_primary_ammo 0.066
+
+set g_balance_hlac_secondary 0
+set g_balance_hlac_secondary_spread 0.06
+set g_balance_hlac_secondary_spread_crouchmod 0.5
+
+set g_balance_hlac_secondary_damage 11
+set g_balance_hlac_secondary_edgedamage 10
+set g_balance_hlac_secondary_force 60
+set g_balance_hlac_secondary_radius 70
+set g_balance_hlac_secondary_speed 20000
+set g_balance_hlac_secondary_lifetime 5
+
+set g_balance_hlac_secondary_refire 0.6
+set g_balance_hlac_secondary_animtime 0.6
+set g_balance_hlac_secondary_ammo 10
+set g_balance_hlac_secondary_shots 5
+// }}}
+// {{{ campingrifle
+set g_balance_campingrifle_magazinecapacity 0
+set g_balance_campingrifle_reloadtime 2 // matches reload anim
+set g_balance_campingrifle_auto_reload_after_changing_weapons 0
+set g_balance_campingrifle_bursttime 0.85 // 0.35 - 0.1 + 0.35 - 0.1 + 0.35 = three secondaries
+set g_balance_campingrifle_tracer 1
+set g_balance_campingrifle_primary_damage 50
+set g_balance_campingrifle_primary_headshotaddeddamage 80
+set g_balance_campingrifle_primary_spread 0
+set g_balance_campingrifle_primary_force 0
+set g_balance_campingrifle_primary_speed 35000
+set g_balance_campingrifle_primary_lifetime 5
+set g_balance_campingrifle_primary_refire 0.7
+set g_balance_campingrifle_primary_animtime 0.7
+set g_balance_campingrifle_primary_ammo 10
+set g_balance_campingrifle_primary_bulletconstant 130 // 56.3qu
+set g_balance_campingrifle_primary_burstcost 0.35 // require same cooldown as secondary, note it's smaller than primary refire time
+set g_balance_campingrifle_primary_bullethail 0
+set g_balance_campingrifle_secondary_damage 15
+set g_balance_campingrifle_secondary_headshotaddeddamage 25
+set g_balance_campingrifle_secondary_spread 0.02
+set g_balance_campingrifle_secondary_force 0
+set g_balance_campingrifle_secondary_speed 20000
+set g_balance_campingrifle_secondary_lifetime 5
+set g_balance_campingrifle_secondary_refire 0.1
+set g_balance_campingrifle_secondary_animtime 0.1
+set g_balance_campingrifle_secondary_ammo 4
+set g_balance_campingrifle_secondary_bulletconstant 130 // 18.3qu
+set g_balance_campingrifle_secondary_burstcost 0.35
+set g_balance_campingrifle_secondary_bullethail 0
+// }}}
+// {{{ 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.15
+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.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 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
+// }}}
+// {{{ seeker
+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 1.05
+set g_balance_seeker_missile_ammo 2
+set g_balance_seeker_missile_animtime 0.3
+set g_balance_seeker_missile_count 4
+set g_balance_seeker_missile_damage 40
+set g_balance_seeker_missile_damageforcescale 4
+set g_balance_seeker_missile_decel 0.9
+set g_balance_seeker_missile_delay 0.25
+set g_balance_seeker_missile_edgedamage 10
+set g_balance_seeker_missile_force 250
+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_accel 0
+set g_balance_seeker_missile_speed_up 300
+set g_balance_seeker_missile_speed_z 0
+set g_balance_seeker_missile_speed_max 1250
+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.3
+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.7
+set g_balance_seeker_tag_speed 9000
+set g_balance_seeker_tag_spread 0
+// End new seeker
index eab32aa2d9eacd708adf5e433329cbdda476109d..0530c99f92170ce83b8ea22b7cb59c85f11d088f 100644 (file)
--- a/bots.txt
+++ b/bots.txt
@@ -1,21 +1,21 @@
 //bot configuration: name      model   skin    shirt   pants   team    keyboard use    moving  dodging ping    weapon use      aggressivity    range   aiming  calmhand        mouse   fightthink      aithink
 //default team values (team-override): 1 = red, 2 = blue, 3 = yellow, 4 = pink                                                                                                                                 
 //use -1 for shirt-color or pants-color to get random colors                                                                                                                                   
-Hellfire       carni   0       4       0       0       0       0       -0.5    -1      1       1       -0.5    -1      -1      2       0.5     -1
-Toxic  carni   1       14      7       0       -1      -1.5    -0.5    0       1       0       0       0       2       -0.5    -0.5    1
-Discovery      crash   0       2       6       0       0       -1      -0.5    -0.5    1       -0.5    0.5     1.5     -0.5    -1      1       0.5
-Pegasus        grunt   0       13      11      0       1       1       1       1       -1      0       0.5     0       -2      0       -1      0
-Eureka headhunter      0       12      7       0       0       0       -1.5    -0.5    -0.5    0       0       0       0       -0.5    1.5     1.5
-Airhead        insurrectionist 0       11      1       0       -1      -1.5    -1      -0.5    1       1       -1      1       -0.5    1       0.5     0
-Gator  lurk    0       3       10      0       0       1       0       0.5     -0.5    0.5     -0.5    -1      0       0       -0.5    0
-Delirium       lurk    1       8       12      0       0       -1      -1      -1      0       2       0       1       0       2       -1      -1
-Death  lycanthrope     0       4       11      0       -0.5    0       0       1       -0.5    0       1       0       0       0       0       0
-Scorcher       marine  0       13      13      0       0       -1      0       -0.5    0.5     1       0       1       -2      1       0       0
-Necrotic       nexus   0       12      14      0       0       0       0       1       0       -1      -0.5    -1      1       0       0       0
-Dominator      nexus   1       3       9       0       0       0       0       2       -1      0       0       0       -1      0       0       0
-Thunderstorm   nexus   2       13      6       0       0       0       0       -0.5    -1      1       0.5     0.5     -0.5    0       0.5     0
-Mystery        pyria   0       9       14      0       1       1       1       1       -1      -1      0       1       1       -2      -1      -1
-Lion   shock   0       0       4       0       1       1.5     2       -1      -1      -1      1       0       1       -0.5    -1      -1
-Sensible       skadi   0       9       9       0       0       0       0.5     -1      0       -1      0       -1      2.5     -1.5    1       0.5
-Shadow specop  0       4       8       0       -0.5    2       1       0       0       -1      0       -1      0       1       -1      -0.5
-Resurrection   visitant        0       1       1       0       0       -0.5    -0.5    0       2       -1      -1      -1      0       -1      1       1
+Hellfire       umbra   0       4       0       0       0       0       -0.5    -1      1       1       -0.5    -1      -1      2       0.5     -1
+Toxic  umbra   0       14      7       0       -1      -1.5    -0.5    0       1       0       0       0       2       -0.5    -0.5    1
+Discovery      umbra   0       2       6       0       0       -1      -0.5    -0.5    1       -0.5    0.5     1.5     -0.5    -1      1       0.5
+Pegasus        umbra   0       13      11      0       1       1       1       1       -1      0       0.5     0       -2      0       -1      0
+Eureka umbra   0       12      7       0       0       0       -1.5    -0.5    -0.5    0       0       0       0       -0.5    1.5     1.5
+Airhead        umbra   0       11      1       0       -1      -1.5    -1      -0.5    1       1       -1      1       -0.5    1       0.5     0
+Gator  umbra   0       3       10      0       0       1       0       0.5     -0.5    0.5     -0.5    -1      0       0       -0.5    0
+Delirium       umbra   0       8       12      0       0       -1      -1      -1      0       2       0       1       0       2       -1      -1
+Death  umbra   0       4       11      0       -0.5    0       0       1       -0.5    0       1       0       0       0       0       0
+Scorcher       umbra   0       13      13      0       0       -1      0       -0.5    0.5     1       0       1       -2      1       0       0
+Necrotic       umbra   0       12      14      0       0       0       0       1       0       -1      -0.5    -1      1       0       0       0
+Dominator      umbra   0       3       9       0       0       0       0       2       -1      0       0       0       -1      0       0       0
+Thunderstorm   umbra   0       13      6       0       0       0       0       -0.5    -1      1       0.5     0.5     -0.5    0       0.5     0
+Mystery        umbra   0       9       14      0       1       1       1       1       -1      -1      0       1       1       -2      -1      -1
+Lion   umbra   0       0       4       0       1       1.5     2       -1      -1      -1      1       0       1       -0.5    -1      -1
+Sensible       umbra   0       9       9       0       0       0       0.5     -1      0       -1      0       -1      2.5     -1.5    1       0.5
+Shadow umbra   0       4       8       0       -0.5    2       1       0       0       -1      0       -1      0       1       -1      -0.5
+Resurrection   umbra   0       1       1       0       0       -0.5    -0.5    0       2       -1      -1      -1      0       -1      1       1
diff --git a/common-spog.pk3 b/common-spog.pk3
deleted file mode 100644 (file)
index 3696bbb..0000000
Binary files a/common-spog.pk3 and /dev/null differ
index 0143318be3e98c8aa12e4a1f110730582142e8e6..372784dd780c5cc14b7e4affc50518ddca673458 100644 (file)
@@ -20,3 +20,6 @@ _update_configversion_$g_configversion
 _update_generic
 
 set g_configversion 2
+
+// we now use mastervolume
+volume 1
diff --git a/cubemaps/default/skynx.png b/cubemaps/default/skynx.png
new file mode 100644 (file)
index 0000000..8903c0b
Binary files /dev/null and b/cubemaps/default/skynx.png differ
diff --git a/cubemaps/default/skyny.png b/cubemaps/default/skyny.png
new file mode 100644 (file)
index 0000000..d11965e
Binary files /dev/null and b/cubemaps/default/skyny.png differ
diff --git a/cubemaps/default/skynz.png b/cubemaps/default/skynz.png
new file mode 100644 (file)
index 0000000..0bee498
Binary files /dev/null and b/cubemaps/default/skynz.png differ
diff --git a/cubemaps/default/skypx.png b/cubemaps/default/skypx.png
new file mode 100644 (file)
index 0000000..f2ac4e1
Binary files /dev/null and b/cubemaps/default/skypx.png differ
diff --git a/cubemaps/default/skypy.png b/cubemaps/default/skypy.png
new file mode 100644 (file)
index 0000000..4677f49
Binary files /dev/null and b/cubemaps/default/skypy.png differ
diff --git a/cubemaps/default/skypz.png b/cubemaps/default/skypz.png
new file mode 100644 (file)
index 0000000..3dde87a
Binary files /dev/null and b/cubemaps/default/skypz.png differ
index 8cf217ce4fc7b26b84e88912e239cf97d3ca2d0a..86b48082742510298643d3039145c27b34156815 100644 (file)
@@ -1,4 +1 @@
 exec defaultXonotic.cfg
-
-// we're not xonotic 2.6 yet
-//exec default25.cfg
diff --git a/default25.cfg b/default25.cfg
deleted file mode 100644 (file)
index 8d380fd..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-cl_netfps 20
-sys_ticrate 0.05
-sv_gameplayfix_delayprojectiles 1
-exec physics25.cfg
-exec balance25.cfg
diff --git a/default26.cfg b/default26.cfg
deleted file mode 100644 (file)
index 260c96d..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-cl_netfps 60
-sys_ticrate 0.0166667
-sv_gameplayfix_delayprojectiles 0
-exec physics26.cfg
-exec balance.cfg
diff --git a/defaultSamual.cfg b/defaultSamual.cfg
new file mode 100644 (file)
index 0000000..c0dce41
--- /dev/null
@@ -0,0 +1,31 @@
+// Samual's mod configuration file
+exec defaultXonotic.cfg
+
+// weapon replace options
+set g_weaponreplace_laser ""
+set g_weaponreplace_shotgun ""
+set g_weaponreplace_uzi ""
+set g_weaponreplace_grenadelauncher ""
+set g_weaponreplace_electro ""
+set g_weaponreplace_crylink ""
+set g_weaponreplace_nex ""
+set g_weaponreplace_hagar ""
+set g_weaponreplace_rocketlauncher ""
+set g_weaponreplace_porto ""
+set g_weaponreplace_minstanex ""
+set g_weaponreplace_hook ""
+set g_weaponreplace_hlac 0 // Maybe will be enabled later after I figure out what I want to do with it
+set g_weaponreplace_campingrifle ""
+set g_weaponreplace_tuba "" 
+set g_weaponreplace_fireball 0 // Same with this
+set g_weaponreplace_seeker 0 // Same with this
+set sv_q3acompat_machineshotgunswap 0
+
+// other options
+set sv_fragmessage_information_ping 1
+set sv_fragmessage_information_handicap 2
+set sv_fragmessage_information_stats 1
+set sv_fragmessage_information_typefrag 1
+
+exec physicsSamual.cfg
+exec balanceSamual.cfg
diff --git a/defaultXPM.cfg b/defaultXPM.cfg
new file mode 100644 (file)
index 0000000..f480e22
--- /dev/null
@@ -0,0 +1,23 @@
+exec defaultXonotic.cfg
+
+set g_weaponreplace_laser ""
+set g_weaponreplace_shotgun "uzi"
+set g_weaponreplace_uzi "shotgun"
+set g_weaponreplace_grenadelauncher ""
+set g_weaponreplace_electro ""
+set g_weaponreplace_crylink ""
+set g_weaponreplace_nex ""
+set g_weaponreplace_hagar ""
+set g_weaponreplace_rocketlauncher ""
+set g_weaponreplace_porto ""
+set g_weaponreplace_minstanex ""
+set g_weaponreplace_hook 0
+set g_weaponreplace_hlac 0
+set g_weaponreplace_campingrifle 0
+set g_weaponreplace_tuba ""
+set g_weaponreplace_fireball 0
+set g_weaponreplace_seeker 0
+set sv_q3acompat_machineshotgunswap 0
+
+exec physicsXPM.cfg
+exec balanceXPM.cfg
index fb2800a02f2d1d43613834eb6a9683ec19dae1db..fd4c100ceb2a164ad643eb2b9dbcbdba95490c8e 100644 (file)
@@ -1,17 +1,5 @@
 set g_xonoticversion 2.5svn    "Xonotic version (formatted for humans)"
 
-//!<showbrand
-showbrand 3
-echo
-echo A warning about this being a SVN development version was set up.
-echo This build shall be used for development and testing only!
-echo
-echo If you want to disable this warning, add the line
-echo   showbrand 0
-echo to your autoexec.cfg.
-echo
-//!>showbrand
-
 // changes a cvar and reports it to the server (for the menu to notify the
 // server about changes)
 alias setreport "set \"$1\" \"$2\" ; sendcvar \"$1\""
@@ -105,7 +93,7 @@ mod_q3bsp_lightmapmergepower 3
 // player defaults
 _cl_color 102
 _cl_name Player
-_cl_playermodel models/player/marine.zym
+_cl_playermodel models/player/umbra.iqm
 _cl_playerskin 0
 crosshair 1
 seta crosshair_per_weapon 0    "when 1, each gun will display a different crosshair"
@@ -193,6 +181,12 @@ seta crosshair_hlac_color_green 0.65       "crosshair color green component to display
 seta crosshair_hlac_color_blue 0.2     "crosshair color blue component to display when wielding the H.L.A.C."
 seta crosshair_hlac_color_alpha 1      "crosshair alpha value to display when wielding the H.L.A.C."
 seta crosshair_hlac_size 0.6   "crosshair size when wielding the H.L.A.C."
+seta crosshair_seeker ""       "crosshair to display when wielding the TAG Seeker"
+seta crosshair_seeker_color_red 1      "crosshair color red component to display when wielding the TAG seeker"
+seta crosshair_seeker_color_green 0.35 "crosshair color green component to display when wielding the TAG seeker"
+seta crosshair_seeker_color_blue 0.35  "crosshair color blue component to display when wielding the TAG seeker"
+seta crosshair_seeker_color_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_campingrifle "" "crosshair to display when wielding the campingrifle"
 seta crosshair_campingrifle_color_red 0.85     "crosshair color red component to display when wielding the campingrifle"
 seta crosshair_campingrifle_color_green 0.5    "crosshair color green component to display when wielding the campingrifle"
@@ -245,6 +239,29 @@ cl_deathfade 1 // fade screen to dark red when dead, value represents how fast t
 cl_bobcycle 0 // how long the cycle of up/down view movement takes (only works if cl_bob is not 0), default is 0.6
 cl_bob 0.01 // how much view moves up/down when moving (does not move if cl_bobcycle is 0, but still enables cl_bobmodel), default is 0.02
 cl_bobmodel 1 // whether to have gun model move around on screen when moving (only works if cl_bob is not 0), default is 1
+cl_leanmodel 1 // enables weapon leaning effect when looking around
+cl_leanmodel_side_speed 0.7 "gun leaning sideways speed"
+cl_leanmodel_side_limit 35 "gun leaning sideways limit"
+cl_leanmodel_side_highpass1 30 "gun leaning sideways pre-highpass in 1/s"
+cl_leanmodel_side_highpass 3 "gun leaning sideways highpass in 1/s"
+cl_leanmodel_side_lowpass 20 "gun leaning sideways lowpass in 1/s"
+cl_leanmodel_up_speed 0.65 "gun leaning upward speed"
+cl_leanmodel_up_limit 50 "gun leaning upward limit"
+cl_leanmodel_up_highpass1 5 "gun leaning upward pre-highpass in 1/s"
+cl_leanmodel_up_highpass 15 "gun leaning upward highpass in 1/s"
+cl_leanmodel_up_lowpass 20 "gun leaning upward lowpass in 1/s"
+cl_followmodel 1 // enables weapon pushing / pulling effect when walking
+cl_followmodel_side_speed 0.25 "gun following sideways speed"
+cl_followmodel_side_limit 6 "gun following sideways limit"
+cl_followmodel_side_highpass1 30 "gun following sideways pre-highpass in 1/s"
+cl_followmodel_side_highpass 5 "gun following sideways highpass in 1/s"
+cl_followmodel_side_lowpass 10 "gun following sideways lowpass in 1/s"
+cl_followmodel_up_speed 0.5 "gun following upward speed"
+cl_followmodel_up_limit 5 "gun following upward limit"
+cl_followmodel_up_highpass1 60 "gun following upward pre-highpass in 1/s"
+cl_followmodel_up_highpass 2 "gun following upward highpass in 1/s"
+cl_followmodel_up_lowpass 10 "gun following upward lowpass in 1/s"
+
 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.5 // whether to use screen tints, default is 1
@@ -311,6 +328,10 @@ set g_telefrags 1
 set g_telefrags_avoid 0
 set g_teleport_maxspeed 0 "maximum speed that a player can keep when going through a teleporter (if a misc_teleporter_dest also has a cap the smallest one of these will be used), 0 = don't limit, -1 = keep no speed"
 
+set g_respawn_ghosts 0 "if 1 dead bodies become ghosts and float away when the player respawns"
+set g_respawn_ghosts_speed 5 "the speed with which respawn ghosts float and rotate"
+set g_respawn_ghosts_maxtime 6 "maximum amount of time a respawn ghost can last, minimum time is half this value. 0 disables and ghosts fade when the body would"
+
 // fragmessage: This allows extra information to be displayed with the frag centerprints. 
 set sv_fragmessage_information_ping 0 "Enable ping display information, 0 = Never display; 1 = Always display (If the player is a bot, it will say bot instead of the ping.)"
 set sv_fragmessage_information_handicap 1 "Enable handicap display information, 0 = Never display; 1 = Only when the player has handicap on; 2 = Always display (Displays Off if off)"
@@ -319,7 +340,7 @@ set sv_fragmessage_information_typefrag 1 "Enable typefrag display information,
 
 // use default physics
 set sv_friction_on_land 0
-exec physics26.cfg
+exec physicsNoQWBunny.cfg
 
 set sv_player_viewoffset "0 0 35" "view offset of the player model"
 set sv_player_mins "-16 -16 -24" "playermodel mins"
@@ -330,9 +351,9 @@ set sv_player_crouch_maxs "16 16 25" "maxs of a crouched playermodel"
 
 set sv_pogostick 1 "don't require releasing the space bar for jumping again"
 set sv_doublejump 0 "allow Quake 2-style double jumps"
-set sv_jumpspeedcap_min "" "wont perform a doublejump if z-axis speed is higher than sv_jumpvelocity * this"
-set sv_jumpspeedcap_max "" "wont perform a doublejump if z-axis speed is higher than sv_jumpvelocity * this"
-set sv_jumpspeedcap_max_disable_on_ramps 0 "disable max jumpspeedcap on ramps to preserve the old rampjump style"
+set sv_jumpspeedcap_min "" "lower bound on the baseline velocity of a jump; final velocity will be >= (jumpheight * min + jumpheight)"
+set sv_jumpspeedcap_max "" "upper bound on the baseline velocity of a jump; final velocity will be <= (jumpheight * max + jumpheight)"
+set sv_jumpspeedcap_max_disable_on_ramps 0 "disable upper baseline velocity bound on ramps to preserve the old rampjump style"
 
 seta sv_precacheplayermodels 1
 seta sv_precacheweapons 0
@@ -409,9 +430,9 @@ set bot_ai_keyboard_treshold 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 campingrifle rocketlauncher grenadelauncher electro hagar hlac crylink laser uzi fireball shotgun tuba" "Desired weapons for far distances ordered by priority"
-set bot_ai_custom_weapon_priority_mid   "minstanex rocketlauncher nex fireball grenadelauncher electro uzi campingrifle crylink hlac hagar shotgun laser tuba" "Desired weapons for middle distances ordered by priority"
-set bot_ai_custom_weapon_priority_close "minstanex nex uzi hlac tuba hagar crylink grenadelauncher shotgun electro campingrifle rocketlauncher laser fireball" "Desired weapons for close distances ordered by priority"
+set bot_ai_custom_weapon_priority_far   "minstanex nex campingrifle rocketlauncher grenadelauncher electro hagar hlac crylink laser uzi fireball seeker shotgun tuba"  "Desired weapons for far distances ordered by priority"
+set bot_ai_custom_weapon_priority_mid   "minstanex rocketlauncher nex fireball seeker grenadelauncher electro uzi campingrifle crylink hlac hagar shotgun laser tuba"  "Desired weapons for middle distances ordered by priority"
+set bot_ai_custom_weapon_priority_close "minstanex nex uzi hlac tuba seeker hagar crylink grenadelauncher shotgun electro campingrifle rocketlauncher laser fireball"  "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.3  "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"
@@ -512,6 +533,19 @@ alias clearmap "disconnect"
 
 set g_grappling_hook 0 "let players spawn with the grappling hook which allows them to pull themselves up"
 
+set g_dodging 0 "set to 1 to enable dodging in games"
+
+seta cl_dodging_timeout 0.2 "determines how long apart (in seconds) two taps on the same direction key are considered a dodge. use 0 to disable"
+
+set sv_dodging_wall_dodging 0 "set to 1 to allow dodging off walls. 0 to disable"
+set sv_dodging_delay 0.5 "determines how long a player has to wait to be able to dodge again after dodging"
+set sv_dodging_up_speed 200 "the jump velocity of the dodge"
+set sv_dodging_horiz_speed 400 "the horizontal velocity of the dodge"
+set sv_dodging_ramp_time 0.1 "a ramp so that the horizontal part of the dodge is added smoothly (seconds)"
+set sv_dodging_height_threshold 10 "the maximum height above ground where to allow dodging"
+set sv_dodging_wall_distance_threshold 10 "the maximum distance from a wall that still allows dodging"
+set sv_dodging_sound 1 "if 1 dodging makes a sound. if 0 dodging is silent"
+
 set leadlimit 0
 
 // this means that timelimit can be overidden globally and fraglimit can be overidden for each game mode: DM/TDM, Domination, CTF, and Runematch.
@@ -1065,12 +1099,12 @@ bind F2 vno
 alias spec "cmd spectate"
 bind F3 spec
 
-// NixNex (No-Items x Xonotic) - at each time, everyone uses the same weapon,
+// NIX (No Items Xonotic) - at each time, everyone uses the same weapon,
 // and in regular intervals, this weapon is cycled
-set g_nixnex 0 "No Items Xonotic - instead of pickup items, everyone plays with the same weapon. After some time, a countdown will start, after which everyone will switch to another weapon, and so on"
-set g_nixnex_with_laser 0 "always carry the laser as an additional weapon in NixNex"
-set g_nixnex_with_healtharmor 0 "when 1, health and armor still show up in NixNex"
-set g_nixnex_with_powerups 0 "when 1, powerups still show up in NixNex"
+set g_nix 0 "No Items Xonotic - instead of pickup items, everyone plays with the same weapon. After some time, a countdown will start, after which everyone will switch to another weapon, and so on"
+set g_nix_with_laser 0 "always carry the laser as an additional weapon in NIX"
+set g_nix_with_healtharmor 0 "when 1, health and armor still show up in NIX"
+set g_nix_with_powerups 0 "when 1, powerups still show up in NIX"
 
 // score log
 set sv_logscores_console 0     "print scores to server console"
@@ -1147,8 +1181,6 @@ set g_chat_flood_lmax_tell 2      "private chat: maximum number of lines per chat mes
 set g_chat_flood_burst_tell 2  "private chat: allow bursts of so many chat lines"
 set g_chat_flood_notify_flooder 1      "when 0, the flooder still can see his own message"
 set g_chat_teamcolors 0        "colorize nicknames in team color for chat"
-set g_voice_flood_spv 4        "normal voices: seconds between voices to not count as flooding"
-set g_voice_flood_spv_team 2   "team voices: seconds between voices to not count as flooding"
 set g_nick_flood_timeout 120 "time after which nick flood protection resets (set to 0 to disable nick flood checking)"
 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"
@@ -1417,11 +1449,22 @@ alias sethostname "set menu_use_default_hostname 0; hostname $*"
 set sv_foginterval 0
 
 // Audio track names (for old-style "cd loop NUMBER" usage)
-set g_cdtracks_remaplist "digital-pursuit breakdown-easy brainsukker chaos-fog infight neuronal-diving subcities thru-the-mirror calling-bogus beast-of-insanity thunder brokenlight brokenlight stairs sixtyfour_ desert3 ninesix sixtyfour_revisited northern-lights" "list used by mapinfo system to automatically assign cdtracks - must match the cd remap command"
-set g_cdtracks_dontusebydefault "digital-pursuit thunder brokenlight" "list used by mapinfo system to automatically assign cdtracks - must be a subset of g_cdtracks_remaplist"
+set _cdtrack_first "1"
+alias _cdtrack_0 "g_cdtracks_remaplist \"$g_cdtracks_remaplist $1\""
+alias _cdtrack_1 "g_cdtracks_remaplist \"$1\"; set _cdtrack_first 0"
+alias _cdtrack "_cdtrack_$_cdtrack_first $2"
+set g_cdtracks_remaplist ""
+exec cdtracks.cfg
+unset _cdtrack_first
+unalias _cdtrack_0
+unalias _cdtrack_1
+unalias _cdtrack
+
 cd remap $g_cdtracks_remaplist
 set sv_intermission_cdtrack ""
-set menu_cdtrack brokenlight
+
+set g_cdtracks_dontusebydefault ""
+set menu_cdtrack "ninesix"
 
 // maxidle (in seconds): kick players idle for more than that amount of time
 set sv_maxidle 0
@@ -1454,18 +1497,19 @@ set g_jump_grunt 0      "Do you make a grunting noise every time you jump? Is it the
 alias allready "sv_cmd allready"
 
 // note: these cvars use weapon NUMBERS. Use the menu to edit this cvar, or look the numbers up in qcsrc/common/constants.qh.
-seta cl_weaponpriority "minstanex rocketlauncher nex grenadelauncher fireball hlac hagar crylink campingrifle uzi electro tuba shotgun laser hook porto" "weapon priority list"
+seta cl_weaponpriority "minstanex rocketlauncher nex grenadelauncher fireball hlac hagar seeker crylink campingrifle 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"
-seta cl_weaponpriority0 "rocketlauncher grenadelauncher hagar 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 campingrifle"                    "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 campingrifle 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 hlac hagar crylink 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_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 campingrifle"                           "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 campingrifle 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 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"
 seta cl_weaponpriority7 "" "use impulse 207 for prev gun from this list, 217 for best gun, 227 for next gun"
 seta cl_weaponpriority8 "" "use impulse 208 for prev gun from this list, 218 for best gun, 228 for next gun"
 seta cl_weaponpriority9 "" "use impulse 209 for prev gun from this list, 219 for best gun, 229 for next gun"
+seta cl_weaponimpulsemode 0 "0: only cycle between currently usable weapons in weapon priority order; 1: cycle between all possible weapons on a key in weapon priority order"
 
 seta sv_status_privacy 1       "hide IP addresses from \"status\" replies shown to clients"
 
@@ -1549,6 +1593,8 @@ alias rankings "cmd rankings"
 
 set g_ballistics_materialconstant 1414213562
 set g_ballistics_mindistance 16
+set g_ballistics_density_player 0.50 // players are 2x as easy to pass as walls
+set g_ballistics_density_corpse 0.10 // corpses are 10x as easy to pass as walls
 // unit: qJ / qu^3 (energy needed per volume unit of solid to push/burn away
 // parameter: bullet constant: mass / area in g/qu^2
 // = mass / (pi/4 * caliber^2)
@@ -1726,7 +1772,7 @@ seta cl_noantilag 0 "turn this on if you believe antilag is bad"
 
 set sv_pitch_min -35 "minimum aiming angle for shooting direction display of the gun"
 set sv_pitch_max  35 "maximum aiming angle for shooting direction display of the gun"
-set sv_pitch_fixyaw 1 "workaround to fix the aiming direction on stupidly made player models, FIXME fix the models and set this to 0"
+set sv_pitch_fixyaw 0 "workaround to fix the aiming direction on stupidly made player models, FIXME fix the models and set this to 0"
 
 set rescan_pending 0 "set to 1 to schedule a fs_rescan at the end of this match"
 
@@ -1776,3 +1822,50 @@ seta _cl_userid "" "player ID (e.g. for tournaments)"
 // FIXME workaround for engine bug
 sv_gameplayfix_nudgeoutofsolid 0
 // to div0: remove this once 5b7ac1706712977bbc0297d2d53294e73574c7cd (svn r9537) is in the stable branch of the engine again
+
+// otherwise, antilag breaks
+sv_gameplayfix_consistentplayerprethink 1
+
+// support Q1BSP maps
+mod_q1bsp_polygoncollisions 1
+
+// improve some minor details
+sv_gameplayfix_gravityunaffectedbyticrate 1
+sv_gameplayfix_nogravityonground 1
+
+// autodemo deleting
+seta cl_autodemo_delete_keeprecords 0 "when 1, records with a newly made race/cts demo are kept even if cl_autodemo_delete is used to delete demos"
+
+// freeze camera
+set cl_lockview 0 "when 1, the camera does not move any more"
+
+// we now use mastervolume
+volume 1
+
+// sucks less than the old one
+cl_decals_newsystem 1
+
+// NOTE: this only replaces weapons on the map
+// use g_start_weapon_* to also replace the on-startup weapons!
+// example: g_weaponreplace_nex "nex minstanex", then Nexes become MinstaNexes 50% of the times
+// set the cvars to "0" to totally disable a weapon
+set g_weaponreplace_laser ""
+set g_weaponreplace_shotgun ""
+set g_weaponreplace_uzi ""
+set g_weaponreplace_grenadelauncher ""
+set g_weaponreplace_electro ""
+set g_weaponreplace_crylink ""
+set g_weaponreplace_nex ""
+set g_weaponreplace_hagar ""
+set g_weaponreplace_rocketlauncher ""
+set g_weaponreplace_porto ""
+set g_weaponreplace_minstanex ""
+set g_weaponreplace_hook ""
+set g_weaponreplace_hlac ""
+set g_weaponreplace_campingrifle ""
+set g_weaponreplace_tuba ""
+set g_weaponreplace_fireball ""
+set g_weaponreplace_seeker ""
+set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping uzi and shotgun (for Q3A map compatibility in mapinfo files)"
+
+set g_movement_highspeed 1 "movement speed modification factor (only changes movement when above maxspeed)"
index 8ab688d8f480ff042e5ba1aec530b07dd9f251b4..53926a7a0b203cb37859fb8cc5a92443d0d15ee1 100644 (file)
@@ -14,7 +14,7 @@ lightradiusfade 200
 lightcolor 0.4 0.9 0.9
 // cloud of particles which expand rapidly and then slow to form a ball
 effect TE_WIZSPIKE
-count 100
+count 50
 type static
 color 0x63F2EA 0x63f2EA
 size 2 2
@@ -47,7 +47,7 @@ alpha 256 256 1024
 size 24 24
 // sparks that rapidly expand and rapidly slow down to form an interesting spherical effect
 effect TE_KNIGHTSPIKE
-count 256
+count 128
 type spark
 color 0x800000 0xFF8020
 alpha 256 256 1024
@@ -70,7 +70,7 @@ alpha 256 256 0
 originjitter 6 6 6
 // dust/smoke drifting away from the impact
 effect TE_SPIKE
-count 8
+count 4
 type smoke
 tex 0 8
 color 0x101010 0x101010
@@ -81,7 +81,7 @@ originjitter 0 0 0
 velocityjitter 8 8 8
 // dust/smoke staying at the impact
 effect TE_SPIKE
-count 1
+count 0.5
 type smoke
 tex 0 8
 color 0x505050 0x505050
@@ -92,7 +92,7 @@ originjitter 0 0 0
 velocityjitter 0 0 0
 // bouncing sparks
 effect TE_SPIKE
-count 20
+count 10
 type spark
 color 0x8f4333 0xfff31b
 size 0.4 0.4
@@ -125,7 +125,7 @@ size 48 48
 alpha 256 256 128
 // large sparks
 effect TE_SPIKEQUAD
-count 20
+count 10
 type static
 color 0x2030FF 0x80C0FF
 size 32 32
@@ -149,7 +149,7 @@ alpha 256 256 0
 originjitter 6 6 6
 // dust/smoke drifting away from the impact
 effect TE_SUPERSPIKE
-count 8
+count 4
 type smoke
 tex 0 8
 color 0x101010 0x101010
@@ -160,7 +160,7 @@ originjitter 0 0 0
 velocityjitter 8 8 8
 // dust/smoke staying at the impact
 effect TE_SUPERSPIKE
-count 1
+count 0.5
 type smoke
 tex 0 8
 color 0x505050 0x505050
@@ -171,7 +171,7 @@ originjitter 0 0 0
 velocityjitter 0 0 0
 // sparks that disappear on impact
 effect TE_SUPERSPIKE
-count 30
+count 15
 type spark
 color 0x8f4333 0xfff31b
 size 0.4 0.4
@@ -196,7 +196,7 @@ lightradiusfade 500
 lightcolor 0.15 0.15 1.5
 // dust/smoke drifting away from the impact
 effect TE_SUPERSPIKEQUAD
-count 8
+count 4
 type smoke
 tex 0 8
 color 0x101010 0x101010
@@ -207,7 +207,7 @@ originjitter 0 0 0
 velocityjitter 8 8 8
 // dust/smoke staying at the impact
 effect TE_SUPERSPIKEQUAD
-count 1
+count 0.5
 type smoke
 tex 0 8
 color 0x505050 0x505050
@@ -218,7 +218,7 @@ originjitter 0 0 0
 velocityjitter 0 0 0
 // sparks that disappear on impact
 effect TE_SUPERSPIKEQUAD
-count 30
+count 15
 type spark
 color 0x8f4333 0xfff31b
 size 0.4 0.4
@@ -240,7 +240,7 @@ alpha 256 256 0
 originjitter 6 6 6
 // dust/smoke drifting away from the impact
 effect TE_GUNSHOT
-count 4
+count 2
 type smoke
 tex 0 8
 color 0x101010 0x101010
@@ -251,7 +251,7 @@ originjitter 0 0 0
 velocityjitter 8 8 8
 // dust/smoke staying at the impact
 effect TE_GUNSHOT
-count 1
+count 0.5
 type smoke
 tex 0 8
 color 0x505050 0x505050
@@ -262,7 +262,7 @@ originjitter 0 0 0
 velocityjitter 0 0 0
 // bouncing sparks
 effect TE_GUNSHOT
-count 10
+count 5
 type spark
 color 0x8f4333 0xfff31b
 size 0.4 0.4
@@ -295,7 +295,7 @@ size 8 8
 alpha 256 256 512
 // purple sparks
 effect TE_GUNSHOTQUAD
-count 12
+count 6
 type spark
 color 0xA040C0 0xFFFFFF
 size 1 1
@@ -329,7 +329,7 @@ alpha 192 192 64
 // fire effect which expands then slows
 effect TE_EXPLOSION
 notunderwater
-count 128
+count 64
 type static
 tex 48 55
 color 0x902010 0xFFD080
@@ -343,7 +343,7 @@ velocityjitter 256 256 256
 // underwater bubbles
 effect TE_EXPLOSION
 underwater
-count 32
+count 16
 type bubble
 tex 62 62
 color 0x404040 0x808080
@@ -357,7 +357,7 @@ velocityjitter 96 96 96
 // bouncing sparks
 effect TE_EXPLOSION
 notunderwater
-count 32
+count 16
 type spark
 color 0x903010 0xFFD030
 size 2 2
@@ -385,7 +385,7 @@ lightcolor 4 2 8
 // smoke cloud
 effect TE_EXPLOSIONQUAD
 notunderwater
-count 32
+count 16
 type smoke
 color 0x202020 0x404040
 tex 0 8
@@ -395,7 +395,7 @@ velocityjitter 48 48 48
 // underwater bubbles
 effect TE_EXPLOSIONQUAD
 underwater
-count 32
+count 16
 type bubble
 tex 62 62
 color 0x404040 0x808080
@@ -409,7 +409,7 @@ velocityjitter 96 96 96
 // sparks which go through walls
 effect TE_EXPLOSIONQUAD
 notunderwater
-count 128
+count 64
 type spark
 color 0x903010 0xFFD030
 size 1 1
@@ -436,7 +436,7 @@ lightcolor 1.6 0.8 2
 // smoke cloud
 effect TE_TAREXPLOSION
 notunderwater
-count 32
+count 16
 type smoke
 color 0x202020 0x404040
 tex 0 8
@@ -446,7 +446,7 @@ velocityjitter 48 48 48
 // underwater bubbles
 effect TE_TAREXPLOSION
 underwater
-count 32
+count 16
 type bubble
 tex 62 62
 color 0x404040 0x808080
@@ -460,7 +460,7 @@ velocityjitter 96 96 96
 // sparks which go through walls
 effect TE_TAREXPLOSION
 notunderwater
-count 128
+count 64
 type spark
 color 0x903010 0xFFD030
 size 1 1
@@ -474,7 +474,7 @@ velocityjitter 256 256 256
 // bloody impact effect indicating damage
 // used nowhere in code
 effect TE_BLOOD
-count 0.333
+count 0.167
 type blood
 tex 24 32
 size 8 8
@@ -493,7 +493,7 @@ staintex 16 24
 // used in qcsrc/server/antilag.qc:            te_spark(antilag_takebackorigin(e, time - e.antilag_debug), '0 0 0', 32)
 // used in qcsrc/server/g_triggers.qc: self.mdl = "TE_SPARK"
 effect TE_SPARK
-count 1
+count 0.5
 type spark
 tex 40 40
 color 0x8f4333 0xfff31b
@@ -528,7 +528,7 @@ size 8 8
 alpha 256 256 512
 // small sparks which form a sphere as they slow down
 effect TE_PLASMABURN
-count 256
+count 128
 type spark
 color 0x2030FF 0x80C0FF
 size 1 2
@@ -549,7 +549,7 @@ lightcolor 2 2 2
 // quake effect
 // used nowhere in code
 effect TE_FLAMEJET
-count 1
+count 0.5
 type smoke
 color 0x6f0f00 0xe3974f
 size 4 4
@@ -564,7 +564,7 @@ velocitymultiplier 1
 // quake effect
 // used nowhere in code
 effect TE_LAVASPLASH
-count 64
+count 32
 type alphastatic
 color 0x6f0f00 0xe3974f
 size 12 12
@@ -578,7 +578,7 @@ velocityjitter 128 128 0
 // player teleport effect
 // used nowhere in code
 effect TE_TELEPORT
-count 112
+count 56
 type static
 color 0xA0A0A0 0xFFFFFF
 size 10 10
@@ -595,13 +595,13 @@ velocityjitter 0 0 256
 effect TE_TEI_G3
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 color 0xFFFFFF 0xFFFFFF
 size 4 4
 alpha 128 128 256
 // experimental
 effect TE_TEI_G3
-trailspacing 2
+trailspacing 4
 type static
 color 0x202020 0x404040
 size 1 1
@@ -614,7 +614,7 @@ type smoke
 // smoke effect
 // used nowhere in code
 effect TE_TEI_SMOKE
-count 0.333
+count 0.167
 type smoke
 color 0x202020 0x404040
 tex 0 8
@@ -648,7 +648,7 @@ alpha 192 192 64
 // fire effect
 effect TE_TEI_BIGEXPLOSION
 notunderwater
-count 256
+count 128
 type static
 tex 48 55
 color 0x902010 0xFFD080
@@ -662,7 +662,7 @@ velocityjitter 512 512 512
 // underwater bubbles
 effect TE_TEI_BIGEXPLOSION
 underwater
-count 64
+count 32
 type bubble
 tex 62 62
 color 0x404040 0x808080
@@ -676,7 +676,7 @@ velocityjitter 144 144 144
 // bouncing sparks
 effect TE_TEI_BIGEXPLOSION
 notunderwater
-count 128
+count 64
 type spark
 color 0x903010 0xFFD030
 size 2 2
@@ -711,7 +711,7 @@ size 32 32
 alpha 256 256 512
 // cloud of bouncing sparks
 effect TE_TEI_PLASMAHIT
-count 1
+count 0.5
 type spark
 color 0x2030FF 0x80C0FF
 size 2 4
@@ -739,7 +739,7 @@ velocityjitter 512 512 512
 // used in qcsrc/client/gibs.qc:       pointparticles(particleeffectnum("blood"), self.origin + '0 0 1', '0 0 30', 10)
 // used in qcsrc/client/gibs.qc:                       pointparticles(particleeffectnum("blood"), org, vel, amount * 16)
 effect blood
-count 0.333
+count 0.167
 type blood
 tex 24 32
 size 3 8
@@ -767,12 +767,13 @@ originjitter 11 11 11
 // used in qcsrc/server/t_teleporters.qc:              pointparticles(particleeffectnum("teleport"), player.origin, '0 0 0', 1)
 // used in qcsrc/server/t_teleporters.qc:              pointparticles(particleeffectnum("teleport"), to + v_forward * 32, '0 0 0', 1)
 effect teleport
-count 1000
+count 500
 type spark
-tex 40 40
-color 0x807aff 0x4463d5
-size 1 3
+tex 64 64
+color 0xff8400 0xff2a00
+size 1 1
 alpha 0 256 100
+stretchfactor 2
 //gravity 1
 bounce 1.5
 originjitter 1 1 1
@@ -780,13 +781,21 @@ velocityjitter 1000 1000 1500
 velocitymultiplier 0.5
 airfriction 2
 stretchfactor 0.6
+effect teleport
+countabsolute 1
+type smoke
+tex 65 65
+size 150 150
+alpha 190 190 180
+sizeincrease -80
+color 0xff8400 0xff2a00
 
 
 
 // normal super gory blood trail (used by gibs)
 // used in qcsrc/client/gibs.qc:               trailparticles(self, particleeffectnum("TR_BLOOD"), oldorg, self.origin)
 effect TR_BLOOD
-trailspacing 16
+trailspacing 32
 type blood
 color 0xA8FFFF 0xA8FFFF
 tex 24 32
@@ -805,7 +814,7 @@ staintex 16 24
 // thinner blood trail (used by quake zombies)
 // used in qcsrc/client/gibs.qc:               trailparticles(self, particleeffectnum("TR_SLIGHTBLOOD"), oldorg, self.origin)
 effect TR_SLIGHTBLOOD
-trailspacing 32
+trailspacing 64
 type blood
 color 0xA8FFFF 0xA8FFFF
 tex 24 32
@@ -825,7 +834,7 @@ staintex 16 24
 // used in qcsrc/server/g_triggers.qc: self.effects = EF_STARDUST
 // used in qcsrc/server/portals.qc:    portal.effects = EF_STARDUST | EF_BLUE
 effect EF_STARDUST
-count 75
+count 37.5
 type static
 color 0xfff368 0xfff368
 size 1.0 2.0
@@ -850,7 +859,7 @@ size 32 32
 alpha 128 128 128
 // cloud of particles which expand rapidly and then slow to form a ball
 effect item_respawn
-count 256
+count 128
 type spark
 tex 41 41
 color 0x63F2EA 0x63f2EA
@@ -873,20 +882,48 @@ lightcolor 2 2 2
 // used in qcsrc/server/w_hlac.qc:     pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
 // used in qcsrc/server/w_laser.qc:    pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
 effect laser_muzzleflash
-count 1
+// glow and light
+countabsolute 1
 type smoke
-color 0xFFFFFF 0xFFFFFF
-tex 0 8
-size 5 5
-alpha 64 64 128
-airfriction 12
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
-velocitymultiplier 0.01
+color 0xcc0000 0xff0000
+tex 65 65
+size 10 15
+alpha 256 512 6280
+airfriction 10
+sizeincrease -100
+stretchfactor 2
 lightradius 200
 lightradiusfade 2000
 lightcolor 3 0.1 0.1
-
+// electricity
+effect laser_muzzleflash
+count 3
+type spark
+color 0xb44215 0xff0000
+tex 43 43
+size 5 7
+alpha 256 512 6280
+airfriction 10
+originjitter 2 2 2
+velocityjitter 150 150 150
+velocitymultiplier 0.2
+sizeincrease -100
+stretchfactor 2.3
+rotate -180 180 4000 -4000
+// fire
+effect laser_muzzleflash
+count 6
+type spark
+color 0xff4200 0xff0000
+tex 8 15
+size 7 9
+alpha 256 512 6280
+airfriction 12
+originjitter 2 2 2
+velocityjitter 100 100 100
+velocitymultiplier 0.2
+sizeincrease -100
+stretchfactor 2
 
 
 // decal
@@ -912,7 +949,7 @@ alpha 256 256 1024
 size 24 24
 // sparks that rapidly expand and rapidly slow down to form an interesting spherical effect
 effect laser_impact
-count 256
+count 128
 type spark
 color 0x800000 0xFF8020
 alpha 256 256 1024
@@ -923,7 +960,7 @@ liquidfriction 6
 //originjitter 32 32 32
 velocityjitter 256 256 256
 effect laser_impact
-count 8
+count 4
 type smoke
 tex 48 55
 color 0x800000 0xFF8020
@@ -940,7 +977,7 @@ sizeincrease 6
 // used in qcsrc/server/w_shotgun.qc:  pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, cvar("g_balance_shotgun_primary_ammo"))
 // used in qcsrc/server/w_shotgun.qc:  pointparticles(particleeffectnum("shotgun_muzzleflash"), w_shotorg, w_shotdir * 1000, cvar("g_balance_shotgun_secondary_ammo"))
 effect shotgun_muzzleflash
-count 3
+count 1.5
 type smoke
 color 0x202020 0x404040
 tex 0 8
@@ -955,19 +992,17 @@ lightcolor 2 1.5 0.2
 sizeincrease 12
 velocitymultiplier 0.05
 effect shotgun_muzzleflash
-count 10
+count 16
 type spark
-tex 40 40
-color 0xFFFDD9 0xff5a00
-size 2 2
+tex 48 55
+color 0xffdb96 0xff5400
+size 10 20
 alpha 0 128 1024
 originjitter 1 1 1
-velocityjitter 444 444 444
-velocitymultiplier 1.7
-gravity 0.3
+velocityjitter 100 100 100
 airfriction 5
-
-
+stretchfactor 2.5
+velocitymultiplier 0.5
 
 // shotgun pellet impact
 // decal
@@ -976,7 +1011,7 @@ effect shotgun_impact
 countabsolute 1
 type decal
 tex 56 59
-size 3 3
+size 5 8
 alpha 256 256 0
 originjitter 10 10 10
 //lightradius 30
@@ -984,48 +1019,53 @@ originjitter 10 10 10
 //lightcolor 1 1 1
 // dust/smoke drifting away from the impact
 effect shotgun_impact
-count 5
-type smoke
+type alphastatic
+notunderwater
 tex 0 8
-color 0xFFFFFF 0xA37443
-size 7 7
-alpha 0 64 32
-originjitter 1 1 1
-airfriction 7
-liquidfriction 16
-velocityjitter 100 100 100
-sizeincrease 12
-velocitymultiplier 0.25
+count 3
+size 10 20
+sizeincrease 25
+alpha 300 550 756
+velocityjitter 150 150 150
+velocitymultiplier 0.2
+airfriction 5
+color 0x473a37 0x0b0a07
+rotate 0 360 -50 50
 // dust/smoke staying at the impact
 effect shotgun_impact
-count 1
-type smoke
-tex 0 8
-color 0xFFFFFF 0xFFFFFF
-size 17 17
-alpha 64 64 32
-sizeincrease 4
+type alphastatic
+notunderwater
+tex 36 36
+count 0.5
+size 10 11
+sizeincrease 74
+alpha 200 350 500
+velocityjitter 11 11 11
+airfriction 5
+color 0x201d1a 0x000000
+bounce 6
+velocitymultiplier 0.03
+rotate 0 360 -50 50
 // sparks
 effect shotgun_impact
 notunderwater
-count 20
+count 1.5
 type spark
 tex 40 40
 color 0xFDFFD9 0xFDFFD9
 size 0.6 0.6
-alpha 256 256 768
+alpha 0 356 268
 gravity 1
-bounce 1
-airfriction 5
+bounce 1.5
+airfriction 1.1
 originjitter 1 1 1
-velocityjitter 400 400 400
-velocitymultiplier 0.1
-
+velocityjitter 200 200 200
+velocitymultiplier 0.2
 
 
 // used in qcsrc/server/w_uzi.qc:      pointparticles(particleeffectnum("uzi_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
 effect uzi_muzzleflash
-count 2
+count 1
 type static
 color 0x202020 0x404040
 tex 0 8
@@ -1039,7 +1079,7 @@ lightradiusfade 2000
 lightcolor 2 1.5 0.2
 gravity -0.1
 effect uzi_muzzleflash
-count 20
+count 10
 type spark
 tex 40 40
 color 0xFFFDD9 0xFFFDD9
@@ -1051,10 +1091,10 @@ velocitymultiplier 0.5
 airfriction 12
 
 
-// decal
 // used in qcsrc/server/cl_client.qc:  //pointparticles(particleeffectnum("machinegun_impact"), self.origin + self.view_ofs + '0 0 7', '0 0 0', 1)
 // used in qcsrc/client/damage.qc:                             pointparticles(particleeffectnum("machinegun_impact"), org2, backoff * 1000, 1)
 // used in qcsrc/client/damage.qc:                             pointparticles(particleeffectnum("machinegun_impact"), org2, backoff * 1000, 1)
+// decal
 effect machinegun_impact
 countabsolute 1
 type decal
@@ -1067,42 +1107,64 @@ lightradiusfade 800
 lightcolor 6 3.6 0.6
 // dust/smoke drifting away from the impact
 effect machinegun_impact
-count 5
-type smoke
+type alphastatic
+notunderwater
 tex 0 8
-color 0xFFFFFF 0xA37443
-size 7 7
-alpha 0 64 32
-originjitter 1 1 1
-airfriction 7
-liquidfriction 16
-velocityjitter 100 100 100
-sizeincrease 12
-velocitymultiplier 0.25
+count 3
+size 10 20
+sizeincrease 15
+alpha 300 550 456
+velocityjitter 150 150 150
+velocitymultiplier 0.1
+airfriction 5
+color 0x473a37 0x0b0a07
+rotate 0 360 -50 50
 // dust/smoke staying at the impact
 effect machinegun_impact
+type alphastatic
+notunderwater
+tex 36 36
+count 0.5
+size 10 11
+sizeincrease 74
+alpha 200 350 500
+velocityjitter 11 11 11
+airfriction 5
+color 0x201d1a 0x000000
+bounce 6
+velocitymultiplier 0.03
+rotate 0 360 -50 50
+//derbis
+effect machinegun_impact
+type alphastatic
+notunderwater
+tex 66 68
 count 1
-type smoke
-tex 0 8
-color 0xFFFFFF 0xFFFFFF
-size 17 17
-alpha 64 64 32
-sizeincrease 4
+size 1 5
+airfriction 1
+gravity 1.4
+alpha 300 550 256
+velocityjitter 350 350 350
+velocitymultiplier 0.2
+bounce 1.7
+color 0x63493e 0xffffff
+rotate 0 360 -500 500
 // sparks
 effect machinegun_impact
 notunderwater
-count 20
+count 1
 type spark
 tex 40 40
 color 0xFDFFD9 0xFDFFD9
 size 0.3 0.3
-alpha 256 256 768
+alpha 256 256 168
 gravity 1
 bounce 1
-airfriction 5
+airfriction 2
 originjitter 1 1 1
-velocityjitter 400 400 400
-velocitymultiplier 0.1
+velocityjitter 300 300 300
+velocitymultiplier 0.2
+
 
 
 
@@ -1111,7 +1173,7 @@ velocitymultiplier 0.1
 // used in qcsrc/server/w_grenadelauncher.qc:  pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
 // used in qcsrc/server/w_porto.qc:    //pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
 effect grenadelauncher_muzzleflash
-count 3
+count 1.5
 type smoke
 color 0x202020 0x404040
 tex 0 8
@@ -1125,16 +1187,17 @@ lightradius 200
 lightradiusfade 2000
 lightcolor 2 1.5 0.2
 effect grenadelauncher_muzzleflash
-count 30
+count 16
 type spark
-tex 40 40
-color 0xFFFDD9 0xFFFDD9
-size 3 3
+tex 48 55
+color 0xffdb96 0xff5400
+size 10 20
 alpha 0 128 1024
 originjitter 1 1 1
-velocityjitter 300 300 300
+velocityjitter 100 100 100
 velocitymultiplier 0.5
-airfriction 12
+airfriction 5
+stretchfactor 2.5
 
 
 
@@ -1143,14 +1206,14 @@ airfriction 12
 // used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_GRENADE"), from, to)
 // used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_GRENADE"), from, to)
 effect TR_GRENADE
-trailspacing 6
-type alphastatic
-color 0x303030 0x000000
+trailspacing 4
+type smoke
+color 0x101010 0x000000
 tex 0 8
-size 1 2
+size 3 2
 bounce 1
-sizeincrease 2
-alpha 100 200 280
+sizeincrease 10
+alpha 300 400 780
 originjitter 1 1 1
 velocityjitter 1 1 1
 velocitymultiplier -0.02
@@ -1158,7 +1221,7 @@ velocitymultiplier -0.02
 // fire
 effect TR_GRENADE
 notunderwater
-trailspacing 2
+trailspacing 4
 type static
 color 0xffdf72 0x811200
 tex 48 55
@@ -1171,7 +1234,7 @@ velocitymultiplier -1.0
 // bubbles
 effect TR_GRENADE
 underwater
-trailspacing 8
+trailspacing 16
 type bubble
 tex 62 62
 color 0x404040 0x808080
@@ -1191,14 +1254,14 @@ velocityjitter 16 16 16
 // used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_KNIGHTSPIKE"), from, to)
 effect TR_KNIGHTSPIKE // used for MF_TRACER2
 notunderwater
-trailspacing 5
-type alphastatic
+trailspacing 6
+type smoke
 color 0x303030 0x000000
 tex 0 8
 size 3 3
 bounce 1
 sizeincrease 11
-alpha 100 200 400
+alpha 300 400 600
 originjitter 2 2 2
 velocityjitter 3 3 3
 velocitymultiplier -0.02
@@ -1210,12 +1273,12 @@ color 0x666666 0x000000
 tex 62 62
 size 1 1
 sizeincrease -0.1
-trailspacing 1
+trailspacing 2
 alpha 256 256 720
 // bubbles
 effect TR_KNIGHTSPIKE // used for MF_TRACER2
 underwater
-trailspacing 16
+trailspacing 32
 type bubble
 tex 62 62
 color 0x404040 0x808080
@@ -1234,123 +1297,163 @@ effect grenade_explode
 countabsolute 1
 type decal
 tex 8 16
-size 72 72
+size 48 48
 alpha 256 256 0
-originjitter 23 23 23
-lightradius 400
-lightradiusfade 750
+originjitter 26 26 26
+lightradius 250
+lightradiusfade 400
 lightcolor 8 4 1
-// fire effect
+// fire effect which expands then slows
 effect grenade_explode
 notunderwater
-count 64
+count 40
 type static
 tex 48 55
-color 0x8f0d00 0xff5a00
-size 33 44
-sizeincrease 45
-alpha 200 256 512
-bounce 1.5
+color 0xe03f00 0x5e0000
+size 16 26
+sizeincrease 20
+alpha 128 228 356
+bounce 4.5
 airfriction 8
 liquidfriction 8
 originjitter 8 8 8
-velocityjitter 512 512 512
-// fire effect 2
+velocityjitter 256 256 256
+// fire effect which make brigt dot inside
 effect grenade_explode
 notunderwater
-count 28
-type smoke
+count 15
+type static
 tex 48 55
-color 0xea691b 0xeed05a
-size 33 44
-sizeincrease 55
-alpha 200 256 612
-bounce 2.5
-airfriction 19
-liquidfriction 19
+color 0xe03f00 0xffdf92
+size 6 16
+sizeincrease 40
+alpha 228 328 756
+bounce 1
+airfriction 8
+liquidfriction 8
 originjitter 8 8 8
-velocityjitter 912 912 912
+velocityjitter 256 256 256
 // smoke
 effect grenade_explode
 type alphastatic
 notunderwater
 tex 0 8
-count 64
+count 10
 size 20 40
-sizeincrease 44
-alpha 200 450 456
-velocityjitter 444 444 444
+sizeincrease 34
+alpha 300 550 556
+velocityjitter 256 256 256
 airfriction 5
 color 0x000000 0x111111
-bounce 2
+bounce 6
 // underwater bubbles
 effect grenade_explode
 underwater
-count 64
+count 32
 type bubble
 tex 62 62
 color 0x404040 0x808080
-size 3 3
+size 3 6
 alpha 128 256 64
 gravity -0.125
 bounce 1.5
 liquidfriction 0.25
 originjitter 16 16 16
-velocityjitter 144 144 144
+velocityjitter 196 196 196
+rotate 0 0 0 0
+// underwatershockwave
+effect grenade_explode
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 5 5
+sizeincrease 1500
+alpha 40 40 300
+velocitymultiplier 0.3
 // bouncing sparks
 effect grenade_explode
 notunderwater
-count 64
+count 16
 type spark
 tex 40 40
-color 0xffa800 0xffedaf
-size 1 1
-sizeincrease 2
-alpha 44 256 384
+color 0xffa35b 0xfff2be
+size 1 0.1
+alpha 644 956 484
 gravity 1
-airfriction -1
-bounce 1.5
+airfriction 1
+bounce 1.6
 liquidfriction 0.8
 velocityoffset 0 0 80
 originjitter 16 16 16
-velocityjitter 224 224 324
+velocityjitter 424 424 624
+// derbis
+effect grenade_explode
+notunderwater
+count 12
+type alphastatic
+tex 66 68
+color 0x6a3d25 0xcac5b4
+size 2 6
+alpha 644 956 684
+gravity 1.3
+airfriction 0.5
+bounce 1.6
+velocityjitter 324 324 524
+rotate -180 180 -1000 1000
 
 
 
 // used in qcsrc/server/w_electro.qc:  pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
 // used in qcsrc/server/w_electro.qc:  pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
 effect electro_muzzleflash
-count 1
+countabsolute 1
 type smoke
 color 0x283880 0x283880 // 0x202020 0x404040
-tex 0 8
-size 5
+tex 65 65
+size 15 15
 alpha 256 256 512
 originjitter 1.5 1.5 1.5
 velocityjitter 6 6 6
+sizeincrease -10
 velocitymultiplier 0.01
 lightradius 200
 lightradiusfade 2000
 lightcolor 1.5 3 6
+
 effect electro_muzzleflash
-count 30
+count 7
 type spark
-tex 31 31
+tex 8 15
 color 0xD9FDFF 0xD9FDFF
-size 3 3
-alpha 0 128 1024
+size 5 15
+alpha 110 228 2024
 originjitter 1 1 1
-velocityjitter 300 300 300
+velocityjitter 150 150 150
 velocitymultiplier 0.5
-airfriction 12
+airfriction 2
+stretchfactor 1.5
 
+effect electro_muzzleflash
+count 5
+type spark
+tex 41 41
+color 0xD9FDFF 0xD9FDFF
+size 7 6
+alpha 110 228 1024
+originjitter 1 1 1
+velocityjitter 350 350 350
+velocitymultiplier 2.5
+airfriction 8
+gravity 1.3
+stretchfactor 0.1
 
 
 // electro trail
 // glowing vapor trail
-// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_XONOTICPLASMA"), from, to)
-effect TR_XONOTICPLASMA
-trailspacing 1
+// used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_NEXUIZPLASMA"), from, to)
+effect TR_NEXUIZPLASMA
+trailspacing 2
 type static
 color 0x283880 0x283880
 size 3 3
@@ -1362,9 +1465,9 @@ lighttime 0
 lightcolor 1.5 3 6
 velocitymultiplier -0.1
 // bright sparks
-effect TR_XONOTICPLASMA
-trailspacing 6
-count 3
+effect TR_NEXUIZPLASMA
+trailspacing 12
+count 1.5
 type snow
 tex 42 42
 color 0x629dff 0x0018ff
@@ -1391,6 +1494,16 @@ originjitter 17 17 17
 lightradius 250
 lightradiusfade 250
 lightcolor 3.125 4.375 10
+// shockwave
+effect electro_impact
+type smoke
+countabsolute 1
+tex 33 33
+size 32 32
+sizeincrease 1000
+color 0x80C0FF 0x80C0FF
+alpha 40 40 350
+velocitymultiplier 44
 // flare effect
 effect electro_impact
 countabsolute 1
@@ -1401,7 +1514,7 @@ size 12 32
 alpha 256 256 512
 // cloud of bouncing sparks
 effect electro_impact
-count 60
+count 30
 type smoke
 tex 42 42
 color 0x629dff 0x0018ff
@@ -1413,9 +1526,10 @@ gravity -0.3
 airfriction 6
 originjitter 1 1 1
 velocityjitter 512 512 512
+rotate -180 180 -9999 9999
 // inner cloud of smoke
 effect electro_impact
-count 60
+count 30
 type smoke
 color 0x629dff 0x0018ff
 tex 0 8
@@ -1448,19 +1562,20 @@ size 32 32
 alpha 256 256 512
 // cloud of bouncing sparks
 effect electro_ballexplode
-count 128
+count 64
 type spark
 tex 41 41
 color 0xFDFFD9 0xFDFFD9
-size 16 16
+size 1 2
 alpha 256 256 1024
 bounce 2
+stretchfactor 0.4
 //airfriction 2
 originjitter 1 1 1
 velocityjitter 512 512 512
 // inner cloud of smoke
 effect electro_ballexplode
-count 16
+count 8
 type smoke
 color 0x202020 0x404040
 tex 0 8
@@ -1493,30 +1608,35 @@ size 48 48
 alpha 128 128 64
 // large sparks
 effect electro_combo
-count 20
+count 5
 type static
 color 0x2030FF 0x80C0FF
 size 32 32
-alpha 256 256 256
+sizeincrease 50
+tex 0 7
+alpha 156 156 156
 bounce 2
 airfriction 6
 liquidfriction 16
 //velocityoffset 0 0 120
 velocityjitter 512 512 512
 effect electro_combo
-count 64
+count 32
 type spark
 tex 41 41
-color 0xFDFFD9 0xFDFFD9
-size 16 16
-alpha 444 512 866
-bounce 2
+color 0xa9cacf 0x0054ff
+size 2 4
+stretchfactor 2
+gravity 0.3
+alpha 444 512 700
+velocitymultiplier 3
+bounce 1.6
 //airfriction 2
 originjitter 1 1 1
-velocityjitter 512 512 512
+velocityjitter 312 312 312
 // inner cloud of smoke
 effect electro_combo
-count 0.25
+count 0.125
 type smoke
 color 0x202020 0x404040
 tex 0 8
@@ -1524,36 +1644,44 @@ size 24 24
 alpha 256 256 256
 originjitter 20 20 20
 velocityjitter 32 32 32
+// shockwave
+effect electro_combo
+type smoke
+countabsolute 1
+color 0xa9cacf 0x0054ff
+tex 33 33
+size 30 30
+sizeincrease 600
+alpha 40 40 100
+velocitymultiplier 0.3
 
 
 
 // used in qcsrc/server/w_crylink.qc:  pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots)
 // used in qcsrc/server/w_crylink.qc:  pointparticles(particleeffectnum("crylink_muzzleflash"), w_shotorg, w_shotdir * 1000, shots)
 effect crylink_muzzleflash
-count 1
+count 0.5
 type smoke
-color 0x202020 0x404040
-tex 0 8
-size 5 5
-alpha 128 128 256
-originjitter 1.5 1.5 1.5
-velocityjitter 6 6 6
+color 0xdd9cff 0xff0090
+tex 65 65
+size 15 20
+alpha 128 128 2024
 velocitymultiplier 0.01
 lightradius 200
 lightradiusfade 2000
 lightcolor 1.6 0.2 2
 effect crylink_muzzleflash
-count 10
+count 5
 type spark
-tex 40 40
+tex 35 36
 color 0xA080C0 0xA080C0
-size 3 3
+size 5 10
 alpha 0 128 1024
 originjitter 1 1 1
 velocityjitter 200 200 200
 velocitymultiplier 0.3
 airfriction 12
-
+stretchfactor 1.5
 
 
 // crylink impact effect
@@ -1579,17 +1707,17 @@ size 8 8
 alpha 256 256 512
 // purple sparks
 effect crylink_impact
-count 20
+count 10
 type spark
 tex 41 41
 color 0xA040C0 0xA040C0
 bounce 2
-size 4 4
+size 1 2
 alpha 256 256 1024
 velocityjitter 256 256 256
 // purple splash
 effect crylink_impact
-count 3
+count 1.5
 type static
 color 0xE070FF 0xE070FF
 size 8 8
@@ -1597,7 +1725,7 @@ alpha 256 256 512
 velocityjitter 8 8 8
 // purple splash
 effect crylink_impact
-count 3
+count 1.5
 type static
 color 0xE070FF 0xE070FF
 size 8 8
@@ -1609,28 +1737,31 @@ velocityjitter 32 32 32
 // used in qcsrc/server/w_minstanex.qc:        pointparticles(particleeffectnum("nex_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
 // used in qcsrc/client/particles.qc:  pointparticles(particleeffectnum("nex_muzzleflash"), shotorg, normalize(endpos - shotorg) * 1000, 1)
 effect nex_muzzleflash
-count 10
-type smoke
-color 0x202020 0x404040
-tex 0 8
+count 12
+type spark
+color 0x202020 0x0072ff
+tex 48 55
 size 16 16
-alpha 128 128 192
+alpha 328 328 4000
 originjitter 4 4 4
-velocityjitter 24 24 24
-velocitymultiplier 0.02
+velocityjitter 180 180 180
+velocitymultiplier 1.4
+stretchfactor 2
+sizeincrease -100
+airfriction 9
 lightradius 200
 lightradiusfade 200
 lightcolor 2 2.5 3
 effect nex_muzzleflash
-count 150
+count 50
 type spark
 tex 41 41
 color 0xD9FDFF 0xD9FDFF
-size 3 3
+size 1 1
 alpha 0 128 1024
 originjitter 1 1 1
 velocityjitter 600 600 600
-velocitymultiplier 0.5
+velocitymultiplier 1.5
 airfriction 9
 
 
@@ -1639,14 +1770,14 @@ airfriction 9
 //effect nex_beam
 //countabsolute 1
 //type beam
-//tex 60 60
+//tex 200 200
 //color 0xFFFFFF 0xFFFFFF
 //size 6 6
 //alpha 128 128 192
 // nex beam: ring smoke
 // used in qcsrc/client/particles.qc:          trailparticles(world, particleeffectnum("nex_beam"), shotorg, endpos)
 effect nex_beam
-trailspacing 32
+trailspacing 64
 color 0x1680A0 0x1680A0
 size 4 4
 tex 32 32
@@ -1656,7 +1787,7 @@ sizeincrease 2
 type static
 // nex beam: drifting smoke
 effect nex_beam
-trailspacing 6
+trailspacing 12
 color 0x5080A0 0x5080A0
 size 1 1
 tex 0 8
@@ -1667,7 +1798,7 @@ velocityjitter 64 64 64
 type static
 // nex beam: bright core
 effect nex_beam
-trailspacing 6
+trailspacing 12
 color 0x80CDFF 0x80CDFF
 size 4 4
 //tex 48 55
@@ -1675,7 +1806,7 @@ alpha 256 256 1280
 type static
 //sparks
 effect nex_beam
-trailspacing 8
+trailspacing 16
 color 0x1680A0 0x1680A0
 size 1 1
 tex 63 63
@@ -1698,15 +1829,35 @@ originjitter 14 14 14
 lightradius 200
 lightradiusfade 250
 lightcolor 4 6 8
+rotate -180 180 0 0
+// rotating something
+effect nex_impact
+count 5
+type smoke
+tex 46 46
+color 0x1680A0 0x1680A0
+size 25 28
+sizeincrease 20
+alpha 55 55 50
+rotate 180 -180 500 -500
 // shockwave
 effect nex_impact
 countabsolute 1
 type static
-tex 34 34
+tex 33 33
+color 0x1680A0 0x1680A0
 size 16 16
-alpha 100 100 300
-sizeincrease 200
-
+alpha 50 50 400
+sizeincrease 900
+// shockwave2
+effect nex_impact
+countabsolute 1
+type static
+tex 65 65
+color 0x1680A0 0x1680A0
+size 5 5
+alpha 50 50 100
+sizeincrease 500
 
 // flare effect
 effect nex_impact
@@ -1729,24 +1880,37 @@ alpha 256 256 256
 //velocityjitter 384 384 384
 // small sparks which glow brightly but live briefly
 effect nex_impact
-count 128
+count 64
 type spark
 tex 41 41
 color 0xD9FDFF 0xD9FDFF
 size 4 4
 alpha 0 128 512
 bounce 2
+stretchfactor 3
 velocityjitter 600 600 600
 velocitymultiplier 0.5
 airfriction 9
-
-
+// small sparks that live longer
+effect nex_impact
+count 16
+type spark
+tex 41 41
+color 0xD9FDFF 0xD9FDFF
+size 2 2
+alpha 255 255 112
+bounce 1.6
+stretchfactor 0.7
+velocityjitter 300 300 600
+velocitymultiplier 2.5
+airfriction 2
+gravity 1
 
 // used in qcsrc/server/w_hagar.qc:    pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
 // used in qcsrc/server/w_hagar.qc:    pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
 // used in qcsrc/server/w_seeker.qc:   pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
 effect hagar_muzzleflash
-count 4
+count 2
 type smoke
 color 0x202020 0x404040
 tex 0 8
@@ -1759,22 +1923,24 @@ lightradius 200
 lightradiusfade 2000
 lightcolor 2 1.5 0.2
 effect hagar_muzzleflash
-count 30
+count 15
 type spark
-tex 40 40
-color 0xFFFDD9 0xFFFDD9
-size 3 3
+tex 48 55
+color 0xff8400 0xff4200
+size 5 10
 alpha 0 128 1024
 originjitter 1 1 1
-velocityjitter 300 300 300
+velocityjitter 200 200 200
 velocitymultiplier 0.5
 airfriction 12
+stretchfactor 2
+rotate -180 180 -400 400
 
 
 
 // used in qcsrc/server/w_hagar.qc:            pointparticles(particleeffectnum("hagar_bounce"), self.origin, self.velocity, 1)
 effect hagar_bounce
-count 4
+count 2
 type smoke
 color 0x202020 0x404040
 tex 0 8
@@ -1787,7 +1953,7 @@ lightradius 60
 lightradiusfade 300
 lightcolor 2 1.5 0.2
 effect hagar_bounce
-count 30
+count 15
 type spark
 tex 40 40
 color 0xFFFDD9 0xFFFDD9
@@ -1819,7 +1985,7 @@ lightcolor 8 4 1
 // fire effect which make bright dot inside
 effect hagar_explode
 notunderwater
-count 10
+count 5
 type smoke
 tex 48 55
 color 0xffe955 0xff5a00
@@ -1834,7 +2000,7 @@ velocityjitter 156 156 156
 // fire effect which expands then slows
 effect hagar_explode
 notunderwater
-count 24
+count 12
 type static
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -1852,7 +2018,7 @@ effect hagar_explode
 type alphastatic
 notunderwater
 tex 0 8
-count 20
+count 10
 size 20 40
 sizeincrease 20
 alpha 200 500 600
@@ -1864,7 +2030,7 @@ bounce 2
 // underwater bubbles
 effect hagar_explode
 underwater
-count 32
+count 16
 type bubble
 tex 62 62
 color 0x404040 0x808080
@@ -1878,24 +2044,25 @@ velocityjitter 96 96 96
 // bouncing sparks
 effect hagar_explode
 notunderwater
-count 16
+count 4
 type spark
-color 0x903010 0xFFD030
-size 2 2
 tex 40 40
-alpha 256 256 384
+color 0xffa35b 0xfff2be
+size 1 0.1
+alpha 644 956 684
 gravity 1
-airfriction 0.2
-bounce 1.5
+airfriction 1
+bounce 1.6
 liquidfriction 0.8
 velocityoffset 0 0 80
-velocityjitter 256 256 256
+originjitter 16 16 16
+velocityjitter 224 224 224
 
 
 
 // used in qcsrc/server/w_rocketlauncher.qc:   pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1)
 effect rocketlauncher_muzzleflash
-count 20
+count 10
 type smoke
 color 0x202020 0x404040
 tex 0 8
@@ -1910,16 +2077,18 @@ velocitymultiplier -0.13
 //lightradiusfade 2000
 //lightcolor 2 1.5 0.2
 effect rocketlauncher_muzzleflash
-count 30
-type spark
-tex 40 40
+count 6
+type smoke
+tex 35 36
 color 0xFFFDD9 0xFFFDD9
-size 3 3
-alpha 0 128 1024
-originjitter 1 1 1
-velocityjitter 300 300 300
-velocitymultiplier 0.5
-airfriction 12
+size 5 10
+sizeincrease 20
+alpha 10 25 20
+originjitter 3 3 3
+velocityjitter 100 100 100
+velocitymultiplier 0.3
+airfriction 9
+rotate -180 180 -30 30
 
 
 
@@ -1930,11 +2099,12 @@ airfriction 12
 // used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_ROCKET"), from, to)
 // used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_ROCKET"), from, to)
 effect TR_ROCKET
-trailspacing 5
-type alphastatic
+trailspacing 10
+type smoke
+notunderwater
 color 0x000000 0x666666
 tex 0 8
-size 1 4
+size 3 4
 bounce 1
 sizeincrease 11
 alpha 200 300 200
@@ -1944,11 +2114,11 @@ lightcolor 6 3 1
 originjitter 2 2 2
 velocityjitter 3 3 3
 velocitymultiplier -0.02
+rotate -180 180 -30 30
 //gravity -0.11
 // fire
 effect TR_ROCKET
-notunderwater
-trailspacing 2
+trailspacing 4
 type static
 color 0xffdf72 0x811200
 tex 48 55
@@ -1960,25 +2130,28 @@ velocityjitter 32 32 32
 velocitymultiplier -1.5
 // bubbles
 effect TR_ROCKET
-underwater
-trailspacing 8
 type bubble
+underwater
+trailspacing 16
 tex 62 62
-color 0x404040 0x808080
-size 1 1
+size 1 2
 alpha 256 256 256
 gravity -0.125
 bounce 1.5
 liquidfriction 4
 velocityjitter 16 16 16
+velocitymultiplier -0.31
+rotate 0 0 0 0
 // sparks
 effect TR_ROCKET
-trailspacing 10
+notunderwater
+trailspacing 20
 type spark
 tex 40 40
 color 0xFFFDD9 0xFFFDD9
-size 1 1
+size 0.5 0.5
 alpha 444 512 1866
+stretchfactor 0.3
 //gravity 1
 bounce 1
 //velocityoffset 0 0 15
@@ -1992,55 +2165,55 @@ effect rocket_explode
 countabsolute 1
 type decal
 tex 8 16
-size 48 48
+size 72 72
 alpha 256 256 0
-originjitter 26 26 26
-lightradius 250
-lightradiusfade 400
+originjitter 23 23 23
+lightradius 400
+lightradiusfade 750
 lightcolor 8 4 1
-// fire effect which expands then slows
+// fire effect
 effect rocket_explode
 notunderwater
-count 80
+count 32
 type static
 tex 48 55
-color 0xe03f00 0x5e0000
-size 16 26
-sizeincrease 20
-alpha 128 228 356
-bounce 4.5
+color 0x8f0d00 0xff5a00
+size 33 44
+sizeincrease 45
+alpha 200 256 512
+bounce 1.5
 airfriction 8
 liquidfriction 8
 originjitter 8 8 8
-velocityjitter 256 256 256
-// fire effect which make brigt dot inside
+velocityjitter 512 512 512
+// fire effect 2
 effect rocket_explode
 notunderwater
-count 30
-type static
+count 14
+type smoke
 tex 48 55
-color 0xe03f00 0xffdf92
-size 6 16
-sizeincrease 40
-alpha 228 328 756
-bounce 1
-airfriction 8
-liquidfriction 8
+color 0xea691b 0xeed05a
+size 33 44
+sizeincrease 55
+alpha 200 256 612
+bounce 2.5
+airfriction 19
+liquidfriction 19
 originjitter 8 8 8
-velocityjitter 256 256 256
+velocityjitter 912 912 912
 // smoke
 effect rocket_explode
 type alphastatic
 notunderwater
 tex 0 8
-count 20
+count 32
 size 20 40
-sizeincrease 34
-alpha 300 550 556
-velocityjitter 256 256 256
+sizeincrease 44
+alpha 200 450 456
+velocityjitter 444 444 444
 airfriction 5
 color 0x000000 0x111111
-bounce 6
+bounce 2
 // underwater bubbles
 effect rocket_explode
 underwater
@@ -2054,24 +2227,47 @@ gravity -0.125
 bounce 1.5
 liquidfriction 0.25
 originjitter 16 16 16
-velocityjitter 96 96 96
+velocityjitter 144 144 144
+// underwatershockwave
+effect rocket_explode
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 1900
+alpha 40 40 300
+velocitymultiplier 0.3
 // bouncing sparks
 effect rocket_explode
 notunderwater
 count 16
 type spark
-color 0x903010 0xFFD030
-size 2 2
 tex 40 40
-alpha 256 256 384
+color 0xffa35b 0xfff2be
+size 1 0.1
+alpha 644 956 484
 gravity 1
-airfriction 0.2
-bounce 1.5
+airfriction 1
+bounce 1.6
 liquidfriction 0.8
 velocityoffset 0 0 80
-velocityjitter 256 256 256
-
-
+originjitter 16 16 16
+velocityjitter 424 424 624
+// derbis
+effect rocket_explode
+notunderwater
+count 12
+type alphastatic
+tex 66 68
+color 0x6a3d25 0xcac5b4
+size 2 6
+alpha 644 956 684
+gravity 1.3
+airfriction 0.5
+bounce 1.6
+velocityjitter 324 324 524
+rotate -180 180 -1000 1000
 
 // used in qcsrc/server/g_hook.qc:     pointparticles(particleeffectnum("grapple_muzzleflash"), org, '0 0 0', 1)
 effect grapple_muzzleflash
@@ -2093,7 +2289,7 @@ lightcolor 1 0 0
 effect nex242_misc_laser_beam
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 size 1 1
 alpha 256 256 64
 color 0xff0000 0xff0000
@@ -2101,7 +2297,7 @@ sizeincrease 1
 
 // used nowhere in code
 effect nex242_misc_laser_beam_end
-count 1
+count 0.5
 type spark
 color 0x8f4333 0xfff31b
 size 0.4 0.4
@@ -2117,7 +2313,7 @@ velocitymultiplier 100
 effect nex242_misc_laser_beam_fast
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 size 1 1
 alpha 256 256 640
 color 0xff0000 0xff0000
@@ -2125,7 +2321,7 @@ sizeincrease 0.1
 
 // used nowhere in code
 effect nex242_misc_laser_beam_fast_end
-count 1
+count 0.5
 type spark
 color 0x8f4333 0xfff31b
 size 0.4 0.4
@@ -2140,7 +2336,7 @@ velocitymultiplier 100
 effect nex242_misc_laser_green_beam
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 size 1 1
 alpha 256 256 64
 color 0x00ff00 0x00ff00
@@ -2148,7 +2344,7 @@ sizeincrease 1
 
 // used nowhere in code
 effect nex242_misc_laser_green_beam_end
-count 1
+count 0.5
 type spark
 color 0x8f4333 0xfff31b
 size 0.4 0.4
@@ -2162,7 +2358,7 @@ velocitymultiplier 100
 effect nex242_misc_laser_blue_beam
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 size 1 1
 alpha 256 256 64
 color 0x0000ff 0x0000ff
@@ -2170,7 +2366,7 @@ sizeincrease 1
 
 // used nowhere in code
 effect nex242_misc_laser_blue_beam_end
-count 1
+count 0.5
 type spark
 color 0x8f4333 0xfff31b
 size 0.4 0.4
@@ -2184,7 +2380,7 @@ velocitymultiplier 100
 effect nex242_misc_laser_yellow_beam
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 size 1 1
 alpha 256 256 64
 color 0xffff00 0xffff00
@@ -2192,7 +2388,7 @@ sizeincrease 1
 
 // used nowhere in code
 effect nex242_misc_laser_yellow_beam_end
-count 1
+count 0.5
 type spark
 color 0x8f4333 0xfff31b
 size 0.4 0.4
@@ -2206,7 +2402,7 @@ velocitymultiplier 100
 effect nex242_misc_laser_cyan_beam
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 size 1 1
 alpha 256 256 64
 color 0x00ffff 0x00ffff
@@ -2214,7 +2410,7 @@ sizeincrease 1
 
 // used nowhere in code
 effect nex242_misc_laser_cyan_beam_end
-count 1
+count 0.5
 type spark
 color 0x8f4333 0xfff31b
 size 0.4 0.4
@@ -2228,7 +2424,7 @@ velocitymultiplier 100
 effect nex242_misc_laser_magenta_beam
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 size 1 1
 alpha 256 256 64
 color 0xff00ff 0xff00ff
@@ -2236,7 +2432,7 @@ sizeincrease 1
 
 // used nowhere in code
 effect nex242_misc_laser_magenta_beam_end
-count 1
+count 0.5
 type spark
 color 0x8f4333 0xfff31b
 size 0.4 0.4
@@ -2250,7 +2446,7 @@ velocitymultiplier 100
 effect nex242_misc_laser_white_beam
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 size 1 1
 alpha 256 256 64
 color 0xffffff 0xffffff
@@ -2258,7 +2454,7 @@ sizeincrease 1
 
 // used nowhere in code
 effect nex242_misc_laser_white_beam_end
-count 1
+count 0.5
 type spark
 color 0x8f4333 0xfff31b
 size 0.4 0.4
@@ -2272,7 +2468,7 @@ velocitymultiplier 100
 effect nex242_misc_laser_black_beam
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 size 1 1
 alpha 256 256 64
 color 0x000000 0x000000
@@ -2280,7 +2476,7 @@ sizeincrease 1
 
 // used nowhere in code
 effect nex242_misc_laser_black_beam_end
-count 1
+count 0.5
 type spark
 color 0x8f4333 0xfff31b
 size 0.4 0.4
@@ -2294,7 +2490,7 @@ velocitymultiplier 100
 effect nex242_misc_laser_orange_beam
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 size 1 1
 alpha 256 256 64
 color 0xff6600 0xff6600
@@ -2302,7 +2498,7 @@ sizeincrease 1
 
 // used nowhere in code
 effect nex242_misc_laser_orange_beam_end
-count 1
+count 0.5
 type spark
 color 0x8f4333 0xfff31b
 size 0.4 0.4
@@ -2338,7 +2534,7 @@ size 24 24
 alpha 256 256 512
 // purple sparks
 effect crylink_impactbig
-count 80
+count 40
 type spark
 tex 41 41
 color 0xA040C0 0xA040C0
@@ -2348,7 +2544,7 @@ alpha 256 256 1024
 velocityjitter 512 512 512
 // purple splash
 effect crylink_impactbig
-count 3
+count 1.5
 type static
 color 0xE070FF 0xE070FF
 size 16 16
@@ -2356,7 +2552,7 @@ alpha 256 256 512
 velocityjitter 32 32 32
 // purple splash
 effect crylink_impactbig
-count 6
+count 3
 type static
 color 0xE070FF 0xE070FF
 size 16 16
@@ -2369,7 +2565,7 @@ velocityjitter 256 256 256
 // used in qcsrc/client/gibs.qc:                       pointparticles(particleeffectnum("damage_hit"), org, vel, amount * 16)
 effect damage_hit
 tex 48 55
-count 1
+count 0.5
 type alphastatic
 color 0x00FFFF 0xFF00FF
 size 16 16
@@ -2382,7 +2578,7 @@ liquidfriction 10
 velocityjitter 256 256 256
 effect damage_hit
 tex 48 55
-count 1
+count 0.5
 type alphastatic
 color 0xFF00FF 0xFFFF00
 size 16 16
@@ -2395,7 +2591,7 @@ liquidfriction 10
 velocityjitter 256 256 256
 effect damage_hit
 tex 48 55
-count 1
+count 0.5
 type alphastatic
 color 0xFFFF00 0x00FFFF
 size 16 16
@@ -2414,7 +2610,7 @@ velocityjitter 256 256 256
 // used in qcsrc/client/gibs.qc:                       pointparticles(particleeffectnum("damage_dissolve"), org, vel, amount)
 effect damage_dissolve
 tex 48 55
-count 30
+count 15
 type alphastatic
 color 0x00FFFF 0xFF00FF
 size 32 32
@@ -2427,7 +2623,7 @@ liquidfriction 6
 velocityjitter 512 512 512
 effect damage_dissolve
 tex 48 55
-count 30
+count 15
 type alphastatic
 color 0xFF00FF 0xFFFF00
 size 32 32
@@ -2440,7 +2636,7 @@ liquidfriction 6
 velocityjitter 512 512 512
 effect damage_dissolve
 tex 48 55
-count 30
+count 15
 type alphastatic
 color 0xFFFF00 0x00FFFF
 size 32 32
@@ -2452,6 +2648,7 @@ airfriction 3
 liquidfriction 6
 velocityjitter 512 512 512
 
+
 // decal
 // used in qcsrc/server/g_triggers.qc:                                 self.cnt = particleeffectnum("laser_deadly")
 // used in qcsrc/server/g_triggers.qc:                 self.cnt = particleeffectnum("laser_deadly")
@@ -2464,7 +2661,7 @@ alpha 256 256 0
 originjitter 6 6 6
 // dust/smoke drifting away from the impact
 effect laser_deadly
-count 0.05 // 50 per second
+count 0.025
 type smoke
 tex 48 55
 color 0xFFFFFF 0xFFFFFF
@@ -2479,7 +2676,7 @@ velocitymultiplier 20
 // sparks
 effect laser_deadly
 notunderwater
-count 0.05 // 50 per second
+count 0.025
 type spark
 tex 40 40
 color 0xFDFFD9 0xFDFFD9
@@ -2498,7 +2695,7 @@ velocitymultiplier 100
 // used nowhere in code
 effect torch_small
 //notunderwater
-count 16
+count 8
 type smoke
 tex 48 55
 size 1 11
@@ -2512,7 +2709,7 @@ velocityjitter 1 1 50
 // smoke
 effect torch_small
 type alphastatic
-count 8
+count 4
 tex 0 8
 size 5 10
 sizeincrease 5
@@ -2526,7 +2723,7 @@ velocityjitter 11 11 50
 //fountain01
 // used nowhere in code
 effect fountain01
-count 32
+count 16
 tex 0 8
 size 10 15
 alpha 0 100 100
@@ -2543,7 +2740,7 @@ velocitymultiplier 2
 // decal
 // used in qcsrc/client/damage.qc:                             pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1)
 effect hookbomb_explode
-count 50
+count 25
 type static
 tex 38 38
 color 0x807aff 0x4463d5
@@ -2576,7 +2773,7 @@ alpha 256 256 0
 originjitter 6 6 6
 // some sparks
 effect hookbomb_explode
-count 60
+count 30
 type spark
 tex 38 38
 color 0x807aff 0x4463d5
@@ -2594,7 +2791,7 @@ airfriction 2
 // smoke
 effect EF_MGTURRETTRAIL
 notunderwater
-trailspacing 5
+trailspacing 10
 type smoke
 color 0xd0d0a0 0xffffff
 tex 0 8
@@ -2605,7 +2802,7 @@ gravity -0.01
 // bubbles
 effect EF_MGTURRETTRAIL
 underwater
-trailspacing 16
+trailspacing 32
 type bubble
 tex 62 62
 color 0x404040 0x808080
@@ -2621,7 +2818,7 @@ velocityjitter 16 16 16
 // used nowhere in code
 effect fire_big
 //notunderwater
-count 52
+count 26
 type smoke
 tex 48 55
 size 11 31
@@ -2635,7 +2832,7 @@ velocityjitter 22 22 50
 // smoke
 effect fire_big
 type alphastatic
-count 22
+count 11
 tex 0 8
 size 22 33
 sizeincrease 11
@@ -2651,7 +2848,7 @@ bounce 2
 // used nowhere in code
 effect red_flare
 type alphastatic
-count 21
+count 10.5
 tex 0 8
 size 1 11
 sizeincrease 11
@@ -2667,7 +2864,7 @@ bounce 1
 // used nowhere in code
 effect blue_flare
 type alphastatic
-count 21
+count 10.5
 tex 0 8
 size 1 11
 sizeincrease 11
@@ -2683,7 +2880,7 @@ bounce 1
 // used in qcsrc/server/ctf.qc:                pointparticles(particleeffectnum("smoke_ring"), 0.5 * (self.absmin + self.absmax), '0 0 0', 1);
 effect smoke_ring
 type smoke
-count 90
+count 45
 tex 0 8
 size 1 11
 sizeincrease 21
@@ -2701,7 +2898,7 @@ notunderwater
 // used nowhere in code
 effect smoke_large
 type alphastatic
-count 50
+count 25
 tex 0 8
 size 11 21
 sizeincrease 21
@@ -2717,7 +2914,7 @@ notunderwater
 //sparks
 // used nowhere in code
 effect sparks
-count 30
+count 15
 type spark
 tex 40 40
 color 0xFFFDD9 0xFFFDD9
@@ -2733,7 +2930,7 @@ airfriction 3
 //sparks
 // used nowhere in code
 effect electricity_sparks
-count 70
+count 35
 type spark
 tex 40 40
 color 0x807aff 0x4463d5
@@ -2750,7 +2947,7 @@ airfriction 3
 // used nowhere in code
 effect steam
 type smoke
-count 2
+count 1
 tex 0 8
 size 1 3
 sizeincrease 7
@@ -2767,7 +2964,7 @@ notunderwater
 // smoke emiter
 // used nowhere in code
 effect smoking
-count 20
+count 10
 type alphastatic
 tex 0 8
 color 0x292929 0x000000
@@ -2784,7 +2981,7 @@ airfriction -1
 //golden dust (create it once per second to cover large area in small yellow particles)
 // used nowhere in code
 effect goldendust
-count 50
+count 25
 type snow
 tex 38 38
 color 0xff9600 0xffefb8
@@ -2800,7 +2997,7 @@ velocityjitter 0.1 0.1 0.1
 
 // used nowhere in code
 effect healing_fx
-count 50
+count 25
 type spark
 tex 40 40
 color 0xff0000 0xff0000
@@ -2816,7 +3013,7 @@ airfriction -0.5
 
 // used nowhere in code
 effect armorrepair_fx
-count 50
+count 25
 type spark
 tex 40 40
 color 0x00ff00 0x00ff00
@@ -2832,7 +3029,7 @@ airfriction -0.5
 
 // used nowhere in code
 effect ammoregen_fx
-count 50
+count 25
 type spark
 tex 40 40
 color 0x0000ff 0x0000ff
@@ -2849,7 +3046,7 @@ airfriction -0.5
 // red-yellow flame like fx
 // used nowhere in code
 effect rage
-count 5
+count 2.5
 type smoke
 tex 35 36
 color 0xff0000 0xff7800
@@ -2864,7 +3061,7 @@ airfriction 2
 // pieces of glass or ice falling on the floor
 // used nowhere in code
 effect iceorglass
-count 30
+count 15
 type alphastatic
 tex 44 44
 color 0xffffff 0xb2d3e6
@@ -2881,7 +3078,7 @@ airfriction 3
 // cover small area in poison gas, spawn it once per second
 // used nowhere in code
 effect poisonfield
-count 30
+count 15
 type smoke
 tex 0 8
 color 0x00ff00 0x7db843
@@ -2897,7 +3094,7 @@ airfriction 1
 // cover small area in icy mist, spawn it once per second
 // used nowhere in code
 effect icefield
-count 20
+count 10
 type smoke
 tex 0 8
 color 0x008aff 0x75e7ff
@@ -2910,7 +3107,7 @@ originjitter 333 333 0
 velocityjitter 5 5 30
 airfriction 1
 effect icefield
-count 10
+count 5
 type smoke
 tex 48 55
 size 1 1
@@ -2925,7 +3122,7 @@ originjitter 333 333 0
 // flames that go up
 // used nowhere in code
 effect firefield
-count 200
+count 100
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -2939,7 +3136,7 @@ velocityjitter 5 5 30
 airfriction 1
 //flames that stay on the ground
 effect firefield
-count 100
+count 50
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -2949,7 +3146,7 @@ alpha 50 256 200
 originjitter 180 180 0
 // smoke
 effect firefield
-count 40
+count 20
 type alphastatic
 tex 0 8
 size 1 1
@@ -2963,7 +3160,7 @@ originjitter 180 180 0
 //fast fire
 // used nowhere in code
 effect flamethrower
-count 6
+count 3
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -2977,7 +3174,7 @@ velocitymultiplier 30
 airfriction 1.2
 //slowfire
 effect flamethrower
-count 5
+count 2.5
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -2991,7 +3188,7 @@ velocitymultiplier 20
 airfriction 1.2
 // very slow and small fire
 effect flamethrower
-count 3
+count 1.5
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -3005,7 +3202,7 @@ velocitymultiplier 10
 airfriction 0.3
 //decreasing fire
 effect flamethrower
-count 4
+count 2
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -3019,7 +3216,7 @@ velocitymultiplier 15
 airfriction 0.3
 //smoke
 effect flamethrower
-count 1
+count 0.5
 type alphastatic
 tex 0 8
 size 5 15
@@ -3037,7 +3234,7 @@ airfriction 1
 // used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_WIZSPIKE"), from, to)
 // used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_WIZSPIKE"), from, to)
 effect TR_WIZSPIKE
-trailspacing 2
+trailspacing 4
 type static
 color 0x404040 0x404040
 size 3 3
@@ -3050,8 +3247,8 @@ lightcolor 1.5 3 6
 velocitymultiplier -0.1
 // bright sparks
 effect TR_WIZSPIKE
-trailspacing 6
-count 3
+trailspacing 12
+count 1.5
 type snow
 tex 42 42
 color 0x404040 0x404040
@@ -3069,7 +3266,7 @@ velocityjitter 50 50 50
 // used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_VORESPIKE"), from, to)
 // used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_VORESPIKE"), from, to)
 effect TR_VORESPIKE
-trailspacing 2
+trailspacing 4
 type static
 color 0x804000 0x804000
 size 3 3
@@ -3082,8 +3279,8 @@ lightcolor 1.5 3 6
 velocitymultiplier -0.1
 // bright sparks
 effect TR_VORESPIKE
-trailspacing 6
-count 3
+trailspacing 12
+count 1.5
 type snow
 tex 42 42
 color 0xff8000 0xff8000
@@ -3110,7 +3307,7 @@ lightcolor 8 4 1
 // fire effect which make bright dot inside
 effect flac_explode
 notunderwater
-count 6
+count 3
 type smoke
 tex 48 55
 color 0xffe955 0xff5a00
@@ -3125,7 +3322,7 @@ velocityjitter 156 156 156
 // fire effect which expands then slows
 effect flac_explode
 notunderwater
-count 12
+count 6
 type static
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -3143,7 +3340,7 @@ effect flac_explode
 type alphastatic
 notunderwater
 tex 0 8
-count 10
+count 5
 size 10 20
 sizeincrease 20
 alpha 500 600 556
@@ -3155,7 +3352,7 @@ bounce 2
 // underwater bubbles
 effect flac_explode
 underwater
-count 16
+count 8
 type bubble
 tex 62 62
 color 0x404040 0x808080
@@ -3169,7 +3366,7 @@ velocityjitter 96 96 96
 // bouncing sparks
 effect flac_explode
 notunderwater
-count 8
+count 4
 type spark
 color 0x903010 0xFFD030
 size 2 2
@@ -3187,18 +3384,18 @@ velocityjitter 256 256 256
 // used in qcsrc/server/w_common.qc:                           zcurveparticles_from_tracetoss(particleeffectnum("tr_bullet"), self.origin, trace_endpos, self.velocity)
 // used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("tr_bullet"), from, to)
 effect tr_bullet
-trailspacing 128
+trailspacing 256
 type spark
 color 0x800000 0xFF8020
 alpha 256 256 2560
-size 3 3
-stretchfactor 0.6
+size 1.5 1.5
+stretchfactor 1
 velocitymultiplier 0.7
 
 // smoke emitter for small pipes
 // used nowhere in code
 effect smoking_smallemitter
-count 20
+count 10
 type alphastatic
 tex 0 8
 color 0x292929 0x000000
@@ -3217,7 +3414,7 @@ airfriction -1
 // used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_CRYLINKPLASMA"), from, to)
 // used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("TR_CRYLINKPLASMA"), from, to)
 effect TR_CRYLINKPLASMA
-trailspacing 64
+trailspacing 128
 type static
 color 0x5522aa 0x6622ff
 size 2 2
@@ -3231,7 +3428,7 @@ velocityjitter 8 8 8
 velocitymultiplier -0.01
 // crylink main trail
 effect TR_CRYLINKPLASMA
-trailspacing 8
+trailspacing 16
 type static
 color 0x5522aa 0x6622ff
 size 3 3
@@ -3242,7 +3439,7 @@ velocityjitter 2 2 2
 velocitymultiplier 0.01
 
 effect cherryblossom
-count 3
+count 1.5
 type static
 color 0xb123ff 0xb183ff
 size 1.5 2
@@ -3258,7 +3455,7 @@ tex 40 40
 //lighttime 0
 
 effect alien_blood
-count 0.333
+count 0.167
 type blood
 tex 24 32
 size 3 8
@@ -3282,7 +3479,7 @@ color 0x000000 0x204010
 originjitter 11 11 11
 
 effect robot_blood
-count 0.333
+count 0.167
 type blood
 tex 24 32
 size 3 8
@@ -3307,7 +3504,7 @@ originjitter 11 11 11
 
 
 effect alien_TR_BLOOD
-trailspacing 16
+trailspacing 32
 type blood
 color 0xC080B0 0xC080B0
 tex 24 32
@@ -3322,7 +3519,7 @@ staincolor 0x808080 0x808080
 staintex 16 24
 
 effect robot_TR_BLOOD
-trailspacing 16
+trailspacing 32
 type blood
 color 0xC0D890 0xC0D890
 tex 24 32
@@ -3337,7 +3534,7 @@ staincolor 0x808080 0x808080
 staintex 16 24
 
 effect alien_TR_SLIGHTBLOOD
-trailspacing 32
+trailspacing 64
 type blood
 color 0xC080B0 0xC080B0
 tex 24 32
@@ -3352,7 +3549,7 @@ staincolor 0x808080 0x808080
 staintex 16 24
 
 effect robot_TR_SLIGHTBLOOD
-trailspacing 32
+trailspacing 64
 type blood
 color 0xC0D890 0xC0D890
 tex 24 32
@@ -3376,7 +3573,7 @@ size 8 16
 alpha 128 64 64
 // cloud of particles which expand rapidly and then slow to form a ball
 effect item_pickup
-count 64
+count 32
 type spark
 tex 41 41
 color 0x63F2EA 0xB0C5C4
@@ -3436,7 +3633,7 @@ staintex 16 24
 // used in qsrc/server/ctf.qc:         pointparticles(particleeffectnum("red_ground_quake"), self.origin, '0 0 0', 1);
 effect red_ground_quake
 type smoke
-count 180
+count 90
 tex 0 8
 size 20 50
 sizeincrease 100
@@ -3451,7 +3648,7 @@ bounce 1.1
 notunderwater
 effect red_ground_quake
 type smoke
-count 80
+count 40
 tex 0 8
 size 10 30
 sizeincrease 60
@@ -3466,7 +3663,7 @@ bounce 1.2
 notunderwater
 effect red_ground_quake
 //notunderwater
-count 32
+count 16
 type smoke
 tex 48 55
 size 4 20
@@ -3481,7 +3678,7 @@ velocityjitter 22 22 50
 // smoke
 effect red_ground_quake
 type alphastatic
-count 22
+count 11
 tex 0 8
 size 22 33
 sizeincrease 11
@@ -3498,7 +3695,7 @@ bounce 2
 // used in qsrc/server/ctf.qc:         pointparticles(particleeffectnum("blue_ground_quake"), self.origin, '0 0 0', 1);
 effect blue_ground_quake
 type smoke
-count 180
+count 90
 tex 0 8
 size 20 50
 sizeincrease 100
@@ -3513,7 +3710,7 @@ bounce 1.1
 notunderwater
 effect blue_ground_quake
 type smoke
-count 80
+count 40
 tex 0 8
 size 10 30
 sizeincrease 60
@@ -3528,7 +3725,7 @@ bounce 1.2
 notunderwater
 effect blue_ground_quake
 //notunderwater
-count 32
+count 16
 type smoke
 tex 48 55
 size 4 20
@@ -3543,7 +3740,7 @@ velocityjitter 22 22 50
 // smoke
 effect blue_ground_quake
 type alphastatic
-count 22
+count 11
 tex 0 8
 size 22 33
 sizeincrease 11
@@ -3562,7 +3759,7 @@ bounce 2
 // used in qcsrc/client/gibs.qc:                       pointparticles(particleeffectnum("damage_hit"), org, vel, amount * 16)
 effect morphed_damage_hit
 tex 43 43
-count 1
+count 0.5
 type spark
 color 0xffffff 0x9271fb
 size 14 24
@@ -3575,7 +3772,7 @@ velocityjitter 356 356 456
 
 effect morphed_damage_hit
 tex 0 8
-count 1
+count 0.5
 type smoke
 color 0xffffff 0x9271fb
 size 24 24
@@ -3593,68 +3790,70 @@ originjitter 10 10 10
 // used in qcsrc/client/gibs.qc:                       pointparticles(particleeffectnum("damage_dissolve"), org, vel, amount)
 effect morphed_damage_dissolve
 tex 43 43
-count 20
-type spark
+count 10
+type smoke
 color 0xffffff 0x9271fb
-size 62 62
+size 40 40
 sizeincrease -16
-alpha 256 256 328
-gravity -0.4
-airfriction 3
+alpha 456 456 1828
+gravity -1.9
+airfriction 8
 liquidfriction 6
 velocityjitter 256 256 512
+rotate -180 180 -399 -99
 
 effect morphed_damage_dissolve
 tex 43 43
-count 5
-type spark
+count 2.5
+type smoke
 color 0x7bdbff 0xbed2ff
-size 62 62
+size 40 40
 sizeincrease -16
-alpha 256 256 328
+alpha 256 256 628
 gravity -0.8
-airfriction 5
+airfriction 9
 liquidfriction 6
 velocityjitter 256 256 512
+rotate -180 180 0 0
 
 effect morphed_damage_dissolve
-tex 0 8
-count 10
+tex 65 65
+count 5
 type smoke
 color 0xffffff 0x9271fb
 size 44 44
 sizeincrease -16
-alpha 256 256 228
+alpha 156 156 128
 airfriction 3
 liquidfriction 6
-originjitter 32 32 96
-
+originjitter 22 22 76
 
 effect morphed_damage_dissolve
 tex 46 46
-count 30
+count 15
 type smoke
 color 0xffffff 0x9271fb
 size 32 32
 sizeincrease -16
-alpha 256 256 228
+alpha 56 56 128
 gravity 1
 bounce 1.5
 airfriction 3
 liquidfriction 6
 velocityjitter 400 400 0
+rotate -180 180 999 -999
 
 // Team / hit minsta effects
 effect TE_TEI_G3RED
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 color 0xFF0000 0xFF0000
 size 4 4
 alpha 128 128 256
 // experimental
 effect TE_TEI_G3RED
-trailspacing 4
+trailspacing 8
 type static
 color 0x200000 0x400000
 size 0.3 0.3
@@ -3669,13 +3868,13 @@ type smoke
 effect TE_TEI_G3RED_HIT
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 color 0xFF0000 0xFF0000
 size 8 8
 alpha 128 128 256
 // experimental
 effect TE_TEI_G3RED_HIT
-trailspacing 10
+trailspacing 20
 type static
 color 0xFFFFFF 0xFF0011
 size 2 2
@@ -3687,7 +3886,7 @@ velocityjitter 2 2 2
 type smoke
 // rings
 effect TE_TEI_G3RED_HIT
-trailspacing 20
+trailspacing 40
 type static
 color 0xFF0000 0xFF0011
 size 10 10 
@@ -3700,13 +3899,13 @@ type smoke
 effect TE_TEI_G3BLUE
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 color 0x0000FF 0x1100FF
 size 4 4
 alpha 128 128 256
 // experimental
 effect TE_TEI_G3BLUE
-trailspacing 4
+trailspacing 8
 type static
 color 0x000020 0x000040
 size 0.3 0.3
@@ -3721,13 +3920,13 @@ type smoke
 effect TE_TEI_G3BLUE_HIT
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 color 0x0000FF 0x1100FF
 size 8 8
 alpha 128 128 256
 // experimental
 effect TE_TEI_G3BLUE_HIT
-trailspacing 10
+trailspacing 20
 type static
 color 0xFFFFFF 0x100FF
 size 2 2
@@ -3739,7 +3938,7 @@ velocityjitter 2 2 2
 type smoke
 // rings
 effect TE_TEI_G3BLUE_HIT
-trailspacing 20
+trailspacing 40
 type static
 color 0x0000FF 0x1100FF
 size 10 10 
@@ -3753,12 +3952,12 @@ type smoke
 effect TE_TEI_G3YELLOW
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 color 0xffff00 0xffff11
 size 4 4
 alpha 128 128 256
 effect TE_TEI_G3YELLOW
-trailspacing 4
+trailspacing 8
 type static
 color 0x202000 0x404000
 size 0.3 0.3
@@ -3772,12 +3971,12 @@ type smoke
 effect TE_TEI_G3YELLOW_HIT
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 color 0xffff00 0xffff11
 size 8 8
 alpha 128 128 256
 effect TE_TEI_G3YELLOW_HIT
-trailspacing 10
+trailspacing 20
 type static
 color 0xFFFFFF 0xffff10
 size 2 2
@@ -3788,7 +3987,7 @@ velocityjitter 2 2 2
 type smoke
 // rings
 effect TE_TEI_G3YELLOW_HIT
-trailspacing 20
+trailspacing 40
 type static
 color 0xffff00 0xffff11
 size 10 10 
@@ -3803,13 +4002,13 @@ type smoke
 effect TE_TEI_G3PINK
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 color 0xFF00FF 0xFF11FF
 size 4 4
 alpha 128 128 256
 // experimental
 effect TE_TEI_G3PINK
-trailspacing 4
+trailspacing 8
 type static
 color 0x200020 0x400040
 size 0.3 0.3
@@ -3824,13 +4023,13 @@ type smoke
 effect TE_TEI_G3PINK_HIT
 countabsolute 1
 type beam
-tex 60 60
+tex 200 200
 color 0xFF00FF 0xFF11FF
 size 8 8
 alpha 128 128 256
 // experimental
 effect TE_TEI_G3PINK_HIT
-trailspacing 10
+trailspacing 20
 type static
 color 0xFFFFFF 0xFF10FF
 size 2 2
@@ -3842,7 +4041,7 @@ velocityjitter 2 2 2
 type smoke
 // rings
 effect TE_TEI_G3PINK_HIT
-trailspacing 20
+trailspacing 40
 type static
 color 0xFF00FF 0xFF11FF
 size 10 10 
@@ -3861,7 +4060,7 @@ type smoke
 // core decal
 effect particlegibs_damage_hit
 type blood
-count 1
+count 0.5
 tex 0 8
 size 5 10
 color 0xA8FFFF 0xA8FFFFF
@@ -3876,7 +4075,7 @@ staintex 16 24
 // front blood
 effect particlegibs_damage_hit
 type blood
-count 0.2
+count 0.1
 tex 24 32
 size 10 20
 color 0xA8FFFF 0xA8FFFFF
@@ -3893,7 +4092,7 @@ staintex 16 24
 // back blood
 effect particlegibs_damage_hit
 type blood
-count 0.2
+count 0.1
 tex 24 32
 size 5 15
 color 0xA8FFFF 0xA8FFFFF
@@ -3917,7 +4116,7 @@ staintex 16 24
 // small core blood no decals
 effect particlegibs_damage_dissolve
 type blood
-count 64
+count 32
 tex 0 8
 size 15 20
 color 0x00ffff 0x82ffff
@@ -3932,7 +4131,7 @@ staintex 16 24
 // core decal
 effect particlegibs_damage_dissolve
 type blood
-count 24
+count 12
 tex 0 8
 size 20 40
 color 0xA8FFFF 0xA8FFFFF
@@ -3948,7 +4147,7 @@ staintex 16 24
 // front blood
 effect particlegibs_damage_dissolve
 type blood
-count 64
+count 32
 tex 24 32
 size 10 20
 color 0xA8FFFF 0xA8FFFFF
@@ -3966,7 +4165,7 @@ staintex 16 24
 // back blood
 effect particlegibs_damage_dissolve
 type blood
-count 64
+count 32
 tex 24 32
 size 5 15
 color 0xA8FFFF 0xA8FFFFF
@@ -3984,7 +4183,7 @@ staintex 16 24
 // small bits
 effect particlegibs_damage_dissolve
 type blood
-count 150
+count 75
 tex 24 32
 size 1 1
 color 0xA8FFFF 0xA8FFFFF
@@ -4001,7 +4200,7 @@ staintex 16 24
 // fire effect which expands then slows
 effect onslaught_generator_gib_explode
 notunderwater
-count 34
+count 17
 type static
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4019,7 +4218,7 @@ effect onslaught_generator_gib_explode
 type alphastatic
 notunderwater
 tex 0 8
-count 12
+count 6
 size 1 10
 sizeincrease 90
 gravity -0.3
@@ -4032,7 +4231,7 @@ bounce 2
 // underwater bubbles
 effect onslaught_generator_gib_explode
 underwater
-count 32
+count 16
 type bubble
 tex 62 62
 color 0x404040 0x808080
@@ -4047,7 +4246,7 @@ velocityjitter 96 96 96
 // fire effect which expands then slows
 effect onslaught_generator_gib_flame
 notunderwater
-count 30
+count 15
 type static
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4064,7 +4263,7 @@ effect onslaught_generator_gib_flame
 type alphastatic
 notunderwater
 tex 0 8
-count 2
+count 1
 size 10 20
 sizeincrease 30
 gravity -0.8
@@ -4077,7 +4276,7 @@ bounce 2
 // underwater bubbles
 effect onslaught_generator_gib_flame
 underwater
-count 32
+count 16
 type bubble
 tex 62 62
 color 0x404040 0x808080
@@ -4092,8 +4291,8 @@ velocityjitter 96 96 96
 
 // used nowhere in code
 effect firemine
-trailspacing 1
-count 1
+trailspacing 2
+count 0.5
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4106,8 +4305,8 @@ velocityjitter 10 10 2
 airfriction 1.2
 //slowfire
 effect firemine
-trailspacing 1
-count 1
+trailspacing 2
+count 0.5
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4120,8 +4319,8 @@ velocityjitter 10 10 10
 airfriction 1.2
 // very slow and small fire
 effect firemine
-trailspacing 2
-count 1
+trailspacing 4
+count 0.5
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4134,8 +4333,8 @@ velocityjitter 8 8 8
 airfriction 0.3
 //decreasing fire
 effect firemine
-trailspacing 2
-count 1
+trailspacing 4
+count 0.5
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4148,8 +4347,8 @@ velocityjitter 3 3 3
 airfriction 0.3
 //smoke
 effect firemine
-trailspacing 4
-count 1
+trailspacing 8
+count 0.5
 type alphastatic
 tex 0 8
 size 1 4
@@ -4162,8 +4361,8 @@ velocityoffset 0 0 3
 airfriction 1
 //fastfire
 effect firemine
-trailspacing 0.5
-count 1
+trailspacing 1
+count 0.5
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4176,15 +4375,15 @@ velocityjitter 0 0 0
 airfriction 1.2
 // light only
 effect firemine
-trailspacing 8
+trailspacing 16
 lightradius 50
 lightradiusfade 50000
 lightcolor 2.7 2.7 0.6
 
 // used nowhere in code
 effect fireball
-trailspacing 1
-count 1
+trailspacing 2
+count 0.5
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4197,8 +4396,8 @@ velocityjitter 40 40 11
 airfriction 1.2
 //slowfire
 effect fireball
-trailspacing 1
-count 1
+trailspacing 2
+count 0.5
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4211,8 +4410,8 @@ velocityjitter 40 40 40
 airfriction 1.2
 // very slow and small fire
 effect fireball
-trailspacing 2
-count 1
+trailspacing 4
+count 0.5
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4225,8 +4424,8 @@ velocityjitter 30 30 30
 airfriction 0.3
 //decreasing fire
 effect fireball
-trailspacing 2
-count 1
+trailspacing 4
+count 0.5
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4239,8 +4438,8 @@ velocityjitter 10 10 10
 airfriction 0.3
 //smoke
 effect fireball
-trailspacing 4
-count 1
+trailspacing 8
+count 0.5
 type alphastatic
 tex 0 8
 size 5 15
@@ -4253,8 +4452,8 @@ velocityoffset 0 0 10
 airfriction 1
 //fastfire
 effect fireball
-trailspacing 0.5
-count 1
+trailspacing 1
+count 0.5
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4267,14 +4466,14 @@ velocityjitter 0 0 0
 airfriction 1.2
 // light only
 effect fireball
-trailspacing 8
+trailspacing 16
 lightradius 300
 lightradiusfade 3000
 lightcolor 2.7 2.7 0.6
 
 // fireball
 effect fireball_laser
-count 20
+count 10
 type spark
 color 0x800000 0xFF8020
 alpha 192 256 2560
@@ -4307,7 +4506,7 @@ alpha 192 192 64
 // fire effect
 effect fireball_explode
 notunderwater
-count 256
+count 128
 type static
 tex 48 55
 color 0x902010 0xFFD080
@@ -4321,7 +4520,7 @@ velocityjitter 512 512 512
 // underwater bubbles
 effect fireball_explode
 underwater
-count 64
+count 32
 type bubble
 tex 62 62
 color 0x404040 0x808080
@@ -4335,7 +4534,7 @@ velocityjitter 144 144 144
 // bouncing sparks
 effect fireball_explode
 notunderwater
-count 128
+count 64
 type spark
 color 0x903010 0xFFD030
 size 2 2
@@ -4348,7 +4547,7 @@ velocityoffset 0 0 80
 velocityjitter 384 384 384
 
 effect fireball_muzzleflash
-count 4
+count 2
 type smoke
 color 0x202020 0x404040
 tex 0 8
@@ -4361,7 +4560,7 @@ lightradius 200
 lightradiusfade 2000
 lightcolor 2 1.5 0.2
 effect fireball_muzzleflash
-count 30
+count 15
 type spark
 tex 40 40
 color 0xFFFDD9 0xFFFDD9
@@ -4373,7 +4572,7 @@ velocitymultiplier 0.5
 airfriction 12
 
 effect fireball_preattack_muzzleflash
-count 4
+count 2
 type smoke
 color 0x202020 0x404040
 tex 0 8
@@ -4386,7 +4585,7 @@ lightradius 200
 lightradiusfade 2000
 lightcolor 2 1.5 0.2
 effect fireball_preattack_muzzleflash
-count 30
+count 15
 type spark
 tex 40 40
 color 0xFFFDD9 0xFFFDD9
@@ -4398,7 +4597,7 @@ velocitymultiplier 0.5
 airfriction 12
 
 effect fireball_bfgdamage
-count 4
+count 2
 type smoke
 color 0x202020 0x404040
 tex 0 8
@@ -4411,7 +4610,7 @@ lightradius 200
 lightradiusfade 2000
 lightcolor 2 1.5 0.2
 effect fireball_bfgdamage
-count 30
+count 15
 type spark
 tex 40 40
 color 0xFFFDD9 0xFFFDD9
@@ -4427,7 +4626,7 @@ airfriction 12
 // used nowhere in code
 effect EF_FLAME
 //notunderwater
-count 200
+count 100
 type smoke
 tex 48 55
 size 5 21
@@ -4442,7 +4641,7 @@ velocityjitter 22 22 50
 // smoke
 effect EF_FLAME
 type alphastatic
-count 100
+count 50
 tex 0 8
 size 11 15
 sizeincrease 6
@@ -4454,7 +4653,7 @@ originjitter 12 12 34
 velocityjitter 11 11 50
 bounce 2
 effect EF_FLAME
-count 1
+count 0.5
 lightradius 200
 lightradiusfade 10000
 lightcolor 0.9 0.9 0.2
@@ -4463,17 +4662,17 @@ lightcolor 0.9 0.9 0.2
 // used in qcsrc/server/w_common.qc:                           zcurveparticles_from_tracetoss(particleeffectnum("tr_bullet"), self.origin, trace_endpos, self.velocity)
 // used in qcsrc/client/projectile.qc:                 trailparticles(self, particleeffectnum("tr_bullet"), from, to)
 effect tr_rifle
-trailspacing 128
+trailspacing 256
 type spark
 color 0x800000 0xFF8020
 alpha 256 256 2560
-size 3 3
-stretchfactor 0.6
+size 1.5 1.5
+stretchfactor 1
 velocitymultiplier 0.7
 effect tr_rifle
 notunderwater
 tex 0 8
-trailspacing 8
+trailspacing 16
 type static
 color 0x202020 0x404040
 size 2 2
@@ -4484,7 +4683,7 @@ velocityjitter 4 4 4
 type smoke
 effect tr_rifle
 underwater
-trailspacing 32
+trailspacing 64
 type bubble
 tex 62 62
 color 0x404040 0x808080
@@ -4498,24 +4697,10 @@ velocityjitter 16 16 16
 
 
 // rocket guiding start
-// smoke
-effect rocket_guide
-type alphastatic
-notunderwater
-tex 0 8
-count 5
-size 10 20
-sizeincrease 17
-alpha 300 550 556
-velocityjitter 128 128 128
-airfriction 5
-color 0x000000 0x111111
-bounce 6
-velocitymultiplier -0.1
 // underwater bubbles
 effect rocket_guide
 underwater
-count 4
+count 2
 type bubble
 tex 62 62
 color 0x404040 0x808080
@@ -4530,19 +4715,28 @@ velocitymultiplier -0.1
 // bouncing sparks
 effect rocket_guide
 notunderwater
-count 16
+count 8
 type spark
 color 0x903010 0xFFD030
-size 2 2
+size 0.3 0.7
 tex 40 40
-alpha 256 256 384
+alpha 256 256 984
 gravity 1
 airfriction 0.2
 bounce 1.5
 liquidfriction 0.8
 velocityoffset 0 0 80
-velocityjitter 256 256 256
-velocitymultiplier -0.1
+velocityjitter 156 156 156
+velocitymultiplier -0.3
+stretchfactor 0.4
+effect rocket_guide
+countabsolute 1
+type smoke
+tex 65 65
+color 0x903010 0xFFD030
+size 10 10
+sizeincrease 300
+alpha 100 100 500
 
 
 // gauntlet laser
@@ -4550,7 +4744,7 @@ velocitymultiplier -0.1
 // used in qcsrc/server/w_laser.qc
 effect laser_gauntlet
 tex 43 43
-count 3
+count 1.5
 type spark
 color 0xff00ff 0xff0000
 size 4 8
@@ -4566,7 +4760,7 @@ velocityjitter 50 50 50
 //fast fire
 // used nowhere in code, meant for maps
 effect torchflame
-count 6
+count 3
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4579,7 +4773,7 @@ velocitymultiplier 30
 airfriction 1.2
 //slowfire
 effect torchflame
-count 5
+count 2.5
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4592,7 +4786,7 @@ velocitymultiplier 20
 airfriction 1.2
 // very slow and small fire
 effect torchflame
-count 3
+count 1.5
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4605,7 +4799,7 @@ velocitymultiplier 10
 airfriction 0.3
 //decreasing fire
 effect torchflame
-count 4
+count 2
 type smoke
 tex 48 55
 color 0x8f0d00 0xff5a00
@@ -4618,7 +4812,7 @@ velocitymultiplier 15
 airfriction 0.3
 //smoke
 effect torchflame
-count 1
+count 0.5
 type alphastatic
 tex 0 8
 size 5 15
@@ -4630,3 +4824,86 @@ originjitter 10 10 10
 velocitymultiplier 20
 velocityoffset 0 0 10
 airfriction 1
+
+//happy death fx for cl_gentle
+effect happy_damage_dissolve
+tex 69 69
+count 15
+type alphastatic
+color 0x00FFFF 0xFF00FF
+size 32 32
+sizeincrease -10
+alpha 256 256 228
+gravity -0.4
+bounce 1.5
+airfriction 3
+liquidfriction 6
+velocityjitter 312 312 312
+effect happy_damage_dissolve
+tex 69 69
+count 15
+type alphastatic
+color 0xFF00FF 0xFFFF00
+size 32 32
+sizeincrease -10
+alpha 256 256 228
+gravity -0.4
+bounce 1.5
+airfriction 3
+liquidfriction 6
+velocityjitter 312 312 312
+effect happy_damage_dissolve
+tex 69 69
+count 15
+type alphastatic
+color 0xFFFF00 0x00FFFF
+size 32 32
+sizeincrease -10
+alpha 256 256 228
+gravity -0.4
+bounce 1.5
+airfriction 3
+liquidfriction 6
+velocityjitter 312 312 312
+
+
+//happy damage fx for cl_gentle
+effect happy_damage_hit
+tex 69 69
+count 0.1
+type alphastatic
+color 0x00FFFF 0xFF00FF
+size 26 26
+sizeincrease -28
+alpha 128 128 192
+gravity -0.4
+bounce 1.5
+airfriction 5
+liquidfriction 10
+velocityjitter 156 156 156
+effect happy_damage_hit
+tex 69 69
+count 0.1
+type alphastatic
+color 0xFF00FF 0xFFFF00
+size 26 26
+sizeincrease -28
+alpha 128 128 192
+gravity -0.4
+bounce 1.5
+airfriction 5
+liquidfriction 10
+velocityjitter 156 156 156
+effect happy_damage_hit
+tex 69 69
+count 0.1
+type alphastatic
+color 0xFFFF00 0x00FFFF
+size 26 26
+sizeincrease -28
+alpha 128 128 192
+gravity -0.4
+bounce 1.5
+airfriction 5
+liquidfriction 10
+velocityjitter 156 156 156
index ea74e6054002d4d308dd27ac6b1a56501f076d95..676e958dfd0595b8e6a39b70b45e8f03071373ae 100644 (file)
@@ -1,6 +1,6 @@
 cl_decals 1
 cl_decals_time 4
-cl_particles_quality 0.75
+cl_particles_quality 1
 gl_flashblend 0
 gl_picmip 1
 gl_texture_anisotropy 16
index c75e3831fa4095cbf73a31c1d332a0932a06e487..82da91797be410e7a70e96c60f88e66f598afd89 100644 (file)
@@ -1,6 +1,6 @@
 cl_decals 1
 cl_decals_time 2
-cl_particles_quality 0.2
+cl_particles_quality 0.4
 gl_flashblend 1
 gl_picmip 2
 gl_texture_anisotropy 1
index 6b8b28af23e9fe13e8048ae69c9b9d15366b564d..9b2a8b38da68239186fc7f80087c047e666a6e5a 100644 (file)
@@ -1,6 +1,6 @@
 cl_decals 1
 cl_decals_time 2
-cl_particles_quality 0.5
+cl_particles_quality 1
 gl_flashblend 0
 gl_picmip 1
 gl_texture_anisotropy 1
index fe6ebdab599a3e757e291c1bf6d531047a7fddfb..7c49b57c620d713749d3220b7d22d4b022967f89 100644 (file)
@@ -1,6 +1,6 @@
 cl_decals 1
 cl_decals_time 2
-cl_particles_quality 0.5
+cl_particles_quality 1
 gl_flashblend 0
 gl_picmip 1
 gl_texture_anisotropy 1
index b5832135e8b04f94a0db7f3d91456f8f4b49b491..8bae286c34f91a56580f15e90ee23febf6472df6 100644 (file)
@@ -1,6 +1,6 @@
 cl_decals 0
 cl_decals_time 2
-cl_particles_quality 0.2
+cl_particles_quality 0.4
 gl_flashblend 1
 gl_picmip 1337
 gl_texture_anisotropy 1
index cfce0c470bb6c6a53bc4467f54cf6193fa8b1dc6..123600875ac7ab55c041f99a5be68a93192ee926 100644 (file)
@@ -14,7 +14,7 @@ r_drawparticles_drawdistance 2000
 r_glsl_deluxemapping 1
 r_glsl_offsetmapping 1
 r_glsl_offsetmapping_reliefmapping 1
-r_hdr 1
+r_hdr 2
 r_motionblur 0.5
 r_picmipworld 0
 r_shadow_gloss 1
diff --git a/font-dejavu.pk3dir/font-dejavu.cfg b/font-dejavu.pk3dir/font-dejavu.cfg
deleted file mode 100644 (file)
index 4b3200f..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-// must be loaded AFTER config.cfg
-utf8_enable 1
-r_font_disable_freetype 0
-r_font_size_snapping 2
-loadfont console fonts/DejaVuSansMono,gfx/conchars $con_textsize
-loadfont notify fonts/DejaVuSans-Bold,gfx/vera-sans $con_notifysize
-loadfont chat fonts/DejaVuSans-Bold,gfx/vera-sans $con_chatsize
-loadfont centerprint fonts/DejaVuSansMono,gfx/conchars 9
-loadfont infobar fonts/DejaVuSansMono,gfx/conchars 8
-loadfont user0 fonts/DejaVuSans-Bold,gfx/vera-sans 9.6 12 12.8 16
-loadfont user1 fonts/DejaVuSans-Bold,gfx/vera-sans 8 10 14 $sbar_fontsize $scr_centersize // csqc font
-loadfont user2 fonts/DejaVuSans-Bold,gfx/vera-sans 16 24 32 // csqc bigfont
-sbar_columns_set
diff --git a/font-dejavu.pk3dir/fonts/DejaVuSans-Bold.ttf b/font-dejavu.pk3dir/fonts/DejaVuSans-Bold.ttf
deleted file mode 100644 (file)
index b8f6c3e..0000000
Binary files a/font-dejavu.pk3dir/fonts/DejaVuSans-Bold.ttf and /dev/null differ
diff --git a/font-dejavu.pk3dir/fonts/DejaVuSansMono.ttf b/font-dejavu.pk3dir/fonts/DejaVuSansMono.ttf
deleted file mode 100644 (file)
index af80fb7..0000000
Binary files a/font-dejavu.pk3dir/fonts/DejaVuSansMono.ttf and /dev/null differ
diff --git a/gfx/brand.tga b/gfx/brand.tga
deleted file mode 100644 (file)
index d2e88c2..0000000
Binary files a/gfx/brand.tga and /dev/null differ
diff --git a/gfx/crosshairseeker.tga b/gfx/crosshairseeker.tga
new file mode 100644 (file)
index 0000000..7311550
Binary files /dev/null and b/gfx/crosshairseeker.tga differ
index ba59acaf143a73b01261307cc95c6051313054d3..0a8cf7ed023f1c5ae882d69cd178e6dfb158f081 100644 (file)
Binary files a/gfx/hud/inv_weapon13.tga and b/gfx/hud/inv_weapon13.tga differ
diff --git a/gfx/hud/inv_weaponseeker.tga b/gfx/hud/inv_weaponseeker.tga
new file mode 100644 (file)
index 0000000..0a8cf7e
Binary files /dev/null and b/gfx/hud/inv_weaponseeker.tga differ
diff --git a/gfx/menu/wickedx/background.tga b/gfx/menu/wickedx/background.tga
new file mode 100644 (file)
index 0000000..d785d64
Binary files /dev/null and b/gfx/menu/wickedx/background.tga differ
diff --git a/gfx/menu/wickedx/background_ingame.tga b/gfx/menu/wickedx/background_ingame.tga
new file mode 100644 (file)
index 0000000..2532d17
Binary files /dev/null and b/gfx/menu/wickedx/background_ingame.tga differ
diff --git a/gfx/menu/wickedx/background_l2.tga b/gfx/menu/wickedx/background_l2.tga
new file mode 100644 (file)
index 0000000..2532d17
Binary files /dev/null and b/gfx/menu/wickedx/background_l2.tga differ
diff --git a/gfx/menu/wickedx/bigbutton_c.tga b/gfx/menu/wickedx/bigbutton_c.tga
new file mode 100644 (file)
index 0000000..a8bf8ad
Binary files /dev/null and b/gfx/menu/wickedx/bigbutton_c.tga differ
diff --git a/gfx/menu/wickedx/bigbutton_d.tga b/gfx/menu/wickedx/bigbutton_d.tga
new file mode 100644 (file)
index 0000000..f6a832b
Binary files /dev/null and b/gfx/menu/wickedx/bigbutton_d.tga differ
diff --git a/gfx/menu/wickedx/bigbutton_f.tga b/gfx/menu/wickedx/bigbutton_f.tga
new file mode 100644 (file)
index 0000000..c4cda96
Binary files /dev/null and b/gfx/menu/wickedx/bigbutton_f.tga differ
diff --git a/gfx/menu/wickedx/bigbutton_n.tga b/gfx/menu/wickedx/bigbutton_n.tga
new file mode 100644 (file)
index 0000000..d54d5d5
Binary files /dev/null and b/gfx/menu/wickedx/bigbutton_n.tga differ
diff --git a/gfx/menu/wickedx/bigbuttongray_c.tga b/gfx/menu/wickedx/bigbuttongray_c.tga
new file mode 100644 (file)
index 0000000..38e9653
Binary files /dev/null and b/gfx/menu/wickedx/bigbuttongray_c.tga differ
diff --git a/gfx/menu/wickedx/bigbuttongray_d.tga b/gfx/menu/wickedx/bigbuttongray_d.tga
new file mode 100644 (file)
index 0000000..959ef93
Binary files /dev/null and b/gfx/menu/wickedx/bigbuttongray_d.tga differ
diff --git a/gfx/menu/wickedx/bigbuttongray_f.tga b/gfx/menu/wickedx/bigbuttongray_f.tga
new file mode 100644 (file)
index 0000000..55ff591
Binary files /dev/null and b/gfx/menu/wickedx/bigbuttongray_f.tga differ
diff --git a/gfx/menu/wickedx/bigbuttongray_n.tga b/gfx/menu/wickedx/bigbuttongray_n.tga
new file mode 100644 (file)
index 0000000..edff6d6
Binary files /dev/null and b/gfx/menu/wickedx/bigbuttongray_n.tga differ
diff --git a/gfx/menu/wickedx/border.tga b/gfx/menu/wickedx/border.tga
new file mode 100644 (file)
index 0000000..d435e60
Binary files /dev/null and b/gfx/menu/wickedx/border.tga differ
diff --git a/gfx/menu/wickedx/button_c.tga b/gfx/menu/wickedx/button_c.tga
new file mode 100644 (file)
index 0000000..745ee7c
Binary files /dev/null and b/gfx/menu/wickedx/button_c.tga differ
diff --git a/gfx/menu/wickedx/button_d.tga b/gfx/menu/wickedx/button_d.tga
new file mode 100644 (file)
index 0000000..6639525
Binary files /dev/null and b/gfx/menu/wickedx/button_d.tga differ
diff --git a/gfx/menu/wickedx/button_f.tga b/gfx/menu/wickedx/button_f.tga
new file mode 100644 (file)
index 0000000..817d849
Binary files /dev/null and b/gfx/menu/wickedx/button_f.tga differ
diff --git a/gfx/menu/wickedx/button_n.tga b/gfx/menu/wickedx/button_n.tga
new file mode 100644 (file)
index 0000000..643360e
Binary files /dev/null and b/gfx/menu/wickedx/button_n.tga differ
diff --git a/gfx/menu/wickedx/buttongray_c.tga b/gfx/menu/wickedx/buttongray_c.tga
new file mode 100644 (file)
index 0000000..032ea91
Binary files /dev/null and b/gfx/menu/wickedx/buttongray_c.tga differ
diff --git a/gfx/menu/wickedx/buttongray_d.tga b/gfx/menu/wickedx/buttongray_d.tga
new file mode 100644 (file)
index 0000000..55f1e62
Binary files /dev/null and b/gfx/menu/wickedx/buttongray_d.tga differ
diff --git a/gfx/menu/wickedx/buttongray_f.tga b/gfx/menu/wickedx/buttongray_f.tga
new file mode 100644 (file)
index 0000000..5ed3a7d
Binary files /dev/null and b/gfx/menu/wickedx/buttongray_f.tga differ
diff --git a/gfx/menu/wickedx/buttongray_n.tga b/gfx/menu/wickedx/buttongray_n.tga
new file mode 100644 (file)
index 0000000..6ba22b5
Binary files /dev/null and b/gfx/menu/wickedx/buttongray_n.tga differ
diff --git a/gfx/menu/wickedx/charmap.tga b/gfx/menu/wickedx/charmap.tga
new file mode 100755 (executable)
index 0000000..d8ed1d5
Binary files /dev/null and b/gfx/menu/wickedx/charmap.tga differ
diff --git a/gfx/menu/wickedx/charmapbutton.tga b/gfx/menu/wickedx/charmapbutton.tga
new file mode 100644 (file)
index 0000000..54fe07e
Binary files /dev/null and b/gfx/menu/wickedx/charmapbutton.tga differ
diff --git a/gfx/menu/wickedx/checkbox_c0.tga b/gfx/menu/wickedx/checkbox_c0.tga
new file mode 100644 (file)
index 0000000..aafd089
Binary files /dev/null and b/gfx/menu/wickedx/checkbox_c0.tga differ
diff --git a/gfx/menu/wickedx/checkbox_c1.tga b/gfx/menu/wickedx/checkbox_c1.tga
new file mode 100644 (file)
index 0000000..4e517e2
Binary files /dev/null and b/gfx/menu/wickedx/checkbox_c1.tga differ
diff --git a/gfx/menu/wickedx/checkbox_d0.tga b/gfx/menu/wickedx/checkbox_d0.tga
new file mode 100644 (file)
index 0000000..40efe7a
Binary files /dev/null and b/gfx/menu/wickedx/checkbox_d0.tga differ
diff --git a/gfx/menu/wickedx/checkbox_d1.tga b/gfx/menu/wickedx/checkbox_d1.tga
new file mode 100644 (file)
index 0000000..bba6824
Binary files /dev/null and b/gfx/menu/wickedx/checkbox_d1.tga differ
diff --git a/gfx/menu/wickedx/checkbox_f0.tga b/gfx/menu/wickedx/checkbox_f0.tga
new file mode 100644 (file)
index 0000000..aafd089
Binary files /dev/null and b/gfx/menu/wickedx/checkbox_f0.tga differ
diff --git a/gfx/menu/wickedx/checkbox_f1.tga b/gfx/menu/wickedx/checkbox_f1.tga
new file mode 100644 (file)
index 0000000..4e517e2
Binary files /dev/null and b/gfx/menu/wickedx/checkbox_f1.tga differ
diff --git a/gfx/menu/wickedx/checkbox_n0.tga b/gfx/menu/wickedx/checkbox_n0.tga
new file mode 100644 (file)
index 0000000..aafd089
Binary files /dev/null and b/gfx/menu/wickedx/checkbox_n0.tga differ
diff --git a/gfx/menu/wickedx/checkbox_n1.tga b/gfx/menu/wickedx/checkbox_n1.tga
new file mode 100644 (file)
index 0000000..4e517e2
Binary files /dev/null and b/gfx/menu/wickedx/checkbox_n1.tga differ
diff --git a/gfx/menu/wickedx/checkmark.tga b/gfx/menu/wickedx/checkmark.tga
new file mode 100644 (file)
index 0000000..cf34dde
Binary files /dev/null and b/gfx/menu/wickedx/checkmark.tga differ
diff --git a/gfx/menu/wickedx/closebutton_c.tga b/gfx/menu/wickedx/closebutton_c.tga
new file mode 100644 (file)
index 0000000..56488ec
Binary files /dev/null and b/gfx/menu/wickedx/closebutton_c.tga differ
diff --git a/gfx/menu/wickedx/closebutton_f.tga b/gfx/menu/wickedx/closebutton_f.tga
new file mode 100644 (file)
index 0000000..7338573
Binary files /dev/null and b/gfx/menu/wickedx/closebutton_f.tga differ
diff --git a/gfx/menu/wickedx/closebutton_n.tga b/gfx/menu/wickedx/closebutton_n.tga
new file mode 100644 (file)
index 0000000..e4b6058
Binary files /dev/null and b/gfx/menu/wickedx/closebutton_n.tga differ
diff --git a/gfx/menu/wickedx/color.tga b/gfx/menu/wickedx/color.tga
new file mode 100755 (executable)
index 0000000..5189ab4
Binary files /dev/null and b/gfx/menu/wickedx/color.tga differ
diff --git a/gfx/menu/wickedx/colorbutton_c.tga b/gfx/menu/wickedx/colorbutton_c.tga
new file mode 100644 (file)
index 0000000..1c294f7
Binary files /dev/null and b/gfx/menu/wickedx/colorbutton_c.tga differ
diff --git a/gfx/menu/wickedx/colorbutton_f.tga b/gfx/menu/wickedx/colorbutton_f.tga
new file mode 100644 (file)
index 0000000..0031c35
Binary files /dev/null and b/gfx/menu/wickedx/colorbutton_f.tga differ
diff --git a/gfx/menu/wickedx/colorbutton_n.tga b/gfx/menu/wickedx/colorbutton_n.tga
new file mode 100755 (executable)
index 0000000..7fec859
Binary files /dev/null and b/gfx/menu/wickedx/colorbutton_n.tga differ
diff --git a/gfx/menu/wickedx/colorpicker.tga b/gfx/menu/wickedx/colorpicker.tga
new file mode 100755 (executable)
index 0000000..6f9845b
Binary files /dev/null and b/gfx/menu/wickedx/colorpicker.tga differ
diff --git a/gfx/menu/wickedx/colorpicker_m.tga b/gfx/menu/wickedx/colorpicker_m.tga
new file mode 100755 (executable)
index 0000000..6775942
Binary files /dev/null and b/gfx/menu/wickedx/colorpicker_m.tga differ
diff --git a/gfx/menu/wickedx/crosshairbutton_c.tga b/gfx/menu/wickedx/crosshairbutton_c.tga
new file mode 100644 (file)
index 0000000..1c294f7
Binary files /dev/null and b/gfx/menu/wickedx/crosshairbutton_c.tga differ
diff --git a/gfx/menu/wickedx/crosshairbutton_d.tga b/gfx/menu/wickedx/crosshairbutton_d.tga
new file mode 100755 (executable)
index 0000000..110faa1
Binary files /dev/null and b/gfx/menu/wickedx/crosshairbutton_d.tga differ
diff --git a/gfx/menu/wickedx/crosshairbutton_f.tga b/gfx/menu/wickedx/crosshairbutton_f.tga
new file mode 100644 (file)
index 0000000..0031c35
Binary files /dev/null and b/gfx/menu/wickedx/crosshairbutton_f.tga differ
diff --git a/gfx/menu/wickedx/crosshairbutton_n.tga b/gfx/menu/wickedx/crosshairbutton_n.tga
new file mode 100755 (executable)
index 0000000..ac94535
Binary files /dev/null and b/gfx/menu/wickedx/crosshairbutton_n.tga differ
diff --git a/gfx/menu/wickedx/cursor.tga b/gfx/menu/wickedx/cursor.tga
new file mode 100644 (file)
index 0000000..0a2e295
Binary files /dev/null and b/gfx/menu/wickedx/cursor.tga differ
diff --git a/gfx/menu/wickedx/inputbox_f.tga b/gfx/menu/wickedx/inputbox_f.tga
new file mode 100644 (file)
index 0000000..6b5bd20
Binary files /dev/null and b/gfx/menu/wickedx/inputbox_f.tga differ
diff --git a/gfx/menu/wickedx/inputbox_n.tga b/gfx/menu/wickedx/inputbox_n.tga
new file mode 100644 (file)
index 0000000..ad169c2
Binary files /dev/null and b/gfx/menu/wickedx/inputbox_n.tga differ
diff --git a/gfx/menu/wickedx/radiobutton_c0.tga b/gfx/menu/wickedx/radiobutton_c0.tga
new file mode 100644 (file)
index 0000000..68ed15e
Binary files /dev/null and b/gfx/menu/wickedx/radiobutton_c0.tga differ
diff --git a/gfx/menu/wickedx/radiobutton_c1.tga b/gfx/menu/wickedx/radiobutton_c1.tga
new file mode 100644 (file)
index 0000000..68ed15e
Binary files /dev/null and b/gfx/menu/wickedx/radiobutton_c1.tga differ
diff --git a/gfx/menu/wickedx/radiobutton_d0.tga b/gfx/menu/wickedx/radiobutton_d0.tga
new file mode 100644 (file)
index 0000000..f935318
Binary files /dev/null and b/gfx/menu/wickedx/radiobutton_d0.tga differ
diff --git a/gfx/menu/wickedx/radiobutton_d1.tga b/gfx/menu/wickedx/radiobutton_d1.tga
new file mode 100644 (file)
index 0000000..1bcc41d
Binary files /dev/null and b/gfx/menu/wickedx/radiobutton_d1.tga differ
diff --git a/gfx/menu/wickedx/radiobutton_f0.tga b/gfx/menu/wickedx/radiobutton_f0.tga
new file mode 100644 (file)
index 0000000..237e09b
Binary files /dev/null and b/gfx/menu/wickedx/radiobutton_f0.tga differ
diff --git a/gfx/menu/wickedx/radiobutton_f1.tga b/gfx/menu/wickedx/radiobutton_f1.tga
new file mode 100644 (file)
index 0000000..68ed15e
Binary files /dev/null and b/gfx/menu/wickedx/radiobutton_f1.tga differ
diff --git a/gfx/menu/wickedx/radiobutton_n0.tga b/gfx/menu/wickedx/radiobutton_n0.tga
new file mode 100644 (file)
index 0000000..55dae24
Binary files /dev/null and b/gfx/menu/wickedx/radiobutton_n0.tga differ
diff --git a/gfx/menu/wickedx/radiobutton_n1.tga b/gfx/menu/wickedx/radiobutton_n1.tga
new file mode 100644 (file)
index 0000000..68ed15e
Binary files /dev/null and b/gfx/menu/wickedx/radiobutton_n1.tga differ
diff --git a/gfx/menu/wickedx/scrollbar_c.tga b/gfx/menu/wickedx/scrollbar_c.tga
new file mode 100644 (file)
index 0000000..eb4326d
Binary files /dev/null and b/gfx/menu/wickedx/scrollbar_c.tga differ
diff --git a/gfx/menu/wickedx/scrollbar_f.tga b/gfx/menu/wickedx/scrollbar_f.tga
new file mode 100644 (file)
index 0000000..eb4326d
Binary files /dev/null and b/gfx/menu/wickedx/scrollbar_f.tga differ
diff --git a/gfx/menu/wickedx/scrollbar_n.tga b/gfx/menu/wickedx/scrollbar_n.tga
new file mode 100644 (file)
index 0000000..eb4326d
Binary files /dev/null and b/gfx/menu/wickedx/scrollbar_n.tga differ
diff --git a/gfx/menu/wickedx/scrollbar_s.tga b/gfx/menu/wickedx/scrollbar_s.tga
new file mode 100644 (file)
index 0000000..c7d4700
Binary files /dev/null and b/gfx/menu/wickedx/scrollbar_s.tga differ
diff --git a/gfx/menu/wickedx/skinpreview.jpg b/gfx/menu/wickedx/skinpreview.jpg
new file mode 100755 (executable)
index 0000000..9b8e393
Binary files /dev/null and b/gfx/menu/wickedx/skinpreview.jpg differ
diff --git a/gfx/menu/wickedx/skinvalues.txt b/gfx/menu/wickedx/skinvalues.txt
new file mode 100755 (executable)
index 0000000..f91a8f2
--- /dev/null
@@ -0,0 +1,224 @@
+title WickedX
+author sev
+
+// Colors: 'Red Green Blue'
+// Suffixes: Clicked (_c), Disabled (_d), Focused (_f), Normal (_n)
+
+// Background layer scaling:
+//   Crop (c), Letterbox (l), Height (h), Width (w), Stretch (s)
+// Background layer positioning:
+//   Top Left (7), Top Center (8) Top Right (9)
+//   Middle Left (4), Middle Center (5) Middle Right (6)
+//   Bottom Left (1), Bottom Center (2) Bottom Right (3)
+// ALIGN_BACKGROUND(_INGAME) spspsp, s=Scale p=Position
+
+//------------------------------------------------------------------------------
+// Structure (e.g. positions, sizes, margins)
+//------------------------------------------------------------------------------
+// item: color picker
+//   uses "colorpicker" images
+MARGIN_COLORPICKER              '0 0 0'
+
+// item: dialog
+//   uses "border" images
+//   uses "closebutton" images
+MARGIN_TOP                      8
+MARGIN_BOTTOM                   8
+MARGIN_LEFT                     8
+MARGIN_RIGHT                    8
+MARGIN_COLUMNS                  4
+MARGIN_ROWS                     4
+HEIGHT_DIALOGBORDER             1
+
+// font sizes (used for everything)
+FONTSIZE_NORMAL                 12
+HEIGHT_NORMAL                   1.5
+FONTSIZE_TITLE                  16
+HEIGHT_TITLE                    1.5
+HEIGHT_ZOOMEDTITLE              -1
+
+// general 
+//   uses "background" images
+//   uses "background_ingame" images
+ALIGN_BACKGROUND                h5h5
+ALIGN_BACKGROUND_INGAME         h5
+ALPHA_BACKGROUND_INGAME         1
+ALPHA_DISABLED                  0.2
+ALPHA_BEHIND                    0.5
+ALPHA_TEXT                      0.7
+
+// mouse
+//   uses "cursor" images
+SIZE_CURSOR                     '32 32 0'
+OFFSET_CURSOR                   '0 0 0'
+ALPHA_CURSOR_INTRO              0
+
+// nexposee positions of windows (they are the scale transformation
+// centers, NOT the actual positions of the windows!)
+POSITION_DIALOG_MULTIPLAYER     '0.8 0.4 0'
+POSITION_DIALOG_SINGLEPLAYER    '0.2 0.4 0'
+POSITION_DIALOG_SETTINGS        '0.5 0.95 0'
+POSITION_DIALOG_CREDITS         '-0.05 1.2 0'
+POSITION_DIALOG_QUIT            '1.05 1.2 0'
+
+// tooltips
+//   uses "tooltip" images
+MARGIN_TOOLTIP                  '8 8 0'
+BORDER_TOOLTIP                  '16 16 0'
+FONTSIZE_TOOLTIP                12
+ALPHA_TOOLTIP                   0.7
+WIDTH_TOOLTIP                   0.3
+AVOID_TOOLTIP                   '8 8 0'
+
+//------------------------------------------------------------------------------
+// Colors (e.g. font colors, field colors)
+//------------------------------------------------------------------------------
+// item: campaign
+ALPHA_CAMPAIGN_SELECTABLE       0.8
+COLOR_CAMPAIGN_SELECTABLE       '1 1 1'
+ALPHA_CAMPAIGN_CURRENT          1
+COLOR_CAMPAIGN_CURRENT          '1 1 1'
+ALPHA_CAMPAIGN_FUTURE           0.2
+COLOR_CAMPAIGN_FUTURE           '1 1 1'
+ALPHA_CAMPAIGN_DESCRIPTION      0.7
+
+// item: credits list
+COLOR_CREDITS_TITLE             '0.875 0.375 0'
+ALPHA_CREDITS_TITLE             1
+COLOR_CREDITS_FUNCTION          '0 0.1875 0.4375'
+ALPHA_CREDITS_FUNCTION          0.5
+COLOR_CREDITS_PERSON            '0 0.375 0.75'
+ALPHA_CREDITS_PERSON            0.875
+ROWS_CREDITS                    20
+WIDTH_CREDITS                   0.5
+
+// item: cvar list
+ALPHA_CVARLIST_SAVED            1
+ALPHA_CVARLIST_TEMPORARY        0.7    
+COLOR_CVARLIST_CHANGED          '0 0.375 0.75' 
+COLOR_CVARLIST_REVERTBUTTON     '1 0 0'
+COLOR_CVARLIST_UNCHANGED        '1 1 1'
+
+// item: list box
+COLOR_LISTBOX_SELECTED          '0.875 0.375 0'
+ALPHA_LISTBOX_SELECTED          1
+COLOR_LISTBOX_WAITING           '1 1 1'
+ALPHA_LISTBOX_WAITING           0.5
+
+// item: map list
+COLOR_MAPLIST_TITLE             '1 1 1'
+COLOR_MAPLIST_AUTHOR            '0 0.375 0.75'
+COLOR_MAPLIST_INCLUDEDBG        '0 0.1875 0.4375'
+ALPHA_MAPLIST_INCLUDEDFG        1
+ALPHA_MAPLIST_INCLUDEDBG        0.375
+ALPHA_MAPLIST_NOTINCLUDEDFG     0.25
+
+// item: nexposee
+ALPHAS_MAINMENU                 '0.8 0.9 1'
+
+// item: player model
+COLOR_MODELTITLE                '1 1 1'
+ALPHA_MODELTITLE                1
+
+// item: server info
+COLOR_SERVERINFO_NAME           '1 1 1'
+COLOR_SERVERINFO_IP             '0.875 0.375 0'
+
+// item: server list
+ALPHA_SERVERLIST_FULL           0.4
+ALPHA_SERVERLIST_EMPTY          0.7
+COLOR_SERVERLIST_LOWPING        '0 1 0'
+COLOR_SERVERLIST_MEDPING        '1 0.75 0'
+COLOR_SERVERLIST_HIGHPING       '1 0 0'
+ALPHA_SERVERLIST_HIGHPING       0.4
+ALPHA_SERVERLIST_FAVORITE       0.8
+COLOR_SERVERLIST_FAVORITE       '1 1 1'
+
+// item: skin list
+COLOR_SKINLIST_TITLE            '1 1 1'
+COLOR_SKINLIST_AUTHOR           '0 0.375 0.75'
+
+//------------------------------------------------------------------------------
+// Images (colors multiplied to images)
+//------------------------------------------------------------------------------
+// item: button
+//   uses "button" images
+//   uses "buttongray" images
+//   uses "bigbutton" images
+//   uses "bigbuttongray" images
+COLOR_BUTTON_N                  '1 1 1'
+COLOR_BUTTON_C                  '1 1 1'
+COLOR_BUTTON_F                  '1 1 1'
+COLOR_BUTTON_D                  '1 1 1'
+
+// item: checkbox
+//   uses "checkbox" images
+COLOR_CHECKBOX_N                '1 1 1'
+COLOR_CHECKBOX_C                '0.5 0.75 1'
+COLOR_CHECKBOX_F                '0.5 0.75 1'
+COLOR_CHECKBOX_D                '1 1 1'
+
+// item: crosshair button
+//   uses "crosshairbutton" images
+
+// dialog background colors
+//   uses "border" images
+COLOR_DIALOG_MULTIPLAYER        '1 1 1'
+COLOR_DIALOG_SETTINGS           '1 1 1'
+COLOR_DIALOG_TEAMSELECT         '1 1 1'
+COLOR_DIALOG_QUIT               '1 1 1'
+COLOR_DIALOG_ADVANCED           '1 1 1'
+COLOR_DIALOG_MUTATORS           '1 1 1'
+COLOR_DIALOG_MAPINFO            '1 1 1'
+COLOR_DIALOG_USERBIND           '1 1 1'
+COLOR_DIALOG_SINGLEPLAYER       '1 1 1'
+COLOR_DIALOG_CREDITS            '1 1 1'
+COLOR_DIALOG_WEAPONS            '1 1 1'
+COLOR_DIALOG_RADAR              '1 1 1'
+COLOR_DIALOG_SERVERINFO         '1 1 1'
+COLOR_DIALOG_CVARS              '1 0 0'
+
+// item: input box
+//   uses "inputbox" images
+COLOR_INPUTBOX_N                '1 1 1'
+COLOR_INPUTBOX_F                '1 1 1'
+MARGIN_INPUTBOX_CHARS           1
+
+// item: key grabber
+COLOR_KEYGRABBER_TITLES         '1 1 1'
+ALPHA_KEYGRABBER_TITLES         1
+COLOR_KEYGRABBER_KEYS           '1 1 1'
+ALPHA_KEYGRABBER_KEYS           0.7
+
+// item: player color button
+//   uses "colorbutton" images
+//   uses "color" images
+
+// item: player name editor
+//   uses "charmap" images
+//   uses "charmapbutton" images
+
+// item: radio button
+//   uses "radiobutton" images
+COLOR_RADIOBUTTON_N             '1 1 1'
+COLOR_RADIOBUTTON_C             '1 1 1'
+COLOR_RADIOBUTTON_F             '1 1 1'
+COLOR_RADIOBUTTON_D             '1 1 1'
+
+// item: scrollbar
+//   uses "scrollbar" images
+COLOR_SCROLLBAR_N               '1 1 1'
+COLOR_SCROLLBAR_C               '0.5 0.75 1'
+COLOR_SCROLLBAR_F               '0.5 0.75 1'
+COLOR_SCROLLBAR_S               '0.25 0.25 0.25'
+WIDTH_SCROLLBAR                 16
+
+// item: slider
+//   uses "slider" images
+COLOR_SLIDER_N                  '1 1 1'
+COLOR_SLIDER_C                  '0.5 0.75 1'
+COLOR_SLIDER_F                  '0.5 0.75 1'
+COLOR_SLIDER_D                  '1 1 1'
+COLOR_SLIDER_S                  '0.25 0.25 0.25'
+WIDTH_SLIDERTEXT                0.333333333333
+TOLERANCE_SLIDER                '0.2 2 0'
diff --git a/gfx/menu/wickedx/slider_c.tga b/gfx/menu/wickedx/slider_c.tga
new file mode 100644 (file)
index 0000000..42e3e98
Binary files /dev/null and b/gfx/menu/wickedx/slider_c.tga differ
diff --git a/gfx/menu/wickedx/slider_d.tga b/gfx/menu/wickedx/slider_d.tga
new file mode 100644 (file)
index 0000000..87ccbe5
Binary files /dev/null and b/gfx/menu/wickedx/slider_d.tga differ
diff --git a/gfx/menu/wickedx/slider_f.tga b/gfx/menu/wickedx/slider_f.tga
new file mode 100644 (file)
index 0000000..42e3e98
Binary files /dev/null and b/gfx/menu/wickedx/slider_f.tga differ
diff --git a/gfx/menu/wickedx/slider_n.tga b/gfx/menu/wickedx/slider_n.tga
new file mode 100644 (file)
index 0000000..42e3e98
Binary files /dev/null and b/gfx/menu/wickedx/slider_n.tga differ
diff --git a/gfx/menu/wickedx/slider_s.tga b/gfx/menu/wickedx/slider_s.tga
new file mode 100644 (file)
index 0000000..954c90c
Binary files /dev/null and b/gfx/menu/wickedx/slider_s.tga differ
diff --git a/gfx/menu/wickedx/tooltip.tga b/gfx/menu/wickedx/tooltip.tga
new file mode 100644 (file)
index 0000000..1dc5679
Binary files /dev/null and b/gfx/menu/wickedx/tooltip.tga differ
index 16e21962e5b298d5cce54e38968e5e3874f7520d..fc500023adb8443ff8d5d7fb2dc6b3bbcaf175f9 100644 (file)
Binary files a/models/ctf/flag_blue.md3 and b/models/ctf/flag_blue.md3 differ
index d25a466eb2df95590a0114f436fe726cac98d7b5..aa9a75f24dca7970742f7d47582b9dd298a7b08e 100644 (file)
Binary files a/models/ctf/flag_red.md3 and b/models/ctf/flag_red.md3 differ
index 9eb6b7fab2b391f3b255d6b70e9ff21524879ea1..05a4fe72fc5955dfe55a03b29dd5ce6cc0d44b85 100644 (file)
@@ -1,3 +1,3 @@
-flag,textures/flags/flag_red
-flag_cloth,textures/flags/flag_red_cloth
-flag_laser,textures/flags/flag_red_laser
+flag,flags/flag_red
+flag_cloth,flags/flag_red_cloth
+flag_laser,flags/flag_red_laser
index a24f1bbabe98e060944cca79aef27a31b65a4e3f..02f217f36abf28de8af0c36f6d5dab9ec9e60360 100644 (file)
@@ -1,3 +1,3 @@
-flag,textures/flags/flag_blue
-flag_cloth,textures/flags/flag_blue_cloth
-flag_laser,textures/flags/flag_blue_laser
+flag,flags/flag_blue
+flag_cloth,flags/flag_blue_cloth
+flag_laser,flags/flag_blue_laser
index b86c2a8c52a9be1d3efd62cae693d9cf3e4bf9e1..9491a2f7931926e33d936ffb2aed8c5ad7c5184b 100644 (file)
Binary files a/models/ctf/radiant/flag_blue_radiant.md3 and b/models/ctf/radiant/flag_blue_radiant.md3 differ
index 3f45e4998fa4e6b74fc7bb23165dca1815f78928..8a73bb2051b12cab088430ecdf0c38896868a85e 100644 (file)
Binary files a/models/ctf/radiant/flag_red_radiant.md3 and b/models/ctf/radiant/flag_red_radiant.md3 differ
index 6429f48948dcc8f8482395974fe30403740c15b0..8fd6b4fc09c8b7b238a2b5daecafe4c163d1da0f 100644 (file)
Binary files a/models/domination/dom_blue.md3 and b/models/domination/dom_blue.md3 differ
index 7aa01bf395a317cbcf42ce51c1141169b3c2c6b0..d8a9579cdb97bddd28fe37670c81dacfafe44533 100644 (file)
Binary files a/models/domination/dom_pink.md3 and b/models/domination/dom_pink.md3 differ
index 332b0f239560283f7d079fa66f7278b356c62919..cb68ce4051de2e1e6d415b93a19ad44c2c58b635 100644 (file)
Binary files a/models/domination/dom_red.md3 and b/models/domination/dom_red.md3 differ
index be5aaa9571860d4e8570e3c096b6c2d66cc8029a..efbcf9cf74ba7fd7932192ddbdac2c7d14e81f72 100644 (file)
Binary files a/models/domination/dom_unclaimed.md3 and b/models/domination/dom_unclaimed.md3 differ
index b1da0d1b0990a4d8cda307a0bb86a67e675470a9..bb6ff52fe546b0319c61ac7d7ef429599cc55ede 100644 (file)
Binary files a/models/domination/dom_yellow.md3 and b/models/domination/dom_yellow.md3 differ
index 7d2f71edd9a330b35fadf86e18826360a07a2fe1..19ccfecfaaa3f061fba1afe17ab15986991f93b4 100644 (file)
Binary files a/models/final_rage/gspawn.md3 and b/models/final_rage/gspawn.md3 differ
index 56afa6ded85b5c6cdf6ae04f960ae10c97069efa..a0688d79abb44bc6c5270ada5e70843340bb1587 100644 (file)
Binary files a/models/final_rage/lamp2.md3 and b/models/final_rage/lamp2.md3 differ
index eb588be7fd0e8cd7325ba80a416b7dc243eba80d..8c91a309a27fe29cf3c0a95a566447c6042fd9c5 100644 (file)
Binary files a/models/final_rage/pspawn1.md3 and b/models/final_rage/pspawn1.md3 differ
index 0e2935f136d027f7f09b124795517fe1b3493f11..69998c145e02b2c8339c248ee963ad2d602f4936 100644 (file)
Binary files a/models/gibs/arm.md3 and b/models/gibs/arm.md3 differ
index cfa59b5ea27c2c538abc8a1288c85c0a073eb54c..1e590ac9012dd68276d359b8d3184abcd1de1d2c 100644 (file)
@@ -1,2 +1,2 @@
-Box03,textures/meat.tga
-Cylinder11,textures/meat.tga
\ No newline at end of file
+Box03,meat
+Cylinder11,meat
\ No newline at end of file
index f7ab64a8924bcc47154177851474681997b144fd..dd64aeff76126589f0cc8ea2445d1ac31aa46022 100644 (file)
@@ -1,2 +1,2 @@
-Box03,textures/meat_robot.tga
-Cylinder11,textures/meat_robot.tga
\ No newline at end of file
+Box03,meat_robot
+Cylinder11,meat_robot
\ No newline at end of file
index c5c1d4659c85ecfa625d52e1ea4e63075d0bd158..bb7214529b7226ceab4bd72378038ff42971c36c 100644 (file)
@@ -1,2 +1,2 @@
-Box03,textures/meat_alien.tga
-Cylinder11,textures/meat_alien.tga
\ No newline at end of file
+Box03,meat_alien
+Cylinder11,meat_alien
\ No newline at end of file
index 8afd7530e69dd2c04143b2952d0804e967b7643e..b0e5250899db8acd5f0e55b2a0682c295391b281 100644 (file)
Binary files a/models/gibs/bloodyskull.md3 and b/models/gibs/bloodyskull.md3 differ
index 00da92429cdcc2f77753da45acadd3fa7987cf6f..f5dae0963451d3e2f31cfe6a00e7d2924418009c 100644 (file)
@@ -1 +1 @@
-Box03,textures/bloodyskull.tga
\ No newline at end of file
+Box03,bloodyskull
\ No newline at end of file
index f3bf1a692afe127216143a59dad9f6d3b0fb8c33..73f5c26d223e0b322887bf1ef4b815586a9744dd 100644 (file)
@@ -1 +1 @@
-Box03,textures/bloodyskull_robot.tga
\ No newline at end of file
+Box03,bloodyskull_robot
\ No newline at end of file
index 5f71d79d7969cc343a2da1810e72d443307d3aba..558041eb81f37c6a4a9dc9cc8f5f928b533249bd 100644 (file)
@@ -1 +1 @@
-Box03,textures/bloodyskull_alien.tga
\ No newline at end of file
+Box03,bloodyskull_alien
\ No newline at end of file
index c7b2510caaa43302864df53e28c31b4774f3bad9..df551b46cc50f61fcb51ea2f93bb8b5058c38db7 100644 (file)
Binary files a/models/gibs/chest.md3 and b/models/gibs/chest.md3 differ
index e18c6ad5b0a7f758b3441b0cc66a0f92aaeee236..2e4720a65c72399c6bb559c517c0c34c64d583c2 100644 (file)
@@ -1,2 +1,2 @@
-Box02,textures/meat.tga
-Cylinder06,textures/meat.tga
\ No newline at end of file
+Box02,meat
+Cylinder06,meat
\ No newline at end of file
index af533063d404071d74e94eb1a7643615d9553767..b3844e5ec0ad67055513c8165d703f46f9a6d2ef 100644 (file)
@@ -1,2 +1,2 @@
-Box02,textures/meat_robot.tga
-Cylinder06,textures/meat_robot.tga
\ No newline at end of file
+Box02,meat_robot
+Cylinder06,meat_robot
\ No newline at end of file
index 3ed29a8e57dd45564a48bb11a6cd03fe885fb24b..4e84e5f919e63e13754dcc878d049b2f7e8f10b7 100644 (file)
@@ -1,2 +1,2 @@
-Box02,textures/meat_alien.tga
-Cylinder06,textures/meat_alien.tga
\ No newline at end of file
+Box02,meat_alien
+Cylinder06,meat_alien
\ No newline at end of file
index 211e65a8a0d69638bd531016904281929b2fda33..696d3aae83c4f0cd7b56f085788d6965743c6e8d 100644 (file)
Binary files a/models/gibs/eye.md3 and b/models/gibs/eye.md3 differ
index 57de2f02b3495950ba4fb55249c954ea957d8dd5..276982da529df03fda8ba79f7ec29e6f68a3fec5 100644 (file)
Binary files a/models/gibs/gib1.md3 and b/models/gibs/gib1.md3 differ
index 4b29988749315568a58c1e02e6f8e86926574074..f5a2f736206ae88382e965f1ac3c041a7f6f22f4 100644 (file)
Binary files a/models/gibs/gib2.md3 and b/models/gibs/gib2.md3 differ
index 99cf0e006e3bfa735405d1bb90fb0893ca6e45f4..8a38b42cb821d253fef00fd078afb6752ddd6f87 100644 (file)
Binary files a/models/gibs/gib3.md3 and b/models/gibs/gib3.md3 differ
index b7588a2c9410cce02c74dfe5476d6e1784421749..dd4c5b53d2770d6f3f4a03304fdad0b0ba7b14cc 100644 (file)
Binary files a/models/gibs/gib4.md3 and b/models/gibs/gib4.md3 differ
index eded1ca5cf00eba1f0636c00952025b1de2e6ab8..6a51eb220d9541a859329d7593ead1d4382a0fc4 100644 (file)
Binary files a/models/gibs/gib5.md3 and b/models/gibs/gib5.md3 differ
index 202877211f84a6a55d32d5a6509e61363b482adc..956c9022bfb5ec4e4ea9fed09b6f92b41c68a90b 100644 (file)
Binary files a/models/gibs/gib6.md3 and b/models/gibs/gib6.md3 differ
index dcbf177c65e5af9f87bba383d35d6e359e8ce8f8..64ab1578abb1cfad0995cce492ea674138ba7b6b 100644 (file)
Binary files a/models/gibs/leg1.md3 and b/models/gibs/leg1.md3 differ
index 9cd6940f5d00fa4dda5936ee33d5f4ba53a127f5..50c0f685b1fb458f783253f9d81a290d543c7675 100644 (file)
@@ -1 +1 @@
-legs,textures/meat.tga
\ No newline at end of file
+legs,meat
\ No newline at end of file
index 52caaeb3f4a3d88bc4661d6de6cfa69dff2d83bd..5e924e611197d0b8ad3bdc84f42acedbfd7b78ac 100644 (file)
@@ -1 +1 @@
-legs,textures/meat_robot.tga
\ No newline at end of file
+legs,meat_robot
\ No newline at end of file
index a5ccef5b42b6ddbfd9bf49d62495da1ec498b411..0151ecad401d4a478d539db41fad3f248f230be9 100644 (file)
@@ -1 +1 @@
-legs,textures/meat_alien.tga
\ No newline at end of file
+legs,meat_alien
\ No newline at end of file
index bc2d3d87fca30c56a41c11a0ceb663656b9871e5..1dabb0a73423235b0cd81a04300510bfd6c6c4ed 100644 (file)
Binary files a/models/gibs/leg2.md3 and b/models/gibs/leg2.md3 differ
index 8b01ac961f31c5c54e76af6368ec3623a3d0fa36..9c6e8a156015ec45f9dc81eb1797daf4b9cc65f5 100644 (file)
@@ -1 +1 @@
-legs01,textures/meat.tga
\ No newline at end of file
+legs01,meat
\ No newline at end of file
index e1b1d96cb96cda3a86280bcbdc5c450f012791d6..12b61e0c0ea872a3bb53c8eeaa70175411eca045 100644 (file)
@@ -1 +1 @@
-legs01,textures/meat_robot.tga
\ No newline at end of file
+legs01,meat_robot
\ No newline at end of file
index 7da9ca8da3c3f53d0f41b229fa8d1d7799a77b47..834656196f3c242b2a6fdea82dbf9771132caaa3 100644 (file)
@@ -1 +1 @@
-legs01,textures/meat_alien.tga
\ No newline at end of file
+legs01,meat_alien
\ No newline at end of file
index 8277e5e715e075b26e6b4fd61bc9511adf8f6489..0f9fd958cc3a612e91be1eb063acd7c42053c025 100644 (file)
Binary files a/models/gibs/smallchest.md3 and b/models/gibs/smallchest.md3 differ
index 463569452f217399b0f697926c9345fec4334cae..2bf1544cbe474c1eec62e2f570ef13b62be5f02c 100644 (file)
@@ -1,5 +1,5 @@
-Box01,textures/meat.tga
-Cylinder02,textures/meat.tga
-Cylinder13,textures/meat.tga
-Cylinder14,textures/meat.tga
-Cylinder15,textures/meat.tga
\ No newline at end of file
+Box01,meat
+Cylinder02,meat
+Cylinder13,meat
+Cylinder14,meat
+Cylinder15,meat
\ No newline at end of file
index 7dcfc4e9f096fdb59e405ab677c690109d371221..3f333a731b65bdfdd282cd7998ba8219ab92a94b 100644 (file)
@@ -1,5 +1,5 @@
-Box01,textures/meat_robot.tga
-Cylinder02,textures/meat_robot.tga
-Cylinder13,textures/meat_robot.tga
-Cylinder14,textures/meat_robot.tga
-Cylinder15,textures/meat_robot.tga
\ No newline at end of file
+Box01,meat_robot
+Cylinder02,meat_robot
+Cylinder13,meat_robot
+Cylinder14,meat_robot
+Cylinder15,meat_robot
\ No newline at end of file
index bd766081cb375804d1f1f46f108a2ad39f0223b3..4c60168a0f48574dad992d6ec596075096d4f963 100644 (file)
@@ -1,5 +1,5 @@
-Box01,textures/meat_alien.tga
-Cylinder02,textures/meat_alien.tga
-Cylinder13,textures/meat_alien.tga
-Cylinder14,textures/meat_alien.tga
-Cylinder15,textures/meat_alien.tga
\ No newline at end of file
+Box01,meat_alien
+Cylinder02,meat_alien
+Cylinder13,meat_alien
+Cylinder14,meat_alien
+Cylinder15,meat_alien
\ No newline at end of file
index 822caccb3a35045a8736ef6d188e558d546c8e15..7758e3e0f3e134e34a90504bc862604a393faf88 100644 (file)
Binary files a/models/grenademodel.md3 and b/models/grenademodel.md3 differ
index 9f71c9d364bc7f08bb102844e711c9c6e69f8273..b41a434c5757a93a7b48a9b5f4f9592fe79d36ca 100644 (file)
Binary files a/models/hook.md3 and b/models/hook.md3 differ
index c8e633d5f8802672893fc4f8744d62b39e50e896..0ae4a68cb01e8bda1387b57ed480f547f6a48cd8 100644 (file)
Binary files a/models/it/chair.md3 and b/models/it/chair.md3 differ
index b14123a33d540321ae280008ed956d26afdb095b..9a81bd74e9f0d270d7ba831c6cb926c46509e32f 100644 (file)
Binary files a/models/it/keyboard.md3 and b/models/it/keyboard.md3 differ
index ef6f62d917dc6b8c3c70a39ffee38adf62648e28..6ca3288eb533da9d66710fbc93a5308d8cca4b6f 100644 (file)
Binary files a/models/it/lcd.md3 and b/models/it/lcd.md3 differ
index 8fb2b8f9b714d35cfc38c9fa2e134dec346c6849..fd69ddd2e1d98ee4a8da05d65dc4e4153a5b6977 100644 (file)
Binary files a/models/it/pc.md3 and b/models/it/pc.md3 differ
index 3f15bf0fe4de12c2a2f5a39a517ebff89f420feb..04f6afed4c74eb3e65fdd54bb905bef383797a3f 100644 (file)
Binary files a/models/items/a_cells.md3 and b/models/items/a_cells.md3 differ
index 90a561ec1f26f8e5ffb2262e59fb91342e6d93fc..f1be48e97575c19e3bbee374354f5b20b06f50e1 100644 (file)
Binary files a/models/items/a_shells.md3 and b/models/items/a_shells.md3 differ
index 830e7f119071074dd45519161f9f2d42d663f1d0..22ed73eae12bb910688be43719332e46e71a91be 100644 (file)
Binary files a/models/items/g_a1.md3 and b/models/items/g_a1.md3 differ
index 8f24ee18470f29fa57283c0e3b864a200d063e52..da02dcb9ae328af70d9d3e5e6c496cd21cd1c951 100644 (file)
Binary files a/models/items/g_a25.md3 and b/models/items/g_a25.md3 differ
index 42a0757430c07637c81bca2d0e779dc7c5ddd923..7525f10480bcc53b1be79748b4874a27196d123f 100644 (file)
Binary files a/models/items/g_a50.md3 and b/models/items/g_a50.md3 differ
index c1ce8a771113089dfb45460709e24ea7812f7175..203a93641f597a173dd9741a38bc6896b6677a33 100644 (file)
Binary files a/models/items/g_armormedium.md3 and b/models/items/g_armormedium.md3 differ
index 095011ef8059263709bce4ab549cbed79e2e68bd..3b6e7e9707e09fc9ac91d920e79f30b201ffcdfd 100644 (file)
Binary files a/models/items/g_h1.md3 and b/models/items/g_h1.md3 differ
index 14b035d4c7bf8678295c14823c030cf22b725685..1893bc5387c3550f302a97406a6e985ce7e1431f 100644 (file)
Binary files a/models/items/g_h100.md3 and b/models/items/g_h100.md3 differ
index 424935c3b587e2dc7cf1fdd566e3592669095069..09ca47b04f2d5e3c9fd4143d6fded0c8efe83c4a 100644 (file)
Binary files a/models/items/g_h25.md3 and b/models/items/g_h25.md3 differ
index 913e270b75072b81726f15958e3687ad2847ef89..9d26a567618d2b1962d622d12e7073c976c1a07a 100644 (file)
Binary files a/models/items/g_h50.md3 and b/models/items/g_h50.md3 differ
index 57c03ca7c3185427ee1c8509a56799d8e55bfc78..7097ec459f44de5e9d269027f49cb50f5fc04e44 100644 (file)
Binary files a/models/items/g_invincible.md3 and b/models/items/g_invincible.md3 differ
index 32cfa0467a231960f7b19877aa6c34536d4adb5b..5a276c67fa8ed38eed165887ac8ac1c61e4f18d6 100644 (file)
Binary files a/models/items/g_rl.md3 and b/models/items/g_rl.md3 differ
index e6cdad2c5e265ffb02536adcae9ee5d8a02cd2eb..6159b5ff710257bf7f49b2c044fa3831c5f69883 100644 (file)
Binary files a/models/items/g_strength.md3 and b/models/items/g_strength.md3 differ
index b41e7d9310123001ba55d331dc0b4ac5f5596979..097c90ce472e4a3d3570c8d9c88da7bce9e3f6ae 100644 (file)
Binary files a/models/keyhunt/key.md3 and b/models/keyhunt/key.md3 differ
index f9a946e05168637d207c5f08c51d8fd0feb599df..7dce9f38564cf5c925e7a286d984f879d5062767 100644 (file)
Binary files a/models/map/forklift.md3 and b/models/map/forklift.md3 differ
index 3451252af2d3a8f3fb5e3496f8a670bd128ff8de..c4d5fec2ec8da910506b6f2231354192d6c33d86 100644 (file)
Binary files a/models/marker.md3 and b/models/marker.md3 differ
index 4bd49bd3709c26f932720bdcc54afc56744ff7f3..3d56cdb2f452d770d5896be4e177e9c5355c80f1 100644 (file)
@@ -1,31 +1,31 @@
-1 56 30 0      // zombie attackleap         1\r
-57 41 60 1     // zombie attackrun1         2\r
-98 41 60 1     // zombie attackrun2         3\r
-139 41 60 1    // zombie attackrun3         4\r
-180 41 30 1    // zombie attackstanding1    5\r
-221 35 30 1    // zombie attackstanding2    6\r
-256 41 30 1    // zombie attackstanding3    7\r
-297 21 60 1    // zombie blockend           8\r
-318 21 60 0    // zombie blockstart         9\r
-339 96 30 0    // zombie deathback1         10\r
-435 67 30 0    // zombie deathback2         11\r
-502 71 30 0    // zombie deathback3         12\r
-573 61 30 0    // zombie deathfront1        13\r
-634 66 30 0    // zombie deathfront2        14\r
-700 96 30 0    // zombie deathfront3        15\r
-796 96 30 0    // zombie deathleft1         16\r
-892 71 30 0    // zombie deathleft2         17\r
-963 66 30 0    // zombie deathright1        18\r
-1029 86  30 0  // zombie deathright2        19\r
-1115 121 10 1  // zombie idle               20\r
-1236 11 30 0   // zombie painback1          21\r
-1247 11 30 0   // zombie painback2          22\r
-1258 11 30 0   // zombie painfront1         23\r
-1269 11 30 0   // zombie painfront2         24\r
-1280 41 60 1   // zombie runbackwards       25\r
-1321 41 60 1   // zombie runbackwardsleft   26\r
-1362 41 60 1   // zombie runbackwardsright  27\r
-1403 41 60 1   // zombie runforward         28\r
-1444 41 60 1   // zombie runforwardleft     29\r
-1485 41 60 1   // zombie runforwardright    30\r
-1526 61 30 0   // zombie spawn              31\r
+1 56 30 0      // zombie attackleap         1
+57 41 60 1     // zombie attackrun1         2
+98 41 60 1     // zombie attackrun2         3
+139 41 60 1    // zombie attackrun3         4
+180 41 30 1    // zombie attackstanding1    5
+221 35 30 1    // zombie attackstanding2    6
+256 41 30 1    // zombie attackstanding3    7
+297 21 60 1    // zombie blockend           8
+318 21 60 0    // zombie blockstart         9
+339 96 30 0    // zombie deathback1         10
+435 67 30 0    // zombie deathback2         11
+502 71 30 0    // zombie deathback3         12
+573 61 30 0    // zombie deathfront1        13
+634 66 30 0    // zombie deathfront2        14
+700 96 30 0    // zombie deathfront3        15
+796 96 30 0    // zombie deathleft1         16
+892 71 30 0    // zombie deathleft2         17
+963 66 30 0    // zombie deathright1        18
+1029 86  30 0  // zombie deathright2        19
+1115 121 10 1  // zombie idle               20
+1236 11 30 0   // zombie painback1          21
+1247 11 30 0   // zombie painback2          22
+1258 11 30 0   // zombie painfront1         23
+1269 11 30 0   // zombie painfront2         24
+1280 41 60 1   // zombie runbackwards       25
+1321 41 60 1   // zombie runbackwardsleft   26
+1362 41 60 1   // zombie runbackwardsright  27
+1403 41 60 1   // zombie runforward         28
+1444 41 60 1   // zombie runforwardleft     29
+1485 41 60 1   // zombie runforwardright    30
+1526 61 30 0   // zombie spawn              31
index 2a21e6758bef6af1543995522b3877d807055f9f..2694a3f0657d5b828ee35368aa8f08e8dd8940c6 100644 (file)
Binary files a/models/mtree01.md3 and b/models/mtree01.md3 differ
index 4beecf2f46ed4c8ad4c6c36a1b5d9a16e8423da9..1732639672c96a67e2804ad37070b2f9c3a16657 100644 (file)
Binary files a/models/mtree02.md3 and b/models/mtree02.md3 differ
index a66acb6f2177194d34a4f8ab4257ddcb58a97e6d..b3b69e65d80c6154ff757f0ae4ebf73e732332c2 100644 (file)
Binary files a/models/mtree03.md3 and b/models/mtree03.md3 differ
index f1a2b058fa63b3d0a319718fad579b995604ad7a..75399efc9957a15e3ec154be595f03375f7a3879 100644 (file)
Binary files a/models/nexball/ball.md3 and b/models/nexball/ball.md3 differ
index 7fd6d05ebd4fda39f499dfb88e499bc8df1c4920..af4c0fc9b4f65fd09fa9770803f01276e3a58d3e 100644 (file)
Binary files a/models/nexflash.md3 and b/models/nexflash.md3 differ
index fd047dafd8fa85058c3168b7c8694c410e950a3b..2688dd9e5cbbda9782b94a79be7996bb50aa2180 100644 (file)
Binary files a/models/onslaught/controlpoint_icon.md3 and b/models/onslaught/controlpoint_icon.md3 differ
index 1a86f2b8f1afc151dc7b51e6c9cd64b82f74a5ce..6ca1ad34efd83582dc695baa05f9a1a905d661fb 100644 (file)
Binary files a/models/onslaught/controlpoint_icon_dmg1.md3 and b/models/onslaught/controlpoint_icon_dmg1.md3 differ
index 3adef9a6a44c32698aa0f7daebe309838eb04e7d..a7ef678686c3519b651b4cff19dc36e46fbbfa1e 100644 (file)
Binary files a/models/onslaught/controlpoint_icon_dmg2.md3 and b/models/onslaught/controlpoint_icon_dmg2.md3 differ
index d8c24a74938956b1ec3c421f101f238ecbc27a18..aaa15953515edaf80421b8034043e9cde3417ce2 100644 (file)
Binary files a/models/onslaught/controlpoint_icon_dmg3.md3 and b/models/onslaught/controlpoint_icon_dmg3.md3 differ
index 50a5dea0ada94763d8372509b1cd82c594ac5c65..2904ed9c4ebbf43abb04a4d58f2bccde1b525cc0 100644 (file)
Binary files a/models/onslaught/controlpoint_icon_gib1.md3 and b/models/onslaught/controlpoint_icon_gib1.md3 differ
index b4675babde42c763f1680d0a3fd49856257bc5f7..3d484044fd8ca3ced1b94228552cec138d994c5e 100644 (file)
Binary files a/models/onslaught/controlpoint_icon_gib2.md3 and b/models/onslaught/controlpoint_icon_gib2.md3 differ
index 9407b853aed6a8dff73195b2415986ea8b63c4b7..afae69b032e03f55d170a8f9f111b29d0f4d9b8c 100644 (file)
Binary files a/models/onslaught/controlpoint_icon_gib4.md3 and b/models/onslaught/controlpoint_icon_gib4.md3 differ
index 4f6ee3d5f6253cb666ed89e661df41ac87c992e2..eb814e93901a9bba5d462f3ea47002a83ac47748 100644 (file)
Binary files a/models/onslaught/controlpoint_pad.md3 and b/models/onslaught/controlpoint_pad.md3 differ
index 24d68942b47afd290d481321abeeec96826baeb5..6cff091066ce024e3472b628e5e7b52d8f35e006 100644 (file)
Binary files a/models/onslaught/controlpoint_pad2.md3 and b/models/onslaught/controlpoint_pad2.md3 differ
index 78320c31b9d862bd385bfc198668339c4804b218..cbf7418cd04f9fc965d34c2b3f5d24c3a03bb0ce 100644 (file)
Binary files a/models/onslaught/gen_gib1.md3 and b/models/onslaught/gen_gib1.md3 differ
index 313d5ef2ee5e260c4ebc49380860c385ba13aa88..b8e4ceb5277a17fbf86e6513c7dd45a912abce71 100644 (file)
Binary files a/models/onslaught/gen_gib2.md3 and b/models/onslaught/gen_gib2.md3 differ
index 825a33bd7e668c7a3ccc3fb6df3aa7ed8789293f..c8d46f149524c47acfa8f4bdf646a07266f08af4 100644 (file)
Binary files a/models/onslaught/gen_gib3.md3 and b/models/onslaught/gen_gib3.md3 differ
index 4bdd5fb85ecffdebe5c44063e4f1a93928692db6..d0c49b9e3a3cbd03917f240895040bc74471414d 100644 (file)
Binary files a/models/onslaught/generator.md3 and b/models/onslaught/generator.md3 differ
index 24eac48b95bd69660914ce8eec14bc8e4e3b3439..aa07c91c6fd22d8505a4a579737d55e9174c975e 100644 (file)
Binary files a/models/onslaught/generator_dead.md3 and b/models/onslaught/generator_dead.md3 differ
index e57df81be4b7929ec3a1281a11f57d961f89facd..7fb818b57a011c30e2a23618a7c5b35130e8f65b 100644 (file)
Binary files a/models/onslaught/generator_dmg1.md3 and b/models/onslaught/generator_dmg1.md3 differ
index d5d9107cf552258c779d49f6bf57ba8fa31e3d6d..12f2bb1b95c203f498789e853bfb6fb0ddae91a9 100644 (file)
Binary files a/models/onslaught/generator_dmg2.md3 and b/models/onslaught/generator_dmg2.md3 differ
index a44963b78b227fcfdc8aeee2797f1e4565bc1d66..abca4fa0a251ee7b2b5984c08b42638021f2d008 100644 (file)
Binary files a/models/onslaught/generator_dmg3.md3 and b/models/onslaught/generator_dmg3.md3 differ
index 8b95b3b75f23d0b55a92f9a6e0a0db51b4bf882e..611a2d4822b31c14011b0e735fb4020216797f3a 100644 (file)
Binary files a/models/onslaught/generator_dmg4.md3 and b/models/onslaught/generator_dmg4.md3 differ
index 744bf15df97b95153e456d5eff2a2eaafd4d6b2b..fbb8e87e609a8529d8237e187c9e7fac7a2ccc5c 100644 (file)
Binary files a/models/onslaught/generator_dmg5.md3 and b/models/onslaught/generator_dmg5.md3 differ
index b56ad911c6ff95a71faa71b4fdd90aae95cc42fb..a7103cdb3a8b52b0a0dc7197b5050a7c272c4584 100644 (file)
Binary files a/models/onslaught/generator_dmg6.md3 and b/models/onslaught/generator_dmg6.md3 differ
index 328e59595579c899714dca98a1921409ca8d3673..b2d6033744baf2a9278b2045f919b4ce3fd7043f 100644 (file)
Binary files a/models/onslaught/generator_dmg7.md3 and b/models/onslaught/generator_dmg7.md3 differ
index 453db5f0b91c5897f991049dccf9ed50869b665c..ee941cda4314d051ab676dc9eea79b319cede475 100644 (file)
Binary files a/models/onslaught/generator_dmg8.md3 and b/models/onslaught/generator_dmg8.md3 differ
index d1b64a9fd3adfaf70e3f0e1f0231e30304fabd9d..03b6768d2db96a4a2a68990fc978b0b9e0b9aa15 100644 (file)
Binary files a/models/onslaught/generator_dmg9.md3 and b/models/onslaught/generator_dmg9.md3 differ
diff --git a/models/player/carni.tga b/models/player/carni.tga
deleted file mode 100644 (file)
index 8794d66..0000000
Binary files a/models/player/carni.tga and /dev/null differ
diff --git a/models/player/carni.txt b/models/player/carni.txt
deleted file mode 100644 (file)
index d6d082c..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-Carni
-models/player/carni
-0
-models/player/carni.zym
-species alien
-
-Mutated Warrior
-
-Sex: Male
-Weight: 107 kg
\ No newline at end of file
diff --git a/models/player/carni.zym b/models/player/carni.zym
deleted file mode 100644 (file)
index 0c2a9e5..0000000
Binary files a/models/player/carni.zym and /dev/null differ
diff --git a/models/player/carni.zym.sounds b/models/player/carni.zym.sounds
deleted file mode 100644 (file)
index b691675..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-//TAG: carni-lycan
-//affirmative sound/player/carni-lycan/player/affirmative 0
-attack sound/player/carni-lycan/coms/attack 0
-//attacking sound/player/carni-lycan/player/attacking 0
-attackinfive sound/player/carni-lycan/coms/attackinfive 0
-coverme sound/player/carni-lycan/coms/coverme 0
-defend sound/player/carni-lycan/coms/defend 0
-//defending sound/player/carni-lycan/player/defending 0
-//droppedflag sound/player/carni-lycan/player/droppedflag 0
-//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/carni-lycan/coms/freelance 2
-//getflag sound/player/carni-lycan/player/getflag 0
-incoming sound/player/carni-lycan/coms/incoming 0
-meet sound/player/carni-lycan/coms/meet 0
-needhelp sound/player/carni-lycan/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/carni-lycan/coms/seenflag 0
-taunt sound/player/carni-lycan/coms/taunt 3
-teamshoot sound/player/carni-lycan/coms/teamshoot 3
-death sound/player/carni-lycan/player/death 3
-drown sound/player/carni-lycan/player/drown 0
-//fall sound/player/carni-lycan/player/fall 0
-falling sound/player/carni-lycan/player/falling 0
-gasp sound/player/carni-lycan/player/gasp 0
-jump sound/player/carni-lycan/player/jump 0
-pain25 sound/player/carni-lycan/player/pain25 0
-pain50 sound/player/carni-lycan/player/pain50 0
-pain75 sound/player/carni-lycan/player/pain75 0
-pain100 sound/player/carni-lycan/player/pain100 0
diff --git a/models/player/carni.zym_0.skin b/models/player/carni.zym_0.skin
deleted file mode 100644 (file)
index f8bfcf9..0000000
+++ /dev/null
@@ -1 +0,0 @@
-carni2,carni
\ No newline at end of file
diff --git a/models/player/carni.zym_1.skin b/models/player/carni.zym_1.skin
deleted file mode 100644 (file)
index 768b201..0000000
+++ /dev/null
@@ -1 +0,0 @@
-carni2,carniarmor
diff --git a/models/player/carni_lod1.zym b/models/player/carni_lod1.zym
deleted file mode 100644 (file)
index 60e44e5..0000000
Binary files a/models/player/carni_lod1.zym and /dev/null differ
diff --git a/models/player/carni_lod1.zym_0.skin b/models/player/carni_lod1.zym_0.skin
deleted file mode 100644 (file)
index f8bfcf9..0000000
+++ /dev/null
@@ -1 +0,0 @@
-carni2,carni
\ No newline at end of file
diff --git a/models/player/carni_lod1.zym_1.skin b/models/player/carni_lod1.zym_1.skin
deleted file mode 100644 (file)
index 768b201..0000000
+++ /dev/null
@@ -1 +0,0 @@
-carni2,carniarmor
diff --git a/models/player/carni_lod2.zym b/models/player/carni_lod2.zym
deleted file mode 100644 (file)
index 4c85820..0000000
Binary files a/models/player/carni_lod2.zym and /dev/null differ
diff --git a/models/player/carni_lod2.zym_0.skin b/models/player/carni_lod2.zym_0.skin
deleted file mode 100644 (file)
index f8bfcf9..0000000
+++ /dev/null
@@ -1 +0,0 @@
-carni2,carni
\ No newline at end of file
diff --git a/models/player/carni_lod2.zym_1.skin b/models/player/carni_lod2.zym_1.skin
deleted file mode 100644 (file)
index 768b201..0000000
+++ /dev/null
@@ -1 +0,0 @@
-carni2,carniarmor
diff --git a/models/player/carniarmor.tga b/models/player/carniarmor.tga
deleted file mode 100644 (file)
index 0d4d317..0000000
Binary files a/models/player/carniarmor.tga and /dev/null differ
diff --git a/models/player/carniarmor.txt b/models/player/carniarmor.txt
deleted file mode 100644 (file)
index 8adb0c7..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Armored Carni
-models/player/carniarmor
-1
-models/player/carni.zym
-species alien
-
-Mutated Warrior
-
-Sex: Male
-Weight: 107 kg
-Age: 15
\ No newline at end of file
diff --git a/models/player/crash.zym b/models/player/crash.zym
deleted file mode 100644 (file)
index 8196089..0000000
Binary files a/models/player/crash.zym and /dev/null differ
diff --git a/models/player/crash.zym.sounds b/models/player/crash.zym.sounds
deleted file mode 100644 (file)
index dd7be39..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/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/soldier/coms/freelance 2
-//getflag sound/player/carni-lycan/player/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/carni-lycan/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/crash.zym_0.skin b/models/player/crash.zym_0.skin
deleted file mode 100644 (file)
index ca24bfe..0000000
+++ /dev/null
@@ -1 +0,0 @@
-mechanical12,quark
diff --git a/models/player/crash_lod1.zym b/models/player/crash_lod1.zym
deleted file mode 100644 (file)
index e722d19..0000000
Binary files a/models/player/crash_lod1.zym and /dev/null differ
diff --git a/models/player/crash_lod1.zym_0.skin b/models/player/crash_lod1.zym_0.skin
deleted file mode 100644 (file)
index ca24bfe..0000000
+++ /dev/null
@@ -1 +0,0 @@
-mechanical12,quark
diff --git a/models/player/crash_lod2.zym b/models/player/crash_lod2.zym
deleted file mode 100644 (file)
index 86b1fa3..0000000
Binary files a/models/player/crash_lod2.zym and /dev/null differ
diff --git a/models/player/crash_lod2.zym_0.skin b/models/player/crash_lod2.zym_0.skin
deleted file mode 100644 (file)
index ca24bfe..0000000
+++ /dev/null
@@ -1 +0,0 @@
-mechanical12,quark
diff --git a/models/player/fricka.tga b/models/player/fricka.tga
deleted file mode 100644 (file)
index 1dc5b02..0000000
Binary files a/models/player/fricka.tga and /dev/null differ
diff --git a/models/player/fricka.txt b/models/player/fricka.txt
deleted file mode 100644 (file)
index 982aa9e..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Fricka
-models/player/fricka
-1
-models/player/visitant.zym
-species alien
-
-Mutated Warrior
-
-Sex: Female
-Weight: 57 kg
-Age: 16
\ No newline at end of file
diff --git a/models/player/gak.iqm b/models/player/gak.iqm
new file mode 100644 (file)
index 0000000..22a1975
Binary files /dev/null and b/models/player/gak.iqm differ
diff --git a/models/player/gak.iqm.framegroups b/models/player/gak.iqm.framegroups
new file mode 100644 (file)
index 0000000..71128c6
--- /dev/null
@@ -0,0 +1,23 @@
+0 36 15.000000 0 // dieone
+36 20 15.000000 0 // dietwo
+56 15 15.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 1 // 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
diff --git a/models/player/gak.iqm_0.tga b/models/player/gak.iqm_0.tga
new file mode 100644 (file)
index 0000000..093b7f0
Binary files /dev/null and b/models/player/gak.iqm_0.tga differ
diff --git a/models/player/gak.iqm_0.txt b/models/player/gak.iqm_0.txt
new file mode 100644 (file)
index 0000000..8aa7419
--- /dev/null
@@ -0,0 +1,7 @@
+name Gak
+species alien
+sex Male
+weight 85
+age 16
+
+Lightweight Xonotic Solider
diff --git a/models/player/gakarmored.iqm b/models/player/gakarmored.iqm
new file mode 100644 (file)
index 0000000..9df6bdb
Binary files /dev/null and b/models/player/gakarmored.iqm differ
diff --git a/models/player/gakarmored.iqm.framegroups b/models/player/gakarmored.iqm.framegroups
new file mode 100644 (file)
index 0000000..71128c6
--- /dev/null
@@ -0,0 +1,23 @@
+0 36 15.000000 0 // dieone
+36 20 15.000000 0 // dietwo
+56 15 15.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 1 // 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
diff --git a/models/player/gakarmored.iqm_0.tga b/models/player/gakarmored.iqm_0.tga
new file mode 100644 (file)
index 0000000..b4a58ea
Binary files /dev/null and b/models/player/gakarmored.iqm_0.tga differ
diff --git a/models/player/gakarmored.iqm_0.txt b/models/player/gakarmored.iqm_0.txt
new file mode 100644 (file)
index 0000000..06ff355
--- /dev/null
@@ -0,0 +1,7 @@
+name Gak Armored
+species alien
+sex Male
+weight 90
+age 20
+
+Heavyweight Xonotic Solider
diff --git a/models/player/gakmasked.iqm b/models/player/gakmasked.iqm
new file mode 100644 (file)
index 0000000..275953d
Binary files /dev/null and b/models/player/gakmasked.iqm differ
diff --git a/models/player/gakmasked.iqm.framegroups b/models/player/gakmasked.iqm.framegroups
new file mode 100644 (file)
index 0000000..71128c6
--- /dev/null
@@ -0,0 +1,23 @@
+0 36 15.000000 0 // dieone
+36 20 15.000000 0 // dietwo
+56 15 15.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 1 // 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
diff --git a/models/player/gakmasked.iqm_0.tga b/models/player/gakmasked.iqm_0.tga
new file mode 100644 (file)
index 0000000..40d2958
Binary files /dev/null and b/models/player/gakmasked.iqm_0.tga differ
diff --git a/models/player/gakmasked.iqm_0.txt b/models/player/gakmasked.iqm_0.txt
new file mode 100644 (file)
index 0000000..aff4f75
--- /dev/null
@@ -0,0 +1,7 @@
+name Gak Masked
+species alien
+sex Male
+weight 87
+age 18
+
+Mediumweight Xonotic Solider
diff --git a/models/player/grunt.tga b/models/player/grunt.tga
deleted file mode 100644 (file)
index 0a4d020..0000000
Binary files a/models/player/grunt.tga and /dev/null differ
diff --git a/models/player/grunt.txt b/models/player/grunt.txt
deleted file mode 100644 (file)
index f780717..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-Grunt
-models/player/grunt
-0
-models/player/grunt.zym
-species robot_solid
-
-Half Mechanical 
-Human Fighter
-
-Sex: Male
-Weight: 170 kg
-Age: 53
diff --git a/models/player/grunt.zym b/models/player/grunt.zym
deleted file mode 100644 (file)
index 4af40df..0000000
Binary files a/models/player/grunt.zym and /dev/null differ
diff --git a/models/player/grunt.zym.sounds b/models/player/grunt.zym.sounds
deleted file mode 100644 (file)
index b691675..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-//TAG: carni-lycan
-//affirmative sound/player/carni-lycan/player/affirmative 0
-attack sound/player/carni-lycan/coms/attack 0
-//attacking sound/player/carni-lycan/player/attacking 0
-attackinfive sound/player/carni-lycan/coms/attackinfive 0
-coverme sound/player/carni-lycan/coms/coverme 0
-defend sound/player/carni-lycan/coms/defend 0
-//defending sound/player/carni-lycan/player/defending 0
-//droppedflag sound/player/carni-lycan/player/droppedflag 0
-//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/carni-lycan/coms/freelance 2
-//getflag sound/player/carni-lycan/player/getflag 0
-incoming sound/player/carni-lycan/coms/incoming 0
-meet sound/player/carni-lycan/coms/meet 0
-needhelp sound/player/carni-lycan/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/carni-lycan/coms/seenflag 0
-taunt sound/player/carni-lycan/coms/taunt 3
-teamshoot sound/player/carni-lycan/coms/teamshoot 3
-death sound/player/carni-lycan/player/death 3
-drown sound/player/carni-lycan/player/drown 0
-//fall sound/player/carni-lycan/player/fall 0
-falling sound/player/carni-lycan/player/falling 0
-gasp sound/player/carni-lycan/player/gasp 0
-jump sound/player/carni-lycan/player/jump 0
-pain25 sound/player/carni-lycan/player/pain25 0
-pain50 sound/player/carni-lycan/player/pain50 0
-pain75 sound/player/carni-lycan/player/pain75 0
-pain100 sound/player/carni-lycan/player/pain100 0
diff --git a/models/player/grunt.zym_0.skin b/models/player/grunt.zym_0.skin
deleted file mode 100644 (file)
index 674cbf0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-grunt,grunt
\ No newline at end of file
diff --git a/models/player/grunt_lod1.zym b/models/player/grunt_lod1.zym
deleted file mode 100644 (file)
index 48faed7..0000000
Binary files a/models/player/grunt_lod1.zym and /dev/null differ
diff --git a/models/player/grunt_lod1.zym_0.skin b/models/player/grunt_lod1.zym_0.skin
deleted file mode 100644 (file)
index 674cbf0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-grunt,grunt
\ No newline at end of file
diff --git a/models/player/grunt_lod2.zym b/models/player/grunt_lod2.zym
deleted file mode 100644 (file)
index 96a0ee9..0000000
Binary files a/models/player/grunt_lod2.zym and /dev/null differ
diff --git a/models/player/grunt_lod2.zym_0.skin b/models/player/grunt_lod2.zym_0.skin
deleted file mode 100644 (file)
index 674cbf0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-grunt,grunt
\ No newline at end of file
diff --git a/models/player/headhunter.tga b/models/player/headhunter.tga
deleted file mode 100644 (file)
index 1ae9249..0000000
Binary files a/models/player/headhunter.tga and /dev/null differ
diff --git a/models/player/headhunter.txt b/models/player/headhunter.txt
deleted file mode 100644 (file)
index 569dc20..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Headhunter
-models/player/headhunter
-0
-models/player/headhunter.zym
-species alien
-
-Mutated Warrior
-
-Sex: Male
-Weight: 115 kg
-Age: 34
\ No newline at end of file
diff --git a/models/player/headhunter.zym b/models/player/headhunter.zym
deleted file mode 100644 (file)
index 16c8327..0000000
Binary files a/models/player/headhunter.zym and /dev/null differ
diff --git a/models/player/headhunter.zym.sounds b/models/player/headhunter.zym.sounds
deleted file mode 100644 (file)
index b691675..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-//TAG: carni-lycan
-//affirmative sound/player/carni-lycan/player/affirmative 0
-attack sound/player/carni-lycan/coms/attack 0
-//attacking sound/player/carni-lycan/player/attacking 0
-attackinfive sound/player/carni-lycan/coms/attackinfive 0
-coverme sound/player/carni-lycan/coms/coverme 0
-defend sound/player/carni-lycan/coms/defend 0
-//defending sound/player/carni-lycan/player/defending 0
-//droppedflag sound/player/carni-lycan/player/droppedflag 0
-//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/carni-lycan/coms/freelance 2
-//getflag sound/player/carni-lycan/player/getflag 0
-incoming sound/player/carni-lycan/coms/incoming 0
-meet sound/player/carni-lycan/coms/meet 0
-needhelp sound/player/carni-lycan/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/carni-lycan/coms/seenflag 0
-taunt sound/player/carni-lycan/coms/taunt 3
-teamshoot sound/player/carni-lycan/coms/teamshoot 3
-death sound/player/carni-lycan/player/death 3
-drown sound/player/carni-lycan/player/drown 0
-//fall sound/player/carni-lycan/player/fall 0
-falling sound/player/carni-lycan/player/falling 0
-gasp sound/player/carni-lycan/player/gasp 0
-jump sound/player/carni-lycan/player/jump 0
-pain25 sound/player/carni-lycan/player/pain25 0
-pain50 sound/player/carni-lycan/player/pain50 0
-pain75 sound/player/carni-lycan/player/pain75 0
-pain100 sound/player/carni-lycan/player/pain100 0
diff --git a/models/player/headhunter.zym_0.skin b/models/player/headhunter.zym_0.skin
deleted file mode 100644 (file)
index 26e9b75..0000000
+++ /dev/null
@@ -1 +0,0 @@
-headhunter,headhunter
\ No newline at end of file
diff --git a/models/player/headhunter_lod1.zym b/models/player/headhunter_lod1.zym
deleted file mode 100644 (file)
index 976ffed..0000000
Binary files a/models/player/headhunter_lod1.zym and /dev/null differ
diff --git a/models/player/headhunter_lod1.zym_0.skin b/models/player/headhunter_lod1.zym_0.skin
deleted file mode 100644 (file)
index 26e9b75..0000000
+++ /dev/null
@@ -1 +0,0 @@
-headhunter,headhunter
\ No newline at end of file
diff --git a/models/player/headhunter_lod2.zym b/models/player/headhunter_lod2.zym
deleted file mode 100644 (file)
index 1d76f61..0000000
Binary files a/models/player/headhunter_lod2.zym and /dev/null differ
diff --git a/models/player/headhunter_lod2.zym_0.skin b/models/player/headhunter_lod2.zym_0.skin
deleted file mode 100644 (file)
index 26e9b75..0000000
+++ /dev/null
@@ -1 +0,0 @@
-headhunter,headhunter
\ No newline at end of file
diff --git a/models/player/heroine.tga b/models/player/heroine.tga
deleted file mode 100644 (file)
index e2621fb..0000000
Binary files a/models/player/heroine.tga and /dev/null differ
diff --git a/models/player/heroine.txt b/models/player/heroine.txt
deleted file mode 100644 (file)
index 2b7394f..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Heroine
-models/player/heroine
-1
-models/player/jeandarc.zym
-species human
-
-Solo Fighter
-
-Sex: Female
-Weight: 50 kg
-Age: 23
\ No newline at end of file
diff --git a/models/player/ignis.iqm b/models/player/ignis.iqm
new file mode 100644 (file)
index 0000000..aefdc83
Binary files /dev/null and b/models/player/ignis.iqm differ
diff --git a/models/player/ignis.iqm.framegroups b/models/player/ignis.iqm.framegroups
new file mode 100644 (file)
index 0000000..71128c6
--- /dev/null
@@ -0,0 +1,23 @@
+0 36 15.000000 0 // dieone
+36 20 15.000000 0 // dietwo
+56 15 15.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 1 // 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
diff --git a/models/player/ignis.iqm_0.tga b/models/player/ignis.iqm_0.tga
new file mode 100644 (file)
index 0000000..177b4a6
Binary files /dev/null and b/models/player/ignis.iqm_0.tga differ
diff --git a/models/player/ignis.iqm_0.txt b/models/player/ignis.iqm_0.txt
new file mode 100644 (file)
index 0000000..7597e41
--- /dev/null
@@ -0,0 +1,7 @@
+name Ignis
+species human
+sex Male
+weight 88
+age 31
+
+Heavyweight Xonotic Solider
diff --git a/models/player/ignishalfmasked.iqm b/models/player/ignishalfmasked.iqm
new file mode 100644 (file)
index 0000000..017485a
Binary files /dev/null and b/models/player/ignishalfmasked.iqm differ
diff --git a/models/player/ignishalfmasked.iqm.framegroups b/models/player/ignishalfmasked.iqm.framegroups
new file mode 100644 (file)
index 0000000..71128c6
--- /dev/null
@@ -0,0 +1,23 @@
+0 36 15.000000 0 // dieone
+36 20 15.000000 0 // dietwo
+56 15 15.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 1 // 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
diff --git a/models/player/ignishalfmasked.iqm_0.tga b/models/player/ignishalfmasked.iqm_0.tga
new file mode 100644 (file)
index 0000000..f1aecb2
Binary files /dev/null and b/models/player/ignishalfmasked.iqm_0.tga differ
diff --git a/models/player/ignishalfmasked.iqm_0.txt b/models/player/ignishalfmasked.iqm_0.txt
new file mode 100644 (file)
index 0000000..39c488c
--- /dev/null
@@ -0,0 +1,7 @@
+name Ignis - HalfMasked
+species human
+sex Male
+weight 90
+age 31
+
+Heavyweight Xonotic Solider
diff --git a/models/player/ignishalfmasked_lod1.iqm b/models/player/ignishalfmasked_lod1.iqm
new file mode 100644 (file)
index 0000000..c3b3fa4
Binary files /dev/null and b/models/player/ignishalfmasked_lod1.iqm differ
diff --git a/models/player/ignishalfmasked_lod2.iqm b/models/player/ignishalfmasked_lod2.iqm
new file mode 100644 (file)
index 0000000..3ad25e9
Binary files /dev/null and b/models/player/ignishalfmasked_lod2.iqm differ
diff --git a/models/player/ignismasked.iqm b/models/player/ignismasked.iqm
new file mode 100644 (file)
index 0000000..df34e30
Binary files /dev/null and b/models/player/ignismasked.iqm differ
diff --git a/models/player/ignismasked.iqm.framegroups b/models/player/ignismasked.iqm.framegroups
new file mode 100644 (file)
index 0000000..71128c6
--- /dev/null
@@ -0,0 +1,23 @@
+0 36 15.000000 0 // dieone
+36 20 15.000000 0 // dietwo
+56 15 15.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 1 // 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
diff --git a/models/player/ignismasked.iqm_0.tga b/models/player/ignismasked.iqm_0.tga
new file mode 100644 (file)
index 0000000..8e22e63
Binary files /dev/null and b/models/player/ignismasked.iqm_0.tga differ
diff --git a/models/player/ignismasked.iqm_0.txt b/models/player/ignismasked.iqm_0.txt
new file mode 100644 (file)
index 0000000..d1c8566
--- /dev/null
@@ -0,0 +1,7 @@
+name Ignis - Masked
+species human
+sex Male
+weight 92
+age 31
+
+Heavyweight Xonotic Solider
diff --git a/models/player/insurrectionist.tga b/models/player/insurrectionist.tga
deleted file mode 100644 (file)
index e6bc1e8..0000000
Binary files a/models/player/insurrectionist.tga and /dev/null differ
diff --git a/models/player/insurrectionist.txt b/models/player/insurrectionist.txt
deleted file mode 100644 (file)
index 01b074d..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Insurrectionist
-models/player/insurrectionist
-0
-models/player/insurrectionist.zym
-species human
-
-Warrior
-
-Sex: Male
-Weight: 87 kg
-Age: 56
\ No newline at end of file
diff --git a/models/player/insurrectionist.zym b/models/player/insurrectionist.zym
deleted file mode 100644 (file)
index 33eef14..0000000
Binary files a/models/player/insurrectionist.zym and /dev/null differ
diff --git a/models/player/insurrectionist.zym.sounds b/models/player/insurrectionist.zym.sounds
deleted file mode 100644 (file)
index 24888d6..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-//TAG: insurrectionist
-//affirmative sound/player/carni-lycan/player/affirmative 0
-attack sound/player/insurrectionist/coms/attack 0
-//attacking sound/player/carni-lycan/player/attacking 0
-attackinfive sound/player/insurrectionist/coms/attackinfive 0
-coverme sound/player/insurrectionist/coms/coverme 0
-defend sound/player/insurrectionist/coms/defend 0
-//defending sound/player/carni-lycan/player/defending 0
-//droppedflag sound/player/carni-lycan/player/droppedflag 0
-//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/insurrectionist/coms/freelance 2
-//getflag sound/player/carni-lycan/player/getflag 0
-incoming sound/player/insurrectionist/coms/incoming 0
-meet sound/player/insurrectionist/coms/meet 0
-needhelp sound/player/insurrectionist/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/insurrectionist/coms/seenflag 0
-taunt sound/player/insurrectionist/coms/taunt 4
-teamshoot sound/player/insurrectionist/coms/teamshoot 3
-death sound/player/insurrectionist/player/death 3
-drown sound/player/insurrectionist/player/drown 0
-//fall sound/player/carni-lycan/player/fall 0
-falling sound/player/insurrectionist/player/falling 0
-gasp sound/player/insurrectionist/player/gasp 0
-jump sound/player/insurrectionist/player/jump 0
-pain25 sound/player/insurrectionist/player/pain25 0
-pain50 sound/player/insurrectionist/player/pain50 0
-pain75 sound/player/insurrectionist/player/pain75 0
-pain100 sound/player/insurrectionist/player/pain100 0
diff --git a/models/player/insurrectionist.zym_0.skin b/models/player/insurrectionist.zym_0.skin
deleted file mode 100644 (file)
index 6536875..0000000
+++ /dev/null
@@ -1 +0,0 @@
-insurrectionist,insurrectionist
\ No newline at end of file
diff --git a/models/player/insurrectionist_lod1.zym b/models/player/insurrectionist_lod1.zym
deleted file mode 100644 (file)
index 624cfa8..0000000
Binary files a/models/player/insurrectionist_lod1.zym and /dev/null differ
diff --git a/models/player/insurrectionist_lod1.zym_0.skin b/models/player/insurrectionist_lod1.zym_0.skin
deleted file mode 100644 (file)
index 6536875..0000000
+++ /dev/null
@@ -1 +0,0 @@
-insurrectionist,insurrectionist
\ No newline at end of file
diff --git a/models/player/insurrectionist_lod2.zym b/models/player/insurrectionist_lod2.zym
deleted file mode 100644 (file)
index 9363cb7..0000000
Binary files a/models/player/insurrectionist_lod2.zym and /dev/null differ
diff --git a/models/player/insurrectionist_lod2.zym_0.skin b/models/player/insurrectionist_lod2.zym_0.skin
deleted file mode 100644 (file)
index 6536875..0000000
+++ /dev/null
@@ -1 +0,0 @@
-insurrectionist,insurrectionist
\ No newline at end of file
diff --git a/models/player/jeandarc.zym b/models/player/jeandarc.zym
deleted file mode 100644 (file)
index b6493df..0000000
Binary files a/models/player/jeandarc.zym and /dev/null differ
diff --git a/models/player/jeandarc.zym_0.skin b/models/player/jeandarc.zym_0.skin
deleted file mode 100644 (file)
index 7d3f664..0000000
+++ /dev/null
@@ -1 +0,0 @@
-jeandarc1,heroine
diff --git a/models/player/jeandarc_lod1.zym b/models/player/jeandarc_lod1.zym
deleted file mode 100644 (file)
index b9d878b..0000000
Binary files a/models/player/jeandarc_lod1.zym and /dev/null differ
diff --git a/models/player/jeandarc_lod1.zym_0.skin b/models/player/jeandarc_lod1.zym_0.skin
deleted file mode 100644 (file)
index 7d3f664..0000000
+++ /dev/null
@@ -1 +0,0 @@
-jeandarc1,heroine
diff --git a/models/player/jeandarc_lod2.zym b/models/player/jeandarc_lod2.zym
deleted file mode 100644 (file)
index 9a02d3f..0000000
Binary files a/models/player/jeandarc_lod2.zym and /dev/null differ
diff --git a/models/player/jeandarc_lod2.zym_0.skin b/models/player/jeandarc_lod2.zym_0.skin
deleted file mode 100644 (file)
index 7d3f664..0000000
+++ /dev/null
@@ -1 +0,0 @@
-jeandarc1,heroine
diff --git a/models/player/lurk.tga b/models/player/lurk.tga
deleted file mode 100644 (file)
index 1ac6fe1..0000000
Binary files a/models/player/lurk.tga and /dev/null differ
diff --git a/models/player/lurk.txt b/models/player/lurk.txt
deleted file mode 100644 (file)
index ebf5e84..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-Lurk
-models/player/lurk
-0
-models/player/lurk.zym
-species alien
-
-Reptilian Combatant
-
-Weight: 84 kg
-Age: 47
\ No newline at end of file
diff --git a/models/player/lurk.zym b/models/player/lurk.zym
deleted file mode 100644 (file)
index 7d1dec8..0000000
Binary files a/models/player/lurk.zym and /dev/null differ
diff --git a/models/player/lurk.zym.sounds b/models/player/lurk.zym.sounds
deleted file mode 100644 (file)
index cc46b5b..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-//TAG: reptilian
-//affirmative sound/player/carni-lycan/player/affirmative 0
-attack sound/player/reptilian/coms/attack 0
-//attacking sound/player/carni-lycan/player/attacking 0
-attackinfive sound/player/reptilian/coms/attackinfive 0
-coverme sound/player/reptilian/coms/coverme 0
-defend sound/player/reptilian/coms/defend 0
-//defending sound/player/carni-lycan/player/defending 0
-//droppedflag sound/player/carni-lycan/player/droppedflag 0
-//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/reptilian/coms/freelance 2
-//getflag sound/player/carni-lycan/player/getflag 0
-incoming sound/player/reptilian/coms/incoming 0
-meet sound/player/reptilian/coms/meet 0
-needhelp sound/player/reptilian/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/reptilian/coms/seenflag 0
-taunt sound/player/reptilian/coms/taunt 3
-teamshoot sound/player/reptilian/coms/teamshoot 3
-death sound/player/reptilian/player/death 3
-drown sound/player/reptilian/player/drown 0
-//fall sound/player/carni-lycan/player/fall 0
-falling sound/player/reptilian/player/falling 0
-gasp sound/player/reptilian/player/gasp 0
-jump sound/player/reptilian/player/jump 0
-pain25 sound/player/reptilian/player/pain25 0
-pain50 sound/player/reptilian/player/pain50 0
-pain75 sound/player/reptilian/player/pain75 0
-pain100 sound/player/reptilian/player/pain100 0
diff --git a/models/player/lurk.zym_0.skin b/models/player/lurk.zym_0.skin
deleted file mode 100644 (file)
index eb9261f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-lurk,lurk
\ No newline at end of file
diff --git a/models/player/lurk.zym_1.skin b/models/player/lurk.zym_1.skin
deleted file mode 100644 (file)
index 0719e78..0000000
+++ /dev/null
@@ -1 +0,0 @@
-lurk,reptile
\ No newline at end of file
diff --git a/models/player/lurk_lod1.zym b/models/player/lurk_lod1.zym
deleted file mode 100644 (file)
index f7520b2..0000000
Binary files a/models/player/lurk_lod1.zym and /dev/null differ
diff --git a/models/player/lurk_lod1.zym_0.skin b/models/player/lurk_lod1.zym_0.skin
deleted file mode 100644 (file)
index eb9261f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-lurk,lurk
\ No newline at end of file
diff --git a/models/player/lurk_lod1.zym_1.skin b/models/player/lurk_lod1.zym_1.skin
deleted file mode 100644 (file)
index 0719e78..0000000
+++ /dev/null
@@ -1 +0,0 @@
-lurk,reptile
\ No newline at end of file
diff --git a/models/player/lurk_lod2.zym b/models/player/lurk_lod2.zym
deleted file mode 100644 (file)
index cb13808..0000000
Binary files a/models/player/lurk_lod2.zym and /dev/null differ
diff --git a/models/player/lurk_lod2.zym_0.skin b/models/player/lurk_lod2.zym_0.skin
deleted file mode 100644 (file)
index eb9261f..0000000
+++ /dev/null
@@ -1 +0,0 @@
-lurk,lurk
\ No newline at end of file
diff --git a/models/player/lurk_lod2.zym_1.skin b/models/player/lurk_lod2.zym_1.skin
deleted file mode 100644 (file)
index 0719e78..0000000
+++ /dev/null
@@ -1 +0,0 @@
-lurk,reptile
\ No newline at end of file
diff --git a/models/player/lycanthrope.tga b/models/player/lycanthrope.tga
deleted file mode 100644 (file)
index d212e4d..0000000
Binary files a/models/player/lycanthrope.tga and /dev/null differ
diff --git a/models/player/lycanthrope.txt b/models/player/lycanthrope.txt
deleted file mode 100644 (file)
index d7795ca..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Lycanthrope
-models/player/lycanthrope
-0
-models/player/lycanthrope.zym
-species human
-
-Monsterous Opponent
-
-Sex: Female
-Weight: 106 kg
-Age: 24
\ No newline at end of file
diff --git a/models/player/lycanthrope.zym b/models/player/lycanthrope.zym
deleted file mode 100644 (file)
index ba84061..0000000
Binary files a/models/player/lycanthrope.zym and /dev/null differ
diff --git a/models/player/lycanthrope.zym.sounds b/models/player/lycanthrope.zym.sounds
deleted file mode 100644 (file)
index b691675..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-//TAG: carni-lycan
-//affirmative sound/player/carni-lycan/player/affirmative 0
-attack sound/player/carni-lycan/coms/attack 0
-//attacking sound/player/carni-lycan/player/attacking 0
-attackinfive sound/player/carni-lycan/coms/attackinfive 0
-coverme sound/player/carni-lycan/coms/coverme 0
-defend sound/player/carni-lycan/coms/defend 0
-//defending sound/player/carni-lycan/player/defending 0
-//droppedflag sound/player/carni-lycan/player/droppedflag 0
-//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/carni-lycan/coms/freelance 2
-//getflag sound/player/carni-lycan/player/getflag 0
-incoming sound/player/carni-lycan/coms/incoming 0
-meet sound/player/carni-lycan/coms/meet 0
-needhelp sound/player/carni-lycan/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/carni-lycan/coms/seenflag 0
-taunt sound/player/carni-lycan/coms/taunt 3
-teamshoot sound/player/carni-lycan/coms/teamshoot 3
-death sound/player/carni-lycan/player/death 3
-drown sound/player/carni-lycan/player/drown 0
-//fall sound/player/carni-lycan/player/fall 0
-falling sound/player/carni-lycan/player/falling 0
-gasp sound/player/carni-lycan/player/gasp 0
-jump sound/player/carni-lycan/player/jump 0
-pain25 sound/player/carni-lycan/player/pain25 0
-pain50 sound/player/carni-lycan/player/pain50 0
-pain75 sound/player/carni-lycan/player/pain75 0
-pain100 sound/player/carni-lycan/player/pain100 0
diff --git a/models/player/lycanthrope.zym_0.skin b/models/player/lycanthrope.zym_0.skin
deleted file mode 100644 (file)
index 51e6c50..0000000
+++ /dev/null
@@ -1 +0,0 @@
-lycanthrope1,lycanthrope
diff --git a/models/player/lycanthrope_lod1.zym b/models/player/lycanthrope_lod1.zym
deleted file mode 100644 (file)
index d4b6241..0000000
Binary files a/models/player/lycanthrope_lod1.zym and /dev/null differ
diff --git a/models/player/lycanthrope_lod1.zym_0.skin b/models/player/lycanthrope_lod1.zym_0.skin
deleted file mode 100644 (file)
index 51e6c50..0000000
+++ /dev/null
@@ -1 +0,0 @@
-lycanthrope1,lycanthrope
diff --git a/models/player/lycanthrope_lod2.zym b/models/player/lycanthrope_lod2.zym
deleted file mode 100644 (file)
index 268c535..0000000
Binary files a/models/player/lycanthrope_lod2.zym and /dev/null differ
diff --git a/models/player/lycanthrope_lod2.zym_0.skin b/models/player/lycanthrope_lod2.zym_0.skin
deleted file mode 100644 (file)
index 51e6c50..0000000
+++ /dev/null
@@ -1 +0,0 @@
-lycanthrope1,lycanthrope
diff --git a/models/player/marine.tga b/models/player/marine.tga
deleted file mode 100644 (file)
index e75e1c6..0000000
Binary files a/models/player/marine.tga and /dev/null differ
diff --git a/models/player/marine.txt b/models/player/marine.txt
deleted file mode 100644 (file)
index 4a6d6f8..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Marine
-models/player/marine
-0
-models/player/marine.zym
-species human
-
-Service Man
-
-Sex: Male
-Weight: 93 kg
-Age: 35
\ No newline at end of file
diff --git a/models/player/marine.zym b/models/player/marine.zym
deleted file mode 100644 (file)
index 1615af4..0000000
Binary files a/models/player/marine.zym and /dev/null differ
diff --git a/models/player/marine.zym.sounds b/models/player/marine.zym.sounds
deleted file mode 100644 (file)
index e868802..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-//TAG: marine
-//affirmative sound/player/carni-lycan/player/affirmative 0
-attack sound/player/marine/coms/attack 0
-//attacking sound/player/carni-lycan/player/attacking 0
-attackinfive sound/player/marine/coms/attackinfive 0
-coverme sound/player/marine/coms/coverme 0
-defend sound/player/marine/coms/defend 0
-//defending sound/player/carni-lycan/player/defending 0
-//droppedflag sound/player/carni-lycan/player/droppedflag 0
-//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/marine/coms/freelance 2
-//getflag sound/player/carni-lycan/player/getflag 0
-incoming sound/player/marine/coms/incoming 0
-meet sound/player/marine/coms/meet 0
-needhelp sound/player/marine/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/marine/coms/seenflag 0
-taunt sound/player/marine/coms/taunt 3
-teamshoot sound/player/marine/coms/teamshoot 4
-death sound/player/marine/player/death 3
-drown sound/player/marine/player/drown 0
-//fall sound/player/carni-lycan/player/fall 0
-falling sound/player/marine/player/fall 1
-gasp sound/player/marine/player/gasp 0
-jump sound/player/marine/player/jump 0
-pain25 sound/player/marine/player/pain25 0
-pain50 sound/player/marine/player/pain50 0
-pain75 sound/player/marine/player/pain75 0
-pain100 sound/player/marine/player/pain100 0
diff --git a/models/player/marine.zym_0.skin b/models/player/marine.zym_0.skin
deleted file mode 100644 (file)
index 936a454..0000000
+++ /dev/null
@@ -1 +0,0 @@
-marine,marine
\ No newline at end of file
diff --git a/models/player/marine_lod1.zym b/models/player/marine_lod1.zym
deleted file mode 100644 (file)
index 38c687a..0000000
Binary files a/models/player/marine_lod1.zym and /dev/null differ
diff --git a/models/player/marine_lod1.zym_0.skin b/models/player/marine_lod1.zym_0.skin
deleted file mode 100644 (file)
index 936a454..0000000
+++ /dev/null
@@ -1 +0,0 @@
-marine,marine
\ No newline at end of file
diff --git a/models/player/marine_lod2.zym b/models/player/marine_lod2.zym
deleted file mode 100644 (file)
index b70070c..0000000
Binary files a/models/player/marine_lod2.zym and /dev/null differ
diff --git a/models/player/marine_lod2.zym_0.skin b/models/player/marine_lod2.zym_0.skin
deleted file mode 100644 (file)
index 936a454..0000000
+++ /dev/null
@@ -1 +0,0 @@
-marine,marine
\ No newline at end of file
diff --git a/models/player/mulder.tga b/models/player/mulder.tga
deleted file mode 100644 (file)
index b0e8112..0000000
Binary files a/models/player/mulder.tga and /dev/null differ
diff --git a/models/player/mulder.txt b/models/player/mulder.txt
deleted file mode 100644 (file)
index 9a4cb8f..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-Mulder
-models/player/mulder
-1
-models/player/nexus.zym
-species robot_solid
-
-Nexuiz's Soldier
-
-Weight: 282 kg
-Age: 313
diff --git a/models/player/nexus.tga b/models/player/nexus.tga
deleted file mode 100644 (file)
index fb915b6..0000000
Binary files a/models/player/nexus.tga and /dev/null differ
diff --git a/models/player/nexus.txt b/models/player/nexus.txt
deleted file mode 100644 (file)
index ffc0431..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-Nexus
-models/player/nexus
-0
-models/player/nexus.zym
-species human
-
-Nexuiz's Soldier
-
-Weight: 282 kg
-Age: 313
\ No newline at end of file
diff --git a/models/player/nexus.zym b/models/player/nexus.zym
deleted file mode 100644 (file)
index 7843d43..0000000
Binary files a/models/player/nexus.zym and /dev/null differ
diff --git a/models/player/nexus.zym.sounds b/models/player/nexus.zym.sounds
deleted file mode 100644 (file)
index dd7be39..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/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/soldier/coms/freelance 2
-//getflag sound/player/carni-lycan/player/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/carni-lycan/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/nexus.zym_0.skin b/models/player/nexus.zym_0.skin
deleted file mode 100644 (file)
index bccc864..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,nexus
\ No newline at end of file
diff --git a/models/player/nexus.zym_1.skin b/models/player/nexus.zym_1.skin
deleted file mode 100644 (file)
index ac518a7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,mulder
diff --git a/models/player/nexus.zym_2.skin b/models/player/nexus.zym_2.skin
deleted file mode 100644 (file)
index d9ec837..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,nexus
diff --git a/models/player/nexus.zym_3.skin b/models/player/nexus.zym_3.skin
deleted file mode 100644 (file)
index b045534..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,fbgreen
diff --git a/models/player/nexus.zym_4.skin b/models/player/nexus.zym_4.skin
deleted file mode 100644 (file)
index 4ac978e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,fbred
diff --git a/models/player/nexus.zym_5.skin b/models/player/nexus.zym_5.skin
deleted file mode 100644 (file)
index 4291728..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,fborange
diff --git a/models/player/nexus.zym_6.skin b/models/player/nexus.zym_6.skin
deleted file mode 100644 (file)
index 4bc8a44..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,fbcolored
diff --git a/models/player/nexus_lod1.zym b/models/player/nexus_lod1.zym
deleted file mode 100644 (file)
index c88108f..0000000
Binary files a/models/player/nexus_lod1.zym and /dev/null differ
diff --git a/models/player/nexus_lod1.zym_0.skin b/models/player/nexus_lod1.zym_0.skin
deleted file mode 100644 (file)
index bccc864..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,nexus
\ No newline at end of file
diff --git a/models/player/nexus_lod1.zym_1.skin b/models/player/nexus_lod1.zym_1.skin
deleted file mode 100644 (file)
index ac518a7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,mulder
diff --git a/models/player/nexus_lod1.zym_2.skin b/models/player/nexus_lod1.zym_2.skin
deleted file mode 100644 (file)
index 92d8498..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,xolar
diff --git a/models/player/nexus_lod1.zym_3.skin b/models/player/nexus_lod1.zym_3.skin
deleted file mode 100644 (file)
index b045534..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,fbgreen
diff --git a/models/player/nexus_lod1.zym_4.skin b/models/player/nexus_lod1.zym_4.skin
deleted file mode 100644 (file)
index 4ac978e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,fbred
diff --git a/models/player/nexus_lod1.zym_5.skin b/models/player/nexus_lod1.zym_5.skin
deleted file mode 100644 (file)
index 4291728..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,fborange
diff --git a/models/player/nexus_lod1.zym_6.skin b/models/player/nexus_lod1.zym_6.skin
deleted file mode 100644 (file)
index 4bc8a44..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,fbcolored
diff --git a/models/player/nexus_lod2.zym b/models/player/nexus_lod2.zym
deleted file mode 100644 (file)
index 7ea9b8e..0000000
Binary files a/models/player/nexus_lod2.zym and /dev/null differ
diff --git a/models/player/nexus_lod2.zym_0.skin b/models/player/nexus_lod2.zym_0.skin
deleted file mode 100644 (file)
index bccc864..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,nexus
\ No newline at end of file
diff --git a/models/player/nexus_lod2.zym_1.skin b/models/player/nexus_lod2.zym_1.skin
deleted file mode 100644 (file)
index ac518a7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,mulder
diff --git a/models/player/nexus_lod2.zym_2.skin b/models/player/nexus_lod2.zym_2.skin
deleted file mode 100644 (file)
index 92d8498..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,xolar
diff --git a/models/player/nexus_lod2.zym_3.skin b/models/player/nexus_lod2.zym_3.skin
deleted file mode 100644 (file)
index b045534..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,fbgreen
diff --git a/models/player/nexus_lod2.zym_4.skin b/models/player/nexus_lod2.zym_4.skin
deleted file mode 100644 (file)
index 4ac978e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,fbred
diff --git a/models/player/nexus_lod2.zym_5.skin b/models/player/nexus_lod2.zym_5.skin
deleted file mode 100644 (file)
index 4291728..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,fborange
diff --git a/models/player/nexus_lod2.zym_6.skin b/models/player/nexus_lod2.zym_6.skin
deleted file mode 100644 (file)
index 4bc8a44..0000000
+++ /dev/null
@@ -1 +0,0 @@
-nexus,fbcolored
diff --git a/models/player/pyria.iqm b/models/player/pyria.iqm
new file mode 100644 (file)
index 0000000..c4e7539
Binary files /dev/null and b/models/player/pyria.iqm differ
diff --git a/models/player/pyria.iqm.framegroups b/models/player/pyria.iqm.framegroups
new file mode 100644 (file)
index 0000000..b98d0b9
--- /dev/null
@@ -0,0 +1,23 @@
+0 36 20.000000 0 // dieone
+36 27 20.000000 0 // dietwo
+63 15 15.000000 1 // draw
+78 20 15.000000 1 // duck
+98 11 15.000000 1 // duckwalk
+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 1 // 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
diff --git a/models/player/pyria.iqm_0.sounds b/models/player/pyria.iqm_0.sounds
new file mode 100644 (file)
index 0000000..691c58f
--- /dev/null
@@ -0,0 +1,32 @@
+//TAG: pyria-skadi
+//affirmative sound/player/carni-lycan/player/affirmative 0
+attack sound/player/pyria-skadi/coms/attack 2
+//attacking sound/player/carni-lycan/player/attacking 0
+attackinfive sound/player/pyria-skadi/coms/attackinfive 0
+//coverme sound/player/pyria-skadi/coms/coverme 0
+//defend sound/player/pyria-skadi/coms/defend 0
+//defending sound/player/carni-lycan/player/defending 0
+//droppedflag sound/player/carni-lycan/player/droppedflag 0
+//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
+freelance sound/player/pyria-skadi/coms/freelance 2
+//getflag sound/player/carni-lycan/player/getflag 0
+//incoming sound/player/pyria-skadi/coms/incoming 0
+meet sound/player/pyria-skadi/coms/meet 0
+needhelp sound/player/pyria-skadi/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/pyria-skadi/coms/seenflag 0
+taunt sound/player/pyria-skadi/coms/taunt 5
+teamshoot sound/player/pyria-skadi/coms/teamshoot 4
+death sound/player/pyria-skadi/player/death 3
+drown sound/player/pyria-skadi/player/drown 0
+//fall sound/player/carni-lycan/player/fall 0
+falling sound/player/pyria-skadi/player/falling 0
+gasp sound/player/pyria-skadi/player/gasp 0
+jump sound/player/pyria-skadi/player/jump 0
+pain25 sound/player/pyria-skadi/player/pain25 0
+pain50 sound/player/pyria-skadi/player/pain50 0
+pain75 sound/player/pyria-skadi/player/pain75 0
+pain100 sound/player/pyria-skadi/player/pain100 0
diff --git a/models/player/pyria.iqm_0.tga b/models/player/pyria.iqm_0.tga
new file mode 100644 (file)
index 0000000..7b81093
Binary files /dev/null and b/models/player/pyria.iqm_0.tga differ
diff --git a/models/player/pyria.iqm_0.txt b/models/player/pyria.iqm_0.txt
new file mode 100644 (file)
index 0000000..2c52f60
--- /dev/null
@@ -0,0 +1,7 @@
+name Pyria
+species human
+sex Female
+weight 57
+age 53
+
+Necro Warrior
diff --git a/models/player/pyria.tga b/models/player/pyria.tga
deleted file mode 100644 (file)
index a0c9837..0000000
Binary files a/models/player/pyria.tga and /dev/null differ
diff --git a/models/player/pyria.txt b/models/player/pyria.txt
deleted file mode 100644 (file)
index c54aa30..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Pyria
-models/player/pyria
-0
-models/player/pyria.zym
-species human
-
-Necro Warrior
-
-Sex: Female
-Weight: 57 kg
-Age: 53
\ No newline at end of file
diff --git a/models/player/pyria.zym b/models/player/pyria.zym
deleted file mode 100644 (file)
index 8421422..0000000
Binary files a/models/player/pyria.zym and /dev/null differ
diff --git a/models/player/pyria.zym.sounds b/models/player/pyria.zym.sounds
deleted file mode 100644 (file)
index 691c58f..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-//TAG: pyria-skadi
-//affirmative sound/player/carni-lycan/player/affirmative 0
-attack sound/player/pyria-skadi/coms/attack 2
-//attacking sound/player/carni-lycan/player/attacking 0
-attackinfive sound/player/pyria-skadi/coms/attackinfive 0
-//coverme sound/player/pyria-skadi/coms/coverme 0
-//defend sound/player/pyria-skadi/coms/defend 0
-//defending sound/player/carni-lycan/player/defending 0
-//droppedflag sound/player/carni-lycan/player/droppedflag 0
-//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/pyria-skadi/coms/freelance 2
-//getflag sound/player/carni-lycan/player/getflag 0
-//incoming sound/player/pyria-skadi/coms/incoming 0
-meet sound/player/pyria-skadi/coms/meet 0
-needhelp sound/player/pyria-skadi/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/pyria-skadi/coms/seenflag 0
-taunt sound/player/pyria-skadi/coms/taunt 5
-teamshoot sound/player/pyria-skadi/coms/teamshoot 4
-death sound/player/pyria-skadi/player/death 3
-drown sound/player/pyria-skadi/player/drown 0
-//fall sound/player/carni-lycan/player/fall 0
-falling sound/player/pyria-skadi/player/falling 0
-gasp sound/player/pyria-skadi/player/gasp 0
-jump sound/player/pyria-skadi/player/jump 0
-pain25 sound/player/pyria-skadi/player/pain25 0
-pain50 sound/player/pyria-skadi/player/pain50 0
-pain75 sound/player/pyria-skadi/player/pain75 0
-pain100 sound/player/pyria-skadi/player/pain100 0
diff --git a/models/player/pyria.zym_0.skin b/models/player/pyria.zym_0.skin
deleted file mode 100644 (file)
index 11b3bc3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-pyria,pyria
\ No newline at end of file
diff --git a/models/player/pyria_lod1.iqm b/models/player/pyria_lod1.iqm
new file mode 100644 (file)
index 0000000..5364a05
Binary files /dev/null and b/models/player/pyria_lod1.iqm differ
diff --git a/models/player/pyria_lod1.zym b/models/player/pyria_lod1.zym
deleted file mode 100644 (file)
index b7a2925..0000000
Binary files a/models/player/pyria_lod1.zym and /dev/null differ
diff --git a/models/player/pyria_lod1.zym_0.skin b/models/player/pyria_lod1.zym_0.skin
deleted file mode 100644 (file)
index 11b3bc3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-pyria,pyria
\ No newline at end of file
diff --git a/models/player/pyria_lod2.iqm b/models/player/pyria_lod2.iqm
new file mode 100644 (file)
index 0000000..3179c71
Binary files /dev/null and b/models/player/pyria_lod2.iqm differ
diff --git a/models/player/pyria_lod2.zym b/models/player/pyria_lod2.zym
deleted file mode 100644 (file)
index 227e52b..0000000
Binary files a/models/player/pyria_lod2.zym and /dev/null differ
diff --git a/models/player/pyria_lod2.zym_0.skin b/models/player/pyria_lod2.zym_0.skin
deleted file mode 100644 (file)
index 11b3bc3..0000000
+++ /dev/null
@@ -1 +0,0 @@
-pyria,pyria
\ No newline at end of file
diff --git a/models/player/quark.tga b/models/player/quark.tga
deleted file mode 100644 (file)
index 57c655b..0000000
Binary files a/models/player/quark.tga and /dev/null differ
diff --git a/models/player/quark.txt b/models/player/quark.txt
deleted file mode 100644 (file)
index c8e4156..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-Quark
-models/player/quark
-0
-models/player/crash.zym
-species robot_shiny
-
-Robot Fighter
-
-Weight: 138 kg
-Age: 3 years
\ No newline at end of file
diff --git a/models/player/reptile.tga b/models/player/reptile.tga
deleted file mode 100644 (file)
index 0768936..0000000
Binary files a/models/player/reptile.tga and /dev/null differ
diff --git a/models/player/reptile.txt b/models/player/reptile.txt
deleted file mode 100644 (file)
index 2e8b9c6..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-Reptile
-models/player/reptile
-1
-models/player/lurk.zym
-species alien
-
-Reptilian Combatant
-
-Weight: 80 kg
-Age: 32
\ No newline at end of file
diff --git a/models/player/shock.tga b/models/player/shock.tga
deleted file mode 100644 (file)
index e296c2a..0000000
Binary files a/models/player/shock.tga and /dev/null differ
diff --git a/models/player/shock.txt b/models/player/shock.txt
deleted file mode 100644 (file)
index 6e33ca5..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Shock Trooper
-models/player/shock
-0
-models/player/shock.zym
-species human
-
-Necro Warrior
-
-Sex: Male
-Weight: 66 kg
-Age: 65
\ No newline at end of file
diff --git a/models/player/shock.zym b/models/player/shock.zym
deleted file mode 100644 (file)
index d2ef3bf..0000000
Binary files a/models/player/shock.zym and /dev/null differ
diff --git a/models/player/shock.zym.sounds b/models/player/shock.zym.sounds
deleted file mode 100644 (file)
index e868802..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-//TAG: marine
-//affirmative sound/player/carni-lycan/player/affirmative 0
-attack sound/player/marine/coms/attack 0
-//attacking sound/player/carni-lycan/player/attacking 0
-attackinfive sound/player/marine/coms/attackinfive 0
-coverme sound/player/marine/coms/coverme 0
-defend sound/player/marine/coms/defend 0
-//defending sound/player/carni-lycan/player/defending 0
-//droppedflag sound/player/carni-lycan/player/droppedflag 0
-//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/marine/coms/freelance 2
-//getflag sound/player/carni-lycan/player/getflag 0
-incoming sound/player/marine/coms/incoming 0
-meet sound/player/marine/coms/meet 0
-needhelp sound/player/marine/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/marine/coms/seenflag 0
-taunt sound/player/marine/coms/taunt 3
-teamshoot sound/player/marine/coms/teamshoot 4
-death sound/player/marine/player/death 3
-drown sound/player/marine/player/drown 0
-//fall sound/player/carni-lycan/player/fall 0
-falling sound/player/marine/player/fall 1
-gasp sound/player/marine/player/gasp 0
-jump sound/player/marine/player/jump 0
-pain25 sound/player/marine/player/pain25 0
-pain50 sound/player/marine/player/pain50 0
-pain75 sound/player/marine/player/pain75 0
-pain100 sound/player/marine/player/pain100 0
diff --git a/models/player/shock.zym_0.skin b/models/player/shock.zym_0.skin
deleted file mode 100644 (file)
index 46ed65a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-shock,shock
\ No newline at end of file
diff --git a/models/player/shock_lod1.zym b/models/player/shock_lod1.zym
deleted file mode 100644 (file)
index a6b24f9..0000000
Binary files a/models/player/shock_lod1.zym and /dev/null differ
diff --git a/models/player/shock_lod1.zym_0.skin b/models/player/shock_lod1.zym_0.skin
deleted file mode 100644 (file)
index 46ed65a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-shock,shock
\ No newline at end of file
diff --git a/models/player/shock_lod2.zym b/models/player/shock_lod2.zym
deleted file mode 100644 (file)
index f7d0433..0000000
Binary files a/models/player/shock_lod2.zym and /dev/null differ
diff --git a/models/player/shock_lod2.zym_0.skin b/models/player/shock_lod2.zym_0.skin
deleted file mode 100644 (file)
index 46ed65a..0000000
+++ /dev/null
@@ -1 +0,0 @@
-shock,shock
\ No newline at end of file
diff --git a/models/player/skadi.tga b/models/player/skadi.tga
deleted file mode 100644 (file)
index 3d4bb91..0000000
Binary files a/models/player/skadi.tga and /dev/null differ
diff --git a/models/player/skadi.txt b/models/player/skadi.txt
deleted file mode 100644 (file)
index b3111b7..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Skadi
-models/player/skadi
-0
-models/player/skadi.zym
-species human
-
-Necro Warrior
-
-Sex: Female
-Weight: 52 kg
-Age: 63
\ No newline at end of file
diff --git a/models/player/skadi.zym b/models/player/skadi.zym
deleted file mode 100644 (file)
index 8febb48..0000000
Binary files a/models/player/skadi.zym and /dev/null differ
diff --git a/models/player/skadi.zym.sounds b/models/player/skadi.zym.sounds
deleted file mode 100644 (file)
index 691c58f..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-//TAG: pyria-skadi
-//affirmative sound/player/carni-lycan/player/affirmative 0
-attack sound/player/pyria-skadi/coms/attack 2
-//attacking sound/player/carni-lycan/player/attacking 0
-attackinfive sound/player/pyria-skadi/coms/attackinfive 0
-//coverme sound/player/pyria-skadi/coms/coverme 0
-//defend sound/player/pyria-skadi/coms/defend 0
-//defending sound/player/carni-lycan/player/defending 0
-//droppedflag sound/player/carni-lycan/player/droppedflag 0
-//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/pyria-skadi/coms/freelance 2
-//getflag sound/player/carni-lycan/player/getflag 0
-//incoming sound/player/pyria-skadi/coms/incoming 0
-meet sound/player/pyria-skadi/coms/meet 0
-needhelp sound/player/pyria-skadi/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/pyria-skadi/coms/seenflag 0
-taunt sound/player/pyria-skadi/coms/taunt 5
-teamshoot sound/player/pyria-skadi/coms/teamshoot 4
-death sound/player/pyria-skadi/player/death 3
-drown sound/player/pyria-skadi/player/drown 0
-//fall sound/player/carni-lycan/player/fall 0
-falling sound/player/pyria-skadi/player/falling 0
-gasp sound/player/pyria-skadi/player/gasp 0
-jump sound/player/pyria-skadi/player/jump 0
-pain25 sound/player/pyria-skadi/player/pain25 0
-pain50 sound/player/pyria-skadi/player/pain50 0
-pain75 sound/player/pyria-skadi/player/pain75 0
-pain100 sound/player/pyria-skadi/player/pain100 0
diff --git a/models/player/skadi.zym_0.skin b/models/player/skadi.zym_0.skin
deleted file mode 100644 (file)
index 120285d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-femaleshock,skadi
\ No newline at end of file
diff --git a/models/player/skadi_lod1.zym b/models/player/skadi_lod1.zym
deleted file mode 100644 (file)
index 5e16140..0000000
Binary files a/models/player/skadi_lod1.zym and /dev/null differ
diff --git a/models/player/skadi_lod1.zym_0.skin b/models/player/skadi_lod1.zym_0.skin
deleted file mode 100644 (file)
index 120285d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-femaleshock,skadi
\ No newline at end of file
diff --git a/models/player/skadi_lod2.zym b/models/player/skadi_lod2.zym
deleted file mode 100644 (file)
index dc022b5..0000000
Binary files a/models/player/skadi_lod2.zym and /dev/null differ
diff --git a/models/player/skadi_lod2.zym_0.skin b/models/player/skadi_lod2.zym_0.skin
deleted file mode 100644 (file)
index 120285d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-femaleshock,skadi
\ No newline at end of file
diff --git a/models/player/specop.tga b/models/player/specop.tga
deleted file mode 100644 (file)
index e19d0ab..0000000
Binary files a/models/player/specop.tga and /dev/null differ
diff --git a/models/player/specop.txt b/models/player/specop.txt
deleted file mode 100644 (file)
index e8a4b98..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-Specop
-models/player/specop
-0
-models/player/specop.zym
-species human
-
-Solo Warrior
-
-Sex: Female
-Weight: 61 kg
-Age: 31
\ No newline at end of file
diff --git a/models/player/specop.zym b/models/player/specop.zym
deleted file mode 100644 (file)
index 69c421d..0000000
Binary files a/models/player/specop.zym and /dev/null differ
diff --git a/models/player/specop.zym.sounds b/models/player/specop.zym.sounds
deleted file mode 100644 (file)
index 3d0ea27..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-//TAG: specop
-//affirmative sound/player/carni-lycan/player/affirmative 0
-attack sound/player/specop/coms/attack 0
-//attacking sound/player/carni-lycan/player/attacking 0
-attackinfive sound/player/specop/coms/attackinfive 0
-coverme sound/player/specop/coms/coverme 0
-defend sound/player/specop/coms/defend 0
-//defending sound/player/carni-lycan/player/defending 0
-//droppedflag sound/player/carni-lycan/player/droppedflag 0
-//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/specop/coms/freelance 2
-//getflag sound/player/carni-lycan/player/getflag 0
-incoming sound/player/specop/coms/incoming 0
-meet sound/player/specop/coms/meet 0
-needhelp sound/player/specop/coms/needhelp 1
-//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/specop/coms/seenflag 0
-taunt sound/player/specop/coms/taunt 4
-teamshoot sound/player/specop/coms/teamshoot 4
-death sound/player/specop/player/death 3
-drown sound/player/specop/player/drown 0
-//fall sound/player/carni-lycan/player/fall 0
-falling sound/player/specop/player/falling 0
-gasp sound/player/specop/player/gasp 0
-jump sound/player/specop/player/jump 0
-pain25 sound/player/specop/player/pain25 0
-pain50 sound/player/specop/player/pain50 0
-pain75 sound/player/specop/player/pain75 0
-pain100 sound/player/specop/player/pain100 0
diff --git a/models/player/specop.zym_0.skin b/models/player/specop.zym_0.skin
deleted file mode 100644 (file)
index 374c595..0000000
+++ /dev/null
@@ -1 +0,0 @@
-specop,specop
\ No newline at end of file
diff --git a/models/player/specop_lod1.zym b/models/player/specop_lod1.zym
deleted file mode 100644 (file)
index ddc0a2d..0000000
Binary files a/models/player/specop_lod1.zym and /dev/null differ
diff --git a/models/player/specop_lod1.zym_0.skin b/models/player/specop_lod1.zym_0.skin
deleted file mode 100644 (file)
index 374c595..0000000
+++ /dev/null
@@ -1 +0,0 @@
-specop,specop
\ No newline at end of file
diff --git a/models/player/specop_lod2.zym b/models/player/specop_lod2.zym
deleted file mode 100644 (file)
index 5c06385..0000000
Binary files a/models/player/specop_lod2.zym and /dev/null differ
diff --git a/models/player/specop_lod2.zym_0.skin b/models/player/specop_lod2.zym_0.skin
deleted file mode 100644 (file)
index 374c595..0000000
+++ /dev/null
@@ -1 +0,0 @@
-specop,specop
\ No newline at end of file
diff --git a/models/player/umbra.iqm b/models/player/umbra.iqm
new file mode 100644 (file)
index 0000000..2b53ad2
Binary files /dev/null and b/models/player/umbra.iqm differ
diff --git a/models/player/umbra.iqm.framegroups b/models/player/umbra.iqm.framegroups
new file mode 100644 (file)
index 0000000..b98d0b9
--- /dev/null
@@ -0,0 +1,23 @@
+0 36 20.000000 0 // dieone
+36 27 20.000000 0 // dietwo
+63 15 15.000000 1 // draw
+78 20 15.000000 1 // duck
+98 11 15.000000 1 // duckwalk
+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 1 // 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
diff --git a/models/player/umbra.iqm_0.tga b/models/player/umbra.iqm_0.tga
new file mode 100644 (file)
index 0000000..726d329
Binary files /dev/null and b/models/player/umbra.iqm_0.tga differ
diff --git a/models/player/umbra.iqm_0.txt b/models/player/umbra.iqm_0.txt
new file mode 100644 (file)
index 0000000..21f4c80
--- /dev/null
@@ -0,0 +1,7 @@
+name Umbra
+species human
+sex Female
+weight 61
+age 25
+
+Lightweight Xonotic Solider
diff --git a/models/player/visitant.zym b/models/player/visitant.zym
deleted file mode 100644 (file)
index dc2f2fb..0000000
Binary files a/models/player/visitant.zym and /dev/null differ
diff --git a/models/player/visitant.zym.sounds b/models/player/visitant.zym.sounds
deleted file mode 100644 (file)
index f5f9ee2..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-//TAG: fricka
-//affirmative sound/player/carni-lycan/player/affirmative 0
-attack sound/player/fricka/coms/attack 0
-//attacking sound/player/carni-lycan/player/attacking 0
-attackinfive sound/player/fricka/coms/attackinfive 0
-//coverme sound/player/fricka/coms/coverme 0
-defend sound/player/fricka/coms/defend 0
-//defending sound/player/carni-lycan/player/defending 0
-//droppedflag sound/player/carni-lycan/player/droppedflag 0
-//flagcarriertakingdamage sound/player/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/fricka/coms/freelance 2
-//getflag sound/player/carni-lycan/player/getflag 0
-incoming sound/player/fricka/coms/incoming 0
-meet sound/player/fricka/coms/waypoint 0
-//needhelp sound/player/fricka/coms/needhelp 0
-//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/fricka/coms/flagseen 0
-taunt sound/player/fricka/coms/taunt 4
-teamshoot sound/player/fricka/coms/teamshoot 3
-death sound/player/fricka/player/death 3
-drown sound/player/fricka/player/drown 0
-//fall sound/player/carni-lycan/player/fall 0
-falling sound/player/fricka/player/falling 0
-gasp sound/player/fricka/player/gasp 0
-jump sound/player/fricka/player/jump 0
-pain25 sound/player/fricka/player/pain25 0
-pain50 sound/player/fricka/player/pain50 0
-pain75 sound/player/fricka/player/pain75 0
-pain100 sound/player/fricka/player/pain100 0
diff --git a/models/player/visitant.zym_0.skin b/models/player/visitant.zym_0.skin
deleted file mode 100644 (file)
index 38a6c6e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-visitant,fricka
diff --git a/models/player/visitant_lod1.zym b/models/player/visitant_lod1.zym
deleted file mode 100644 (file)
index 1974124..0000000
Binary files a/models/player/visitant_lod1.zym and /dev/null differ
diff --git a/models/player/visitant_lod1.zym_0.skin b/models/player/visitant_lod1.zym_0.skin
deleted file mode 100644 (file)
index 38a6c6e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-visitant,fricka
diff --git a/models/player/visitant_lod2.zym b/models/player/visitant_lod2.zym
deleted file mode 100644 (file)
index 8d039b3..0000000
Binary files a/models/player/visitant_lod2.zym and /dev/null differ
diff --git a/models/player/visitant_lod2.zym_0.skin b/models/player/visitant_lod2.zym_0.skin
deleted file mode 100644 (file)
index 38a6c6e..0000000
+++ /dev/null
@@ -1 +0,0 @@
-visitant,fricka
diff --git a/models/player/xolar.dpm b/models/player/xolar.dpm
deleted file mode 100644 (file)
index 5009792..0000000
Binary files a/models/player/xolar.dpm and /dev/null differ
diff --git a/models/player/xolar.dpm.framegroups b/models/player/xolar.dpm.framegroups
deleted file mode 100644 (file)
index d2924b1..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-Generated framegroups file for xolar
-Used by DarkPlaces to simulate frame groups in DPM models.
-*/
-
-1 41 15 0 // xolar die1
-42 47 30 0 // xolar die2
-89 11 30 1 // xolar draw
-100 11 30 1 // xolar duck
-111 81 60 1 // xolar duckwalk
-192 41 60 0 // xolar duckjump
-233 21 10 1 // xolar duckidle
-254 301 10 1 // xolar idle
-555 41 60 0 // xolar jump
-596 6 15 0 // xolar pain1
-602 6 15 0 // xolar pain2
-608 8 30 1 // xolar shoot
-616 31 30 1 // xolar taunt
-647 41 60 1 // xolar run
-688 41 60 1 // xolar runbackwards
-729 41 60 1 // xolar strafeleft
-770 41 60 1 // xolar straferight
-811 3 30 0 // xolar dead1
-814 3 30 0 // xolar dead2
-817 41 60 1 // xolar forwardright
-858 41 60 1 // xolar forwardleft
-899 41 60 1 // xolar backright
-940 41 60 1 // xolar backleft
diff --git a/models/player/xolar.dpm.sounds b/models/player/xolar.dpm.sounds
deleted file mode 100644 (file)
index dd7be39..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/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/soldier/coms/freelance 2
-//getflag sound/player/carni-lycan/player/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/carni-lycan/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/xolar.tga b/models/player/xolar.tga
deleted file mode 100644 (file)
index f5ab215..0000000
Binary files a/models/player/xolar.tga and /dev/null differ
diff --git a/models/player/xolar.txt b/models/player/xolar.txt
deleted file mode 100644 (file)
index 4f6bbe9..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-Xolar
-models/player/xolar
-0
-models/player/xolar.dpm
-species robot_solid
-
-Heavy Nexuiz's Soldier
-
-Weight: 582 kg
-Age: 439
diff --git a/models/player/xolar.zym.sounds b/models/player/xolar.zym.sounds
deleted file mode 100644 (file)
index dd7be39..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/carni-lycan/player/flagcarriertakingdamage 0
-freelance sound/player/soldier/coms/freelance 2
-//getflag sound/player/carni-lycan/player/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/carni-lycan/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/xolar_lod1.dpm b/models/player/xolar_lod1.dpm
deleted file mode 100644 (file)
index 21d0600..0000000
Binary files a/models/player/xolar_lod1.dpm and /dev/null differ
diff --git a/models/player/xolar_lod1.dpm.framegroups b/models/player/xolar_lod1.dpm.framegroups
deleted file mode 100644 (file)
index 70074ef..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-Generated framegroups file for xolar_lod1
-Used by DarkPlaces to simulate frame groups in DPM models.
-*/
-
-1 41 15 0 // xolar_lod1 die1
-42 47 30 0 // xolar_lod1 die2
-89 11 30 1 // xolar_lod1 draw
-100 11 30 1 // xolar_lod1 duck
-111 81 60 1 // xolar_lod1 duckwalk
-192 41 60 0 // xolar_lod1 duckjump
-233 21 10 1 // xolar_lod1 duckidle
-254 301 10 1 // xolar_lod1 idle
-555 41 60 0 // xolar_lod1 jump
-596 6 15 0 // xolar_lod1 pain1
-602 6 15 0 // xolar_lod1 pain2
-608 8 30 1 // xolar_lod1 shoot
-616 31 30 1 // xolar_lod1 taunt
-647 41 60 1 // xolar_lod1 run
-688 41 60 1 // xolar_lod1 runbackwards
-729 41 60 1 // xolar_lod1 strafeleft
-770 41 60 1 // xolar_lod1 straferight
-811 3 30 0 // xolar_lod1 dead1
-814 3 30 0 // xolar_lod1 dead2
-817 41 60 1 // xolar_lod1 forwardright
-858 41 60 1 // xolar_lod1 forwardleft
-899 41 60 1 // xolar_lod1 backright
-940 41 60 1 // xolar_lod1 backleft
diff --git a/models/player/xolar_lod2.dpm b/models/player/xolar_lod2.dpm
deleted file mode 100644 (file)
index 821327e..0000000
Binary files a/models/player/xolar_lod2.dpm and /dev/null differ
diff --git a/models/player/xolar_lod2.dpm.animinfo b/models/player/xolar_lod2.dpm.animinfo
deleted file mode 100644 (file)
index 3e2da39..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-/*
-Generated animinfo file for xolar_lod2
-Useful for game code to simulate frame groups in DPM models.
-*/
-
-
-// end of animinfo definitions for xolar_lod2
-
-
diff --git a/models/player/xolar_lod2.dpm.framegroups b/models/player/xolar_lod2.dpm.framegroups
deleted file mode 100644 (file)
index 7525506..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-Generated framegroups file for xolar_lod2
-Used by DarkPlaces to simulate frame groups in DPM models.
-*/
-
-1 41 15 0 // xolar_lod2 die1
-42 47 30 0 // xolar_lod2 die2
-89 11 30 1 // xolar_lod2 draw
-100 11 30 1 // xolar_lod2 duck
-111 81 60 1 // xolar_lod2 duckwalk
-192 41 60 0 // xolar_lod2 duckjump
-233 21 10 1 // xolar_lod2 duckidle
-254 301 10 1 // xolar_lod2 idle
-555 41 60 0 // xolar_lod2 jump
-596 6 15 0 // xolar_lod2 pain1
-602 6 15 0 // xolar_lod2 pain2
-608 8 30 1 // xolar_lod2 shoot
-616 31 30 1 // xolar_lod2 taunt
-647 41 60 1 // xolar_lod2 run
-688 41 60 1 // xolar_lod2 runbackwards
-729 41 60 1 // xolar_lod2 strafeleft
-770 41 60 1 // xolar_lod2 straferight
-811 3 30 0 // xolar_lod2 dead1
-814 3 30 0 // xolar_lod2 dead2
-817 41 60 1 // xolar_lod2 forwardright
-858 41 60 1 // xolar_lod2 forwardleft
-899 41 60 1 // xolar_lod2 backright
-940 41 60 1 // xolar_lod2 backleft
index a028b81c1316392945895ad97549ba1bf7affcfa..0b51eb5ee95c9ceacba86e68c0c0e4bc63c24ee4 100644 (file)
Binary files a/models/portal.md3 and b/models/portal.md3 differ
index d0c84ff09b45211780c41e2f013db058698f3b57..75c4b017d7931c8057462ce700d680977f4cba61 100644 (file)
@@ -1,2 +1,2 @@
-portal,textures/portals/portals_red.tga
+portal,portals/portals_red
 vortex,portals_red_vortex
index 4b8a244dd39d1fcc6ebd9ea7ab38cb8b52cc74a4..d8a4e788fb2036897739ff125b7df0ed92e01792 100644 (file)
@@ -1,2 +1,2 @@
-portal,textures/portals/portals_blue.tga
+portal,portals/portals_blue
 vortex,portals_blue_vortex
index 7dea39541de54af8d6acfc0768efb8a13bc73cc1..a7ab397050bbb69727906eb91cedff43099be9fb 100644 (file)
@@ -1,2 +1,2 @@
-portal,textures/portals/portals_inactive.tga
+portal,portals/portals_inactive
 vortex,portals_inactive_vortex
index 6f9c0fc27444d2252a8d9cdeb69dcdaa18b98311..9c98dbf0d03b19b2d4220d8ec90c5346630c59b9 100644 (file)
Binary files a/models/race/checkpoint/checkpoint.md3 and b/models/race/checkpoint/checkpoint.md3 differ
index ab166870dc824f17468f107be4bad849b86663a7..76510d7d28ae8b68532edc0f3065eb2a8527d173 100644 (file)
Binary files a/models/race/checkpoint/checkpoint_half.md3 and b/models/race/checkpoint/checkpoint_half.md3 differ
index b23c542e8adf57e2caf410ffdeb0a544b004960f..2efad347c3f6ebc857e6d9d793f3bb090869a30e 100644 (file)
Binary files a/models/rocket.md3 and b/models/rocket.md3 differ
index 4f953fe31d525d56c3da1c3cb4face3a70e2fa96..e7df673d51f039ea6ed4831a69aacae61a535ceb 100644 (file)
Binary files a/models/sprites/defend.sp2 and b/models/sprites/defend.sp2 differ
index 732399bd36d0564493c8359520473a423ce6dae3..de5012db07f245aeea3d61f2f4b611160e268235 100644 (file)
Binary files a/models/sprites/destroy.sp2 and b/models/sprites/destroy.sp2 differ
index 69461228da84f4ac54bbc1b123ae6c053f5b506d..79eca790312329d6690d4e0813158ba74e306d1f 100644 (file)
Binary files a/models/sprites/push.sp2 and b/models/sprites/push.sp2 differ
diff --git a/models/tagrocket.md3 b/models/tagrocket.md3
new file mode 100644 (file)
index 0000000..8e0279e
Binary files /dev/null and b/models/tagrocket.md3 differ
diff --git a/models/tagrocket.tga b/models/tagrocket.tga
new file mode 100644 (file)
index 0000000..adf0a8c
Binary files /dev/null and b/models/tagrocket.tga differ
index d9e83ad34dde5a8b9805994f97fc32b48056545d..1d357b409c84ce3dad94130bbaba345d64752c85 100644 (file)
Binary files a/models/turrets/c512.md3 and b/models/turrets/c512.md3 differ
index 391131599c9b86dc907dad18857f7e41338c37f9..1a1c9c39af0ba09809531b4153e50c450902b4a1 100644 (file)
Binary files a/models/turrets/hunter2.md3 and b/models/turrets/hunter2.md3 differ
index 1d482ff837ebc0099af429281faa3ca0efe225a8..507784927a8a88e7c8b28e05f4246e3c762aa843 100644 (file)
Binary files a/models/turrets/radiant/walker.md3 and b/models/turrets/radiant/walker.md3 differ
index 9da6f0a48df64ae1aa8ba978ff4e1a2a8a165705..ee67dc5dcb88c62d2bfeeebf63eb08d5a6eacad3 100644 (file)
Binary files a/models/turrets/terrainbase.md3 and b/models/turrets/terrainbase.md3 differ
index 1bfc274ef75b2110cccaa6bc92394e06b8f1256e..dc9fff38b4a310dbe9bb35b2a2989ff036d17024 100644 (file)
Binary files a/models/turrets/walker_body.md3 and b/models/turrets/walker_body.md3 differ
index 590155efb17e2f66361b97a1ee7861476269cbc8..050d79cd8e01a9895f8a1153aa91977e43a3b52c 100644 (file)
@@ -1,12 +1,12 @@
-1   1   1  0  // ANIM_NO\r
-35 55 20 1 // ANIM_TURN\r
-5 25 20 1   // ANIM_WALK\r
-5 25 40 1   // ANIM_RUN\r
-35 55 20 1 // ANIM_STRAFE_L\r
-65 85 20 1 // ANIM_STRAFE_R\r
-95 100 20 0 // ANIM_JUMP\r
-100 107 20 0 // ANIM_LAND\r
-90 95 20 0 // ANIM_PAIN\r
-123 140 40 0 // ANIM_MEELE\r
-146 151 20 1 // ANIM_SWIM\r
-5 25 20 1   // ANIM_ROAM\r
+1   1   1  0  // ANIM_NO
+35 55 20 1 // ANIM_TURN
+5 25 20 1   // ANIM_WALK
+5 25 40 1   // ANIM_RUN
+35 55 20 1 // ANIM_STRAFE_L
+65 85 20 1 // ANIM_STRAFE_R
+95 100 20 0 // ANIM_JUMP
+100 107 20 0 // ANIM_LAND
+90 95 20 0 // ANIM_PAIN
+123 140 40 0 // ANIM_MEELE
+146 151 20 1 // ANIM_SWIM
+5 25 20 1   // ANIM_ROAM
index 849fe7e3e1bcf26318a90b387716b48b90620ab1..e819e8ec14bd88dc76adc1590683f98587c8a86f 100644 (file)
Binary files a/models/turrets/walker_mghead.md3 and b/models/turrets/walker_mghead.md3 differ
index 049d1cd5baa5b7f6c9ed1e110966de6a31c261c4..e71a80c932d1ca5cee3290cba4ca759285a4491b 100644 (file)
Binary files a/models/turrets/walker_spawn.md3 and b/models/turrets/walker_spawn.md3 differ
index 2ff60d487a377619ae1f0405d0cd519bca0ea7ad..d65e3da709c858d9031cfd6668a690617b9eff2d 100644 (file)
Binary files a/models/uziflash.md3 and b/models/uziflash.md3 differ
diff --git a/models/vehicles/raptor.dpm b/models/vehicles/raptor.dpm
new file mode 100644 (file)
index 0000000..83518c5
Binary files /dev/null and b/models/vehicles/raptor.dpm differ
diff --git a/models/vehicles/raptor_bomb.dpm b/models/vehicles/raptor_bomb.dpm
new file mode 100644 (file)
index 0000000..7fcc713
Binary files /dev/null and b/models/vehicles/raptor_bomb.dpm differ
diff --git a/models/vehicles/raptor_cockpit.dpm b/models/vehicles/raptor_cockpit.dpm
new file mode 100644 (file)
index 0000000..332b2d7
Binary files /dev/null and b/models/vehicles/raptor_cockpit.dpm differ
diff --git a/models/vehicles/raptor_gun.dpm b/models/vehicles/raptor_gun.dpm
new file mode 100644 (file)
index 0000000..fdc2791
Binary files /dev/null and b/models/vehicles/raptor_gun.dpm differ
index 3ea278df30931dd4e1a004936e2ac6d3087d671c..f9db7221e4f2e959f420eaee3a6e000ae3551ad1 100644 (file)
@@ -1,6 +1,6 @@
-1   30  20 1 // forward\r
-32  30  20 1 // backward\r
-63  30  20 1 // left\r
-94  30 20 1 // right\r
-125 30 20 0 // jump\r
-0   1   20 0 // idle\r
+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
index 86de96d108a800d8af48b65c99b24e0bd8314514..594e706f816163407b4e8e3324ca9963a4705f15 100644 (file)
Binary files a/models/weapons/g_campingrifle.md3 and b/models/weapons/g_campingrifle.md3 differ
index 9423f288dcd1fdfcf39833ce95c74af7eebc0197..8634feaeb06a6d08e4b1f41af6620b28b69b221c 100644 (file)
Binary files a/models/weapons/g_crylink.md3 and b/models/weapons/g_crylink.md3 differ
index baea8a59bfbfaeb664390a9ff3fb3baae55b1282..76c2e8962be3a6e84882eb8f9b9d7c299ddce2bb 100644 (file)
Binary files a/models/weapons/g_electro.md3 and b/models/weapons/g_electro.md3 differ
index 4c4646ed89d0da16604c8253c40e2825cee95c3d..c953426724ec3ba219dd00b6a5659e5fa837254d 100644 (file)
Binary files a/models/weapons/g_fireball.md3 and b/models/weapons/g_fireball.md3 differ
index d8442d7a1198c862f648613582ac68190af86194..2e341fbda4c5fb87025ebce96c76ef46e8a0c5df 100644 (file)
Binary files a/models/weapons/g_gl.md3 and b/models/weapons/g_gl.md3 differ
index 298e31ccdafca60f89d473d6b331b20592b718da..6e21ba9f83a4d578b2b8454aacff8f9aeb3d6c73 100644 (file)
Binary files a/models/weapons/g_hagar.md3 and b/models/weapons/g_hagar.md3 differ
index 4c82e009cb3afd1082626a5a7891198d917daf2d..ae76ba7655f5a6181abd5501932a9ad9a2932204 100644 (file)
Binary files a/models/weapons/g_hlac.md3 and b/models/weapons/g_hlac.md3 differ
index b92ff937f700332046d96c581197b6c136f077b9..9c25b737a1075d4216aeb26e75d97087c21821b6 100644 (file)
Binary files a/models/weapons/g_hookgun.md3 and b/models/weapons/g_hookgun.md3 differ
index 2ad2895b9aec83411b3b41e4c6785157c181947f..b31e260343dab616ed8e45f21aea02bb7cd98eee 100644 (file)
Binary files a/models/weapons/g_laser.md3 and b/models/weapons/g_laser.md3 differ
index d22c5c9b2cc4e6e0211d4fea7821b7c69865ee28..4575e9be4d2399fcc718625d73f17eef48a45300 100644 (file)
Binary files a/models/weapons/g_minstanex.md3 and b/models/weapons/g_minstanex.md3 differ
index 1ceebb75581c043de2fcdf38b283b7cc408034b9..1df904fc3b0cecb44a7459be28ec8b63b372de7c 100644 (file)
Binary files a/models/weapons/g_nex.md3 and b/models/weapons/g_nex.md3 differ
index b224c70d20e54f5e0a2a7cb14108d8cac7569591..f0dce9dc42bd18fce9ab34d41555c2695956884f 100644 (file)
Binary files a/models/weapons/g_porto.md3 and b/models/weapons/g_porto.md3 differ
index 2d8a1eeb881672d825a306abd54e2ad118c7abf7..13339305982e66177d06e039f24e50947f1a94c0 100644 (file)
Binary files a/models/weapons/g_rl.md3 and b/models/weapons/g_rl.md3 differ
diff --git a/models/weapons/g_seeker.md3 b/models/weapons/g_seeker.md3
new file mode 100644 (file)
index 0000000..da02fb6
Binary files /dev/null and b/models/weapons/g_seeker.md3 differ
index 097a8d0924f5c01b1afe87f128c9ba8c4133f23c..3838be811d7e9437f898e2581945cb2192cea754 100644 (file)
Binary files a/models/weapons/g_shotgun.md3 and b/models/weapons/g_shotgun.md3 differ
index efe8f3cffe4845f34b715956502d4a7c057a9cab..53d74e578ef377fd14ac22aedfd48e955da9cda1 100644 (file)
Binary files a/models/weapons/g_tuba.md3 and b/models/weapons/g_tuba.md3 differ
index 28641448906296b5a57e9015bdb370fbc0f743c5..76062c6d44f4dc0957473425c1b7558975a45d83 100644 (file)
Binary files a/models/weapons/g_uzi.md3 and b/models/weapons/g_uzi.md3 differ
diff --git a/models/weapons/h_campingrifle.dpm b/models/weapons/h_campingrifle.dpm
deleted file mode 100644 (file)
index 0184e66..0000000
Binary files a/models/weapons/h_campingrifle.dpm and /dev/null differ
diff --git a/models/weapons/h_campingrifle.dpm.framegroups b/models/weapons/h_campingrifle.dpm.framegroups
deleted file mode 100644 (file)
index 474f093..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 39 20 0 // reload
diff --git a/models/weapons/h_campingrifle.iqm b/models/weapons/h_campingrifle.iqm
new file mode 100644 (file)
index 0000000..2d4e970
Binary files /dev/null and b/models/weapons/h_campingrifle.iqm differ
diff --git a/models/weapons/h_campingrifle.iqm.framegroups b/models/weapons/h_campingrifle.iqm.framegroups
new file mode 100644 (file)
index 0000000..474f093
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 39 20 0 // reload
diff --git a/models/weapons/h_crylink.dpm b/models/weapons/h_crylink.dpm
deleted file mode 100644 (file)
index 7e025d2..0000000
Binary files a/models/weapons/h_crylink.dpm and /dev/null differ
diff --git a/models/weapons/h_crylink.dpm.framegroups b/models/weapons/h_crylink.dpm.framegroups
deleted file mode 100644 (file)
index 0a59625..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
diff --git a/models/weapons/h_crylink.iqm b/models/weapons/h_crylink.iqm
new file mode 100644 (file)
index 0000000..2aadd39
Binary files /dev/null and b/models/weapons/h_crylink.iqm differ
diff --git a/models/weapons/h_crylink.iqm.framegroups b/models/weapons/h_crylink.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_electro.dpm b/models/weapons/h_electro.dpm
deleted file mode 100644 (file)
index 12a6945..0000000
Binary files a/models/weapons/h_electro.dpm and /dev/null differ
diff --git a/models/weapons/h_electro.dpm.framegroups b/models/weapons/h_electro.dpm.framegroups
deleted file mode 100644 (file)
index 0a59625..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
diff --git a/models/weapons/h_electro.iqm b/models/weapons/h_electro.iqm
new file mode 100644 (file)
index 0000000..ef0c7e2
Binary files /dev/null and b/models/weapons/h_electro.iqm differ
diff --git a/models/weapons/h_electro.iqm.framegroups b/models/weapons/h_electro.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_fireball.dpm b/models/weapons/h_fireball.dpm
deleted file mode 100644 (file)
index dd94bbc..0000000
Binary files a/models/weapons/h_fireball.dpm and /dev/null differ
diff --git a/models/weapons/h_fireball.dpm.framegroups b/models/weapons/h_fireball.dpm.framegroups
deleted file mode 100644 (file)
index 0a59625..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
diff --git a/models/weapons/h_fireball.iqm b/models/weapons/h_fireball.iqm
new file mode 100644 (file)
index 0000000..9fb4af5
Binary files /dev/null and b/models/weapons/h_fireball.iqm differ
diff --git a/models/weapons/h_fireball.iqm.framegroups b/models/weapons/h_fireball.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_gl.dpm b/models/weapons/h_gl.dpm
deleted file mode 100644 (file)
index e8341cf..0000000
Binary files a/models/weapons/h_gl.dpm and /dev/null differ
diff --git a/models/weapons/h_gl.dpm.framegroups b/models/weapons/h_gl.dpm.framegroups
deleted file mode 100644 (file)
index 0a59625..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
diff --git a/models/weapons/h_gl.iqm b/models/weapons/h_gl.iqm
new file mode 100644 (file)
index 0000000..33fab12
Binary files /dev/null and b/models/weapons/h_gl.iqm differ
diff --git a/models/weapons/h_gl.iqm.framegroups b/models/weapons/h_gl.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_hagar.dpm b/models/weapons/h_hagar.dpm
deleted file mode 100644 (file)
index 24f2e6e..0000000
Binary files a/models/weapons/h_hagar.dpm and /dev/null differ
diff --git a/models/weapons/h_hagar.dpm.framegroups b/models/weapons/h_hagar.dpm.framegroups
deleted file mode 100644 (file)
index 0a59625..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
diff --git a/models/weapons/h_hagar.iqm b/models/weapons/h_hagar.iqm
new file mode 100644 (file)
index 0000000..e3a4d57
Binary files /dev/null and b/models/weapons/h_hagar.iqm differ
diff --git a/models/weapons/h_hagar.iqm.framegroups b/models/weapons/h_hagar.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_hlac.dpm b/models/weapons/h_hlac.dpm
deleted file mode 100644 (file)
index 9927f70..0000000
Binary files a/models/weapons/h_hlac.dpm and /dev/null differ
diff --git a/models/weapons/h_hlac.dpm.framegroups b/models/weapons/h_hlac.dpm.framegroups
deleted file mode 100644 (file)
index 0a59625..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
diff --git a/models/weapons/h_hlac.iqm b/models/weapons/h_hlac.iqm
new file mode 100644 (file)
index 0000000..157a56b
Binary files /dev/null and b/models/weapons/h_hlac.iqm differ
diff --git a/models/weapons/h_hlac.iqm.framegroups b/models/weapons/h_hlac.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_hookgun.dpm b/models/weapons/h_hookgun.dpm
deleted file mode 100644 (file)
index 009c242..0000000
Binary files a/models/weapons/h_hookgun.dpm and /dev/null differ
diff --git a/models/weapons/h_hookgun.dpm.framegroups b/models/weapons/h_hookgun.dpm.framegroups
deleted file mode 100644 (file)
index 0a59625..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
diff --git a/models/weapons/h_hookgun.iqm b/models/weapons/h_hookgun.iqm
new file mode 100644 (file)
index 0000000..0492d0a
Binary files /dev/null and b/models/weapons/h_hookgun.iqm differ
diff --git a/models/weapons/h_hookgun.iqm.framegroups b/models/weapons/h_hookgun.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_laser.dpm b/models/weapons/h_laser.dpm
deleted file mode 100644 (file)
index 9deb0c7..0000000
Binary files a/models/weapons/h_laser.dpm and /dev/null differ
diff --git a/models/weapons/h_laser.dpm.framegroups b/models/weapons/h_laser.dpm.framegroups
deleted file mode 100644 (file)
index 0a59625..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
diff --git a/models/weapons/h_laser.iqm b/models/weapons/h_laser.iqm
new file mode 100644 (file)
index 0000000..0ca28e9
Binary files /dev/null and b/models/weapons/h_laser.iqm differ
diff --git a/models/weapons/h_laser.iqm.framegroups b/models/weapons/h_laser.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_minstanex.dpm b/models/weapons/h_minstanex.dpm
deleted file mode 100644 (file)
index 0079031..0000000
Binary files a/models/weapons/h_minstanex.dpm and /dev/null differ
diff --git a/models/weapons/h_minstanex.dpm.framegroups b/models/weapons/h_minstanex.dpm.framegroups
deleted file mode 100644 (file)
index 0a59625..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
diff --git a/models/weapons/h_minstanex.iqm b/models/weapons/h_minstanex.iqm
new file mode 100644 (file)
index 0000000..77d6775
Binary files /dev/null and b/models/weapons/h_minstanex.iqm differ
diff --git a/models/weapons/h_minstanex.iqm.framegroups b/models/weapons/h_minstanex.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_nex.dpm b/models/weapons/h_nex.dpm
deleted file mode 100644 (file)
index c04cec4..0000000
Binary files a/models/weapons/h_nex.dpm and /dev/null differ
diff --git a/models/weapons/h_nex.dpm.framegroups b/models/weapons/h_nex.dpm.framegroups
deleted file mode 100644 (file)
index 0a59625..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
diff --git a/models/weapons/h_nex.iqm b/models/weapons/h_nex.iqm
new file mode 100644 (file)
index 0000000..22642ef
Binary files /dev/null and b/models/weapons/h_nex.iqm differ
diff --git a/models/weapons/h_nex.iqm.framegroups b/models/weapons/h_nex.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_porto.dpm b/models/weapons/h_porto.dpm
deleted file mode 100644 (file)
index 60385bf..0000000
Binary files a/models/weapons/h_porto.dpm and /dev/null differ
diff --git a/models/weapons/h_porto.dpm.framegroups b/models/weapons/h_porto.dpm.framegroups
deleted file mode 100644 (file)
index 0a59625..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
diff --git a/models/weapons/h_porto.iqm b/models/weapons/h_porto.iqm
new file mode 100644 (file)
index 0000000..0c6ed41
Binary files /dev/null and b/models/weapons/h_porto.iqm differ
diff --git a/models/weapons/h_porto.iqm.framegroups b/models/weapons/h_porto.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_rl.dpm b/models/weapons/h_rl.dpm
deleted file mode 100644 (file)
index eb8d663..0000000
Binary files a/models/weapons/h_rl.dpm and /dev/null differ
diff --git a/models/weapons/h_rl.dpm.framegroups b/models/weapons/h_rl.dpm.framegroups
deleted file mode 100644 (file)
index 0a59625..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
diff --git a/models/weapons/h_rl.iqm b/models/weapons/h_rl.iqm
new file mode 100644 (file)
index 0000000..21b7225
Binary files /dev/null and b/models/weapons/h_rl.iqm differ
diff --git a/models/weapons/h_rl.iqm.framegroups b/models/weapons/h_rl.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_seeker.iqm b/models/weapons/h_seeker.iqm
new file mode 100644 (file)
index 0000000..9fb4af5
Binary files /dev/null and b/models/weapons/h_seeker.iqm differ
diff --git a/models/weapons/h_seeker.iqm.framegroups b/models/weapons/h_seeker.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_shotgun.dpm b/models/weapons/h_shotgun.dpm
deleted file mode 100644 (file)
index b90fc4b..0000000
Binary files a/models/weapons/h_shotgun.dpm and /dev/null differ
diff --git a/models/weapons/h_shotgun.dpm.framegroups b/models/weapons/h_shotgun.dpm.framegroups
deleted file mode 100644 (file)
index 0a59625..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
diff --git a/models/weapons/h_shotgun.iqm b/models/weapons/h_shotgun.iqm
new file mode 100644 (file)
index 0000000..1fb76f8
Binary files /dev/null and b/models/weapons/h_shotgun.iqm differ
diff --git a/models/weapons/h_shotgun.iqm.framegroups b/models/weapons/h_shotgun.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_tuba.dpm b/models/weapons/h_tuba.dpm
deleted file mode 100644 (file)
index 12a6945..0000000
Binary files a/models/weapons/h_tuba.dpm and /dev/null differ
diff --git a/models/weapons/h_tuba.dpm.framegroups b/models/weapons/h_tuba.dpm.framegroups
deleted file mode 100644 (file)
index 0a59625..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
diff --git a/models/weapons/h_tuba.iqm b/models/weapons/h_tuba.iqm
new file mode 100644 (file)
index 0000000..523bbb1
Binary files /dev/null and b/models/weapons/h_tuba.iqm differ
diff --git a/models/weapons/h_tuba.iqm.framegroups b/models/weapons/h_tuba.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
diff --git a/models/weapons/h_uzi.dpm b/models/weapons/h_uzi.dpm
deleted file mode 100644 (file)
index 5aa51a4..0000000
Binary files a/models/weapons/h_uzi.dpm and /dev/null differ
diff --git a/models/weapons/h_uzi.dpm.framegroups b/models/weapons/h_uzi.dpm.framegroups
deleted file mode 100644 (file)
index 0a59625..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-1 8 20 0 // fire
-9 5 20 0 // fire2
-15 200 20 1 // idle
-215 40 20 0 // reload
diff --git a/models/weapons/h_uzi.iqm b/models/weapons/h_uzi.iqm
new file mode 100644 (file)
index 0000000..523bbb1
Binary files /dev/null and b/models/weapons/h_uzi.iqm differ
diff --git a/models/weapons/h_uzi.iqm.framegroups b/models/weapons/h_uzi.iqm.framegroups
new file mode 100644 (file)
index 0000000..0a59625
--- /dev/null
@@ -0,0 +1,4 @@
+1 8 20 0 // fire
+9 5 20 0 // fire2
+15 200 20 1 // idle
+215 40 20 0 // reload
index db4d8a0cbce90edc3422ccc43886b1a5f220e940..251e79f75cf7390d99a516981b7cf14de58fc58b 100644 (file)
Binary files a/models/weapons/v_campingrifle.md3 and b/models/weapons/v_campingrifle.md3 differ
index 79f0e9d738110b2d75874e853eedf58a832fbb62..af34658d79ee109cc6a2faf3d657316f0265206f 100644 (file)
Binary files a/models/weapons/v_crylink.md3 and b/models/weapons/v_crylink.md3 differ
index 6c05c181554dbdbf23988fcfb0be9dc64a3a8522..67105bcf6f1686260de4501e9d485f8a1e69b112 100644 (file)
Binary files a/models/weapons/v_electro.md3 and b/models/weapons/v_electro.md3 differ
index abc854f4f757309f7525e7bf1e579cd38313e1c2..a5e847c37b375d7222611e30f63d6ce38fbfccd3 100644 (file)
Binary files a/models/weapons/v_fireball.md3 and b/models/weapons/v_fireball.md3 differ
index 3e0302b0e91c14601d1fd01c77f5c2b98ff945c2..d705024dd873cc7bd86faacd036f363d5a6559d5 100644 (file)
Binary files a/models/weapons/v_gl.md3 and b/models/weapons/v_gl.md3 differ
index 3167ce648683016ac1519f06a4e6fcb9b89bc3fe..19a245343322da6aa2dbfbb7de9b9a96c63264cf 100644 (file)
Binary files a/models/weapons/v_hagar.md3 and b/models/weapons/v_hagar.md3 differ
index b260f457f900dcbd97d8ee09d2bfd8cd8ce7d973..3bbc34d567d126fcf47fca6b40a6b4b02de58251 100644 (file)
Binary files a/models/weapons/v_hlac.md3 and b/models/weapons/v_hlac.md3 differ
index 2ee80e880d6c8fea565097f9ef29fa757bb177d4..4ca6a130e8d74900063cf18210f3352a0b35167f 100644 (file)
Binary files a/models/weapons/v_hookgun.md3 and b/models/weapons/v_hookgun.md3 differ
index 724fb4c9a99bfb07a827d87ab0174744c3c9c579..836ad36b39e4cfcd945d4117d406c1a3f8751d5b 100644 (file)
Binary files a/models/weapons/v_laser.md3 and b/models/weapons/v_laser.md3 differ
index 0230a42658ff718594702865c939ca26e7061d04..d583e1a616ee5e9cf4d0bf3f7e4f8fccf634c7c3 100644 (file)
Binary files a/models/weapons/v_minstanex.md3 and b/models/weapons/v_minstanex.md3 differ
index 7670659bbb9f5c7c41c1665ff3e1831daec8cb9f..9144fa0a04f7a199d97d603cd2b8bdd422333a42 100644 (file)
Binary files a/models/weapons/v_nex.md3 and b/models/weapons/v_nex.md3 differ
index 49bc64be787b91b50c087a05e803f0b98823c954..5d06b3c0667e1fba9319313b19059f211d7e7b25 100644 (file)
Binary files a/models/weapons/v_porto.md3 and b/models/weapons/v_porto.md3 differ
index ad4e9bd3a0f9a9dc28bf018d0ac7d525d1cf510a..022b52de7a908a7ace020a7837dfd537ad99e38d 100644 (file)
Binary files a/models/weapons/v_rl.md3 and b/models/weapons/v_rl.md3 differ
diff --git a/models/weapons/v_seeker.md3 b/models/weapons/v_seeker.md3
new file mode 100644 (file)
index 0000000..146809f
Binary files /dev/null and b/models/weapons/v_seeker.md3 differ
index 191a3c4e1c35684a00a901dd49d5eff55b36ecf9..d4a6287991b207781085069e89aaaf83d0ac254a 100644 (file)
Binary files a/models/weapons/v_shotgun.md3 and b/models/weapons/v_shotgun.md3 differ
index 3fbbb5d15901e7dcd18f48a2878341badf995572..910b2271ff54a601a553b0bfc840f5087c52b3ca 100644 (file)
Binary files a/models/weapons/v_tuba.md3 and b/models/weapons/v_tuba.md3 differ
index d5ee1467cd8556e517899aa66231e71186551742..53b27c6b589f4784f103a156e8c4b939308cd2c1 100644 (file)
Binary files a/models/weapons/v_uzi.md3 and b/models/weapons/v_uzi.md3 differ
index 4ddac784154591ae5bc60d2e60fae2c2fce3ab9c..70cbd174e8b7c62b6beda817ce6410d1a06622e5 100644 (file)
Binary files a/models/weapons/w_electro.zym and b/models/weapons/w_electro.zym differ
index 7b21181e539e4f227161beb2d14a101590313f1b..5f28a0a1defda09cfb45f1027942d4c974119162 100644 (file)
Binary files a/models/weapons/w_gl.zym and b/models/weapons/w_gl.zym differ
index c557d101f3ec526135471ceb465e3a887222b12a..031fa8609e2e78c8bfdaab0b38d219351ef7e70d 100644 (file)
Binary files a/models/weapons/w_shotgun.zym and b/models/weapons/w_shotgun.zym differ
index 89eba2b28d7b622ed330d06900f8a1c0492a5dbc..65d9e71a3f95bcf7c003a6f2e686e0eabdeccba0 100644 (file)
@@ -1,21 +1,21 @@
-set g_monster_zombie_respawntime    2\r
-set g_monster_zombie_movespeed      350\r
-set g_monster_zombie_health         275\r
-set g_monster_zombie_stopspeed      90\r
-set g_monster_zombie_turnspeed      360\r
-set g_monster_zombie_idle_timer_min 5\r
-set g_monster_zombie_idle_timer_max 10\r
-set g_monster_zombie_targetrange    2048\r
-\r
-set g_monster_zombie_attack_run_range    128\r
-set g_monster_zombie_attack_run_hitrange 96\r
-set g_monster_zombie_attack_run_delay    0.35\r
-set g_monster_zombie_attack_run_damage   30\r
-set g_monster_zombie_attack_run_force    300\r
-\r
-set g_monster_zombie_attack_stand_range    64\r
-set g_monster_zombie_attack_stand_hitrange 64\r
-set g_monster_zombie_attack_stand_delay    0.25\r
-set g_monster_zombie_attack_stand_damage   60\r
-set g_monster_zombie_attack_stand_force    250\r
-\r
+set g_monster_zombie_respawntime    2
+set g_monster_zombie_movespeed      350
+set g_monster_zombie_health         275
+set g_monster_zombie_stopspeed      90
+set g_monster_zombie_turnspeed      360
+set g_monster_zombie_idle_timer_min 5
+set g_monster_zombie_idle_timer_max 10
+set g_monster_zombie_targetrange    2048
+
+set g_monster_zombie_attack_run_range    128
+set g_monster_zombie_attack_run_hitrange 96
+set g_monster_zombie_attack_run_delay    0.35
+set g_monster_zombie_attack_run_damage   30
+set g_monster_zombie_attack_run_force    300
+
+set g_monster_zombie_attack_stand_range    64
+set g_monster_zombie_attack_stand_hitrange 64
+set g_monster_zombie_attack_stand_delay    0.25
+set g_monster_zombie_attack_stand_damage   60
+set g_monster_zombie_attack_stand_force    250
+
index 6fa9949fa14374c055303bd820e4d7dc271b1d10..a6fd71e6e09ccd02073af8f68b2a64f65e85fd01 100644 (file)
Binary files a/particles/particlefont-template.png and b/particles/particlefont-template.png differ
diff --git a/particles/particlefont-template.txt b/particles/particlefont-template.txt
new file mode 100644 (file)
index 0000000..6d6b740
--- /dev/null
@@ -0,0 +1,166 @@
+0 0.00048828125 0.00048828125 0.06201171875 0.06201171875
+1 0.06298828125 0.00048828125 0.12451171875 0.06201171875
+2 0.12548828125 0.00048828125 0.18701171875 0.06201171875
+3 0.18798828125 0.00048828125 0.24951171875 0.06201171875
+4 0.25048828125 0.00048828125 0.31201171875 0.06201171875
+5 0.31298828125 0.00048828125 0.37451171875 0.06201171875
+6 0.37548828125 0.00048828125 0.43701171875 0.06201171875
+7 0.43798828125 0.00048828125 0.49951171875 0.06201171875
+8 0.50048828125 0.00048828125 0.56201171875 0.06201171875
+9 0.56298828125 0.00048828125 0.62451171875 0.06201171875
+10 0.62548828125 0.00048828125 0.68701171875 0.06201171875
+11 0.68798828125 0.00048828125 0.74951171875 0.06201171875
+12 0.75048828125 0.00048828125 0.81201171875 0.06201171875
+13 0.81298828125 0.00048828125 0.87451171875 0.06201171875
+14 0.87548828125 0.00048828125 0.93701171875 0.06201171875
+15 0.93798828125 0.00048828125 0.99951171875 0.06201171875
+16 0.00048828125 0.06298828125 0.06201171875 0.12451171875
+17 0.06298828125 0.06298828125 0.12451171875 0.12451171875
+18 0.12548828125 0.06298828125 0.18701171875 0.12451171875
+19 0.18798828125 0.06298828125 0.24951171875 0.12451171875
+20 0.25048828125 0.06298828125 0.31201171875 0.12451171875
+21 0.31298828125 0.06298828125 0.37451171875 0.12451171875
+22 0.37548828125 0.06298828125 0.43701171875 0.12451171875
+23 0.43798828125 0.06298828125 0.49951171875 0.12451171875
+24 0.50048828125 0.06298828125 0.56201171875 0.12451171875
+25 0.56298828125 0.06298828125 0.62451171875 0.12451171875
+26 0.62548828125 0.06298828125 0.68701171875 0.12451171875
+27 0.68798828125 0.06298828125 0.74951171875 0.12451171875
+28 0.75048828125 0.06298828125 0.81201171875 0.12451171875
+29 0.81298828125 0.06298828125 0.87451171875 0.12451171875
+30 0.87548828125 0.06298828125 0.93701171875 0.12451171875
+31 0.93798828125 0.06298828125 0.99951171875 0.12451171875
+32 0.00048828125 0.12548828125 0.06201171875 0.18701171875
+33 0.06298828125 0.12548828125 0.12451171875 0.18701171875
+34 0.12548828125 0.12548828125 0.18701171875 0.18701171875
+35 0.18798828125 0.12548828125 0.24951171875 0.18701171875
+36 0.25048828125 0.12548828125 0.31201171875 0.18701171875
+37 0.31298828125 0.12548828125 0.37451171875 0.18701171875
+38 0.37548828125 0.12548828125 0.43701171875 0.18701171875
+39 0.43798828125 0.12548828125 0.49951171875 0.18701171875
+40 0.50048828125 0.12548828125 0.56201171875 0.18701171875
+41 0.56298828125 0.12548828125 0.62451171875 0.18701171875
+42 0.62548828125 0.12548828125 0.68701171875 0.18701171875
+43 0.68798828125 0.12548828125 0.74951171875 0.18701171875
+44 0.75048828125 0.12548828125 0.81201171875 0.18701171875
+45 0.81298828125 0.12548828125 0.87451171875 0.18701171875
+46 0.87548828125 0.12548828125 0.93701171875 0.18701171875
+47 0.93798828125 0.12548828125 0.99951171875 0.18701171875
+48 0.00048828125 0.18798828125 0.06201171875 0.24951171875
+49 0.06298828125 0.18798828125 0.12451171875 0.24951171875
+50 0.12548828125 0.18798828125 0.18701171875 0.24951171875
+51 0.18798828125 0.18798828125 0.24951171875 0.24951171875
+52 0.25048828125 0.18798828125 0.31201171875 0.24951171875
+53 0.31298828125 0.18798828125 0.37451171875 0.24951171875
+54 0.37548828125 0.18798828125 0.43701171875 0.24951171875
+55 0.43798828125 0.18798828125 0.49951171875 0.24951171875
+56 0.50048828125 0.18798828125 0.56201171875 0.24951171875
+57 0.56298828125 0.18798828125 0.62451171875 0.24951171875
+58 0.62548828125 0.18798828125 0.68701171875 0.24951171875
+59 0.68798828125 0.18798828125 0.74951171875 0.24951171875
+60 0.75048828125 0.18798828125 0.81201171875 0.24951171875
+61 0.81298828125 0.18798828125 0.87451171875 0.24951171875
+62 0.87548828125 0.18798828125 0.93701171875 0.24951171875
+63 0.93798828125 0.18798828125 0.99951171875 0.24951171875
+64 0.00048828125 0.25048828125 0.06201171875 0.31201171875
+65 0.06298828125 0.25048828125 0.12451171875 0.31201171875
+66 0.12548828125 0.25048828125 0.18701171875 0.31201171875
+67 0.18798828125 0.25048828125 0.24951171875 0.31201171875
+68 0.25048828125 0.25048828125 0.31201171875 0.31201171875
+69 0.31298828125 0.25048828125 0.37451171875 0.31201171875
+70 0.37548828125 0.25048828125 0.43701171875 0.31201171875
+71 0.43798828125 0.25048828125 0.49951171875 0.31201171875
+72 0.50048828125 0.25048828125 0.56201171875 0.31201171875
+73 0.56298828125 0.25048828125 0.62451171875 0.31201171875
+74 0.62548828125 0.25048828125 0.68701171875 0.31201171875
+75 0.68798828125 0.25048828125 0.74951171875 0.31201171875
+76 0.75048828125 0.25048828125 0.81201171875 0.31201171875
+77 0.81298828125 0.25048828125 0.87451171875 0.31201171875
+78 0.87548828125 0.25048828125 0.93701171875 0.31201171875
+79 0.93798828125 0.25048828125 0.99951171875 0.31201171875
+80 0.00048828125 0.31298828125 0.06201171875 0.37451171875
+81 0.06298828125 0.31298828125 0.12451171875 0.37451171875
+82 0.12548828125 0.31298828125 0.18701171875 0.37451171875
+83 0.18798828125 0.31298828125 0.24951171875 0.37451171875
+84 0.25048828125 0.31298828125 0.31201171875 0.37451171875
+85 0.31298828125 0.31298828125 0.37451171875 0.37451171875
+86 0.37548828125 0.31298828125 0.43701171875 0.37451171875
+87 0.43798828125 0.31298828125 0.49951171875 0.37451171875
+88 0.50048828125 0.31298828125 0.56201171875 0.37451171875
+89 0.56298828125 0.31298828125 0.62451171875 0.37451171875
+90 0.62548828125 0.31298828125 0.68701171875 0.37451171875
+91 0.68798828125 0.31298828125 0.74951171875 0.37451171875
+92 0.75048828125 0.31298828125 0.81201171875 0.37451171875
+93 0.81298828125 0.31298828125 0.87451171875 0.37451171875
+94 0.87548828125 0.31298828125 0.93701171875 0.37451171875
+95 0.93798828125 0.31298828125 0.99951171875 0.37451171875
+96 0.00048828125 0.37548828125 0.06201171875 0.43701171875
+97 0.06298828125 0.37548828125 0.12451171875 0.43701171875
+98 0.12548828125 0.37548828125 0.18701171875 0.43701171875
+99 0.18798828125 0.37548828125 0.24951171875 0.43701171875
+100 0.25048828125 0.37548828125 0.31201171875 0.43701171875
+101 0.31298828125 0.37548828125 0.37451171875 0.43701171875
+102 0.37548828125 0.37548828125 0.43701171875 0.43701171875
+103 0.43798828125 0.37548828125 0.49951171875 0.43701171875
+104 0.50048828125 0.37548828125 0.56201171875 0.43701171875
+105 0.56298828125 0.37548828125 0.62451171875 0.43701171875
+106 0.62548828125 0.37548828125 0.68701171875 0.43701171875
+107 0.68798828125 0.37548828125 0.74951171875 0.43701171875
+108 0.75048828125 0.37548828125 0.81201171875 0.43701171875
+109 0.81298828125 0.37548828125 0.87451171875 0.43701171875
+110 0.87548828125 0.37548828125 0.93701171875 0.43701171875
+111 0.93798828125 0.37548828125 0.99951171875 0.43701171875
+112 0.00048828125 0.43798828125 0.06201171875 0.49951171875
+113 0.06298828125 0.43798828125 0.12451171875 0.49951171875
+114 0.12548828125 0.43798828125 0.18701171875 0.49951171875
+115 0.18798828125 0.43798828125 0.24951171875 0.49951171875
+116 0.25048828125 0.43798828125 0.31201171875 0.49951171875
+117 0.31298828125 0.43798828125 0.37451171875 0.49951171875
+118 0.37548828125 0.43798828125 0.43701171875 0.49951171875
+119 0.43798828125 0.43798828125 0.49951171875 0.49951171875
+120 0.50048828125 0.43798828125 0.56201171875 0.49951171875
+121 0.56298828125 0.43798828125 0.62451171875 0.49951171875
+122 0.62548828125 0.43798828125 0.68701171875 0.49951171875
+123 0.68798828125 0.43798828125 0.74951171875 0.49951171875
+124 0.75048828125 0.43798828125 0.81201171875 0.49951171875
+125 0.81298828125 0.43798828125 0.87451171875 0.49951171875
+126 0.87548828125 0.43798828125 0.93701171875 0.49951171875
+127 0.93798828125 0.43798828125 0.99951171875 0.49951171875
+128 0.00048828125 0.50048828125 0.06201171875 0.56201171875
+129 0.06298828125 0.50048828125 0.12451171875 0.56201171875
+130 0.12548828125 0.50048828125 0.18701171875 0.56201171875
+131 0.18798828125 0.50048828125 0.24951171875 0.56201171875
+132 0.25048828125 0.50048828125 0.31201171875 0.56201171875
+133 0.31298828125 0.50048828125 0.37451171875 0.56201171875
+134 0.37548828125 0.50048828125 0.43701171875 0.56201171875
+135 0.43798828125 0.50048828125 0.49951171875 0.56201171875
+136 0.50048828125 0.50048828125 0.56201171875 0.56201171875
+137 0.56298828125 0.50048828125 0.62451171875 0.56201171875
+138 0.62548828125 0.50048828125 0.68701171875 0.56201171875
+139 0.68798828125 0.50048828125 0.74951171875 0.56201171875
+140 0.75048828125 0.50048828125 0.81201171875 0.56201171875
+141 0.81298828125 0.50048828125 0.87451171875 0.56201171875
+142 0.87548828125 0.50048828125 0.93701171875 0.56201171875
+143 0.93798828125 0.50048828125 0.99951171875 0.56201171875
+144 0.00048828125 0.56298828125 0.06201171875 0.62451171875
+145 0.06298828125 0.56298828125 0.12451171875 0.62451171875
+146 0.12548828125 0.56298828125 0.18701171875 0.62451171875
+147 0.18798828125 0.56298828125 0.24951171875 0.62451171875
+148 0.25048828125 0.56298828125 0.31201171875 0.62451171875
+149 0.31298828125 0.56298828125 0.37451171875 0.62451171875
+150 0.37548828125 0.56298828125 0.43701171875 0.62451171875
+151 0.43798828125 0.56298828125 0.49951171875 0.62451171875
+152 0.50048828125 0.56298828125 0.56201171875 0.62451171875
+153 0.56298828125 0.56298828125 0.62451171875 0.62451171875
+154 0.62548828125 0.56298828125 0.68701171875 0.62451171875
+155 0.68798828125 0.56298828125 0.74951171875 0.62451171875
+156 0.75048828125 0.56298828125 0.81201171875 0.62451171875
+157 0.81298828125 0.56298828125 0.87451171875 0.62451171875
+158 0.87548828125 0.56298828125 0.93701171875 0.62451171875
+159 0.93798828125 0.56298828125 0.99951171875 0.62451171875
+1000 0 0.62548828125 1 0.68701171875
+1001 0 0.68798828125 1 0.74951171875
+1002 0 0.75048828125 1 0.81201171875
+1003 0 0.81298828125 1 0.87451171875
+1004 0 0.87548828125 1 0.93701171875
+1005 0 0.93798828125 1 0.99951171875
index 5455e7b16c2ec6a03459332c544c4ae8232ead0c..8ee89adb08bc7ad249a7ff3162ce9bf74ce66315 100644 (file)
Binary files a/particles/particlefont.tga and b/particles/particlefont.tga differ
index 10073ca6f5725a2cad65e7a63c84d11aab046eef..2994f82a1bd411d7d42cfab217a200a6ed782d9a 100644 (file)
-0 0.001953125 0.001953125 0.123046875 0.123046875
-1 0.126953125 0.001953125 0.248046875 0.123046875
-2 0.251953125 0.001953125 0.373046875 0.123046875
-3 0.376953125 0.001953125 0.498046875 0.123046875
-4 0.501953125 0.001953125 0.623046875 0.123046875
-5 0.626953125 0.001953125 0.748046875 0.123046875
-6 0.751953125 0.001953125 0.873046875 0.123046875
-7 0.876953125 0.001953125 0.998046875 0.123046875
-8 0.001953125 0.126953125 0.123046875 0.248046875
-9 0.126953125 0.126953125 0.248046875 0.248046875
-10 0.251953125 0.126953125 0.373046875 0.248046875
-11 0.376953125 0.126953125 0.498046875 0.248046875
-12 0.501953125 0.126953125 0.623046875 0.248046875
-13 0.626953125 0.126953125 0.748046875 0.248046875
-14 0.751953125 0.126953125 0.873046875 0.248046875
-15 0.876953125 0.126953125 0.998046875 0.248046875
-16 0.001953125 0.251953125 0.123046875 0.373046875
-17 0.126953125 0.251953125 0.248046875 0.373046875
-18 0.251953125 0.251953125 0.373046875 0.373046875
-19 0.376953125 0.251953125 0.498046875 0.373046875
-20 0.501953125 0.251953125 0.623046875 0.373046875
-21 0.626953125 0.251953125 0.748046875 0.373046875
-22 0.751953125 0.251953125 0.873046875 0.373046875
-23 0.876953125 0.251953125 0.998046875 0.373046875
-24 0.001953125 0.376953125 0.123046875 0.498046875
-25 0.126953125 0.376953125 0.248046875 0.498046875
-26 0.251953125 0.376953125 0.373046875 0.498046875
-27 0.376953125 0.376953125 0.498046875 0.498046875
-28 0.501953125 0.376953125 0.623046875 0.498046875
-29 0.626953125 0.376953125 0.748046875 0.498046875
-30 0.751953125 0.376953125 0.873046875 0.498046875
-31 0.876953125 0.376953125 0.998046875 0.498046875
-32 0.001953125 0.501953125 0.123046875 0.623046875
-33 0.126953125 0.501953125 0.248046875 0.623046875
-34 0.251953125 0.501953125 0.373046875 0.623046875
-35 0.376953125 0.501953125 0.498046875 0.623046875
-36 0.501953125 0.501953125 0.623046875 0.623046875
-37 0.626953125 0.501953125 0.748046875 0.623046875
-38 0.751953125 0.501953125 0.873046875 0.623046875
-39 0.876953125 0.501953125 0.998046875 0.623046875
-40 0.001953125 0.626953125 0.123046875 0.748046875
-41 0.126953125 0.626953125 0.248046875 0.748046875
-42 0.251953125 0.626953125 0.373046875 0.748046875
-43 0.376953125 0.626953125 0.498046875 0.748046875
-44 0.501953125 0.626953125 0.623046875 0.748046875
-45 0.626953125 0.626953125 0.748046875 0.748046875
-46 0.751953125 0.626953125 0.873046875 0.748046875
-47 0.876953125 0.626953125 0.998046875 0.748046875
-48 0.001953125 0.751953125 0.123046875 0.873046875
-49 0.126953125 0.751953125 0.248046875 0.873046875
-50 0.251953125 0.751953125 0.373046875 0.873046875
-51 0.376953125 0.751953125 0.498046875 0.873046875
-52 0.501953125 0.751953125 0.623046875 0.873046875
-53 0.626953125 0.751953125 0.748046875 0.873046875
-54 0.751953125 0.751953125 0.873046875 0.873046875
-55 0.876953125 0.751953125 0.998046875 0.873046875
-56 0.001953125 0.876953125 0.123046875 0.998046875
-57 0.126953125 0.876953125 0.248046875 0.998046875
-58 0.251953125 0.876953125 0.373046875 0.998046875
-59 0.376953125 0.876953125 0.498046875 0.998046875
-// 60 0.501953125 0.876953125 0.623046875 0.998046875
-61 0.626953125 0.876953125 0.748046875 0.998046875
-62 0.751953125 0.876953125 0.873046875 0.998046875
-63 0.876953125 0.876953125 0.998046875 0.998046875
+0 0.00048828125 0.00048828125 0.06201171875 0.06201171875
+1 0.06298828125 0.00048828125 0.12451171875 0.06201171875
+2 0.12548828125 0.00048828125 0.18701171875 0.06201171875
+3 0.18798828125 0.00048828125 0.24951171875 0.06201171875
+4 0.25048828125 0.00048828125 0.31201171875 0.06201171875
+5 0.31298828125 0.00048828125 0.37451171875 0.06201171875
+6 0.37548828125 0.00048828125 0.43701171875 0.06201171875
+7 0.43798828125 0.00048828125 0.49951171875 0.06201171875
+8 0.50048828125 0.00048828125 0.56201171875 0.06201171875
+9 0.56298828125 0.00048828125 0.62451171875 0.06201171875
+10 0.62548828125 0.00048828125 0.68701171875 0.06201171875
+11 0.68798828125 0.00048828125 0.74951171875 0.06201171875
+12 0.75048828125 0.00048828125 0.81201171875 0.06201171875
+13 0.81298828125 0.00048828125 0.87451171875 0.06201171875
+14 0.87548828125 0.00048828125 0.93701171875 0.06201171875
+15 0.93798828125 0.00048828125 0.99951171875 0.06201171875
+16 0.00048828125 0.06298828125 0.06201171875 0.12451171875
+17 0.06298828125 0.06298828125 0.12451171875 0.12451171875
+18 0.12548828125 0.06298828125 0.18701171875 0.12451171875
+19 0.18798828125 0.06298828125 0.24951171875 0.12451171875
+20 0.25048828125 0.06298828125 0.31201171875 0.12451171875
+21 0.31298828125 0.06298828125 0.37451171875 0.12451171875
+22 0.37548828125 0.06298828125 0.43701171875 0.12451171875
+23 0.43798828125 0.06298828125 0.49951171875 0.12451171875
+24 0.50048828125 0.06298828125 0.56201171875 0.12451171875
+25 0.56298828125 0.06298828125 0.62451171875 0.12451171875
+26 0.62548828125 0.06298828125 0.68701171875 0.12451171875
+27 0.68798828125 0.06298828125 0.74951171875 0.12451171875
+28 0.75048828125 0.06298828125 0.81201171875 0.12451171875
+29 0.81298828125 0.06298828125 0.87451171875 0.12451171875
+30 0.87548828125 0.06298828125 0.93701171875 0.12451171875
+31 0.93798828125 0.06298828125 0.99951171875 0.12451171875
+32 0.00048828125 0.12548828125 0.06201171875 0.18701171875
+33 0.06298828125 0.12548828125 0.12451171875 0.18701171875
+34 0.12548828125 0.12548828125 0.18701171875 0.18701171875
+35 0.18798828125 0.12548828125 0.24951171875 0.18701171875
+36 0.25048828125 0.12548828125 0.31201171875 0.18701171875
+37 0.31298828125 0.12548828125 0.37451171875 0.18701171875
+38 0.37548828125 0.12548828125 0.43701171875 0.18701171875
+39 0.43798828125 0.12548828125 0.49951171875 0.18701171875
+40 0.50048828125 0.12548828125 0.56201171875 0.18701171875
+41 0.56298828125 0.12548828125 0.62451171875 0.18701171875
+42 0.62548828125 0.12548828125 0.68701171875 0.18701171875
+43 0.68798828125 0.12548828125 0.74951171875 0.18701171875
+44 0.75048828125 0.12548828125 0.81201171875 0.18701171875
+45 0.81298828125 0.12548828125 0.87451171875 0.18701171875
+46 0.87548828125 0.12548828125 0.93701171875 0.18701171875
+47 0.93798828125 0.12548828125 0.99951171875 0.18701171875
+48 0.00048828125 0.18798828125 0.06201171875 0.24951171875
+49 0.06298828125 0.18798828125 0.12451171875 0.24951171875
+50 0.12548828125 0.18798828125 0.18701171875 0.24951171875
+51 0.18798828125 0.18798828125 0.24951171875 0.24951171875
+52 0.25048828125 0.18798828125 0.31201171875 0.24951171875
+53 0.31298828125 0.18798828125 0.37451171875 0.24951171875
+54 0.37548828125 0.18798828125 0.43701171875 0.24951171875
+55 0.43798828125 0.18798828125 0.49951171875 0.24951171875
+56 0.50048828125 0.18798828125 0.56201171875 0.24951171875
+57 0.56298828125 0.18798828125 0.62451171875 0.24951171875
+58 0.62548828125 0.18798828125 0.68701171875 0.24951171875
+59 0.68798828125 0.18798828125 0.74951171875 0.24951171875
+60 0.75048828125 0.18798828125 0.81201171875 0.24951171875
+61 0.81298828125 0.18798828125 0.87451171875 0.24951171875
+62 0.87548828125 0.18798828125 0.93701171875 0.24951171875
+63 0.93798828125 0.18798828125 0.99951171875 0.24951171875
+64 0.00048828125 0.25048828125 0.06201171875 0.31201171875
+65 0.06298828125 0.25048828125 0.12451171875 0.31201171875
+66 0.12548828125 0.25048828125 0.18701171875 0.31201171875
+67 0.18798828125 0.25048828125 0.24951171875 0.31201171875
+68 0.25048828125 0.25048828125 0.31201171875 0.31201171875
+69 0.31298828125 0.25048828125 0.37451171875 0.31201171875
+70 0.37548828125 0.25048828125 0.43701171875 0.31201171875
+71 0.43798828125 0.25048828125 0.49951171875 0.31201171875
+72 0.50048828125 0.25048828125 0.56201171875 0.31201171875
+73 0.56298828125 0.25048828125 0.62451171875 0.31201171875
+74 0.62548828125 0.25048828125 0.68701171875 0.31201171875
+75 0.68798828125 0.25048828125 0.74951171875 0.31201171875
+76 0.75048828125 0.25048828125 0.81201171875 0.31201171875
+77 0.81298828125 0.25048828125 0.87451171875 0.31201171875
+78 0.87548828125 0.25048828125 0.93701171875 0.31201171875
+79 0.93798828125 0.25048828125 0.99951171875 0.31201171875
+80 0.00048828125 0.31298828125 0.06201171875 0.37451171875
+81 0.06298828125 0.31298828125 0.12451171875 0.37451171875
+82 0.12548828125 0.31298828125 0.18701171875 0.37451171875
+83 0.18798828125 0.31298828125 0.24951171875 0.37451171875
+84 0.25048828125 0.31298828125 0.31201171875 0.37451171875
+85 0.31298828125 0.31298828125 0.37451171875 0.37451171875
+86 0.37548828125 0.31298828125 0.43701171875 0.37451171875
+87 0.43798828125 0.31298828125 0.49951171875 0.37451171875
+88 0.50048828125 0.31298828125 0.56201171875 0.37451171875
+89 0.56298828125 0.31298828125 0.62451171875 0.37451171875
+90 0.62548828125 0.31298828125 0.68701171875 0.37451171875
+91 0.68798828125 0.31298828125 0.74951171875 0.37451171875
+92 0.75048828125 0.31298828125 0.81201171875 0.37451171875
+93 0.81298828125 0.31298828125 0.87451171875 0.37451171875
+94 0.87548828125 0.31298828125 0.93701171875 0.37451171875
+95 0.93798828125 0.31298828125 0.99951171875 0.37451171875
+96 0.00048828125 0.37548828125 0.06201171875 0.43701171875
+97 0.06298828125 0.37548828125 0.12451171875 0.43701171875
+98 0.12548828125 0.37548828125 0.18701171875 0.43701171875
+99 0.18798828125 0.37548828125 0.24951171875 0.43701171875
+100 0.25048828125 0.37548828125 0.31201171875 0.43701171875
+101 0.31298828125 0.37548828125 0.37451171875 0.43701171875
+102 0.37548828125 0.37548828125 0.43701171875 0.43701171875
+103 0.43798828125 0.37548828125 0.49951171875 0.43701171875
+104 0.50048828125 0.37548828125 0.56201171875 0.43701171875
+105 0.56298828125 0.37548828125 0.62451171875 0.43701171875
+106 0.62548828125 0.37548828125 0.68701171875 0.43701171875
+107 0.68798828125 0.37548828125 0.74951171875 0.43701171875
+108 0.75048828125 0.37548828125 0.81201171875 0.43701171875
+109 0.81298828125 0.37548828125 0.87451171875 0.43701171875
+110 0.87548828125 0.37548828125 0.93701171875 0.43701171875
+111 0.93798828125 0.37548828125 0.99951171875 0.43701171875
+112 0.00048828125 0.43798828125 0.06201171875 0.49951171875
+113 0.06298828125 0.43798828125 0.12451171875 0.49951171875
+114 0.12548828125 0.43798828125 0.18701171875 0.49951171875
+115 0.18798828125 0.43798828125 0.24951171875 0.49951171875
+116 0.25048828125 0.43798828125 0.31201171875 0.49951171875
+117 0.31298828125 0.43798828125 0.37451171875 0.49951171875
+118 0.37548828125 0.43798828125 0.43701171875 0.49951171875
+119 0.43798828125 0.43798828125 0.49951171875 0.49951171875
+120 0.50048828125 0.43798828125 0.56201171875 0.49951171875
+121 0.56298828125 0.43798828125 0.62451171875 0.49951171875
+122 0.62548828125 0.43798828125 0.68701171875 0.49951171875
+123 0.68798828125 0.43798828125 0.74951171875 0.49951171875
+124 0.75048828125 0.43798828125 0.81201171875 0.49951171875
+125 0.81298828125 0.43798828125 0.87451171875 0.49951171875
+126 0.87548828125 0.43798828125 0.93701171875 0.49951171875
+127 0.93798828125 0.43798828125 0.99951171875 0.49951171875
+128 0.00048828125 0.50048828125 0.06201171875 0.56201171875
+129 0.06298828125 0.50048828125 0.12451171875 0.56201171875
+130 0.12548828125 0.50048828125 0.18701171875 0.56201171875
+131 0.18798828125 0.50048828125 0.24951171875 0.56201171875
+132 0.25048828125 0.50048828125 0.31201171875 0.56201171875
+133 0.31298828125 0.50048828125 0.37451171875 0.56201171875
+134 0.37548828125 0.50048828125 0.43701171875 0.56201171875
+135 0.43798828125 0.50048828125 0.49951171875 0.56201171875
+136 0.50048828125 0.50048828125 0.56201171875 0.56201171875
+137 0.56298828125 0.50048828125 0.62451171875 0.56201171875
+138 0.62548828125 0.50048828125 0.68701171875 0.56201171875
+139 0.68798828125 0.50048828125 0.74951171875 0.56201171875
+140 0.75048828125 0.50048828125 0.81201171875 0.56201171875
+141 0.81298828125 0.50048828125 0.87451171875 0.56201171875
+142 0.87548828125 0.50048828125 0.93701171875 0.56201171875
+143 0.93798828125 0.50048828125 0.99951171875 0.56201171875
+144 0.00048828125 0.56298828125 0.06201171875 0.62451171875
+145 0.06298828125 0.56298828125 0.12451171875 0.62451171875
+146 0.12548828125 0.56298828125 0.18701171875 0.62451171875
+147 0.18798828125 0.56298828125 0.24951171875 0.62451171875
+148 0.25048828125 0.56298828125 0.31201171875 0.62451171875
+149 0.31298828125 0.56298828125 0.37451171875 0.62451171875
+150 0.37548828125 0.56298828125 0.43701171875 0.62451171875
+151 0.43798828125 0.56298828125 0.49951171875 0.62451171875
+152 0.50048828125 0.56298828125 0.56201171875 0.62451171875
+153 0.56298828125 0.56298828125 0.62451171875 0.62451171875
+154 0.62548828125 0.56298828125 0.68701171875 0.62451171875
+155 0.68798828125 0.56298828125 0.74951171875 0.62451171875
+156 0.75048828125 0.56298828125 0.81201171875 0.62451171875
+157 0.81298828125 0.56298828125 0.87451171875 0.62451171875
+158 0.87548828125 0.56298828125 0.93701171875 0.62451171875
+159 0.93798828125 0.56298828125 0.99951171875 0.62451171875
+200 0 0.62548828125 1 0.68701171875
+201 0 0.68798828125 1 0.74951171875
+202 0 0.75048828125 1 0.81201171875
+203 0 0.81298828125 1 0.87451171875
+204 0 0.87548828125 1 0.93701171875
+205 0 0.93798828125 1 0.99951171875
index 30f22a6cbc8e4f0a0ac843064df4e36880383c45..4631d5ea7b5f6d129267ab4858387545ea97fd76 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 0
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index 46d6587b9e49af9a84b690d306a5d1ae871f7207..8c8219af5fa0fd30a05e4f178a865a6e1a68690c 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 0
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index e56e6f1a334a84c2e219bd82a577db4e96584d7b..9707f6f7ce6002d736d5c00b75256921d162f1eb 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 0
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index 528f62336bdf65b4ca90d78469cdbfc3277a1ce1..475875b1a2f316341c8c975580d58188292addc1 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 0
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index bdf1525518be8ffadbefede42bb266a339bcfde6..68a8f198ef6e48d074efa4aa153b53f110b7b9de 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 0
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index 6aaf747cc1c05ddac18ecf178af1dba271667f5f..b2e056ee5a9e092fd0dc011683ccdae0ac5e6449 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 0.93
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index b60f74b9a580c8e046da2cff350e07bb3ff72a8c..85e4841cd127b739ddfcfc2e757e020787557e53 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 0.95
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index a31467897663c3b706e5a0ab69b99e4983bb5301..0e4de396e70cdcb29b59e143a6e70ca021ec9edf 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 0.95
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index 95b34c25bdeeec83e7310cd058a528cf7d21647c..d572e6d97f5606864aa6e57f4edb976c10596ef5 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 1
 sv_airstopaccelerate 2.5
 sv_airstrafeaccelerate 70
 sv_maxairstrafespeed 30
+sv_airstrafeaccel_qw 0
 sv_aircontrol 150
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index 78d4240430771aec3fc85b43529e2a73b702d6f7..eb63775623b486ae5e77ed5a0cd8c64e6fd5face 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 0.95
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
diff --git a/physicsLeeStricklin.cfg b/physicsLeeStricklin.cfg
new file mode 100644 (file)
index 0000000..4a959db
--- /dev/null
@@ -0,0 +1,32 @@
+// These have been modified from Nexuiz 2.4.2's physicsQBR.cfg file
+sv_gravity 800
+sv_gravity 802
+sv_maxspeed 417
+sv_maxairspeed 202
+sv_stopspeed 100
+sv_accelerate 5.8
+sv_airaccelerate 5.5
+sv_friction 4.1
+edgefriction 1
+sv_stepheight 34
+sv_jumpvelocity 307
+sv_wateraccelerate -1
+sv_waterfriction -1
+sv_airaccel_sideways_friction 0.207
+sv_airaccel_qw -0.93
+sv_airstopaccelerate 0
+sv_airstrafeaccelerate 0
+sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
+sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0
+sv_doublejump 0
+sv_jumpspeedcap_min ""
+sv_jumpspeedcap_max ""
+sv_jumpspeedcap_max_disable_on_ramps 0
index 0349610e30309357587fd6bd7fb498c4d5da2ee2..2b437d3443a0dd62dfcad4602064d7de51c07dd2 100644 (file)
@@ -17,7 +17,10 @@ sv_airaccel_qw 0.95
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
diff --git a/physicsNexrun.cfg b/physicsNexrun.cfg
deleted file mode 100644 (file)
index 122c89b..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-// Nexrun tweaked to suit CPM
-sv_gravity 800
-sv_maxspeed 320
-// CPMA: 320
-sv_maxairspeed 320
-// CPMA: 320
-sv_stopspeed 100
-sv_accelerate 15
-sv_airaccelerate 1
-sv_friction 8
-edgefriction 1
-sv_stepheight 34
-// CPMA: 18
-sv_jumpvelocity 270
-sv_wateraccelerate 4
-sv_waterfriction 1
-sv_airaccel_sideways_friction 0
-sv_airaccel_qw 0.95
-// CPMA: 1
-sv_airstopaccelerate 2.5
-sv_airstrafeaccelerate 70
-sv_maxairstrafespeed 30
-sv_aircontrol 150
-sv_warsowbunny_turnaccel 0
-sv_warsowbunny_accel 0.1593
-sv_warsowbunny_topspeed 925
-sv_warsowbunny_backtosideratio 0.8
-sv_friction_on_land 0
-sv_doublejump 1
-sv_jumpspeedcap_min 0
-sv_jumpspeedcap_max 1
-sv_jumpspeedcap_max_disable_on_ramps 1
diff --git a/physicsNexrun_old.cfg b/physicsNexrun_old.cfg
deleted file mode 100644 (file)
index 6142cf2..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-// CPMA tweaked to match the speeds in old Nexrun
-sv_gravity 800
-sv_maxspeed 400
-// CPMA: 320
-sv_maxairspeed 400
-// CPMA: 320
-sv_stopspeed 100
-sv_accelerate 15
-sv_airaccelerate 1
-sv_friction 8
-edgefriction 1
-sv_stepheight 34
-// CPMA: 18
-sv_jumpvelocity 270
-sv_wateraccelerate 4
-sv_waterfriction 1
-sv_airaccel_sideways_friction 0
-sv_airaccel_qw 0.95
-// CPMA: 1
-sv_airstopaccelerate 2.5
-sv_airstrafeaccelerate 70
-sv_maxairstrafespeed 30
-sv_aircontrol 150
-sv_warsowbunny_turnaccel 0
-sv_warsowbunny_accel 0.1593
-sv_warsowbunny_topspeed 925
-sv_warsowbunny_backtosideratio 0.8
-sv_friction_on_land 0
-sv_doublejump 1
-sv_jumpspeedcap_min 0
-sv_jumpspeedcap_max 1
-sv_jumpspeedcap_max_disable_on_ramps 1
index 363a425558d4e48e363f41bd513b247b7d2d3fb1..d70bc1bde1fa2a981a5ac98d55f45aa559ea9a18 100644 (file)
@@ -1,22 +1,25 @@
-// Xonotic 2.0-2.4.2 physics minus QW-bunnyhopping-bug, faster onground accel, CPMA air control
+// 2.0-2.4.2 physics minus QW-bunnyhopping-bug, faster onground accel, CPMA air control
 sv_gravity 800
-sv_maxspeed 320
-sv_maxairspeed 320
+sv_maxspeed 400
+sv_maxairspeed 400
 sv_stopspeed 100
 sv_accelerate 15
-sv_airaccelerate 5.5
-sv_friction 5
+sv_airaccelerate 2
+sv_friction 7
 edgefriction 1
 sv_stepheight 34
 sv_jumpvelocity 300
 sv_wateraccelerate -1
 sv_waterfriction -1
-sv_airaccel_sideways_friction -1
-sv_airaccel_qw -0.95
-sv_airstopaccelerate 0
-sv_airstrafeaccelerate 0
-sv_maxairstrafespeed 0
-sv_aircontrol 70
+sv_airaccel_sideways_friction -0.2
+sv_airaccel_qw -0.9475
+sv_airstopaccelerate 2.5
+sv_airstrafeaccelerate 24
+sv_maxairstrafespeed 100
+sv_airstrafeaccel_qw -0.9825
+sv_aircontrol 125
+sv_aircontrol_power 2.5
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
@@ -25,4 +28,4 @@ sv_friction_on_land 0
 sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
-sv_jumpspeedcap_max_disable_on_ramps 0
+sv_jumpspeedcap_max_disable_on_ramps 1
index 51cf682f360ca615174528c9f98ebbf6e132f6ed..ea8e1acf7bdd167e971f3a30dde9ca6fdeafb571 100644 (file)
@@ -17,7 +17,10 @@ sv_airaccel_qw 1
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index ecbd2a3dde74c0640af838c773b0dabb78beb157..1d08ae8c7400b13cac0c0b1ca23207e8d10ce3b3 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 1
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index 76c0ba17d91919283ae4ac2849fae94d2a9c79cc..7409ae4be2c327173ea97be61ab07de43d7863cd 100644 (file)
@@ -17,7 +17,10 @@ sv_airaccel_qw 1
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index 6b8d4c1f85218e5e432c3e044daf09281b4cf21e..1951becf20abd05d24685a6e51b813dabe592b23 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 1
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index 2e2d0b5e47fd5240d9511044bb2770947b3b1814..4bbb9be2d4f91eab389b0653e9fcf12e83743edd 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 1
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index f64b2be4676d186176f348996f726487fcdb07cc..6c17ad683b7905284ec5ff9d65e94c41e8c36453 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 0.93
 sv_airstopaccelerate 0
 sv_airstrafeaccelerate 0
 sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index f4a184044c571845a50c1e40ddbd789da2c60453..e03363a088ba30a3d59e1c9d8eccbefa1f5595d0 100644 (file)
@@ -1,27 +1,31 @@
-sv_gravity 880\r
-sv_maxspeed 420\r
-sv_maxairspeed 235\r
-sv_stopspeed 200\r
-sv_accelerate 6\r
-sv_airaccelerate 6\r
-sv_friction 4\r
-edgefriction 0\r
-sv_stepheight 34\r
-sv_jumpvelocity 330\r
-sv_wateraccelerate -1\r
-sv_waterfriction -1\r
-sv_airaccel_sideways_friction 0.3\r
-sv_airaccel_qw 0.93\r
-sv_airstopaccelerate 0\r
-sv_airstrafeaccelerate 0\r
-sv_maxairstrafespeed 0\r
-sv_aircontrol 0\r
-sv_warsowbunny_turnaccel 0\r
-sv_warsowbunny_accel 0.1593\r
-sv_warsowbunny_topspeed 925\r
-sv_warsowbunny_backtosideratio 0.8\r
-sv_friction_on_land 0\r
-sv_doublejump 0\r
+// Mix of 2.3 physics and NANL physics, goal of going for faster movement
+sv_gravity 800
+sv_maxspeed 420
+sv_maxairspeed 235
+sv_stopspeed 200
+sv_accelerate 6
+sv_airaccelerate 6
+sv_friction 4
+edgefriction 1
+sv_stepheight 34
+sv_jumpvelocity 300
+sv_wateraccelerate -1
+sv_waterfriction -1
+sv_airaccel_sideways_friction 0.3
+sv_airaccel_qw 0.93
+sv_airstopaccelerate 0
+sv_airstrafeaccelerate 0
+sv_maxairstrafespeed 0
+sv_airstrafeaccel_qw 0
+sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0
+sv_doublejump 0
 sv_jumpspeedcap_min ""
 sv_jumpspeedcap_max ""
 sv_jumpspeedcap_max_disable_on_ramps 0
index eeb919bf86c42084c368b7db836f4b83c953c75e..b1b0655cbc863b9a7394076401300b61cf3579fe 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 1
 sv_airstopaccelerate 2.5
 sv_airstrafeaccelerate 70
 sv_maxairstrafespeed 30
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 9 // activates warsow movement mode
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index 0a66f454377864ccc8ed3b065258a5969ce35858..06e7c1a575c61ffba43a5382974affbc32128ef6 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 1
 sv_airstopaccelerate 2.5
 sv_airstrafeaccelerate 70
 sv_maxairstrafespeed 30
+sv_airstrafeaccel_qw 0
 sv_aircontrol 150
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 0
 sv_warsowbunny_accel 0.1593
 sv_warsowbunny_topspeed 925
index 4f7fff927cc4b0ffedc38359d0dab238f867a5e0..cb07a488180082f927575f3c39ee515f9aaf648b 100644 (file)
@@ -16,7 +16,10 @@ sv_airaccel_qw 1
 sv_airstopaccelerate 2
 sv_airstrafeaccelerate 70
 sv_maxairstrafespeed 30
+sv_airstrafeaccel_qw 0
 sv_aircontrol 0
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
 sv_warsowbunny_turnaccel 6 // activates warsow movement mode
 sv_warsowbunny_accel 0.1585
 sv_warsowbunny_topspeed 900
diff --git a/physicsXPM.cfg b/physicsXPM.cfg
new file mode 100644 (file)
index 0000000..2a60b65
--- /dev/null
@@ -0,0 +1,35 @@
+// Nexrun tweaked to suit CPM
+sv_gravity 800
+sv_maxspeed 320
+// CPMA: 320
+sv_maxairspeed 320
+// CPMA: 320
+sv_stopspeed 100
+sv_accelerate 15
+sv_airaccelerate 1
+sv_friction 8
+edgefriction 1
+sv_stepheight 34
+// CPMA: 18
+sv_jumpvelocity 270
+sv_wateraccelerate 4
+sv_waterfriction 1
+sv_airaccel_sideways_friction 0
+sv_airaccel_qw 0.95
+// CPMA: 1
+sv_airstopaccelerate 2.5
+sv_airstrafeaccelerate 70
+sv_maxairstrafespeed 30
+sv_airstrafeaccel_qw 1
+sv_aircontrol 150
+sv_aircontrol_power 2
+sv_airspeedlimit_nonqw 0
+sv_warsowbunny_turnaccel 0
+sv_warsowbunny_accel 0.1593
+sv_warsowbunny_topspeed 925
+sv_warsowbunny_backtosideratio 0.8
+sv_friction_on_land 0
+sv_doublejump 1
+sv_jumpspeedcap_min 0
+sv_jumpspeedcap_max 1
+sv_jumpspeedcap_max_disable_on_ramps 1
index 985bcc7eacc9ab0cbac6aff21bbe43b71f90fb7e..575f8b0622deb1b433f54702e79c17a2cf10a352 100644 (file)
@@ -60,6 +60,10 @@ void CSQC_Init(void)
        
        check_unacceptable_compiler_bugs();
 
+#ifdef WATERMARK
+       print("^4CSQC Build information: ", WATERMARK(), "\n");
+#endif
+
        float i;
        CSQC_CheckEngine();
 
@@ -584,12 +588,16 @@ void GameCommand(string msg)
                localcmd("sv_cmd debug_shotorg\n");
        }
        else if(cmd == "sendcvar") {
-               s = cvar_string(argv(1));
-               if(argv(1) == "cl_weaponpriority")
+               // W_FixWeaponOrder will trash argv, so save what we need.
+               string cvar;
+               cvar = strzone(argv(1));
+               s = cvar_string(cvar);
+               if(cvar == "cl_weaponpriority")
                        s = W_FixWeaponOrder(W_NumberWeaponOrder(s), 1);
-               else if(substring(argv(1), 0, 17) == "cl_weaponpriority" && strlen(argv(1)) == 18)
+               else if(substring(cvar, 0, 17) == "cl_weaponpriority" && strlen(cvar) == 18)
                        s = W_FixWeaponOrder(W_NumberWeaponOrder(s), 0);
-               localcmd("cmd sentcvar ", argv(1), " \"", s, "\"\n");
+               localcmd("cmd sentcvar ", cvar, " \"", s, "\"\n");
+               strunzone(cvar);
        }
        else if(cmd == "spawn") {
                s = argv(1);
@@ -902,6 +910,7 @@ void(float bIsNewEntity) CSQC_Ent_Update =
                case ENT_CLIENT_TUBANOTE: Ent_TubaNote(bIsNewEntity); break;
                case ENT_CLIENT_WARPZONE: WarpZone_Read(bIsNewEntity); break;
                case ENT_CLIENT_WARPZONE_CAMERA: WarpZone_Camera_Read(bIsNewEntity); break;
+               case ENT_CLIENT_TRIGGER_MUSIC: Ent_ReadTriggerMusic(); break;
                default:
                        error(strcat("unknown entity type in CSQC_Ent_Update: ", ftos(self.enttype), "\n"));
                        break;
@@ -1016,6 +1025,9 @@ void Ent_Init()
 
        g_weaponswitchdelay = ReadByte() / 255.0;
 
+       g_balance_grenadelauncher_secondary_bouncefactor = ReadCoord();
+       g_balance_grenadelauncher_secondary_bouncestop = ReadCoord();
+
        if(!postinit)
                PostInit();
 }
@@ -1231,6 +1243,10 @@ float CSQC_Parse_TempEntity()
                // NOTE: Could just do return instead of break...
        switch(nTEID)
        {
+               case TE_CSQC_TARGET_MUSIC:
+                       Net_TargetMusic();
+                       bHandled = true;
+                       break;
                case TE_CSQC_PICTURE:
                        Net_MapVote_Picture();
                        bHandled = true;
index c42512a1cab4d06d2d67b7eca9e7029ce9106cc7..0557db1160be5c4a8d0e7d4ae9339e9b72837aae 100644 (file)
@@ -291,6 +291,10 @@ float TrueAimCheck()
                        mi = '-16 -16 -16';
                        ma = '16 16 16';
                        break;
+               case WEP_SEEKER: // projectile has a size!
+                       mi = '-2 -2 -2';
+                       ma = '2 2 2';
+                       break;
                case WEP_ELECTRO: // projectile has a size!
                        mi = '0 0 -3';
                        ma = '0 0 -3';
@@ -341,6 +345,10 @@ float view_set;
 float camera_mode;
 string NextFrameCommand;
 void CSQC_SPIDER_HUD();
+void CSQC_RAPTOR_HUD();
+
+vector freeze_pmove_org, freeze_input_angles;
+
 void CSQC_UpdateView(float w, float h)
 {
        entity e;
@@ -359,10 +367,23 @@ void CSQC_UpdateView(float w, float h)
        vo = '0 0 1' * getstati(STAT_VIEWHEIGHT);
 
        warpzone_fixview_origin = pmove_org + vo;
-       warpzone_fixview_angles = input_angles;
+       warpzone_fixview_cl_viewangles = input_angles;
+       warpzone_fixview_angles = view_angles;
        WarpZone_FixView();
        pmove_org = warpzone_fixview_origin - vo;
-       input_angles = warpzone_fixview_angles;
+       input_angles = warpzone_fixview_cl_viewangles;
+       view_angles = warpzone_fixview_angles;
+
+       if(cvar("cl_lockview"))
+       {
+               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);
+       }
+       freeze_pmove_org = pmove_org;
+       freeze_input_angles = input_angles;
 
        // Render the Scene
        if(!intermission || !view_set)
@@ -398,6 +419,7 @@ void CSQC_UpdateView(float w, float h)
        }
 #endif
 
+       TargetMusic_Advance();
        Fog_Force();
 
        drawframetime = max(0.000001, time - drawtime);
@@ -596,6 +618,8 @@ void CSQC_UpdateView(float w, float h)
        }
        else if(hud == HUD_WAKIZASHI)
         CSQC_WAKIZASHI_HUD();
+    else if(hud == HUD_RAPTOR)
+        CSQC_RAPTOR_HUD();
        else
        {
                if(cvar("r_letterbox") == 0)
@@ -857,13 +881,13 @@ void Sbar_Draw();
 
 void CSQC_SPIDER_HUD()
 {
-       float rockets, reload, heat, hp, shield, i;
+       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), 1);
+       heat    = min(getstatf(STAT_VEHICLESTAT_RELOAD1), 2);
        rockets =     getstati(STAT_VEHICLESTAT_AMMO2);
        reload  = min(getstatf(STAT_VEHICLESTAT_RELOAD2), 1);
 
@@ -882,10 +906,8 @@ void CSQC_SPIDER_HUD()
     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;
@@ -964,6 +986,76 @@ void CSQC_SPIDER_HUD()
 
 }
 
+#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"
+
+#define spider_a1 "gfx/hud/sb_rocket.tga"
+#define spider_a2 "gfx/sb_bullets.tga"
+
+void CSQC_RAPTOR_HUD()
+{
+       float rockets, reload, heat, 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 *= cvar_or("cl_vehicle_spiderbot_cross_size", 1);
+    picsize_y *= cvar_or("cl_vehicle_spiderbot_cross_size", 1);
+    drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', cvar_or("cl_vehicle_spiderbot_cross_alpha",0.6), DRAWFLAG_NORMAL);
+
+    hudloc_y =  4;
+    hudloc_x = 4;
+
+    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)
+    {
+        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);
+    }
+    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 (sb_showscores)
+       {
+               Sbar_DrawScoreboard();
+               Sbar_DrawCenterPrint();
+       }
+
+}
+
 #define waki_h "gfx/vehicles/hud_bg.tga"
 #define waki_b "gfx/vehicles/waki.tga"
 #define waki_e "gfx/vehicles/waki_e.tga"
index d3e42cd986a566348f5a193fe5b62fec97ff5290..83955df8ca30680f44589f7049427e5a222848c6 100644 (file)
@@ -308,3 +308,11 @@ float PI      = 3.14159265358979323846264338327950288419716939937510582097494459
 float log(float f) = #532;
 
 void(entity e, entity ignore) tracetoss = #64;
+
+float(entity e, float ch) getsoundtime = #533; // (DP_SND_GETSOUNDTIME)
+
+#define PARTICLES_USEALPHA 1
+float particles_alphamin, particles_alphamax;
+#define PARTICLES_USECOLOR 2
+vector particles_colormin, particles_colormax;
+void(float effectindex, entity own, vector org_from, vector org_to, vector dir_from, vector dir_to, float countmultiplier, float flags)        boxparticles = #502;
index 89edacd9443a49e622a3e40ef5710c68c58bdb8a..9e90bee2240161c7293450712830d826fac63b53 100644 (file)
@@ -218,6 +218,56 @@ void Ent_DamageInfo(float isNew)
                                if(!issilent)
                                        sound(self, CHAN_PROJECTILE, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM);
                                break;
+                       case WEP_SEEKER:
+                               org2 = org + backoff * 6;
+                               if(secondary)
+                               {
+                                       pointparticles(particleeffectnum("flac_explode"), org2, '0 0 0', 1);
+                                       if(!issilent)
+                                       {
+                                               if (r<0.15)
+                                                       sound(self, CHAN_PROJECTILE, "weapons/flacexp1.wav", 1, ATTN_NORM);
+                                               else if (r<0.7)
+                                                       sound(self, CHAN_PROJECTILE, "weapons/flacexp2.wav", 1, ATTN_NORM);
+                                               else
+                                                       sound(self, CHAN_PROJECTILE, "weapons/flacexp3.wav", 1, ATTN_NORM);
+                                       }
+                               }
+                               else
+                               {
+                                       if(bounce)
+                                       {
+                                               pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
+                                               if(!issilent)
+                                               {
+                                                       if (r<0.15)
+                                                               sound(self, CHAN_PROJECTILE, "weapons/tagexp1.wav", 1, ATTN_NORM);
+                                                       else if (r<0.7)
+                                                               sound(self, CHAN_PROJECTILE, "weapons/tagexp2.wav", 1, ATTN_NORM);
+                                                       else
+                                                               sound(self, CHAN_PROJECTILE, "weapons/tagexp3.wav", 1, ATTN_NORM);
+                                               }
+                                       }
+                                       else if(headshot)
+                                       {
+                                               if(!issilent)
+                                                       sound(self, CHAN_PROJECTILE, "weapons/tag_impact.wav", 1, ATTN_NORM);
+                                       }
+                                       else
+                                       {
+                                               pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
+                                               if(!issilent)
+                                               {
+                                                       if (r<0.15)
+                                                               sound(self, CHAN_PROJECTILE, "weapons/seekerexp1.wav", 1, ATTN_NORM);
+                                                       else if (r<0.7)
+                                                               sound(self, CHAN_PROJECTILE, "weapons/seekerexp2.wav", 1, ATTN_NORM);
+                                                       else
+                                                               sound(self, CHAN_PROJECTILE, "weapons/seekerexp3.wav", 1, ATTN_NORM);
+                                               }
+                                       }
+                               }
+                               break;
                        case WEP_HLAC:
                                org2 = org + backoff * 6;
                                pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1);
@@ -241,16 +291,16 @@ void Ent_DamageInfo(float isNew)
                                break;
                        case WEP_FIREBALL:
                                if(secondary)
+                               {
+                                       // firemine goes out silently
+                               }
+                               else
                                {
                                        org2 = org + backoff * 16;
                                        pointparticles(particleeffectnum("fireball_explode"), org2, '0 0 0', 1);
                                        if(!issilent)
                                                sound(self, CHAN_PROJECTILE, "weapons/fireball_impact2.wav", VOL_BASE, ATTN_NORM * 0.25); // long range boom
                                }
-                               else
-                               {
-                                       // firemine goes out silently
-                               }
                                break;
                        default:
                                dprint("Unhandled damage of weapon ", ftos(hitwep), "\n");
@@ -265,6 +315,9 @@ void DamageInfo_Precache()
        precache_sound("weapons/crylink_impact.wav");
        precache_sound("weapons/electro_impact.wav");
        precache_sound("weapons/electro_impact_combo.wav");
+       precache_sound("weapons/flacexp1.wav");
+       precache_sound("weapons/flacexp2.wav");
+       precache_sound("weapons/flacexp3.wav");
        precache_sound("weapons/grenade_impact.wav");
        precache_sound("weapons/hagexp1.wav");
        precache_sound("weapons/hagexp2.wav");
@@ -281,4 +334,11 @@ void DamageInfo_Precache()
        precache_sound("weapons/rocket_impact.wav");
        precache_sound("weapons/fireball_impact.wav");
        precache_sound("weapons/fireball_impact2.wav");
+       precache_sound("weapons/seekerexp1.wav");
+       precache_sound("weapons/seekerexp2.wav");
+       precache_sound("weapons/seekerexp3.wav");
+       precache_sound("weapons/tagexp1.wav");
+       precache_sound("weapons/tagexp2.wav");
+       precache_sound("weapons/tagexp3.wav");
+       precache_sound("weapons/tag_impact.wav");
 }
index 9842a28753d404d20d599235ed86fcd613455749..a92567e61928f90ff8f4c74916430234f4768f3d 100644 (file)
@@ -156,9 +156,11 @@ void Ent_GibSplash(float isNew)
 
        if(type & 0x80)
        {
-               if(cvar("cl_gentle") > 1)
+               if(cvar("cl_gentle") == 2)
                        gentle_prefix = "";
-               else
+               else if(cvar("cl_gentle") == 3) 
+                       gentle_prefix = "happy_";
+               else if(cvar("cl_gentle"))
                        gentle_prefix = "morphed_";
        }
        else if(cvar("cl_particlegibs"))
index 101ab9f019ad561e836b832a69f6941d2edac2b1..dbd8ab2ad89fd7429a8b8349ccd54634e8aacd16 100644 (file)
@@ -16,6 +16,13 @@ void Draw_CylindricLine(vector from, vector to, float thickness, string texture,
        // direction is perpendicular to the view normal, and perpendicular to the axis
        thickdir = normalize(cross(axis, view_origin - from));
 
+/*
+       print("from ", vtos(from), "\n");
+       print("to ", vtos(to), "\n");
+       print("org ", vtos(view_origin), "\n");
+       print("dir ", vtos(thickdir), "\n");
+*/
+
        A = from - thickdir * (thickness / 2);
        B = from + thickdir * (thickness / 2);
        C = to + thickdir * (thickness / 2);
diff --git a/qcsrc/client/hud.qc.orig b/qcsrc/client/hud.qc.orig
new file mode 100644 (file)
index 0000000..4a118d4
--- /dev/null
@@ -0,0 +1,2769 @@
+/*
+==================
+Misc HUD functions
+==================
+*/
+
+// a border picture is a texture containing nine parts:
+//   1/4 width: left part
+//   1/2 width: middle part (stretched)
+//   1/4 width: right part
+// divided into
+//   1/4 height: top part
+//   1/2 height: middle part (stretched)
+//   1/4 height: bottom part
+void draw_BorderPicture(vector theOrigin, string pic, vector theSize, vector theColor, float theAlpha, vector theBorderSize)
+{
+       vector dX, dY;
+       vector width, height;
+       vector bW, bH;
+       //pic = draw_UseSkinFor(pic);
+       width = eX * theSize_x;
+       height = eY * theSize_y;
+       if(theSize_x <= theBorderSize_x * 2)
+       {
+               // not wide enough... draw just left and right then
+               bW = eX * (0.25 * theSize_x / (theBorderSize_x * 2));
+               if(theSize_y <= theBorderSize_y * 2)
+               {
+                       // not high enough... draw just corners
+                       bH = eY * (0.25 * theSize_y / (theBorderSize_y * 2));
+                       drawsubpic(theOrigin,                 width * 0.5 + height * 0.5, pic, '0 0 0',           bW + bH, theColor, theAlpha, 0);
+                       drawsubpic(theOrigin + width   * 0.5, width * 0.5 + height * 0.5, pic, eX - bW,           bW + bH, theColor, theAlpha, 0);
+                       drawsubpic(theOrigin + height  * 0.5, width * 0.5 + height * 0.5, pic, eY - bH,           bW + bH, theColor, theAlpha, 0);
+                       drawsubpic(theOrigin + theSize * 0.5, width * 0.5 + height * 0.5, pic, eX + eY - bW - bH, bW + bH, theColor, theAlpha, 0);
+               }
+               else
+               {
+                       dY = theBorderSize_x * eY;
+                       drawsubpic(theOrigin,                             width * 0.5          +     dY, pic, '0 0    0',           '0 0.25 0' + bW, theColor, theAlpha, 0);
+                       drawsubpic(theOrigin + width * 0.5,               width * 0.5          +     dY, pic, '0 0    0' + eX - bW, '0 0.25 0' + bW, theColor, theAlpha, 0);
+                       drawsubpic(theOrigin                        + dY, width * 0.5 + height - 2 * dY, pic, '0 0.25 0',           '0 0.5  0' + bW, theColor, theAlpha, 0);
+                       drawsubpic(theOrigin + width * 0.5          + dY, width * 0.5 + height - 2 * dY, pic, '0 0.25 0' + eX - bW, '0 0.5  0' + bW, theColor, theAlpha, 0);
+                       drawsubpic(theOrigin               + height - dY, width * 0.5          +     dY, pic, '0 0.75 0',           '0 0.25 0' + bW, theColor, theAlpha, 0);
+                       drawsubpic(theOrigin + width * 0.5 + height - dY, width * 0.5          +     dY, pic, '0 0.75 0' + eX - bW, '0 0.25 0' + bW, theColor, theAlpha, 0);
+               }
+       }
+       else
+       {
+               if(theSize_y <= theBorderSize_y * 2)
+               {
+                       // not high enough... draw just top and bottom then
+                       bH = eY * (0.25 * theSize_y / (theBorderSize_y * 2));
+                       dX = theBorderSize_x * eX;
+                       drawsubpic(theOrigin,                                         dX + height * 0.5, pic, '0    0 0',           '0.25 0 0' + bH, theColor, theAlpha, 0);
+                       drawsubpic(theOrigin + dX,                        width - 2 * dX + height * 0.5, pic, '0.25 0 0',           '0.5  0 0' + bH, theColor, theAlpha, 0);
+                       drawsubpic(theOrigin + width - dX,                            dX + height * 0.5, pic, '0.75 0 0',           '0.25 0 0' + bH, theColor, theAlpha, 0);
+                       drawsubpic(theOrigin              + height * 0.5,             dX + height * 0.5, pic, '0    0 0' + eY - bH, '0.25 0 0' + bH, theColor, theAlpha, 0);
+                       drawsubpic(theOrigin + dX         + height * 0.5, width - 2 * dX + height * 0.5, pic, '0.25 0 0' + eY - bH, '0.5  0 0' + bH, theColor, theAlpha, 0);
+                       drawsubpic(theOrigin + width - dX + height * 0.5,             dX + height * 0.5, pic, '0.75 0 0' + eY - bH, '0.25 0 0' + bH, theColor, theAlpha, 0);
+               }
+               else
+               {
+                       dX = theBorderSize_x * eX;
+                       dY = theBorderSize_x * eY;
+                       drawsubpic(theOrigin,                                        dX          +     dY, pic, '0    0    0', '0.25 0.25 0', theColor, theAlpha, 0);
+                       drawsubpic(theOrigin                  + dX,      width - 2 * dX          +     dY, pic, '0.25 0    0', '0.5  0.25 0', theColor, theAlpha, 0);
+                       drawsubpic(theOrigin          + width - dX,                  dX          +     dY, pic, '0.75 0    0', '0.25 0.25 0', theColor, theAlpha, 0);
+                       drawsubpic(theOrigin          + dY,                          dX + height - 2 * dY, pic, '0    0.25 0', '0.25 0.5  0', theColor, theAlpha, 0);
+                       drawsubpic(theOrigin          + dY         + dX, width - 2 * dX + height - 2 * dY, pic, '0.25 0.25 0', '0.5  0.5  0', theColor, theAlpha, 0);
+                       drawsubpic(theOrigin          + dY + width - dX,             dX + height - 2 * dY, pic, '0.75 0.25 0', '0.25 0.5  0', theColor, theAlpha, 0);
+                       drawsubpic(theOrigin + height - dY,                          dX          +     dY, pic, '0    0.75 0', '0.25 0.25 0', theColor, theAlpha, 0);
+                       drawsubpic(theOrigin + height - dY         + dX, width - 2 * dX          +     dY, pic, '0.25 0.75 0', '0.5  0.25 0', theColor, theAlpha, 0);
+                       drawsubpic(theOrigin + height - dY + width - dX,             dX          +     dY, pic, '0.75 0.75 0', '0.25 0.25 0', theColor, theAlpha, 0);
+               }
+       }
+}
+
+// return HUD background color
+vector HUD_GetBgColor()
+{
+       vector color;
+       if (teamplay)
+               GetTeamRGB(myteam) * hud_color_bg_team;
+       else {
+               // allow custom HUD colors in non-teamgames
+               color_x = cvar("hud_color_bg_r");
+               color_y = cvar("hud_color_bg_g");
+               color_z = cvar("hud_color_bg_b");
+       }
+       return color;
+}
+
+// return accuracy text color
+vector HUD_AccuracyColor(float accuracy)
+{
+       vector rgb;
+       float yellow_accuracy = cvar("hud_accuracy_yellow"); // value at which this function returns yellow
+       if(accuracy >= 100) {
+               rgb_x = 0;
+               rgb_y = 1;
+       }
+       else if(accuracy > yellow_accuracy) {
+               rgb_x = 1 - (accuracy-yellow_accuracy)/(100-yellow_accuracy); // red value between 1 -> 0
+               rgb_y = 1;
+       }
+       else {
+               rgb_x = 1;
+               rgb_y = accuracy/yellow_accuracy; // green value between 0 -> 1
+       }
+       rgb_z = 0;
+       return rgb;
+}
+
+// draw number in the XSCALE font
+void HUD_DrawXNum (vector pos, float num, float digits, float showsign, float lettersize, vector rgb, float highlighted, float stroke, float alpha, float dflags)
+{
+       float l, i;
+       string str, tmp, l_length;
+       float minus, plus;
+       vector vsize, num_color;
+
+       vsize_x = vsize_y = lettersize;
+       vsize_z = 0;
+
+       // showsign 1: always prefix with minus sign (useful in race distribution display)
+       // showsign 2: always prefix with plus sign (useful in race distribution display)
+       // showsign 3: prefix with minus sign if negative, plus sign if positive (useful in score distribution display)
+
+       if((showsign == 2 && num >= 0) || (num > 0 && showsign == 3))
+       {
+               plus = true;
+               pos_x -= lettersize;
+       } else
+               plus = false;
+
+       if(num < 0 || (num < 0 && showsign == 3) || (showsign == 1 && num <= 0))
+       {
+               minus = true;
+               num = -num;
+               pos_x -= lettersize;
+       } else
+               minus = false;
+
+       if(digits < 0)
+       {
+               tmp = ftos(num);
+               digits = -digits;
+               str = strcat(substring("0000000000", 0, digits - strlen(tmp)), tmp);
+       } else
+               str = ftos(num);
+
+       l = strlen(str);
+       l_length = ftos(l);
+
+       if(l > digits)
+       {
+               str = substring(str, l-digits, 999);
+               l = strlen(str);
+       } else if(l < digits)
+               pos_x += (digits-l) * lettersize;
+
+       if (highlighted == 1) {
+               vector hl_size;
+               hl_size_x = vsize_x * l + vsize_x * 0.2;
+               hl_size_y = vsize_y * 1.1;
+               hl_size_z = 0;
+               if(minus)
+                       hl_size_x = hl_size_x + vsize_x;
+
+               vector hl_pos;
+               hl_pos_x = pos_x - lettersize/10;
+               hl_pos_y = pos_y - lettersize/20;
+               hl_pos_z = 0;
+
+               drawpic(hl_pos, strcat("gfx/hud/sb_highlight_", l_length), hl_size, '1 1 1', alpha, dflags);
+       }
+
+       if (stroke == 1)
+               num_color = '1 1 1';
+       else
+               num_color = rgb;
+
+       if(minus)
+       {
+               if (stroke == 1)
+                       drawpic(pos, "gfx/hud/num_minus_stroke", vsize, rgb, alpha, dflags);
+               drawpic(pos, "gfx/hud/num_minus", vsize, num_color, alpha, dflags);
+               pos_x += lettersize;
+       } else if(plus)
+       {
+               if (stroke == 1)
+                       drawpic(pos, "gfx/hud/num_plus_stroke", vsize, rgb, alpha, dflags);
+               drawpic(pos, "gfx/hud/num_plus", vsize, num_color, alpha, dflags);
+               pos_x += lettersize;
+       }
+
+       for(i = 0; i < l; ++i)
+       {
+               tmp = substring(str, i, 1);
+               if (stroke == 1)
+                       drawpic(pos, strcat("gfx/hud/num_", tmp, "_stroke"), vsize, rgb, alpha, dflags);
+               drawpic(pos, strcat("gfx/hud/num_", tmp), vsize, num_color, alpha, dflags);
+               pos_x += lettersize;
+       }
+}
+
+// color the number differently based on how big it is (used in the health/armor panel)
+void HUD_DrawXNum_Colored (vector pos, float x, float digits, float lettersize, float alpha)
+{
+       vector color;
+       if(x > 200) {
+               color_x = 0;
+               color_y = 1;
+               color_z = 0;
+       }
+       else if(x > 150) {
+               color_x = 0.4 - (x-150)*0.02 * 0.4; //red value between 0.4 -> 0
+               color_y = 0.9 + (x-150)*0.02 * 0.1; // green value between 0.9 -> 1
+               color_z = 0;
+       }
+       else if(x > 100) {
+               color_x = 1 - (x-100)*0.02 * 0.6; //red value between 1 -> 0.4
+               color_y = 1 - (x-100)*0.02 * 0.1; // green value between 1 -> 0.9
+               color_z = 1 - (x-100)*0.02; // blue value between 1 -> 0
+       }
+       else if(x > 50) {
+               color_x = 1;
+               color_y = 1;
+               color_z = 0.2 + (x-50)*0.02 * 0.8; // blue value between 0.2 -> 1
+       }
+       else if(x > 20) {
+               color_x = 1;
+               color_y = (x-20)*90/27/100; // green value between 0 -> 1
+               color_z = (x-20)*90/27/100 * 0.2; // blue value between 0 -> 0.2
+       }
+       else {
+               color_x = 1;
+               color_y = 0;
+               color_z = 0;
+       }
+       HUD_DrawXNum(pos, x, digits, 0, lettersize, color, 0, 0, alpha, DRAWFLAG_NORMAL);
+}
+
+float stringwidth_colors(string s, vector theSize)
+{
+       return stringwidth(s, TRUE, theSize);
+}
+
+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];
+vector centerprint_start;
+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(cvar("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])
+                               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(cvar("con_chatpos") < 0)
+               havail -= (-cvar("con_chatpos") + cvar("con_chat")) * cvar("con_chatsize"); // avoid overlapping chat
+       if(havail > vid_conheight - 70)
+               havail = vid_conheight - 70; // avoid overlapping HUD
+
+       centerprint_start_x = 0;
+
+#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
+       centerprint_start_y =
+               min(
+                       max(
+                               max(scoreboard_bottom, vid_conheight * 0.5 + 16),
+                               (havail - h)/2
+                       ),
+                       havail - h
+               );
+#endif
+
+       centerprint_num = i;
+       centerprint_expire = time + cvar("scr_centertime");
+}
+
+void HUD_DrawCenterPrint (void)
+{
+       float i;
+       vector pos;
+       string ts;
+       float a;
+
+       //if(time > centerprint_expire)
+       //      return;
+
+       //a = bound(0, 1 - 2 * (time - centerprint_expire), 1);
+       a = bound(0, 1 - 4 * (time - centerprint_expire), 1);
+       //sz = 1.2 / (a + 0.2);
+
+       if(a <= 0)
+               return;
+
+       pos = centerprint_start;
+       for (i=0; i<centerprint_num; i = i + 1)
+       {
+               pos_x = (vid_conwidth - centerprint_width[i]) * 0.5;
+               ts = centerprint_messages[i];
+               if (ts != "")
+               {
+                       dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0)
+                       drawcolorcodedstring(pos, ts, centerprint_fontsize, a, DRAWFLAG_NORMAL);
+                       //  - '0 0.5 0' * (sz - 1) * centerprint_fontsize_x - '0.5 0 0' * (sz - 1) * centerprint_width[i] * centerprint_fontsize_y, centerprint_fontsize * sz
+                       pos_y = pos_y + centerprint_fontsize_y;
+               }
+               else
+                       // half height for empty lines looks better
+                       pos_y = pos_y + centerprint_fontsize_y * 0.5;
+       }
+}
+
+void drawstringright(vector position, string text, vector scale, vector rgb, float alpha, float flag)
+{
+       position_x -= 2 / 3 * strlen(text) * scale_x;
+       drawstring(position, text, scale, rgb, alpha, flag);
+}
+
+void drawstringcenter(vector position, string text, vector scale, vector rgb, float alpha, float flag)
+{
+       position_x = 0.5 * (vid_conwidth - 0.6025 * strlen(text) * scale_x);
+       drawstring(position, text, scale, rgb, alpha, flag);
+}
+
+// return the string of the given race place
+string race_PlaceName(float pos) {
+       if(pos == 1)
+               return "1st";
+       else if(pos == 2)
+               return "2nd";
+       else if(pos == 3)
+               return "3rd";
+       else
+               return strcat(ftos(pos), "th");
+}
+
+// return the string of the onscreen race timer
+string MakeRaceString(float cp, float mytime, float histime, float lapdelta, string hisname)
+{
+       string col;
+       string timestr;
+       string cpname;
+       string lapstr;
+       lapstr = "";
+
+       if(histime == 0) // goal hit
+       {
+               if(mytime > 0)
+               {
+                       timestr = strcat("+", ftos_decimals(+mytime, TIME_DECIMALS));
+                       col = "^1";
+               }
+               else if(mytime == 0)
+               {
+                       timestr = "+0.0";
+                       col = "^3";
+               }
+               else
+               {
+                       timestr = strcat("-", ftos_decimals(-mytime, TIME_DECIMALS));
+                       col = "^2";
+               }
+
+               if(lapdelta > 0)
+               {
+                       lapstr = strcat(" (-", ftos(lapdelta), "L)");
+                       col = "^2";
+               }
+               else if(lapdelta < 0)
+               {
+                       lapstr = strcat(" (+", ftos(-lapdelta), "L)");
+                       col = "^1";
+               }
+       }
+       else if(histime > 0) // anticipation
+       {
+               if(mytime >= histime)
+                       timestr = strcat("+", ftos_decimals(mytime - histime, TIME_DECIMALS));
+               else
+                       timestr = TIME_ENCODED_TOSTRING(TIME_ENCODE(histime));
+               col = "^3";
+       }
+       else
+               col = "^7";
+
+       if(cp == 254)
+               cpname = "Start line";
+       else if(cp == 255)
+               cpname = "Finish line";
+       else if(cp)
+               cpname = strcat("Intermediate ", ftos(cp));
+       else
+               cpname = "Finish line";
+
+       if(histime < 0)
+               return strcat(col, cpname);
+       else if(hisname == "")
+               return strcat(col, cpname, " (", timestr, ")");
+       else
+               return strcat(col, cpname, " (", timestr, " ", strcat(hisname, col, lapstr), ")");
+}
+
+// Check if the given name already exist in race rankings? In that case, where? (otherwise return 0)
+float race_CheckName(string net_name) {
+       float i;
+       for (i=RANKINGS_CNT-1;i>=0;--i)
+               if(grecordholder[i] == net_name)
+                       return i+1;
+       return 0;
+}
+
+/*
+==================
+HUD panels
+==================
+*/
+
+string HUD_Panel_GetName(float id)
+{
+       switch(id) {
+               case 0: return "weaponicons"; break;
+               case 1: return "inventory"; break;
+               case 2: return "powerups"; break;
+               case 3: return "healtharmor"; break;
+               case 4: return "notify"; break;
+               case 5: return "timer"; break;
+               case 6: return "radar"; break;
+               case 7: return "score"; break;
+               case 8: return "racetimer"; break;
+               case 9: return "vote"; break;
+               case 10: return "pressedkeys"; break;
+               default: return "";
+       }
+}
+
+vector HUD_Panel_CheckLimitSize(float id, vector mySize)
+{
+       switch(id) {
+               case 0: 
+                       mySize_x = max(mySize_y * (1/10), mySize_x); // at least 1/10 * height
+                       mySize_y = max(mySize_x * (1/26), mySize_y); // at least 1/26 * width
+                       break;
+               case 1: 
+                       mySize_x = max(mySize_y * 0.7, mySize_x); // at least 0.7 * height
+                       break;
+               case 3: 
+                       mySize_x = max(mySize_y * 2, mySize_x); // at least 2 * height
+                       break;
+               case 5: 
+                       mySize_x = max(mySize_y * 2, mySize_x); // at least 2 * height
+                       break;
+               case 9: 
+                       mySize_y = (1/4) * mySize_x; // 1/4 * width
+                       break;
+               case 10: 
+                       mySize_y = 0.5898 * mySize_x; // 0.5898 * width, reason: bg has weird dimensions...
+                       break;
+       }
+       return mySize;
+}
+
+// return active status of panel
+float HUD_Panel_CheckActive(float id)
+{
+       if (cvar_or(strcat("hud_", HUD_Panel_GetName(id)), 1))
+               return 1;
+       return 0;
+}
+
+// return size of given panel
+vector HUD_Panel_GetSize(float id)
+{
+       return stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_size")));
+}
+
+// return pos of given panel
+vector HUD_Panel_GetPos(float id)
+{
+       vector pos;
+       pos = stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_pos")));
+
+       if (pos_x < 0)
+               pos_x = vid_conwidth + pos_x;
+       if (pos_y < 0)
+               pos_y = vid_conheight + pos_y;
+       return pos;
+}
+
+float HUD_Panel_GetMarigin(float id)
+{
+       return bound(1, MARIGIN_MULTIPLIER * cvar_or(strcat("hud_", HUD_Panel_GetName(id), "_marigin"), 30), 200);
+}
+
+vector HUD_Panel_GetColor(float id)
+{
+       if(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_color")) != "")
+               return stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_color")));
+       else
+               return stov(cvar_string("hud_color"));
+}
+
+float HUD_Panel_GetBgActive(float id)
+{
+       if(cvar("_hud_configure"))
+               return 1;
+
+       return cvar_or(strcat("hud_", HUD_Panel_GetName(id), "_bg"), 1);
+}
+
+vector HUD_Panel_GetProgressBarColor(string item)
+{
+       return stov(cvar_string(strcat("hud_progreshud_", item, "_color")));
+}
+
+float resizeCorner; // 1 = topleft, 2 = topright, 3 = bottomleft, 4 = bottomright
+// check if resize will result in panel being moved into another panel. If so, return snapped vector, otherwise return the given vector
+vector HUD_Panel_CheckResize(float id, vector myPos, vector mySize)
+{
+       float i;
+
+       vector myTarget;
+       myTarget = mySize;
+
+       vector targPos;
+       vector targSize;
+       vector myCenter;
+       vector targCenter;
+
+       for (i = 0; i < panel_cnt; ++i) {
+               if(i == id || !HUD_Panel_CheckActive(i))
+                       continue;
+
+               targPos = HUD_Panel_GetPos(i);
+               targSize = HUD_Panel_GetSize(i);
+
+               targPos = HUD_Panel_GetPos(i) - '1 1 0' * HUD_Panel_GetMarigin(id);
+               targSize = HUD_Panel_GetSize(i) + '2 2 0' * HUD_Panel_GetMarigin(id);
+
+               if(myPos_y + mySize_y < targPos_y)
+                       continue;
+               if(myPos_y > targPos_y + targSize_y)
+                       continue;
+
+               if(myPos_x + mySize_x < targPos_x)
+                       continue;
+               if(myPos_x > targPos_x + targSize_x)
+                       continue;
+
+               // OK, there IS a collision.
+
+               myCenter_x = myPos_x + 0.5 * mySize_x;
+               myCenter_y = myPos_y + 0.5 * mySize_y;
+
+               targCenter_x = targPos_x + 0.5 * targSize_x;
+               targCenter_y = targPos_y + 0.5 * targSize_y;
+
+               float k, y;
+               if(myCenter_x < targCenter_x && myCenter_y < targCenter_y && resizeCorner != 1) // top left (of target panel)
+               {
+                       if(myPos_x + mySize_x - targPos_x < myPos_y + mySize_y - targPos_y) // push it to the side
+                               myTarget_x = targPos_x - myPos_x;
+                       else // push it upwards
+                               myTarget_y = targPos_y - myPos_y;
+               }
+               else if(myCenter_x > targCenter_x && myCenter_y < targCenter_y && resizeCorner != 2) // top right
+               {
+                       if(targPos_x + targSize_x - myPos_x < myPos_y + mySize_y - targPos_y) // push it to the side
+                               myTarget_x = targPos_x + targSize_x;
+                       else // push it upwards
+                               myTarget_y = targPos_y - myPos_y;
+               }
+               else if(myCenter_x < targCenter_x && myCenter_y > targCenter_y) // bottom left
+               {
+                       if(myPos_x + mySize_x - targPos_x < targPos_y + targSize_y - myPos_y) // push it to the side
+                               myTarget_x = targPos_x - myPos_x;
+                       else // push it downwards
+                               myTarget_y = targPos_y + targSize_y;
+               }
+               else if(myCenter_x > targCenter_x && myCenter_y > targCenter_y) // bottom right
+               {
+                       if(targPos_x + targSize_x - myPos_x < targPos_y + targSize_y - myPos_y) // push it to the side
+                               myTarget_x = targPos_x + targSize_x;
+                       else // push it downwards
+                               myTarget_y = targPos_y + targSize_y;
+               }
+       }
+
+       return myTarget;
+}
+
+// TODO: checkResize
+float HUD_Panel_SetSize(float id, vector mySize)
+{
+       float didntresize;
+
+       vector oldSize;
+       oldSize = stov(cvar_string(strcat("hud_", HUD_Panel_GetName(id), "_size")));
+
+       vector myPos;
+       myPos = HUD_Panel_GetPos(id);
+
+       // check for collisions
+       mySize = HUD_Panel_CheckResize(id, HUD_Panel_GetPos(id), mySize);
+
+       mySize_x = bound(0.025 * vid_conwidth, mySize_x, vid_conwidth - myPos_x);
+       mySize_y = bound(0.025 * vid_conheight, mySize_y, vid_conheight - myPos_y);
+
+       // cap against panel's own limits
+       mySize = HUD_Panel_CheckLimitSize(id, mySize);
+
+       //mySize_x = bound(0.025 * vid_conwidth, mySize_x, vid_conwidth);
+       //mySize_y = bound(0.025 * vid_conheight, mySize_y, vid_conheight);
+
+       // TODO: is this needed?
+       // this is to check if (and how) SetPos should be called
+       if(mySize_x == oldSize_x && mySize_y == oldSize_y)
+               didntresize = 3; // didnt resize either
+       else if(mySize_x == oldSize_x && mySize_y != oldSize_y)
+               didntresize = 2; // resized Y
+       else if(mySize_y == oldSize_y && mySize_x != oldSize_x)
+               didntresize = 1; // resized X
+
+       string s;
+       s = strcat(ftos(mySize_x), " ", ftos(mySize_y));
+       cvar_set(strcat("hud_", HUD_Panel_GetName(id), "_size"), s);
+       return didntresize;
+}
+
+// check if move will result in panel being moved into another panel. If so, return snapped vector, otherwise return the given vector
+vector HUD_Panel_CheckMove(float id, vector myPos, vector mySize)
+{
+       float i;
+
+       vector myTarget;
+       myTarget = myPos;
+
+       vector targPos;
+       vector targSize;
+       vector myCenter;
+       vector targCenter;
+
+       for (i = 0; i < panel_cnt; ++i) {
+               if(i == id || !HUD_Panel_CheckActive(i))
+                       continue;
+
+               targPos = HUD_Panel_GetPos(i) - '1 1 0' * HUD_Panel_GetMarigin(id);
+               targSize = HUD_Panel_GetSize(i) + '2 2 0' * HUD_Panel_GetMarigin(id);
+
+               if(myPos_y + mySize_y < targPos_y)
+                       continue;
+               if(myPos_y > targPos_y + targSize_y)
+                       continue;
+
+               if(myPos_x + mySize_x < targPos_x)
+                       continue;
+               if(myPos_x > targPos_x + targSize_x)
+                       continue;
+
+               // OK, there IS a collision.
+
+               myCenter_x = myPos_x + 0.5 * mySize_x;
+               myCenter_y = myPos_y + 0.5 * mySize_y;
+
+               targCenter_x = targPos_x + 0.5 * targSize_x;
+               targCenter_y = targPos_y + 0.5 * targSize_y;
+
+               float k, y;
+               if(myCenter_x < targCenter_x && myCenter_y < targCenter_y) // top left (of the target panel)
+               {
+                       if(myPos_x + mySize_x - targPos_x < myPos_y + mySize_y - targPos_y) // push it to the side
+                               myTarget_x = targPos_x - mySize_x;
+                       else // push it upwards
+                               myTarget_y = targPos_y - mySize_y;
+               }
+               else if(myCenter_x > targCenter_x && myCenter_y < targCenter_y) // top right
+               {
+                       if(targPos_x + targSize_x - myPos_x < myPos_y + mySize_y - targPos_y) // push it to the side
+                               myTarget_x = targPos_x + targSize_x;
+                       else // push it upwards
+                               myTarget_y = targPos_y - mySize_y;
+               }
+               else if(myCenter_x < targCenter_x && myCenter_y > targCenter_y) // bottom left
+               {
+                       if(myPos_x + mySize_x - targPos_x < targPos_y + targSize_y - myPos_y) // push it to the side
+                               myTarget_x = targPos_x - mySize_x;
+                       else // push it downwards
+                               myTarget_y = targPos_y + targSize_y;
+               }
+               else if(myCenter_x > targCenter_x && myCenter_y > targCenter_y) // bottom right
+               {
+                       if(targPos_x + targSize_x - myPos_x < targPos_y + targSize_y - myPos_y) // push it to the side
+                               myTarget_x = targPos_x + targSize_x;
+                       else // push it downwards
+                               myTarget_y = targPos_y + targSize_y;
+               }
+       }
+
+       return myTarget;
+}
+
+void HUD_Panel_SetPos(float id, vector pos, float didntresize)
+{
+       vector oldPos;
+       oldPos = HUD_Panel_GetPos(id);
+       if(didntresize == 2)
+               pos_x = oldPos_x;
+       else if(didntresize == 1)
+               pos_y = oldPos_y;
+       else if(didntresize == 3)
+               return;
+
+       vector mySize;
+       mySize = HUD_Panel_GetSize(id);
+
+       pos = HUD_Panel_CheckMove(id, pos, mySize);
+
+       pos_x = bound(0, pos_x, vid_conwidth - mySize_x);
+       pos_y = bound(0, pos_y, vid_conheight - mySize_y);
+
+       if (pos_x + 0.5 * mySize_x > 0.5 * vid_conwidth)
+               pos_x = pos_x - vid_conwidth;
+       if (pos_y + 0.5 * mySize_y > 0.5 * vid_conheight)
+               pos_y = pos_y - vid_conheight;
+
+       string s;
+       s = strcat(ftos(pos_x), " ", ftos(pos_y));
+
+       cvar_set(strcat("hud_", HUD_Panel_GetName(id), "_pos"), s);
+}
+
+float mouseClicked;
+float prevMouseClicked; // previous state
+float HUD_Panel_InputEvent(float bInputType, float nPrimary, float nSecondary)
+{
+       prevMouseClicked = mouseClicked;
+       if(nPrimary == K_MOUSE1)
+       {
+               if(bInputType == 0) { // key pressed
+                       mouseClicked = 1;
+                       return true;
+               }
+               if(bInputType == 1) {// key released
+                       mouseClicked = 0;
+                       return true;
+               }
+       }
+       return false;
+}
+
+vector mousepos, mouseprevpos;
+vector panel_click_distance; // mouse cursor distance from the top left corner of the panel (saved only upon a click)
+vector panel_click_pos; // panel pos (saved only upon a click)
+vector panel_click_size; // panel size (saved only upon a click)
+float highlightedPanel;
+float highlightedAction; // 0 = nothing, 1 = move, 2 = resize
+void HUD_Panel_Mouse()
+{
+       if(mouseClicked == 0) {
+               highlightedPanel = -1;
+               highlightedAction = 0;
+       }
+
+       mousepos = mousepos + getmousepos();
+
+       mousepos_x = bound(0, mousepos_x, vid_conwidth);
+       mousepos_y = bound(0, mousepos_y, vid_conheight);
+
+       drawpic(mousepos, "gfx/menu/default/cursor.tga", '32 32 0', '1 1 1', 1, hud_alpha_fg);
+
+       if(mouseClicked)
+       {
+               float i, marigin;
+               vector panelPos;
+               vector panelSize;
+
+               for(i = 0; i <= panel_cnt; i++)
+               {
+                       panelPos = HUD_Panel_GetPos(i);
+                       panelSize = HUD_Panel_GetSize(i);
+                       marigin = HUD_Panel_GetMarigin(i);
+                       if(prevMouseClicked == 0) {
+                               // move
+                               if(mousepos_x >= panelPos_x && mousepos_y >= panelPos_y && mousepos_x <= panelPos_x + panelSize_x && mousepos_y <= panelPos_y + panelSize_y)
+                               {
+                                       highlightedPanel = i;
+                                       highlightedAction = 1;
+                               }
+                               // resize from topleft border
+                               else if(mousepos_x >= panelPos_x - eX * marigin && mousepos_y >= panelPos_y - eX * marigin && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + 0.5 * panelSize_y)
+                               {
+                                       highlightedPanel = i;
+                                       highlightedAction = 2;
+                                       resizeCorner = 1;
+                               }
+                               // resize from topright border
+                               else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y - eX * marigin && mousepos_x <= panelPos_x + panelSize_x + eX * marigin && mousepos_y <= panelPos_y + 0.5 * panelSize_y)
+                               {
+                                       highlightedPanel = i;
+                                       highlightedAction = 2;
+                                       resizeCorner = 2;
+                               }
+                               // resize from bottomleft border
+                               else if(mousepos_x >= panelPos_x - eX * marigin && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + 0.5 * panelSize_x && mousepos_y <= panelPos_y + panelSize_y + eY * marigin)
+                               {
+                                       highlightedPanel = i;
+                                       highlightedAction = 2;
+                                       resizeCorner = 3;
+                               }
+                               // resize from bottomright border
+                               else if(mousepos_x >= panelPos_x + 0.5 * panelSize_x && mousepos_y >= panelPos_y + 0.5 * panelSize_y && mousepos_x <= panelPos_x + panelSize_x + eX * marigin && mousepos_y <= panelPos_y + panelSize_y + eY * marigin)
+                               {
+                                       highlightedPanel = i;
+                                       highlightedAction = 2;
+                                       resizeCorner = 4;
+                               }
+                       }
+
+                       if(highlightedPanel == i)
+                       {
+                               if(prevMouseClicked == 0)
+                               {
+                                       panel_click_distance = mousepos - panelPos;
+                                       panel_click_pos = panelPos;
+                                       panel_click_size = panelSize;
+                               }
+
+                               if(highlightedAction == 1)
+                                       HUD_Panel_SetPos(i, mousepos - panel_click_distance, 0);
+                               else if(highlightedAction == 2)
+                               {
+                                       float didntresize; // panel too big/too small, dont resize (also has to affect moving)
+                                       if(resizeCorner == 1) {
+                                               didntresize = HUD_Panel_SetSize(i, panelSize + mouseprevpos - mousepos);
+                                               HUD_Panel_SetPos(i, mousepos - panel_click_distance, didntresize);
+                                       }
+                                       if(resizeCorner == 2) {
+                                               didntresize = HUD_Panel_SetSize(i, eY * panel_click_size_y + eX * (mousepos_x - panelPos_x - (panel_click_distance_x - panel_click_size_x))
+                                                               + eY * (panel_click_distance_y + (panel_click_pos_y - mousepos_y)));
+                                               HUD_Panel_SetPos(i, eX * panelPos_x + eY * (mousepos_y - panel_click_distance_y), didntresize);
+                                       }
+                                       if(resizeCorner == 3) {
+                                               didntresize = HUD_Panel_SetSize(i, panelSize + eX * (mouseprevpos_x - mousepos_x) + eY * (mousepos_y - mouseprevpos_y));
+                                               HUD_Panel_SetPos(i, eX * (mousepos_x - panel_click_distance_x) + eY * panelPos_y, didntresize);
+                                       }
+                                       if(resizeCorner == 4) {
+                                               HUD_Panel_SetSize(i, mousepos - panelPos - (panel_click_distance - panel_click_size));
+                                       }
+                               }
+                       }
+               }
+       }
+       mouseprevpos = mousepos;
+       prevMouseClicked = mouseClicked;
+}
+
+/*void HUD_DrawDockEdge(float id, vector p1, vector p2, float target)
+{
+       vector pos;
+       vector size;
+
+       pos =
+*/ // maybe one day, since this will be quite complicated
+
+// Weapon icons (#0)
+//
+
+float weaponspace[10];
+void HUD_WeaponIcons_Clear()
+{
+       float idx;
+       for(idx = 0; idx < 10; ++idx)
+               weaponspace[idx] = 0;
+}
+
+void HUD_WeaponIcons()
+{
+       float alpha, height, marigin, accuracybar_height, stat_weapons; // "constants"
+       vector pos, mySize, mysize, mypos, color, accuracy_color;
+       float i, id, fade, weapon_stats, weapon_hit, weapon_damage, weapon_cnt; // variables
+
+       marigin = HUD_Panel_GetMarigin(0);
+       pos = HUD_Panel_GetPos(0);
+       mySize = HUD_Panel_GetSize(0);
+       color = HUD_Panel_GetColor(0);
+       accuracybar_height = cvar_or("hud_weaponicons_accuracybar_height", 3);
+
+       stat_weapons = getstati(STAT_WEAPONS);
+       for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+       {
+               self = get_weaponinfo(i);
+               if(self.weapons && self.impulse >= 0 && stat_weapons & self.weapons)
+                       ++weapon_cnt;
+       }
+
+       if(HUD_Panel_GetBgActive(0) && weapon_cnt)
+               draw_BorderPicture(pos - '1 1 0' * marigin, "gfx/hud/border", mySize + '1 1 0' * 2 * marigin, color, hud_alpha_bg, '1 1 0' * (marigin/MARIGIN_MULTIPLIER));
+
+       // hits
+       weapon_stats = getstati(STAT_DAMAGE_HITS);
+       weapon_number = weapon_stats & 63;
+       weapon_hits[weapon_number-WEP_FIRST] = floor(weapon_stats / 64);
+       // fired
+       weapon_stats = getstati(STAT_DAMAGE_FIRED);
+       weapon_number = weapon_stats & 63;
+       weapon_fired[weapon_number-WEP_FIRST] = floor(weapon_stats / 64);
+
+       if(cvar_or("hud_weaponicons_fade", 1))
+       {
+               fade = 3.2 - 2 * (time - weapontime);
+               fade = bound(0.7, fade, 1);
+       }
+       else
+               fade = 1;
+
+       HUD_WeaponIcons_Clear();
+
+       float rows, columns;
+       //TODO: yuck. there must be a better way :)
+       //rows = ceil(4 * mySize_y/mySize_x);
+       if(mySize_y/mySize_x < 0.08)
+               rows = 1;
+       else if(mySize_y/mySize_x < 0.25)
+               rows = 2;
+       else if(mySize_y/mySize_x < 0.5)
+               rows = 3;
+       else if(mySize_y/mySize_x < 0.7)
+               rows = 4;
+       else if(mySize_y/mySize_x < 0.9)
+               rows = 5;
+       else if(mySize_y/mySize_x < 1.25)
+               rows = 6;
+       else if(mySize_y/mySize_x < 1.7)
+               rows = 7;
+       else if(mySize_y/mySize_x < 2.5)
+               rows = 8;
+       else if(mySize_y/mySize_x < 4)
+               rows = 12;
+       else if(mySize_y/mySize_x < 6)
+               rows = 14;
+       else
+               rows = 16;
+
+       columns = ceil(16/rows);
+       float row, column;
+       for(i = WEP_FIRST; i <= WEP_LAST; ++i)
+       {
+               self = get_weaponinfo(i);
+               if((self.weapons && self.impulse >= 0 && stat_weapons & self.weapons) || cvar("_hud_configure"))
+               {
+                       id = self.impulse;
+
+                       alpha = (id == activeweapon) ? 1 : 0.6;
+
+                       weapon_hit = weapon_hits[self.weapon-WEP_FIRST];
+                       weapon_damage = weapon_fired[self.weapon-WEP_FIRST];
+                       if(id == 0) // porto and hook should be last
+                               id = 9;
+                       else
+                               id = --id;
+
+                       if(id+1 == activeweapon)
+                               drawpic(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), "gfx/hud/sb_ammobg", eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), color, fade * hud_alpha_fg, DRAWFLAG_NORMAL);
+                       drawpic(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), strcat("gfx/hud/inv_weapon", self.netname), eX * mySize_x*(1/columns) + eY * mySize_y*(1/rows), '1 1 1', fade * hud_alpha_fg, DRAWFLAG_NORMAL);
+
+                       if(cvar_or("hud_weaponicons_number", 1))
+                               drawstring(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows), ftos(id+1), '1 1 0' * 0.5 * mySize_y*(1/rows), '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+
+                       // draw the weapon accuracy on the HUD
+                       if(hud_accuracy_hud && !(gametype == GAME_RACE || gametype == GAME_CTS))
+                       {
+                               if(weapon_damage)
+                                       weapon_stats = floor(100 * weapon_hit / weapon_damage);
+
+                               accuracy_color = HUD_AccuracyColor(weapon_stats);
+                               if(weapon_damage)
+                                       drawpic(pos + eX * column * mySize_x*(1/columns) + eY * row * mySize_y*(1/rows) - '2 0 0' + eY * (mySize_y/rows - accuracybar_height), "gfx/hud/sb_accuracy_bar.tga", eX * mySize_x*(1/columns) + eY * accuracybar_height, accuracy_color, hud_alpha_fg, DRAWFLAG_NORMAL);
+                       }
+               }
+
+               ++row;
+               if(row >= rows)
+               {
+                       row = 0;
+                       ++column;
+               }
+       }
+
+}
+
+// Inventory (#1)
+//
+
+float GetAmmoStat(float i)
+{
+       switch(i)
+       {
+               case 0: return STAT_SHELLS;
+               case 1: return STAT_NAILS;
+               case 2: return STAT_ROCKETS;
+               case 3: return STAT_CELLS;
+               case 4: return STAT_FUEL;
+               default: return -1;
+       }
+}
+
+float GetAmmoItemCode(float i)
+{
+       switch(i)
+       {
+               case 0: return IT_SHELLS;
+               case 1: return IT_NAILS;
+               case 2: return IT_ROCKETS;
+               case 3: return IT_CELLS;
+               case 4: return IT_FUEL;
+               default: return -1;
+       }
+}
+
+string GetAmmoPicture(float i)
+{
+       switch(i)
+       {
+               case 0: return "gfx/hud/sb_shells";
+               case 1: return "gfx/hud/sb_bullets";
+               case 2: return "gfx/hud/sb_rocket";
+               case 3: return "gfx/hud/sb_cells";
+               case 4: return "gfx/hud/sb_fuel";
+               default: return "";
+       }
+}
+
+void HUD_Inventory()
+{
+       float i;
+       float stat_items;
+       float marigin;
+
+       vector pos, mySize, mysize, mypos, color;
+       marigin = HUD_Panel_GetMarigin(1);
+       pos = HUD_Panel_GetPos(1);
+       mySize = HUD_Panel_GetSize(1);
+       color = HUD_Panel_GetColor(1);
+
+       if(HUD_Panel_GetBgActive(1))
+               draw_BorderPicture(pos - '1 1 0' * marigin, "gfx/hud/border", mySize + '1 1 0' * 2 * marigin, color, hud_alpha_bg, '1 1 0' * (marigin/MARIGIN_MULTIPLIER));
+
+       // ammo
+       stat_items = getstati(STAT_ITEMS);
+       for (i = 0; i < 4; ++i) {
+               float a;
+               a = getstati(GetAmmoStat(i)); // how much ammo do we have of type i?
+               if(cvar("_hud_configure"))
+                       a = 100;
+
+               if(cvar("hud_ammo_onlycurrent")) {
+                       if (stat_items & GetAmmoItemCode(i)) {
+                               drawpic(pos - '1 1 0' * marigin, "gfx/hud/sb_ammobg", mysize + '1 1 0' * marigin, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               drawpic(pos + eX * mysize_x * 1.7, GetAmmoPicture(i), '24 24 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               if(a < 10)
+                                       HUD_DrawXNum(pos + '5 5 0', a, 3, 0, 24, '0.7 0 0', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                               else
+                                       HUD_DrawXNum(pos + '5 5 0', a, 3, 0, 24, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                       }
+               } else {
+                       if (a > 0) {
+                               if(mySize_x/mySize_y >= 10) { // arrange horizontally
+                                       switch (i) {
+                                               case 0: mypos_x = pos_x;                        mypos_y = pos_y;                        break; // shells
+                                               case 1: mypos_x = pos_x + 0.25 * mySize_x;      mypos_y = pos_y;                        break; // bullets
+                                               case 2: mypos_x = pos_x + 0.5  * mySize_x;      mypos_y = pos_y;                        break; // rockets
+                                               case 3: mypos_x = pos_x + 0.75 * mySize_x;      mypos_y = pos_y;                        break; // cells
+                                       }
+                                       mysize_x = 0.25 * mySize_x;
+                                       mysize_y = mySize_y;
+                               } else if(mySize_x/mySize_y >= 2.5) { // arrange in a 2x2 grid
+                                       switch (i) {
+                                               case 0: mypos_x = pos_x + 0.5 * mySize_x;       mypos_y = pos_y + 0.5 * mySize_y;       break; // shells
+                                               case 1: mypos_x = pos_x + 0.5 * mySize_x;       mypos_y = pos_y;                        break; // bullets
+                                               case 2: mypos_x = pos_x;                        mypos_y = pos_y + 0.5 * mySize_y;       break; // rockets
+                                               case 3: mypos_x = pos_x;                        mypos_y = pos_y;                        break; // cells
+                                       }
+                                       mysize_x = 0.5 * mySize_x;
+                                       mysize_y = 0.5 * mySize_y;
+                               } else { // arrange vertically
+                                       switch (i) {
+                                               case 0: mypos_x = pos_x;                        mypos_y = pos_y;                        break; // shells
+                                               case 1: mypos_x = pos_x;                        mypos_y = pos_y + 0.25 * mySize_y;      break; // bullets
+                                               case 2: mypos_x = pos_x;                        mypos_y = pos_y + 0.5  * mySize_y;      break; // rockets
+                                               case 3: mypos_x = pos_x;                        mypos_y = pos_y + 0.75 * mySize_y;      break; // cells
+                                       }
+                                       mysize_x = mySize_x;
+                                       mysize_y = 0.25 * mySize_y;
+                               }
+
+                               if (stat_items & GetAmmoItemCode(i))
+                                       drawpic(mypos, "gfx/hud/sb_ammobg", mysize, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               drawpic(mypos + eY * 0.05 * mysize_y, GetAmmoPicture(i), '1 1 0' * 0.8 * mysize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               if (a < 10) {
+                                       if(stat_items & GetAmmoItemCode(i))
+                                               HUD_DrawXNum(mypos + eX * 0.8 * mysize_y + eY * 0.25 * mysize_y, a, strlen(ftos(a)), 0, 0.5 * mysize_y, '0.7 0 0', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                                       else
+                                               HUD_DrawXNum(mypos + eX * 0.8 * mysize_y + eY * 0.25 * mysize_y, a, strlen(ftos(a)), 0, 0.5 * mysize_y, '0.7 0 0', 0, 0, hud_alpha_fg * 0.7, DRAWFLAG_NORMAL);
+                               } else {
+                                       if(stat_items & GetAmmoItemCode(i))
+                                               HUD_DrawXNum(mypos + eX * 0.8 * mysize_y + eY * 0.25 * mysize_y, a, strlen(ftos(a)), 0, 0.5 * mysize_y, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                                       else
+                                               HUD_DrawXNum(mypos + eX * 0.8 * mysize_y + eY * 0.25 * mysize_y, a, strlen(ftos(a)), 0, 0.5 * mysize_y, '0.7 0.7 0.7', 0, 0, hud_alpha_fg * 0.7, DRAWFLAG_NORMAL);
+                               }
+                       }
+               }
+       }
+
+       // fuel ammo
+       a = getstati(GetAmmoStat(4)); // how much fuel do we have?
+
+       if (a > 0) { // if we have fuel, draw the amount
+               if(pos_x + 0.5 * mySize_x > 0.5 * vid_conwidth)
+                       mypos_x += pos_x + mySize_x - 0; // TODO!
+
+               drawpic(mypos - '0 2 0' + '52 0 0', GetAmmoPicture(4), '20 20 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+               if (a > 10)
+                       HUD_DrawXNum(mypos, a, 3, 0, 16, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+               else
+                       HUD_DrawXNum(mypos, a, 3, 0, 16, '0.7 0 0', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+       }
+}
+
+
+// Powerups (#2)
+// TODO!
+void HUD_Powerups() {
+       float stat_items, dt;
+       float marigin;
+
+       vector pos, mySize, color;
+       marigin = HUD_Panel_GetMarigin(2);
+       pos = HUD_Panel_GetPos(2);
+       mySize = HUD_Panel_GetSize(2);
+       color = HUD_Panel_GetColor(2);
+
+       if(HUD_Panel_GetBgActive(2))
+               draw_BorderPicture(pos - '1 1 0' * marigin, "gfx/hud/border", mySize + '1 1 0' * 2 * marigin, color, hud_alpha_bg, '1 1 0' * (marigin/MARIGIN_MULTIPLIER));
+
+       stat_items = getstati(STAT_ITEMS);
+       /*
+       if not(stat_items & IT_STRENGTH)
+               if not(stat_items & IT_INVINCIBLE)
+                       return;
+       */
+
+       if (getstati(STAT_HEALTH) <= 0)
+               return;
+
+       float strength_time, invincibility_time, countdown_fontsize;
+
+       //strength
+       strength_time = getstatf(STAT_STRENGTH_FINISHED);
+       invincibility_time = getstatf(STAT_INVINCIBLE_FINISHED);
+
+       if (strength_time) {
+               dt = strength_time - time;
+               if(dt > 0)
+               {
+                       if(dt < 5)
+                       {
+                               drawpic_expanding_two(pos, "gfx/hud/sb_str", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE,
+                                       bound(0, (ceil(dt) - dt) / 0.5, 1));
+                       }
+                       else
+                       {
+                               drawpic(pos, "gfx/hud/sb_str", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE);
+                       }
+                       HUD_DrawXNum(pos - '40 -2 0', ceil(dt), 2, 0, countdown_fontsize, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+               }
+               else if(dt > -1)
+               {
+                       drawpic_expanding(pos, "gfx/hud/sb_str", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE,
+                               bound(0, -dt / 0.5, 1));
+               }
+       }
+
+       //invincibility
+       if (invincibility_time) {
+               dt = invincibility_time - time;
+               if(dt > 0)
+               {
+                       if(dt < 5)
+                       {
+                               drawpic_expanding_two(pos - '0 -22 0', "gfx/hud/sb_invinc", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE,
+                                       bound(0, (ceil(dt) - dt) / 0.5, 1));
+                       }
+                       else
+                       {
+                               drawpic(pos - '0 -22 0', "gfx/hud/sb_invinc", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE);
+                       }
+                       HUD_DrawXNum(pos - '40 -24 0', ceil(dt), 2, 0, countdown_fontsize, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+               }
+               else if(dt > -1)
+               {
+                       drawpic_expanding(pos - '0 -22 0', "gfx/hud/sb_invinc", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE,
+                               bound(0, -dt / 0.5, 1));
+               }
+       }
+}
+
+// Health/armor (#3)
+//
+void HUD_HealthArmor(void)
+{
+       float marigin;
+
+       vector pos, mySize, color;
+       marigin = HUD_Panel_GetMarigin(3);
+       pos = HUD_Panel_GetPos(3);
+       mySize = HUD_Panel_GetSize(3);
+       color = HUD_Panel_GetColor(3);
+
+       if(HUD_Panel_GetBgActive(3))
+               draw_BorderPicture(pos - '1 1 0' * marigin, "gfx/hud/border", mySize + '1 1 0' * 2 * marigin, color, hud_alpha_bg, '1 1 0' * (marigin/MARIGIN_MULTIPLIER));
+
+       float armor, health, x;
+       armor = getstati(STAT_ARMOR);
+       health = getstati(STAT_HEALTH);
+       if(cvar("_hud_configure"))
+       {
+               armor = 150;
+               health = 100;
+       }
+
+       if(health <= 0)
+               return;
+
+       float numbers;
+
+       // TODO!
+       if(hud_hudselector == 2) // combined health and armor display
+       {
+               vector v;
+               v = healtharmor_maxdamage(health, armor, armorblockpercent);
+
+               vector num_pos;
+               num_pos = - '96 28 0';
+
+               x = floor(v_x + 1);
+
+               if(v_z) // fully armored
+               {
+                       // here, armorideal > armor
+                       drawpic(num_pos + '78 -4.5 0', "gfx/hud/sb_health", '32 32 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                       drawpic(num_pos + '108 -4.5 0', "gfx/hud/sb_armor", '20 20 0', '1 1 1', hud_alpha_fg * armor / v_y, DRAWFLAG_NORMAL);
+               }
+               else
+               {
+                       drawpic(num_pos + '108 -4.5 0', "gfx/hud/sb_health", '20 20 0', '1 1 1', hud_alpha_fg * v_y / armor, DRAWFLAG_NORMAL);
+                       drawpic(num_pos + '78 -4.5 0', "gfx/hud/sb_armor", '32 32 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+               }
+               HUD_DrawXNum_Colored(num_pos, x, 3, 24, hud_alpha_fg); // draw the combined health and armor
+       }
+
+       else
+       {
+               vector health_pos, armor_pos;
+
+               // TODO!
+               if (hud_hudselector == 0) { // old style layout with armor left of health
+                       armor_pos = pos;
+                       health_pos = pos + eX * 0.5 * mySize_x;
+               } else {
+                       health_pos = pos;
+                       armor_pos = pos + eX * 0.5 * mySize_x;
+               }
+
+
+               if (mySize_x/mySize_y > 5)
+               {
+                       // armor
+                       x = armor;
+                       numbers = strlen(ftos(x));
+
+                       if (x > 0)
+                       {
+                               drawpic(pos, "gfx/hud/statuhud", eX * 0.5 * mySize_x * min(1, x/200) + eY * mySize_y, HUD_Panel_GetProgressBarColor("armor"), cvar("hud_progreshud_alpha"), DRAWFLAG_NORMAL);
+                               if (x > 45)
+                                       drawpic(pos, "gfx/hud/sb_armor", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               else
+                                       drawpic(pos, "gfx/hud/sb_armor", '1 1 0' * mySize_y, '1 1 1', (x+10)/55 * hud_alpha_fg, DRAWFLAG_NORMAL);
+                               HUD_DrawXNum_Colored(pos + eX * mySize_y + eY * 0.25 * mySize_y, x, numbers, 0.5 * mySize_y, hud_alpha_fg);
+                       }
+
+                       // health
+                       x = health;
+                       drawpic(pos + eX * mySize_x - eX * 0.5 * mySize_x * min(1, x/200), "gfx/hud/statuhud", eX * 0.5 * mySize_x * min(1, x/200) + eY * mySize_y, HUD_Panel_GetProgressBarColor("health"), cvar("hud_progreshud_alpha"), DRAWFLAG_NORMAL);
+                       drawpic(pos + eX * mySize_x - eX * mySize_y, "gfx/hud/sb_health", '1 1 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum_Colored(pos + eX * mySize_x - eX * 2.5 * mySize_y + eY * 0.25 * mySize_y, x, 3, 0.5 * mySize_y, hud_alpha_fg);
+               }
+               else if (mySize_x/mySize_y > 3.2)
+               {
+                       // armor
+                       x = armor;
+                       numbers = strlen(ftos(x));
+
+                       if (x > 0)
+                       {
+                               drawpic(pos + eY * mySize_y - eY * mySize_y * min(1, x/200), "gfx/hud/statuhud", eX * 0.5 * mySize_x + eY * mySize_y * min(1, x/200), HUD_Panel_GetProgressBarColor("armor"), cvar("hud_progreshud_alpha"), DRAWFLAG_NORMAL);
+                               if (x > 45)
+                                       drawpic(pos + eX * 0.4 * mySize_y, "gfx/hud/sb_armor", '0.7 0.7 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               else
+                                       drawpic(pos + eX * 0.4 * mySize_y, "gfx/hud/sb_armor", '0.7 0.7 0' * mySize_y, '1 1 1', (x+10)/55 * hud_alpha_fg, DRAWFLAG_NORMAL);
+                               HUD_DrawXNum_Colored(pos + eY * 0.55 * mySize_y, x, numbers, 0.5 * mySize_y, hud_alpha_fg);
+                       }
+
+                       // health
+                       x = health;
+                       numbers = strlen(ftos(x));
+
+                       drawpic(pos + eX * 0.5 * mySize_x + eY * mySize_y - eY * mySize_y * min(1, x/200), "gfx/hud/statuhud", eX * 0.5 * mySize_x + eY * mySize_y * min(1, x/200), HUD_Panel_GetProgressBarColor("health"), cvar("hud_progreshud_alpha"), DRAWFLAG_NORMAL);
+                       drawpic(pos + eX * mySize_x - eX * 1.1 * mySize_y, "gfx/hud/sb_health", '0.7 0.7 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum_Colored(pos + eX * mySize_x - eX * numbers * 0.5 * mySize_y + eY * 0.55 * mySize_y, x, numbers, 0.5 * mySize_y, hud_alpha_fg);
+               }
+               else
+               {
+                       // armor
+                       x = armor;
+                       numbers = strlen(ftos(x));
+
+                       if (x > 0)
+                       {
+                               drawpic(pos, "gfx/hud/statuhud", eX * mySize_x * min(1, x/200) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor("armor"), cvar("hud_progreshud_alpha"), DRAWFLAG_NORMAL);
+                               if (x > 45)
+                                       drawpic(pos, "gfx/hud/sb_armor", '0.5 0.5 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                               else
+                                       drawpic(pos, "gfx/hud/sb_armor", '0.5 0.5 0' * mySize_y, '1 1 1', (x+10)/55 * hud_alpha_fg, DRAWFLAG_NORMAL);
+                               HUD_DrawXNum_Colored(pos + eX * 0.5 * mySize_y, x, numbers, 0.5 * mySize_y, hud_alpha_fg);
+                       }
+
+                       // health
+                       x = health;
+                       numbers = strlen(ftos(x));
+
+                       drawpic(pos + eY * 0.5 * mySize_y, "gfx/hud/statuhud", eX * mySize_x * min(1, x/200) + eY * 0.5 * mySize_y, HUD_Panel_GetProgressBarColor("health"), cvar("hud_progreshud_alpha"), DRAWFLAG_NORMAL);
+                       drawpic(pos + eY * 0.5 * mySize_y, "gfx/hud/sb_health", '0.5 0.5 0' * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum_Colored(pos + eX * 0.5 * mySize_y + eY * 0.5 * mySize_y, x, numbers, 0.5 * mySize_y, hud_alpha_fg);
+               }
+       }
+}
+
+// Score (#7)
+//
+void HUD_Score()
+{
+       float marigin;
+
+       vector pos, mySize, color;
+       marigin = HUD_Panel_GetMarigin(7);
+       pos = HUD_Panel_GetPos(7);
+       mySize = HUD_Panel_GetSize(7);
+       color = HUD_Panel_GetColor(7);
+
+       if(HUD_Panel_GetBgActive(7))
+               draw_BorderPicture(pos - '1 1 0' * marigin, "gfx/hud/border", mySize + '1 1 0' * 2 * marigin, color, hud_alpha_bg, '1 1 0' * (marigin/MARIGIN_MULTIPLIER));
+
+       float score, distribution, leader;
+       vector score_pos, secondary_score_pos, distribution_color;
+       entity tm, pl, me;
+       me = (spectatee_status > 0) ? playerslots[spectatee_status - 1] : playerslots[player_localentnum - 1];
+
+       if (!teamplay) { // non-teamgames
+               // me vector := [team/connected frags id]
+               pl = players.sort_next;
+               if(pl == me)
+                       pl = pl.sort_next;
+
+               if(pl)
+                       distribution = me.(scores[ps_primary]) - pl.(scores[ps_primary]);
+               else
+                       distribution = 0;
+
+               score = me.(scores[ps_primary]);
+
+               if(distribution >= 5) {
+                       distribution_color = eY;
+                       leader = 1;
+               } else if(distribution >= 0) {
+                       distribution_color = '1 1 1';
+                       leader = 1;
+               } else if(distribution >= -5)
+                       distribution_color = '1 1 0';
+               else
+                       distribution_color = eX;
+
+               HUD_DrawXNum(pos + eX * mySize_x - eX * 6 * 0.3  * mySize_y, distribution, 6, 3, 0.3 * mySize_y, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+               HUD_DrawXNum(pos + eX * mySize_x - eX * 6 * 0.75 * mySize_y + eY * 0.35 * mySize_y, score, 6, 0, 0.75 * mySize_y, distribution_color, leader, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+       } else { // teamgames
+               float max_fragcount;
+               max_fragcount = -999;
+
+               for(tm = teams.sort_next; tm; tm = tm.sort_next) {
+                       if(tm.team == COLOR_SPECTATOR || !tm.team_size) // no players? don't display
+                               continue;
+                       score = tm.(teamscores[ts_primary]);
+                       leader = 0;
+
+                       if (score > max_fragcount)
+                               max_fragcount = score;
+
+                       if(tm.team == myteam) {
+                               if (max_fragcount == score)
+                                       leader = 1;
+                               HUD_DrawXNum(score_pos, score, 4, 0, 34, GetTeamRGB(tm.team) * 0.8, leader, 1, hud_alpha_fg, DRAWFLAG_NORMAL);
+                       } else {
+                               if (max_fragcount == score)
+                                       leader = 1;
+                               HUD_DrawXNum(secondary_score_pos, score, 6, 0, 16, GetTeamRGB(tm.team) * 0.8, leader, 1, hud_alpha_fg, DRAWFLAG_NORMAL);
+                               secondary_score_pos = secondary_score_pos + '0 16 0';
+                       }
+               }
+       }
+}
+
+// Race timer (#8)
+//
+void HUD_RaceTimer (void) {
+       float marigin;
+
+       vector pos, mySize, color;
+       marigin = HUD_Panel_GetMarigin(8);
+       pos = HUD_Panel_GetPos(8);
+       mySize = HUD_Panel_GetSize(8);
+       color = HUD_Panel_GetColor(8);
+
+       if(HUD_Panel_GetBgActive(8))
+               draw_BorderPicture(pos - '1 1 0' * marigin, "gfx/hud/border", mySize + '1 1 0' * 2 * marigin, color, hud_alpha_bg, '1 1 0' * (marigin/MARIGIN_MULTIPLIER));
+
+       drawfont = hud_bigfont;
+       float a, t;
+       string s, forcetime;
+
+       if(race_checkpointtime)
+       {
+               a = bound(0, 2 - (time - race_checkpointtime), 1);
+               s = "";
+               forcetime = "";
+               if(a > 0) // just hit a checkpoint?
+               {
+                       if(race_checkpoint != 254)
+                       {
+                               if(race_time && race_previousbesttime)
+                                       s = MakeRaceString(race_checkpoint, TIME_DECODE(race_time) - TIME_DECODE(race_previousbesttime), 0, 0, race_previousbestname);
+                               else
+                                       s = MakeRaceString(race_checkpoint, 0, -1, 0, race_previousbestname);
+                               if(race_time)
+                                       forcetime = TIME_ENCODED_TOSTRING(race_time);
+                       }
+               }
+               else
+               {
+                       if(race_laptime && race_nextbesttime && race_nextcheckpoint != 254)
+                       {
+                               a = bound(0, 2 - ((race_laptime + TIME_DECODE(race_nextbesttime)) - (time + TIME_DECODE(race_penaltyaccumulator))), 1);
+                               if(a > 0) // next one?
+                               {
+                                       s = MakeRaceString(race_nextcheckpoint, (time + TIME_DECODE(race_penaltyaccumulator)) - race_laptime, TIME_DECODE(race_nextbesttime), 0, race_nextbestname);
+                               }
+                       }
+               }
+
+               if(s != "" && a > 0)
+               {
+                       dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0)
+                       //drawcolorcodedstring(m - '0 16 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+                       drawcolorcodedstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, TRUE, '1 1 0' * 0.25 * mySize_y) + eY * 0.75 * mySize_y, s, '1 1 0' * 0.25 * mySize_y, hud_alpha_fg * a, DRAWFLAG_NORMAL);
+               }
+
+               if(race_penaltytime)
+               {
+                       a = bound(0, 2 - (time - race_penaltyeventtime), 1);
+                       if(a > 0)
+                       {
+                               s = strcat("^1PENALTY: ", ftos_decimals(race_penaltytime * 0.1, 1), " (", race_penaltyreason, ")");
+                               dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0)
+                               //drawcolorcodedstring(m - '0 32 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos - '0 32 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+                       }
+               }
+
+               if(forcetime != "")
+               {
+                       a = bound(0, (time - race_checkpointtime) / 0.5, 1);
+                       //drawstring_expanding(m - '16 0 0' * stringwidth(forcetime, FALSE), forcetime, '32 32 0', '1 1 1', hud_alpha_fg, 0, a);
+                       drawstring_expanding(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(forcetime, FALSE, '1 1 0' * 0.75 * mySize_y), forcetime, '1 1 0' * 0.75 * mySize_y, '1 1 1', hud_alpha_fg, 0, a);
+               }
+               else
+                       a = 1;
+
+               if(race_laptime && race_checkpoint != 255)
+               {
+                       s = TIME_ENCODED_TOSTRING(TIME_ENCODE(time + TIME_DECODE(race_penaltyaccumulator) - race_laptime));
+                       //drawstring(m - '16 0 0' * stringwidth(s, FALSE), s, '32 32 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+                       drawstring(pos + eX * 0.5 * mySize_x - '0.5 0 0' * stringwidth(s, FALSE, '0.75 0.75 0' * mySize_y), s, '0.75 0.75 0' * mySize_y, '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+               }
+       }
+       else
+       {
+               if(race_mycheckpointtime)
+               {
+                       a = bound(0, 2 - (time - race_mycheckpointtime), 1);
+                       s = MakeRaceString(race_mycheckpoint, TIME_DECODE(race_mycheckpointdelta), -!race_mycheckpointenemy, race_mycheckpointlapsdelta, race_mycheckpointenemy);
+                       dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0)
+                       //drawcolorcodedstring(m - '0 16 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+                       drawcolorcodedstring(pos - '0 16 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+               }
+               if(race_othercheckpointtime && race_othercheckpointenemy != "")
+               {
+                       a = bound(0, 2 - (time - race_othercheckpointtime), 1);
+                       s = MakeRaceString(race_othercheckpoint, -TIME_DECODE(race_othercheckpointdelta), -!race_othercheckpointenemy, race_othercheckpointlapsdelta, race_othercheckpointenemy);
+                       dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0)
+                       //drawcolorcodedstring(m - '0 0 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+                       drawcolorcodedstring(pos - '0 0 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+               }
+
+               if(race_penaltytime && !race_penaltyaccumulator)
+               {
+                       t = race_penaltytime * 0.1 + race_penaltyeventtime;
+                       a = bound(0, (1 + t - time), 1);
+                       if(a > 0)
+                       {
+                               if(time < t)
+                                       s = strcat("^1PENALTY: ", ftos_decimals(t - time, 1), " (", race_penaltyreason, ")");
+                               else
+                                       s = strcat("^2PENALTY: 0.0 (", race_penaltyreason, ")");
+                               dummyfunction(0, 0, 0, 0, 0, 0, 0, 0); // work around DP bug (set OFS_PARAM5 to 0)
+                               //drawcolorcodedstring(m - '0 32 0' - '8 0 0' * stringwidth(s, TRUE), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+                               drawcolorcodedstring(pos - '0 32 0' - '0.5 0 0' * stringwidth(s, TRUE, '16 16 0'), s, '16 16 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+                       }
+               }
+       }
+
+       drawfont = hud_font;
+}
+
+// Notification area (#4)
+void HUD_Notify (void)
+{
+       float marigin;
+
+       vector pos, mySize, color;
+       marigin = HUD_Panel_GetMarigin(4);
+       pos = HUD_Panel_GetPos(4);
+       mySize = HUD_Panel_GetSize(4);
+       color = HUD_Panel_GetColor(4);
+
+       if(HUD_Panel_GetBgActive(4))
+               draw_BorderPicture(pos - '1 1 0' * marigin, "gfx/hud/border", mySize + '1 1 0' * 2 * marigin, color, hud_alpha_bg, '1 1 0' * (marigin/MARIGIN_MULTIPLIER));
+
+       string s;
+       entity tm;
+       if(spectatee_status && !intermission)
+       {
+               drawfont = hud_bigfont;
+               if(spectatee_status == -1)
+                       s = "^1Observing";
+               else
+                       s = GetPlayerName(spectatee_status - 1);
+               // spectated player name between HUD and chat area, aligned to the left
+               pos_x = 0;
+               pos_y = - 50 - hud_fontsize_spec_y;
+               s = textShortenToWidth(s, vid_conwidth/2.5, hud_fontsize_spec, stringwidth_colors);
+               drawcolorcodedstring(pos, s, hud_fontsize_spec, hud_alpha_fg, DRAWFLAG_NORMAL);
+               drawfont = hud_font;
+
+               // spectator text in the upper right corner
+               if(spectatee_status == -1)
+                       s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 to spectate");
+               else
+                       s = strcat("^1Press ^3", getcommandkey("primary fire", "+attack"), "^1 for another player");
+
+               if(spectatee_status == -1)
+                       s = strcat("^1Use ^3", getcommandkey("next weapon", "weapnext"), "^1 or ^3", getcommandkey("previous weapon", "weapprev"), "^1 to change the speed");
+               else
+                       s = strcat("^1Press ^3", getcommandkey("secondary fire", "+attack2"), "^1 to observe");
+
+               s = strcat("^1Press ^3", getcommandkey("server info", "+show_info"), "^1 for gamemode info");
+
+               if(gametype == GAME_ARENA)
+                       s = "^1Wait for your turn to join";
+               else if(gametype == GAME_LMS)
+               {
+                       entity sk;
+                       sk = playerslots[player_localentnum - 1];
+                       if(sk.(scores[ps_primary]) >= 666)
+                               s = "^1Match has already begun";
+                       else if(sk.(scores[ps_primary]) > 0)
+                               s = "^1You have no more lives left";
+                       else
+                               s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join");
+               }
+               else
+                       s = strcat("^1Press ^3", getcommandkey("jump", "+jump"), "^1 to join");
+
+               //show restart countdown:
+               if (time < getstatf(STAT_GAMESTARTTIME)) {
+                       float countdown;
+                       //we need to ceil, otherwise the countdown would be off by .5 when using round()
+                       countdown = ceil(getstatf(STAT_GAMESTARTTIME) - time);
+                       s = strcat("^1Game starts in ^3", ftos(countdown), "^1 seconds");
+               }
+       }
+       if(warmup_stage && !intermission)
+       {
+               s = "^2Currently in ^1warmup^2 stage!";
+       }
+
+       // move more important stuff more to the middle so its more visible
+
+       string blinkcolor;
+       if(mod(time, 1) >= 0.5)
+               blinkcolor = "^1";
+       else
+               blinkcolor = "^3";
+
+       if(ready_waiting && !intermission && !spectatee_status)
+       {
+               if(ready_waiting_for_me)
+               {
+                       if(warmup_stage)
+                               s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " to end warmup");
+                       else
+                               s = strcat(blinkcolor, "Press ^3", getcommandkey("ready", "ready"), blinkcolor, " once you are ready");
+               }
+               else
+               {
+                       if(warmup_stage)
+                               s = strcat("^2Waiting for others to ready up to end warmup...");
+                       else
+                               s = strcat("^2Waiting for others to ready up...");
+               }
+       }
+       else if(warmup_stage && !intermission && !spectatee_status)
+       {
+               s = strcat("^2Press ^3", getcommandkey("ready", "ready"), "^2 to end warmup");
+       }
+
+       if(teamplay && !intermission && !spectatee_status && gametype != GAME_CA && teamnagger)
+       {
+               float ts_min, ts_max;
+               tm = teams.sort_next;
+               if (tm)
+               {
+                       for(; tm.sort_next; tm = tm.sort_next)
+                       {
+                               if(!tm.team_size || tm.team == COLOR_SPECTATOR)
+                                       continue;
+                               if(!ts_min) ts_min = tm.team_size;
+                               else ts_min = min(ts_min, tm.team_size);
+                               if(!ts_max) ts_max = tm.team_size;
+                               else ts_max = max(ts_max, tm.team_size);
+                       }
+                       if ((ts_max - ts_min) > 1)
+                       {
+                               s = strcat(blinkcolor, "Teamnumbers are unbalanced!");
+                               tm = GetTeam(myteam, false);
+                               if (tm)
+                               if (tm.team != COLOR_SPECTATOR)
+                               if (tm.team_size == ts_max)
+                                       s = strcat(s, " Press ^3", getcommandkey("team menu", "menu_showteamselect"), blinkcolor, " to adjust");
+
+                       }
+               }
+       }
+}
+
+// Vote window (#9)
+float vote_yescount;
+float vote_nocount;
+float vote_needed;
+float vote_highlighted; // currently selected vote
+
+float vote_active; // is there an active vote?
+float vote_prev; // previous state of vote_active to check for a change
+float vote_alpha;
+float vote_change; // "time" when vote_active changed
+
+void HUD_VoteWindow(void) 
+{
+       float marigin;
+
+       vector pos, mySize, color;
+       marigin = HUD_Panel_GetMarigin(9);
+       pos = HUD_Panel_GetPos(9);
+       mySize = HUD_Panel_GetSize(9);
+       color = HUD_Panel_GetColor(9);
+
+       string s;
+       float a;
+       if(vote_active != vote_prev) {
+               vote_change = time;
+               vote_prev = bound(0, vote_active, 1);
+       }
+
+       if(vote_active)
+               vote_alpha = bound(0, (time - vote_change) * 2, 1);
+       else
+               vote_alpha = bound(0, 1 - (time - vote_change) * 2, 1);
+
+       if(HUD_Panel_GetBgActive(9))
+               draw_BorderPicture(pos - '1 1 0' * marigin, "gfx/hud/border", mySize + '1 1 0' * 2 * marigin, color, hud_alpha_bg * vote_alpha, '1 1 0' * (marigin/MARIGIN_MULTIPLIER));
+
+       if(vote_alpha) {
+               a = vote_alpha * bound(cvar_or("hud_vote_alreadyvoted_alpha", 0.75), 1 - vote_highlighted, 1);
+
+               drawpic(pos, "gfx/hud/voteprogress_back", mySize, HUD_GetBgColor(), a * hud_alpha_bg, DRAWFLAG_NORMAL);
+
+               s = "A vote has been called for: ";
+               drawstring(pos + '0.5 0 0' * mySize_x + '0 0.1 0' * mySize_y - eX * stringwidth(s, FALSE, '1 1 0' * 0.5 * mySize_y*(1/5)), s, '1 1 0' * mySize_y*(1/5), '1 1 1', a * hud_alpha_fg, DRAWFLAG_NORMAL);
+               s = textShortenToWidth(vote_called_vote, mySize_x * 0.96, '10 0 0', stringwidth_colors);
+               drawcolorcodedstring(pos + '0.52 0 0' * mySize_x + '0 0.3 0' * mySize_y - eX * stringwidth(s, FALSE, '1 1 0' * 0.5 * mySize_y*(1/6)), s, '1 1 0' * mySize_y*(1/6), a * hud_alpha_fg, DRAWFLAG_NORMAL);
+
+               // print the yes/no counts
+               s = strcat("Yes: ", ftos(vote_yescount));
+               drawstring(pos + '0 0.6 0' * mySize_y + '0.02 0 0' * mySize_x, s, '1 1 0' * mySize_y*(1/6) , eY, a * hud_alpha_fg, DRAWFLAG_NORMAL);
+               s = strcat("No: ", ftos(vote_nocount));
+               drawstring(pos + '0 0.6 0' * mySize_y + '0.98 0 0' * mySize_x - eX * stringwidth(s, FALSE, '1 1 0' * mySize_y*(1/6)), s, '1 1 0' * mySize_y*(1/6), eX, a * hud_alpha_fg, DRAWFLAG_NORMAL);
+
+               // draw the progress bars
+               drawsetcliparea(pos_x, pos_y, mySize_x * 0.5 * (vote_yescount/vote_needed), mySize_y);
+               drawpic(pos, "gfx/hud/voteprogress_prog", mySize, eY, a * hud_alpha_fg, DRAWFLAG_NORMAL);
+
+               drawsetcliparea(pos_x + mySize_x - mySize_x * 0.5 * (vote_nocount/vote_needed), pos_y, mySize_x * 0.5, mySize_y);
+               drawpic(pos, "gfx/hud/voteprogress_prog", mySize, eX, a * hud_alpha_fg, DRAWFLAG_NORMAL);
+
+               // draw the highlights
+               if(vote_highlighted == 1) {
+                       drawsetcliparea(pos_x, pos_y, mySize_x * 0.5, mySize_y);
+                       drawpic(pos, "gfx/hud/voteprogress_voted", mySize, eY, a * hud_alpha_fg, DRAWFLAG_NORMAL);
+               }
+               else if(vote_highlighted == 2) {
+                       drawsetcliparea(pos_x + 0.5 * mySize_x, pos_y, mySize_x * 0.5, mySize_y);
+                       drawpic(pos, "gfx/hud/voteprogress_voted", mySize, eX, a * hud_alpha_fg, DRAWFLAG_NORMAL);
+               }
+
+               drawresetcliparea();
+       }
+       else if(!vote_active) {
+               vote_highlighted = 0;
+       }
+}
+
+// Awards system
+float race_status_time;
+float race_status_prev;
+string race_status_name_prev;
+void HUD_DrawRaceStatus(vector pos)
+{
+       if (race_status != race_status_prev || race_status_name != race_status_name_prev) {
+               race_status_time = time + 5;
+               race_status_prev = race_status;
+               if (race_status_name_prev)
+                       strunzone(race_status_name_prev);
+               race_status_name_prev = strzone(race_status_name);
+       }
+
+       float a;
+       a = bound(0, race_status_time - time, 1);
+
+       string s;
+       s = textShortenToWidth(race_status_name, 120, '10 10 0', stringwidth_colors);
+
+       float rank;
+       if(race_status > 0)
+               rank = race_CheckName(race_status_name);
+       string rankname;
+       rankname = race_PlaceName(rank);
+
+       if(race_status == 0)
+               drawpic(pos, "gfx/hud/race/newfail", '80 80 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+       else if(race_status == 1) {
+               drawpic(pos, "gfx/hud/race/newtime", '80 80 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+               drawcolorcodedstring(pos + '40 80 0' - eX * stringwidth(s, TRUE, '5 0 0'), s, '10 10 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+               drawstring(pos + '40 20 0' - eX * stringwidth(rankname, TRUE, '7 0 0'), rankname, '14 14 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+       } else if(race_status == 2) {
+               if(race_status_name == GetPlayerName(player_localentnum -1) || !race_myrank || race_myrank < rank)
+                       drawpic(pos, "gfx/hud/race/newrankgreen", '80 80 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+               else
+                       drawpic(pos, "gfx/hud/race/newrankyellow", '80 80 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+               drawcolorcodedstring(pos + '40 80 0' - eX * stringwidth(s, TRUE, '5 0 0'), s, '10 10 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+               drawstring(pos + '40 20 0' - eX * stringwidth(rankname, TRUE, '7 0 0'), rankname, '14 14 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+       } else if(race_status == 3) {
+               drawpic(pos, "gfx/hud/race/newrecordserver", '80 80 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+               drawcolorcodedstring(pos + '40 80 0' - eX * stringwidth(s, TRUE, '5 0 0'), s, '10 10 0', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+               drawstring(pos + '40 20 0' - eX * stringwidth(rankname, TRUE, '7 0 0'), rankname, '14 14 0', '1 1 1', hud_alpha_fg * a, DRAWFLAG_NORMAL);
+       }
+
+       if (race_status_time - time <= 0) {
+               race_status_prev = -1;
+               race_status = -1;
+               if(race_status_name)
+                       strunzone(race_status_name);
+               race_status_name = string_null;
+               if(race_status_name_prev)
+                       strunzone(race_status_name_prev);
+               race_status_name_prev = string_null;
+       }
+}
+
+// CTF HUD modicon section
+float redflag_prevframe, blueflag_prevframe; // status during previous frame
+float redflag_prevstatus, blueflag_prevstatus; // last remembered status
+float redflag_statuschange_time, blueflag_statuschange_time; // time when the status changed
+
+void CSQC_ctf_hudreset(void)
+{
+       redflag_prevstatus = blueflag_prevstatus = redflag_prevframe = blueflag_prevframe = redflag_statuschange_time = blueflag_statuschange_time = 0;
+}
+
+void CSQC_ctf_hud(void)
+{
+       vector bottomleft, redflag_pos, blueflag_pos, sz;
+       float f; // every function should have that
+       bottomleft_y = vid_conheight;
+       bottomleft_z = 0;
+
+       float redflag, blueflag; // current status
+       float redflag_statuschange_elapsedtime, blueflag_statuschange_elapsedtime; // time since the status changed
+       float stat_items;
+
+       stat_items = getstati(STAT_ITEMS);
+       redflag = (stat_items/IT_RED_FLAG_TAKEN) & 3;
+       blueflag = (stat_items/IT_BLUE_FLAG_TAKEN) & 3;
+
+       // when status CHANGES, set old status into prevstatus and current status into status
+       if (redflag != redflag_prevframe)
+       {
+               redflag_statuschange_time = time;
+               redflag_prevstatus = redflag_prevframe;
+               redflag_prevframe = redflag;
+       }
+
+       if (blueflag != blueflag_prevframe)
+       {
+               blueflag_statuschange_time = time;
+               blueflag_prevstatus = blueflag_prevframe;
+               blueflag_prevframe = blueflag;
+       }
+
+       redflag_statuschange_elapsedtime = time - redflag_statuschange_time;
+       blueflag_statuschange_elapsedtime = time - blueflag_statuschange_time;
+
+       float BLINK_FACTOR = 0.15;
+       float BLINK_BASE = 0.85;
+       // note:
+       //   RMS = sqrt(BLINK_BASE^2 + 0.5 * BLINK_FACTOR^2)
+       // thus
+       //   BLINK_BASE = sqrt(RMS^2 - 0.5 * BLINK_FACTOR^2)
+       // ensure RMS == 1
+       float BLINK_FREQ = 5; // circle frequency, = 2*pi*frequency in hertz
+
+       string red_icon, red_icon_prevstatus;
+       float red_alpha, red_alpha_prevstatus;
+       red_alpha = red_alpha_prevstatus = 1;
+       switch(redflag) {
+               case 1: red_icon = "gfx/hud/sb_flag_red_taken"; break;
+               case 2: red_icon = "gfx/hud/sb_flag_red_lost"; break;
+               case 3: red_icon = "gfx/hud/sb_flag_red_carrying"; red_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
+               default:
+                       if((stat_items & IT_CTF_SHIELDED) && (myteam == COLOR_TEAM2))
+                               red_icon = "gfx/hud/sb_flag_red_shielded";
+                       else
+                               red_icon = string_null;
+                       break;
+       }
+       switch(redflag_prevstatus) {
+               case 1: red_icon_prevstatus = "gfx/hud/sb_flag_red_taken"; break;
+               case 2: red_icon_prevstatus = "gfx/hud/sb_flag_red_lost"; break;
+               case 3: red_icon_prevstatus = "gfx/hud/sb_flag_red_carrying"; red_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
+               default:
+                       if(redflag == 3)
+                               red_icon_prevstatus = "gfx/hud/sb_flag_red_carrying"; // make it more visible
+                       else if((stat_items & IT_CTF_SHIELDED) && (myteam == COLOR_TEAM2))
+                               red_icon_prevstatus = "gfx/hud/sb_flag_red_shielded";
+                       else
+                               red_icon_prevstatus = string_null;
+                       break;
+       }
+
+       string blue_icon, blue_icon_prevstatus;
+       float blue_alpha, blue_alpha_prevstatus;
+       blue_alpha = blue_alpha_prevstatus = 1;
+       switch(blueflag) {
+               case 1: blue_icon = "gfx/hud/sb_flag_blue_taken"; break;
+               case 2: blue_icon = "gfx/hud/sb_flag_blue_lost"; break;
+               case 3: blue_icon = "gfx/hud/sb_flag_blue_carrying"; blue_alpha = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
+               default:
+                       if((stat_items & IT_CTF_SHIELDED) && (myteam == COLOR_TEAM1))
+                               blue_icon = "gfx/hud/sb_flag_blue_shielded";
+                       else
+                               blue_icon = string_null;
+                       break;
+       }
+       switch(blueflag_prevstatus) {
+               case 1: blue_icon_prevstatus = "gfx/hud/sb_flag_blue_taken"; break;
+               case 2: blue_icon_prevstatus = "gfx/hud/sb_flag_blue_lost"; break;
+               case 3: blue_icon_prevstatus = "gfx/hud/sb_flag_blue_carrying"; blue_alpha_prevstatus = BLINK_BASE + BLINK_FACTOR * cos(time * BLINK_FREQ); break;
+               default:
+                       if(blueflag == 3)
+                               blue_icon_prevstatus = "gfx/hud/sb_flag_blue_carrying"; // make it more visible
+                       else if((stat_items & IT_CTF_SHIELDED) && (myteam == COLOR_TEAM1))
+                               blue_icon_prevstatus = "gfx/hud/sb_flag_blue_shielded";
+                       else
+                               blue_icon_prevstatus = string_null;
+                       break;
+       }
+
+       if (myteam == COLOR_TEAM1) { // always draw own flag on left
+               redflag_pos = bottomleft - '-4 50 0';
+               blueflag_pos = bottomleft - '-62 50 0';
+       } else {
+               blueflag_pos = bottomleft - '-4 50 0';
+               redflag_pos = bottomleft - '-62 50 0';
+       }
+
+       sz = '52 52 0';
+
+       f = bound(0, redflag_statuschange_elapsedtime*2, 1);
+       if(red_icon_prevstatus && f < 1)
+               drawpic_expanding(redflag_pos, red_icon_prevstatus, sz, '1 1 1', hud_alpha_fg * red_alpha_prevstatus, DRAWFLAG_NORMAL, f);
+       if(red_icon)
+               drawpic(redflag_pos, red_icon, sz, '1 1 1', hud_alpha_fg * red_alpha * f, DRAWFLAG_NORMAL);
+
+       f = bound(0, blueflag_statuschange_elapsedtime*2, 1);
+       if(blue_icon_prevstatus && f < 1)
+               drawpic_expanding(blueflag_pos, blue_icon_prevstatus, sz, '1 1 1', hud_alpha_fg * blue_alpha_prevstatus, DRAWFLAG_NORMAL, f);
+       if(blue_icon)
+               drawpic(blueflag_pos, blue_icon, sz, '1 1 1', hud_alpha_fg * blue_alpha * f, DRAWFLAG_NORMAL);
+}
+
+/*void HUD_Mod_Race (void) {
+       if((scores_flags[ps_primary] & SFL_TIME) && !teamplay) { // race/cts record display on HUD
+               pl = players.sort_next;
+               if(pl == me)
+                       pl = pl.sort_next;
+               if(scores_flags[ps_primary] & SFL_ZERO_IS_WORST)
+                       if(pl.scores[ps_primary] == 0)
+                               pl = world;
+
+               score = me.(scores[ps_primary]);
+
+               float racemin, racesec, racemsec;
+               float distsec, distmsec, minusplus;
+
+               racemin = floor(score/(60 * TIME_FACTOR));
+               racesec = floor((score - racemin*(60 * TIME_FACTOR))/TIME_FACTOR);
+               racemsec = score - racemin*60*TIME_FACTOR - racesec*TIME_FACTOR;
+
+               if (pl && ((!(scores_flags[ps_primary] & SFL_ZERO_IS_WORST)) || score)) {
+                       // distribution display
+                       distribution = me.(scores[ps_primary]) - pl.(scores[ps_primary]);
+
+                       if (distribution < TIME_FACTOR && distribution > -TIME_FACTOR)
+                               distmsec = fabs(distribution);
+                       else {
+                               distsec = floor(fabs(distribution)/TIME_FACTOR);
+                               distmsec = fabs(distribution) - distsec*TIME_FACTOR;
+                               if (distribution < 0)
+                                       distsec = -distsec;
+                       }
+
+                       if (distribution <= 0) {
+                               distribution_color = eY;
+                               minusplus = 1; // minusplus 1: always prefix with minus sign
+                       }
+                       else {
+                               distribution_color = eX;
+                               minusplus = 2; // minusplus 1: always prefix with plus sign
+                       }
+                       HUD_DrawXNum(bottomright - '0 48 0' - '16 0 0' * TIME_DECIMALS, distmsec, -TIME_DECIMALS, 0, 16, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum(bottomright - '68 48 0' - '16 0 0' * TIME_DECIMALS, distsec, 4, minusplus, 16, distribution_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                       drawpic(bottomright - '10 48 0' - '16 0 0' * TIME_DECIMALS, "gfx/hud/num_dot", '16 16 0', distribution_color, hud_alpha_fg, DRAWFLAG_ADDITIVE);
+               }
+               // race record display
+               if (distribution <= 0 || distribution == score) // draw the highlight background behind the timer if we have the lead
+                       drawpic(bottomright - '0 32 0' - '32 0 0' * (4 + TIME_DECIMALS), "gfx/hud/sb_highlight_4", '0 28 0' + '32 0 0' * (4 + TIME_DECIMALS), '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+
+               HUD_DrawXNum(bottomright - '0 32 0' - TIME_DECIMALS * '30 0 0', racemsec, -TIME_DECIMALS, 0, 30, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+               HUD_DrawXNum(bottomright - '0 32 0' - TIME_DECIMALS * '30 0 0'  - '66 0 0', racesec, -2, 0, 30, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+               drawpic(bottomright - '0 32 0' - TIME_DECIMALS * '30 0 0' - '18 0 0', "gfx/hud/num_dot", '30 30 0', '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE);
+
+               HUD_DrawXNum(bottomright - '0 32 0' - TIME_DECIMALS * '30 0 0' - '132 0 0', racemin, -2, 0, 30, '1 1 1', 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+               drawpic(bottomright - '0 32 0' - TIME_DECIMALS * '30 0 0' - '84 0 0', "gfx/hud/num_colon", '30 30 0', '1 1 1', hud_alpha_fg, DRAWFLAG_ADDITIVE);
+       }
+}*/
+
+// Keyhunt HUD modicon section
+float kh_runheretime;
+
+void CSQC_kh_hudreset(void)
+{
+       kh_runheretime = 0;
+}
+
+void CSQC_kh_hud(void)
+{
+       float kh_keys;
+       float keyteam;
+       float a, aa;
+       vector p, pa, kh_size, kh_asize;
+
+       p_x = 6;
+       p_y = vid_conheight - 34 - 3;
+       p_z = 0;
+
+       kh_keys = getstati(STAT_KH_KEYS);
+
+       kh_size = '19 34 0';
+       kh_asize = '19 10 0';
+       pa = p + '0 -10 0';
+
+       float i, key;
+
+       float keycount;
+       keycount = 0;
+       for(i = 0; i < 4; ++i)
+       {
+               key = floor(kh_keys / pow(32, i)) & 31;
+               keyteam = key - 1;
+               if(keyteam == 30 && keycount <= 4)
+                       keycount += 4;
+               if(keyteam == myteam || keyteam == -1 || keyteam == 30)
+                       keycount += 1;
+       }
+       // this yields 8 exactly if "RUN HERE" shows
+
+       if(keycount == 8)
+       {
+               if(!kh_runheretime)
+                       kh_runheretime = time;
+               pa_y -= fabs(sin((time - kh_runheretime) * 3.5)) * 6; // make the arrows jump in case of RUN HERE
+       }
+       else
+               kh_runheretime = 0;
+
+       for(i = 0; i < 4; ++i)
+       {
+               key = floor(kh_keys / pow(32, i)) & 31;
+               keyteam = key - 1;
+               switch(keyteam)
+               {
+                       case 30: // my key
+                               keyteam = myteam;
+                               a = 1;
+                               aa = 1;
+                               break;
+                       case -1: // no key
+                               a = 0;
+                               aa = 0;
+                               break;
+                       default: // owned or dropped
+                               a = 0.2;
+                               aa = 0.5;
+                               break;
+               }
+               a = a * hud_alpha_fg;
+               aa = aa * hud_alpha_fg;
+               if(a > 0)
+               {
+                       switch(keyteam)
+                       {
+                               case COLOR_TEAM1:
+                                       drawpic (pa, "gfx/hud/sb_kh_redarrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL);  // show 30% alpha key
+                                       break;
+                               case COLOR_TEAM2:
+                                       drawpic (pa, "gfx/hud/sb_kh_bluearrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL);  // show 30% alpha key
+                                       break;
+                               case COLOR_TEAM3:
+                                       drawpic (pa, "gfx/hud/sb_kh_yellowarrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL);  // show 30% alpha key
+                                       break;
+                               case COLOR_TEAM4:
+                                       drawpic (pa, "gfx/hud/sb_kh_pinkarrow", kh_asize, '1 1 1', aa, DRAWFLAG_NORMAL);  // show 30% alpha key
+                                       break;
+                               default:
+                                       break;
+                       }
+                       switch(i) // YAY! switch(i) inside a for loop for i. DailyWTF, here we come!
+                       {
+                               case 0:
+                                       drawpic (p, "gfx/hud/sb_kh_red", kh_size, '1 1 1', a, DRAWFLAG_NORMAL);  // show 30% alpha key
+                                       break;
+                               case 1:
+                                       drawpic (p, "gfx/hud/sb_kh_blue", kh_size, '1 1 1', a, DRAWFLAG_NORMAL);  // show 30% alpha key
+                                       break;
+                               case 2:
+                                       drawpic (p, "gfx/hud/sb_kh_yellow", kh_size, '1 1 1', a, DRAWFLAG_NORMAL);  // show 30% alpha key
+                                       break;
+                               case 3:
+                                       drawpic (p, "gfx/hud/sb_kh_pink", kh_size, '1 1 1', a, DRAWFLAG_NORMAL);  // show 30% alpha key
+                                       break;
+                       }
+               }
+               p_x += 24;
+               pa_x += 24;
+       }
+}
+
+// Nexball HUD modicon section
+#define NBPB_SIZE '96 38 0'
+#define NBPB_BT 2                   //thickness
+#define NBPB_BRGB '1 1 1'
+#define NBPB_BALPH 1                //alpha
+#define NBPB_BFLAG DRAWFLAG_NORMAL
+#define NBPB_IALPH 0.4
+#define NBPB_IFLAG DRAWFLAG_NORMAL
+#define NBPB_IRGB '0.7 0.1 0'
+
+void CSQC_nb_hud(void)
+{
+       float stat_items, nb_pb_starttime, dt, p;
+       vector pos;
+
+       stat_items = getstati(STAT_ITEMS);
+       nb_pb_starttime = getstatf(STAT_NB_METERSTART);
+
+       pos_x = 4;
+       pos_y = vid_conheight - 42;
+       pos_z = 0;
+
+       //Manage the progress bar if any
+       if (nb_pb_starttime > 0)
+       {
+               vector s;
+               dt = mod(time - nb_pb_starttime, nb_pb_period);
+               // one period of positive triangle
+               p = 2 * dt / nb_pb_period;
+               if (p > 1)
+                       p = 2 - p;
+
+               s = NBPB_SIZE;
+               //Draw the filling
+               drawfill(pos, p * s_x * eX + s_y * eY, NBPB_IRGB, NBPB_IALPH, NBPB_IFLAG);
+
+               //Draw the box
+               s = NBPB_SIZE;
+               drawline(NBPB_BT, pos    , pos + eX * s_x, NBPB_BRGB, NBPB_BALPH, NBPB_BFLAG);
+               drawline(NBPB_BT, pos    , pos + eY * s_y, NBPB_BRGB, NBPB_BALPH, NBPB_BFLAG);
+               drawline(NBPB_BT, pos + s, pos + eX * s_x, NBPB_BRGB, NBPB_BALPH, NBPB_BFLAG);
+               drawline(NBPB_BT, pos + s, pos + eY * s_y, NBPB_BRGB, NBPB_BALPH, NBPB_BFLAG);
+       }
+
+       pos_x += 12; //horizontal margin to the picture
+       pos_y += 2; //vertical margin to the picture
+
+       if (stat_items & IT_KEY1)
+               drawpic(pos, "gfx/hud/sb_nexball_carrying", '80 34 0', '1 1 1', 1, DRAWFLAG_NORMAL);
+}
+
+// Race/CTS HUD modicon section
+float crecordtime_prev; // last remembered crecordtime
+float crecordtime_change_time; // time when crecordtime last changed
+float srecordtime_prev; // last remembered srecordtime
+float srecordtime_change_time; // time when srecordtime last changed
+void CSQC_race_hud(void)
+{
+       entity me;
+       me = playerslots[player_localentnum - 1];
+       float t, score;
+       float f; // yet another function has this
+       score = me.(scores[ps_primary]);
+
+       if not((scores_flags[ps_primary] & SFL_TIME) && !teamplay) // race/cts record display on HUD
+               return; // no records in the actual race
+
+       drawfont = hud_bigfont;
+       vector pos;
+       pos_x = 2;
+       pos_y = vid_conheight - 48;
+
+       // clientside personal record
+       string rr;
+       if(gametype == GAME_CTS)
+               rr = CTS_RECORD;
+       else
+               rr = RACE_RECORD;
+       t = stof(db_get(ClientProgsDB, strcat(shortmapname, rr, "time")));
+
+       if(score && score < t || !t)
+               db_put(ClientProgsDB, strcat(shortmapname, rr, "time"), ftos(score));
+
+       if(t != crecordtime_prev) {
+               crecordtime_prev = t;
+               crecordtime_change_time = time;
+       }
+       f = time - crecordtime_change_time;
+
+       if (f > 1) {
+               drawstring(pos, "Personal best ", '10 10 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+               drawstring(pos + '0 10 0', TIME_ENCODED_TOSTRING(t),'14 14 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+       } else {
+               drawstring(pos, "Personal best ", '10 10 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+               drawstring(pos + '0 10 0', TIME_ENCODED_TOSTRING(t),'14 14 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+               drawstring_expanding(pos, "Personal best ", '10 10 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL, f);
+               drawstring_expanding(pos + '0 10 0', TIME_ENCODED_TOSTRING(t),'14 14 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL, f);
+       }
+
+       // server record
+       pos_y += 26;
+       t = race_server_record;
+       if(t != srecordtime_prev) {
+               srecordtime_prev = t;
+               srecordtime_change_time = time;
+       }
+       f = time - srecordtime_change_time;
+
+       if (f > 1) {
+               drawstring(pos, "Server best ", '10 10 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+               drawstring(pos + '0 10 0', TIME_ENCODED_TOSTRING(t),'14 14 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+       } else {
+               drawstring(pos, "Server best ", '10 10 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+               drawstring(pos + '0 10 0', TIME_ENCODED_TOSTRING(t),'14 14 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+               drawstring_expanding(pos, "Server best ", '10 10 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL, f);
+               drawstring_expanding(pos + '0 10 0', TIME_ENCODED_TOSTRING(t),'14 14 0', '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL, f);
+       }
+       drawfont = hud_font;
+}
+
+// Timer (#5)
+//
+void HUD_Timer()
+{
+       float marigin;
+
+       vector pos, mySize, color;
+       marigin = HUD_Panel_GetMarigin(5);
+       pos = HUD_Panel_GetPos(5);
+       mySize = HUD_Panel_GetSize(5);
+       color = HUD_Panel_GetColor(5);
+
+       if(HUD_Panel_GetBgActive(5))
+               draw_BorderPicture(pos - '1 1 0' * marigin, "gfx/hud/border", mySize + '1 1 0' * 2 * marigin, color, hud_alpha_bg, '1 1 0' * (marigin/MARIGIN_MULTIPLIER));
+
+       float timelimit, elapsedTime, minutes, seconds, timeleft, minutesLeft, secondsLeft;
+
+       timelimit = getstatf(STAT_TIMELIMIT);
+
+       HUD_DrawRaceStatus(pos + '0 30 0');
+
+       timeleft = max(0, timelimit * 60 + getstatf(STAT_GAMESTARTTIME) - time);
+       timeleft = ceil(timeleft);
+       minutesLeft = floor(timeleft / 60);
+       secondsLeft = timeleft - minutesLeft*60;
+
+       vector timer_color;
+       if(minutesLeft >= 5 || warmup_stage || timelimit == 0) //don't use red or yellow in warmup or when there is no timelimit
+               timer_color = '1 1 1'; //white
+       else if(minutesLeft >= 1)
+               timer_color = '1 1 0'; //yellow
+       else
+               timer_color = '1 0 0'; //red
+
+       if (cvar("hud_timer_increment") || timelimit == 0 || warmup_stage) {
+               if (time < getstatf(STAT_GAMESTARTTIME)) {
+                       //while restart is still active, show 00:00
+                       minutes = seconds = 0;
+               } else {
+                       elapsedTime = floor(time - getstatf(STAT_GAMESTARTTIME)); //127
+                       minutes = floor(elapsedTime / 60);
+                       seconds = elapsedTime - minutes*60;
+               }
+       } else {
+               minutes = minutesLeft;
+               seconds = secondsLeft;
+       }
+
+       if(mySize_x/mySize_y > 5.1)
+       {
+               if(minutes > 999)
+                       seconds = 99;
+               minutes = min(minutes, 999);
+               if(minutesLeft >= 1 || cvar("hud_timer_increment") || timelimit == 0 || warmup_stage) {
+                       if(minutes < 100)
+                               drawpic(pos + eX * mySize_x - eX * 5.1 * mySize_y, "gfx/hud/sb_timer", '1 1 0' * mySize_y, timer_color, hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum(pos + eX * mySize_x - eX * 5.1 * mySize_y, minutes, 3, 0, mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                       drawpic(pos + eX * mySize_x - eX * 2.57 * mySize_y, "gfx/hud/num_colon", '1 1 0' * mySize_y, timer_color, hud_alpha_fg, DRAWFLAG_NORMAL);
+               }
+               HUD_DrawXNum(pos + eX * mySize_x - eX * 2 * mySize_y, seconds, -2, 0, mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+       }
+       else
+       {
+               if(minutes > 99)
+                       seconds = 99;
+               minutes = min(minutes, 99);
+               if(minutesLeft >= 1 || cvar("hud_timer_increment") || timelimit == 0 || warmup_stage) {
+                       if(minutes < 100)
+                               drawpic(pos + eX * 0.5 * mySize_x - eX * 0.5 * 0.5 * mySize_y, "gfx/hud/sb_timer", '0.5 0.5 0' * mySize_y, timer_color, hud_alpha_fg, DRAWFLAG_NORMAL);
+                       HUD_DrawXNum(pos + eX * 0.5 * mySize_x - eX * mySize_y + eY * 0.5 * mySize_y, minutes, -2, 0, 0.5 * mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+                       drawpic(pos + eX * 0.5 * mySize_x - eX * 0.5 * 0.5 * mySize_y + eY * 0.5 * mySize_y, "gfx/hud/num_colon", '0.5 0.5 0' * mySize_y, timer_color, hud_alpha_fg, DRAWFLAG_NORMAL);
+               }
+               HUD_DrawXNum(pos + eX * 0.51 * mySize_x + eY * 0.5 * mySize_y, seconds, -2, 0, 0.5 * mySize_y, timer_color, 0, 0, hud_alpha_fg, DRAWFLAG_NORMAL);
+       }
+}
+
+// Radar (#6)
+//
+
+void HUD_Radar(void)
+{
+       float marigin;
+
+       vector pos, mySize, color;
+       marigin = HUD_Panel_GetMarigin(6);
+       pos = HUD_Panel_GetPos(6);
+       mySize = HUD_Panel_GetSize(6);
+       color = HUD_Panel_GetColor(6);
+
+       if(HUD_Panel_GetBgActive(6))
+               draw_BorderPicture(pos - '1 1 0' * marigin, "gfx/hud/border", mySize + '1 1 0' * 2 * marigin, color, hud_alpha_bg, '1 1 0' * (marigin/MARIGIN_MULTIPLIER));
+
+       local float color1, color2; // color already declared as a global in hud.qc
+       local vector rgb;
+       local entity tm;
+       float scale2d, normalsize, bigsize;
+       float f;
+
+       teamradar_origin2d = pos + 0.5 * mySize; // TODO: stupid compat, should be removed
+       teamradar_size2d = mySize;
+
+       if(minimapname == "" && !ons_showmap)
+               return;
+
+       teamradar_loadcvars();
+
+       switch(cl_teamradar_zoommode)
+       {
+               default:
+               case 0:
+                       f = current_zoomfraction;
+                       break;
+               case 1:
+                       f = 1 - current_zoomfraction;
+                       break;
+               case 2:
+                       f = 0;
+                       break;
+               case 3:
+                       f = 1;
+                       break;
+       }
+
+       switch(cl_teamradar_rotation)
+       {
+               case 0:
+                       teamradar_angle = view_angles_y - 90;
+                       break;
+               default:
+                       teamradar_angle = 90 * cl_teamradar_rotation;
+                       break;
+       }
+
+       scale2d = vlen_maxnorm2d(mi_picmax - mi_picmin);
+       teamradar_size2d = mySize;
+
+       teamradar_extraclip_mins = teamradar_extraclip_maxs = '0 0 0';
+       if(pos == eX * vid_conwidth)
+       {
+               if(cl_teamradar_nohudhack < 2)
+                       pos_y += 25;
+               if(cl_teamradar_nohudhack < 1)
+                       teamradar_extraclip_mins_y -= 25;
+       }
+       else if(pos == eY * vid_conheight || pos == eX * vid_conwidth + eY * vid_conheight)
+       {
+               if(cl_teamradar_nohudhack < 2)
+                       pos_y -= 50;
+               //if(cl_teamradar_nohudhack < 1)
+                       //teamradar_extraclip_size_y += 50; // don't, the HUD looks nice
+       }
+
+       // pixels per world qu to match the teamradar_size2d_x range in the longest dimension
+       if(cl_teamradar_rotation == 0)
+       {
+               // max-min distance must fit the radar in any rotation
+               bigsize = vlen_minnorm2d(teamradar_size2d) * scale2d / (1.05 * vlen2d(mi_max - mi_min));
+       }
+       else
+       {
+               vector c0, c1, c2, c3, span;
+               c0 = rotate(mi_min, teamradar_angle * DEG2RAD);
+               c1 = rotate(mi_max, teamradar_angle * DEG2RAD);
+               c2 = rotate('1 0 0' * mi_min_x + '0 1 0' * mi_max_y, teamradar_angle * DEG2RAD);
+               c3 = rotate('1 0 0' * mi_max_x + '0 1 0' * mi_min_y, teamradar_angle * DEG2RAD);
+               span = '0 0 0';
+               span_x = max4(c0_x, c1_x, c2_x, c3_x) - min4(c0_x, c1_x, c2_x, c3_x);
+               span_y = max4(c0_y, c1_y, c2_y, c3_y) - min4(c0_y, c1_y, c2_y, c3_y);
+
+               // max-min distance must fit the radar in x=x, y=y
+               bigsize = min(
+                       teamradar_size2d_x * scale2d / (1.05 * span_x),
+                       teamradar_size2d_y * scale2d / (1.05 * span_y)
+               );
+       }
+
+       normalsize = vlen_maxnorm2d(teamradar_size2d) * scale2d / cl_teamradar_scale;
+       if(bigsize > normalsize)
+               normalsize = bigsize;
+
+       teamradar_size =
+                 f * bigsize
+               + (1 - f) * normalsize;
+       teamradar_origin3d_in_texcoord = teamradar_3dcoord_to_texcoord(
+                 f * (mi_min + mi_max) * 0.5
+               + (1 - f) * view_origin);
+
+       color1 = GetPlayerColor(player_localentnum-1);
+       rgb = GetTeamRGB(color1);
+
+       drawsetcliparea(
+               pos_x,
+               pos_y,
+               pos_x + mySize_x,
+               pos_y + mySize_y
+       );
+
+       draw_teamradar_background(cl_teamradar_background_alpha, cl_teamradar_foreground_alpha);
+
+       if(ons_showmap)
+       {
+               drawresetcliparea();
+
+               vector frame_origin, frame_size;
+               frame_origin = frame_size = '0 0 0';
+
+               frame_origin_x = pos_x - teamradar_size2d_x * 0.55859375; // matches the picture
+               frame_origin_y = pos_y - teamradar_size2d_y * 0.55859375; // matches the picture
+               frame_size_x = pos_x * 1.1171875; // matches the picture
+               frame_size_y = pos_y * 1.1171875; // matches the picture
+               drawpic(frame_origin, "gfx/ons-frame.tga", frame_size, '1 1 1', hud_alpha_fg, 0);
+               drawpic(frame_origin, "gfx/ons-frame-team.tga", frame_size, rgb, hud_alpha_fg, 0);
+
+               drawsetcliparea(
+                       pos_x - teamradar_size2d_x * 0.5,
+                       pos_y - teamradar_size2d_y * 0.5,
+                       teamradar_size2d_x,
+                       teamradar_size2d_y
+               );
+       }
+
+       for(tm = world; (tm = find(tm, classname, "radarlink")); )
+               draw_teamradar_link(tm.origin, tm.velocity, tm.team);
+       for(tm = world; (tm = findflags(tm, teamradar_icon, 0xFFFFFF)); )
+               draw_teamradar_icon(tm.origin, tm.teamradar_icon, tm, tm.teamradar_color, hud_alpha_fg);
+       for(tm = world; (tm = find(tm, classname, "entcs_receiver")); )
+       {
+               color2 = GetPlayerColor(tm.sv_entnum);
+               //if(color == COLOR_SPECTATOR || color == color2)
+                       draw_teamradar_player(tm.origin, tm.angles, GetTeamRGB(color2));
+       }
+       draw_teamradar_player(view_origin, view_angles, '1 1 1');
+
+       drawresetcliparea();
+};
+
+/*
+==================
+Main HUD system
+==================
+*/
+
+void HUD_DrawPressedKeys(void)
+{
+       float marigin;
+
+       vector pos, mySize, color;
+       marigin = HUD_Panel_GetMarigin(10);
+       pos = HUD_Panel_GetPos(10);
+       mySize = HUD_Panel_GetSize(10);
+       color = HUD_Panel_GetColor(10);
+
+       if(HUD_Panel_GetBgActive(10))
+               draw_BorderPicture(pos - '1 1 0' * marigin, "gfx/hud/border", mySize + '1 1 0' * 2 * marigin, color, hud_alpha_bg, '1 1 0' * (marigin/MARIGIN_MULTIPLIER));
+
+       float pressedkeys;
+
+       pressedkeys = getstatf(STAT_PRESSED_KEYS);
+       drawpic(pos, "gfx/hud/keys/key_bg.tga",           mySize, '1 1 1', 0.1 * hud_alpha_fg, DRAWFLAG_NORMAL);
+       drawpic(pos + eX * mySize_x - eX * 0.22 * mySize_x +       eY * 0.195 * mySize_y, ((pressedkeys & KEY_CROUCH) ? "gfx/hud/keys/key_crouch_inv.tga" : "gfx/hud/keys/key_crouch.tga"),        '1 1 0' * (1/3) * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+       drawpic(pos + eX * 0.5 * mySize_x - eX * 0.23 * mySize_y + eY * 0.040 * mySize_y, ((pressedkeys & KEY_FORWARD) ? "gfx/hud/keys/key_forward_inv.tga" : "gfx/hud/keys/key_forward.tga"),     '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+       drawpic(pos + eX * 0.023 * mySize_x +                      eY * 0.195 * mySize_y, ((pressedkeys & KEY_JUMP) ? "gfx/hud/keys/key_jump_inv.tga" : "gfx/hud/keys/key_jump.tga"),              '1 1 0' * (1/3) * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+       drawpic(pos + eX * 0.1 * mySize_x +                        eY * 0.486 * mySize_y, ((pressedkeys & KEY_LEFT) ? "gfx/hud/keys/key_left_inv.tga" : "gfx/hud/keys/key_left.tga"),              '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+       drawpic(pos + eX * 0.5 * mySize_x - eX * 0.23 * mySize_y + eY * 0.486 * mySize_y, ((pressedkeys & KEY_BACKWARD) ? "gfx/hud/keys/key_backward_inv.tga" : "gfx/hud/keys/key_backward.tga"),  '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+       drawpic(pos + eX * mySize_x - eX * 0.372 * mySize_x +      eY * 0.486 * mySize_y, ((pressedkeys & KEY_RIGHT) ? "gfx/hud/keys/key_right_inv.tga" : "gfx/hud/keys/key_right.tga"),           '1 1 0' * 0.46 * mySize_y, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+}
+
+void HUD_ShowSpeed(void)
+{
+       vector numsize;
+       float pos, conversion_factor;
+       string speed, zspeed, unit;
+
+       switch(cvar("cl_showspeed_unit"))
+       {
+               default:
+               case 0:
+                       unit = "";
+                       conversion_factor = 1.0;
+                       break;
+               case 1:
+                       unit = " qu/s";
+                       conversion_factor = 1.0;
+                       break;
+               case 2:
+                       unit = " m/s";
+                       conversion_factor = 0.0254;
+                       break;
+               case 3:
+                       unit = " km/h";
+                       conversion_factor = 0.0254 * 3.6;
+                       break;
+               case 4:
+                       unit = " mph";
+                       conversion_factor = 0.0254 * 3.6 * 0.6213711922;
+                       break;
+               case 5:
+                       unit = " knots";
+                       conversion_factor = 0.0254 * 1.943844492; // 1 m/s = 1.943844492 knots, because 1 knot = 1.852 km/h
+                       break;
+       }
+
+       speed = strcat(ftos(floor( vlen(pmove_vel - pmove_vel_z * '0 0 1') * conversion_factor + 0.5 )), unit);
+
+       numsize_x = numsize_y = cvar("cl_showspeed_size");
+       pos = (vid_conheight - numsize_y) * cvar("cl_showspeed_position");
+
+       drawfont = hud_bigfont;
+       drawstringcenter(eX + pos * eY, speed, numsize, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+
+       if (cvar("cl_showspeed_z") == 1) {
+               zspeed = strcat(ftos(fabs(floor( pmove_vel_z * conversion_factor + 0.5 ))), unit);
+               drawstringcenter(eX + pos * eY + numsize_y * eY, zspeed, numsize * 0.5, '1 1 1', hud_alpha_fg, DRAWFLAG_NORMAL);
+       }
+
+       drawfont = hud_font;
+}
+
+vector acc_prevspeed;
+float acc_prevtime;
+float acc_avg;
+
+void HUD_ShowAcceleration(void)
+{
+       float acceleration, sz, scale, alpha, f;
+       vector pos, top, rgb;
+       top_x = vid_conwidth/2;
+       top_y = 0;
+
+       f = time - acc_prevtime;
+       if(cvar("cl_showacceleration_z"))
+               acceleration = (vlen(pmove_vel) - vlen(acc_prevspeed)) * (1 / f);
+       else
+               acceleration = (vlen(pmove_vel - '0 0 1' * pmove_vel_z) - vlen(acc_prevspeed - '0 0 1' * acc_prevspeed_z)) * (1 / f);
+       acc_prevspeed = pmove_vel;
+       acc_prevtime = time;
+
+       f = bound(0, f * 10, 1);
+       acc_avg = acc_avg * (1 - f) + acceleration * f;
+       acceleration = acc_avg / getstatf(STAT_MOVEVARS_MAXSPEED);
+
+       pos = top - sz/2 * eY + (cvar("cl_showacceleration_position") * vid_conheight) * eY;
+
+       sz = cvar("cl_showacceleration_size");
+       scale = cvar("cl_showacceleration_scale");
+       alpha = cvar("cl_showacceleration_alpha");
+       if (cvar("cl_showacceleration_color_custom"))
+               rgb = stov(cvar_string("cl_showacceleration_color"));
+       else {
+               rgb = '1 1 1';
+               if (acceleration < 0) {
+                       rgb = '1 .5 .5' - '0 .5 .5' * bound(0, -acceleration * 0.2, 1);
+               } else if (acceleration > 0) {
+                       rgb = '.5 1 .5' - '.5 0 .5' * bound(0, +acceleration * 0.2, 1);
+               }
+       }
+
+       if (acceleration > 0)
+               drawpic(pos, "gfx/hud/statuhud", acceleration * scale * '40 0 0' + sz * eY, rgb, alpha * hud_alpha_fg, DRAWFLAG_NORMAL);
+       else if (acceleration < 0)
+               drawpic(pos + acceleration * scale * '40 0 0', "gfx/hud/statuhud", -acceleration * scale * '40 0 0' + sz * eY, rgb, alpha * hud_alpha_fg, DRAWFLAG_NORMAL);
+}
+
+void HUD_Reset (void)
+{
+       // reset gametype specific icons
+       if(gametype == GAME_KEYHUNT)
+               CSQC_kh_hudreset();
+       else if(gametype == GAME_CTF)
+               CSQC_ctf_hudreset();
+}
+
+void HUD_Main (void)
+{
+       hud_alpha_bg = cvar_or("hud_alpha_bg", 0.8) * (1 - cvar("_menu_alpha"));
+       hud_border_thickness = bound(0, cvar("hud_border_thickness"), 5);
+       hud_accuracy_border_thickness = bound(0, cvar_or("hud_accuracy_border_thickness", 1), 5);
+       hud_color_bg_team = cvar("hud_color_bg_team");
+
+       hud_fontsize = HUD_GetFontsize("hud_fontsize");
+       hud_fontsize_spec = HUD_GetFontsize("hud_fontsize_spec");
+
+       if(HUD_Panel_CheckActive(0))
+               HUD_WeaponIcons();
+       if(HUD_Panel_CheckActive(1))
+               HUD_Inventory();
+       if(HUD_Panel_CheckActive(2))
+               HUD_Powerups();
+       if(HUD_Panel_CheckActive(3))
+               HUD_HealthArmor();
+       if(HUD_Panel_CheckActive(4))
+               HUD_Notify();
+       if(HUD_Panel_CheckActive(5))
+               HUD_Timer();
+       if(HUD_Panel_CheckActive(6))
+               if(ons_showmap || cvar_string("cl_teamradar") != "0" && (cvar("cl_teamradar") == 2 || teamplay))
+                       HUD_Radar();
+       if(HUD_Panel_CheckActive(7))
+               HUD_Score();
+       if(HUD_Panel_CheckActive(8))
+               if(gametype == GAME_RACE || gametype == GAME_CTS || cvar("_hud_configure"))
+                       HUD_RaceTimer();
+       if(HUD_Panel_CheckActive(9))
+               HUD_VoteWindow();
+       if(HUD_Panel_CheckActive(10))
+               if(spectatee_status > 0 || cvar("cl_showpressedkeys") >= 2 || cvar("_hud_configure"))
+                       HUD_DrawPressedKeys();
+
+       // TODO hud_'ify these
+       if (cvar("cl_showspeed"))
+               HUD_ShowSpeed();
+       if (cvar("cl_showacceleration"))
+               HUD_ShowAcceleration();
+
+       // TODO... well make them work in a panel etc
+       if(gametype == GAME_KEYHUNT)
+               CSQC_kh_hud();
+       else if(gametype == GAME_CTF)
+               CSQC_ctf_hud();
+       else if(gametype == GAME_NEXBALL)
+               CSQC_nb_hud();
+       else if(gametype == GAME_CTS || gametype == GAME_RACE)
+               CSQC_race_hud();
+       return;
+}
index b7a3d59b34ad0f70510c37d87bd251d15a874975..d2847af00bd7c323d1e439053a72ca002a95c064 100644 (file)
@@ -163,3 +163,6 @@ float calledhooks;
 #define HOOK_END      2
 
 .float ping, ping_packetloss, ping_movementloss;
+
+float g_balance_grenadelauncher_secondary_bouncefactor;
+float g_balance_grenadelauncher_secondary_bouncestop;
index 15f230d7f0a5fe4d308948ec0c82a06c36c002ef..e039ce46dcda8777ed171f7c5a7df158e1b891b9 100644 (file)
@@ -49,6 +49,7 @@ effects.qc
 wall.qc
 modeleffects.qc
 tuba.qc
+target_music.qc
 
 //vehicles/spiderbot.qc
 Main.qc
index 97debdfacd388320f8ea8e9b325685c17b102a07..b67cc76aadc206c591f8f1f3f249ecc394f9af6b 100644 (file)
@@ -31,8 +31,28 @@ void Projectile_DrawTrail(vector to)
        self.trail_oldorigin = to;
        self.trail_oldtime = time;
 
+       // force the effect even for stationary firemine
+       if(self.cnt == PROJECTILE_FIREMINE)
+               if(from == to)
+                       from_z += 1;
+
        if (self.traileffect)
-               trailparticles(self, self.traileffect, from, to);
+       {
+               if(checkextension("DP_CSQC_BOXPARTICLES"))
+               {
+                       /* looks good, but we can do better with particle count
+                       particles_alphamin = particles_alphamax = self.alpha;
+                       boxparticles(self.traileffect, self, from, to, self.velocity, self.velocity, 1, PARTICLES_USEALPHA);
+                       */
+                       /* looks bad
+                       boxparticles(self.traileffect, self, from, to, self.velocity, self.velocity, self.alpha, 0);
+                       */
+                       particles_alphamin = particles_alphamax = sqrt(self.alpha);
+                       boxparticles(self.traileffect, self, from, to, self.velocity, self.velocity, sqrt(self.alpha), PARTICLES_USEALPHA);
+               }
+               else
+                       trailparticles(self, self.traileffect, from, to);
+       }
 }
 
 void Projectile_Draw()
@@ -97,8 +117,10 @@ void Projectile_Draw()
        makevectors(ang);
 
        a = 1 - (time - self.fade_time) * self.fade_rate;
-       if(a <= 0)
+       self.alpha = bound(0, self.alphamod * a, 1);
+       if(self.alpha <= 0)
                drawn = 0;
+       self.renderflags = 0;
 
        trailorigin = self.origin;
        switch(self.cnt)
@@ -131,9 +153,6 @@ void Projectile_Draw()
                        break;
        }
 
-       self.alpha = self.alphamod * a;
-       self.renderflags = 0;
-
        R_AddEntity(self);
 }
 
@@ -213,13 +232,15 @@ void Ent_Projectile()
                        self.velocity_x = ReadCoord();
                        self.velocity_y = ReadCoord();
                        self.velocity_z = ReadCoord();
-                       self.gravity = ReadCoord();
-
+                       if(f & 0x10)
+                               self.gravity = ReadCoord();
+                       else
+                               self.gravity = 0; // none
                        self.move_origin = self.origin;
                        self.move_velocity = self.velocity;
                }
 
-               if(time == self.spawntime || (self.count & 0x80) || (f & 0x10))
+               if(time == self.spawntime || (self.count & 0x80) || (f & 0x08))
                {
                        self.trail_oldorigin = self.origin;
                        if(!(self.count & 0x80))
@@ -249,14 +270,14 @@ void Ent_Projectile()
                self.traileffect = 0;
                switch(self.cnt)
                {
-                       case PROJECTILE_ELECTRO: setmodel(self, "models/ebomb.mdl");self.traileffect = particleeffectnum("TR_XONOTICPLASMA"); break;
+                       case PROJECTILE_ELECTRO: setmodel(self, "models/ebomb.mdl");self.traileffect = particleeffectnum("TR_NEXUIZPLASMA"); break;
                        case PROJECTILE_ROCKET: setmodel(self, "models/rocket.md3");self.traileffect = particleeffectnum("TR_ROCKET"); self.scale = 2; break;
                        case PROJECTILE_BULLET: setmodel(self, "models/tracer.mdl");self.traileffect = particleeffectnum("tr_bullet"); break;
                        case PROJECTILE_BULLET_GLOWING: setmodel(self, "models/tracer.mdl");self.traileffect = particleeffectnum("tr_bullet"); break;
                        case PROJECTILE_BULLET_GLOWING_TRACER: setmodel(self, "models/tracer.mdl");self.traileffect = particleeffectnum("tr_rifle"); break;
                        case PROJECTILE_CRYLINK: setmodel(self, "models/plasmatrail.mdl");self.traileffect = particleeffectnum("TR_CRYLINKPLASMA"); break;
                        case PROJECTILE_CRYLINK_BOUNCING: setmodel(self, "models/plasmatrail.mdl");self.traileffect = particleeffectnum("TR_CRYLINKPLASMA"); break;
-                       case PROJECTILE_ELECTRO_BEAM: setmodel(self, "models/elaser.mdl");self.traileffect = particleeffectnum("TR_XONOTICPLASMA"); break;
+                       case PROJECTILE_ELECTRO_BEAM: setmodel(self, "models/elaser.mdl");self.traileffect = particleeffectnum("TR_NEXUIZPLASMA"); break;
                        case PROJECTILE_GRENADE: setmodel(self, "models/grenademodel.md3");self.traileffect = particleeffectnum("TR_GRENADE"); break;
                        case PROJECTILE_GRENADE_BOUNCING: setmodel(self, "models/grenademodel.md3");self.traileffect = particleeffectnum("TR_GRENADE"); break;
                        case PROJECTILE_LASER: setmodel(self, "models/laser.mdl");self.traileffect = particleeffectnum(""); break;
@@ -268,6 +289,9 @@ void Ent_Projectile()
                        case PROJECTILE_HAGAR_BOUNCING: setmodel(self, "models/hagarmissile.mdl");self.traileffect = particleeffectnum("TR_GRENADE"); self.scale = 0.4; break;
                        case PROJECTILE_FIREBALL: self.model = ""; self.modelindex = 0; self.traileffect = particleeffectnum("fireball"); break; // particle effect is good enough
                        case PROJECTILE_FIREMINE: self.model = ""; self.modelindex = 0; self.traileffect = particleeffectnum("firemine"); break; // particle effect is good enough
+                       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_ROCKET"); break;
+                       case PROJECTILE_SEEKER: setmodel(self, "models/tagrocket.md3"); self.scale = 2; self.traileffect = particleeffectnum("TR_ROCKET"); break;
                        default:
                                error("Received invalid CSQC projectile, can't work with this!");
                                break;
@@ -304,6 +328,8 @@ void Ent_Projectile()
                                self.maxs = '0 0 -3';
                                self.move_movetype = MOVETYPE_BOUNCE;
                                self.move_touch = SUB_Null;
+                               self.move_bounce_factor = g_balance_grenadelauncher_secondary_bouncefactor;
+                               self.move_bounce_stopspeed = g_balance_grenadelauncher_secondary_bouncestop;
                                break;
                        case PROJECTILE_PORTO_RED:
                                self.colormod = '2 1 1';
@@ -337,6 +363,19 @@ void Ent_Projectile()
                                self.mins = '-4 -4 -4';
                                self.maxs = '4 4 4';
                                break;
+                       case PROJECTILE_TAG:
+                               loopsound(self, CHAN_PROJECTILE, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
+                               self.mins = '-2 -2 -2';
+                               self.maxs = '2 2 2';
+                               break;
+                       case PROJECTILE_FLAC:
+                               self.mins = '-2 -2 -2';
+                               self.maxs = '2 2 2';
+                               break;
+                       case PROJECTILE_SEEKER:
+                               self.mins = '-4 -4 -4';
+                               self.maxs = '4 4 4';
+                               break;
                        default:
                                break;
                }
@@ -374,9 +413,11 @@ void Projectile_Precache()
        precache_model("models/laser.mdl");
        precache_model("models/plasmatrail.mdl");
        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 2b06979413cb6906dd920c8f54ef78bfcaf78c5c..d817590d6941e029b6c506479415dc19d083a74f 100644 (file)
@@ -3395,8 +3395,15 @@ void CSQC_race_hud(void)
                rr = RACE_RECORD;
        t = stof(db_get(ClientProgsDB, strcat(shortmapname, rr, "time")));
 
-       if(score && score < t || !t)
+       if(score && (score < t || !t)) {
                db_put(ClientProgsDB, strcat(shortmapname, rr, "time"), ftos(score));
+               if(cvar("cl_autodemo_delete_keeprecords"))
+               {
+                       f = cvar("cl_autodemo_delete");
+                       f &~= 1;
+                       cvar_set("cl_autodemo_delete", ftos(f)); // don't delete demo with new record!
+               }
+       }
 
        if(t != crecordtime_prev) {
                crecordtime_prev = t;
diff --git a/qcsrc/client/target_music.qc b/qcsrc/client/target_music.qc
new file mode 100644 (file)
index 0000000..a7a46d8
--- /dev/null
@@ -0,0 +1,188 @@
+float music_disabled;
+entity music_default;
+entity music_target;
+entity music_trigger;
+
+.float state;
+.float lastvol;
+
+void TargetMusic_Advance()
+{
+       // run AFTER all the thinks!
+       entity best, e;
+       float vol, vol0;
+       best = music_default;
+       if(music_target && time < music_target.lifetime)
+               best = music_target;
+       if(music_trigger)
+               best = music_trigger;
+       for(e = world; (e = findfloat(e, enttype, ENT_CLIENT_TRIGGER_MUSIC)); ) if(e.noise)
+       {
+               vol0 = e.lastvol;
+               if(getsoundtime(e, CHAN_VOICE) < 0)
+               {
+                       vol0 = -1;
+               }
+               if(e == best)
+               {
+                       // increase volume
+                       if(e.fade_time > 0)
+                               e.state = bound(0, e.state + frametime / e.fade_time, 1);
+                       else
+                               e.state = 1;
+               }
+               else
+               {
+                       // decrease volume
+                       if(e.fade_rate > 0)
+                               e.state = bound(0, e.state - frametime / e.fade_rate, 1);
+                       else
+                               e.state = 0;
+               }
+               vol = e.state * e.volume * cvar("bgmvolume");
+               if(vol != vol0)
+               {
+                       if(vol0 < 0)
+                               sound(e, CHAN_VOICE, e.noise, vol, ATTN_NONE); // restart
+                       else
+                               sound(e, CHAN_VOICE, "", vol, ATTN_NONE);
+                       e.lastvol = vol;
+               }
+       }
+       music_trigger = world;
+}
+
+void Net_TargetMusic()
+{
+       float vol, fai, fao, tim, id;
+       string noi;
+       entity e;
+
+       id = ReadShort();
+       vol = ReadByte() / 255.0;
+       fai = ReadByte() / 16.0;
+       fao = ReadByte() / 16.0;
+       tim = ReadByte();
+       noi = ReadString();
+
+       for(e = world; (e = findfloat(e, enttype, ENT_CLIENT_TRIGGER_MUSIC)); )
+       {
+               if(e.count == id)
+                       break;
+       }
+       if(!e)
+       {
+               e = spawn();
+               e.enttype = ENT_CLIENT_TRIGGER_MUSIC;
+               e.count = id;
+       }
+       if(e.noise != noi)
+       {
+               if(e.noise)
+                       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)
+               {
+                       print("Cannot initialize sound ", e.noise, "\n");
+                       strunzone(e.noise);
+                       e.noise = string_null;
+               }
+       }
+       e.volume = vol;
+       e.fade_time = fai;
+       e.fade_rate = fao;
+       if(vol > 0)
+       {
+               if(tim == 0)
+               {
+                       music_default = e;
+                       if(!music_disabled)
+                       {
+                               e.state = 2;
+                               localcmd("cd stop\n"); // just in case
+                               music_disabled = 1;
+                       }
+               }
+               else
+               {
+                       music_target = e;
+                       e.lifetime = time + tim;
+               }
+       }
+}
+
+void Ent_TriggerMusic_Think()
+{
+       if(WarpZoneLib_BoxTouchesBrush(view_origin, view_origin, self, world))
+       {
+               music_trigger = self;
+       }
+       self.nextthink = time;
+}
+
+void Ent_TriggerMusic_Remove()
+{
+       if(self.noise)
+               strunzone(self.noise);
+       self.noise = string_null;
+}
+
+void Ent_ReadTriggerMusic()
+{
+       float f;
+       string s;
+       f = ReadByte();
+       if(f & 4)
+       {
+               self.origin_x = ReadCoord();
+               self.origin_y = ReadCoord();
+               self.origin_z = ReadCoord();
+       }
+       if(f & 1)
+       {
+               self.modelindex = ReadShort();
+               if(self.modelindex)
+               {
+                       self.mins_x = ReadCoord();
+                       self.mins_y = ReadCoord();
+                       self.mins_z = ReadCoord();
+                       self.maxs_x = ReadCoord();
+                       self.maxs_y = ReadCoord();
+                       self.maxs_z = ReadCoord();
+               }
+               else
+               {
+                       self.mins    = '0 0 0';
+                       self.maxs_x = ReadCoord();
+                       self.maxs_y = ReadCoord();
+                       self.maxs_z = ReadCoord();
+               }
+
+               self.volume = ReadByte() / 255.0;
+               self.fade_time = ReadByte() / 16.0;
+               self.fade_rate = ReadByte() / 16.0;
+               s = self.noise;
+               if(self.noise)
+                       strunzone(self.noise);
+               self.noise = strzone(ReadString());
+               if(self.noise != s)
+               {
+                       precache_sound(self.noise);
+                       sound(self, CHAN_VOICE, self.noise, 0, ATTN_NONE);
+                       if(getsoundtime(self, CHAN_VOICE) < 0)
+                       {
+                               print("Cannot initialize sound ", self.noise, "\n");
+                               strunzone(self.noise);
+                               self.noise = string_null;
+                       }
+               }
+       }
+
+       setorigin(self, self.origin);
+       setsize(self, self.mins, self.maxs);
+       self.cnt = 1;
+       self.think = Ent_TriggerMusic_Think;
+       self.nextthink = time;
+}
index cdd3a3185b9c94ef16b495d6bcbaca7c1f439d7e..2fe55b1688bffd5295e2c9af812e4659f28f8931 100644 (file)
@@ -56,6 +56,7 @@ 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 RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder
 const float RACE_NET_CHECKPOINT_CLEAR = 1;
@@ -98,6 +99,7 @@ const float ENT_CLIENT_MODELEFFECT = 22;
 const float ENT_CLIENT_TUBANOTE = 23;
 const float ENT_CLIENT_WARPZONE = 24;
 const float ENT_CLIENT_WARPZONE_CAMERA = 25;
+const float ENT_CLIENT_TRIGGER_MUSIC = 26;
 
 const float ENT_CLIENT_TURRET = 40;
 
@@ -277,6 +279,12 @@ const float STAT_NB_METERSTART = 45;
 const float STAT_SHOTORG = 46; // compressShotOrigin
 const float STAT_LEADLIMIT = 47;
 const float STAT_BULLETS_LOADED = 48;
+
+// see DP source, quakedef.h
+const float STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW = 222;
+const float STAT_MOVEVARS_AIRSTRAFEACCEL_QW = 223;
+const float STAT_MOVEVARS_AIRACCEL_QW = 254;
+
 const float CTF_STATE_ATTACK = 1;
 const float CTF_STATE_DEFEND = 2;
 const float CTF_STATE_COMMANDER = 3;
@@ -285,6 +293,7 @@ const float STAT_HUD = 50;
 const float HUD_NORMAL = 0;
 const float HUD_SPIDERBOT = 10;
 const float HUD_WAKIZASHI = 11;
+const float HUD_RAPTOR    = 12;
 
 const float STAT_VEHICLESTAT_HEALTH  = 60;
 const float STAT_VEHICLESTAT_SHIELD  = 61;
@@ -367,7 +376,7 @@ float       CHAN_VOICE                              = 2; // Voice/Radio
        // on world: UNUSED
        // on players: voice                             VOICE
        // on entities: ambient                          AMBIENT
-       // on csqc: UNUSED
+       // on csqc: background music                     BGM
 float  CHAN_TRIGGER                    = 3; // Triggers/Items
        // on world: UNUSED
        // on players: item pickup                       ITEMS
@@ -407,6 +416,7 @@ float       ATTN_MAX                                = 3.984375;
 // this sets sounds and other properties of the projectiles in csqc
 float PROJECTILE_ELECTRO = 1;
 float PROJECTILE_ROCKET = 2;
+float PROJECTILE_TAG = 3;
 float PROJECTILE_BULLET = 4;
 float PROJECTILE_CRYLINK = 5;
 float PROJECTILE_ELECTRO_BEAM = 6;
@@ -414,6 +424,8 @@ float PROJECTILE_GRENADE = 7;
 float PROJECTILE_GRENADE_BOUNCING = 8;
 float PROJECTILE_LASER = 9;
 float PROJECTILE_HLAC = 10;
+float PROJECTILE_SEEKER = 11;
+float PROJECTILE_FLAC = 12;
 float PROJECTILE_PORTO_RED = 13;
 float PROJECTILE_PORTO_BLUE = 14;
 float PROJECTILE_HOOKBOMB = 15;
index ae07214e73b196bfd46a3e1fe4d680507a4b49a3..53a07186b6a126461fa1af1a05f2445e7ee33539 100644 (file)
@@ -324,6 +324,8 @@ float _MapInfo_Generate(string pFilename) // 0: failure, 1: ok ent, 2: ok bsp
                                        { }
                                else if(startsWith(v, "weapon_"))
                                        MapInfo_Map_supportedFeatures |= MAPINFO_FEATURE_WEAPONS;
+                               else if(v == "target_music" || v == "trigger_music")
+                                       _MapInfo_Map_worldspawn_music = string_null; // don't use regular BGM
                        }
                }
        }
@@ -630,7 +632,7 @@ float MapInfo_Get_ByName(string pFilename, float pAllowGenerate, float pGametype
                        else
                                fputs(fh, strcat("cdtrack ", _MapInfo_Map_worldspawn_music, "\n"));
                }
-               else
+               else if(_MapInfo_Map_worldspawn_music)
                {
                        n = tokenize_console(cvar_string("g_cdtracks_remaplist"));
                        s = strcat(" ", cvar_string("g_cdtracks_dontusebydefault"), " ");
@@ -894,7 +896,7 @@ float MapInfo_CurrentFeatures()
 {
        float req;
        req = 0;
-       if(!(cvar("g_lms") || cvar("g_minstagib") || cvar("g_nixnex") || cvar("g_weaponarena") || !cvar("g_pickup_items") || cvar("g_race") || cvar("g_cts") || cvar("g_nexball")))
+       if(!(cvar("g_lms") || cvar("g_minstagib") || cvar("g_nix") || cvar("g_weaponarena") || !cvar("g_pickup_items") || cvar("g_race") || cvar("g_cts") || cvar("g_nexball")))
                req |= MAPINFO_FEATURE_WEAPONS;
        return req;
 }
index 2407b173db677c9bde308f52d82c2547ef8fb371..9875529d3fe68c92084d6595e306dfe65f91ae06 100644 (file)
@@ -1863,5 +1863,88 @@ float startsWithNocase(string haystack, string needle)
        return strcasecmp(substring(haystack, 0, strlen(needle)), needle) == 0;
 }
 
-#ifndef MENUQC
-#endif
+string get_model_datafilename(string m, float sk, string fil)
+{
+       if(m)
+               m = strcat(m, "_");
+       else
+               m = "models/player/*_";
+       if(sk >= 0)
+               m = strcat(m, ftos(sk));
+       else
+               m = strcat(m, "*");
+       return strcat(m, ".", fil);
+}
+
+float get_model_parameters(string m, float sk)
+{
+       string fn, s, c;
+       float fh;
+
+       get_model_parameters_modelname = string_null;
+       get_model_parameters_modelskin = -1;
+       get_model_parameters_name = string_null;
+       get_model_parameters_species = -1;
+       get_model_parameters_sex = string_null;
+       get_model_parameters_weight = -1;
+       get_model_parameters_age = -1;
+       get_model_parameters_desc = string_null;
+
+       if not(m)
+               return 1;
+       if(sk < 0)
+       {
+               if(substring(m, -4, -1) != ".txt")
+                       return 0;
+               if(substring(m, -6, 1) != "_")
+                       return 0;
+               sk = stof(substring(m, -5, 1));
+               m = substring(m, 0, -7);
+       }
+
+       fn = get_model_datafilename(m, sk, "txt");
+       fh = fopen(fn, FILE_READ);
+       if(fh < 0)
+               return 0;
+
+       get_model_parameters_modelname = m;
+       get_model_parameters_modelskin = sk;
+       while((s = fgets(fh)))
+       {
+               if(s == "")
+                       break; // next lines will be description
+               c = car(s);
+               s = cdr(s);
+               if(c == "name")
+                       get_model_parameters_name = s;
+               if(c == "species")
+                       switch(s)
+                       {
+                               case "human":       get_model_parameters_species = SPECIES_HUMAN;       break;
+                               case "alien":       get_model_parameters_species = SPECIES_ALIEN;       break;
+                               case "robot_shiny": get_model_parameters_species = SPECIES_ROBOT_SHINY; break;
+                               case "robot_rusty": get_model_parameters_species = SPECIES_ROBOT_RUSTY; break;
+                               case "robot_solid": get_model_parameters_species = SPECIES_ROBOT_SOLID; break;
+                               case "animal":      get_model_parameters_species = SPECIES_ANIMAL;      break;
+                               case "reserved":    get_model_parameters_species = SPECIES_RESERVED;    break;
+                       }
+               if(c == "sex")
+                       get_model_parameters_sex = s;
+               if(c == "weight")
+                       get_model_parameters_weight = stof(s);
+               if(c == "age")
+                       get_model_parameters_age = stof(s);
+       }
+
+       while((s = fgets(fh)))
+       {
+               if(get_model_parameters_desc)
+                       get_model_parameters_desc = strcat(get_model_parameters_desc, "\n");
+               if(s != "")
+                       get_model_parameters_desc = strcat(get_model_parameters_desc, s);
+       }
+
+       fclose(fh);
+
+       return 1;
+}
index f78a42258a075155664e050c4758ce6a7c1e292b..23126b6331df1557b15461dab2ab36947caeeb1c 100644 (file)
@@ -199,3 +199,14 @@ string cdr(string s); // returns all but first word
 float matchacl(string acl, string str); // matches str against ACL acl (with entries +foo*, +foo, +*foo, +*foo*, and same with - for forbidding)
 float startsWith(string haystack, string needle);
 float startsWithNocase(string haystack, string needle);
+
+string get_model_datafilename(string mod, float skn, string fil); // skin -1 will return wildcard, mod string_null will also put wildcard there
+string get_model_parameters_modelname;
+float get_model_parameters_modelskin;
+string get_model_parameters_name;
+float get_model_parameters_species;
+string get_model_parameters_sex;
+float get_model_parameters_weight;
+float get_model_parameters_age;
+string get_model_parameters_desc;
+float get_model_parameters(string mod, float skn); // call with string_null to clear; skin -1 means mod is the filename of the txt file and is to be split
index 4aacb27244d5541609769faf0f029c9338cd75a9..d6fb114c2c4a9c113ccaaa5cd7732a093679c03c 100644 (file)
@@ -27,11 +27,11 @@ void setterDummy(entity, float);
 #endif
 
 #ifdef IMPLEMENTATION
-void configureAnimationAnimation(entity me, entity obj, void(entity, float) setter, float startTime, float duration, float startValue, float end)
+void configureAnimationAnimation(entity me, entity obj, void(entity, float) objSetter, float animStartTime, float animDuration, float animStartValue, float animEndValue)
 {
-       me.setObjectSetter(me, obj, setter);
-       me.setTimeStartDuration(me, startTime, duration);
-       me.setValueStartEnd(me, startValue, end);
+       me.setObjectSetter(me, obj, objSetter);
+       me.setTimeStartDuration(me, animStartTime, animDuration);
+       me.setValueStartEnd(me, animStartValue, animEndValue);
 }
 
 void setTimeStartEndAnimation(entity me, float s, float e)
@@ -64,22 +64,22 @@ void setObjectSetterAnimation(entity me, entity o, void(entity, float) s)
        me.setter = s;
 }
 
-void tickAnimation(entity me, float time)
+void tickAnimation(entity me, float tickTime)
 {
-       if (me.isStopped(me) || me.isFinished(me) || (time < me.startTime))
+       if (me.isStopped(me) || me.isFinished(me) || (tickTime < me.startTime))
                return;
 
-       if (time >= (me.startTime + me.duration))
+       if (tickTime >= (me.startTime + me.duration))
                me.finishAnim(me);
        else
-               me.value = me.calcValue(me, (time - me.startTime), me.duration, me.startValue, me.delta);
+               me.value = me.calcValue(me, (tickTime - me.startTime), me.duration, me.startValue, me.delta);
 
        me.setter(me.object, me.value);
 }
 
-float calcValueAnimation(entity me, float time, float duration, float startValue, float delta)
+float calcValueAnimation(entity me, float tickTime, float animDuration, float animStartValue, float animDelta)
 {
-       return startValue;
+       return animStartValue;
 }
 
 float isStoppedAnimation(entity me)
@@ -106,9 +106,10 @@ void finishAnimAnimation(entity me)
 {
        me.value = me.delta + me.startValue;
        me.finished = TRUE;
+       me.setter(me.object, me.value);
 }
 
-void setterDummy(entity object, float value)
+void setterDummy(entity obj, float objValue)
 {
 }
 
index 1052e2a1bcb99e6b91306fcbc2bbe4833fa1a806..41a26d5e0dace443b32be76b912810c04d4e9a38 100644 (file)
@@ -2,8 +2,14 @@
 CLASS(AnimHost) EXTENDS(Object)
        METHOD(AnimHost, addAnim, void(entity, entity))
        METHOD(AnimHost, removeAnim, void(entity, entity))
+       METHOD(AnimHost, removeAllAnim, void(entity))
+       METHOD(AnimHost, removeObjAnim, void(entity, entity))
        METHOD(AnimHost, stopAllAnim, void(entity))
+       METHOD(AnimHost, stopObjAnim, void(entity, entity))
+       METHOD(AnimHost, resumeAllAnim, void(entity))
+       METHOD(AnimHost, resumeObjAnim, void(entity, entity))
        METHOD(AnimHost, finishAllAnim, void(entity))
+       METHOD(AnimHost, finishObjAnim, void(entity, entity))
        METHOD(AnimHost, tickAll, void(entity))
        ATTRIB(AnimHost, firstChild, entity, NULL)
        ATTRIB(AnimHost, lastChild, entity, NULL)
@@ -61,6 +67,31 @@ void removeAnimAnimHost(entity me, entity other)
                me.lastChild = p;
 }
 
+void removeAllAnimAnimHost(entity me)
+{
+       entity e, tmp;
+       for(e = me.firstChild; e; e = e.nextSibling)
+       {
+               tmp = e;
+               e = tmp.prevSibling;
+               me.removeAnim(me, tmp);
+       }
+}
+
+void removeObjAnimAnimHost(entity me, entity obj)
+{
+       entity e, tmp;
+       for(e = me.firstChild; e; e = e.nextSibling)
+       {
+               if (e.object == obj)
+               {
+                       tmp = e;
+                       e = tmp.prevSibling;
+                       me.removeAnim(me, tmp);
+               }
+       }
+}
+
 void stopAllAnimAnimHost(entity me)
 {
        entity e;
@@ -70,6 +101,39 @@ void stopAllAnimAnimHost(entity me)
        }
 }
 
+void stopObjAnimAnimHost(entity me, entity obj)
+{
+       entity e;
+       for(e = me.firstChild; e; e = e.nextSibling)
+       {
+               if (e.object == obj)
+               {
+                       e.stopAnim(e);
+               }
+       }
+}
+
+void resumeAllAnimAnimHost(entity me)
+{
+       entity e;
+       for(e = me.firstChild; e; e = e.nextSibling)
+       {
+               e.resumeAnim(e);
+       }
+}
+
+void resumeObjAnimAnimHost(entity me, entity obj)
+{
+       entity e;
+       for(e = me.firstChild; e; e = e.nextSibling)
+       {
+               if (e.object == obj)
+               {
+                       e.resumeAnim(e);
+               }
+       }
+}
+
 void finishAllAnimAnimHost(entity me)
 {
        entity e, tmp;
@@ -78,7 +142,22 @@ void finishAllAnimAnimHost(entity me)
                tmp = e;
                e = tmp.prevSibling;
                me.removeAnim(me, tmp);
-               e.finishAnim(tmp);
+               tmp.finishAnim(tmp);
+       }
+}
+
+void finishObjAnimAnimHost(entity me, entity obj)
+{
+       entity e, tmp;
+       for(e = me.firstChild; e; e = e.nextSibling)
+       {
+               if (e.object == obj)
+               {
+                       tmp = e;
+                       e = tmp.prevSibling;
+                       me.removeAnim(me, tmp);
+                       tmp.finishAnim(tmp);
+               }
        }
 }
 
index 2c82f81e78675df5eabfdf70060b7149e14aa72e..f14a4be0a602625b3d1dae98e3579f5bc553cc1f 100644 (file)
@@ -13,26 +13,26 @@ float easingQuadInOut(float, float, float, float);
 #endif
 
 #ifdef IMPLEMENTATION
-entity makeHostedEasing(entity obj, void(entity, float) setter, float(float, float, float, float) func, float duration, float startValue, float end)
+entity makeHostedEasing(entity obj, void(entity, float) objSetter, float(float, float, float, float) func, float animDuration, float animStartValue, float animEnd)
 {
        entity me;
-       me = makeEasing(obj, setter, func, time, duration, startValue, end);
+       me = makeEasing(obj, objSetter, func, time, animDuration, animStartValue, animEnd);
        anim.addAnim(anim, me);
        return me;
 }
 
-entity makeEasing(entity obj, void(entity, float) setter, float(float, float, float, float) func, float startTime, float duration, float startValue, float end)
+entity makeEasing(entity obj, void(entity, float) objSetter, float(float, float, float, float) func, float animStartTime, float animDuration, float animStartValue, float animEnd)
 {
        entity me;
        me = spawnEasing();
-       me.configureAnimation(me, obj, setter, startTime, duration, startValue, end);
+       me.configureAnimation(me, obj, objSetter, animStartTime, animDuration, animStartValue, animEnd);
        me.setMath(me, func);
        return me;
 }
 
-float calcValueEasing(entity me, float time, float duration, float start, float delta)
+float calcValueEasing(entity me, float tickTime, float animDuration, float animStart, float animDelta)
 {
-       return me.math(time, duration, start, delta);
+       return me.math(tickTime, animDuration, animStart, animDelta);
 }
 
 void setMathEasing(entity me, float(float, float, float, float) func)
@@ -40,32 +40,32 @@ void setMathEasing(entity me, float(float, float, float, float) func)
        me.math = func;
 }
 
-float easingLinear(float time, float duration, float start, float delta)
+float easingLinear(float tickTime, float animDuration, float animStart, float animDelta)
 {
-       return (delta * (time / duration)) + start;
+       return (animDelta * (tickTime / animDuration)) + animStart;
 }
 
-float easingQuadIn(float time, float duration, float start, float delta)
+float easingQuadIn(float tickTime, float animDuration, float animStart, float animDelta)
 {
-       float frac = time / duration;
-       return (delta * frac * frac) + start;
+       float frac = tickTime / animDuration;
+       return (animDelta * frac * frac) + animStart;
 }
 
-float easingQuadOut(float time, float duration, float start, float delta)
+float easingQuadOut(float tickTime, float animDuration, float animStart, float animDelta)
 {
-       float frac = time / duration;
-       return (-delta * frac * (frac - 2)) + start;
+       float frac = tickTime / animDuration;
+       return (-animDelta * frac * (frac - 2)) + animStart;
 }
 
-float easingQuadInOut(float time, float duration, float start, float delta)
+float easingQuadInOut(float tickTime, float animDuration, float animStart, float animDelta)
 {
-       if (time < (duration / 2))
+       if (tickTime < (animDuration / 2))
        {
-               return easingQuadIn(time, (duration / 2), start, (delta / 2));
+               return easingQuadIn(tickTime, (animDuration / 2), animStart, (animDelta / 2));
        }
        else
        {
-               return easingQuadOut((time - (duration / 2)), (duration / 2), (start + (delta / 2)), (delta / 2));
+               return easingQuadOut((tickTime - (animDuration / 2)), (animDuration / 2), (animStart + (animDelta / 2)), (animDelta / 2));
        }
 }
 
index 39e1fd8b423f9c0ba15a53a47b0199724af885d8..95fbf63ccefe5b15d5acc6a019db25a868d2fedf 100644 (file)
@@ -1,5 +1,6 @@
 #ifdef INTERFACE
 CLASS(Keyframe) EXTENDS(Animation)
+       METHOD(Keyframe, addEasing, entity(entity, float, float, float(float, float, float, float)))
        METHOD(Keyframe, addAnim, void(entity, entity))
        METHOD(Keyframe, calcValue, float(entity, float, float, float, float))
        ATTRIB(Keyframe, currentChild, entity, NULL)
@@ -8,25 +9,62 @@ CLASS(Keyframe) EXTENDS(Animation)
 ENDCLASS(Animation)
 entity makeHostedKeyframe(entity, void(entity, float), float, float, float);
 entity makeKeyframe(entity, void(entity, float), float, float, float);
+float getNewChildStart(entity);
+float getNewChildDuration(entity, float);
+float getNewChildValue(entity);
 #endif
 
 #ifdef IMPLEMENTATION
-entity makeHostedKeyframe(entity obj, void(entity, float) setter, float duration, float start, float end)
+entity makeHostedKeyframe(entity obj, void(entity, float) objSetter, float animDuration, float animStart, float animEnd)
 {
        entity me;
-       me = makeKeyframe(obj, setter, duration, start, end);
+       me = makeKeyframe(obj, objSetter, animDuration, animStart, animEnd);
        anim.addAnim(anim, me);
        return me;
 }
 
-entity makeKeyframe(entity obj, void(entity, float) setter, float duration, float start, float end)
+entity makeKeyframe(entity obj, void(entity, float) objSetter, float animDuration, float animStart, float animEnd)
 {
        entity me;
        me = spawnKeyframe();
-       me.configureAnimation(me, obj, setter, time, duration, start, end);
+       me.configureAnimation(me, obj, objSetter, time, animDuration, animStart, animEnd);
        return me;
 }
 
+entity addEasingKeyframe(entity me, float animDurationTime, float animEnd, float(float, float, float, float) func)
+{
+       entity other;
+       other = makeEasing(me.object, me.setter, func, getNewChildStart(me), getNewChildDuration(me, animDurationTime), getNewChildValue(me), animEnd);
+       me.addAnim(me, other);
+       return other;
+}
+
+float getNewChildStart(entity me)
+{
+       if (me.lastChild)
+               return (me.lastChild.startTime + me.lastChild.duration);
+       else
+               return 0;
+}
+
+float getNewChildDuration(entity me, float durationTime)
+{
+       float dura, maxDura;
+       maxDura = me.duration;
+       if (me.lastChild) maxDura = maxDura - (me.lastChild.startTime + me.lastChild.duration);
+       dura = durationTime;
+       if (0 >= dura || dura > maxDura) dura = maxDura;
+       return dura;
+}
+
+float getNewChildValue(entity me)
+{
+       if (me.lastChild)
+               return (me.lastChild.startValue + me.lastChild.delta);
+       else
+               return me.startValue;
+}
+
 void addAnimKeyframe(entity me, entity other)
 {
        if(other.parent)
@@ -54,7 +92,7 @@ void addAnimKeyframe(entity me, entity other)
        me.lastChild = other;
 }
 
-float calcValueKeyframe(entity me, float time, float duration, float startValue, float delta)
+float calcValueKeyframe(entity me, float tickTime, float animDuration, float animStartValue, float animDelta)
 {
        if (me.currentChild)
                if (me.currentChild.isFinished(me.currentChild))
@@ -62,10 +100,10 @@ float calcValueKeyframe(entity me, float time, float duration, float startValue,
 
        if (me.currentChild)
        {
-               me.currentChild.tick(me.currentChild, time);
+               me.currentChild.tick(me.currentChild, tickTime);
                return me.currentChild.value;
        }
 
-       return startValue + delta;
+       return animStartValue + animDelta;
 }
 #endif
index 4e252d8d2226e14ee02eb470ea693715d5bdbe45..c60ec232f2c7b2f2e4e5539f02bb69a034711464 100644 (file)
@@ -4,6 +4,7 @@ CLASS(Image) EXTENDS(Item)
        METHOD(Image, draw, void(entity))
        METHOD(Image, toString, string(entity))
        METHOD(Image, resizeNotify, void(entity, vector, vector, vector, vector))
+       METHOD(Image, updateAspect, void(entity))
        ATTRIB(Image, src, string, string_null)
        ATTRIB(Image, color, vector, '1 1 1')
        ATTRIB(Image, forcedAspect, float, 0)
@@ -25,9 +26,11 @@ void drawImage(entity me)
 {
        draw_Picture(me.imgOrigin, me.src, me.imgSize, me.color, 1);
 }
-void resizeNotifyImage(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
+void updateAspectImage(entity me)
 {
-       resizeNotifyItem(me, relOrigin, relSize, absOrigin, absSize);
+       float asp;
+       if(me.size_x <= 0 || me.size_y <= 0)
+               return;
        if(me.forcedAspect == 0)
        {
                me.imgOrigin = '0 0 0';
@@ -35,17 +38,30 @@ void resizeNotifyImage(entity me, vector relOrigin, vector relSize, vector absOr
        }
        else
        {
-               if(absSize_x > me.forcedAspect * absSize_y)
+               if(me.forcedAspect < 0)
+               {
+                       vector sz;
+                       sz = draw_PictureSize(me.src);
+                       asp = sz_x / sz_y;
+               }
+               else
+                       asp = me.forcedAspect;
+               if(me.size_x > asp * me.size_y)
                {
                        // x too large, so center x-wise
-                       me.imgSize = eY + eX * (absSize_y * me.forcedAspect / absSize_x);
+                       me.imgSize = eY + eX * (me.size_y * asp / me.size_x);
                }
                else
                {
                        // y too large, so center y-wise
-                       me.imgSize = eX + eY * (absSize_x / (me.forcedAspect * absSize_y));
+                       me.imgSize = eX + eY * (me.size_x / (asp * me.size_y));
                }
                me.imgOrigin = '0.5 0.5 0' - 0.5 * me.imgSize;
        }
 }
+void resizeNotifyImage(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
+{
+       resizeNotifyItem(me, relOrigin, relSize, absOrigin, absSize);
+       me.updateAspect(me);
+}
 #endif
index a0493482081d3d03e4775fa9a2a988bd2499a979..d85b1d5285084566dae9598a08565312cd45bfd0 100644 (file)
@@ -106,9 +106,9 @@ float mouseDragListBox(entity me, vector pos)
                if(hit)
                {
                        // calculate new pos to v
-                       float delta;
-                       delta = (pos_y - me.pressOffset) / (1 - (me.controlBottom - me.controlTop)) * (me.nItems * me.itemHeight - 1);
-                       me.scrollPos = me.previousValue + delta;
+                       float d;
+                       d = (pos_y - me.pressOffset) / (1 - (me.controlBottom - me.controlTop)) * (me.nItems * me.itemHeight - 1);
+                       me.scrollPos = me.previousValue + d;
                }
                else
                        me.scrollPos = me.previousValue;
index f71bb32da9703c561d0a8d72caec4bfe9551b606..eeac0edd844ba43d3e1e25ae197cd2188eda9bd6 100644 (file)
@@ -13,10 +13,13 @@ CLASS(Slider) EXTENDS(Label)
        METHOD(Slider, valueToText, string(entity, float))
        METHOD(Slider, toString, string(entity))
        METHOD(Slider, setValue, void(entity, float))
+       METHOD(Slider, setSliderValue, void(entity, float))
        METHOD(Slider, showNotify, void(entity))
        ATTRIB(Slider, src, string, string_null)
        ATTRIB(Slider, focusable, float, 1)
        ATTRIB(Slider, value, float, 0)
+       ATTRIB(Slider, animated, float, 1)
+       ATTRIB(Slider, sliderValue, float, 0)
        ATTRIB(Slider, valueMin, float, 0)
        ATTRIB(Slider, valueMax, float, 0)
        ATTRIB(Slider, valueStep, float, 0)
@@ -43,8 +46,19 @@ ENDCLASS(Slider)
 #ifdef IMPLEMENTATION
 void setValueSlider(entity me, float val)
 {
+       if (me.animated) {
+               anim.stopObjAnim(anim, me);
+               anim.removeObjAnim(anim, me);
+               makeHostedEasing(me, setSliderValueSlider, easingQuadInOut, 1, me.sliderValue, val);
+       } else {
+               me.setSliderValue(me, val);
+       }
        me.value = val;
 }
+void setSliderValueSlider(entity me, float val)
+{
+       me.sliderValue = val;
+}
 string toStringSlider(entity me)
 {
        return strcat(ftos(me.value), " (", me.valueToText(me, me.value), ")");
@@ -70,6 +84,7 @@ void configureSliderVisualsSlider(entity me, float sz, float theAlign, float the
 void configureSliderValuesSlider(entity me, float theValueMin, float theValue, float theValueMax, float theValueStep, float theValueKeyStep, float theValuePageStep)
 {
        me.value = theValue;
+       me.sliderValue = theValue;
        me.valueStep = theValueStep;
        me.valueMin = theValueMin;
        me.valueMax = theValueMax;
@@ -137,9 +152,14 @@ float keyDownSlider(entity me, float key, float ascii, float shift)
 float mouseDragSlider(entity me, vector pos)
 {
        float hit;
-       float v;
+       float v, animed;
        if(me.disabled)
                return 0;
+
+       anim.finishObjAnim(anim, me);
+       animed = me.animated;
+       me.animated = false;
+
        if(me.pressed)
        {
                hit = 1;
@@ -157,6 +177,9 @@ float mouseDragSlider(entity me, vector pos)
                else
                        me.setValue(me, me.previousValue);
        }
+
+       me.animated = animed;
+
        return 1;
 }
 float mousePressSlider(entity me, vector pos)
@@ -236,9 +259,9 @@ void drawSlider(entity me)
        if(me.disabled)
                draw_alpha *= me.disabledAlpha;
        draw_ButtonPicture('0 0 0', strcat(me.src, "_s"), eX * (1 - me.textSpace) + eY, me.color2, 1);
-       if(almost_in_bounds(me.valueMin, me.value, me.valueMax))
+       if(almost_in_bounds(me.valueMin, me.sliderValue, me.valueMax))
        {
-               controlLeft = (me.value - me.valueMin) / (me.valueMax - me.valueMin) * (1 - me.textSpace - me.controlWidth);
+               controlLeft = (me.sliderValue - me.valueMin) / (me.valueMax - me.valueMin) * (1 - me.textSpace - me.controlWidth);
                if(me.disabled)
                        draw_Picture(eX * controlLeft, strcat(me.src, "_d"), eX * me.controlWidth + eY, me.colorD, 1);
                else if(me.pressed)
@@ -253,4 +276,4 @@ void drawSlider(entity me)
        drawLabel(me);
        me.text = string_null; // TEMPSTRING!
 }
-#endif
\ No newline at end of file
+#endif
index 628c8a579b86d6a48d2c34a0e60d38b0872f071a..b6a345481171b949904913e5010a6c57ac24bc08 100644 (file)
@@ -37,10 +37,10 @@ void setValueFromIdentifierTextSlider(entity me, string id)
        for(i = 0; i < me.nValues; ++i)
                if(me.valueToIdentifier(me, i) == id)
                {
-                       me.value = i;
+                       setValueSlider( me, i );
                        return;
                }
-       me.value = -1;
+       setValueSlider( me, -1 );
 }
 string getIdentifierTextSlider(entity me)
 {
index 232dee83db55018bd32438e3eb9b8ef0c940ddb5..6d9d3345c30e0430ba892190176c3be584cd94b2 100644 (file)
@@ -348,3 +348,5 @@ string(float, float) getgamedirinfo = #626;
 #define GETGAMEDIRINFO_NAME 0
 #define GETGAMEDIRINFO_DESCRIPTION 1
 float log(float f) = #532;
+
+string(string format, ...) sprintf = #627;
index 462337c05126cab5acbfe786cc1b0c23034df70c..b8fee02a13263a8b9e24a7b43359c150bc1f9dad 100644 (file)
@@ -24,6 +24,10 @@ void() m_init =
 
        check_unacceptable_compiler_bugs();
 
+#ifdef WATERMARK
+       print("^4MQC Build information: ", WATERMARK(), "\n");
+#endif
+
        // list all game dirs (TEST)
        if(cvar("developer"))
        {
index 1a411d0fdaf4fc8d329106a9feb0956b3a5c811f..12d7e4fccb980ce15b539d6a80ae9662faa55bb1 100644 (file)
@@ -64,10 +64,12 @@ string toStringXonoticMutatorsDialog(entity me)
 {
        string s;
        s = "";
+       if(cvar("g_dodging"))
+               s = strcat(s, ", Dodging");
        if(cvar("g_minstagib"))
                s = strcat(s, ", MinstaGib");
-       if(cvar("g_nixnex"))
-               s = strcat(s, ", NixNex");
+       if(cvar("g_nix"))
+               s = strcat(s, ", NIX");
        if(cvar_string("g_weaponarena") != "0")
                s = strcat(s, ", ", WeaponArenaString());
        if(cvar("g_start_weapon_laser") == 0)
@@ -162,6 +164,9 @@ void fillXonoticMutatorsDialog(entity me)
        string str, hstr;
        me.TR(me);
                me.TD(me, 1, 2, makeXonoticTextLabel(0, "Gameplay mutators:"));
+       me.TR(me);
+               me.TDempty(me, 0.2);
+               me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_dodging", "Dodging"));
        me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "g_cloaked", "Cloaked"));
@@ -250,11 +255,11 @@ void fillXonoticMutatorsDialog(entity me)
                me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "g_minstagib", string_null, "MinstaGib"));
        me.TR(me);
                me.TDempty(me, 0.2);
-               me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "g_nixnex", string_null, "NixNex"));
+               me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "g_nix", string_null, "NIX"));
        me.TR(me);
                me.TDempty(me, 0.4);
-               me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "g_nixnex_with_laser", "with laser"));
-                       setDependent(e, "g_nixnex", 1, 1);
+               me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "g_nix_with_laser", "with laser"));
+                       setDependent(e, "g_nix", 1, 1);
        me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 2, e = makeXonoticRadioButton(1, "g_weaponarena", "most", "Most weapons"));
index 0bd6e18f903c395d9be3ea8dc9b6c4580473881e..f3d3fbf758dd40dc3a7468c37a13fa1a1894da6a 100644 (file)
@@ -173,6 +173,6 @@ void fillXonoticPlayerSettingsTab(entity me)
        me.TR(me);
 
        me.gotoRC(me, me.rows - 1, 0);
-               me.TD(me, 1, me.columns, makeXonoticCommandButton("Apply immediately", '0 0 0', "color -1 -1;name \"$_cl_name\";cl_cmd sendcvar cl_weaponpriority;sendcvar cl_zoomfactor;sendcvar cl_zoomspeed;sendcvar cl_autoswitch;sendcvar cl_shownames;sendcvar cl_forceplayermodelsfromxonotic;sendcvar cl_forceplayermodels", COMMANDBUTTON_APPLY));
+               me.TD(me, 1, me.columns, makeXonoticCommandButton("Apply immediately", '0 0 0', "color -1 -1;name \"$_cl_name\";cl_cmd sendcvar cl_weaponpriority;sendcvar cl_zoomfactor;sendcvar cl_zoomspeed;sendcvar cl_autoswitch;sendcvar cl_shownames;sendcvar cl_forceplayermodelsfromxonotic;sendcvar cl_forceplayermodels;playermodel $_cl_playermodel;playerskin $_cl_playerskin", COMMANDBUTTON_APPLY));
 }
 #endif
index 1c589eccd175a59b6a87c57037c7b832f046b3c1..7c3c754d4cce746dbb49ad9acf44c44ec8814fa4 100644 (file)
@@ -23,13 +23,14 @@ void fillXonoticAudioSettingsTab(entity me)
        entity e, s, sl;
 
        me.TR(me);
-               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "bgmvolume");
-               me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Music:"));
+               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "mastervolume");
+               me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Master:"));
                me.TD(me, 1, 2, s);
        me.TR(me);
-       me.TR(me);
-               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "volume");
-               me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Master:"));
+               me.TDempty(me, 0.2);
+               s = makeXonoticDecibelsSlider(-20, 0, 0.5, "bgmvolume");
+               makeMulti(s, "snd_csqcchannel2volume");
+               me.TD(me, 1, 0.8, e = makeXonoticSliderCheckBox(-1000000, 1, s, "Music:"));
                me.TD(me, 1, 2, s);
        me.TR(me);
                me.TDempty(me, 0.2);
index bd2c6dd886b40fd9cde6d5e2234486c187ef8736..eb080a50f5f8ada5697f4dbc8ba9a326dbeb05ba 100644 (file)
@@ -92,7 +92,7 @@ void fillXonoticEffectsSettingsTab(entity me)
        me.TR(me);
        me.TR(me);
                me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Particle quality:"));
-               me.TD(me, 1, 2, e = makeXonoticSlider(0.1, 1.0, 0.05, "cl_particles_quality"));
+               me.TD(me, 1, 2, e = makeXonoticSlider(0.2, 1.0, 0.1, "cl_particles_quality"));
        me.TR(me);
                me.TD(me, 1, 1, e = makeXonoticTextLabel(0, "Particle dist.:"));
                me.TD(me, 1, 2, e = makeXonoticSlider(500, 2000, 100, "r_drawparticles_drawdistance"));
@@ -158,7 +158,7 @@ void fillXonoticEffectsSettingsTab(entity me)
        me.TR(me);
                me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "r_bloom", "Bloom"));
                        setDependent(e, "r_hdr", 0, 0);
-               me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "r_hdr", "High Dynamic Range (HDR)"));
+               me.TD(me, 1, 2, e = makeXonoticCheckBoxEx(2, 0, "r_hdr", "High Dynamic Range (HDR)"));
        
        me.TR(me);
                s = makeXonoticSlider(0.1, 1, 0.1, "r_motionblur");
index 40709cd3514e2a610fb81ab8c54646c1004667dc..65f5ee9d817b84957f105519ae5789ad8b32e2ab 100644 (file)
@@ -16,13 +16,6 @@ entity makeXonoticImage(string theImage, float theAspect)
 void configureXonoticImageXonoticImage(entity me, string theImage, float theAspect)
 {
        me.configureImage(me, theImage);
-       if(theAspect < 0) // use image aspect
-       {
-               vector sz;
-               sz = draw_PictureSize(theImage);
-               me.forcedAspect = sz_x / sz_y;
-       }
-       else
-               me.forcedAspect = theAspect;
+       me.forcedAspect = theAspect;
 }
 #endif
index deeb30c083991df82509898539a7285e1d57b93f..27d5721afd3c6d432e50fc50e15049989c0a7548 100644 (file)
@@ -7,16 +7,19 @@ CLASS(XonoticPlayerModelSelector) EXTENDS(XonoticImage)
        METHOD(XonoticPlayerModelSelector, resizeNotify, void(entity, vector, vector, vector, vector))
        ATTRIB(XonoticPlayerModelSelector, currentModel, string, string_null)
        ATTRIB(XonoticPlayerModelSelector, currentSkin, float, 0)
-       ATTRIB(XonoticPlayerModelSelector, currentModelName, string, string_null)
+       ATTRIB(XonoticPlayerModelSelector, currentModelImage, string, string_null)
        ATTRIB(XonoticPlayerModelSelector, currentModelTitle, string, string_null)
-       ATTRIB(XonoticPlayerModelSelector, currentModelTxtName, string, string_null)
        ATTRIB(XonoticPlayerModelSelector, currentModelDescription, string, string_null)
        METHOD(XonoticPlayerModelSelector, go, void(entity, float))
+       METHOD(XonoticPlayerModelSelector, destroy, void(entity))
        ATTRIB(XonoticPlayerModelSelector, origin, vector, '0 0 0')
        ATTRIB(XonoticPlayerModelSelector, size, vector, '0 0 0')
        ATTRIB(XonoticPlayerModelSelector, realFontSize, vector, '0 0 0')
        ATTRIB(XonoticPlayerModelSelector, fontSize, float, SKINFONTSIZE_NORMAL)
        ATTRIB(XonoticPlayerModelSelector, titleFontSize, float, SKINFONTSIZE_TITLE)
+       ATTRIB(XonoticPlayerModelSelector, bufModels, float, -1)
+       ATTRIB(XonoticPlayerModelSelector, numModels, float, -1)
+       ATTRIB(XonoticPlayerModelSelector, idxModels, float, -1)
 ENDCLASS(XonoticPlayerModelSelector)
 entity makeXonoticPlayerModelSelector();
 void PlayerModelSelector_Next_Click(entity btn, entity me);
@@ -32,125 +35,106 @@ entity makeXonoticPlayerModelSelector()
        return me;
 }
 
+#define BUFMODELS_TITLE 0
+#define BUFMODELS_IMAGE 1
+#define BUFMODELS_MODEL 2
+#define BUFMODELS_SKIN 3
+#define BUFMODELS_DESC 4
+#define BUFMODELS_COUNT 5
+
 void configureXonoticPlayerModelSelectorXonoticPlayerModelSelector(entity me)
 {
-       me.configureXonoticImage(me, string_null, 263.0/360.0);
+       float sortbuf, glob, i;
+       string fn;
+
+       me.configureXonoticImage(me, string_null, -1);
+
+       sortbuf = buf_create();
+       glob = search_begin(get_model_datafilename(string_null, -1, "txt"), TRUE, TRUE);
+       for(i = 0; i < search_getsize(glob); ++i)
+       {
+               // select model #i!
+               fn = search_getfilename(glob, i);
+               if(!get_model_parameters(fn, -1))
+                       continue;
+               bufstr_add(sortbuf, sprintf("%-128s%s", get_model_parameters_name, fn), 1);
+       }
+       search_end(glob);
+       buf_sort(sortbuf, 128, 0);
+       me.numModels = buf_getsize(sortbuf);
+       me.bufModels = buf_create();
+       for(i = 0; i < me.numModels; ++i)
+       {
+               fn = substring(bufstr_get(sortbuf, i), 128, -1);
+               if(!get_model_parameters(fn, -1))
+                       error("But it JUST worked!");
+               bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_TITLE, get_model_parameters_name);
+               bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_IMAGE, strcat("/", substring(get_model_datafilename(get_model_parameters_modelname, get_model_parameters_modelskin, "tga"), 0, -5)));
+               bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_MODEL, get_model_parameters_modelname);
+               bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_SKIN, ftos(get_model_parameters_modelskin));
+               get_model_parameters_desc = strcat(get_model_parameters_desc, "\n");
+               if(get_model_parameters_sex)
+                       get_model_parameters_desc = strcat(get_model_parameters_desc, "\nSex: ", get_model_parameters_sex);
+               if(get_model_parameters_weight)
+                       get_model_parameters_desc = strcat(get_model_parameters_desc, "\nWeight: ", ftos(get_model_parameters_weight), " kg");
+               if(get_model_parameters_age)
+                       get_model_parameters_desc = strcat(get_model_parameters_desc, "\nAge: ", ftos(get_model_parameters_age));
+               while(substring(get_model_parameters_desc, -1, 1) == "\n")
+                       get_model_parameters_desc = substring(get_model_parameters_desc, 0, -2);
+               bufstr_set(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_DESC, get_model_parameters_desc);
+       }
+       buf_del(sortbuf);
+       get_model_parameters(string_null, 0);
        me.loadCvars(me);
 }
+void destroyXonoticPlayerModelSelector(entity me)
+{
+       buf_del(me.bufModels);
+       me.bufModels = -1;
+}
 
 void loadCvarsXonoticPlayerModelSelector(entity me)
 {
-       float glob, i, fh;
-       string fn;
-       string nm, t, l;
-
+       float i;
        if(me.currentModel)
                strunzone(me.currentModel);
-       if(me.currentModelTitle)
-               strunzone(me.currentModelTitle);
-       if(me.currentModelName)
-               strunzone(me.currentModelName);
-       if(me.currentModelTxtName)
-               strunzone(me.currentModelTxtName);
-       if(me.currentModelDescription)
-               strunzone(me.currentModelDescription);
        me.currentSkin = cvar("_cl_playerskin");
        me.currentModel = strzone(cvar_string("_cl_playermodel"));
-       me.currentModelName = string_null;
-       me.currentModelDescription = string_null;
-       me.currentModelTitle = string_null;
-       me.currentModelTxtName = string_null;
-
-       // lookup model name
-       glob = search_begin("models/player/*.txt", TRUE, TRUE);
-       if(glob < 0)
-               return;
-       for(i = 0; i < search_getsize(glob); ++i)
+       for(i = 0; i < me.numModels; ++i)
        {
-               fn = search_getfilename(glob, i);
-               fh = fopen(fn, FILE_READ);
-               if(fh < 0)
-                       continue;
-               t = fgets(fh);
-               nm = fgets(fh);
-               if(stof(fgets(fh)) == me.currentSkin)
-               if(fgets(fh) == me.currentModel)
-               {
-                       me.currentModelName = strzone(strcat("/", nm));
-                       me.currentModelTxtName = strzone(fn);
-                       me.currentModelTitle = strzone(t);
-                       me.currentModelDescription = "";
-                       fgets(fh); // Skip species
-                       while((l = fgets(fh)))
-                       {
-                               if(me.currentModelDescription != "")
-                                       me.currentModelDescription = strcat(me.currentModelDescription, "\n");
-                               me.currentModelDescription = strcat(me.currentModelDescription, l);
-                       }
-                       me.currentModelDescription = strzone(me.currentModelDescription);
-                       fclose(fh);
+               if(bufstr_get(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_MODEL) == me.currentModel)
+               if(bufstr_get(me.bufModels, BUFMODELS_COUNT*i+BUFMODELS_SKIN) == ftos(me.currentSkin))
                        break;
-               }
-               fclose(fh);
        }
-       search_end(glob);
+       if(i >= me.numModels) // fail
+               i = 0;
+       me.idxModels = i;
+       me.go(me, 0); // this will set the other vars for currentSkin and currentModel
 }
 
 void goXonoticPlayerModelSelector(entity me, float d)
 {
-       float glob, i, fh;
-       string l;
-
-       glob = search_begin("models/player/*.txt", TRUE, TRUE);
-       if(glob < 0)
-               return;
-       for(i = 0; i < search_getsize(glob); ++i)
-               if(search_getfilename(glob, i) == me.currentModelTxtName)
-                       break;
-       // now i is search_getsize(glob) if not found, and the right index if found.
-       if(i == search_getsize(glob))
-       {
-               if(d < 0)
-                       i = search_getsize(glob) - 1;
-               else
-                       i = 0;
-       }
-       else
-       {
-               i = mod(i + d + search_getsize(glob), search_getsize(glob));
-       }
+       me.idxModels = mod(me.idxModels + d + me.numModels, me.numModels);
 
        if(me.currentModel)
                strunzone(me.currentModel);
        if(me.currentModelTitle)
                strunzone(me.currentModelTitle);
-       if(me.currentModelName)
-               strunzone(me.currentModelName);
-       if(me.currentModelTxtName)
-               strunzone(me.currentModelTxtName);
+       if(me.currentModelImage)
+               strunzone(me.currentModelImage);
        if(me.currentModelDescription)
                strunzone(me.currentModelDescription);
 
        // select model #i!
-       me.currentModelTxtName = strzone(search_getfilename(glob, i));
-       fh = fopen(me.currentModelTxtName, FILE_READ);
-       search_end(glob);
-       if(fh < 0)
-               return;
-       me.currentModelTitle = strzone(fgets(fh));
-       me.currentModelName = strzone(strcat("/", fgets(fh)));
-       me.currentSkin = stof(fgets(fh));
-       me.currentModel = strzone(fgets(fh));
-       me.currentModelDescription = "";
-       fgets(fh); // Skip species
-       while((l = fgets(fh)))
-       {
-               if(me.currentModelDescription != "")
-                       me.currentModelDescription = strcat(me.currentModelDescription, "\n");
-               me.currentModelDescription = strcat(me.currentModelDescription, l);
-       }
-       me.currentModelDescription = strzone(me.currentModelDescription);
-       fclose(fh);
+       me.currentModelTitle = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_TITLE));
+       me.currentModelImage = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_IMAGE));
+       me.currentSkin = stof(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_SKIN));
+       me.currentModel = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_MODEL));
+       me.currentModelDescription = strzone(bufstr_get(me.bufModels, BUFMODELS_COUNT*me.idxModels+BUFMODELS_DESC));
+
+       // fix the image
+       me.src = me.currentModelImage;
+       me.updateAspect(me);
 }
 
 void PlayerModelSelector_Next_Click(entity btn, entity me)
@@ -167,8 +151,9 @@ void PlayerModelSelector_Prev_Click(entity btn, entity me)
 
 void saveCvarsXonoticPlayerModelSelector(entity me)
 {
-       // TODO rather set the _cl ones and apply later?
-       localcmd(strcat("playermodel ", me.currentModel, "\nplayerskin ", ftos(me.currentSkin), "\n"));
+       // we can't immediately apply here because of flood control
+       cvar_set("_cl_playermodel", me.currentModel);
+       cvar_set("_cl_playerskin", ftos(me.currentSkin));
 }
 
 void drawXonoticPlayerModelSelector(entity me)
@@ -176,9 +161,7 @@ void drawXonoticPlayerModelSelector(entity me)
        float i, n;
        vector o;
 
-       me.src = me.currentModelName;
        drawImage(me);
-       me.src = string_null;
 
        // draw text on the image, handle \n in the description
        draw_CenterText('0.5 0 0', me.currentModelTitle, me.realFontSize * (me.titleFontSize / me.fontSize), SKINCOLOR_MODELTITLE, SKINALPHA_MODELTITLE, FALSE);
index 13ea0f2dd0c34390196a88900e12e8e385d392be..134557da7dcd9bd1c12065e89f213d78fea799d1 100644 (file)
@@ -53,7 +53,7 @@ void setValueXonoticSlider(entity me, float val)
 {
        if(val != me.value)
        {
-               me.value = val;
+               setValueSlider( me, val );
                me.saveCvars(me);
        }
 }
@@ -62,7 +62,7 @@ void loadCvarsXonoticSlider(entity me)
        if not(me.cvarName)
                return;
 
-       me.value = cvar(me.cvarName);
+       me.setValue( me, cvar(me.cvarName) );
 }
 void saveCvarsXonoticSlider(entity me)
 {
index 20beec911e6144f7c42cda41986a423e8c82d31a..ba7cffc22f049b99564ca11fb7582225716b90db 100644 (file)
@@ -25,11 +25,11 @@ void loadCvarsXonoticDecibelsSlider(entity me)
 
        v = cvar(me.cvarName);
        if(v >= 0.98)
-               me.value = 0;
+               setValueSlider( me, 0 );
        else if(v < 0.0005)
-               me.value = -1000000;
+               setValueSlider( me, -1000000 );
        else
-               me.value = 0.1 * floor(0.5 + 10.0 * log10(cvar(me.cvarName)) * 10);
+               setValueSlider( me, 0.1 * floor(0.5 + 10.0 * log10(cvar(me.cvarName)) * 10) );
 }
 void saveCvarsXonoticDecibelsSlider(entity me)
 {
index d4786a7910aa7e43fbe1f915090abc8bee1fad54..2236bc51fe362b88705c10b353e0e57b6e5ef7fe 100644 (file)
@@ -46,7 +46,7 @@ void setValueXonoticTextSlider(entity me, float val)
 {
        if(val != me.value)
        {
-               me.value = val;
+               setValueSlider( me, val );
                me.saveCvars(me);
        }
 }
index 4f365d794f5829342a3fa933425bf99d2156b05e..3571e1ba834c6b47c5c9cb7392f9e071ee9289ec 100644 (file)
@@ -322,8 +322,18 @@ float preMenuInit()
 
 string campaign_name_previous;
 float campaign_won_previous;
+#ifdef WATERMARK
+var string autocvar_menu_watermark = WATERMARK();
+#else
+var string autocvar_menu_watermark = "";
+#endif
 void postMenuDraw()
 {
+       if(autocvar_menu_watermark != "")
+       {
+               vector fs = '48 48 0';
+               draw_CenterText('0.5 0.1 0', autocvar_menu_watermark, globalToBoxSize('32 32 0', draw_scale), '1 1 1', 0.05, 1);
+       }
 }
 void preMenuDraw()
 {
diff --git a/qcsrc/qc-client.cbp b/qcsrc/qc-client.cbp
new file mode 100644 (file)
index 0000000..056b98e
--- /dev/null
@@ -0,0 +1,92 @@
+<?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
new file mode 100644 (file)
index 0000000..95f1ba8
--- /dev/null
@@ -0,0 +1,65 @@
+<?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
new file mode 100644 (file)
index 0000000..00912be
--- /dev/null
@@ -0,0 +1,212 @@
+<?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_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 2401c746f2acf135455dffa6d439b50b5bfebbdd..44ece52bfd9c66cd2caf0d67af3ce2c4c0256d4e 100644 (file)
@@ -153,7 +153,7 @@ void bot_setnameandstuff()
        else bot_name = "Bot";
 
        if(argv(1) != "") bot_model = argv(1);
-       else bot_model = "marine";
+       else bot_model = "";
 
        if(argv(2) != "") bot_skin = argv(2);
        else bot_skin = "0";
@@ -200,9 +200,23 @@ void bot_setnameandstuff()
        else
                name = bot_name;
 
+       self.cleanname = strzone(name);
+
+       // number bots with identical names
+       float i;
+       i = 0;
+       FOR_EACH_CLIENT(p)
+       {
+               if(clienttype(p) == CLIENTTYPE_BOT)
+                       if(p.cleanname == name)
+                               ++i;
+       }
+       if (i)
+               name = strcat(name, "(", ftos(i), ")");
+
        // pick the model and skin
        if(substring(bot_model, -4, 1) != ".")
-               bot_model = strcat(bot_model, ".zym");
+               bot_model = strcat(bot_model, ".iqm");
        self.playermodel = self.playermodel_freeme = strzone(strcat("models/player/", bot_model));
        self.playerskin = self.playerskin_freeme = strzone(bot_skin);
 
@@ -338,12 +352,15 @@ void bot_clientdisconnect()
 {
        if (clienttype(self) != CLIENTTYPE_BOT)
                return;
+       if(self.cleanname)
+               strunzone(self.cleanname);
        if(self.netname_freeme)
                strunzone(self.netname_freeme);
        if(self.playermodel_freeme)
                strunzone(self.playermodel_freeme);
        if(self.playerskin_freeme)
                strunzone(self.playerskin_freeme);
+       self.cleanname = string_null;
        self.netname_freeme = string_null;
        self.playermodel_freeme = string_null;
        self.playerskin_freeme = string_null;
index 75619e19b786633e198a2063bac65bf0e34655ae..0550431e968bd8b31b49a7c7546a89faed272bd5 100644 (file)
@@ -53,6 +53,7 @@ entity bot_list;
 entity player_list;
 .entity nextbot;
 .entity nextplayer;
+.string cleanname;
 .string netname_freeme;
 .string playermodel_freeme;
 .string playerskin_freeme;
index 0e51f95823e7f8db2272ba0ea41f6c50d5301b2b..2b86c27ad0b3c6949c4f1ccc109260d601737edb 100644 (file)
@@ -162,8 +162,8 @@ void havocbot_keyboard_movement(vector destorg)
        self.havocbot_keyboardtime =
                max(
                        self.havocbot_keyboardtime
-                               + bound(0,0.05/(sk+self.havocbot_keyboardskill),0.05)
-                               +random()*bound(0,0.025/(skill+self.havocbot_keyboardskill),100)
+                               + 0.05/max(1, sk+self.havocbot_keyboardskill)
+                               + random()*0.025/max(0.00025, skill+self.havocbot_keyboardskill)
                , time);
        keyboard = self.movement * (1.0 / maxspeed);
 
index 9e905a7d889c45a3205b7c5f01e5dd16491bcd2d..3268daefa5a5ae601056dc02a1b6d6142ee3662f 100644 (file)
@@ -38,7 +38,7 @@ void havocbot_goalrating_ons_offenseitems(float ratingscale, vector org, float s
        for(i = WEP_FIRST; i < WEP_LAST ; ++i)
        {
                // Find weapon
-               if((get_weaponinfo(i)).weapons & self.weapons)
+               if(power2of(i-1) & self.weapons)
                if(++c>=4)
                        break;
        }
index 90f4b234eb8fc07173ef73884a906088803477eb..45eab621ea6b83caf327e662ceff0648dc2d09fe 100644 (file)
@@ -230,11 +230,8 @@ float CheatImpulse(float i)
                        IS_CHEAT(i, 0, 0);
                        FOR_EACH_PLAYER(e)
                        {
-                               if( e.playermodel == "models/player/jeandarc.zym"
-                                               ||  e.playermodel == "models/player/pyria.zym"
-                                               ||  e.playermodel == "models/player/skadi.zym"
-                                               || (e.playermodel == "models/player/specop.zym" && random() < 0.5) // you never know
-                                               ||  e.playermodel == "models/player/visitant.zym")
+                               get_model_parameters(e.playermodel, e.skinindex);
+                               if(get_model_parameters_sex == "Female")
                                {
                                        makevectors(e.angles);
                                        traceline(e.origin, e.origin + v_right * 256, MOVE_NORMAL, e);
index 2f424b8a8f49d81bd3b82f7a53181fe05df15aac..73c9169e5e6929341cca72c4f50377ec92c32125 100644 (file)
@@ -13,10 +13,13 @@ void Announce(string snd) {
 }
 
 void AnnounceTo(entity e, string snd) {
-       msg_entity = e;
-       WriteByte(MSG_ONE, SVC_TEMPENTITY);
-       WriteByte(MSG_ONE, TE_CSQC_ANNOUNCE);
-       WriteString(MSG_ONE, snd);
+       if (clienttype(e) == CLIENTTYPE_REAL)
+       {
+               msg_entity = e;
+               WriteByte(MSG_ONE, SVC_TEMPENTITY);
+               WriteByte(MSG_ONE, TE_CSQC_ANNOUNCE);
+               WriteString(MSG_ONE, snd);
+       }
 }
 
 float ClientData_Send(entity to, float sf)
@@ -395,8 +398,15 @@ Checks if the argument string can be a valid playermodel.
 Returns a valid one in doubt.
 =============
 */
-string FallbackPlayerModel = "models/player/marine.zym";
+string FallbackPlayerModel;
 string CheckPlayerModel(string plyermodel) {
+       if(FallbackPlayerModel != cvar_defstring("_cl_playermodel"))
+       {
+               // note: we cannot summon Don Strunzone here, some player may
+               // still have the model string set. In case anyone manages how
+               // to change a cvar default, we'll have a small leak here.
+               FallbackPlayerModel = strzone(cvar_defstring("_cl_playermodel"));
+       }
        if(strlen(plyermodel) < 4)
                return FallbackPlayerModel;
        if( substring(plyermodel,0,14) != "models/player/")
@@ -405,6 +415,7 @@ string CheckPlayerModel(string plyermodel) {
        {
                if(substring(plyermodel,-4,4) != ".zym")
                if(substring(plyermodel,-4,4) != ".dpm")
+               if(substring(plyermodel,-4,4) != ".iqm")
                if(substring(plyermodel,-4,4) != ".md3")
                if(substring(plyermodel,-4,4) != ".psk")
                        return FallbackPlayerModel;
@@ -504,7 +515,6 @@ float Client_customizeentityforclient()
        return TRUE;
 }
 
-void UpdatePlayerSounds();
 void setmodel_lod(entity e, string modelname)
 {
        string s;
@@ -582,7 +592,6 @@ void PutObserverInServer (void)
        }
 
        DropAllRunes(self);
-       kh_Key_DropAll(self, TRUE);
 
        Portal_ClearAll(self);
 
@@ -697,6 +706,8 @@ void PutObserverInServer (void)
        }
        else
                self.frags = FRAGS_SPECTATOR;
+
+       MUTATOR_CALLHOOK(MakePlayerObserver);
 }
 
 float RestrictSkin(float s)
@@ -898,9 +909,6 @@ void PutClientInServer (void)
                        self.weapons = randombits(self.weapons, g_weaponarena_random, FALSE);
 
                self.items = start_items;
-               self.switchweapon = w_getbestweapon(self);
-               self.cnt = self.switchweapon;
-               self.weapon = 0;
                self.jump_interval = time;
 
                self.spawnshieldtime = time + cvar("g_spawnshieldtime");
@@ -931,6 +939,7 @@ void PutClientInServer (void)
                self.nextthink = 0;
                self.hook_time = 0;
                self.dmg_team = 0;
+               self.ballistics_density = cvar("g_ballistics_density_player");
 
                self.metertime = 0;
 
@@ -993,7 +1002,6 @@ void PutClientInServer (void)
                }
 
                self.cnt = WEP_LASER;
-               self.nixnex_lastchange_id = -1;
 
                CL_SpawnWeaponentity();
                self.alpha = default_player_alpha;
@@ -1028,8 +1036,8 @@ void PutClientInServer (void)
                target_voicescript_clear(self);
 
                // reset fields the weapons may use
-        for (j = WEP_FIRST; j <= WEP_LAST; ++j)
-            weapon_action(j, WR_RESETPLAYER);
+               for (j = WEP_FIRST; j <= WEP_LAST; ++j)
+                       weapon_action(j, WR_RESETPLAYER);
 
                oldself = self;
                self = spot;
@@ -1037,6 +1045,12 @@ void PutClientInServer (void)
                                SUB_UseTargets();
                        activator = world;
                self = oldself;
+
+               MUTATOR_CALLHOOK(PlayerSpawn);
+
+               self.switchweapon = w_getbestweapon(self);
+               self.cnt = self.switchweapon;
+               self.weapon = 0;
        } else if(self.classname == "observer" || (g_ca && !allowed_to_spawn)) {
                PutObserverInServer ();
        }
@@ -1052,19 +1066,55 @@ float ClientInit_SendEntity(entity to, float sf)
        WriteCoord(MSG_ENTITY, hook_shotorigin_x);
        WriteCoord(MSG_ENTITY, hook_shotorigin_y);
        WriteCoord(MSG_ENTITY, hook_shotorigin_z);
-
        if(sv_foginterval && world.fog != "")
                WriteString(MSG_ENTITY, world.fog);
        else
                WriteString(MSG_ENTITY, "");
-       WriteByte(MSG_ENTITY, cvar("g_balance_armor_blockpercent") * 255.0);
-       WriteByte(MSG_ENTITY, cvar("g_balance_weaponswitchdelay") * 255.0);
+       WriteByte(MSG_ENTITY, self.count * 255.0); // g_balance_armor_blockpercent
+       WriteByte(MSG_ENTITY, self.cnt * 255.0); // g_balance_weaponswitchdelay
+       WriteCoord(MSG_ENTITY, self.bouncefactor); // g_balance_grenadelauncher_secondary_bouncefactor
+       WriteCoord(MSG_ENTITY, self.bouncestop); // g_balance_grenadelauncher_secondary_bouncestop
        return TRUE;
 }
 
+void ClientInit_CheckUpdate()
+{
+       self.nextthink = time;
+       if(self.count != cvar("g_balance_armor_blockpercent"))
+       {
+               self.count = cvar("g_balance_armor_blockpercent");
+               self.SendFlags |= 1;
+       }
+       if(self.cnt != cvar("g_balance_weaponswitchdelay"))
+       {
+               self.cnt = cvar("g_balance_weaponswitchdelay");
+               self.SendFlags |= 1;
+       }
+       if(self.bouncefactor != cvar("g_balance_grenadelauncher_secondary_bouncefactor"))
+       {
+               self.bouncefactor = cvar("g_balance_grenadelauncher_secondary_bouncefactor");
+               self.SendFlags |= 1;
+       }
+       if(self.bouncestop != cvar("g_balance_grenadelauncher_secondary_bouncestop"))
+       {
+               self.bouncestop = cvar("g_balance_grenadelauncher_secondary_bouncestop");
+               self.SendFlags |= 1;
+       }
+}
+
 void ClientInit_Spawn()
 {
-       Net_LinkEntity(spawn(), FALSE, 0, ClientInit_SendEntity);
+       entity o;
+       entity e;
+       e = spawn();
+       e.classname = "clientinit";
+       e.think = ClientInit_CheckUpdate;
+       Net_LinkEntity(e, FALSE, 0, ClientInit_SendEntity);
+
+       o = self;
+       self = e;
+       ClientInit_CheckUpdate();
+       self = o;
 }
 
 /*
@@ -1344,6 +1394,10 @@ void ClientConnect (void)
 
        DecodeLevelParms();
 
+#ifdef WATERMARK
+       sprint(self, strcat("^4SVQC Build information: ", WATERMARK(), "\n"));
+#endif
+
        self.classname = "player_joining";
 
        self.flags = FL_CLIENT;
@@ -1578,7 +1632,7 @@ void ClientDisconnect (void)
        SoundEntity_Detach(self);
 
        DropAllRunes(self);
-       kh_Key_DropAll(self, TRUE);
+       MUTATOR_CALLHOOK(ClientDisconnect);
 
        Portal_ClearAll(self);
 
@@ -1741,10 +1795,31 @@ void UpdateTeamBubble()
        else self.colormod = '1 1 1';
 };*/
 
+.float oldcolormap;
 void respawn(void)
 {
+       if(self.modelindex != 0 && cvar("g_respawn_ghosts"))
+       {
+               self.solid = SOLID_NOT;
+               self.takedamage = DAMAGE_NO;
+               self.movetype = MOVETYPE_FLY;
+               self.velocity = '0 0 1' * cvar("g_respawn_ghosts_speed");
+               self.avelocity = randomvec() * cvar("g_respawn_ghosts_speed") * 3 - randomvec() * cvar("g_respawn_ghosts_speed") * 3;
+               self.effects |= EF_ADDITIVE;
+               self.oldcolormap = self.colormap;
+               self.colormap = 512;
+               pointparticles(particleeffectnum("respawn_ghost"), self.origin, '0 0 0', 1);
+               if(cvar("g_respawn_ghosts_maxtime"))
+                       SUB_SetFade (self, time + cvar("g_respawn_ghosts_maxtime") / 2 + random () * (cvar("g_respawn_ghosts_maxtime") - cvar("g_respawn_ghosts_maxtime") / 2), 1.5);
+       }
+
        CopyBody(1);
        self.effects |= EF_NODRAW; // prevent another CopyBody
+       if(self.oldcolormap)
+       {
+               self.colormap = self.oldcolormap;
+               self.oldcolormap = 0;
+       }
        PutClientInServer();
 }
 
@@ -2046,6 +2121,7 @@ void SetZoomState(float z)
 }
 
 void GetPressedKeys(void) {
+       MUTATOR_CALLHOOK(GetPressedKeys);
        if (self.movement_x > 0) // get if movement keys are pressed
        {       // forward key pressed
                self.pressedkeys |= KEY_FORWARD;
@@ -2115,7 +2191,8 @@ void SpectateCopy(entity spectatee) {
        } else
                update_stats (0, spectatee.cvar_cl_accuracy_data_share * spectatee.stat_hit, spectatee.cvar_cl_accuracy_data_share * spectatee.stat_fired);
 
-       self.kh_state = spectatee.kh_state;
+       other = spectatee;
+       MUTATOR_CALLHOOK(SpectateCopy);
        self.armortype = spectatee.armortype;
        self.armorvalue = spectatee.armorvalue;
        self.ammo_cells = spectatee.ammo_cells;
@@ -2487,6 +2564,8 @@ void PlayerPreThink (void)
                return;
 #endif
 
+       MUTATOR_CALLHOOK(PlayerPreThink);
+
        if(self.classname == "player") {
 //             if(self.netname == "Wazat")
 //                     bprint(self.classname, "\n");
@@ -2508,8 +2587,6 @@ void PlayerPreThink (void)
                        self.effects = self.effects - (self.effects & EF_NODRAW);
                }
 
-               Nixnex_GiveCurrentWeapon();
-
                if(frametime > 0) // don't do this in cl_movement frames, just in server ticks
                        UpdateSelectedPlayer();
 
@@ -2522,8 +2599,7 @@ void PlayerPreThink (void)
 
                if(frametime)
                {
-                       if(cvar("gameversion") >= 20600) // only do this for 2.6 and above FIXME remove this check when making 2.6
-                               self.glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2;
+                       self.glowmod = colormapPaletteColor(self.clientcolors & 0x0F, TRUE) * 2;
                        player_powerups();
                }
 
@@ -2772,6 +2848,18 @@ Called every frame for each client after the physics are run
 =============
 */
 .float idlekick_lasttimeleft;
+.entity showheadshotbbox;
+void showheadshotbbox_think()
+{
+       if(self.owner.showheadshotbbox != self)
+       {
+               remove(self);
+               return;
+       }
+       self.nextthink = time;
+       setorigin(self, self.owner.origin);
+       setsize(self, GetHeadshotMins(self.owner), GetHeadshotMaxs(self.owner));
+}
 void PlayerPostThink (void)
 {
        // Savage: Check for nameless players
@@ -2843,7 +2931,6 @@ void PlayerPostThink (void)
                        ImpulseCommands();
                if (intermission_running)
                        return;         // intermission or finale
-
                GetPressedKeys();
        } else if (self.classname == "observer") {
                //do nothing
@@ -2874,6 +2961,26 @@ void PlayerPostThink (void)
        if(self.waypointsprite_attachedforcarrier)
                WaypointSprite_UpdateHealth(self.waypointsprite_attachedforcarrier, '1 0 0' * healtharmor_maxdamage(self.health, self.armorvalue, cvar("g_balance_armor_blockpercent")));
        
+       if(self.classname == "player" && self.deadflag == DEAD_NO && cvar("r_showbboxes"))
+       {
+               if(!self.showheadshotbbox)
+               {
+                       self.showheadshotbbox = spawn();
+                       self.showheadshotbbox.classname = "headshotbbox";
+                       self.showheadshotbbox.owner = self;
+                       self.showheadshotbbox.think = showheadshotbbox_think;
+                       self.showheadshotbbox.nextthink = time;
+                       self = self.showheadshotbbox;
+                       self.think();
+                       self = self.owner;
+               }
+       }
+       else
+       {
+               if(self.showheadshotbbox)
+                       remove(self.showheadshotbbox);
+       }
+
        playerdemo_write();
 
        /*
index 56823b3e2988e4b301aefee956b7b0be38a585d1..3a405c40be8f52fe179c71cb631ec044da90213c 100644 (file)
@@ -13,12 +13,15 @@ float sv_airaccel_qw;
 float sv_airstopaccelerate;
 float sv_airstrafeaccelerate;
 float sv_maxairstrafespeed;
+float sv_airstrafeaccel_qw;
 float sv_aircontrol;
+float sv_aircontrol_power;
 float sv_warsowbunny_airforwardaccel;
 float sv_warsowbunny_accel;
 float sv_warsowbunny_topspeed;
 float sv_warsowbunny_turnaccel;
 float sv_warsowbunny_backtosideratio;
+float sv_airspeedlimit_nonqw;
 
 .float ladder_time;
 .entity ladder_entity;
@@ -39,6 +42,15 @@ When you press the jump key
 void PlayerJump (void)
 {
        float mjumpheight;
+       float doublejump;
+
+       doublejump = FALSE;
+       if (sv_doublejump)
+       {
+               tracebox(self.origin + '0 0 0.01', self.mins, self.maxs, self.origin - '0 0 0.01', MOVE_NORMAL, self);
+               if (trace_fraction < 1 && trace_plane_normal_z > 0.7)
+                       doublejump = TRUE;
+       }
 
        mjumpheight = cvar("sv_jumpvelocity");
        if (self.waterlevel >= WATERLEVEL_SWIMMING)
@@ -53,6 +65,7 @@ void PlayerJump (void)
                return;
        }
 
+       if (!doublejump)
        if (!(self.flags & FL_ONGROUND))
                return;
 
@@ -83,15 +96,34 @@ void PlayerJump (void)
                mjumpheight = mjumpheight * cvar("g_minstagib_speed_jumpheight");
        }
 
+       // sv_jumpspeedcap_min/sv_jumpspeedcap_max act as baseline
+       // velocity bounds.  Final velocity is bound between (jumpheight *
+       // min + jumpheight) and (jumpheight * max + jumpheight);
+
        if(cvar_string("sv_jumpspeedcap_min") != "")
-               self.velocity_z = max(cvar("sv_jumpvelocity") * cvar("sv_jumpspeedcap_min"), self.velocity_z);
-       if(cvar_string("sv_jumpspeedcap_max") != "") {
-               if(trace_fraction < 1 && trace_plane_normal_z < 0.98 && cvar("sv_jumpspeedcap_max_disable_on_ramps")) {
-                       // don't do jump speedcaps on ramps to preserve old xonotic ramjump style
-                       //print("Trace plane normal z: ", ftos(trace_plane_normal_z), ", disabling speed cap!\n");
+       {
+               float minjumpspeed;
+
+               minjumpspeed = mjumpheight * cvar("sv_jumpspeedcap_min");
+
+               if (self.velocity_z < minjumpspeed)
+                       mjumpheight += minjumpspeed - self.velocity_z;
+       }
+
+       if(cvar_string("sv_jumpspeedcap_max") != "")
+       {
+               // don't do jump speedcaps on ramps to preserve old xonotic ramjump style
+               tracebox(self.origin + '0 0 0.01', self.mins, self.maxs, self.origin - '0 0 0.01', MOVE_NORMAL, self);
+
+               if(!(trace_fraction < 1 && trace_plane_normal_z < 0.98 && cvar("sv_jumpspeedcap_max_disable_on_ramps")))
+               {
+                       float maxjumpspeed;
+
+                       maxjumpspeed = mjumpheight * cvar("sv_jumpspeedcap_max");
+
+                       if (self.velocity_z > maxjumpspeed)
+                               mjumpheight -= self.velocity_z - maxjumpspeed;
                }
-               else
-                       self.velocity_z = min(cvar("sv_jumpvelocity") * cvar("sv_jumpspeedcap_max"), self.velocity_z) + trace_ent.velocity_z;
        }
 
        if(!(self.lastflags & FL_ONGROUND))
@@ -385,7 +417,7 @@ float IsMoveInDirection(vector mv, float angle) // key mix factor
 {
        if(mv_x == 0 && mv_y == 0)
                return 0; // avoid division by zero
-       angle = RAD2DEG * atan2(mv_y, mv_x);
+       angle -= RAD2DEG * atan2(mv_y, mv_x);
        angle = remainder(angle, 360) / 45;
        if(angle >  1)
                return 0;
@@ -394,6 +426,25 @@ float IsMoveInDirection(vector mv, float angle) // key mix factor
        return 1 - fabs(angle);
 }
 
+float GeomLerp(float a, float lerp, float b)
+{
+       if(a == 0)
+       {
+               if(lerp < 1)
+                       return 0;
+               else
+                       return b;
+       }
+       if(b == 0)
+       {
+               if(lerp > 0)
+                       return 0;
+               else
+                       return a;
+       }
+       return a * pow(fabs(b / a), lerp);
+}
+
 void CPM_PM_Aircontrol(vector wishdir, float wishspeed)
 {
        float zspeed, xyspeed, dot, k;
@@ -416,10 +467,10 @@ void CPM_PM_Aircontrol(vector wishdir, float wishspeed)
        xyspeed = vlen(self.velocity); self.velocity = normalize(self.velocity);
 
        dot = self.velocity * wishdir;
-       k *= sv_aircontrol*dot*dot*frametime;
 
        if(dot > 0) // we can't change direction while slowing down
        {
+               k *= fabs(sv_aircontrol)*pow(dot, sv_aircontrol_power)*frametime;
                self.velocity = normalize(self.velocity * xyspeed + wishdir * k);
        }
 
@@ -427,12 +478,17 @@ void CPM_PM_Aircontrol(vector wishdir, float wishspeed)
        self.velocity_z = zspeed;
 }
 
+float AdjustAirAccelQW(float accelqw, float factor)
+{
+       return copysign(bound(0.000001, 1 - (1 - fabs(accelqw)) * factor, 1), accelqw);
+}
+
 // example config for alternate speed clamping:
 //   sv_airaccel_qw 0.8
 //   sv_airaccel_sideways_friction 0
 //   prvm_globalset server speedclamp_mode 1
 //     (or 2)
-void PM_Accelerate(vector wishdir, float wishspeed, float wishspeed0, float accel, float accelqw, float sidefric)
+void PM_Accelerate(vector wishdir, float wishspeed, float wishspeed0, float accel, float accelqw, float sidefric, float speedlimit)
 {
        float vel_straight;
        float vel_z;
@@ -459,6 +515,8 @@ void PM_Accelerate(vector wishdir, float wishspeed, float wishspeed0, float acce
        step = accel * frametime * wishspeed0;
 
        vel_xy_current  = vlen(vel_xy);
+       if(speedlimit)
+               accelqw = AdjustAirAccelQW(accelqw, (speedlimit - bound(wishspeed, vel_xy_current, speedlimit)) / max(1, speedlimit - wishspeed));
        vel_xy_forward  = vel_xy_current + bound(0, wishspeed - vel_xy_current, step) * accelqw + step * (1 - accelqw);
        vel_xy_backward = vel_xy_current - bound(0, wishspeed + vel_xy_current, step) * accelqw - step * (1 - accelqw);
        if(vel_xy_backward < 0)
@@ -542,7 +600,6 @@ void PM_AirAccelerate(vector wishdir, float wishspeed)
 .vector v_angle_old;
 .string lastclassname;
 
-void Nixnex_GiveCurrentWeapon();
 .float() PlayerPhysplug;
 
 string specialcommand = "xwxwxsxsxaxdxaxdx1x ";
@@ -584,7 +641,7 @@ void race_send_speedaward_alltimebest(float msg)
 string GetMapname(void);
 float speedaward_lastupdate;
 float speedaward_lastsent;
-.float jumppadusetime;
+var float autocvar_g_movement_highspeed = 1;
 void SV_PlayerPhysics()
 {
        local vector wishvel, wishdir, v;
@@ -594,6 +651,14 @@ void SV_PlayerPhysics()
        float not_allowed_to_move;
        string c;
 
+       // fix physics stats for g_movement_highspeed
+       self.stat_sv_airaccel_qw = AdjustAirAccelQW(sv_airaccel_qw, autocvar_g_movement_highspeed);
+       if(sv_airstrafeaccel_qw)
+               self.stat_sv_airstrafeaccel_qw = AdjustAirAccelQW(sv_airstrafeaccel_qw, autocvar_g_movement_highspeed);
+       else
+               self.stat_sv_airstrafeaccel_qw = 0;
+       self.stat_sv_airspeedlimit_nonqw = sv_airspeedlimit_nonqw * autocvar_g_movement_highspeed;
+
     if(self.PlayerPhysplug)
         if(self.PlayerPhysplug())
             return;
@@ -689,6 +754,8 @@ void SV_PlayerPhysics()
                bot_think();
        }
        
+       MUTATOR_CALLHOOK(PlayerPhysics);
+
        self.items &~= IT_USING_JETPACK;
 
        if(self.classname == "player")
@@ -828,14 +895,6 @@ void SV_PlayerPhysics()
 
        if(self.classname == "player")
        {
-               if(sv_doublejump && time - self.jumppadusetime > 2 * sys_frametime)
-               {
-                       tracebox(self.origin + '0 0 0.01', self.mins, self.maxs, self.origin - '0 0 0.01', MOVE_NORMAL, self);
-                       self.flags &~= FL_ONGROUND;
-                       if(trace_fraction < 1 && trace_plane_normal_z > 0.7)
-                               self.flags |= FL_ONGROUND;
-               }
-
                if (self.BUTTON_JUMP)
                        PlayerJump ();
                else
@@ -874,7 +933,7 @@ void SV_PlayerPhysics()
                if (wishspeed > sv_maxspeed*maxspd_mod)
                        wishspeed = sv_maxspeed*maxspd_mod;
                if (time >= self.teleport_time)
-                       PM_Accelerate(wishdir, wishspeed, wishspeed, sv_accelerate*maxspd_mod, 1, 0);
+                       PM_Accelerate(wishdir, wishspeed, wishspeed, sv_accelerate*maxspd_mod, 1, 0, 0);
        }
        else if (self.waterlevel >= WATERLEVEL_SWIMMING)
        {
@@ -897,7 +956,7 @@ void SV_PlayerPhysics()
                self.velocity = self.velocity * (1 - frametime * sv_friction);
 
                // water acceleration
-               PM_Accelerate(wishdir, wishspeed, wishspeed, sv_accelerate*maxspd_mod, 1, 0);
+               PM_Accelerate(wishdir, wishspeed, wishspeed, sv_accelerate*maxspd_mod, 1, 0, 0);
        }
        else if (time < self.ladder_time)
        {
@@ -940,7 +999,7 @@ void SV_PlayerPhysics()
                if (time >= self.teleport_time)
                {
                        // water acceleration
-                       PM_Accelerate(wishdir, wishspeed, wishspeed, sv_accelerate*maxspd_mod, 1, 0);
+                       PM_Accelerate(wishdir, wishspeed, wishspeed, sv_accelerate*maxspd_mod, 1, 0, 0);
                }
        }
        else if ((self.items & IT_JETPACK) && self.BUTTON_HOOK && (!cvar("g_jetpack_fuel") || self.ammo_fuel >= 0.01 || self.items & IT_UNLIMITED_WEAPON_AMMO))
@@ -1100,7 +1159,7 @@ void SV_PlayerPhysics()
                if (self.crouch)
                        wishspeed = wishspeed * 0.5;
                if (time >= self.teleport_time)
-                       PM_Accelerate(wishdir, wishspeed, wishspeed, sv_accelerate*maxspd_mod, 1, 0);
+                       PM_Accelerate(wishdir, wishspeed, wishspeed, sv_accelerate*maxspd_mod, 1, 0, 0);
        }
        else
        {
@@ -1136,8 +1195,9 @@ void SV_PlayerPhysics()
                        float accelerating;
                        float wishspeed2;
                        float airaccelqw;
+                       float strafity;
 
-                       airaccelqw = sv_airaccel_qw;
+                       airaccelqw = self.stat_sv_airaccel_qw;
                        accelerating = (self.velocity * wishdir > 0);
                        wishspeed2 = wishspeed;
 
@@ -1145,30 +1205,27 @@ void SV_PlayerPhysics()
                        if(sv_airstopaccelerate)
                                if(self.velocity * wishdir < 0)
                                        airaccel = sv_airstopaccelerate*maxspd_mod;
-                       // this doesn't play well with analog input, but can't r
-                       // fixed like the AirControl can. So, don't set the maxa
-                       // cvars when you want to support analog input.
-                       if(self.movement_x == 0 && self.movement_y != 0)
-                       {
-                               if(sv_maxairstrafespeed)
-                               {
-                                       wishspeed = min(wishspeed, sv_maxairstrafespeed*maxspd_mod);
-                                       if(sv_maxairstrafespeed < sv_maxairspeed)
-                                               airaccelqw = 1;
-                               }
-                               if(sv_airstrafeaccelerate)
-                               {
-                                       airaccel = sv_airstrafeaccelerate*maxspd_mod;
-                                       if(sv_airstrafeaccelerate > sv_airaccelerate)
-                                               airaccelqw = 1;
-                               }
-                       }
+                       // note that for straight forward jumping:
+                       // step = accel * frametime * wishspeed0;
+                       // accel  = bound(0, wishspeed - vel_xy_current, step) * accelqw + step * (1 - accelqw);
+                       // -->
+                       // dv/dt = accel * maxspeed (when slow)
+                       // dv/dt = accel * maxspeed * (1 - accelqw) (when fast)
+                       // log dv/dt = logaccel + logmaxspeed (when slow)
+                       // log dv/dt = logaccel + logmaxspeed + log(1 - accelqw) (when fast)
+                       strafity = IsMoveInDirection(self.movement, -90) + IsMoveInDirection(self.movement, +90); // if one is nonzero, other is always zero
+                       if(sv_maxairstrafespeed)
+                               wishspeed = min(wishspeed, GeomLerp(sv_maxairspeed*maxspd_mod, strafity, sv_maxairstrafespeed*maxspd_mod));
+                       if(sv_airstrafeaccelerate)
+                               airaccel = GeomLerp(airaccel, strafity, sv_airstrafeaccelerate*maxspd_mod);
+                       if(self.stat_sv_airstrafeaccel_qw)
+                               airaccelqw = copysign(1-GeomLerp(1-fabs(self.stat_sv_airaccel_qw), strafity, 1-fabs(self.stat_sv_airstrafeaccel_qw)), ((strafity > 0.5) ? self.stat_sv_airstrafeaccel_qw : self.stat_sv_airaccel_qw));
                        // !CPM
 
                        if(sv_warsowbunny_turnaccel && accelerating && self.movement_y == 0 && self.movement_x != 0)
                                PM_AirAccelerate(wishdir, wishspeed);
                        else
-                               PM_Accelerate(wishdir, wishspeed, wishspeed0, airaccel, airaccelqw, sv_airaccel_sideways_friction / maxairspd);
+                               PM_Accelerate(wishdir, wishspeed, wishspeed0, airaccel, airaccelqw, sv_airaccel_sideways_friction / maxairspd, self.stat_sv_airspeedlimit_nonqw);
 
                        if(sv_aircontrol)
                                CPM_PM_Aircontrol(wishdir, wishspeed2);
index 92335faeef3a5c206e2a9bfce0bf9892f5b01880..b3f0e3ee5aac7fd72f57ea2a4b9e3c5eb570519f 100644 (file)
@@ -142,6 +142,7 @@ void CopyBody(float keepvelocity)
        self.movetype = oldself.movetype;
        self.nextthink = oldself.nextthink;
        self.solid = oldself.solid;
+       self.ballistics_density = oldself.ballistics_density;
        self.takedamage = oldself.takedamage;
        self.think = oldself.think;
        self.customizeentityforclient = oldself.customizeentityforclient;
@@ -165,55 +166,12 @@ void CopyBody(float keepvelocity)
 
 float player_getspecies()
 {
-       local float glob, i, j, fh, len, s, sk;
-       local string fn, l;
-
-       s = -1;
-
-       glob = search_begin("models/player/*.txt", TRUE, TRUE);
-       if(glob < 0)
-               return s;
-       for(j = 0; j <= 1; ++j)
-       {
-               for(i = 0; i < search_getsize(glob); ++i)
-               {
-                       fn = search_getfilename(glob, i);
-                       fh = fopen(fn, FILE_READ);
-                       if(fh < 0)
-                               continue;
-                       fgets(fh); fgets(fh);
-                       sk = stof(fgets(fh));
-                       if(sk == (j ? 0 : self.skinindex)) // 2nd pass skips the skin test
-                       if(fgets(fh) == self.model)
-                       {
-                               l = fgets(fh);
-                               len = tokenize_console(l);
-                               if (len != 2)
-                                       goto nospecies;
-                               if (argv(0) != "species")
-                                       goto nospecies;
-                               switch(argv(1))
-                               {
-                                       case "human":       s = SPECIES_HUMAN;       break;
-                                       case "alien":       s = SPECIES_ALIEN;       break;
-                                       case "robot_shiny": s = SPECIES_ROBOT_SHINY; break;
-                                       case "robot_rusty": s = SPECIES_ROBOT_RUSTY; break;
-                                       case "robot_solid": s = SPECIES_ROBOT_SOLID; break;
-                                       case "animal":      s = SPECIES_ANIMAL;      break;
-                                       case "reserved":    s = SPECIES_RESERVED;    break;
-                               }
-                       }
-:nospecies
-                       fclose(fh);
-               }
-               if (s >= 0)
-                       break;
-       }
-       search_end(glob);
-
-       if (s < 0)
-               s = SPECIES_HUMAN;
-
+       float s;
+       get_model_parameters(self.playermodel, self.skinindex);
+       s = get_model_parameters_species;
+       get_model_parameters(string_null, 0);
+       if(s < 0)
+               return SPECIES_HUMAN;
        return s;
 }
 
@@ -412,7 +370,7 @@ void PlayerCorpseDamage (entity inflictor, entity attacker, float damage, float
        self.dmg_take = self.dmg_take + take;//max(take - 10, 0);
        self.dmg_inflictor = inflictor;
 
-       if (self.health <= -75 && self.modelindex != 0)
+       if (self.health <= -100 && self.modelindex != 0)
        {
                // don't use any animations as a gib
                self.frame = 0;
@@ -633,12 +591,12 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                Obituary (attacker, inflictor, self, deathtype);
                race_PreDie();
                DropAllRunes(self);
-               if(self == attacker)
-                       kh_Key_DropAll(self, TRUE);
-               else if(attacker.classname == "player" || attacker.classname == "gib")
-                       kh_Key_DropAll(self, FALSE);
-               else
-                       kh_Key_DropAll(self, TRUE);
+
+               frag_attacker = attacker;
+               frag_inflictor = inflictor;
+               frag_target = self;
+               MUTATOR_CALLHOOK(PlayerDies);
+
                if(self.flagcarried)
                {
                        if(attacker.classname != "player" && attacker.classname != "gib")
@@ -664,6 +622,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                self.movetype = MOVETYPE_TOSS;
                // shootable corpse
                self.solid = SOLID_CORPSE;
+               self.ballistics_density = cvar("g_ballistics_density_corpse");
                // don't stick to the floor
                self.flags &~= FL_ONGROUND;
                // dying animation
@@ -886,14 +845,20 @@ void UpdateSelectedPlayer()
 }
 
 .float muted; // to be used by prvm_edictset server playernumber muted 1
-void Say(entity source, float teamsay, entity privatesay, string msgin, float floodcontrol)
+float Say(entity source, float teamsay, entity privatesay, string msgin, float floodcontrol)
+// message "": do not say, just test flood control
+// return value:
+//   1 = accept
+//   0 = reject
+//  -1 = fake accept
 {
        string msgstr, colorstr, cmsgstr, namestr, fullmsgstr, sourcemsgstr, fullcmsgstr, sourcecmsgstr, privatemsgprefix;
        float flood, privatemsgprefixlen;
        entity head;
+       float ret;
 
        if(Ban_MaybeEnforceBan(source))
-               return;
+               return 0;
 
        if(!teamsay && !privatesay)
                if(substring(msgin, 0, 1) == " ")
@@ -901,9 +866,6 @@ void Say(entity source, float teamsay, entity privatesay, string msgin, float fl
 
        msgin = formatmessage(msgin);
 
-       if(msgin == "")
-               return;
-
        if(source.classname != "player")
                colorstr = "^0"; // black for spectators
        else if(teams_matter)
@@ -914,9 +876,8 @@ void Say(entity source, float teamsay, entity privatesay, string msgin, float fl
        if(intermission_running)
                teamsay = FALSE;
 
-       msgin = trigger_magicear_processmessage_forallears(source, teamsay, privatesay, msgin);
-       if(msgin == "")
-               return;
+       if(msgin != "")
+               msgin = trigger_magicear_processmessage_forallears(source, teamsay, privatesay, msgin);
 
        /*
         * using bprint solves this... me stupid
@@ -934,29 +895,36 @@ void Say(entity source, float teamsay, entity privatesay, string msgin, float fl
        else
                namestr = source.netname;
 
-       if(privatesay)
+       if(msgin != "")
        {
-               msgstr = strcat("\{1}\{13}* ^3", namestr, "^3 tells you: ^7");
-               privatemsgprefixlen = strlen(msgstr);
-               msgstr = strcat(msgstr, msgin);
-               cmsgstr = strcat(colorstr, "^3", namestr, "^3 tells you:\n^7", msgin);
-               if(cvar("g_chat_teamcolors"))
-                       privatemsgprefix = strcat("\{1}\{13}* ^3You tell ", playername(privatesay), ": ^7");
+               if(privatesay)
+               {
+                       msgstr = strcat("\{1}\{13}* ^3", namestr, "^3 tells you: ^7");
+                       privatemsgprefixlen = strlen(msgstr);
+                       msgstr = strcat(msgstr, msgin);
+                       cmsgstr = strcat(colorstr, "^3", namestr, "^3 tells you:\n^7", msgin);
+                       if(cvar("g_chat_teamcolors"))
+                               privatemsgprefix = strcat("\{1}\{13}* ^3You tell ", playername(privatesay), ": ^7");
+                       else
+                               privatemsgprefix = strcat("\{1}\{13}* ^3You tell ", privatesay.netname, ": ^7");
+               }
+               else if(teamsay)
+               {
+                       msgstr = strcat("\{1}\{13}", colorstr, "(^3", namestr, colorstr, ") ^7", msgin);
+                       cmsgstr = strcat(colorstr, "(^3", namestr, colorstr, ")\n^7", msgin);
+               }
                else
-                       privatemsgprefix = strcat("\{1}\{13}* ^3You tell ", privatesay.netname, ": ^7");
-       }
-       else if(teamsay)
-       {
-               msgstr = strcat("\{1}\{13}", colorstr, "(^3", namestr, colorstr, ") ^7", msgin);
-               cmsgstr = strcat(colorstr, "(^3", namestr, colorstr, ")\n^7", msgin);
+               {
+                       msgstr = strcat("\{1}", namestr, "^7: ", msgin);
+                       cmsgstr = "";
+               }
+               msgstr = strcat(strreplace("\n", " ", msgstr), "\n"); // newlines only are good for centerprint
        }
        else
        {
-               msgstr = strcat("\{1}", namestr, "^7: ", msgin);
-               cmsgstr = "";
+               msgstr = cmsgstr = "";
        }
 
-       msgstr = strcat(strreplace("\n", " ", msgstr), "\n"); // newlines only are good for centerprint
        fullmsgstr = msgstr;
        fullcmsgstr = cmsgstr;
 
@@ -994,37 +962,47 @@ void Say(entity source, float teamsay, entity privatesay, string msgin, float fl
                // to match explanation in default.cfg, a value of 3 must allow three-line bursts and not four!
 
                // do flood control for the default line size
-               getWrappedLine_remaining = msgstr;
-               msgstr = "";
-               lines = 0;
-               while(getWrappedLine_remaining && (!flood_lmax || lines <= flood_lmax))
+               if(msgstr != "")
                {
-                       msgstr = strcat(msgstr, " ", getWrappedLineLen(82.4289758859709, strlennocol)); // perl averagewidth.pl < gfx/vera-sans.width
-                       ++lines;
-               }
-               msgstr = substring(msgstr, 1, strlen(msgstr) - 1);
+                       getWrappedLine_remaining = msgstr;
+                       msgstr = "";
+                       lines = 0;
+                       while(getWrappedLine_remaining && (!flood_lmax || lines <= flood_lmax))
+                       {
+                               msgstr = strcat(msgstr, " ", getWrappedLineLen(82.4289758859709, strlennocol)); // perl averagewidth.pl < gfx/vera-sans.width
+                               ++lines;
+                       }
+                       msgstr = substring(msgstr, 1, strlen(msgstr) - 1);
 
-               if(getWrappedLine_remaining != "")
-               {
-                       msgstr = strcat(msgstr, "\n");
-                       flood = 2;
-               }
+                       if(getWrappedLine_remaining != "")
+                       {
+                               msgstr = strcat(msgstr, "\n");
+                               flood = 2;
+                       }
 
-               if(time >= source.flood_field)
-               {
-                       source.flood_field = max(time - flood_burst * flood_spl, source.flood_field) + lines * flood_spl;
+                       if(time >= source.flood_field)
+                       {
+                               source.flood_field = max(time - flood_burst * flood_spl, source.flood_field) + lines * flood_spl;
+                       }
+                       else
+                       {
+                               flood = 1;
+                               msgstr = fullmsgstr;
+                       }
                }
                else
                {
-                       flood = 1;
-                       msgstr = fullmsgstr;
+                       if(time >= source.flood_field)
+                               source.flood_field = max(time - flood_burst * flood_spl, source.flood_field) + flood_spl;
+                       else
+                               flood = 1;
                }
        }
 
        if (timeoutStatus == 2) //when game is paused, no flood protection
                source.flood_field = flood = 0;
 
-       if(flood == 2)
+       if(flood == 2) // cannot happen for empty msgstr
        {
                if(cvar("g_chat_flood_notify_flooder"))
                {
@@ -1061,57 +1039,70 @@ void Say(entity source, float teamsay, entity privatesay, string msgin, float fl
        if(source.muted)
        {
                // always fake the message
-               sprint(source, sourcemsgstr);
-               if(cmsgstr != "" && !privatesay)
-                       centerprint(source, sourcecmsgstr);
+               ret = -1;
        }
        else if(flood == 1)
        {
                if(cvar("g_chat_flood_notify_flooder"))
-                       sprint(source, strcat("^3FLOOD CONTROL: ^7wait ^1", ftos(source.flood_field - time), "^3 seconds\n"));
-               else
                {
-                       sprint(source, sourcemsgstr);
-                       if(cmsgstr != "" && !privatesay)
-                               centerprint(source, sourcecmsgstr);
+                       sprint(source, strcat("^3FLOOD CONTROL: ^7wait ^1", ftos(source.flood_field - time), "^3 seconds\n"));
+                       ret = 0;
                }
+               else
+                       ret = -1;
        }
-       else if(privatesay)
-       {
-               sprint(source, sourcemsgstr);
-               sprint(privatesay, msgstr);
-               if(cmsgstr != "")
-                       centerprint(privatesay, cmsgstr);
-       }
-       else if(teamsay > 0)
-       {
-               sprint(source, sourcemsgstr);
-               if(sourcecmsgstr != "")
-                       centerprint(source, sourcecmsgstr);
-               FOR_EACH_REALPLAYER(head) if(head.team == source.team)
-                       if(head != source)
-                       {
-                               sprint(head, msgstr);
-                               if(cmsgstr != "")
-                                       centerprint(head, cmsgstr);
-                       }
-       }
-       else if(teamsay < 0)
+       else
        {
-               sprint(source, sourcemsgstr);
-               FOR_EACH_REALCLIENT(head) if(head.classname != "player")
-                       if(head != source)
-                               sprint(head, msgstr);
+               ret = 1;
        }
-       else if(sourcemsgstr != msgstr)
+
+       if(sourcemsgstr != "" && ret != 0)
        {
-               sprint(source, sourcemsgstr);
-               FOR_EACH_REALCLIENT(head)
-                       if(head != source)
-                               sprint(head, msgstr);
+               if(ret < 0) // fake
+               {
+                       sprint(source, sourcemsgstr);
+                       if(sourcecmsgstr != "" && !privatesay)
+                               centerprint(source, sourcecmsgstr);
+               }
+               else if(privatesay)
+               {
+                       sprint(source, sourcemsgstr);
+                       sprint(privatesay, msgstr);
+                       if(cmsgstr != "")
+                               centerprint(privatesay, cmsgstr);
+               }
+               else if(teamsay > 0)
+               {
+                       sprint(source, sourcemsgstr);
+                       if(sourcecmsgstr != "")
+                               centerprint(source, sourcecmsgstr);
+                       FOR_EACH_REALPLAYER(head) if(head.team == source.team)
+                               if(head != source)
+                               {
+                                       sprint(head, msgstr);
+                                       if(cmsgstr != "")
+                                               centerprint(head, cmsgstr);
+                               }
+               }
+               else if(teamsay < 0)
+               {
+                       sprint(source, sourcemsgstr);
+                       FOR_EACH_REALCLIENT(head) if(head.classname != "player")
+                               if(head != source)
+                                       sprint(head, msgstr);
+               }
+               else if(sourcemsgstr != msgstr)
+               {
+                       sprint(source, sourcemsgstr);
+                       FOR_EACH_REALCLIENT(head)
+                               if(head != source)
+                                       sprint(head, msgstr);
+               }
+               else
+                       bprint(msgstr);
        }
-       else
-               bprint(msgstr);
+
+       return ret;
 }
 
 float GetVoiceMessageVoiceType(string type)
@@ -1212,7 +1203,10 @@ void LoadPlayerSounds(string f, float first)
        var .string field;
        fh = fopen(f, FILE_READ);
        if(fh < 0)
+       {
+               dprint("Player sound file not found: ", f, "\n");
                return;
+       }
        while((s = fgets(fh)))
        {
                if(tokenize_console(s) != 3)
@@ -1233,14 +1227,92 @@ void LoadPlayerSounds(string f, float first)
 }
 
 .float modelindex_for_playersound;
+.float skinindex_for_playersound;
 void UpdatePlayerSounds()
 {
        if(self.modelindex == self.modelindex_for_playersound)
+       if(self.skinindex == self.skinindex_for_playersound)
                return;
        self.modelindex_for_playersound = self.modelindex;
+       self.skinindex_for_playersound = self.skinindex;
        ClearPlayerSounds();
        LoadPlayerSounds("sound/player/default.sounds", 1);
-       LoadPlayerSounds(strcat(self.model, ".sounds"), 0);
+       LoadPlayerSounds(get_model_datafilename(self.playermodel, self.skinindex, "sounds"), 0);
+}
+
+void FakeGlobalSound(string sample, float chan, float voicetype)
+{
+       float n;
+       float tauntrand;
+
+       if(sample == "")
+               return;
+
+       tokenize_console(sample);
+       n = stof(argv(1));
+       if(n > 0)
+               sample = strcat(argv(0), ftos(floor(random() * n + 1)), ".wav"); // randomization
+       else
+               sample = strcat(argv(0), ".wav"); // randomization
+
+       switch(voicetype)
+       {
+               case VOICETYPE_LASTATTACKER_ONLY:
+                       break;
+               case VOICETYPE_LASTATTACKER:
+                       if(self.pusher)
+                       {
+                               msg_entity = self;
+                               if(clienttype(msg_entity) == CLIENTTYPE_REAL)
+                                       soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
+                       }
+                       break;
+               case VOICETYPE_TEAMRADIO:
+                       msg_entity = self;
+                       if(msg_entity.cvar_cl_voice_directional == 1)
+                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
+                       else
+                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
+                       break;
+               case VOICETYPE_AUTOTAUNT:
+                       if(!sv_autotaunt)
+                               break;
+                       if(!sv_taunt)
+                               break;
+                       if(sv_gentle)
+                               break;
+                       tauntrand = random();
+                       msg_entity = self;
+                       if (tauntrand < msg_entity.cvar_cl_autotaunt)
+                       {
+                               if (msg_entity.cvar_cl_voice_directional >= 1)
+                                       soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, bound(ATTN_MIN, msg_entity.cvar_cl_voice_directional_taunt_attenuation, ATTN_MAX));
+                               else
+                                       soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
+                       }
+                       break;
+               case VOICETYPE_TAUNT:
+                       if(self.classname == "player")
+                               if(self.deadflag == DEAD_NO)
+                                       setanim(self, self.anim_taunt, FALSE, TRUE, TRUE);
+                       if(!sv_taunt)
+                               break;
+                       if(sv_gentle)
+                               break;
+                       msg_entity = self;
+                       if (msg_entity.cvar_cl_voice_directional >= 1)
+                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, bound(ATTN_MIN, msg_entity.cvar_cl_voice_directional_taunt_attenuation, ATTN_MAX));
+                       else
+                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
+                       break;
+               case VOICETYPE_PLAYERSOUND:
+                       msg_entity = self;
+                       soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NORM);
+                       break;
+               default:
+                       backtrace("Invalid voice type!");
+                       break;
+       }
 }
 
 void GlobalSound(string sample, float chan, float voicetype)
@@ -1262,34 +1334,32 @@ void GlobalSound(string sample, float chan, float voicetype)
        {
                case VOICETYPE_LASTATTACKER_ONLY:
                        if(self.pusher)
-                               if(self.pusher.team == self.team)
+                       {
+                               msg_entity = self.pusher;
+                               if(clienttype(msg_entity) == CLIENTTYPE_REAL)
                                {
-                                       msg_entity = self.pusher;
-                                       if(clienttype(msg_entity) == CLIENTTYPE_REAL)
-                                       {
-                                               if(msg_entity.cvar_cl_voice_directional == 1)
-                                                       soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
-                                               else
-                                                       soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
-                                       }
+                                       if(msg_entity.cvar_cl_voice_directional == 1)
+                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
+                                       else
+                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
                                }
+                       }
                        break;
                case VOICETYPE_LASTATTACKER:
                        if(self.pusher)
-                               if(self.pusher.team == self.team)
+                       {
+                               msg_entity = self.pusher;
+                               if(clienttype(msg_entity) == CLIENTTYPE_REAL)
                                {
-                                       msg_entity = self.pusher;
-                                       if(clienttype(msg_entity) == CLIENTTYPE_REAL)
-                                       {
-                                               if(msg_entity.cvar_cl_voice_directional == 1)
-                                                       soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
-                                               else
-                                                       soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
-                                       }
-                                       msg_entity = self;
-                                       if(clienttype(msg_entity) == CLIENTTYPE_REAL)
-                                               soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
+                                       if(msg_entity.cvar_cl_voice_directional == 1)
+                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_MIN);
+                                       else
+                                               soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
                                }
+                               msg_entity = self;
+                               if(clienttype(msg_entity) == CLIENTTYPE_REAL)
+                                       soundto(MSG_ONE, self, chan, sample, VOL_BASE, ATTN_NONE);
+                       }
                        break;
                case VOICETYPE_TEAMRADIO:
                        FOR_EACH_REALCLIENT(msg_entity)
@@ -1333,6 +1403,7 @@ void GlobalSound(string sample, float chan, float voicetype)
                                else
                                        soundto(MSG_ONE, self, chan, sample, VOL_BASEVOICE, ATTN_NONE);
                        }
+                       break;
                case VOICETYPE_PLAYERSOUND:
                        sound(self, chan, sample, VOL_BASE, ATTN_NORM);
                        break;
@@ -1344,15 +1415,14 @@ void GlobalSound(string sample, float chan, float voicetype)
 
 void PlayerSound(.string samplefield, float chan, float voicetype)
 {
-       string sample;
-       sample = self.samplefield;
-       GlobalSound(sample, chan, voicetype);
+       GlobalSound(self.samplefield, chan, voicetype);
 }
 
 void VoiceMessage(string type, string msg)
 {
        var .string sample;
-       var float voicetype, ownteam;
+       float voicetype, ownteam;
+       float flood;
        sample = GetVoiceMessageSampleField(type);
 
        if(GetPlayerSoundSampleField_notFound)
@@ -1364,35 +1434,12 @@ void VoiceMessage(string type, string msg)
        voicetype = GetVoiceMessageVoiceType(type);
        ownteam = (voicetype == VOICETYPE_TEAMRADIO);
 
-       float flood;
-       float flood_spv;
-       var .float flood_field;
-
-       flood = 0;
-       if(ownteam)
-       {
-               flood_spv = cvar("g_voice_flood_spv_team");
-               flood_field = floodcontrol_voiceteam;
-       }
-       else
-       {
-               flood_spv = cvar("g_voice_flood_spv");
-               flood_field = floodcontrol_voice;
-       }
-
-       if(time >= self.flood_field)
-               self.flood_field = max(time, self.flood_field) + flood_spv;
-       else
-               flood = 1;
-
-       if (timeoutStatus == 2) //when game is paused, no flood protection
-               self.flood_field = flood = 0;
-
-       if (msg != "")
-               Say(self, ownteam, world, msg, 0);
+       flood = Say(self, ownteam, world, msg, 1);
 
-       if (!flood)
-               PlayerSound(sample, CHAN_VOICE, voicetype);
+       if (flood > 0)
+               GlobalSound(self.sample, CHAN_VOICE, voicetype);
+       else if (flood < 0)
+               FakeGlobalSound(self.sample, CHAN_VOICE, voicetype);
 }
 
 void MoveToTeam(entity client, float team_colour, float type, float show_message)
index 4a1281424e39eb8b51c993e3d6460318cf5b9f33..04b656c9a134e0daf0ee956dff64e7dd5251b753 100644 (file)
@@ -12,6 +12,8 @@ void W_SwitchWeapon(float imp)
        {
                if (client_hasweapon(self, imp, TRUE, TRUE))
                        W_SwitchWeapon_Force(self, imp);
+               else
+                       self.selectweapon = imp; // update selectweapon ANYWAY
        }
        else
        {
@@ -20,7 +22,7 @@ void W_SwitchWeapon(float imp)
 };
 
 .float weaponcomplainindex;
-float W_GetCycleWeapon(entity pl, string weaponorder, float dir, float imp, float complain)
+float W_GetCycleWeapon(entity pl, string weaponorder, float dir, float imp, float complain, float skipmissing)
 {
        // We cannot tokenize in this function, as GiveItems calls this
        // function. Thus we must use car/cdr.
@@ -28,6 +30,12 @@ float W_GetCycleWeapon(entity pl, string weaponorder, float dir, float imp, floa
        string rest;
        switchtonext = switchtolast = 0;
        first_valid = prev_valid = 0;
+       float weaponcur;
+
+       if(skipmissing || pl.selectweapon == 0)
+               weaponcur = pl.switchweapon;
+       else
+               weaponcur = pl.selectweapon;
 
        if(dir == 0)
                switchtonext = 1;
@@ -44,13 +52,13 @@ float W_GetCycleWeapon(entity pl, string weaponorder, float dir, float imp, floa
 
                ++c;
 
-               if(client_hasweapon(pl, weaponwant, TRUE, FALSE))
+               if(!skipmissing || client_hasweapon(pl, weaponwant, TRUE, FALSE))
                {
                        if(switchtonext)
                                return weaponwant;
                        if(!first_valid)
                                first_valid = weaponwant;
-                       if(weaponwant == pl.switchweapon)
+                       if(weaponwant == weaponcur)
                        {
                                if(dir >= 0)
                                        switchtonext = 1;
@@ -96,7 +104,7 @@ float W_GetCycleWeapon(entity pl, string weaponorder, float dir, float imp, floa
 void W_CycleWeapon(string weaponorder, float dir)
 {
        float w;
-       w = W_GetCycleWeapon(self, weaponorder, dir, -1, 1);
+       w = W_GetCycleWeapon(self, weaponorder, dir, -1, 1, TRUE);
        if(w > 0)
                W_SwitchWeapon(w);
 }
@@ -104,7 +112,7 @@ void W_CycleWeapon(string weaponorder, float dir)
 void W_NextWeaponOnImpulse(float imp)
 {
        float w;
-       w = W_GetCycleWeapon(self, self.cvar_cl_weaponpriority, +1, imp, 1);
+       w = W_GetCycleWeapon(self, self.cvar_cl_weaponpriority, +1, imp, 1, (self.cvar_cl_weaponimpulsemode == 0));
        if(w > 0)
                W_SwitchWeapon(w);
 }
@@ -145,7 +153,7 @@ string W_FixWeaponOrder_ForceComplete(string order)
 
 float w_getbestweapon(entity e)
 {
-       return W_GetCycleWeapon(e, e.cvar_cl_weaponpriority, 0, -1, 0);
+       return W_GetCycleWeapon(e, e.cvar_cl_weaponpriority, 0, -1, FALSE, TRUE);
 };
 
 // generic weapons table
@@ -267,12 +275,12 @@ void W_ThrowWeapon(vector velo, vector delta, float doreduce)
        w = self.weapon;
        if (w == 0)
                return; // just in case
+       if(MUTATOR_CALLHOOK(ForbidThrowCurrentWeapon))
+               return;
        if (g_weaponarena)
                return;
        if (g_lms)
                return;
-       if (g_nixnex)
-               return;
        if (g_nexball && w == WEP_GRENADE_LAUNCHER)
                return;
        if (!cvar("g_pickup_items"))
@@ -285,6 +293,8 @@ void W_ThrowWeapon(vector velo, vector delta, float doreduce)
                return;
        if(!W_IsWeaponThrowable(w))
                return;
+       if(self.weaponentity.state != WS_READY)
+               return;
 
        wb = W_WeaponBit(w);
        if(self.weapons & wb != wb)
@@ -425,131 +435,3 @@ void W_WeaponFrame()
                self.currentammo = 1;
 #endif
 };
-
-float nixnex_weapon;
-float nixnex_weapon_ammo;
-float nixnex_nextchange;
-float nixnex_nextweapon;
-float nixnex_nextweapon_ammo;
-.float nixnex_lastchange_id;
-.float nixnex_lastinfotime;
-.float nixnex_nextincr;
-
-float NixNex_CanChooseWeapon(float wpn)
-{
-       entity e;
-       e = get_weaponinfo(wpn);
-       if(!e.weapons) // skip dummies
-               return FALSE;
-       if(g_weaponarena)
-       {
-               if not(g_weaponarena & e.weapons)
-                       return FALSE;
-       }
-       else
-       {
-               if(wpn == WEP_LASER && g_nixnex_with_laser)
-                       return FALSE;
-               if not(e.spawnflags & WEP_FLAG_NORMAL)
-                       return FALSE;
-       }
-       return TRUE;
-}
-void Nixnex_ChooseNextWeapon()
-{
-       float j;
-       RandomSelection_Init();
-       for(j = WEP_FIRST; j <= WEP_LAST; ++j)
-               if(NixNex_CanChooseWeapon(j))
-                       RandomSelection_Add(world, j, string_null, 1, (j != nixnex_weapon));
-       nixnex_nextweapon = RandomSelection_chosen_float;
-       nixnex_nextweapon_ammo = W_AmmoItemCode(nixnex_nextweapon);
-}
-
-void Nixnex_GiveCurrentWeapon()
-{
-       float dt;
-       if(g_nixnex)
-       {
-               if(!nixnex_nextweapon)
-                       Nixnex_ChooseNextWeapon();
-
-               dt = ceil(nixnex_nextchange - time);
-
-               if(dt <= 0)
-               {
-                       nixnex_weapon = nixnex_nextweapon;
-                       nixnex_weapon_ammo = nixnex_nextweapon_ammo;
-                       nixnex_nextweapon = 0;
-                       nixnex_nextchange = time + cvar("g_balance_nixnex_roundtime");
-                       //weapon_action(nixnex_weapon, WR_PRECACHE); // forget it, too slow
-               }
-               
-               if(nixnex_nextchange != self.nixnex_lastchange_id) // this shall only be called once per round!
-               {
-                       self.nixnex_lastchange_id = nixnex_nextchange;
-                       if (self.items & IT_UNLIMITED_WEAPON_AMMO)
-                       {
-                               self.ammo_shells = (nixnex_weapon_ammo & IT_SHELLS) ?
-                                       cvar("g_pickup_shells_max") : 0;
-                               self.ammo_nails = (nixnex_weapon_ammo & IT_NAILS) ?
-                                       cvar("g_pickup_nails_max") : 0;
-                               self.ammo_rockets = (nixnex_weapon_ammo & IT_ROCKETS) ?
-                                       cvar("g_pickup_rockets_max") : 0;
-                               self.ammo_cells = (nixnex_weapon_ammo & IT_CELLS) ?
-                                       cvar("g_pickup_cells_max") : 0;
-                               self.ammo_fuel = (nixnex_weapon_ammo & IT_FUEL) ?
-                                       cvar("g_pickup_fuel_max") : 0;
-                       }
-                       else
-                       {
-                               self.ammo_shells = (nixnex_weapon_ammo & IT_SHELLS) ?
-                                       cvar("g_balance_nixnex_ammo_shells") : 0;
-                               self.ammo_nails = (nixnex_weapon_ammo & IT_NAILS) ?
-                                       cvar("g_balance_nixnex_ammo_nails") : 0;
-                               self.ammo_rockets = (nixnex_weapon_ammo & IT_ROCKETS) ?
-                                       cvar("g_balance_nixnex_ammo_rockets") : 0;
-                               self.ammo_cells = (nixnex_weapon_ammo & IT_CELLS) ?
-                                       cvar("g_balance_nixnex_ammo_cells") : 0;
-                               self.ammo_fuel = (nixnex_weapon_ammo & IT_FUEL) ?
-                                       cvar("g_balance_nixnex_ammo_fuel") : 0;
-                       }
-                       self.nixnex_nextincr = time + cvar("g_balance_nixnex_incrtime");
-                       if(dt >= 1 && dt <= 5)
-                               self.nixnex_lastinfotime = -42;
-                       else
-                               centerprint(self, strcat("\n\n^2Active weapon: ^3", W_Name(nixnex_weapon)));
-               }
-               if(self.nixnex_lastinfotime != dt)
-               {
-                       self.nixnex_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(nixnex_nextweapon), "\n"));
-               }
-
-               if(!(self.items & IT_UNLIMITED_WEAPON_AMMO) && time > self.nixnex_nextincr)
-               {
-                       if (nixnex_weapon_ammo & IT_SHELLS)
-                               self.ammo_shells = self.ammo_shells + cvar("g_balance_nixnex_ammoincr_shells");
-                       else if (nixnex_weapon_ammo & IT_NAILS)
-                               self.ammo_nails = self.ammo_nails + cvar("g_balance_nixnex_ammoincr_nails");
-                       else if (nixnex_weapon_ammo & IT_ROCKETS)
-                               self.ammo_rockets = self.ammo_rockets + cvar("g_balance_nixnex_ammoincr_rockets");
-                       else if (nixnex_weapon_ammo & IT_CELLS)
-                               self.ammo_cells = self.ammo_cells + cvar("g_balance_nixnex_ammoincr_cells");
-                       if (nixnex_weapon_ammo & IT_FUEL) // hook uses cells and fuel
-                               self.ammo_fuel = self.ammo_fuel + cvar("g_balance_nixnex_ammoincr_fuel");
-                       self.nixnex_nextincr = time + cvar("g_balance_nixnex_incrtime");
-               }
-
-               self.weapons = 0;
-               if(g_nixnex_with_laser)
-                       self.weapons = self.weapons | WEPBIT_LASER;
-               self.weapons = self.weapons | W_WeaponBit(nixnex_weapon);
-
-               if(self.switchweapon != nixnex_weapon)
-                       if(!client_hasweapon(self, self.switchweapon, TRUE, FALSE))
-                               if(client_hasweapon(self, nixnex_weapon, TRUE, FALSE))
-                                       W_SwitchWeapon(nixnex_weapon);
-       }
-}
index e7bfc69d0546115d875b0f2502579c20bcafe472..15898759ede6b82578b755a365ecebcda5a1cc36 100644 (file)
@@ -36,6 +36,7 @@ void W_SwitchWeapon_Force(entity e, float w)
 {
        e.cnt = e.switchweapon;
        e.switchweapon = w;
+       e.selectweapon = w;
 }
 
 .float antilag_debug;
@@ -439,8 +440,8 @@ void CL_Weaponentity_Think()
                        }
                        else
                        {
-                               setmodel(self, strcat("models/weapons/h_", self.owner.weaponname, ".dpm")); // precision set below
-                               animfilename = strcat("models/weapons/h_", self.owner.weaponname, ".dpm.animinfo");
+                               setmodel(self, strcat("models/weapons/h_", self.owner.weaponname, ".iqm")); // precision set below
+                               animfilename = strcat("models/weapons/h_", self.owner.weaponname, ".iqm.animinfo");
                                animfile = fopen(animfilename, FILE_READ);
                                // preset some defaults that work great for renamed zym files (which don't need an animinfo)
                                self.anim_fire1  = '0 1 0.01';
@@ -1030,29 +1031,39 @@ void weapon_setup(float windex)
 };
 
 // perform weapon to attack (weaponstate and attack_finished check is here)
+void W_SwitchToOtherWeapon(entity pl)
+{
+       // hack to ensure it switches to an OTHER weapon (in case the other fire mode still has ammo, we want that anyway)
+       float w, ww;
+       w = W_WeaponBit(pl.weapon);
+       pl.weapons &~= w;
+       ww = w_getbestweapon(pl);
+       pl.weapons |= w;
+       if(ww)
+               W_SwitchWeapon_Force(pl, ww);
+}
+float weapon_prepareattack_checkammo(float secondary)
+{
+       if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+       if (!weapon_action(self.weapon, WR_CHECKAMMO1 + secondary))
+       {
+               W_SwitchToOtherWeapon(self);
+               return FALSE;
+       }
+       return TRUE;
+}
 .float race_penalty;
-float weapon_prepareattack(float secondary, float attacktime)
+float weapon_prepareattack_check(float secondary, float attacktime)
 {
+       if(!weapon_prepareattack_checkammo(secondary))
+               return FALSE;
+
        //if sv_ready_restart_after_countdown is set, don't allow the player to shoot
        //if all players readied up and the countdown is running
        if(time < game_starttime || time < self.race_penalty) {
                return FALSE;
        }
 
-       if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-       if (!weapon_action(self.weapon, WR_CHECKAMMO1 + secondary))
-       {
-               // hack to ensure it switches to an OTHER weapon (in case the other fire mode still has ammo, we want that anyway)
-               float w, ww;
-               w = W_WeaponBit(self.weapon);
-               self.weapons &~= w;
-               ww = w_getbestweapon(self);
-               self.weapons |= w;
-               if(ww)
-                       W_SwitchWeapon_Force(self, ww);
-               return FALSE;
-       }
-
        if (timeoutStatus == 2) //don't allow the player to shoot while game is paused
                return FALSE;
 
@@ -1069,6 +1080,11 @@ float weapon_prepareattack(float secondary, float attacktime)
                if (self.weaponentity.state != WS_READY)
                        return FALSE;
        }
+
+       return TRUE;
+}
+float weapon_prepareattack_do(float secondary, float attacktime)
+{
        self.weaponentity.state = WS_INUSE;
 
        self.spawnshieldtime = min(self.spawnshieldtime, time); // kill spawn shield when you fire
@@ -1086,7 +1102,17 @@ float weapon_prepareattack(float secondary, float attacktime)
        self.bulletcounter += 1;
        //dprint("attack finished ", ftos(ATTACK_FINISHED(self)), "\n");
        return TRUE;
-};
+}
+float weapon_prepareattack(float secondary, float attacktime)
+{
+       if(weapon_prepareattack_check(secondary, attacktime))
+       {
+               weapon_prepareattack_do(secondary, attacktime);
+               return TRUE;
+       }
+       else
+               return FALSE;
+}
 
 void weapon_thinkf(float fr, float t, void() func)
 {
index 8fc949fa412f49ea70263db21c7f5066ef9a55a8..ff5794dae989397d202294c1641844ee7b678e57 100644 (file)
@@ -225,7 +225,6 @@ void SV_ParseClientCommand(string s) {
                                DropFlag(self.flagcarried, world, world);
                        if(self.ballcarried)
                                DropBall(self.ballcarried, self.origin, self.velocity);
-                       kh_Key_DropAll(self, TRUE);
                        WaypointSprite_PlayerDead();
                        self.classname = "observer";
                        if(g_ca)
index e585b1e37900497737a4800e9f5e5192588a7b50..d250d39def5f523e1a57bb775731128aa04fb7e0 100644 (file)
@@ -4,8 +4,8 @@ float CSQCProjectile_SendEntity(entity to, float sf)
 {
        float ft, fr;
 
-       // note: flag 0x10 = no trail please
-       sf = sf & 0x1F;
+       // note: flag 0x08 = no trail please (teleport bit)
+       sf = sf & 0x0F;
 
        if(self.csqcprojectile_clientanimate)
                sf |= 0x80; // client animated, not interpolated
@@ -21,6 +21,9 @@ float CSQCProjectile_SendEntity(entity to, float sf)
                        sf |= 0x20;
        }
 
+       if(self.gravity != 0)
+               sf |= 0x10;
+
        WriteByte(MSG_ENTITY, ENT_CLIENT_PROJECTILE);
        WriteByte(MSG_ENTITY, sf);
 
@@ -35,7 +38,8 @@ float CSQCProjectile_SendEntity(entity to, float sf)
                        WriteCoord(MSG_ENTITY, self.velocity_x);
                        WriteCoord(MSG_ENTITY, self.velocity_y);
                        WriteCoord(MSG_ENTITY, self.velocity_z);
-                       WriteCoord(MSG_ENTITY, self.gravity);
+                       if(sf & 0x10)
+                               WriteCoord(MSG_ENTITY, self.gravity);
                }
 
                if(sf & 0x20)
@@ -85,7 +89,7 @@ void UpdateCSQCProjectile(entity e)
        if(e.SendEntity == CSQCProjectile_SendEntity)
        {
                // send new origin data
-               e.SendFlags |= 1;
+               e.SendFlags |= 0x01;
        }
 }
 
@@ -93,8 +97,10 @@ void UpdateCSQCProjectileAfterTeleport(entity e)
 {
        if(e.SendEntity == CSQCProjectile_SendEntity)
        {
-               // send new origin data and mark as teleported
-               e.SendFlags |= 0x11;
+               // send new origin data
+               e.SendFlags |= 0x01;
+               // mark as teleported
+               e.SendFlags |= 0x08;
        }
 }
 
index bc9e300ebf77dfa94c61880b6eba6aeb83f9ee09..4d701772434caba1f8b589f5179f227e51b1d461 100644 (file)
@@ -18,7 +18,7 @@ float require_spawnfunc_prefix; // if this float exists, only functions with spa
 float ctf_score_value(string parameter);
 
 float g_dm, g_domination, g_ctf, g_tdm, g_keyhunt, g_onslaught, g_assault, g_arena, g_ca, g_lms, g_runematch, g_race, g_nexball, g_cts;
-float g_cloaked, g_footsteps, g_jump_grunt, g_grappling_hook, g_laserguided_missile, g_midair, g_minstagib, g_nixnex, g_nixnex_with_laser, g_pinata, g_norecoil, g_vampire, g_minstagib_invis_alpha, g_bloodloss;
+float g_cloaked, g_footsteps, g_jump_grunt, g_grappling_hook, g_laserguided_missile, g_midair, g_minstagib, g_pinata, g_norecoil, g_vampire, g_minstagib_invis_alpha, g_bloodloss;
 float g_warmup_limit;
 float g_warmup_allguns;
 float g_warmup_allow_timeout;
@@ -505,6 +505,7 @@ void UpdatePlayerSounds();
 void ClearPlayerSounds();
 void PlayerSound(.string samplefield, float channel, float voicetype);
 void GlobalSound(string samplestring, float channel, float voicetype);
+void FakeGlobalSound(string samplestring, float channel, float voicetype);
 void VoiceMessage(string type, string message);
 
 // autotaunt system
@@ -533,6 +534,10 @@ string cvar_changes;
 float game_starttime; //point in time when the countdown is over
 .float stat_game_starttime;
 
+.float stat_sv_airaccel_qw;
+.float stat_sv_airstrafeaccel_qw;
+.float stat_sv_airspeedlimit_nonqw;
+
 void W_Porto_Remove (entity p);
 
 .float projectiledeathtype;
@@ -637,3 +642,8 @@ string deathmessage;
 
 .float cvar_cl_accuracy_data_share;
 .float cvar_cl_accuracy_data_receive;
+
+.float cvar_cl_weaponimpulsemode;
+.float selectweapon; // last selected weapon of the player
+
+.float ballistics_density; // wall piercing factor, larger = bullet can pass through more
index f73259cf9c13bcb42090f80bfae183f5a8c400bd..18119546c63d1b82d5bd6a188961647d98f39968 100644 (file)
@@ -177,7 +177,7 @@ float   EF_RED          = 128;
 
 //DP_EF_RESTARTANIM_BIT
 //idea: id software
-//darkplaces implementation: div0
+//darkplaces implementation: divVerent
 //effects bit:
 float   EF_RESTARTANIM_BIT = 1048576;
 //description:
@@ -195,7 +195,7 @@ float   EF_STARDUST     = 2048;
 
 //DP_EF_TELEPORT_BIT
 //idea: id software
-//darkplaces implementation: div0
+//darkplaces implementation: divVerent
 //effects bit:
 float   EF_TELEPORT_BIT = 2097152;
 //description:
@@ -517,7 +517,7 @@ void(entity e, entity tagentity, string tagname) setattachment = #443; // attach
 
 //DP_NULL_MODEL
 //idea: Chris
-//darkplaces implementation: div0
+//darkplaces implementation: divVerent
 //definitions:
 //string dp_null_model = "null";
 //description:
@@ -561,8 +561,8 @@ float(float a) tan = #475; // returns tangent value (which is simply sin(a)/cos(
 //note: atan2 can take unnormalized vectors (just like vectoyaw), and the function was included only for completeness (more often you want vectoyaw or vectoangles), atan2(v_x,v_y) * RAD2DEG gives the same result as vectoyaw(v)
 
 //DP_QC_AUTOCVARS
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //description:
 //allows QC variables to be bound to cvars
 //(works for float, string, vector types)
@@ -572,12 +572,10 @@ float(float a) tan = #475; // returns tangent value (which is simply sin(a)/cos(
 // string autocvar__cl_name;
 //NOTE: copying a string-typed autocvar to another variable/field, and then
 //changing the cvar or returning from progs is UNDEFINED. Writing to autocvar
-//globals is UNDEFINED.  Accessing autocvar globals after cvar_set()ing that
+//globals is UNDEFINED. Accessing autocvar globals after cvar_set()ing that
 //cvar is IMPLEMENTATION DEFINED (an implementation may either yield the
-//previous, or the current, value). Whether autocvar globals, after restoring
-//a savegame, have the cvar's current value, or the original value at time of
-//saving, is UNDEFINED. Restoring a savegame however must not restore the
-//cvar values themselves.
+//previous, or the current, value). Writing to an autocvar global is NOT
+//ALLOWED.
 //In case the cvar does NOT exist, then it is automatically created with the
 //value of the autocvar initializer, if given. This is possible with e.g.
 //frikqcc and fteqcc the following way:
@@ -615,8 +613,8 @@ string(string s) cvar_defstring = #482;
 //returns the default value of a cvar, as a tempstring.
 
 //DP_QC_CVAR_DESCRIPTION
-//idea: div0
-//DarkPlaces implementation: div0
+//idea: divVerent
+//DarkPlaces implementation: divVerent
 //builtin definitions:
 string(string name) cvar_description = #518;
 //description:
@@ -631,8 +629,8 @@ string(string s) cvar_string = #448;
 //returns the value of a cvar, as a tempstring.
 
 //DP_QC_CVAR_TYPE
-//idea: div0
-//DarkPlaces implementation: div0
+//idea: divVerent
+//DarkPlaces implementation: divVerent
 //builtin definitions:
 float(string name) cvar_type = #495;
 float CVAR_TYPEFLAG_EXISTS = 1;
@@ -694,8 +692,8 @@ string(entity ent) etos = #65;
 //prints "entity 1" or similar into a string. (this was a Q2 builtin)
 
 //DP_QC_EXTRESPONSEPACKET
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //builtin definitions:
 string(void) getextresponse = #624;
 //description:
@@ -713,8 +711,8 @@ entity(.string fld, string match) findchain = #402;
 //similar to find() but returns a chain of entities like findradius.
 
 //DP_QC_FINDCHAIN_TOFIELD
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //builtin definitions:
 entity(.string fld, float match, .entity tofield) findradius_tofield = #22;
 entity(.string fld, string match, .entity tofield) findchain_tofield = #402;
@@ -806,12 +804,13 @@ float SPA_LIGHTMAP0_TEXCOORDS = 5;
 float SPA_LIGHTMAP0_COLOR = 6;
 //builtin definitions:
 vector(entity e, float s, float n, float a) getsurfacepointattribute = #486;
+
 //description:
 //function to query extended information about a point on a certain surface
 
 //DP_QC_GETSURFACETRIANGLE
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //builtin definitions:
 float(entity e, float s) getsurfacenumtriangles = #628;
 vector(entity e, float s, float n) getsurfacetriangle = #629;
@@ -830,7 +829,7 @@ vector(entity ent, float tagindex) gettaginfo = #452;
 
 //DP_QC_GETTAGINFO_BONEPROPERTIES
 //idea: daemon
-//DarkPlaces implementation: div0
+//DarkPlaces implementation: divVerent
 //global definitions:
 float gettaginfo_parent;
 string gettaginfo_name;
@@ -846,7 +845,7 @@ vector gettaginfo_up;
 
 //DP_QC_GETTIME
 //idea: tZork
-//darkplaces implementation: tZork, div0
+//darkplaces implementation: tZork, divVerent
 //constant definitions:
 float GETTIME_FRAMESTART = 0; // time of start of frame
 float GETTIME_REALTIME = 1; // current time (may be OS specific)
@@ -858,15 +857,15 @@ float(float tmr) gettime = #519;
 //some timers to query...
 
 //DP_QC_GETTIME_CDTRACK
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //constant definitions:
 float GETTIME_CDTRACK = 4;
 //description:
 //returns the playing time of the current cdtrack when passed to gettime()
 
 //DP_QC_LOG
-//darkplaces implementation: div0
+//darkplaces implementation: divVerent
 //builtin definitions:
 float log(float f) = #532;
 //description:
@@ -937,8 +936,8 @@ float(float a, float b) pow = #97;
 //useful math functions, sine of val, cosine of val, square root of val, and raise a to power b, respectively.
 
 //DP_QC_SPRINTF
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //builtin definitions:
 string(string format, ...) sprintf = #627;
 //description:
@@ -955,6 +954,7 @@ string(string format, ...) sprintf = #627;
 //    ouxXc take a float if no length is specified or h is, and an int/entity if l is specified as length, and cast it to an unsigned int
 //    eEfFgG take a float if no length is specified or h is, and an int/entity if l is specified as length, and cast it to a double
 //    s takes a string
+//    vV takes a vector, and processes the three components as if it were a gG for all three components, separated by space
 //    For conversions s and c, the flag # makes precision and width interpreted
 //      as byte count, by default it is interpreted as character count in UTF-8
 //      enabled engines. No other conversions can create wide characters, and #
@@ -1011,8 +1011,8 @@ float(string s, string separator1, ...) tokenizebyseparator = #479;
 //possibly useful for parsing IPv4 addresses (such as "1.2.3.4") and IPv6 addresses (such as "[1234:5678:9abc:def0:1234:5678:9abc:def0]:26000")
 
 //DP_QC_TOKENIZE_CONSOLE
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //builtin definitions:
 float(string s) tokenize_console = #514;
 float(float i) argv_start_index = #515;
@@ -1055,7 +1055,7 @@ float MOVE_WORLDONLY = 3;
 //allows traces to hit only world (ignoring all entities, unlike MOVE_NOMONSTERS which hits all bmodels), use as the nomonsters parameter to trace functions
 
 //DP_QC_UNLIMITEDTEMPSTRINGS
-//idea: div0
+//idea: divVerent
 //darkplaces implementation: LordHavoc
 //description:
 //this extension alters Quake behavior such that instead of reusing a single
@@ -1097,23 +1097,23 @@ void(vector dir) vectorvectors = #432;
 //creates v_forward, v_right, and v_up vectors given a forward vector, similar to makevectors except it takes a forward direction vector instead of angles.
 
 //DP_QC_WHICHPACK
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //builtin definitions:
 string(string filename) whichpack = #503;
 //description:
 //returns the name of the pak/pk3/whatever containing the given file, in the same path space as FRIK_FILE functions use (that is, possibly with a path name prefix)
 
 //DP_QC_URI_ESCAPE
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //URI::Escape's functionality
 string(string in) uri_escape = #510;
 string(string in) uri_unescape = #511;
 
 //DP_QC_URI_GET
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //loads text from an URL into a string
 //returns 1 on success of initiation, 0 if there are too many concurrent
 //connections already or if the URL is invalid
@@ -1133,8 +1133,8 @@ float(string url, float id) uri_get = #513;
 //this extension indicates that FTE_CSQC_SKELETONOBJECTS functionality is available in server QC (as well as CSQC).
 
 //DP_SV_SPAWNFUNC_PREFIX
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //Make functions whose name start with spawnfunc_ take precedence as spawn function for loading entities.
 //Useful if you have a field ammo_shells (required in any Quake mod) but want to support spawn functions called ammo_shells (like in Q3A).
 //Optionally, you can declare a global "float require_spawnfunc_prefix;" which will require ANY spawn function to start with that prefix.
@@ -1304,6 +1304,17 @@ float(entity clent) clienttype = #455; // returns one of the CLIENTTYPE_* consta
 //implementation notes:
 //entity customization is done before per-client culling (visibility for instance) because the entity may be doing setorigin to display itself in different locations on different clients, may be altering its .modelindex, .effects and other fields important to culling, so customized entities increase cpu usage (non-customized entities can use all the early culling they want however, as they are not changing on a per client basis).
 
+//DP_SV_DISCARDABLEDEMO
+//idea: parasti
+//darkplaces implementation: parasti
+//field definitions:
+.float discardabledemo;
+//description:
+//when this field is set to a non-zero value on a player entity, a possibly recorded server-side demo for the player is discarded
+//Note that this extension only works if:
+//  auto demos are enabled (the cvar sv_autodemo_perclient is set)
+//  discarding demos is enabled (the cvar sv_autodemo_perclient_discardable is set)
+
 //DP_SV_DRAWONLYTOCLIENT
 //idea: LordHavoc
 //darkplaces implementation: LordHavoc
@@ -1372,8 +1383,8 @@ void(vector origin, string sample, float volume, float attenuation) pointsound =
 // To mimic the engine's default behavior, simply call remove(self).
 
 //DP_SV_ONENTITYPREPOSTSPAWNFUNCTION
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //engine-called QC prototypes:
 //void() SV_OnEntityPreSpawnFunction;
 //void() SV_OnEntityPostSpawnFunction;
@@ -1494,8 +1505,8 @@ void(string s, ...) print = #339; // same number as in EXT_CSQC
 //this extension allows precache_model and precache_sound (and any variants) to be used during the game (with automatic messages to clients to precache the new model/sound indices), also setmodel/sound/ambientsound can be called without precaching first (they will cause an automatic precache).
 
 //DP_SV_QCSTATUS
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //1. A global variable
 string worldstatus;
 //Its content is set as "qcstatus" field in the rules.
@@ -1535,8 +1546,8 @@ void(entity ent, float colors) setcolor = #401;
 //range is 0 to infinite, recommended values to try are 0.1 (very slow, 10% speed), 1 (normal speed), 5 (500% speed).
 
 //DP_SV_WRITEPICTURE
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //builtin definitions:
 void(float to, string s, float sz) WritePicture = #501;
 //description:
@@ -1865,12 +1876,14 @@ float FILE_WRITE = 2;
 //idea: Spike, LordHavoc
 //darkplaces implementation: LordHavoc
 //builtin definitions:
-float(float modlindex) skel_create = #263; // create a skeleton (be sure to assign this value into .skeletonindex for use), returns skeleton index (1 or higher) on success, returns 0 on failure  (for example if the modelindex is not skeletal), it is recommended that you create a new skeleton if you change modelindex.
+// all skeleton numbers are 1-based (0 being no skeleton)
+// all bone numbers are 1-based (0 being invalid)
+float(float modlindex) skel_create = #263; // create a skeleton (be sure to assign this value into .skeletonindex for use), returns skeleton index (1 or higher) on success, returns 0 on failure (for example if the modelindex is not skeletal), it is recommended that you create a new skeleton if you change modelindex, as the skeleton uses the hierarchy from the model.
 float(float skel, entity ent, float modlindex, float retainfrac, float firstbone, float lastbone) skel_build = #264; // blend in a percentage of standard animation, 0 replaces entirely, 1 does nothing, 0.5 blends half, etc, and this only alters the bones in the specified range for which out of bounds values like 0,100000 are safe (uses .frame, .frame2, .frame3, .frame4, .lerpfrac, .lerpfrac3, .lerpfrac4, .frame1time, .frame2time, .frame3time, .frame4time), returns skel on success, 0 on failure
-float(float skel) skel_get_numbones = #265; // returns how many bones exist in the created skeleton
-string(float skel, float bonenum) skel_get_bonename = #266; // returns name of bone (as a tempstring)
-float(float skel, float bonenum) skel_get_boneparent = #267; // returns parent num for supplied bonenum, -1 if bonenum has no parent or bone does not exist (returned value is always less than bonenum, you can loop on this)
-float(float skel, string tagname) skel_find_bone = #268; // get number of bone with specified name, 0 on failure, tagindex (bonenum+1) on success, same as using gettagindex on the modelindex
+float(float skel) skel_get_numbones = #265; // returns how many bones exist in the created skeleton, 0 if skeleton does not exist
+string(float skel, float bonenum) skel_get_bonename = #266; // returns name of bone (as a tempstring), "" if invalid bonenum (< 1 for example) or skeleton does not exist
+float(float skel, float bonenum) skel_get_boneparent = #267; // returns parent num for supplied bonenum, 0 if bonenum has no parent or bone does not exist (returned value is always less than bonenum, you can loop on this)
+float(float skel, string tagname) skel_find_bone = #268; // get number of bone with specified name, 0 on failure, bonenum (1-based) on success, same as using gettagindex but takes modelindex instead of entity
 vector(float skel, float bonenum) skel_get_bonerel = #269; // get matrix of bone in skeleton relative to its parent - sets v_forward, v_right, v_up, returns origin (relative to parent bone)
 vector(float skel, float bonenum) skel_get_boneabs = #270; // get matrix of bone in skeleton in model space - sets v_forward, v_right, v_up, returns origin (relative to entity)
 void(float skel, float bonenum, vector org) skel_set_bone = #271; // set matrix of bone relative to its parent, reads v_forward, v_right, v_up, takes origin as parameter (relative to parent bone)
@@ -2070,8 +2083,8 @@ string(float n) argv = #442;
 //description:
 //when a savegame is loaded, this function is called
 
-//XONOTIC_PLAYERMODEL
-//idea: Xonotic
+//NEXUIZ_PLAYERMODEL
+//idea: Nexuiz
 //darkplaces implementation: Black
 //console commands:
 //playermodel <name> - FIXME: EXAMPLE NEEDED
@@ -2080,7 +2093,7 @@ string(float n) argv = #442;
 .string playermodel; // name of player model sent by client
 .string playerskin; // name of player skin sent by client
 //description:
-//these client properties are used by Xonotic.
+//these client properties are used by Nexuiz.
 
 //NXQ_GFX_LETTERBOX
 //idea: nxQuake
@@ -2140,7 +2153,7 @@ float PFLAGS_FULLDYNAMIC = 128; // light enable (without this set no light is pr
 
 //FTE_QC_CHECKPVS
 //idea: Urre
-//darkplaces implementation: div0
+//darkplaces implementation: divVerent
 //builtin definitions:
 float checkpvs(vector viewpos, entity viewee) = #240;
 //description:
@@ -2177,7 +2190,7 @@ float(string s1, string s2, float len) strncasecmp = #230; // same as strcasecmp
 
 //DP_CON_BESTWEAPON
 //idea: many
-//darkplaces implementation: div0
+//darkplaces implementation: divVerent
 //description:
 //allows QC to register weapon properties for use by the bestweapon command, for mods that change required ammo count or type for the weapons
 //it is done using console commands sent via stuffcmd:
@@ -2212,8 +2225,8 @@ float(float bufhandle, string str, float order) bufstr_add = #468;
 void(float bufhandle, float string_index) bufstr_free = #469;
 
 //DP_QC_STRINGBUFFERS_CVARLIST
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //functions to list cvars and store their names into a stringbuffer
 //cvars that start with pattern but not with antipattern will be stored into the buffer
 void(float bufhandle, string pattern, string antipattern) buf_cvarlist = #517;
@@ -2229,15 +2242,15 @@ string(string search, string replace, string subject) strireplace = #485;
 //strireplace does the same but uses case-insensitive matching of the 'search' term
 //
 //DP_QC_CRC16
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //Some hash function to build hash tables with. This has to be be the CRC-16-CCITT that is also required for the QuakeWorld download protocol.
 //When caseinsensitive is set, the CRC is calculated of the lower cased string.
 float(float caseinsensitive, string s, ...) crc16 = #494;
 
 //DP_SV_SHUTDOWN
-//idea: div0
-//darkplaces implementation: div0
+//idea: divVerent
+//darkplaces implementation: divVerent
 //A function that gets called just before progs exit. To save persistent data from.
 //It is not called on a crash or error.
 //void SV_Shutdown();
@@ -2263,17 +2276,24 @@ void(float pause) setpause = #531;
 
 
 
-
-
+// EXPERIMENTAL (not finalized) EXTENSIONS:
 
 //DP_PHYSICS
+//idea: LordHavoc
+//darkplaces implementation: LordHavoc, divVerent
+//constant definitions:
 float SOLID_PHYSICS_BOX = 32;
 float SOLID_PHYSICS_SPHERE = 33;
 float SOLID_PHYSICS_CAPSULE = 34;
 float MOVETYPE_PHYSICS = 32;
+float JOINTTYPE_POINT = 1; // point; uses origin (anchor)
+float JOINTTYPE_HINGE = 2; // hinge; uses origin (anchor) and angles (axis)
+float JOINTTYPE_SLIDER = 3; // slider; uses angles (axis)
+float JOINTTYPE_UNIVERSAL = 4; // universal; uses origin (anchor) and angles (forward is axis1, up is axis2)
+float JOINTTYPE_HINGE2 = 5; // hinge2; uses origin (anchor), angles (axis1), velocity (axis2)
+//field definitions:
 .float mass;
-
-.float jointtype;
+.float jointtype; // see JOINTTYPE_ definitions above
 // common joint properties:
 // .entity aiment, enemy; // connected objects
 // .vector movedir;
@@ -2286,28 +2306,6 @@ float MOVETYPE_PHYSICS = 32;
 //     movedir_y = -1 * max motor force to use
 //     movedir_z = stop position (+/-), set to 0 for no stop
 //   note that ODE does not support both in one anyway
-//   motor properties only make sense for hinge and slider!
-
-float JOINTTYPE_POINT = 1;
-// .vector origin; // point anchor
-
-float JOINTTYPE_HINGE = 2;
-// .vector origin; // hinge anchor
-// .vector angles; // hinge axis
-
-float JOINTTYPE_SLIDER = 3;
-// .vector angles; // slider axis
-
-float JOINTTYPE_UNIVERSAL = 4;
-// .vector origin; // universal anchor
-// .vector angles; // universal axis1 and axis2 (axis1 is forward, axis2 is up)
-
-float JOINTTYPE_HINGE2 = 5;
-// .vector origin; // hinge2 anchor
-// .vector angles; // hinge2 first axis (as angles)
-// .vector velocity; // hinge2 second axis (as vector)
-
-
-
-
-
+//description:
+//various physics properties can be defined in an entity and are executed via
+//ODE
index d84546cf2f2e8e056edd6d0dff44b48dcba6f0a2..505b2e7688a659d890b36faa422a41228ce66c61 100644 (file)
@@ -86,6 +86,15 @@ float IsFlying(entity a)
        return 1;
 }
 
+vector GetHeadshotMins(entity targ)
+{
+       return '0.6 0 0' * targ.mins_x + '0 0.6 0' * targ.mins_y + '0 0 1' * (1.3 * targ.view_ofs_z - 0.3 * targ.maxs_z);
+}
+vector GetHeadshotMaxs(entity targ)
+{
+       return '0.6 0 0' * targ.maxs_x + '0 0.6 0' * targ.maxs_y + '0 0 1' * targ.maxs_z;
+}
+
 void UpdateFrags(entity player, float f)
 {
        PlayerTeamScore_AddScore(player, f);
@@ -146,34 +155,45 @@ void GiveFrags (entity attacker, entity targ, float f)
        }
 
        // FIXME fix the mess this is (we have REAL points now!)
-       if(g_runematch)
-       {
-               f = RunematchHandleFrags(attacker, targ, f);
-       }
-       else if(g_keyhunt)
+       entity oldself;
+       oldself = self;
+       self = attacker;
+       frag_attacker = attacker;
+       frag_target = targ;
+       frag_score = f;
+       if(MUTATOR_CALLHOOK(GiveFragsForKill))
        {
-               f = kh_HandleFrags(attacker, targ, f);
+               f = frag_score;
+               self = oldself;
        }
-       else if(g_lms)
+       else
        {
-               // remove a life
-               float tl;
-               tl = PlayerScore_Add(targ, SP_LMS_LIVES, -1);
-               if(tl < lms_lowest_lives)
-                       lms_lowest_lives = tl;
-               if(tl <= 0)
+               self = oldself;
+               if(g_runematch)
                {
-                       if(!lms_next_place)
-                               lms_next_place = player_count;
-                       PlayerScore_Add(targ, SP_LMS_RANK, lms_next_place); // won't ever spawn again
-                       --lms_next_place;
+                       f = RunematchHandleFrags(attacker, targ, f);
                }
-               f = 0;
-       }
-       else if(g_ctf)
-       {
-               if(g_ctf_ignore_frags)
+               else if(g_lms)
+               {
+                       // remove a life
+                       float tl;
+                       tl = PlayerScore_Add(targ, SP_LMS_LIVES, -1);
+                       if(tl < lms_lowest_lives)
+                               lms_lowest_lives = tl;
+                       if(tl <= 0)
+                       {
+                               if(!lms_next_place)
+                                       lms_next_place = player_count;
+                               PlayerScore_Add(targ, SP_LMS_RANK, lms_next_place); // won't ever spawn again
+                               --lms_next_place;
+                       }
                        f = 0;
+               }
+               else if(g_ctf)
+               {
+                       if(g_ctf_ignore_frags)
+                               f = 0;
+               }
        }
 
        attacker.totalfrags += f;
@@ -861,8 +881,8 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                                // if above view_ofs and below maxs, and also in the middle half of the bbox, it is head shot
                                vector headmins, headmaxs, org;
                                org = antilag_takebackorigin(targ, time - ANTILAG_LATENCY(attacker));
-                               headmins = org + '0.6 0 0' * targ.mins_x + '0 0.6 0' * targ.mins_y + '0 0 1' * (1.3 * targ.view_ofs_z - 0.3 * targ.maxs_z);
-                               headmaxs = org + '0.6 0 0' * targ.maxs_x + '0 0.6 0' * targ.maxs_y + '0 0 1' * targ.maxs_z;
+                               headmins = org + GetHeadshotMins(targ);
+                               headmaxs = org + GetHeadshotMaxs(targ);
                                if(trace_hits_box(railgun_start, railgun_end, headmins, headmaxs))
                                {
                                        deathtype |= HITTYPE_HEADSHOT;
index e09b03bcc2b1f3a8705a2fabe46d8b86a4902878..8a380484a2f9791af0f2d6a3ef7dd27bc541c9e9 100644 (file)
@@ -133,9 +133,9 @@ float g_clientmodel_genericsendentity (entity to, float sf)
        Net_LinkEntity(self, TRUE, 0, g_clientmodel_genericsendentity);
 
 // non-solid model entities:
-void spawnfunc_misc_gamemodel()         { G_MODEL_INIT      (SOLID_NOT) } // model entity
-void spawnfunc_misc_clientmodel()       { G_CLIENTMODEL_INIT(SOLID_NOT) } // model entity
-void spawnfunc_misc_models()            { G_MODEL_INIT      (SOLID_NOT) } // DEPRECATED old compat entity with confusing name, do not use
+void spawnfunc_misc_gamemodel()         { self.angles_x = -self.angles_x; G_MODEL_INIT      (SOLID_NOT) } // model entity
+void spawnfunc_misc_clientmodel()       { self.angles_x = -self.angles_x; G_CLIENTMODEL_INIT(SOLID_NOT) } // model entity
+void spawnfunc_misc_models()            { self.angles_x = -self.angles_x; G_MODEL_INIT      (SOLID_NOT) } // DEPRECATED old compat entity with confusing name, do not use
 
 // non-solid brush entities:
 void spawnfunc_func_illusionary()       { G_MODEL_INIT      (SOLID_NOT) } // Q1 name (WARNING: MISPREDICTED)
index 5c65847eadf9d062ab2c8e58ae47df842f4a1a9e..3f14bf3e7ea9eaa12dc459cb2c9e15b36c850494 100644 (file)
@@ -8,6 +8,7 @@ compile with -DTETRIS
 
 #ifdef TETRIS
 
+float autocvar_g_bastet;
 .vector tet_org;
 
 float tet_vs_current_id;
@@ -26,8 +27,11 @@ float tet_vs_current_timeout;
 
 var float tet_high_score = 0;
 
-float TET_LINES = 20;
+vector TET_START_PIECE_POS = '5 1 0';
+float TET_LINES = 22;
+float TET_DISPLAY_LINES = 20;
 float TET_WIDTH = 10;
+string TET_EMPTY_LINE = "0000000000"; // must match TET_WIDTH
 //character values
 float TET_BORDER = 139;
 float TET_BLOCK = 133;
@@ -46,10 +50,7 @@ string TET_PADDING_RIGHT = "\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0\xA0
 
 float PIECES = 7;
 
-.float line1, line2, line3, line4, line5, line6, line7,
-line8, line9, line10, line11, line12, line13, line14, line15,
-line16, line17, line18, line19, line20;
-
+float tet_line_buf;
 
 float  SVC_CENTERPRINTa                = 26;
 
@@ -70,146 +71,36 @@ Library Functions
 
 *********************************
 */
-void SetLine(float ln, float vl)
+void SetLine(float ln, string vl)
 {
-       if (ln == 1)
-               self.line1 = vl;
-       else if (ln == 2)
-               self.line2 = vl;
-       else if (ln == 3)
-               self.line3 = vl;
-       else if (ln == 4)
-               self.line4 = vl;
-       else if (ln == 5)
-               self.line5 = vl;
-       else if (ln == 6)
-               self.line6 = vl;
-       else if (ln == 7)
-               self.line7 = vl;
-       else if (ln == 8)
-               self.line8 = vl;
-       else if (ln == 9)
-               self.line9 = vl;
-       else if (ln == 10)
-               self.line10 = vl;
-       else if (ln == 11)
-               self.line11 = vl;
-       else if (ln == 12)
-               self.line12 = vl;
-       else if (ln == 13)
-               self.line13 = vl;
-       else if (ln == 14)
-               self.line14 = vl;
-       else if (ln == 15)
-               self.line15 = vl;
-       else if (ln == 16)
-               self.line16 = vl;
-       else if (ln == 17)
-               self.line17 = vl;
-       else if (ln == 18)
-               self.line18 = vl;
-       else if (ln == 19)
-               self.line19 = vl;
-       else if (ln == 20)
-               self.line20 = vl;
+       if(ln < 1 || ln > TET_LINES)
+               error("WTF");
+       bufstr_set(tet_line_buf, ln + TET_LINES * num_for_edict(self), vl);
 };
 
-float GetLine(float ln)
+string GetLine(float ln)
 {
-       if (ln == 1)
-               return self.line1;
-       else if (ln == 2)
-               return self.line2;
-       else if (ln == 3)
-               return self.line3;
-       else if (ln == 4)
-               return self.line4;
-       else if (ln == 5)
-               return self.line5;
-       else if (ln == 6)
-               return self.line6;
-       else if (ln == 7)
-               return self.line7;
-       else if (ln == 8)
-               return self.line8;
-       else if (ln == 9)
-               return self.line9;
-       else if (ln == 10)
-               return self.line10;
-       else if (ln == 11)
-               return self.line11;
-       else if (ln == 12)
-               return self.line12;
-       else if (ln == 13)
-               return self.line13;
-       else if (ln == 14)
-               return self.line14;
-       else if (ln == 15)
-               return self.line15;
-       else if (ln == 16)
-               return self.line16;
-       else if (ln == 17)
-               return self.line17;
-       else if (ln == 18)
-               return self.line18;
-       else if (ln == 19)
-               return self.line19;
-       else if (ln == 20)
-               return self.line20;
-       else
-               return 0;
+       if(ln < 1 || ln > TET_LINES)
+               error("WTF");
+       if(ln < 1 || ln > TET_LINES)
+               return TET_EMPTY_LINE;
+       return bufstr_get(tet_line_buf, ln + TET_LINES * num_for_edict(self));
 };
 
-float GetXBlock(float x, float dat)
-{
-       if (x == 1)
-               return dat & 3;
-       else if (x == 2)
-               return (dat & 12) / 4;
-       else if (x == 3)
-               return (dat & 48) / 16;
-       else if (x == 4)
-               return (dat & 192) / 64;
-       else if (x == 5)
-               return (dat & 768) / 256;
-       else if (x == 6)
-               return (dat & 3072) / 1024;
-       else if (x == 7)
-               return (dat & 12288) / 4096;
-       else if (x == 8)
-               return (dat & 49152) / 16384;
-       else if (x == 9)
-               return (dat & 196608) / 65536;
-       else if (x == 10)
-               return (dat & 786432) / 262144;
-       else
-               return 0;
+float GetXBlock(float x, string dat)
+{
+       if(x < 1 || x > TET_WIDTH)
+               error("WTF");
+       return stof(substring(dat, x-1, 1));
 };
 
-float SetXBlock(float x, float dat, float new)
-{
-       if (x == 1)
-               return (dat - (dat & 3)) | new;
-       else if (x == 2)
-               return (dat - (dat & 12)) | (new*4);
-       else if (x == 3)
-               return (dat - (dat & 48)) | (new*16);
-       else if (x == 4)
-               return (dat - (dat & 192)) | (new*64);
-       else if (x == 5)
-               return (dat - (dat & 768)) | (new*256);
-       else if (x == 6)
-               return (dat - (dat & 3072)) | (new*1024);
-       else if (x == 7)
-               return (dat - (dat & 12288)) | (new*4096);
-       else if (x == 8)
-               return (dat - (dat & 49152)) | (new*16384);
-       else if (x == 9)
-               return (dat - (dat & 196608)) | (new*65536);
-       else if (x == 10)
-               return (dat - (dat & 786432)) | (new*262144);
-       else
-               return dat;
+string SetXBlock(float x, string dat, float new)
+{
+       return strcat(
+               substring(dat, 0, x-1),
+               ftos(new),
+               substring(dat, x, -1)
+       );
 };
 
 
@@ -220,23 +111,41 @@ float GetSquare(float x, float y)
 
 void SetSquare(float x, float y, float val)
 {
-       float dat;
-
+       string dat;
        dat = GetLine(y);
-       dat  = SetXBlock(x, dat, val & 3);
+       dat  = SetXBlock(x, dat, val);
        SetLine(y, dat);
 };
 
+float PieceColor(float pc)
+{
+       if (pc == 1)
+               return 3; // O
+       else if (pc == 2)
+               return 4; // J
+       else if (pc == 3)
+               return 7; // L // we don't have orange, let's use white instead!
+       else if (pc == 4)
+               return 5; // I
+       else if (pc == 5)
+               return 1; // Z
+       else if (pc == 6)
+               return 2; // S
+       else if (pc == 7)
+               return 6; // T
+       else
+               return 0;
+}
 vector PieceShape(float pc)
 {
        if (pc == 1)
-               return '5 5 0'; // O
+               return '20 20 0'; // O
        else if (pc == 2)
                return '1 21 0'; // J
        else if (pc == 3)
-               return '21 1 0'; // L
+               return '16 21 0'; // L
        else if (pc == 4)
-               return '85 0 0'; // I
+               return '0 85 0'; // I
        else if (pc == 5)
                return '5 20 0'; // Z
        else if (pc == 6)
@@ -246,17 +155,35 @@ vector PieceShape(float pc)
        else
                return '0 0 0';
 }
-
+vector PieceSize(float pc)
+{
+       if (pc == 1)
+               return '2 2 0'; // O
+       else if (pc == 2)
+               return '3 2 0'; // J
+       else if (pc == 3)
+               return '3 2 0'; // L
+       else if (pc == 4)
+               return '4 1 0'; // I
+       else if (pc == 5)
+               return '3 2 0'; // Z
+       else if (pc == 6)
+               return '3 2 0'; // S
+       else if (pc == 7)
+               return '3 2 0'; // T
+       else
+               return '0 0 0';
+}
 vector PieceCenter(float pc)
 {
        if(pc == 1)
-               return '1.5 1.5 0'; // O
+               return '2.5 1.5 0'; // O
        else if (pc == 2)
                return '2 2 0'; // J
        else if (pc == 3)
-               return '2 1 0'; // L
+               return '2 2 0'; // L
        else if (pc == 4)
-               return '2.5 1.5 0'; // I
+               return '2.5 2.5 0'; // I
        else if (pc == 5)
                return '2 2 0'; // Z
        else if (pc == 6)
@@ -271,12 +198,10 @@ vector PieceCenter(float pc)
 float PieceMetric(float x, float y, float rot, float pc)
 {
        float t;
-       vector piece_dat;
-       float wid;
+       vector ce;
 
        // return bits of a piece
-       wid = piece_dat_z + 1;
-       piece_dat = PieceCenter(pc);
+       ce = PieceCenter(pc);
        if (rot == 1) // 90 degrees
        {
                // x+cx, y+cy -> -y+cx, x+cy
@@ -284,13 +209,13 @@ float PieceMetric(float x, float y, float rot, float pc)
                //   x = X-cx
                //   y = Y-cy
                t = y;
-               y = x - piece_dat_x + piece_dat_y;
-               x = -t + piece_dat_x + piece_dat_y;
+               y = x - ce_x + ce_y;
+               x = -t + ce_x + ce_y;
        }
        else if (rot == 2)//180
        {
-               x = 2 * piece_dat_x - x;
-               y = 2 * piece_dat_y - y;
+               x = 2 * ce_x - x;
+               y = 2 * ce_y - y;
        }
        else if (rot == 3) // 270
        {
@@ -299,19 +224,104 @@ float PieceMetric(float x, float y, float rot, float pc)
                //   x = X-cx
                //   y = Y-cy
                t = y;
-               y = -x + piece_dat_y + piece_dat_x;
-               x =  t - piece_dat_y + piece_dat_x;
+               y = -x + ce_y + ce_x;
+               x =  t - ce_y + ce_x;
        }
        if (x < 1 || y < 1 || x > 4 || y > 2)
                return 0;
-       piece_dat = PieceShape(pc);
+       ce = PieceShape(pc);
        if (y == 1)
-               return GetXBlock(x, piece_dat_x); // first row
+               return !!(ce_x & pow(4, x-1)); // first row
        else if (y == 2)
-               return GetXBlock(x, piece_dat_y); // second row
+               return !!(ce_y & pow(4, x-1)); // second row
        else
                return 0; // illegal parms
 };
+vector tet_piecemins;
+vector tet_piecemaxs;
+void PieceMinsMaxs(float rot, float pc)
+{
+       vector sz, ce;
+       float t;
+       vector v;
+
+       sz = PieceSize(pc);
+       ce = PieceCenter(pc);
+       // 1 = 2..2
+       // 2 = 2..3
+       // 3 = 1..3
+       // 4 = 1..4
+       tet_piecemins_x = floor(3.0 - sz_x * 0.5);
+       tet_piecemaxs_x = floor(2.0 + sz_x * 0.5);
+       if(sz_y == 1)
+       {
+               // special case for "I"
+               tet_piecemins_y = tet_piecemaxs_y = 2;
+       }
+       else
+       {
+               tet_piecemins_y = 1;
+               tet_piecemaxs_y = sz_y;
+       }
+       //print(sprintf("ce%v sz%v mi%v ma%v\n", ce, sz, tet_piecemins, tet_piecemaxs));
+       if (rot == 1) // 90 degrees
+       {
+               t = tet_piecemins_y;
+               tet_piecemins_y = -tet_piecemins_x + ce_y + ce_x;
+               tet_piecemins_x = t - ce_y + ce_x;
+               t = tet_piecemaxs_y;
+               tet_piecemaxs_y = -tet_piecemaxs_x + ce_y + ce_x;
+               tet_piecemaxs_x = t - ce_y + ce_x;
+               // swap mins_y, maxs_y
+               t = tet_piecemins_y;
+               tet_piecemins_y = tet_piecemaxs_y;
+               tet_piecemaxs_y = t;
+               // TODO OPTIMIZE
+       }
+       else if (rot == 2)//180
+       {
+               v = tet_piecemins;
+               tet_piecemins = 2 * ce - tet_piecemaxs;
+               tet_piecemaxs = 2 * ce - v;
+       }
+       else if (rot == 3) // 270
+       {
+               t = tet_piecemins_y;
+               tet_piecemins_y = tet_piecemins_x - ce_x + ce_y;
+               tet_piecemins_x = -t + ce_x + ce_y;
+               t = tet_piecemaxs_y;
+               tet_piecemaxs_y = tet_piecemaxs_x - ce_x + ce_y;
+               tet_piecemaxs_x = -t + ce_x + ce_y;
+               // swap mins_x, maxs_x
+               t = tet_piecemins_x;
+               tet_piecemins_x = tet_piecemaxs_x;
+               tet_piecemaxs_x = t;
+               // TODO OPTIMIZE
+       }
+#ifdef VERIFY
+       print(vtos(tet_piecemins), "-");
+       print(vtos(tet_piecemaxs), "\n");
+       if(tet_piecemins_x > tet_piecemaxs_x)
+               error("inconsistent mins/maxs");
+       if(tet_piecemins_y > tet_piecemaxs_y)
+               error("inconsistent mins/maxs");
+       float i, j;
+       vector realmins, realmaxs;
+       realmins = '4 4 0';
+       realmaxs = '1 1 0';
+       for(i = 1; i <= 4; ++i)
+               for(j = 1; j <= 4; ++j)
+                       if(PieceMetric(i, j, rot, pc))
+                       {
+                               realmins_x = min(realmins_x, i);
+                               realmins_y = min(realmins_y, j);
+                               realmaxs_x = max(realmaxs_x, i);
+                               realmaxs_y = max(realmaxs_y, j);
+                       }
+       if(realmins != tet_piecemins || realmaxs != tet_piecemaxs)
+               error(sprintf("incorrect mins/maxs: %v %v in %d rot %d mins %v maxs %v\n", realmins, realmaxs, rot, pc, tet_piecemins, tet_piecemaxs));
+#endif
+}
 /*
 *********************************
 
@@ -361,11 +371,11 @@ void DrawLine(float ln)
 
        for (x = 1; x <= TET_WIDTH; x = x + 1)
        {
-               d = GetSquare(x, ln);
+               d = GetSquare(x, ln + TET_LINES - TET_DISPLAY_LINES);
                if (d)
                {
                        WriteChar(MSG_ONE, '^');
-                       WriteChar(MSG_ONE, d * d - 2 * d + 50); // 1, 2, 5
+                       WriteChar(MSG_ONE, d + '0');
                        WriteChar(MSG_ONE, TET_BLOCK);
                }
                else
@@ -380,7 +390,7 @@ void DrawPiece(float pc, float ln)
 {
        float x, d, piece_ln, pcolor;
        vector piece_dat;
-       pcolor = mod(pc, 3) + 1;
+       pcolor = PieceColor(pc);
        WriteChar(MSG_ONE, TET_SPACE); // pad to 6
 
        piece_dat = PieceShape(pc);
@@ -390,11 +400,10 @@ void DrawPiece(float pc, float ln)
                piece_ln = piece_dat_y;
        for (x = 1; x <= 4; x = x + 1)
        {
-               d = GetXBlock(x, piece_ln) * pcolor;
-               if (d)
+               if (piece_ln & pow(4, x-1))
                {
                        WriteChar(MSG_ONE, '^');
-                       WriteChar(MSG_ONE, d * d - 2 * d + 50); // 1, 2, 5
+                       WriteChar(MSG_ONE, pcolor + '0');
                        WriteChar(MSG_ONE, TET_BLOCK);
                }
                else
@@ -408,13 +417,18 @@ void Draw_Tetris()
        entity head;
        msg_entity = self;
        WriteChar(MSG_ONE, SVC_CENTERPRINTa);
+       if(autocvar_g_bastet)
+       {
+               WriteTetrisString("NEVER GONNA GIVE YOU");
+               WriteChar(MSG_ONE, 10);
+       }
        // decoration
        for (i = 1; i <= (TET_WIDTH + 2); i = i + 1)
                WriteChar(MSG_ONE, TET_BORDER);
        WriteTetrisString("      ");
        WriteUnterminatedString(MSG_ONE, TET_PADDING_RIGHT);
        WriteChar(MSG_ONE, 10);
-       for (i = 1; i <= TET_LINES; i = i + 1)
+       for (i = 1; i <= TET_DISPLAY_LINES; i = i + 1)
        {
                if(self.tetris_on == 2)
                        WriteTetrisString(" GAME  OVER ");
@@ -423,7 +437,7 @@ void Draw_Tetris()
                else
                        DrawLine(i);
                if (i == 1)
-                       WriteTetrisString(" NEXT ");
+                       WriteTetrisString(autocvar_g_bastet ? " THAT " : " NEXT ");
                else if (i == 3)
                        DrawPiece(self.next_piece, 1);
                else if (i == 4)
@@ -501,8 +515,11 @@ void ResetTetris()
 {
        float i;
 
+       if(!tet_line_buf)
+               tet_line_buf = buf_create();
+
        for (i=1; i<=TET_LINES; i = i + 1)
-               SetLine(i, 0);
+               SetLine(i, TET_EMPTY_LINE);
        self.piece_pos = '0 0 0';
        self.piece_type = 0;
        self.next_piece = self.tet_lines = self.tet_score = 0;
@@ -518,6 +535,227 @@ void Tet_GameExit()
        self.movetype = MOVETYPE_WALK;
 };
 
+void PrintField()
+{
+       string l;
+       float r, c;
+       for(r = 1; r <= TET_LINES; ++r)
+       {
+               l = GetLine(r);
+               print(">");
+               for(c = 1; c <= TET_WIDTH; ++c)
+               {
+                       print(ftos(GetXBlock(c, l)));
+               }
+               print("\n");
+       }
+}
+
+float BastetEvaluate()
+{
+       float height;
+       string l;
+       float lines;
+       float score, score_save;
+       string occupied, occupied_save;
+       float occupied_count, occupied_count_save;
+       float i, j, line;
+
+       score = 0;
+
+       // adds a bonus for each free dot above the occupied blocks profile
+       occupied = TET_EMPTY_LINE;
+       occupied_count = TET_WIDTH;
+       height = 0;
+       lines = 0;
+       for(i = 1; i <= TET_LINES; ++i)
+       {
+               l = GetLine(i);
+               if(l == TET_EMPTY_LINE)
+               {
+                       height = i;
+                       continue;
+               }
+               line = 1;
+               occupied_save = occupied;
+               occupied_count_save = occupied_count;
+               score_save = score;
+               for(j = 1; j <= TET_WIDTH; ++j)
+               {
+                       if(GetXBlock(j, l))
+                       {
+                               if(!GetXBlock(j, occupied))
+                               {
+                                       occupied = SetXBlock(j, occupied, 1);
+                                       --occupied_count;
+                               }
+                       }
+                       else
+                               line = 0;
+                       score += 10000 * occupied_count;
+               }
+               if(line)
+               {
+                       occupied = occupied_save;
+                       occupied_count = occupied_count_save;
+                       score = score_save + 100000000 + 10000 * TET_WIDTH + 1000;
+                       ++lines;
+               }
+       }
+
+       score += 1000 * height;
+
+       return score;
+}
+
+float CheckMetrics(float piece, float orgx, float orgy, float rot);
+void ClearPiece(float piece, float orgx, float orgy, float rot);
+void CementPiece(float piece, float orgx, float orgy, float rot);
+float bastet_profile_evaluate_time;
+float bastet_profile_checkmetrics_time;
+float BastetSearch(float buf, float pc, float x, float y, float rot, float move_bias)
+// returns best score, or -1 if position is impossible
+{
+       string r;
+       float b;
+       float s, sm;
+       float t1, t2;
+
+       if(move_bias < 0)
+               return 0; // DO NOT WANT
+
+       if(x < 1 || x > TET_WIDTH || y < 1 || y > TET_LINES)
+               return -1; // impossible
+       if(rot < 0) rot = 3;
+       if(rot > 3) rot = 0;
+
+       // did we already try?
+       b = x + (TET_WIDTH+2) * (y + (TET_LINES+2) * rot);
+       r = bufstr_get(buf, b);
+       if(r != "") // already tried
+               return stof(r);
+
+       bufstr_set(buf, b, "0"); // in case we READ that, not that bad - we already got that value in another branch then anyway
+
+
+
+       t1 = gettime(GETTIME_HIRES);
+       if(CheckMetrics(pc, x, y, rot))
+       {
+               t2 = gettime(GETTIME_HIRES);
+               bastet_profile_checkmetrics_time += (t2 - t1);
+               // try all moves
+               sm = 1;
+               s = BastetSearch(buf, pc, x-1, y, rot, move_bias - 1); if(s > sm) sm = s;
+               s = BastetSearch(buf, pc, x+1, y, rot, move_bias - 1); if(s > sm) sm = s;
+               s = BastetSearch(buf, pc, x, y, rot+1, move_bias - 1); if(s > sm) sm = s;
+               s = BastetSearch(buf, pc, x, y, rot-1, move_bias - 1); if(s > sm) sm = s;
+
+               s = BastetSearch(buf, pc, x, y+1, rot, move_bias + 2); if(s > sm) sm = s;
+               if(s < 0)
+               {
+                       //print(sprintf("MAY CEMENT AT: %d %d %d\n", x, y, rot));
+                       // moving down did not work - that means we can fixate the block here
+                       t1 = gettime(GETTIME_HIRES);
+
+                       CementPiece(pc, x, y, rot);
+                       s = BastetEvaluate();
+                       ClearPiece(pc, x, y, rot);
+
+                       t2 = gettime(GETTIME_HIRES);
+                       bastet_profile_evaluate_time += (t2 - t1);
+
+                       if(s > sm) sm = s;
+               }
+       }
+       else
+       {
+               t2 = gettime(GETTIME_HIRES);
+               bastet_profile_checkmetrics_time += (t2 - t1);
+               sm = -1; // impassible
+       }
+
+       bufstr_set(buf, b, ftos(sm));
+
+       return sm;
+}
+
+float bastet_piece[7];
+float bastet_score[7];
+float bastet_piecetime[7];
+float BastetPiece()
+{
+       float b;
+
+       bastet_profile_evaluate_time = 0;
+       bastet_profile_checkmetrics_time = 0;
+       var float t1 = gettime(GETTIME_HIRES);
+
+       b = buf_create(); bastet_piece[0] = 1; bastet_score[0] = BastetSearch(b, 1, TET_START_PIECE_POS_x, 1+TET_START_PIECE_POS_y, TET_START_PIECE_POS_y, TET_WIDTH) + 100 * random() + bastet_piecetime[0]; buf_del(b);
+       b = buf_create(); bastet_piece[1] = 2; bastet_score[1] = BastetSearch(b, 2, TET_START_PIECE_POS_x, 1+TET_START_PIECE_POS_y, TET_START_PIECE_POS_y, TET_WIDTH) + 100 * random() + bastet_piecetime[1]; buf_del(b);
+       b = buf_create(); bastet_piece[2] = 3; bastet_score[2] = BastetSearch(b, 3, TET_START_PIECE_POS_x, 1+TET_START_PIECE_POS_y, TET_START_PIECE_POS_y, TET_WIDTH) + 100 * random() + bastet_piecetime[2]; buf_del(b);
+       b = buf_create(); bastet_piece[3] = 4; bastet_score[3] = BastetSearch(b, 4, TET_START_PIECE_POS_x, 1+TET_START_PIECE_POS_y, TET_START_PIECE_POS_y, TET_WIDTH) + 100 * random() + bastet_piecetime[3]; buf_del(b);
+       b = buf_create(); bastet_piece[4] = 5; bastet_score[4] = BastetSearch(b, 5, TET_START_PIECE_POS_x, 1+TET_START_PIECE_POS_y, TET_START_PIECE_POS_y, TET_WIDTH) + 100 * random() + bastet_piecetime[4]; buf_del(b);
+       b = buf_create(); bastet_piece[5] = 6; bastet_score[5] = BastetSearch(b, 6, TET_START_PIECE_POS_x, 1+TET_START_PIECE_POS_y, TET_START_PIECE_POS_y, TET_WIDTH) + 100 * random() + bastet_piecetime[5]; buf_del(b);
+       b = buf_create(); bastet_piece[6] = 7; bastet_score[6] = BastetSearch(b, 7, TET_START_PIECE_POS_x, 1+TET_START_PIECE_POS_y, TET_START_PIECE_POS_y, TET_WIDTH) + 100 * random() + bastet_piecetime[6]; buf_del(b);
+
+       var float t2 = gettime(GETTIME_HIRES);
+       dprint(sprintf("Time taken: %.6f seconds (of this, ev = %.2f%%, cm = %.2f%%)\n", t2 - t1, 100 * bastet_profile_evaluate_time / (t2 - t1), 100 * bastet_profile_checkmetrics_time / (t2 - t1)));
+
+       // sort
+       float i, j, k, p, s;
+
+/*
+       for(i = 0; i < 7; ++i)
+       {
+               print(sprintf("piece %s value = %d\n", substring("OJLIZST", bastet_piece[i]-1, 1), bastet_score[i]));
+       }
+*/
+
+       for(i = 0; i < 7; ++i)
+       {
+               k = i;
+               p = bastet_piece[k];
+               s = bastet_score[k];
+               for(j = i + 1; j < 7; ++j)
+               {
+                       if(bastet_score[j] < s)
+                       {
+                               k = j;
+                               s = bastet_score[k];
+                               p = bastet_piece[k];
+                       }
+               }
+               if(k != i)
+               {
+                       bastet_score[k] = bastet_score[i];
+                       bastet_piece[k] = bastet_piece[i];
+                       bastet_score[i] = s;
+                       bastet_piece[i] = p;
+               }
+       }
+
+       b = random();
+       if(b < 0.8)
+               j = 0;
+       else if(b < 0.92)
+               j = 1;
+       else if(b < 0.98)
+               j = 2;
+       else
+               j = 3;
+       j = bastet_piece[j];
+
+       for(i = 0; i < 7; ++i)
+       {
+               if(i == j-1)
+                       bastet_piecetime[i] = 0.2 * bastet_piecetime[i];
+               else
+                       bastet_piecetime[i] = 1.8 * bastet_piecetime[i] + 1000;
+       }
+
+       return j;
+}
 
 
 /*
@@ -534,6 +772,7 @@ float RandomPiece()
        float p, q;
        float b;
        float seen;
+
        if(self.tet_piece_bucket > 1)
        {
                p = mod(self.tet_piece_bucket, 7);
@@ -575,37 +814,37 @@ float CheckMetrics(float piece, float orgx, float orgy, float rot) /*FIXDECL*/
        // check to see if the piece, if moved to the locations will overlap
 
        float x, y;
+       string l;
        // why did I start counting from 1, damnit
        orgx = orgx - 1;
        orgy = orgy - 1;
 
-       for (y = 0; y < 5; y = y + 1)
+       PieceMinsMaxs(rot, piece);
+       if (tet_piecemins_x+orgx<1 || tet_piecemaxs_x+orgx > TET_WIDTH || tet_piecemins_y+orgy<1 || tet_piecemaxs_y+orgy> TET_LINES)
+               return FALSE; // ouside the level
+       for (y = tet_piecemins_y; y <= tet_piecemaxs_y; y = y + 1)
        {
-               for (x = 0; x < 5; x = x + 1)
-               {
+               l = GetLine(y + orgy);
+               if(l != TET_EMPTY_LINE)
+               for (x = tet_piecemins_x; x <= tet_piecemaxs_x; x = x + 1)
                        if (PieceMetric(x, y, rot, piece))
-                       {
-                               if (GetSquare(x + orgx, y + orgy))
+                               if (GetXBlock(x + orgx, l))
                                        return FALSE; // uhoh, gonna hit something.
-                               if (x+orgx<1 || x+orgx > TET_WIDTH || y+orgy<1 || y+orgy> TET_LINES)
-                                       return FALSE; // ouside the level
-                       }
-               }
        }
        return TRUE;
 }
 
 void ClearPiece(float piece, float orgx, float orgy, float rot) /*FIXDECL*/
 {
-
        float x, y;
        // why did I start counting from 1, damnit
        orgx = orgx - 1;
        orgy = orgy - 1;
 
-       for (y = 0; y < 5; y = y + 1)
+       PieceMinsMaxs(rot, piece);
+       for (y = tet_piecemins_y; y <= tet_piecemaxs_y; y = y + 1)
        {
-               for (x = 0; x < 5; x = x + 1)
+               for (x = tet_piecemins_x; x <= tet_piecemaxs_x; x = x + 1)
                {
                        if (PieceMetric(x, y, rot, piece))
                        {
@@ -622,11 +861,12 @@ void CementPiece(float piece, float orgx, float orgy, float rot) /*FIXDECL*/
        orgx = orgx - 1;
        orgy = orgy - 1;
 
-       pcolor = mod(piece, 3) + 1;
+       pcolor = PieceColor(piece);
 
-       for (y = 0; y < 5; y = y + 1)
+       PieceMinsMaxs(rot, piece);
+       for (y = tet_piecemins_y; y <= tet_piecemaxs_y; y = y + 1)
        {
-               for (x = 0; x < 5; x = x + 1)
+               for (x = tet_piecemins_x; x <= tet_piecemaxs_x; x = x + 1)
                {
                        if (PieceMetric(x, y, rot, piece))
                        {
@@ -650,18 +890,24 @@ void AddLines(float n)
 
 void CompletedLines()
 {
-       float y, cleared, ln, added, pos, i;
+       float y, cleared, added, pos, i;
+       string ln;
 
        cleared = 0;
        y = TET_LINES;
-       while(y >= 1)
+       for(;;)
        {
                ln = GetLine(y);
-               if (((ln & LINE_LOW) | ((ln & LINE_HIGH)/2)) == LINE_LOW)
+               if(strstrofs(ln, "0", 0) < 0)
                        cleared = cleared + 1;
                else
                        y = y - 1;
-               ln = GetLine(y - cleared);
+               if(y < 1)
+                       break;
+               if(y - cleared < 1)
+                       ln = TET_EMPTY_LINE;
+               else
+                       ln = GetLine(y - cleared);
                SetLine(y, ln);
        }
 
@@ -685,17 +931,17 @@ void CompletedLines()
                for(y = max(1, TET_LINES - added + 1); y <= TET_LINES; ++y)
                {
                        pos = floor(random() * TET_WIDTH);
-                       ln = 0;
+                       ln = TET_EMPTY_LINE;
                        for(i = 1; i <= TET_WIDTH; ++i)
                                if(i != pos)
-                                       ln = SetXBlock(i, ln, floor(random() * 3 + 1));
+                                       ln = SetXBlock(i, ln, floor(random() * 7 + 1));
                        SetLine(y, ln);
                }
        }
 
        self.tet_highest_line = 0;
        for(y = 1; y <= TET_LINES; ++y)
-               if(GetLine(y) != 0)
+               if(GetLine(y) != TET_EMPTY_LINE)
                {
                        self.tet_highest_line = TET_LINES + 1 - y;
                        break;
@@ -725,12 +971,21 @@ void HandleGame(float keyss)
 
        if (self.piece_type == 0)
        {
-               self.piece_pos = '5 1 0'; // that's about middle top, we count from 1 ARGH
-               if (self.next_piece)
-                       self.piece_type = self.next_piece;
+               self.piece_pos = TET_START_PIECE_POS; // that's about middle top, we count from 1 ARGH
+
+               if(autocvar_g_bastet)
+               {
+                       self.piece_type = BastetPiece();
+                       self.next_piece = bastet_piece[6];
+               }
                else
-                       self.piece_type = RandomPiece();
-               self.next_piece =  RandomPiece();
+               {
+                       if (self.next_piece)
+                               self.piece_type = self.next_piece;
+                       else
+                               self.piece_type = RandomPiece();
+                       self.next_piece =  RandomPiece();
+               }
                keyss = 0; // no movement first frame
                self.tet_autodown = time + 0.2;
                brand_new = 1;
index 786884454d1ac5323d3b14036242670e2e1ef9ca..c31352ed5dec0e3f517d30198211d143db2cdcba 100644 (file)
@@ -533,7 +533,112 @@ void spawnfunc_trigger_heal()
 //
 //////////////////////////////////////////////////////////////
 
+.entity trigger_gravity_check;
+void trigger_gravity_remove(entity own)
+{
+       if(own.trigger_gravity_check.owner == own)
+       {
+               UpdateCSQCProjectile(own);
+               own.gravity = own.trigger_gravity_check.gravity;
+               remove(own.trigger_gravity_check);
+       }
+       else
+               backtrace("Removing a trigger_gravity_check with no valid owner");
+       own.trigger_gravity_check = world;
+}
+void trigger_gravity_check_think()
+{
+       // This spawns when a player enters the gravity zone and checks if he left.
+       // Each frame, self.count is set to 2 by trigger_gravity_touch() and decreased by 1 here.
+       // It the player has left the gravity trigger, this will be allowed to reach 0 and indicate that.
+       if(self.count <= 0)
+       {
+               if(self.owner.trigger_gravity_check == self)
+                       trigger_gravity_remove(self.owner);
+               else
+                       remove(self);
+               return;
+       }
+       else
+       {
+               self.count -= 1;
+               self.nextthink = time;
+       }
+};
+
+void trigger_gravity_use()
+{
+       self.state = !self.state;
+};
+
+void trigger_gravity_touch()
+{
+       float g;
+
+       if(self.state != TRUE)
+               return;
+
+       EXACTTRIGGER_TOUCH;
+
+       g = self.gravity;
+
+       if not(self.spawnflags & 1)
+       {
+               if(other.trigger_gravity_check)
+               {
+                       if(self == other.trigger_gravity_check.enemy)
+                       {
+                               // same?
+                               other.trigger_gravity_check.count = 2; // gravity one more frame...
+                               return;
+                       }
+
+                       // compare prio
+                       if(self.cnt > other.trigger_gravity_check.enemy.cnt)
+                               trigger_gravity_remove(other);
+                       else
+                               return;
+               }
+               other.trigger_gravity_check = spawn();
+               other.trigger_gravity_check.enemy = self;
+               other.trigger_gravity_check.owner = other;
+               other.trigger_gravity_check.gravity = other.gravity;
+               other.trigger_gravity_check.think = trigger_gravity_check_think;
+               other.trigger_gravity_check.nextthink = time;
+               other.trigger_gravity_check.count = 2;
+               if(other.gravity)
+                       g *= other.gravity;
+       }
+
+       if (other.gravity != g)
+       {
+               other.gravity = g;
+               if(self.noise != "")
+                       sound (other, CHAN_AUTO, self.noise, VOL_BASE, ATTN_NORM);
+               UpdateCSQCProjectile(self.owner);
+       }
+};
 
+void spawnfunc_trigger_gravity()
+{
+       if(self.gravity == 1)
+               return;
+
+       EXACTTRIGGER_INIT;
+       self.touch = trigger_gravity_touch;
+       if(self.noise != "")
+               precache_sound(self.noise);
+
+       self.state = TRUE;
+       IFTARGETED
+       {
+               self.use = trigger_gravity_use;
+               if(self.spawnflags & 2)
+                       self.state = FALSE;
+       }
+};
+
+//=============================================================================
 
 // TODO add a way to do looped sounds with sound(); then complete this entity
 .float volume, atten;
index ad9341e2d0f947e6aec137e193b3b5f0650d8a4d..f873ea7c6b00331ed188b2bf1bf3f030f165fc4f 100644 (file)
@@ -539,6 +539,11 @@ void spawnfunc_worldspawn (void)
 
                GameLogEcho(strcat(":gamestart:", GetGametype(), "_", GetMapname(), ":", s));
                s = ":gameinfo:mutators:LIST";
+
+               ret_string = s;
+               MUTATOR_CALLHOOK(BuildMutatorsString);
+               s = ret_string;
+
                if(cvar("g_grappling_hook"))
                        s = strcat(s, ":grappling_hook");
                if(!cvar("g_use_ammunition"))
@@ -547,8 +552,6 @@ void spawnfunc_worldspawn (void)
                        s = strcat(s, ":no_pickup_items");
                if(cvar_string("g_weaponarena") != "0")
                        s = strcat(s, ":", cvar_string("g_weaponarena"), " arena");
-               if(cvar("g_nixnex"))
-                       s = strcat(s, ":nixnex");
                if(cvar("g_vampire"))
                        s = strcat(s, ":vampire");
                if(cvar("g_laserguided_missile"))
@@ -632,6 +635,11 @@ void spawnfunc_worldspawn (void)
        addstat(STAT_LEADLIMIT, AS_FLOAT, stat_leadlimit);
        addstat(STAT_BULLETS_LOADED, AS_INT, campingrifle_bulletcounter);
 
+       // g_movementspeed hack
+       addstat(STAT_MOVEVARS_AIRSPEEDLIMIT_NONQW, AS_FLOAT, stat_sv_airspeedlimit_nonqw);
+       addstat(STAT_MOVEVARS_AIRACCEL_QW, AS_FLOAT, stat_sv_airaccel_qw);
+       addstat(STAT_MOVEVARS_AIRSTRAFEACCEL_QW, AS_FLOAT, stat_sv_airstrafeaccel_qw);
+
        next_pingtime = time + 5;
        InitializeEntity(self, cvar_changes_init, INITPRIO_CVARS);
 
@@ -2694,6 +2702,7 @@ float RedirectionThink()
        return TRUE;
 }
 
+void TargetMusic_RestoreGame();
 void RestoreGame()
 {
        // Loaded from a save game
@@ -2707,6 +2716,8 @@ void RestoreGame()
        MapInfo_Enumerate();
        MapInfo_FilterGametype(MapInfo_CurrentGametype(), MapInfo_CurrentFeatures(), MapInfo_RequiredFlags(), MapInfo_ForbiddenFlags(), 1);
        WeaponStats_Init();
+
+       TargetMusic_RestoreGame();
 }
 
 void SV_Shutdown()
index af03b8348d7af30c96b0b979ec911475d35b6931..a6881b293ca52ae2754bc9f80ebfa281a386589f 100644 (file)
@@ -588,7 +588,7 @@ void EffectIndexDump()
        db_put(d, "TR_KNIGHTSPIKE", "1"); print("effect TR_KNIGHTSPIKE is ", ftos(particleeffectnum("TR_KNIGHTSPIKE")), "\n");
        db_put(d, "TR_VORESPIKE", "1"); print("effect TR_VORESPIKE is ", ftos(particleeffectnum("TR_VORESPIKE")), "\n");
        db_put(d, "TR_NEHAHRASMOKE", "1"); print("effect TR_NEHAHRASMOKE is ", ftos(particleeffectnum("TR_NEHAHRASMOKE")), "\n");
-       db_put(d, "TR_XONOTICPLASMA", "1"); print("effect TR_XONOTICPLASMA is ", ftos(particleeffectnum("TR_XONOTICPLASMA")), "\n");
+       db_put(d, "TR_NEXUIZPLASMA", "1"); print("effect TR_NEXUIZPLASMA is ", ftos(particleeffectnum("TR_NEXUIZPLASMA")), "\n");
        db_put(d, "TR_GLOWTRAIL", "1"); print("effect TR_GLOWTRAIL is ", ftos(particleeffectnum("TR_GLOWTRAIL")), "\n");
        db_put(d, "SVC_PARTICLE", "1"); print("effect SVC_PARTICLE is ", ftos(particleeffectnum("SVC_PARTICLE")), "\n");
 
@@ -960,15 +960,25 @@ void GameCommand(string command)
                if(argv(1) == "w")
                        setmodel(e, (nextent(world)).weaponentity.model);
                else
+               {
+                       precache_model(argv(1));
                        setmodel(e, argv(1));
+               }
                e.frame = stof(argv(2));
-               i = gettagindex(e, argv(3));
+               if(substring(argv(3), 0, 1) == "#")
+                       i = stof(substring(argv(3), 1, -1));
+               else
+                       i = gettagindex(e, argv(3));
                if(i)
                {
                        v = gettaginfo(e, i);
-                       print("model ", e.model, " frame ", ftos(e.frame), " tag ", argv(3));
-                       print(" index = ", ftos(i));
+                       print("model ", e.model, " frame ", ftos(e.frame), " tag ", gettaginfo_name);
+                       print(" index ", ftos(i), " parent ", ftos(gettaginfo_parent), "\n");
                        print(" vector = ", ftos(v_x), " ", ftos(v_y), " ", ftos(v_z), "\n");
+                       print(" offset = ", ftos(gettaginfo_offset_x), " ", ftos(gettaginfo_offset_y), " ", ftos(gettaginfo_offset_z), "\n");
+                       print(" forward = ", ftos(gettaginfo_forward_x), " ", ftos(gettaginfo_forward_y), " ", ftos(gettaginfo_forward_z), "\n");
+                       print(" right = ", ftos(gettaginfo_right_x), " ", ftos(gettaginfo_right_y), " ", ftos(gettaginfo_right_z), "\n");
+                       print(" up = ", ftos(gettaginfo_up_x), " ", ftos(gettaginfo_up_y), " ", ftos(gettaginfo_up_z), "\n");
                        if(argc >= 6)
                        {
                                v_y = -v_y;
@@ -1333,6 +1343,17 @@ void GameCommand(string command)
                return;
        }
 
+       if(argv(0) == "showtraceline")
+       {
+               vector src, dst;
+               src = stov(argv(1));
+               dst = stov(argv(2));
+               traceline(src, dst, MOVE_NORMAL, world);
+               trailparticles(world, particleeffectnum("TR_NEXUIZPLASMA"), src, trace_endpos);
+               trailparticles(world, particleeffectnum("TR_CRYLINKPLASMA"), trace_endpos, dst);
+               return;
+       }
+
        print("Invalid command. For a list of supported commands, try sv_cmd help.\n");
 }
 
diff --git a/qcsrc/server/keyhunt.qc b/qcsrc/server/keyhunt.qc
deleted file mode 100644 (file)
index eb3e239..0000000
+++ /dev/null
@@ -1,1014 +0,0 @@
-#define FOR_EACH_KH_KEY(v) for(v = kh_worldkeylist; v; v = v.kh_worldkeynext )
-
-// #define KH_PLAYER_USE_ATTACHMENT
-// #define KH_PLAYER_USE_CARRIEDMODEL
-// #define KH_KEY_ATTACHMENT_DEBUG
-
-#ifdef KH_PLAYER_USE_ATTACHMENT
-vector KH_PLAYER_ATTACHMENT_DIST_ROTATED = '0 -4 0';
-vector KH_PLAYER_ATTACHMENT_DIST = '4 0 0';
-vector KH_PLAYER_ATTACHMENT = '0 0 0';
-vector KH_PLAYER_ATTACHMENT_ANGLES = '0 0 0';
-string KH_PLAYER_ATTACHMENT_BONE = "";
-#else
-float KH_KEY_ZSHIFT = 22;
-float KH_KEY_XYDIST = 24;
-float KH_KEY_XYSPEED = 45;
-#endif
-float KH_KEY_WP_ZSHIFT = 20;
-
-vector KH_KEY_MIN = '-10 -10 -46';
-vector KH_KEY_MAX = '10 10 3';
-float KH_KEY_BRIGHTNESS = 2;
-
-string kh_Controller_Waitmsg;
-float kh_no_radar_circles;
-
-// kh_state
-//     bits  0- 4: team of key 1, or 0 for no such key, or 30 for dropped, or 31 for self
-//     bits  5- 9: team of key 2, or 0 for no such key, or 30 for dropped, or 31 for self
-//     bits 10-14: team of key 3, or 0 for no such key, or 30 for dropped, or 31 for self
-//     bits 15-19: team of key 4, or 0 for no such key, or 30 for dropped, or 31 for self
-.float kh_state;
-.float siren_time;  //  time delay the siren
-//.float stuff_time;  //  time delay to stuffcmd a cvar
-
-float test[17] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
-//test[0] = status of dropped keys, test[1 - 16] = player #
-//replace 17 with cvar("maxplayers") or similar !!!!!!!!!
-//for(i = 0; i < maxplayers; ++i)
-//     test[i] = "0";
-
-float kh_Team_ByID(float t)
-{
-       if(t == 0) return COLOR_TEAM1;
-       if(t == 1) return COLOR_TEAM2;
-       if(t == 2) return COLOR_TEAM3;
-       if(t == 3) return COLOR_TEAM4;
-       return 0;
-}
-
-entity kh_worldkeylist;
-.entity kh_worldkeynext;
-entity kh_controller;
-float kh_tracking_enabled;
-float kh_teams;
-float kh_interferemsg_time, kh_interferemsg_team;
-.entity kh_next, kh_prev; // linked list
-.float kh_droptime;
-.float kh_dropperteam;
-.entity kh_previous_owner;
-.float kh_previous_owner_playerid;
-
-string kh_sound_capture = "kh/capture.wav";
-string kh_sound_destroy = "kh/destroy.wav";
-string kh_sound_drop = "kh/drop.wav";
-string kh_sound_collect = "kh/collect.wav";
-string kh_sound_alarm = "kh/alarm.wav";  // the new siren/alarm
-
-float kh_key_dropped, kh_key_carried;
-
-void kh_Controller_SetThink(float t, string msg, kh_Think_t func)  // runs occasionaly
-{
-       kh_Controller_Thinkfunc = func;
-       kh_controller.cnt = ceil(t);
-       if(kh_Controller_Waitmsg != "")
-               strunzone(kh_Controller_Waitmsg);
-       if(msg == "")
-               kh_Controller_Waitmsg = "";
-       else
-               kh_Controller_Waitmsg = strzone(msg);
-       if(t == 0)
-               kh_controller.nextthink = time; // force
-}
-
-void kh_Controller_Think()  // called a lot
-{
-       entity e;
-       if(intermission_running)
-               return;
-       if(self.cnt > 0)
-       {
-               if(kh_Controller_Waitmsg != "")
-               {
-                       string s;
-                       if(substring(kh_Controller_Waitmsg, strlen(kh_Controller_Waitmsg)-1, 1) == " ")
-                               s = strcat(kh_Controller_Waitmsg, ftos(self.cnt));
-                       else
-                               s = kh_Controller_Waitmsg;
-
-                       //dprint(s, "\n");
-
-                       FOR_EACH_PLAYER(e)
-                               if(clienttype(e) == CLIENTTYPE_REAL)
-                                       centerprint_atprio(e, CENTERPRIO_SPAM, s);
-               }
-               self.cnt -= 1;
-       }
-       else if(self.cnt == 0)
-       {
-               self.cnt -= 1;
-               kh_Controller_Thinkfunc();
-       }
-       self.nextthink = time + 1;
-}
-
-// frags f: take from cvar * f
-// frags 0: no frags
-void kh_Scores_Event(entity player, entity key, string what, float frags_player, float frags_owner)  // update the score when a key is captured
-{
-       string s;
-       if(intermission_running)
-               return;
-
-       if(frags_player)
-               UpdateFrags(player, frags_player);
-
-       if(key && key.owner && frags_owner)
-               UpdateFrags(key.owner, frags_owner);
-
-       if(!cvar("sv_eventlog"))  //output extra info to the console or text file
-               return;
-
-       s = strcat(":keyhunt:", what, ":", ftos(player.playerid), ":", ftos(frags_player));
-
-       if(key && key.owner)
-               s = strcat(s, ":", ftos(key.owner.playerid));
-       else
-               s = strcat(s, ":0");
-
-       s = strcat(s, ":", ftos(frags_owner), ":");
-
-       if(key)
-               s = strcat(s, key.netname);
-
-       GameLogEcho(s);
-}
-
-vector kh_AttachedOrigin(entity e)  // runs when a team captures the flag, it can run 2 or 3 times.
-{
-       if(e.tag_entity)
-       {
-               makevectors(e.tag_entity.angles);
-               return e.tag_entity.origin + e.origin_x * v_forward - e.origin_y * v_right + e.origin_z * v_up;
-       }
-       else
-               return e.origin;
-}
-
-void kh_Key_Attach(entity key)  // runs when a player picks up a key and several times when a key is assigned to a player at the start of a round
-{
-#ifdef KH_PLAYER_USE_ATTACHMENT
-       entity first;
-       first = key.owner.kh_next;
-       if(key == first)
-       {
-               setattachment(key, key.owner, KH_PLAYER_ATTACHMENT_BONE);
-               if(key.kh_next)
-               {
-                       setattachment(key.kh_next, key, "");
-                       setorigin(key, key.kh_next.origin - 0.5 * KH_PLAYER_ATTACHMENT_DIST);
-                       setorigin(key.kh_next, KH_PLAYER_ATTACHMENT_DIST_ROTATED);
-                       key.kh_next.angles = '0 0 0';
-               }
-               else
-                       setorigin(key, KH_PLAYER_ATTACHMENT);
-               key.angles = KH_PLAYER_ATTACHMENT_ANGLES;
-       }
-       else
-       {
-               setattachment(key, key.kh_prev, "");
-               if(key.kh_next)
-                       setattachment(key.kh_next, key, "");
-               setorigin(key, KH_PLAYER_ATTACHMENT_DIST_ROTATED);
-               setorigin(first, first.origin - 0.5 * KH_PLAYER_ATTACHMENT_DIST);
-               key.angles = '0 0 0';
-       }
-#else
-       setattachment(key, key.owner, "");
-       setorigin(key, '0 0 1' * KH_KEY_ZSHIFT);  // fixing x, y in think
-       key.angles_y -= key.owner.angles_y;
-#endif
-       key.flags = 0;
-       key.solid = SOLID_NOT;
-       key.movetype = MOVETYPE_NONE;
-       key.team = key.owner.team;
-       key.nextthink = time;
-       key.damageforcescale = 0;
-       key.takedamage = DAMAGE_NO;
-       key.modelindex = kh_key_carried;
-}
-
-void kh_Key_Detach(entity key) // runs every time a key is dropped or lost. Runs several times times when all the keys are captured
-{
-#ifdef KH_PLAYER_USE_ATTACHMENT
-       entity first;
-       first = key.owner.kh_next;
-       if(key == first)
-       {
-               if(key.kh_next)
-               {
-                       setattachment(key.kh_next, key.owner, KH_PLAYER_ATTACHMENT_BONE);
-                       setorigin(key.kh_next, key.origin + 0.5 * KH_PLAYER_ATTACHMENT_DIST);
-                       key.kh_next.angles = KH_PLAYER_ATTACHMENT_ANGLES;
-               }
-       }
-       else
-       {
-               if(key.kh_next)
-                       setattachment(key.kh_next, key.kh_prev, "");
-               setorigin(first, first.origin + 0.5 * KH_PLAYER_ATTACHMENT_DIST);
-       }
-       // in any case:
-       setattachment(key, world, "");
-       setorigin(key, key.owner.origin + '0 0 1' * (PL_MIN_z - KH_KEY_MIN_z));
-       key.angles = key.owner.angles;
-#else
-       setorigin(key, key.owner.origin + key.origin_z * '0 0 1');
-       setattachment(key, world, "");
-       key.angles_y += key.owner.angles_y;
-#endif
-       key.flags = FL_ITEM;
-       key.solid = SOLID_TRIGGER;
-       key.movetype = MOVETYPE_TOSS;
-       key.pain_finished = time + cvar("g_balance_keyhunt_delay_return");
-       key.damageforcescale = cvar("g_balance_keyhunt_damageforcescale");
-       key.takedamage = DAMAGE_YES;
-       // let key.team stay
-       key.modelindex = kh_key_dropped;
-       key.kh_previous_owner = key.owner;
-       key.kh_previous_owner_playerid = key.owner.playerid;
-}
-
-void kh_Key_AssignTo(entity key, entity player)  // runs every time a key is picked up or assigned. Runs prior to kh_key_attach
-{
-       entity k;
-       float ownerteam0, ownerteam;
-       if(key.owner == player)
-               return;
-
-       ownerteam0 = kh_Key_AllOwnedByWhichTeam();
-
-       if(key.owner)
-       {
-               kh_Key_Detach(key);
-
-               // remove from linked list
-               if(key.kh_next)
-                       key.kh_next.kh_prev = key.kh_prev;
-               key.kh_prev.kh_next = key.kh_next;
-               key.kh_next = world;
-               key.kh_prev = world;
-
-               if(key.owner.kh_next == world)
-               {
-                       // No longer a key carrier
-                       if(!kh_no_radar_circles)
-                               WaypointSprite_Ping(key.owner.waypointsprite_attachedforcarrier);
-                       WaypointSprite_DetachCarrier(key.owner);
-               }
-       }
-
-       key.owner = player;
-
-       if(player)
-       {
-               // insert into linked list
-               key.kh_next = player.kh_next;
-               key.kh_prev = player;
-               player.kh_next = key;
-               if(key.kh_next)
-                       key.kh_next.kh_prev = key;
-
-               float i;
-               i = test[key.owner.playerid];
-                       if(key.netname == "^1red key")
-                               i += 1;
-                       if(key.netname == "^4blue key")
-                               i += 2;
-                       if(key.netname == "^3yellow key")
-                               i += 4;
-                       if(key.netname == "^6pink key")
-                               i += 8;
-               test[key.owner.playerid] = i;
-
-               kh_Key_Attach(key);
-
-               if(key.kh_next == world)
-               {
-                       // player is now a key carrier
-                       WaypointSprite_AttachCarrier("", player);
-                       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)
-                               WaypointSprite_UpdateSprites(player.waypointsprite_attachedforcarrier, "keycarrier-red", "keycarrier-friend", "keycarrier-red");
-                       else if(player.team == COLOR_TEAM2)
-                               WaypointSprite_UpdateSprites(player.waypointsprite_attachedforcarrier, "keycarrier-blue", "keycarrier-friend", "keycarrier-blue");
-                       else if(player.team == COLOR_TEAM3)
-                               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);
-               }
-       }
-
-       // moved that here, also update if there's no player
-       kh_update_state();
-
-       key.pusher = world;
-
-       ownerteam = kh_Key_AllOwnedByWhichTeam();
-       if(ownerteam != ownerteam0)
-       {
-               if(ownerteam != -1)
-               {
-                       kh_interferemsg_time = time + 0.2;
-                       kh_interferemsg_team = player.team;
-
-                       // audit all key carrier sprites, update them to RUN HERE
-                       FOR_EACH_KH_KEY(k)
-                       {
-                               if(k.owner)
-                                       WaypointSprite_UpdateSprites(k.owner.waypointsprite_attachedforcarrier, k.owner.waypointsprite_attachedforcarrier.model1, "keycarrier-finish", k.owner.waypointsprite_attachedforcarrier.model3);
-                       }
-               }
-               else
-               {
-                       kh_interferemsg_time = 0;
-
-                       // audit all key carrier sprites, update them to RUN HERE
-                       FOR_EACH_KH_KEY(k)
-                       {
-                               if(k.owner)
-                                       WaypointSprite_UpdateSprites(k.owner.waypointsprite_attachedforcarrier, k.owner.waypointsprite_attachedforcarrier.model1, "keycarrier-friend", k.owner.waypointsprite_attachedforcarrier.model3);
-                       }
-               }
-       }
-}
-
-void kh_Key_Damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
-{
-       if(self.owner)
-               return;
-       if(vlen(force) <= 0)
-               return;
-       if(time > self.pushltime)
-               if(attacker.classname == "player")
-                       self.team = attacker.team;
-}
-
-void key_reset()
-{
-       kh_Key_AssignTo(self, world);
-       kh_Key_Remove(self);
-}
-
-void kh_Key_Spawn(entity initial_owner, float angle, float i)  // runs every time a new flag is created, ie after all the keys have been collected
-{
-       entity key;
-       key = spawn();
-       key.count = i;
-       key.classname = STR_ITEM_KH_KEY;
-       key.touch = kh_Key_Touch;
-       key.think = kh_Key_Think;
-       key.nextthink = time;
-       key.items = IT_KEY1 | IT_KEY2;
-       key.cnt = angle;
-       key.angles = '0 360 0' * random();
-       key.event_damage = kh_Key_Damage;
-       key.takedamage = DAMAGE_YES;
-       key.modelindex = kh_key_dropped;
-       key.model = "key";
-       key.kh_dropperteam = 0;
-       key.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
-       setsize(key, KH_KEY_MIN, KH_KEY_MAX);
-       key.colormod = TeamColor(initial_owner.team) * KH_KEY_BRIGHTNESS;
-       key.reset = key_reset;
-
-       switch(initial_owner.team)
-       {
-               case COLOR_TEAM1:
-                       key.netname = "^1red key";
-                       break;
-               case COLOR_TEAM2:
-                       key.netname = "^4blue key";
-                       break;
-               case COLOR_TEAM3:
-                       key.netname = "^3yellow key";
-                       break;
-               case COLOR_TEAM4:
-                       key.netname = "^6pink key";
-                       break;
-               default:
-                       key.netname = "NETGIER key";
-                       break;
-       }
-
-       // link into key list
-       key.kh_worldkeynext = kh_worldkeylist;
-       kh_worldkeylist = key;
-
-       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);
-       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);
-}
-
-void kh_Key_Remove(entity key)  // runs after when all the keys have been collected or when a key has been dropped for more than X seconds
-{
-       entity o;
-       o = key.owner;
-       kh_Key_AssignTo(key, world);
-       if(o) // it was attached
-               WaypointSprite_Kill(key.waypointsprite_attachedforcarrier);
-       else // it was dropped
-               WaypointSprite_DetachCarrier(key);
-
-       // remove key from key list
-       if (kh_worldkeylist == key)
-               kh_worldkeylist = kh_worldkeylist.kh_worldkeynext;
-       else
-       {
-               o = kh_worldkeylist;
-               while (o)
-               {
-                       if (o.kh_worldkeynext == key)
-                       {
-                               o.kh_worldkeynext = o.kh_worldkeynext.kh_worldkeynext;
-                               break;
-                       }
-                       o = o.kh_worldkeynext;
-               }
-       }
-
-       remove(key);
-
-       kh_update_state();
-}
-
-// -1 when no team completely owns all keys yet
-float kh_Key_AllOwnedByWhichTeam()  // constantly called. check to see if all the keys are owned by the same team
-{
-       entity key;
-       float teem;
-       float keys;
-
-       teem = -1;
-       keys = kh_teams;
-       FOR_EACH_KH_KEY(key)
-       {
-               if(!key.owner)
-                       return -1;
-               if(teem == -1)
-                       teem = key.team;
-               else if(teem != key.team)
-                       return -1;
-               --keys;
-       }
-       if(keys != 0)
-               return -1;
-       return teem;
-}
-
-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);
-
-       if(key.kh_dropperteam != player.team)
-       {
-               kh_Scores_Event(player, key, "collect", cvar("g_balance_keyhunt_score_collect"), 0);
-               PlayerScore_Add(player, SP_KH_PICKUPS, 1);
-       }
-       key.kh_dropperteam = 0;
-       bprint(player.netname, "^7 picked up the ", key.netname, "\n");
-
-       kh_Key_AssignTo(key, player); // this also updates .kh_state
-}
-
-void kh_Key_DropAll(entity player, float suicide) // runs whenever a player dies
-{
-       entity key;
-       entity mypusher;
-       if(player.kh_next)
-       {
-               mypusher = world;
-               if(player.pusher)
-                       if(time < player.pushltime)
-                               mypusher = player.pusher;
-               while((key = player.kh_next))
-               {
-                       kh_Scores_Event(player, key, "losekey", 0, 0);
-                       PlayerScore_Add(player, SP_KH_LOSSES, 1);
-                       bprint(player.netname, "^7 died and lost the ", key.netname, "\n");
-                       kh_Key_AssignTo(key, world);
-                       makevectors('-1 0 0' * (45 + 45 * random()) + '0 360 0' * random());
-                       key.velocity = W_CalculateProjectileVelocity(player.velocity, cvar("g_balance_keyhunt_dropvelocity") * v_forward);
-                       key.pusher = mypusher;
-                       key.pushltime = time + cvar("g_balance_keyhunt_protecttime");
-                       if(suicide)
-                               key.kh_dropperteam = player.team;
-               }
-               sound(player, CHAN_AUTO, kh_sound_drop, VOL_BASE, ATTN_NORM);
-       }
-}
-
-void kh_Key_Touch()  // runs many, many times when a key has been dropped and can be picked up
-{
-       if(intermission_running)
-               return;
-
-       if(self.owner) // already carried
-               return;
-       if(other.classname != "player")
-               return;
-       if(other.deadflag != DEAD_NO)
-               return;
-       if(other == self.enemy)
-               if(time < self.kh_droptime + cvar("g_balance_keyhunt_delay_collect"))
-                       return;  // you just dropped it!
-       kh_Key_Collect(self, other);
-}
-
-void kh_Key_Think()  // runs all the time
-{
-       entity head;
-       //entity player;  // needed by FOR_EACH_PLAYER
-
-       if(intermission_running)
-               return;
-
-#ifdef KH_KEY_ATTACHMENT_DEBUG
-       if(self.kh_prev == self.owner)
-       {
-               if(cvar_string("_angles") != "")
-               {
-                       self.angles = stov(cvar_string("_angles"));
-                       setorigin(self, stov(cvar_string("_origin")));
-               }
-       }
-#endif
-
-       if(self.owner)
-       {
-#ifndef KH_PLAYER_USE_ATTACHMENT
-               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 + cvar("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, cvar("g_balance_keyhunt_throwvelocity") * v_forward);
-                       kh_Key_AssignTo(self, world);
-                       self.pushltime = time + cvar("g_balance_keyhunt_protecttime");
-                       self.kh_dropperteam = self.team;
-               }
-       }
-
-       // if in nodrop or time over, end the round
-       if(!self.owner)
-               if(time > self.pain_finished)
-                       kh_LoserTeam(self.team, self);
-
-       if(self.owner)
-       if(kh_Key_AllOwnedByWhichTeam() != -1)
-       {
-               if(self.siren_time < time)
-               {
-                       sound(self.owner, CHAN_AUTO, kh_sound_alarm, VOL_BASE, ATTN_NORM);  // play a simple alarm
-                       self.siren_time = time + 2.5;  // repeat every 2.5 seconds
-               }
-
-               entity key;
-               vector p;
-               p = self.owner.origin;
-               FOR_EACH_KH_KEY(key)
-                       if(vlen(key.owner.origin - p) > cvar("g_balance_keyhunt_maxdist"))
-                               goto not_winning;
-               kh_WinnerTeam(self.team);
-:not_winning
-       }
-
-       if(kh_interferemsg_time && time > kh_interferemsg_time)
-       {
-               kh_interferemsg_time = 0;
-               FOR_EACH_PLAYER(head)
-               {
-                       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!");
-                               else
-                                       centerprint(head, "All keys are in your team's hands!\n\nHelp the key carriers to meet!");
-                       else
-                               centerprint(head, strcat("All keys are in the ", ColoredTeamName(kh_interferemsg_team), "^7's hands!\n\nInterfere ^1NOW^7!"));
-               }
-       }
-
-       self.nextthink = time + 0.05;
-}
-
-void kh_WinnerTeam(float teem)  // runs when a team wins
-{
-       // all key carriers get some points
-       vector firstorigin, lastorigin, midpoint;
-       float first;
-       entity key;
-       float score;
-       score = (kh_teams - 1) * cvar("g_balance_keyhunt_score_capture");
-       DistributeEvenly_Init(score, kh_teams);
-       // twice the score for 3 team games, three times the score for 4 team games!
-       // note: for a win by destroying the key, this should NOT be applied
-       FOR_EACH_KH_KEY(key)
-       {
-               float f;
-               f = DistributeEvenly_Get(1);
-               kh_Scores_Event(key.owner, key, "capture", f, 0);
-               PlayerTeamScore_Add(key.owner, SP_KH_CAPS, ST_KH_CAPS, 1);
-       }
-
-       first = TRUE;
-       FOR_EACH_KH_KEY(key)
-               if(key.owner.kh_next == key)
-               {
-                       if(!first)
-                               bprint("^7, ");
-                       bprint(key.owner.netname);
-                       first = FALSE;
-               }
-       bprint("^7 captured the keys for the ", ColoredTeamName(teem), "\n");
-
-       first = TRUE;
-       midpoint = '0 0 0';
-       FOR_EACH_KH_KEY(key)
-       {
-               vector thisorigin;
-
-               thisorigin = kh_AttachedOrigin(key);
-               //dprint("Key origin: ", vtos(thisorigin), "\n");
-               midpoint += thisorigin;
-
-               if(!first)
-                       te_lightning2(world, lastorigin, thisorigin);
-               lastorigin = thisorigin;
-               if(first)
-                       firstorigin = thisorigin;
-               first = FALSE;
-       }
-       if(kh_teams > 2)
-       {
-               te_lightning2(world, lastorigin, firstorigin);
-       }
-       midpoint = midpoint * (1 / kh_teams);
-       te_customflash(midpoint, 1000, 1, TeamColor(teem) * 0.5 + '0.5 0.5 0.5');  // make the color >=0.5 in each component
-
-       play2all(kh_sound_capture);
-       kh_FinishRound();
-}
-
-void kh_LoserTeam(float teem, entity lostkey)  // runs when a player pushes a flag carrier off the map
-{
-       entity player, key, attacker;
-       float players;
-       float keys;
-       float f;
-
-       attacker = world;
-       if(lostkey.pusher)
-               if(lostkey.pusher.team != teem)
-                       if(lostkey.pusher.classname == "player")
-                               attacker = lostkey.pusher;
-
-       players = keys = 0;
-
-       if(attacker)
-       {
-               if(lostkey.kh_previous_owner)
-                       kh_Scores_Event(lostkey.kh_previous_owner, world, "pushed", 0, -cvar("g_balance_keyhunt_score_push"));
-                       // don't actually GIVE him the -nn points, just log
-               kh_Scores_Event(attacker, world, "push", cvar("g_balance_keyhunt_score_push"), 0);
-               PlayerScore_Add(attacker, SP_KH_PUSHES, 1);
-               centerprint(attacker, "Your push is the best!");
-               bprint("The ", ColoredTeamName(teem), "^7 could not take care of the ", lostkey.netname, "^7 when ", attacker.netname, "^7 came\n");
-       }
-       else
-       {
-               float of, fragsleft, i, j, thisteam;
-               of = cvar("g_balance_keyhunt_score_destroyed_ownfactor");
-
-               FOR_EACH_PLAYER(player)
-                       if(player.team != teem)
-                               ++players;
-
-               FOR_EACH_KH_KEY(key)
-                       if(key.owner && key.team != teem)
-                               ++keys;
-
-               if(lostkey.kh_previous_owner)
-                       kh_Scores_Event(lostkey.kh_previous_owner, world, "destroyed", 0, -cvar("g_balance_keyhunt_score_destroyed"));
-                       // don't actually GIVE him the -nn points, just log
-
-               if(lostkey.kh_previous_owner.playerid == lostkey.kh_previous_owner_playerid)
-                       PlayerScore_Add(lostkey.kh_previous_owner, SP_KH_DESTROYS, 1);
-
-               DistributeEvenly_Init(cvar("g_balance_keyhunt_score_destroyed"), keys * of + players);
-
-               FOR_EACH_KH_KEY(key)
-                       if(key.owner && key.team != teem)
-                       {
-                               f = DistributeEvenly_Get(of);
-                               kh_Scores_Event(key.owner, world, "destroyed_holdingkey", f, 0);
-                       }
-
-               fragsleft = DistributeEvenly_Get(players);
-
-               // Now distribute these among all other teams...
-               j = kh_teams - 1;
-               for(i = 0; i < kh_teams; ++i)
-               {
-                       thisteam = kh_Team_ByID(i);
-                       if(thisteam == teem) // bad boy, no cookie - this WILL happen
-                               continue;
-
-                       players = 0;
-                       FOR_EACH_PLAYER(player)
-                               if(player.team == thisteam)
-                                       ++players;
-
-                       DistributeEvenly_Init(fragsleft, j);
-                       fragsleft = DistributeEvenly_Get(j - 1);
-                       DistributeEvenly_Init(DistributeEvenly_Get(1), players);
-
-                       FOR_EACH_PLAYER(player)
-                               if(player.team == thisteam)
-                               {
-                                       f = DistributeEvenly_Get(1);
-                                       kh_Scores_Event(player, world, "destroyed", f, 0);
-                               }
-
-                       --j;
-               }
-
-               bprint("The ", ColoredTeamName(teem), "^7 could not take care of the ", lostkey.netname, "\n");
-       }
-       play2all(kh_sound_destroy);
-       te_tarexplosion(lostkey.origin);
-
-       kh_FinishRound();
-}
-
-void kh_FinishRound()  // runs when a team captures the keys
-{
-       // prepare next round
-       kh_interferemsg_time = 0;
-       entity key;
-
-       kh_no_radar_circles = TRUE;
-       FOR_EACH_KH_KEY(key)
-               kh_Key_Remove(key);
-       kh_no_radar_circles = FALSE;
-
-       kh_Controller_SetThink(cvar("g_balance_keyhunt_delay_round"), "Round starts in ", kh_StartRound);
-}
-
-string kh_CheckEnoughPlayers()  // checks enough player are present, runs after every completed round
-{
-       float i, players, teem;
-       entity player;
-       string result;
-       result = "";
-
-       // find a random player per team
-       for(i = 0; i < kh_teams; ++i)
-       {
-               teem = kh_Team_ByID(i);
-               players = 0;
-               FOR_EACH_PLAYER(player)
-                       if(player.deadflag == DEAD_NO)
-                               if(!player.BUTTON_CHAT)
-                                       if(player.team == teem)
-                                               ++players;
-               if(players == 0)
-               {
-                       if(result != "")
-                               result = strcat(result, ", ");
-                       result = strcat(result, ColoredTeamName(teem));
-               }
-       }
-       return result;
-}
-
-void kh_WaitForPlayers()  // delay start of the round until enough players are present
-{
-       string teams_missing;
-
-       if(time < game_starttime)
-       {
-               kh_Controller_SetThink(game_starttime - time + 0.1, "", kh_WaitForPlayers);
-               return;
-       }
-
-       teams_missing = kh_CheckEnoughPlayers();
-       if(teams_missing == "")
-               kh_Controller_SetThink(cvar("g_balance_keyhunt_delay_round"), "Round starts in ", kh_StartRound);
-       else
-               kh_Controller_SetThink(1, strcat("Waiting for players to join...\n\nNeed active players for: ", teams_missing), kh_WaitForPlayers);
-}
-
-void kh_StartRound()  // runs at the start of each round
-{
-       string teams_missing;
-       float i, players, teem;
-       entity player;
-
-       if(time < game_starttime)
-       {
-               kh_Controller_SetThink(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);
-               return;
-       }
-
-       FOR_EACH_PLAYER(player)
-               if(clienttype(player) == CLIENTTYPE_REAL)
-                       centerprint_expire(player, CENTERPRIO_SPAM);
-
-       for(i = 0; i < kh_teams; ++i)
-       {
-               teem = kh_Team_ByID(i);
-               players = 0;
-               entity my_player;
-               FOR_EACH_PLAYER(player)
-                       if(player.deadflag == DEAD_NO)
-                               if(!player.BUTTON_CHAT)
-                                       if(player.team == teem)
-                                       {
-                                               ++players;
-                                               if(random() * players <= 1)
-                                                       my_player = player;
-                                       }
-               kh_Key_Spawn(my_player, 360 * i / kh_teams, i);
-       }
-
-       kh_tracking_enabled = FALSE;
-       kh_Controller_SetThink(cvar("g_balance_keyhunt_delay_tracking"), "Scanning frequency range...", kh_EnableTrackingDevice);
-}
-
-void kh_EnableTrackingDevice()  // runs after each round
-{
-       entity player;
-
-       FOR_EACH_PLAYER(player)
-               if(clienttype(player) == CLIENTTYPE_REAL)
-                       centerprint_expire(player, CENTERPRIO_SPAM);
-
-       kh_tracking_enabled = TRUE;
-}
-
-float kh_Key_waypointsprite_visible_for_player(entity e) // ??
-{
-       if(!kh_tracking_enabled)
-               return FALSE;
-       if(!self.owner)
-               return TRUE;
-       if(!self.owner.owner)
-               return TRUE;
-       return FALSE;  // draw only when key is not owned
-}
-
-float kh_KeyCarrier_waypointsprite_visible_for_player(entity e)  // runs all the time
-{
-       if(e.classname != "player" || self.team != e.team)
-               if(!kh_tracking_enabled)
-                       return FALSE;
-
-       return TRUE;
-}
-
-float kh_HandleFrags(entity attacker, entity targ, float f)  // adds to the player score
-{
-       if(attacker == targ)
-               return f;
-
-       if(targ.kh_next)
-       {
-               if(attacker.team == targ.team)
-               {
-                       entity k;
-                       float nk;
-                       nk = 0;
-                       for(k = targ.kh_next; k != world; k = k.kh_next)
-                               ++nk;
-                       kh_Scores_Event(attacker, targ.kh_next, "carrierfrag", -nk * cvar("g_balance_keyhunt_score_collect"), 0);
-               }
-               else
-               {
-                       kh_Scores_Event(attacker, targ.kh_next, "carrierfrag", cvar("g_balance_keyhunt_score_carrierfrag")-1, 0);
-                       PlayerScore_Add(attacker, SP_KH_KCKILLS, 1);
-                       // the frag gets added later
-               }
-       }
-
-       return f;
-}
-
-void kh_init()  // sets up th KH environment
-{
-       precache_sound(kh_sound_capture);
-       precache_sound(kh_sound_destroy);
-       precache_sound(kh_sound_drop);
-       precache_sound(kh_sound_collect);
-       precache_sound(kh_sound_alarm);  // the new siren
-
-#ifdef KH_PLAYER_USE_CARRIEDMODEL
-       precache_model("models/keyhunt/key-carried.md3");
-#endif
-       precache_model("models/keyhunt/key.md3");
-
-       // setup variables
-       kh_teams = cvar("g_keyhunt_teams_override");
-       if(kh_teams < 2)
-               kh_teams = cvar("g_keyhunt_teams");
-       kh_teams = bound(2, kh_teams, 4);
-
-       // make a KH entity for controlling the game
-       kh_controller = spawn();
-       kh_controller.think = kh_Controller_Think;
-       kh_Controller_SetThink(0, "", kh_WaitForPlayers);
-
-       setmodel(kh_controller, "models/keyhunt/key.md3");
-       kh_key_dropped = kh_controller.modelindex;
-       /*
-       dprint(vtos(kh_controller.mins));
-       dprint(vtos(kh_controller.maxs));
-       dprint("\n");
-       */
-#ifdef KH_PLAYER_USE_CARRIEDMODEL
-       setmodel(kh_controller, "models/keyhunt/key-carried.md3");
-       kh_key_carried = kh_controller.modelindex;
-#else
-       kh_key_carried = kh_key_dropped;
-#endif
-
-       kh_controller.model = "";
-       kh_controller.modelindex = 0;
-
-       addstat(STAT_KH_KEYS, AS_INT, kh_state);
-
-       ScoreRules_kh(kh_teams);
-}
-
-void kh_finalize()
-{
-       // to be called before intermission
-       kh_FinishRound();
-       remove(kh_controller);
-       kh_controller = world;
-}
-
-void kh_update_state()
-{
-       entity player;
-       entity key;
-       float s;
-       float f;
-
-       s = 0;
-       FOR_EACH_KH_KEY(key)
-       {
-               if(key.owner)
-                       f = key.team;
-               else
-                       f = 30;
-               s |= pow(32, key.count) * f;
-       }
-
-       FOR_EACH_CLIENT(player)
-       {
-               player.kh_state = s;
-       }
-
-       FOR_EACH_KH_KEY(key)
-       {
-               if(key.owner)
-                       key.owner.kh_state |= pow(32, key.count) * 31;
-       }
-       //print(ftos((nextent(world)).kh_state), "\n");
-}
diff --git a/qcsrc/server/keyhunt.qh b/qcsrc/server/keyhunt.qh
deleted file mode 100644 (file)
index 99f7566..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-.float kh_state;
-float kh_teams;
-float kh_tracking_enabled;
-.entity kh_next, kh_prev;
-
-void kh_Scores_Event(entity player, entity key, string what, float frags_player, float frags_owner);
-void kh_Key_Attach(entity key);
-void kh_Key_Detach(entity key);
-void kh_Key_AssignTo(entity key, entity player);
-void kh_Key_Spawn(entity initial_owner, float angle, float idx);
-void kh_Key_Remove(entity key);
-void kh_Key_Collect(entity key, entity player);
-void kh_Key_DropAll(entity player, float suicide);
-void kh_Key_Touch();
-void kh_Key_Think();
-void kh_WinnerTeam(float teem);
-void kh_LoserTeam(float teem, entity lostkey);
-void kh_FinishRound();
-void kh_StartRound();
-void kh_EnableTrackingDevice();
-void kh_init();
-void kh_finalize();
-float kh_KeyCarrier_waypointsprite_visible_for_player(entity e);
-float kh_Key_waypointsprite_visible_for_player(entity e);
-float kh_HandleFrags(entity attacker, entity targ, float f);
-float kh_Key_AllOwnedByWhichTeam();
-
-void kh_update_state();
-
-#define STR_ITEM_KH_KEY "item_kh_key"
-typedef void(void) kh_Think_t;
-var kh_Think_t kh_Controller_Thinkfunc;
-void kh_Controller_SetThink(float t, string msg, kh_Think_t func)
-void kh_Key_Remove(entity key)
index 16f4a33fbbdf9abb4901af37fa3b9f6429a7b107..fa61ad8712783892d3b916701f75a163e42d2ab3 100644 (file)
@@ -534,7 +534,7 @@ void GetCvars_handleString(string thisname, float f, .string field, string name)
                }
        }
        else
-               stuffcmd(self, strcat("sendcvar ", name, "\n"));
+               stuffcmd(self, strcat("cl_cmd sendcvar ", name, "\n"));
 }
 void GetCvars_handleString_Fixup(string thisname, float f, .string field, string name, string(string) func)
 {
@@ -562,7 +562,7 @@ void GetCvars_handleFloat(string thisname, float f, .float field, string name)
                        self.field = stof(argv(f + 1));
        }
        else
-               stuffcmd(self, strcat("sendcvar ", name, "\n"));
+               stuffcmd(self, strcat("cl_cmd sendcvar ", name, "\n"));
 }
 void GetCvars_handleFloatOnce(string thisname, float f, .float field, string name)
 {
@@ -584,7 +584,7 @@ void GetCvars_handleFloatOnce(string thisname, float f, .float field, string nam
        else
        {
                if(!self.field)
-                       stuffcmd(self, strcat("sendcvar ", name, "\n"));
+                       stuffcmd(self, strcat("cl_cmd sendcvar ", name, "\n"));
        }
 }
 string W_FixWeaponOrder_ForceComplete(string s);
@@ -593,8 +593,13 @@ float w_getbestweapon(entity e);
 void GetCvars(float f)
 {
        string s;
+
        if (f > 0)
                s = strcat1(argv(f));
+
+       get_cvars_f = f;
+       get_cvars_s = s;
+       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");
@@ -612,6 +617,7 @@ void GetCvars(float f)
        GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[7], "cl_weaponpriority7", W_FixWeaponOrder_AllowIncomplete);
        GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[8], "cl_weaponpriority8", W_FixWeaponOrder_AllowIncomplete);
        GetCvars_handleString_Fixup(s, f, cvar_cl_weaponpriorities[9], "cl_weaponpriority9", W_FixWeaponOrder_AllowIncomplete);
+       GetCvars_handleFloat(s, f, cvar_cl_weaponimpulsemode, "cl_weaponimpulsemode");
        GetCvars_handleFloat(s, f, cvar_cl_autotaunt, "cl_autotaunt");
        GetCvars_handleFloat(s, f, cvar_cl_noantilag, "cl_noantilag");
        GetCvars_handleFloat(s, f, cvar_cl_voice_directional, "cl_voice_directional");
@@ -819,20 +825,30 @@ float g_pickup_fuel_jetpack;
 float g_pickup_fuel_max;
 float g_pickup_armorsmall;
 float g_pickup_armorsmall_max;
+float g_pickup_armorsmall_anyway;
 float g_pickup_armormedium;
 float g_pickup_armormedium_max;
+float g_pickup_armormedium_anyway;
 float g_pickup_armorbig;
 float g_pickup_armorbig_max;
+float g_pickup_armorbig_anyway;
 float g_pickup_armorlarge;
 float g_pickup_armorlarge_max;
+float g_pickup_armorlarge_anyway;
 float g_pickup_healthsmall;
 float g_pickup_healthsmall_max;
+float g_pickup_healthsmall_anyway;
 float g_pickup_healthmedium;
 float g_pickup_healthmedium_max;
+float g_pickup_healthmedium_anyway;
 float g_pickup_healthlarge;
 float g_pickup_healthlarge_max;
+float g_pickup_healthlarge_anyway;
 float g_pickup_healthmega;
 float g_pickup_healthmega_max;
+float g_pickup_healthmega_anyway;
+float g_pickup_ammo_anyway;
+float g_pickup_weapons_anyway;
 float g_weaponarena;
 float g_weaponarena_random;
 string g_weaponarena_list;
@@ -896,7 +912,6 @@ float want_weapon(string cvarprefix, entity weaponinfo, float allguns)
        return t;
 }
 
-float NixNex_CanChooseWeapon(float wpn);
 void readplayerstartcvars()
 {
        entity e;
@@ -977,17 +992,7 @@ void readplayerstartcvars()
        else
                g_weaponarena_random = 0;
 
-       if (g_nixnex)
-       {
-               start_weapons = 0;
-               // will be done later
-               for (i = WEP_FIRST; i <= WEP_LAST; ++i)
-                       if (NixNex_CanChooseWeapon(i))
-                               weapon_action(i, WR_PRECACHE);
-               if(!cvar("g_use_ammunition"))
-                       start_items |= IT_UNLIMITED_AMMO;
-       }
-       else if (g_weaponarena)
+       if (g_weaponarena)
        {
                start_weapons = g_weaponarena;
                if (g_weaponarena & (WEPBIT_GRENADE_LAUNCHER | WEPBIT_HAGAR | WEPBIT_ROCKET_LAUNCHER))
@@ -1027,7 +1032,7 @@ void readplayerstartcvars()
                        start_health = cvar("g_lms_start_health");
                        start_armorvalue = cvar("g_lms_start_armor");
                }
-               else if (cvar("g_use_ammunition"))
+               else
                {
                        start_ammo_shells = cvar("g_start_ammo_shells");
                        start_ammo_nails = cvar("g_start_ammo_nails");
@@ -1035,24 +1040,12 @@ void readplayerstartcvars()
                        start_ammo_cells = cvar("g_start_ammo_cells");
                        start_ammo_fuel = cvar("g_start_ammo_fuel");
                }
-               else
-               {
-                       start_ammo_shells = cvar("g_pickup_shells_max");
-                       start_ammo_nails = cvar("g_pickup_nails_max");
-                       start_ammo_rockets = cvar("g_pickup_rockets_max");
-                       start_ammo_cells = cvar("g_pickup_cells_max");
-                       start_ammo_fuel = cvar("g_pickup_fuel_max");
-                       start_items |= IT_UNLIMITED_AMMO;
-               }
 
                for (i = WEP_FIRST; i <= WEP_LAST; ++i)
                {
                        e = get_weaponinfo(i);
                        if(want_weapon("g_start_weapon_", e, FALSE))
-                       {
                                start_weapons |= e.weapons;
-                               weapon_action(e.weapon, WR_PRECACHE);
-                       }
                }
        }
 
@@ -1067,16 +1060,13 @@ void readplayerstartcvars()
                warmup_start_armorvalue = start_armorvalue;
                warmup_start_weapons = start_weapons;
 
-               if (!g_weaponarena && !g_nixnex && !g_minstagib && !g_ca)
+               if (!g_weaponarena && !g_minstagib && !g_ca)
                {
-                       if (cvar("g_use_ammunition"))
-                       {
-                               warmup_start_ammo_shells = cvar("g_warmup_start_ammo_shells");
-                               warmup_start_ammo_cells = cvar("g_warmup_start_ammo_cells");
-                               warmup_start_ammo_nails = cvar("g_warmup_start_ammo_nails");
-                               warmup_start_ammo_rockets = cvar("g_warmup_start_ammo_rockets");
-                               warmup_start_ammo_fuel = cvar("g_warmup_start_ammo_fuel");
-                       }
+                       warmup_start_ammo_shells = cvar("g_warmup_start_ammo_shells");
+                       warmup_start_ammo_cells = cvar("g_warmup_start_ammo_cells");
+                       warmup_start_ammo_nails = cvar("g_warmup_start_ammo_nails");
+                       warmup_start_ammo_rockets = cvar("g_warmup_start_ammo_rockets");
+                       warmup_start_ammo_fuel = cvar("g_warmup_start_ammo_fuel");
                        warmup_start_health = cvar("g_warmup_start_health");
                        warmup_start_armorvalue = cvar("g_warmup_start_armor");
                        warmup_start_weapons = 0;
@@ -1084,10 +1074,7 @@ void readplayerstartcvars()
                        {
                                e = get_weaponinfo(i);
                                if(want_weapon("g_start_weapon_", e, cvar("g_warmup_allguns")))
-                               {
                                        warmup_start_weapons |= e.weapons;
-                                       weapon_action(e.weapon, WR_PRECACHE);
-                               }
                        }
                }
        }
@@ -1100,6 +1087,22 @@ void readplayerstartcvars()
                warmup_start_ammo_fuel = max(warmup_start_ammo_fuel, cvar("g_balance_fuel_rotstable"));
        }
 
+       if(!cvar("g_use_ammunition"))
+       {
+               start_ammo_shells = cvar("g_pickup_shells_max");
+               start_ammo_nails = cvar("g_pickup_nails_max");
+               start_ammo_rockets = cvar("g_pickup_rockets_max");
+               start_ammo_cells = cvar("g_pickup_cells_max");
+               start_ammo_fuel = cvar("g_pickup_fuel_max");
+               start_items |= IT_UNLIMITED_AMMO;
+               warmup_start_ammo_shells = cvar("g_pickup_shells_max");
+               warmup_start_ammo_nails = cvar("g_pickup_nails_max");
+               warmup_start_ammo_rockets = cvar("g_pickup_rockets_max");
+               warmup_start_ammo_cells = cvar("g_pickup_cells_max");
+               warmup_start_ammo_fuel = cvar("g_pickup_fuel_max");
+               //warmup_start_items |= IT_UNLIMITED_AMMO;
+       }
+
        if (g_jetpack)
                start_items |= IT_JETPACK;
 
@@ -1117,6 +1120,15 @@ void readplayerstartcvars()
                if (!warmup_start_ammo_fuel) warmup_start_ammo_fuel = g_pickup_fuel;
        }
 
+       MUTATOR_CALLHOOK(SetStartItems);
+
+       for (i = WEP_FIRST; i <= WEP_LAST; ++i)
+       {
+               e = get_weaponinfo(i);
+               if(e.weapons & (start_weapons | warmup_start_weapons))
+                       weapon_action(e.weapon, WR_PRECACHE);
+       }
+
        start_ammo_shells = max(0, start_ammo_shells);
        start_ammo_nails = max(0, start_ammo_nails);
        start_ammo_cells = max(0, start_ammo_cells);
@@ -1163,6 +1175,10 @@ float sv_accuracy_data_share;
 
 void readlevelcvars(void)
 {
+       // first load all the mutators
+       if(cvar("g_nix"))
+               MUTATOR_ADD(mutator_nix);
+
     g_bugrigs = cvar("g_bugrigs");
     g_bugrigs_planar_movement = cvar("g_bugrigs_planar_movement");
     g_bugrigs_planar_movement_car_jumping = cvar("g_bugrigs_planar_movement_car_jumping");
@@ -1205,15 +1221,12 @@ void readlevelcvars(void)
        g_laserguided_missile = cvar("g_laserguided_missile");
        g_midair = cvar("g_midair");
        g_minstagib = cvar("g_minstagib");
-       g_nixnex = cvar("g_nixnex");
-       g_nixnex_with_laser = cvar("g_nixnex_with_laser");
        g_norecoil = cvar("g_norecoil");
        g_vampire = cvar("g_vampire");
        g_bloodloss = cvar("g_bloodloss");
        sv_maxidle = cvar("sv_maxidle");
        sv_maxidle_spectatorsareidle = cvar("sv_maxidle_spectatorsareidle");
        sv_pogostick = cvar("sv_pogostick");
-       sv_doublejump = cvar("sv_doublejump");
        g_ctf_reverse = cvar("g_ctf_reverse");
        sv_autotaunt = cvar("sv_autotaunt");
        sv_taunt = cvar("sv_taunt");
@@ -1239,10 +1252,6 @@ void readlevelcvars(void)
        g_pickup_respawntimejitter_long = cvar("g_pickup_respawntimejitter_long");
        g_pickup_respawntimejitter_powerup = cvar("g_pickup_respawntimejitter_powerup");
 
-       if (g_minstagib) g_nixnex = g_weaponarena = 0;
-       if (g_nixnex) g_weaponarena = 0;
-               g_weaponarena = 0;
-
        g_weaponspeedfactor = cvar("g_weaponspeedfactor");
        g_weaponratefactor = cvar("g_weaponratefactor");
        g_weapondamagefactor = cvar("g_weapondamagefactor");
@@ -1262,20 +1271,31 @@ void readlevelcvars(void)
        g_pickup_fuel_max = cvar("g_pickup_fuel_max");
        g_pickup_armorsmall = cvar("g_pickup_armorsmall");
        g_pickup_armorsmall_max = cvar("g_pickup_armorsmall_max");
+       g_pickup_armorsmall_anyway = cvar("g_pickup_armorsmall_anyway");
        g_pickup_armormedium = cvar("g_pickup_armormedium");
        g_pickup_armormedium_max = cvar("g_pickup_armormedium_max");
+       g_pickup_armormedium_anyway = cvar("g_pickup_armormedium_anyway");
        g_pickup_armorbig = cvar("g_pickup_armorbig");
        g_pickup_armorbig_max = cvar("g_pickup_armorbig_max");
+       g_pickup_armorbig_anyway = cvar("g_pickup_armorbig_anyway");
        g_pickup_armorlarge = cvar("g_pickup_armorlarge");
        g_pickup_armorlarge_max = cvar("g_pickup_armorlarge_max");
+       g_pickup_armorlarge_anyway = cvar("g_pickup_armorlarge_anyway");
        g_pickup_healthsmall = cvar("g_pickup_healthsmall");
        g_pickup_healthsmall_max = cvar("g_pickup_healthsmall_max");
+       g_pickup_healthsmall_anyway = cvar("g_pickup_healthsmall_anyway");
        g_pickup_healthmedium = cvar("g_pickup_healthmedium");
        g_pickup_healthmedium_max = cvar("g_pickup_healthmedium_max");
+       g_pickup_healthmedium_anyway = cvar("g_pickup_healthmedium_anyway");
        g_pickup_healthlarge = cvar("g_pickup_healthlarge");
        g_pickup_healthlarge_max = cvar("g_pickup_healthlarge_max");
+       g_pickup_healthlarge_anyway = cvar("g_pickup_healthlarge_anyway");
        g_pickup_healthmega = cvar("g_pickup_healthmega");
        g_pickup_healthmega_max = cvar("g_pickup_healthmega_max");
+       g_pickup_healthmega_anyway = cvar("g_pickup_healthmega_anyway");
+
+       g_pickup_ammo_anyway = cvar("g_pickup_ammo_anyway");
+       g_pickup_weapons_anyway = cvar("g_pickup_weapons_anyway");
 
        g_pinata = cvar("g_pinata");
 
@@ -1513,30 +1533,50 @@ void play2all(string samp)
 }
 
 void PrecachePlayerSounds(string f);
-void precache_all_models(string pattern)
+void precache_playermodel(string m)
 {
-    float globhandle, i, n;
-    string f;
+       float globhandle, i, n;
+       string f;
 
-    globhandle = search_begin(pattern, TRUE, FALSE);
-    if (globhandle < 0)
-        return;
-    n = search_getsize(globhandle);
-    for (i = 0; i < n; ++i)
-    {
+       if(substring(m, -9,5) == "_lod1")
+               return;
+       if(substring(m, -9,5) == "_lod2")
+               return;
+       precache_model(m);
+       if(sv_loddistance1)
+       {
+               precache_model(strcat(substring(m, 0, -5), "_lod1", substring(m, -4, -1)));
+               precache_model(strcat(substring(m, 0, -5), "_lod2", substring(m, -4, -1)));
+       }
+
+       globhandle = search_begin(strcat(m, "_*.sounds"), TRUE, FALSE);
+       if (globhandle < 0)
+               return;
+       n = search_getsize(globhandle);
+       for (i = 0; i < n; ++i)
+       {
                //print(search_getfilename(globhandle, i), "\n");
                f = search_getfilename(globhandle, i);
-               if(sv_loddistance1)
-                       precache_model(f);
-               if(substring(f, -9,5) == "_lod1")
-                       continue;
-               if(substring(f, -9,5) == "_lod2")
-                       continue;
-               if(!sv_loddistance1)
-                       precache_model(f);
-               PrecachePlayerSounds(strcat(f, ".sounds"));
-    }
-    search_end(globhandle);
+               PrecachePlayerSounds(f);
+       }
+       search_end(globhandle);
+}
+void precache_all_playermodels(string pattern)
+{
+       float globhandle, i, n;
+       string f;
+
+       globhandle = search_begin(pattern, TRUE, FALSE);
+       if (globhandle < 0)
+               return;
+       n = search_getsize(globhandle);
+       for (i = 0; i < n; ++i)
+       {
+               //print(search_getfilename(globhandle, i), "\n");
+               f = search_getfilename(globhandle, i);
+               precache_playermodel(f);
+       }
+       search_end(globhandle);
 }
 
 void precache()
@@ -1559,25 +1599,11 @@ void precache()
     if (cvar("sv_precacheplayermodels"))
     {
         PrecachePlayerSounds("sound/player/default.sounds");
-        precache_all_models("models/player/*.zym");
-        precache_all_models("models/player/*.dpm");
-        precache_all_models("models/player/*.md3");
-        precache_all_models("models/player/*.psk");
-        //precache_model("models/player/carni.zym");
-        //precache_model("models/player/crash.zym");
-        //precache_model("models/player/grunt.zym");
-        //precache_model("models/player/headhunter.zym");
-        //precache_model("models/player/insurrectionist.zym");
-        //precache_model("models/player/jeandarc.zym");
-        //precache_model("models/player/lurk.zym");
-        //precache_model("models/player/lycanthrope.zym");
-        //precache_model("models/player/marine.zym");
-        //precache_model("models/player/nexus.zym");
-        //precache_model("models/player/pyria.zym");
-        //precache_model("models/player/shock.zym");
-        //precache_model("models/player/skadi.zym");
-        //precache_model("models/player/specop.zym");
-        //precache_model("models/player/visitant.zym");
+        precache_all_playermodels("models/player/*.zym");
+        precache_all_playermodels("models/player/*.dpm");
+        precache_all_playermodels("models/player/*.md3");
+        precache_all_playermodels("models/player/*.psk");
+        precache_all_playermodels("models/player/*.iqm");
     }
 
     if (cvar("sv_defaultcharacter"))
@@ -1585,34 +1611,19 @@ void precache()
         string s;
         s = cvar_string("sv_defaultplayermodel_red");
         if (s != "")
-        {
-            precache_model(s);
-            PrecachePlayerSounds(strcat(s, ".sounds"));
-        }
+            precache_playermodel(s);
         s = cvar_string("sv_defaultplayermodel_blue");
         if (s != "")
-        {
-            precache_model(s);
-            PrecachePlayerSounds(strcat(s, ".sounds"));
-        }
+            precache_playermodel(s);
         s = cvar_string("sv_defaultplayermodel_yellow");
         if (s != "")
-        {
-            precache_model(s);
-            PrecachePlayerSounds(strcat(s, ".sounds"));
-        }
+            precache_playermodel(s);
         s = cvar_string("sv_defaultplayermodel_pink");
         if (s != "")
-        {
-            precache_model(s);
-            PrecachePlayerSounds(strcat(s, ".sounds"));
-        }
+            precache_playermodel(s);
         s = cvar_string("sv_defaultplayermodel");
         if (s != "")
-        {
-            precache_model(s);
-            PrecachePlayerSounds(strcat(s, ".sounds"));
-        }
+            precache_playermodel(s);
     }
 
     if (g_footsteps)
@@ -1669,7 +1680,7 @@ void precache()
         precache_sound ("weapons/hook_impact.wav"); // hook
     }
 
-    if (cvar("sv_precacheweapons") || g_nixnex)
+    if(cvar("sv_precacheweapons"))
     {
         //precache weapon models/sounds
         local float wep;
@@ -1904,6 +1915,13 @@ void adaptor_think2use()
     activator = a;
 }
 
+void adaptor_think2use_hittype_splash() // for timed projectile detonation
+{
+       if not(self.flags & FL_ONGROUND) // if onground, we ARE touching something, but HITTYPE_SPLASH is to be networked if the damage causing projectile is not touching ANYTHING
+               self.projectiledeathtype |= HITTYPE_SPLASH;
+       adaptor_think2use();
+}
+
 // deferred dropping
 void DropToFloor_Handler()
 {
@@ -2335,7 +2353,7 @@ vector shotorg_adjustfromclient(vector vecs, float y_is_right, float allowcenter
                        {
                                // center
                                vecs_y = 0;
-                               vecs_z -= 4;
+                               vecs_z -= 2;
                        }
                        else
                        {
@@ -2348,7 +2366,7 @@ vector shotorg_adjustfromclient(vector vecs, float y_is_right, float allowcenter
                        {
                                // center
                                vecs_y = 0;
-                               vecs_z -= 4;
+                               vecs_z -= 2;
                        }
                        else
                        {
@@ -2386,7 +2404,7 @@ vector shotorg_adjust(vector vecs, float y_is_right, float visual)
                else
                {
                        vecs_y = 0;
-                       vecs_z -= 4;
+                       vecs_z -= 2;
                }
        }
        else if ((s = cvar_string("g_shootfromfixedorigin")) != "")
index 0d43660aa8a57e44ed6fbfdd402049ebcee26cae..9b7ad548c4bebfeae4d99d4f2176d1e261f1c62e 100644 (file)
-//#define MONSTES_ENABLED\r
-#ifdef MONSTES_ENABLED\r
-\r
-#define zombie_anim_attackleap         0\r
-#define zombie_anim_attackrun1         1\r
-#define zombie_anim_attackrun2         2\r
-#define zombie_anim_attackrun3         3\r
-#define zombie_anim_attackstanding1    4\r
-#define zombie_anim_attackstanding2    5\r
-#define zombie_anim_attackstanding3    6\r
-#define zombie_anim_blockend           7\r
-#define zombie_anim_blockstart         8\r
-#define zombie_anim_deathback1         9\r
-#define zombie_anim_deathback2         10\r
-#define zombie_anim_deathback3         11\r
-#define zombie_anim_deathfront1        12\r
-#define zombie_anim_deathfront2        13\r
-#define zombie_anim_deathfront3        14\r
-#define zombie_anim_deathleft1         15\r
-#define zombie_anim_deathleft2         16\r
-#define zombie_anim_deathright1        17\r
-#define zombie_anim_deathright2        18\r
-#define zombie_anim_idle               19\r
-#define zombie_anim_painback1          20\r
-#define zombie_anim_painback2          21\r
-#define zombie_anim_painfront1         22\r
-#define zombie_anim_painfront2         23\r
-#define zombie_anim_runbackwards       24\r
-#define zombie_anim_runbackwardsleft   25\r
-#define zombie_anim_runbackwardsright  26\r
-#define zombie_anim_runforward         27\r
-#define zombie_anim_runforwardleft     28\r
-#define zombie_anim_runforwardright    29\r
-#define zombie_anim_spawn              30\r
-\r
-#define ZOMBIE_MIN                                      '-18 -18 -25'\r
-#define ZOMBIE_MAX                                      '18 18 47'\r
-\r
-#define ZV_IDLE     10\r
-\r
-#define ZV_PATH     100\r
-#define ZV_HUNT     200\r
-\r
-#define ZV_ATTACK_FIND  10\r
-#define ZV_ATTACK_RUN   20\r
-#define ZV_ATTACK_STAND 30\r
-\r
-#define ZV_PATH2 10000\r
-\r
-//.entity verbs_idle;\r
-//.entity verbs_attack;\r
-//.entity verbs_move;\r
-\r
-//.float  state_timeout;\r
-//.void() monster_state;\r
-#define MONSTERFLAG_NORESPAWN 2\r
-\r
-void zombie_spawn();\r
-\r
-float zombie_scoretarget(entity trg)\r
-{\r
-    float  tmp;\r
-    vector ang1;\r
-\r
-    if (trg.takedamage == DAMAGE_AIM)\r
-    if not (trg.flags & FL_NOTARGET)\r
-    if (trg.deadflag == DEAD_NO)\r
-    if (trg.team != self.team)\r
-    {\r
-        if((self.origin_z - trg.origin_z) < 128)\r
-        {\r
-            ang1 = normalize(self.origin - trg.origin);\r
-            tmp = vlen(ang1 - v_forward);\r
-            if(tmp > 1.5)\r
-            {\r
-                traceline(self.origin + '0 0 47',trg.origin + '0 0 32',MOVE_NORMAL,self);\r
-                if(trace_ent != trg)\r
-                    return 0;\r
-\r
-                return (cvar("g_monster_zombie_targetrange") - vlen(self.origin - trg.origin)) * tmp;\r
-            }\r
-            else if(self.enemy == trg)\r
-                return (cvar("g_monster_zombie_targetrange") - vlen(self.origin - trg.origin)) * tmp;\r
-        }\r
-    }\r
-\r
-    return 0;\r
-}\r
-\r
-void zombie_corpse_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)\r
-{\r
-    //dprint("zombie_corpse_damage\n");\r
-    Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker);\r
-\r
-    self.health -= damage;\r
-\r
-    if(self.health < 0)\r
-    {\r
-        Violence_GibSplash(self, 1, 1, attacker);\r
-        remove(self);\r
-    }\r
-}\r
-\r
-void zombie_die(vector dir)\r
-{\r
-    vector v;\r
-    float f;\r
-\r
-    entity dummy;\r
-\r
-    dummy = spawn();\r
-    setmodel(dummy,"models/monsters/zombie.dpm");\r
-    setorigin(dummy, self.origin);\r
-    dummy.velocity  = self.velocity;\r
-    dummy.movetype  = MOVETYPE_BOUNCE;\r
-    dummy.think     = SUB_Remove;\r
-    dummy.nextthink = time + 3;\r
-    dummy.health    = 50;\r
-    dummy.takedamage = DAMAGE_YES;\r
-    dummy.event_damage = zombie_corpse_damage;\r
-    dummy.solid      = SOLID_CORPSE;\r
-    setsize(dummy,self.mins,self.maxs);\r
-\r
-    SUB_SetFade(dummy,time + 5,2);\r
-\r
-\r
-    v = normalize(self.origin - dir);\r
-    f = vlen(v_forward - v) - 1;\r
-    if(f > 0.5)\r
-        dummy.frame = zombie_anim_deathfront1 + rint(random() * 2);\r
-    else if(f < 0.5)\r
-        dummy.frame = zombie_anim_deathback1 + rint(random() * 2);\r
-    else\r
-    {\r
-        f = vlen(v_right - v) - 1;\r
-        if(f > 0.5)\r
-            dummy.frame = zombie_anim_deathright1 + rint(random() * 2);\r
-        else if(f < 0.5)\r
-            dummy.frame = zombie_anim_deathleft1 + rint(random() * 2);\r
-    }\r
-\r
-\r
-    if(self.spawnflags & MONSTERFLAG_NORESPAWN)\r
-    {\r
-        self.think = SUB_Remove;\r
-        self.nextthink = time;\r
-        return;\r
-    }\r
-\r
-    setmodel(self,"");\r
-    self.solid          = SOLID_NOT;\r
-    self.takedamage     = DAMAGE_NO;\r
-    self.event_damage   = SUB_Null;\r
-    self.enemy          = world;\r
-    self.think          = zombie_spawn;\r
-    self.nextthink      = time + cvar("g_monster_zombie_respawntime");\r
-    self.pain_finished  = self.nextthink;\r
-}\r
-\r
-void zombie_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)\r
-{\r
-\r
-    vector v;\r
-    float f;\r
-\r
-    v = normalize(self.origin - hitloc);\r
-    f = vlen(v_forward - v) - 1;\r
-\r
-\r
-    self.health -= damage;\r
-    self.velocity = self.velocity + force;\r
-    if(self.health <= 0)\r
-    {\r
-        zombie_die(hitloc);\r
-        return;\r
-    }\r
-\r
-    Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker);\r
-\r
-       if (damage > 50)\r
-               Violence_GibSplash_At(hitloc, force * -0.1, 3, 1, self, attacker);\r
-       if (damage > 100)\r
-               Violence_GibSplash_At(hitloc, force * -0.2, 3, 1, self, attacker);\r
-\r
-    if (time > self.pain_finished)\r
-    {\r
-        if(f < 0.5)\r
-        {\r
-            if(random() < 0.5)\r
-                self.frame = zombie_anim_painback1;\r
-            else\r
-                self.frame = zombie_anim_painback2;\r
-        }\r
-        else\r
-        {\r
-            if(random() < 0.5)\r
-                self.frame = zombie_anim_painfront1;\r
-            else\r
-                self.frame = zombie_anim_painfront2;\r
-        }\r
-\r
-        self.pain_finished = time + 0.36;\r
-    }\r
-}\r
-\r
-.vector bvec;\r
-.float bvec_time;\r
-\r
-void zombie_move()\r
-{\r
-    vector real_angle;\r
-    float vz, tdiff, tspeed;\r
-\r
-    tdiff = time - self.zoomstate;\r
-    tspeed = tdiff * cvar("g_monster_zombie_turnspeed");\r
-    vz = self.velocity_z;\r
-    self.zoomstate = time;\r
-\r
-    if(self.bvec_time < time)\r
-    {\r
-        self.bvec_time = time + 0.2;\r
-        self.bvec = steerlib_beamsteer(steerlib_attract2(self.moveto,0.5,500,0.95),512,32,34,64);\r
-    }\r
-\r
-    if(self.enemy)\r
-        self.moveto = self.enemy.origin;\r
-    else\r
-        self.moveto = self.origin + v_forward;\r
-\r
-    self.steerto = normalize(steerlib_attract2(self.moveto,0.5,500,0.95) + self.bvec);\r
-\r
-    self.angles_y = safeangle(self.angles_y);\r
-    real_angle = vectoangles(self.steerto) - self.angles;\r
-    self.angles_y += bound(-10, real_angle_y, 10);\r
-\r
-    if(vlen(self.origin - self.moveto) > 64)\r
-    {\r
-        movelib_move_simple(v_forward ,cvar("g_monster_zombie_movespeed"),0.6);\r
-        if(time > self.pain_finished)\r
-            if(self.attack_finished_single < time)\r
-                self.frame = zombie_anim_runforward;\r
-    }\r
-    else\r
-    {\r
-        movelib_beak_simple(cvar("g_monster_zombie_stopspeed"));\r
-        if(time > self.pain_finished)\r
-            if(self.attack_finished_single < time)\r
-                self.frame = zombie_anim_idle;\r
-    }\r
-\r
-    self.velocity_z = vz;\r
-    self.steerto = self.origin;\r
-}\r
-\r
-float zombie_verb_idle_roam(float eval)\r
-{\r
-    switch (eval)\r
-    {\r
-    case VCM_EVAL:\r
-\r
-        if(self.enemy)\r
-            return VS_CALL_NO;\r
-\r
-        return verb.verb_static_value;\r
-\r
-    case VCM_DO:\r
-\r
-        self.moveto = v_forward * 128;\r
-        self.steerto = v_forward; //steerlib_beamsteer(v_forward,512,32,34,64);\r
-\r
-        return VS_CALL_YES_DOING;\r
-    }\r
-\r
-    return VS_CALL_YES_DONE;\r
-}\r
-\r
-float zombie_verb_idle_stand(float eval)\r
-{\r
-    switch (eval)\r
-    {\r
-    case VCM_EVAL:\r
-\r
-        if(self.enemy)\r
-            return VS_CALL_NO;\r
-\r
-        return verb.verb_static_value;\r
-\r
-    case VCM_DO:\r
-\r
-        self.moveto   = self.origin;\r
-        self.frame    = zombie_anim_idle;\r
-        self.velocity = '0 0 0';\r
-\r
-        return VS_CALL_YES_DOING;\r
-    }\r
-\r
-    return VS_CALL_YES_DONE;\r
-}\r
-\r
-float zombie_verb_idle(float eval)\r
-{\r
-    switch (eval)\r
-    {\r
-    case VCM_EVAL:\r
-\r
-        if(self.enemy)\r
-            return VS_CALL_NO;\r
-\r
-        return verb.verb_static_value;\r
-\r
-    case VCM_DO:\r
-        float t;\r
-\r
-        t = cvar("g_monster_zombie_idle_timer_max") -  cvar("g_monster_zombie_idle_timer_min");\r
-        t = cvar("g_monster_zombie_idle_timer_min") + (random() * t);\r
-\r
-        if(random() < 0.5)\r
-            verbstack_push(self.verbs_idle, zombie_verb_idle_roam,  ZV_IDLE + 1, t, self);\r
-        else\r
-            verbstack_push(self.verbs_idle, zombie_verb_idle_stand, ZV_IDLE + 1, 0.1, self);\r
-\r
-        return VS_CALL_YES_DOING;\r
-    }\r
-\r
-    return VS_CALL_YES_DONE;\r
-}\r
-\r
-float zombie_verb_attack_findtarget(float eval)\r
-{\r
-    switch (eval)\r
-    {\r
-    case VCM_EVAL:\r
-        if(self.enemy)\r
-            return VS_CALL_NO;\r
-\r
-        return verb.verb_static_value;\r
-\r
-    case VCM_DO:\r
-\r
-        entity trg, best_trg;\r
-        float trg_score, best_trg_score;\r
-\r
-        trg = findradius(self.origin,cvar("g_monster_zombie_targetrange"));\r
-        while(trg)\r
-        {\r
-            trg_score = zombie_scoretarget(trg);\r
-            if(trg_score > best_trg_score)\r
-            {\r
-                best_trg = trg;\r
-                best_trg_score = trg_score;\r
-            }\r
-\r
-            trg = trg.chain;\r
-        }\r
-\r
-        if(best_trg)\r
-        {\r
-            self.enemy = best_trg;\r
-            dprint("Selected: ",best_trg.netname, " as target.\n");\r
-        }\r
-\r
-        return VS_CALL_YES_DOING;\r
-    }\r
-\r
-    return VS_CALL_YES_DONE;\r
-}\r
-\r
-void zombie_runattack_damage()\r
-{\r
-    entity oldself;\r
-    oldself = self;\r
-    self = self.owner;\r
-\r
-    if(vlen(self.origin - self.enemy.origin) > cvar("g_monster_zombie_attack_run_hitrange"))\r
-        return;\r
-\r
-    if(vlen(normalize(self.origin - self.enemy.origin) - v_forward) < 1.6)\r
-        return;\r
-\r
-    Damage(self.enemy, self, self, cvar("g_monster_zombie_attack_run_damage"), DEATH_TURRET, self.enemy.origin, normalize(self.enemy.origin - self.origin)  * cvar("g_monster_zombie_attack_run_force"));\r
-\r
-    self = oldself;\r
-    self.think = SUB_Remove;\r
-    self.nextthink = time;\r
-}\r
-\r
-float zombie_verb_attack_run(float eval)\r
-{\r
-    switch (eval)\r
-    {\r
-    case VCM_EVAL:\r
-        if not (self.enemy)\r
-            return VS_CALL_NO;\r
-\r
-        if(self.attack_finished_single > time)\r
-            return VS_CALL_NO;\r
-\r
-        if(vlen(self.origin - self.enemy.origin) > cvar("g_monster_zombie_attack_run_range"))\r
-            return VS_CALL_NO;\r
-\r
-        if(vlen(normalize(self.origin - self.enemy.origin) - v_forward) < 1.6)\r
-            return VS_CALL_NO;\r
-\r
-        return verb.verb_static_value;\r
-\r
-    case VCM_DO:\r
-        entity pain;\r
-        pain = spawn();\r
-        pain.owner = self;\r
-        pain.think = zombie_runattack_damage;\r
-        pain.nextthink = time + cvar("g_monster_zombie_attack_run_delay");\r
-\r
-        self.attack_finished_single = time + 0.7;\r
-        self.frame = zombie_anim_attackrun1 + rint(random() * 2);\r
-\r
-        return VS_CALL_YES_DOING;\r
-    }\r
-\r
-    return VS_CALL_YES_DONE;\r
-}\r
-\r
-void zombie_standattack_damage()\r
-{\r
-    //entity oldself;\r
-    //oldself = self;\r
-    //self = self.owner;\r
-\r
-    setorigin(self,self.owner.origin + v_forward * 32);\r
-    RadiusDamage(self, self.owner, cvar("g_monster_zombie_attack_stand_damage"),cvar("g_monster_zombie_attack_stand_damage"),16,self, cvar("g_monster_zombie_attack_stand_force"),DEATH_TURRET,world);\r
-    //float RadiusDamage (entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity ignore, float forceintensity, float deathtype, entity directhitentity)\r
-\r
-\r
-    //self = oldself;\r
-    self.think = SUB_Remove;\r
-    self.nextthink = time;\r
-}\r
-\r
-float zombie_verb_attack_stand(float eval)\r
-{\r
-    switch (eval)\r
-    {\r
-    case VCM_EVAL:\r
-        if not (self.enemy)\r
-            return VS_CALL_NO;\r
-\r
-        if(self.attack_finished_single > time)\r
-            return VS_CALL_NO;\r
-\r
-        if(vlen(self.origin - self.enemy.origin) > cvar("g_monster_zombie_attack_stand_range"))\r
-            return VS_CALL_NO;\r
-\r
-        if(vlen(normalize(self.origin - self.enemy.origin) - v_forward) < 1.8)\r
-            return VS_CALL_NO;\r
-\r
-        return verb.verb_static_value;\r
-\r
-    case VCM_DO:\r
-        entity pain;\r
-        pain = spawn();\r
-        pain.owner = self;\r
-        pain.think = zombie_runattack_damage;\r
-        pain.nextthink = time + cvar("g_monster_zombie_attack_stand_delay");\r
-\r
-        self.attack_finished_single = time + 0.7;\r
-        self.frame = zombie_anim_attackstanding1 + rint(random() * 1);\r
-        dprint("frame:",ftos(self.frame),"\n");\r
-\r
-        return VS_CALL_YES_DOING;\r
-    }\r
-\r
-    return VS_CALL_YES_DONE;\r
-}\r
-\r
-void zombie_think()\r
-{\r
-    self.angles_x *= -1;\r
-    makevectors(self.angles);\r
-    self.angles_x *= -1;\r
-\r
-    if (zombie_scoretarget(self.enemy) == 0)\r
-        self.enemy = world;\r
-\r
-    verbstack_pop(self.verbs_attack);\r
-    //verbstack_pop(self.verbs_move);\r
-\r
-    if not (self.enemy)\r
-        verbstack_pop(self.verbs_idle);\r
-\r
-    zombie_move();\r
-\r
-    if(self.enemy)\r
-        self.nextthink = time;\r
-    else\r
-        self.nextthink = time + 0.2;\r
-}\r
-\r
-void zombie_spawn()\r
-{\r
-    setmodel(self,"models/monsters/zombie.dpm");\r
-\r
-    self.solid          = SOLID_BBOX;\r
-    self.takedamage     = DAMAGE_AIM;\r
-    self.event_damage   = zombie_damage;\r
-    self.enemy          = world;\r
-    self.frame          = zombie_anim_spawn;\r
-    self.think          = zombie_think;\r
-    self.nextthink      = time + 2.1;\r
-    self.pain_finished  = self.nextthink;\r
-    self.movetype       = MOVETYPE_WALK;\r
-    self.health         = cvar("g_monster_zombie_health");\r
-    self.velocity       = '0 0 0';\r
-    self.angles         = self.pos2;\r
-    self.moveto         = self.origin;\r
-    self.flags          = FL_MONSTER;\r
-\r
-    setorigin(self,self.pos1);\r
-    setsize(self,ZOMBIE_MIN,ZOMBIE_MAX);\r
-}\r
-\r
-\r
-void spawnfunc_monster_zombie()\r
-{\r
-    if not(cvar("g_monsters"))\r
-    {\r
-        remove(self);\r
-        return;\r
-    }\r
-\r
-    precache_model("models/monsters/zombie.dpm");\r
-\r
-\r
-    self.verbs_idle   = spawn();\r
-    self.verbs_attack = spawn();\r
-\r
-    self.verbs_idle.owner = self;\r
-    self.verbs_attack.owner = self;\r
-\r
-    self.think      = zombie_spawn;\r
-    self.nextthink  = time + 2;\r
-\r
-    traceline(self.origin + '0 0 10', self.origin - '0 0 32', MOVE_WORLDONLY, self);\r
-\r
-    self.pos1 = trace_endpos;\r
-    self.pos2 = self.angles;\r
-    self.team = MAX_SHOT_DISTANCE -1;\r
-\r
-    verbstack_push(self.verbs_idle, zombie_verb_idle, ZV_IDLE,0 , self);\r
-\r
-    verbstack_push(self.verbs_attack, zombie_verb_attack_findtarget, ZV_ATTACK_FIND,0 , self);\r
-    verbstack_push(self.verbs_attack, zombie_verb_attack_run, ZV_ATTACK_RUN,0 , self);\r
-    verbstack_push(self.verbs_attack, zombie_verb_attack_stand, ZV_ATTACK_STAND,0 , self);\r
-\r
-}\r
-\r
-#endif // MONSTES_ENABLED\r
+//#define MONSTES_ENABLED
+#ifdef MONSTES_ENABLED
+
+#define zombie_anim_attackleap         0
+#define zombie_anim_attackrun1         1
+#define zombie_anim_attackrun2         2
+#define zombie_anim_attackrun3         3
+#define zombie_anim_attackstanding1    4
+#define zombie_anim_attackstanding2    5
+#define zombie_anim_attackstanding3    6
+#define zombie_anim_blockend           7
+#define zombie_anim_blockstart         8
+#define zombie_anim_deathback1         9
+#define zombie_anim_deathback2         10
+#define zombie_anim_deathback3         11
+#define zombie_anim_deathfront1        12
+#define zombie_anim_deathfront2        13
+#define zombie_anim_deathfront3        14
+#define zombie_anim_deathleft1         15
+#define zombie_anim_deathleft2         16
+#define zombie_anim_deathright1        17
+#define zombie_anim_deathright2        18
+#define zombie_anim_idle               19
+#define zombie_anim_painback1          20
+#define zombie_anim_painback2          21
+#define zombie_anim_painfront1         22
+#define zombie_anim_painfront2         23
+#define zombie_anim_runbackwards       24
+#define zombie_anim_runbackwardsleft   25
+#define zombie_anim_runbackwardsright  26
+#define zombie_anim_runforward         27
+#define zombie_anim_runforwardleft     28
+#define zombie_anim_runforwardright    29
+#define zombie_anim_spawn              30
+
+#define ZOMBIE_MIN                                      '-18 -18 -25'
+#define ZOMBIE_MAX                                      '18 18 47'
+
+#define ZV_IDLE     10
+
+#define ZV_PATH     100
+#define ZV_HUNT     200
+
+#define ZV_ATTACK_FIND  10
+#define ZV_ATTACK_RUN   20
+#define ZV_ATTACK_STAND 30
+
+#define ZV_PATH2 10000
+
+//.entity verbs_idle;
+//.entity verbs_attack;
+//.entity verbs_move;
+
+//.float  state_timeout;
+//.void() monster_state;
+#define MONSTERFLAG_NORESPAWN 2
+
+void zombie_spawn();
+
+float zombie_scoretarget(entity trg)
+{
+    float  tmp;
+    vector ang1;
+
+    if (trg.takedamage == DAMAGE_AIM)
+    if not (trg.flags & FL_NOTARGET)
+    if (trg.deadflag == DEAD_NO)
+    if (trg.team != self.team)
+    {
+        if((self.origin_z - trg.origin_z) < 128)
+        {
+            ang1 = normalize(self.origin - trg.origin);
+            tmp = vlen(ang1 - v_forward);
+            if(tmp > 1.5)
+            {
+                traceline(self.origin + '0 0 47',trg.origin + '0 0 32',MOVE_NORMAL,self);
+                if(trace_ent != trg)
+                    return 0;
+
+                return (cvar("g_monster_zombie_targetrange") - vlen(self.origin - trg.origin)) * tmp;
+            }
+            else if(self.enemy == trg)
+                return (cvar("g_monster_zombie_targetrange") - vlen(self.origin - trg.origin)) * tmp;
+        }
+    }
+
+    return 0;
+}
+
+void zombie_corpse_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+    //dprint("zombie_corpse_damage\n");
+    Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker);
+
+    self.health -= damage;
+
+    if(self.health < 0)
+    {
+        Violence_GibSplash(self, 1, 1, attacker);
+        remove(self);
+    }
+}
+
+void zombie_die(vector dir)
+{
+    vector v;
+    float f;
+
+    entity dummy;
+
+    dummy = spawn();
+    setmodel(dummy,"models/monsters/zombie.dpm");
+    setorigin(dummy, self.origin);
+    dummy.velocity  = self.velocity;
+    dummy.movetype  = MOVETYPE_BOUNCE;
+    dummy.think     = SUB_Remove;
+    dummy.nextthink = time + 3;
+    dummy.health    = 50;
+    dummy.takedamage = DAMAGE_YES;
+    dummy.event_damage = zombie_corpse_damage;
+    dummy.solid      = SOLID_CORPSE;
+    setsize(dummy,self.mins,self.maxs);
+
+    SUB_SetFade(dummy,time + 5,2);
+
+
+    v = normalize(self.origin - dir);
+    f = vlen(v_forward - v) - 1;
+    if(f > 0.5)
+        dummy.frame = zombie_anim_deathfront1 + rint(random() * 2);
+    else if(f < 0.5)
+        dummy.frame = zombie_anim_deathback1 + rint(random() * 2);
+    else
+    {
+        f = vlen(v_right - v) - 1;
+        if(f > 0.5)
+            dummy.frame = zombie_anim_deathright1 + rint(random() * 2);
+        else if(f < 0.5)
+            dummy.frame = zombie_anim_deathleft1 + rint(random() * 2);
+    }
+
+
+    if(self.spawnflags & MONSTERFLAG_NORESPAWN)
+    {
+        self.think = SUB_Remove;
+        self.nextthink = time;
+        return;
+    }
+
+    setmodel(self,"");
+    self.solid          = SOLID_NOT;
+    self.takedamage     = DAMAGE_NO;
+    self.event_damage   = SUB_Null;
+    self.enemy          = world;
+    self.think          = zombie_spawn;
+    self.nextthink      = time + cvar("g_monster_zombie_respawntime");
+    self.pain_finished  = self.nextthink;
+}
+
+void zombie_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+
+    vector v;
+    float f;
+
+    v = normalize(self.origin - hitloc);
+    f = vlen(v_forward - v) - 1;
+
+
+    self.health -= damage;
+    self.velocity = self.velocity + force;
+    if(self.health <= 0)
+    {
+        zombie_die(hitloc);
+        return;
+    }
+
+    Violence_GibSplash_At(hitloc, force, 2, bound(0, damage, 200) / 16, self, attacker);
+
+       if (damage > 50)
+               Violence_GibSplash_At(hitloc, force * -0.1, 3, 1, self, attacker);
+       if (damage > 100)
+               Violence_GibSplash_At(hitloc, force * -0.2, 3, 1, self, attacker);
+
+    if (time > self.pain_finished)
+    {
+        if(f < 0.5)
+        {
+            if(random() < 0.5)
+                self.frame = zombie_anim_painback1;
+            else
+                self.frame = zombie_anim_painback2;
+        }
+        else
+        {
+            if(random() < 0.5)
+                self.frame = zombie_anim_painfront1;
+            else
+                self.frame = zombie_anim_painfront2;
+        }
+
+        self.pain_finished = time + 0.36;
+    }
+}
+
+.vector bvec;
+.float bvec_time;
+
+void zombie_move()
+{
+    vector real_angle;
+    float vz, tdiff, tspeed;
+
+    tdiff = time - self.zoomstate;
+    tspeed = tdiff * cvar("g_monster_zombie_turnspeed");
+    vz = self.velocity_z;
+    self.zoomstate = time;
+
+    if(self.bvec_time < time)
+    {
+        self.bvec_time = time + 0.2;
+        self.bvec = steerlib_beamsteer(steerlib_attract2(self.moveto,0.5,500,0.95),512,32,34,64);
+    }
+
+    if(self.enemy)
+        self.moveto = self.enemy.origin;
+    else
+        self.moveto = self.origin + v_forward;
+
+    self.steerto = normalize(steerlib_attract2(self.moveto,0.5,500,0.95) + self.bvec);
+
+    self.angles_y = safeangle(self.angles_y);
+    real_angle = vectoangles(self.steerto) - self.angles;
+    self.angles_y += bound(-10, real_angle_y, 10);
+
+    if(vlen(self.origin - self.moveto) > 64)
+    {
+        movelib_move_simple(v_forward ,cvar("g_monster_zombie_movespeed"),0.6);
+        if(time > self.pain_finished)
+            if(self.attack_finished_single < time)
+                self.frame = zombie_anim_runforward;
+    }
+    else
+    {
+        movelib_beak_simple(cvar("g_monster_zombie_stopspeed"));
+        if(time > self.pain_finished)
+            if(self.attack_finished_single < time)
+                self.frame = zombie_anim_idle;
+    }
+
+    self.velocity_z = vz;
+    self.steerto = self.origin;
+}
+
+float zombie_verb_idle_roam(float eval)
+{
+    switch (eval)
+    {
+    case VCM_EVAL:
+
+        if(self.enemy)
+            return VS_CALL_NO;
+
+        return verb.verb_static_value;
+
+    case VCM_DO:
+
+        self.moveto = v_forward * 128;
+        self.steerto = v_forward; //steerlib_beamsteer(v_forward,512,32,34,64);
+
+        return VS_CALL_YES_DOING;
+    }
+
+    return VS_CALL_YES_DONE;
+}
+
+float zombie_verb_idle_stand(float eval)
+{
+    switch (eval)
+    {
+    case VCM_EVAL:
+
+        if(self.enemy)
+            return VS_CALL_NO;
+
+        return verb.verb_static_value;
+
+    case VCM_DO:
+
+        self.moveto   = self.origin;
+        self.frame    = zombie_anim_idle;
+        self.velocity = '0 0 0';
+
+        return VS_CALL_YES_DOING;
+    }
+
+    return VS_CALL_YES_DONE;
+}
+
+float zombie_verb_idle(float eval)
+{
+    switch (eval)
+    {
+    case VCM_EVAL:
+
+        if(self.enemy)
+            return VS_CALL_NO;
+
+        return verb.verb_static_value;
+
+    case VCM_DO:
+        float t;
+
+        t = cvar("g_monster_zombie_idle_timer_max") -  cvar("g_monster_zombie_idle_timer_min");
+        t = cvar("g_monster_zombie_idle_timer_min") + (random() * t);
+
+        if(random() < 0.5)
+            verbstack_push(self.verbs_idle, zombie_verb_idle_roam,  ZV_IDLE + 1, t, self);
+        else
+            verbstack_push(self.verbs_idle, zombie_verb_idle_stand, ZV_IDLE + 1, 0.1, self);
+
+        return VS_CALL_YES_DOING;
+    }
+
+    return VS_CALL_YES_DONE;
+}
+
+float zombie_verb_attack_findtarget(float eval)
+{
+    switch (eval)
+    {
+    case VCM_EVAL:
+        if(self.enemy)
+            return VS_CALL_NO;
+
+        return verb.verb_static_value;
+
+    case VCM_DO:
+
+        entity trg, best_trg;
+        float trg_score, best_trg_score;
+
+        trg = findradius(self.origin,cvar("g_monster_zombie_targetrange"));
+        while(trg)
+        {
+            trg_score = zombie_scoretarget(trg);
+            if(trg_score > best_trg_score)
+            {
+                best_trg = trg;
+                best_trg_score = trg_score;
+            }
+
+            trg = trg.chain;
+        }
+
+        if(best_trg)
+        {
+            self.enemy = best_trg;
+            dprint("Selected: ",best_trg.netname, " as target.\n");
+        }
+
+        return VS_CALL_YES_DOING;
+    }
+
+    return VS_CALL_YES_DONE;
+}
+
+void zombie_runattack_damage()
+{
+    entity oldself;
+    oldself = self;
+    self = self.owner;
+
+    if(vlen(self.origin - self.enemy.origin) > cvar("g_monster_zombie_attack_run_hitrange"))
+        return;
+
+    if(vlen(normalize(self.origin - self.enemy.origin) - v_forward) < 1.6)
+        return;
+
+    Damage(self.enemy, self, self, cvar("g_monster_zombie_attack_run_damage"), DEATH_TURRET, self.enemy.origin, normalize(self.enemy.origin - self.origin)  * cvar("g_monster_zombie_attack_run_force"));
+
+    self = oldself;
+    self.think = SUB_Remove;
+    self.nextthink = time;
+}
+
+float zombie_verb_attack_run(float eval)
+{
+    switch (eval)
+    {
+    case VCM_EVAL:
+        if not (self.enemy)
+            return VS_CALL_NO;
+
+        if(self.attack_finished_single > time)
+            return VS_CALL_NO;
+
+        if(vlen(self.origin - self.enemy.origin) > cvar("g_monster_zombie_attack_run_range"))
+            return VS_CALL_NO;
+
+        if(vlen(normalize(self.origin - self.enemy.origin) - v_forward) < 1.6)
+            return VS_CALL_NO;
+
+        return verb.verb_static_value;
+
+    case VCM_DO:
+        entity pain;
+        pain = spawn();
+        pain.owner = self;
+        pain.think = zombie_runattack_damage;
+        pain.nextthink = time + cvar("g_monster_zombie_attack_run_delay");
+
+        self.attack_finished_single = time + 0.7;
+        self.frame = zombie_anim_attackrun1 + rint(random() * 2);
+
+        return VS_CALL_YES_DOING;
+    }
+
+    return VS_CALL_YES_DONE;
+}
+
+void zombie_standattack_damage()
+{
+    //entity oldself;
+    //oldself = self;
+    //self = self.owner;
+
+    setorigin(self,self.owner.origin + v_forward * 32);
+    RadiusDamage(self, self.owner, cvar("g_monster_zombie_attack_stand_damage"),cvar("g_monster_zombie_attack_stand_damage"),16,self, cvar("g_monster_zombie_attack_stand_force"),DEATH_TURRET,world);
+    //float RadiusDamage (entity inflictor, entity attacker, float coredamage, float edgedamage, float rad, entity ignore, float forceintensity, float deathtype, entity directhitentity)
+
+
+    //self = oldself;
+    self.think = SUB_Remove;
+    self.nextthink = time;
+}
+
+float zombie_verb_attack_stand(float eval)
+{
+    switch (eval)
+    {
+    case VCM_EVAL:
+        if not (self.enemy)
+            return VS_CALL_NO;
+
+        if(self.attack_finished_single > time)
+            return VS_CALL_NO;
+
+        if(vlen(self.origin - self.enemy.origin) > cvar("g_monster_zombie_attack_stand_range"))
+            return VS_CALL_NO;
+
+        if(vlen(normalize(self.origin - self.enemy.origin) - v_forward) < 1.8)
+            return VS_CALL_NO;
+
+        return verb.verb_static_value;
+
+    case VCM_DO:
+        entity pain;
+        pain = spawn();
+        pain.owner = self;
+        pain.think = zombie_runattack_damage;
+        pain.nextthink = time + cvar("g_monster_zombie_attack_stand_delay");
+
+        self.attack_finished_single = time + 0.7;
+        self.frame = zombie_anim_attackstanding1 + rint(random() * 1);
+        dprint("frame:",ftos(self.frame),"\n");
+
+        return VS_CALL_YES_DOING;
+    }
+
+    return VS_CALL_YES_DONE;
+}
+
+void zombie_think()
+{
+    self.angles_x *= -1;
+    makevectors(self.angles);
+    self.angles_x *= -1;
+
+    if (zombie_scoretarget(self.enemy) == 0)
+        self.enemy = world;
+
+    verbstack_pop(self.verbs_attack);
+    //verbstack_pop(self.verbs_move);
+
+    if not (self.enemy)
+        verbstack_pop(self.verbs_idle);
+
+    zombie_move();
+
+    if(self.enemy)
+        self.nextthink = time;
+    else
+        self.nextthink = time + 0.2;
+}
+
+void zombie_spawn()
+{
+    setmodel(self,"models/monsters/zombie.dpm");
+
+    self.solid          = SOLID_BBOX;
+    self.takedamage     = DAMAGE_AIM;
+    self.event_damage   = zombie_damage;
+    self.enemy          = world;
+    self.frame          = zombie_anim_spawn;
+    self.think          = zombie_think;
+    self.nextthink      = time + 2.1;
+    self.pain_finished  = self.nextthink;
+    self.movetype       = MOVETYPE_WALK;
+    self.health         = cvar("g_monster_zombie_health");
+    self.velocity       = '0 0 0';
+    self.angles         = self.pos2;
+    self.moveto         = self.origin;
+    self.flags          = FL_MONSTER;
+
+    setorigin(self,self.pos1);
+    setsize(self,ZOMBIE_MIN,ZOMBIE_MAX);
+}
+
+
+void spawnfunc_monster_zombie()
+{
+    if not(cvar("g_monsters"))
+    {
+        remove(self);
+        return;
+    }
+
+    precache_model("models/monsters/zombie.dpm");
+
+
+    self.verbs_idle   = spawn();
+    self.verbs_attack = spawn();
+
+    self.verbs_idle.owner = self;
+    self.verbs_attack.owner = self;
+
+    self.think      = zombie_spawn;
+    self.nextthink  = time + 2;
+
+    traceline(self.origin + '0 0 10', self.origin - '0 0 32', MOVE_WORLDONLY, self);
+
+    self.pos1 = trace_endpos;
+    self.pos2 = self.angles;
+    self.team = MAX_SHOT_DISTANCE -1;
+
+    verbstack_push(self.verbs_idle, zombie_verb_idle, ZV_IDLE,0 , self);
+
+    verbstack_push(self.verbs_attack, zombie_verb_attack_findtarget, ZV_ATTACK_FIND,0 , self);
+    verbstack_push(self.verbs_attack, zombie_verb_attack_run, ZV_ATTACK_RUN,0 , self);
+    verbstack_push(self.verbs_attack, zombie_verb_attack_stand, ZV_ATTACK_STAND,0 , self);
+
+}
+
+#endif // MONSTES_ENABLED
diff --git a/qcsrc/server/mutators/base.qc b/qcsrc/server/mutators/base.qc
new file mode 100644 (file)
index 0000000..0b1bea4
--- /dev/null
@@ -0,0 +1,108 @@
+.float() cbc_func;
+.entity cbc_next;
+.float cbc_order;
+
+entity CallbackChain_New(string name)
+{
+       entity e;
+       e = spawn();
+       e.classname = "callbackchain";
+       e.netname = name;
+       return e;
+}
+
+float CallbackChain_Add(entity cb, float() func, float order)
+{
+       entity e;
+       if(order & CBC_ORDER_FIRST)
+       {
+               if(order & CBC_ORDER_LAST)
+                       if(cb.cbc_order & CBC_ORDER_ANY)
+                               return 0;
+               if(cb.cbc_order & CBC_ORDER_FIRST)
+                       return 0;
+       }
+       else if(order & CBC_ORDER_LAST)
+       {
+               if(cb.cbc_order & CBC_ORDER_LAST)
+                       return 0;
+       }
+       entity thiscb;
+       thiscb = spawn();
+       thiscb.classname = "callback";
+       thiscb.cbc_func = func;
+       thiscb.cbc_order = order;
+       if(order & CBC_ORDER_FIRST)
+       {
+               thiscb.cbc_next = cb.cbc_next;
+               cb.cbc_next = thiscb;
+       }
+       else if(order & CBC_ORDER_LAST)
+       {
+               for(e = cb; e.cbc_next; e = e.cbc_next);
+               e.cbc_next = thiscb;
+       }
+       else
+       {
+               // by default we execute last, but before a possible CBC_ORDER_LAST callback
+               for(e = cb; e.cbc_next && !(e.cbc_next.cbc_order & CBC_ORDER_LAST); e = e.cbc_next); // we must make sure that we insert BEFORE an CBC_ORDER_LAST mutator!
+               thiscb.cbc_next = e.cbc_next;
+               e.cbc_next = thiscb;
+       }
+       cb.cbc_order |= (order | CBC_ORDER_ANY);
+       return 1;
+}
+
+float CallbackChain_Remove(entity cb, float() func)
+{
+       float order;
+       entity e;
+       float n;
+       n = 0;
+       for(e = cb; e.cbc_next; e = e.cbc_next)
+       {
+               while(e.cbc_next.cbc_func == func)
+               {
+                       // remove e.cbc_next from the chain
+                       entity e2;
+                       e2 = e.cbc_next.cbc_next;
+                       remove(e.cbc_next);
+                       e.cbc_next = e2;
+                       ++n;
+               }
+               // e.cbc_next is now something we want to keep
+               order |= (e.cbc_next.cbc_order & CBC_ORDER_ANY);
+       }
+       cb.cbc_order = order;
+       return n;
+}
+
+float CallbackChain_Call(entity cb)
+{
+       float r;
+       entity e;
+       r = 0;
+       for(e = cb; e.cbc_next; e = e.cbc_next)
+               r |= e.cbc_next.cbc_func();
+       return r; // callbacks return an error status, so 0 is default return value
+}
+
+float Mutator_Add(float(float) func)
+{
+       if(func(MUTATOR_ADDING) == 0)
+       {
+               // good
+               return 1;
+       }
+       backtrace("WARNING: when adding mutator: adding failed\n");
+       Mutator_Remove(func);
+       return 0;
+}
+void Mutator_Remove(float(float) func)
+{
+       if(func(MUTATOR_REMOVING) != 0)
+       {
+               // baaaaad
+               error("Mutator_Remove: removing mutator failed");
+       }
+}
diff --git a/qcsrc/server/mutators/base.qh b/qcsrc/server/mutators/base.qh
new file mode 100644 (file)
index 0000000..73c16a9
--- /dev/null
@@ -0,0 +1,114 @@
+#define CBC_ORDER_EXCLUSIVE 3
+#define CBC_ORDER_FIRST 1
+#define CBC_ORDER_LAST 2
+#define CBC_ORDER_ANY 4
+
+entity CallbackChain_New(string name);
+float CallbackChain_Add(entity cb, float() func, float order)
+float CallbackChain_Remove(entity cb, float() func);
+// a callback function is like this:
+// float mycallback(entity me)
+// {
+//   do something
+//   return r;
+// }
+float CallbackChain_Call(entity cb);
+
+#define MUTATOR_REMOVING 0
+#define MUTATOR_ADDING 1
+float Mutator_Add(float(float) func);
+void Mutator_Remove(float(float) func); // calls error() on fail
+
+#define MUTATOR_ADD(name) Mutator_Add(MUTATOR_##name)
+#define MUTATOR_REMOVE(name) Mutator_Remove(MUTATOR_##name)
+#define MUTATOR_DEFINITION(name) float MUTATOR_##name(float mode)
+#define MUTATOR_DECLARATION(name) float MUTATOR_##name(float mode)
+#define MUTATOR_HOOKFUNCTION(name) float HOOKFUNCTION_##name()
+#define MUTATOR_HOOK(cb,func,order) do { if(mode == MUTATOR_ADDING) { if(!HOOK_##cb) HOOK_##cb = CallbackChain_New(#cb); if(!CallbackChain_Add(HOOK_##cb,HOOKFUNCTION_##func,order)) { print("HOOK FAILED: ", #func, "\n"); return 1; } } else if(mode == MUTATOR_REMOVING) { if(HOOK_##cb) CallbackChain_Remove(HOOK_##cb,HOOKFUNCTION_##func); } } while(0)
+#define MUTATOR_ONADD if(mode == MUTATOR_ADDING)
+#define MUTATOR_ONREMOVE if(mode == MUTATOR_REMOVING)
+
+#define MUTATOR_HOOKABLE(cb) entity HOOK_##cb
+#define MUTATOR_CALLHOOK(cb) CallbackChain_Call(HOOK_##cb)
+
+
+
+
+
+// register all possible hooks here
+
+MUTATOR_HOOKABLE(MakePlayerObserver);
+       // called when a player becomes observer, after shared setup
+
+MUTATOR_HOOKABLE(PlayerSpawn);
+       // called when a player spawns as player, after shared setup, before his weapon is chosen (so items may be changed in here)
+
+MUTATOR_HOOKABLE(ClientDisconnect);
+       // called when a player disconnects
+
+MUTATOR_HOOKABLE(PlayerDies);
+       // called when a player dies to e.g. remove stuff he was carrying.
+       // INPUT:
+               entity frag_inflictor;
+               entity frag_attacker;
+               entity frag_target; // same as self
+
+MUTATOR_HOOKABLE(GiveFragsForKill);
+       // called when someone was fragged by "self", and is expected to change frag_score to adjust scoring for the kill
+       // INPUT:
+               entity frag_attacker; // same as self
+               entity frag_target;
+       // INPUT, OUTPUT:
+               float frag_score;
+
+MUTATOR_HOOKABLE(MatchEnd);
+       // called when the match ends
+
+MUTATOR_HOOKABLE(GetTeamCount);
+       // should adjust ret_float to contain the team count
+       // INPUT, OUTPUT:
+               float ret_float;
+
+MUTATOR_HOOKABLE(SpectateCopy);
+       // copies variables for spectating "other" to "self"
+       // INPUT:
+               entity other;
+
+MUTATOR_HOOKABLE(ForbidThrowCurrentWeapon);
+       // returns 1 if throwing the current weapon shall not be allowed
+
+MUTATOR_HOOKABLE(SetStartItems);
+       // adjusts {warmup_}start_{items,weapons,ammo_{cells,rockets,nails,shells,fuel}}
+
+MUTATOR_HOOKABLE(BuildMutatorsString);
+       // appends ":mutatorname" to ret_string for logging
+       // INPUT, OUTPUT:
+               string ret_string;
+
+MUTATOR_HOOKABLE(BuildMutatorsPrettyString);
+       // appends ", Mutator name" to ret_string for display
+       // INPUT, OUTPUT:
+               string ret_string;
+
+MUTATOR_HOOKABLE(FilterItem);
+       // checks if the current item may be spawned (self.items and self.weapons may be read and written to, as well as the ammo_ fields)
+       // return error to request removal
+
+MUTATOR_HOOKABLE(OnEntityPreSpawn);
+       // return error to prevent entity spawn, or modify the entity
+
+MUTATOR_HOOKABLE(PlayerPreThink);
+       // runs in the event loop for players; is called for ALL player entities, also bots, also the dead, or spectators
+
+MUTATOR_HOOKABLE(GetPressedKeys);
+       // TODO change this into a general PlayerPostThink hook?
+
+MUTATOR_HOOKABLE(PlayerPhysics);
+       // called before any player physics, may adjust variables for movement,
+       // is run AFTER bot code and idle checking
+
+MUTATOR_HOOKABLE(GetCvars);
+       // is meant to call GetCvars_handle*(get_cvars_s, get_cvars_f, cvarfield, "cvarname") for cvars this mutator needs from the client
+       // INPUT:
+               float get_cvars_f;
+               string get_cvars_s;
diff --git a/qcsrc/server/mutators/gamemode_keyhunt.qc b/qcsrc/server/mutators/gamemode_keyhunt.qc
new file mode 100644 (file)
index 0000000..cdc4a07
--- /dev/null
@@ -0,0 +1,1089 @@
+#define FOR_EACH_KH_KEY(v) for(v = kh_worldkeylist; v; v = v.kh_worldkeynext )
+
+// #define KH_PLAYER_USE_ATTACHMENT
+// #define KH_PLAYER_USE_CARRIEDMODEL
+// #define KH_KEY_ATTACHMENT_DEBUG
+
+#ifdef KH_PLAYER_USE_ATTACHMENT
+vector KH_PLAYER_ATTACHMENT_DIST_ROTATED = '0 -4 0';
+vector KH_PLAYER_ATTACHMENT_DIST = '4 0 0';
+vector KH_PLAYER_ATTACHMENT = '0 0 0';
+vector KH_PLAYER_ATTACHMENT_ANGLES = '0 0 0';
+string KH_PLAYER_ATTACHMENT_BONE = "";
+#else
+float KH_KEY_ZSHIFT = 22;
+float KH_KEY_XYDIST = 24;
+float KH_KEY_XYSPEED = 45;
+#endif
+float KH_KEY_WP_ZSHIFT = 20;
+
+vector KH_KEY_MIN = '-10 -10 -46';
+vector KH_KEY_MAX = '10 10 3';
+float KH_KEY_BRIGHTNESS = 2;
+
+string kh_Controller_Waitmsg;
+float kh_no_radar_circles;
+
+// kh_state
+//     bits  0- 4: team of key 1, or 0 for no such key, or 30 for dropped, or 31 for self
+//     bits  5- 9: team of key 2, or 0 for no such key, or 30 for dropped, or 31 for self
+//     bits 10-14: team of key 3, or 0 for no such key, or 30 for dropped, or 31 for self
+//     bits 15-19: team of key 4, or 0 for no such key, or 30 for dropped, or 31 for self
+.float kh_state;
+.float siren_time;  //  time delay the siren
+//.float stuff_time;  //  time delay to stuffcmd a cvar
+
+float test[17] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+//test[0] = status of dropped keys, test[1 - 16] = player #
+//replace 17 with cvar("maxplayers") or similar !!!!!!!!!
+//for(i = 0; i < maxplayers; ++i)
+//     test[i] = "0";
+
+float kh_Team_ByID(float t)
+{
+       if(t == 0) return COLOR_TEAM1;
+       if(t == 1) return COLOR_TEAM2;
+       if(t == 2) return COLOR_TEAM3;
+       if(t == 3) return COLOR_TEAM4;
+       return 0;
+}
+
+entity kh_worldkeylist;
+.entity kh_worldkeynext;
+entity kh_controller;
+float kh_tracking_enabled;
+float kh_teams;
+float kh_interferemsg_time, kh_interferemsg_team;
+.entity kh_next, kh_prev; // linked list
+.float kh_droptime;
+.float kh_dropperteam;
+.entity kh_previous_owner;
+.float kh_previous_owner_playerid;
+
+string kh_sound_capture = "kh/capture.wav";
+string kh_sound_destroy = "kh/destroy.wav";
+string kh_sound_drop = "kh/drop.wav";
+string kh_sound_collect = "kh/collect.wav";
+string kh_sound_alarm = "kh/alarm.wav";  // the new siren/alarm
+
+float kh_key_dropped, kh_key_carried;
+
+float kh_KeyCarrier_waypointsprite_visible_for_player(entity e)  // runs all the time
+{
+       if(e.classname != "player" || self.team != e.team)
+               if(!kh_tracking_enabled)
+                       return FALSE;
+
+       return TRUE;
+}
+
+float kh_Key_waypointsprite_visible_for_player(entity e) // ??
+{
+       if(!kh_tracking_enabled)
+               return FALSE;
+       if(!self.owner)
+               return TRUE;
+       if(!self.owner.owner)
+               return TRUE;
+       return FALSE;  // draw only when key is not owned
+}
+
+void kh_update_state()
+{
+       entity player;
+       entity key;
+       float s;
+       float f;
+
+       s = 0;
+       FOR_EACH_KH_KEY(key)
+       {
+               if(key.owner)
+                       f = key.team;
+               else
+                       f = 30;
+               s |= pow(32, key.count) * f;
+       }
+
+       FOR_EACH_CLIENT(player)
+       {
+               player.kh_state = s;
+       }
+
+       FOR_EACH_KH_KEY(key)
+       {
+               if(key.owner)
+                       key.owner.kh_state |= pow(32, key.count) * 31;
+       }
+       //print(ftos((nextent(world)).kh_state), "\n");
+}
+
+
+
+
+var kh_Think_t kh_Controller_Thinkfunc;
+void kh_Controller_SetThink(float t, string msg, kh_Think_t func)  // runs occasionaly
+{
+       kh_Controller_Thinkfunc = func;
+       kh_controller.cnt = ceil(t);
+       if(kh_Controller_Waitmsg != "")
+               strunzone(kh_Controller_Waitmsg);
+       if(msg == "")
+               kh_Controller_Waitmsg = "";
+       else
+               kh_Controller_Waitmsg = strzone(msg);
+       if(t == 0)
+               kh_controller.nextthink = time; // force
+}
+
+void kh_Controller_Think()  // called a lot
+{
+       entity e;
+       if(intermission_running)
+               return;
+       if(self.cnt > 0)
+       {
+               if(kh_Controller_Waitmsg != "")
+               {
+                       string s;
+                       if(substring(kh_Controller_Waitmsg, strlen(kh_Controller_Waitmsg)-1, 1) == " ")
+                               s = strcat(kh_Controller_Waitmsg, ftos(self.cnt));
+                       else
+                               s = kh_Controller_Waitmsg;
+
+                       //dprint(s, "\n");
+
+                       FOR_EACH_PLAYER(e)
+                               if(clienttype(e) == CLIENTTYPE_REAL)
+                                       centerprint_atprio(e, CENTERPRIO_SPAM, s);
+               }
+               self.cnt -= 1;
+       }
+       else if(self.cnt == 0)
+       {
+               self.cnt -= 1;
+               kh_Controller_Thinkfunc();
+       }
+       self.nextthink = time + 1;
+}
+
+// frags f: take from cvar * f
+// frags 0: no frags
+void kh_Scores_Event(entity player, entity key, string what, float frags_player, float frags_owner)  // update the score when a key is captured
+{
+       string s;
+       if(intermission_running)
+               return;
+
+       if(frags_player)
+               UpdateFrags(player, frags_player);
+
+       if(key && key.owner && frags_owner)
+               UpdateFrags(key.owner, frags_owner);
+
+       if(!cvar("sv_eventlog"))  //output extra info to the console or text file
+               return;
+
+       s = strcat(":keyhunt:", what, ":", ftos(player.playerid), ":", ftos(frags_player));
+
+       if(key && key.owner)
+               s = strcat(s, ":", ftos(key.owner.playerid));
+       else
+               s = strcat(s, ":0");
+
+       s = strcat(s, ":", ftos(frags_owner), ":");
+
+       if(key)
+               s = strcat(s, key.netname);
+
+       GameLogEcho(s);
+}
+
+vector kh_AttachedOrigin(entity e)  // runs when a team captures the flag, it can run 2 or 3 times.
+{
+       if(e.tag_entity)
+       {
+               makevectors(e.tag_entity.angles);
+               return e.tag_entity.origin + e.origin_x * v_forward - e.origin_y * v_right + e.origin_z * v_up;
+       }
+       else
+               return e.origin;
+}
+
+void kh_Key_Attach(entity key)  // runs when a player picks up a key and several times when a key is assigned to a player at the start of a round
+{
+#ifdef KH_PLAYER_USE_ATTACHMENT
+       entity first;
+       first = key.owner.kh_next;
+       if(key == first)
+       {
+               setattachment(key, key.owner, KH_PLAYER_ATTACHMENT_BONE);
+               if(key.kh_next)
+               {
+                       setattachment(key.kh_next, key, "");
+                       setorigin(key, key.kh_next.origin - 0.5 * KH_PLAYER_ATTACHMENT_DIST);
+                       setorigin(key.kh_next, KH_PLAYER_ATTACHMENT_DIST_ROTATED);
+                       key.kh_next.angles = '0 0 0';
+               }
+               else
+                       setorigin(key, KH_PLAYER_ATTACHMENT);
+               key.angles = KH_PLAYER_ATTACHMENT_ANGLES;
+       }
+       else
+       {
+               setattachment(key, key.kh_prev, "");
+               if(key.kh_next)
+                       setattachment(key.kh_next, key, "");
+               setorigin(key, KH_PLAYER_ATTACHMENT_DIST_ROTATED);
+               setorigin(first, first.origin - 0.5 * KH_PLAYER_ATTACHMENT_DIST);
+               key.angles = '0 0 0';
+       }
+#else
+       setattachment(key, key.owner, "");
+       setorigin(key, '0 0 1' * KH_KEY_ZSHIFT);  // fixing x, y in think
+       key.angles_y -= key.owner.angles_y;
+#endif
+       key.flags = 0;
+       key.solid = SOLID_NOT;
+       key.movetype = MOVETYPE_NONE;
+       key.team = key.owner.team;
+       key.nextthink = time;
+       key.damageforcescale = 0;
+       key.takedamage = DAMAGE_NO;
+       key.modelindex = kh_key_carried;
+}
+
+void kh_Key_Detach(entity key) // runs every time a key is dropped or lost. Runs several times times when all the keys are captured
+{
+#ifdef KH_PLAYER_USE_ATTACHMENT
+       entity first;
+       first = key.owner.kh_next;
+       if(key == first)
+       {
+               if(key.kh_next)
+               {
+                       setattachment(key.kh_next, key.owner, KH_PLAYER_ATTACHMENT_BONE);
+                       setorigin(key.kh_next, key.origin + 0.5 * KH_PLAYER_ATTACHMENT_DIST);
+                       key.kh_next.angles = KH_PLAYER_ATTACHMENT_ANGLES;
+               }
+       }
+       else
+       {
+               if(key.kh_next)
+                       setattachment(key.kh_next, key.kh_prev, "");
+               setorigin(first, first.origin + 0.5 * KH_PLAYER_ATTACHMENT_DIST);
+       }
+       // in any case:
+       setattachment(key, world, "");
+       setorigin(key, key.owner.origin + '0 0 1' * (PL_MIN_z - KH_KEY_MIN_z));
+       key.angles = key.owner.angles;
+#else
+       setorigin(key, key.owner.origin + key.origin_z * '0 0 1');
+       setattachment(key, world, "");
+       key.angles_y += key.owner.angles_y;
+#endif
+       key.flags = FL_ITEM;
+       key.solid = SOLID_TRIGGER;
+       key.movetype = MOVETYPE_TOSS;
+       key.pain_finished = time + cvar("g_balance_keyhunt_delay_return");
+       key.damageforcescale = cvar("g_balance_keyhunt_damageforcescale");
+       key.takedamage = DAMAGE_YES;
+       // let key.team stay
+       key.modelindex = kh_key_dropped;
+       key.kh_previous_owner = key.owner;
+       key.kh_previous_owner_playerid = key.owner.playerid;
+}
+
+void kh_Key_AssignTo(entity key, entity player)  // runs every time a key is picked up or assigned. Runs prior to kh_key_attach
+{
+       entity k;
+       float ownerteam0, ownerteam;
+       if(key.owner == player)
+               return;
+
+       ownerteam0 = kh_Key_AllOwnedByWhichTeam();
+
+       if(key.owner)
+       {
+               kh_Key_Detach(key);
+
+               // remove from linked list
+               if(key.kh_next)
+                       key.kh_next.kh_prev = key.kh_prev;
+               key.kh_prev.kh_next = key.kh_next;
+               key.kh_next = world;
+               key.kh_prev = world;
+
+               if(key.owner.kh_next == world)
+               {
+                       // No longer a key carrier
+                       if(!kh_no_radar_circles)
+                               WaypointSprite_Ping(key.owner.waypointsprite_attachedforcarrier);
+                       WaypointSprite_DetachCarrier(key.owner);
+               }
+       }
+
+       key.owner = player;
+
+       if(player)
+       {
+               // insert into linked list
+               key.kh_next = player.kh_next;
+               key.kh_prev = player;
+               player.kh_next = key;
+               if(key.kh_next)
+                       key.kh_next.kh_prev = key;
+
+               float i;
+               i = test[key.owner.playerid];
+                       if(key.netname == "^1red key")
+                               i += 1;
+                       if(key.netname == "^4blue key")
+                               i += 2;
+                       if(key.netname == "^3yellow key")
+                               i += 4;
+                       if(key.netname == "^6pink key")
+                               i += 8;
+               test[key.owner.playerid] = i;
+
+               kh_Key_Attach(key);
+
+               if(key.kh_next == world)
+               {
+                       // player is now a key carrier
+                       WaypointSprite_AttachCarrier("", player);
+                       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)
+                               WaypointSprite_UpdateSprites(player.waypointsprite_attachedforcarrier, "keycarrier-red", "keycarrier-friend", "keycarrier-red");
+                       else if(player.team == COLOR_TEAM2)
+                               WaypointSprite_UpdateSprites(player.waypointsprite_attachedforcarrier, "keycarrier-blue", "keycarrier-friend", "keycarrier-blue");
+                       else if(player.team == COLOR_TEAM3)
+                               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);
+               }
+       }
+
+       // moved that here, also update if there's no player
+       kh_update_state();
+
+       key.pusher = world;
+
+       ownerteam = kh_Key_AllOwnedByWhichTeam();
+       if(ownerteam != ownerteam0)
+       {
+               if(ownerteam != -1)
+               {
+                       kh_interferemsg_time = time + 0.2;
+                       kh_interferemsg_team = player.team;
+
+                       // audit all key carrier sprites, update them to RUN HERE
+                       FOR_EACH_KH_KEY(k)
+                       {
+                               if(k.owner)
+                                       WaypointSprite_UpdateSprites(k.owner.waypointsprite_attachedforcarrier, k.owner.waypointsprite_attachedforcarrier.model1, "keycarrier-finish", k.owner.waypointsprite_attachedforcarrier.model3);
+                       }
+               }
+               else
+               {
+                       kh_interferemsg_time = 0;
+
+                       // audit all key carrier sprites, update them to RUN HERE
+                       FOR_EACH_KH_KEY(k)
+                       {
+                               if(k.owner)
+                                       WaypointSprite_UpdateSprites(k.owner.waypointsprite_attachedforcarrier, k.owner.waypointsprite_attachedforcarrier.model1, "keycarrier-friend", k.owner.waypointsprite_attachedforcarrier.model3);
+                       }
+               }
+       }
+}
+
+void kh_Key_Damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+       if(self.owner)
+               return;
+       if(vlen(force) <= 0)
+               return;
+       if(time > self.pushltime)
+               if(attacker.classname == "player")
+                       self.team = attacker.team;
+}
+
+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);
+
+       if(key.kh_dropperteam != player.team)
+       {
+               kh_Scores_Event(player, key, "collect", cvar("g_balance_keyhunt_score_collect"), 0);
+               PlayerScore_Add(player, SP_KH_PICKUPS, 1);
+       }
+       key.kh_dropperteam = 0;
+       bprint(player.netname, "^7 picked up the ", key.netname, "\n");
+
+       kh_Key_AssignTo(key, player); // this also updates .kh_state
+}
+
+void kh_Key_Touch()  // runs many, many times when a key has been dropped and can be picked up
+{
+       if(intermission_running)
+               return;
+
+       if(self.owner) // already carried
+               return;
+       if(other.classname != "player")
+               return;
+       if(other.deadflag != DEAD_NO)
+               return;
+       if(other == self.enemy)
+               if(time < self.kh_droptime + cvar("g_balance_keyhunt_delay_collect"))
+                       return;  // you just dropped it!
+       kh_Key_Collect(self, other);
+}
+
+void kh_Key_Remove(entity key)  // runs after when all the keys have been collected or when a key has been dropped for more than X seconds
+{
+       entity o;
+       o = key.owner;
+       kh_Key_AssignTo(key, world);
+       if(o) // it was attached
+               WaypointSprite_Kill(key.waypointsprite_attachedforcarrier);
+       else // it was dropped
+               WaypointSprite_DetachCarrier(key);
+
+       // remove key from key list
+       if (kh_worldkeylist == key)
+               kh_worldkeylist = kh_worldkeylist.kh_worldkeynext;
+       else
+       {
+               o = kh_worldkeylist;
+               while (o)
+               {
+                       if (o.kh_worldkeynext == key)
+                       {
+                               o.kh_worldkeynext = o.kh_worldkeynext.kh_worldkeynext;
+                               break;
+                       }
+                       o = o.kh_worldkeynext;
+               }
+       }
+
+       remove(key);
+
+       kh_update_state();
+}
+
+void kh_FinishRound()  // runs when a team captures the keys
+{
+       // prepare next round
+       kh_interferemsg_time = 0;
+       entity key;
+
+       kh_no_radar_circles = TRUE;
+       FOR_EACH_KH_KEY(key)
+               kh_Key_Remove(key);
+       kh_no_radar_circles = FALSE;
+
+       kh_Controller_SetThink(cvar("g_balance_keyhunt_delay_round"), "Round starts in ", kh_StartRound);
+}
+
+void kh_WinnerTeam(float teem)  // runs when a team wins
+{
+       // all key carriers get some points
+       vector firstorigin, lastorigin, midpoint;
+       float first;
+       entity key;
+       float score;
+       score = (kh_teams - 1) * cvar("g_balance_keyhunt_score_capture");
+       DistributeEvenly_Init(score, kh_teams);
+       // twice the score for 3 team games, three times the score for 4 team games!
+       // note: for a win by destroying the key, this should NOT be applied
+       FOR_EACH_KH_KEY(key)
+       {
+               float f;
+               f = DistributeEvenly_Get(1);
+               kh_Scores_Event(key.owner, key, "capture", f, 0);
+               PlayerTeamScore_Add(key.owner, SP_KH_CAPS, ST_KH_CAPS, 1);
+       }
+
+       first = TRUE;
+       FOR_EACH_KH_KEY(key)
+               if(key.owner.kh_next == key)
+               {
+                       if(!first)
+                               bprint("^7, ");
+                       bprint(key.owner.netname);
+                       first = FALSE;
+               }
+       bprint("^7 captured the keys for the ", ColoredTeamName(teem), "\n");
+
+       first = TRUE;
+       midpoint = '0 0 0';
+       FOR_EACH_KH_KEY(key)
+       {
+               vector thisorigin;
+
+               thisorigin = kh_AttachedOrigin(key);
+               //dprint("Key origin: ", vtos(thisorigin), "\n");
+               midpoint += thisorigin;
+
+               if(!first)
+                       te_lightning2(world, lastorigin, thisorigin);
+               lastorigin = thisorigin;
+               if(first)
+                       firstorigin = thisorigin;
+               first = FALSE;
+       }
+       if(kh_teams > 2)
+       {
+               te_lightning2(world, lastorigin, firstorigin);
+       }
+       midpoint = midpoint * (1 / kh_teams);
+       te_customflash(midpoint, 1000, 1, TeamColor(teem) * 0.5 + '0.5 0.5 0.5');  // make the color >=0.5 in each component
+
+       play2all(kh_sound_capture);
+       kh_FinishRound();
+}
+
+void kh_LoserTeam(float teem, entity lostkey)  // runs when a player pushes a flag carrier off the map
+{
+       entity player, key, attacker;
+       float players;
+       float keys;
+       float f;
+
+       attacker = world;
+       if(lostkey.pusher)
+               if(lostkey.pusher.team != teem)
+                       if(lostkey.pusher.classname == "player")
+                               attacker = lostkey.pusher;
+
+       players = keys = 0;
+
+       if(attacker)
+       {
+               if(lostkey.kh_previous_owner)
+                       kh_Scores_Event(lostkey.kh_previous_owner, world, "pushed", 0, -cvar("g_balance_keyhunt_score_push"));
+                       // don't actually GIVE him the -nn points, just log
+               kh_Scores_Event(attacker, world, "push", cvar("g_balance_keyhunt_score_push"), 0);
+               PlayerScore_Add(attacker, SP_KH_PUSHES, 1);
+               centerprint(attacker, "Your push is the best!");
+               bprint("The ", ColoredTeamName(teem), "^7 could not take care of the ", lostkey.netname, "^7 when ", attacker.netname, "^7 came\n");
+       }
+       else
+       {
+               float of, fragsleft, i, j, thisteam;
+               of = cvar("g_balance_keyhunt_score_destroyed_ownfactor");
+
+               FOR_EACH_PLAYER(player)
+                       if(player.team != teem)
+                               ++players;
+
+               FOR_EACH_KH_KEY(key)
+                       if(key.owner && key.team != teem)
+                               ++keys;
+
+               if(lostkey.kh_previous_owner)
+                       kh_Scores_Event(lostkey.kh_previous_owner, world, "destroyed", 0, -cvar("g_balance_keyhunt_score_destroyed"));
+                       // don't actually GIVE him the -nn points, just log
+
+               if(lostkey.kh_previous_owner.playerid == lostkey.kh_previous_owner_playerid)
+                       PlayerScore_Add(lostkey.kh_previous_owner, SP_KH_DESTROYS, 1);
+
+               DistributeEvenly_Init(cvar("g_balance_keyhunt_score_destroyed"), keys * of + players);
+
+               FOR_EACH_KH_KEY(key)
+                       if(key.owner && key.team != teem)
+                       {
+                               f = DistributeEvenly_Get(of);
+                               kh_Scores_Event(key.owner, world, "destroyed_holdingkey", f, 0);
+                       }
+
+               fragsleft = DistributeEvenly_Get(players);
+
+               // Now distribute these among all other teams...
+               j = kh_teams - 1;
+               for(i = 0; i < kh_teams; ++i)
+               {
+                       thisteam = kh_Team_ByID(i);
+                       if(thisteam == teem) // bad boy, no cookie - this WILL happen
+                               continue;
+
+                       players = 0;
+                       FOR_EACH_PLAYER(player)
+                               if(player.team == thisteam)
+                                       ++players;
+
+                       DistributeEvenly_Init(fragsleft, j);
+                       fragsleft = DistributeEvenly_Get(j - 1);
+                       DistributeEvenly_Init(DistributeEvenly_Get(1), players);
+
+                       FOR_EACH_PLAYER(player)
+                               if(player.team == thisteam)
+                               {
+                                       f = DistributeEvenly_Get(1);
+                                       kh_Scores_Event(player, world, "destroyed", f, 0);
+                               }
+
+                       --j;
+               }
+
+               bprint("The ", ColoredTeamName(teem), "^7 could not take care of the ", lostkey.netname, "\n");
+       }
+       play2all(kh_sound_destroy);
+       te_tarexplosion(lostkey.origin);
+
+       kh_FinishRound();
+}
+
+void kh_Key_Think()  // runs all the time
+{
+       entity head;
+       //entity player;  // needed by FOR_EACH_PLAYER
+
+       if(intermission_running)
+               return;
+
+#ifdef KH_KEY_ATTACHMENT_DEBUG
+       if(self.kh_prev == self.owner)
+       {
+               if(cvar_string("_angles") != "")
+               {
+                       self.angles = stov(cvar_string("_angles"));
+                       setorigin(self, stov(cvar_string("_origin")));
+               }
+       }
+#endif
+
+       if(self.owner)
+       {
+#ifndef KH_PLAYER_USE_ATTACHMENT
+               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 + cvar("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, cvar("g_balance_keyhunt_throwvelocity") * v_forward);
+                       kh_Key_AssignTo(self, world);
+                       self.pushltime = time + cvar("g_balance_keyhunt_protecttime");
+                       self.kh_dropperteam = self.team;
+               }
+       }
+
+       // if in nodrop or time over, end the round
+       if(!self.owner)
+               if(time > self.pain_finished)
+                       kh_LoserTeam(self.team, self);
+
+       if(self.owner)
+       if(kh_Key_AllOwnedByWhichTeam() != -1)
+       {
+               if(self.siren_time < time)
+               {
+                       sound(self.owner, CHAN_AUTO, kh_sound_alarm, VOL_BASE, ATTN_NORM);  // play a simple alarm
+                       self.siren_time = time + 2.5;  // repeat every 2.5 seconds
+               }
+
+               entity key;
+               vector p;
+               p = self.owner.origin;
+               FOR_EACH_KH_KEY(key)
+                       if(vlen(key.owner.origin - p) > cvar("g_balance_keyhunt_maxdist"))
+                               goto not_winning;
+               kh_WinnerTeam(self.team);
+:not_winning
+       }
+
+       if(kh_interferemsg_time && time > kh_interferemsg_time)
+       {
+               kh_interferemsg_time = 0;
+               FOR_EACH_PLAYER(head)
+               {
+                       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!");
+                               else
+                                       centerprint(head, "All keys are in your team's hands!\n\nHelp the key carriers to meet!");
+                       else
+                               centerprint(head, strcat("All keys are in the ", ColoredTeamName(kh_interferemsg_team), "^7's hands!\n\nInterfere ^1NOW^7!"));
+               }
+       }
+
+       self.nextthink = time + 0.05;
+}
+
+void key_reset()
+{
+       kh_Key_AssignTo(self, world);
+       kh_Key_Remove(self);
+}
+
+string STR_ITEM_KH_KEY = "item_kh_key";
+void kh_Key_Spawn(entity initial_owner, float angle, float i)  // runs every time a new flag is created, ie after all the keys have been collected
+{
+       entity key;
+       key = spawn();
+       key.count = i;
+       key.classname = STR_ITEM_KH_KEY;
+       key.touch = kh_Key_Touch;
+       key.think = kh_Key_Think;
+       key.nextthink = time;
+       key.items = IT_KEY1 | IT_KEY2;
+       key.cnt = angle;
+       key.angles = '0 360 0' * random();
+       key.event_damage = kh_Key_Damage;
+       key.takedamage = DAMAGE_YES;
+       key.modelindex = kh_key_dropped;
+       key.model = "key";
+       key.kh_dropperteam = 0;
+       key.dphitcontentsmask = DPCONTENTS_SOLID | DPCONTENTS_BODY | DPCONTENTS_PLAYERCLIP;
+       setsize(key, KH_KEY_MIN, KH_KEY_MAX);
+       key.colormod = TeamColor(initial_owner.team) * KH_KEY_BRIGHTNESS;
+       key.reset = key_reset;
+
+       switch(initial_owner.team)
+       {
+               case COLOR_TEAM1:
+                       key.netname = "^1red key";
+                       break;
+               case COLOR_TEAM2:
+                       key.netname = "^4blue key";
+                       break;
+               case COLOR_TEAM3:
+                       key.netname = "^3yellow key";
+                       break;
+               case COLOR_TEAM4:
+                       key.netname = "^6pink key";
+                       break;
+               default:
+                       key.netname = "NETGIER key";
+                       break;
+       }
+
+       // link into key list
+       key.kh_worldkeynext = kh_worldkeylist;
+       kh_worldkeylist = key;
+
+       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);
+       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);
+}
+
+// -1 when no team completely owns all keys yet
+float kh_Key_AllOwnedByWhichTeam()  // constantly called. check to see if all the keys are owned by the same team
+{
+       entity key;
+       float teem;
+       float keys;
+
+       teem = -1;
+       keys = kh_teams;
+       FOR_EACH_KH_KEY(key)
+       {
+               if(!key.owner)
+                       return -1;
+               if(teem == -1)
+                       teem = key.team;
+               else if(teem != key.team)
+                       return -1;
+               --keys;
+       }
+       if(keys != 0)
+               return -1;
+       return teem;
+}
+
+void kh_Key_DropAll(entity player, float suicide) // runs whenever a player dies
+{
+       entity key;
+       entity mypusher;
+       if(player.kh_next)
+       {
+               mypusher = world;
+               if(player.pusher)
+                       if(time < player.pushltime)
+                               mypusher = player.pusher;
+               while((key = player.kh_next))
+               {
+                       kh_Scores_Event(player, key, "losekey", 0, 0);
+                       PlayerScore_Add(player, SP_KH_LOSSES, 1);
+                       bprint(player.netname, "^7 died and lost the ", key.netname, "\n");
+                       kh_Key_AssignTo(key, world);
+                       makevectors('-1 0 0' * (45 + 45 * random()) + '0 360 0' * random());
+                       key.velocity = W_CalculateProjectileVelocity(player.velocity, cvar("g_balance_keyhunt_dropvelocity") * v_forward);
+                       key.pusher = mypusher;
+                       key.pushltime = time + cvar("g_balance_keyhunt_protecttime");
+                       if(suicide)
+                               key.kh_dropperteam = player.team;
+               }
+               sound(player, CHAN_AUTO, kh_sound_drop, VOL_BASE, ATTN_NORM);
+       }
+}
+
+string kh_CheckEnoughPlayers()  // checks enough player are present, runs after every completed round
+{
+       float i, players, teem;
+       entity player;
+       string result;
+       result = "";
+
+       // find a random player per team
+       for(i = 0; i < kh_teams; ++i)
+       {
+               teem = kh_Team_ByID(i);
+               players = 0;
+               FOR_EACH_PLAYER(player)
+                       if(player.deadflag == DEAD_NO)
+                               if(!player.BUTTON_CHAT)
+                                       if(player.team == teem)
+                                               ++players;
+               if(players == 0)
+               {
+                       if(result != "")
+                               result = strcat(result, ", ");
+                       result = strcat(result, ColoredTeamName(teem));
+               }
+       }
+       return result;
+}
+
+void kh_WaitForPlayers()  // delay start of the round until enough players are present
+{
+       string teams_missing;
+
+       if(time < game_starttime)
+       {
+               kh_Controller_SetThink(game_starttime - time + 0.1, "", kh_WaitForPlayers);
+               return;
+       }
+
+       teams_missing = kh_CheckEnoughPlayers();
+       if(teams_missing == "")
+               kh_Controller_SetThink(cvar("g_balance_keyhunt_delay_round"), "Round starts in ", kh_StartRound);
+       else
+               kh_Controller_SetThink(1, strcat("Waiting for players to join...\n\nNeed active players for: ", teams_missing), kh_WaitForPlayers);
+}
+
+void kh_EnableTrackingDevice()  // runs after each round
+{
+       entity player;
+
+       FOR_EACH_PLAYER(player)
+               if(clienttype(player) == CLIENTTYPE_REAL)
+                       centerprint_expire(player, CENTERPRIO_SPAM);
+
+       kh_tracking_enabled = TRUE;
+}
+
+void kh_StartRound()  // runs at the start of each round
+{
+       string teams_missing;
+       float i, players, teem;
+       entity player;
+
+       if(time < game_starttime)
+       {
+               kh_Controller_SetThink(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);
+               return;
+       }
+
+       FOR_EACH_PLAYER(player)
+               if(clienttype(player) == CLIENTTYPE_REAL)
+                       centerprint_expire(player, CENTERPRIO_SPAM);
+
+       for(i = 0; i < kh_teams; ++i)
+       {
+               teem = kh_Team_ByID(i);
+               players = 0;
+               entity my_player;
+               FOR_EACH_PLAYER(player)
+                       if(player.deadflag == DEAD_NO)
+                               if(!player.BUTTON_CHAT)
+                                       if(player.team == teem)
+                                       {
+                                               ++players;
+                                               if(random() * players <= 1)
+                                                       my_player = player;
+                                       }
+               kh_Key_Spawn(my_player, 360 * i / kh_teams, i);
+       }
+
+       kh_tracking_enabled = FALSE;
+       kh_Controller_SetThink(cvar("g_balance_keyhunt_delay_tracking"), "Scanning frequency range...", kh_EnableTrackingDevice);
+}
+
+float kh_HandleFrags(entity attacker, entity targ, float f)  // adds to the player score
+{
+       if(attacker == targ)
+               return f;
+
+       if(targ.kh_next)
+       {
+               if(attacker.team == targ.team)
+               {
+                       entity k;
+                       float nk;
+                       nk = 0;
+                       for(k = targ.kh_next; k != world; k = k.kh_next)
+                               ++nk;
+                       kh_Scores_Event(attacker, targ.kh_next, "carrierfrag", -nk * cvar("g_balance_keyhunt_score_collect"), 0);
+               }
+               else
+               {
+                       kh_Scores_Event(attacker, targ.kh_next, "carrierfrag", cvar("g_balance_keyhunt_score_carrierfrag")-1, 0);
+                       PlayerScore_Add(attacker, SP_KH_KCKILLS, 1);
+                       // the frag gets added later
+               }
+       }
+
+       return f;
+}
+
+void kh_Initialize()  // sets up th KH environment
+{
+       precache_sound(kh_sound_capture);
+       precache_sound(kh_sound_destroy);
+       precache_sound(kh_sound_drop);
+       precache_sound(kh_sound_collect);
+       precache_sound(kh_sound_alarm);  // the new siren
+
+#ifdef KH_PLAYER_USE_CARRIEDMODEL
+       precache_model("models/keyhunt/key-carried.md3");
+#endif
+       precache_model("models/keyhunt/key.md3");
+
+       // setup variables
+       kh_teams = cvar("g_keyhunt_teams_override");
+       if(kh_teams < 2)
+               kh_teams = cvar("g_keyhunt_teams");
+       kh_teams = bound(2, kh_teams, 4);
+
+       // make a KH entity for controlling the game
+       kh_controller = spawn();
+       kh_controller.think = kh_Controller_Think;
+       kh_Controller_SetThink(0, "", kh_WaitForPlayers);
+
+       setmodel(kh_controller, "models/keyhunt/key.md3");
+       kh_key_dropped = kh_controller.modelindex;
+       /*
+       dprint(vtos(kh_controller.mins));
+       dprint(vtos(kh_controller.maxs));
+       dprint("\n");
+       */
+#ifdef KH_PLAYER_USE_CARRIEDMODEL
+       setmodel(kh_controller, "models/keyhunt/key-carried.md3");
+       kh_key_carried = kh_controller.modelindex;
+#else
+       kh_key_carried = kh_key_dropped;
+#endif
+
+       kh_controller.model = "";
+       kh_controller.modelindex = 0;
+
+       addstat(STAT_KH_KEYS, AS_INT, kh_state);
+
+       ScoreRules_kh(kh_teams);
+}
+
+void kh_finalize()
+{
+       // to be called before intermission
+       kh_FinishRound();
+       remove(kh_controller);
+       kh_controller = world;
+}
+
+// register this as a mutator
+
+MUTATOR_HOOKFUNCTION(kh_Key_DropAll)
+{
+       kh_Key_DropAll(self, TRUE);
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(kh_PlayerDies)
+{
+       if(self == other)
+               kh_Key_DropAll(self, TRUE);
+       else if(other.classname == "player" || other.classname == "gib")
+               kh_Key_DropAll(self, FALSE);
+       else
+               kh_Key_DropAll(self, TRUE);
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(kh_GiveFragsForKill)
+{
+       frag_score = kh_HandleFrags(frag_attacker, frag_target, frag_score);
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(kh_finalize)
+{
+       kh_finalize();
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(kh_GetTeamCount)
+{
+       ret_float = kh_teams;
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(kh_SpectateCopy)
+{
+       self.kh_state = other.kh_state;
+       return 0;
+}
+
+MUTATOR_DEFINITION(gamemode_keyhunt)
+{
+       MUTATOR_HOOK(MakePlayerObserver, kh_Key_DropAll, CBC_ORDER_ANY);
+       MUTATOR_HOOK(ClientDisconnect, kh_Key_DropAll, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerDies, kh_PlayerDies, CBC_ORDER_ANY);
+       MUTATOR_HOOK(GiveFragsForKill, kh_GiveFragsForKill, CBC_ORDER_FIRST);
+       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_ONADD
+       {
+               if(time > 1) // game loads at time 1
+                       error("This is a game type and it cannot be added at runtime.");
+               g_keyhunt = 1;
+               kh_Initialize();
+       }
+
+       MUTATOR_ONREMOVE
+       {
+               g_keyhunt = 0;
+               error("This is a game type and it cannot be removed at runtime.");
+       }
+
+       return 0;
+}
diff --git a/qcsrc/server/mutators/gamemode_keyhunt.qh b/qcsrc/server/mutators/gamemode_keyhunt.qh
new file mode 100644 (file)
index 0000000..71f25c3
--- /dev/null
@@ -0,0 +1,12 @@
+// ALL OF THESE should be removed in the future, as other code should not have
+// to care
+
+// used by bots:
+float kh_tracking_enabled;
+.entity kh_next;
+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);
diff --git a/qcsrc/server/mutators/mutator_dodging.qc b/qcsrc/server/mutators/mutator_dodging.qc
new file mode 100644 (file)
index 0000000..d3b8e6d
--- /dev/null
@@ -0,0 +1,295 @@
+
+.float cvar_cl_dodging_timeout;
+
+
+// these are used to store the last key press time for each of the keys..
+.float last_FORWARD_KEY_time;
+.float last_BACKWARD_KEY_time;
+.float last_LEFT_KEY_time;
+.float last_RIGHT_KEY_time;
+
+// these store the movement direction at the time of the dodge action happening.
+.float dodging_direction_x;
+.float dodging_direction_y;
+
+// this indicates the last time a dodge was executed. used to check if another one is allowed
+// and to ramp up the dodge acceleration in the physics hook.
+.float last_dodging_time;
+
+// set to 1 to indicate dodging has started.. reset by physics hook after dodge has been done..
+.float dodging_action;
+
+// This is the velocity gain to be added over the ramp time.
+// It will decrease from frame to frame during dodging_action = 1
+// until it's 0.
+.float dodging_velocity_gain;
+
+// the jump part of the dodge cannot be ramped
+.float dodging_single_action;
+
+void dodging_Initialize() {
+       // print("dodging_Initialize\n");
+
+       self.last_FORWARD_KEY_time = 0;
+       self.last_BACKWARD_KEY_time = 0;
+       self.last_RIGHT_KEY_time = 0;
+       self.last_LEFT_KEY_time = 0;
+       self.last_dodging_time = 0;
+       self.dodging_action = 0;
+       self.dodging_velocity_gain = 0;
+       self.dodging_single_action = 0;
+       self.dodging_direction_x = 0;
+       self.dodging_direction_y = 0;
+}
+
+MUTATOR_HOOKFUNCTION(dodging_GetCvars) {
+       GetCvars_handleFloat(get_cvars_s, get_cvars_f, cvar_cl_dodging_timeout, "cl_dodging_timeout");
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(dodging_PlayerPhysics) {
+       // print("dodging_PlayerPhysics\n");
+
+       float common_factor;
+       float new_velocity_gain;
+       float velocity_difference;
+       float clean_up_and_do_nothing;
+
+       new_velocity_gain = 0;
+       clean_up_and_do_nothing = 0;
+
+       if (g_dodging == 0)
+               clean_up_and_do_nothing = 1;
+
+       // when swimming, no dodging allowed..
+       if (self.waterlevel >= WATERLEVEL_SWIMMING)
+               clean_up_and_do_nothing = 1;
+
+       if (clean_up_and_do_nothing != 0) {
+               self.dodging_action = 0;
+               self.dodging_direction_x = 0;
+               self.dodging_direction_y = 0;
+               return 0;
+       }
+
+       // make sure v_up, v_right and v_forward are sane
+       makevectors(self.angles);
+
+       // if we have e.g. 0.5 sec ramptime and a frametime of 0.25, then the ramp code 
+       // will be called ramp_time/frametime times = 2 times. so, we need to 
+       // add 0.5 * the total speed each frame until the dodge action is done..
+       common_factor = sys_frametime / cvar("sv_dodging_ramp_time");
+
+       // if ramp time is smaller than frametime we get problems ;D
+       if (common_factor > 1) 
+               common_factor = 1;
+
+       new_velocity_gain = self.dodging_velocity_gain - (common_factor * cvar("sv_dodging_horiz_speed"));
+       if (new_velocity_gain < 0)
+               new_velocity_gain = 0;
+
+       velocity_difference = self.dodging_velocity_gain - new_velocity_gain;
+
+       // ramp up dodging speed by adding some velocity each frame.. TODO: do it! :D
+       if (self.dodging_action == 1) {
+               //disable jump key during dodge accel phase
+               if (self.movement_z > 0) self.movement_z = 0;
+
+               self.velocity = 
+                         self.velocity 
+                       + ((self.dodging_direction_y * velocity_difference) * v_right)
+                       + ((self.dodging_direction_x * velocity_difference) * v_forward);
+
+               self.dodging_velocity_gain = self.dodging_velocity_gain - velocity_difference;
+       }
+
+       // the up part of the dodge is a single shot action
+       if (self.dodging_single_action == 1) {
+               self.flags &~= FL_ONGROUND;
+
+               self.velocity = 
+                         self.velocity 
+                       + (cvar("sv_dodging_up_speed") * v_up);
+
+               if (cvar("sv_dodging_sound") == 1)
+                       PlayerSound(playersound_jump, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+
+               setanim(self, self.anim_jump, TRUE, FALSE, TRUE);
+
+               self.dodging_single_action = 0;
+       }
+
+       // are we done with the dodging ramp yet?
+       if((self.dodging_action == 1) && ((time - self.last_dodging_time) > cvar("sv_dodging_ramp_time")))
+       {
+               // reset state so next dodge can be done correctly
+               self.dodging_action = 0;
+               self.dodging_direction_x = 0;
+               self.dodging_direction_y = 0;
+       }
+
+       return 0;
+}
+
+
+// returns 1 if the player is close to a wall
+float check_close_to_wall(float threshold) {
+       if (cvar("sv_dodging_wall_dodging") == 0)
+               return 0;
+
+       vector trace_start;
+       vector trace_end;
+
+       trace_start = self.origin;
+
+       trace_end = self.origin + (1000*v_right);
+       tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self);
+       if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold)
+               return 1;
+
+       trace_end = self.origin - (1000*v_right);
+       tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self);
+       if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold)
+               return 1;
+
+       trace_end = self.origin + (1000*v_forward);
+       tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self);
+       if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold)
+               return 1;
+
+       trace_end = self.origin - (1000*v_forward);
+       tracebox(trace_start, self.mins, self.maxs, trace_end, TRUE, self);
+       if (trace_fraction < 1 && vlen (self.origin - trace_endpos) < threshold)
+               return 1;
+
+       return 0;
+}
+
+float check_close_to_ground(float threshold) {
+       if (self.flags & FL_ONGROUND)
+               return 1;
+
+       return 0;
+}
+
+
+MUTATOR_HOOKFUNCTION(dodging_GetPressedKeys) {
+       // print("dodging_PlayerPhysics\n");
+
+       float length;
+       float tap_direction_x;
+       float tap_direction_y;
+
+       tap_direction_x = 0;
+       tap_direction_y = 0;
+
+       float dodge_detected;
+       if (g_dodging == 0)
+               return 0;
+
+       dodge_detected = 0;
+
+       // first check if the last dodge is far enough back in time so we can dodge again
+       if ((time - self.last_dodging_time) < cvar("sv_dodging_delay"))
+               return 0;
+
+       if (check_close_to_ground(cvar("sv_dodging_height_threshold")) != 1 
+               && check_close_to_wall(cvar("sv_dodging_wall_distance_threshold")) != 1)
+               return 0;
+
+       if (self.movement_x > 0) {
+               // is this a state change?
+               if (!(self.pressedkeys & KEY_FORWARD)) {
+                       if ((time - self.last_FORWARD_KEY_time) < self.cvar_cl_dodging_timeout) { 
+                               tap_direction_x = 1.0;
+                               dodge_detected = 1;
+                       }
+                       self.last_FORWARD_KEY_time = time;
+               }
+       }
+
+       if (self.movement_x < 0) {
+               // is this a state change?
+               if (!(self.pressedkeys & KEY_BACKWARD)) {
+                       tap_direction_x = -1.0;
+                       if ((time - self.last_BACKWARD_KEY_time) < self.cvar_cl_dodging_timeout)        { 
+                               dodge_detected = 1;
+                       }
+                       self.last_BACKWARD_KEY_time = time;
+               }
+       }
+
+       if (self.movement_y > 0) {
+               // is this a state change?
+               if (!(self.pressedkeys & KEY_RIGHT)) {
+                       tap_direction_y = 1.0;
+                       if ((time - self.last_RIGHT_KEY_time) < self.cvar_cl_dodging_timeout)   { 
+                               dodge_detected = 1;
+                       }
+                       self.last_RIGHT_KEY_time = time;
+               }
+       }
+
+       if (self.movement_y < 0) {
+               // is this a state change?
+               if (!(self.pressedkeys & KEY_LEFT)) {
+                       tap_direction_y = -1.0;
+                       if ((time - self.last_LEFT_KEY_time) < self.cvar_cl_dodging_timeout)    { 
+                               dodge_detected = 1;
+                       }
+                       self.last_LEFT_KEY_time = time;
+               }
+       }
+
+
+
+       if (dodge_detected == 1) {
+               self.last_dodging_time = time;
+
+               self.dodging_action = 1;
+               self.dodging_single_action = 1;
+
+               self.dodging_velocity_gain = cvar("sv_dodging_horiz_speed");
+
+               self.dodging_direction_x = tap_direction_x;
+               self.dodging_direction_y = tap_direction_y;
+
+               // normalize the dodging_direction vector.. (unlike UT99) XD
+               length = length + self.dodging_direction_x * self.dodging_direction_x;
+               length = length + self.dodging_direction_y * self.dodging_direction_y;
+               length = sqrt(length);
+
+               self.dodging_direction_x = self.dodging_direction_x * 1.0/length;
+               self.dodging_direction_y = self.dodging_direction_y * 1.0/length;
+       }
+
+       return 0;
+}
+
+MUTATOR_DEFINITION(dodging)
+{
+       // we need to be called before GetPressedKey does its thing so we can
+       // detect state changes and therefore dodging actions..
+       MUTATOR_HOOK(GetPressedKeys, dodging_GetPressedKeys, CBC_ORDER_ANY);
+
+       // in the physics hook we actually implement the dodge..
+       MUTATOR_HOOK(PlayerPhysics, dodging_PlayerPhysics, CBC_ORDER_ANY);
+
+       // get timeout information from the client, so the client can configure it..
+       MUTATOR_HOOK(GetCvars, dodging_GetCvars, CBC_ORDER_ANY);
+
+       // this just turns on the cvar.
+       MUTATOR_ONADD
+       {
+               g_dodging = 1;
+               dodging_Initialize();
+       }
+
+       // this just turns off the cvar.
+       MUTATOR_ONREMOVE
+       {        
+               g_dodging = 0;
+       }
+
+       return 0;
+}
diff --git a/qcsrc/server/mutators/mutator_dodging.qh b/qcsrc/server/mutators/mutator_dodging.qh
new file mode 100644 (file)
index 0000000..8e8be25
--- /dev/null
@@ -0,0 +1,2 @@
+float g_dodging;
+
diff --git a/qcsrc/server/mutators/mutator_nix.qc b/qcsrc/server/mutators/mutator_nix.qc
new file mode 100644 (file)
index 0000000..cc3d563
--- /dev/null
@@ -0,0 +1,278 @@
+float g_nix_with_laser;
+
+float nix_weapon;
+float nix_weapon_ammo;
+float nix_nextchange;
+float nix_nextweapon;
+float nix_nextweapon_ammo;
+.float nix_lastchange_id;
+.float nix_lastinfotime;
+.float nix_nextincr;
+
+.float nix_save_cells;
+.float nix_save_shells;
+.float nix_save_nails;
+.float nix_save_rockets;
+.float nix_save_fuel;
+.float nix_save_weapons;
+
+float NIX_CanChooseWeapon(float wpn)
+{
+       entity e;
+       e = get_weaponinfo(wpn);
+       if(!e.weapons) // skip dummies
+               return FALSE;
+       if(g_weaponarena)
+       {
+               if not(g_weaponarena & e.weapons)
+                       return FALSE;
+       }
+       else
+       {
+               if(wpn == WEP_LASER && g_nix_with_laser)
+                       return FALSE;
+               if not(e.spawnflags & WEP_FLAG_NORMAL)
+                       return FALSE;
+       }
+       return TRUE;
+}
+void NIX_ChooseNextWeapon()
+{
+       float j;
+       RandomSelection_Init();
+       for(j = WEP_FIRST; j <= WEP_LAST; ++j)
+               if(NIX_CanChooseWeapon(j))
+                       RandomSelection_Add(world, j, string_null, 1, (j != nix_weapon));
+       nix_nextweapon = RandomSelection_chosen_float;
+       nix_nextweapon_ammo = W_AmmoItemCode(nix_nextweapon);
+}
+
+void NIX_GiveCurrentWeapon()
+{
+       float dt;
+
+       if(!nix_nextweapon)
+               NIX_ChooseNextWeapon();
+
+       dt = ceil(nix_nextchange - time);
+
+       if(dt <= 0)
+       {
+               nix_weapon = nix_nextweapon;
+               nix_weapon_ammo = nix_nextweapon_ammo;
+               nix_nextweapon = 0;
+               nix_nextchange = time + cvar("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;
+               if (self.items & IT_UNLIMITED_WEAPON_AMMO)
+               {
+                       self.ammo_shells = (nix_weapon_ammo & IT_SHELLS) ?
+                               cvar("g_pickup_shells_max") : 0;
+                       self.ammo_nails = (nix_weapon_ammo & IT_NAILS) ?
+                               cvar("g_pickup_nails_max") : 0;
+                       self.ammo_rockets = (nix_weapon_ammo & IT_ROCKETS) ?
+                               cvar("g_pickup_rockets_max") : 0;
+                       self.ammo_cells = (nix_weapon_ammo & IT_CELLS) ?
+                               cvar("g_pickup_cells_max") : 0;
+                       self.ammo_fuel = (nix_weapon_ammo & IT_FUEL) ?
+                               cvar("g_pickup_fuel_max") : 0;
+               }
+               else
+               {
+                       self.ammo_shells = (nix_weapon_ammo & IT_SHELLS) ?
+                               cvar("g_balance_nix_ammo_shells") : 0;
+                       self.ammo_nails = (nix_weapon_ammo & IT_NAILS) ?
+                               cvar("g_balance_nix_ammo_nails") : 0;
+                       self.ammo_rockets = (nix_weapon_ammo & IT_ROCKETS) ?
+                               cvar("g_balance_nix_ammo_rockets") : 0;
+                       self.ammo_cells = (nix_weapon_ammo & IT_CELLS) ?
+                               cvar("g_balance_nix_ammo_cells") : 0;
+                       self.ammo_fuel = (nix_weapon_ammo & IT_FUEL) ?
+                               cvar("g_balance_nix_ammo_fuel") : 0;
+               }
+               self.nix_nextincr = time + cvar("g_balance_nix_incrtime");
+               if(dt >= 1 && dt <= 5)
+                       self.nix_lastinfotime = -42;
+               else
+                       centerprint(self, strcat("\n\n^2Active weapon: ^3", W_Name(nix_weapon)));
+       }
+       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"));
+       }
+
+       if(!(self.items & IT_UNLIMITED_WEAPON_AMMO) && time > self.nix_nextincr)
+       {
+               if (nix_weapon_ammo & IT_SHELLS)
+                       self.ammo_shells = self.ammo_shells + cvar("g_balance_nix_ammoincr_shells");
+               else if (nix_weapon_ammo & IT_NAILS)
+                       self.ammo_nails = self.ammo_nails + cvar("g_balance_nix_ammoincr_nails");
+               else if (nix_weapon_ammo & IT_ROCKETS)
+                       self.ammo_rockets = self.ammo_rockets + cvar("g_balance_nix_ammoincr_rockets");
+               else if (nix_weapon_ammo & IT_CELLS)
+                       self.ammo_cells = self.ammo_cells + cvar("g_balance_nix_ammoincr_cells");
+               if (nix_weapon_ammo & IT_FUEL) // hook uses cells and fuel
+                       self.ammo_fuel = self.ammo_fuel + cvar("g_balance_nix_ammoincr_fuel");
+               self.nix_nextincr = time + cvar("g_balance_nix_incrtime");
+       }
+
+       self.weapons = 0;
+       if(g_nix_with_laser)
+               self.weapons = self.weapons | WEPBIT_LASER;
+       self.weapons = self.weapons | W_WeaponBit(nix_weapon);
+
+       if(self.switchweapon != nix_weapon)
+               if(!client_hasweapon(self, self.switchweapon, TRUE, FALSE))
+                       if(client_hasweapon(self, nix_weapon, TRUE, FALSE))
+                               W_SwitchWeapon(nix_weapon);
+}
+
+void NIX_precache()
+{
+       float i;
+       for (i = WEP_FIRST; i <= WEP_LAST; ++i)
+               if (NIX_CanChooseWeapon(i))
+                       weapon_action(i, WR_PRECACHE);
+}
+
+MUTATOR_HOOKFUNCTION(nix_ForbidThrowCurrentWeapon)
+{
+       return 1; // no throwing in NIX
+}
+
+MUTATOR_HOOKFUNCTION(nix_SetStartItems)
+{
+       NIX_precache();
+       // we do NOT change the start weapons any more, so we can later turn off the mutator!
+       //   start_weapons = 0; // will be done later, when player spawns
+       //   warmup_start_weapons = 0; // will be done later, when player spawns
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(nix_BuildMutatorsString)
+{
+       ret_string = strcat(ret_string, ":NIX");
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(nix_BuildMutatorsPrettyString)
+{
+       ret_string = strcat(ret_string, ", NIX");
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(nix_FilterItem)
+{
+       switch (self.items)
+       {
+               case IT_HEALTH:
+               case IT_5HP:
+               case IT_25HP:
+               case IT_ARMOR:
+               case IT_ARMOR_SHARD:
+                       if (cvar("g_nix_with_healtharmor"))
+                               return 0;
+                       break;
+               case IT_STRENGTH:
+               case IT_INVINCIBLE:
+                       if (cvar("g_nix_with_powerups"))
+                               return 0;
+                       break;
+       }
+
+       return 1; // delete all other items
+}
+
+MUTATOR_HOOKFUNCTION(nix_OnEntityPreSpawn)
+{
+       if(self.classname == "target_items") // items triggers cannot work in nixnex (as they change weapons/ammo)
+               return 1;
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(nix_PlayerPreThink)
+{
+       if(!intermission_running)
+       if(self.deadflag == DEAD_NO)
+       if(self.classname == "player")
+               NIX_GiveCurrentWeapon();
+       return 0;
+}
+
+MUTATOR_HOOKFUNCTION(nix_PlayerSpawn)
+{
+       self.nix_lastchange_id = -1;
+       NIX_GiveCurrentWeapon(); // overrides the weapons you got when spawning
+       return 0;
+}
+
+MUTATOR_DEFINITION(mutator_nix)
+{
+       entity e;
+
+       MUTATOR_HOOK(ForbidThrowCurrentWeapon, nix_ForbidThrowCurrentWeapon, CBC_ORDER_ANY);
+       MUTATOR_HOOK(SetStartItems, nix_SetStartItems, CBC_ORDER_EXCLUSIVE);
+       MUTATOR_HOOK(BuildMutatorsString, nix_BuildMutatorsString, CBC_ORDER_ANY);
+       MUTATOR_HOOK(BuildMutatorsPrettyString, nix_BuildMutatorsPrettyString, CBC_ORDER_ANY);
+       MUTATOR_HOOK(FilterItem, nix_FilterItem, CBC_ORDER_ANY);
+       MUTATOR_HOOK(OnEntityPreSpawn, nix_OnEntityPreSpawn, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerPreThink, nix_PlayerPreThink, CBC_ORDER_ANY);
+       MUTATOR_HOOK(PlayerSpawn, nix_PlayerSpawn, CBC_ORDER_ANY);
+
+       MUTATOR_ONADD
+       {
+               g_nix_with_laser = cvar("g_nix_with_laser");
+
+               nix_nextchange = time;
+               nix_nextweapon = 0;
+
+               NIX_precache();
+
+               FOR_EACH_PLAYER(e)
+               {
+                       if(e.deadflag == DEAD_NO)
+                       {
+                               e.nix_save_cells = e.ammo_cells;
+                               e.nix_save_shells = e.ammo_shells;
+                               e.nix_save_nails = e.ammo_nails;
+                               e.nix_save_rockets = e.ammo_rockets;
+                               e.nix_save_fuel = e.ammo_fuel;
+                               e.nix_save_weapons = e.weapons;
+                       }
+                       else
+                       {
+                               e.nix_save_cells = 0;
+                               e.nix_save_shells = 0;
+                               e.nix_save_nails = 0;
+                               e.nix_save_rockets = 0;
+                               e.nix_save_fuel = 0;
+                               e.nix_save_weapons = 0;
+                       }
+               }
+       }
+
+       MUTATOR_ONREMOVE
+       {
+               // as the PlayerSpawn hook will no longer run, NIX is turned off by this!
+
+               FOR_EACH_PLAYER(e) if(e.deadflag == DEAD_NO)
+               {
+                       e.ammo_cells = max(start_ammo_cells, e.nix_save_cells);
+                       e.ammo_shells = max(start_ammo_shells, e.nix_save_shells);
+                       e.ammo_nails = max(start_ammo_nails, e.nix_save_nails);
+                       e.ammo_rockets = max(start_ammo_rockets, e.nix_save_rockets);
+                       e.ammo_fuel = max(start_ammo_fuel, e.nix_save_fuel);
+                       e.weapons = (start_weapons | e.nix_save_weapons);
+                       if(!client_hasweapon(e, e.weapon, TRUE, FALSE))
+                               e.switchweapon = w_getbestweapon(self);
+               }
+       }
+
+       return 0;
+}
diff --git a/qcsrc/server/mutators/mutators.qh b/qcsrc/server/mutators/mutators.qh
new file mode 100644 (file)
index 0000000..da14483
--- /dev/null
@@ -0,0 +1,5 @@
+MUTATOR_DECLARATION(gamemode_keyhunt);
+
+MUTATOR_DECLARATION(mutator_nix);
+
+MUTATOR_DECLARATION(dodging);
index ac6249f9936365667bd50f2a9f34b5a8a8dd101c..bad8516de6b1b7ab7392f9b93425ba1eca4c2399 100644 (file)
@@ -56,7 +56,7 @@ void pathlib_showsquare2(entity node ,vector ncolor,float align)
 
     if(align)
     {
-        traceline(node.origin + '0 0 32',node.origin - '0 0 128',MOVE_WORLDONLY,node);
+        traceline(node.origin + '0 0 32', node.origin - '0 0 128', MOVE_WORLDONLY, node);
         node.angles = vectoangles(trace_plane_normal);
         node.angles_x -= 90;
     }
index 81c0cd1e7ead44850ebb525ab62f3cc57ccf5a6d..4647fea1392abdba4013b61f2b2c6c99fdde31bb 100644 (file)
@@ -40,7 +40,7 @@ float pathlib_expandnode_starf(entity node, vector start, vector goal)
     for(i=0;i < 8; ++i)
     {
         t = plib_points[i];
-        fc  = pathlib_heuristic(t,goal) + pathlib_cost(node,t,pathlib_gridsize);
+        fc  = pathlib_heuristic(t,goal) + pathlib_cost(node, t, pathlib_gridsize);
         plib_fvals[i] = fc;
 
     }
@@ -77,11 +77,11 @@ float pathlib_expandnode_starf(entity node, vector start, vector goal)
         */
     }
 
-    pathlib_makenode(node,start,bp,goal,pathlib_gridsize);
+    pathlib_makenode(node, start, bp, goal, pathlib_gridsize);
 
     for(i = 0; i < 3; ++i)
     {
-        pathlib_makenode(node,start,plib_points2[i],goal,pathlib_gridsize);
+        pathlib_makenode(node, start, plib_points2[i], goal, pathlib_gridsize);
     }
 
     return pathlib_open_cnt;
@@ -89,44 +89,79 @@ float pathlib_expandnode_starf(entity node, vector start, vector goal)
 
 float pathlib_expandnode_star(entity node, vector start, vector goal)
 {
-    vector point,where,f,r;
+    vector point, where, f, r;
 
     where = node.origin;
 
     f = PLIB_FORWARD * pathlib_gridsize;
     r = PLIB_RIGHT   * pathlib_gridsize;
 
+    if (node.pathlib_node_edgeflags == pathlib_node_edgeflag_unknown)
+        node.pathlib_node_edgeflags = tile_check_plus2(node.origin);
+
+    if(node.pathlib_node_edgeflags == pathlib_node_edgeflag_none)
+    {
+        dprint("Node at ", vtos(node.origin), " not expanable");
+        return pathlib_open_cnt;
+    }
+
     // Forward
-    point = where + f;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost);
+    if (node.pathlib_node_edgeflags & pathlib_node_edgeflag_forward)
+    {
+        point = where + f;
+        pathlib_makenode(node, start, point, goal, pathlib_movecost);
+    }
 
     // Back
-    point = where - f;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost);
+    if (node.pathlib_node_edgeflags & pathlib_node_edgeflag_back)
+    {
+        point = where - f;
+        pathlib_makenode(node, start, point, goal, pathlib_movecost);
+    }
 
     // Right
-    point = where + r;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost);
+        if (node.pathlib_node_edgeflags & pathlib_node_edgeflag_right)
+    {
+        point = where + r;
+        pathlib_makenode(node, start, point, goal, pathlib_movecost);
+    }
 
     // Left
-    point = where - r;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost);
+    if (node.pathlib_node_edgeflags & pathlib_node_edgeflag_left)
+    {
+        point = where - r;
+        pathlib_makenode(node, start, point, goal, pathlib_movecost);
+
+    }
 
     // Forward-right
-    point = where + f + r;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost_diag);
+    if (node.pathlib_node_edgeflags & pathlib_node_edgeflag_forwardright)
+    {
+        point = where + f + r;
+        pathlib_makenode(node, start, point, goal, pathlib_movecost_diag);
+    }
 
     // Forward-left
-    point = where + f - r;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost_diag);
+    if (node.pathlib_node_edgeflags & pathlib_node_edgeflag_forwardleft)
+    {
+        point = where + f - r;
+        pathlib_makenode(node, start, point, goal, pathlib_movecost_diag);
+
+    }
 
     // Back-right
-    point = where - f + r;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost_diag);
+    if (node.pathlib_node_edgeflags & pathlib_node_edgeflag_backright)
+    {
+        point = where - f + r;
+        pathlib_makenode(node, start, point, goal, pathlib_movecost_diag);
+    }
 
     // Back-left
-    point = where - f - r;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost_diag);
+    if (node.pathlib_node_edgeflags & pathlib_node_edgeflag_backleft)
+    {
+        point = where - f - r;
+        pathlib_makenode(node, start, point, goal, pathlib_movecost_diag);
+    }
 
     return pathlib_open_cnt;
 }
@@ -142,40 +177,40 @@ float pathlib_expandnode_octagon(entity node, vector start, vector goal)
 
     // Forward
     point = where + f;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost);
+    pathlib_makenode(node, start, point, goal, pathlib_movecost);
 
     // Back
     point = where - f;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost);
+    pathlib_makenode(node, start, point, goal, pathlib_movecost);
 
     // Right
     point = where + r;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost);
+    pathlib_makenode(node, start, point, goal, pathlib_movecost);
 
     // Left
     point = where - r;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost);
+    pathlib_makenode(node, start, point, goal, pathlib_movecost);
 
     f = PLIB_FORWARD * pathlib_gridsize * 0.5;
     r = PLIB_RIGHT   * pathlib_gridsize * 0.5;
 
     // Forward-right
     point = where + f + r;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost);
+    pathlib_makenode(node, start, point, goal, pathlib_movecost);
 
 
     // Forward-left
     point = where + f - r;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost);
+    pathlib_makenode(node, start, point, goal, pathlib_movecost);
 
 
     // Back-right
     point = where - f + r;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost);
+    pathlib_makenode(node, start, point, goal, pathlib_movecost);
 
     // Back-left
     point = where - f - r;
-    pathlib_makenode(node,start,point,goal,pathlib_movecost);
+    pathlib_makenode(node, start, point, goal, pathlib_movecost);
 
     return pathlib_open_cnt;
 }
index 6d5a785cc61e72e3cfca1f537c60d95b8c905af3..fbff82e9ef7c2ca6d818282cce004bdafbdd3226 100644 (file)
@@ -28,7 +28,7 @@ entity pathlib_mknode(vector where,entity parent)
     node = pathlib_nodeatpoint(where);
     if(node)
     {
-        mark_error(where,60);
+        mark_error(where, 60);
         return node;
     }
 
@@ -40,19 +40,12 @@ entity pathlib_mknode(vector where,entity parent)
     node.owner        = openlist;
     node.path_prev    = parent;
 
-    setmodel(node,"models/pathlib/square.md3");
-    setsize(node,'0 0 0','0 0 0');
-    node.colormod = randomvec() * 2;
-    node.alpha = 0.25;
-    node.scale     = pathlib_gridsize / 512.001;
 
-    //pathlib_showsquare2(node,'1 1 1',0);//(node.medium & CONTENT_EMPTY));
+    setsize(node, '0 0 0', '0 0 0');
+
     setorigin(node, where);
     node.medium = pointcontents(where);
-
-    mark_info(where,60);
-    //pathlib_showsquare(where,1,30);
-
+    pathlib_showsquare(where, 1 ,15);
 
     ++pathlib_made_cnt;
     ++pathlib_open_cnt;
@@ -70,6 +63,7 @@ float pathlib_makenode_adaptive(entity parent,vector start, vector to, vector go
 
     if(inwater(parent.origin))
     {
+        dprint("FromWater\n");
         pathlib_expandnode = pathlib_expandnode_box;
         pathlib_movenode   = pathlib_swimnode;
     }
@@ -77,11 +71,13 @@ float pathlib_makenode_adaptive(entity parent,vector start, vector to, vector go
     {
         if(inwater(to))
         {
+            dprint("ToWater\n");
             pathlib_expandnode = pathlib_expandnode_box;
             pathlib_movenode   = pathlib_walknode;
         }
         else
         {
+            dprint("LandToLoand\n");
             //if(edge_check(parent.origin))
             //    return 0;
 
@@ -94,6 +90,7 @@ float pathlib_makenode_adaptive(entity parent,vector start, vector to, vector go
     node = pathlib_nodeatpoint(to);
     if(node)
     {
+        dprint("NodeAtPoint\n");
         ++pathlib_merge_cnt;
 
         if(node.owner == openlist)
@@ -120,9 +117,17 @@ float pathlib_makenode_adaptive(entity parent,vector start, vector to, vector go
         return 1;
     }
 
-    where = pathlib_movenode(parent.origin,to,0);
+    where = pathlib_movenode(parent.origin, to, 0);
+
     if not(pathlib_movenode_goodnode)
+    {
+        //pathlib_showsquare(where, 0 ,30);
+        //pathlib_showsquare(parent.origin, 1 ,30);
+        dprint("pathlib_movenode_goodnode = 0\n");
         return 0;
+    }
+
+    //pathlib_showsquare(where, 1 ,30);
 
     if(pathlib_nodeatpoint(where))
     {
@@ -132,15 +137,20 @@ float pathlib_makenode_adaptive(entity parent,vector start, vector to, vector go
         return 0;
     }
 
+
     if(doedge)
         if not (tile_check(where))
+        {
+            dprint("tile_check fail\n");
+            pathlib_showsquare(where, 0 ,30);
             return 0;
+        }
+
 
     h = pathlib_heuristic(where,goal);
     g = pathlib_cost(parent,where,cost);
     f = g + h;
 
-
     /*
     node = findradius(where,pathlib_gridsize * 0.5);
     while(node)
@@ -175,7 +185,7 @@ float pathlib_makenode_adaptive(entity parent,vector start, vector to, vector go
     }
     */
 
-    node = pathlib_mknode(where,parent);
+    node = pathlib_mknode(where, parent);
     node.pathlib_node_h = h;
     node.pathlib_node_g = g;
     node.pathlib_node_f = f;
@@ -317,6 +327,11 @@ float buildpath_nodefilter_moveskip(vector n,vector c,vector p)
     return 0;
 }
 
+float buildpath_nodefilter_none(vector n,vector c,vector p)
+{
+    return 0;
+}
+
 entity path_build(entity next, vector where, entity prev, entity start)
 {
     entity path;
@@ -358,17 +373,23 @@ entity pathlib_astar(vector from,vector to)
 
     // Select water<->land capable node make/link
     pathlib_makenode     = pathlib_makenode_adaptive;
+
     // Select XYZ cost estimate
     //pathlib_heuristic    = pathlib_h_diagonal3;
     pathlib_heuristic    = pathlib_h_diagonal;
+
     // Select distance + waterfactor cost
     pathlib_cost         = pathlib_g_euclidean_water;
+
     // Select star expander
     pathlib_expandnode   = pathlib_expandnode_star;
+
     // Select walk simulation movement test
     pathlib_movenode     = pathlib_walknode;
+
     // Filter final nodes by direction
     buildpath_nodefilter = buildpath_nodefilter_directional;
+
     // Filter tiles with cross pattern
     tile_check = tile_check_cross;
 
@@ -400,31 +421,37 @@ entity pathlib_astar(vector from,vector to)
     pathlib_gridsize       = 128;
     pathlib_movecost       = pathlib_gridsize;
     pathlib_movecost_diag  = vlen(('1 1 0' * pathlib_gridsize));
-    pathlib_movecost_waterfactor = 1;
+    pathlib_movecost_waterfactor = 25000000;
     pathlib_foundgoal      = 0;
 
-    movenode_boxmax   = self.maxs * 1.25;
-    movenode_boxmin   = self.mins * 1.25;
+    movenode_boxmax   = self.maxs * 1.1;
+    movenode_boxmin   = self.mins * 1.1;
 
-    movenode_stepsize = 32;
+    movenode_stepsize = pathlib_gridsize * 0.25;
 
-    tile_check_size = 65;
+    tile_check_size = pathlib_gridsize * 0.5;
+    tile_check_up   = '0 0 2' * pathlib_gridsize;
     tile_check_up   = '0 0 128';
-    tile_check_down = '0 0 128';
+    tile_check_down = '0 0 3' * pathlib_gridsize;
+    tile_check_down = '0 0 256';
 
+    //movenode_stepup   = '0 0 128';
     movenode_stepup   = '0 0 36';
-    movenode_maxdrop  = '0 0 128';
+    movenode_maxdrop  = '0 0 512';
+    //movenode_maxdrop  = '0 0 512';
     movenode_boxup    = '0 0 72';
 
-    from_x = fsnap(from_x,pathlib_gridsize);
-    from_y = fsnap(from_y,pathlib_gridsize);
+    from_x = fsnap(from_x, pathlib_gridsize);
+    from_y = fsnap(from_y, pathlib_gridsize);
+    //from_z += 32;
 
-    to_x = fsnap(to_x,pathlib_gridsize);
-    to_y = fsnap(to_y,pathlib_gridsize);
+    to_x = fsnap(to_x, pathlib_gridsize);
+    to_y = fsnap(to_y, pathlib_gridsize);
+    //to_z += 32;
 
     dprint("AStar init\n");
-    path = pathlib_mknode(from,world);
-    pathlib_close_node(path,to);
+    path = pathlib_mknode(from, world);
+    pathlib_close_node(path, to);
     if(pathlib_foundgoal)
     {
         dprint("AStar: Goal found on first node!\n");
@@ -439,7 +466,7 @@ entity pathlib_astar(vector from,vector to)
         return open;
     }
 
-    if(pathlib_expandnode(path,from,to) <= 0)
+    if(pathlib_expandnode(path, from, to) <= 0)
     {
         dprint("AStar path fail.\n");
         pathlib_cleanup();
@@ -449,11 +476,11 @@ entity pathlib_astar(vector from,vector to)
 
     best_open_node = pathlib_getbestopen();
     n = best_open_node;
-    pathlib_close_node(best_open_node,to);
+    pathlib_close_node(best_open_node, to);
     if(inwater(n.origin))
-        pathlib_expandnode_box(n,from,to);
+        pathlib_expandnode_box(n, from, to);
     else
-        pathlib_expandnode_star(n,from,to);
+        pathlib_expandnode_star(n, from, to);
 
     while(pathlib_open_cnt)
     {
index 59973b0456354747ef0c9f4bb5e03d5075b52126..9369fb4d69f2a179ff47ac74c8677e49349a1449 100644 (file)
@@ -66,11 +66,22 @@ vector pathlib_flynode(vector start,vector end)
     return end;
 }
 
+void a_think()
+{
+    te_lightning1(self,self.origin, self.pos1);
+    if(self.cnt < time)
+        remove(self);
+    else
+        self.nextthink = time + 0.2;
+}
+
 vector pathlib_walknode(vector start,vector end,float doedge)
 {
     vector direction,point,last_point,s,e;
     float steps, distance, i;
 
+    dprint("Walking node from ", vtos(start), " to ", vtos(end), "\n");
+
     pathlib_movenode_goodnode = 0;
 
     end_x = fsnap(end_x,pathlib_gridsize);
@@ -79,9 +90,21 @@ vector pathlib_walknode(vector start,vector end,float doedge)
     start_y = fsnap(start_y,pathlib_gridsize);
 
     // Find the floor
-    traceline(start + movenode_stepup, start - movenode_maxdrop,MOVE_WORLDONLY,self);
+    traceline(start + movenode_stepup, start - movenode_maxdrop, MOVE_WORLDONLY, self);
     if(trace_fraction == 1.0)
+    {
+        entity a;
+        a = spawn();
+        a.think = a_think;
+        a.nextthink = time;
+        setorigin(a,start + movenode_stepup);
+        a.pos1 = trace_endpos;
+        //start - movenode_maxdrop
+        a.cnt = time + 10;
+
+        dprint("I cant walk on air!\n");
         return trace_endpos;
+    }
 
     start = trace_endpos;
 
diff --git a/qcsrc/server/pathlib/path_waypoint.qc b/qcsrc/server/pathlib/path_waypoint.qc
new file mode 100644 (file)
index 0000000..73b4155
--- /dev/null
@@ -0,0 +1,245 @@
+var float pathlib_wpp_open(entity wp, entity child, float cost);
+
+void pathlib_wpp_close(entity wp)
+{
+    --pathlib_open_cnt;
+    ++pathlib_closed_cnt;
+
+    wp.pathlib_list = closedlist;
+
+    if(wp == best_open_node)
+        best_open_node = world;
+
+    if(wp == goal_node)
+        pathlib_foundgoal = TRUE;
+}
+
+float pathlib_wpp_opencb(entity wp, entity child, float cost)
+{
+
+    if(child.pathlib_list == closedlist)
+        return FALSE;
+
+       // FIXME! wp.wp##mincost is NOT distance. Make it distance or add a field for distance to be used here (for better speed)
+       cost = vlen(child.origin - wp.origin);
+       
+    child.path_prev     = wp;
+    child.pathlib_list   = openlist;
+    child.pathlib_node_g = wp.pathlib_node_g + cost;
+    child.pathlib_node_h = pathlib_heuristic(child.origin, goal_node.origin);
+    child.pathlib_node_c = pathlib_wpp_waypointcallback(child, wp);
+    child.pathlib_node_f = child.pathlib_node_g + child.pathlib_node_h + child.pathlib_node_c;
+    
+
+    if(child == goal_node)
+        pathlib_foundgoal = TRUE;
+
+    ++pathlib_open_cnt;
+
+    if(best_open_node.pathlib_node_f > child.pathlib_node_f)
+        best_open_node = child;
+
+    return TRUE;
+}
+
+float pathlib_wpp_openncb(entity wp, entity child, float cost)
+{
+
+    if(child.pathlib_list == closedlist)
+        return FALSE;
+
+       // FIXME! wp.wp##mincost is NOT distance. Make it distance or add a field for distance to be used here (for better speed)
+       cost = vlen(child.origin - wp.origin);
+       
+    child.path_prev     = wp;
+    child.pathlib_list   = openlist;
+    child.pathlib_node_g = wp.pathlib_node_g + cost;
+    child.pathlib_node_h = pathlib_heuristic(child.origin, goal_node.origin); 
+    child.pathlib_node_f = child.pathlib_node_g + child.pathlib_node_h;
+
+    if(child == goal_node)
+        pathlib_foundgoal = TRUE;
+
+    ++pathlib_open_cnt;
+
+    if(best_open_node.pathlib_node_f > child.pathlib_node_f)
+        best_open_node = child;
+
+    return TRUE;
+}
+
+float pathlib_wpp_expand(entity wp)
+{
+    if(wp.wp00) pathlib_wpp_open(wp,wp.wp00,wp.wp00mincost); else return 0;
+    if(wp.wp01) pathlib_wpp_open(wp,wp.wp01,wp.wp01mincost); else return 1;
+    if(wp.wp02) pathlib_wpp_open(wp,wp.wp02,wp.wp02mincost); else return 2;
+    if(wp.wp03) pathlib_wpp_open(wp,wp.wp03,wp.wp03mincost); else return 3;
+    if(wp.wp04) pathlib_wpp_open(wp,wp.wp04,wp.wp04mincost); else return 4;
+    if(wp.wp05) pathlib_wpp_open(wp,wp.wp05,wp.wp05mincost); else return 5;
+    if(wp.wp06) pathlib_wpp_open(wp,wp.wp06,wp.wp06mincost); else return 6;
+    if(wp.wp07) pathlib_wpp_open(wp,wp.wp07,wp.wp07mincost); else return 7;
+    if(wp.wp08) pathlib_wpp_open(wp,wp.wp08,wp.wp08mincost); else return 8;
+    if(wp.wp09) pathlib_wpp_open(wp,wp.wp09,wp.wp09mincost); else return 9;
+    if(wp.wp10) pathlib_wpp_open(wp,wp.wp10,wp.wp10mincost); else return 10;
+    if(wp.wp11) pathlib_wpp_open(wp,wp.wp11,wp.wp11mincost); else return 11;
+    if(wp.wp12) pathlib_wpp_open(wp,wp.wp12,wp.wp12mincost); else return 12;
+    if(wp.wp13) pathlib_wpp_open(wp,wp.wp13,wp.wp13mincost); else return 13;
+    if(wp.wp14) pathlib_wpp_open(wp,wp.wp14,wp.wp14mincost); else return 14;
+    if(wp.wp15) pathlib_wpp_open(wp,wp.wp15,wp.wp15mincost); else return 15;
+    if(wp.wp16) pathlib_wpp_open(wp,wp.wp16,wp.wp16mincost); else return 16;
+    if(wp.wp17) pathlib_wpp_open(wp,wp.wp17,wp.wp17mincost); else return 17;
+    if(wp.wp18) pathlib_wpp_open(wp,wp.wp18,wp.wp18mincost); else return 18;
+    if(wp.wp19) pathlib_wpp_open(wp,wp.wp19,wp.wp19mincost); else return 19;
+    if(wp.wp20) pathlib_wpp_open(wp,wp.wp20,wp.wp20mincost); else return 20;
+    if(wp.wp21) pathlib_wpp_open(wp,wp.wp21,wp.wp21mincost); else return 21;
+    if(wp.wp22) pathlib_wpp_open(wp,wp.wp22,wp.wp22mincost); else return 22;
+    if(wp.wp23) pathlib_wpp_open(wp,wp.wp23,wp.wp23mincost); else return 23;
+    if(wp.wp24) pathlib_wpp_open(wp,wp.wp24,wp.wp24mincost); else return 24;
+    if(wp.wp25) pathlib_wpp_open(wp,wp.wp25,wp.wp25mincost); else return 25;
+    if(wp.wp26) pathlib_wpp_open(wp,wp.wp26,wp.wp26mincost); else return 26;
+    if(wp.wp27) pathlib_wpp_open(wp,wp.wp27,wp.wp27mincost); else return 27;
+    if(wp.wp28) pathlib_wpp_open(wp,wp.wp28,wp.wp28mincost); else return 28;
+    if(wp.wp29) pathlib_wpp_open(wp,wp.wp29,wp.wp29mincost); else return 29;
+    if(wp.wp30) pathlib_wpp_open(wp,wp.wp30,wp.wp30mincost); else return 30;
+    if(wp.wp31) pathlib_wpp_open(wp,wp.wp31,wp.wp31mincost); else return 31;
+    
+    return 32;
+}
+
+entity pathlib_wpp_bestopen()
+{
+    entity n, best;
+
+    if(best_open_node)
+        return best_open_node;
+
+    n = findchainentity(pathlib_list, openlist);
+    best = n;
+    while(n)
+    {
+        if(n.pathlib_node_f < best.pathlib_node_f)
+            best = n;
+
+        n = n.chain;
+    }
+
+    return best;
+
+}
+
+entity pathlib_waypointpath(entity wp_from, entity wp_to, float callback)
+{
+    entity n;
+    float ptime;
+
+    ptime                                      = gettime(GETTIME_REALTIME);
+    pathlib_starttime          = ptime;        
+       pathlib_movecost                = 300;
+       pathlib_movecost_diag   = vlen('1 1 0' * pathlib_movecost);
+       
+       if not (pathlib_wpp_waypointcallback) 
+               callback = FALSE;
+               
+       if (callback)
+               pathlib_wpp_open = pathlib_wpp_opencb;
+       else
+               pathlib_wpp_open = pathlib_wpp_openncb;
+       
+       pathlib_heuristic = pathlib_h_none;
+       
+    if not(openlist)
+        openlist       = spawn();
+
+    if not(closedlist)
+        closedlist     = spawn();
+
+    pathlib_closed_cnt       = 0;
+    pathlib_open_cnt         = 0;
+    pathlib_searched_cnt     = 0;
+    pathlib_foundgoal      = FALSE;
+
+    dprint("pathlib_waypointpath init\n");
+
+    // Initialize waypoint grid
+    // FIXME! presisted chain for better preformance
+    for(n = findchain(classname, "waypoint"); n; n = n.chain)
+    {
+        n.pathlib_list = world;
+        n.pathlib_node_g = 0;
+        n.pathlib_node_f = 0;
+        n.pathlib_node_h = 0;
+        
+        //setmodel(n, "models/runematch/rune.mdl");
+        //n.effects = EF_LOWPRECISION;
+        //n.colormod = '0 0 0';
+        //n.scale = 1;
+        
+    }
+
+    goal_node  = wp_to;
+    start_node = wp_from;
+
+    start_node.pathlib_list = closedlist;
+    dprint("Expanding ",ftos(pathlib_wpp_expand(start_node))," links\n");
+    if(pathlib_open_cnt <= 0)
+    {
+        dprint("pathlib_waypointpath: Start waypoint not linked! aborting.\n");
+        return world;
+    }
+
+    return world;
+}
+
+entity pathlib_waypointpath_step()
+{
+    entity n;
+
+    n = pathlib_wpp_bestopen();
+    if(!n)
+    {
+        dprint("Cannot find best open node, abort.\n");
+        return world;
+    }
+    pathlib_wpp_close(n);
+       dprint("Expanding ",ftos(pathlib_wpp_expand(n))," links\n");
+       
+    if(pathlib_foundgoal)
+    {
+        entity start, end, open, ln;
+        
+        dprint("Target found. Rebuilding and filtering path...\n");
+        
+               buildpath_nodefilter = buildpath_nodefilter_none;
+               start = path_build(world, start_node.origin, world, world);
+               end   = path_build(world, goal_node.origin, world, start);
+               ln    = end;
+               
+               for(open = goal_node; open.path_prev != start_node; open = open.path_prev)
+               {
+                       n    = path_build(ln,open.origin,open.path_prev,start);
+                       ln.path_prev = n;
+                       ln = n;
+               }
+               start.path_next = n;
+               n.path_prev = start;            
+               
+        return start;
+    }
+
+    return world;
+}
+void plas_think()
+{
+    pathlib_waypointpath_step();
+    if(pathlib_foundgoal)
+        return;
+    self.nextthink = time + 0.1;
+}
+
+void pathlib_waypointpath_autostep()
+{
+    entity n;
+    n = spawn();
+    n.think = plas_think;
+    n.nextthink = time + 0.1;
+}
index 19f6ef083be8d924ccbc6b7e768c29a094fe5584..2616a77369fb767b5d6ca9c8f89ca0e60676ec83 100644 (file)
@@ -1,3 +1,4 @@
+.entity pathlib_list;
 .entity path_next;
 .entity path_prev;
 
@@ -17,12 +18,28 @@ void pathlib_showpath2(entity path);
 
 entity openlist;
 entity closedlist;
+entity edgelist;
+
 entity goal_node;
+entity start_node;
 
 .float is_path_node;
 .float pathlib_node_g;
 .float pathlib_node_h;
 .float pathlib_node_f;
+.float pathlib_node_c;
+
+#define pathlib_node_edgeflag_unknown        0
+#define pathlib_node_edgeflag_left           2
+#define pathlib_node_edgeflag_right          4
+#define pathlib_node_edgeflag_forward        8
+#define pathlib_node_edgeflag_back           16
+#define pathlib_node_edgeflag_backleft       32
+#define pathlib_node_edgeflag_backright      64
+#define pathlib_node_edgeflag_forwardleft    128
+#define pathlib_node_edgeflag_forwardright   256
+#define pathlib_node_edgeflag_none           512
+.float pathlib_node_edgeflags;
 
 float pathlib_open_cnt;
 float pathlib_closed_cnt;
@@ -39,17 +56,17 @@ float pathlib_movecost_waterfactor;
 float pathlib_foundgoal;
 
 float pathlib_starttime;
-#define pathlib_maxtime 5
+#define pathlib_maxtime 60
 
 entity best_open_node;
 
 vector tile_check_up;
 vector tile_check_down;
 float  tile_check_size;
-float      tile_check_cross(vector where);
-float      tile_check_plus(vector where);
-float      tile_check_star(vector where);
-var float  tile_check(vector where);
+float     tile_check_cross(vector where);
+float     tile_check_plus(vector where);
+float     tile_check_star(vector where);
+var float tile_check(vector where);
 
 float  movenode_stepsize;
 vector movenode_stepup;
@@ -82,14 +99,17 @@ float      pathlib_h_euclidean(vector a,vector b);
 float      pathlib_h_diagonal2(vector a, vector b);
 float      pathlib_h_diagonal3(vector a, vector b);
 float      pathlib_h_diagonal2sdp(vector preprev, vector prev, vector point, vector end);
+float      pathlib_h_none(vector preprev, vector prev) { return 0; }
 var float  pathlib_heuristic(vector from, vector to);
 
 var float  pathlib_makenode(entity parent,vector start, vector to, vector goal,float cost);
 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"
+       #include "debug.qc"
 #endif
 
 #include "utility.qc"
@@ -97,3 +117,4 @@ var float  buildpath_nodefilter(vector n,vector c,vector p);
 #include "costs.qc"
 #include "expandnode.qc"
 #include "main.qc"
+#include "path_waypoint.qc"
index 81d06b2c9a6d494b73ebf5dbce42aee8a3a1efd5..5d9fc3d9788c38aab12173b5c7054e3b45e7d2b2 100644 (file)
@@ -90,28 +90,29 @@ float tile_check_cross(vector where)
     f = PLIB_FORWARD * tile_check_size;
     r = PLIB_RIGHT   * tile_check_size;
 
+
     // forward-right
     p = where + f + r;
-    traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
-    if not (location_isok(trace_endpos,1,0))
+    traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
+    if not (location_isok(trace_endpos, 1, 0))
         return 0;
 
     // Forward-left
     p = where + f - r;
-    traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
-    if not (location_isok(trace_endpos,1,0))
+    traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
+    if not (location_isok(trace_endpos, 1, 0))
         return 0;
 
     // Back-right
     p = where - f + r;
-    traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
-    if not (location_isok(trace_endpos,1,0))
+    traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
+    if not (location_isok(trace_endpos, 1 ,0))
         return 0;
 
     //Back-left
     p = where - f - r;
-    traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
-    if not (location_isok(trace_endpos,1,0))
+    traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
+    if not (location_isok(trace_endpos, 1, 0))
         return 0;
 
     return 1;
@@ -130,13 +131,13 @@ float tile_check_plus(vector where)
     if not (location_isok(trace_endpos,1,0))
         return 0;
 
+
     //left
     p = where - r;
     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
     if not (location_isok(trace_endpos,1,0))
         return 0;
 
-
     // Right
     p = where + r;
     traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
@@ -152,6 +153,100 @@ float tile_check_plus(vector where)
     return 1;
 }
 
+float tile_check_plus2(vector where)
+{
+    vector p,f,r;
+    float i,e;
+
+    f = PLIB_FORWARD * pathlib_gridsize;
+    r = PLIB_RIGHT   * pathlib_gridsize;
+
+//#define pathlib_node_edgeflag_left    2
+//#define pathlib_node_edgeflag_right   4
+//#define pathlib_node_edgeflag_forward 8
+//#define pathlib_node_edgeflag_back    16
+
+    // forward
+    p = where + f;
+    traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
+    if (location_isok(trace_endpos,1,0))
+    {
+       ++i;
+       e |= pathlib_node_edgeflag_forward;
+    }
+
+
+    //left
+    p = where - r;
+    traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
+    if (location_isok(trace_endpos,1,0))
+    {
+       ++i;
+       e |= pathlib_node_edgeflag_left;
+    }
+
+
+    // Right
+    p = where + r;
+    traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
+    if (location_isok(trace_endpos,1,0))
+    {
+       ++i;
+       e |= pathlib_node_edgeflag_right;
+    }
+
+    //Back
+    p = where - f;
+    traceline(p+tile_check_up,p-tile_check_down,MOVE_WORLDONLY,self);
+    if (location_isok(trace_endpos,1,0))
+    {
+       ++i;
+       e |= pathlib_node_edgeflag_back;
+    }
+
+    // forward-right
+    p = where + f + r;
+    traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
+    if (location_isok(trace_endpos, 1, 0))
+    {
+       ++i;
+       e |= pathlib_node_edgeflag_forwardright;
+    }
+
+    // Forward-left
+    p = where + f - r;
+    traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
+    if (location_isok(trace_endpos, 1, 0))
+    {
+       ++i;
+       e |= pathlib_node_edgeflag_forwardleft;
+    }
+
+    // Back-right
+    p = where - f + r;
+    traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
+    if (location_isok(trace_endpos, 1 ,0))
+    {
+       ++i;
+       e |= pathlib_node_edgeflag_backright;
+    }
+
+    //Back-left
+    p = where - f - r;
+    traceline(p + tile_check_up, p - tile_check_down, MOVE_WORLDONLY, self);
+    if (location_isok(trace_endpos, 1, 0))
+    {
+       ++i;
+       e |= pathlib_node_edgeflag_backleft;
+    }
+
+
+    if(i == 0)
+        e = pathlib_node_edgeflag_none;
+
+    return e;
+}
+
 float tile_check_star(vector where)
 {
     if(tile_check_plus(where))
index 3c3ba5bb515bd92baa3bc21f66a3a45971bf9e3e..d1d0d1d3af9677dc9f6470d359a82707ee8f7b9c 100644 (file)
@@ -20,6 +20,11 @@ constants.qh
 
 defs.qh                // Should rename this, it has fields and globals
 
+mutators/base.qh
+mutators/mutators.qh
+mutators/gamemode_keyhunt.qh // TODO fix this
+mutators/mutator_dodging.qh
+
 //// tZork Turrets ////
 tturrets/include/turrets_early.qh
 
@@ -44,8 +49,6 @@ ipban.qh
 
 race.qh
 
-keyhunt.qh
-
 antilag.qh
 
 vote.qh
@@ -127,8 +130,6 @@ campaign.qc
 ../common/gamecommand.qc
 gamecommand.qc
 
-keyhunt.qc
-
 assault.qc
 
 ipban.qc
@@ -155,6 +156,7 @@ portals.qc
 
 target_spawn.qc
 func_breakable.qc
+target_music.qc
 
 ../common/items.qc
 
@@ -170,6 +172,11 @@ playerdemo.qc
 anticheat.qc
 cheats.qc
 
+mutators/base.qc
+mutators/gamemode_keyhunt.qc
+mutators/mutator_nix.qc
+mutators/mutator_dodging.qc
+
 ../warpzonelib/anglestransform.qc
 ../warpzonelib/mathlib.qc
 ../warpzonelib/common.qc
index 97b78ca7978a22e058ef4598f57c9c8b7b682340..59480ab656db12c789baf9852b8a52ad5e41f4d8 100644 (file)
@@ -324,7 +324,8 @@ float PlayerScore_Add(entity player, float scorefield, float score)
        {
                if(gameover)
                        return 0;
-               error("Adding score to unknown player!");
+               backtrace("Adding score to unknown player!");
+               return 0;
        }
        if(score)
                if(scores_label[scorefield] != "")
index 7713125235be848a8e5d46a8e276212a6d5ecd7d..45320f2db526f0303cb0f3e9d8aed3181e78c9e7 100644 (file)
@@ -190,14 +190,18 @@ void StartFrame (void)
        sv_airstopaccelerate = cvar("sv_airstopaccelerate");
        sv_airstrafeaccelerate = cvar("sv_airstrafeaccelerate");
        sv_maxairstrafespeed = cvar("sv_maxairstrafespeed");
+       sv_airstrafeaccel_qw = cvar("sv_airstrafeaccel_qw");
        sv_aircontrol = cvar("sv_aircontrol");
+       sv_aircontrol_power = cvar("sv_aircontrol_power");
        sv_warsowbunny_airforwardaccel = cvar("sv_warsowbunny_airforwardaccel");
        sv_warsowbunny_accel = cvar("sv_warsowbunny_accel");
        sv_warsowbunny_topspeed = cvar("sv_warsowbunny_topspeed");
        sv_warsowbunny_turnaccel = cvar("sv_warsowbunny_turnaccel");
        sv_warsowbunny_backtosideratio = cvar("sv_warsowbunny_backtosideratio");
+       sv_airspeedlimit_nonqw = cvar("sv_airspeedlimit_nonqw");
        teamplay = cvar ("teamplay");
        sys_frametime = cvar("sys_ticrate") * cvar("slowmo");
+       sv_doublejump = cvar("sv_doublejump");
 
        if (timeoutStatus == 1) // just before the timeout (when timeoutStatus will be 2)
                orig_slowmo = cvar("slowmo"); // slowmo will be restored after the timeout
@@ -395,4 +399,10 @@ void SV_OnEntityPreSpawnFunction()
                self.angles_z = self.angles_z + (random() * 2 - 1) * self.anglesjitter_z;
        if(self.anglejitter != 0)
                self.angles_y = self.angles_y + (random() * 2 - 1) * self.anglejitter;
+
+       if(MUTATOR_CALLHOOK(OnEntityPreSpawn))
+       {
+               remove(self);
+               return;
+       }
 }
index 04328de873f246593fe148514231adab3fe6821c..cb8f0b1025bd204260b6ea396918afad7e890268 100644 (file)
@@ -40,6 +40,7 @@ string Item_CounterFieldName(float it)
 }
 
 .float max_armorvalue;
+.float pickup_anyway;
 
 float Item_Customize()
 {
@@ -48,8 +49,7 @@ float Item_Customize()
        if(self.weapons != (self.weapons & other.weapons))
        {
                self.colormod = '0 0 0';
-               if(cvar("gameversion") >= 20600) // only do this for 2.6 and above FIXME remove this check when making 2.6
-                       self.glowmod = self.colormod;
+               self.glowmod = self.colormod;
                self.alpha = 0.5 + 0.5 * g_ghost_items; // halfway more alpha
                return TRUE;
        }
@@ -58,8 +58,7 @@ float Item_Customize()
                if(g_ghost_items)
                {
                        self.colormod = stov(cvar_string("g_ghost_items_color"));
-                       if(cvar("gameversion") >= 20600) // only do this for 2.6 and above FIXME remove this check when making 2.6
-                               self.glowmod = self.colormod;
+                       self.glowmod = self.colormod;
                        self.alpha = g_ghost_items;
                        return TRUE;
                }
@@ -77,8 +76,7 @@ void Item_Show (entity e, float mode)
                e.model = e.mdl;
                e.solid = SOLID_TRIGGER;
                e.colormod = '0 0 0';
-               if(cvar("gameversion") >= 20600) // only do this for 2.6 and above FIXME remove this check when making 2.6
-                       self.glowmod = self.colormod;
+               self.glowmod = self.colormod;
                e.alpha = 0;
                e.customizeentityforclient = func_null;
 
@@ -90,8 +88,7 @@ void Item_Show (entity e, float mode)
                e.model = string_null;
                e.solid = SOLID_NOT;
                e.colormod = '0 0 0';
-               if(cvar("gameversion") >= 20600) // only do this for 2.6 and above FIXME remove this check when making 2.6
-                       self.glowmod = self.colormod;
+               self.glowmod = self.colormod;
                e.alpha = 0;
                e.customizeentityforclient = func_null;
 
@@ -103,8 +100,7 @@ void Item_Show (entity e, float mode)
                e.model = e.mdl;
                e.solid = SOLID_TRIGGER; // can STILL be picked up!
                e.colormod = '0 0 0';
-               if(cvar("gameversion") >= 20600) // only do this for 2.6 and above FIXME remove this check when making 2.6
-                       self.glowmod = self.colormod;
+               self.glowmod = self.colormod;
                e.effects |= EF_STARDUST;
                e.customizeentityforclient = Item_Customize;
 
@@ -116,8 +112,7 @@ void Item_Show (entity e, float mode)
                e.model = e.mdl;
                e.solid = SOLID_NOT;
                e.colormod = stov(cvar_string("g_ghost_items_color"));
-               if(cvar("gameversion") >= 20600) // only do this for 2.6 and above FIXME remove this check when making 2.6
-                       self.glowmod = self.colormod;
+               self.glowmod = self.colormod;
                e.alpha = g_ghost_items;
                e.customizeentityforclient = func_null;
 
@@ -129,8 +124,7 @@ void Item_Show (entity e, float mode)
                e.model = string_null;
                e.solid = SOLID_NOT;
                e.colormod = stov(cvar_string("g_ghost_items_color"));
-               if(cvar("gameversion") >= 20600) // only do this for 2.6 and above FIXME remove this check when making 2.6
-                       self.glowmod = self.colormod;
+               self.glowmod = self.colormod;
                e.alpha = 0;
                e.customizeentityforclient = func_null;
 
@@ -332,7 +326,7 @@ float Item_GiveTo(entity item, entity player)
                        }
 
                        if (item.ammo_fuel)
-                       if (player.ammo_fuel < g_pickup_fuel_max)
+                       if (player.ammo_fuel < g_pickup_fuel_max) 
                        {
                                pickedup = TRUE;
                                player.ammo_fuel = min(player.ammo_fuel + item.ammo_fuel, g_pickup_fuel_max);
@@ -371,31 +365,31 @@ float Item_GiveTo(entity item, entity player)
                if(item.spawnshieldtime)
                {
                        if (item.ammo_shells)
-                       if (player.ammo_shells < g_pickup_shells_max)
+                       if ((player.ammo_shells < g_pickup_shells_max) || item.pickup_anyway)
                        {
                                pickedup = TRUE;
                                player.ammo_shells = min (player.ammo_shells + item.ammo_shells, g_pickup_shells_max);
                        }
                        if (item.ammo_nails)
-                       if (player.ammo_nails < g_pickup_nails_max)
+                       if ((player.ammo_nails < g_pickup_nails_max) || item.pickup_anyway)
                        {
                                pickedup = TRUE;
                                player.ammo_nails = min (player.ammo_nails + item.ammo_nails, g_pickup_nails_max);
                        }
                        if (item.ammo_rockets)
-                       if (player.ammo_rockets < g_pickup_rockets_max)
+                       if ((player.ammo_rockets < g_pickup_rockets_max) || item.pickup_anyway)
                        {
                                pickedup = TRUE;
                                player.ammo_rockets = min (player.ammo_rockets + item.ammo_rockets, g_pickup_rockets_max);
                        }
                        if (item.ammo_cells)
-                       if (player.ammo_cells < g_pickup_cells_max)
+                       if ((player.ammo_cells < g_pickup_cells_max) || item.pickup_anyway)
                        {
                                pickedup = TRUE;
                                player.ammo_cells = min (player.ammo_cells + item.ammo_cells, g_pickup_cells_max);
                        }
                        if (item.ammo_fuel)
-                       if (player.ammo_fuel < g_pickup_fuel_max)
+                       if ((player.ammo_fuel < g_pickup_fuel_max) || item.pickup_anyway)
                        {
                                pickedup = TRUE;
                                player.ammo_fuel = min(player.ammo_fuel + item.ammo_fuel, g_pickup_fuel_max);
@@ -404,7 +398,7 @@ float Item_GiveTo(entity item, entity player)
                }
 
                if (item.flags & FL_WEAPON)
-               if ((it = item.weapons - (item.weapons & player.weapons)))
+               if ((it = item.weapons - (item.weapons & player.weapons)) || g_pickup_weapons_anyway)
                {
                        pickedup = TRUE;
                        for(i = WEP_FIRST; i <= WEP_LAST; ++i)
@@ -436,14 +430,14 @@ float Item_GiveTo(entity item, entity player)
                        }
 
                        if (item.health)
-                       if (player.health < item.max_health)
+                       if ((player.health < item.max_health) || item.pickup_anyway)
                        {
                                pickedup = TRUE;
                                player.health = min(player.health + item.health, item.max_health);
                                player.pauserothealth_finished = max(player.pauserothealth_finished, time + cvar("g_balance_pause_health_rot"));
                        }
                        if (item.armorvalue)
-                       if (player.armorvalue < item.max_armorvalue)
+                       if ((player.armorvalue < item.max_armorvalue) || item.pickup_anyway)
                        {
                                pickedup = TRUE;
                                player.armorvalue = min(player.armorvalue + item.armorvalue, item.max_armorvalue);
@@ -689,6 +683,9 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
 {
        startitem_failed = FALSE;
 
+       self.items = itemid;
+       self.weapons = weaponid;
+
        // is it a dropped weapon?
        if (self.classname == "droppedweapon")
        {
@@ -709,6 +706,16 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
        }
        else
        {
+               if(MUTATOR_CALLHOOK(FilterItem)) // error means we do not want the item
+               {
+                       startitem_failed = TRUE;
+                       remove(self);
+                       return;
+               }
+
+               itemid = self.items;
+               weaponid = self.weapons;
+
                self.reset = Item_Reset;
                // it's a level item
                if(self.spawnflags & 1)
@@ -815,35 +822,6 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
                                return;
                        }
                }
-               else if (g_nixnex)
-               {
-                       local float rm;
-
-                       rm = 1;
-                       switch (itemid)
-                       {
-                               case IT_HEALTH:
-                               case IT_5HP:
-                               case IT_25HP:
-                               case IT_ARMOR:
-                               case IT_ARMOR_SHARD:
-                                       if (cvar("g_nixnex_with_healtharmor"))
-                                               rm = 0;
-                                       break;
-                               case IT_STRENGTH:
-                               case IT_INVINCIBLE:
-                                       if (cvar("g_nixnex_with_powerups"))
-                                               rm = 0;
-                                       break;
-                       }
-
-                       if(rm)
-                       {
-                               startitem_failed = TRUE;
-                               remove (self);
-                               return;
-                       }
-               }
                else if (!cvar("g_pickup_items") && itemid != IT_STRENGTH && itemid != IT_INVINCIBLE && itemid != IT_HEALTH)
                {
                        startitem_failed = TRUE;
@@ -877,8 +855,6 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime,
                self.respawntimejitter = defaultrespawntimejitter;
        }
        self.netname = itemname;
-       self.items = itemid;
-       self.weapons = weaponid;
        self.flags = FL_ITEM | itemflags;
        self.touch = Item_Touch;
        setmodel (self, self.mdl); // precision set below
@@ -1173,6 +1149,8 @@ void spawnfunc_weapon_rocketlauncher (void)
 void spawnfunc_item_rockets (void) {
        if(!self.ammo_rockets)
                self.ammo_rockets = g_pickup_rockets;
+       if(!self.pickup_anyway)
+               self.pickup_anyway = g_pickup_ammo_anyway;
        StartItem ("models/items/a_rockets.md3", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "rockets", IT_ROCKETS, 0, 0, commodity_pickupevalfunc, 3000);
 }
 
@@ -1190,12 +1168,16 @@ void spawnfunc_item_bullets (void) {
 
        if(!self.ammo_nails)
                self.ammo_nails = g_pickup_nails;
+       if(!self.pickup_anyway)
+               self.pickup_anyway = g_pickup_ammo_anyway;
        StartItem ("models/items/a_bullets.mdl", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "bullets", IT_NAILS, 0, 0, commodity_pickupevalfunc, 2000);
 }
 
 void spawnfunc_item_cells (void) {
        if(!self.ammo_cells)
                self.ammo_cells = g_pickup_cells;
+       if(!self.pickup_anyway)
+               self.pickup_anyway = g_pickup_ammo_anyway;
        StartItem ("models/items/a_cells.md3", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "cells", IT_CELLS, 0, 0, commodity_pickupevalfunc, 2000);
 }
 
@@ -1212,6 +1194,8 @@ void spawnfunc_item_shells (void) {
 
        if(!self.ammo_shells)
                self.ammo_shells = g_pickup_shells;
+       if(!self.pickup_anyway)
+               self.pickup_anyway = g_pickup_ammo_anyway;
        StartItem ("models/items/a_shells.md3", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "shells", IT_SHELLS, 0, 0, commodity_pickupevalfunc, 500);
 }
 
@@ -1220,6 +1204,8 @@ void spawnfunc_item_armor_small (void) {
                self.armorvalue = g_pickup_armorsmall;
        if(!self.max_armorvalue)
                self.max_armorvalue = g_pickup_armorsmall_max;
+       if(!self.pickup_anyway)
+               self.pickup_anyway = g_pickup_armorsmall_anyway;
        StartItem ("models/items/g_a1.md3", "misc/armor1.wav", g_pickup_respawntime_short, g_pickup_respawntimejitter_short, "5 Armor", IT_ARMOR_SHARD, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_LOW);
 }
 
@@ -1228,6 +1214,8 @@ void spawnfunc_item_armor_medium (void) {
                self.armorvalue = g_pickup_armormedium;
        if(!self.max_armorvalue)
                self.max_armorvalue = g_pickup_armormedium_max;
+       if(!self.pickup_anyway)
+               self.pickup_anyway = g_pickup_armormedium_anyway;
        StartItem ("models/items/g_armormedium.md3", "misc/armor10.wav", g_pickup_respawntime_medium, g_pickup_respawntimejitter_medium, "25 Armor", IT_ARMOR, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_MID);
 }
 
@@ -1236,6 +1224,8 @@ void spawnfunc_item_armor_big (void) {
                self.armorvalue = g_pickup_armorbig;
        if(!self.max_armorvalue)
                self.max_armorvalue = g_pickup_armorbig_max;
+       if(!self.pickup_anyway)
+               self.pickup_anyway = g_pickup_armorbig_anyway;
        StartItem ("models/items/g_a50.md3", "misc/armor17_5.wav", g_pickup_respawntime_long, g_pickup_respawntimejitter_long, "50 Armor", IT_ARMOR, 0, 0, commodity_pickupevalfunc, 20000);
 }
 
@@ -1244,6 +1234,8 @@ void spawnfunc_item_armor_large (void) {
                self.armorvalue = g_pickup_armorlarge;
        if(!self.max_armorvalue)
                self.max_armorvalue = g_pickup_armorlarge_max;
+       if(!self.pickup_anyway)
+               self.pickup_anyway = g_pickup_armorlarge_anyway;
        StartItem ("models/items/g_a25.md3", "misc/armor25.wav", g_pickup_respawntime_long, g_pickup_respawntimejitter_long, "100 Armor", IT_ARMOR, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_HIGH);
 }
 
@@ -1252,6 +1244,8 @@ void spawnfunc_item_health_small (void) {
                self.max_health = g_pickup_healthsmall_max;
        if(!self.health)
                self.health = g_pickup_healthsmall;
+       if(!self.pickup_anyway)
+               self.pickup_anyway = g_pickup_healthsmall_anyway;
        StartItem ("models/items/g_h1.md3", "misc/minihealth.wav", g_pickup_respawntime_short, g_pickup_respawntimejitter_short, "5 Health", IT_5HP, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_LOW);
 }
 
@@ -1260,6 +1254,8 @@ void spawnfunc_item_health_medium (void) {
                self.max_health = g_pickup_healthmedium_max;
        if(!self.health)
                self.health = g_pickup_healthmedium;
+       if(!self.pickup_anyway)
+               self.pickup_anyway = g_pickup_healthmedium_anyway;
        StartItem ("models/items/g_h25.md3", "misc/mediumhealth.wav", g_pickup_respawntime_short, g_pickup_respawntimejitter_short, "25 Health", IT_25HP, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_MID);
 }
 
@@ -1268,6 +1264,8 @@ void spawnfunc_item_health_large (void) {
                self.max_health = g_pickup_healthlarge_max;
        if(!self.health)
                self.health = g_pickup_healthlarge;
+       if(!self.pickup_anyway)
+               self.pickup_anyway = g_pickup_healthlarge_anyway;
        StartItem ("models/items/g_h50.md3", "misc/mediumhealth.wav", g_pickup_respawntime_medium, g_pickup_respawntimejitter_medium, "50 Health", IT_25HP, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_MID);
 }
 
@@ -1285,6 +1283,8 @@ void spawnfunc_item_health_mega (void) {
                        self.max_health = g_pickup_healthmega_max;
                if(!self.health)
                        self.health = g_pickup_healthmega;
+               if(!self.pickup_anyway)
+                       self.pickup_anyway = g_pickup_healthmega_anyway;
                StartItem ("models/items/g_h100.md3", "misc/megahealth.wav", g_pickup_respawntime_long, g_pickup_respawntimejitter_long, "100 Health", IT_HEALTH, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_HIGH);
        }
 }
@@ -1370,13 +1370,6 @@ void spawnfunc_target_items (void)
        float n, i, j;
        entity e;
 
-       if(g_nixnex)
-       {
-               // items triggers cannot work in nixnex (as they change weapons/ammo)
-               remove(self);
-               return;
-       }
-
        self.use = target_items_use;
        if(!self.strength_finished)
                self.strength_finished = cvar("g_balance_powerup_strength_time");
@@ -1492,6 +1485,8 @@ void spawnfunc_item_fuel(void)
 {
        if(!self.ammo_fuel)
                self.ammo_fuel = g_pickup_fuel;
+       if(!self.pickup_anyway)
+               self.pickup_anyway = g_pickup_ammo_anyway;
        StartItem ("models/items/g_fuel.md3", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "Fuel", IT_FUEL, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_LOW);
 }
 
@@ -1519,12 +1514,6 @@ void spawnfunc_item_jetpack(void)
        StartItem ("models/items/g_jetpack.md3", "misc/itempickup.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, "Jet pack", IT_JETPACK, 0, FL_POWERUP, commodity_pickupevalfunc, BOT_PICKUP_RATING_LOW);
 }
 
-// we no longer have the seeker
-void spawnfunc_weapon_seeker()
-{
-       spawnfunc_weapon_fireball();
-}
-
 
 #define OP_SET 0
 #define OP_MIN 1
@@ -1678,8 +1667,8 @@ float GiveItems(entity e, float beginarg, float endarg)
                                continue;
                        case "ALL":
                                got += GiveBit(e, items, IT_FUEL_REGEN, op, val);
-                               got += GiveValue(e, strength_finished, op, time + val);
-                               got += GiveValue(e, invincible_finished, op, time + val);
+                               got += GiveValue(e, strength_finished, op, time);
+                               got += GiveValue(e, invincible_finished, op, time);
                                got += GiveBit(e, items, IT_UNLIMITED_AMMO, op, val);
                        case "all":
                                got += GiveBit(e, items, IT_JETPACK, op, val);
index 4faba6d71c4aa288b55527721711721a019377e7..9bb8f7c92034d88e0de65ba2f88e0039ed4f53f5 100644 (file)
@@ -152,7 +152,6 @@ void trigger_push_touch()
        other.flags &~= FL_ONGROUND;
 
        other.velocity = self.movedir;
-       other.jumppadusetime = time;
 
        if (other.classname == "player")
        {
diff --git a/qcsrc/server/target_music.qc b/qcsrc/server/target_music.qc
new file mode 100644 (file)
index 0000000..daab646
--- /dev/null
@@ -0,0 +1,129 @@
+.float lifetime;
+// values:
+//   volume
+//   noise
+//   targetname
+//   lifetime
+//   fade_time
+//   fade_rate
+// when triggered, the music is overridden for activator until lifetime (or forever, if lifetime is 0)
+// when targetname is not set, THIS ONE is default
+void target_music_sendto(float to, float is)
+{
+       WriteByte(to, SVC_TEMPENTITY);
+       WriteByte(to, TE_CSQC_TARGET_MUSIC);
+       WriteShort(to, num_for_edict(self));
+       WriteByte(to, self.volume * 255.0 * is);
+       WriteByte(to, self.fade_time * 16.0);
+       WriteByte(to, self.fade_rate * 16.0);
+       WriteByte(to, self.lifetime);
+       WriteString(to, self.noise);
+}
+void target_music_reset()
+{
+       if(self.targetname == "")
+               target_music_sendto(MSG_ALL, 1);
+}
+void target_music_use()
+{
+       if(!activator)
+               return;
+       msg_entity = activator;
+       target_music_sendto(MSG_ONE, 1);
+}
+void spawnfunc_target_music()
+{
+       self.use = target_music_use;
+       self.reset = target_music_reset;
+       if(!self.volume)
+               self.volume = 1;
+       if(self.targetname == "")
+               target_music_sendto(MSG_INIT, 1);
+       else
+               target_music_sendto(MSG_INIT, 0);
+}
+void TargetMusic_RestoreGame()
+{
+       for(self = world; (self = find(self, classname, "target_music")); )
+       {
+               if(self.targetname == "")
+                       target_music_sendto(MSG_INIT, 1);
+               else
+                       target_music_sendto(MSG_INIT, 0);
+       }
+}
+// values:
+//   volume
+//   noise
+//   targetname
+//   fade_time
+// spawnflags:
+//   1 = START_OFF
+// when triggered, it is disabled/enabled for everyone
+float trigger_music_SendEntity(entity to, float sf)
+{
+       WriteByte(MSG_ENTITY, ENT_CLIENT_TRIGGER_MUSIC);
+       sf &~= 0x80;
+       if(self.cnt)
+               sf |= 0x80;
+       WriteByte(MSG_ENTITY, sf);
+       if(sf & 4)
+       {
+               WriteCoord(MSG_ENTITY, self.origin_x);
+               WriteCoord(MSG_ENTITY, self.origin_y);
+               WriteCoord(MSG_ENTITY, self.origin_z);
+       }
+       if(sf & 1)
+       {
+               if(self.model != "null")
+               {
+                       WriteShort(MSG_ENTITY, self.modelindex);
+                       WriteCoord(MSG_ENTITY, self.mins_x);
+                       WriteCoord(MSG_ENTITY, self.mins_y);
+                       WriteCoord(MSG_ENTITY, self.mins_z);
+                       WriteCoord(MSG_ENTITY, self.maxs_x);
+                       WriteCoord(MSG_ENTITY, self.maxs_y);
+                       WriteCoord(MSG_ENTITY, self.maxs_z);
+               }
+               else
+               {
+                       WriteShort(MSG_ENTITY, 0);
+                       WriteCoord(MSG_ENTITY, self.maxs_x);
+                       WriteCoord(MSG_ENTITY, self.maxs_y);
+                       WriteCoord(MSG_ENTITY, self.maxs_z);
+               }
+               WriteByte(MSG_ENTITY, self.volume * 255.0);
+               WriteByte(MSG_ENTITY, self.fade_time * 16.0);
+               WriteByte(MSG_ENTITY, self.fade_rate * 16.0);
+               WriteString(MSG_ENTITY, self.noise);
+       }
+       return 1;
+}
+void trigger_music_reset()
+{
+       self.cnt = !(self.spawnflags & 1);
+       self.SendFlags |= 0x80;
+}
+void trigger_music_use()
+{
+       self.cnt = !self.cnt;
+       self.SendFlags |= 0x80;
+}
+void spawnfunc_trigger_music()
+{
+       if(self.model != "")
+               setmodel(self, self.model);
+       if(!self.volume)
+               self.volume = 1;
+       if(!self.modelindex)
+       {
+               setorigin(self, self.origin + self.mins);
+               setsize(self, '0 0 0', self.maxs - self.mins);
+       }
+       trigger_music_reset();
+
+       self.use = trigger_music_use;
+       self.reset = trigger_music_reset;
+
+       Net_LinkEntity(self, FALSE, 0, trigger_music_SendEntity);
+}
index 5e1c78262432f051d6572e2bdb39af804aa0c0a6..1253fe1c07abb9132279becd9becbeff6b00bbfa 100644 (file)
@@ -269,6 +269,12 @@ void target_spawn_use()
                target_spawn_useon(e);
                e.target_spawn_id = self.target_spawn_id;
        }
+       else if(self.target == "*activator")
+       {
+               // edit entity
+               if(activator)
+                       target_spawn_useon(activator);
+       }
        else
        {
                // edit entity
index 1c07a602f61fa78efdd49df1b07d34838fda6a51..0798b29b29b2769194190d7200d39ce3a6bd32ff 100644 (file)
@@ -208,6 +208,9 @@ void InitGameplayMode()
        fraglimit_override = cvar("fraglimit_override");
        leadlimit_override = cvar("leadlimit_override");
 
+       if(cvar("g_dodging"))
+               MUTATOR_ADD(dodging);
+       
        if(g_dm)
        {
                game = GAME_DEATHMATCH;
@@ -312,7 +315,7 @@ void InitGameplayMode()
                ActivateTeamplay();
                fraglimit_override = cvar("g_keyhunt_point_limit");
                leadlimit_override = cvar("g_keyhunt_point_leadlimit");
-               kh_init();
+               MUTATOR_ADD(gamemode_keyhunt);
        }
 
        if(g_assault)
@@ -489,11 +492,12 @@ void PrintWelcomeMessage(entity pl)
        }
 
 :normal
-       modifications = "";
+       ret_string = "";
+       MUTATOR_CALLHOOK(BuildMutatorsPrettyString);
+       modifications = ret_string;
+       
        if(g_minstagib)
                modifications = strcat(modifications, ", MinstaGib");
-       if(g_nixnex)
-               modifications = strcat(modifications, ", NixNex");
        if(g_weaponarena)
        {
                if(g_weaponarena_random)
@@ -621,7 +625,11 @@ void CheckAllowedTeams (entity for_whom)
        c1 = c2 = c3 = c4 = -1;
        cb1 = cb2 = cb3 = cb4 = 0;
 
-       if(g_onslaught)
+       if(cvar("g_campaign") && for_whom && clienttype(for_whom) == CLIENTTYPE_REAL)
+       {
+               c1 = 0; // only allow RED team for player joining
+       }
+       else if(g_onslaught)
        {
                // onslaught is special
                head = findchain(classname, "onslaught_generator");
@@ -647,13 +655,15 @@ void CheckAllowedTeams (entity for_whom)
        else
        {
                // cover anything else by treating it like tdm with no teams spawned
-               if(g_keyhunt)
-                       dm = kh_teams;
-               else if(g_race)
+               if(g_race)
                        dm = race_teams;
                else
                        dm = 2;
 
+               ret_float = dm;
+               MUTATOR_CALLHOOK(GetTeamCount);
+               dm = ret_float;
+
                if(dm >= 4)
                        c1 = c2 = c3 = c4 = 0;
                else if(dm >= 3)
@@ -794,7 +804,9 @@ float FindSmallestTeam(entity pl, float ignore_pl)
 
        if(totalteams <= 1)
        {
-               if(g_domination)
+               if(cvar("g_campaign") && pl && clienttype(pl) == CLIENTTYPE_REAL)
+                       return 1; // special case for campaign and player joining
+               else if(g_domination)
                        error("Too few teams available for domination\n");
                else if(g_ctf)
                        error("Too few teams available for ctf\n");
@@ -841,9 +853,9 @@ float FindSmallestTeam(entity pl, float ignore_pl)
        {
                // 1: use team count, if equal prefer own team
                if(c1 >= 0) RandomSelection_Add(world, 1, string_null, 1, (maxc - c1) + (self.team == COLOR_TEAM1) / 512.0);
-               if(c2 >= 0) RandomSelection_Add(world, 1, string_null, 1, (maxc - c1) + (self.team == COLOR_TEAM2) / 512.0);
-               if(c3 >= 0) RandomSelection_Add(world, 1, string_null, 1, (maxc - c1) + (self.team == COLOR_TEAM3) / 512.0);
-               if(c4 >= 0) RandomSelection_Add(world, 1, string_null, 1, (maxc - c1) + (self.team == COLOR_TEAM4) / 512.0);
+               if(c2 >= 0) RandomSelection_Add(world, 2, string_null, 1, (maxc - c1) + (self.team == COLOR_TEAM2) / 512.0);
+               if(c3 >= 0) RandomSelection_Add(world, 3, string_null, 1, (maxc - c1) + (self.team == COLOR_TEAM3) / 512.0);
+               if(c4 >= 0) RandomSelection_Add(world, 4, string_null, 1, (maxc - c1) + (self.team == COLOR_TEAM4) / 512.0);
        }
        else if(balance_type == 3)
        {
index 25cba992c0e9e70217ca529d00400515b8d222bb..fa07f867fcded1d6c28b131ecb2d59c0ea088d12 100644 (file)
@@ -28,6 +28,7 @@ vector real_origin(entity ent);
 .string cvar_basename;
 
 //.float spawnflags
+#define TSF_SUSPENDED     1
 /// Spawn a pillar model under the turret to make it look ok on uneven ground surfaces
 #define TSF_TERRAINBASE   2
 /// Disable builtin ammo regeneration
index 6ee08493c95eee1e2669e6a8b648aa322eca1662..afddaef0d319bba83bbb419519bbdc8edc9f5329 100644 (file)
@@ -567,7 +567,8 @@ float turret_validate_target(entity e_turret,entity e_target,float validate_flag
     if (validate_flags & TFL_TARGETSELECT_LOS)
     {
         v_tmp = real_origin(e_target) + ((e_target.mins + e_target.maxs) * 0.5);
-        traceline(e_turret.tur_shotorg,v_tmp,0,e_turret);
+
+        traceline(e_turret.tur_shotorg, v_tmp, 0, e_turret);
 
         if (e_turret.aim_firetolerance_dist < vlen(v_tmp - trace_endpos))
             return -19;
@@ -926,8 +927,8 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
         v = gettaginfo(e,gettagindex(e,"tag_fire"));
         if(v == '0 0 0')
         {
-            objerror("^1ERROR: Engine is borken! Turrets will NOT work. force g_turrets to 0 to run maps with turrets anyway.");
-            crash();
+            //objerror("^1ERROR: Engine is borken! Turrets will NOT work. force g_turrets to 0 to run maps with turrets anyway.");
+            //crash();
         }
         setmodel(e,"");
 
@@ -942,6 +943,9 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
         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.
     if (self.spawnflags & TSF_TERRAINBASE)
index 3f7acdac95941704784826b51b367eb18b7c94df..3d84386a4932599be18198ffaa7b29bef633541b 100644 (file)
@@ -171,6 +171,13 @@ void ewheel_postthink()
     float vz;
     vector wish_angle,real_angle;
 
+    /*
+    if(self.enemy)
+        dprint("enemy!\n");
+    else
+        dprint("nothign =(!\n");
+    */
+
     vz = self.velocity_z;
 
     self.angles_x = anglemods(self.angles_x);
@@ -190,7 +197,8 @@ void ewheel_postthink()
     self.angles_y = (self.angles_y + real_angle_y);
 
     // Simulate banking
-    self.angles_z = bound(-45,real_angle_y * -2.5,45);
+    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();
@@ -207,7 +215,10 @@ void ewheel_respawnhook()
 {
     entity e;
 
-    setorigin(self,self.pos1);
+    self.velocity = '0 0 0';
+    self.enemy = world;
+
+    setorigin(self, self.pos1);
 
     if (self.target != "")
     {
@@ -230,23 +241,14 @@ void ewheel_respawnhook()
 
 void ewheel_diehook()
 {
-    turret_trowgib2(self.origin,self.velocity + '0 0 400', '-0.6 -0.2 -02', self, 3 + time + random() * 2);
-
     self.velocity = '0 0 0';
 
+    turret_trowgib2(self.origin, self.velocity + '0 0 400', '-0.6 -0.2 -02', self, 3 + time + random() * 2);
+
     if (self.pathcurrent)
         pathlib_deletepath(self.pathcurrent.owner);
 
     self.pathcurrent = world;
-
-    /*
-    if (self.damage_flags & TFL_DMG_DEATH_NORESPAWN)
-    {
-        verbstack_flush(self.verbs_move);
-        remove(self.verbs_move);
-    }
-    */
-
 }
 
 void turret_ewheel_dinit()
@@ -291,12 +293,11 @@ void turret_ewheel_dinit()
     self.solid      = SOLID_SLIDEBOX;
     self.takedamage = DAMAGE_AIM;
 
-    setsize(self,'-32 -32 0', '32 32 48');
+    setsize(self, '-32 -32 0', '32 32 48');
+    self.idle_aim = '0 0 0';
 
     self.pos1 = self.origin;
 
-    self.idle_aim = '0 0 0';
-
     // Our fire routine
     self.turret_firefunc  = ewheel_attack;
     self.turret_postthink = ewheel_postthink;
@@ -306,6 +307,10 @@ void turret_ewheel_dinit()
     self.tur_head.aim_speed = cvar("g_turrets_unit_ewheel_turnrate");
     self.tur_head.aim_speed = self.tur_head.aim_speed / (1 / self.ticrate);
 
+    if (!turret_tag_setup())
+        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
+
+    //setorigin(self,self.origin + '0 0 128');
     if (self.target != "")
     {
         e = find(world,targetname,self.target);
@@ -319,7 +324,7 @@ void turret_ewheel_dinit()
             dprint("Warning: not a turrret path\n");
         else
         {
-            self.pathcurrent = WALKER_PATH(self.origin,e.origin);
+            self.pathcurrent = WALKER_PATH(self.origin, e.origin);
             self.pathgoal = e;
         }
     }
@@ -332,6 +337,10 @@ 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;
index 14dd1639719d3ed7a074ddfa45a7e1f2b1d973e3..e1341b4605e48bc7cb0491a2024484d2bc2fb436 100644 (file)
@@ -718,6 +718,9 @@ void turret_walker_dinit()
         return;
     }
 
+    if (!turret_tag_setup())
+        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;
index 3e36dc807ba0ec298b4be81c48b2d9d94fe97e15..b929c425f38e8080b0c7b7b30520f3f32bdabdf0 100644 (file)
@@ -22,6 +22,8 @@ float racer_turnroll;
 float racer_speed_forward;
 float racer_speed_strafe;
 
+float racer_afterburn_cost;
+
 float  jetfromtag_power;
 float  jetfromtag_normpower;
 vector jetfromtag_origin;
@@ -41,6 +43,8 @@ void racer_loadsettings()
     racer_speed_forward     = cvar("g_vehicle_racer_speed_forward");
     racer_speed_strafe      = cvar("g_vehicle_racer_speed_strafe");
 
+    racer_afterburn_cost    = cvar("g_vehicle_racer_afterburn_cost");
+
     racer_healthmax = cvar("g_vehicle_racer_health");
     racer_shieldmax = cvar("g_vehicle_racer_shield");
     racer_energymax = cvar("g_vehicle_racer_energy");
@@ -203,7 +207,6 @@ void racer_fire_cannon(string tagname)
        // FIXME this uses prydon cursor
     v = normalize(self.owner.cursor_trace_endpos - bolt.origin);
     v_forward_z = v_z * 0.5;
-    //v_forward_z *= 0.5;
 
     bolt.velocity = v_forward * cvar("g_vehicle_racer_laser_speed");
 
@@ -355,7 +358,6 @@ float racer_pplug()
     float ftmp, ftmp2;
     vector df;
 
-
     if(cvar("g_vehicle_racer_reload"))
     {
         racer_loadsettings();
@@ -395,13 +397,13 @@ float racer_pplug()
     ftmp = racer_turnspeed * sys_frametime;
     ftmp2 = ftmp * -1;
 
-    ftmp = bound(ftmp2,shortangle_f(player.v_angle_y - racer.angles_y,racer.angles_y),ftmp);
+    ftmp = bound(ftmp2, shortangle_f(player.v_angle_y - racer.angles_y, racer.angles_y), ftmp);
     ftmp2 = safeangle(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 = bound(-45, shortangle_f(player.v_angle_z + ((racer.angles_y - ftmp2) * racer_turnroll), racer.angles_z), 45);
     ftmp = safeangle(racer.angles_z + ftmp);
-    racer.angles_z = bound(-85,ftmp,85);
+    racer.angles_z = bound(-85, ftmp, 85);
 
     // Turn
     racer.angles_y = ftmp2;
@@ -414,7 +416,7 @@ float racer_pplug()
     racer.angles_x = safeangle(racer.angles_x + ftmp);
     racer.angles_x *= -1;
 
-    df = racer.velocity * -1;
+    df = racer.velocity * -0.5;
 
     if(player.movement_x != 0)
     {
@@ -438,12 +440,11 @@ float racer_pplug()
 
 
     // Afterburn
-    //if (jetfromtag_groundcontact)
     if (player.BUTTON_JUMP)
-    if(racer.vehicle_energy >= (cvar("g_vehicle_racer_speed_afterburn_cost") * frametime))
+    if(racer.vehicle_energy >= (racer_afterburn_cost * frametime))
     {
         racer.wait = time + cvar("g_vehicle_racer_energy_usepause");
-        racer.vehicle_energy -= cvar("g_vehicle_racer_speed_afterburn_cost") * frametime;
+        racer.vehicle_energy -= racer_afterburn_cost * frametime;
         df += (v_forward * cvar("g_vehicle_racer_speed_afterburn"));
     }
 
@@ -494,8 +495,6 @@ float racer_pplug()
     }
 
     player.vehicle_reload1 = (time - racer.lip) / (racer.delay-racer.lip);
-    //player.vehicle_energy = racer.vehicle_energy;
-
     vehicle_stdproc_shiledregen(racer_shieldmax, frametime);
     vehicle_stdproc_healthregen(racer_healthmax, frametime);
 
@@ -715,16 +714,6 @@ void racer_touch()
     racer_enter();
 }
 
-/*
-float racer_customizeentityforclient()
-{
-    if(self.deadflag == DEAD_DEAD)
-        return FALSE;
-
-    return TRUE;
-}
-*/
-
 void racer_spawn()
 {
     self.think = racer_spawnthink;
diff --git a/qcsrc/server/vehicles/raptor.qc b/qcsrc/server/vehicles/raptor.qc
new file mode 100644 (file)
index 0000000..d7f4de6
--- /dev/null
@@ -0,0 +1,892 @@
+#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;
+
+void raptor_spawn();
+void raptor_return();
+float raptor_pplug();
+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);
+}
+
+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_max");
+    raptor_shield_regen  = CCVAR("_shield_regen");
+
+    raptor_health_max    = CCVAR("_health_max");
+    raptor_health_regen  = CCVAR("_health_regen");
+
+    raptor_energy_max    = CCVAR("_energy_max");
+    raptor_energy_regen  = CCVAR("_energy_regen");
+}
+
+void raptor_bombs_return()
+{
+    self.owner.bomb1.alpha = 1;
+    self.owner.bomb2.alpha = 1;
+    remove(self);
+}
+
+void raptor_bomblet_boom()
+{
+    if(other.enemy == self.enemy)
+        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);
+}
+
+void raptor_bomb_burst()
+{
+    self.angles = vectoangles(self.velocity);
+
+    if(self.cnt < time)
+    {
+        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)
+        {
+            remove(self);
+            return;
+        }
+
+        self.cnt = time + raptor_bomblet_wavenext;
+    }
+
+    self.nextthink = time;
+}
+
+void raptor_bomb_touch()
+{
+    raptor_bomb_burst();
+}
+
+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.solid     = bomb_2.solid      = SOLID_BBOX;
+
+    bomb_1 = spawn();
+    bomb_1.owner = self;
+    bomb_1.think = raptor_bombs_return;
+    bomb_1.nextthink = time + raptor_bombs_refire;
+}
+
+void raptor_animator_think()
+{
+    self.owner.frame += 1;
+    if(self.owner.frame == self.cnt)
+        remove(self);
+    else
+        self.nextthink = time + self.wait;
+}
+
+void raptor_setanim(float start, float end, float length)
+{
+    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)
+
+{
+    vector hitloc, force, endpoint, dir;
+    entity ent;
+
+    dir = normalize(end - start);
+    force = dir * bforce;
+
+    // go a little bit into the wall because we need to hit this wall later
+    end = end + dir;
+
+    // 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()
+{
+    // Remove this when bots know how to use vehicles
+    if (clienttype(other) != CLIENTTYPE_REAL)
+        return;
+
+    if(teamplay)
+        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);
+
+    self.team                 = self.owner.team;
+    self.flags               -= FL_NOTARGET;
+
+    self.velocity = '0 0 1';
+
+    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 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
+
+    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.exteriormodeltoclient = self;
+
+    self.vehicle_hudmodel.viewmodelforclient = self;
+
+       if(eject)
+       {
+           makevectors(self.angles);
+           setorigin(self.owner,self.origin + v_forward * 100);
+           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);
+       }
+
+    self.owner = world;
+
+    if (self.deadflag != DEAD_NO)
+    {
+        entity ret;
+        ret = spawn();
+        ret.enemy = self;
+        ret.think = raptor_return;
+        ret.nextthink = time + cvar("g_vehicle_racer_respawntime");
+    }
+}
+
+
+float raptor_pplug()
+{
+    entity player, vhic;
+    float ftmp, ftmp2, energy_used;
+    vector df;
+
+
+    if(cvar("g_vehicle_raptor_reload"))
+    {
+        raptor_loadsettings();
+        cvar_set("g_vehicle_raptor_reload","0");
+    }
+
+    player = self;
+    vhic   = self.vehicle;
+    self    = vhic;
+
+    if(player.BUTTON_USE)
+    {
+        self = vhic;
+        raptor_exit(0);
+        self = player;
+        return 0;
+    }
+
+    if(vhic.deadflag != DEAD_NO)
+    {
+        self = player;
+        player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
+        return 1;
+    }
+
+    vhic.angles_x *= -1;
+    // Rotate Body
+    ftmp = raptor_turnspeed * sys_frametime;
+
+    ftmp = bound(-ftmp, shortangle_f(player.v_angle_y - vhic.angles_y, vhic.angles_y), ftmp);
+
+    // 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 = safeangle(vhic.angles_y + ftmp);
+
+    // Pitch Body
+    ftmp = raptor_pitchspeed  * sys_frametime;
+
+    ftmp = bound(-ftmp, shortangle_f(player.v_angle_x - vhic.angles_x,vhic.angles_x), ftmp);
+
+    vhic.angles_x = bound(-60,safeangle(vhic.angles_x + ftmp),60);
+    vhic.angles_x *= -1;
+
+    if(raptor_movestyle == 1)
+    {
+        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;
+    }
+    else
+        fixedmakevectors(vhic.angles);
+
+    df = vhic.velocity * -1;
+
+    if(player.movement_x != 0)
+    {
+        if(player.movement_x > 0)
+            df += v_forward  * raptor_speed_forward;
+        else if(player.movement_x < 0)
+            df -= v_forward  * raptor_speed_forward;
+    }
+
+    if(player.movement_y != 0)
+    {
+        if(player.movement_y < 0)
+            df -= v_right * raptor_speed_strafe;
+        else if(player.movement_y > 0)
+            df += v_right * raptor_speed_strafe;
+
+        vhic.angles_z = bound(-30,vhic.angles_z + (player.movement_y / raptor_speed_strafe),30);
+    }
+    else
+    {
+        vhic.angles_z *= 0.95;
+        if(vhic.angles_z >= -1 && vhic.angles_z <= -1)
+            vhic.angles_z = 0;
+    }
+
+    if(player.BUTTON_CROUCH)
+        df -=   v_up * 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');
+
+    // Aim the gunz
+    vector target_angle, move_angle, org1, org2, targ;
+
+    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"));
+
+    traceline(vhic.origin + player.view_ofs, targ, FALSE, vhic);
+    targ = trace_endpos;
+
+    // Find the direction
+    target_angle = vectoangles(normalize(targ - org1)); // And make a angle
+
+    // 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);
+
+    // Find the direction
+    target_angle = vectoangles(normalize(targ - org2)); // And make a angle
+
+    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);
+
+    if(player.BUTTON_ATCK)
+    if(vhic.vehicle_energy > (raptor_beam_aps * sys_frametime))
+    {
+        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;
+    }
+
+    if(vhic.cnt < time)
+        vhic.vehicle_energy = min(vhic.vehicle_energy += raptor_energy_regen * frametime, raptor_energy_max);
+
+    player.vehicle_energy = vhic.vehicle_energy / raptor_energy_max;
+
+
+    if(player.BUTTON_ATCK2)
+    if(time > vhic.delay)
+    {
+        raptor_bombdrop();
+        vhic.delay = time + raptor_bombs_refire;
+    }
+
+    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;
+
+    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;
+
+    return 1;
+}
+
+float raptor_land()
+{
+    return 0;
+}
+
+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);
+}
+
+void raptor_think()
+{
+}
+
+void raptor_touch()
+{
+    if(self.owner)
+    {
+        if(vlen(self.velocity) == 0)
+            return;
+
+        if(other.classname != "player")
+            return;
+
+        return;
+    }
+
+    if(other.classname != "player")
+        return;
+
+    if(other.deadflag != DEAD_NO)
+        return;
+
+    if(other.vehicle != world)
+        return;
+
+    raptor_enter();
+}
+
+void raptor_die()
+{
+    self.health       = 0;
+    self.event_damage = SUB_Null;
+    self.iscreature   = FALSE;
+    self.solid        = SOLID_NOT;
+    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';
+
+    if(random() < 0.5)
+        self.avelocity_z  = 45;
+    else
+        self.avelocity_z  = -45;
+
+    self.colormod = '-0.5 -0.5 -0.5';
+
+       self.think     = raptor_spawn;
+       self.nextthink = time + 5;
+}
+
+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.vehicle_energy = 1;
+    self.vehicle_hudmodel.viewmodelforclient = self;
+
+    setorigin(self, self.pos1);
+    self.angles = self.pos2;
+
+    setsize(self,RAPTOR_MIN ,RAPTOR_MAX );
+    pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
+    self.delay = time;
+}
+
+float raptor_customizeentityforclient()
+{
+    if(self.deadflag == DEAD_DEAD)
+        return FALSE;
+
+    /*
+    if(other == self.owner)
+        self.alpha = -1;
+    else
+        self.alpha = 1;
+    */
+
+    return TRUE;
+}
+
+void raptor_dinit()
+{
+
+    if (self.netname == "")
+        self.netname     = "Raptor";
+
+    setorigin(self, self.origin);
+
+    self.frame = 0;
+
+    setmodel(self,"models/vehicles/raptor.dpm");
+
+    self.bomb1 = spawn();
+    self.bomb2 = spawn();
+
+    setmodel(self.bomb1,"models/vehicles/raptor_bomb.dpm");
+    setmodel(self.bomb2,"models/vehicles/raptor_bomb.dpm");
+
+    setattachment(self.bomb1, self,"bombmount_left");
+    setattachment(self.bomb2, self,"bombmount_right");
+
+
+    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");
+    }
+
+    if not (self.vehicle_viewport)
+    {
+        self.vehicle_viewport   = spawn();
+        setmodel (self.vehicle_viewport, "null");
+        setattachment(self.vehicle_viewport, self.vehicle_hudmodel, "tag_camera");
+    }
+
+    if not (self.gun1)
+    {
+        self.gun1   = spawn();
+        setmodel(self.gun1, "models/vehicles/raptor_gun.dpm");
+        setattachment(self.gun1, self, "gunmount_left");
+    }
+
+    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';
+
+    spinner = spawn();
+    spinner.owner = self;
+    setmodel(spinner,"models/vehicles/spinner.dpm");
+    setattachment(spinner, self, "engine_right");
+    spinner.movetype = MOVETYPE_NOCLIP;
+    spinner.avelocity = '0 -90 0';
+
+    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);
+
+    raptor_spawn();
+}
+
+void spawnfunc_vehicle_raptor2()
+{
+    self.cvar_basename      = "g_vehicle_raptor";
+    raptor_loadsettings();
+
+    self.vehicle_flags      = VHF_HASSHIELD | VHF_SHIELDREGEN;
+
+    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(trace_fraction != 1.0)
+        setorigin(self,trace_endpos + '0 0 8');
+    else
+        dprint("WARNING: vehicle_racer placed more then 2048 units above ground.\n");
+
+    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");
+
+
+    self.think = raptor_dinit;
+    self.nextthink = time + 1;
+}
+
+
+void spawnfunc_vehicle_raptor()
+{
+    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');
+}
index 56caf6ff37a6d91b0933f093cc8119134f382028..32049c86266ece9838a5e63bda58be4203e1d9b4 100644 (file)
@@ -50,55 +50,43 @@ void spiderbot_rocket_touch()
     spiderbot_rocket_explode();
 }
 
-void spiderbot_rocket_guided()
+void spiderbot_rocket_unguided()
 {
     vector newdir,olddir;
 
     self.nextthink  = time;
-    if (self.owner.deadflag != DEAD_NO || self.cnt < time)
-    {
-        spiderbot_rocket_explode();
-        return;
-    }
 
-    if not (self.owner.vehicle)
-    {
-        UpdateCSQCProjectile(self);
-        return;
-    }
 
     olddir = normalize(self.velocity);
-    crosshair_trace(self.owner);
-    newdir = normalize(trace_endpos - self.origin) + randomvec() * cvar("g_vehicle_spiderbot_rocket_noise");
+    newdir = normalize(self.pos1 - self.origin) + randomvec() * cvar("g_vehicle_spiderbot_rocket_noise");
     self.velocity = normalize(olddir + newdir * cvar("g_vehicle_spiderbot_rocket_turnrate")) * cvar("g_vehicle_spiderbot_rocket_speed");
 
     UpdateCSQCProjectile(self);
+
+    if (self.owner.deadflag != DEAD_NO || self.cnt < time)
+        spiderbot_rocket_explode();
+
 }
 
-void spiderbot_rocket_unguided()
+void spiderbot_rocket_guided()
 {
-    vector newdir,olddir;
+    vector newdir, olddir;
 
     self.nextthink  = time;
-    if (self.owner.deadflag != DEAD_NO || self.cnt < time)
-    {
-        spiderbot_rocket_explode();
-        return;
-    }
 
     if not (self.owner.vehicle)
-    {
-        UpdateCSQCProjectile(self);
-        return;
-    }
+        self.think = spiderbot_rocket_unguided;
 
+    crosshair_trace(self.owner);
     olddir = normalize(self.velocity);
-    newdir = normalize(self.pos1 - self.origin) + randomvec() * cvar("g_vehicle_spiderbot_rocket_noise");
+    newdir = normalize(trace_endpos - self.origin) + randomvec() * cvar("g_vehicle_spiderbot_rocket_noise");
     self.velocity = normalize(olddir + newdir * cvar("g_vehicle_spiderbot_rocket_turnrate")) * cvar("g_vehicle_spiderbot_rocket_speed");
 
     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)
 {
@@ -311,13 +299,6 @@ void spiderbot_miniguns_do()
         return;
     }
 }
-#define SBS_IDLE  0
-#define SBS_JUMP  1
-#define SBS_WALK  2
-#define SBS_BACK  3
-#define SBS_LEFT  4
-#define SBS_RIGHT 5
-.float state;
 
 float spiderbot_pplug()
 {
@@ -325,6 +306,10 @@ float spiderbot_pplug()
     entity player,spider;
     float ftmp;
 
+    if not (self.owner)
+    {
+    }
+
     player = self;
     spider = self.vehicle;
 
@@ -366,8 +351,9 @@ float spiderbot_pplug()
     self = spider;
     if(spider.flags & FL_ONGROUND)
     {
-        if(player.BUTTON_JUMP)
+        if(player.BUTTON_JUMP && self.tur_head.wait < time)
         {
+            self.tur_head.wait = time + 2;
             player.BUTTON_JUMP = 0;
             spider.velocity   = v_forward * 700 + v_up * 600;
             spider.frame = 4;
@@ -432,7 +418,6 @@ float spiderbot_pplug()
     else
         player.vehicle_reload2 = 1 - ((spider.gun2.cnt - time) / spider.attack_finished_single);
 
-    //setorigin(spider,spider.origin);
     setorigin(player,spider.origin + '0 0 64');
     player.velocity = spider.velocity;
 
@@ -444,10 +429,7 @@ float spiderbot_pplug()
 void spiderbot_think()
 {
     if(self.flags & FL_ONGROUND)
-    {
         movelib_beak_simple(cvar("g_vehicle_spiderbot_speed_stop"));
-        //movelib_groundalign4point(300,100);
-    }
 
     self.nextthink = time;
 }
@@ -648,6 +630,7 @@ void spiderbot_spawn()
 
     setsize(self,spiderbot_MIN,spiderbot_MAX);
 
+    self.owner = world;
     self.velocity = '0 0 0';
     self.vehicle_health = CCVAR("_health");
     self.vehicle_shield = CCVAR("_shield");
index ea2d4406889d3df6c5224d3d20621e421b5578e4..192d83f6da4f21085cdf753b84dcc9b277eec9b2 100644 (file)
@@ -36,8 +36,8 @@ float SVC_UPDATEENTITY = 128; // Net.Protocol 0x80
 .entity vehicle_viewport;
 .entity vehicle_hudmodel;
 
-.float anim_start;
-.float anim_end;
+//.float anim_start;
+//.float anim_end;
 
 .float dmg_time;
 
@@ -51,7 +51,9 @@ var .void() vehicle_spawn;
 //var .float(float message) vehicle_message;
 
 #include "vehicles.qc"
+
 #include "spiderbot.qc"
 #include "racer.qc"
+#include "raptor.qc"
 
 #endif
index fdb02cf6bff7e3815c781741a68a2d0343c1e038..9a9b3830244602e00861704efe6716a2229f6304 100644 (file)
@@ -14,3 +14,4 @@
 #include "w_tuba.qc"
 #include "w_campingrifle.qc"
 #include "w_fireball.qc"
+#include "w_seeker.qc"
index 39e271886d3ea47c4b4504fd9536213037d49f52..8f6a9104946ce3f6dc263191d5520853f1065e57 100644 (file)
@@ -31,24 +31,27 @@ void W_CampingRifle_ReloadedAndReady()
        w_ready();
 }
 
-void W_CampingRifle_Reload()
+float W_CampingRifle_Reload()
 {
        float t;
 
        W_CampingRifle_CheckMaxBullets(TRUE);
-       if (self.campingrifle_bulletcounter >= cvar("g_balance_campingrifle_magazinecapacity"))
-               return;
 
-       if(self.ammo_nails < min(cvar("g_balance_campingrifle_primary_ammo"), cvar("g_balance_campingrifle_secondary_ammo")))
+       if(self.ammo_nails < min(cvar("g_balance_campingrifle_primary_ammo"), cvar("g_balance_campingrifle_secondary_ammo"))) // when we get here, bulletcounter must be 0 or -1
        {
+               print("cannot reload... not enough bullets\n");
                self.campingrifle_bulletcounter = -1; // reload later
-               return;
+               W_SwitchToOtherWeapon(self);
+               return 0;
        }
        
+       if (self.campingrifle_bulletcounter >= cvar("g_balance_campingrifle_magazinecapacity"))
+               return 0;
+
        if (self.weaponentity)
        {
                if (self.weaponentity.wframe == WFRAME_RELOAD)
-                       return;
+                       return 0;
 
                // allow to switch away while reloading, but this will cause a new reload!
                self.weaponentity.state = WS_READY;
@@ -62,15 +65,16 @@ void W_CampingRifle_Reload()
        weapon_thinkf(WFRAME_RELOAD, cvar("g_balance_campingrifle_reloadtime"), W_CampingRifle_ReloadedAndReady);
 
        self.campingrifle_bulletcounter = -1;
+
+       return 1;
 }
 
 void W_CampingRifle_CheckReloadAndReady()
 {
        w_ready();
-       if (self.campingrifle_bulletcounter <= 0)
-               W_CampingRifle_Reload();
-       else
-               w_ready();
+       if(self.campingrifle_bulletcounter <= 0)
+               if(W_CampingRifle_Reload())
+                       return;
 }
 
 void W_CampingRifle_FireBullet(float pSpread, float pDamage, float pHeadshotAddedDamage, float pForce, float pSpeed, float pLifetime, float pAmmo, float deathtype, float pBulletConstant)
@@ -116,6 +120,57 @@ void spawnfunc_weapon_campingrifle (void)
        weapon_defaultspawnfunc(WEP_CAMPINGRIFLE);
 }
 
+.void(void) campingrifle_bullethail_attackfunc;
+.float campingrifle_bullethail_frame;
+.float campingrifle_bullethail_animtime;
+.float campingrifle_bullethail_refire;
+void W_CampingRifle_BulletHail_Continue()
+{
+       float r, sw, af;
+       W_CampingRifle_CheckReloadAndReady();
+       if(self.campingrifle_bulletcounter < 0)
+               return; // reloading, so we are done
+       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.campingrifle_bullethail_frame == WFRAME_FIRE2, self.campingrifle_bullethail_refire);
+       if(self.switchweapon == self.weapon)
+               self.switchweapon = sw;
+       if(r)
+       {
+               self.campingrifle_bullethail_attackfunc();
+               weapon_thinkf(self.campingrifle_bullethail_frame, self.campingrifle_bullethail_animtime, W_CampingRifle_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_CampingRifle_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.campingrifle_bullethail_attackfunc = AttackFunc;
+               self.campingrifle_bullethail_frame = fr;
+               self.campingrifle_bullethail_animtime = animtime;
+               self.campingrifle_bullethail_refire = refire;
+               weapon_thinkf(fr, animtime, W_CampingRifle_BulletHail_Continue);
+       }
+       else
+       {
+               // just one shot
+               weapon_thinkf(fr, animtime, W_CampingRifle_CheckReloadAndReady);
+       }
+}
+
 .float bot_secondary_campingriflemooth;
 float w_campingrifle(float req)
 {
@@ -155,19 +210,19 @@ float w_campingrifle(float req)
                {
                        self.campingrifle_accumulator = bound(time - cvar("g_balance_campingrifle_bursttime"), self.campingrifle_accumulator, time);
                        if (self.BUTTON_ATCK)
+                       if (weapon_prepareattack_check(0, cvar("g_balance_campingrifle_primary_refire")))
                        if (time >= self.campingrifle_accumulator + cvar("g_balance_campingrifle_primary_burstcost"))
-                       if (weapon_prepareattack(0, cvar("g_balance_campingrifle_primary_refire")))
                        {
-                               W_CampingRifle_Attack();
-                               weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_campingrifle_primary_animtime"), W_CampingRifle_CheckReloadAndReady);
+                               weapon_prepareattack_do(0, cvar("g_balance_campingrifle_primary_refire"));
+                               W_CampingRifle_BulletHail(cvar("g_balance_campingrifle_primary_bullethail"), W_CampingRifle_Attack, WFRAME_FIRE1, cvar("g_balance_campingrifle_primary_animtime"), cvar("g_balance_campingrifle_primary_refire"));
                                self.campingrifle_accumulator += cvar("g_balance_campingrifle_primary_burstcost");
                        }
                        if (self.BUTTON_ATCK2)
+                       if (weapon_prepareattack_check(1, cvar("g_balance_campingrifle_secondary_refire")))
                        if (time >= self.campingrifle_accumulator + cvar("g_balance_campingrifle_secondary_burstcost"))
-                       if (weapon_prepareattack(1, cvar("g_balance_campingrifle_secondary_refire")))
                        {
-                               W_CampingRifle_Attack2();
-                               weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_campingrifle_secondary_animtime"), W_CampingRifle_CheckReloadAndReady);
+                               weapon_prepareattack_do(1, cvar("g_balance_campingrifle_secondary_refire"));
+                               W_CampingRifle_BulletHail(cvar("g_balance_campingrifle_secondary_bullethail"), W_CampingRifle_Attack2, WFRAME_FIRE2, cvar("g_balance_campingrifle_secondary_animtime"), cvar("g_balance_campingrifle_primary_refire"));
                                self.campingrifle_accumulator += cvar("g_balance_campingrifle_secondary_burstcost");
                        }
                }
@@ -176,7 +231,7 @@ float w_campingrifle(float req)
        {               
                precache_model ("models/weapons/g_campingrifle.md3");
                precache_model ("models/weapons/v_campingrifle.md3");
-               precache_model ("models/weapons/h_campingrifle.dpm");
+               precache_model ("models/weapons/h_campingrifle.iqm");
                precache_sound ("weapons/campingrifle_reload.wav");
                precache_sound ("weapons/campingrifle_fire.wav");
                precache_sound ("weapons/campingrifle_fire2.wav");
@@ -239,84 +294,3 @@ float w_campingrifle(float req)
        return TRUE;
 };
 #endif
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0Ç[\7f\90Kg|º^fÆ,9Þ@ª  w_deathtypestring = "sniped themself somehow";
-       }
-       else if (req == WR_KILLMESSAGE)
-       {
-               if(w_deathtype & HITTYPE_SECONDARY)
-               {
-                       if(w_deathtype & HITTYPE_BOUNCE)
-                               w_deathtypestring = "failed to hide from #'s bullet hail";
-                       else
-                               w_deathtypestring = "died in #'s bullet hail";
-               }
-               else
-               {
-                       if(w_deathtype & HITTYPE_BOUNCE)
-                       {
-                               // TODO special headshot message here too?
-                               w_deathtypestring = "failed to hide from #'s rifle";
-                       }
-                       else
-                       {
-                               if(w_deathtype & HITTYPE_HEADSHOT)
-                                       w_deathtypestring = "got hit in the head by #";
-                               else
-                                       w_deathtypestring = "was sniped by #";
-                       }
-               }
-       }
-       else if (req == WR_RELOAD)
-       {
-               W_CampingRifle_Reload();
-       }
-       else if (req == WR_RESETPLAYER)
-       {
-               self.campingrifle_accumulator = time - cvar("g_balance_campingrifle_bursttime");
-               self.campingrifle_bulletcounter = cvar("g_balance_campingrifle_magazinecapacity");
-               W_CampingRifle_CheckMaxBullets(FALSE);
-       }
-       return TRUE;
-};
-#endif
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\11tì\87{³\vío¸?~á\85\17Ñ  w_deathtypestring = "sniped themself somehow";
-       }
-       else if (req == WR_KILLMESSAGE)
-       {
-               if(w_deathtype & HITTYPE_SECONDARY)
-               {
-                       if(w_deathtype & HITTYPE_BOUNCE)
-                               w_deathtypestring = "failed to hide from #'s bullet hail";
-                       else
-                               w_deathtypestring = "died in #'s bullet hail";
-               }
-               else
-               {
-                       if(w_deathtype & HITTYPE_BOUNCE)
-                       {
-                               // TODO special headshot message here too?
-                               w_deathtypestring = "failed to hide from #'s rifle";
-                       }
-                       else
-                       {
-                               if(w_deathtype & HITTYPE_HEADSHOT)
-                                       w_deathtypestring = "got hit in the head by #";
-                               else
-                                       w_deathtypestring = "was sniped by #";
-                       }
-               }
-       }
-       else if (req == WR_RELOAD)
-       {
-               W_CampingRifle_Reload();
-       }
-       else if (req == WR_RESETPLAYER)
-       {
-               self.campingrifle_accumulator = time - cvar("g_balance_campingrifle_bursttime");
-               self.campingrifle_bulletcounter = cvar("g_balance_campingrifle_magazinecapacity");
-               W_CampingRifle_CheckMaxBullets(FALSE);
-       }
-       return TRUE;
-};
-#endif
-\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0
\ No newline at end of file
index ec307528a0984f4bfdf64ab47d7c05c3532407d3..8f2de4e8ce27b777624ea583860d081df599e830 100644 (file)
@@ -1,3 +1,4 @@
+
 void W_GiveWeapon (entity e, float wep, string name)
 {
        entity oldself;
@@ -301,14 +302,20 @@ float W_BallisticBullet_LeaveSolid(entity e, vector vel, float constant)
 
 void W_BallisticBullet_Touch (void)
 {
+       float density;
+
        if(self.think == W_BallisticBullet_LeaveSolid_think) // skip this!
                return;
 
        PROJECTILE_TOUCH;
        W_BallisticBullet_Hit ();
 
+       density = other.ballistics_density;
+       if(density == 0)
+               density = 1;
+
        // go through solid!
-       if(!W_BallisticBullet_LeaveSolid(self, self.velocity, self.dmg_radius))
+       if(!W_BallisticBullet_LeaveSolid(self, self.velocity, self.dmg_radius * density))
        {
                remove(self);
                return;
@@ -332,7 +339,7 @@ void fireBallisticBullet_trace_callback(vector start, vector hit, vector end)
 
 void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, float lifetime, float damage, float headshotbonus, float force, float dtype, float tracereffects, float gravityfactor, float bulletconstant)
 {
-       float lag, dt, savetime;
+       float lag, dt, savetime, density;
        entity pl, oldself;
 
        entity proj;
@@ -438,8 +445,12 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
                                W_BallisticBullet_Hit();
                        }
 
+                       density = other.ballistics_density;
+                       if(density == 0)
+                               density = 1;
+
                        // go through solid!
-                       if(!W_BallisticBullet_LeaveSolid(self, self.velocity, self.dmg_radius))
+                       if(!W_BallisticBullet_LeaveSolid(self, self.velocity, self.dmg_radius * density))
                                break;
 
                        W_BallisticBullet_LeaveSolid_think();
index ba676866dce26e8caa1af772dc9eb41b3b471c75..b95a7cef897645479054eba22b5e7d79e269a2c8 100644 (file)
@@ -209,7 +209,7 @@ float w_crylink(float req)
        {
                precache_model ("models/weapons/g_crylink.md3");
                precache_model ("models/weapons/v_crylink.md3");
-               precache_model ("models/weapons/h_crylink.dpm");
+               precache_model ("models/weapons/h_crylink.iqm");
                precache_sound ("weapons/crylink_fire.wav");
                precache_sound ("weapons/crylink_fire2.wav");
        }
index e19c01b343f88f597cb634959db2f0a4545c069c..c9e7d23c31eff0682d56453b594b2cfdbd115481 100644 (file)
@@ -51,7 +51,6 @@ void W_Plasma_Explode (void)
 
 void W_Plasma_Explode_Combo (void)
 {
-
        W_Plasma_TriggerCombo(self.origin, cvar("g_balance_electro_combo_comboradius"), self.owner);
 
        self.event_damage = SUB_Null;
@@ -98,7 +97,7 @@ void W_Plasma_Damage (entity inflictor, entity attacker, float damage, float dea
                else
                {
                        self.use = W_Plasma_Explode;
-                       self.think = adaptor_think2use;
+                       self.think = adaptor_think2use; // not _hittype_splash, as this runs "immediately"
                }
        }
 }
@@ -117,7 +116,7 @@ void W_Electro_Attack()
        proj.bot_dodge = TRUE;
        proj.bot_dodgerating = cvar("g_balance_electro_primary_damage");
        proj.use = W_Plasma_Explode;
-       proj.think = adaptor_think2use;
+       proj.think = adaptor_think2use_hittype_splash;
        proj.nextthink = time + cvar("g_balance_electro_primary_lifetime");
        PROJECTILE_MAKETRIGGER(proj);
        proj.projectiledeathtype = WEP_ELECTRO;
@@ -151,7 +150,7 @@ void W_Electro_Attack2()
        proj.classname = "plasma";
        proj.owner = self;
        proj.use = W_Plasma_Explode;
-       proj.think = adaptor_think2use;
+       proj.think = adaptor_think2use_hittype_splash;
        proj.bot_dodge = TRUE;
        proj.bot_dodgerating = cvar("g_balance_electro_secondary_damage");
        proj.nextthink = time + cvar("g_balance_electro_secondary_lifetime");
@@ -270,7 +269,7 @@ float w_electro(float req)
        {
                precache_model ("models/weapons/g_electro.md3");
                precache_model ("models/weapons/v_electro.md3");
-               precache_model ("models/weapons/h_electro.dpm");
+               precache_model ("models/weapons/h_electro.iqm");
                precache_sound ("weapons/electro_bounce.wav");
                precache_sound ("weapons/electro_fire.wav");
                precache_sound ("weapons/electro_fire2.wav");
index 05de87693708f8f3647d487ac794b509daed1b60..0462cd9018b256f0febe222f9e415b3c164e3a2c 100644 (file)
@@ -1,9 +1,9 @@
 #ifdef REGISTER_WEAPON
-REGISTER_WEAPON(FIREBALL, w_fireball, IT_ROCKETS, 9, WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "fireball", "fireball", "Fireball");
+REGISTER_WEAPON(FIREBALL, w_fireball, IT_FUEL, 9, WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "fireball", "fireball", "Fireball");
 #else
-.float bot_secondary_fireballmooth; // whatever a mooth is
+.float bot_primary_fireballmooth; // whatever a mooth is
 .vector fireball_impactvec;
-.float fireball_secondarytime;
+.float fireball_primarytime;
 
 void W_Fireball_Explode (void)
 {
@@ -18,15 +18,15 @@ void W_Fireball_Explode (void)
 
        // 1. dist damage
        d = (self.owner.health + self.owner.armorvalue);
-       RadiusDamage (self, self.realowner, cvar("g_balance_fireball_secondary_damage"), cvar("g_balance_fireball_secondary_edgedamage"), cvar("g_balance_fireball_secondary_radius"), world, cvar("g_balance_fireball_secondary_force"), self.projectiledeathtype, other);
+       RadiusDamage (self, self.realowner, cvar("g_balance_fireball_primary_damage"), cvar("g_balance_fireball_primary_edgedamage"), cvar("g_balance_fireball_primary_radius"), world, cvar("g_balance_fireball_primary_force"), self.projectiledeathtype, other);
        if(self.realowner.health + self.realowner.armorvalue >= d)
        if(!self.cnt)
        {
-               modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, cvar("g_balance_fireball_secondary_bfgradius"), 0.2, 0.05, 0.25);
+               modeleffect_spawn("models/sphere/sphere.md3", 0, 0, self.origin, '0 0 0', '0 0 0', '0 0 0', 0, cvar("g_balance_fireball_primary_bfgradius"), 0.2, 0.05, 0.25);
 
                // 2. bfg effect
                // NOTE: this cannot be made warpzone aware by design. So, better intentionally ignore warpzones here.
-               for(e = findradius(self.origin, cvar("g_balance_fireball_secondary_bfgradius")); e; e = e.chain)
+               for(e = findradius(self.origin, cvar("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))
                {
                        // can we see fireball?
@@ -39,14 +39,14 @@ void W_Fireball_Explode (void)
                        if(/* trace_startsolid || */ trace_fraction != 1)
                                continue;
                        dist = vlen(self.origin - e.origin - e.view_ofs);
-                       points = (1 - sqrt(dist / cvar("g_balance_fireball_secondary_bfgradius")));
+                       points = (1 - sqrt(dist / cvar("g_balance_fireball_primary_bfgradius")));
                        if(points <= 0)
                                continue;
                        dir = normalize(e.origin + e.view_ofs - self.origin);
-                       Damage(e, self, self.realowner, cvar("g_balance_fireball_secondary_bfgdamage") * points, self.projectiledeathtype | HITTYPE_BOUNCE | HITTYPE_SPLASH, e.origin + e.view_ofs, cvar("g_balance_fireball_secondary_bfgforce") * dir);
+                       Damage(e, self, self.realowner, cvar("g_balance_fireball_primary_bfgdamage") * points, self.projectiledeathtype | HITTYPE_BOUNCE | HITTYPE_SPLASH, e.origin + e.view_ofs, cvar("g_balance_fireball_primary_bfgforce") * dir);
                        pointparticles(particleeffectnum("fireball_bfgdamage"), e.origin, -1 * dir, 1);
 
-                       Damage_RecordDamage(self.owner, self.projectiledeathtype, cvar("g_balance_fireball_secondary_bfgdamage") * points);
+                       Damage_RecordDamage(self.owner, self.projectiledeathtype, cvar("g_balance_fireball_primary_bfgdamage") * points);
                }
        }
 
@@ -98,11 +98,12 @@ void W_Fireball_Think()
        if(time > self.pushltime)
        {
                self.cnt = 1;
+               self.projectiledeathtype |= HITTYPE_SPLASH;
                W_Fireball_Explode();
                return;
        }
 
-       W_Fireball_LaserPlay(0.1, cvar("g_balance_fireball_secondary_laserradius"), cvar("g_balance_fireball_secondary_laserdamage"), cvar("g_balance_fireball_secondary_laseredgedamage"), cvar("g_balance_fireball_secondary_laserburntime"));
+       W_Fireball_LaserPlay(0.1, cvar("g_balance_fireball_primary_laserradius"), cvar("g_balance_fireball_primary_laserdamage"), cvar("g_balance_fireball_primary_laseredgedamage"), cvar("g_balance_fireball_primary_laserburntime"));
 
        self.nextthink = time + 0.1;
 }
@@ -119,11 +120,11 @@ void W_Fireball_Damage (entity inflictor, entity attacker, float damage, float d
        }
 }
 
-void W_Fireball_Attack2()
+void W_Fireball_Attack1()
 {
        local entity proj;
 
-       W_SetupShot_ProjectileSize (self, '-16 -16 -16', '16 16 16', FALSE, 2, "weapons/fireball_fire2.wav", cvar("g_balance_fireball_secondary_damage") + cvar("g_balance_fireball_secondary_bfgdamage"));
+       W_SetupShot_ProjectileSize (self, '-16 -16 -16', '16 16 16', FALSE, 2, "weapons/fireball_fire2.wav", cvar("g_balance_fireball_primary_damage") + cvar("g_balance_fireball_primary_bfgdamage"));
 
        pointparticles(particleeffectnum("fireball_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
@@ -131,22 +132,22 @@ void W_Fireball_Attack2()
        proj.classname = "plasma_prim";
        proj.owner = proj.realowner = self;
        proj.bot_dodge = TRUE;
-       proj.bot_dodgerating = cvar("g_balance_fireball_secondary_damage");
-       proj.pushltime = time + cvar("g_balance_fireball_secondary_lifetime");
+       proj.bot_dodgerating = cvar("g_balance_fireball_primary_damage");
+       proj.pushltime = time + cvar("g_balance_fireball_primary_lifetime");
        proj.use = W_Fireball_Explode;
        proj.think = W_Fireball_Think;
        proj.nextthink = time;
-       proj.health = cvar("g_balance_fireball_secondary_health");
+       proj.health = cvar("g_balance_fireball_primary_health");
        proj.team = self.team;
        proj.event_damage = W_Fireball_Damage;
        proj.takedamage = DAMAGE_YES;
-       proj.damageforcescale = cvar("g_balance_fireball_secondary_damageforcescale");
+       proj.damageforcescale = cvar("g_balance_fireball_primary_damageforcescale");
        PROJECTILE_MAKETRIGGER(proj);
-       proj.projectiledeathtype = WEP_FIREBALL | HITTYPE_SECONDARY;
+       proj.projectiledeathtype = WEP_FIREBALL;
        setorigin(proj, w_shotorg);
 
        proj.movetype = MOVETYPE_FLY;
-       W_SETUPPROJECTILEVELOCITY(proj, g_balance_fireball_secondary);
+       W_SETUPPROJECTILEVELOCITY(proj, g_balance_fireball_primary);
        proj.angles = vectoangles(proj.velocity);
        proj.touch = W_Fireball_TouchExplode;
        setsize(proj, '-16 -16 -16', '16 16 16');
@@ -162,38 +163,38 @@ void W_Fireball_AttackEffect(float i, vector f_diff)
        pointparticles(particleeffectnum("fireball_preattack_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 }
 
-void W_Fireball_Attack2_Frame4()
+void W_Fireball_Attack1_Frame4()
 {
-       W_Fireball_Attack2();
-       weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_fireball_secondary_animtime"), w_ready);
+       W_Fireball_Attack1();
+       weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_fireball_primary_animtime"), w_ready);
 }
 
-void W_Fireball_Attack2_Frame3()
+void W_Fireball_Attack1_Frame3()
 {
        W_Fireball_AttackEffect(0, '+1.25 +3.75 0');
-       weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_fireball_secondary_animtime"), W_Fireball_Attack2_Frame4);
+       weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_fireball_primary_animtime"), W_Fireball_Attack1_Frame4);
 }
 
-void W_Fireball_Attack2_Frame2()
+void W_Fireball_Attack1_Frame2()
 {
        W_Fireball_AttackEffect(0, '-1.25 +3.75 0');
-       weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_fireball_secondary_animtime"), W_Fireball_Attack2_Frame3);
+       weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_fireball_primary_animtime"), W_Fireball_Attack1_Frame3);
 }
 
-void W_Fireball_Attack2_Frame1()
+void W_Fireball_Attack1_Frame1()
 {
        W_Fireball_AttackEffect(1, '+1.25 -3.75 0');
-       weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_fireball_secondary_animtime"), W_Fireball_Attack2_Frame2);
+       weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_fireball_primary_animtime"), W_Fireball_Attack1_Frame2);
 }
 
-void W_Fireball_Attack2_Frame0()
+void W_Fireball_Attack1_Frame0()
 {
        if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-               self.ammo_rockets = self.ammo_rockets - cvar("g_balance_fireball_secondary_ammo");
+               self.ammo_fuel = self.ammo_fuel - cvar("g_balance_fireball_primary_ammo");
 
        W_Fireball_AttackEffect(0, '-1.25 -3.75 0');
        sound (self, CHAN_WEAPON, "weapons/fireball_prefire2.wav", VOL_BASE, ATTN_NORM);
-       weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_fireball_secondary_animtime"), W_Fireball_Attack2_Frame1);
+       weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_fireball_primary_animtime"), W_Fireball_Attack1_Frame1);
 }
 
 void W_Firemine_Think()
@@ -207,7 +208,7 @@ void W_Firemine_Think()
        // make it "hot" once it leaves its owner
        if(self.owner)
        {
-               if(vlen(self.origin - self.owner.origin - self.owner.view_ofs) > cvar("g_balance_fireball_primary_laserradius"))
+               if(vlen(self.origin - self.owner.origin - self.owner.view_ofs) > cvar("g_balance_fireball_secondary_laserradius"))
                {
                        self.cnt += 1;
                        if(self.cnt == 3)
@@ -217,7 +218,7 @@ void W_Firemine_Think()
                        self.cnt = 0;
        }
 
-       W_Fireball_LaserPlay(0.1, cvar("g_balance_fireball_primary_laserradius"), cvar("g_balance_fireball_primary_laserdamage"), cvar("g_balance_fireball_primary_laseredgedamage"), cvar("g_balance_fireball_primary_laserburntime"));
+       W_Fireball_LaserPlay(0.1, cvar("g_balance_fireball_secondary_laserradius"), cvar("g_balance_fireball_secondary_laserdamage"), cvar("g_balance_fireball_secondary_laseredgedamage"), cvar("g_balance_fireball_secondary_laserburntime"));
 
        self.nextthink = time + 0.1;
 }
@@ -226,7 +227,7 @@ void W_Firemine_Touch (void)
 {
        PROJECTILE_TOUCH;
        if (other.takedamage == DAMAGE_AIM)
-       if(Fire_AddDamage(other, self.realowner, cvar("g_balance_fireball_primary_damage"), cvar("g_balance_fireball_primary_damagetime"), self.projectiledeathtype | HITTYPE_HEADSHOT) >= 0)
+       if(Fire_AddDamage(other, self.realowner, cvar("g_balance_fireball_secondary_damage"), cvar("g_balance_fireball_secondary_damagetime"), self.projectiledeathtype | HITTYPE_HEADSHOT) >= 0)
        {
                remove(self);
                return;
@@ -234,14 +235,14 @@ void W_Firemine_Touch (void)
        self.projectiledeathtype |= HITTYPE_BOUNCE;
 }
 
-void W_Fireball_Attack1()
+void W_Fireball_Attack2()
 {
        local entity proj;
        vector f_diff;
        float c;
 
        if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
-               self.ammo_rockets = self.ammo_rockets - cvar("g_balance_fireball_primary_ammo");
+               self.ammo_fuel = self.ammo_fuel - cvar("g_balance_fireball_secondary_ammo");
 
        c = mod(self.bulletcounter, 4);
        switch(c)
@@ -260,7 +261,7 @@ void W_Fireball_Attack1()
                        f_diff = '+1.25 +3.75 0';
                        break;
        }
-       W_SetupShot_ProjectileSize(self, '-4 -4 -4', '4 4 4', FALSE, 2, "weapons/fireball_fire.wav", cvar("g_balance_fireball_primary_damage"));
+       W_SetupShot_ProjectileSize(self, '-4 -4 -4', '4 4 4', FALSE, 2, "weapons/fireball_fire.wav", cvar("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;
 
@@ -270,18 +271,18 @@ void W_Fireball_Attack1()
        proj.owner = proj.realowner = self;
        proj.classname = "grenade";
        proj.bot_dodge = TRUE;
-       proj.bot_dodgerating = cvar("g_balance_fireball_primary_damage");
+       proj.bot_dodgerating = cvar("g_balance_fireball_secondary_damage");
        proj.movetype = MOVETYPE_BOUNCE;
-       proj.projectiledeathtype = WEP_FIREBALL;
+       proj.projectiledeathtype = WEP_FIREBALL | HITTYPE_SECONDARY;
        proj.touch = W_Firemine_Touch;
        PROJECTILE_MAKETRIGGER(proj);
        setsize(proj, '-4 -4 -4', '4 4 4');
        setorigin(proj, w_shotorg);
        proj.think = W_Firemine_Think;
        proj.nextthink = time;
-       proj.damageforcescale = cvar("g_balance_fireball_primary_damageforcescale");
-       proj.pushltime = time + cvar("g_balance_fireball_primary_lifetime");
-       W_SETUPPROJECTILEVELOCITY_UP(proj, g_balance_fireball_primary);
+       proj.damageforcescale = cvar("g_balance_fireball_secondary_damageforcescale");
+       proj.pushltime = time + cvar("g_balance_fireball_secondary_lifetime");
+       W_SETUPPROJECTILEVELOCITY_UP(proj, g_balance_fireball_secondary);
 
        proj.angles = vectoangles(proj.velocity);
        proj.flags = FL_PROJECTILE;
@@ -300,44 +301,44 @@ float w_fireball(float req)
        {
                self.BUTTON_ATCK = FALSE;
                self.BUTTON_ATCK2 = FALSE;
-               if (self.bot_secondary_fireballmooth == 0)
+               if (self.bot_primary_fireballmooth == 0)
                {
-                       if(bot_aim(cvar("g_balance_fireball_primary_speed"), cvar("g_balance_fireball_primary_speed_up"), cvar("g_balance_fireball_primary_lifetime"), TRUE))
+                       if(bot_aim(cvar("g_balance_fireball_primary_speed"), 0, cvar("g_balance_fireball_primary_lifetime"), FALSE))
                        {
                                self.BUTTON_ATCK = TRUE;
-                               if(random() < 0.01) self.bot_secondary_fireballmooth = 1;
+                               if(random() < 0.02) self.bot_primary_fireballmooth = 0;
                        }
                }
                else
                {
-                       if(bot_aim(cvar("g_balance_fireball_secondary_speed"), 0, cvar("g_balance_fireball_secondary_lifetime"), FALSE))
+                       if(bot_aim(cvar("g_balance_fireball_secondary_speed"), cvar("g_balance_fireball_secondary_speed_up"), cvar("g_balance_fireball_secondary_lifetime"), TRUE))
                        {
                                self.BUTTON_ATCK2 = TRUE;
-                               if(random() < 0.02) self.bot_secondary_fireballmooth = 0;
+                               if(random() < 0.01) self.bot_primary_fireballmooth = 1;
                        }
                }
        }
        else if (req == WR_THINK)
        {
                if (self.BUTTON_ATCK)
-               if (weapon_prepareattack(0, cvar("g_balance_fireball_primary_refire")))
+               if (time >= self.fireball_primarytime)
+               if (weapon_prepareattack(1, cvar("g_balance_fireball_primary_refire")))
                {
-                       W_Fireball_Attack1();
-                       weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_fireball_primary_animtime"), w_ready);
+                       W_Fireball_Attack1_Frame0();
+                       self.fireball_primarytime = time + cvar("g_balance_fireball_primary_refire2");
                }
                if (self.BUTTON_ATCK2)
-               if (time >= self.fireball_secondarytime)
-               if (weapon_prepareattack(1, cvar("g_balance_fireball_secondary_refire")))
+               if (weapon_prepareattack(0, cvar("g_balance_fireball_secondary_refire")))
                {
-                       W_Fireball_Attack2_Frame0();
-                       self.fireball_secondarytime = time + cvar("g_balance_fireball_secondary_refire2");
+                       W_Fireball_Attack2();
+                       weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_fireball_secondary_animtime"), w_ready);
                }
        }
        else if (req == WR_PRECACHE)
        {
                precache_model ("models/weapons/g_fireball.md3");
                precache_model ("models/weapons/v_fireball.md3");
-               precache_model ("models/weapons/h_fireball.dpm");
+               precache_model ("models/weapons/h_fireball.iqm");
                precache_model ("models/sphere/sphere.md3");
                precache_sound ("weapons/fireball_fire.wav");
                precache_sound ("weapons/fireball_fire2.wav");
@@ -346,19 +347,26 @@ float w_fireball(float req)
        else if (req == WR_SETUP)
                weapon_setup(WEP_FIREBALL);
        else if (req == WR_CHECKAMMO1)
-               return self.ammo_rockets >= cvar("g_balance_fireball_primary_ammo");
+               return self.ammo_fuel >= cvar("g_balance_fireball_primary_ammo");
        else if (req == WR_CHECKAMMO2)
-               return self.ammo_rockets >= cvar("g_balance_fireball_secondary_ammo");
+               return self.ammo_fuel >= cvar("g_balance_fireball_secondary_ammo");
        else if (req == WR_SUICIDEMESSAGE)
        {
                if(w_deathtype & HITTYPE_SECONDARY)
-                       w_deathtypestring = "should have used a smaller gun";
-               else
                        w_deathtypestring = "forgot about some firemine";
+               else
+                       w_deathtypestring = "should have used a smaller gun";
        }
        else if (req == WR_KILLMESSAGE)
        {
                if(w_deathtype & HITTYPE_SECONDARY)
+               {
+                       if(w_deathtype & HITTYPE_HEADSHOT)
+                               w_deathtypestring = "tried to catch #'s firemine";
+                       else
+                               w_deathtypestring = "fatefully ignored #'s firemine";
+               }
+               else
                {
                        if(w_deathtype & HITTYPE_BOUNCE)
                        {
@@ -376,17 +384,10 @@ float w_fireball(float req)
                        else
                                w_deathtypestring = "tasted #'s fireball";
                }
-               else
-               {
-                       if(w_deathtype & HITTYPE_HEADSHOT)
-                               w_deathtypestring = "tried to catch #'s firemine";
-                       else
-                               w_deathtypestring = "fatefully ignored #'s firemine";
-               }
        }
        else if (req == WR_RESETPLAYER)
        {
-               self.fireball_secondarytime = time;
+               self.fireball_primarytime = time;
        }
        return TRUE;
 };
index 80b7020130a945a2a76aa07ab707f75cfb926bc3..251137401c4a0580d934da6f6b4949313131ed59 100644 (file)
@@ -99,7 +99,7 @@ void W_Grenade_Attack (void)
        setsize(gren, '0 0 -3', '0 0 -3');
 
        gren.nextthink = time + cvar("g_balance_grenadelauncher_primary_lifetime");
-       gren.think = adaptor_think2use;
+       gren.think = adaptor_think2use_hittype_splash;
        gren.use = W_Grenade_Explode;
        gren.touch = W_Grenade_Touch1;
        W_SETUPPROJECTILEVELOCITY_UP(gren, g_balance_grenadelauncher_primary);
@@ -127,13 +127,15 @@ void W_Grenade_Attack2 (void)
        gren.bot_dodge = TRUE;
        gren.bot_dodgerating = cvar("g_balance_grenadelauncher_secondary_damage");
        gren.movetype = MOVETYPE_BOUNCE;
+       gren.bouncefactor = cvar("g_balance_grenadelauncher_secondary_bouncefactor");
+       gren.bouncestop = cvar("g_balance_grenadelauncher_secondary_bouncestop");
        PROJECTILE_MAKETRIGGER(gren);
        gren.projectiledeathtype = WEP_GRENADE_LAUNCHER | HITTYPE_SECONDARY;
        setsize(gren, '0 0 -3', '0 0 -3');
        setorigin(gren, w_shotorg);
 
        gren.nextthink = time + cvar("g_balance_grenadelauncher_secondary_lifetime");
-       gren.think = adaptor_think2use;
+       gren.think = adaptor_think2use_hittype_splash;
        gren.use = W_Grenade_Explode2;
        gren.touch = W_Grenade_Touch2;
        gren.takedamage = DAMAGE_YES;
@@ -199,7 +201,7 @@ float w_glauncher(float req)
        {
                precache_model ("models/weapons/g_gl.md3");
                precache_model ("models/weapons/v_gl.md3");
-               precache_model ("models/weapons/h_gl.dpm");
+               precache_model ("models/weapons/h_gl.iqm");
                precache_sound ("weapons/grenade_bounce1.wav");
                precache_sound ("weapons/grenade_bounce2.wav");
                precache_sound ("weapons/grenade_bounce3.wav");
index f23893ac18c5719f037dbb97acc7283f7532b423..638e18bcc261f5f718de326eb40647d3640f8e6a 100644 (file)
@@ -56,7 +56,7 @@ void W_Hagar_Attack (void)
        missile.bot_dodgerating = cvar("g_balance_hagar_primary_damage");
        missile.touch = W_Hagar_Touch;
        missile.use = W_Hagar_Explode;
-       missile.think = adaptor_think2use;
+       missile.think = adaptor_think2use_hittype_splash;
        missile.nextthink = time + cvar("g_balance_hagar_primary_lifetime");
        PROJECTILE_MAKETRIGGER(missile);
        missile.projectiledeathtype = WEP_HAGAR;
@@ -91,7 +91,7 @@ void W_Hagar_Attack2 (void)
        missile.touch = W_Hagar_Touch2;
        missile.cnt = 0;
        missile.use = W_Hagar_Explode2;
-       missile.think = adaptor_think2use;
+       missile.think = adaptor_think2use_hittype_splash;
        missile.nextthink = time + cvar("g_balance_hagar_secondary_lifetime_min") + random() * cvar("g_balance_hagar_secondary_lifetime_rand");
        PROJECTILE_MAKETRIGGER(missile);
        missile.projectiledeathtype = WEP_HAGAR | HITTYPE_SECONDARY;
@@ -141,7 +141,7 @@ float w_hagar(float req)
        {
                precache_model ("models/weapons/g_hagar.md3");
                precache_model ("models/weapons/v_hagar.md3");
-               precache_model ("models/weapons/h_hagar.dpm");
+               precache_model ("models/weapons/h_hagar.iqm");
                precache_sound ("weapons/hagar_fire.wav");
        }
        else if (req == WR_SETUP)
index f182ed3971d795c16b86822eee9e69f5d6683779..ecd30d76911d0b8f016eada99910014eb7cf9d31 100644 (file)
@@ -196,7 +196,7 @@ float w_hlac(float req)
        {
         precache_model ("models/weapons/g_hlac.md3");
                precache_model ("models/weapons/v_hlac.md3");
-               precache_model ("models/weapons/h_hlac.dpm");
+               precache_model ("models/weapons/h_hlac.iqm");
                precache_sound ("weapons/lasergun_fire.wav");
 
        }
index 79240494febd784750c5b494a07da924e6ac06d0..7b4eba094df0d558318942fbb8879947102f6097 100644 (file)
@@ -77,7 +77,7 @@ void W_Hook_Attack2()
        setsize(gren, '0 0 0', '0 0 0');
 
        gren.nextthink = time + cvar("g_balance_hook_secondary_lifetime");
-       gren.think = adaptor_think2use;
+       gren.think = adaptor_think2use_hittype_splash;
        gren.use = W_Hook_Explode2;
        gren.touch = W_Hook_Touch2;
 
@@ -217,7 +217,7 @@ float w_hook(float req)
        {
                precache_model ("models/weapons/g_hookgun.md3");
                precache_model ("models/weapons/v_hookgun.md3");
-               precache_model ("models/weapons/h_hookgun.dpm");
+               precache_model ("models/weapons/h_hookgun.iqm");
                precache_sound ("weapons/hook_impact.wav"); // done by g_hook.qc
                precache_sound ("weapons/hook_fire.wav");
                precache_sound ("weapons/hookbomb_fire.wav");
index d90c97a38959f04a7b72708e25484e64d13c83a2..4d749d0ba1c36bdcdc792883cee07b0d1652cc0e 100644 (file)
@@ -167,7 +167,7 @@ float w_laser(float req)
        {
                precache_model ("models/weapons/g_laser.md3");
                precache_model ("models/weapons/v_laser.md3");
-               precache_model ("models/weapons/h_laser.dpm");
+               precache_model ("models/weapons/h_laser.iqm");
                precache_sound ("weapons/lasergun_fire.wav");
                precache_sound ("weapons/gauntlet_fire.wav");
        }
index 27bc8bd91dae9d0e38b51f73fa1298602a17699d..00e8fd890a0ea2f2a7bf22ac9328fc52daf9ac3c 100644 (file)
@@ -210,7 +210,7 @@ float w_minstanex(float req)
                precache_model ("models/nexflash.md3");
                precache_model ("models/weapons/g_minstanex.md3");
                precache_model ("models/weapons/v_minstanex.md3");
-               precache_model ("models/weapons/h_minstanex.dpm");
+               precache_model ("models/weapons/h_minstanex.iqm");
                precache_sound ("weapons/minstanexfire.wav");
                precache_sound ("weapons/nexwhoosh1.wav");
                precache_sound ("weapons/nexwhoosh2.wav");
index f9196a8e8c979a0fb1eaa12d38b4fc1d90c97a89..7a9103ccfabf2cd619919b4863fbfcdc9a1ccaa9 100644 (file)
@@ -61,7 +61,7 @@ float w_nex(float req)
                precache_model ("models/nexflash.md3");
                precache_model ("models/weapons/g_nex.md3");
                precache_model ("models/weapons/v_nex.md3");
-               precache_model ("models/weapons/h_nex.dpm");
+               precache_model ("models/weapons/h_nex.iqm");
                precache_sound ("weapons/nexfire.wav");
                precache_sound ("weapons/nexwhoosh1.wav");
                precache_sound ("weapons/nexwhoosh2.wav");
index 55872df4fcfd89ee4a73821baca67ace1c154add..55bbc51f8c4bc44624187cabe4fcdba3ddc74cce 100644 (file)
@@ -257,7 +257,7 @@ float w_porto(float req)
        {
                precache_model ("models/weapons/g_porto.md3");
                precache_model ("models/weapons/v_porto.md3");
-               precache_model ("models/weapons/h_porto.dpm");
+               precache_model ("models/weapons/h_porto.iqm");
                precache_model ("models/portal.md3");
                precache_sound ("porto/bounce.wav");
                precache_sound ("porto/create.wav");
index 68cd5e9597152a4bd33dc64ee037dd7692035711..348a79c700630c8cd78663c1014ea95394e897a0 100644 (file)
@@ -520,7 +520,7 @@ float w_rlauncher(float req)
                precache_model ("models/flash.md3");
                precache_model ("models/weapons/g_rl.md3");
                precache_model ("models/weapons/v_rl.md3");
-               precache_model ("models/weapons/h_rl.dpm");
+               precache_model ("models/weapons/h_rl.iqm");
                precache_sound ("weapons/rocket_det.wav");
                precache_sound ("weapons/rocket_fire.wav");
                precache_sound ("weapons/rocket_mode.wav");
diff --git a/qcsrc/server/w_seeker.qc b/qcsrc/server/w_seeker.qc
new file mode 100644 (file)
index 0000000..83d6158
--- /dev/null
@@ -0,0 +1,481 @@
+#ifdef REGISTER_WEAPON
+REGISTER_WEAPON(SEEKER, w_seeker, IT_ROCKETS, 9, WEP_FLAG_NORMAL | WEP_TYPE_SPLASH, BOT_PICKUP_RATING_MID, "seeker", "seeker", "T.A.G. Seeker");
+#else
+//.float speed; = switchweapon
+//.float proxytime; = autoswitch
+//.float tl; = wait
+
+void Seeker_Missile_Explode ()
+{
+       self.event_damage = SUB_Null;
+       RadiusDamage (self, self.owner, cvar("g_balance_seeker_missile_damage"), cvar("g_balance_seeker_missile_edgedamage"), cvar("g_balance_seeker_missile_radius"), world, cvar("g_balance_seeker_missile_force"), self.projectiledeathtype, other);
+
+       remove (self);
+}
+
+void Seeker_Missile_Touch()
+{
+       PROJECTILE_TOUCH;
+
+       Seeker_Missile_Explode();
+}
+
+void Seeker_Missile_Think()
+{
+       entity e;
+       vector desireddir, olddir, newdir, eorg;
+       float turnrate;
+       float dist;
+
+       if (time > self.cnt)
+       {
+               self.projectiledeathtype |= HITTYPE_SPLASH;
+               Seeker_Missile_Explode();
+       }
+
+       if (!self.switchweapon)
+               self.switchweapon = cvar("g_balance_seeker_missile_speed");
+
+       if ((self.switchweapon < cvar("g_balance_seeker_missile_speed_max")) && cvar("g_balance_seeker_missile_speed_accel"))
+               self.switchweapon = self.switchweapon * cvar("g_balance_seeker_missile_accel");
+
+       if (self.switchweapon > cvar("g_balance_seeker_missile_speed_max"))
+               self.switchweapon = self.switchweapon * cvar("g_balance_seeker_missile_decel");
+
+       if (self.enemy != world)
+               if (self.enemy.takedamage != DAMAGE_AIM || self.enemy.deadflag != DEAD_NO)
+                       self.enemy = world;
+
+       if (self.enemy != world)
+       {
+               e               = self.enemy;
+               eorg            = 0.5 * (e.absmin + e.absmax);
+               turnrate        = cvar("g_balance_seeker_missile_turnrate");                // how fast to turn
+               desireddir      = normalize(eorg - self.origin);
+               olddir          = normalize(self.velocity);                                         // get my current direction
+               dist            = vlen(eorg - self.origin);
+
+               // Do evasive maneuvers for world objects? ( this should be a cpu hog. :P )
+               if (cvar("g_balance_seeker_missile_smart") && (dist > cvar("g_balance_seeker_missile_smart_mindist")))
+               {
+                       // Is it a better idea (shorter distance) to trace to the target itself?
+                       if ( vlen(self.origin + olddir * self.wait) < dist)
+                               traceline(self.origin, self.origin + olddir * self.wait, FALSE, self);
+                       else
+                               traceline(self.origin, eorg, FALSE, self);
+
+                       // Setup adaptive tracelength
+                       self.wait = vlen(self.origin - trace_endpos);
+                       if (self.wait < cvar("g_balance_seeker_missile_smart_trace_min")) self.wait = cvar("g_balance_seeker_missile_smart_trace_min");
+                       if (self.wait > cvar("g_balance_seeker_missile_smart_trace_max")) self.wait = cvar("g_balance_seeker_missile_smart_trace_max");
+
+                       // Calc how important it is that we turn and add this to the desierd (enemy) dir.
+                       desireddir  = normalize(((trace_plane_normal * (1 - trace_fraction)) + (desireddir * trace_fraction)) * 0.5);
+               }
+
+               //newdir = normalize((olddir + desireddir * turnrate) * 0.5);// take the average of the 2 directions; not the best method but simple & easy
+               newdir = normalize(olddir + desireddir * turnrate);// take the average of the 2 directions; not the best method but simple & easy
+
+               self.velocity = newdir * self.switchweapon;                                         // make me fly in the new direction at my flight speed
+       }
+
+       // Proxy
+       if (cvar("g_balance_seeker_missile_proxy"))
+       {
+               if ( dist <= cvar("g_balance_seeker_missile_proxy_maxrange"))
+               {
+                       if (self.autoswitch == 0)
+                       {
+                               self.autoswitch = time + cvar("g_balance_seeker_missile_proxy_delay");
+                       }
+                       else
+                       {
+                               if (self.autoswitch <= time)
+                               {
+                                       Seeker_Missile_Explode();
+                                       self.autoswitch = 0;
+                               }
+                       }
+               }
+               else
+               {
+                       if (self.autoswitch != 0)
+                               self.autoswitch = 0;
+               }
+       }
+       ///////////////
+
+       if (self.enemy.deadflag != DEAD_NO)
+       {
+               self.enemy = world;
+               self.cnt = time + 1 + (random() * 4);
+               self.nextthink = self.cnt;
+               return;
+       }
+
+       self.angles = vectoangles(self.velocity);                       // turn model in the new flight direction
+       self.nextthink = time + 0.05;
+
+       UpdateCSQCProjectile(self);
+}
+
+
+
+void Seeker_Missile_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+       float d;
+       d = damage;
+
+       if (self.health <= 0)
+               return;
+
+       if (self.owner == attacker)
+               d = d * 0.25;
+
+       self.health = self.health - d;
+
+       if (self.health <= 0)
+               W_PrepareExplosionByDamage(attacker, Seeker_Missile_Explode);
+}
+
+void Seeker_Missile_Animate()
+{
+       self.frame = self.frame +1;
+       self.nextthink = time + 0.05;
+
+       if (self.enemy != world)
+               if (self.enemy.takedamage != DAMAGE_AIM || self.enemy.deadflag != DEAD_NO)
+                       self.enemy = world;
+
+       if(self.frame == 5)
+       {
+               self.think           = Seeker_Missile_Think;
+               self.nextthink       = time;// + cvar("g_balance_seeker_missile_activate_delay"); // cant dealy with csqc projectiles
+
+               if (cvar("g_balance_seeker_missile_proxy"))
+                       self.movetype    = MOVETYPE_BOUNCEMISSILE;
+               else
+                       self.movetype    = MOVETYPE_FLYMISSILE;
+       }
+
+       UpdateCSQCProjectile(self);
+}
+
+void Seeker_Fire_Missile(vector f_diff)
+{
+       local entity missile;
+
+       if not(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)
+               self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_missile_ammo");
+
+       makevectors(self.v_angle);
+       W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/seeker_fire.wav", cvar("g_balance_seeker_missile_damage"));
+       w_shotorg += f_diff;
+       pointparticles(particleeffectnum("seeker_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+
+       //self.detornator         = FALSE;
+
+       missile                 = spawn();
+       missile.owner           = self;
+       missile.classname       = "seeker_missile";
+       missile.bot_dodge       = TRUE;
+       missile.bot_dodgerating = cvar("g_balance_seeker_missile_damage");
+
+       missile.think           = Seeker_Missile_Animate;
+
+       //if (!cvar("g_balance_seeker_missile_proxy"))
+       missile.touch           = Seeker_Missile_Touch;
+
+       missile.event_damage    = Seeker_Missile_Damage;
+       missile.nextthink       = time;// + 0.2;// + cvar("g_balance_seeker_missile_activate_delay");
+       missile.cnt             = time + cvar("g_balance_seeker_missile_lifetime");
+       missile.enemy           = self.enemy;
+       missile.solid           = SOLID_BBOX;
+       missile.scale           = 2;
+       missile.takedamage          = DAMAGE_YES;
+       missile.health          = cvar("g_balance_seeker_missile_health");
+       missile.damageforcescale = cvar("g_balance_seeker_missile_damageforcescale");
+       missile.projectiledeathtype = WEP_SEEKER;
+
+       setorigin (missile, w_shotorg);
+       setsize (missile, '-4 -4 -4', '4 4 4');
+
+
+       missile.movetype    = MOVETYPE_FLYMISSILE;// MOVETYPE_TOSS;
+
+       missile.flags       = FL_PROJECTILE;
+
+       W_SETUPPROJECTILEVELOCITY_UP(missile, g_balance_seeker_missile);
+
+       missile.switchweapon = vlen(missile.velocity);
+       missile.angles = vectoangles (missile.velocity);
+
+       CSQCProjectile(missile, FALSE, PROJECTILE_SEEKER, TRUE);
+}
+
+void Seeker_Vollycontroler_Think()
+{
+       float c;
+       entity oldself,oldenemy;
+       self.cnt = self.cnt - 1;
+
+       if((!(self.owner.items & IT_UNLIMITED_AMMO) && self.owner.ammo_rockets < cvar("g_balance_seeker_missile_ammo")) || (self.cnt <= -1) || (self.owner.deadflag != DEAD_NO))
+       {
+               remove(self);
+               return;
+       }
+
+       self.nextthink = time + cvar("g_balance_seeker_missile_delay");
+
+       oldself = self;
+       self = self.owner;
+
+       oldenemy = self.enemy;
+       self.enemy = oldself.enemy;
+
+       c = mod(oldself.cnt, 4);
+       switch(c)
+       {
+               case 0:
+                       Seeker_Fire_Missile('-1.25 -3.75 0');
+                       break;
+               case 1:
+                       Seeker_Fire_Missile('+1.25 -3.75 0');
+                       break;
+               case 2:
+                       Seeker_Fire_Missile('-1.25 +3.75 0');
+                       break;
+               case 3:
+               default:
+                       Seeker_Fire_Missile('+1.25 +3.75 0');
+                       break;
+       }
+
+       self.enemy = oldenemy;
+       self = oldself;
+}
+
+void Seeker_Tag_Explode ()
+{
+       //if(other==self.owner)
+       //    return;
+       Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_BOUNCE, self);
+
+       remove (self);
+}
+
+void Seeker_Tag_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+       if (self.health <= 0)
+               return;
+       self.health = self.health - damage;
+       if (self.health <= 0)
+               Seeker_Tag_Explode();
+}
+
+void Seeker_Tag_Think()
+{
+       remove(self);
+       return;
+}
+
+void Seeker_Tag_Touch()
+{
+       vector dir;
+       vector org2;
+
+       dir     = normalize (self.owner.origin - self.origin);
+       org2    = findbetterlocation (self.origin, 8);
+
+       te_knightspike(org2);
+
+       self.event_damage = SUB_Null;
+       Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_HEADSHOT, self);
+
+       if (other.takedamage == DAMAGE_AIM && other.deadflag == DEAD_NO)
+       {
+               entity e;
+               e           = spawn();
+               e.cnt       = cvar("g_balance_seeker_missile_count");
+               e.owner     = self.owner;
+               e.enemy     = other;
+               e.think     = Seeker_Vollycontroler_Think;
+               e.nextthink = time;
+
+               //sprint(self.owner, "^1Target lock ^3[^7 ",other.netname, " ^3]^1 acquired - autofire activated.\n");
+               //sprint(other,"^1You are targeted!\n");
+
+               // stuffcmd(other,"play2 weapons/zany-alarm4.ogg\n");
+               // stuffcmd(self.owner, "play2 weapons/zany-lock4.ogg\n");
+       }
+
+       remove(self);
+       return;
+}
+
+
+
+void Seeker_Fire_Tag()
+{
+       local entity missile;
+       if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+               self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_tag_ammo");
+
+       W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/tag_fire.wav", 0);
+
+       missile                 = spawn();
+       missile.owner           = self;
+       missile.classname       = "seeker_tag";
+       missile.bot_dodge       = TRUE;
+       missile.bot_dodgerating = 50;
+       missile.touch           = Seeker_Tag_Touch;
+       missile.think           = Seeker_Tag_Think;
+       missile.nextthink       = time + cvar("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;
+       missile.health          = cvar("g_balance_seeker_tag_health");
+       missile.damageforcescale = cvar("g_balance_seeker_tag_damageforcescale");
+
+       setorigin (missile, w_shotorg);
+       setsize (missile, '-2 -2 -2', '2 2 2');
+
+       missile.flags       = FL_PROJECTILE;
+
+       missile.movetype    = MOVETYPE_FLY;
+       W_SETUPPROJECTILEVELOCITY(missile, g_balance_seeker_tag);
+       missile.angles = vectoangles (missile.velocity);
+
+       CSQCProjectile(missile, TRUE, PROJECTILE_TAG, FALSE); // has sound
+}
+
+
+void Seeker_Flac_Explode ()
+{
+       self.event_damage = SUB_Null;
+
+       RadiusDamage (self, self.owner, cvar("g_balance_seeker_flac_damage"), cvar("g_balance_seeker_flac_edgedamage"), cvar("g_balance_seeker_flac_radius"), world, cvar("g_balance_seeker_flac_force"), self.projectiledeathtype, other);
+
+       remove (self);
+}
+
+void Seeker_Flac_Touch()
+{
+       PROJECTILE_TOUCH;
+
+       Seeker_Flac_Explode();
+}
+
+void Seeker_Fire_Flac()
+{
+       local entity missile;
+       vector f_diff;
+       float c;
+
+       if not(self.items & IT_UNLIMITED_WEAPON_AMMO)
+               self.ammo_rockets = self.ammo_rockets - cvar("g_balance_seeker_flac_ammo");
+
+       c = mod(self.bulletcounter, 4);
+       switch(c)
+       {
+               case 0:
+                       f_diff = '-1.25 -3.75 0';
+                       break;
+               case 1:
+                       f_diff = '+1.25 -3.75 0';
+                       break;
+               case 2:
+                       f_diff = '-1.25 +3.75 0';
+                       break;
+               case 3:
+               default:
+                       f_diff = '+1.25 +3.75 0';
+                       break;
+       }
+       W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/flac_fire.wav", cvar("g_balance_seeker_flac_damage"));
+       w_shotorg += f_diff;
+
+       pointparticles(particleeffectnum("hagar_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
+
+       missile = spawn ();
+       missile.owner = missile.realowner = self;
+       missile.classname = "missile";
+       missile.bot_dodge = TRUE;
+       missile.bot_dodgerating = cvar("g_balance_seeker_flac_damage");
+       missile.touch = Seeker_Flac_Explode;
+       missile.use = Seeker_Flac_Explode;
+       missile.think = adaptor_think2use_hittype_splash;
+       missile.nextthink = time + cvar("g_balance_seeker_flac_lifetime") + cvar("g_balance_seeker_flac_lifetime_rand");
+       missile.solid = SOLID_BBOX;
+       missile.scale = 0.4; // BUG: the model is too big
+       missile.projectiledeathtype = WEP_SEEKER;
+       setorigin (missile, w_shotorg);
+       setsize (missile, '-2 -2 -2', '2 2 2');
+       missile.projectiledeathtype = WEP_SEEKER | HITTYPE_SECONDARY;
+
+       missile.movetype = MOVETYPE_FLY;
+       W_SETUPPROJECTILEVELOCITY_UP(missile, g_balance_seeker_flac);
+
+       missile.angles = vectoangles (missile.velocity);
+       missile.flags = FL_PROJECTILE;
+
+       CSQCProjectile(missile, TRUE, PROJECTILE_FLAC, TRUE);
+}
+
+void spawnfunc_weapon_seeker (void)
+{
+       weapon_defaultspawnfunc(WEP_SEEKER);
+}
+
+float w_seeker(float req)
+{
+       if (req == WR_AIM)
+               self.BUTTON_ATCK = bot_aim(cvar("g_balance_seeker_tag_speed"), 0, 20, FALSE);
+
+       else if (req == WR_THINK)
+       {
+               if (self.BUTTON_ATCK)
+                       if (weapon_prepareattack(0, cvar("g_balance_seeker_tag_refire")))
+                       {
+                               Seeker_Fire_Tag();
+                               weapon_thinkf(WFRAME_FIRE1, cvar("g_balance_seeker_tag_animtime"), w_ready);
+                       }
+
+               if (self.BUTTON_ATCK2)
+                       if (weapon_prepareattack(1, cvar("g_balance_seeker_flac_refire")))
+                       {
+                               Seeker_Fire_Flac();
+                               weapon_thinkf(WFRAME_FIRE2, cvar("g_balance_seeker_flac_animtime"), w_ready);
+                       }
+
+       }
+       else if (req == WR_PRECACHE)
+       {
+               precache_model ("models/weapons/g_seeker.md3");
+               precache_model ("models/weapons/v_seeker.md3");
+               precache_model ("models/weapons/h_seeker.iqm");
+               precache_sound ("weapons/tag_fire.wav");
+               precache_sound ("weapons/flac_fire.wav");
+               precache_sound ("weapons/seeker_fire.wav");
+       }
+       else if (req == WR_SETUP)
+               weapon_setup(WEP_SEEKER);
+       else if (req == WR_CHECKAMMO1)
+               return self.ammo_rockets >= cvar("g_balance_seeker_tag_ammo") + cvar("g_balance_seeker_missile_ammo");
+       else if (req == WR_CHECKAMMO2)
+               return self.ammo_rockets >= cvar("g_balance_seeker_flac_ammo");
+       else if (req == WR_SUICIDEMESSAGE)
+               w_deathtypestring = "played with tiny rockets";
+       else if (req == WR_KILLMESSAGE)
+       {
+               if(w_deathtype & HITTYPE_SECONDARY)
+                       w_deathtypestring = "ran into #'s flac";
+               else
+                       w_deathtypestring = "was tagged by";
+       }
+       return TRUE;
+};
+#endif
index 71451aa09c1a3e422f2f8b04ae46628ff33ac8a4..0b499f4832586cc8b5c03e6688d00c519a7adcd6 100644 (file)
@@ -129,7 +129,7 @@ float w_shotgun(float req)
                precache_model ("models/uziflash.md3");
                precache_model ("models/weapons/g_shotgun.md3");
                precache_model ("models/weapons/v_shotgun.md3");
-               precache_model ("models/weapons/h_shotgun.dpm");
+               precache_model ("models/weapons/h_shotgun.iqm");
                precache_sound ("misc/itempickup.wav");
                precache_sound ("weapons/shotgun_fire.wav");
        }
index 9074ba84926ad12e4d85729cf2b55a1cc14c9318..eab14f4f516d62da409e3c2ada398c8afb81b9ce 100644 (file)
@@ -228,7 +228,7 @@ float w_tuba(float req)
        {
                precache_model ("models/weapons/g_tuba.md3");
                precache_model ("models/weapons/v_tuba.md3");
-               precache_model ("models/weapons/h_tuba.dpm");
+               precache_model ("models/weapons/h_tuba.iqm");
 
                //float i;
                //for(i = -18; i <= +27; ++i)
index ddec0e8abf0e7c7bf7ed5d7c6f164c7bf45e7252..4887f803d36e518153bf69de39a14378f1b6c982 100644 (file)
@@ -116,7 +116,7 @@ float w_uzi(float req)
                precache_model ("models/uziflash.md3");
                precache_model ("models/weapons/g_uzi.md3");
                precache_model ("models/weapons/v_uzi.md3");
-               precache_model ("models/weapons/h_uzi.dpm");
+               precache_model ("models/weapons/h_uzi.iqm");
                precache_sound ("weapons/uzi_fire.wav");
        }
        else if (req == WR_SETUP)
index c16fc898b0d09232c049bb25a31babf4ffca811a..773e90d5ecd655752f4fa02ca10ac2e36f951361 100644 (file)
@@ -112,22 +112,33 @@ void WarpZone_Outside()
 float warpzone_saved;
 vector warpzone_saved_origin;
 vector warpzone_saved_angles;
+vector warpzone_saved_cl_viewangles;
 #ifndef KEEP_ROLL
 var float autocvar_cl_rollkillspeed = 10;
 #endif
 void WarpZone_FixView()
 {
-       float pd;
+       float pd, f;
        entity e;
        warpzone_saved = 0;
        warpzone_saved_origin = warpzone_fixview_origin;
        warpzone_saved_angles = warpzone_fixview_angles;
+       warpzone_saved_cl_viewangles = warpzone_fixview_cl_viewangles;
 
 #ifndef KEEP_ROLL
-       if(autocvar_cl_rollkillspeed)
-               R_SetView(VF_CL_VIEWANGLES_Z, input_angles_z * max(0, (1 - frametime * autocvar_cl_rollkillspeed)));
-       else
-               R_SetView(VF_CL_VIEWANGLES_Z, 0);
+       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);
+       }
 #endif
 
        e = WarpZone_Find(warpzone_fixview_origin, warpzone_fixview_origin);
@@ -136,6 +147,7 @@ void WarpZone_FixView()
                warpzone_saved = 1;
                warpzone_fixview_origin = WarpZone_TransformOrigin(e, warpzone_fixview_origin);
                warpzone_fixview_angles = WarpZone_TransformVAngles(e, warpzone_fixview_angles);
+               warpzone_fixview_cl_viewangles = WarpZone_TransformVAngles(e, warpzone_fixview_cl_viewangles);
                WarpZone_Inside();
        }
        else
@@ -154,10 +166,10 @@ void WarpZone_FixView()
                }
        }
 
-       if(warpzone_saved)
+       if(warpzone_saved == 1)
        {
                R_SetView(VF_ORIGIN, warpzone_fixview_origin);
-               R_SetView(VF_ANGLES, warpzone_fixview_angles);
+               R_SetView(VF_ANGLES, warpzone_fixview_cl_viewangles);
        }
 }
 void WarpZone_UnFixView()
@@ -166,8 +178,10 @@ void WarpZone_UnFixView()
        {
                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);
        }
 }
 
index 5ab212a333e938c9e7bcb7c18fe46adba6e71dba..e8f44be136d4effa8c4cf5102554fdab48c77eec 100644 (file)
@@ -3,6 +3,7 @@ void WarpZone_Camera_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
 
index 4aaef971db5b32ff4cde0a0931ba14ea54a9d4d4..3f6bb10a2ebe872b77bc88e45f44558beced4bb1 100644 (file)
@@ -150,7 +150,7 @@ void WarpZone_Trace_AddTransform(entity wz)
 
 void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end, float nomonsters, entity forent, entity zone, WarpZone_trace_callback_t cb)
 {
-       float frac, sol;
+       float frac, sol, i;
        vector o0, e0;
        entity wz;
        vector vf, vr, vu;
@@ -179,8 +179,14 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
        WarpZone_MakeAllSolid();
        sol = -1;
        frac = 0;
+       i = 16;
        for(;;)
        {
+               if(--i < 1)
+               {
+                       dprint("Too many warpzones in sequence, aborting trace.\n");
+                       break;
+               }
                tracebox(org, mi, ma, end, nomonsters, forent);
                if(cb)
                        cb(org, trace_endpos, end);
@@ -225,7 +231,7 @@ void WarpZone_TraceLine(vector org, vector end, float nomonsters, entity forent)
 
 void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZone_trace_callback_t cb)
 {
-       float g, dt;
+       float g, dt, i;
        vector vf, vr, vu, v0, o0;
        entity wz;
 
@@ -254,8 +260,14 @@ void WarpZone_TraceToss_ThroughZone(entity e, entity forent, entity zone, WarpZo
        WarpZone_MakeAllSolid();
        g = cvar("sv_gravity") * e.gravity;
        WarpZone_tracetoss_time = 0;
+       i = 16;
        for(;;)
        {
+               if(--i < 1)
+               {
+                       dprint("Too many warpzones in sequence, aborting trace.\n");
+                       break;
+               }
                tracetoss(e, forent);
                if(cb)
                        cb(e.origin, trace_endpos, trace_endpos);
index 44e696aece4e632077fa2519e3e1cfa14e6b2086..7b4c09ccb7cb17a9ee2b16b47094e2c5b302e6d4 100644 (file)
@@ -252,10 +252,8 @@ float WarpZone_Projectile_Touch()
        return FALSE;
 }
 
-void WarpZone_InitStep_FindTarget()
+void WarpZone_InitStep_FindOriginTarget()
 {
-       entity e;
-
        if(self.killtarget != "")
        {
                self.aiment = find(world, targetname, self.killtarget);
@@ -265,23 +263,10 @@ void WarpZone_InitStep_FindTarget()
                        return;
                }
        }
-
-       // this way only one of the two ents needs to target
-       if(self.target != "")
-       {
-               e = find(world, targetname, self.target);
-               if(e)
-               {
-                       self.enemy = e;
-                       self.enemy.enemy = self;
-               }
-       }
 }
 
 void WarpZonePosition_InitStep_FindTarget()
 {
-       entity e;
-
        if(self.target == "")
        {
                error("Warp zone position with no target");
@@ -304,8 +289,6 @@ void WarpZonePosition_InitStep_FindTarget()
 
 void WarpZoneCamera_InitStep_FindTarget()
 {
-       entity e;
-
        if(self.target == "")
        {
                error("Camera with no target");
@@ -327,12 +310,6 @@ void WarpZone_InitStep_UpdateTransform()
        float i_s, i_t, n_t;
        string tex;
 
-       if(!self.enemy || self.enemy.enemy != self)
-       {
-               error("Invalid warp zone detected. Killed.");
-               return;
-       }
-
        org = self.origin;
        if(org == '0 0 0')
                org = 0.5 * (self.mins + self.maxs);
@@ -408,10 +385,48 @@ void WarpZone_InitStep_UpdateTransform()
        self.warpzone_origin = org;
        self.warpzone_angles = ang;
 }
+
+void WarpZone_InitStep_ClearTarget()
+{
+       if(self.enemy)
+               self.enemy.enemy = world;
+       self.enemy = world;
+}
+
+void WarpZone_InitStep_FindTarget()
+{
+       float i;
+       entity e, e2;
+
+       // this way only one of the two ents needs to target
+       if(self.target != "")
+       {
+               e2 = world;
+               for(e = world; (e = find(e, targetname, self.target)); )
+                       if(!e.enemy)
+                               if(random() * ++i < 1)
+                                       e2 = e;
+               if(!e2)
+               {
+                       error("Warpzone with non-existing target");
+                       return;
+               }
+               self.enemy = e2;
+               e2.enemy = self;
+       }
+}
+
 void WarpZone_InitStep_FinalizeTransform()
 {
+       if(!self.enemy || self.enemy.enemy != self)
+       {
+               error("Invalid warp zone detected. Killed.");
+               return;
+       }
+
        WarpZone_SetUp(self, self.warpzone_origin, self.warpzone_angles, self.enemy.warpzone_origin, self.enemy.warpzone_angles);
        self.touch = WarpZone_Touch;
+       self.SendFlags = 0xFFFFFF;
 }
 
 float warpzone_initialized;
@@ -487,6 +502,19 @@ void spawnfunc_func_camera(void)
        self.warpzone_next = warpzone_camera_first;
        warpzone_camera_first = self;
 }
+void WarpZones_Reconnect()
+{
+       entity e;
+       e = self;
+       for(self = warpzone_first; self; self = self.warpzone_next)
+               WarpZone_InitStep_ClearTarget();
+       for(self = warpzone_first; self; self = self.warpzone_next)
+               WarpZone_InitStep_FindTarget();
+       for(self = warpzone_first; self; self = self.warpzone_next)
+               WarpZone_InitStep_FinalizeTransform();
+       self = e;
+}
+
 void WarpZone_StartFrame()
 {
        entity e;
@@ -495,17 +523,39 @@ void WarpZone_StartFrame()
                warpzone_initialized = 1;
                e = self;
                for(self = warpzone_first; self; self = self.warpzone_next)
-                       WarpZone_InitStep_FindTarget();
+                       WarpZone_InitStep_FindOriginTarget();
                for(self = warpzone_position_first; self; self = self.warpzone_next)
                        WarpZonePosition_InitStep_FindTarget();
                for(self = warpzone_camera_first; self; self = self.warpzone_next)
                        WarpZoneCamera_InitStep_FindTarget();
                for(self = warpzone_first; self; self = self.warpzone_next)
                        WarpZone_InitStep_UpdateTransform();
-               for(self = warpzone_first; self; self = self.warpzone_next)
-                       WarpZone_InitStep_FinalizeTransform();
                self = e;
+               WarpZones_Reconnect();
        }
        for(e = world; (e = nextent(e)); )
                WarpZone_StoreProjectileData(e);
 }
+
+void target_warpzone_reconnect_use()
+{
+       entity e;
+       e = self;
+       // NOTE: this matches for target, not targetname, but of course
+       // targetname must be set too on the other entities
+       for(self = warpzone_first; self; self = self.warpzone_next)
+               if(e.target == "" || self.target == e.target)
+                       WarpZone_InitStep_ClearTarget();
+       for(self = warpzone_first; self; self = self.warpzone_next)
+               if(e.target == "" || self.target == e.target)
+                       WarpZone_InitStep_FindTarget();
+       for(self = warpzone_first; self; self = self.warpzone_next)
+               if(e.target == "" || self.target == e.target || self.enemy.target == e.target)
+                       WarpZone_InitStep_FinalizeTransform();
+       self = e;
+}
+
+void trigger_warpzone_reconnect()
+{
+       self.use = target_warpzone_reconnect_use;
+}
diff --git a/qcsrc/xonotic-gamecode.workspace b/qcsrc/xonotic-gamecode.workspace
new file mode 100644 (file)
index 0000000..3f4a59a
--- /dev/null
@@ -0,0 +1,8 @@
+<?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>
diff --git a/scripts/electro.shader b/scripts/electro.shader
new file mode 100644 (file)
index 0000000..84fa240
--- /dev/null
@@ -0,0 +1,16 @@
+electro_plasma
+{
+ {
+       map textures/electro_plasma.tga
+       tcMod scroll 0.03 0.001
+ }
+}
+
+electro_plasma_hull
+{
+        {
+       map textures/electro_plasma_hull.tga
+       alphaFunc GT0
+       rgbGen Vertex
+        }
+}
diff --git a/scripts/fireball.shader b/scripts/fireball.shader
new file mode 100644 (file)
index 0000000..822be77
--- /dev/null
@@ -0,0 +1,10 @@
+fireball
+{
+       {
+               map textures/fireball
+               tcgen environment
+       }
+       {
+               map $lightmap
+       }
+}
diff --git a/scripts/flags.shader b/scripts/flags.shader
new file mode 100644 (file)
index 0000000..1ed38d6
--- /dev/null
@@ -0,0 +1,33 @@
+flags/flag_red_cloth {
+       cull none
+       deformVertexes wave 100 sin 0 0.4 0 2.5
+       {
+               map textures/flags/flag_red_cloth.tga
+       }
+}
+
+flags/flag_red_laser {
+       {
+               map textures/flags/flag_red_laser.tga
+               tcMod scroll 0.2 -1
+               blendfunc add
+       }
+}
+
+
+flags/flag_blue_cloth {
+       cull none
+       deformVertexes wave 100 sin 0 0.4 0 2.5
+       {
+               map textures/flags/flag_blue_cloth.tga
+       }
+}
+
+flags/flag_blue_laser {
+       {
+               map textures/flags/flag_blue_laser.tga
+               tcMod scroll 0.2 -1
+               blendfunc add
+       }
+}
+
diff --git a/scripts/hlac.shader b/scripts/hlac.shader
new file mode 100644 (file)
index 0000000..cd85d93
--- /dev/null
@@ -0,0 +1,40 @@
+hlac_plasma
+{
+ {
+       map textures/hlac_plasma.tga
+       tcMod scroll 22.5 0.2
+       tcmod scale 0.01 0.01
+ }
+}
+
+hlac_metal
+{
+        cull none
+        {
+                map textures/hlac_metal.tga
+                rgbgen vertex
+        }
+}
+hlac_glass
+{
+       qer_editorimage textures/hlac_glass.tga
+       surfaceparm trans
+       cull disable
+       qer_trans 0.5
+       {
+               map textures/hlac_glass.tga
+               blendfunc add
+               //rgbGen vertex
+               tcgen environment
+               tcmod scale 4 4
+       }       
+}
+hlac_bullet
+{
+       cull disable
+       deformVertexes autosprite
+       {
+               map models/hlac_bullet.tga
+               blendfunc add
+       }       
+}
diff --git a/scripts/model-common.shader b/scripts/model-common.shader
new file mode 100644 (file)
index 0000000..a99d5ee
--- /dev/null
@@ -0,0 +1,10 @@
+// shaders to be used on models
+
+nodraw
+{
+       surfaceparm nodraw
+       surfaceparm nolightmap
+       surfaceparm nonsolid
+       surfaceparm trans
+       surfaceparm nomarks
+}
diff --git a/scripts/onslaught.shader b/scripts/onslaught.shader
new file mode 100644 (file)
index 0000000..6b9c946
--- /dev/null
@@ -0,0 +1,99 @@
+ons_shield
+{
+ {
+       map textures/ons_shield.tga
+       tcMod rotate 15
+       tcMod scale 0.3 0.3
+       tcMod scroll 0.03 0.001
+       tcGen environment
+ }
+}
+
+ons_pad_text
+{
+       cull none
+ {
+       map textures/ons_text.tga
+       tcMod scroll 0.1 0
+       blendfunc add
+
+ }
+}
+
+ons_icon_text
+{
+ {
+       map textures/ons_text.tga
+       tcMod scroll 0.1 0
+ }
+}
+
+ons_icon_thrust
+{
+ {
+       map textures/ons_icon_thrust.tga
+       tcMod scroll 3 0
+       tcMod rotate 10
+ }
+}
+ons_gen_spark
+{
+       cull none
+ {
+       animmap 9 textures/generator_lightning.tga textures/generator_lightning2.tga
+       tcMod scroll 0.5 0
+       blendfunc add
+
+ }
+}
+ons_fire
+{
+ {
+       map textures/ons_boom1.tga
+       tcMod scroll 0.05 0.1
+       tcMod rotate 0.01
+       blendfunc add
+
+ }
+}
+ons_smoke
+{
+       deformVertexes wave sin 1 3 2 0.2
+ {
+       map textures/ons_smoke1.tga
+       tcMod scroll 0.01 0.04
+       tcMod rotate 0.01
+       alphaFunc GE128
+
+ }
+}
+ons_shockwave
+{
+       cull none
+ {
+       map textures/ons_shockwave1.tga
+       tcMod scroll 0.2 0
+       blendfunc add
+
+ }
+}
+ons_shockwave2
+{
+ {
+       map textures/ons_shockwave2.tga
+       tcMod rotate 85
+       tcMod scroll 0.03 0.6
+       tcGen environment
+       blendfunc add
+ }
+}
+
+ons_ray
+{
+cull none
+ {
+       map textures/ons_ray.tga
+       tcMod rotate 85
+       blendfunc add
+ }
+}
\ No newline at end of file
diff --git a/scripts/portals.shader b/scripts/portals.shader
new file mode 100644 (file)
index 0000000..08732b1
--- /dev/null
@@ -0,0 +1,68 @@
+portals_red_vortex
+{
+       cull none
+       deformVertexes wave 100 sin 1.5 0.6 0 1.5
+       {
+               map textures/portals/portals_red_vortex.tga
+               tcMod rotate 10
+               blendfunc blend
+       }
+}
+
+portals_blue_vortex
+{
+       cull none
+       deformVertexes wave 100 sin 1.5 0.6 0 1.5
+       {
+               map textures/portals/portals_blue_vortex.tga
+               tcMod rotate 10
+               blendfunc blend
+       }
+}
+
+portals_inactive_vortex
+{
+       cull none
+       deformVertexes wave 100 sin 1.5 0.6 0 1.5
+       {
+               map textures/portals/portals_inactive_vortex.tga
+               tcMod rotate 10
+               blendfunc blend
+       }
+}
+
+portals/portals_red
+{
+       surfaceparm nonsolid
+       {
+               map textures/portals/portals_red.tga
+       }
+       {
+               map $lightmap
+               blendfunc filter
+       }
+}
+
+portals/portals_blue
+{
+       surfaceparm nonsolid
+       {
+               map textures/portals/portals_blue.tga
+       }
+       {
+               map $lightmap
+               blendfunc filter
+       }
+}
+
+portals/portals_inactive
+{
+       surfaceparm nonsolid
+       {
+               map textures/portals/portals_inactive.tga
+       }
+       {
+               map $lightmap
+               blendfunc filter
+       }
+}
diff --git a/scripts/pyria.shader b/scripts/pyria.shader
new file mode 100644 (file)
index 0000000..8cc0385
--- /dev/null
@@ -0,0 +1,13 @@
+pyriahair
+{
+
+       surfaceparm trans
+       cull none
+
+       {
+               map textures/pyriahair
+               alphaFunc GE128
+               blendFunc blend
+               rgbGen identity
+       }
+}
diff --git a/scripts/shotgun.shader b/scripts/shotgun.shader
new file mode 100644 (file)
index 0000000..6bd301b
--- /dev/null
@@ -0,0 +1,10 @@
+shotgun_sight
+{
+       surfaceparm trans
+
+       {
+               map textures/shotgun_sight.tga
+               blendfunc add
+               //rgbGen vertex
+       }       
+}
diff --git a/scripts/spiderbot.shader b/scripts/spiderbot.shader
new file mode 100644 (file)
index 0000000..445fed5
--- /dev/null
@@ -0,0 +1,10 @@
+darkvisor
+{
+       qer_editorimage darkvisor.tga
+       {
+               map darkvisor.tga
+               rgbGen vertex
+               tcgen environment
+               tcmod scale 4 4
+       }       
+}
\ No newline at end of file
diff --git a/scripts/teamfx.shader b/scripts/teamfx.shader
new file mode 100644 (file)
index 0000000..8f368af
--- /dev/null
@@ -0,0 +1,120 @@
+teamfx/blobblue
+{
+surfaceparm trans
+deformVertexes autosprite
+{
+       map models/teamfx/blobblue.tga
+       blendfunc add
+}
+}
+
+teamfx/blobred
+{
+surfaceparm trans
+deformVertexes autosprite
+{
+       map models/teamfx/blobred.tga
+       blendfunc add
+}
+
+}
+
+teamfx/blobyellow
+{
+surfaceparm trans
+deformVertexes autosprite
+{
+       map models/teamfx/blobyellow.tga
+       blendfunc add
+}
+
+}
+
+teamfx/blobpink
+{
+surfaceparm trans
+deformVertexes autosprite
+{
+       map models/teamfx/blobpink.tga
+       blendfunc add
+}
+
+}
+
+teamfx/bluering
+{
+surfaceparm trans
+{
+       map models/teamfx/blobblue.tga
+       blendfunc add
+}
+}
+teamfx/redring
+{
+surfaceparm trans
+{
+       map models/teamfx/blobyellow.tga
+       blendfunc add
+}
+}
+teamfx/yellowring
+{
+surfaceparm trans
+{
+       map models/teamfx/blobpink.tga
+       blendfunc add
+}
+}
+teamfx/pinkring
+{
+surfaceparm trans
+{
+       map models/teamfx/blobpink.tga
+       blendfunc add
+}
+}
+teamfx/flare
+{
+surfaceparm trans
+deformVertexes autosprite
+{
+       map models/teamfx/flare.tga
+       blendfunc add
+}
+}
+teamfx/rayblue
+{
+surfaceparm trans
+deformVertexes autosprite
+{
+       map models/teamfx/rayblue.tga
+       blendfunc add
+}
+}
+teamfx/rayred
+{
+surfaceparm trans
+deformVertexes autosprite
+{
+       map models/teamfx/rayred.tga
+       blendfunc add
+}
+}
+teamfx/rayyellow
+{
+surfaceparm trans
+deformVertexes autosprite
+{
+       map models/teamfx/rayyellow.tga
+       blendfunc add
+}
+}
+teamfx/raypink
+{
+surfaceparm trans
+deformVertexes autosprite
+{
+       map models/teamfx/raypink.tga
+       blendfunc add
+}
+}
diff --git a/scripts/tuba.shader b/scripts/tuba.shader
new file mode 100644 (file)
index 0000000..c66a894
--- /dev/null
@@ -0,0 +1,19 @@
+tuba
+{
+       {
+               map textures/tuba
+               tcgen environment
+       }
+       {
+               map $lightmap
+       }
+}
+tuba_misc
+{
+       {
+               map textures/tuba
+       }
+       {
+               map $lightmap
+       }
+}
diff --git a/scripts/turrets.shader b/scripts/turrets.shader
new file mode 100644 (file)
index 0000000..c0d223c
--- /dev/null
@@ -0,0 +1,57 @@
+models/turrets/tesla_chrome\r
+{\r
+\r
+       qer_editorimage models/turrets/chrome.tga\r
+\r
+       //dp_reflect 0 0.75 0.75 1 0.5  \r
+       {\r
+               map models/turrets/chrome.tga   \r
+               rgbGen vertex\r
+               tcGen environment \r
+               tcMod scale 2 2\r
+               \r
+       }\r
+}\r
+\r
+models/turrets/phaser_beam\r
+{\r
+       surfaceparm trans\r
+       cull none\r
+       nopicmip\r
+\r
+       qer_editorimage models/turrets/phaser_beam\r
+       {               \r
+               map models/turrets/phaser_beam\r
+               blendFunc add\r
+       }\r
+\r
+}\r
+\r
+models/turrets/reactor_beams\r
+{\r
+       surfaceparm trans\r
+       cull none\r
+\r
+       qer_editorimage models/turrets/reactor\r
+       {               \r
+               map models/turrets/reactor\r
+               blendFunc add\r
+       }\r
+}\r
+\r
+models/turrets/r_fx1\r
+{\r
+       surfaceparm nomarks\r
+       surfaceparm trans\r
+       surfaceparm pointlight\r
+       surfaceparm nolightmap  \r
+       nopicmip\r
+       qer_editorimage models/turrets/r_fx1_1\r
+\r
+       {\r
+               animmap 10 models/turrets/r_fx1_3 models/turrets/r_fx1_4 models/turrets/r_fx1_5 models/turrets/r_fx1_4 models/turrets/r_fx1_3 models/turrets/r_fx1_2  models/turrets/r_fx1_1 models/turrets/r_fx1_2 \r
+       }\r
+\r
+}\r
+\r
+\r
diff --git a/scripts/weapons.shader b/scripts/weapons.shader
new file mode 100644 (file)
index 0000000..2ed0c9a
--- /dev/null
@@ -0,0 +1,104 @@
+electro
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/electro.tga
+               rgbgen lightingDiffuse
+       }
+}
+nexgun
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/nexgun.tga
+               rgbgen lightingDiffuse
+       }
+}
+uzi
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/uzi.tga
+               rgbgen lightingDiffuse
+       }
+}
+glauncher
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/glauncher.tga
+               rgbgen lightingDiffuse
+       }
+}
+hagar2
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/hagar2.tga
+               rgbgen lightingDiffuse
+       }
+}
+crylink
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/crylink.tga
+               rgbgen lightingDiffuse
+       }
+}
+shotgun2
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/shotgun2.tga
+               rgbgen lightingDiffuse
+       }
+}
+nex
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/nex.tga
+               rgbgen lightingDiffuse
+       }
+}
+rl
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/rl.tga
+               rgbgen lightingDiffuse
+       }
+}
+laser
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/laser.tga
+               rgbgen lightingDiffuse
+       }
+}
+hlac_accessory
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/hlac_accessory.tga
+               rgbgen lightingDiffuse
+       }
+}
+hlac_body
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/hlac_body.tga
+               rgbgen lightingDiffuse
+       }
+}
+seeker
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/seeker.tga
+               rgbgen lightingDiffuse
+       }
+}
index c1e9f70b86fbc2de1845272ab2607f699a3bc44a..50352aaae846931ea54e9aa8c3f32e2b8ae4c884 100644 (file)
@@ -15,9 +15,9 @@ skill 100
 fraglimit_override 0
 timelimit_override 3
 sv_eventlog 1
-g_nixnex 1
-g_nixnex_with_laser 1
-g_balance_nixnex_roundtime 3
+g_nix 1
+g_nix_with_laser 1
+g_balance_nix_roundtime 3
 map downer
 
 // time darkplaces/xonotic-dedicated +exec serverbench.cfg | grep ^: > serverbench.log
diff --git a/sound/weapons/fireball_fly.ogg b/sound/weapons/fireball_fly.ogg
new file mode 100644 (file)
index 0000000..05c6d37
Binary files /dev/null and b/sound/weapons/fireball_fly.ogg differ
diff --git a/sound/weapons/fireball_fly.wav b/sound/weapons/fireball_fly.wav
deleted file mode 100644 (file)
index f5f79db..0000000
Binary files a/sound/weapons/fireball_fly.wav and /dev/null differ
diff --git a/sound/weapons/fireball_fly2.ogg b/sound/weapons/fireball_fly2.ogg
new file mode 100644 (file)
index 0000000..4e7a929
Binary files /dev/null and b/sound/weapons/fireball_fly2.ogg differ
diff --git a/sound/weapons/fireball_fly2.wav b/sound/weapons/fireball_fly2.wav
deleted file mode 100644 (file)
index 5e8a1ca..0000000
Binary files a/sound/weapons/fireball_fly2.wav and /dev/null differ
diff --git a/sound/weapons/flac_fire.ogg b/sound/weapons/flac_fire.ogg
new file mode 100644 (file)
index 0000000..2904078
Binary files /dev/null and b/sound/weapons/flac_fire.ogg differ
diff --git a/sound/weapons/flacexp1.ogg b/sound/weapons/flacexp1.ogg
new file mode 100644 (file)
index 0000000..d5f6180
Binary files /dev/null and b/sound/weapons/flacexp1.ogg differ
diff --git a/sound/weapons/flacexp2.ogg b/sound/weapons/flacexp2.ogg
new file mode 100644 (file)
index 0000000..94ff7ab
Binary files /dev/null and b/sound/weapons/flacexp2.ogg differ
diff --git a/sound/weapons/flacexp3.ogg b/sound/weapons/flacexp3.ogg
new file mode 100644 (file)
index 0000000..51e9e8c
Binary files /dev/null and b/sound/weapons/flacexp3.ogg differ
diff --git a/sound/weapons/seeker_fire.ogg b/sound/weapons/seeker_fire.ogg
new file mode 100644 (file)
index 0000000..17da90c
Binary files /dev/null and b/sound/weapons/seeker_fire.ogg differ
diff --git a/sound/weapons/seekerexp1.ogg b/sound/weapons/seekerexp1.ogg
new file mode 100644 (file)
index 0000000..d5f6180
Binary files /dev/null and b/sound/weapons/seekerexp1.ogg differ
diff --git a/sound/weapons/seekerexp2.ogg b/sound/weapons/seekerexp2.ogg
new file mode 100644 (file)
index 0000000..94ff7ab
Binary files /dev/null and b/sound/weapons/seekerexp2.ogg differ
diff --git a/sound/weapons/seekerexp3.ogg b/sound/weapons/seekerexp3.ogg
new file mode 100644 (file)
index 0000000..51e9e8c
Binary files /dev/null and b/sound/weapons/seekerexp3.ogg differ
diff --git a/sound/weapons/tag_fire.ogg b/sound/weapons/tag_fire.ogg
new file mode 100644 (file)
index 0000000..2904078
Binary files /dev/null and b/sound/weapons/tag_fire.ogg differ
diff --git a/sound/weapons/tag_impact.ogg b/sound/weapons/tag_impact.ogg
new file mode 100644 (file)
index 0000000..8ea4310
Binary files /dev/null and b/sound/weapons/tag_impact.ogg differ
diff --git a/sound/weapons/tag_rocket_fly.ogg b/sound/weapons/tag_rocket_fly.ogg
new file mode 100644 (file)
index 0000000..780fd5a
Binary files /dev/null and b/sound/weapons/tag_rocket_fly.ogg differ
diff --git a/sound/weapons/tagexp1.ogg b/sound/weapons/tagexp1.ogg
new file mode 100644 (file)
index 0000000..6c61fcf
Binary files /dev/null and b/sound/weapons/tagexp1.ogg differ
diff --git a/sound/weapons/tagexp2.ogg b/sound/weapons/tagexp2.ogg
new file mode 100644 (file)
index 0000000..1386185
Binary files /dev/null and b/sound/weapons/tagexp2.ogg differ
diff --git a/sound/weapons/tagexp3.ogg b/sound/weapons/tagexp3.ogg
new file mode 100644 (file)
index 0000000..55b5f4a
Binary files /dev/null and b/sound/weapons/tagexp3.ogg differ
diff --git a/sync-extensions.sh b/sync-extensions.sh
new file mode 100755 (executable)
index 0000000..833a435
--- /dev/null
@@ -0,0 +1,5 @@
+#!/bin/sh
+
+wget -N http://svn.icculus.org/*checkout*/twilight/trunk/dpmod/qc/dpextensions.qc
+wget -N http://svn.icculus.org/*checkout*/nexuiz/trunk/data/qcsrc/server/extensions.qh
+vimdiff dpextensions.qc extensions.qh qcsrc/server/extensions.qh
diff --git a/textures/bloodyskull.jpg b/textures/bloodyskull.jpg
new file mode 100644 (file)
index 0000000..e1dd7ea
Binary files /dev/null and b/textures/bloodyskull.jpg differ
diff --git a/textures/bloodyskull_alien.tga b/textures/bloodyskull_alien.tga
new file mode 100644 (file)
index 0000000..349df24
Binary files /dev/null and b/textures/bloodyskull_alien.tga differ
diff --git a/textures/bloodyskull_alien_glow.tga b/textures/bloodyskull_alien_glow.tga
new file mode 100644 (file)
index 0000000..b7860d1
Binary files /dev/null and b/textures/bloodyskull_alien_glow.tga differ
diff --git a/textures/bloodyskull_robot.tga b/textures/bloodyskull_robot.tga
new file mode 100644 (file)
index 0000000..bbd81fc
Binary files /dev/null and b/textures/bloodyskull_robot.tga differ
diff --git a/textures/bloodyskull_robot_gloss.tga b/textures/bloodyskull_robot_gloss.tga
new file mode 100644 (file)
index 0000000..de84f51
Binary files /dev/null and b/textures/bloodyskull_robot_gloss.tga differ
diff --git a/textures/bloodyskull_robot_glow.tga b/textures/bloodyskull_robot_glow.tga
new file mode 100644 (file)
index 0000000..f489167
Binary files /dev/null and b/textures/bloodyskull_robot_glow.tga differ
diff --git a/textures/campingrifle.tga b/textures/campingrifle.tga
new file mode 100644 (file)
index 0000000..b707d7f
Binary files /dev/null and b/textures/campingrifle.tga differ
diff --git a/textures/campingrifle_bump.tga b/textures/campingrifle_bump.tga
new file mode 100644 (file)
index 0000000..b319739
Binary files /dev/null and b/textures/campingrifle_bump.tga differ
diff --git a/textures/campingrifle_gloss.tga b/textures/campingrifle_gloss.tga
new file mode 100644 (file)
index 0000000..0e0156e
Binary files /dev/null and b/textures/campingrifle_gloss.tga differ
diff --git a/textures/campingrifle_glow.tga b/textures/campingrifle_glow.tga
new file mode 100644 (file)
index 0000000..b7a33d9
Binary files /dev/null and b/textures/campingrifle_glow.tga differ
diff --git a/textures/campingrifle_pants.tga b/textures/campingrifle_pants.tga
new file mode 100644 (file)
index 0000000..633d3dd
Binary files /dev/null and b/textures/campingrifle_pants.tga differ
diff --git a/textures/campingrifle_screen.tga b/textures/campingrifle_screen.tga
new file mode 100644 (file)
index 0000000..5ffda6f
Binary files /dev/null and b/textures/campingrifle_screen.tga differ
diff --git a/textures/campingrifle_shirt.tga b/textures/campingrifle_shirt.tga
new file mode 100644 (file)
index 0000000..8944408
Binary files /dev/null and b/textures/campingrifle_shirt.tga differ
diff --git a/textures/cellammoskin.jpg b/textures/cellammoskin.jpg
new file mode 100644 (file)
index 0000000..116ba9d
Binary files /dev/null and b/textures/cellammoskin.jpg differ
diff --git a/textures/cellammoskin_glow.jpg b/textures/cellammoskin_glow.jpg
new file mode 100644 (file)
index 0000000..274913c
Binary files /dev/null and b/textures/cellammoskin_glow.jpg differ
diff --git a/textures/cleanskull.jpg b/textures/cleanskull.jpg
new file mode 100644 (file)
index 0000000..58ffd0b
Binary files /dev/null and b/textures/cleanskull.jpg differ
diff --git a/textures/cockpit.tga b/textures/cockpit.tga
new file mode 100644 (file)
index 0000000..c49e302
Binary files /dev/null and b/textures/cockpit.tga differ
diff --git a/textures/cockpit_glow.tga b/textures/cockpit_glow.tga
new file mode 100644 (file)
index 0000000..1a2ee22
Binary files /dev/null and b/textures/cockpit_glow.tga differ
diff --git a/textures/cp.tga b/textures/cp.tga
new file mode 100644 (file)
index 0000000..045030c
Binary files /dev/null and b/textures/cp.tga differ
diff --git a/textures/cp_gloss.tga b/textures/cp_gloss.tga
new file mode 100644 (file)
index 0000000..2269afd
Binary files /dev/null and b/textures/cp_gloss.tga differ
diff --git a/textures/cp_glow.tga b/textures/cp_glow.tga
new file mode 100644 (file)
index 0000000..e32c84e
Binary files /dev/null and b/textures/cp_glow.tga differ
diff --git a/textures/cp_norm.tga b/textures/cp_norm.tga
new file mode 100644 (file)
index 0000000..cd7bf36
Binary files /dev/null and b/textures/cp_norm.tga differ
diff --git a/textures/crylink.tga b/textures/crylink.tga
new file mode 100644 (file)
index 0000000..f67d646
Binary files /dev/null and b/textures/crylink.tga differ
diff --git a/textures/crylink_bump.tga b/textures/crylink_bump.tga
new file mode 100644 (file)
index 0000000..bae1984
Binary files /dev/null and b/textures/crylink_bump.tga differ
diff --git a/textures/crylink_gloss.tga b/textures/crylink_gloss.tga
new file mode 100644 (file)
index 0000000..9701686
Binary files /dev/null and b/textures/crylink_gloss.tga differ
diff --git a/textures/crylink_glow.jpg b/textures/crylink_glow.jpg
new file mode 100644 (file)
index 0000000..e73aaaa
Binary files /dev/null and b/textures/crylink_glow.jpg differ
diff --git a/textures/crylink_pants.tga b/textures/crylink_pants.tga
new file mode 100644 (file)
index 0000000..cc53e76
Binary files /dev/null and b/textures/crylink_pants.tga differ
diff --git a/textures/crylink_reflect.tga b/textures/crylink_reflect.tga
new file mode 100644 (file)
index 0000000..5c5109e
Binary files /dev/null and b/textures/crylink_reflect.tga differ
diff --git a/textures/crylink_shirt.tga b/textures/crylink_shirt.tga
new file mode 100644 (file)
index 0000000..ae10ecc
Binary files /dev/null and b/textures/crylink_shirt.tga differ
diff --git a/textures/darkvisor.tga b/textures/darkvisor.tga
new file mode 100644 (file)
index 0000000..dcf484d
Binary files /dev/null and b/textures/darkvisor.tga differ
diff --git a/textures/electro.tga b/textures/electro.tga
new file mode 100644 (file)
index 0000000..d6f1f8b
Binary files /dev/null and b/textures/electro.tga differ
diff --git a/textures/electro_gloss.tga b/textures/electro_gloss.tga
new file mode 100644 (file)
index 0000000..d5f2592
Binary files /dev/null and b/textures/electro_gloss.tga differ
diff --git a/textures/electro_glow.tga b/textures/electro_glow.tga
new file mode 100644 (file)
index 0000000..085f0b0
Binary files /dev/null and b/textures/electro_glow.tga differ
diff --git a/textures/electro_norm.tga b/textures/electro_norm.tga
new file mode 100644 (file)
index 0000000..54718a6
Binary files /dev/null and b/textures/electro_norm.tga differ
diff --git a/textures/electro_pants.tga b/textures/electro_pants.tga
new file mode 100644 (file)
index 0000000..9454d81
Binary files /dev/null and b/textures/electro_pants.tga differ
diff --git a/textures/electro_plasma.tga b/textures/electro_plasma.tga
new file mode 100644 (file)
index 0000000..f57bc18
Binary files /dev/null and b/textures/electro_plasma.tga differ
diff --git a/textures/electro_plasma_glow.tga b/textures/electro_plasma_glow.tga
new file mode 100644 (file)
index 0000000..f57bc18
Binary files /dev/null and b/textures/electro_plasma_glow.tga differ
diff --git a/textures/electro_plasma_hull.tga b/textures/electro_plasma_hull.tga
new file mode 100644 (file)
index 0000000..96a82fc
Binary files /dev/null and b/textures/electro_plasma_hull.tga differ
diff --git a/textures/electro_reflect.tga b/textures/electro_reflect.tga
new file mode 100644 (file)
index 0000000..95cc2ba
Binary files /dev/null and b/textures/electro_reflect.tga differ
diff --git a/textures/eye.jpg b/textures/eye.jpg
new file mode 100644 (file)
index 0000000..a79afab
Binary files /dev/null and b/textures/eye.jpg differ
diff --git a/textures/eyeblood.jpg b/textures/eyeblood.jpg
new file mode 100644 (file)
index 0000000..a2ad7a1
Binary files /dev/null and b/textures/eyeblood.jpg differ
diff --git a/textures/fireball.tga b/textures/fireball.tga
new file mode 100644 (file)
index 0000000..53b47a1
Binary files /dev/null and b/textures/fireball.tga differ
diff --git a/textures/fireball_gloss.tga b/textures/fireball_gloss.tga
new file mode 100644 (file)
index 0000000..8cd8b25
Binary files /dev/null and b/textures/fireball_gloss.tga differ
diff --git a/textures/fireball_glow.tga b/textures/fireball_glow.tga
new file mode 100644 (file)
index 0000000..c949f92
Binary files /dev/null and b/textures/fireball_glow.tga differ
diff --git a/textures/flesh1.tga b/textures/flesh1.tga
new file mode 100644 (file)
index 0000000..675e8de
Binary files /dev/null and b/textures/flesh1.tga differ
diff --git a/textures/gak.tga b/textures/gak.tga
new file mode 100644 (file)
index 0000000..7a6075f
Binary files /dev/null and b/textures/gak.tga differ
diff --git a/textures/gak_gloss.tga b/textures/gak_gloss.tga
new file mode 100644 (file)
index 0000000..43f9d42
Binary files /dev/null and b/textures/gak_gloss.tga differ
diff --git a/textures/gak_norm.tga b/textures/gak_norm.tga
new file mode 100644 (file)
index 0000000..0df3a07
Binary files /dev/null and b/textures/gak_norm.tga differ
diff --git a/textures/gak_shirt.tga b/textures/gak_shirt.tga
new file mode 100644 (file)
index 0000000..4f9d053
Binary files /dev/null and b/textures/gak_shirt.tga differ
diff --git a/textures/gakarmor.tga b/textures/gakarmor.tga
new file mode 100644 (file)
index 0000000..b570c01
Binary files /dev/null and b/textures/gakarmor.tga differ
diff --git a/textures/gakarmor_gloss.tga b/textures/gakarmor_gloss.tga
new file mode 100644 (file)
index 0000000..137f0e5
Binary files /dev/null and b/textures/gakarmor_gloss.tga differ
diff --git a/textures/gakarmor_norm.tga b/textures/gakarmor_norm.tga
new file mode 100644 (file)
index 0000000..910c453
Binary files /dev/null and b/textures/gakarmor_norm.tga differ
diff --git a/textures/gakarmor_pants.tga b/textures/gakarmor_pants.tga
new file mode 100644 (file)
index 0000000..3bfa2f8
Binary files /dev/null and b/textures/gakarmor_pants.tga differ
diff --git a/textures/gakarmor_shirt.tga b/textures/gakarmor_shirt.tga
new file mode 100644 (file)
index 0000000..ce4b6d6
Binary files /dev/null and b/textures/gakarmor_shirt.tga differ
diff --git a/textures/generator.tga b/textures/generator.tga
new file mode 100644 (file)
index 0000000..f6a6abc
Binary files /dev/null and b/textures/generator.tga differ
diff --git a/textures/generator_destroyed.tga b/textures/generator_destroyed.tga
new file mode 100644 (file)
index 0000000..538be06
Binary files /dev/null and b/textures/generator_destroyed.tga differ
diff --git a/textures/generator_gloss.tga b/textures/generator_gloss.tga
new file mode 100644 (file)
index 0000000..89252c3
Binary files /dev/null and b/textures/generator_gloss.tga differ
diff --git a/textures/generator_glow.tga b/textures/generator_glow.tga
new file mode 100644 (file)
index 0000000..67168bc
Binary files /dev/null and b/textures/generator_glow.tga differ
diff --git a/textures/generator_lightning.tga b/textures/generator_lightning.tga
new file mode 100644 (file)
index 0000000..7d7dc50
Binary files /dev/null and b/textures/generator_lightning.tga differ
diff --git a/textures/generator_lightning2.tga b/textures/generator_lightning2.tga
new file mode 100644 (file)
index 0000000..87a4659
Binary files /dev/null and b/textures/generator_lightning2.tga differ
diff --git a/textures/generator_norm.tga b/textures/generator_norm.tga
new file mode 100644 (file)
index 0000000..35d5b69
Binary files /dev/null and b/textures/generator_norm.tga differ
diff --git a/textures/generator_pants.tga b/textures/generator_pants.tga
new file mode 100644 (file)
index 0000000..7a0f517
Binary files /dev/null and b/textures/generator_pants.tga differ
diff --git a/textures/generator_shield.tga b/textures/generator_shield.tga
new file mode 100644 (file)
index 0000000..47086ba
Binary files /dev/null and b/textures/generator_shield.tga differ
diff --git a/textures/gib1.tga b/textures/gib1.tga
new file mode 100644 (file)
index 0000000..11dacc1
Binary files /dev/null and b/textures/gib1.tga differ
diff --git a/textures/gib2.jpg b/textures/gib2.jpg
new file mode 100644 (file)
index 0000000..66078a9
Binary files /dev/null and b/textures/gib2.jpg differ
diff --git a/textures/gib2_norm.tga b/textures/gib2_norm.tga
new file mode 100644 (file)
index 0000000..6143d92
Binary files /dev/null and b/textures/gib2_norm.tga differ
diff --git a/textures/gib2_spec.tga b/textures/gib2_spec.tga
new file mode 100644 (file)
index 0000000..1e83337
Binary files /dev/null and b/textures/gib2_spec.tga differ
diff --git a/textures/gib3.jpg b/textures/gib3.jpg
new file mode 100644 (file)
index 0000000..8be0793
Binary files /dev/null and b/textures/gib3.jpg differ
diff --git a/textures/gib3_norm.tga b/textures/gib3_norm.tga
new file mode 100644 (file)
index 0000000..a63ebe1
Binary files /dev/null and b/textures/gib3_norm.tga differ
diff --git a/textures/gib3_spec.tga b/textures/gib3_spec.tga
new file mode 100644 (file)
index 0000000..1e81d9a
Binary files /dev/null and b/textures/gib3_spec.tga differ
diff --git a/textures/gib4.jpg b/textures/gib4.jpg
new file mode 100644 (file)
index 0000000..3b2d397
Binary files /dev/null and b/textures/gib4.jpg differ
diff --git a/textures/gib4_norm.tga b/textures/gib4_norm.tga
new file mode 100644 (file)
index 0000000..46abb4c
Binary files /dev/null and b/textures/gib4_norm.tga differ
diff --git a/textures/gib4_spec.tga b/textures/gib4_spec.tga
new file mode 100644 (file)
index 0000000..899b220
Binary files /dev/null and b/textures/gib4_spec.tga differ
diff --git a/textures/glauncher.tga b/textures/glauncher.tga
new file mode 100644 (file)
index 0000000..a68b0fe
Binary files /dev/null and b/textures/glauncher.tga differ
diff --git a/textures/glauncher_gloss.tga b/textures/glauncher_gloss.tga
new file mode 100644 (file)
index 0000000..5d9abed
Binary files /dev/null and b/textures/glauncher_gloss.tga differ
diff --git a/textures/glauncher_norm.tga b/textures/glauncher_norm.tga
new file mode 100644 (file)
index 0000000..d8131da
Binary files /dev/null and b/textures/glauncher_norm.tga differ
diff --git a/textures/glauncher_pants.tga b/textures/glauncher_pants.tga
new file mode 100644 (file)
index 0000000..f750e1d
Binary files /dev/null and b/textures/glauncher_pants.tga differ
diff --git a/textures/glauncher_reflect.tga b/textures/glauncher_reflect.tga
new file mode 100644 (file)
index 0000000..fbe2c81
Binary files /dev/null and b/textures/glauncher_reflect.tga differ
diff --git a/textures/glauncher_shirt.tga b/textures/glauncher_shirt.tga
new file mode 100644 (file)
index 0000000..bb8be51
Binary files /dev/null and b/textures/glauncher_shirt.tga differ
diff --git a/textures/glscope.tga b/textures/glscope.tga
new file mode 100644 (file)
index 0000000..f582ce6
Binary files /dev/null and b/textures/glscope.tga differ
diff --git a/textures/glscope_glow.tga b/textures/glscope_glow.tga
new file mode 100644 (file)
index 0000000..f582ce6
Binary files /dev/null and b/textures/glscope_glow.tga differ
diff --git a/textures/grenademodelskin.jpg b/textures/grenademodelskin.jpg
new file mode 100644 (file)
index 0000000..110df25
Binary files /dev/null and b/textures/grenademodelskin.jpg differ
diff --git a/textures/grenademodelskin_glow.jpg b/textures/grenademodelskin_glow.jpg
new file mode 100644 (file)
index 0000000..b26e87d
Binary files /dev/null and b/textures/grenademodelskin_glow.jpg differ
diff --git a/textures/hagar2.tga b/textures/hagar2.tga
new file mode 100644 (file)
index 0000000..1a87879
Binary files /dev/null and b/textures/hagar2.tga differ
diff --git a/textures/hagar2_gloss.tga b/textures/hagar2_gloss.tga
new file mode 100644 (file)
index 0000000..7b7d86d
Binary files /dev/null and b/textures/hagar2_gloss.tga differ
diff --git a/textures/hagar2_glow.tga b/textures/hagar2_glow.tga
new file mode 100644 (file)
index 0000000..48f29bf
Binary files /dev/null and b/textures/hagar2_glow.tga differ
diff --git a/textures/hagar2_norm.tga b/textures/hagar2_norm.tga
new file mode 100644 (file)
index 0000000..27178fd
Binary files /dev/null and b/textures/hagar2_norm.tga differ
diff --git a/textures/hagar2_pants.tga b/textures/hagar2_pants.tga
new file mode 100644 (file)
index 0000000..44e4bec
Binary files /dev/null and b/textures/hagar2_pants.tga differ
diff --git a/textures/hagar2_reflect.tga b/textures/hagar2_reflect.tga
new file mode 100644 (file)
index 0000000..1381edc
Binary files /dev/null and b/textures/hagar2_reflect.tga differ
diff --git a/textures/hagar2_shirt.tga b/textures/hagar2_shirt.tga
new file mode 100644 (file)
index 0000000..b6700dd
Binary files /dev/null and b/textures/hagar2_shirt.tga differ
diff --git a/textures/hlac_accessory.tga b/textures/hlac_accessory.tga
new file mode 100644 (file)
index 0000000..9fe31cc
Binary files /dev/null and b/textures/hlac_accessory.tga differ
diff --git a/textures/hlac_accessory_gloss.tga b/textures/hlac_accessory_gloss.tga
new file mode 100644 (file)
index 0000000..225efdc
Binary files /dev/null and b/textures/hlac_accessory_gloss.tga differ
diff --git a/textures/hlac_accessory_norm.tga b/textures/hlac_accessory_norm.tga
new file mode 100644 (file)
index 0000000..c9601a0
Binary files /dev/null and b/textures/hlac_accessory_norm.tga differ
diff --git a/textures/hlac_accessory_pants.tga b/textures/hlac_accessory_pants.tga
new file mode 100644 (file)
index 0000000..23516cc
Binary files /dev/null and b/textures/hlac_accessory_pants.tga differ
diff --git a/textures/hlac_accessory_reflect.tga b/textures/hlac_accessory_reflect.tga
new file mode 100644 (file)
index 0000000..e245ac7
Binary files /dev/null and b/textures/hlac_accessory_reflect.tga differ
diff --git a/textures/hlac_accessory_shirt.tga b/textures/hlac_accessory_shirt.tga
new file mode 100644 (file)
index 0000000..0bfdefd
Binary files /dev/null and b/textures/hlac_accessory_shirt.tga differ
diff --git a/textures/hlac_body.tga b/textures/hlac_body.tga
new file mode 100644 (file)
index 0000000..49d17bb
Binary files /dev/null and b/textures/hlac_body.tga differ
diff --git a/textures/hlac_body_gloss.tga b/textures/hlac_body_gloss.tga
new file mode 100644 (file)
index 0000000..b362c1d
Binary files /dev/null and b/textures/hlac_body_gloss.tga differ
diff --git a/textures/hlac_body_glow.tga b/textures/hlac_body_glow.tga
new file mode 100644 (file)
index 0000000..fffafab
Binary files /dev/null and b/textures/hlac_body_glow.tga differ
diff --git a/textures/hlac_body_norm.tga b/textures/hlac_body_norm.tga
new file mode 100644 (file)
index 0000000..5387a5d
Binary files /dev/null and b/textures/hlac_body_norm.tga differ
diff --git a/textures/hlac_body_pants.tga b/textures/hlac_body_pants.tga
new file mode 100644 (file)
index 0000000..b9ff4f1
Binary files /dev/null and b/textures/hlac_body_pants.tga differ
diff --git a/textures/hlac_body_reflect.tga b/textures/hlac_body_reflect.tga
new file mode 100644 (file)
index 0000000..eba8b2d
Binary files /dev/null and b/textures/hlac_body_reflect.tga differ
diff --git a/textures/hlac_body_shirt.tga b/textures/hlac_body_shirt.tga
new file mode 100644 (file)
index 0000000..637c977
Binary files /dev/null and b/textures/hlac_body_shirt.tga differ
diff --git a/textures/hlac_metal.tga b/textures/hlac_metal.tga
new file mode 100644 (file)
index 0000000..5842c4f
Binary files /dev/null and b/textures/hlac_metal.tga differ
diff --git a/textures/hlac_metal_glow.tga b/textures/hlac_metal_glow.tga
new file mode 100644 (file)
index 0000000..3a6abf5
Binary files /dev/null and b/textures/hlac_metal_glow.tga differ
diff --git a/textures/hook.tga b/textures/hook.tga
new file mode 100644 (file)
index 0000000..33c3d3a
Binary files /dev/null and b/textures/hook.tga differ
diff --git a/textures/hook_gloss.tga b/textures/hook_gloss.tga
new file mode 100644 (file)
index 0000000..abed439
Binary files /dev/null and b/textures/hook_gloss.tga differ
diff --git a/textures/hook_glow.tga b/textures/hook_glow.tga
new file mode 100644 (file)
index 0000000..463689a
Binary files /dev/null and b/textures/hook_glow.tga differ
diff --git a/textures/hook_norm.tga b/textures/hook_norm.tga
new file mode 100644 (file)
index 0000000..e12e7e8
Binary files /dev/null and b/textures/hook_norm.tga differ
diff --git a/textures/hookgun.tga b/textures/hookgun.tga
new file mode 100644 (file)
index 0000000..5e4f8f2
Binary files /dev/null and b/textures/hookgun.tga differ
diff --git a/textures/hookgun_gloss.tga b/textures/hookgun_gloss.tga
new file mode 100644 (file)
index 0000000..ba1b5ed
Binary files /dev/null and b/textures/hookgun_gloss.tga differ
diff --git a/textures/hookgun_norm.tga b/textures/hookgun_norm.tga
new file mode 100644 (file)
index 0000000..33ec9de
Binary files /dev/null and b/textures/hookgun_norm.tga differ
diff --git a/textures/hookgun_pants.tga b/textures/hookgun_pants.tga
new file mode 100644 (file)
index 0000000..4091e9d
Binary files /dev/null and b/textures/hookgun_pants.tga differ
diff --git a/textures/ignis.tga b/textures/ignis.tga
new file mode 100644 (file)
index 0000000..768ac88
Binary files /dev/null and b/textures/ignis.tga differ
diff --git a/textures/ignis_gloss.tga b/textures/ignis_gloss.tga
new file mode 100644 (file)
index 0000000..ec7185d
Binary files /dev/null and b/textures/ignis_gloss.tga differ
diff --git a/textures/ignis_glow.tga b/textures/ignis_glow.tga
new file mode 100644 (file)
index 0000000..c9eee49
Binary files /dev/null and b/textures/ignis_glow.tga differ
diff --git a/textures/ignis_norm.tga b/textures/ignis_norm.tga
new file mode 100644 (file)
index 0000000..fd7695e
Binary files /dev/null and b/textures/ignis_norm.tga differ
diff --git a/textures/ignis_shirt.tga b/textures/ignis_shirt.tga
new file mode 100644 (file)
index 0000000..0a2f7fa
Binary files /dev/null and b/textures/ignis_shirt.tga differ
diff --git a/textures/ignishead.tga b/textures/ignishead.tga
new file mode 100644 (file)
index 0000000..096b943
Binary files /dev/null and b/textures/ignishead.tga differ
diff --git a/textures/ignishead_gloss.tga b/textures/ignishead_gloss.tga
new file mode 100644 (file)
index 0000000..37bf376
Binary files /dev/null and b/textures/ignishead_gloss.tga differ
diff --git a/textures/ignishead_glow.tga b/textures/ignishead_glow.tga
new file mode 100644 (file)
index 0000000..d23f731
Binary files /dev/null and b/textures/ignishead_glow.tga differ
diff --git a/textures/ignishead_norm.tga b/textures/ignishead_norm.tga
new file mode 100644 (file)
index 0000000..ec4b095
Binary files /dev/null and b/textures/ignishead_norm.tga differ
diff --git a/textures/ignishead_shirt.tga b/textures/ignishead_shirt.tga
new file mode 100644 (file)
index 0000000..209b298
Binary files /dev/null and b/textures/ignishead_shirt.tga differ
diff --git a/textures/invincible.jpg b/textures/invincible.jpg
new file mode 100644 (file)
index 0000000..443b728
Binary files /dev/null and b/textures/invincible.jpg differ
diff --git a/textures/invincible_glow.jpg b/textures/invincible_glow.jpg
new file mode 100644 (file)
index 0000000..443b728
Binary files /dev/null and b/textures/invincible_glow.jpg differ
diff --git a/textures/items/a_bullets.jpg b/textures/items/a_bullets.jpg
new file mode 100644 (file)
index 0000000..8a99c05
Binary files /dev/null and b/textures/items/a_bullets.jpg differ
diff --git a/textures/items/a_rocket_box.jpg b/textures/items/a_rocket_box.jpg
new file mode 100644 (file)
index 0000000..a29505b
Binary files /dev/null and b/textures/items/a_rocket_box.jpg differ
diff --git a/textures/items/a_rocket_gre.jpg b/textures/items/a_rocket_gre.jpg
new file mode 100644 (file)
index 0000000..66fbc3c
Binary files /dev/null and b/textures/items/a_rocket_gre.jpg differ
diff --git a/textures/items/a_rocket_gre_glow.jpg b/textures/items/a_rocket_gre_glow.jpg
new file mode 100644 (file)
index 0000000..b26e87d
Binary files /dev/null and b/textures/items/a_rocket_gre_glow.jpg differ
diff --git a/textures/items/a_rocket_roc.jpg b/textures/items/a_rocket_roc.jpg
new file mode 100644 (file)
index 0000000..300b2b9
Binary files /dev/null and b/textures/items/a_rocket_roc.jpg differ
diff --git a/textures/items/a_rocket_roc_gloss.jpg b/textures/items/a_rocket_roc_gloss.jpg
new file mode 100644 (file)
index 0000000..0e6f937
Binary files /dev/null and b/textures/items/a_rocket_roc_gloss.jpg differ
diff --git a/textures/items/a_rocket_roc_glow.jpg b/textures/items/a_rocket_roc_glow.jpg
new file mode 100644 (file)
index 0000000..2bb921a
Binary files /dev/null and b/textures/items/a_rocket_roc_glow.jpg differ
diff --git a/textures/items/a_rocket_roc_norm.jpg b/textures/items/a_rocket_roc_norm.jpg
new file mode 100644 (file)
index 0000000..8073764
Binary files /dev/null and b/textures/items/a_rocket_roc_norm.jpg differ
diff --git a/textures/items/a_rocket_tag.jpg b/textures/items/a_rocket_tag.jpg
new file mode 100644 (file)
index 0000000..1314605
Binary files /dev/null and b/textures/items/a_rocket_tag.jpg differ
diff --git a/textures/laser.tga b/textures/laser.tga
new file mode 100644 (file)
index 0000000..d651d38
Binary files /dev/null and b/textures/laser.tga differ
diff --git a/textures/laser_bump.tga b/textures/laser_bump.tga
new file mode 100644 (file)
index 0000000..2180e6e
Binary files /dev/null and b/textures/laser_bump.tga differ
diff --git a/textures/laser_gloss.tga b/textures/laser_gloss.tga
new file mode 100644 (file)
index 0000000..fc54840
Binary files /dev/null and b/textures/laser_gloss.tga differ
diff --git a/textures/laser_glow.tga b/textures/laser_glow.tga
new file mode 100644 (file)
index 0000000..9e7eb10
Binary files /dev/null and b/textures/laser_glow.tga differ
diff --git a/textures/laser_pants.tga b/textures/laser_pants.tga
new file mode 100644 (file)
index 0000000..4566bc0
Binary files /dev/null and b/textures/laser_pants.tga differ
diff --git a/textures/laser_shirt.tga b/textures/laser_shirt.tga
new file mode 100644 (file)
index 0000000..279c0e7
Binary files /dev/null and b/textures/laser_shirt.tga differ
diff --git a/textures/meat.tga b/textures/meat.tga
new file mode 100644 (file)
index 0000000..e9a74e2
Binary files /dev/null and b/textures/meat.tga differ
diff --git a/textures/meat_alien.tga b/textures/meat_alien.tga
new file mode 100644 (file)
index 0000000..52c5246
Binary files /dev/null and b/textures/meat_alien.tga differ
diff --git a/textures/meat_alien_gloss.tga b/textures/meat_alien_gloss.tga
new file mode 100644 (file)
index 0000000..b76a8a0
Binary files /dev/null and b/textures/meat_alien_gloss.tga differ
diff --git a/textures/meat_alien_glow.tga b/textures/meat_alien_glow.tga
new file mode 100644 (file)
index 0000000..e63a91c
Binary files /dev/null and b/textures/meat_alien_glow.tga differ
diff --git a/textures/meat_alien_norm.tga b/textures/meat_alien_norm.tga
new file mode 100644 (file)
index 0000000..218c99a
Binary files /dev/null and b/textures/meat_alien_norm.tga differ
diff --git a/textures/meat_gloss.tga b/textures/meat_gloss.tga
new file mode 100644 (file)
index 0000000..916b538
Binary files /dev/null and b/textures/meat_gloss.tga differ
diff --git a/textures/meat_norm.tga b/textures/meat_norm.tga
new file mode 100644 (file)
index 0000000..75b0f8b
Binary files /dev/null and b/textures/meat_norm.tga differ
diff --git a/textures/meat_robot.tga b/textures/meat_robot.tga
new file mode 100644 (file)
index 0000000..838f75d
Binary files /dev/null and b/textures/meat_robot.tga differ
diff --git a/textures/meat_robot_gloss.tga b/textures/meat_robot_gloss.tga
new file mode 100644 (file)
index 0000000..ae10c6f
Binary files /dev/null and b/textures/meat_robot_gloss.tga differ
diff --git a/textures/meat_robot_glow.tga b/textures/meat_robot_glow.tga
new file mode 100644 (file)
index 0000000..86ee684
Binary files /dev/null and b/textures/meat_robot_glow.tga differ
diff --git a/textures/meat_robot_norm.tga b/textures/meat_robot_norm.tga
new file mode 100644 (file)
index 0000000..ff8ebfa
Binary files /dev/null and b/textures/meat_robot_norm.tga differ
diff --git a/textures/muzzle1.tga b/textures/muzzle1.tga
new file mode 100644 (file)
index 0000000..13614a8
Binary files /dev/null and b/textures/muzzle1.tga differ
diff --git a/textures/muzzle2.tga b/textures/muzzle2.tga
new file mode 100644 (file)
index 0000000..8a27b90
Binary files /dev/null and b/textures/muzzle2.tga differ
diff --git a/textures/nex.tga b/textures/nex.tga
new file mode 100644 (file)
index 0000000..1fdc59a
Binary files /dev/null and b/textures/nex.tga differ
diff --git a/textures/nex_bump.tga b/textures/nex_bump.tga
new file mode 100644 (file)
index 0000000..b833a51
Binary files /dev/null and b/textures/nex_bump.tga differ
diff --git a/textures/nex_gloss.tga b/textures/nex_gloss.tga
new file mode 100644 (file)
index 0000000..8bfd691
Binary files /dev/null and b/textures/nex_gloss.tga differ
diff --git a/textures/nex_glow.tga b/textures/nex_glow.tga
new file mode 100644 (file)
index 0000000..915001c
Binary files /dev/null and b/textures/nex_glow.tga differ
diff --git a/textures/nex_pants.tga b/textures/nex_pants.tga
new file mode 100644 (file)
index 0000000..6fc3833
Binary files /dev/null and b/textures/nex_pants.tga differ
diff --git a/textures/nex_reflect.tga b/textures/nex_reflect.tga
new file mode 100644 (file)
index 0000000..c44e7be
Binary files /dev/null and b/textures/nex_reflect.tga differ
diff --git a/textures/nex_shirt.tga b/textures/nex_shirt.tga
new file mode 100644 (file)
index 0000000..7cd8f52
Binary files /dev/null and b/textures/nex_shirt.tga differ
diff --git a/textures/nexflash.tga b/textures/nexflash.tga
new file mode 100644 (file)
index 0000000..c3a704e
Binary files /dev/null and b/textures/nexflash.tga differ
diff --git a/textures/nexgun.tga b/textures/nexgun.tga
new file mode 100644 (file)
index 0000000..9a0a9e1
Binary files /dev/null and b/textures/nexgun.tga differ
diff --git a/textures/nexgun_gloss.tga b/textures/nexgun_gloss.tga
new file mode 100644 (file)
index 0000000..6e634fa
Binary files /dev/null and b/textures/nexgun_gloss.tga differ
diff --git a/textures/nexgun_glow.tga b/textures/nexgun_glow.tga
new file mode 100644 (file)
index 0000000..162895f
Binary files /dev/null and b/textures/nexgun_glow.tga differ
diff --git a/textures/nexgun_norm.tga b/textures/nexgun_norm.tga
new file mode 100644 (file)
index 0000000..29fc33b
Binary files /dev/null and b/textures/nexgun_norm.tga differ
diff --git a/textures/nexgun_pants.tga b/textures/nexgun_pants.tga
new file mode 100644 (file)
index 0000000..c23cc0c
Binary files /dev/null and b/textures/nexgun_pants.tga differ
diff --git a/textures/nexgun_reflect.tga b/textures/nexgun_reflect.tga
new file mode 100644 (file)
index 0000000..86a5dfb
Binary files /dev/null and b/textures/nexgun_reflect.tga differ
diff --git a/textures/nexgun_shirt.tga b/textures/nexgun_shirt.tga
new file mode 100644 (file)
index 0000000..ca2681a
Binary files /dev/null and b/textures/nexgun_shirt.tga differ
diff --git a/textures/nutsandbolts1.tga b/textures/nutsandbolts1.tga
new file mode 100644 (file)
index 0000000..307167c
Binary files /dev/null and b/textures/nutsandbolts1.tga differ
diff --git a/textures/nutsandbolts1_gloss.tga b/textures/nutsandbolts1_gloss.tga
new file mode 100644 (file)
index 0000000..88d94e6
Binary files /dev/null and b/textures/nutsandbolts1_gloss.tga differ
diff --git a/textures/nutsandbolts3.tga b/textures/nutsandbolts3.tga
new file mode 100644 (file)
index 0000000..2a08c42
Binary files /dev/null and b/textures/nutsandbolts3.tga differ
diff --git a/textures/nutsandbolts3_gloss.tga b/textures/nutsandbolts3_gloss.tga
new file mode 100644 (file)
index 0000000..02f2210
Binary files /dev/null and b/textures/nutsandbolts3_gloss.tga differ
diff --git a/textures/nutsandbolts4.tga b/textures/nutsandbolts4.tga
new file mode 100644 (file)
index 0000000..92a1861
Binary files /dev/null and b/textures/nutsandbolts4.tga differ
diff --git a/textures/nutsandbolts4_gloss.tga b/textures/nutsandbolts4_gloss.tga
new file mode 100644 (file)
index 0000000..41a907e
Binary files /dev/null and b/textures/nutsandbolts4_gloss.tga differ
diff --git a/textures/nutsandbolts5.tga b/textures/nutsandbolts5.tga
new file mode 100644 (file)
index 0000000..174bf6f
Binary files /dev/null and b/textures/nutsandbolts5.tga differ
diff --git a/textures/nutsandbolts5_gloss.tga b/textures/nutsandbolts5_gloss.tga
new file mode 100644 (file)
index 0000000..14483f6
Binary files /dev/null and b/textures/nutsandbolts5_gloss.tga differ
diff --git a/textures/ons_boom1.tga b/textures/ons_boom1.tga
new file mode 100644 (file)
index 0000000..bb12722
Binary files /dev/null and b/textures/ons_boom1.tga differ
diff --git a/textures/ons_gengib.tga b/textures/ons_gengib.tga
new file mode 100644 (file)
index 0000000..906f4d6
Binary files /dev/null and b/textures/ons_gengib.tga differ
diff --git a/textures/ons_icon.tga b/textures/ons_icon.tga
new file mode 100644 (file)
index 0000000..e2097e1
Binary files /dev/null and b/textures/ons_icon.tga differ
diff --git a/textures/ons_icon_gloss.tga b/textures/ons_icon_gloss.tga
new file mode 100644 (file)
index 0000000..b96d369
Binary files /dev/null and b/textures/ons_icon_gloss.tga differ
diff --git a/textures/ons_icon_glow.tga b/textures/ons_icon_glow.tga
new file mode 100644 (file)
index 0000000..5a2c3a9
Binary files /dev/null and b/textures/ons_icon_glow.tga differ
diff --git a/textures/ons_icon_norm.tga b/textures/ons_icon_norm.tga
new file mode 100644 (file)
index 0000000..ca7456b
Binary files /dev/null and b/textures/ons_icon_norm.tga differ
diff --git a/textures/ons_icon_pants.tga b/textures/ons_icon_pants.tga
new file mode 100644 (file)
index 0000000..22729c9
Binary files /dev/null and b/textures/ons_icon_pants.tga differ
diff --git a/textures/ons_icon_thrust.tga b/textures/ons_icon_thrust.tga
new file mode 100644 (file)
index 0000000..7bb6358
Binary files /dev/null and b/textures/ons_icon_thrust.tga differ
diff --git a/textures/ons_icon_thrust_glow.tga b/textures/ons_icon_thrust_glow.tga
new file mode 100644 (file)
index 0000000..52dcce0
Binary files /dev/null and b/textures/ons_icon_thrust_glow.tga differ
diff --git a/textures/ons_pad.tga b/textures/ons_pad.tga
new file mode 100644 (file)
index 0000000..ba99035
Binary files /dev/null and b/textures/ons_pad.tga differ
diff --git a/textures/ons_pad_gloss.tga b/textures/ons_pad_gloss.tga
new file mode 100644 (file)
index 0000000..42b9273
Binary files /dev/null and b/textures/ons_pad_gloss.tga differ
diff --git a/textures/ons_pad_glow.tga b/textures/ons_pad_glow.tga
new file mode 100644 (file)
index 0000000..d527f53
Binary files /dev/null and b/textures/ons_pad_glow.tga differ
diff --git a/textures/ons_pad_norm.tga b/textures/ons_pad_norm.tga
new file mode 100644 (file)
index 0000000..bf9dc41
Binary files /dev/null and b/textures/ons_pad_norm.tga differ
diff --git a/textures/ons_pad_pants.tga b/textures/ons_pad_pants.tga
new file mode 100644 (file)
index 0000000..ef9feac
Binary files /dev/null and b/textures/ons_pad_pants.tga differ
diff --git a/textures/ons_pad_screen.tga b/textures/ons_pad_screen.tga
new file mode 100644 (file)
index 0000000..e1e2a9b
Binary files /dev/null and b/textures/ons_pad_screen.tga differ
diff --git a/textures/ons_ray.tga b/textures/ons_ray.tga
new file mode 100644 (file)
index 0000000..6389c79
Binary files /dev/null and b/textures/ons_ray.tga differ
diff --git a/textures/ons_shield.tga b/textures/ons_shield.tga
new file mode 100644 (file)
index 0000000..62dc6a4
Binary files /dev/null and b/textures/ons_shield.tga differ
diff --git a/textures/ons_shockwave1.tga b/textures/ons_shockwave1.tga
new file mode 100644 (file)
index 0000000..860abaa
Binary files /dev/null and b/textures/ons_shockwave1.tga differ
diff --git a/textures/ons_shockwave2.tga b/textures/ons_shockwave2.tga
new file mode 100644 (file)
index 0000000..1725603
Binary files /dev/null and b/textures/ons_shockwave2.tga differ
diff --git a/textures/ons_smoke1.tga b/textures/ons_smoke1.tga
new file mode 100644 (file)
index 0000000..57649c8
Binary files /dev/null and b/textures/ons_smoke1.tga differ
diff --git a/textures/ons_text.tga b/textures/ons_text.tga
new file mode 100644 (file)
index 0000000..d8b9d2a
Binary files /dev/null and b/textures/ons_text.tga differ
diff --git a/textures/ons_text_glow.tga b/textures/ons_text_glow.tga
new file mode 100644 (file)
index 0000000..d8b9d2a
Binary files /dev/null and b/textures/ons_text_glow.tga differ
diff --git a/textures/pickups.tga b/textures/pickups.tga
new file mode 100644 (file)
index 0000000..ed4e34a
Binary files /dev/null and b/textures/pickups.tga differ
diff --git a/textures/pickups_bump.tga b/textures/pickups_bump.tga
new file mode 100644 (file)
index 0000000..0442d39
Binary files /dev/null and b/textures/pickups_bump.tga differ
diff --git a/textures/pickups_gloss.tga b/textures/pickups_gloss.tga
new file mode 100644 (file)
index 0000000..16d73c2
Binary files /dev/null and b/textures/pickups_gloss.tga differ
diff --git a/textures/pickups_glow.tga b/textures/pickups_glow.tga
new file mode 100644 (file)
index 0000000..c9e6f71
Binary files /dev/null and b/textures/pickups_glow.tga differ
diff --git a/textures/portalgun.tga b/textures/portalgun.tga
new file mode 100644 (file)
index 0000000..420bf15
Binary files /dev/null and b/textures/portalgun.tga differ
diff --git a/textures/portalgun_gloss.tga b/textures/portalgun_gloss.tga
new file mode 100644 (file)
index 0000000..a3fd5ff
Binary files /dev/null and b/textures/portalgun_gloss.tga differ
diff --git a/textures/portalgun_glow.tga b/textures/portalgun_glow.tga
new file mode 100644 (file)
index 0000000..1719b05
Binary files /dev/null and b/textures/portalgun_glow.tga differ
diff --git a/textures/portalgun_norm.tga b/textures/portalgun_norm.tga
new file mode 100644 (file)
index 0000000..1f15a94
Binary files /dev/null and b/textures/portalgun_norm.tga differ
diff --git a/textures/portals/portals_blue.tga b/textures/portals/portals_blue.tga
new file mode 100644 (file)
index 0000000..239f2d0
Binary files /dev/null and b/textures/portals/portals_blue.tga differ
diff --git a/textures/portals/portals_blue_gloss.tga b/textures/portals/portals_blue_gloss.tga
new file mode 100644 (file)
index 0000000..f321527
Binary files /dev/null and b/textures/portals/portals_blue_gloss.tga differ
diff --git a/textures/portals/portals_blue_glow.tga b/textures/portals/portals_blue_glow.tga
new file mode 100644 (file)
index 0000000..71ef5c2
Binary files /dev/null and b/textures/portals/portals_blue_glow.tga differ
diff --git a/textures/portals/portals_blue_norm.tga b/textures/portals/portals_blue_norm.tga
new file mode 100644 (file)
index 0000000..4484921
Binary files /dev/null and b/textures/portals/portals_blue_norm.tga differ
diff --git a/textures/portals/portals_blue_vortex.tga b/textures/portals/portals_blue_vortex.tga
new file mode 100644 (file)
index 0000000..1edd53f
Binary files /dev/null and b/textures/portals/portals_blue_vortex.tga differ
diff --git a/textures/portals/portals_inactive.tga b/textures/portals/portals_inactive.tga
new file mode 100644 (file)
index 0000000..a873416
Binary files /dev/null and b/textures/portals/portals_inactive.tga differ
diff --git a/textures/portals/portals_inactive_vortex.tga b/textures/portals/portals_inactive_vortex.tga
new file mode 100644 (file)
index 0000000..7cdc799
Binary files /dev/null and b/textures/portals/portals_inactive_vortex.tga differ
diff --git a/textures/portals/portals_red.tga b/textures/portals/portals_red.tga
new file mode 100644 (file)
index 0000000..ae9d1a3
Binary files /dev/null and b/textures/portals/portals_red.tga differ
diff --git a/textures/portals/portals_red_gloss.tga b/textures/portals/portals_red_gloss.tga
new file mode 100644 (file)
index 0000000..d2baef6
Binary files /dev/null and b/textures/portals/portals_red_gloss.tga differ
diff --git a/textures/portals/portals_red_glow.tga b/textures/portals/portals_red_glow.tga
new file mode 100644 (file)
index 0000000..ee42694
Binary files /dev/null and b/textures/portals/portals_red_glow.tga differ
diff --git a/textures/portals/portals_red_norm.tga b/textures/portals/portals_red_norm.tga
new file mode 100644 (file)
index 0000000..743a267
Binary files /dev/null and b/textures/portals/portals_red_norm.tga differ
diff --git a/textures/portals/portals_red_vortex.tga b/textures/portals/portals_red_vortex.tga
new file mode 100644 (file)
index 0000000..bc6cb86
Binary files /dev/null and b/textures/portals/portals_red_vortex.tga differ
diff --git a/textures/pyria.tga b/textures/pyria.tga
new file mode 100644 (file)
index 0000000..b659f62
Binary files /dev/null and b/textures/pyria.tga differ
diff --git a/textures/pyria_gloss.jpg b/textures/pyria_gloss.jpg
new file mode 100644 (file)
index 0000000..8cd77a7
Binary files /dev/null and b/textures/pyria_gloss.jpg differ
diff --git a/textures/pyria_glow.jpg b/textures/pyria_glow.jpg
new file mode 100644 (file)
index 0000000..952dfd9
Binary files /dev/null and b/textures/pyria_glow.jpg differ
diff --git a/textures/pyria_glow.tga b/textures/pyria_glow.tga
new file mode 100644 (file)
index 0000000..b1161db
Binary files /dev/null and b/textures/pyria_glow.tga differ
diff --git a/textures/pyria_norm.tga b/textures/pyria_norm.tga
new file mode 100644 (file)
index 0000000..4301faa
Binary files /dev/null and b/textures/pyria_norm.tga differ
diff --git a/textures/pyria_pants.tga b/textures/pyria_pants.tga
new file mode 100644 (file)
index 0000000..0b6a69c
Binary files /dev/null and b/textures/pyria_pants.tga differ
diff --git a/textures/pyria_shirt.tga b/textures/pyria_shirt.tga
new file mode 100644 (file)
index 0000000..ff448ab
Binary files /dev/null and b/textures/pyria_shirt.tga differ
diff --git a/textures/pyriahair.jpg b/textures/pyriahair.jpg
new file mode 100644 (file)
index 0000000..cc300fb
Binary files /dev/null and b/textures/pyriahair.jpg differ
diff --git a/textures/pyriahair_alpha.jpg b/textures/pyriahair_alpha.jpg
new file mode 100644 (file)
index 0000000..ebef9f0
Binary files /dev/null and b/textures/pyriahair_alpha.jpg differ
diff --git a/textures/pyriahair_gloss.jpg b/textures/pyriahair_gloss.jpg
new file mode 100644 (file)
index 0000000..7d70f23
Binary files /dev/null and b/textures/pyriahair_gloss.jpg differ
diff --git a/textures/pyriahair_norm.jpg b/textures/pyriahair_norm.jpg
new file mode 100644 (file)
index 0000000..e95c171
Binary files /dev/null and b/textures/pyriahair_norm.jpg differ
diff --git a/textures/raptor.jpg b/textures/raptor.jpg
new file mode 100644 (file)
index 0000000..8a1cdce
Binary files /dev/null and b/textures/raptor.jpg differ
diff --git a/textures/raptor_bump.jpg b/textures/raptor_bump.jpg
new file mode 100644 (file)
index 0000000..fe07efb
Binary files /dev/null and b/textures/raptor_bump.jpg differ
diff --git a/textures/raptor_cockpit.jpg b/textures/raptor_cockpit.jpg
new file mode 100644 (file)
index 0000000..fd999b5
Binary files /dev/null and b/textures/raptor_cockpit.jpg differ
diff --git a/textures/raptor_gloss.jpg b/textures/raptor_gloss.jpg
new file mode 100644 (file)
index 0000000..71ee4d4
Binary files /dev/null and b/textures/raptor_gloss.jpg differ
diff --git a/textures/raptor_pants.jpg b/textures/raptor_pants.jpg
new file mode 100644 (file)
index 0000000..5cfa32a
Binary files /dev/null and b/textures/raptor_pants.jpg differ
diff --git a/textures/raptor_shirt.jpg b/textures/raptor_shirt.jpg
new file mode 100644 (file)
index 0000000..e5bae42
Binary files /dev/null and b/textures/raptor_shirt.jpg differ
diff --git a/textures/reptile.tga b/textures/reptile.tga
new file mode 100644 (file)
index 0000000..2090bb1
Binary files /dev/null and b/textures/reptile.tga differ
diff --git a/textures/reptile_bump.tga b/textures/reptile_bump.tga
new file mode 100644 (file)
index 0000000..27c5754
Binary files /dev/null and b/textures/reptile_bump.tga differ
diff --git a/textures/reptile_gloss.tga b/textures/reptile_gloss.tga
new file mode 100644 (file)
index 0000000..9647cde
Binary files /dev/null and b/textures/reptile_gloss.tga differ
diff --git a/textures/reptile_glow.tga b/textures/reptile_glow.tga
new file mode 100644 (file)
index 0000000..15b3071
Binary files /dev/null and b/textures/reptile_glow.tga differ
diff --git a/textures/reptile_pants.tga b/textures/reptile_pants.tga
new file mode 100644 (file)
index 0000000..a7d8359
Binary files /dev/null and b/textures/reptile_pants.tga differ
diff --git a/textures/reptile_shirt.tga b/textures/reptile_shirt.tga
new file mode 100644 (file)
index 0000000..0e3023f
Binary files /dev/null and b/textures/reptile_shirt.tga differ
diff --git a/textures/rl.tga b/textures/rl.tga
new file mode 100644 (file)
index 0000000..67fdf6b
Binary files /dev/null and b/textures/rl.tga differ
diff --git a/textures/rl2.tga b/textures/rl2.tga
new file mode 100644 (file)
index 0000000..56e5b14
Binary files /dev/null and b/textures/rl2.tga differ
diff --git a/textures/rl2_gloss.tga b/textures/rl2_gloss.tga
new file mode 100644 (file)
index 0000000..f2a212d
Binary files /dev/null and b/textures/rl2_gloss.tga differ
diff --git a/textures/rl2_glow.tga b/textures/rl2_glow.tga
new file mode 100644 (file)
index 0000000..fdcb393
Binary files /dev/null and b/textures/rl2_glow.tga differ
diff --git a/textures/rl2_norm.tga b/textures/rl2_norm.tga
new file mode 100644 (file)
index 0000000..afea25c
Binary files /dev/null and b/textures/rl2_norm.tga differ
diff --git a/textures/rl_gloss.jpg b/textures/rl_gloss.jpg
new file mode 100644 (file)
index 0000000..269fb58
Binary files /dev/null and b/textures/rl_gloss.jpg differ
diff --git a/textures/rl_norm.tga b/textures/rl_norm.tga
new file mode 100644 (file)
index 0000000..cdb53f8
Binary files /dev/null and b/textures/rl_norm.tga differ
diff --git a/textures/rl_pants.tga b/textures/rl_pants.tga
new file mode 100644 (file)
index 0000000..9f7cd2e
Binary files /dev/null and b/textures/rl_pants.tga differ
diff --git a/textures/rl_reflect.tga b/textures/rl_reflect.tga
new file mode 100644 (file)
index 0000000..3f5ee49
Binary files /dev/null and b/textures/rl_reflect.tga differ
diff --git a/textures/rl_shirt.tga b/textures/rl_shirt.tga
new file mode 100644 (file)
index 0000000..9735bcf
Binary files /dev/null and b/textures/rl_shirt.tga differ
diff --git a/textures/sb_shield.tga b/textures/sb_shield.tga
new file mode 100644 (file)
index 0000000..ded8440
Binary files /dev/null and b/textures/sb_shield.tga differ
diff --git a/textures/seeker.tga b/textures/seeker.tga
new file mode 100644 (file)
index 0000000..e275817
Binary files /dev/null and b/textures/seeker.tga differ
diff --git a/textures/seeker_gloss.tga b/textures/seeker_gloss.tga
new file mode 100644 (file)
index 0000000..38069b4
Binary files /dev/null and b/textures/seeker_gloss.tga differ
diff --git a/textures/seeker_glow.tga b/textures/seeker_glow.tga
new file mode 100644 (file)
index 0000000..84acdbc
Binary files /dev/null and b/textures/seeker_glow.tga differ
diff --git a/textures/seeker_norm.tga b/textures/seeker_norm.tga
new file mode 100644 (file)
index 0000000..3f799c9
Binary files /dev/null and b/textures/seeker_norm.tga differ
diff --git a/textures/seeker_pants.tga b/textures/seeker_pants.tga
new file mode 100644 (file)
index 0000000..471fe0c
Binary files /dev/null and b/textures/seeker_pants.tga differ
diff --git a/textures/shellsammo.tga b/textures/shellsammo.tga
new file mode 100644 (file)
index 0000000..26e0855
Binary files /dev/null and b/textures/shellsammo.tga differ
diff --git a/textures/shellsammo_gloss.tga b/textures/shellsammo_gloss.tga
new file mode 100644 (file)
index 0000000..5419b6a
Binary files /dev/null and b/textures/shellsammo_gloss.tga differ
diff --git a/textures/shellsammo_norm.tga b/textures/shellsammo_norm.tga
new file mode 100644 (file)
index 0000000..83b1e82
Binary files /dev/null and b/textures/shellsammo_norm.tga differ
diff --git a/textures/shotgun2.tga b/textures/shotgun2.tga
new file mode 100644 (file)
index 0000000..55e561a
Binary files /dev/null and b/textures/shotgun2.tga differ
diff --git a/textures/shotgun2_gloss.tga b/textures/shotgun2_gloss.tga
new file mode 100644 (file)
index 0000000..ef85807
Binary files /dev/null and b/textures/shotgun2_gloss.tga differ
diff --git a/textures/shotgun2_glow.tga b/textures/shotgun2_glow.tga
new file mode 100644 (file)
index 0000000..16f6b00
Binary files /dev/null and b/textures/shotgun2_glow.tga differ
diff --git a/textures/shotgun2_norm.tga b/textures/shotgun2_norm.tga
new file mode 100644 (file)
index 0000000..cff6611
Binary files /dev/null and b/textures/shotgun2_norm.tga differ
diff --git a/textures/shotgun2_shirt.tga b/textures/shotgun2_shirt.tga
new file mode 100644 (file)
index 0000000..ea9a7d8
Binary files /dev/null and b/textures/shotgun2_shirt.tga differ
diff --git a/textures/shotgun_sight.tga b/textures/shotgun_sight.tga
new file mode 100644 (file)
index 0000000..bc74918
Binary files /dev/null and b/textures/shotgun_sight.tga differ
diff --git a/textures/spawn.jpg b/textures/spawn.jpg
new file mode 100644 (file)
index 0000000..a0bbef9
Binary files /dev/null and b/textures/spawn.jpg differ
diff --git a/textures/spiderbot.tga b/textures/spiderbot.tga
new file mode 100644 (file)
index 0000000..1c4f306
Binary files /dev/null and b/textures/spiderbot.tga differ
diff --git a/textures/spiderbot_gloss.tga b/textures/spiderbot_gloss.tga
new file mode 100644 (file)
index 0000000..fd84dd4
Binary files /dev/null and b/textures/spiderbot_gloss.tga differ
diff --git a/textures/spiderbot_glow.tga b/textures/spiderbot_glow.tga
new file mode 100644 (file)
index 0000000..71331ee
Binary files /dev/null and b/textures/spiderbot_glow.tga differ
diff --git a/textures/spiderbot_norm.tga b/textures/spiderbot_norm.tga
new file mode 100644 (file)
index 0000000..8778c0d
Binary files /dev/null and b/textures/spiderbot_norm.tga differ
diff --git a/textures/spiderbot_pants.tga b/textures/spiderbot_pants.tga
new file mode 100644 (file)
index 0000000..fe05ec7
Binary files /dev/null and b/textures/spiderbot_pants.tga differ
diff --git a/textures/strength.jpg b/textures/strength.jpg
new file mode 100644 (file)
index 0000000..ec1d1dd
Binary files /dev/null and b/textures/strength.jpg differ
diff --git a/textures/strength_glow.jpg b/textures/strength_glow.jpg
new file mode 100644 (file)
index 0000000..ec1d1dd
Binary files /dev/null and b/textures/strength_glow.jpg differ
diff --git a/textures/thrust.tga b/textures/thrust.tga
new file mode 100644 (file)
index 0000000..16f86a1
Binary files /dev/null and b/textures/thrust.tga differ
diff --git a/textures/thrust_glow.tga b/textures/thrust_glow.tga
new file mode 100644 (file)
index 0000000..16f86a1
Binary files /dev/null and b/textures/thrust_glow.tga differ
diff --git a/textures/thrustc1.tga b/textures/thrustc1.tga
new file mode 100644 (file)
index 0000000..2b80f57
Binary files /dev/null and b/textures/thrustc1.tga differ
diff --git a/textures/tuba.tga b/textures/tuba.tga
new file mode 100644 (file)
index 0000000..7dc5ebb
Binary files /dev/null and b/textures/tuba.tga differ
diff --git a/textures/tuba_gloss.tga b/textures/tuba_gloss.tga
new file mode 100644 (file)
index 0000000..061f784
Binary files /dev/null and b/textures/tuba_gloss.tga differ
diff --git a/textures/tuba_glow.tga b/textures/tuba_glow.tga
new file mode 100644 (file)
index 0000000..fca1e65
Binary files /dev/null and b/textures/tuba_glow.tga differ
diff --git a/textures/umbra.tga b/textures/umbra.tga
new file mode 100644 (file)
index 0000000..390882a
Binary files /dev/null and b/textures/umbra.tga differ
diff --git a/textures/umbra_gloss.jpg b/textures/umbra_gloss.jpg
new file mode 100644 (file)
index 0000000..116ebbd
Binary files /dev/null and b/textures/umbra_gloss.jpg differ
diff --git a/textures/umbra_glow.jpg b/textures/umbra_glow.jpg
new file mode 100644 (file)
index 0000000..f18553a
Binary files /dev/null and b/textures/umbra_glow.jpg differ
diff --git a/textures/umbra_norm.tga b/textures/umbra_norm.tga
new file mode 100644 (file)
index 0000000..d5f9d8b
Binary files /dev/null and b/textures/umbra_norm.tga differ
diff --git a/textures/umbra_pants.tga b/textures/umbra_pants.tga
new file mode 100644 (file)
index 0000000..754f78a
Binary files /dev/null and b/textures/umbra_pants.tga differ
diff --git a/textures/umbra_shirt.tga b/textures/umbra_shirt.tga
new file mode 100644 (file)
index 0000000..d2fdc31
Binary files /dev/null and b/textures/umbra_shirt.tga differ
diff --git a/textures/uzi.tga b/textures/uzi.tga
new file mode 100644 (file)
index 0000000..ecd2637
Binary files /dev/null and b/textures/uzi.tga differ
diff --git a/textures/uzi_gloss.tga b/textures/uzi_gloss.tga
new file mode 100644 (file)
index 0000000..8a40baf
Binary files /dev/null and b/textures/uzi_gloss.tga differ
diff --git a/textures/uzi_glow.tga b/textures/uzi_glow.tga
new file mode 100644 (file)
index 0000000..de6d9db
Binary files /dev/null and b/textures/uzi_glow.tga differ
diff --git a/textures/uzi_norm.tga b/textures/uzi_norm.tga
new file mode 100644 (file)
index 0000000..5744908
Binary files /dev/null and b/textures/uzi_norm.tga differ
diff --git a/textures/uzi_pants.tga b/textures/uzi_pants.tga
new file mode 100644 (file)
index 0000000..82d1ca2
Binary files /dev/null and b/textures/uzi_pants.tga differ
diff --git a/textures/uzi_reflect.tga b/textures/uzi_reflect.tga
new file mode 100644 (file)
index 0000000..f4d246d
Binary files /dev/null and b/textures/uzi_reflect.tga differ
diff --git a/textures/uzi_shirt.tga b/textures/uzi_shirt.tga
new file mode 100644 (file)
index 0000000..4123247
Binary files /dev/null and b/textures/uzi_shirt.tga differ
diff --git a/textures/uziflash.jpg b/textures/uziflash.jpg
new file mode 100644 (file)
index 0000000..e2664a5
Binary files /dev/null and b/textures/uziflash.jpg differ
diff --git a/textures/wakazachi.tga b/textures/wakazachi.tga
new file mode 100644 (file)
index 0000000..89ac632
Binary files /dev/null and b/textures/wakazachi.tga differ
diff --git a/textures/wakazachi_gloss.tga b/textures/wakazachi_gloss.tga
new file mode 100644 (file)
index 0000000..ff916a6
Binary files /dev/null and b/textures/wakazachi_gloss.tga differ
diff --git a/textures/wakazachi_norm.tga b/textures/wakazachi_norm.tga
new file mode 100644 (file)
index 0000000..2208aec
Binary files /dev/null and b/textures/wakazachi_norm.tga differ
diff --git a/textures/wakazachi_pants.tga b/textures/wakazachi_pants.tga
new file mode 100644 (file)
index 0000000..51d0fc1
Binary files /dev/null and b/textures/wakazachi_pants.tga differ
index 25ec3c09c7635e83c2f78d3080061d7635b584a5..801314a6d82121f00f33e0766e0e4dd2ef78d2a8 100755 (executable)
@@ -1,6 +1,6 @@
 #!/bin/sh
 
-balance_cfgs="balance25.cfg balanceSamual.cfg balanceNexrun.cfg"
+balance_cfgs="balance25.cfg balanceSamual.cfg balanceXPM.cfg"
 
 countw=`awk '/^seta? g_/ { print $2; }' balance.cfg       | sort -u | tr -d '\r' | md5sum | cut -c 1-32`
 for b in $balance_cfgs; do
index c455c484dbd8baf60965ae21e8b69c4451a6392c..cdf28d72977e9a59810075d176a78b7154e6938b 100644 (file)
@@ -1,13 +1,10 @@
-**Team Leaders:
+(THIS FILE IS A HUGE TODO)
+(YES, REALLY, NOTHING HERE IS TRUE)
+(PLEASE FIX THIS FILE)
 
-Lee Vermeulen
-*Project Founder and Co-Designer
 
-Forest "LordHavoc" Hale
-*Lead Programmer and Co-Designer
+**Team Leaders:
 
-Rudolf "div0" Polzer
-*Programmer
 
 
 **Project maintainers:
@@ -19,6 +16,9 @@ Maik "SavageX" Merten
 
 **Development Team:
 
+Rudolf "div0" Polzer
+*Programmer
+
 Andreas "Black" Kirsch
 *Programmer
 
@@ -118,6 +118,9 @@ Gerd "Elysis" Raudenbusch
 Marius "GreEn`mArine" Shekow
 *Programmer
 
+Forest "LordHavoc" Hale
+*DarkPlaces Engine Programmer
+
 Braden "meoblast001" Walters
 *Music
 
@@ -169,6 +172,7 @@ Jitspoe
 Jody Gallagher
 Juergen "LowDragon" Timm
 Lee David Ash
+Lee Vermeulen
 Mathieu "Elric" Olivier
 Mephisto
 MirceaKitsune