]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into terencehill/scoreboard_fineadjustments
authorterencehill <piuntn@gmail.com>
Mon, 27 Jun 2011 16:31:10 +0000 (18:31 +0200)
committerterencehill <piuntn@gmail.com>
Mon, 27 Jun 2011 16:31:10 +0000 (18:31 +0200)
296 files changed:
csprogs.dat.de.po
defaultXonotic.cfg
effectinfo.txt
effects-high.cfg
effects-low.cfg
effects-med.cfg
effects-normal.cfg
effects-omg.cfg
effects-ultimate.cfg
effects-ultra.cfg
gfx/loading.tga
gfx/loading10.tga
gfx/loading11.tga
gfx/loading12.tga
gfx/loading13.tga [new file with mode: 0644]
gfx/loading2.tga
gfx/loading3.tga
gfx/loading4.tga
gfx/loading5.tga
gfx/loading6.tga
gfx/loading7.tga
gfx/loading8.tga
gfx/loading9.tga
gfx/vehicles/axh-bracket.tga [new file with mode: 0644]
gfx/vehicles/axh-cross.tga [new file with mode: 0644]
gfx/vehicles/axh-dropcross.tga [new file with mode: 0644]
gfx/vehicles/axh-ring.tga [new file with mode: 0644]
gfx/vehicles/axh-special1.tga [new file with mode: 0644]
gfx/vehicles/axh-special2.tga [new file with mode: 0644]
gfx/vehicles/axh-tag.tga [new file with mode: 0644]
gfx/vehicles/axh-target.tga [new file with mode: 0644]
gfx/vehicles/axh-x.tga [new file with mode: 0644]
gfx/vehicles/bar_dwn_left.tga [new file with mode: 0644]
gfx/vehicles/bar_dwn_right.tga [new file with mode: 0644]
gfx/vehicles/bar_up_left.tga [new file with mode: 0644]
gfx/vehicles/bar_up_right.tga [new file with mode: 0644]
gfx/vehicles/bullets.tga [new file with mode: 0644]
gfx/vehicles/frame.tga [new file with mode: 0644]
gfx/vehicles/health.tga [new file with mode: 0644]
gfx/vehicles/hud_bg.tga [deleted file]
gfx/vehicles/raptor.tga [new file with mode: 0644]
gfx/vehicles/raptor_bombs.tga [new file with mode: 0644]
gfx/vehicles/raptor_guns.tga [new file with mode: 0644]
gfx/vehicles/rocket.tga [new file with mode: 0644]
gfx/vehicles/shield.tga [new file with mode: 0644]
gfx/vehicles/shiled.tga [deleted file]
gfx/vehicles/vh-shield.tga [new file with mode: 0644]
input-demoseeking.cfg
menu.dat.de.po
models/player/erebus.iqm
models/player/erebus.iqm.framegroups
models/player/erebus_lod1.iqm
models/player/erebus_lod1.iqm.framegroups
models/player/erebus_lod2.iqm
models/player/erebus_lod2.iqm.framegroups
models/player/gak.iqm
models/player/gak.iqm.framegroups
models/player/gak_lod1.iqm
models/player/gak_lod1.iqm.framegroups
models/player/gak_lod2.iqm
models/player/gak_lod2.iqm.framegroups
models/player/gakarmored.iqm
models/player/gakarmored.iqm.framegroups
models/player/gakarmored_lod1.iqm
models/player/gakarmored_lod1.iqm.framegroups
models/player/gakarmored_lod2.iqm
models/player/gakarmored_lod2.iqm.framegroups
models/player/gakmasked.iqm
models/player/gakmasked.iqm.framegroups
models/player/gakmasked_lod1.iqm
models/player/gakmasked_lod1.iqm.framegroups
models/player/gakmasked_lod2.iqm
models/player/gakmasked_lod2.iqm.framegroups
models/player/ignis.iqm
models/player/ignis.iqm.framegroups
models/player/ignis_lod1.iqm
models/player/ignis_lod1.iqm.framegroups
models/player/ignis_lod2.iqm
models/player/ignis_lod2.iqm.framegroups
models/player/ignishalfmasked.iqm
models/player/ignishalfmasked.iqm.framegroups
models/player/ignishalfmasked_lod1.iqm
models/player/ignishalfmasked_lod1.iqm.framegroups
models/player/ignishalfmasked_lod2.iqm
models/player/ignishalfmasked_lod2.iqm.framegroups
models/player/ignismasked.iqm
models/player/ignismasked.iqm.framegroups
models/player/ignismasked_lod1.iqm
models/player/ignismasked_lod1.iqm.framegroups
models/player/ignismasked_lod2.iqm
models/player/ignismasked_lod2.iqm.framegroups
models/player/megaerebus.iqm
models/player/megaerebus.iqm.framegroups
models/player/megaerebus_lod1.iqm
models/player/megaerebus_lod1.iqm.framegroups
models/player/megaerebus_lod1.iqm_0.skin [new file with mode: 0644]
models/player/megaerebus_lod2.iqm
models/player/megaerebus_lod2.iqm.framegroups
models/player/megaerebus_lod2.iqm_0.skin [new file with mode: 0644]
models/player/nyx.iqm
models/player/nyx.iqm.framegroups
models/player/nyx_lod1.iqm
models/player/nyx_lod1.iqm.framegroups
models/player/nyx_lod2.iqm
models/player/nyx_lod2.iqm.framegroups
models/player/pyria.iqm
models/player/pyria.iqm.framegroups
models/player/pyria_lod1.iqm
models/player/pyria_lod1.iqm.framegroups
models/player/pyria_lod2.iqm
models/player/pyria_lod2.iqm.framegroups
models/player/seraphina.iqm
models/player/seraphina.iqm.framegroups
models/player/seraphina_lod1.iqm
models/player/seraphina_lod1.iqm.framegroups
models/player/seraphina_lod2.iqm
models/player/seraphina_lod2.iqm.framegroups
models/player/seraphinamasked.iqm
models/player/seraphinamasked.iqm.framegroups
models/player/seraphinamasked_lod1.iqm
models/player/seraphinamasked_lod1.iqm.framegroups
models/player/seraphinamasked_lod2.iqm
models/player/seraphinamasked_lod2.iqm.framegroups
models/player/umbra.iqm
models/player/umbra.iqm.framegroups
models/player/umbra_lod1.iqm
models/player/umbra_lod1.iqm.framegroups
models/player/umbra_lod2.iqm
models/player/umbra_lod2.iqm.framegroups
models/sprites/vehicle_frame0.tga [new file with mode: 0644]
models/sprites/vehicle_frame1.tga [new file with mode: 0644]
models/vehicles/bomblet.md3 [new file with mode: 0644]
models/vehicles/bumblebee.tga [new file with mode: 0644]
models/vehicles/bumblebee_body.dpm [new file with mode: 0644]
models/vehicles/bumblebee_gloss.tga [new file with mode: 0644]
models/vehicles/bumblebee_glow.tga [new file with mode: 0644]
models/vehicles/bumblebee_norm.tga [new file with mode: 0644]
models/vehicles/bumblebee_pants.tga [new file with mode: 0644]
models/vehicles/bumblebee_plasma_left.dpm [new file with mode: 0644]
models/vehicles/bumblebee_plasma_right.dpm [new file with mode: 0644]
models/vehicles/bumblebee_ray.dpm [new file with mode: 0644]
models/vehicles/clusterbomb.md3 [new file with mode: 0644]
models/vehicles/clusterbomb_folded.md3 [new file with mode: 0644]
models/vehicles/clusterbomb_fragment.md3 [new file with mode: 0644]
models/vehicles/raptor.dpm
models/vehicles/raptor_body.dpm [new file with mode: 0644]
models/vehicles/raptor_cockpit.dpm
models/vehicles/rocket01.md3 [new file with mode: 0644]
models/vehicles/rocket02.md3 [new file with mode: 0644]
models/vehicles/rockets.tga [new file with mode: 0644]
models/vehicles/rockets_gloss.tga [new file with mode: 0644]
models/vehicles/rockets_glow.tga [new file with mode: 0644]
models/vehicles/rockets_reflect.tga [new file with mode: 0644]
models/vehicles/spiderbot.dpm
models/vehicles/spiderbot.dpm.framegroups
models/vehicles/spiderbot_cockpit.dpm
models/vehicles/spiderbot_top.dpm
models/vehicles/spinner.dpm
models/vehicles/tracer.md3 [new file with mode: 0644]
models/vehicles/tracercore.tga [new file with mode: 0644]
models/vehicles/tracertrail.tga [new file with mode: 0644]
models/vehicles/tracertrail_glow.tga [new file with mode: 0644]
physicsX.cfg
qcsrc/client/Main.qc
qcsrc/client/View.qc
qcsrc/client/autocvars.qh
qcsrc/client/casings.qc
qcsrc/client/csqc_constants.qc
qcsrc/client/damage.qc
qcsrc/client/hud.qc
qcsrc/client/main.qh
qcsrc/client/progs.src
qcsrc/client/projectile.qc
qcsrc/client/tturrets.qc [new file with mode: 0644]
qcsrc/client/tturrets.qh [new file with mode: 0644]
qcsrc/client/vehicles/racer.qc [new file with mode: 0644]
qcsrc/client/vehicles/raptor.qc [new file with mode: 0644]
qcsrc/client/vehicles/spiderbot.qc [new file with mode: 0644]
qcsrc/client/vehicles/vehicles.qc [new file with mode: 0644]
qcsrc/client/vehicles/vehicles.qh [new file with mode: 0644]
qcsrc/client/waypointsprites.qc
qcsrc/common/constants.qh
qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c
qcsrc/menu/xonotic/dialog_settings_effects.c
qcsrc/qc-client.cbp
qcsrc/server/assault.qc
qcsrc/server/autocvars.qh
qcsrc/server/bot/aim.qc
qcsrc/server/bot/havocbot/havocbot.qc
qcsrc/server/bot/havocbot/role_freezetag.qc [new file with mode: 0644]
qcsrc/server/bot/havocbot/role_keepaway.qc [new file with mode: 0644]
qcsrc/server/bot/havocbot/roles.qc
qcsrc/server/cl_client.qc
qcsrc/server/cl_impulse.qc
qcsrc/server/cl_player.qc
qcsrc/server/cl_weaponsystem.qc
qcsrc/server/ctf.qc
qcsrc/server/defs.qh
qcsrc/server/domination.qc
qcsrc/server/g_damage.qc
qcsrc/server/g_hook.qc
qcsrc/server/miscfunctions.qc
qcsrc/server/mode_onslaught.qc
qcsrc/server/movelib.qc
qcsrc/server/mutators/gamemode_freezetag.qc
qcsrc/server/mutators/gamemode_keepaway.qc
qcsrc/server/mutators/gamemode_keyhunt.qc
qcsrc/server/nexball.qc
qcsrc/server/portals.qc
qcsrc/server/progs.src
qcsrc/server/race.qc
qcsrc/server/steerlib.qc
qcsrc/server/t_items.qc
qcsrc/server/t_teleporters.qc
qcsrc/server/tturrets/include/turrets_early.qh
qcsrc/server/tturrets/system/system_damage.qc
qcsrc/server/tturrets/system/system_main.qc
qcsrc/server/tturrets/system/system_misc.qc
qcsrc/server/tturrets/system/system_scoreprocs.qc
qcsrc/server/tturrets/units/unit_checkpoint.qc
qcsrc/server/tturrets/units/unit_ewheel.qc
qcsrc/server/tturrets/units/unit_flac.qc
qcsrc/server/tturrets/units/unit_fusionreactor.qc
qcsrc/server/tturrets/units/unit_hellion.qc
qcsrc/server/tturrets/units/unit_hk.qc
qcsrc/server/tturrets/units/unit_machinegun.qc
qcsrc/server/tturrets/units/unit_mlrs.qc
qcsrc/server/tturrets/units/unit_phaser.qc
qcsrc/server/tturrets/units/unit_plasma.qc
qcsrc/server/tturrets/units/unit_tessla.qc
qcsrc/server/tturrets/units/unit_walker.qc
qcsrc/server/vehicles/bumblebee.qc [new file with mode: 0644]
qcsrc/server/vehicles/collision.qc [new file with mode: 0644]
qcsrc/server/vehicles/network.qc [new file with mode: 0644]
qcsrc/server/vehicles/racer.qc
qcsrc/server/vehicles/raptor.qc
qcsrc/server/vehicles/spiderbot.qc
qcsrc/server/vehicles/vehicles.qc
qcsrc/server/vehicles/vehicles.qh
qcsrc/server/vehicles/vehicles_def.qh [new file with mode: 0644]
qcsrc/server/w_common.qc
qcsrc/server/w_electro.qc
qcsrc/server/w_fireball.qc
qcsrc/server/w_grenadelauncher.qc
qcsrc/server/w_hlac.qc
qcsrc/server/w_hook.qc
qcsrc/server/w_laser.qc
qcsrc/server/w_minelayer.qc
qcsrc/server/w_minstanex.qc
qcsrc/server/w_nex.qc
qcsrc/server/w_porto.qc
qcsrc/server/w_rocketlauncher.qc
qcsrc/server/w_seeker.qc
qcsrc/server/w_shotgun.qc
qcsrc/server/w_tuba.qc
qcsrc/server/w_uzi.qc
qcsrc/server/waypointsprites.qc
qcsrc/warpzonelib/anglestransform.qc
qcsrc/warpzonelib/anglestransform.qh
qcsrc/warpzonelib/common.qc
qcsrc/warpzonelib/common.qh
qcsrc/warpzonelib/server.qc
scripts/vehicles.shader [new file with mode: 0644]
scripts/vrockets.shader [new file with mode: 0644]
sound/vehicles/alarm.wav [new file with mode: 0644]
sound/vehicles/alarm_shield.wav [new file with mode: 0644]
sound/vehicles/lock.wav [new file with mode: 0644]
sound/vehicles/locked.wav [new file with mode: 0644]
sound/vehicles/locking.wav [new file with mode: 0644]
sound/vehicles/racer_boost.wav [new file with mode: 0644]
sound/vehicles/racer_idle.wav [new file with mode: 0644]
sound/vehicles/racer_move.wav [new file with mode: 0644]
sound/vehicles/raptor_fly.wav [new file with mode: 0644]
sound/vehicles/raptor_speed.wav [new file with mode: 0644]
sound/vehicles/spiderbot_die.wav [new file with mode: 0644]
sound/vehicles/spiderbot_idle.wav [new file with mode: 0644]
sound/vehicles/spiderbot_jump.wav [new file with mode: 0644]
sound/vehicles/spiderbot_land.wav [new file with mode: 0644]
sound/vehicles/spiderbot_strafe.wav [new file with mode: 0644]
sound/vehicles/spiderbot_walk.wav [new file with mode: 0644]
textures/cockpit_gloss.tga [new file with mode: 0644]
textures/cockpit_reflect.tga [new file with mode: 0644]
textures/raptor.jpg [deleted file]
textures/raptor.tga [new file with mode: 0644]
textures/raptor_cockpit.jpg [deleted file]
textures/spiderbot_reflect.tga [new file with mode: 0644]
textures/wakazachi_gloss.jpg [new file with mode: 0644]
textures/wakazachi_glow.tga [new file with mode: 0644]
textures/wakazachi_reflect.tga [new file with mode: 0644]
unit_walker.cfg
vehicle_bumblebee.cfg [new file with mode: 0644]
vehicle_racer.cfg
vehicle_raptor.cfg
vehicle_spiderbot.cfg
vehicles.cfg [new file with mode: 0644]
xonotic-credits.txt

index 67f8bee59f181a171e5155c725811b822e8caccf..2608dcebf6a1e49792e60eb31da568497d6d5755 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:06+0200\n"
+"POT-Creation-Date: 2011-06-21 21:25+0200\n"
 "PO-Revision-Date: 2011-04-20 10:46+0200\n"
 "Last-Translator: Rudolf Polzer <divVerent@xonotic.org>\n"
 "Language-Team: Rudolf Polzer <divVerent@xonotic.org>\n"
@@ -33,54 +33,62 @@ msgstr ""
 msgid "^4CSQC Build information: ^1%s\n"
 msgstr "^4CSQC Build-Information: ^1%s (deutsch)\n"
 
-#: qcsrc/client/Main.qc:232 qcsrc/client/Main.qc:248
+#: qcsrc/client/Main.qc:236 qcsrc/client/Main.qc:252
 #, c-format
 msgid "trying to switch to unsupported team %d\n"
 msgstr "es wurde versucht, in das nicht unterstützte Team %d zu wechseln"
 
-#: qcsrc/client/Main.qc:364 qcsrc/client/scoreboard.qc:241
+#: qcsrc/client/Main.qc:368 qcsrc/client/scoreboard.qc:241
 msgid "Usage:\n"
 msgstr "Syntax:\n"
 
-#: qcsrc/client/Main.qc:365
+#: qcsrc/client/Main.qc:369
 msgid "hud_save configname   (saves to hud_skinname_configname.cfg)\n"
 msgstr "hud_save configname   (speichert als hud_skinname_configname.cfg)\n"
 
-#: qcsrc/client/Main.qc:512
+#: qcsrc/client/Main.qc:493
 msgid "Usage: cl_cmd COMMAND..., where possible commands are:\n"
 msgstr "Syntax: cl_cmd BEFEHL..., wobei mögliche Befehle sind:\n"
 
-#: qcsrc/client/Main.qc:513
+#: qcsrc/client/Main.qc:494
 msgid "  settemp cvar value\n"
 msgstr "  settemp Cvar Wert\n"
 
-#: qcsrc/client/Main.qc:514
+#: qcsrc/client/Main.qc:495
 msgid "  scoreboard_columns_set ...\n"
 msgstr "  scoreboard_columns_set ...\n"
 
-#: qcsrc/client/Main.qc:515
+#: qcsrc/client/Main.qc:496
 msgid "  scoreboard_columns_help\n"
 msgstr "  scoreboard_columns_help\n"
 
-#: qcsrc/client/Main.qc:720
-msgid "A CSQC entity changed its owner!\n"
-msgstr "Ein CSQC-Entity hat seinen Besitzer gewechselt!\n"
+#: qcsrc/client/Main.qc:725
+#, c-format
+msgid "A CSQC entity changed its owner! (edict: %d, classname: %s)\n"
+msgstr ""
+"Ein CSQC-Entity hat seinen Besitzer gewechselt! (edict: %d, classname: %s)\n"
 
-#: qcsrc/client/Main.qc:934
-msgid "A CSQC entity changed its type!\n"
-msgstr "Ein CSQC-Entity hat seinen Typ gewechselt!\n"
+#: qcsrc/client/Main.qc:952
+#, c-format
+msgid "A CSQC entity changed its type! (edict: %d, classname: %s)\n"
+msgstr ""
+"Ein CSQC-Entity hat seinen Typ gewechselt! (edict: %d, classname: %s)\n"
 
-#: qcsrc/client/Main.qc:972
+#: qcsrc/client/Main.qc:992
 #, c-format
-msgid "unknown entity type in CSQC_Ent_Update: %d\n"
-msgstr "unbekannter Entity-Typ in CSQC_Ent_Update: %d\n"
+msgid ""
+"Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: "
+"%s)\n"
+msgstr ""
+"Unbekannter Entity-Typ in CSQC_Ent_Update (enttype: %d, edict: %d, "
+"classname: %s)\n"
 
-#: qcsrc/client/Main.qc:1444
+#: qcsrc/client/Main.qc:1461
 #, c-format
 msgid "%s (not bound)"
 msgstr "%s (nicht zugewiesen)"
 
-#: qcsrc/client/Main.qc:1449 qcsrc/client/hud.qc:407
+#: qcsrc/client/Main.qc:1466 qcsrc/client/hud.qc:407
 #, c-format
 msgid "%s (%s)"
 msgstr "%s (%s)"
@@ -184,440 +192,443 @@ msgstr "Zwischenzeit %d"
 msgid "%s (%s %s)"
 msgstr "%s (%s %s)"
 
-#: qcsrc/client/hud.qc:553
-#, c-format
-msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
-msgstr ""
-"^2Erfolgreich als %s exportiert! (Hinweis: die Datei wurde in data/data/ "
-"abgelegt)\n"
-
-#: qcsrc/client/hud.qc:557
-#, c-format
-msgid "^1Couldn't write to %s\n"
-msgstr "^1Konnte nicht nach %s schreiben\n"
-
-#: qcsrc/client/hud.qc:1837
+#: qcsrc/client/hud.qc:911
 msgid "Out of ammo"
 msgstr "Keine Munition mehr."
 
-#: qcsrc/client/hud.qc:1841
+#: qcsrc/client/hud.qc:915
 msgid "Don't have"
 msgstr "nicht vorhanden"
 
-#: qcsrc/client/hud.qc:1845
+#: qcsrc/client/hud.qc:919
 msgid "Unavailable"
 msgstr "nicht verfügbar"
 
-#: qcsrc/client/hud.qc:2696
+#: qcsrc/client/hud.qc:1649
 #, c-format
 msgid "^1%s^1 couldn't take it anymore\n"
 msgstr "^1%s^1 konnte es nicht mehr ertragen\n"
 
-#: qcsrc/client/hud.qc:2700 qcsrc/client/hud.qc:2992
+#: qcsrc/client/hud.qc:1653 qcsrc/client/hud.qc:1957
 #, c-format
 msgid "^1%s^1 died\n"
 msgstr "^1%s^1 ist gestorben\n"
 
-#: qcsrc/client/hud.qc:2704
+#: qcsrc/client/hud.qc:1657
 #, c-format
 msgid "^7%s^7 committed suicide. What's the point of living without ammo?\n"
 msgstr "^7%s^7 hat sich erhängt. Was ist schon ein Leben ohne Munition?\n"
 
-#: qcsrc/client/hud.qc:2708
+#: qcsrc/client/hud.qc:1661
 #, c-format
 msgid "^1%s^1 thought they found a nice camping ground\n"
 msgstr "^1%s^1 dachte, einen tollen Campingplatz gefunden zu haben\n"
 
-#: qcsrc/client/hud.qc:2712
+#: qcsrc/client/hud.qc:1665
 #, c-format
 msgid "^1%s^1 didn't become friends with the Lord of Teamplay\n"
 msgstr "^1%s^1 bekam Probleme mit dem Lord of Teamplay\n"
 
-#: qcsrc/client/hud.qc:2716
+#: qcsrc/client/hud.qc:1669
 #, c-format
 msgid "^1%s^1 unfairly eliminated themself\n"
 msgstr "^1%s^1 hat sich selbst auf unfaire Weise erledigt\n"
 
-#: qcsrc/client/hud.qc:2720
+#: qcsrc/client/hud.qc:1673
 #, c-format
 msgid "^1%s^1 burned to death\n"
 msgstr "^1%s^1 brannte zu Tode\n"
 
-#: qcsrc/client/hud.qc:2724
+#: qcsrc/client/hud.qc:1677
 #, c-format
 msgid "^1%s^1 couldn't resist the urge to self-destruct\n"
 msgstr ""
 "^1%s^1 konnte dem Drang zur Selbstzerstörung einfach nicht widerstehen\n"
 
-#: qcsrc/client/hud.qc:2728
+#: qcsrc/client/hud.qc:1681
 #, c-format
 msgid "^1%s^1 ended it all after a %d kill spree\n"
 msgstr "^1%s^1 machte seinem %d-Amoklauf ein Ende\n"
 
-#: qcsrc/client/hud.qc:2745
+#: qcsrc/client/hud.qc:1698
 #, c-format
 msgid "^1%s^1 took action against a team mate\n"
 msgstr "^1%s^1 ergriff Maßnahmen gegen einen Mitspieler\n"
 
-#: qcsrc/client/hud.qc:2747
+#: qcsrc/client/hud.qc:1700
 #, c-format
 msgid "^1%s^1 mows down a team mate\n"
 msgstr "^1%s^1 mähte einen Mitspieler nieder\n"
 
-#: qcsrc/client/hud.qc:2752
+#: qcsrc/client/hud.qc:1705
 #, c-format
 msgid "^1%s^1 ended a %d scoring spree by going against a team mate\n"
 msgstr ""
 "^1%s^1 dachte, %d Punkte hintereinander reichen, und trug dies an einem "
 "Mitspieler aus\n"
 
-#: qcsrc/client/hud.qc:2754
+#: qcsrc/client/hud.qc:1707
 #, c-format
 msgid "^1%s^1 ended a %d kill spree by killing a team mate\n"
 msgstr "^1%s^1 beendete seinen %d-Amoklauf, indem er einen Mitspieler tötete\n"
 
-#: qcsrc/client/hud.qc:2758
+#: qcsrc/client/hud.qc:1711
 #, c-format
 msgid "^1%s^1's %s scoring spree was ended by a team mate!\n"
 msgstr ""
 "^1%s^1s %s Punkte hintereinander wurden von einem Mitspieler gestört!\n"
 
-#: qcsrc/client/hud.qc:2760
+#: qcsrc/client/hud.qc:1713
 #, c-format
 msgid "^1%s^1's %s kill spree was ended by a team mate!\n"
 msgstr "^1%s^1s %s-Amoklauf wurde von einem Mitspieler beendet!\n"
 
-#: qcsrc/client/hud.qc:2764
+#: qcsrc/client/hud.qc:1717
 #, c-format
 msgid "^1%s^1 drew first blood\n"
 msgstr "^1%s^1 war der Erste\n"
 
-#: qcsrc/client/hud.qc:2768
+#: qcsrc/client/hud.qc:1721
 #, c-format
 msgid "^1%s^1 tried to occupy %s^1's teleport destination space\n"
 msgstr "^1%s^1 dachte, %s^1 am Teleportieren hindern zu können\n"
 
-#: qcsrc/client/hud.qc:2770
+#: qcsrc/client/hud.qc:1723
 #, c-format
 msgid "^1%s^1 was telefragged by %s\n"
 msgstr "^1%s^1 wurde von %s^1 telefragged\n"
 
-#: qcsrc/client/hud.qc:2775
+#: qcsrc/client/hud.qc:1728
 #, c-format
 msgid "^1%s^1 was drowned by %s\n"
 msgstr "^1%s^1 wurde von %s^1 etränkt\n"
 
-#: qcsrc/client/hud.qc:2780
+#: qcsrc/client/hud.qc:1733
 #, c-format
 msgid "^1%s^1 was slimed by %s\n"
 msgstr "^1%s^1 wurde von %s^1 im Schleim versenkt\n"
 
-#: qcsrc/client/hud.qc:2785
+#: qcsrc/client/hud.qc:1738
 #, c-format
 msgid "^1%s^1 was cooked by %s\n"
 msgstr "^1%s^1 wurde von %s^1 gebraten\n"
 
-#: qcsrc/client/hud.qc:2790
+#: qcsrc/client/hud.qc:1743
 #, c-format
 msgid "^1%s^1 was grounded by %s\n"
 msgstr "^1%s^1 wurde von %s^1 geerdet\n"
 
-#: qcsrc/client/hud.qc:2795
+#: qcsrc/client/hud.qc:1748
 #, c-format
 msgid "^1%s^1 was shot into space by %s\n"
 msgstr "^1%s^1 wurde von %s^1 ins All geschossen\n"
 
-#: qcsrc/client/hud.qc:2800
+#: qcsrc/client/hud.qc:1753
 #, c-format
 msgid "^1%s^1 was conserved by %s\n"
 msgstr "^1%s^1 wurde von %s^1 konserviert\n"
 
-#: qcsrc/client/hud.qc:2806
+#: qcsrc/client/hud.qc:1759
 #, c-format
 msgid "^1%s^1 was thrown into a world of hurt by %s\n"
 msgstr "^1%s^1 wurde von %s^1 in eine Welt des Schmerzes geworfen\n"
 
-#: qcsrc/client/hud.qc:2810
+#: qcsrc/client/hud.qc:1763
 #, c-format
 msgid "^1%s^1 was crushed by %s\n"
 msgstr "^1%s^1 wurde von %s^1 zerquetscht\n"
 
-#: qcsrc/client/hud.qc:2814
+#: qcsrc/client/hud.qc:1767
 #, c-format
 msgid "^1%s^1 got shredded by %s\n"
 msgstr "^1%s^1 wurde von %s^1 zerstückelt\n"
 
-#: qcsrc/client/hud.qc:2818
+#: qcsrc/client/hud.qc:1771
 #, c-format
 msgid "^1%s^1 was blasted to bits by %s\n"
 msgstr "^1%s^1 wurde von %s^1 in die Luft gejagt\n"
 
-#: qcsrc/client/hud.qc:2822
+#: qcsrc/client/hud.qc:1775
 #, c-format
 msgid "^1%s^1 got caught in the destruction of %s^1's vehicle\n"
 msgstr "^1%s^1 wurde von der Explosion von %s^1s Fahrzeug erwischt\n"
 
-#: qcsrc/client/hud.qc:2826
+#: qcsrc/client/hud.qc:1779
 #, c-format
 msgid "^1%s^1 was bolted down by %s\n"
 msgstr "^1%s^1 wurde von %s^1 niedergeschmettert\n"
 
-#: qcsrc/client/hud.qc:2830
+#: qcsrc/client/hud.qc:1783
 #, c-format
 msgid "^1%s^1 could find no shelter from %s^1's rockets\n"
 msgstr "^1%s^1 fand keine Deckung vor %s^1s Raketen\n"
 
-#: qcsrc/client/hud.qc:2834
+#: qcsrc/client/hud.qc:1787
 #, c-format
 msgid "^1%s^1 dies when %s^1's wakizashi dies.\n"
 msgstr "^1%s^1 starb zusammen mit %s^1's Wakizashi.\n"
 
-#: qcsrc/client/hud.qc:2838
+#: qcsrc/client/hud.qc:1791
+#, c-format
+msgid "^1%s^1 nailed to hell by %s\n"
+msgstr "^1%s^1 wurde von %s^1 in die Hölle geschossen\n"
+
+#: qcsrc/client/hud.qc:1795
+#, c-format
+msgid "^1%s^1 cluster crushed by %s\n"
+msgstr "^1%s^1 wurde von %s^1 total zerstört\n"
+
+#: qcsrc/client/hud.qc:1799
+#, c-format
+msgid "^1%s^1 dies when %s^1's raptor dies.\n"
+msgstr "^1%s^1 starb zusammen mit %s^1's Raptor.\n"
+
+#: qcsrc/client/hud.qc:1803
 #, c-format
 msgid "^1%s^1 was pushed into the line of fire by %s\n"
 msgstr "^1%s^1 wurde von %s^1 ins offene Feuer geschubst\n"
 
-#: qcsrc/client/hud.qc:2842
+#: qcsrc/client/hud.qc:1807
 #, c-format
 msgid "^1%s^1 was pushed into an accident by %s\n"
 msgstr "^1%s^1 wurde von %s^1 in einen unglücklichen Unfall geschubst\n"
 
-#: qcsrc/client/hud.qc:2846
+#: qcsrc/client/hud.qc:1811
 #, c-format
 msgid "^1%s^1 was unfairly eliminated by %s\n"
 msgstr "^1%s^1 wurde von %s auf unfaire Weise erledigt\n"
 
-#: qcsrc/client/hud.qc:2850
+#: qcsrc/client/hud.qc:1815
 #, c-format
 msgid "^1%s^1 was burnt to death by %s\n"
 msgstr "^1%s^1 wurde von %s verbrannt\n"
 
-#: qcsrc/client/hud.qc:2862
+#: qcsrc/client/hud.qc:1827
 #, c-format
 msgid "^1%s^1 was fragged by %s\n"
 msgstr "^1%s^1 wurde von %s^1 gefraggt\n"
 
-#: qcsrc/client/hud.qc:2867
+#: qcsrc/client/hud.qc:1832
 #, c-format
 msgid "^1%s^1's %s scoring spree was ended by %s\n"
 msgstr "^1%s^1's Punkte-Folge wurde von %s^1 beendet\n"
 
-#: qcsrc/client/hud.qc:2869
+#: qcsrc/client/hud.qc:1834
 #, c-format
 msgid "^1%s^1's %s kill spree was ended by %s\n"
 msgstr "^1%s^1's Kill-Spree wurde von %s^1 beendet\n"
 
-#: qcsrc/client/hud.qc:2872
+#: qcsrc/client/hud.qc:1837
 #, c-format
 msgid "^1%s^1 made %s scores in a row\n"
 msgstr "^1%s^1 machte %s Punkte hintereinander\n"
 
-#: qcsrc/client/hud.qc:2874
+#: qcsrc/client/hud.qc:1839
 #, c-format
 msgid "^1%s^1 has %s frags in a row\n"
 msgstr "^1%s^1 hat %s Frags hintereinander\n"
 
-#: qcsrc/client/hud.qc:2877
+#: qcsrc/client/hud.qc:1842
 #, c-format
 msgid "%s^7 made a ^1TRIPLE SCORE\n"
 msgstr "%s^7 hat einen ^1TRIPLE SCORE\n"
 
-#: qcsrc/client/hud.qc:2879
+#: qcsrc/client/hud.qc:1844
 #, c-format
 msgid "%s^7 made a ^1TRIPLE FRAG\n"
 msgstr "%s^7 hat einen ^1TRIPLE FRAG\n"
 
-#: qcsrc/client/hud.qc:2882
+#: qcsrc/client/hud.qc:1847
 #, c-format
 msgid "%s^7 unleashes ^1SCORING RAGE\n"
 msgstr "%s^7 hat ^1PUNKTE-RASEN\n"
 
-#: qcsrc/client/hud.qc:2884
+#: qcsrc/client/hud.qc:1849
 #, c-format
 msgid "%s^7 unleashes ^1RAGE\n"
 msgstr "%s^7 ^1RAST VOR ZORN\n"
 
-#: qcsrc/client/hud.qc:2887
+#: qcsrc/client/hud.qc:1852
 #, c-format
 msgid "%s^7 made ^1TEN SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1ZEHN PUNKTE HINTEREINANDER!\n"
 
-#: qcsrc/client/hud.qc:2889
+#: qcsrc/client/hud.qc:1854
 #, c-format
 msgid "%s^7 starts the ^1MASSACRE!\n"
 msgstr "%s^7 beginnt das ^1MASSAKER!\n"
 
-#: qcsrc/client/hud.qc:2892
+#: qcsrc/client/hud.qc:1857
 #, c-format
 msgid "%s^7 made ^1FIFTEEN SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1FÃœNFZEHN PUNKTE HINTEREINANDER\n"
 
-#: qcsrc/client/hud.qc:2894
+#: qcsrc/client/hud.qc:1859
 #, c-format
 msgid "%s^7 executes ^1MAYHEM!\n"
 msgstr "%s^7 erzeugt das ^1CHAOS!\n"
 
-#: qcsrc/client/hud.qc:2897
+#: qcsrc/client/hud.qc:1862
 #, c-format
 msgid "%s^7 made ^1TWENTY SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1ZWANZIG PUNKTE HINTEREINANDER\n"
 
-#: qcsrc/client/hud.qc:2899
+#: qcsrc/client/hud.qc:1864
 #, c-format
 msgid "%s^7 is a ^1BERSERKER!\n"
 msgstr "%s^7 ist ein ^1BERSERKER!\n"
 
-#: qcsrc/client/hud.qc:2902
+#: qcsrc/client/hud.qc:1867
 #, c-format
 msgid "%s^7 made ^1TWENTY FIVE SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1FÃœNFUNDZWANZIG PUNKTE HINTEREINANDER!\n"
 
-#: qcsrc/client/hud.qc:2904
+#: qcsrc/client/hud.qc:1869
 #, c-format
 msgid "%s^7 inflicts ^1CARNAGE!\n"
 msgstr "%s^7 hält ein ^1BLUTBAD!\n"
 
-#: qcsrc/client/hud.qc:2907
+#: qcsrc/client/hud.qc:1872
 #, c-format
 msgid "%s^7 made ^1THIRTY SCORES IN A ROW!\n"
 msgstr "%s^7 hat ^1DREISSIG PUNKTE HINTEREINANDER\n"
 
-#: qcsrc/client/hud.qc:2909
+#: qcsrc/client/hud.qc:1874
 #, c-format
 msgid "%s^7 unleashes ^1ARMAGEDDON!\n"
 msgstr "%s^7 lässt die ^1APOKALYPSE^7 los!\n"
 
-#: qcsrc/client/hud.qc:2917
+#: qcsrc/client/hud.qc:1882
 #, c-format
 msgid "^1%s^1 was in the water for too long\n"
 msgstr "^1%s^1 war zu lange im Wasser\n"
 
-#: qcsrc/client/hud.qc:2919
+#: qcsrc/client/hud.qc:1884
 #, c-format
 msgid "^1%s^1 drowned\n"
 msgstr "^1%s^1 ertrank\n"
 
-#: qcsrc/client/hud.qc:2924
+#: qcsrc/client/hud.qc:1889
 #, c-format
 msgid "^1%s^1 was slimed\n"
 msgstr "^1%s^1 wurde im Schleim versenkt\n"
 
-#: qcsrc/client/hud.qc:2930
+#: qcsrc/client/hud.qc:1895
 #, c-format
 msgid "^1%s^1 found a hot place\n"
 msgstr "^1%s^1 fand einen heißen Ort\n"
 
-#: qcsrc/client/hud.qc:2932
+#: qcsrc/client/hud.qc:1897
 #, c-format
 msgid "^1%s^1 turned into hot slag\n"
 msgstr "^1%s^1 verwandelte sich in heiße Schlacke\n"
 
-#: qcsrc/client/hud.qc:2939
+#: qcsrc/client/hud.qc:1904
 #, c-format
 msgid "^1%s^1 tested gravity (and it worked)\n"
 msgstr "^1%s^1 probierte die Gravitation aus (und sie funktionierte)\n"
 
-#: qcsrc/client/hud.qc:2941
+#: qcsrc/client/hud.qc:1906
 #, c-format
 msgid "^1%s^1 hit the ground with a crunch\n"
 msgstr "^1%s^1 landete mit einem Knall auf dem Boden\n"
 
-#: qcsrc/client/hud.qc:2946
+#: qcsrc/client/hud.qc:1911
 #, c-format
 msgid "^1%s^1 became a shooting star\n"
 msgstr "^1%s^1 wurde zu einer Sternschnuppe\n"
 
-#: qcsrc/client/hud.qc:2952
+#: qcsrc/client/hud.qc:1917
 #, c-format
 msgid "^1%s^1 discovered a swamp\n"
 msgstr "^1%s^1 entdeckte einen Sumpf\n"
 
-#: qcsrc/client/hud.qc:2954
+#: qcsrc/client/hud.qc:1919
 #, c-format
 msgid "^1%s^1 is now conserved for centuries to come\n"
 msgstr "^1%s^1 ist jetzt für Jahrhunderte konserviert\n"
 
-#: qcsrc/client/hud.qc:2959
+#: qcsrc/client/hud.qc:1924
 #, c-format
 msgid "^1%s^1 was mowed down by a turret \n"
 msgstr "^1%s^1 wurde von einem Turret niedergemäht\n"
 
-#: qcsrc/client/hud.qc:2971
+#: qcsrc/client/hud.qc:1936
 #, c-format
 msgid "^1%s^1 died in an accident\n"
 msgstr "^1%s^1 starb an einem Unfall\n"
 
-#: qcsrc/client/hud.qc:2975
+#: qcsrc/client/hud.qc:1940
 #, c-format
 msgid "^1%s^1 was unfairly eliminated\n"
 msgstr "^1%s^1 wurde auf unfaire Weise eliminiert\n"
 
-#: qcsrc/client/hud.qc:2981
+#: qcsrc/client/hud.qc:1946
 #, c-format
 msgid "^1%s^1 felt a little hot\n"
 msgstr "^1%s^1 fand es ein wenig zu warm\n"
 
-#: qcsrc/client/hud.qc:2983
+#: qcsrc/client/hud.qc:1948
 #, c-format
 msgid "^1%s^1 burnt to death\n"
 msgstr "^1%s^1 verbrannte\n"
 
-#: qcsrc/client/hud.qc:2990
+#: qcsrc/client/hud.qc:1955
 #, c-format
 msgid "^1%s^1 needs a restart\n"
 msgstr "^1%s^1 braucht einen Neustart\n"
 
-#: qcsrc/client/hud.qc:2997
+#: qcsrc/client/hud.qc:1962
 #, c-format
 msgid "^1%s^1 needs a restart after a %d scoring spree\n"
 msgstr "^1%s^1 braucht einen Neustart nach %d Punkten in Folge\n"
 
-#: qcsrc/client/hud.qc:2999
+#: qcsrc/client/hud.qc:1964
 #, c-format
 msgid "^1%s^1 died with a %d kill spree\n"
 msgstr "^1%s^1 starb mit einer %d-Kill-Spree\n"
 
-#: qcsrc/client/hud.qc:3003
+#: qcsrc/client/hud.qc:1968
 #, c-format
 msgid "%s^7 got the %s\n"
 msgstr "%s^7 bekam die %s\n"
 
-#: qcsrc/client/hud.qc:3006
+#: qcsrc/client/hud.qc:1971
 #, c-format
 msgid "%s^7 lost the %s\n"
 msgstr "%s^7 verlor die %s\n"
 
-#: qcsrc/client/hud.qc:3009
+#: qcsrc/client/hud.qc:1974
 #, c-format
 msgid "%s^7 picked up the %s\n"
 msgstr "%s^7 nahm sich die %s\n"
 
-#: qcsrc/client/hud.qc:3012
+#: qcsrc/client/hud.qc:1977
 #, c-format
 msgid "%s^7 returned the %s\n"
 msgstr "%s^7 brachte die %s^7 zurück\n"
 
-#: qcsrc/client/hud.qc:3015
+#: qcsrc/client/hud.qc:1980
 #, c-format
 msgid "%s^7 captured the %s%s\n"
 msgstr "%s^7 eroberte die %s%s\n"
 
-#: qcsrc/client/hud.qc:3034
+#: qcsrc/client/hud.qc:1999
 #, c-format
 msgid "%s^7 has picked up the ball!\n"
 msgstr "%s^7 hat den Ball genommen!\n"
 
-#: qcsrc/client/hud.qc:3039
+#: qcsrc/client/hud.qc:2004
 #, c-format
 msgid "%s^7 has dropped the ball!\n"
 msgstr "%s^7 hat den Ball verloren!\n"
 
-#: qcsrc/client/hud.qc:3052
+#: qcsrc/client/hud.qc:2017
 #, c-format
 msgid "You are now on: %s"
 msgstr "Du bist jetzt im: %s"
 
-#: qcsrc/client/hud.qc:3054
+#: qcsrc/client/hud.qc:2019
 #, c-format
 msgid ""
 "You have been moved into a different team to improve team balance\n"
@@ -626,307 +637,327 @@ msgstr ""
 "Du wurdest in ein anderes Team verschoben, um Team-Balance zu verbessern.\n"
 "Du bist jetzt im: %s"
 
-#: qcsrc/client/hud.qc:3057
+#: qcsrc/client/hud.qc:2022
 msgid "^1Reconsider your tactics, camper!"
 msgstr "^1Ändere dein Verhalten, Camper!"
 
-#: qcsrc/client/hud.qc:3059
+#: qcsrc/client/hud.qc:2024
 msgid "^1Die camper!"
 msgstr "^1Stirb, Camper!"
 
-#: qcsrc/client/hud.qc:3062
+#: qcsrc/client/hud.qc:2027
 msgid "^1You are reinserted into the game for running out of ammo..."
 msgstr ""
 "^1Du wurdest ins Spiel neu eingesetzt, weil dir die Munition ausging..."
 
-#: qcsrc/client/hud.qc:3064
+#: qcsrc/client/hud.qc:2029
 msgid "^1You were killed for running out of ammo..."
 msgstr "^1Du wurdest getötet, da dir die Munition ausging..."
 
-#: qcsrc/client/hud.qc:3067
+#: qcsrc/client/hud.qc:2032
 msgid "^1You need to preserve your health"
 msgstr "^1Du solltest deine Gesundheit erhalten"
 
-#: qcsrc/client/hud.qc:3069
+#: qcsrc/client/hud.qc:2034
 msgid "^1You grew too old without taking your medicine"
 msgstr "^1Du wurdest zu alt, und hast nicht deine Medizin genommen"
 
-#: qcsrc/client/hud.qc:3072
+#: qcsrc/client/hud.qc:2037
 msgid "^1Don't go against team mates!"
 msgstr "^1Ärgere deine Teamkollegen nicht!"
 
-#: qcsrc/client/hud.qc:3074
+#: qcsrc/client/hud.qc:2039
 msgid "^1Don't shoot your team mates!"
 msgstr "^1Schieße nicht auf deine Teamkollegen!"
 
-#: qcsrc/client/hud.qc:3079
+#: qcsrc/client/hud.qc:2044
 msgid "^1You need to be more careful!"
 msgstr "^1Sei vorsichtiger!"
 
-#: qcsrc/client/hud.qc:3081
+#: qcsrc/client/hud.qc:2046
 msgid "^1You killed your own dumb self!"
 msgstr "^1Du hast dich selbst umgebracht. Wie blöd."
 
-#: qcsrc/client/hud.qc:3086
+#: qcsrc/client/hud.qc:2051
 #, c-format
-msgid "^1Moron! You went against %s, a team mate!"
+msgid "^1Moron! You went against ^7%s^1, a team mate!"
 msgstr "^1Idiot! Du hast %s getroffen, also einen Teamkollegen von dir!"
 
-#: qcsrc/client/hud.qc:3088
+#: qcsrc/client/hud.qc:2053
 #, c-format
-msgid "^1Moron! You fragged %s, a team mate!"
+msgid "^1Moron! You fragged ^7%s^1, a team mate!"
 msgstr "^1Idiot! Du hast %s getötet, also einen Teamkollegen von dir!"
 
-#: qcsrc/client/hud.qc:3092
+#: qcsrc/client/hud.qc:2057
 msgid "^1First score"
 msgstr "^1Erster Punkt"
 
-#: qcsrc/client/hud.qc:3094
+#: qcsrc/client/hud.qc:2059
 msgid "^1First blood"
 msgstr "^1Erstes Blut"
 
-#: qcsrc/client/hud.qc:3098
+#: qcsrc/client/hud.qc:2063
 msgid "^1First casualty"
 msgstr "^1Erster Kollateralschaden"
 
-#: qcsrc/client/hud.qc:3100
+#: qcsrc/client/hud.qc:2065
 msgid "^1First victim"
 msgstr "^1Erstes Opfer"
 
-#: qcsrc/client/hud.qc:3104
+#: qcsrc/client/hud.qc:2069
 #, c-format
 msgid "^1You scored against ^7%s^1 who was typing!"
 msgstr "^1Du hast gegen ^7%s^1 gepunktet, während er am Tippen war!"
 
-#: qcsrc/client/hud.qc:3106
+#: qcsrc/client/hud.qc:2071
 #, c-format
 msgid "^1You typefragged ^7%s"
 msgstr "^1Du hast ^7%s^1 beim Tippen erschossen"
 
-#: qcsrc/client/hud.qc:3110
+#: qcsrc/client/hud.qc:2075
 #, c-format
 msgid "^1You were scored against by ^7%s^1 while you were typing!"
 msgstr "^1Gegen dich hat ^7%s^1 gepunktet, während du am Tippen warst!"
 
-#: qcsrc/client/hud.qc:3112
+#: qcsrc/client/hud.qc:2077
 #, c-format
 msgid "^1You were typefragged by ^7%s"
 msgstr "^1Du wurdest von ^7%s^1 erschossen, während du am Tippen warst"
 
-#: qcsrc/client/hud.qc:3116
+#: qcsrc/client/hud.qc:2081
 #, c-format
 msgid "^4You scored against ^7%s"
 msgstr "^4Du hast gegen ^7%s^4 gepunktet"
 
-#: qcsrc/client/hud.qc:3118
+#: qcsrc/client/hud.qc:2083
 #, c-format
 msgid "^4You fragged ^7%s"
 msgstr "^4Du hast ^7%s^4 getötet"
 
-#: qcsrc/client/hud.qc:3122
+#: qcsrc/client/hud.qc:2087
 #, c-format
 msgid "^1You were scored against by ^7%s"
 msgstr "^1Gegen dich hat ^7%s^1 gepunktet"
 
-#: qcsrc/client/hud.qc:3124
+#: qcsrc/client/hud.qc:2089
 #, c-format
 msgid "^1You were fragged by ^7%s"
 msgstr "^1Du wurdest von ^7%s^1 getötet"
 
-#: qcsrc/client/hud.qc:3129
+#: qcsrc/client/hud.qc:2094
 msgid "^1Watch your step!"
 msgstr "^1Achte, wo du hintrittst!"
 
-#: qcsrc/client/hud.qc:3194 qcsrc/client/hud.qc:3195
+#: qcsrc/client/hud.qc:2162 qcsrc/client/hud.qc:2163 qcsrc/client/hud.qc:2646
 #, c-format
 msgid "Player %d"
 msgstr "Spieler %d"
 
-#: qcsrc/client/hud.qc:3791
+#: qcsrc/client/hud.qc:2949
 msgid "^1Intermediate 1 (+15.42)"
 msgstr "^1Intermediate 1 (+15.42)"
 
-#: qcsrc/client/hud.qc:3793 qcsrc/client/hud.qc:3835 qcsrc/client/hud.qc:3876
+#: qcsrc/client/hud.qc:2951 qcsrc/client/hud.qc:2993 qcsrc/client/hud.qc:3034
 #, c-format
 msgid "^1PENALTY: %.1f (%s)"
 msgstr "^1STRAFE: %.1f (%s)"
 
-#: qcsrc/client/hud.qc:3878
+#: qcsrc/client/hud.qc:3036
 #, c-format
 msgid "^2PENALTY: %.1f (%s)"
 msgstr "^2STRAFE: %.1f (%s)"
 
-#: qcsrc/client/hud.qc:3903
+#: qcsrc/client/hud.qc:3064
+msgid "^1You must answer before entering hud configure mode\n"
+msgstr "^1Du musst antworten, bevore das HUD konfiguriert werden kann\n"
+
+#: qcsrc/client/hud.qc:3067
 msgid "^2Name ^7instead of \"^1Unregistered player^7\" in stats"
 msgstr "^2Name^7 statt \"^1Unregistered player^7\" in den Statistiken"
 
-#: qcsrc/client/hud.qc:3985
+#: qcsrc/client/hud.qc:3148
 msgid "A vote has been called for:"
 msgstr "Eine Abstimmung wurde initiiert für:"
 
-#: qcsrc/client/hud.qc:3987
+#: qcsrc/client/hud.qc:3150
 msgid "Allow servers to store and display your name?"
 msgstr "Erlaube Servern, deinen Namen zu speichern und später zu zeigen?"
 
-#: qcsrc/client/hud.qc:3991
+#: qcsrc/client/hud.qc:3154
 msgid "^1Configure the HUD"
 msgstr "^1Das HUD konfigurieren"
 
-#: qcsrc/client/hud.qc:3995
+#: qcsrc/client/hud.qc:3158
 #, c-format
 msgid "Yes (%s): %d"
 msgstr "Ja (%s): %d"
 
-#: qcsrc/client/hud.qc:3997
+#: qcsrc/client/hud.qc:3160
 #, c-format
 msgid "No (%s): %d"
 msgstr "Nein (%s): %d"
 
-#: qcsrc/client/hud.qc:4510 qcsrc/client/hud.qc:4513 qcsrc/client/hud.qc:4515
+#: qcsrc/client/hud.qc:3667 qcsrc/client/hud.qc:3670 qcsrc/client/hud.qc:3672
 msgid "Personal best"
 msgstr "Persönliche Bestzeit"
 
-#: qcsrc/client/hud.qc:4528 qcsrc/client/hud.qc:4531 qcsrc/client/hud.qc:4533
+#: qcsrc/client/hud.qc:3685 qcsrc/client/hud.qc:3688 qcsrc/client/hud.qc:3690
 msgid "Server best"
 msgstr "Server-Bestzeit"
 
-#: qcsrc/client/hud.qc:4765
+#: qcsrc/client/hud.qc:4031
 msgid "^3Player^7: This is the chat area."
 msgstr "^3Player^7: Das ist der Chat-Bereich."
 
-#: qcsrc/client/hud.qc:4828
+#: qcsrc/client/hud.qc:4098
 #, c-format
 msgid "FPS: %.*f"
 msgstr "FPS: %.*f"
 
-#: qcsrc/client/hud.qc:4893
+#: qcsrc/client/hud.qc:4164
 msgid "^1Observing"
 msgstr "^1Beobachten"
 
-#: qcsrc/client/hud.qc:4895
+#: qcsrc/client/hud.qc:4166
 #, c-format
 msgid "^1Spectating: ^7%s"
 msgstr "^1Zuschauen bei: ^7%s"
 
-#: qcsrc/client/hud.qc:4899
+#: qcsrc/client/hud.qc:4170
 #, c-format
 msgid "^1Press ^3%s^1 to spectate"
 msgstr "^1Drücke ^3%s^1, um bei jemandem zuzuschauen"
 
-#: qcsrc/client/hud.qc:4901
+#: qcsrc/client/hud.qc:4172
 #, c-format
 msgid "^1Press ^3%s^1 for another player"
 msgstr "^1Drücke ^3%s^1 für einen anderen Spieler"
 
-#: qcsrc/client/hud.qc:4905
+#: qcsrc/client/hud.qc:4176
 #, c-format
 msgid "^1Use ^3%s^1 or ^3%s^1 to change the speed"
 msgstr "^1Benutze ^3%s^1 oder ^3%s^1 zum Ã„ndern der Geschwindigkeit"
 
-#: qcsrc/client/hud.qc:4907
+#: qcsrc/client/hud.qc:4178
 #, c-format
 msgid "^1Press ^3%s^1 to observe"
 msgstr "^1Drücke ^3%s^1 zum Beobachten"
 
-#: qcsrc/client/hud.qc:4910
+#: qcsrc/client/hud.qc:4181
 #, c-format
 msgid "^1Press ^3%s^1 for gamemode info"
 msgstr "^1Drücke ^3%s^1 für Spielmodus-Info"
 
-#: qcsrc/client/hud.qc:4914
+#: qcsrc/client/hud.qc:4185
 msgid "^1Wait for your turn to join"
 msgstr "^1Warte, bis du dran bist"
 
-#: qcsrc/client/hud.qc:4920
+#: qcsrc/client/hud.qc:4191
 msgid "^1Match has already begun"
 msgstr "^1Das Match hat bereits begonnen"
 
-#: qcsrc/client/hud.qc:4922
+#: qcsrc/client/hud.qc:4193
 msgid "^1You have no more lives left"
 msgstr "^1Du hast keine Leben mehr Ã¼brig"
 
-#: qcsrc/client/hud.qc:4924 qcsrc/client/hud.qc:4927
+#: qcsrc/client/hud.qc:4195 qcsrc/client/hud.qc:4198
 #, c-format
 msgid "^1Press ^3%s^1 to join"
 msgstr "^1Drücke ^3%s^1 zum Eintreten"
 
-#: qcsrc/client/hud.qc:4935
+#: qcsrc/client/hud.qc:4206
 #, c-format
 msgid "^1Game starts in ^3%d^1 seconds"
 msgstr "^1Das Spiel beginnt in ^3%d^1 Sekunden"
 
-#: qcsrc/client/hud.qc:4942
+#: qcsrc/client/hud.qc:4213
 msgid "^2Currently in ^1warmup^2 stage!"
 msgstr "^2Momentan in der ^1Aufwärmphase!"
 
-#: qcsrc/client/hud.qc:4957
+#: qcsrc/client/hud.qc:4228
 #, c-format
 msgid "%sPress ^3%s%s to end warmup"
 msgstr "%sDrücke ^3%s%s um die Aufwärmphase zu beenden"
 
-#: qcsrc/client/hud.qc:4959
+#: qcsrc/client/hud.qc:4230
 #, c-format
 msgid "%sPress ^3%s%s once you are ready"
 msgstr "%sDrücke ^3%s%s sobald du soweit bist"
 
-#: qcsrc/client/hud.qc:4964
+#: qcsrc/client/hud.qc:4235
 msgid "^2Waiting for others to ready up to end warmup..."
 msgstr "^2Warte, bis andere bereit sind, um die Aufwärmphase zu beenden"
 
-#: qcsrc/client/hud.qc:4966
+#: qcsrc/client/hud.qc:4237
 msgid "^2Waiting for others to ready up..."
 msgstr "^2Warte, bis andere bereit sind..."
 
-#: qcsrc/client/hud.qc:4972
+#: qcsrc/client/hud.qc:4243
 #, c-format
 msgid "^2Press ^3%s^2 to end warmup"
 msgstr "^2Drücke ^3%s^2 um die Aufwärmphase zu beenden"
 
-#: qcsrc/client/hud.qc:4993
+#: qcsrc/client/hud.qc:4264
 msgid "Teamnumbers are unbalanced!"
 msgstr "Die Teams sind unbalanciert!"
 
-#: qcsrc/client/hud.qc:4998
+#: qcsrc/client/hud.qc:4269
 #, c-format
 msgid " Press ^3%s%s to adjust"
 msgstr "Drücke ^3%s%s um dies zu korrigieren"
 
-#: qcsrc/client/hud.qc:5006
+#: qcsrc/client/hud.qc:4277
 msgid "^7Press ^3ESC ^7to show HUD options."
 msgstr "^7Drücke ^3ESC^7 um die HUD-Optionen zu zeigen"
 
-#: qcsrc/client/hud.qc:5008
+#: qcsrc/client/hud.qc:4279
 msgid "^3Doubleclick ^7a panel for panel-specific options."
 msgstr "^3Doppelklick^7 auf ein Panel für Panel-spezifische Optionen."
 
-#: qcsrc/client/hud.qc:5010
+#: qcsrc/client/hud.qc:4281
 msgid "^3CTRL ^7to disable collision testing, ^3SHIFT ^7and"
 msgstr "^3CTRL^7 um Kollisionstests zu deaktivieren, ^3SHIFT^7 und"
 
-#: qcsrc/client/hud.qc:5012
+#: qcsrc/client/hud.qc:4283
 msgid "^3ALT ^7+ ^3ARROW KEYS ^7for fine adjustments."
 msgstr "^3ALT^7 + ^3PFEILTASTEN^7 für Feinjustierungen"
 
-#: qcsrc/client/hud.qc:5037
+#: qcsrc/client/hud.qc:4319
 msgid " qu/s"
 msgstr "qu/s"
 
-#: qcsrc/client/hud.qc:5041
+#: qcsrc/client/hud.qc:4323
 msgid " m/s"
 msgstr "m/s"
 
-#: qcsrc/client/hud.qc:5045
+#: qcsrc/client/hud.qc:4327
 msgid " km/h"
 msgstr "km/h"
 
-#: qcsrc/client/hud.qc:5049
+#: qcsrc/client/hud.qc:4331
 msgid " mph"
 msgstr "mph"
 
-#: qcsrc/client/hud.qc:5053
+#: qcsrc/client/hud.qc:4335
 msgid " knots"
 msgstr "Knoten"
 
+#: qcsrc/client/hud.qc:4686
+msgid "Automatically fixed wrong/missing panel numbers in _hud_panelorder\n"
+msgstr "Falsche Panel-Nummern in _hud_panelorder wurden automatisch behoben"
+
+#: qcsrc/client/hud_config.qc:132
+#, c-format
+msgid "^2Successfully exported to %s! (Note: It's saved in data/data/)\n"
+msgstr ""
+"^2Erfolgreich als %s exportiert! (Hinweis: die Datei wurde in data/data/ "
+"abgelegt)\n"
+
+#: qcsrc/client/hud_config.qc:136
+#, c-format
+msgid "^1Couldn't write to %s\n"
+msgstr "^1Konnte nicht nach %s schreiben\n"
+
 #: qcsrc/client/mapvoting.qc:28
 msgid " (1 vote)"
 msgstr "(1 Stimme)"
@@ -994,6 +1025,18 @@ msgstr "Du hast die %s!"
 msgid "Trying to remove a team which is not in the teamlist!"
 msgstr "Versuchte, ein Team zu löschen, das nicht in der Teamliste ist!"
 
+#: qcsrc/client/movetypes.qc:159
+#, c-format
+msgid "Can't unstick an entity (edict: %d, classname: %s, origin: %s)\n"
+msgstr ""
+"Kann ein Objekt nicht befreien (edict: %d, classname: %s, origin: %s)\n"
+
+#: qcsrc/client/movetypes.qc:162
+#, c-format
+msgid "Sucessfully unstuck an entity (edict: %d, classname: %s, origin: %s)\n"
+msgstr ""
+"Ein Objekt wurde erfolgreich befreit (edict: %d, classname: %s, origin: %s)\n"
+
 #: qcsrc/client/scoreboard.qc:19
 msgid "SCO^bckills"
 msgstr "BC getötet"
@@ -1334,68 +1377,68 @@ msgstr "Fehlendes Feld '%s' wurde ergänzt.\n"
 msgid "N/A"
 msgstr "-"
 
-#: qcsrc/client/scoreboard.qc:951
+#: qcsrc/client/scoreboard.qc:949
 #, c-format
 msgid "Accuracy stats (average %d%%)"
 msgstr "Genauigkeit (Durchschn.: %d%%)"
 
-#: qcsrc/client/scoreboard.qc:1016
+#: qcsrc/client/scoreboard.qc:1014
 #, c-format
 msgid "%d%%"
 msgstr "%d%%"
 
-#: qcsrc/client/scoreboard.qc:1076
+#: qcsrc/client/scoreboard.qc:1074
 msgid "Rankings"
 msgstr "Platzierungen"
 
-#: qcsrc/client/scoreboard.qc:1167 qcsrc/client/scoreboard.qc:1169
+#: qcsrc/client/scoreboard.qc:1165 qcsrc/client/scoreboard.qc:1167
 msgid "Scoreboard"
 msgstr "Tabelle"
 
-#: qcsrc/client/scoreboard.qc:1210
+#: qcsrc/client/scoreboard.qc:1208
 #, c-format
 msgid "Speed award: %d ^7(%s^7)"
 msgstr "Höchstgeschwindigkeit: %d ^7(%s^7)"
 
-#: qcsrc/client/scoreboard.qc:1214
+#: qcsrc/client/scoreboard.qc:1212
 #, c-format
 msgid "All-time fastest: %d ^7(%s^7)"
 msgstr "Rekord: %d ^7(%s^7)"
 
-#: qcsrc/client/scoreboard.qc:1241 qcsrc/client/teamplay.qc:55
+#: qcsrc/client/scoreboard.qc:1239 qcsrc/client/teamplay.qc:63
 msgid "Spectators"
 msgstr "Zuschauer"
 
-#: qcsrc/client/scoreboard.qc:1248
+#: qcsrc/client/scoreboard.qc:1246
 #, c-format
 msgid "playing on ^2%s^7"
 msgstr "es wird auf ^2%s^7 gespielt"
 
-#: qcsrc/client/scoreboard.qc:1255 qcsrc/client/scoreboard.qc:1260
+#: qcsrc/client/scoreboard.qc:1253 qcsrc/client/scoreboard.qc:1258
 #, c-format
 msgid " for up to ^1%1.0f minutes^7"
 msgstr " für bis zu ^1%.1f Minuten^7"
 
-#: qcsrc/client/scoreboard.qc:1264 qcsrc/client/scoreboard.qc:1283
+#: qcsrc/client/scoreboard.qc:1262 qcsrc/client/scoreboard.qc:1281
 msgid " or"
 msgstr " oder"
 
-#: qcsrc/client/scoreboard.qc:1267 qcsrc/client/scoreboard.qc:1274
+#: qcsrc/client/scoreboard.qc:1265 qcsrc/client/scoreboard.qc:1272
 #, c-format
 msgid " until ^3%s %s^7"
 msgstr " bis ^3%s %s^7"
 
-#: qcsrc/client/scoreboard.qc:1268 qcsrc/client/scoreboard.qc:1275
-#: qcsrc/client/scoreboard.qc:1287 qcsrc/client/scoreboard.qc:1294
+#: qcsrc/client/scoreboard.qc:1266 qcsrc/client/scoreboard.qc:1273
+#: qcsrc/client/scoreboard.qc:1285 qcsrc/client/scoreboard.qc:1292
 msgid "SCO^points"
 msgstr "Punkte"
 
-#: qcsrc/client/scoreboard.qc:1269 qcsrc/client/scoreboard.qc:1276
-#: qcsrc/client/scoreboard.qc:1288 qcsrc/client/scoreboard.qc:1295
+#: qcsrc/client/scoreboard.qc:1267 qcsrc/client/scoreboard.qc:1274
+#: qcsrc/client/scoreboard.qc:1286 qcsrc/client/scoreboard.qc:1293
 msgid "SCO^is beaten"
 msgstr "geschlagen wird"
 
-#: qcsrc/client/scoreboard.qc:1286 qcsrc/client/scoreboard.qc:1293
+#: qcsrc/client/scoreboard.qc:1284 qcsrc/client/scoreboard.qc:1291
 #, c-format
 msgid " until a lead of ^3%s %s^7"
 msgstr " bis zu einem Vorsprung von ^3%s %s^7"
@@ -1405,26 +1448,224 @@ msgstr " bis zu einem Vorsprung von ^3%s %s^7"
 msgid "Cannot initialize sound %s\n"
 msgstr "Kann Sound %s nicht initialisieren\n"
 
-#: qcsrc/client/teamplay.qc:56
+#: qcsrc/client/teamplay.qc:64
 msgid "Red Team"
 msgstr "Rotes Team"
 
-#: qcsrc/client/teamplay.qc:57
+#: qcsrc/client/teamplay.qc:65
 msgid "Blue Team"
 msgstr "Blaues Team"
 
-#: qcsrc/client/teamplay.qc:58
+#: qcsrc/client/teamplay.qc:66
 msgid "Yellow Team"
 msgstr "Gelbes Team"
 
-#: qcsrc/client/teamplay.qc:59
+#: qcsrc/client/teamplay.qc:67
 msgid "Pink Team"
 msgstr "Pinkes Team"
 
-#: qcsrc/server/w_crylink.qc:2
+#: qcsrc/client/waypointsprites.qc:234
+msgid "Push"
+msgstr "Drücken"
+
+#: qcsrc/client/waypointsprites.qc:235
+msgid "Destroy"
+msgstr "Zerstören"
+
+#: qcsrc/client/waypointsprites.qc:236
+msgid "Defend"
+msgstr "Verteidigen"
+
+#: qcsrc/client/waypointsprites.qc:237
+msgid "Blue base"
+msgstr "Blaue Basis"
+
+#: qcsrc/client/waypointsprites.qc:238
+msgid "DANGER"
+msgstr "GEFAHR"
+
+#: qcsrc/client/waypointsprites.qc:239
+msgid "Flag carrier"
+msgstr "Flaggenträger"
+
+#: qcsrc/client/waypointsprites.qc:240
+msgid "Dropped flag"
+msgstr "Flagge"
+
+#: qcsrc/client/waypointsprites.qc:241
+msgid "Help me!"
+msgstr "Hilfe!"
+
+#: qcsrc/client/waypointsprites.qc:242
+msgid "Here"
+msgstr "Hier"
+
+#: qcsrc/client/waypointsprites.qc:243
+msgid "Dropped key"
+msgstr "Schlüssel"
+
+#: qcsrc/client/waypointsprites.qc:244 qcsrc/client/waypointsprites.qc:246
+#: qcsrc/client/waypointsprites.qc:247 qcsrc/client/waypointsprites.qc:248
+#: qcsrc/client/waypointsprites.qc:249
+msgid "Key carrier"
+msgstr "Schlüsselträger"
+
+#: qcsrc/client/waypointsprites.qc:245
+msgid "Run here"
+msgstr "Hier her!"
+
+#: qcsrc/client/waypointsprites.qc:250
+msgid "Red base"
+msgstr "Rote Basis"
+
+#: qcsrc/client/waypointsprites.qc:251
+msgid "Waypoint"
+msgstr "Wegpunkt"
+
+#: qcsrc/client/waypointsprites.qc:252 qcsrc/client/waypointsprites.qc:253
+#: qcsrc/client/waypointsprites.qc:254
+msgid "Generator"
+msgstr "Generator"
+
+#: qcsrc/client/waypointsprites.qc:255 qcsrc/client/waypointsprites.qc:256
+#: qcsrc/client/waypointsprites.qc:257 qcsrc/client/waypointsprites.qc:258
+#: qcsrc/client/waypointsprites.qc:259 qcsrc/client/waypointsprites.qc:260
+#: qcsrc/client/waypointsprites.qc:261 qcsrc/client/waypointsprites.qc:262
+#: qcsrc/client/waypointsprites.qc:285 qcsrc/client/waypointsprites.qc:286
+#: qcsrc/client/waypointsprites.qc:287 qcsrc/client/waypointsprites.qc:288
+#: qcsrc/client/waypointsprites.qc:289
+msgid "Control point"
+msgstr "Kontrollpunkt"
+
+#: qcsrc/client/waypointsprites.qc:263
+msgid "Checkpoint"
+msgstr "Checkpoint"
+
+#: qcsrc/client/waypointsprites.qc:264
+msgid "Finish"
+msgstr "Ziel"
+
+#: qcsrc/client/waypointsprites.qc:265
+msgid "Start"
+msgstr "Start"
+
+#: qcsrc/client/waypointsprites.qc:266 qcsrc/client/waypointsprites.qc:267
+msgid "Ball"
+msgstr "Ball"
+
+#: qcsrc/client/waypointsprites.qc:268
+msgid "Ball carrier"
+msgstr "Ballbesitzer"
+
+#: qcsrc/client/waypointsprites.qc:269 qcsrc/server/w_laser.qc:2
+msgid "Laser"
+msgstr "Laser"
+
+#: qcsrc/client/waypointsprites.qc:270 qcsrc/server/w_shotgun.qc:2
+msgid "Shotgun"
+msgstr "Shotgun"
+
+#: qcsrc/client/waypointsprites.qc:271 qcsrc/server/w_uzi.qc:2
+msgid "Machine Gun"
+msgstr "Machine Gun"
+
+#: qcsrc/client/waypointsprites.qc:272 qcsrc/server/w_grenadelauncher.qc:2
+msgid "Mortar"
+msgstr "Mortar"
+
+#: qcsrc/client/waypointsprites.qc:273 qcsrc/server/w_electro.qc:2
+msgid "Electro"
+msgstr "Electro"
+
+#: qcsrc/client/waypointsprites.qc:274 qcsrc/server/w_crylink.qc:2
 msgid "Crylink"
 msgstr "Crylink"
 
+#: qcsrc/client/waypointsprites.qc:275 qcsrc/server/w_nex.qc:2
+msgid "Nex"
+msgstr "Nex"
+
+#: qcsrc/client/waypointsprites.qc:276 qcsrc/server/w_hagar.qc:2
+msgid "Hagar"
+msgstr "Hagar"
+
+#: qcsrc/client/waypointsprites.qc:277 qcsrc/server/w_rocketlauncher.qc:2
+msgid "Rocket Launcher"
+msgstr "Rocket Launcher"
+
+#: qcsrc/client/waypointsprites.qc:278 qcsrc/server/w_porto.qc:2
+msgid "Port-O-Launch"
+msgstr "Port-O-Launch"
+
+#: qcsrc/client/waypointsprites.qc:279
+msgid "Minstanex"
+msgstr "MinstaNex"
+
+#: qcsrc/client/waypointsprites.qc:280
+msgid "Hook"
+msgstr "Hook"
+
+#: qcsrc/client/waypointsprites.qc:281 qcsrc/server/w_fireball.qc:2
+msgid "Fireball"
+msgstr "Fireball"
+
+#: qcsrc/client/waypointsprites.qc:282
+msgid "HLAC"
+msgstr "HLAC"
+
+#: qcsrc/client/waypointsprites.qc:283 qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Gewehr"
+
+#: qcsrc/client/waypointsprites.qc:284 qcsrc/server/w_minelayer.qc:2
+msgid "Mine Layer"
+msgstr "Mine Layer"
+
+#: qcsrc/client/waypointsprites.qc:290
+msgid "Invisibility"
+msgstr "Unsichtbarkeit"
+
+#: qcsrc/client/waypointsprites.qc:291
+msgid "Extra life"
+msgstr "Extraleben"
+
+#: qcsrc/client/waypointsprites.qc:292
+msgid "Speed"
+msgstr "Geschwindigkeit"
+
+#: qcsrc/client/waypointsprites.qc:293
+msgid "Strength"
+msgstr "Stärke"
+
+#: qcsrc/client/waypointsprites.qc:294
+msgid "Shield"
+msgstr "Schutzschild"
+
+#: qcsrc/client/waypointsprites.qc:295
+msgid "Fuel regen"
+msgstr "Treibstoff-Regeneration"
+
+#: qcsrc/client/waypointsprites.qc:296
+msgid "Jet Pack"
+msgstr "Jetpack"
+
+#: qcsrc/client/waypointsprites.qc:297
+msgid "Frozen!"
+msgstr "Eingefroren!"
+
+#: qcsrc/client/waypointsprites.qc:298
+msgid "Tagged"
+msgstr "Getaggt!"
+
+#: qcsrc/client/waypointsprites.qc:299
+msgid "Vehicle"
+msgstr "Fahrzeug"
+
+#: qcsrc/client/waypointsprites.qc:560
+#, c-format
+msgid "%s needing help!"
+msgstr "%s braucht Hilfe!"
+
 #: qcsrc/server/w_crylink.qc:664
 #, c-format
 msgid "%s succeeded at self-destructing themself with the Crylink"
@@ -1445,10 +1686,6 @@ msgstr "%s trat %ss Crylink zu nahe"
 msgid "%s took a close look at %s's Crylink"
 msgstr "%s schaute sich %ss Crylink sehr genau an"
 
-#: qcsrc/server/w_electro.qc:2
-msgid "Electro"
-msgstr "Electro"
-
 #: qcsrc/server/w_electro.qc:571
 #, c-format
 msgid "%s could not remember where they put plasma"
@@ -1484,10 +1721,6 @@ msgstr "%s kam zu nah an %ss blauen Strahl"
 msgid "%s was blasted by %s's blue beam"
 msgstr "%s wurde von %ss blauen Strahl erwischt"
 
-#: qcsrc/server/w_fireball.qc:2
-msgid "Fireball"
-msgstr "Fireball"
-
 #: qcsrc/server/w_fireball.qc:417
 #, c-format
 msgid "%s forgot about some firemine"
@@ -1528,50 +1761,42 @@ msgstr "%s ist %ss Feuerball zu nahe getreten"
 msgid "%s tasted %s's fireball"
 msgstr "%s hat von %ss Feuerball probiert"
 
-#: qcsrc/server/w_grenadelauncher.qc:2
-msgid "Mortar"
-msgstr "Mortar"
-
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:379
 #, c-format
 msgid "%s tried out his own grenade"
 msgstr "%s wollte wissen, ob seine Granate funktioniert"
 
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:381
 #, c-format
 msgid "%s detonated"
 msgstr "%s verfing sich in der eigenen Detonation"
 
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:387
 #, c-format
 msgid "%s didn't see %s's grenade"
 msgstr "%s hat %ss Granate nicht gesehen"
 
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:389
 #, c-format
 msgid "%s almost dodged %s's grenade"
 msgstr "%s ist fast %ss Granate ausgewichen"
 
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:391
 #, c-format
 msgid "%s ate %s's grenade"
 msgstr "%s nahm %ss Granate in den Mund"
 
-#: qcsrc/server/w_hagar.qc:2
-msgid "Hagar"
-msgstr "Hagar"
-
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655
 #, c-format
 msgid "%s played with tiny rockets"
 msgstr "%s hat mit kleinen Raketen gespielt"
 
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:386
 #, c-format
 msgid "%s hoped %s's missiles wouldn't bounce"
 msgstr "%s hat gehofft, dass %ss Raketen nicht von Wänden abprallen"
 
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661
 #, c-format
 msgid "%s was pummeled by %s"
 msgstr "^1%s^1 wurde von %s^1 erwischt"
@@ -1590,7 +1815,7 @@ msgid "Grappling Hook"
 msgstr "Grappling Hook"
 
 #: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
+#: qcsrc/server/w_nex.qc:253 qcsrc/server/w_porto.qc:296
 #: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
 #, c-format
 msgid "%s did the impossible"
@@ -1601,10 +1826,6 @@ msgstr "%s hat das Unmögliche geschafft"
 msgid "%s has run into %s's gravity bomb"
 msgstr "%s ist in %ss Gravitationsbombe reingelaufen"
 
-#: qcsrc/server/w_laser.qc:2
-msgid "Laser"
-msgstr "Laser"
-
 #: qcsrc/server/w_laser.qc:305
 #, c-format
 msgid "%s lasered themself to hell"
@@ -1620,26 +1841,22 @@ msgstr "%s ist von %ss Gauntlet halbiert worden"
 msgid "%s was lasered to death by %s"
 msgstr "^1%s^1 wurde von %s^1 zu Tode gelasert"
 
-#: qcsrc/server/w_minelayer.qc:2
-msgid "Mine Layer"
-msgstr "Mine Layer"
-
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:522 qcsrc/server/w_rocketlauncher.qc:501
 #, c-format
 msgid "%s exploded"
 msgstr "%s ist explodiert"
 
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:526
 #, c-format
 msgid "%s got too close to %s's mine"
 msgstr "%s ist %ss Mine zu nahe getreten"
 
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:528
 #, c-format
 msgid "%s almost dodged %s's mine"
 msgstr "%s ist fast %ss Mine ausgewichen"
 
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:530
 #, c-format
 msgid "%s stepped on %s's mine"
 msgstr "%s ist auf %ss Mine gelatscht"
@@ -1648,39 +1865,62 @@ msgstr "%s ist auf %ss Mine gelatscht"
 msgid "MinstaNex"
 msgstr "MinstaNex"
 
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:255
 #, c-format
 msgid "%s has been vaporized by %s"
 msgstr "^1%s^1 wurde von %s^1 vernichtet"
 
-#: qcsrc/server/w_nex.qc:2
-msgid "Nex"
-msgstr "Nex"
-
-#: qcsrc/server/w_porto.qc:2
-msgid "Port-O-Launch"
-msgstr "Port-O-Launch"
-
 #: qcsrc/server/w_porto.qc:298
 #, c-format
 msgid "%s felt %s doing the impossible to him"
 msgstr "%s hat gespürt, wie %s das Unmögliche für ihn getan hat"
 
-#: qcsrc/server/w_rocketlauncher.qc:2
-msgid "Rocket Launcher"
-msgstr "Rocket Launcher"
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s hat sich vollautomatisch selbst erschossen"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s ist in %ss Kugelhagel gefallen"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
 
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "^1%s^1 wurde von %s^1 erledigt"
+
+#: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
 msgid "%s got too close to %s's rocket"
 msgstr "%s ist %ss Rakete zu nahe getreten"
 
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
 msgid "%s almost dodged %s's rocket"
 msgstr "%s ist fast %ss Rakete ausgewichen"
 
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
 msgid "%s ate %s's rocket"
 msgstr "%s hat %ss Rakete in den Mund genommen"
@@ -1694,10 +1934,6 @@ msgstr "T.A.G. Seeker"
 msgid "%s was tagged by %s"
 msgstr "^1%s^1 wurde von %s^1 getagged"
 
-#: qcsrc/server/w_shotgun.qc:2
-msgid "Shotgun"
-msgstr "Shotgun"
-
 #: qcsrc/server/w_shotgun.qc:207
 #, c-format
 msgid "%2$s ^7slapped %1$s ^7around a bit with a large ^2shotgun"
@@ -1708,45 +1944,6 @@ msgstr "%2$1s ^7hat %1$s ^7ein wenig mit einer großen Schrotflinte geschlagen"
 msgid "%s was gunned by %s"
 msgstr "^1%s^1 wurde von %s^1 erschossen"
 
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_rifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s hat sich vollautomatisch selbst erschossen"
-
-#: qcsrc/server/w_rifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
-
-#: qcsrc/server/w_rifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
-
-#: qcsrc/server/w_rifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s ist in %ss Kugelhagel gefallen"
-
-#: qcsrc/server/w_rifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
-
-#: qcsrc/server/w_rifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
-
-#: qcsrc/server/w_rifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "^1%s^1 wurde von %s^1 erledigt"
-
 #: qcsrc/server/w_tuba.qc:2
 #, c-format
 msgid "@!#%'n Tuba"
@@ -1765,11 +1962,25 @@ msgstr ""
 "%s ist an seinen Ohrenschmerzen, die von %ss großartigem Spiel auf der @!#"
 "%%'n Tuba stammten, gestorben"
 
-#: qcsrc/server/w_uzi.qc:2
-msgid "Machine Gun"
-msgstr "Machine Gun"
-
 #: qcsrc/server/w_uzi.qc:323
 #, c-format
 msgid "%s was riddled full of holes by %s"
 msgstr "%s ist von %s durchlöchert worden wie ein Schweizer Käse"
+
+#~ msgid "Sniper Rifle"
+#~ msgstr "Sniper Rifle"
+
+#~ msgid "^1Moron! You fragged %s, a team mate!"
+#~ msgstr "^1Idiot! Du hast %s getötet, also einen Teamkollegen von dir!"
+
+#~ msgid "^1Moron! You went against %s, a team mate!"
+#~ msgstr "^1Idiot! Du hast %s getroffen, also einen Teamkollegen von dir!"
+
+#~ msgid "unknown entity type in CSQC_Ent_Update: %d\n"
+#~ msgstr "unbekannter Entity-Typ in CSQC_Ent_Update: %d\n"
+
+#~ msgid "A CSQC entity changed its type!\n"
+#~ msgstr "Ein CSQC-Entity hat seinen Typ gewechselt!\n"
+
+#~ msgid "A CSQC entity changed its owner!\n"
+#~ msgstr "Ein CSQC-Entity hat seinen Besitzer gewechselt!\n"
index 76371bf0ef9f45f1db3c1e8465a7c609001a5f81..0853e4c345398ba9a13b5567a2b5027a0fe777b3 100644 (file)
@@ -282,7 +282,7 @@ cl_rollangle 0 // amount of view tilt when strafing, default is 2.0
 v_kicktime 0 // how long damage kicks of the view last, default is 0 seconds
 gl_polyblend 0 // whether to use screen tints, this has now been replaced by a better system in CSQC
 r_motionblur 0 // motion blur value, default is 0
-r_damageblur 0 // motion blur when damaged, default is 0
+r_damageblur 0 // motion blur when damaged, default is 0 (removed in Xonotic)
 
 r_bloom_blur 8
 r_bloom_brighten 3
@@ -320,7 +320,7 @@ set sv_ready_restart_repeatable 0   "allows the players to restart the game as oft
 seta cl_hitsound 1 "play a hit notifier sound when you have hit an enemy"
 set cl_hitsound_antispam_time 0.05 "don't play the hitsound more often than this"
 
-seta cl_eventchase_death 0 "camera goes into 3rd person mode when the player is dead"
+seta cl_eventchase_death 1 "camera goes into 3rd person mode when the player is dead"
 seta cl_eventchase_distance 140 "final camera distance"
 seta cl_eventchase_speed 1.3 "how fast the camera slides back, 0 is instant"
 
@@ -899,6 +899,7 @@ set g_multijump_add 0       "0 = make the current z velocity equal to jumpvelocity, 1
 set g_multijump_speed -999999  "Minimum vertical speed a player must have in order to jump again"
 
 // effects
+r_glsl_postprocess 1
 r_picmipsprites 0 // Xonotic uses sprites that should never be picmipped (team mate, typing, waypoints)
 r_picmipworld 1
 gl_picmip_world 0
@@ -1228,6 +1229,7 @@ set g_nick_flood_penalty 0.5 "duration of the nick flood penalty"
 set g_nick_flood_penalty_yellow 3 "number of changes to allow before warning and movement blocking"
 set g_nick_flood_penalty_red 30 "number of changes to allow before totally disorienting the player"
 
+seta g_waypointsprite_uppercase 1
 set g_waypointsprite_normdistance 512
 set g_waypointsprite_minscale 0.5
 set g_waypointsprite_minalpha 0.4
@@ -1238,6 +1240,7 @@ set g_waypointsprite_deadlifetime 1
 set g_waypointsprite_limitedrange 5120
 set g_waypointsprite_stuffbinds 0
 seta g_waypointsprite_scale 1
+seta g_waypointsprite_fontsize 12
 seta g_waypointsprite_alpha 1 "This allows the client to control transparency of the waypoint"
 seta g_waypointsprite_edgefadealpha 0.5 "alpha multiplier near the edge"
 seta g_waypointsprite_edgefadescale 1 "scale multiplier near the edge"
@@ -1473,6 +1476,8 @@ seta hud_showbinds_limit 2        "maximum number of bound keys to show for a command.
 seta hud_colorflash_alpha 0.5 "starting alpha of the color flash"
 
 seta hud_damage 0.55 "an improved version of gl_polyblend for damage, draw an image instead when hurt"
+seta hud_damage_blur 10 "Use postprocessing to blur the screen when you have taken damage. This can be paired with current hud damage or just used alone. Higher values = more blur"
+seta hud_damage_blur_alpha 0.5 "Amount of alpha to use when merging the blurred layers back into the render. Turning this up higher will remove bloom, so it's best to find a balance"
 seta hud_damage_gentle_alpha_multiplier 0.10 "how much to multiply alpha of flash when using the cl_gentle version, it's much more opaque than the non-gentle version"
 seta hud_damage_gentle_color "1 0.7 1" "color of flash for cl_gentle version"
 seta hud_damage_color "1 0 0" "color of flash"
@@ -1485,7 +1490,15 @@ seta hud_damage_pain_threshold_lower_health 50 "at which health we start lowerin
 seta hud_damage_pain_threshold_pulsating_min 0.6 "minimum value when calculating the pulse: max(pulsating_min, fabs(sin(PI * time / period))"
 seta hud_damage_pain_threshold_pulsating_period 0.8 "one pulse every X seconds"
 
+seta hud_powerup 0 "power of the sharpen effect when owning the shield or strength powerups, default is 0.5"
+
+seta hud_postprocessing 1 "enables the ability for effects such as hud_damage_blur and hud_contents to apply a postprocessing method upon the screen - enabling this disables manual editing of the postprocess cvars"
+seta hud_postprocessing_maxbluralpha 0 "maximum alpha which the blur postprocess can be, default is 0.5"
+seta hud_postprocessing_maxblurradius 8 "maximum radius which the blur postprocess can be, default is 8"
+
 seta hud_contents 1 "an improved version of gl_polyblend for liquids such as water/lava/slime, draw a filler when inside the liquid"
+seta hud_contents_blur 10 "Use postprocessing to blur the screen when you are inside a liquid. Higher values = more blur"
+seta hud_contents_blur_alpha 0.5 "Amount of alpha to use when merging the blurred layers back into the render. Turning this up higher will remove bloom, so it's best to find a balance"
 seta hud_contents_factor 1 "factor at which to multiply the current faded value."
 seta hud_contents_fadeintime 0.02 "factor of time it takes for the alpha level to reach normal value when entering the liquid"
 seta hud_contents_fadeouttime 0.1 "factor of time it takes for the alpha level to reach normal value when leaving the liquid"
@@ -2125,7 +2138,7 @@ set snd_soundradius 1200
 scr_loadingscreen_background 0
 scr_loadingscreen_barcolor "0 0.5 1"
 scr_loadingscreen_barheight 12
-scr_loadingscreen_count 12
+scr_loadingscreen_count 13
 scr_loadingscreen_scale 999
 scr_loadingscreen_scale_base 1
 scr_loadingscreen_scale_limit 2
index e2b476ce8a0726bbca58256968631ad979045a17..bf631fb254197ed732145f2538180345fddaea2d 100644 (file)
@@ -5257,3 +5257,1153 @@ airfriction 5
 originjitter 1 1 1
 velocityjitter 100 100 100
 velocitymultiplier -0.31
+
+// --------------- vehicles
+
+effect spiderbot_minigun_trail
+notunderwater
+trailspacing 10
+type smoke
+color 0xd0d0a0 0xffffff
+tex 0 8
+size 1 2
+alpha 20 50 100
+sizeincrease 2
+velocityjitter 5 5 5
+gravity -0.03
+airfriction 1
+
+effect spiderbot_minigun_muzzleflash
+count 3
+type spark
+color 0xff9c00 0xff8400
+tex 48 55
+size 10 15
+alpha 256 512 6280
+airfriction 10
+originjitter 2 2 2
+velocityjitter 150 150 150
+velocitymultiplier 0.35
+sizeincrease -100
+stretchfactor 1.3
+rotate -180 180 4000 -4000
+// fire
+effect spiderbot_minigun_muzzleflash
+count 6
+type spark
+color 0xff9c00 0xff8400
+tex 8 15
+size 5 7
+alpha 256 512 6280
+airfriction 12
+originjitter 2 2 2
+velocityjitter 200 200 200
+velocitymultiplier 0.2
+sizeincrease -10
+stretchfactor 0.8
+effect spiderbot_minigun_muzzleflash
+countabsolute 2
+type static
+tex 48 55
+color 0xff9c00 0xff8400
+size 32 32
+alpha 256 512 6680
+sizeincrease -100
+stretchfactor 0.1
+rotate -180 180 4000 -4000
+lightradius 120
+lightradiusfade 8000
+lightcolor 3 3 0
+
+effect spiderbot_minigun_impact
+countabsolute 1
+type static
+tex 65 65
+color 0xff9c00 0xf6ff00
+size 52 52
+alpha 50 100 1680
+sizeincrease -100
+stretchfactor 0.1
+rotate -180 180 4000 -4000
+// fire
+effect spiderbot_minigun_impact
+count 7
+type spark
+color 0xff9c00 0xff8400
+tex 48 55
+size 9 15
+alpha 256 512 6280
+airfriction 10
+originjitter 2 2 2
+velocityjitter 250 250 150
+velocitymultiplier 0.2
+sizeincrease 100
+stretchfactor 3
+airfriction 6
+rotate -180 180 4000 -4000
+// smoke 
+effect spiderbot_minigun_impact
+count 6
+type smoke
+color 0xd0d0a0 0xffffff
+tex 0 8
+size 10 20
+alpha 50 50 190
+sizeincrease 80
+velocityjitter 100 100 250
+velocitymultiplier 0.49
+gravity 1.3
+airfriction 10
+rotate -180 180 0 0
+// smoke 2
+effect spiderbot_minigun_impact
+count 7
+type spark
+color 0xd0d0a0 0xffffff
+tex 0 8
+size 15 19
+alpha 25 51 128
+airfriction 6
+originjitter 2 2 2
+velocityjitter 250 250 150
+velocitymultiplier 0.2
+sizeincrease 100
+stretchfactor 7.6
+// derbis
+effect spiderbot_minigun_impact
+notunderwater
+count 3
+type alphastatic
+tex 66 68
+color 0x99977D 0xFFFFFF
+size 6 8
+alpha 644 756 1484
+gravity 1.1
+airfriction 0.4
+sizeincrease -10
+velocitymultiplier 0.15
+originjitter 16 16 16
+velocityjitter 124 124 224
+rotate -180 180 -1000 1000
+// decal
+effect spiderbot_minigun_impact
+countabsolute 1
+type decal
+tex 56 59
+size 20 25
+alpha 256 256 0
+originjitter 16 16 16
+rotate -180 180 0 0
+
+effect spiderbot_rocket_explode
+countabsolute 1
+type decal
+tex 8 16
+size 72 72
+alpha 256 256 0
+originjitter 23 23 23
+lightradius 300
+lightradiusfade 1750
+lightcolor 8 4 0
+// shockwave
+effect spiderbot_rocket_explode
+countabsolute 1
+type static
+tex 33 33 
+size 22 22
+alpha 56 56 230
+color 0x8f0d00 0xff5a00
+sizeincrease 2400
+// glow
+effect spiderbot_rocket_explode
+countabsolute 1
+type static
+tex 64 64
+size 120 120
+alpha 156 156 830
+color 0x8f0d00 0xff5a00
+sizeincrease 240
+// fire effect
+effect spiderbot_rocket_explode
+notunderwater
+count 32
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 12 21
+sizeincrease 495
+alpha 200 256 812
+airfriction 8
+liquidfriction 8
+originjitter 100 100 100
+velocityjitter 512 512 512
+rotate -180 180 -50 50
+// fire effect 2
+effect spiderbot_rocket_explode
+notunderwater
+count 16
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 3 3
+sizeincrease 120
+alpha 200 256 912
+airfriction -2
+liquidfriction 8
+velocityjitter 412 412 412
+rotate -180 180 -150 150
+stretchfactor 10
+// fire rays
+effect spiderbot_rocket_explode
+notunderwater
+count 10
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 13 54
+sizeincrease 120
+alpha 200 256 1600
+airfriction -3
+liquidfriction 8
+originjitter 40 40 40
+velocityjitter 712 712 712
+stretchfactor 10
+// smoke
+effect spiderbot_rocket_explode
+type alphastatic
+notunderwater
+tex 0 8
+count 10
+size 10 15
+sizeincrease 280
+alpha 300 650 756
+originjitter 100 100 100
+velocityjitter 200 200 200
+airfriction 3
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+// smoke2
+effect spiderbot_rocket_explode
+type alphastatic
+notunderwater
+tex 0 8
+count 3
+size 100 150
+sizeincrease 30
+alpha 300 650 556
+originjitter 10 10 10
+velocityjitter 200 200 200
+airfriction 2
+gravity -0.5
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+// underwater bubbles
+effect spiderbot_rocket_explode
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 1 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 160 160 160
+velocityjitter 144 144 144
+// underwatershockwave
+effect spiderbot_rocket_explode
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 1200
+alpha 40 40 300
+
+
+effect spiderbot_rocket_thrust
+notunderwater
+count 3
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 5 10
+sizeincrease -40
+alpha 200 256 1600
+velocityjitter 20 20 20
+velocitymultiplier -1.4
+stretchfactor 0.9
+effect spiderbot_rocket_thrust
+notunderwater
+count 4
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 25 25
+sizeincrease -3000
+alpha 200 200 9000
+velocityjitter 60 60 60
+velocitymultiplier -1.4
+stretchfactor 1
+rotate -180 180 -500 500
+
+
+
+// long lasting smoke
+effect spiderbot_rocket_launch
+notunderwater
+count 8
+type smoke
+tex 0 8
+color 0xFFFFFF 0xD9C4B0
+size 30 30
+sizeincrease 20
+alpha 100 156 60
+velocityjitter 60 60 60
+velocitymultiplier -0.1
+airfriction 0.3
+gravity -0.01
+// fast smoke
+effect spiderbot_rocket_launch
+notunderwater
+count 14
+type smoke
+tex 0 8
+color 0xFFFFFF 0xD9C4B0
+size 30 30
+sizeincrease 20
+alpha 100 156 260
+gravity -0.3
+velocityjitter 160 160 60
+airfriction 0.3
+// fire
+effect spiderbot_rocket_launch
+notunderwater
+count 14
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 30 30
+sizeincrease 40
+velocitymultiplier 0.5
+alpha 200 256 1960
+velocityjitter 60 60 60
+airfriction 0.3
+stretchfactor 3
+airfriction 0.3
+//sparks
+effect spiderbot_rocket_launch
+notunderwater
+count 10
+type spark
+tex 40 40
+color 0xFFFFFF 0xD9C4B0
+size 1 4
+alpha 200 256 1000
+velocityjitter 160 160 160
+velocitymultiplier -0.5
+
+effect wakizashi_gun_impact
+count 15
+type spark
+color 0xff0000 0xc03535
+tex 41 41
+size 4 7
+alpha 256 512 1180
+airfriction 4
+gravity 3
+originjitter 40 40 10
+velocityjitter 350 350 550
+velocityoffset 0 0 700
+stretchfactor 0.9
+effect wakizashi_gun_impact
+type smoke
+count 24
+color 0xd0d0a0 0xc03535
+tex 0 8
+size 10 20
+alpha 50 90 150
+sizeincrease 80
+velocityjitter 250 250 450
+velocityoffset 0 0 600
+originjitter 40 40 10
+airfriction 4
+sizeincrease 80
+rotate -180 180 0 0
+effect wakizashi_gun_impact
+countabsolute 1
+type smoke
+tex 65 65
+color 0xff0000 0xc03535
+size 82 82
+alpha 250 300 680
+sizeincrease -180
+effect wakizashi_gun_impact
+countabsolute 1
+type smoke
+tex 33 33
+color 0xff0000 0xc03535
+size 40 40
+alpha 50 100 620
+sizeincrease 900
+rotate -180 180 400 -400
+effect wakizashi_gun_impact
+countabsolute 1
+type decal
+tex 59 59
+size 14 14
+alpha 256 256 0
+originjitter 16 16 16
+rotate -180 180 0 0
+
+effect wakizashi_gun_muzzleflash
+count 16
+type spark
+color 0xff0000 0xc03535
+tex 8 15
+size 5 7
+alpha 256 512 6280
+airfriction 12
+originjitter 2 2 2
+velocityjitter 200 200 200
+velocitymultiplier 0.2
+sizeincrease -10
+stretchfactor 0.7
+
+effect wakizashi_rocket_explode
+countabsolute 1
+type decal
+tex 8 16
+size 72 72
+alpha 256 256 0
+originjitter 23 23 23
+lightradius 300
+lightradiusfade 1750
+lightcolor 8 4 0
+// shockwave
+effect wakizashi_rocket_explode
+countabsolute 1
+type static
+tex 33 33 
+size 22 22
+alpha 56 56 230
+color 0x8f0d00 0xff5a00
+sizeincrease 2400
+// glow
+effect wakizashi_rocket_explode
+countabsolute 1
+type static
+tex 64 64
+size 120 120
+alpha 156 156 830
+color 0x8f0d00 0xff5a00
+sizeincrease 240
+// fire effect
+effect wakizashi_rocket_explode
+notunderwater
+count 64
+type static
+tex 48 55
+color 0xFFAE00 0xff5a00
+size 12 21
+sizeincrease 195
+alpha 200 256 512
+airfriction 2
+liquidfriction 8
+originjitter 10 10 10
+velocityjitter 512 512 512
+rotate -180 180 -50 50
+// fire rays
+effect wakizashi_rocket_explode
+notunderwater
+count 10
+type spark
+tex 48 55
+color 0xFFEA00 0xff5a00
+size 43 54
+sizeincrease 120
+alpha 200 256 1600
+airfriction -3
+liquidfriction 8
+originjitter 40 40 40
+velocityjitter 512 512 512
+stretchfactor 10
+// smoke
+effect wakizashi_rocket_explode
+type alphastatic
+notunderwater
+tex 0 8
+count 32
+size 10 15
+sizeincrease 230
+alpha 300 450 556
+originjitter 100 100 100
+velocityjitter 200 200 200
+airfriction 3
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+// bouncing sparks
+effect wakizashi_rocket_explode
+notunderwater
+count 14
+type spark
+tex 40 40
+color 0xffa35b 0xfff2be
+size 1 2
+alpha 644 956 884
+gravity 1
+airfriction 1
+liquidfriction 0.8
+velocityoffset 0 0 170
+originjitter 60 60 60
+velocityjitter 524 524 524
+// underwater bubbles
+effect wakizashi_rocket_explode
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 1 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 160 160 160
+velocityjitter 144 144 144
+// underwatershockwave
+effect wakizashi_rocket_explode
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 1200
+alpha 40 40 300
+
+effect wakizashi_rocket_thrust
+notunderwater
+countabsolute 3
+type spark
+tex 48 55
+color 0x00FFDD 0x6200FF
+size 14 19
+sizeincrease -2
+alpha 200 256 1600
+velocityjitter 60 60 60
+velocitymultiplier -1.1
+stretchfactor 1
+effect wakizashi_rocket_thrust
+notunderwater
+countabsolute 2
+type spark
+tex 48 55
+color 0xFFFF33 0xFFEE00
+size 5 10
+sizeincrease -2
+alpha 200 256 1900
+velocityjitter 60 60 60
+velocitymultiplier -0.3
+stretchfactor 3
+
+// long lasting smoke
+effect wakizashi_rocket_launch
+notunderwater
+count 8
+type smoke
+tex 0 8
+color 0xFFFFFF 0xD9C4B0
+size 3 30
+sizeincrease 20
+alpha 100 156 60
+velocityjitter 160 160 60
+velocitymultiplier -0.1
+airfriction 0.3
+// fast smoke
+effect wakizashi_rocket_launch
+notunderwater
+count 14
+type smoke
+tex 0 8
+color 0xFFFFFF 0xD9C4B0
+size 30 30
+sizeincrease 20
+alpha 100 156 260
+velocityjitter 160 160 60
+velocitymultiplier 0.4
+airfriction 0.3
+//sparks
+effect wakizashi_rocket_launch
+notunderwater
+count 10
+type spark
+tex 40 40
+color 0xFFFFFF 0xD9C4B0
+size 1 4
+alpha 200 256 1000
+velocityjitter 60 60 60
+velocitymultiplier -1.5
+
+effect wakizashi_booster_smoke
+type alphastatic
+notunderwater
+tex 0 8
+count 3
+size 60 100
+sizeincrease 10
+gravity -0.1
+alpha 200 750 200
+velocityjitter 40 40 40
+originjitter 60 60 60
+airfriction 2
+color 0xA69A80 0xB3B39F
+rotate -180 180 -20 20
+
+// decal
+effect raptor_cannon_impact
+countabsolute 1
+type decal
+tex 47 47
+size 24 24
+alpha 256 256 0
+originjitter 16 16 16
+rotate -180 180 0 0
+//spark
+effect raptor_cannon_impact
+notunderwater
+count 6
+type spark
+tex 40 40
+color 0xD400FF 0x571863
+size 1 1
+alpha 644 956 784
+gravity 1
+airfriction 0.2
+velocityoffset 0 0 150
+originjitter 16 16 16
+velocityjitter 124 124 524
+// smoke
+effect raptor_cannon_impact
+count 4
+type alphastatic
+tex 0 7
+size 50 50
+color 0x646364 0x151515
+alpha 428 428 600
+rotate -180 180 0 0
+velocityjitter 200 200 300
+velocityoffset 0 0 340
+gravity 0.7
+airfriction 2
+// fire
+effect raptor_cannon_impact
+notunderwater
+count 10
+type static
+tex 48 55
+color 0xD400FF 0x571863
+size 33 44
+sizeincrease 25
+alpha 200 256 812
+bounce 1.5
+airfriction 8
+liquidfriction 8
+originjitter 8 8 8
+velocityjitter 312 312 312
+
+
+effect raptor_cannon_muzzleflash
+count 16
+type spark
+color 0xD400FF 0x571863
+tex 8 15
+size 10 17
+alpha 1256 1512 56280
+airfriction 12
+originjitter 2 2 2
+velocityjitter 200 200 200
+velocitymultiplier 0.2
+sizeincrease -10
+stretchfactor 0.6
+effect raptor_cannon_muzzleflash
+countabsolute 1
+type static
+tex 48 55
+color 0xD400FF 0x571863
+size 32 32
+alpha 6056 20112 406280
+sizeincrease -100
+stretchfactor 0.1
+rotate -180 180 4000 -4000
+lightradius 150
+lightradiusfade 6000
+lightcolor 3 0 6
+
+// decal
+effect raptor_bomb_impact
+countabsolute 1
+type decal
+tex 8 16
+size 84 84
+alpha 256 256 0
+originjitter 16 16 16
+rotate -180 180 0 0
+
+//spark vertical
+effect raptor_bomb_impact
+count 3
+type spark
+color 0xff9c00 0xff3c00
+tex 48 55
+size 20 40
+alpha 300 300 600
+originjitter 10 10 10
+velocityjitter 40 40 120
+stretchfactor 210
+sizeincrease 50
+
+//fire
+effect raptor_bomb_impact
+count 4
+type static 
+color 0xff9c00 0xff3c00
+tex 48 55
+size 30 120
+alpha 300 300 500
+originjitter 10 10 10
+velocityjitter 950 950 0
+sizeincrease 230
+airfriction 2
+
+//smoke
+effect raptor_bomb_impact
+count 4
+type spark
+blend alpha
+tex 0 7
+size 120 180
+color 0x646364 0x151515
+alpha 428 428 600
+rotate -180 180 0 0
+velocityjitter 200 200 280
+velocityoffset 0 0 280
+originjitter 30 30 10
+stretchfactor 10
+
+//smoke 2
+effect raptor_bomb_impact
+count 4
+//type alphastatic
+type spark
+blend alpha
+tex 0 7
+size 40 100
+color 0x646364 0x151515
+alpha 328 328 350
+rotate -180 180 0 0
+velocityjitter 200 200 300
+velocityoffset 0 0 580
+originjitter 30 30 10
+sizeincrease 60
+airfriction 0.6
+gravity 2
+
+// sparks
+effect raptor_bomb_impact
+notunderwater
+count 5
+type spark
+tex 40 40
+color 0xffa35b 0xfff2be
+size 3 5
+alpha 644 956 984
+gravity 1
+airfriction 0.3
+velocityoffset 0 0 350
+originjitter 16 16 16
+velocityjitter 174 174 924
+stretchfactor 2
+
+effect raptor_bomb_spread
+notunderwater
+count 34
+type spark
+tex 40 40
+color 0xffa35b 0xfff2be
+size 1 2
+alpha 644 956 1284
+gravity 1
+airfriction 1
+liquidfriction 0.8
+originjitter 110 110 110
+velocityjitter 324 324 324
+
+
+// generic explosion size:big (biggest explosion ever)
+effect explosion_big
+countabsolute 1
+type decal
+tex 8 16
+size 172 172
+alpha 256 256 0
+originjitter 23 23 23
+lightradius 600
+lightradiusfade 1750
+lightcolor 8 4 0
+// shockwave
+effect explosion_big
+countabsolute 1
+type static
+tex 33 33 
+size 72 72
+alpha 56 56 330
+color 0x8f0d00 0xff5a00
+sizeincrease 4400
+// fire effect
+effect explosion_big
+notunderwater
+count 64
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 133 144
+sizeincrease 45
+alpha 200 256 712
+airfriction 8
+liquidfriction 8
+originjitter 80 80 80
+velocityjitter 2512 2512 2512
+// fire rays
+effect explosion_big
+notunderwater
+count 64
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 133 144
+sizeincrease 45
+alpha 200 256 800
+airfriction -5
+liquidfriction 8
+originjitter 40 40 40
+velocityjitter 512 512 512
+stretchfactor 10
+// smoke
+effect explosion_big
+type alphastatic
+notunderwater
+tex 0 8
+count 32
+size 50 100
+sizeincrease 244
+alpha 300 650 456
+velocityjitter 3444 3444 3444
+airfriction 8
+color 0x4F4B46 0x000000
+// bouncing sparks
+effect explosion_big
+notunderwater
+count 34
+type spark
+tex 40 40
+color 0xffa35b 0xfff2be
+size 3 4
+alpha 644 956 1284
+gravity 1
+airfriction 1
+liquidfriction 0.8
+velocityoffset 0 0 370
+originjitter 160 160 160
+velocityjitter 924 924 924
+stretchfactor 0.7
+// derbis
+effect explosion_big
+notunderwater
+count 16
+type alphastatic
+tex 66 68
+color 0xFFFFFF 0xcac5b4
+size 10 16
+alpha 444 1356 1184
+gravity 2.3
+airfriction 0.5
+velocityjitter 1800 1800 1800
+velocityoffset 0 0 970
+sizeincrease -5
+rotate -180 180 -1000 1000
+// underwater bubbles
+effect explosion_big
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 160 160 160
+velocityjitter 444 444 444
+// underwatershockwave
+effect explosion_big
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 2900
+alpha 40 40 300
+velocitymultiplier 0.3
+
+
+// generic explosion size:medium (it leaves rising smoke for a longer time)
+// shockwave
+effect explosion_medium
+countabsolute 1
+type static
+tex 33 33 
+size 72 72
+alpha 56 56 330
+color 0x8f0d00 0xff5a00
+sizeincrease 2400
+// fire effect
+effect explosion_medium
+notunderwater
+count 32
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 133 144
+sizeincrease 45
+alpha 200 256 712
+airfriction 8
+liquidfriction 8
+originjitter 30 30 30
+velocityjitter 1512 1512 1512
+rotate -180 180 -500 500
+// fire effect 2
+effect explosion_medium
+notunderwater
+count 32
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 73 94
+sizeincrease 40
+gravity -2
+alpha 200 256 612
+airfriction 8
+liquidfriction 8
+originjitter 30 30 30
+velocityjitter 1512 1512 1512
+rotate -180 180 -150 150
+// fire rays
+effect explosion_medium
+notunderwater
+count 14
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 43 74
+sizeincrease 40
+alpha 200 256 800
+airfriction -3
+liquidfriction 8
+originjitter 40 40 40
+velocityjitter 512 512 512
+stretchfactor 8
+// smoke 
+effect explosion_medium
+type alphastatic
+notunderwater
+tex 0 8
+count 5
+size 250 300
+sizeincrease -30
+alpha 300 650 756
+originjitter 100 100 100
+velocityjitter 200 200 200
+airfriction 3
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+// smoke 2
+effect explosion_medium
+type alphastatic
+notunderwater
+tex 0 8
+count 10
+size 50 100
+sizeincrease 50
+gravity -0.3
+alpha 300 650 256
+originjitter 100 100 100
+velocityjitter 500 500 500
+velocityoffset 0 0 200
+airfriction 3
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+// smoke rays
+effect explosion_medium
+type spark
+notunderwater
+tex 0 8
+count 13
+size 150 200
+sizeincrease 100
+alpha 140 255 350
+velocityjitter 250 250 250
+originjitter 40 40 40
+color 0x4F4B46 0x000000
+stretchfactor 50
+// bouncing sparks
+effect explosion_medium
+notunderwater
+count 14
+type spark
+tex 40 40
+color 0xffa35b 0xfff2be
+size 2 3
+alpha 644 956 984
+gravity 1
+airfriction 1
+liquidfriction 0.8
+velocityoffset 0 0 370
+originjitter 100 100 100
+velocityjitter 624 624 624
+stretchfactor 0.7
+// underwater bubbles
+effect explosion_medium
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 3 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 160 160 160
+velocityjitter 444 444 444
+// underwatershockwave
+effect explosion_medium
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 2900
+alpha 40 40 300
+velocitymultiplier 0.3
+
+// generic explosion size:small (its fire only, made to support other explosions)
+// shockwave
+effect explosion_small
+countabsolute 1
+type static
+tex 33 33 
+size 22 22
+alpha 56 56 330
+color 0x8f0d00 0xff5a00
+sizeincrease 2400
+// fire effect
+effect explosion_small
+notunderwater
+count 16
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 1 44
+sizeincrease 45
+alpha 200 256 1212
+airfriction 5
+liquidfriction 8
+velocityjitter 512 512 512
+rotate -180 180 -500 500
+// fire effect 2
+effect explosion_small
+notunderwater
+count 16
+type static
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 73 94
+sizeincrease 40
+alpha 200 256 812
+airfriction 8
+liquidfriction 8
+velocityjitter 912 912 912
+rotate -180 180 -150 150
+// fire rays
+effect explosion_small
+notunderwater
+count 14
+type spark
+tex 48 55
+color 0x8f0d00 0xff5a00
+size 13 54
+sizeincrease 30
+alpha 200 256 1300
+airfriction -3
+liquidfriction 8
+originjitter 40 40 40
+velocityjitter 512 512 512
+stretchfactor 8
+// underwater bubbles
+effect explosion_small
+underwater
+count 32
+type bubble
+tex 62 62
+color 0x404040 0x808080
+size 1 3
+alpha 128 256 64
+gravity -0.125
+bounce 1.5
+liquidfriction 0.25
+originjitter 160 160 160
+velocityjitter 144 144 144
+// underwatershockwave
+effect explosion_small
+underwater
+type smoke
+countabsolute 1
+tex 33 33
+size 30 30
+sizeincrease 1200
+alpha 40 40 300
+
+// big smoke ( for spamming on damaged stuff )
+effect smoke_big
+type alphastatic
+notunderwater
+tex 0 8
+count 3
+size 30 60
+sizeincrease 15
+gravity -0.5
+alpha 200 750 200
+originjitter 55 55 55
+velocityjitter 140 140 200
+velocityoffset 0 0 200
+airfriction 4
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
+
+// small smoke ( more precise than big one, for spamming on damaged parts like raptors spinner )
+effect smoke_small
+type alphastatic
+notunderwater
+tex 0 8
+count 3
+size 60 100
+sizeincrease -10
+gravity -0.5
+alpha 200 750 200
+velocityjitter 40 40 400
+velocityoffset 0 0 200
+airfriction 4
+color 0x4F4B46 0x000000
+rotate -180 180 -20 20
index e4d9632bcb458ec751958fe75220fe5da22a060e..664fca7ad3aa2b8e51e595a3e0e0f17bd5f30824 100644 (file)
@@ -8,7 +8,8 @@ mod_q3bsp_nolightmaps 0
 r_bloom 1
 r_coronas 1
 r_coronas_occlusionquery 1
-r_damageblur 0.4
+hud_postprocessing_maxbluralpha 0.5
+hud_powerup 0
 r_depthfirst 2
 r_drawdecals_drawdistance 500
 r_drawparticles_drawdistance 2000
index 0c3fef95b8cd4524e1052a0d23444a01a93fe9e2..769ca51217b5a36b2d5691f34ca3bf8fbe5fb6b7 100644 (file)
@@ -8,7 +8,8 @@ mod_q3bsp_nolightmaps 1
 r_bloom 0
 r_coronas 1
 r_coronas_occlusionquery 0
-r_damageblur 0
+hud_postprocessing_maxbluralpha 0
+hud_powerup 0
 r_depthfirst 0
 r_drawdecals_drawdistance 200
 r_drawparticles_drawdistance 500
index 5b9ea85f39f48e75ee90ce96188460fe7655b629..a6e5e7d0bd76b1f829cfa6761117040958c602bc 100644 (file)
@@ -8,7 +8,8 @@ mod_q3bsp_nolightmaps 0
 r_bloom 0
 r_coronas 1
 r_coronas_occlusionquery 0
-r_damageblur 0
+hud_postprocessing_maxbluralpha 0
+hud_powerup 0
 r_depthfirst 0
 r_drawdecals_drawdistance 300
 r_drawparticles_drawdistance 1000
index 1ee62d057729f09d4eb04be9082c675c1cfdeff8..dbad238261bf234989f3c1fc7fc6cc383daea6ee 100644 (file)
@@ -8,7 +8,8 @@ mod_q3bsp_nolightmaps 0
 r_bloom 0
 r_coronas 1
 r_coronas_occlusionquery 0
-r_damageblur 0
+hud_postprocessing_maxbluralpha 0
+hud_powerup 0
 r_depthfirst 1
 r_drawdecals_drawdistance 300
 r_drawparticles_drawdistance 1000
index ffd5af713e2fae60aa7942b7a4e1a017a6d0018b..6e6a1dcbbe96abc8b91f13090016ce4c40fec1b0 100644 (file)
@@ -8,7 +8,8 @@ mod_q3bsp_nolightmaps 1
 r_bloom 0
 r_coronas 1
 r_coronas_occlusionquery 0
-r_damageblur 0
+hud_postprocessing_maxbluralpha 0.5
+hud_powerup 0.5
 r_depthfirst 0
 r_drawdecals_drawdistance 100
 r_drawparticles_drawdistance 250
index e7a2efb3f1a0c368448853ae2ae779b037f24317..d6e501892b4fb334dc40a354e5b3d00888475e77 100644 (file)
@@ -8,7 +8,8 @@ mod_q3bsp_nolightmaps 0
 r_bloom 1
 r_coronas 1
 r_coronas_occlusionquery 1
-r_damageblur 0.4
+hud_postprocessing_maxbluralpha 0.5
+hud_powerup 0.5
 r_depthfirst 2
 r_drawdecals_drawdistance 500
 r_drawparticles_drawdistance 2000
index 218565408d372a4d3647ab023060e95b42d51575..47949e551b06203da8447f0425a42023c00eb50e 100644 (file)
@@ -8,7 +8,8 @@ mod_q3bsp_nolightmaps 0
 r_bloom 1
 r_coronas 1
 r_coronas_occlusionquery 1
-r_damageblur 0.4
+hud_postprocessing_maxbluralpha 0.5
+hud_powerup 0.5
 r_depthfirst 2
 r_drawdecals_drawdistance 500
 r_drawparticles_drawdistance 2000
index 76a7edf1fad45a5333f64ec13d3430c071efa4d2..67580e9daccdd08a4e6e8a66ce63fd7f42e7997f 100644 (file)
Binary files a/gfx/loading.tga and b/gfx/loading.tga differ
index 5f453bed6fd06bfe5918d341139166f5333cd60e..6cddc0ca32b09d1ca0b69b9c9ed574bab7e8bff3 100644 (file)
Binary files a/gfx/loading10.tga and b/gfx/loading10.tga differ
index 5fb261efc6cc1d8bc8416a6c266a83856c6613e0..0cee44b8c5ebb1385f428d99ac610a783dd6500c 100644 (file)
Binary files a/gfx/loading11.tga and b/gfx/loading11.tga differ
index 6345a9aa67343c06f38faa3f28e1450cab08a587..0314a97a7a1c4f836516d7d608ff9a11b8e49bcc 100644 (file)
Binary files a/gfx/loading12.tga and b/gfx/loading12.tga differ
diff --git a/gfx/loading13.tga b/gfx/loading13.tga
new file mode 100644 (file)
index 0000000..ef30878
Binary files /dev/null and b/gfx/loading13.tga differ
index 3aa4a29e150abc0068394c2a16c9761c4c936d33..63c4c4782023651f310c4c51aa5c3a6656450465 100644 (file)
Binary files a/gfx/loading2.tga and b/gfx/loading2.tga differ
index 639608565eafd28867b74cdebb00158f1aa02d15..42ae5cd48f228478a6ae26ac18f08571cfa53b2c 100644 (file)
Binary files a/gfx/loading3.tga and b/gfx/loading3.tga differ
index eaf44d09496ca033b8e57f97c1e79739117211be..62877a6729f2dcf2ca2e72520be72a041c790d68 100644 (file)
Binary files a/gfx/loading4.tga and b/gfx/loading4.tga differ
index c06d32320fd7370f5376f3feb839c3a1b476139a..96ec6c4a742a03742dc65aedf8178a07b7e0fe29 100644 (file)
Binary files a/gfx/loading5.tga and b/gfx/loading5.tga differ
index 7c8007c44680432d5f14cf900e20796951f65caf..a0e2fc85318dbf9081544ac239a531ee743e96da 100644 (file)
Binary files a/gfx/loading6.tga and b/gfx/loading6.tga differ
index 56aa4afc4b19b7bbd24c7bb01a5824004471ccdc..87d5f13e058959833fc64cb1a90237f7a004bc39 100644 (file)
Binary files a/gfx/loading7.tga and b/gfx/loading7.tga differ
index a41d344ef8b8e8b225d8f3d534a830aa1fc3078c..c8689704489adb6baf9b7bc5a0b4c3e2cef98a63 100644 (file)
Binary files a/gfx/loading8.tga and b/gfx/loading8.tga differ
index dc636036947a0671376bf6fc9528afa92ad0db96..ac758099aa2eda35a61f45fd31c58dd3c688449d 100644 (file)
Binary files a/gfx/loading9.tga and b/gfx/loading9.tga differ
diff --git a/gfx/vehicles/axh-bracket.tga b/gfx/vehicles/axh-bracket.tga
new file mode 100644 (file)
index 0000000..82f0796
Binary files /dev/null and b/gfx/vehicles/axh-bracket.tga differ
diff --git a/gfx/vehicles/axh-cross.tga b/gfx/vehicles/axh-cross.tga
new file mode 100644 (file)
index 0000000..69e1c0b
Binary files /dev/null and b/gfx/vehicles/axh-cross.tga differ
diff --git a/gfx/vehicles/axh-dropcross.tga b/gfx/vehicles/axh-dropcross.tga
new file mode 100644 (file)
index 0000000..e8ba095
Binary files /dev/null and b/gfx/vehicles/axh-dropcross.tga differ
diff --git a/gfx/vehicles/axh-ring.tga b/gfx/vehicles/axh-ring.tga
new file mode 100644 (file)
index 0000000..bb3ade5
Binary files /dev/null and b/gfx/vehicles/axh-ring.tga differ
diff --git a/gfx/vehicles/axh-special1.tga b/gfx/vehicles/axh-special1.tga
new file mode 100644 (file)
index 0000000..184a065
Binary files /dev/null and b/gfx/vehicles/axh-special1.tga differ
diff --git a/gfx/vehicles/axh-special2.tga b/gfx/vehicles/axh-special2.tga
new file mode 100644 (file)
index 0000000..caad1d7
Binary files /dev/null and b/gfx/vehicles/axh-special2.tga differ
diff --git a/gfx/vehicles/axh-tag.tga b/gfx/vehicles/axh-tag.tga
new file mode 100644 (file)
index 0000000..4eb3b66
Binary files /dev/null and b/gfx/vehicles/axh-tag.tga differ
diff --git a/gfx/vehicles/axh-target.tga b/gfx/vehicles/axh-target.tga
new file mode 100644 (file)
index 0000000..8c05908
Binary files /dev/null and b/gfx/vehicles/axh-target.tga differ
diff --git a/gfx/vehicles/axh-x.tga b/gfx/vehicles/axh-x.tga
new file mode 100644 (file)
index 0000000..f6a4fce
Binary files /dev/null and b/gfx/vehicles/axh-x.tga differ
diff --git a/gfx/vehicles/bar_dwn_left.tga b/gfx/vehicles/bar_dwn_left.tga
new file mode 100644 (file)
index 0000000..011f9a9
Binary files /dev/null and b/gfx/vehicles/bar_dwn_left.tga differ
diff --git a/gfx/vehicles/bar_dwn_right.tga b/gfx/vehicles/bar_dwn_right.tga
new file mode 100644 (file)
index 0000000..e93b5e6
Binary files /dev/null and b/gfx/vehicles/bar_dwn_right.tga differ
diff --git a/gfx/vehicles/bar_up_left.tga b/gfx/vehicles/bar_up_left.tga
new file mode 100644 (file)
index 0000000..f49d205
Binary files /dev/null and b/gfx/vehicles/bar_up_left.tga differ
diff --git a/gfx/vehicles/bar_up_right.tga b/gfx/vehicles/bar_up_right.tga
new file mode 100644 (file)
index 0000000..a3b5910
Binary files /dev/null and b/gfx/vehicles/bar_up_right.tga differ
diff --git a/gfx/vehicles/bullets.tga b/gfx/vehicles/bullets.tga
new file mode 100644 (file)
index 0000000..ff853ee
Binary files /dev/null and b/gfx/vehicles/bullets.tga differ
diff --git a/gfx/vehicles/frame.tga b/gfx/vehicles/frame.tga
new file mode 100644 (file)
index 0000000..92a6573
Binary files /dev/null and b/gfx/vehicles/frame.tga differ
diff --git a/gfx/vehicles/health.tga b/gfx/vehicles/health.tga
new file mode 100644 (file)
index 0000000..3956a3f
Binary files /dev/null and b/gfx/vehicles/health.tga differ
diff --git a/gfx/vehicles/hud_bg.tga b/gfx/vehicles/hud_bg.tga
deleted file mode 100644 (file)
index a2ba3b3..0000000
Binary files a/gfx/vehicles/hud_bg.tga and /dev/null differ
diff --git a/gfx/vehicles/raptor.tga b/gfx/vehicles/raptor.tga
new file mode 100644 (file)
index 0000000..9a2519a
Binary files /dev/null and b/gfx/vehicles/raptor.tga differ
diff --git a/gfx/vehicles/raptor_bombs.tga b/gfx/vehicles/raptor_bombs.tga
new file mode 100644 (file)
index 0000000..9012fb2
Binary files /dev/null and b/gfx/vehicles/raptor_bombs.tga differ
diff --git a/gfx/vehicles/raptor_guns.tga b/gfx/vehicles/raptor_guns.tga
new file mode 100644 (file)
index 0000000..0d0012a
Binary files /dev/null and b/gfx/vehicles/raptor_guns.tga differ
diff --git a/gfx/vehicles/rocket.tga b/gfx/vehicles/rocket.tga
new file mode 100644 (file)
index 0000000..f0385b9
Binary files /dev/null and b/gfx/vehicles/rocket.tga differ
diff --git a/gfx/vehicles/shield.tga b/gfx/vehicles/shield.tga
new file mode 100644 (file)
index 0000000..916268f
Binary files /dev/null and b/gfx/vehicles/shield.tga differ
diff --git a/gfx/vehicles/shiled.tga b/gfx/vehicles/shiled.tga
deleted file mode 100644 (file)
index bd728e2..0000000
Binary files a/gfx/vehicles/shiled.tga and /dev/null differ
diff --git a/gfx/vehicles/vh-shield.tga b/gfx/vehicles/vh-shield.tga
new file mode 100644 (file)
index 0000000..bd728e2
Binary files /dev/null and b/gfx/vehicles/vh-shield.tga differ
index 87b42330a576f91f366730b7d09e93c3ab8e32cc..45df74f223564da7c19369f7158363dd6ca1f681 100644 (file)
@@ -9,7 +9,7 @@ alias seekdemo "_seekdemo_1_$_demo_seeking $1"
 alias _seekdemo_1_0 "cl_cmd rpn time dup        \"$1\" add dup /_demo_time exch def le /_demo_time_increasing exch def; _seekdemo_2"
 alias _seekdemo_1_1 "cl_cmd rpn time _demo_time \"$1\" add dup /_demo_time exch def le /_demo_time_increasing exch def; _seekdemo_2"
 alias _seekdemo_2 "_demo_seeking 1; r_render 0; snd_startnonloopingsounds 0; _seekdemo_3_$_demo_time_increasing"
-alias _seekdemo_3_0 "playdemo \"$_demo_name\"; _seekdemo_4; defer 2 _seekdemo_9_2"
+alias _seekdemo_3_0 "playdemo \"$_demo_name\"; _seekdemo_4; defer 10 _seekdemo_9_2"
 alias _seekdemo_3_1 "_seekdemo_7"
 alias _seekdemo_4 "set _demo_good 0; cl_cmd rpn /_demo_good 1 def; _seekdemo_5"
 alias _seekdemo_5 "_seekdemo_6_$_demo_good"
index 15fd023e925088448321d934e0b81243143537b6..7182fe33a297282ea2405cb95e048e2a86c6620b 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 0.1preview\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-04-30 10:05+0200\n"
+"POT-Creation-Date: 2011-06-20 20:46+0200\n"
 "PO-Revision-Date: 2011-04-20 10:46+0200\n"
 "Last-Translator: Rudolf Polzer <divVerent@xonotic.org>\n"
 "Language-Team: Rudolf Polzer <divVerent@xonotic.org>\n"
@@ -111,7 +111,7 @@ msgstr "Entwickler"
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_advanced.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c:269
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_waypoint.c:41
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:57
 #: qcsrc/menu/xonotic/dialog_settings_misc_cvars.c:61
 #: qcsrc/menu/xonotic/dialog_singleplayer_winner.c:21
 msgid "OK"
@@ -158,6 +158,10 @@ msgstr "Munitionsanzeige:"
 msgid "Show only current ammo type"
 msgstr "Nur aktuellen Munitionstyp anzeigen"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:28
+msgid "Align icon:"
+msgstr "Icon ausrichten:"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_ammo.c:29
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:28
 #: qcsrc/menu/xonotic/dialog_hudpanel_healtharmor.c:40
@@ -283,6 +287,100 @@ msgstr "Eintrags-Sichtbarkeit:"
 msgid "Entry fadetime:"
 msgstr "Eintrags-Ausblendung:"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:4
+msgid "Physics Panel"
+msgstr "Physik-Panel"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
+msgid "Panel disabled"
+msgstr "Panel nicht anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:24
+msgid "Panel enabled if not observing"
+msgstr "Panel beim Spielen anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:25
+#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
+#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
+msgid "Panel always enabled"
+msgstr "Panel immer anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:31
+msgid "Status bar"
+msgstr "Statusleiste"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:33
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
+msgid "Left align"
+msgstr "Links"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:34
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:52
+msgid "Right align"
+msgstr "Rechts"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:35
+msgid "Inward align"
+msgstr "Innen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:36
+msgid "Outward align"
+msgstr "Außen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:40
+msgid "Flip speed/acceleration positions"
+msgstr "Geschwindigkeit/Beschleunigung tauschen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:44
+msgid "Speed:"
+msgstr "Geschwindigkeit:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:45
+msgid "Include vertical speed"
+msgstr "Mit vertikaler Geschwindigkeit"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:56
+msgid "Speed unit:"
+msgstr "Geschwindigkeitseinheit:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:58
+msgid "qu/s"
+msgstr "qu/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:59
+msgid "m/s"
+msgstr "m/s"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:60
+msgid "km/h"
+msgstr "km/h"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:61
+msgid "mph"
+msgstr "mph"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:62
+msgid "knots"
+msgstr "Knoten"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:64
+msgid "Show"
+msgstr "Anzeigen"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:67
+msgid "Top speed"
+msgstr "Geschwindigkeitsrekord:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:73
+msgid "Acceleration:"
+msgstr "Beschleunigung:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_physics.c:74
+msgid "Include vertical acceleration"
+msgstr "Mit vertikaler Beschleunigung"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_powerups.c:4
 msgid "Powerups Panel"
 msgstr "Bonus-Panel"
@@ -295,20 +393,10 @@ msgstr "Strength und Shield vertauschen"
 msgid "Pressed Keys Panel"
 msgstr "Gedrückte-Tasten-Panel"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:21
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:21
-msgid "Panel disabled"
-msgstr "Panel nicht anzeigen"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:22
 msgid "Panel enabled when spectating"
 msgstr "Panel beim Zuschauen anzeigen"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:23
-#: qcsrc/menu/xonotic/dialog_hudpanel_radar.c:23
-msgid "Panel always enabled"
-msgstr "Panel immer anzeigen"
-
 #: qcsrc/menu/xonotic/dialog_hudpanel_pressedkeys.c:30
 msgid "Forced aspect:"
 msgstr "Aspektverhältnis:"
@@ -333,7 +421,7 @@ msgstr "Radar:"
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:43
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:82
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup.c:154
-#: qcsrc/menu/xonotic/util.qc:608
+#: qcsrc/menu/xonotic/util.qc:600
 msgid "Alpha:"
 msgstr "Alpha:"
 
@@ -389,6 +477,26 @@ msgstr "nie vergrößert"
 msgid "Score Panel"
 msgstr "Punkte-Panel"
 
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:22
+msgid "Score:"
+msgstr "Punkte:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:25
+msgid "Rankings:"
+msgstr "Platzierungen:"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:26
+msgid "Off"
+msgstr "Aus"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:27
+msgid "And me"
+msgstr "Auch für mich"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_score.c:28
+msgid "Pure"
+msgstr "Rein"
+
 #: qcsrc/menu/xonotic/dialog_hudpanel_timer.c:4
 msgid "Timer Panel"
 msgstr "Zeit-Panel"
@@ -431,11 +539,11 @@ msgstr "%ds"
 msgid "Fade effect:"
 msgstr "Ausblendeeffekt:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:33
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
 msgid "EF^None"
 msgstr "keiner"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:35
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:36
 msgid "Slide"
 msgstr "Schieben"
 
@@ -443,39 +551,43 @@ msgstr "Schieben"
 msgid "Alpha"
 msgstr "Alpha"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:40
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:38
+msgid "EF^Both"
+msgstr "beide"
+
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:42
 msgid "Weapon icons:"
 msgstr "Waffensymbole:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:43
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
 msgid "Show weapon ID as:"
 msgstr "Waffen-ID zeigen als:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:44
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
 msgid "SHOWAS^None"
 msgstr "nichts"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:45
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:47
 msgid "Number"
 msgstr "Zahl"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:46
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:48
 msgid "Bind"
 msgstr "Taste"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:49
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:51
 msgid "Show Accuracy"
 msgstr "Trefferquote zeigen"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:50
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:52
 msgid "Show Ammo"
 msgstr "Munition zeigen"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:55
 msgid "Ammo bar color:"
 msgstr "Muntionsleistenfarbe:"
 
-#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:59
+#: qcsrc/menu/xonotic/dialog_hudpanel_weapons.c:61
 msgid "Ammo bar alpha:"
 msgstr "Munitionsleistenalpha:"
 
@@ -487,20 +599,24 @@ msgstr "HUD-Konfiguration"
 msgid "Panel background defaults:"
 msgstr "Panel-Standardhintergrund:"
 
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:23 qcsrc/menu/xonotic/util.qc:575
+msgid "Background:"
+msgstr "Hintergrund:"
+
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:25
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:37
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:52
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:586
-#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:619
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:91 qcsrc/menu/xonotic/util.qc:578
+#: qcsrc/menu/xonotic/util.qc:594 qcsrc/menu/xonotic/util.qc:611
 msgid "Disable"
 msgstr "Aus"
 
 #: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:30
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:591
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:77 qcsrc/menu/xonotic/util.qc:583
 msgid "Color:"
 msgstr "Farbe:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:599
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:35 qcsrc/menu/xonotic/util.qc:591
 msgid "Border size:"
 msgstr "Rahmengröße:"
 
@@ -509,11 +625,11 @@ msgstr "Rahmengröße:"
 msgid "Team color:"
 msgstr "Teamfarbe:"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:625
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:58 qcsrc/menu/xonotic/util.qc:617
 msgid "Test team color in configure mode"
 msgstr "Teamfarbe bei Konfiguration testen"
 
-#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:628
+#: qcsrc/menu/xonotic/dialog_hudsetup_exit.c:61 qcsrc/menu/xonotic/util.qc:620
 msgid "Padding:"
 msgstr "Abstand:"
 
@@ -671,7 +787,7 @@ msgid "Mutators..."
 msgstr "Mutators..."
 
 #: qcsrc/menu/xonotic/dialog_multiplayer_create.c:98
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:84
+#: qcsrc/menu/xonotic/dialog_settings_misc.c:57
 msgid "Advanced settings..."
 msgstr "Erweiterte Einstellungen..."
 
@@ -1255,7 +1371,7 @@ msgstr "Schadenseffekt:"
 #: qcsrc/menu/xonotic/dialog_settings_effects.c:194
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:30
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:41
-#: qcsrc/menu/xonotic/dialog_settings_video.c:105
+#: qcsrc/menu/xonotic/dialog_settings_video.c:109
 msgid "Apply immediately"
 msgstr "Sofort anwenden"
 
@@ -1315,15 +1431,11 @@ msgstr "Automatisch auf beste Waffe wechseln"
 msgid "Draw 1st person weapon model"
 msgstr "Waffe in 3D anzeigen"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:48
-msgid "Left align"
-msgstr "Links"
-
 #: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:50
-msgid "Right align"
-msgstr "Rechts"
+msgid "Center"
+msgstr "Mittig"
 
-#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:53
+#: qcsrc/menu/xonotic/dialog_multiplayer_playersetup_weapons.c:55
 msgid "Flip view horizontally"
 msgstr "3D-Ansicht spiegeln"
 
@@ -1834,29 +1946,29 @@ msgstr "Bearbeiten..."
 msgid "Sensitivity:"
 msgstr "Empfindlichkeit:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:49
+#: qcsrc/menu/xonotic/dialog_settings_input.c:51
 msgid "UI mouse speed:"
 msgstr "Mausgeschwindigkeit:"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:52
+#: qcsrc/menu/xonotic/dialog_settings_input.c:55
 msgid "Mouse filter"
 msgstr "Mausfilterung"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:54
+#: qcsrc/menu/xonotic/dialog_settings_input.c:57
 msgid "Invert mouse"
 msgstr "Höhe invertieren"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:57
-#: qcsrc/menu/xonotic/dialog_settings_input.c:59
+#: qcsrc/menu/xonotic/dialog_settings_input.c:60
+#: qcsrc/menu/xonotic/dialog_settings_input.c:62
 msgid "Use joystick input"
 msgstr "Joystick verwenden"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:62
-#: qcsrc/menu/xonotic/dialog_settings_input.c:64
+#: qcsrc/menu/xonotic/dialog_settings_input.c:65
+#: qcsrc/menu/xonotic/dialog_settings_input.c:67
 msgid "Turn off OS mouse acceleration"
 msgstr "Mausbeschleunigung deaktivieren"
 
-#: qcsrc/menu/xonotic/dialog_settings_input.c:66
+#: qcsrc/menu/xonotic/dialog_settings_input.c:69
 msgid "\"enter console\" also closes"
 msgstr "\"Konsole Ã¶ffnen\" schließt auch"
 
@@ -1897,42 +2009,6 @@ msgid "Show frames per second"
 msgstr "Frames pro Sekunde anzeigen"
 
 #: qcsrc/menu/xonotic/dialog_settings_misc.c:53
-msgid "Speedometer"
-msgstr "Tachometer"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:56
-msgid "qu/s (hidden)"
-msgstr "qu/s (ohne Einheit)"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:58
-msgid "qu/s"
-msgstr "qu/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:60
-msgid "m/s"
-msgstr "m/s"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:64
-msgid "km/h"
-msgstr "km/h"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:66
-msgid "mph"
-msgstr "mph"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:68
-msgid "knots"
-msgstr "Knoten"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:71
-msgid "Show accelerometer"
-msgstr "Akzelerometer anzeigen"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:74
-msgid "Accelerometer scale:"
-msgstr "Akzelerometer-Skalierung:"
-
-#: qcsrc/menu/xonotic/dialog_settings_misc.c:80
 msgid "Minimize input latency"
 msgstr "Eingabelatenz minimieren"
 
@@ -2128,19 +2204,19 @@ msgstr "Kontrast:"
 msgid "Gamma:"
 msgstr "Gamma:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:89
+#: qcsrc/menu/xonotic/dialog_settings_video.c:91
 msgid "Contrast boost:"
 msgstr "Kontrasterhöhung:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:92
+#: qcsrc/menu/xonotic/dialog_settings_video.c:96
 msgid "Saturation:"
 msgstr "Sättigung:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:98
+#: qcsrc/menu/xonotic/dialog_settings_video.c:102
 msgid "LIT^Ambient:"
 msgstr "Umgebungslicht:"
 
-#: qcsrc/menu/xonotic/dialog_settings_video.c:101
+#: qcsrc/menu/xonotic/dialog_settings_video.c:105
 msgid "Intensity:"
 msgstr "Lichtstärke:"
 
@@ -2316,7 +2392,7 @@ msgstr "^1%s TESTVERSION"
 msgid "Update to %s now!"
 msgstr "Jetzt auf %s updaten!"
 
-#: qcsrc/menu/xonotic/util.qc:509
+#: qcsrc/menu/xonotic/util.qc:501
 msgid ""
 "^1ERROR: Texture compression is required but not supported.\n"
 "^1Expect visual problems.\n"
@@ -2324,94 +2400,90 @@ msgstr ""
 "^1FEHLER: Texturekompression ist notwendig aber nicht unterstützt.\n"
 "^1Darstellungsprobleme sind zu erwarten.\n"
 
-#: qcsrc/menu/xonotic/util.qc:531
+#: qcsrc/menu/xonotic/util.qc:523
 msgid "Arena"
 msgstr "Arena"
 
-#: qcsrc/menu/xonotic/util.qc:532
+#: qcsrc/menu/xonotic/util.qc:524
 msgid "Assault"
 msgstr "Assault"
 
-#: qcsrc/menu/xonotic/util.qc:533
+#: qcsrc/menu/xonotic/util.qc:525
 msgid "Capture The Flag"
 msgstr "Capture The Flag"
 
-#: qcsrc/menu/xonotic/util.qc:534
+#: qcsrc/menu/xonotic/util.qc:526
 msgid "Clan Arena"
 msgstr "Clan Arena"
 
-#: qcsrc/menu/xonotic/util.qc:535
+#: qcsrc/menu/xonotic/util.qc:527
 msgid "Deathmatch"
 msgstr "Deathmatch"
 
-#: qcsrc/menu/xonotic/util.qc:536
+#: qcsrc/menu/xonotic/util.qc:528
 msgid "Domination"
 msgstr "Domination"
 
-#: qcsrc/menu/xonotic/util.qc:537
+#: qcsrc/menu/xonotic/util.qc:529
 msgid "Freeze Tag"
 msgstr "Freeze Tag"
 
-#: qcsrc/menu/xonotic/util.qc:538
+#: qcsrc/menu/xonotic/util.qc:530
 msgid "Keepaway"
 msgstr "Keepaway"
 
-#: qcsrc/menu/xonotic/util.qc:539
+#: qcsrc/menu/xonotic/util.qc:531
 msgid "Key Hunt"
 msgstr "Key Hunt"
 
-#: qcsrc/menu/xonotic/util.qc:540
+#: qcsrc/menu/xonotic/util.qc:532
 msgid "Last Man Standing"
 msgstr "Last Man Standing"
 
-#: qcsrc/menu/xonotic/util.qc:541
+#: qcsrc/menu/xonotic/util.qc:533
 msgid "Nexball"
 msgstr "Nexball"
 
-#: qcsrc/menu/xonotic/util.qc:542
+#: qcsrc/menu/xonotic/util.qc:534
 msgid "Onslaught"
 msgstr "Onslaught"
 
-#: qcsrc/menu/xonotic/util.qc:543
+#: qcsrc/menu/xonotic/util.qc:535
 msgid "Race"
 msgstr "Race"
 
-#: qcsrc/menu/xonotic/util.qc:544
+#: qcsrc/menu/xonotic/util.qc:536
 msgid "Race CTS"
 msgstr "Race CTS"
 
-#: qcsrc/menu/xonotic/util.qc:545
+#: qcsrc/menu/xonotic/util.qc:537
 msgid "Runematch"
 msgstr "Runematch"
 
-#: qcsrc/menu/xonotic/util.qc:546
+#: qcsrc/menu/xonotic/util.qc:538
 msgid "Team Deathmatch"
 msgstr "Team Deathmatch"
 
-#: qcsrc/menu/xonotic/util.qc:565
+#: qcsrc/menu/xonotic/util.qc:557
 #, c-format
 msgid "@!#%'n Tuba Throwing"
 msgstr "@!#%'n Tuba-Werfen"
 
-#: qcsrc/menu/xonotic/util.qc:583
-msgid "Background:"
-msgstr "Hintergrund:"
-
-#: qcsrc/menu/xonotic/util.qc:585 qcsrc/menu/xonotic/util.qc:601
-#: qcsrc/menu/xonotic/util.qc:610 qcsrc/menu/xonotic/util.qc:618
-#: qcsrc/menu/xonotic/util.qc:630
+#: qcsrc/menu/xonotic/util.qc:577 qcsrc/menu/xonotic/util.qc:593
+#: qcsrc/menu/xonotic/util.qc:602 qcsrc/menu/xonotic/util.qc:610
+#: qcsrc/menu/xonotic/util.qc:622
 msgid "Default"
 msgstr "Standard"
 
-#: qcsrc/menu/xonotic/util.qc:596
+#: qcsrc/menu/xonotic/util.qc:588
 msgid "Use default"
 msgstr "Standard verwenden"
 
-#: qcsrc/menu/xonotic/util.qc:616
+#: qcsrc/menu/xonotic/util.qc:608
 msgid "Team Color:"
 msgstr "Teamfarbe:"
 
-#: qcsrc/menu/xonotic/util.qh:49
+#: qcsrc/menu/xonotic/util.qh:47
 msgid "Enable panel"
 msgstr "Panel aktivieren"
 
@@ -2526,27 +2598,27 @@ msgstr "%s hat von %ss Feuerball probiert"
 msgid "Mortar"
 msgstr "Mortar"
 
-#: qcsrc/server/w_grenadelauncher.qc:378
+#: qcsrc/server/w_grenadelauncher.qc:379
 #, c-format
 msgid "%s tried out his own grenade"
 msgstr "%s wollte wissen, ob seine Granate funktioniert"
 
-#: qcsrc/server/w_grenadelauncher.qc:380
+#: qcsrc/server/w_grenadelauncher.qc:381
 #, c-format
 msgid "%s detonated"
 msgstr "%s verfing sich in der eigenen Detonation"
 
-#: qcsrc/server/w_grenadelauncher.qc:386
+#: qcsrc/server/w_grenadelauncher.qc:387
 #, c-format
 msgid "%s didn't see %s's grenade"
 msgstr "%s hat %ss Granate nicht gesehen"
 
-#: qcsrc/server/w_grenadelauncher.qc:388
+#: qcsrc/server/w_grenadelauncher.qc:389
 #, c-format
 msgid "%s almost dodged %s's grenade"
 msgstr "%s ist fast %ss Granate ausgewichen"
 
-#: qcsrc/server/w_grenadelauncher.qc:390
+#: qcsrc/server/w_grenadelauncher.qc:391
 #, c-format
 msgid "%s ate %s's grenade"
 msgstr "%s nahm %ss Granate in den Mund"
@@ -2555,17 +2627,17 @@ msgstr "%s nahm %ss Granate in den Mund"
 msgid "Hagar"
 msgstr "Hagar"
 
-#: qcsrc/server/w_hagar.qc:209 qcsrc/server/w_seeker.qc:655
+#: qcsrc/server/w_hagar.qc:382 qcsrc/server/w_seeker.qc:655
 #, c-format
 msgid "%s played with tiny rockets"
 msgstr "%s hat mit kleinen Raketen gespielt"
 
-#: qcsrc/server/w_hagar.qc:213
+#: qcsrc/server/w_hagar.qc:386
 #, c-format
 msgid "%s hoped %s's missiles wouldn't bounce"
 msgstr "%s hat gehofft, dass %ss Raketen nicht von Wänden abprallen"
 
-#: qcsrc/server/w_hagar.qc:215 qcsrc/server/w_seeker.qc:661
+#: qcsrc/server/w_hagar.qc:388 qcsrc/server/w_seeker.qc:661
 #, c-format
 msgid "%s was pummeled by %s"
 msgstr "^1%s^1 wurde von %s^1 erwischt"
@@ -2584,7 +2656,7 @@ msgid "Grappling Hook"
 msgstr "Grappling Hook"
 
 #: qcsrc/server/w_hook.qc:266 qcsrc/server/w_minstanex.qc:290
-#: qcsrc/server/w_nex.qc:267 qcsrc/server/w_porto.qc:296
+#: qcsrc/server/w_nex.qc:253 qcsrc/server/w_porto.qc:296
 #: qcsrc/server/w_shotgun.qc:203 qcsrc/server/w_uzi.qc:317
 #, c-format
 msgid "%s did the impossible"
@@ -2618,22 +2690,22 @@ msgstr "^1%s^1 wurde von %s^1 zu Tode gelasert"
 msgid "Mine Layer"
 msgstr "Mine Layer"
 
-#: qcsrc/server/w_minelayer.qc:495 qcsrc/server/w_rocketlauncher.qc:500
+#: qcsrc/server/w_minelayer.qc:522 qcsrc/server/w_rocketlauncher.qc:501
 #, c-format
 msgid "%s exploded"
 msgstr "%s ist explodiert"
 
-#: qcsrc/server/w_minelayer.qc:499
+#: qcsrc/server/w_minelayer.qc:526
 #, c-format
 msgid "%s got too close to %s's mine"
 msgstr "%s ist %ss Mine zu nahe getreten"
 
-#: qcsrc/server/w_minelayer.qc:501
+#: qcsrc/server/w_minelayer.qc:528
 #, c-format
 msgid "%s almost dodged %s's mine"
 msgstr "%s ist fast %ss Mine ausgewichen"
 
-#: qcsrc/server/w_minelayer.qc:503
+#: qcsrc/server/w_minelayer.qc:530
 #, c-format
 msgid "%s stepped on %s's mine"
 msgstr "%s ist auf %ss Mine gelatscht"
@@ -2642,7 +2714,7 @@ msgstr "%s ist auf %ss Mine gelatscht"
 msgid "MinstaNex"
 msgstr "MinstaNex"
 
-#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:269
+#: qcsrc/server/w_minstanex.qc:292 qcsrc/server/w_nex.qc:255
 #, c-format
 msgid "%s has been vaporized by %s"
 msgstr "^1%s^1 wurde von %s^1 vernichtet"
@@ -2660,21 +2732,60 @@ msgstr "Port-O-Launch"
 msgid "%s felt %s doing the impossible to him"
 msgstr "%s hat gespürt, wie %s das Unmögliche für ihn getan hat"
 
+#: qcsrc/server/w_rifle.qc:2
+msgid "Rifle"
+msgstr "Gewehr"
+
+#: qcsrc/server/w_rifle.qc:233
+#, c-format
+msgid "%s shot themself automatically"
+msgstr "%s hat sich vollautomatisch selbst erschossen"
+
+#: qcsrc/server/w_rifle.qc:235
+#, c-format
+msgid "%s sniped themself somehow"
+msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
+
+#: qcsrc/server/w_rifle.qc:242
+#, c-format
+msgid "%s failed to hide from %s's bullet hail"
+msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
+
+#: qcsrc/server/w_rifle.qc:244
+#, c-format
+msgid "%s died in %s's bullet hail"
+msgstr "%s ist in %ss Kugelhagel gefallen"
+
+#: qcsrc/server/w_rifle.qc:251
+#, c-format
+msgid "%s failed to hide from %s's rifle"
+msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
+
+#: qcsrc/server/w_rifle.qc:256
+#, c-format
+msgid "%s got hit in the head by %s"
+msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
+
+#: qcsrc/server/w_rifle.qc:258 qcsrc/server/w_uzi.qc:321
+#, c-format
+msgid "%s was sniped by %s"
+msgstr "^1%s^1 wurde von %s^1 erledigt"
+
 #: qcsrc/server/w_rocketlauncher.qc:2
 msgid "Rocket Launcher"
 msgstr "Rocket Launcher"
 
-#: qcsrc/server/w_rocketlauncher.qc:504
+#: qcsrc/server/w_rocketlauncher.qc:505
 #, c-format
 msgid "%s got too close to %s's rocket"
 msgstr "%s ist %ss Rakete zu nahe getreten"
 
-#: qcsrc/server/w_rocketlauncher.qc:506
+#: qcsrc/server/w_rocketlauncher.qc:507
 #, c-format
 msgid "%s almost dodged %s's rocket"
 msgstr "%s ist fast %ss Rakete ausgewichen"
 
-#: qcsrc/server/w_rocketlauncher.qc:508
+#: qcsrc/server/w_rocketlauncher.qc:509
 #, c-format
 msgid "%s ate %s's rocket"
 msgstr "%s hat %ss Rakete in den Mund genommen"
@@ -2702,45 +2813,6 @@ msgstr "%2$1s ^7hat %1$s ^7ein wenig mit einer großen Schrotflinte geschlagen"
 msgid "%s was gunned by %s"
 msgstr "^1%s^1 wurde von %s^1 erschossen"
 
-#: qcsrc/server/w_rifle.qc:2
-msgid "Sniper Rifle"
-msgstr "Sniper Rifle"
-
-#: qcsrc/server/w_rifle.qc:229
-#, c-format
-msgid "%s shot themself automatically"
-msgstr "%s hat sich vollautomatisch selbst erschossen"
-
-#: qcsrc/server/w_rifle.qc:231
-#, c-format
-msgid "%s sniped themself somehow"
-msgstr "%s hat so scharf geschossen, dass er sich selbst getroffen hat"
-
-#: qcsrc/server/w_rifle.qc:238
-#, c-format
-msgid "%s failed to hide from %s's bullet hail"
-msgstr "%s hat es nicht geschafft, sich vor %ss Kugelhagel zu verstecken"
-
-#: qcsrc/server/w_rifle.qc:240
-#, c-format
-msgid "%s died in %s's bullet hail"
-msgstr "%s ist in %ss Kugelhagel gefallen"
-
-#: qcsrc/server/w_rifle.qc:247
-#, c-format
-msgid "%s failed to hide from %s's rifle"
-msgstr "%s hat es nicht geschafft, sich vor %ss Gewehr zu verstecken"
-
-#: qcsrc/server/w_rifle.qc:252
-#, c-format
-msgid "%s got hit in the head by %s"
-msgstr "%s hat ein Loch im Kopf bekommen; schuld war %s"
-
-#: qcsrc/server/w_rifle.qc:254 qcsrc/server/w_uzi.qc:321
-#, c-format
-msgid "%s was sniped by %s"
-msgstr "^1%s^1 wurde von %s^1 erledigt"
-
 #: qcsrc/server/w_tuba.qc:2
 #, c-format
 msgid "@!#%'n Tuba"
@@ -2767,3 +2839,18 @@ msgstr "Machine Gun"
 #, c-format
 msgid "%s was riddled full of holes by %s"
 msgstr "%s ist von %s durchlöchert worden wie ein Schweizer Käse"
+
+#~ msgid "Speedometer"
+#~ msgstr "Tachometer"
+
+#~ msgid "qu/s (hidden)"
+#~ msgstr "qu/s (ohne Einheit)"
+
+#~ msgid "Show accelerometer"
+#~ msgstr "Akzelerometer anzeigen"
+
+#~ msgid "Accelerometer scale:"
+#~ msgstr "Akzelerometer-Skalierung:"
+
+#~ msgid "Sniper Rifle"
+#~ msgstr "Sniper Rifle"
index fbf8db8d8e46cac6cce2223b93fcec13f3a5eaff..106333058667c5c8c90a7c1351adf7f74746ac4d 100644 (file)
Binary files a/models/player/erebus.iqm and b/models/player/erebus.iqm differ
index 1d8d493b909bc51a67d429efee533767e174b18a..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index b856898b44012001a24b19ea6a24155b7f75a42c..fc3fc19fa1e669b7142a35426c70ff42f539f6c2 100644 (file)
Binary files a/models/player/erebus_lod1.iqm and b/models/player/erebus_lod1.iqm differ
index 1d8d493b909bc51a67d429efee533767e174b18a..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 68cadb3341c6eab5a66d65a8a0e881a747f61b05..159dee54e16a97f1ba0be19fddf4454126329f54 100644 (file)
Binary files a/models/player/erebus_lod2.iqm and b/models/player/erebus_lod2.iqm differ
index 1d8d493b909bc51a67d429efee533767e174b18a..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 533df54ac1c5a86476320efab666ebc4c0f4fc2b..c423ecd41fcd00017c9b0a73be8f4c6d8980f648 100644 (file)
Binary files a/models/player/gak.iqm and b/models/player/gak.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index b1f48c31c2dc5ebb2a0effd13aa367e3ab456219..8b4b72dc7c2b6410d343f7ef179cfb4eedf2b182 100644 (file)
Binary files a/models/player/gak_lod1.iqm and b/models/player/gak_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 001e2a0e7fa10a88996bf10756df04ea85bc75f6..f4a8080440607c8bc5e79a9f0d9684abf2db9904 100644 (file)
Binary files a/models/player/gak_lod2.iqm and b/models/player/gak_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index b77766e0d9e5d91bc6d65ded3da91de0d833008f..400812c5be3db15d34380370567d7c54fa988b3b 100644 (file)
Binary files a/models/player/gakarmored.iqm and b/models/player/gakarmored.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 6e7c68444d795b97793e7d2034d8a49aa0c84fa8..27f7e03a7c694250d2cb2add36d89362cc8e1b40 100644 (file)
Binary files a/models/player/gakarmored_lod1.iqm and b/models/player/gakarmored_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index e259d14ef698091f25309897df140d60cde24656..2d8fa0d64466e8fd7eb262d73e8d9f26e99033c0 100644 (file)
Binary files a/models/player/gakarmored_lod2.iqm and b/models/player/gakarmored_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 557324371e6f50cadbf4a2dcca5e73e6b87fc294..2c283abffb1e3bfb41c16e28a6c1bdfd1361b6e9 100644 (file)
Binary files a/models/player/gakmasked.iqm and b/models/player/gakmasked.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 07d81d9a229f3deea462a5c190d3cffba0d5dcf5..e5e58a762a00696ff5404393fbc8455315de20a2 100644 (file)
Binary files a/models/player/gakmasked_lod1.iqm and b/models/player/gakmasked_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index ebe8b41a20b3191e00aa55b9ffff03e2f3a97afb..142e28a579a1c995335988427d30594f98ea0ecf 100644 (file)
Binary files a/models/player/gakmasked_lod2.iqm and b/models/player/gakmasked_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index d0e40a4bff66dad7b5f6e4eef6bbde5151e71a68..692be86d8efdfd2ee2740e7d35d2cbd1602bef56 100644 (file)
Binary files a/models/player/ignis.iqm and b/models/player/ignis.iqm differ
index 1d8d493b909bc51a67d429efee533767e174b18a..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index c1a1c0129f9d0f5a0c00038cfdc01d469ac80aea..15fd6e2dc27ab14b2afbc11860d87a4378a761ef 100644 (file)
Binary files a/models/player/ignis_lod1.iqm and b/models/player/ignis_lod1.iqm differ
index 1d8d493b909bc51a67d429efee533767e174b18a..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 5e15baf2d683bf6cc2e81c44634b6b58fb73f08a..caa5ebe19366f7305803eee0144a3bc53e8474b2 100644 (file)
Binary files a/models/player/ignis_lod2.iqm and b/models/player/ignis_lod2.iqm differ
index 1d8d493b909bc51a67d429efee533767e174b18a..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index d412189cda9ebc37d401f0409c546c4315003670..98ee7cf7c6a5a195b8759380f41572a593dd0a9a 100644 (file)
Binary files a/models/player/ignishalfmasked.iqm and b/models/player/ignishalfmasked.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -1,24 +1,24 @@
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
 91 21 30.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 4e0063e92231e98c981db8de4fefe301a36b6395..a1421f17a582a345e876b90dabae3536afed6545 100644 (file)
Binary files a/models/player/ignishalfmasked_lod1.iqm and b/models/player/ignishalfmasked_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -1,24 +1,24 @@
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
 91 21 30.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 2338dca7b3c1c7ef0b0c540853091c530428a778..cbb13f4acab95d7f7affcf0032db52efc101ffd8 100644 (file)
Binary files a/models/player/ignishalfmasked_lod2.iqm and b/models/player/ignishalfmasked_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -1,24 +1,24 @@
-0 36 15.000000 0 // dieone
-36 20 15.000000 0 // dietwo
-56 15 15.000000 1 // draw
+0 36 30.000000 0 // dieone
+36 20 25.000000 0 // dietwo
+56 15 30.000000 1 // draw
 71 20 15.000000 1 // duck
 91 21 30.000000 1 // duckwalk
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 5bebaa5a2424b111cc49f482cc97002b363f8d40..abcc4f3728a8263b1c887397c43af81b37d2f690 100644 (file)
Binary files a/models/player/ignismasked.iqm and b/models/player/ignismasked.iqm differ
index 1d8d493b909bc51a67d429efee533767e174b18a..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 1a852ddb8bacb2982c677ac8f5ba4af35282e9ea..2cd6aa1a8651c8dd830eb94fdd6b3975514161a6 100644 (file)
Binary files a/models/player/ignismasked_lod1.iqm and b/models/player/ignismasked_lod1.iqm differ
index 1d8d493b909bc51a67d429efee533767e174b18a..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 5ccc07b9c1f975b56b9277610f0c5fda4918119e..0c0cf7058b5a0e355c3793c0980520d309a15fc4 100644 (file)
Binary files a/models/player/ignismasked_lod2.iqm and b/models/player/ignismasked_lod2.iqm differ
index 1d8d493b909bc51a67d429efee533767e174b18a..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 3052db52f916865b2e2f7adea12594bac6335b6e..52698300919884c1f65e87489f7ab7c14f38b71e 100644 (file)
Binary files a/models/player/megaerebus.iqm and b/models/player/megaerebus.iqm differ
index 1d8d493b909bc51a67d429efee533767e174b18a..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
index 42fa19c2451779b35ea009e2dbc295e8cc2b195b..7cf73126f9ea21f2713fd216631e22035e6b4080 100644 (file)
Binary files a/models/player/megaerebus_lod1.iqm and b/models/player/megaerebus_lod1.iqm differ
index 1d8d493b909bc51a67d429efee533767e174b18a..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
diff --git a/models/player/megaerebus_lod1.iqm_0.skin b/models/player/megaerebus_lod1.iqm_0.skin
new file mode 100644 (file)
index 0000000..4597cef
--- /dev/null
@@ -0,0 +1,2 @@
+erebus,erebusfullbright
+erebus.001,shadowhead
index b4d445766417057bc45b552bd0bed705e3cae8e2..7d05b660312e719fe10d687fc1cd0b308bd83a35 100644 (file)
Binary files a/models/player/megaerebus_lod2.iqm and b/models/player/megaerebus_lod2.iqm differ
index 1d8d493b909bc51a67d429efee533767e174b18a..07516e08cdcc1ffc7269d55c3b95da44a9c48673 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 24.000000 0 // painone
-220 17 34.000000 0 // paintwo
-237 3 3.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 20 29.000000 1 // run
-282 20 29.000000 1 // runbackwards
-303 20 29.000000 1 // strafeleft
-324 20 29.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 20 29.000000 1 // forwardright
-370 20 29.000000 1 // forwardleft
-391 20 29.000000 1 // backright
-412 20 29.000000 1 // backleft
-433 21 20.000000 0 // melee
+184 160 25.000000 0 // jump
+344 15 24.000000 0 // painone
+359 17 34.000000 0 // paintwo
+376 3 3.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 20 29.000000 1 // run
+421 20 29.000000 1 // runbackwards
+442 20 29.000000 1 // strafeleft
+463 20 29.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 20 29.000000 1 // forwardright
+509 20 29.000000 1 // forwardleft
+530 20 29.000000 1 // backright
+551 20 29.000000 1 // backleft
+572 21 20.000000 0 // melee
diff --git a/models/player/megaerebus_lod2.iqm_0.skin b/models/player/megaerebus_lod2.iqm_0.skin
new file mode 100644 (file)
index 0000000..4597cef
--- /dev/null
@@ -0,0 +1,2 @@
+erebus,erebusfullbright
+erebus.001,shadowhead
index 43546c14303357c7ea7cc5b8053c2170cd985456..24cc947bf13ea2a690b6f92f9c9f0b2f007479e7 100644 (file)
Binary files a/models/player/nyx.iqm and b/models/player/nyx.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index ccbc45ad452b2cfccf5d798c24d80903108b3f0a..27a418a382f5ab79dc5b3d3be46c92c75192b29e 100644 (file)
Binary files a/models/player/nyx_lod1.iqm and b/models/player/nyx_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index e5f55cc4723f99e25f30c46e51b6fc05688c93ae..82d48b6c9d4c6558f7ae78bd00b7273cb20a1e38 100644 (file)
Binary files a/models/player/nyx_lod2.iqm and b/models/player/nyx_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 763a5f0b7039768d35a607248c7e16ff3604bf42..4dad4b7985199d32192a3c8eb98c9e5e74591ce5 100644 (file)
Binary files a/models/player/pyria.iqm and b/models/player/pyria.iqm differ
index b3a5c2647bee189640476e55b5cdcb976c06d665..686dd60cef5afdd8ce051d191baed2e12a781354 100644 (file)
@@ -6,19 +6,19 @@
 109 16 15.000000 0 // duckjump
 125 15 5.000000 1 // duckidle
 140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
index 367522f7f051119a836051a8a48fbab19863b51d..037b6598795dfc49b2b922046c2f4758b6632542 100644 (file)
Binary files a/models/player/pyria_lod1.iqm and b/models/player/pyria_lod1.iqm differ
index b3a5c2647bee189640476e55b5cdcb976c06d665..686dd60cef5afdd8ce051d191baed2e12a781354 100644 (file)
@@ -6,19 +6,19 @@
 109 16 15.000000 0 // duckjump
 125 15 5.000000 1 // duckidle
 140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
index 8e7a85c3b30c8f11639dadf572d9096ee089c293..383060331b6dc2796b541ab97871cda68dc574d0 100644 (file)
Binary files a/models/player/pyria_lod2.iqm and b/models/player/pyria_lod2.iqm differ
index b3a5c2647bee189640476e55b5cdcb976c06d665..686dd60cef5afdd8ce051d191baed2e12a781354 100644 (file)
@@ -6,19 +6,19 @@
 109 16 15.000000 0 // duckjump
 125 15 5.000000 1 // duckidle
 140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
index 3d43a8c24ccd6dc31ba8c36567132e6e4999147f..95c46a3a5005417c6bdd8574b4acb31fd5105838 100644 (file)
Binary files a/models/player/seraphina.iqm and b/models/player/seraphina.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index cb10ac8733d0d152b123b1f3d979293ad70f6d14..cd8ff803036b04cf7922fdf5bdff09877401459e 100644 (file)
Binary files a/models/player/seraphina_lod1.iqm and b/models/player/seraphina_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index ad2aca8cd591f556a19197df1fb1aab967677878..118efe6fd93c50fac4c407951fea7214b06ea0a2 100644 (file)
Binary files a/models/player/seraphina_lod2.iqm and b/models/player/seraphina_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 0c3751d93d26f1c6aa574cecdab1e58a5b34ed13..185263d6243a35bec0cf5d3813b50aecbf8e7420 100644 (file)
Binary files a/models/player/seraphinamasked.iqm and b/models/player/seraphinamasked.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index fd9c7f7373b3765ea5e0e3be4f6147f386a2f5a6..4b1ea685bc9a4b0dd1a208cd6c67b91904a5ef1d 100644 (file)
Binary files a/models/player/seraphinamasked_lod1.iqm and b/models/player/seraphinamasked_lod1.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 220de90f53707ca52023f0995f36664a362548c9..58fe05c4f42c3d8d4b76edaad9a24419730ffc9a 100644 (file)
Binary files a/models/player/seraphinamasked_lod2.iqm and b/models/player/seraphinamasked_lod2.iqm differ
index 9dc589e5c899b7d6820a214c60db0ced0081adfe..94baca7332497dee1820a92f0f68df117b786873 100644 (file)
@@ -6,19 +6,19 @@
 112 16 15.000000 0 // duckjump
 128 15 5.000000 1 // duckidle
 143 41 5.000000 1 // idle
-184 21 25.000000 0 // jump
-205 15 15.000000 0 // painone
-220 17 15.000000 0 // paintwo
-237 3 15.000000 0 // shoot
-240 21 15.000000 1 // taunt
-261 21 35.000000 1 // run
-282 21 35.000000 1 // runbackwards
-303 21 35.000000 1 // strafeleft
-324 21 35.000000 1 // straferight
-345 2 15.000000 0 // deadone
-347 2 15.000000 0 // deadtwo
-349 21 35.000000 1 // forwardright
-370 21 35.000000 1 // forwardleft
-391 21 35.000000 1 // backright
-412 21 30.000000 1 // backleft
-433 21 20.000000 0 // melee
\ No newline at end of file
+184 160 25.000000 0 // jump
+344 15 15.000000 0 // painone
+359 17 15.000000 0 // paintwo
+376 3 15.000000 0 // shoot
+379 21 15.000000 1 // taunt
+400 21 35.000000 1 // run
+421 21 35.000000 1 // runbackwards
+442 21 35.000000 1 // strafeleft
+463 21 35.000000 1 // straferight
+484 2 15.000000 0 // deadone
+486 2 15.000000 0 // deadtwo
+488 21 35.000000 1 // forwardright
+598 21 35.000000 1 // forwardleft
+530 21 35.000000 1 // backright
+551 21 30.000000 1 // backleft
+572 21 20.000000 0 // melee
\ No newline at end of file
index 9eb6f9c64139bba0d186ced39e58143c246fdee4..07f73615b59cafed9fa0ee7866dbd4e78dfc702f 100644 (file)
Binary files a/models/player/umbra.iqm and b/models/player/umbra.iqm differ
index b3a5c2647bee189640476e55b5cdcb976c06d665..686dd60cef5afdd8ce051d191baed2e12a781354 100644 (file)
@@ -6,19 +6,19 @@
 109 16 15.000000 0 // duckjump
 125 15 5.000000 1 // duckidle
 140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
index 0686a73ad4402bbf513f44991018bf40265ad0cb..1173db86bb8dbcea34901bb67ecb97fd04396106 100644 (file)
Binary files a/models/player/umbra_lod1.iqm and b/models/player/umbra_lod1.iqm differ
index b3a5c2647bee189640476e55b5cdcb976c06d665..686dd60cef5afdd8ce051d191baed2e12a781354 100644 (file)
@@ -6,19 +6,19 @@
 109 16 15.000000 0 // duckjump
 125 15 5.000000 1 // duckidle
 140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
index fecc35b5e89558a9c5bb36bc001e3ea6bffb16a0..b47ac76f0fb1570d8afd2e4c17f56bea6092af71 100644 (file)
Binary files a/models/player/umbra_lod2.iqm and b/models/player/umbra_lod2.iqm differ
index b3a5c2647bee189640476e55b5cdcb976c06d665..686dd60cef5afdd8ce051d191baed2e12a781354 100644 (file)
@@ -6,19 +6,19 @@
 109 16 15.000000 0 // duckjump
 125 15 5.000000 1 // duckidle
 140 16 5.000000 1 // idle
-156 16 15.000000 0 // jump
-172 15 15.000000 0 // painone
-187 17 15.000000 0 // paintwo
-204 5 15.000000 0 // shoot
-209 21 15.000000 1 // taunt
-230 21 40.000000 1 // run
-251 21 40.000000 1 // runbackwards
-272 21 40.000000 1 // strafeleft
-293 21 40.000000 1 // straferight
-314 2 15.000000 0 // deadone
-316 2 15.000000 0 // deadtwo
-318 21 40.000000 1 // forwardright
-339 21 40.000000 1 // forwardleft
-360 21 40.000000 1 // backright
-381 21 40.000000 1 // backleft
-402 21 20.000000 0 // melee
\ No newline at end of file
+156 160 25.000000 0 // jump
+316 15 15.000000 0 // painone
+331 17 15.000000 0 // paintwo
+348 5 15.000000 0 // shoot
+353 21 15.000000 1 // taunt
+374 21 40.000000 1 // run
+395 21 40.000000 1 // runbackwards
+416 21 40.000000 1 // strafeleft
+437 21 40.000000 1 // straferight
+458 2 15.000000 0 // deadone
+460 2 15.000000 0 // deadtwo
+462 21 40.000000 1 // forwardright
+483 21 40.000000 1 // forwardleft
+504 21 40.000000 1 // backright
+525 21 40.000000 1 // backleft
+546 21 20.000000 0 // melee
\ No newline at end of file
diff --git a/models/sprites/vehicle_frame0.tga b/models/sprites/vehicle_frame0.tga
new file mode 100644 (file)
index 0000000..0864bcb
Binary files /dev/null and b/models/sprites/vehicle_frame0.tga differ
diff --git a/models/sprites/vehicle_frame1.tga b/models/sprites/vehicle_frame1.tga
new file mode 100644 (file)
index 0000000..073354d
Binary files /dev/null and b/models/sprites/vehicle_frame1.tga differ
diff --git a/models/vehicles/bomblet.md3 b/models/vehicles/bomblet.md3
new file mode 100644 (file)
index 0000000..55ca725
Binary files /dev/null and b/models/vehicles/bomblet.md3 differ
diff --git a/models/vehicles/bumblebee.tga b/models/vehicles/bumblebee.tga
new file mode 100644 (file)
index 0000000..a20e851
Binary files /dev/null and b/models/vehicles/bumblebee.tga differ
diff --git a/models/vehicles/bumblebee_body.dpm b/models/vehicles/bumblebee_body.dpm
new file mode 100644 (file)
index 0000000..9962dd7
Binary files /dev/null and b/models/vehicles/bumblebee_body.dpm differ
diff --git a/models/vehicles/bumblebee_gloss.tga b/models/vehicles/bumblebee_gloss.tga
new file mode 100644 (file)
index 0000000..bbfb176
Binary files /dev/null and b/models/vehicles/bumblebee_gloss.tga differ
diff --git a/models/vehicles/bumblebee_glow.tga b/models/vehicles/bumblebee_glow.tga
new file mode 100644 (file)
index 0000000..c688168
Binary files /dev/null and b/models/vehicles/bumblebee_glow.tga differ
diff --git a/models/vehicles/bumblebee_norm.tga b/models/vehicles/bumblebee_norm.tga
new file mode 100644 (file)
index 0000000..0ab707c
Binary files /dev/null and b/models/vehicles/bumblebee_norm.tga differ
diff --git a/models/vehicles/bumblebee_pants.tga b/models/vehicles/bumblebee_pants.tga
new file mode 100644 (file)
index 0000000..32d0aa5
Binary files /dev/null and b/models/vehicles/bumblebee_pants.tga differ
diff --git a/models/vehicles/bumblebee_plasma_left.dpm b/models/vehicles/bumblebee_plasma_left.dpm
new file mode 100644 (file)
index 0000000..57df41a
Binary files /dev/null and b/models/vehicles/bumblebee_plasma_left.dpm differ
diff --git a/models/vehicles/bumblebee_plasma_right.dpm b/models/vehicles/bumblebee_plasma_right.dpm
new file mode 100644 (file)
index 0000000..1689979
Binary files /dev/null and b/models/vehicles/bumblebee_plasma_right.dpm differ
diff --git a/models/vehicles/bumblebee_ray.dpm b/models/vehicles/bumblebee_ray.dpm
new file mode 100644 (file)
index 0000000..2e36eb5
Binary files /dev/null and b/models/vehicles/bumblebee_ray.dpm differ
diff --git a/models/vehicles/clusterbomb.md3 b/models/vehicles/clusterbomb.md3
new file mode 100644 (file)
index 0000000..c0842df
Binary files /dev/null and b/models/vehicles/clusterbomb.md3 differ
diff --git a/models/vehicles/clusterbomb_folded.md3 b/models/vehicles/clusterbomb_folded.md3
new file mode 100644 (file)
index 0000000..f1b65a6
Binary files /dev/null and b/models/vehicles/clusterbomb_folded.md3 differ
diff --git a/models/vehicles/clusterbomb_fragment.md3 b/models/vehicles/clusterbomb_fragment.md3
new file mode 100644 (file)
index 0000000..516da16
Binary files /dev/null and b/models/vehicles/clusterbomb_fragment.md3 differ
index 83518c5c629d255f7412295d9248aadd30aebf46..bbd758a1c7216591a1d3c1baf10ca66d72925d57 100644 (file)
Binary files a/models/vehicles/raptor.dpm and b/models/vehicles/raptor.dpm differ
diff --git a/models/vehicles/raptor_body.dpm b/models/vehicles/raptor_body.dpm
new file mode 100644 (file)
index 0000000..2a28317
Binary files /dev/null and b/models/vehicles/raptor_body.dpm differ
index fe933e4e427835b1a15efe7231cc88a5e1982282..d321f37d3d386eb8cf8b34258edf671812acdbdb 100644 (file)
Binary files a/models/vehicles/raptor_cockpit.dpm and b/models/vehicles/raptor_cockpit.dpm differ
diff --git a/models/vehicles/rocket01.md3 b/models/vehicles/rocket01.md3
new file mode 100644 (file)
index 0000000..1d9aab9
Binary files /dev/null and b/models/vehicles/rocket01.md3 differ
diff --git a/models/vehicles/rocket02.md3 b/models/vehicles/rocket02.md3
new file mode 100644 (file)
index 0000000..0a3eef0
Binary files /dev/null and b/models/vehicles/rocket02.md3 differ
diff --git a/models/vehicles/rockets.tga b/models/vehicles/rockets.tga
new file mode 100644 (file)
index 0000000..a6b873c
Binary files /dev/null and b/models/vehicles/rockets.tga differ
diff --git a/models/vehicles/rockets_gloss.tga b/models/vehicles/rockets_gloss.tga
new file mode 100644 (file)
index 0000000..22616da
Binary files /dev/null and b/models/vehicles/rockets_gloss.tga differ
diff --git a/models/vehicles/rockets_glow.tga b/models/vehicles/rockets_glow.tga
new file mode 100644 (file)
index 0000000..14c9f30
Binary files /dev/null and b/models/vehicles/rockets_glow.tga differ
diff --git a/models/vehicles/rockets_reflect.tga b/models/vehicles/rockets_reflect.tga
new file mode 100644 (file)
index 0000000..3cad23f
Binary files /dev/null and b/models/vehicles/rockets_reflect.tga differ
index eeb5e92e7e37ec0e1a75677c0cd0d0455b7e025b..2b5624f03cc41d29029fa7fdd49885c1bc5bd87c 100644 (file)
Binary files a/models/vehicles/spiderbot.dpm and b/models/vehicles/spiderbot.dpm differ
index f9db7221e4f2e959f420eaee3a6e000ae3551ad1..835bd3bd176e2b806fcfb89773bcdbecf55d6878 100644 (file)
@@ -1,6 +1,17 @@
-1   30  20 1 // forward
-32  30  20 1 // backward
-63  30  20 1 // left
-94  30 20 1 // right
-125 30 20 0 // jump
-0   1   20 0 // idle
+/*
+Generated framegroups file for spiderbot
+Used by DarkPlaces to simulate frame groups in DPM models.
+*/
+
+1 31 30 1 // spiderbot forward
+32 31 30 1 // spiderbot backwards
+63 31 20 1 // spiderbot left
+94 31 20 1 // spiderbot right
+125 31 20 0 // spiderbot jump
+156 1 1 0 // spiderbot idle
+157 12 20 0 // spiderbot jump2
+169 7 20 0 // spiderbot jump_charge
+176 11 15 0 // spiderbot jump_fly
+187 21 20 0 // spiderbot jump_land
+208 51 15 0 // spiderbot death
+259 3 1 0 // spiderbot dead
index 8d64449d3c0adc908e5e9deba373c2b92a4d7a91..a851f3e0832cb42cfb76e27696ff4e3da878db03 100644 (file)
Binary files a/models/vehicles/spiderbot_cockpit.dpm and b/models/vehicles/spiderbot_cockpit.dpm differ
index 5085e6be2e9fd78a7d26280d3d86677ee5887b56..e9209ba9c773c0ddc950976ba0aa1869b2029389 100644 (file)
Binary files a/models/vehicles/spiderbot_top.dpm and b/models/vehicles/spiderbot_top.dpm differ
index d3d83b44b30909b4310318b76b95e6c73476f2b4..7e453f2011faea574866814370e23d0a6c7dd403 100644 (file)
Binary files a/models/vehicles/spinner.dpm and b/models/vehicles/spinner.dpm differ
diff --git a/models/vehicles/tracer.md3 b/models/vehicles/tracer.md3
new file mode 100644 (file)
index 0000000..81ef34b
Binary files /dev/null and b/models/vehicles/tracer.md3 differ
diff --git a/models/vehicles/tracercore.tga b/models/vehicles/tracercore.tga
new file mode 100644 (file)
index 0000000..811db46
Binary files /dev/null and b/models/vehicles/tracercore.tga differ
diff --git a/models/vehicles/tracertrail.tga b/models/vehicles/tracertrail.tga
new file mode 100644 (file)
index 0000000..38a4f03
Binary files /dev/null and b/models/vehicles/tracertrail.tga differ
diff --git a/models/vehicles/tracertrail_glow.tga b/models/vehicles/tracertrail_glow.tga
new file mode 100644 (file)
index 0000000..75ff134
Binary files /dev/null and b/models/vehicles/tracertrail_glow.tga differ
index 5cc6b52be804d9f159b7e9bf6ecd888c326c4a84..7a78d3726b4cb8f9b9ba79f9c24417557e0eceb8 100644 (file)
@@ -15,6 +15,12 @@ sv_stepheight 26
 
 // actually, what we want is 266.6666 for 180bpm
 // but 260 takes same amount of frames and is nicer to mappers
+// jump height == sv_jumpvelocity^2 / (2*sv_gravity)
+// in this case: 42.25 qu
+// player: 24+45 qu
+// total: 111.25qu
+// this is smaller than 112 qu, so a 112 qu high corridor (7 of 8 grid units in
+// the 16 grid, and the 8th unit used for wall/floor) just lets a player jump!
 sv_jumpvelocity 260
 sv_wateraccelerate -1
 sv_waterfriction -1
index c9fbc87b1b07ba0db18266125cd252f9155188f6..fb9a1bb74db3e4725911dacbbd8d50327579b1fb 100644 (file)
@@ -47,7 +47,7 @@ void WaypointSprite_Load();
 void CSQC_Init(void)
 {
        prvm_language = cvar_string("prvm_language");
-       
+
 #ifdef USE_FTE
 #pragma target ID
        __engine_check = checkextension("DP_SV_WRITEPICTURE");
@@ -139,6 +139,9 @@ void CSQC_Init(void)
        GibSplash_Precache();
        Casings_Precache();
        DamageInfo_Precache();
+       Vehicles_Precache();
+       turrets_precache();
+
        if(autocvar_cl_announcer != cl_announcer_prev) {
                Announcer_Precache();
                if(cl_announcer_prev)
@@ -902,7 +905,7 @@ void Ent_ReadAccuracy(void)
                        weapon_accuracy[w] = -1;
                return;
        }
-       
+
        for(w = 0, f = 1; w <= WEP_LAST - WEP_FIRST; ++w, f *= 2)
        {
                if(sf & f)
@@ -984,6 +987,8 @@ void(float bIsNewEntity) CSQC_Ent_Update =
                case ENT_CLIENT_LGBEAM: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_LGBEAM); break;
                case ENT_CLIENT_GAUNTLET: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_GAUNTLET); break;
                case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break;
+               case ENT_CLIENT_AUXILIARYXHAIR: Net_AuXair2(bIsNewEntity); break;
+               case ENT_CLIENT_TURRET: ent_turret(); break; 
                default:
                        //error(strcat(_("unknown entity type in CSQC_Ent_Update: %d\n"), self.enttype));
                        error(sprintf(_("Unknown entity type in CSQC_Ent_Update (enttype: %d, edict: %d, classname: %s)\n"), self.enttype, num_for_edict(self), self.classname));
@@ -1410,6 +1415,10 @@ float CSQC_Parse_TempEntity()
                        Net_WeaponComplain();
                        bHandled = true;
                        break;
+        case TE_CSQC_VEHICLESETUP:
+            Net_VehicleSetup();
+            bHandled = true;
+            break;
                default:
                        // No special logic for this temporary entity; return 0 so the engine can handle it
                        bHandled = false;
index 8c7f87c984c089b187d380164cdf9e3d3a7e023a..1dfa1b359b9d65cfa4d63f5ee90c187644d0826b 100644 (file)
@@ -1,12 +1,3 @@
-#define spider_rocket_icon "gfx/vehicles/rocket_ico.tga"
-#define spider_rocket_targ "gfx/vehicles/target.tga"
-#define SPIDER_CROSS "textures/spiderbot/cross.tga"
-#define rkt_size 32
-#define rld_size_x 256
-#define rld_size_y 16
-
-void CSQC_WAKIZASHI_HUD();
-
 entity porto;
 vector polyline[16];
 float trace_dphitcontents;
@@ -137,6 +128,7 @@ vector GetCurrentFov(float fov)
                        zoomspeed = 3.5;
 
        zoomdir = button_zoom;
+       if(hud == HUD_NORMAL)
        if((getstati(STAT_ACTIVEWEAPON) == WEP_NEX && nex_scope) || (getstati(STAT_ACTIVEWEAPON) == WEP_RIFLE && rifle_scope)) // do NOT use switchweapon here
                zoomdir += button_attack2;
        if(spectatee_status > 0 || isdemo())
@@ -360,6 +352,9 @@ float use_nex_chargepool;
 float myhealth, myhealth_prev;
 float myhealth_flash;
 
+float old_blurradius, old_bluralpha;
+float old_sharpen_intensity;
+
 vector myhealth_gentlergb;
 
 float contentavgalpha, liquidalpha_prev;
@@ -367,6 +362,8 @@ vector liquidcolor_prev;
 
 float eventchase_current_distance;
 
+vector damage_blurpostprocess, content_blurpostprocess;
+
 float checkfail[16];
 
 void CSQC_UpdateView(float w, float h)
@@ -377,6 +374,7 @@ void CSQC_UpdateView(float w, float h)
        vector v, vo;
        vector vf_size, vf_min;
        float a;
+       hud = getstati(STAT_HUD);
 
        button_attack2 = (input_buttons & BUTTON_3);
        button_zoom = (input_buttons & BUTTON_4);
@@ -672,12 +670,12 @@ void CSQC_UpdateView(float w, float h)
                R_PolygonVertex(autocvar_vid_conheight * '0 1 0', tc_01, rgb, a);
                R_EndPolygon();
        }
-
+        
        // Draw the aiming reticle for weapons that use it
        // reticle_type is changed to the item we are zooming / aiming with, to decide which reticle to use
        // It must be a persisted float for fading out to work properly (you let go of the zoom button for
        // the view to go back to normal, so reticle_type would become 0 as we fade out)
-       if(spectatee_status || getstati(STAT_HEALTH) <= 0)
+       if(spectatee_status || getstati(STAT_HEALTH) <= 0 || hud != HUD_NORMAL)
                reticle_type = 0; // prevent reticle from showing during the respawn zoom effect or for spectators
        else if(activeweapon == WEP_NEX && (button_zoom || zoomscript_caught) || activeweapon == WEP_RIFLE && (button_zoom || zoomscript_caught) || activeweapon == WEP_MINSTANEX && (button_zoom || zoomscript_caught))
                reticle_type = 2; // nex zoom
@@ -685,7 +683,7 @@ void CSQC_UpdateView(float w, float h)
                reticle_type = 1; // normal zoom
        else if(activeweapon == WEP_NEX && button_attack2 || activeweapon == WEP_RIFLE && button_attack2)
                reticle_type = 2; // nex zoom
-
+    
        if (reticle_type)
        {
                if(autocvar_cl_reticle_stretch)
@@ -725,7 +723,7 @@ void CSQC_UpdateView(float w, float h)
        {
                float contentalpha_temp, incontent, liquidalpha, contentfadetime;
                vector liquidcolor;
-               
+
                switch(pointcontents(view_origin))
                {
                        case CONTENT_WATER:
@@ -733,26 +731,26 @@ void CSQC_UpdateView(float w, float h)
                                liquidcolor = stov(autocvar_hud_contents_water_color);
                                incontent = 1;
                                break;
-                               
+
                        case CONTENT_LAVA:
                                liquidalpha = autocvar_hud_contents_lava_alpha;
                                liquidcolor = stov(autocvar_hud_contents_lava_color);
                                incontent = 1;
-                               break;  
-                                                       
+                               break;
+
                        case CONTENT_SLIME:
                                liquidalpha = autocvar_hud_contents_slime_alpha;
                                liquidcolor = stov(autocvar_hud_contents_slime_color);
                                incontent = 1;
                                break;
-                               
+
                        default:
                                liquidalpha = 0;
                                liquidcolor = '0 0 0';
                                incontent = 0;
                                break;
                }
-               
+
                if(incontent) // fade in/out at different speeds so you can do e.g. instant fade when entering water and slow when leaving it.
                { // also lets delcare previous values for blending properties, this way it isn't reset until after you have entered a different content
                        contentfadetime = autocvar_hud_contents_fadeintime;
@@ -761,15 +759,32 @@ void CSQC_UpdateView(float w, float h)
                }
                else
                        contentfadetime = autocvar_hud_contents_fadeouttime;
-                       
+
                contentalpha_temp = bound(0, drawframetime / max(0.0001, contentfadetime), 1);
                contentavgalpha = contentavgalpha * (1 - contentalpha_temp) + incontent * contentalpha_temp;
-               
+
                if(contentavgalpha)
                        drawfill('0 0 0', eX * vid_conwidth + eY * vid_conheight, liquidcolor_prev, contentavgalpha * liquidalpha_prev, DRAWFLAG_NORMAL);
+
+               if(autocvar_hud_postprocessing)
+               {
+                       if(autocvar_hud_contents_blur && contentavgalpha)
+                       {
+                               content_blurpostprocess_x = 1;
+                               content_blurpostprocess_y = contentavgalpha * autocvar_hud_contents_blur;
+                               content_blurpostprocess_z = contentavgalpha * autocvar_hud_contents_blur_alpha;
+                       }
+                       else
+                       {
+                               content_blurpostprocess_x = 0;
+                               content_blurpostprocess_y = 0;
+                               content_blurpostprocess_z = 0;
+                       }
+               }
        }
        
        if(autocvar_hud_damage && !autocvar_chase_active)
+
        {
                splash_size_x = max(vid_conwidth, vid_conheight);
                splash_size_y = max(vid_conwidth, vid_conheight);
@@ -833,6 +848,74 @@ void CSQC_UpdateView(float w, float h)
                }
                else
                        drawpic(splash_pos, "gfx/blood", splash_size, stov(autocvar_hud_damage_color), bound(0, myhealth_flash_temp, 1) * autocvar_hud_damage, DRAWFLAG_NORMAL);
+
+               if(autocvar_hud_postprocessing)
+               {
+                       if(autocvar_hud_damage_blur && myhealth_flash_temp)
+                       {
+                               damage_blurpostprocess_x = 1;
+                               damage_blurpostprocess_y = bound(0, myhealth_flash_temp, 1) * autocvar_hud_damage_blur;
+                               damage_blurpostprocess_z = bound(0, myhealth_flash_temp, 1) * autocvar_hud_damage_blur_alpha;
+                       }
+                       else
+                       {
+                               damage_blurpostprocess_x = 0;
+                               damage_blurpostprocess_y = 0;
+                               damage_blurpostprocess_z = 0;
+                       }
+               }
+       }
+
+       if(autocvar_hud_postprocessing)
+       {
+               // all of this should be done in the engine eventually
+
+               // enable or disable rendering types if they are used or not
+               if(cvar("r_glsl_postprocess_uservec1_enable") != (cvar("hud_postprocessing_maxbluralpha") != 0))
+                       cvar_set("r_glsl_postprocess_uservec1_enable", ftos(cvar("hud_postprocessing_maxbluralpha") != 0));
+               if(cvar("r_glsl_postprocess_uservec2_enable") != (cvar("hud_powerup") != 0))
+                       cvar_set("r_glsl_postprocess_uservec2_enable", ftos(cvar("hud_powerup") != 0));
+
+               // lets apply the postprocess effects from the previous two functions if needed
+               if((damage_blurpostprocess_x || content_blurpostprocess_x) && autocvar_chase_active >= 0) // not while the event chase camera is active
+               {
+                       float blurradius = bound(0, damage_blurpostprocess_y + content_blurpostprocess_y, autocvar_hud_postprocessing_maxblurradius);
+                       float bluralpha = bound(0, damage_blurpostprocess_z + content_blurpostprocess_z, autocvar_hud_postprocessing_maxbluralpha);
+                       if(blurradius != old_blurradius || bluralpha != old_bluralpha) // reduce cvar_set spam as much as possible
+                       {
+                               cvar_set("r_glsl_postprocess_uservec1", strcat(ftos(blurradius), " ", ftos(bluralpha), " 0 0"));
+                               old_blurradius = blurradius;
+                               old_bluralpha = bluralpha;
+                       }
+               }
+               else if(cvar_string("r_glsl_postprocess_uservec1") != "0 0 0 0") // reduce cvar_set spam as much as possible
+               {
+                       cvar_set("r_glsl_postprocess_uservec1", "0 0 0 0");
+                       old_blurradius = 0;
+                       old_bluralpha = 0;
+               }
+
+               float sharpen_intensity;
+               if (getstatf(STAT_STRENGTH_FINISHED) - time > 0)
+                       sharpen_intensity += (getstatf(STAT_STRENGTH_FINISHED) - time);
+               if (getstatf(STAT_INVINCIBLE_FINISHED) - time > 0)
+                       sharpen_intensity += (getstatf(STAT_INVINCIBLE_FINISHED) - time);
+
+               if(autocvar_hud_powerup && sharpen_intensity > 0 && autocvar_chase_active >= 0) // not while the event chase camera is active
+               {
+                       sharpen_intensity = bound(0, sharpen_intensity, 5); // powerup warning time is 5 seconds, so fade the effect from there
+
+                       if(sharpen_intensity != old_sharpen_intensity) // reduce cvar_set spam as much as possible
+                       {
+                               cvar_set("r_glsl_postprocess_uservec2", strcat("0 ", ftos(-sharpen_intensity * cvar("hud_powerup")), " 0 0"));
+                               old_sharpen_intensity = sharpen_intensity;
+                       }
+               }
+               else if(cvar_string("r_glsl_postprocess_uservec2") != "0 0 0 0") // reduce cvar_set spam as much as possible
+               {
+                       cvar_set("r_glsl_postprocess_uservec2", "0 0 0 0");
+                       old_sharpen_intensity = 0;
+               }
        }
 
        if(menu_visible)
@@ -866,15 +949,7 @@ void CSQC_UpdateView(float w, float h)
                nextsound_typehit_time = time + autocvar_cl_hitsound_antispam_time;
        }
 
-       float hud;
-       hud = getstati(STAT_HUD);
-       if(hud == HUD_SPIDERBOT)
-               CSQC_SPIDER_HUD();
-       else if(hud == HUD_WAKIZASHI)
-        CSQC_WAKIZASHI_HUD();
-    else if(hud == HUD_RAPTOR)
-        CSQC_RAPTOR_HUD();
-       else
+       //else
        {
                if(gametype == GAME_FREEZETAG)
                {
@@ -892,7 +967,7 @@ void CSQC_UpdateView(float w, float h)
                                CSQC_common_hud();
 
                // crosshair goes VERY LAST
-               if(!scoreboard_active && !camera_active && intermission != 2 && spectatee_status != -1) {
+               if(!scoreboard_active && !camera_active && intermission != 2 && spectatee_status != -1 && hud == HUD_NORMAL) {
                        string wcross_style;
                        float wcross_alpha, wcross_resolution;
                        wcross_style = autocvar_crosshair;
@@ -959,13 +1034,13 @@ void CSQC_UpdateView(float w, float h)
                        else if(autocvar_crosshair_color_by_health)
                        {
                                local float x = getstati(STAT_HEALTH);
-                               
+
                                //x = red
                                //y = green
                                //z = blue
-                               
+
                                wcross_color_z = 0;
-                               
+
                                if(x > 200)
                                {
                                        wcross_color_x = 0;
@@ -986,7 +1061,7 @@ void CSQC_UpdateView(float w, float h)
                                {
                                        wcross_color_x = 1;
                                        wcross_color_y = 1;
-                                       wcross_color_z = 0.2 + (x-50)*0.02 * 0.8;  
+                                       wcross_color_z = 0.2 + (x-50)*0.02 * 0.8;
                                }
                                else if(x > 20)
                                {
@@ -1030,7 +1105,7 @@ void CSQC_UpdateView(float w, float h)
 
                                wcross_scale += sin(pickup_crosshair_size) * autocvar_crosshair_pickup;
                        }
-                       
+
                        vector hitindication_color;
                        if(autocvar_crosshair_hitindication)
                        {
@@ -1107,134 +1182,137 @@ void CSQC_UpdateView(float w, float h)
                        wcross_alpha *= 1 - autocvar__menu_alpha;
                        wcross_size = drawgetimagesize(wcross_name) * wcross_scale;
 
-                       // crosshair rings for weapon stats
-                       if (autocvar_crosshair_ring || autocvar_crosshair_ring_reload)
+                       if(wcross_scale >= 0.001 && wcross_alpha >= 0.001)
                        {
-                               // declarations and stats
-                               float ring_value, ring_scale, ring_alpha, ring_inner_value, ring_inner_alpha;
-                               string ring_image, ring_inner_image;
-                               vector ring_rgb, ring_inner_rgb;
-                               
-                               ring_scale = autocvar_crosshair_ring_size;
-
-                               float weapon_clipload, weapon_clipsize;
-                               weapon_clipload = getstati(STAT_WEAPON_CLIPLOAD);
-                               weapon_clipsize = getstati(STAT_WEAPON_CLIPSIZE);
-
-                               float nex_charge, nex_chargepool;
-                               nex_charge = getstatf(STAT_NEX_CHARGE);
-                               nex_chargepool = getstatf(STAT_NEX_CHARGEPOOL);
-
-                               if(nex_charge_movingavg == 0) // this should only happen if we have just loaded up the game
-                                       nex_charge_movingavg = nex_charge;
-                                       
-
-                               // handle the values
-                               if (autocvar_crosshair_ring && activeweapon == WEP_NEX && nex_charge && autocvar_crosshair_ring_nex) // ring around crosshair representing velocity-dependent damage for the nex
-                               {
-                                       if (nex_chargepool || use_nex_chargepool) { 
-                                               use_nex_chargepool = 1; 
-                                               ring_inner_value = nex_chargepool;
-                                       } else { 
-                                               nex_charge_movingavg = (1 - autocvar_crosshair_ring_nex_currentcharge_movingavg_rate) * nex_charge_movingavg + autocvar_crosshair_ring_nex_currentcharge_movingavg_rate * nex_charge;
-                                               ring_inner_value = bound(0, autocvar_crosshair_ring_nex_currentcharge_scale * (nex_charge - nex_charge_movingavg), 1); 
-                                       }
-                                               
-                                       ring_inner_alpha = autocvar_crosshair_ring_nex_inner_alpha;
-                                       ring_inner_rgb = eX * autocvar_crosshair_ring_nex_inner_color_red + eY * autocvar_crosshair_ring_nex_inner_color_green + eZ * autocvar_crosshair_ring_nex_inner_color_blue;
-                                       ring_inner_image = "gfx/crosshair_ring_inner.tga";
-                                       
-                                       // draw the outer ring to show the current charge of the weapon
-                                       ring_value = nex_charge;
-                                       ring_alpha = autocvar_crosshair_ring_nex_alpha;
-                                       ring_rgb = wcross_color;
-                                       ring_image = "gfx/crosshair_ring_nexgun.tga";
-                               }
-                               else if (autocvar_crosshair_ring && activeweapon == WEP_MINE_LAYER && minelayer_maxmines && autocvar_crosshair_ring_minelayer) 
-                               {
-                                       ring_value = bound(0, getstati(STAT_LAYED_MINES) / minelayer_maxmines, 1); // if you later need to use the count of bullets in another place, then add a float for it. For now, no need to.
-                                       ring_alpha = autocvar_crosshair_ring_minelayer_alpha;
-                                       ring_rgb = wcross_color;
-                                       ring_image = "gfx/crosshair_ring.tga";
-                               }
-                               else if (activeweapon == WEP_HAGAR && getstati(STAT_HAGAR_LOAD) && autocvar_crosshair_ring_hagar)
+                               // crosshair rings for weapon stats
+                               if (autocvar_crosshair_ring || autocvar_crosshair_ring_reload)
                                {
-                                       ring_value = bound(0, getstati(STAT_HAGAR_LOAD) / hagar_maxrockets, 1);
-                                       ring_alpha = autocvar_crosshair_ring_hagar_alpha;
-                                       ring_rgb = wcross_color;
-                                       ring_image = "gfx/crosshair_ring.tga";
-                               }
+                                       // declarations and stats
+                                       float ring_value, ring_scale, ring_alpha, ring_inner_value, ring_inner_alpha;
+                                       string ring_image, ring_inner_image;
+                                       vector ring_rgb, ring_inner_rgb;
 
-                               if(autocvar_crosshair_ring_reload && weapon_clipsize) // forces there to be only an ammo ring 
-                               {
-                                       ring_value = bound(0, weapon_clipload / weapon_clipsize, 1);
-                                       ring_scale = autocvar_crosshair_ring_reload_size;
-                                       ring_alpha = autocvar_crosshair_ring_reload_alpha;
-                                       ring_rgb = wcross_color;
-                                       
-                                       // Note: This is to stop Taoki from complaining that the image doesn't match all potential balances.
-                                       // if a new image for another weapon is added, add the code (and its respective file/value) here
-                                       if ((activeweapon == WEP_RIFLE) && (weapon_clipsize == 80))
-                                               ring_image = "gfx/crosshair_ring_rifle.tga";
-                                       else
+                                       ring_scale = autocvar_crosshair_ring_size;
+
+                                       float weapon_clipload, weapon_clipsize;
+                                       weapon_clipload = getstati(STAT_WEAPON_CLIPLOAD);
+                                       weapon_clipsize = getstati(STAT_WEAPON_CLIPSIZE);
+
+                                       float nex_charge, nex_chargepool;
+                                       nex_charge = getstatf(STAT_NEX_CHARGE);
+                                       nex_chargepool = getstatf(STAT_NEX_CHARGEPOOL);
+
+                                       if(nex_charge_movingavg == 0) // this should only happen if we have just loaded up the game
+                                               nex_charge_movingavg = nex_charge;
+
+
+                                       // handle the values
+                                       if (autocvar_crosshair_ring && activeweapon == WEP_NEX && nex_charge && autocvar_crosshair_ring_nex) // ring around crosshair representing velocity-dependent damage for the nex
+                                       {
+                                               if (nex_chargepool || use_nex_chargepool) { 
+                                                       use_nex_chargepool = 1; 
+                                                       ring_inner_value = nex_chargepool;
+                                               } else { 
+                                                       nex_charge_movingavg = (1 - autocvar_crosshair_ring_nex_currentcharge_movingavg_rate) * nex_charge_movingavg + autocvar_crosshair_ring_nex_currentcharge_movingavg_rate * nex_charge;
+                                                       ring_inner_value = bound(0, autocvar_crosshair_ring_nex_currentcharge_scale * (nex_charge - nex_charge_movingavg), 1); 
+                                               }
+
+                                               ring_inner_alpha = autocvar_crosshair_ring_nex_inner_alpha;
+                                               ring_inner_rgb = eX * autocvar_crosshair_ring_nex_inner_color_red + eY * autocvar_crosshair_ring_nex_inner_color_green + eZ * autocvar_crosshair_ring_nex_inner_color_blue;
+                                               ring_inner_image = "gfx/crosshair_ring_inner.tga";
+
+                                               // draw the outer ring to show the current charge of the weapon
+                                               ring_value = nex_charge;
+                                               ring_alpha = autocvar_crosshair_ring_nex_alpha;
+                                               ring_rgb = wcross_color;
+                                               ring_image = "gfx/crosshair_ring_nexgun.tga";
+                                       }
+                                       else if (autocvar_crosshair_ring && activeweapon == WEP_MINE_LAYER && minelayer_maxmines && autocvar_crosshair_ring_minelayer) 
+                                       {
+                                               ring_value = bound(0, getstati(STAT_LAYED_MINES) / minelayer_maxmines, 1); // if you later need to use the count of bullets in another place, then add a float for it. For now, no need to.
+                                               ring_alpha = autocvar_crosshair_ring_minelayer_alpha;
+                                               ring_rgb = wcross_color;
                                                ring_image = "gfx/crosshair_ring.tga";
-                               }
+                                       }
+                                       else if (activeweapon == WEP_HAGAR && getstati(STAT_HAGAR_LOAD) && autocvar_crosshair_ring_hagar)
+                                       {
+                                               ring_value = bound(0, getstati(STAT_HAGAR_LOAD) / hagar_maxrockets, 1);
+                                               ring_alpha = autocvar_crosshair_ring_hagar_alpha;
+                                               ring_rgb = wcross_color;
+                                               ring_image = "gfx/crosshair_ring.tga";
+                                       }
 
-                               if (autocvar_crosshair_ring_inner && ring_inner_value) // lets draw a ring inside a ring so you can ring while you ring
-                                       DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_inner_image, ring_inner_value, ring_inner_rgb, wcross_alpha * ring_inner_alpha, DRAWFLAG_ADDITIVE);
+                                       if(autocvar_crosshair_ring_reload && weapon_clipsize) // forces there to be only an ammo ring 
+                                       {
+                                               ring_value = bound(0, weapon_clipload / weapon_clipsize, 1);
+                                               ring_scale = autocvar_crosshair_ring_reload_size;
+                                               ring_alpha = autocvar_crosshair_ring_reload_alpha;
+                                               ring_rgb = wcross_color;
+
+                                               // Note: This is to stop Taoki from complaining that the image doesn't match all potential balances.
+                                               // if a new image for another weapon is added, add the code (and its respective file/value) here
+                                               if ((activeweapon == WEP_RIFLE) && (weapon_clipsize == 80))
+                                                       ring_image = "gfx/crosshair_ring_rifle.tga";
+                                               else
+                                                       ring_image = "gfx/crosshair_ring.tga";
+                                       }
 
-                               if (ring_value)
-                                       DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_image, ring_value, ring_rgb, wcross_alpha * ring_alpha, DRAWFLAG_ADDITIVE);
-                       }
+                                       if (autocvar_crosshair_ring_inner && ring_inner_value) // lets draw a ring inside a ring so you can ring while you ring
+                                               DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_inner_image, ring_inner_value, ring_inner_rgb, wcross_alpha * ring_inner_alpha, DRAWFLAG_ADDITIVE);
+
+                                       if (ring_value)
+                                               DrawCircleClippedPic(wcross_origin, wcross_size_x * ring_scale, ring_image, ring_value, ring_rgb, wcross_alpha * ring_alpha, DRAWFLAG_ADDITIVE);
+                               }
 
 #define CROSSHAIR_DO_BLUR(M,sz,wcross_name,wcross_alpha) \
-                       do \
-                       { \
-                               if(wcross_blur > 0) \
+                               do \
                                { \
-                                       for(i = -2; i <= 2; ++i) \
+                                       if(wcross_blur > 0) \
+                                       { \
+                                               for(i = -2; i <= 2; ++i) \
                                                for(j = -2; j <= 2; ++j) \
-                                                       M(i,j,sz,wcross_name,wcross_alpha*0.04); \
-                               } \
-                               else \
-                               { \
-                                       M(0,0,sz,wcross_name,wcross_alpha); \
+                                               M(i,j,sz,wcross_name,wcross_alpha*0.04); \
+                                       } \
+                                       else \
+                                       { \
+                                               M(0,0,sz,wcross_name,wcross_alpha); \
+                                       } \
                                } \
-                       } \
-                       while(0)
+                               while(0)
 
 #define CROSSHAIR_DRAW_SINGLE(i,j,sz,wcross_name,wcross_alpha) \
-                       drawpic(wcross_origin - ('0.5 0 0' * (sz * wcross_size_x + i * wcross_blur) + '0 0.5 0' * (sz * wcross_size_y + j * wcross_blur)), wcross_name, sz * wcross_size, wcross_color, wcross_alpha, DRAWFLAG_NORMAL)
+                               drawpic(wcross_origin - ('0.5 0 0' * (sz * wcross_size_x + i * wcross_blur) + '0 0.5 0' * (sz * wcross_size_y + j * wcross_blur)), wcross_name, sz * wcross_size, wcross_color, wcross_alpha, DRAWFLAG_NORMAL)
 
 #define CROSSHAIR_DRAW(sz,wcross_name,wcross_alpha) \
-                       CROSSHAIR_DO_BLUR(CROSSHAIR_DRAW_SINGLE,sz,wcross_name,wcross_alpha)
+                               CROSSHAIR_DO_BLUR(CROSSHAIR_DRAW_SINGLE,sz,wcross_name,wcross_alpha)
 
-                       if(time < wcross_name_changedonetime && wcross_name != wcross_name_goal_prev_prev && wcross_name_goal_prev_prev)
-                       {
-                               f = (wcross_name_changedonetime - time) / (wcross_name_changedonetime - wcross_name_changestarttime);
-                               wcross_size = drawgetimagesize(wcross_name_goal_prev_prev) * wcross_scale;
-                               CROSSHAIR_DRAW(wcross_resolution_goal_prev_prev, wcross_name_goal_prev_prev, wcross_alpha * f * wcross_name_alpha_goal_prev_prev);
-                               f = 1 - f;
-                       }
-                       else
-                       {
-                               f = 1;
-                       }
+                               if(time < wcross_name_changedonetime && wcross_name != wcross_name_goal_prev_prev && wcross_name_goal_prev_prev)
+                               {
+                                       f = (wcross_name_changedonetime - time) / (wcross_name_changedonetime - wcross_name_changestarttime);
+                                       wcross_size = drawgetimagesize(wcross_name_goal_prev_prev) * wcross_scale;
+                                       CROSSHAIR_DRAW(wcross_resolution_goal_prev_prev, wcross_name_goal_prev_prev, wcross_alpha * f * wcross_name_alpha_goal_prev_prev);
+                                       f = 1 - f;
+                               }
+                               else
+                               {
+                                       f = 1;
+                               }
+                               wcross_name_alpha_goal_prev = f;
 
-                       wcross_size = drawgetimagesize(wcross_name) * wcross_scale;
-                       CROSSHAIR_DRAW(wcross_resolution, wcross_name, wcross_alpha * f);
-
-                       if(autocvar_crosshair_dot)
-            {
-                vector wcross_color_old;
-                wcross_color_old = wcross_color;
-                if(autocvar_crosshair_dot_color != "0")
-                    wcross_color = stov(autocvar_crosshair_dot_color);
-                               CROSSHAIR_DRAW(wcross_resolution * autocvar_crosshair_dot_size, "gfx/crosshairdot.tga", f * autocvar_crosshair_dot_alpha);
-                wcross_color = wcross_color_old;
-            }
-
-                       wcross_name_alpha_goal_prev = f;
+                               wcross_size = drawgetimagesize(wcross_name) * wcross_scale;
+                               CROSSHAIR_DRAW(wcross_resolution, wcross_name, wcross_alpha * f);
+
+                               if(autocvar_crosshair_dot)
+                               {
+                                       vector wcross_color_old;
+                                       wcross_color_old = wcross_color;
+                                       if(autocvar_crosshair_dot_color != "0")
+                                               wcross_color = stov(autocvar_crosshair_dot_color);
+                                       CROSSHAIR_DRAW(wcross_resolution * autocvar_crosshair_dot_size, "gfx/crosshairdot.tga", f * autocvar_crosshair_dot_alpha);
+                                       // FIXME why don't we use wcross_alpha here?
+                                       wcross_color = wcross_color_old;
+                               }
+                       }
                }
                else
                {
@@ -1293,359 +1371,71 @@ void CSQC_UpdateView(float w, float h)
 
        if(autocvar__hud_configure)
                HUD_Panel_Mouse();
-
+    
+    if(hud && !intermission)
+    {        
+        if(hud == HUD_SPIDERBOT)
+            CSQC_SPIDER_HUD();
+        else if(hud == HUD_WAKIZASHI)
+            CSQC_WAKIZASHI_HUD();
+        else if(hud == HUD_RAPTOR)
+            CSQC_RAPTOR_HUD();
+        else if(hud == HUD_BUMBLEBEE)
+            CSQC_BUMBLE_HUD();
+    }
        // let's reset the view back to normal for the end
        R_SetView(VF_MIN, '0 0 0');
        R_SetView(VF_SIZE, '1 0 0' * w + '0 1 0' * h);
 }
 
-#define spider_h "gfx/vehicles/hud_bg.tga"
-#define spider_b "gfx/vehicles/sbot.tga"
-#define spider_r "gfx/vehicles/sbot_rpods.tga"
-#define spider_g "gfx/vehicles/sbot_mguns.tga"
-#define spider_s "gfx/vehicles/shiled.tga"
-#define spider_a1 "gfx/hud/sb_rocket.tga"
-#define spider_a2 "gfx/sb_bullets.tga"
 
-void CSQC_SPIDER_HUD()
+void CSQC_common_hud(void)
 {
-       float rockets, reload, heat, hp, shield;
-       vector picsize, hudloc;
-
-    // Fetch health & ammo stats
-    hp      = bound(0,getstatf(STAT_VEHICLESTAT_HEALTH), 1);
-       shield  = bound(0,getstatf(STAT_VEHICLESTAT_SHIELD), 1);
-       heat    = min(getstatf(STAT_VEHICLESTAT_RELOAD1), 2);
-       rockets =     getstati(STAT_VEHICLESTAT_AMMO2);
-       reload  = min(getstatf(STAT_VEHICLESTAT_RELOAD2), 1);
-
-    // Draw the crosshairs
-    picsize = drawgetimagesize(SPIDER_CROSS);
-    picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
-    picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
-    drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL);
-
-    hudloc_y =  4;
-    hudloc_x = 4;
-
-    picsize = drawgetimagesize(spider_h) * 0.5;
-    drawpic(hudloc, spider_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
-    picsize = drawgetimagesize(spider_a2) * 0.5;
-    drawpic(hudloc + '120 96  0', spider_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
-    drawstring(hudloc + '145 19  0', strcat(ftos(rint(hp * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL);
-    drawstring(hudloc + '175 34  0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL);
-    drawstring(hudloc + '136 102  0', strcat(ftos(100 - rint(heat * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
-
-    picsize = drawgetimagesize(spider_a1) * 0.85;
-    if(rockets == 9)
-    {
-        drawpic(hudloc + '132 54  0', spider_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL);
-        drawstring(hudloc + '179 69 0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
-    }
-    else
+    // do some accuracy var caching
+    float i;
+    if(!(gametype == GAME_RACE || gametype == GAME_CTS))
     {
-        drawpic(hudloc + '132 54  0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-        drawstring(hudloc + '179 69  0', strcat(ftos(9 - rockets), "/8"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
+        if(autocvar_accuracy_color_levels != acc_color_levels)
+        {
+            if(acc_color_levels)
+                strunzone(acc_color_levels);
+            acc_color_levels = strzone(autocvar_accuracy_color_levels);
+            acc_levels = tokenize(acc_color_levels);
+            if (acc_levels > MAX_ACCURACY_LEVELS)
+                acc_levels = MAX_ACCURACY_LEVELS;
+
+            for (i = 0; i < acc_levels; ++i)
+                acc_lev[i] = stof(argv(i)) / 100.0;
+        }
+        // let know that acc_col[] needs to be loaded
+        acc_col_x[0] = -1;
     }
 
-    picsize = drawgetimagesize(spider_b) * 0.5;
-    hudloc_y = 10.5;
-    hudloc_x = 10.5;
-
-    drawpic(hudloc, spider_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
-    drawpic(hudloc, spider_b, picsize, '0 1 0' * hp + '1 0 0' * (1 - hp), 1, DRAWFLAG_NORMAL);
-    drawpic(hudloc, spider_r, picsize, '1 1 1' * reload + '1 0 0' * (1 - reload), 1, DRAWFLAG_NORMAL);
-    drawpic(hudloc, spider_g, picsize, '1 1 1' * (1 - heat) + '1 0 0' *  heat, 1, DRAWFLAG_NORMAL);
-
-
-       /*
-       // Draw health bar
-       p = '0.5 0 0' * (vid_conwidth - (rkt_size * 8));
-       p = p + '0 1 0' * vid_conheight - '0 32 0';
-       //pp = ('0 1 0' * hp) + ('1 0 0' * (1-hp));
-       drawfill(p, '256 0 0' * shield + '0 8 0' , '0.5 0.5 1', 0.75, DRAWFLAG_NORMAL);
-       p_y += 8;
-       drawfill(p, '256 0 0' * hp + '0 8 0' , '0 1 0', 0.75, DRAWFLAG_NORMAL);
-       p_x += 256 * hp;
-       drawfill(p, '256 0 0' * (1-hp) + '0 8 0' , '0 0 0', 0.75, DRAWFLAG_NORMAL);
-
-       // Draw minigun heat indicator
-       p = '0.5 0 0' * (vid_conwidth - 256);
-       p = p + '0 1 0' * vid_conheight - '0 34  0';
-       drawfill(p, '256 0 0' * (1-heat) + '0 2 0' ,'0 0 1', 0.5, DRAWFLAG_NORMAL);
-       p_x += 256 * (1-heat);
-       drawfill(p, '256 0 0' * heat  + '0 2 0' , '1 0 0', 0.5, DRAWFLAG_NORMAL);
-
-
-       // Draw rocket icons for loaded/empty tubes.
-       pp = '0.5 0 0' * (vid_conwidth - (rkt_size * 8));
-       pp += '0 1 0' * vid_conheight - '0 64 0';
-       for(i = 0; i < 8; ++i)
-       {
-               p = pp + '1 0 0' * (rkt_size * i);
-               if(rockets == 8)
-               {
-                       if(floor(reload * 8) == i)
-                       {
-                               drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '1 0 0' + '0 1 0' * ((reload*8)-i), 0.75 , DRAWFLAG_NORMAL);
-                       }
-                       else if(i < reload * 8)
-                               drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '1 1 0', 0.75 , DRAWFLAG_NORMAL);
-                       else
-                               drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '0.5 0.5 0.5', 0.75, DRAWFLAG_NORMAL);
-               }
-               else
-               {
-                       if(i < rockets)
-                               drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '0 0 0', 0.25, DRAWFLAG_NORMAL);
-                       else
-                               drawpic(p, spider_rocket_icon, '1 1 0' * rkt_size, '0 1 0' * reload, 0.75, DRAWFLAG_NORMAL);
-               }
-       }
-       */
-
-       if (scoreboard_showscores)
-       {
-               HUD_DrawScoreboard();
-               HUD_DrawCenterPrint();
-       }
-
-}
-
-#define raptor_h "gfx/vehicles/hud_bg.tga"
-#define raptor_b "gfx/vehicles/raptor.tga"
-#define raptor_g1 "gfx/vehicles/raptor_guns.tga"
-#define raptor_g2 "gfx/vehicles/raptor_bombs.tga"
-#define raptor_s "gfx/vehicles/shiled.tga"
-
-void CSQC_RAPTOR_HUD()
-{
-       float reload, hp, shield, energy;
-       vector picsize, hudloc;
-
-    // Fetch health & ammo stats
-    hp      = bound(0,getstatf(STAT_VEHICLESTAT_HEALTH), 1);
-       shield  = bound(0,getstatf(STAT_VEHICLESTAT_SHIELD), 1);
-       reload  = min(getstatf(STAT_VEHICLESTAT_RELOAD1), 1);
-       energy  = min(getstatf(STAT_VEHICLESTAT_ENERGY),  1);
-
-    // Draw the crosshairs
-    picsize = drawgetimagesize(SPIDER_CROSS);
-    picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
-    picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
-    drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL);
+    HUD_Main(); // always run these functions for alpha checks
+    HUD_DrawScoreboard();
 
-    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)
+    if (scoreboard_active) // scoreboard/accuracy
     {
-        drawpic(hudloc + '132 54  0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-        drawstring(hudloc + '179 69  0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','0 1 0', 0.5, DRAWFLAG_NORMAL);
+        HUD_Reset();
+        // HUD_DrawScoreboard takes care of centerprint_start
     }
-    else
+    else if (intermission == 2) // map voting screen
     {
-        drawpic(hudloc + '132 54  0', spider_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-        drawstring(hudloc + '179 69  0', strcat(ftos(rint(reload * 100)), "%"),'14 14 0','0 0 1', 1, DRAWFLAG_NORMAL);
-    }
+        HUD_FinaleOverlay();
+        HUD_Reset();
 
-    picsize = drawgetimagesize(raptor_b) * 0.5;
-    hudloc_y = 10.5;
-    hudloc_x = 10.5;
-
-    drawpic(hudloc, raptor_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
-    drawpic(hudloc, raptor_b, picsize, '0 1 0' * hp + '1 0 0' * (1 - hp), 1, DRAWFLAG_NORMAL);
-    drawpic(hudloc, raptor_g1, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL);
-    drawpic(hudloc, raptor_g2, picsize, '1 1 1' * reload + '1 0 0' *  (1 - reload), 1, DRAWFLAG_NORMAL);
-
-
-       if (scoreboard_showscores)
-       {
-               HUD_DrawScoreboard();
-               HUD_DrawCenterPrint();
-       }
-
-}
-
-#define waki_h "gfx/vehicles/hud_bg.tga"
-#define waki_b "gfx/vehicles/waki.tga"
-#define waki_e "gfx/vehicles/waki_e.tga"
-#define waki_g "gfx/vehicles/waki_guns.tga"
-#define waki_r "gfx/vehicles/waki_rockets.tga"
-#define waki_s "gfx/vehicles/shiled.tga"
-
-#define waki_a1 "gfx/hud/sb_rocket.tga"
-#define waki_a2 "gfx/sb_cells.tga"
-
-void CSQC_WAKIZASHI_HUD()
-{
-       // 0--1 floats. 1 = 100%, 0.6 = 50%.
-       float health, shield, energy, rockets;
-       vector picsize, hudloc;
-
-    picsize = drawgetimagesize(SPIDER_CROSS);
-    picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
-    picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
-    drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), SPIDER_CROSS, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_NORMAL);
-
-/*
-const float STAT_VEHICLESTAT_HEALTH  = 60;
-const float STAT_VEHICLESTAT_SHIELD  = 61;
-const float STAT_VEHICLESTAT_ENERGY  = 62;
-const float STAT_VEHICLESTAT_AMMO1   = 63;
-const float STAT_VEHICLESTAT_RELAOD1 = 64;
-const float STAT_VEHICLESTAT_AMMO2   = 65;
-const float STAT_VEHICLESTAT_RELOAD2 = 66;
-*/
-    health  = min(getstatf(STAT_VEHICLESTAT_HEALTH),  1);
-       shield  = min(getstatf(STAT_VEHICLESTAT_SHIELD),  1);
-       energy  = min(getstatf(STAT_VEHICLESTAT_ENERGY),  1);
-       rockets = bound(0,getstatf(STAT_VEHICLESTAT_RELOAD1), 1);
-
-    hudloc_y =  4;
-    hudloc_x = 4;
-
-    picsize = drawgetimagesize(waki_h) * 0.5;
-    drawpic(hudloc, waki_h, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
-    picsize = drawgetimagesize(waki_a2) * 0.7;
-    drawpic(hudloc + '116 92  0', waki_a2, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-
-
-    drawstring(hudloc + '145 19  0', strcat(ftos(rint(health * 100)), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL);
-    drawstring(hudloc + '175 34  0', strcat(ftos(rint(shield * 100)), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL);
-
-    drawstring(hudloc + '136 102  0', strcat(ftos(rint(energy * 100)), "%"),'14 14 0','1 1 1', 1, DRAWFLAG_NORMAL);
-
-    picsize = drawgetimagesize(waki_a1) * 0.75;
-    if(rockets == 1)
-    {
-        drawpic(hudloc + '140 55  0', waki_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
-        drawpic(hudloc + '144 59  0', waki_a1, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+        centerprint_start_x = 0;
+        centerprint_start_y = autocvar_scr_centerpos * vid_conheight;
     }
-    else
+    else // hud
     {
-        drawpic(hudloc + '140 55  0', waki_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL);
-        drawpic(hudloc + '144 59  0', waki_a1, picsize, '-1 -1 -1', 1, DRAWFLAG_NORMAL);
-        drawstring(hudloc + '165 69 0', strcat(ftos(rint(rockets * 100)), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
+        centerprint_start_x = 0;
+        centerprint_start_y = autocvar_scr_centerpos * vid_conheight;
     }
 
-    picsize = drawgetimagesize(waki_b) * 0.5;
-    hudloc_y = 10.5;
-    hudloc_x = 10.5;
-
-    drawpic(hudloc, waki_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
-    drawpic(hudloc, waki_b, picsize, '0 1 0' * health + '1 0 0' * (1 - health), 1, DRAWFLAG_NORMAL);
-    drawpic(hudloc, waki_r, picsize, '1 1 1' * rockets + '1 0 0' * (1 - rockets), 1, DRAWFLAG_NORMAL);
-    drawpic(hudloc, waki_e, picsize, '1 1 1' * energy + '1 0 0' *  (1 - energy), 1, DRAWFLAG_NORMAL);
-
-
-
        /*
-       p = '0.5 0 0' * (vid_conwidth - (rkt_size * 8));
-       p = p + '0 1 0' * vid_conheight - '0 32 0';
-
-       // Draw health bar
-       p_y += 8;
-       drawfill(p, '256 0 0' * health + '0 8 0' , '0 0.7 0', 0.75, DRAWFLAG_NORMAL);
-       p_x += 256 * health;
-       drawfill(p, '256 0 0' * (1 - health) + '0 8 0' , '0 0 0', 0.75, DRAWFLAG_NORMAL);
-
-       // Draw shiled bar
-       p_x -= 256 * health;
-       p_y += 4;
-       drawfill(p, '256 0 0' * shield + '0 4 0' , '0.25 0.25 1', 0.5, DRAWFLAG_NORMAL);
-
-       // Draw energy
-       //p_x -= 256 * health;
-       p_y -= 8;
-       drawfill(p, '256 0 0' * energy + '0 4 0' , '1 1 1', 0.75, DRAWFLAG_NORMAL);
-
-       // Draw rockets bar
-       p_y += 12;
-       drawfill(p, '256 0 0' * rockets + '0 4 0' , '1 0 0', 0.75, DRAWFLAG_NORMAL);
-       */
-
-
-
-
-       if (scoreboard_showscores)
-       {
-               HUD_DrawScoreboard();
-               HUD_DrawCenterPrint();
-       }
-
-}
-
-void CSQC_common_hud(void)
-{
-       // HUD_SortFrags(); done in HUD_Draw
-       float hud;
-       hud = getstati(STAT_HUD);
-
-       //hud = 10;
        switch(hud)
        {
-               case HUD_NORMAL:
-                       // do some accuracy var caching
-                       float i;
-                       if(!(gametype == GAME_RACE || gametype == GAME_CTS))
-                       {
-                               if(autocvar_accuracy_color_levels != acc_color_levels)
-                               {
-                                       if(acc_color_levels)
-                                               strunzone(acc_color_levels);
-                                       acc_color_levels = strzone(autocvar_accuracy_color_levels);
-                                       acc_levels = tokenize(acc_color_levels);
-                                       if (acc_levels > MAX_ACCURACY_LEVELS)
-                                               acc_levels = MAX_ACCURACY_LEVELS;
-
-                                       for (i = 0; i < acc_levels; ++i)
-                                               acc_lev[i] = stof(argv(i)) / 100.0;
-                               }
-                               // let know that acc_col[] needs to be loaded
-                               acc_col_x[0] = -1;
-                       }
-
-                       HUD_Main(); // always run these functions for alpha checks
-                       HUD_DrawScoreboard();
-
-                       if (scoreboard_active) // scoreboard/accuracy
-                       {       
-                               HUD_Reset();
-                               // HUD_DrawScoreboard takes care of centerprint_start
-                       }
-                       else if (intermission == 2) // map voting screen
-                       {
-                               HUD_FinaleOverlay();
-                               HUD_Reset();
-
-                               centerprint_start_x = 0;
-                               centerprint_start_y = autocvar_scr_centerpos * vid_conheight;
-                       }
-                       else // hud
-                       {
-                               centerprint_start_x = 0;
-                               centerprint_start_y = autocvar_scr_centerpos * vid_conheight;
-                       }
-
-                       HUD_DrawCenterPrint();
-                       break;
-
                case HUD_SPIDERBOT:
                        CSQC_SPIDER_HUD();
                        break;
@@ -1653,7 +1443,15 @@ void CSQC_common_hud(void)
                case HUD_WAKIZASHI:
                        CSQC_WAKIZASHI_HUD();
                        break;
+
+        case HUD_BUMBLEBEE:
+            CSQC_BUMBLE_HUD();
+            break;
        }
+       */
+       
+    HUD_DrawCenterPrint();
+    
 }
 
 
index bf9924a9279ddd1ac6f3f0cc5266527cffa26a34..eda2aa7a452dfd343c29f8682e0945217f10e235 100644 (file)
@@ -122,6 +122,7 @@ float autocvar_g_balance_tuba_attenuation;
 float autocvar_g_balance_tuba_fadetime;
 float autocvar_g_balance_tuba_volume;
 float autocvar_g_warmup_limit;
+var float autocvar_g_waypointsprite_uppercase = 1;
 var float autocvar_g_waypointsprite_alpha = 1;
 var float autocvar_g_waypointsprite_crosshairfadealpha = 1;
 float autocvar_g_waypointsprite_crosshairfadedistance;
@@ -137,6 +138,7 @@ float autocvar_g_waypointsprite_minalpha;
 float autocvar_g_waypointsprite_minscale;
 float autocvar_g_waypointsprite_normdistance;
 var float autocvar_g_waypointsprite_scale = 1;
+var float autocvar_g_waypointsprite_fontsize = 12;
 float autocvar_g_waypointsprite_timealphaexponent;
 var float autocvar_hud_colorflash_alpha = 0.5;
 float autocvar_hud_configure_bg_minalpha;
@@ -147,6 +149,8 @@ float autocvar_hud_configure_grid_xsize;
 float autocvar_hud_configure_grid_ysize;
 float autocvar_hud_configure_teamcolorforced;
 float autocvar_hud_contents;
+float autocvar_hud_contents_blur;
+float autocvar_hud_contents_blur_alpha;
 float autocvar_hud_contents_factor;
 float autocvar_hud_contents_fadeintime;
 float autocvar_hud_contents_fadeouttime;
@@ -157,6 +161,8 @@ string autocvar_hud_contents_slime_color;
 float autocvar_hud_contents_water_alpha;
 string autocvar_hud_contents_water_color;
 float autocvar_hud_damage;
+float autocvar_hud_damage_blur;
+float autocvar_hud_damage_blur_alpha;
 string autocvar_hud_damage_color;
 float autocvar_hud_damage_factor;
 float autocvar_hud_damage_fade_rate;
@@ -168,6 +174,10 @@ float autocvar_hud_damage_pain_threshold_lower;
 float autocvar_hud_damage_pain_threshold_lower_health;
 float autocvar_hud_damage_pain_threshold_pulsating_min;
 float autocvar_hud_damage_pain_threshold_pulsating_period;
+float autocvar_hud_powerup;
+float autocvar_hud_postprocessing;
+float autocvar_hud_postprocessing_maxbluralpha;
+float autocvar_hud_postprocessing_maxblurradius;
 string autocvar_hud_dock;
 float autocvar_hud_dock_alpha;
 string autocvar_hud_dock_color;
index 860e8296f700cb94562b9efb3775895ed1b8fefd..423896f39a3ed46f31b94ad7eac4bb7eea4111cc 100644 (file)
@@ -75,7 +75,7 @@ void Ent_Casing(float isNew)
 {
        entity casing;
 
-       casing = RubbleNew("casing");
+    casing = RubbleNew("casing");
        casing.state = ReadByte();
        casing.silent = (casing.state & 0x80);
        casing.state = (casing.state & 0x7F);
index 93051cc4d15f423dbe1883a9fb217444437a4b04..5976eb975eee0e3151deff590e4348916714e41a 100644 (file)
@@ -164,7 +164,6 @@ const float BUTTON_14 = 65536;
 const float BUTTON_15 = 131072;
 const float BUTTON_16 = 262144;
 
-
 const float DRAWFLAG_NORMAL = 0;
 const float DRAWFLAG_ADDITIVE = 1;
 const float DRAWFLAG_MODULATE = 2;
index 783f66759b50b3881d533b083e732db2866d7d55..6ff989e4a6ed598d55e0da35ad71d535f33bfa2d 100644 (file)
@@ -69,9 +69,147 @@ void Ent_DamageInfo(float isNew)
        }
 
        self = oldself;
+       
+       if(DEATH_ISVEHICLE(w_deathtype))
+       {
+           traceline(w_org - normalize(force) * 16, w_org + normalize(force) * 16, MOVE_NOMONSTERS, world);
+           if(trace_plane_normal != '0 0 0')       
+            w_backoff = trace_plane_normal;
+        else
+            w_backoff = -1 * normalize(w_org - (w_org + normalize(force) * 16));
+           
+           setorigin(self, w_org + w_backoff * 2); // for sound() calls
+           
+           switch(w_deathtype)
+           {            
+            case DEATH_VHCRUSH:
+                break;
+                
+            case DEATH_SBMINIGUN:
+                string _snd;
+                _snd = strcat("weapons/ric", ftos(1 + rint(random() * 2)), ".waw");
+                sound(self, CHAN_PROJECTILE, _snd, VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("spiderbot_minigun_impact"), self.origin, w_backoff * 1000, 1);
+                break;
+            case DEATH_SBROCKET:
+                sound(self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("spiderbot_rocket_explode"), self.origin, w_backoff * 1000, 1);
+                break;
+            case DEATH_SBBLOWUP:
+                sound(self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_MIN);
+                pointparticles(particleeffectnum("explosion_big"), self.origin, w_backoff * 1000, 1);
+                break;
+                
+            case DEATH_WAKIGUN:
+                sound(self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("wakizashi_gun_impact"), self.origin, w_backoff * 1000, 1);
+                break;
+            case DEATH_WAKIROCKET:
+                sound(self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("wakizashi_rocket_explode"), self.origin, w_backoff * 1000, 1);
+                break;
+            case DEATH_WAKIBLOWUP:
+                sound(self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_MIN);
+                pointparticles(particleeffectnum("explosion_big"), self.origin, w_backoff * 1000, 1);
+                break;
+                
+            case DEATH_RAPTOR_CANNON:
+                sound(self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("raptor_cannon_impact"), self.origin, w_backoff * 1000, 1);
+                break;
+            case DEATH_RAPTOR_BOMB_SPLIT:
+                float i;
+                vector ang, vel;
+                for(i = 1; i < 4; ++i)
+                {
+                    vel = normalize(w_org - (w_org + normalize(force) * 16)) + randomvec() * 128;
+                    ang = vectoangles(vel);
+                    RaptorCBShellfragToss(w_org, vel, ang + '0 0 1' * (120 * i));
+                }
+                    
+                
+                sound(self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("raptor_bomb_spread"), self.origin, w_backoff * 1000, 1);
+                break;
+            case DEATH_RAPTOR_BOMB:
+                sound(self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("raptor_bomb_impact"), self.origin, w_backoff * 1000, 1);
+                break;
+            case DEATH_RAPTOR_DEATH:
+                sound(self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_MIN);
+                pointparticles(particleeffectnum("explosion_big"), self.origin, w_backoff * 1000, 1);
+                break;
+           }
+       }
+       
+       
+       if(DEATH_ISTURRET(w_deathtype))
+       {           
+           traceline(w_org - normalize(force) * 16, w_org + normalize(force) * 16, MOVE_NOMONSTERS, world);
+           if(trace_plane_normal != '0 0 0')       
+            w_backoff = trace_plane_normal;
+        else
+            w_backoff = -1 * normalize(w_org - (w_org + normalize(force) * 16));
+           
+           setorigin(self, w_org + w_backoff * 2); // for sound() calls
+           
+           switch(w_deathtype)
+           {   
+             case DEATH_TURRET_EWHEEL:
+                sound(self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_MIN);
+                pointparticles(particleeffectnum("electro_impact"), self.origin, w_backoff * 1000, 1);
+                break;
+             
+             case DEATH_TURRET_FLAC:
+                vector org2;
+                org2 = w_org + w_backoff * 6;
+                pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
+                if (w_random<0.15)
+                    sound(self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
+                else if (w_random<0.7)
+                    sound(self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
+                else
+                    sound(self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
+                
+                break;
+                
+             case DEATH_TURRET_MLRS:
+             case DEATH_TURRET_HK:
+             case DEATH_TURRET_WALKER_ROCKET:
+             case DEATH_TURRET_HELLION:
+                sound(self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_MIN);
+                pointparticles(particleeffectnum("rocket_explode"), self.origin, w_backoff * 1000, 1);
+                break;
+             
+             case DEATH_TURRET_MACHINEGUN:
+             case DEATH_TURRET_WALKER_GUN:
+                string _snd;
+                _snd = strcat("weapons/ric", ftos(1 + rint(random() * 2)), ".waw");
+                sound(self, CHAN_PROJECTILE, _snd, VOL_BASE, ATTN_NORM);
+                pointparticles(particleeffectnum("machinegun_impact"), self.origin, w_backoff * 1000, 1);
+                break;
+                          
+             case DEATH_TURRET_PLASMA:
+                sound(self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_MIN);
+                pointparticles(particleeffectnum("electro_impact"), self.origin, w_backoff * 1000, 1);
+                break;
+                          
+             case DEATH_TURRET_WALKER_MEELE:
+                sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_MIN);
+                pointparticles(particleeffectnum("TE_SPARK"), self.origin, w_backoff * 1000, 1);
+                break;
 
-       // TODO spawn particle effects and sounds based on w_deathtype
+             case DEATH_TURRET_PHASER:
+                break;
+                
+             case DEATH_TURRET_TESLA:
+                te_smallflash(self.origin);
+                break;
+
+        }        
+       }
        
+       // TODO spawn particle effects and sounds based on w_deathtype
        if(!DEATH_ISSPECIAL(w_deathtype))
        {
                float hitwep;
index a737c82d25cdfaab7b7992eda002ffd3f15523ed..6b11719567d055e4234fd81ddb8344f3ba4316e8 100644 (file)
@@ -614,7 +614,7 @@ void HUD_Weapons(void)
 {
        float f, screen_ar;
        float center_x, center_y;
-
+    if(hud != HUD_NORMAL) return;
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_weapons) return;
@@ -1019,6 +1019,7 @@ void DrawAmmoItem(vector myPos, vector mySize, float itemcode, float currently_s
 
 void HUD_Ammo(void)
 {
+    if(hud != HUD_NORMAL) return;
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_ammo) return;
@@ -1319,6 +1320,7 @@ void HUD_HealthArmor(void)
        if(!autocvar__hud_configure)
        {
                if(!autocvar_hud_panel_healtharmor) return;
+               if(hud != HUD_NORMAL) return;
                if(spectatee_status == -1) return;
 
                health = getstati(STAT_HEALTH);
@@ -1755,7 +1757,7 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s
                        HUD_KillNotify_Push(s1, s2, 1, DEATH_HURTTRIGGER);
                        if(alsoprint)
                                print(sprintf(_("^1%s^1 was thrown into a world of hurt by %s\n"), s2, s1));
-               } else if(type == DEATH_SBCRUSH) {
+               } else if(type == DEATH_VHCRUSH) {
                        HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
                                print (sprintf(_("^1%s^1 was crushed by %s\n"), s2, s1));
@@ -1783,6 +1785,18 @@ void HUD_KillNotify(string s1, string s2, string s3, float type, float msg) // s
                        HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
                                print (sprintf(_("^1%s^1 dies when %s^1's wakizashi dies.\n"), s2, s1));
+               } else if(type == DEATH_RAPTOR_CANNON) {
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print (sprintf(_("^1%s^1 nailed to hell by %s\n"), s2, s1));
+               } else if(type == DEATH_RAPTOR_BOMB) {
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print (sprintf(_("^1%s^1 cluster crushed by %s\n"), s2, s1));
+               } else if(type == DEATH_RAPTOR_DEATH) {
+                       HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
+                       if(alsoprint)
+                               print (sprintf(_("^1%s^1 dies when %s^1's raptor dies.\n"), s2, s1));
                } else if(type == DEATH_TURRET) {
                        HUD_KillNotify_Push(s1, s2, 1, DEATH_GENERIC);
                        if(alsoprint)
index af849e18c57c92dce1d1580b3342962b5b23403d..6788daad18d229f17499c3f7f38b425d839252d5 100644 (file)
@@ -164,3 +164,5 @@ float g_balance_electro_secondary_bouncestop;
 float g_trueaim_minrange;
 
 entity entcs_receiver[255]; // 255 is the engine limit on maxclients
+
+float hud;
index 4219eef16447e01372629a917b91c8e853cfcc71..0d024a9411fc4306280c5b54c22a3d89a7669f59 100644 (file)
@@ -30,8 +30,11 @@ prandom.qh
 bgmscript.qh
 noise.qh
 teamplay.qh
-
+tturrets.qh
+../server/tturrets/include/turrets_early.qh
+../server/movelib.qc
 main.qh
+vehicles/vehicles.qh
 
 sortlist.qc
 miscfunctions.qc
@@ -59,9 +62,10 @@ modeleffects.qc
 tuba.qc
 target_music.qc
 
-//vehicles/spiderbot.qc
+vehicles/vehicles.qc
 shownames.qh
 shownames.qc
+
 Main.qc
 View.qc
 interpolate.qc
@@ -82,5 +86,6 @@ noise.qc
 ../warpzonelib/mathlib.qc
 ../warpzonelib/common.qc
 ../warpzonelib/client.qc
+tturrets.qc
 
 ../common/if-this-file-errors-scroll-up-and-fix-the-warnings.fteqccfail
index 092cdc21a6f60e94a2939a5df1e955f9c027ed66..2282723867b1ec3bb23bfc40c282c25591c5cb4d 100644 (file)
@@ -27,10 +27,12 @@ void Projectile_ResetTrail(vector to)
        self.trail_oldorigin = to;
        self.trail_oldtime = time;
 }
+
 void Projectile_DrawTrail(vector to)
 {
        vector from;
        float t0;
+
        from = self.trail_oldorigin;
        t0 = self.trail_oldtime;
        self.trail_oldorigin = to;
@@ -195,7 +197,7 @@ void Ent_Projectile()
        //   effects
        //
        // projectiles don't send angles, because they always follow the velocity
-       
+
        f = ReadByte();
        self.count = (f & 0x80);
        self.iflags = (self.iflags & IFLAG_INTERNALMASK) | IFLAG_AUTOANGLES | IFLAG_ANGLES;
@@ -294,6 +296,14 @@ void Ent_Projectile()
                        case PROJECTILE_TAG: setmodel(self, "models/laser.mdl"); self.traileffect = particleeffectnum("TR_ROCKET"); break;
                        case PROJECTILE_FLAC: setmodel(self, "models/hagarmissile.mdl"); self.scale = 0.4; self.traileffect = particleeffectnum("TR_SEEKER"); break;
                        case PROJECTILE_SEEKER: setmodel(self, "models/tagrocket.md3"); self.traileffect = particleeffectnum("TR_SEEKER"); break;
+
+                       case PROJECTILE_RAPTORBOMB:    setmodel(self, "models/vehicles/clusterbomb.md3"); self.gravity = 1; self.avelocity = '0 0 180'; self.traileffect = particleeffectnum(""); break;
+                       case PROJECTILE_RAPTORBOMBLET: setmodel(self, "models/vehicles/bomblet.md3");     self.gravity = 1; self.avelocity = '0 0 180'; self.traileffect = particleeffectnum(""); break;
+                       case PROJECTILE_RAPTORCANNON:  setmodel(self, "models/plasmatrail.mdl"); self.traileffect = particleeffectnum("TR_CRYLINKPLASMA"); break;
+
+                       case PROJECTILE_SPIDERROCKET: setmodel(self, "models/vehicles/rocket02.md3"); self.traileffect = particleeffectnum("spiderbot_rocket_thrust"); break;
+                       case PROJECTILE_WAKIROCKET:   setmodel(self, "models/vehicles/rocket01.md3");  self.traileffect = particleeffectnum("wakizashi_rocket_thrust"); break;
+                       case PROJECTILE_WAKICANNON:   setmodel(self, "models/laser.mdl");  self.traileffect = particleeffectnum(""); break;
                        default:
                                error("Received invalid CSQC projectile, can't work with this!");
                                break;
@@ -384,6 +394,22 @@ void Ent_Projectile()
                                self.mins = '-4 -4 -4';
                                self.maxs = '4 4 4';
                                break;
+            case PROJECTILE_RAPTORBOMB:
+                               self.mins = '-3 -3 -3';
+                               self.maxs = '3 3 3';
+                               break;
+            case PROJECTILE_RAPTORBOMBLET:
+                               break;
+            case PROJECTILE_RAPTORCANNON:
+                               break;
+            case PROJECTILE_SPIDERROCKET:
+                loopsound(self, CHAN_PROJECTILE, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
+                               break;
+            case PROJECTILE_WAKIROCKET:
+                loopsound(self, CHAN_PROJECTILE, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
+                               break;
+            case PROJECTILE_WAKICANNON:
+                               break;
                        default:
                                break;
                }
@@ -406,7 +432,7 @@ void Ent_Projectile()
 
        if(!(self.count & 0x80))
                InterpolateOrigin_Note();
-       
+
        self.draw = Projectile_Draw;
        self.entremove = Ent_RemoveProjectile;
 }
@@ -424,9 +450,11 @@ void Projectile_Precache()
        precache_model("models/rocket.md3");
        precache_model("models/tagrocket.md3");
        precache_model("models/tracer.mdl");
+
        precache_sound("weapons/electro_fly.wav");
        precache_sound("weapons/rocket_fly.wav");
        precache_sound("weapons/fireball_fly.wav");
        precache_sound("weapons/fireball_fly2.wav");
        precache_sound("weapons/tag_rocket_fly.wav");
+
 }
diff --git a/qcsrc/client/tturrets.qc b/qcsrc/client/tturrets.qc
new file mode 100644 (file)
index 0000000..55fcd88
--- /dev/null
@@ -0,0 +1,505 @@
+string tid2info_base;
+string tid2info_head;
+string tid2info_name;
+vector  tid2info_min;
+vector  tid2info_max;
+
+void turret_tid2info(float _tid);
+void turret_precache(float _tid);
+float turret_is_precache[TID_LAST];
+
+void turrets_precache()
+{
+    turret_precache(TID_COMMON);
+}
+
+void turret_precache(float _tid)
+{    
+    if (!turret_is_precache[TID_COMMON])
+    {
+        dprint("turret_precache TID_COMMON\n");
+        precache_sound ("weapons/rocket_impact.wav");
+        precache_model ("models/turrets/base-gib1.md3");
+        precache_model ("models/turrets/base-gib2.md3");
+        precache_model ("models/turrets/base-gib3.md3");
+        precache_model ("models/turrets/base-gib4.md3");
+        precache_model ("models/turrets/head-gib1.md3");
+        precache_model ("models/turrets/head-gib2.md3");
+        precache_model ("models/turrets/head-gib3.md3");
+        precache_model ("models/turrets/head-gib4.md3");
+        precache_model ("models/turrets/terrainbase.md3");
+        precache_model ("models/turrets/base.md3");
+        precache_model ("models/turrets/rocket.md3");
+    }
+    turret_tid2info(_tid);
+    if(turret_is_precache[_tid])
+    {
+        dprint("turret_precache: ", tid2info_name, " allready precachd, skipping.\n");
+        return;
+    }
+    else
+        dprint("turret_precache: ", tid2info_name, " precaching.\n");
+
+    switch(_tid)
+    {
+        case TID_EWHEEL:
+            precache_model ("models/turrets/ewheel-base2.md3");
+            precache_model ("models/turrets/ewheel-gun1.md3");            
+            break;
+        case TID_FLAC:
+            precache_model ("models/turrets/flac.md3");
+            break;
+        case TID_FUSION:
+            precache_model ("models/turrets/reactor.md3");    
+            break;
+        case TID_HELLION:
+            precache_model ("models/turrets/hellion.md3");
+            break;
+        case TID_HK:
+            precache_model ("models/turrets/hk.md3");
+            break;
+        case TID_MACHINEGUN:
+            precache_model ("models/turrets/machinegun.md3");
+            precache_sound ("weapons/uzi_fire.wav");
+            break;
+        case TID_MLRS:
+            precache_model ("models/turrets/mlrs.md3");
+            break;
+        case TID_PHASER:
+            precache_model ("models/turrets/phaser.md3");
+            precache_model ("models/turrets/phaser_beam.md3");
+            precache_sound ("turrets/phaser.wav");
+            break;
+        case TID_PLASMA:
+            precache_model ("models/turrets/plasma.md3");
+            break;
+        case TID_PLASMA_DUAL:
+            precache_model ("models/turrets/plasmad.md3");
+            break;
+        case TID_TESLA:
+            precache_model ("models/turrets/tesla_head.md3");
+            precache_model ("models/turrets/tesla_base.md3");
+            break;
+        case TID_WALKER:
+            precache_model ("models/turrets/walker_head_minigun.md3");
+            precache_model ("models/turrets/walker_body.md3");
+            precache_sound ("weapons/uzi_fire.wav");
+            break;
+    }    
+    turret_is_precache[_tid] = TRUE;
+}
+
+void turret_tid2info(float _tid)
+{
+    tid2info_base = "models/turrets/base.md3";
+    tid2info_min = '-32 -32 0';
+    tid2info_max = '32 32 64';
+
+    switch(_tid)
+    {
+        case TID_EWHEEL:
+            tid2info_base = "models/turrets/ewheel-base2.md3";
+            tid2info_head = "models/turrets/ewheel-gun1.md3";
+            tid2info_name = "eWheel";
+            break;
+        case TID_FLAC:
+            tid2info_head = "models/turrets/flac.md3";
+            tid2info_name = "Flac Cannon";
+            break;
+        case TID_FUSION:
+            tid2info_head = "models/turrets/reactor.md3";
+            tid2info_name = "Fusion Reactor";
+            tid2info_min = '-34 -34 0';
+            tid2info_max = '34 34 90';
+            break;
+        case TID_HELLION:
+            tid2info_head = "models/turrets/hellion.md3";
+            tid2info_name = "Hellion";
+            break;
+        case TID_HK:
+            tid2info_head = "models/turrets/hk.md3";
+            tid2info_name = "Hunter-Killer";
+            break;
+        case TID_MACHINEGUN:
+            tid2info_head = "models/turrets/machinegun.md3";
+            tid2info_name = "Machinegun";
+            break;
+        case TID_MLRS:
+            tid2info_head = "models/turrets/mlrs.md3";
+            tid2info_name = "MLRS";
+            break;
+        case TID_PHASER:
+            tid2info_head = "models/turrets/phaser.md3";
+            tid2info_name = "Phaser";
+            break;
+        case TID_PLASMA:
+            tid2info_head = "models/turrets/plasma.md3";
+            tid2info_name = "Plasma";
+            break;
+        case TID_PLASMA_DUAL:
+            tid2info_head = "models/turrets/plasmad.md3";
+            tid2info_name = "Dual Plasma";
+            break;
+        case TID_TESLA:
+            tid2info_base = "models/turrets/tesla_base.md3";
+            tid2info_head = "models/turrets/tesla_head.md3";
+            tid2info_name = "Tesla coil";
+            tid2info_min = '-60 -60 0';
+            tid2info_max  ='60 60 128';
+            break;
+        case TID_WALKER:
+            tid2info_base = "models/turrets/walker_body.md3";
+            tid2info_head = "models/turrets/walker_head_minigun.md3";
+            tid2info_name = "Walker";
+            tid2info_min = '-70 -70 0';
+            tid2info_max = '70 70 95';
+            break;
+    }    
+}
+
+void turret_remove()
+{
+    turret_tid2info(self.turret_type);
+    dprint("Removing ", tid2info_name, " turrret.\n");
+    
+    remove(self.tur_head);
+    self.tur_head = world;    
+}
+
+void turret_changeteam()
+{
+       self.colormod = '0 0 0';
+       
+       switch(self.team)
+       {
+        case COLOR_TEAM1: // Red
+            self.colormod = '2 0.5 0.5';
+            break;
+
+        case COLOR_TEAM2: // Blue
+            self.colormod = '0.5 0.5 2';
+            break;
+
+        case COLOR_TEAM3: // Yellow
+            self.colormod = '1.4 1.4 0.6';
+            break;
+
+        case COLOR_TEAM4: // Pink
+            self.colormod = '1.4 0.6 1.4';
+            break;
+       }
+       
+       self.tur_head.colormod = self.colormod;    
+}
+
+void turret_head_draw()
+{    
+    self.drawmask = MASK_NORMAL;
+}
+
+void turret_draw()
+{        
+    float dt;
+
+    dt = time - self.move_time;
+    self.move_time = time;
+    if(dt <= 0)
+        return;
+    
+    self.tur_head.angles += dt * self.tur_head.move_avelocity;
+
+    if (self.health < 127)
+    {
+        dt = random();
+        
+        if(dt < 0.25)
+            te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);    
+        
+    }
+    
+    if(self.health < 85)    
+    if(dt < 0.1)
+        pointparticles(particleeffectnum("smoke_small"), (self.origin + (randomvec() * 80)), '0 0 0', 1);        
+    
+    if(self.health < 32)
+    if(dt < 0.1)
+        pointparticles(particleeffectnum("smoke_large"), (self.origin + (randomvec() * 80)), '0 0 0', 1);        
+    
+}
+
+void turret_walker_draw()
+{        
+    float dt;
+            
+    dt = time - self.move_time;
+    self.move_time = time;
+    if(dt <= 0)
+        return;
+    
+    fixedmakevectors(self.angles);
+    movelib_groundalign4point(300, 100, 0.25);
+    
+    setorigin(self, self.origin + self.velocity * dt);
+    setorigin(self.tur_head, gettaginfo(self, gettagindex(self, "tag_head")));
+    
+    self.tur_head.angles += dt * self.tur_head.move_avelocity;
+    
+    self.angles_y = self.move_angles_y;
+    
+    if (self.health < 127)
+    if(random() < 0.25)
+        te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);    
+}
+
+void turret_ewheel_draw()
+{        
+    float dt;
+            
+    dt = time - self.move_time;
+    self.move_time = time;
+    if(dt <= 0)
+        return;
+    
+    fixedmakevectors(self.angles);
+    movelib_groundalign4point(300, 100, 0.25);
+    
+    setorigin(self, self.origin + self.velocity * dt);
+    setorigin(self.tur_head, self.origin);
+    
+    self.tur_head.angles += dt * self.tur_head.move_avelocity;
+    
+    // Simulate banking
+    //self.angles_z -= self.angles_z * dt * 2;
+    //self.angles_z = bound(-45, self.angles_z  + ((self.move_angles_y - self.angles_y * -25) * dt), 45);
+    
+    self.angles_y = self.move_angles_y;
+    
+    if (self.health < 127)
+    if(random() < 0.25)
+        te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);    
+}
+
+void turret_construct()
+{    
+    if(self.tur_head == world)
+        self.tur_head = spawn();
+    
+    turret_tid2info(self.turret_type);
+    dprint("Constructing ", tid2info_name , " turret (", ftos(self.turret_type), ")\n");
+
+    setorigin(self, self.origin);
+    setmodel(self, tid2info_base);
+    setmodel(self.tur_head, tid2info_head);
+    setsize(self, tid2info_min, tid2info_max);
+    setsize(self.tur_head, '0 0 0', '0 0 0');
+    setorigin(self.tur_head, gettaginfo(self, gettagindex(self, "tag_head")));
+
+    self.tur_head.classname     = "turret_head";
+    self.tur_head.owner         = self;
+    self.tur_head.move_movetype = MOVETYPE_NOCLIP;
+    self.move_movetype          = MOVETYPE_NOCLIP;
+    self.tur_head.angles        = self.angles;
+    self.health                 = 255;
+    self.solid                  = SOLID_BBOX;
+    self.tur_head.solid         = SOLID_NOT;
+    self.movetype               = MOVETYPE_NOCLIP;
+    self.tur_head.movetype      = MOVETYPE_NOCLIP;    
+    self.draw                   = turret_draw;
+    self.entremove              = turret_remove;
+    self.drawmask = MASK_NORMAL;
+    self.tur_head.drawmask = MASK_NORMAL;
+
+    if(self.turret_type == TID_EWHEEL || self.turret_type == TID_WALKER)
+    {
+        self.gravity            = 1;
+        self.movetype           = MOVETYPE_BOUNCE;
+        self.move_movetype      = MOVETYPE_BOUNCE;
+        self.move_origin        = self.origin;                
+        self.move_time          = time;
+        switch(self.turret_type)
+        {
+            case TID_EWHEEL:
+                self.draw               = turret_ewheel_draw;
+                break;
+            case TID_WALKER:
+                self.draw               = turret_walker_draw;
+        }        
+    }
+}
+
+entity turret_gibtoss(string _model, vector _from, vector _to, vector _cmod, float _explode);
+void turret_gibboom();
+void turret_gib_draw()
+{
+    Movetype_Physics_MatchTicrate(autocvar_cl_gibs_ticrate, autocvar_cl_gibs_sloppy);
+    
+    self.drawmask = MASK_NORMAL;
+       
+       if(self.cnt)
+       {
+           if(time >= self.nextthink)
+           {
+            turret_gibboom();
+            remove(self);
+           }
+       }
+       else
+       {
+        self.alpha = bound(0, self.nextthink - time, 1);
+        if(self.alpha < ALPHA_MIN_VISIBLE)
+            remove(self);          
+       }
+}
+
+void turret_gibboom()
+{
+    float i;
+    
+    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+    pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
+
+    for (i = 1; i < 5; i = i + 1)
+        turret_gibtoss(strcat("models/turrets/head-gib", ftos(i), ".md3"), self.origin, self.velocity + randomvec() * 700, '0 0 0', FALSE);
+}
+
+entity turret_gibtoss(string _model, vector _from, vector _to, vector _cmod, float _explode)
+{
+    entity gib;
+
+    gib = spawn();
+    setorigin(gib, _from);
+    setmodel(gib, _model);
+    gib.colormod    = _cmod;
+       gib.solid       = SOLID_CORPSE;
+    gib.draw        = turret_gib_draw;    
+    gib.cnt         = _explode;
+    
+    if(_explode)
+    {
+        gib.nextthink = time + 0.2 * (autocvar_cl_gibs_lifetime * (1 + prandom() * 0.15));
+        gib.effects = EF_FLAME;
+    }        
+    else
+        gib.nextthink = time + autocvar_cl_gibs_lifetime * (1 + prandom() * 0.15);
+    
+    gib.gravity         = 1;
+       gib.move_movetype   = MOVETYPE_BOUNCE;
+       gib.move_origin     = gib.origin = _from;
+       gib.move_velocity   = _to;      
+       gib.move_avelocity  = prandomvec() * 32;
+       gib.move_time       = time;
+       gib.damageforcescale = 1;
+       
+       return gib;
+}
+
+void turret_die()
+{    
+    entity headgib;
+    
+    setmodel(self, "");
+    setmodel(self.tur_head, "");
+    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+    pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
+    turret_tid2info(self.turret_type);
+    dprint("Turret ", tid2info_name, " dies.\n");
+    
+    // Base
+    if(self.turret_type == TID_EWHEEL)
+        turret_gibtoss(tid2info_base, self.origin, self.velocity, '-1 -1 -1', FALSE);
+    else if (self.turret_type == TID_WALKER)
+        turret_gibtoss(tid2info_base, self.origin, self.velocity, '-1 -1 -1', FALSE);
+    else if (self.turret_type == TID_TESLA)
+        turret_gibtoss(tid2info_base, self.origin, self.velocity, '-1 -1 -1', FALSE);
+    else
+    {        
+        if (random() > 0.5)
+        {
+            turret_gibtoss("models/turrets/base-gib2.md3", self.origin + '0 0 2', '0 0 50' + randomvec() * 150, '0 0 0', FALSE);
+            turret_gibtoss("models/turrets/base-gib3.md3", self.origin + '0 0 2', '0 0 50' + randomvec() * 150, '0 0 0', FALSE);
+            turret_gibtoss("models/turrets/base-gib4.md3", self.origin + '0 0 2', '0 0 50' + randomvec() * 150, '0 0 0', FALSE);
+        }
+        else
+            turret_gibtoss("models/turrets/base-gib1.md3", self.origin + '0 0 4', '0 0 0', '0 0 0', TRUE);
+    }
+    
+    headgib = turret_gibtoss(tid2info_head, self.origin + '0 0 32', '0 0 200' + randomvec() * 200, '-1 -1 -1', TRUE);
+    headgib.angles = headgib.move_angles = self.tur_head.angles;
+    headgib.avelocity = headgib.move_avelocity = self.tur_head.move_avelocity + randomvec() * 45;
+    headgib.avelocity_y = headgib.move_avelocity_y = headgib.move_avelocity_y * 5;
+    headgib.gravity = 0.5;
+}
+
+void ent_turret()
+{
+    float sf;
+    sf = ReadByte();
+
+       if(sf & TNSF_SETUP)
+       {           
+           self.turret_type = ReadByte();
+                   
+           self.origin_x = ReadCoord();
+           self.origin_y = ReadCoord();
+           self.origin_z = ReadCoord();
+           
+           self.angles_x = ReadAngle();
+           self.angles_y = ReadAngle();
+           
+           turret_precache(self.turret_type);
+           turret_construct();
+    }
+    
+    if(sf & TNSF_ANG)
+    {
+        self.tur_head.move_angles_x = ReadShort();
+        self.tur_head.move_angles_y = ReadShort();
+        self.tur_head.angles = self.angles + self.tur_head.move_angles;
+    }
+    
+    if(sf & TNSF_AVEL)
+    {
+        self.tur_head.move_avelocity_x = ReadShort();
+        self.tur_head.move_avelocity_y = ReadShort();            
+    }
+    
+    if(sf & TNSF_MOVE)
+    {
+        self.origin_x = ReadShort();
+        self.origin_y = ReadShort();
+        self.origin_z = ReadShort();
+        setorigin(self, self.origin);
+        
+        self.velocity_x = ReadShort();
+        self.velocity_y = ReadShort();
+        self.velocity_z = ReadShort();
+        
+        self.move_angles_y = ReadShort();
+            
+        self.move_time     = time;
+        self.move_velocity = self.velocity;
+        self.move_origin   = self.origin;
+    }
+        
+    if(sf & TNSF_ANIM)
+    {
+        self.frame1time = ReadCoord();
+        self.frame      = ReadByte();
+    }
+
+    if(sf & TNSF_STATUS)
+    {
+        float _team;
+        _team = ReadByte();
+        _team -= 1; // /&)=(%&#)&%)/#&)=½!!!½!!". thanks.
+        self.health = ReadByte();
+        if(_team != self.team)
+        {
+            self.team = _team;
+            turret_changeteam();        
+        }
+    } 
+    
+    if(self.health == 0)
+        turret_die();
+}
diff --git a/qcsrc/client/tturrets.qh b/qcsrc/client/tturrets.qh
new file mode 100644 (file)
index 0000000..cf74f48
--- /dev/null
@@ -0,0 +1,3 @@
+void ent_turret();
+void turrets_precache();
+.entity tur_head;
diff --git a/qcsrc/client/vehicles/racer.qc b/qcsrc/client/vehicles/racer.qc
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/qcsrc/client/vehicles/raptor.qc b/qcsrc/client/vehicles/raptor.qc
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/qcsrc/client/vehicles/spiderbot.qc b/qcsrc/client/vehicles/spiderbot.qc
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/qcsrc/client/vehicles/vehicles.qc b/qcsrc/client/vehicles/vehicles.qc
new file mode 100644 (file)
index 0000000..ab42d61
--- /dev/null
@@ -0,0 +1,718 @@
+#define hud_bg "gfx/vehicles/frame.tga"
+#define hud_sh "gfx/vehicles/vh-shield.tga"
+
+#define hud_hp_bar "gfx/vehicles/bar_up_left.tga"
+#define hud_hp_ico "gfx/vehicles/health.tga"
+#define hud_sh_bar "gfx/vehicles/bar_dwn_left.tga"
+#define hud_sh_ico "gfx/vehicles/shield.tga"
+
+#define hud_ammo1_bar "gfx/vehicles/bar_up_right.tga"
+#define hud_ammo1_ico "gfx/vehicles/bullets.tga"
+#define hud_ammo2_bar "gfx/vehicles/bar_dwn_right.tga"
+#define hud_ammo2_ico "gfx/vehicles/rocket.tga"
+
+entity dropmark;
+float autocvar_cl_vehicles_hudscale;
+float autocvar_cl_vehicles_hudalpha;
+
+
+void CSQC_WAKIZASHI_HUD();
+void CSQC_SPIDER_HUD();
+void CSQC_RAPTOR_HUD();
+void CSQC_BUMBLE_HUD();
+
+#define MAX_AXH 4
+entity AuxiliaryXhair[MAX_AXH];
+const var void Draw_Not();
+
+.string axh_image;
+.float  axh_fadetime;
+.float  axh_drawflag;
+.float  axh_scale;
+
+void AuxiliaryXhair_Draw2D()
+{
+    vector loc, psize;
+
+    psize = self.axh_scale * drawgetimagesize(self.axh_image);
+    loc = project_3d_to_2d(self.origin) - 0.5 * psize;
+    if not (loc_z < 0 || loc_x < 0 || loc_y < 0 || loc_x > vid_conwidth || loc_y > vid_conheight)
+    {
+        loc_z = 0;
+        psize_z = 0;
+        drawpic(loc, self.axh_image, psize, self.colormod, self.alpha, self.axh_drawflag);
+    }
+
+    if(time - self.cnt > self.axh_fadetime)
+        self.draw2d = Draw_Not;
+}
+
+void Net_AuXair2(float bIsNew)
+{
+    float axh_id;
+    entity axh;
+
+    axh_id = bound(0, ReadByte(), MAX_AXH);
+    axh = AuxiliaryXhair[axh_id];
+
+    if(axh == world || wasfreed(axh))  // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?)
+    {
+        axh               = spawn();
+               axh.draw2d        = Draw_Not;
+               axh.drawmask      = MASK_NORMAL;
+               axh.axh_drawflag  = DRAWFLAG_ADDITIVE;
+               axh.axh_fadetime  = 0.1;
+               axh.axh_image     = "gfx/vehicles/axh-ring.tga";
+               axh.axh_scale     = 1;
+        axh.alpha         = 1;
+               AuxiliaryXhair[axh_id] = axh;
+    }
+
+    axh.draw2d   = AuxiliaryXhair_Draw2D;
+
+       axh.origin_x = ReadCoord();
+       axh.origin_y = ReadCoord();
+       axh.origin_z = ReadCoord();
+
+       axh.colormod_x = ReadByte() / 255;
+       axh.colormod_y = ReadByte() / 255;
+       axh.colormod_z = ReadByte() / 255;
+    axh.cnt = time;
+}
+
+void Net_VehicleSetup()
+{
+
+    float hud_id, i;
+    hud_id = bound(HUD_SPIDERBOT, ReadByte(), HUD_RAPTOR);
+
+    // Init auxiliary crosshairs
+    entity axh;
+    for(i = 0; i < MAX_AXH; ++i)
+    {
+        axh = AuxiliaryXhair[i];
+        if(axh != world && !wasfreed(axh))  // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?)
+            remove(axh);
+
+        axh               = spawn();
+               axh.draw2d        = Draw_Not;
+               axh.drawmask      = MASK_NORMAL;
+               axh.axh_drawflag  = DRAWFLAG_NORMAL;
+               axh.axh_fadetime  = 0.1;
+               axh.axh_image     = "gfx/vehicles/axh-ring.tga";
+               axh.axh_scale     = 1;
+        axh.alpha         = 1;
+               AuxiliaryXhair[i] = axh;
+    }
+
+    switch(hud_id)
+    {
+        case HUD_SPIDERBOT:
+            // Minigun1
+            AuxiliaryXhair[0].axh_image   = "gfx/vehicles/axh-ring.tga";
+            AuxiliaryXhair[0].axh_scale   = 0.25;
+            // Minigun2
+            AuxiliaryXhair[1].axh_image   = "gfx/vehicles/axh-ring.tga";
+            AuxiliaryXhair[1].axh_scale   = 0.25;
+            // Rocket
+            AuxiliaryXhair[2].axh_image   = "gfx/vehicles/axh-special1.tga";
+            AuxiliaryXhair[2].axh_scale   = 0.5;
+            break;
+
+        case HUD_WAKIZASHI:
+            AuxiliaryXhair[0].axh_image   = "gfx/vehicles/axh-bracket.tga";
+            AuxiliaryXhair[0].axh_scale   = 0.25;
+            break;
+
+        case HUD_RAPTOR:
+            AuxiliaryXhair[0].axh_image   = "gfx/vehicles/axh-special2.tga";
+            AuxiliaryXhair[0].axh_scale   = 0.5;
+            //AuxiliaryXhair[0].alpha       = 0.5;
+
+            AuxiliaryXhair[1].axh_image   = "gfx/vehicles/axh-bracket.tga";
+            AuxiliaryXhair[1].axh_scale   = 0.25;
+            //AuxiliaryXhair[1].alpha       = 0.75;
+            //AuxiliaryXhair[1].axh_drawflag  = DRAWFLAG_NORMAL;
+            break;
+
+        case HUD_BUMBLEBEE:
+            // Plasma cannons
+            AuxiliaryXhair[0].axh_image   = "gfx/vehicles/axh-ring.tga";
+            AuxiliaryXhair[0].axh_scale   = 0.25;
+            // Raygun
+            AuxiliaryXhair[1].axh_image   = "gfx/vehicles/axh-special1.tga";
+            AuxiliaryXhair[1].axh_scale   = 0.25;
+            break;
+    }
+}
+#define HUD_GETSTATS \
+    float vh_health    = getstati(STAT_VEHICLESTAT_HEALTH);  \
+       float shield    = getstati(STAT_VEHICLESTAT_SHIELD);  \
+       float energy    = getstati(STAT_VEHICLESTAT_ENERGY);  \
+       float ammo1     = getstati(STAT_VEHICLESTAT_AMMO1);   \
+       float reload1   = getstati(STAT_VEHICLESTAT_RELOAD1); \
+       float ammo2     = getstati(STAT_VEHICLESTAT_AMMO2);   \
+       float reload2   = getstati(STAT_VEHICLESTAT_RELOAD2);
+
+void CSQC_BUMBLE_HUD()
+{
+}
+
+
+#define spider_ico  "gfx/vehicles/sbot.tga"
+#define spider_rkt  "gfx/vehicles/sbot_rpods.tga"
+#define spider_mgun "gfx/vehicles/sbot_mguns.tga"
+#define spider_xhair "gfx/vehicles/axh-special1.tga"
+float alarm1time;
+float alarm2time;
+
+void CSQC_SPIDER_HUD()
+{
+       if(autocvar_r_letterbox)
+        return;
+
+    vector picsize, hudloc, pic2size, picloc;
+    float i;
+
+    // Fetch health & ammo stats
+       HUD_GETSTATS
+
+    picsize = drawgetimagesize(hud_bg) * autocvar_cl_vehicles_hudscale;
+    hudloc_y = vid_conheight - picsize_y;
+    hudloc_x = vid_conwidth * 0.5 - picsize_x * 0.5;
+
+    drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL);
+
+    //drawstring(hudloc + '145 19  0', strcat(ftos(vh_health), "%"),'15 15 0','0 1 0', 1, DRAWFLAG_NORMAL);
+    //drawstring(hudloc + '175 34  0', strcat(ftos(shield), "%"),'15 15 0','0 0 1', 1, DRAWFLAG_NORMAL);
+    //drawstring(hudloc + '136 102  0', strcat(ftos(ammo1), "%"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
+    //drawstring(hudloc + '179 69  0', strcat(ftos(9 - ammo2), " / 8"),'14 14 0','1 1 0', 1, DRAWFLAG_NORMAL);
+
+    ammo1   *= 0.01;
+    shield  *= 0.01;
+    vh_health  *= 0.01;
+    reload2 *= 0.01;
+
+    pic2size = drawgetimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8);
+    picloc = picsize * 0.5 - pic2size * 0.5;
+    if(vh_health < 0.25)
+        drawpic(hudloc + picloc, spider_ico, pic2size,  '1 0 0' + '0 1 1' * sin(time * 8),  1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, spider_ico, pic2size,  '1 1 1' * vh_health  + '1 0 0' * (1 - vh_health),  1, DRAWFLAG_NORMAL);    
+    drawpic(hudloc + picloc, spider_rkt, pic2size,  '1 1 1' * reload2 + '1 0 0' * (1 - reload2), 1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, spider_mgun, pic2size, '1 1 1' * ammo1   + '1 0 0' * (1 - ammo1),   1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, hud_sh, pic2size,  '1 1 1', shield, DRAWFLAG_NORMAL);
+
+// Health bar
+    picsize = drawgetimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '69 69 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - vh_health)), 0, vid_conwidth, vid_conheight);
+    drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picsize = drawgetimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '37 65 0' * autocvar_cl_vehicles_hudscale;
+    if(vh_health < 0.25)
+    {
+        if(alarm1time < time)
+        {
+            alarm1time = time + 2;
+            sound(world, CHAN_PAIN, "vehicles/alarm.wav", VOL_BASEVOICE, ATTN_NONE);
+        }        
+        drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    }        
+    else
+    {
+        drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+        if(alarm1time)
+        {
+            sound(world, CHAN_PAIN, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+            alarm1time = 0;
+        }        
+    }
+// Shield bar
+    picsize = drawgetimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '69 140 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - shield)), 0, vid_conwidth, vid_conheight);
+    drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picloc = '40 136 0' * autocvar_cl_vehicles_hudscale;
+    picsize = drawgetimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale;
+    if(shield < 0.25)
+    {
+        if(alarm2time < time)
+        {
+            alarm2time = time + 1;
+            sound(world, CHAN_TRIGGER, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTN_NONE);
+        }
+        drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    }
+    else
+    {
+        drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+        if(alarm2time)
+        {            
+            sound(world, CHAN_TRIGGER, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+            alarm2time = 0;
+        }
+    }
+    
+
+// Minigun bar
+    picsize = drawgetimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '450 69 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x, picloc_y, picsize_x * ammo1, vid_conheight);
+    drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picsize = drawgetimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '664 60 0' * autocvar_cl_vehicles_hudscale;
+    if(ammo1 < 0.2)
+        drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+// Rocket ammo bar
+    picsize = drawgetimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale;
+    ammo1 = picsize_x / 8;
+    picloc = '450 140 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x, hudloc_y + picloc_y, picsize_x * reload2, vid_conheight);
+    drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+
+// ..  and icons
+    pic2size = 0.35 * drawgetimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
+    picloc_x -= pic2size_x;
+    picloc_y += pic2size_y * 2.25;
+    if(ammo2 == 9)
+    {
+        for(i = 1; i < 9; ++i)
+        {
+            picloc_x += ammo1;
+            drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, ((8 * reload2 <= i) ? '0 0 0' : '1 1 1'), 0.75, DRAWFLAG_NORMAL);
+        }
+    }
+    else
+    {
+        for(i = 1; i < 9; ++i)
+        {
+            picloc_x += ammo1;
+            drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, ((i >= ammo2) ? '1 1 1' : '0 0 0'), 0.75, DRAWFLAG_NORMAL);
+        }
+    }
+    pic2size = drawgetimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '664 130 0' * autocvar_cl_vehicles_hudscale;
+    if(ammo2 == 9)
+        drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+
+    HUD_DrawCenterPrint();
+
+       if (scoreboard_showscores)
+               HUD_DrawScoreboard();
+    else
+    {
+        picsize = drawgetimagesize(spider_xhair);
+        picsize_x *= autocvar_cl_vehicle_spiderbot_cross_size;
+        picsize_y *= autocvar_cl_vehicle_spiderbot_cross_size;
+
+        drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), spider_xhair, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_ADDITIVE);
+    }
+}
+
+#define raptor_ico  "gfx/vehicles/raptor.tga"
+#define raptor_gun  "gfx/vehicles/raptor_guns.tga"
+#define raptor_bomb "gfx/vehicles/raptor_bombs.tga"
+#define raptor_drop "gfx/vehicles/axh-dropcross.tga"
+#define raptor_xhair "gfx/vehicles/axh-ring.tga"
+void CSQC_RAPTOR_HUD()
+{
+       if(autocvar_r_letterbox)
+        return;
+
+    vector picsize, hudloc, pic2size, picloc;
+
+    // Fetch health & ammo stats
+       HUD_GETSTATS
+
+    picsize = drawgetimagesize(hud_bg) * autocvar_cl_vehicles_hudscale;
+    hudloc_y = vid_conheight - picsize_y;
+    hudloc_x = vid_conwidth * 0.5 - picsize_x * 0.5;
+
+    drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL);
+
+    ammo1   *= 0.01;
+    ammo2   *= 0.01;
+    shield  *= 0.01;
+    vh_health  *= 0.01;
+    energy  *= 0.01;
+    reload1 = reload2 * 0.01;
+    //reload2 *= 0.01;
+
+    pic2size = drawgetimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8);
+    picloc = picsize * 0.5 - pic2size * 0.5;
+    if(vh_health < 0.25)
+        drawpic(hudloc + picloc, raptor_ico, pic2size,  '1 0 0' + '0 1 1' * sin(time * 8),  1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, raptor_ico, pic2size,  '1 1 1' * vh_health  + '1 0 0' * (1 - vh_health),  1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, raptor_bomb, pic2size,  '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, raptor_gun, pic2size, '1 1 1' * energy   + '1 0 0' * (1 - energy),   1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, hud_sh, pic2size,  '1 1 1', shield, DRAWFLAG_NORMAL);
+
+// Health bar
+    picsize = drawgetimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '69 69 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - vh_health)), 0, vid_conwidth, vid_conheight);
+    drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picsize = drawgetimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '37 65 0' * autocvar_cl_vehicles_hudscale;
+    if(vh_health < 0.25)
+    {
+        if(alarm1time < time)
+        {
+            alarm1time = time + 2;
+            sound(self, CHAN_PAIN, "vehicles/alarm.wav", VOL_BASEVOICE, ATTN_NONE);
+        }
+        
+        drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    }        
+    else
+    {
+        drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+        if(alarm1time)
+        {
+            sound(self, CHAN_PAIN, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+            alarm1time = 0;
+        }
+    }
+
+// Shield bar
+    picsize = drawgetimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '69 140 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - shield)), 0, vid_conwidth, vid_conheight);
+    drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picloc = '40 136 0' * autocvar_cl_vehicles_hudscale;
+    picsize = drawgetimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale;
+    if(shield < 0.25)
+    {
+        if(alarm2time < time)
+        {
+            alarm2time = time + 1;
+            sound(world, CHAN_TRIGGER, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTN_NONE);
+        }
+        drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    }
+    else
+    {
+        drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+        if(alarm2time)
+        {            
+            sound(world, CHAN_TRIGGER, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+            alarm2time = 0;
+        }
+    }
+    
+// Gun bar
+    picsize = drawgetimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '450 69 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x, picloc_y, picsize_x * energy, vid_conheight);
+    drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picsize = drawgetimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '664 60 0' * autocvar_cl_vehicles_hudscale;
+    if(energy < 0.2)
+        drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+// Bomb bar
+    picsize = drawgetimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '450 140 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x, hudloc_y + picloc_y, picsize_x * reload1, vid_conheight);
+    drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    pic2size = drawgetimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '664 130 0' * autocvar_cl_vehicles_hudscale;
+    if(reload1 != 1)
+        drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+// Bombing crosshair
+    if(!dropmark)
+    {
+        dropmark = spawn();
+        dropmark.owner = self;
+        dropmark.gravity = 1;
+    }
+
+    if(reload2 == 100)
+    {
+        vector where;
+
+        setorigin(dropmark, pmove_org);
+        dropmark.velocity = pmove_vel;
+        tracetoss(dropmark, self);
+
+        where = project_3d_to_2d(trace_endpos);
+
+        setorigin(dropmark, trace_endpos);
+        picsize = drawgetimagesize(raptor_drop) * 0.2;
+
+        if not (where_z < 0 || where_x < 0 || where_y < 0 || where_x > vid_conwidth || where_y > vid_conheight)
+        {
+            where_x -= picsize_x * 0.5;
+            where_y -= picsize_y * 0.5;
+            where_z = 0;
+            drawpic(where, raptor_drop, picsize, '0 2 0', 1, DRAWFLAG_ADDITIVE);
+        }
+        dropmark.cnt = time + 5;
+    }
+    else
+    {
+        vector where;
+        if(dropmark.cnt > time)
+        {
+            where = project_3d_to_2d(dropmark.origin);
+            picsize = drawgetimagesize(raptor_drop) * 0.25;
+
+            if not (where_z < 0 || where_x < 0 || where_y < 0 || where_x > vid_conwidth || where_y > vid_conheight)
+            {
+                where_x -= picsize_x * 0.5;
+                where_y -= picsize_y * 0.5;
+                where_z = 0;
+                drawpic(where, raptor_drop, picsize, '2 0 0', 1, DRAWFLAG_ADDITIVE);
+            }
+        }
+    }
+
+    HUD_DrawCenterPrint();
+
+       if (scoreboard_showscores)
+               HUD_DrawScoreboard();
+    else
+    {
+        picsize = drawgetimagesize(raptor_xhair);
+        picsize_x *= 0.5;
+        picsize_y *= 0.5;
+
+        drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), raptor_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    }
+}
+
+#define waki_ico "gfx/vehicles/waki.tga"
+#define waki_eng "gfx/vehicles/waki_e.tga"
+#define waki_gun "gfx/vehicles/waki_guns.tga"
+#define waki_rkt "gfx/vehicles/waki_rockets.tga"
+#define waki_xhair "gfx/vehicles/axh-special1.tga"
+void CSQC_WAKIZASHI_HUD()
+{
+/*
+    drawpic(hudloc, waki_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL);
+    drawpic(hudloc, waki_b, picsize, '0 1 0' * health + '1 0 0'  * (1 - health), 1, DRAWFLAG_NORMAL);
+    drawpic(hudloc, waki_r, picsize, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL);
+    drawpic(hudloc, waki_e, picsize, '1 1 1' * energy + '1 0 0'  * (1 - energy), 1, DRAWFLAG_NORMAL);
+*/
+       if(autocvar_r_letterbox)
+        return;
+
+    vector picsize, hudloc, pic2size, picloc;
+
+    // Fetch health & ammo stats
+       HUD_GETSTATS
+
+    picsize = drawgetimagesize(hud_bg) * autocvar_cl_vehicles_hudscale;
+    hudloc_y = vid_conheight - picsize_y;
+    hudloc_x = vid_conwidth * 0.5 - picsize_x * 0.5;
+
+    drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL);
+
+    shield  *= 0.01;
+    vh_health  *= 0.01;
+    energy  *= 0.01;
+    reload1 *= 0.01;
+
+    pic2size = drawgetimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8);
+    picloc = picsize * 0.5 - pic2size * 0.5;
+    if(vh_health < 0.25)
+        drawpic(hudloc + picloc, waki_ico, pic2size,  '1 0 0' + '0 1 1' * sin(time * 8),  1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, waki_ico, pic2size,  '1 1 1' * vh_health  + '1 0 0' * (1 - vh_health),  1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, waki_eng, pic2size, '1 1 1' * energy   + '1 0 0' * (1 - energy),   1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, waki_gun, pic2size, '1 1 1' * energy   + '1 0 0' * (1 - energy),   1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, waki_rkt, pic2size,  '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL);
+    drawpic(hudloc + picloc, hud_sh, pic2size,  '1 1 1', shield, DRAWFLAG_NORMAL);
+
+// Health bar
+    picsize = drawgetimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '69 69 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - vh_health)), 0, vid_conwidth, vid_conheight);
+    drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picsize = drawgetimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '37 65 0' * autocvar_cl_vehicles_hudscale;
+    if(vh_health < 0.25)
+    {
+        if(alarm1time < time)
+        {
+            alarm1time = time + 2;
+            sound(self, CHAN_PAIN, "vehicles/alarm.wav", VOL_BASEVOICE, ATTN_NONE);
+        }
+        
+        drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    }        
+    else
+    {
+        drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+        if(alarm1time)
+        {
+            sound(self, CHAN_PAIN, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+            alarm1time = 0;
+        }        
+    }
+        
+
+// Shield bar
+    picsize = drawgetimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '69 140 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x + (picsize_x * (1 - shield)), 0, vid_conwidth, vid_conheight);
+    drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picloc = '40 136 0' * autocvar_cl_vehicles_hudscale;
+    picsize = drawgetimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale;
+    if(shield < 0.25)
+    {
+        if(alarm2time < time)
+        {
+            alarm2time = time + 1;
+            sound(world, CHAN_TRIGGER, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTN_NONE);
+        }
+        drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    }
+    else
+    {
+        drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+        if(alarm2time)
+        {            
+            sound(world, CHAN_TRIGGER, "misc/null.wav", VOL_BASEVOICE, ATTN_NONE);
+            alarm2time = 0;
+        }
+    }
+    
+// Gun bar
+    picsize = drawgetimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '450 69 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x, picloc_y, picsize_x * energy, vid_conheight);
+    drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    picsize = drawgetimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '664 60 0' * autocvar_cl_vehicles_hudscale;
+    if(energy < 0.2)
+        drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+// Bomb bar
+    picsize = drawgetimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale;
+    picloc = '450 140 0' * autocvar_cl_vehicles_hudscale;
+    drawsetcliparea(hudloc_x + picloc_x, hudloc_y + picloc_y, picsize_x * reload1, vid_conheight);
+    drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    drawresetcliparea();
+// ..  and icon
+    pic2size = drawgetimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale;
+    picloc = '664 130 0' * autocvar_cl_vehicles_hudscale;
+    if(reload1 != 1)
+        drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL);
+    else
+        drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL);
+
+
+    HUD_DrawCenterPrint();
+
+       if (scoreboard_showscores)
+               HUD_DrawScoreboard();
+    else
+    {
+        picsize = drawgetimagesize(waki_xhair);
+        picsize_x *= 0.5;
+        picsize_y *= 0.5;
+
+
+        drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), waki_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL);
+    }
+}
+
+void Vehicles_Precache()
+{
+// fixme: HAAAAKKKZZZ!!!!!!!!!!!! (this belongs as a setting in default.cfg)
+    autocvar_cl_vehicles_hudscale = 0.5;
+    autocvar_cl_vehicles_hudalpha = 0.75;
+
+
+       precache_model("models/vehicles/wakizashi.dpm");
+
+       precache_model("models/vehicles/bomblet.md3");
+       precache_model("models/vehicles/clusterbomb.md3");
+       precache_model("models/vehicles/clusterbomb_fragment.md3");
+       precache_model("models/vehicles/rocket01.md3");
+       precache_model("models/vehicles/rocket02.md3");
+       
+       precache_sound ("vehicles/alarm.wav");
+       precache_sound ("vehicles/alarm_shield.wav");
+}
+
+void RaptorCBShellfragDraw()
+{
+       
+       Movetype_Physics_MatchTicrate(autocvar_cl_gibs_ticrate, autocvar_cl_gibs_sloppy);
+       if(wasfreed(self))
+               return;     
+
+       self.move_avelocity += randomvec() * 15;
+       self.renderflags = 0;
+       if(self.cnt < time)
+       self.alpha = bound(0, self.nextthink - time, 1);
+
+       if(self.alpha < ALPHA_MIN_VISIBLE)
+        remove(self);
+}
+
+void RaptorCBShellfragToss(vector _org, vector _vel, vector _ang)
+{
+    entity sfrag;
+    
+    sfrag = spawn();
+    setmodel(sfrag, "models/vehicles/clusterbomb_fragment.md3");
+    setorigin(sfrag, _org);
+
+       sfrag.move_movetype = MOVETYPE_BOUNCE;
+       sfrag.gravity = 0.15;
+       sfrag.solid = SOLID_CORPSE;
+
+       sfrag.draw = RaptorCBShellfragDraw;
+
+       sfrag.move_origin = sfrag.origin = _org;
+       sfrag.move_velocity = _vel;
+       sfrag.move_avelocity = prandomvec() * vlen(sfrag.move_velocity);
+       sfrag.angles = self.move_angles = _ang;
+
+       sfrag.move_time = time;
+       sfrag.damageforcescale = 4;
+
+       sfrag.nextthink = time + 3;
+       sfrag.cnt = time + 2;
+       sfrag.alpha = 1;
+    sfrag.drawmask = MASK_NORMAL;
+}
diff --git a/qcsrc/client/vehicles/vehicles.qh b/qcsrc/client/vehicles/vehicles.qh
new file mode 100644 (file)
index 0000000..66b2af1
--- /dev/null
@@ -0,0 +1,4 @@
+void RaptorCBShellfragDraw();
+void RaptorCBShellfragToss(vector _org, vector _vel, vector _ang);
+void Vehicles_Precache();
+
index bcd8c433e07b185d3eb997f60d976daee526b2d2..3e83e45bcae4d144c462050eac1c5dcf6f6242f4 100644 (file)
@@ -6,6 +6,7 @@ float waypointsprite_minalpha;
 float waypointsprite_distancealphaexponent;
 float waypointsprite_timealphaexponent;
 float waypointsprite_scale;
+float waypointsprite_fontsize;
 float waypointsprite_edgefadealpha;
 float waypointsprite_edgefadescale;
 float waypointsprite_edgefadedistance;
@@ -17,6 +18,7 @@ float waypointsprite_distancefadescale;
 float waypointsprite_distancefadedistance;
 float waypointsprite_alpha;
 
+.float helpme;
 .float rule;
 .string netname; // primary picture
 .string netname2; // secondary picture
@@ -32,14 +34,14 @@ float waypointsprite_alpha;
 .float build_starthealth;
 .float build_finished;
 
-vector SPRITE_SIZE = '288 36 0';
-vector SPRITE_HOTSPOT = '144 36 0';
 float SPRITE_HEALTHBAR_WIDTH = 144;
 float SPRITE_HEALTHBAR_HEIGHT = 9;
 float SPRITE_HEALTHBAR_MARGIN = 6;
 float SPRITE_HEALTHBAR_BORDER = 2;
 float SPRITE_HEALTHBAR_BORDERALPHA = 1;
 float SPRITE_HEALTHBAR_HEALTHALPHA = 0.5;
+float SPRITE_ARROW_SCALE = 1.0;
+float SPRITE_HELPME_BLINK = 2;
 
 void drawrotpic(vector org, float rot, string pic, vector sz, vector hotspot, vector rgb, float a, float f)
 {
@@ -106,6 +108,257 @@ void drawhealthbar(vector org, float rot, float h, vector sz, vector hotspot, fl
        drawquad(o + ri * (border + align * ((1 - h) * width)), ri * width * h, up * height, "", hrgb, ha, f);
 }
 
+// returns location of sprite text
+vector drawspritearrow(vector o, float ang, vector rgb, float a, float t)
+{
+       float SQRT2 = 1.414;
+       float BORDER; BORDER = 1.5 * t;
+       float TSIZE; TSIZE = 8 * t;
+       float RLENGTH; RLENGTH = 8 * t;
+       float RWIDTH; RWIDTH = 4 * t;
+       float MLENGTH; MLENGTH = 4 * t;
+
+       R_BeginPolygon("", DRAWFLAG_NORMAL);
+       R_PolygonVertex(o + rotate(eX * -(TSIZE + BORDER * (1 + SQRT2)) + eY * (TSIZE + BORDER), ang), '0 0 0', '0 0 0', a);
+       R_PolygonVertex(o + rotate(eX *  (TSIZE + BORDER * (1 + SQRT2)) + eY * (TSIZE + BORDER), ang), '0 0 0', '0 0 0', a);
+       R_PolygonVertex(o + rotate(eY * -(        BORDER *      SQRT2),                          ang), '0 0 0', '0 0 0', a);
+       R_EndPolygon();
+       R_BeginPolygon("", DRAWFLAG_NORMAL);
+       R_PolygonVertex(o + rotate(eX * -(RWIDTH + BORDER) + eY * (TSIZE           + BORDER), ang), '0 0 0', '0 0 0', a);
+       R_PolygonVertex(o + rotate(eX * -(RWIDTH + BORDER) + eY * (TSIZE + RLENGTH + BORDER), ang), '0 0 0', '0 0 0', a);
+       R_PolygonVertex(o + rotate(eX *  (RWIDTH + BORDER) + eY * (TSIZE + RLENGTH + BORDER), ang), '0 0 0', '0 0 0', a);
+       R_PolygonVertex(o + rotate(eX *  (RWIDTH + BORDER) + eY * (TSIZE           + BORDER), ang), '0 0 0', '0 0 0', a);
+       R_EndPolygon();
+
+       R_BeginPolygon("", DRAWFLAG_ADDITIVE);
+       R_PolygonVertex(o + rotate(eX * -TSIZE + eY * TSIZE, ang), '0 0 0', rgb, a);
+       R_PolygonVertex(o + rotate(eX *  TSIZE + eY * TSIZE, ang), '0 0 0', rgb, a);
+       R_PolygonVertex(o + rotate('0 0 0',                  ang), '0 0 0', rgb, a);
+       R_EndPolygon();
+       R_BeginPolygon("", DRAWFLAG_ADDITIVE);
+       R_PolygonVertex(o + rotate(eX * -RWIDTH + eY *  TSIZE,            ang), '0 0 0', rgb, a);
+       R_PolygonVertex(o + rotate(eX * -RWIDTH + eY * (TSIZE + RLENGTH), ang), '0 0 0', rgb, a);
+       R_PolygonVertex(o + rotate(eX *  RWIDTH + eY * (TSIZE + RLENGTH), ang), '0 0 0', rgb, a);
+       R_PolygonVertex(o + rotate(eX *  RWIDTH + eY *  TSIZE,            ang), '0 0 0', rgb, a);
+       R_EndPolygon();
+
+       return
+               o + rotate(eY * (TSIZE + RLENGTH + MLENGTH), ang);
+}
+
+// returns location of sprite healthbar
+vector drawspritetext(vector o, float ang, float minwidth, vector rgb, float a, vector fontsize, string s)
+{
+       float algnx, algny;
+       float sw, w, h;
+       float aspect, sa, ca;
+
+       sw = stringwidth(s, FALSE, fontsize);
+       if(sw > minwidth)
+               w = sw;
+       else
+               w = minwidth;
+       h = fontsize_y;
+
+       // how do corners work?
+       aspect = vid_conwidth / vid_conheight;
+       sa = sin(ang);
+       ca = cos(ang) * aspect;
+       if(fabs(sa) > fabs(ca))
+       {
+               algnx = (sa < 0);
+               algny = 0.5 - 0.5 * ca / fabs(sa);
+       }
+       else
+       {
+               algnx = 0.5 - 0.5 * sa / fabs(ca);
+               algny = (ca < 0);
+       }
+
+       // align
+       o_x -= w * algnx;
+       o_y -= h * algny;
+
+       // we want to be onscreen
+       if(o_x < 0)
+               o_x = 0;
+       if(o_y < 0)
+               o_y = 0;
+       if(o_x > vid_conwidth - w)
+               o_x = vid_conwidth - w;
+       if(o_y > vid_conheight - h)
+               o_x = vid_conheight - h;
+
+       o_x += 0.5 * (w - sw);
+
+       drawstring(o, s, fontsize, rgb, a, DRAWFLAG_NORMAL);
+
+       o_x += 0.5 * sw;
+       o_y += 0.5 * h;
+
+       return o;
+}
+
+float spritelookupblinkvalue(string s)
+{
+       switch(s)
+       {
+               case "ons-cp-atck-neut": return 2;
+               case "ons-cp-atck-red":  return 2;
+               case "ons-cp-atck-blue": return 2;
+               case "ons-cp-dfnd-red":  return 0.5;
+               case "ons-cp-dfnd-blue": return 0.5;
+               case "item-invis":       return 2;
+               case "item-extralife":   return 2;
+               case "item-speed":       return 2;
+               case "item-strength":    return 2;
+               case "item-shueld":      return 2;
+               case "item-fuelregen":   return 2;
+               case "item-jetpack":     return 2;
+               case "tagged-target":    return 2;
+               default:                 return 1;
+       }
+}
+vector spritelookupcolor(string s, vector def)
+{
+       switch(s)
+       {
+               case "keycarrier-friend": return '0 1 0';
+               default:                  return def;
+       }
+}
+string spritelookuptext(string s)
+{
+       switch(s)
+       {
+               case "as-push": return _("Push");
+               case "as-destroy": return _("Destroy");
+               case "as-defend": return _("Defend");
+               case "bluebase": return _("Blue base");
+               case "danger": return _("DANGER");
+               case "flagcarrier": return _("Flag carrier");
+               case "flagdropped": return _("Dropped flag");
+               case "helpme": return _("Help me!");
+               case "here": return _("Here");
+               case "key-dropped": return _("Dropped key");
+               case "keycarrier-blue": return _("Key carrier");
+               case "keycarrier-finish": return _("Run here");
+               case "keycarrier-friend": return _("Key carrier");
+               case "keycarrier-pink": return _("Key carrier");
+               case "keycarrier-red": return _("Key carrier");
+               case "keycarrier-yellow": return _("Key carrier");
+               case "redbase": return _("Red base");
+               case "waypoint": return _("Waypoint");
+               case "ons-gen-red": return _("Generator");
+               case "ons-gen-blue": return _("Generator");
+               case "ons-gen-shielded": return _("Generator");
+               case "ons-cp-neut": return _("Control point");
+               case "ons-cp-red": return _("Control point");
+               case "ons-cp-blue": return _("Control point");
+               case "ons-cp-atck-neut": return _("Control point");
+               case "ons-cp-atck-red": return _("Control point");
+               case "ons-cp-atck-blue": return _("Control point");
+               case "ons-cp-dfnd-red": return _("Control point");
+               case "ons-cp-dfnd-blue": return _("Control point");
+               case "race-checkpoint": return _("Checkpoint");
+               case "race-finish": return _("Finish");
+               case "race-start": return _("Start");
+               case "nb-ball": return _("Ball");
+               case "ka-ball": return _("Ball");
+               case "ka-ballcarrier": return _("Ball carrier");
+               case "wpn-laser": return _("Laser");
+               case "wpn-shotgun": return _("Shotgun");
+               case "wpn-uzi": return _("Machine Gun");
+               case "wpn-gl": return _("Mortar");
+               case "wpn-electro": return _("Electro");
+               case "wpn-crylink": return _("Crylink");
+               case "wpn-nex": return _("Nex");
+               case "wpn-hagar": return _("Hagar");
+               case "wpn-rl": return _("Rocket Launcher");
+               case "wpn-porto": return _("Port-O-Launch");
+               case "wpn-minstanex": return _("Minstanex");
+               case "wpn-hookgun": return _("Hook");
+               case "wpn-fireball": return _("Fireball");
+               case "wpn-hlac": return _("HLAC");
+               case "wpn-campingrifle": return _("Rifle");
+               case "wpn-minelayer": return _("Mine Layer");
+               case "dom-neut": return _("Control point");
+               case "dom-red": return _("Control point");
+               case "dom-blue": return _("Control point");
+               case "dom-yellow": return _("Control point");
+               case "dom-pink": return _("Control point");
+               case "item-invis": return _("Invisibility");
+               case "item-extralife": return _("Extra life");
+               case "item-speed": return _("Speed");
+               case "item-strength": return _("Strength");
+               case "item-shield": return _("Shield");
+               case "item-fuelregen": return _("Fuel regen");
+               case "item-jetpack": return _("Jet Pack");
+               case "freezetag_frozen": return _("Frozen!");
+               case "tagged-target": return _("Tagged");
+               case "vehicle": return _("Vehicle");
+               default: return s;
+       }
+}
+
+vector fixrgbexcess_move(vector rgb, vector src, vector dst)
+{
+       vector yvec = '0.299 0.587 0.114';
+       return rgb + dst * ((src * yvec) / (dst * yvec)) * ((rgb - '1 1 1') * src);
+}
+vector fixrgbexcess(vector rgb)
+{
+       if(rgb_x > 1)
+       {
+               rgb = fixrgbexcess_move(rgb, '1 0 0', '0 1 1');
+               if(rgb_y > 1)
+               {
+                       rgb = fixrgbexcess_move(rgb, '0 1 0', '0 0 1');
+                       if(rgb_z > 1)
+                               rgb_z = 1;
+               }
+               else if(rgb_z > 1)
+               {
+                       rgb = fixrgbexcess_move(rgb, '0 0 1', '0 1 0');
+                       if(rgb_y > 1)
+                               rgb_y = 1;
+               }
+       }
+       else if(rgb_y > 1)
+       {
+               rgb = fixrgbexcess_move(rgb, '0 1 0', '1 0 1');
+               if(rgb_x > 1)
+               {
+                       rgb = fixrgbexcess_move(rgb, '1 0 0', '0 0 1');
+                       if(rgb_z > 1)
+                               rgb_z = 1;
+               }
+               else if(rgb_z > 1)
+               {
+                       rgb = fixrgbexcess_move(rgb, '0 0 1', '1 0 0');
+                       if(rgb_x > 1)
+                               rgb_x = 1;
+               }
+       }
+       else if(rgb_z > 1)
+       {
+               rgb = fixrgbexcess_move(rgb, '0 0 1', '1 1 0');
+               if(rgb_x > 1)
+               {
+                       rgb = fixrgbexcess_move(rgb, '1 0 0', '0 1 0');
+                       if(rgb_y > 1)
+                               rgb_y = 1;
+               }
+               else if(rgb_y > 1)
+               {
+                       rgb = fixrgbexcess_move(rgb, '0 1 0', '1 0 0');
+                       if(rgb_x > 1)
+                               rgb_x = 1;
+               }
+       }
+       return rgb;
+}
+
 void Draw_WaypointSprite()
 {
        string spriteimage;
@@ -173,34 +426,48 @@ void Draw_WaypointSprite()
        else if(self.maxdistance > 0)
                a *= pow(bound(0, (waypointsprite_fadedistance - dist) / (waypointsprite_fadedistance - waypointsprite_normdistance), 1), waypointsprite_distancealphaexponent) * (1 - waypointsprite_minalpha) + waypointsprite_minalpha;
 
+       vector rgb;
+       rgb = self.teamradar_color;
+       rgb = spritelookupcolor(spriteimage, rgb);
+       if(rgb == '0 0 0')
+       {
+               self.teamradar_color = '1 0 1';
+               print(sprintf("WARNING: sprite of name %s has no color, using pink so you notice it\n", spriteimage)); 
+       }
+
+       if(time - floor(time) > 0.5)
+       {
+               if(self.helpme && time < self.helpme)
+                       a *= SPRITE_HELPME_BLINK;
+               else
+                       a *= spritelookupblinkvalue(spriteimage);
+       }
+
+       if(a > 1)
+       {
+               rgb *= a;
+               a = 1;
+       }
+
        if(a <= 0)
                return;
-       
-       // draw the sprite image
+
+       rgb = fixrgbexcess(rgb);
+
        vector o;
-       float rot;
-       o = project_3d_to_2d(self.origin);
-       rot = 0;
+       float ang;
 
+       o = project_3d_to_2d(self.origin);
        if(o_z < 0 || o_x < 0 || o_y < 0 || o_x > vid_conwidth || o_y > vid_conheight)
        {
                // scale it to be just in view
                vector d;
                float f1, f2;
 
-               // get the waypoint angle vector
-               /*
-               d_x = view_right * (self.origin - view_origin) * vid_conwidth / vid_width;
-               d_y = -view_up * (self.origin - view_origin) * vid_conheight / (vid_height * vid_pixelheight);
-               d_z = 0;
-               */
-               
                d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
-
-               /*
-               if(autocvar_v_flipped)
-                       d_x = -d_x;
-               */
+               ang = atan2(-d_x, -d_y);
+               if(o_z < 0)
+                       ang += M_PI;
 
                f1 = d_x / vid_conwidth;
                f2 = d_y / vid_conheight;
@@ -211,13 +478,11 @@ void Draw_WaypointSprite()
                        {
                                // RIGHT edge
                                d = d * (0.5 / f1);
-                               rot = 3;
                        }
                        else
                        {
                                // LEFT edge
                                d = d * (-0.5 / f1);
-                               rot = 1;
                        }
                }
                else
@@ -226,32 +491,34 @@ void Draw_WaypointSprite()
                        {
                                // BOTTOM edge
                                d = d * (0.5 / f2);
-                               rot = 0;
                        }
                        else
                        {
                                // TOP edge
                                d = d * (-0.5 / f2);
-                               rot = 2;
                        }
                }
 
                o = d + '0.5 0 0' * vid_conwidth + '0 0.5 0' * vid_conheight;
        }
-       o_z = 0;
-
-       float vidscale;
-       vidscale = max(vid_conwidth / vid_width, vid_conheight / vid_height);
-
-       t = stof(db_get(tempdb, strcat("/spriteframes/", spriteimage)));
-       if(t == 0)
-               spriteimage = strcat("models/sprites/", spriteimage);
        else
-               spriteimage = strcat("models/sprites/", spriteimage, "_frame", ftos(mod(floor((max(0, time - self.spawntime)) * 2), t)));
+       {
+#if 1
+               ang = M_PI;
+#else
+               vector d;
+               d = o - '0.5 0 0' * vid_conwidth - '0 0.5 0' * vid_conheight;
+               ang = atan2(-d_x, -d_y);
+#endif
+       }
+       o_z = 0;
 
        float edgedistance_min, crosshairdistance;
        edgedistance_min = min4(o_y, o_x,vid_conwidth - o_x, vid_conheight - o_y);
 
+       float vidscale;
+       vidscale = max(vid_conwidth / vid_width, vid_conheight / vid_height);
+
        crosshairdistance = sqrt( pow(o_x - vid_conwidth/2, 2) + pow(o_y - vid_conheight/2, 2) );
 
        t = waypointsprite_scale * vidscale;
@@ -269,7 +536,6 @@ void Draw_WaypointSprite()
                a = a * (1 - (1 - waypointsprite_crosshairfadealpha) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1)));
                t = t * (1 - (1 - waypointsprite_crosshairfadescale) * (1 - bound(0, crosshairdistance/waypointsprite_crosshairfadedistance, 1)));
        }
-       drawrotpic(o, rot * 90 * DEG2RAD, spriteimage, SPRITE_SIZE * t, SPRITE_HOTSPOT * t, '1 1 1', a, DRAWFLAG_MIPMAP);
 
        if(self.build_finished)
        {
@@ -286,14 +552,49 @@ void Draw_WaypointSprite()
                        self.health = -1;
        }
 
+       o = drawspritearrow(o, ang, rgb, a, SPRITE_ARROW_SCALE * t);
+       
+       string txt;
+       txt = spritelookuptext(spriteimage);
+       if(self.helpme && time < self.helpme)
+               txt = sprintf(_("%s needing help!"), txt);
+       if(autocvar_g_waypointsprite_uppercase)
+               txt = strtoupper(txt);
+
        if(self.health >= 0)
        {
-               float align;
+               o = drawspritetext(o, ang, (SPRITE_HEALTHBAR_WIDTH + 2 * SPRITE_HEALTHBAR_BORDER) * t, rgb, a, waypointsprite_fontsize * '1 1 0', txt);
+
+               float align, marg;
                if(self.build_finished)
                        align = 0.5;
                else
                        align = 0;
-               drawhealthbar(o, rot * 90 * DEG2RAD, self.health, SPRITE_SIZE * t, SPRITE_HOTSPOT * t, SPRITE_HEALTHBAR_WIDTH * t, SPRITE_HEALTHBAR_HEIGHT * t, SPRITE_HEALTHBAR_MARGIN * t, SPRITE_HEALTHBAR_BORDER * t, align, self.teamradar_color, a * SPRITE_HEALTHBAR_BORDERALPHA, self.teamradar_color, a * SPRITE_HEALTHBAR_HEALTHALPHA, DRAWFLAG_NORMAL);
+               if(cos(ang) > 0)
+                       marg = -(SPRITE_HEALTHBAR_MARGIN + SPRITE_HEALTHBAR_HEIGHT + 2 * SPRITE_HEALTHBAR_BORDER) * t - 0.5 * waypointsprite_fontsize;
+               else
+                       marg = SPRITE_HEALTHBAR_MARGIN * t + 0.5 * waypointsprite_fontsize;
+               drawhealthbar(
+                               o,
+                               0,
+                               self.health,
+                               '0 0 0',
+                               '0 0 0',
+                               SPRITE_HEALTHBAR_WIDTH * t,
+                               SPRITE_HEALTHBAR_HEIGHT * t,
+                               marg,
+                               SPRITE_HEALTHBAR_BORDER * t,
+                               align,
+                               rgb,
+                               a * SPRITE_HEALTHBAR_BORDERALPHA,
+                               rgb,
+                               a * SPRITE_HEALTHBAR_HEALTHALPHA,
+                               DRAWFLAG_NORMAL
+                            );
+       }
+       else
+       {
+               o = drawspritetext(o, ang, 0, rgb, a, waypointsprite_fontsize * '1 1 0', txt);
        }
 }
 
@@ -399,6 +700,9 @@ void Ent_WaypointSprite()
                self.teamradar_color_x = ReadByte() / 255.0;
                self.teamradar_color_y = ReadByte() / 255.0;
                self.teamradar_color_z = ReadByte() / 255.0;
+               self.helpme = ReadByte() * 0.1;
+               if(self.helpme > 0)
+                       self.helpme += servertime;
        }
 
        InterpolateOrigin_Note();
@@ -438,6 +742,7 @@ void WaypointSprite_Load()
        waypointsprite_distancealphaexponent = autocvar_g_waypointsprite_distancealphaexponent;
        waypointsprite_timealphaexponent = autocvar_g_waypointsprite_timealphaexponent;
        waypointsprite_scale = autocvar_g_waypointsprite_scale;
+       waypointsprite_fontsize = autocvar_g_waypointsprite_fontsize;
        waypointsprite_edgefadealpha = autocvar_g_waypointsprite_edgefadealpha;
        waypointsprite_edgefadescale = autocvar_g_waypointsprite_edgefadescale;
        waypointsprite_edgefadedistance = autocvar_g_waypointsprite_edgefadedistance;
index 507cff85abcdb2780ee6af7054a6500d5f9f18d6..fcce8a70bbfcfab6b76ad6b3be16a80f35634113 100644 (file)
@@ -64,6 +64,7 @@ const float TE_CSQC_WEAPONCOMPLAIN = 113;
 const float TE_CSQC_NEX_SCOPE = 116;
 const float TE_CSQC_MINELAYER_MAXMINES = 117;
 const float TE_CSQC_HAGAR_MAXROCKETS = 118;
+const float TE_CSQC_VEHICLESETUP = 119;
 
 const float RACE_NET_CHECKPOINT_HIT_QUALIFYING = 0; // byte checkpoint, short time, short recordtime, string recordholder
 const float RACE_NET_CHECKPOINT_CLEAR = 1;
@@ -118,10 +119,13 @@ const float ENT_CLIENT_SHOWNAMES = 31;
 const float ENT_CLIENT_WARPZONE_TELEPORTED = 32;
 
 const float ENT_CLIENT_TURRET = 40;
+const float ENT_CLIENT_AUXILIARYXHAIR = 50;
+const float ENT_CLIENT_VEHICLE = 60;
 
 const float SPRITERULE_DEFAULT = 0;
 const float SPRITERULE_TEAMPLAY = 1;
 
+const float RADARICON_NONE = 0;
 const float RADARICON_FLAG = 1;
 const float RADARICON_FLAGCARRIER = 1;
 const float RADARICON_HERE = 1; // TODO make these 3 and 4, and make images for them
@@ -133,6 +137,7 @@ const float RADARICON_GENERATOR = 1;
 const float RADARICON_OBJECTIVE = 1;
 const float RADARICON_DOMPOINT = 1;
 const float RADARICON_POWERUP = 1;
+const float RADARICON_TAGGED = 1;
 
 ///////////////////////////
 // key constants
@@ -333,9 +338,13 @@ const float CTF_STATE_DEFEND = 2;
 const float CTF_STATE_COMMANDER = 3;
 
 const float HUD_NORMAL = 0;
-const float HUD_SPIDERBOT = 10;
-const float HUD_WAKIZASHI = 11;
-const float HUD_RAPTOR    = 12;
+const float HUD_VEHICLE_FIRST   = 10;
+const float HUD_SPIDERBOT       = 10;
+const float HUD_WAKIZASHI       = 11;
+const float HUD_RAPTOR          = 12;
+const float HUD_BUMBLEBEE       = 13;
+const float HUD_VEHICLE_LAST    = 13;
+
 const vector eX = '1 0 0';
 const vector eY = '0 1 0';
 const vector eZ = '0 0 1';
@@ -358,6 +367,7 @@ const float STAT_PINKALIVE = 103;
 const float STAT_FROZEN = 104;
 const float STAT_REVIVE_PROGRESS = 105;
 
+
 const float STAT_DOM_TOTAL_PPS = 100;
 const float STAT_DOM_PPS_RED = 101;
 const float STAT_DOM_PPS_BLUE = 102;
@@ -367,9 +377,6 @@ const float STAT_DOM_PPS_YELLOW = 104;
 //const float STAT_SPIDERBOT_AIM     53 // compressShotOrigin
 //const float STAT_SPIDERBOT_TARGET  54 // compressShotOrigin
 
-
-
-
 // moved that here so the client knows the max.
 // # of maps, I'll use arrays for them :P
 #define MAPVOTE_COUNT 10
@@ -499,6 +506,13 @@ float PROJECTILE_FIREBALL = 21;
 float PROJECTILE_FIREMINE = 22;
 float PROJECTILE_BULLET_GLOWING_TRACER = 23;
 
+float PROJECTILE_RAPTORCANNON   = 24;
+float PROJECTILE_RAPTORBOMB     = 25;
+float PROJECTILE_RAPTORBOMBLET  = 26;
+float PROJECTILE_SPIDERROCKET   = 27;
+float PROJECTILE_WAKIROCKET     = 28;
+float PROJECTILE_WAKICANNON     = 29;
+
 float SPECIES_HUMAN        =  0;
 float SPECIES_ROBOT_SOLID  =  1;
 float SPECIES_ALIEN        =  2;
@@ -528,18 +542,23 @@ float DEATH_MIRRORDAMAGE = 10014;
 float DEATH_TOUCHEXPLODE = 10015;
 float DEATH_CHEAT = 10016;
 float DEATH_FIRE = 10017;
-float DEATH_TURRET = 10020;
 float DEATH_QUIET = 10021;
 float DEATH_HEADSHOT = 10022;
 
-float DEATH_SBMINIGUN = 10030;
-float DEATH_SBROCKET  = 10031;
-float DEATH_SBCRUSH   = 10032;
-float DEATH_SBBLOWUP  = 10033;
-
-float DEATH_WAKIGUN    = 10040;
-float DEATH_WAKIROCKET = 10041;
-float DEATH_WAKIBLOWUP = 10042;
+float  DEATH_VHFIRST       = 10030;
+float  DEATH_VHCRUSH       = 10030;
+float  DEATH_SBMINIGUN     = 10031;
+float  DEATH_SBROCKET      = 10032;
+float  DEATH_SBBLOWUP      = 10033;
+float  DEATH_WAKIGUN       = 10034;
+float  DEATH_WAKIROCKET    = 10035;
+float  DEATH_WAKIBLOWUP    = 10036;
+float  DEATH_RAPTOR_CANNON = 10037;
+float  DEATH_RAPTOR_BOMB   = 10038;
+float  DEATH_RAPTOR_BOMB_SPLIT = 10039;
+float  DEATH_RAPTOR_DEATH  = 10040;
+float  DEATH_VHLAST        = 10040;
+#define DEATH_ISVEHICLE(t)  ((t) >= DEATH_VHFIRST && (t) <= DEATH_VHLAST)
 
 float DEATH_GENERIC = 10050;
 
@@ -547,6 +566,20 @@ float DEATH_WEAPON = 10100;
 
 float DEATH_CUSTOM = 10300;
 
+float DEATH_TURRET                  = 10500;
+float DEATH_TURRET_EWHEEL           = 10501;
+float DEATH_TURRET_FLAC             = 10502;
+float DEATH_TURRET_MACHINEGUN       = 10503;
+float DEATH_TURRET_WALKER_GUN       = 10504;
+float DEATH_TURRET_WALKER_MEELE     = 10505;
+float DEATH_TURRET_WALKER_ROCKET    = 10506;
+float DEATH_TURRET_HELLION          = 10507;
+float DEATH_TURRET_HK               = 10508;
+float DEATH_TURRET_MLRS             = 10509;
+float DEATH_TURRET_PLASMA           = 10510;
+float DEATH_TURRET_PHASER           = 10511;
+float DEATH_TURRET_TESLA            = 10512;
+float DEATH_TURRET_LAST            = 10512;
 
 float DEATH_WEAPONMASK = 0xFF;
 float DEATH_HITTYPEMASK = 0x1F00; // which is WAY below 10000 used for normal deaths
@@ -557,6 +590,7 @@ float HITTYPE_HEADSHOT = 0x800;
 float HITTYPE_RESERVED = 0x1000; // unused yet
 
 // macros to access these
+#define DEATH_ISTURRET(t)            ((t) >= DEATH_TURRET && (t) <= DEATH_TURRET_LAST)
 #define DEATH_ISSPECIAL(t)            ((t) >= DEATH_SPECIAL_START)
 #define DEATH_WEAPONOFWEAPONDEATH(t)  ((t) & DEATH_WEAPONMASK)
 #define DEATH_ISWEAPON(t,w)           (!DEATH_ISSPECIAL(t) && DEATH_WEAPONOFWEAPONDEATH(t) == (w))
index 6557a1cd69e051fb01770c23bc462d4393fdce94..2c960d36886b12a2c717162fac022dd08a32859c 100644 (file)
@@ -6,7 +6,7 @@ CLASS(XonoticWeaponsDialog) EXTENDS(XonoticDialog)
        ATTRIB(XonoticWeaponsDialog, title, string, _("Weapon settings"))
        ATTRIB(XonoticWeaponsDialog, color, vector, SKINCOLOR_DIALOG_WEAPONS)
        ATTRIB(XonoticWeaponsDialog, intendedWidth, float, 0.4)
-       ATTRIB(XonoticWeaponsDialog, rows, float, 17)
+       ATTRIB(XonoticWeaponsDialog, rows, float, 18)
        ATTRIB(XonoticWeaponsDialog, columns, float, 3)
        ATTRIB(XonoticWeaponsDialog, weaponsList, entity, NULL)
 ENDCLASS(XonoticWeaponsDialog)
@@ -28,8 +28,8 @@ void XonoticWeaponsDialog_fill(entity me)
        me.TR(me);
                me.TD(me, 1, 3, makeXonoticTextLabel(0, _("Weapon priority list:")));
        me.TR(me);
-               me.TD(me, 9, 3, e = me.weaponsList = makeXonoticWeaponsList());
-       me.gotoRC(me, 10, 0);
+               me.TD(me, 10, 3, e = me.weaponsList = makeXonoticWeaponsList());
+       me.gotoRC(me, 11, 0);
                me.TDempty(me, 0.5);
                me.TD(me, 1, 1, e = makeXonoticButton(_("Up"), '0 0 0'));
                        e.onClick = WeaponsList_MoveUp_Click;
index fd252a54abdd5d181e14045cacfbd9415d9ac64c..2aa2d52397cb7020196df54513e4e890d010dab2 100644 (file)
@@ -184,11 +184,8 @@ void XonoticEffectsSettingsTab_fill(entity me)
                        e.savedValue = 0.5; // default
                me.TD(me, 1, 2, s);
        me.TR(me);
-               s = makeXonoticSlider(0.1, 1, 0.1, "r_damageblur");
-               me.TD(me, 1, 1, e = makeXonoticSliderCheckBox(0, 1, s, _("Damage blur:")));
-               if(s.value != e.savedValue)
-                       e.savedValue = 0.4; // default
-               me.TD(me, 1, 2, s);
+               me.TD(me, 1, 2, e = makeXonoticCheckBoxEx(0.5, 0, "hud_postprocessing_maxbluralpha", _("Damage & water blur")));
+               me.TD(me, 1, 1, e = makeXonoticCheckBoxEx(0.5, 0, "hud_powerup", _("Powerup sharpen")));
        
        me.gotoRC(me, me.rows - 1, 0);
                me.TD(me, 1, me.columns, makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "vid_restart", COMMANDBUTTON_APPLY));
index 056b98ef2756a770e13b7935b614d155b3c152bf..63e00e9e1774ea707be6c07f377eebdecc922765 100644 (file)
@@ -6,28 +6,42 @@
                <Option makefile="client" />
                <Option makefile_is_custom="1" />
                <Option pch_mode="2" />
-               <Option compiler="qaukec" />
+               <Option compiler="fteqcc" />
+               <MakeCommands>
+                       <Build command="$make -src $makefile" />
+                       <CompileFile command="$make -src $makefile" />
+                       <Clean command="$make -src $makefile" />
+<<<<<<< HEAD
+                       <DistClean command="$make -f $makefile distclean$target" />
+=======
+                       <DistClean command="" />
+>>>>>>> origin/master
+                       <AskRebuildNeeded command="" />
+                       <SilentBuild command="$make -src $makefile" />
+               </MakeCommands>
                <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" />
+                               <Option compiler="fteqcc" />
                                <Compiler>
                                        <Add option="-g" />
                                </Compiler>
                                <MakeCommands>
                                        <Build command="$make -src $makefile" />
-                                       <CompileFile command="" />
-                                       <Clean command="" />
+                                       <CompileFile command="$make -src $makefile" />
+                                       <Clean command="$make -src $makefile" />
                                        <DistClean command="" />
+                                       <AskRebuildNeeded command="" />
+                                       <SilentBuild command="$make -src $makefile" />
                                </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" />
+                               <Option compiler="fteqcc" />
                                <Compiler>
                                        <Add option="-O2" />
                                </Compiler>
                                        <Add option="-s" />
                                </Linker>
                                <MakeCommands>
+<<<<<<< HEAD
                                        <Build command="$make -src $makefile" />
-                                       <CompileFile command="" />
-                                       <Clean command="" />
+                                       <CompileFile command="$make -src $makefile" />
+                                       <Clean command="$make -src $makefile" />
                                        <DistClean command="" />
+                                       <AskRebuildNeeded command="" />
+                                       <SilentBuild command="$make -src $makefile" />
+=======
+                                       <Build command="$make -DRELEASE -src $makefile" />
+                                       <CompileFile command="$make -DRELEASE -src $makefile" />
+                                       <Clean command="$make -DRELEASE -src $makefile" />
+                                       <DistClean command="" />
+                                       <AskRebuildNeeded command="" />
+                                       <SilentBuild command="$make -DRELEASE -src $makefile" />
+>>>>>>> origin/master
                                </MakeCommands>
                        </Target>
                </Build>
                <Compiler>
-                       <Add option="-Wall" />
+                       <Add option="-g" />
                </Compiler>
                <Unit filename="client\Defs.qc" />
                <Unit filename="client\Main.qc" />
@@ -59,6 +84,9 @@
                <Unit filename="client\effects.qc" />
                <Unit filename="client\gibs.qc" />
                <Unit filename="client\hook.qc" />
+               <Unit filename="client\hud.qc" />
+               <Unit filename="client\hud.qh" />
+               <Unit filename="client\hud_config.qc" />
                <Unit filename="client\interpolate.qc" />
                <Unit filename="client\interpolate.qh" />
                <Unit filename="client\laser.qc" />
                <Unit filename="client\modeleffects.qc" />
                <Unit filename="client\movetypes.qc" />
                <Unit filename="client\movetypes.qh" />
+               <Unit filename="client\noise.qc" />
+               <Unit filename="client\noise.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\progs.src.BASE.src" />
+               <Unit filename="client\progs.src.LOCAL.src" />
+               <Unit filename="client\progs.src.REMOTE.src" />
                <Unit filename="client\projectile.qc" />
                <Unit filename="client\rubble.qc" />
-               <Unit filename="client\sbar.qc" />
+<<<<<<< HEAD
+               <Unit filename="client\scoreboard.qc" />
+               <Unit filename="client\scoreboard.qh" />
+               <Unit filename="client\shownames.qc" />
+               <Unit filename="client\shownames.qh" />
+=======
+>>>>>>> origin/master
                <Unit filename="client\sortlist.qc" />
+               <Unit filename="client\target_music.qc" />
                <Unit filename="client\teamplay.qc" />
+               <Unit filename="client\teamplay.qh" />
                <Unit filename="client\teamradar.qc" />
                <Unit filename="client\teamradar.qh" />
+               <Unit filename="client\tturrets.qc" />
+               <Unit filename="client\tturrets.qh" />
                <Unit filename="client\tuba.qc" />
+               <Unit filename="client\vehicles\vehicles.qc" />
+               <Unit filename="client\vehicles\vehicles.qh" />
                <Unit filename="client\wall.qc" />
                <Unit filename="client\waypointsprites.qc" />
                <Unit filename="client\waypointsprites.qh" />
index 3006189834d91bc722d331cb046f034ccbfd5150..2a0d8bc5374f456e9f935cc707c48ab3cd1ceb31 100644 (file)
@@ -155,7 +155,7 @@ void target_objective_decrease_activate()
                                ent.sprite = world;
                }
 
-               spr = WaypointSprite_SpawnFixed("<placeholder>", 0.5 * (ent.absmin + ent.absmax), ent, assault_sprite);
+               spr = WaypointSprite_SpawnFixed("<placeholder>", 0.5 * (ent.absmin + ent.absmax), ent, assault_sprite, RADARICON_OBJECTIVE, '1 0.5 0');
                spr.assault_decreaser = self;
                spr.waypointsprite_visible_for_player = assault_decreaser_sprite_visible;
                spr.classname = "sprite_waypoint";
@@ -169,7 +169,6 @@ void target_objective_decrease_activate()
                }
                else
                        WaypointSprite_UpdateSprites(spr, "as-defend", "as-push", "as-push");
-               WaypointSprite_UpdateTeamRadar(spr, RADARICON_OBJECTIVE, '1 0.5 0');
        }
 }
 
index f9dea3ac4476c2fc5336f74d0e93fec1fa3bec75..f7075b9b24ecbf5ca515150ed7c9f0ab01263447 100644 (file)
@@ -1009,69 +1009,12 @@ float autocvar_g_turrets_unit_walker_std_rocket_speed;
 float autocvar_g_turrets_unit_walker_std_rocket_turnrate;
 float autocvar_g_turrets_unit_walker_std_rockets_range;
 float autocvar_g_turrets_unit_walker_std_rockets_range_min;
+float autocvar_g_turrets_unit_walker_turn;
+float autocvar_g_turrets_unit_walker_turn_walk;
+float autocvar_g_turrets_unit_walker_turn_run;
+float autocvar_g_turrets_unit_walker_turn_strafe;
+float autocvar_g_turrets_unit_walker_turn_swim;
 float autocvar_g_use_ammunition;
-float autocvar_g_vehicle_racer_afterburn_cost;
-float autocvar_g_vehicle_racer_anglestabilizer;
-float autocvar_g_vehicle_racer_downforce;
-float autocvar_g_vehicle_racer_energy;
-float autocvar_g_vehicle_racer_energy_usepause;
-float autocvar_g_vehicle_racer_health;
-float autocvar_g_vehicle_racer_laser_cost;
-float autocvar_g_vehicle_racer_laser_damage;
-float autocvar_g_vehicle_racer_laser_radius;
-float autocvar_g_vehicle_racer_laser_refire;
-float autocvar_g_vehicle_racer_laser_speed;
-float autocvar_g_vehicle_racer_pitchspeed;
-float autocvar_g_vehicle_racer_power_air;
-float autocvar_g_vehicle_racer_power_min;
-float autocvar_g_vehicle_racer_power_solid;
-float autocvar_g_vehicle_racer_reload;
-float autocvar_g_vehicle_racer_respawntime;
-float autocvar_g_vehicle_racer_rocket_accel;
-float autocvar_g_vehicle_racer_rocket_damage;
-float autocvar_g_vehicle_racer_rocket_radius;
-float autocvar_g_vehicle_racer_rocket_refire;
-float autocvar_g_vehicle_racer_rocket_speed;
-float autocvar_g_vehicle_racer_rocket_turnrate;
-float autocvar_g_vehicle_racer_shield;
-float autocvar_g_vehicle_racer_speed_afterburn;
-float autocvar_g_vehicle_racer_speed_forward;
-float autocvar_g_vehicle_racer_speed_strafe;
-float autocvar_g_vehicle_racer_springlength;
-float autocvar_g_vehicle_racer_turnroll;
-float autocvar_g_vehicle_racer_turnspeed;
-float autocvar_g_vehicle_raptor_reload;
-float autocvar_g_vehicle_spiderbot_crush_dmg;
-float autocvar_g_vehicle_spiderbot_crush_force;
-float autocvar_g_vehicle_spiderbot_head_pitchlimit_down;
-float autocvar_g_vehicle_spiderbot_head_pitchlimit_up;
-float autocvar_g_vehicle_spiderbot_head_pitchspeed;
-float autocvar_g_vehicle_spiderbot_head_turnlimit;
-float autocvar_g_vehicle_spiderbot_head_turnspeed;
-float autocvar_g_vehicle_spiderbot_health;
-float autocvar_g_vehicle_spiderbot_minigun_cooldown;
-float autocvar_g_vehicle_spiderbot_minigun_damage;
-float autocvar_g_vehicle_spiderbot_minigun_heat;
-float autocvar_g_vehicle_spiderbot_minigun_refire;
-float autocvar_g_vehicle_spiderbot_minigun_spread;
-float autocvar_g_vehicle_spiderbot_movement_inertia;
-float autocvar_g_vehicle_spiderbot_respawntime;
-float autocvar_g_vehicle_spiderbot_rocket_damage;
-float autocvar_g_vehicle_spiderbot_rocket_edgedamage;
-float autocvar_g_vehicle_spiderbot_rocket_force;
-float autocvar_g_vehicle_spiderbot_rocket_health;
-float autocvar_g_vehicle_spiderbot_rocket_lifetime;
-float autocvar_g_vehicle_spiderbot_rocket_noise;
-float autocvar_g_vehicle_spiderbot_rocket_radius;
-float autocvar_g_vehicle_spiderbot_rocket_refire;
-float autocvar_g_vehicle_spiderbot_rocket_reload;
-float autocvar_g_vehicle_spiderbot_rocket_speed;
-float autocvar_g_vehicle_spiderbot_rocket_turnrate;
-float autocvar_g_vehicle_spiderbot_shield;
-float autocvar_g_vehicle_spiderbot_speed_stop;
-float autocvar_g_vehicle_spiderbot_speed_strafe;
-float autocvar_g_vehicle_spiderbot_speed_walk;
-float autocvar_g_vehicle_spiderbot_turnspeed;
 float autocvar_g_waypointeditor;
 float autocvar_g_waypoints_for_items;
 float autocvar_g_waypointsprite_deadlifetime;
index 9300ac721d889366a386bc8b0a06fb0656ad1443..63e971b17da9c52cacc638e8ae6c3f006cff096f 100644 (file)
@@ -1,4 +1,5 @@
 
+entity ka_ball;
 // traces multiple trajectories to find one that will impact the target
 // 'end' vector is the place it aims for,
 // returns TRUE only if it hit targ (don't target non-solid entities)
@@ -113,6 +114,12 @@ float bot_shouldattack(entity e)
                if(e.freezetag_frozen)
                        return FALSE;
 
+       // If neither player has ball then don't attack unless the ball is on the
+       // ground.
+       if (g_keepaway)
+               if (!e.ballcarried && !self.ballcarried && ka_ball.owner)
+                       return FALSE;
+
        if(teamplay)
        {
                if(e.team==0)
index dd111d9f00400f376eedd8ea6462ec90c3caaddd..7c2f986346677e73b2cefc533cf45651ebd18cf0 100644 (file)
@@ -2,6 +2,8 @@
 #include "role_ctf.qc"
 #include "role_onslaught.qc"
 #include "role_keyhunt.qc"
+#include "role_freezetag.qc"
+#include "role_keepaway.qc"
 #include "roles.qc"
 
 void havocbot_ai()
diff --git a/qcsrc/server/bot/havocbot/role_freezetag.qc b/qcsrc/server/bot/havocbot/role_freezetag.qc
new file mode 100644 (file)
index 0000000..c81d7d0
--- /dev/null
@@ -0,0 +1,109 @@
+void() havocbot_role_ft_freeing;
+void() havocbot_role_ft_offense;
+
+void havocbot_goalrating_freeplayers(float ratingscale, vector org, float sradius)
+{
+       local entity head;
+       float distance;
+
+       FOR_EACH_PLAYER(head)
+       {
+               if ((head != self) && (head.team == self.team))
+               {
+                       if (head.freezetag_frozen)
+                       {
+                               distance = vlen(head.origin - org);
+                               if (distance > sradius)
+                                       continue;
+                               navigation_routerating(head, ratingscale, 2000);
+                       }
+                       else
+                       {
+                               // If teamate is not frozen still seek them out as fight better
+                               // in a group.
+                               navigation_routerating(head, ratingscale/3, 2000);
+                       }
+               }
+       }
+};
+
+void havocbot_role_ft_offense()
+{
+       local entity head;
+       float unfrozen;
+
+       if(self.deadflag != DEAD_NO)
+               return;
+
+       if (!self.havocbot_role_timeout)
+               self.havocbot_role_timeout = time + random() * 10 + 20;
+
+       // Count how many players on team are unfrozen.
+       unfrozen = 0;
+       FOR_EACH_PLAYER(head)
+       {
+               if ((head.team == self.team) && (!head.freezetag_frozen))
+                       unfrozen++;
+       }
+
+       // If only one left on team or if role has timed out then start trying to free players.
+       if (((unfrozen == 0) && (!self.freezetag_frozen)) || (time > self.havocbot_role_timeout))
+       {
+               dprint("changing role to freeing\n");
+               self.havocbot_role = havocbot_role_ft_freeing;
+               self.havocbot_role_timeout = 0;
+               return;
+       }
+
+       if (time > self.bot_strategytime)
+       {
+               self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+
+               navigation_goalrating_start();
+               havocbot_goalrating_items(10000, self.origin, 10000);
+               havocbot_goalrating_enemyplayers(20000, self.origin, 10000);
+               havocbot_goalrating_freeplayers(9000, self.origin, 10000);
+               //havocbot_goalrating_waypoints(1, self.origin, 1000);
+               navigation_goalrating_end();
+       }
+};
+
+void havocbot_role_ft_freeing()
+{
+       if(self.deadflag != DEAD_NO)
+               return;
+
+       if (!self.havocbot_role_timeout)
+               self.havocbot_role_timeout = time + random() * 10 + 20;
+
+       if (time > self.havocbot_role_timeout)
+       {
+               dprint("changing role to offense\n");
+               self.havocbot_role = havocbot_role_ft_offense;
+               self.havocbot_role_timeout = 0;
+               return;
+       }
+
+       if (time > self.bot_strategytime)
+       {
+               self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+
+               navigation_goalrating_start();
+               havocbot_goalrating_items(8000, self.origin, 10000);
+               havocbot_goalrating_enemyplayers(10000, self.origin, 10000);
+               havocbot_goalrating_freeplayers(20000, self.origin, 10000);
+               //havocbot_goalrating_waypoints(1, self.origin, 1000);
+               navigation_goalrating_end();
+       }
+};
+
+void havocbot_chooserole_ft()
+{
+       if(self.deadflag != DEAD_NO)
+               return;
+
+       if (random() < 0.5)
+               self.havocbot_role = havocbot_role_ft_freeing;
+       else
+               self.havocbot_role = havocbot_role_ft_offense;
+};
diff --git a/qcsrc/server/bot/havocbot/role_keepaway.qc b/qcsrc/server/bot/havocbot/role_keepaway.qc
new file mode 100644 (file)
index 0000000..30d9649
--- /dev/null
@@ -0,0 +1,82 @@
+void() havocbot_role_ka_carrier;
+void() havocbot_role_ka_collector;
+void() havocbot_chooserole_ka;
+
+entity ka_ball;
+
+// Keepaway
+// If you don't have the ball, get it; if you do, kill people.
+
+void havocbot_goalrating_ball(float ratingscale, vector org)
+{
+       local float t, distance;
+       local entity ball_owner;
+       ball_owner = ka_ball.owner;
+
+       if (ball_owner == self)
+               return;
+
+       // If ball is carried by player then hunt them down.
+       if (ball_owner)
+       {
+               t = (self.health + self.armorvalue) / (ball_owner.health + ball_owner.armorvalue);
+               navigation_routerating(ball_owner, t * ratingscale, 2000);
+       }
+
+       // Ball has been dropped so collect.
+       navigation_routerating(ka_ball, ratingscale, 2000);
+};
+
+void havocbot_role_ka_carrier()
+{
+       if (self.deadflag != DEAD_NO)
+               return;
+
+       if (time > self.bot_strategytime)
+       {
+               self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+
+               navigation_goalrating_start();
+               havocbot_goalrating_items(10000, self.origin, 10000);
+               havocbot_goalrating_enemyplayers(20000, self.origin, 10000);
+               //havocbot_goalrating_waypoints(1, self.origin, 1000);
+               navigation_goalrating_end();
+       }
+
+       if (!self.ballcarried)
+       {
+               self.havocbot_role = havocbot_role_ka_collector;
+               self.bot_strategytime = 0;
+       }
+};
+
+void havocbot_role_ka_collector()
+{
+       if (self.deadflag != DEAD_NO)
+               return;
+
+       if (time > self.bot_strategytime)
+       {
+               self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
+
+               navigation_goalrating_start();
+               havocbot_goalrating_items(10000, self.origin, 10000);
+               havocbot_goalrating_enemyplayers(1000, self.origin, 10000);
+               havocbot_goalrating_ball(20000, self.origin);
+               navigation_goalrating_end();
+       }
+
+       if (self.ballcarried)
+       {
+               self.havocbot_role = havocbot_role_ka_carrier;
+               self.bot_strategytime = 0;
+       }
+};
+
+void havocbot_chooserole_ka()
+{
+       if (self.ballcarried)
+               self.havocbot_role = havocbot_role_ka_carrier;
+       else
+               self.havocbot_role = havocbot_role_ka_collector;
+};
index ebd0d4e44d1cc28458c547c46df2c8c2906b7d07..ac52c698f6cdb10c6387799898f9f400ebc5ef54 100644 (file)
@@ -168,6 +168,9 @@ void havocbot_goalrating_enemyplayers(float ratingscale, vector org, float sradi
                        if (distance < 100 || distance > sradius)
                                continue;
 
+                       if (head.freezetag_frozen)
+                               continue;
+
                        if(g_minstagib)
                        if(head.items & IT_STRENGTH)
                                continue;
@@ -274,24 +277,6 @@ void havocbot_role_race()
        }
 };
 
-// Keepaway
-// If you don't have the ball, get it; if you do, kill people.
-void havocbot_role_ka()
-{
-       if(self.deadflag != DEAD_NO)
-               return;
-
-       if (self.bot_strategytime < time)
-       {
-               self.bot_strategytime = time + autocvar_bot_ai_strategyinterval;
-               navigation_goalrating_start();
-               havocbot_goalrating_items(10000, self.origin, 10000);
-               havocbot_goalrating_enemyplayers(20000, self.origin, 10000);
-               //havocbot_goalrating_waypoints(1, self.origin, 1000);
-               navigation_goalrating_end();
-       }
-}
-
 void havocbot_chooserole_dm()
 {
        self.havocbot_role = havocbot_role_dm;
@@ -307,11 +292,6 @@ void havocbot_chooserole_dom()
        self.havocbot_role = havocbot_role_dom;
 };
 
-void havocbot_chooserole_ka()
-{
-       self.havocbot_role = havocbot_role_ka;
-}
-
 void havocbot_chooserole()
 {
        dprint("choosing a role...\n");
@@ -328,6 +308,8 @@ void havocbot_chooserole()
                havocbot_chooserole_ons();
        else if (g_keepaway)
                havocbot_chooserole_ka();
+       else if (g_freezetag)
+               havocbot_chooserole_ft();
        else // assume anything else is deathmatch
                havocbot_chooserole_dm();
 };
index 2a22d193a1b9a2cd671a5164cfc0f06750cd895f..9a1d4100473f0967dae2bea37e158ed5103805a2 100644 (file)
@@ -596,7 +596,7 @@ void FixPlayermodel();
 void PutObserverInServer (void)
 {
        entity  spot;
-
+    self.hud = HUD_NORMAL;
        race_PreSpawnObserver();
 
        spot = SelectSpawnPoint (TRUE);
@@ -622,6 +622,9 @@ void PutObserverInServer (void)
                self.alivetime = 0;
        }
 
+       if(self.vehicle)
+           vehicles_exit(VHEF_RELESE);
+
        if(self.flagcarried)
                DropFlag(self.flagcarried, world, world);
 
@@ -1264,6 +1267,16 @@ void ClientKill_Now_TeamChange()
 
 void ClientKill_Now()
 {
+       if(self.vehicle)
+       {
+           vehicles_exit(VHEF_RELESE);
+           if(!self.killindicator_teamchange)
+           {
+            self.vehicle_health = -1;
+            Damage(self, self, self, 1 , DEATH_KILL, self.origin, '0 0 0');            
+           }
+       }
+       
        remove(self.killindicator);
        self.killindicator = world;
 
@@ -1569,7 +1582,7 @@ void ClientConnect (void)
        playerdemo_init();
 
        anticheat_init();
-       
+
        race_PreSpawnObserver();
 
        //if(g_domination)
@@ -1790,6 +1803,9 @@ Called when a client disconnects from the server
 void ReadyCount();
 void ClientDisconnect (void)
 {
+       if(self.vehicle)
+           vehicles_exit(VHEF_RELESE);
+
        if not(self.flags & FL_CLIENT)
        {
                print("Warning: ClientDisconnect without ClientConnect\n");
@@ -2017,7 +2033,7 @@ void player_powerups (void)
 {
        // add a way to see what the items were BEFORE all of these checks for the mutator hook
        olditems = self.items;
-       
+
        if((self.items & IT_USING_JETPACK) && !self.deadflag)
        {
                SoundEntity_StartSound(self, CHAN_PLAYER, "misc/jetpack_fly.wav", VOL_BASE, autocvar_g_jetpack_attenuation);
@@ -2033,7 +2049,7 @@ void player_powerups (void)
 
        if(!self.modelindex || self.deadflag) // don't apply the flags if the player is gibbed
                return;
-       
+
        Fire_ApplyDamage(self);
        Fire_ApplyEffect(self);
 
@@ -2139,7 +2155,7 @@ void player_powerups (void)
                if (time < self.spawnshieldtime)
                        self.effects = self.effects | (EF_ADDITIVE | EF_FULLBRIGHT);
        }
-       
+
        MUTATOR_CALLHOOK(PlayerPowerups);
 }
 
@@ -2360,11 +2376,34 @@ void SpectateCopy(entity spectatee) {
        SetZoomState(spectatee.zoomstate);
 
        anticheat_spectatecopy(spectatee);
+
+       //self.vehicle = spectatee.vehicle;
+
+       self.hud = spectatee.hud;
+       if(spectatee.vehicle)
+    {
+        setorigin(self, spectatee.origin);
+        self.velocity = spectatee.vehicle.velocity;
+        self.v_angle += spectatee.vehicle.angles;
+        //self.v_angle_x *= -1;
+        self.vehicle_health = spectatee.vehicle_health;
+        self.vehicle_shield = spectatee.vehicle_shield;
+        self.vehicle_energy = spectatee.vehicle_energy;
+        self.vehicle_ammo1 = spectatee.vehicle_ammo1;
+        self.vehicle_ammo2 = spectatee.vehicle_ammo2;
+        self.vehicle_reload1 = spectatee.vehicle_reload1;
+        self.vehicle_reload2 = spectatee.vehicle_reload2;
+        
+        msg_entity = self;
+        WriteByte (MSG_ONE, SVC_SETVIEWPORT);
+        WriteEntity(MSG_ONE, spectatee);
+        //self.tur_head = spectatee.vehicle.vehicle_viewport;
+    }
 }
 
 float SpectateUpdate() {
        if(!self.enemy)
-               return 0;
+           return 0;           
 
        if (self == self.enemy)
                return 0;
@@ -2387,17 +2426,28 @@ float SpectateNext() {
                self.enemy = other;
 
        if(self.enemy.classname == "player") {
-               msg_entity = self;
-               WriteByte(MSG_ONE, SVC_SETVIEW);
-               WriteEntity(MSG_ONE, self.enemy);
-               //stuffcmd(self, "set viewsize $tmpviewsize \n");
-               self.movetype = MOVETYPE_NONE;
-               accuracy_resend(self);
-
-               if(!SpectateUpdate())
-                       PutObserverInServer();
-
-               return 1;
+           if(self.enemy.vehicle)
+           {      
+            msg_entity = self;
+            WriteByte(MSG_ONE, SVC_SETVIEWPORT);
+            WriteEntity(MSG_ONE, self.enemy);
+            //stuffcmd(self, "set viewsize $tmpviewsize \n");
+            self.movetype = MOVETYPE_NONE;
+            accuracy_resend(self);
+           }
+           else 
+           {           
+            msg_entity = self;
+            WriteByte(MSG_ONE, SVC_SETVIEW);
+            WriteEntity(MSG_ONE, self.enemy);
+            //stuffcmd(self, "set viewsize $tmpviewsize \n");
+            self.movetype = MOVETYPE_NONE;
+            accuracy_resend(self);
+
+            if(!SpectateUpdate())
+                PutObserverInServer();
+        }
+        return 1;
        } else {
                return 0;
        }
@@ -2570,6 +2620,8 @@ void SpectatorThink()
                                return;
                        }
                }
+               if(!SpectateUpdate())
+                       PutObserverInServer();
        }
 
        PrintWelcomeMessage(self);
@@ -2582,6 +2634,12 @@ void PlayerUseKey()
        if(self.classname != "player")
                return;
 
+       if(self.vehicle)
+       {
+        vehicles_exit(VHEF_NORMAL);
+        return;
+       }
+       
        // a use key was pressed; call handlers
        if(ctf_usekey())
                return;
@@ -3098,7 +3156,7 @@ void PlayerPostThink (void)
 
        if(self.waypointsprite_attachedforcarrier)
                WaypointSprite_UpdateHealth(self.waypointsprite_attachedforcarrier, '1 0 0' * healtharmor_maxdamage(self.health, self.armorvalue, autocvar_g_balance_armor_blockpercent));
-       
+
        if(self.classname == "player" && self.deadflag == DEAD_NO && autocvar_r_showbboxes)
        {
                if(!self.showheadshotbbox)
index 8ce1cec132695d169f893767d681385de3ac8277..3dfd2a6aa7d1449d6950da633e59f170f3f0db8d 100644 (file)
@@ -135,108 +135,79 @@ void ImpulseCommands (void)
                switch(imp)
                {
                        case 30:
-                               wp = WaypointSprite_DeployPersonal("waypoint", self.origin);
+                               wp = WaypointSprite_DeployPersonal("waypoint", self.origin, RADARICON_WAYPOINT, '0 1 1');
                                if(wp)
-                               {
-                                       WaypointSprite_UpdateTeamRadar(wp, RADARICON_WAYPOINT, '0 1 1');
                                        WaypointSprite_Ping(wp);
-                               }
                                sprint(self, "personal waypoint spawned at location\n");
                                break;
                        case 31:
                                WarpZone_crosshair_trace(self);
-                               wp = WaypointSprite_DeployPersonal("waypoint", trace_endpos);
+                               wp = WaypointSprite_DeployPersonal("waypoint", trace_endpos, RADARICON_WAYPOINT, '0 1 1');
                                if(wp)
-                               {
-                                       WaypointSprite_UpdateTeamRadar(wp, RADARICON_WAYPOINT, '0 1 1');
                                        WaypointSprite_Ping(wp);
-                               }
                                sprint(self, "personal waypoint spawned at crosshair\n");
                                break;
                        case 32:
                                if(vlen(self.death_origin))
                                {
-                                       wp = WaypointSprite_DeployPersonal("waypoint", self.death_origin);
+                                       wp = WaypointSprite_DeployPersonal("waypoint", self.death_origin, RADARICON_WAYPOINT, '0 1 1');
                                        if(wp)
-                                       {
-                                               WaypointSprite_UpdateTeamRadar(wp, RADARICON_WAYPOINT, '0 1 1');
                                                WaypointSprite_Ping(wp);
-                                       }
                                        sprint(self, "personal waypoint spawned at death location\n");
                                }
                                break;
                        case 33:
                                if(self.deadflag == DEAD_NO && teamplay)
                                {
-                                       wp = WaypointSprite_Attach("helpme", TRUE);
-                                       if(wp)
-                                               WaypointSprite_UpdateTeamRadar(wp, RADARICON_HELPME, '1 0.5 0'); // TODO choose better color
+                                       wp = WaypointSprite_Attach("helpme", TRUE, RADARICON_HELPME, '1 0.5 0');
                                        if(!wp)
-                                               wp = self.waypointsprite_attachedforcarrier; // flag sprite?
-                                       if(wp)
+                                               WaypointSprite_HelpMePing(self.waypointsprite_attachedforcarrier);
+                                       else
                                                WaypointSprite_Ping(wp);
                                        sprint(self, "HELP ME attached\n");
                                }
                                break;
                        case 34:
-                               wp = WaypointSprite_DeployFixed("here", FALSE, self.origin);
+                               wp = WaypointSprite_DeployFixed("here", FALSE, self.origin, RADARICON_HERE, '0 1 0');
                                if(wp)
-                               {
-                                       WaypointSprite_UpdateTeamRadar(wp, RADARICON_HERE, '0 1 0');
                                        WaypointSprite_Ping(wp);
-                               }
                                sprint(self, "HERE spawned at location\n");
                                break;
                        case 35:
                                WarpZone_crosshair_trace(self);
-                               wp = WaypointSprite_DeployFixed("here", FALSE, trace_endpos);
+                               wp = WaypointSprite_DeployFixed("here", FALSE, trace_endpos, RADARICON_HERE, '0 1 0');
                                if(wp)
-                               {
-                                       WaypointSprite_UpdateTeamRadar(wp, RADARICON_HERE, '0 1 0');
                                        WaypointSprite_Ping(wp);
-                               }
                                sprint(self, "HERE spawned at crosshair\n");
                                break;
                        case 36:
                                if(vlen(self.death_origin))
                                {
-                                       wp = WaypointSprite_DeployFixed("here", FALSE, self.death_origin);
+                                       wp = WaypointSprite_DeployFixed("here", FALSE, self.death_origin, RADARICON_HERE, '0 1 0');
                                        if(wp)
-                                       {
-                                               WaypointSprite_UpdateTeamRadar(wp, RADARICON_HERE, '0 1 0');
                                                WaypointSprite_Ping(wp);
-                                       }
                                        sprint(self, "HERE spawned at death location\n");
                                }
                                break;
                        case 37:
-                               wp = WaypointSprite_DeployFixed("danger", FALSE, self.origin);
+                               wp = WaypointSprite_DeployFixed("danger", FALSE, self.origin, RADARICON_DANGER, '1 0.5 0');
                                if(wp)
-                               {
-                                       WaypointSprite_UpdateTeamRadar(wp, RADARICON_DANGER, '1 0.5 0');
                                        WaypointSprite_Ping(wp);
-                               }
                                sprint(self, "DANGER spawned at location\n");
                                break;
                        case 38:
                                WarpZone_crosshair_trace(self);
-                               wp = WaypointSprite_DeployFixed("danger", FALSE, trace_endpos);
+                               wp = WaypointSprite_DeployFixed("danger", FALSE, trace_endpos, RADARICON_DANGER, '1 0.5 0');
                                if(wp)
-                               {
-                                       WaypointSprite_UpdateTeamRadar(wp, RADARICON_DANGER, '1 0.5 0');
                                        WaypointSprite_Ping(wp);
-                               }
                                sprint(self, "DANGER spawned at crosshair\n");
                                break;
                        case 39:
                                if(vlen(self.death_origin))
                                {
-                                       wp = WaypointSprite_DeployFixed("danger", FALSE, self.death_origin);
+                                       wp = WaypointSprite_DeployFixed("danger", FALSE, self.death_origin, RADARICON_DANGER, '1 0.5 0');
                                        if(wp)
-                                       {
-                                               WaypointSprite_UpdateTeamRadar(wp, RADARICON_DANGER, '1 0.5 0');
                                                WaypointSprite_Ping(wp);
-                                       }
                                        sprint(self, "DANGER spawned at death location\n");
                                }
                                break;
index 3d098458e30b4bc07cd69decd017d22cb6dc6528..dc5c0addce9d94437f030a53e0f3add7eb883120 100644 (file)
@@ -559,7 +559,7 @@ void PlayerDamage (entity inflictor, entity attacker, float damage, float deatht
                        awep = DEATH_WEAPONOF(deathtype);
                valid_damage_for_weaponstats = 1;
        }
-       
+
        if(valid_damage_for_weaponstats)
        {
                dh = dh - max(self.health, 0);
index 15894f6df0bc009f2c727f49b15bd2c252580806..500132f0bdf26af7e5ddaa8246a17cedcce20d38 100644 (file)
@@ -986,7 +986,8 @@ float client_hasweapon(entity cl, float wpn, float andammo, float complain)
                                                world, e.origin,
                                                self, 0,
                                                world, enemy,
-                                               0
+                                               0,
+                                               RADARICON_NONE, '0 0 0'
                                        );
                                }
                        }
index f5cbae51b505e157ba501b5cd1820d667454bd12..7edfe9337185601a50019e2b9c6eab592eee2e92 100644 (file)
@@ -49,7 +49,7 @@ float ctf_captureshield_shielded(entity p)
 
        // player is in the worse half, if >= half the players are better than him, or consequently, if < half of the players are worse
        // use this rule here
-       
+
        if(players_worseeq >= players_total * captureshield_max_ratio)
                return FALSE;
 
@@ -125,15 +125,9 @@ void ctf_flag_spawnstuff()
        self.basewaypoint = self.nearestwaypoint;
 
        if(self.team == COLOR_TEAM1)
-       {
-               WaypointSprite_SpawnFixed("redbase", self.origin + '0 0 61', self, sprite);
-               WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_FLAG, colormapPaletteColor(COLOR_TEAM1 - 1, FALSE));
-       }
+               WaypointSprite_SpawnFixed("redbase", self.origin + '0 0 61', self, sprite, RADARICON_FLAG, colormapPaletteColor(COLOR_TEAM1 - 1, FALSE));
        else
-       {
-               WaypointSprite_SpawnFixed("bluebase", self.origin + '0 0 61', self, sprite);
-               WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_FLAG, colormapPaletteColor(COLOR_TEAM2 - 1, FALSE));
-       }
+               WaypointSprite_SpawnFixed("bluebase", self.origin + '0 0 61', self, sprite, RADARICON_FLAG, colormapPaletteColor(COLOR_TEAM2 - 1, FALSE));
 }
 
 float ctf_score_value(string parameter)
@@ -296,11 +290,11 @@ void DropFlag(entity e, entity penalty_receiver, entity attacker)
        ctf_captureshield_update(p, 0); // shield only
        e.playerid = attacker.playerid;
        e.ctf_droptime = time;
-       WaypointSprite_Spawn("flagdropped", 0, 0, e, '0 0 1' * 61, world, COLOR_TEAM1 + COLOR_TEAM2 - e.team, e, waypointsprite_attachedforcarrier, FALSE);
+       WaypointSprite_Spawn("flagdropped", 0, 0, e, '0 0 1' * 61, world, COLOR_TEAM1 + COLOR_TEAM2 - e.team, e, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAG, '0 1 1');
+       WaypointSprite_Ping(e.waypointsprite_attachedforcarrier);
        
        if(p.waypointsprite_attachedforcarrier)
        {
-               WaypointSprite_Ping(p.waypointsprite_attachedforcarrier);
                WaypointSprite_DetachCarrier(p);
        }
        else
@@ -515,10 +509,10 @@ void FlagTouch()
        {
                if (other.next_take_time > time)
                        return;
-                       
+
                if (autocvar_g_ctf_flag_pickup_effects) // pickup effect
                        pointparticles(particleeffectnum("smoke_ring"), 0.5 * (self.absmin + self.absmax), '0 0 0', 1);
-                       
+
                // pick up
                self.flagpickuptime = time; // used for timing runs
                self.speedrunning = other.speedrunning; // if speedrunning, flag will self-return and teleport the owner back after the record
@@ -546,8 +540,7 @@ void FlagTouch()
                self.movetype = MOVETYPE_NONE;
                setorigin(self, FLAG_CARRY_POS);
                setattachment(self, other, "");
-               WaypointSprite_AttachCarrier("flagcarrier", other);
-               WaypointSprite_UpdateTeamRadar(other.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '1 1 0');
+               WaypointSprite_AttachCarrier("flagcarrier", other, RADARICON_FLAGCARRIER, '1 1 0');
                WaypointSprite_Ping(self.sprite);
 
                return;
@@ -603,7 +596,7 @@ void FlagTouch()
 
                        if (autocvar_g_ctf_flag_pickup_effects) // field pickup effect
                                pointparticles(particleeffectnum("smoke_ring"), 0.5 * (self.absmin + self.absmax), '0 0 0', 1);
-                       
+
                        // pick up
                        self.solid = SOLID_NOT;
                        setorigin(self, self.origin); // relink
@@ -636,8 +629,7 @@ void FlagTouch()
                        setattachment(self, other, "");
                        self.damageforcescale = 0;
                        self.takedamage = DAMAGE_NO;
-                       WaypointSprite_AttachCarrier("flagcarrier", other);
-                       WaypointSprite_UpdateTeamRadar(other.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '1 1 0');
+                       WaypointSprite_AttachCarrier("flagcarrier", other, RADARICON_FLAGCARRIER, '1 1 0');
                }
        }
 };
@@ -742,7 +734,7 @@ void item_flag_postspawn()
                if(self.team == COLOR_TEAM2)
                        // Blue
                        self.glow_color = 210;
-                       
+
                self.glow_size = 25;
                self.glow_trail = 1;
        }
@@ -1087,7 +1079,7 @@ entity(float cteam) ctf_team_has_commander =
        entity pl;
        if(cteam != COLOR_TEAM1 || cteam != COLOR_TEAM2)
                return world;
-       
+
        FOR_EACH_REALPLAYER(pl) {
                if(pl.team == cteam && pl.iscommander) {
                        return pl;
@@ -1105,7 +1097,7 @@ void(entity e, float st) ctf_setstate =
 void(float cteam) ctf_new_commander =
 {
        entity pl, plmax;
-       
+
        plmax = world;
        FOR_EACH_REALPLAYER(pl) {
                if(pl.team == cteam) {
@@ -1130,14 +1122,14 @@ void(float cteam) ctf_new_commander =
 void() ctf_clientconnect =
 {
        self.iscommander = FALSE;
-       
+
        if(!self.team || self.classname != "player") {
                ctf_setstate(self, -1);
        } else
                ctf_setstate(self, 0);
 
        self.team_saved = self.team;
-       
+
        if(self.team != 0 && self.classname == "player" && !ctf_team_has_commander(self.team)) {
                ctf_new_commander(self.team);
        }
@@ -1162,9 +1154,9 @@ void() ctf_playerchanged =
                        ctf_setstate(self, -1);
                ctf_new_commander(self.team_saved);
        }
-       
+
        self.team_saved = self.team;
-       
+
        ctf_new_commander(self.team);
 };
 
index d6140ea2afaaab83b826f0890820c5062e93550e..cb88d354e4087a13d40ddf5473b50bb9ecef754a 100644 (file)
@@ -562,10 +562,6 @@ void ClientData_Touch(entity e);
 
 vector debug_shotorg; // if non-zero, overrides the shot origin of all weapons
 
-// the QC VM sucks
-#define BITXOR(v,b)        ((v) + (b) - 2 * ((v) & (b)))
-#define BITXOR_ASSIGN(v,b) ((v) += ((b) - 2 * ((v) & (b))))
-
 .float wasplayer;
 
 float servertime, serverprevtime, serverframetime;
index b58c0f074fd052ba8824c007d89293247d5ea686..93bd69a1142d176ebfa68acbd1ef6ce399f9a3de 100644 (file)
@@ -392,8 +392,7 @@ void dom_controlpoint_setup()
        droptofloor();
 
        waypoint_spawnforitem(self);
-       WaypointSprite_SpawnFixed("dom-neut", self.origin + '0 0 32', self, sprite);
-       WaypointSprite_UpdateTeamRadar(self.sprite, RADARICON_DOMPOINT, '0 1 1');
+       WaypointSprite_SpawnFixed("dom-neut", self.origin + '0 0 32', self, sprite, RADARICON_DOMPOINT, '0 1 1');
 };
 
 
index 0bd7a8da84b4ae6aa743673b45df1db5f428d958..0fdeb1354607b160844d0a19bf49f92ec7848eca 100644 (file)
@@ -782,15 +782,21 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
                        if(deathtype & HITTYPE_HEADSHOT)
                                damage *= 1 + damage_headshotbonus;
 
-                       if(targ.classname == "player")
+                       entity victim;
+                       if((targ.vehicle_flags & VHF_ISVEHICLE) && targ.owner)
+                               victim = targ.owner;
+                       else
+                               victim = targ;
+
+                       if(victim.classname == "player")
                        {
-                               if(IsDifferentTeam(targ, attacker))
+                               if(IsDifferentTeam(victim, attacker))
                                {
                                        if(damage > 0)
                                        {
                                                if(deathtype != DEATH_FIRE)
                                                {
-                                                       if(targ.BUTTON_CHAT)
+                                                       if(victim.BUTTON_CHAT)
                                                                attacker.typehitsound += 1;
                                                        else
                                                                attacker.hitsound += 1;
@@ -801,12 +807,13 @@ void Damage (entity targ, entity inflictor, entity attacker, float damage, float
 
                                                if not(DEATH_ISSPECIAL(deathtype))
                                                {
+                                                       if(targ.classname == "player") // don't do this for vehicles
                                                        if(!g_minstagib)
-                                                       if(IsFlying(targ))
+                                                       if(IsFlying(victim))
                                                                yoda = 1;
 
                                                        if(g_minstagib)
-                                                       if(targ.items & IT_STRENGTH)
+                                                       if(victim.items & IT_STRENGTH)
                                                                yoda = 1;
 
                                                        if(deathtype & HITTYPE_HEADSHOT)
index dd6d73effd8aae382ae92c4d40bf16807faa9b2b..f03f78473f82dfd8e5cfad64ac38720e90221419 100644 (file)
@@ -47,43 +47,6 @@ And you should be done!
 
 ============================================*/
 
-.string aiment_classname;
-.float aiment_deadflag;
-void SetMovetypeFollow(entity ent, entity e)
-{
-       // FIXME this may not be warpzone aware
-       ent.movetype = MOVETYPE_FOLLOW; // make the hole follow
-       ent.solid = SOLID_NOT; // MOVETYPE_FOLLOW is always non-solid - this means this cannot be teleported by warpzones any more! Instead, we must notice when our owner gets teleported.
-       ent.aiment = e; // make the hole follow bmodel
-       ent.punchangle = e.angles; // the original angles of bmodel
-       ent.view_ofs = ent.origin - e.origin; // relative origin
-       ent.v_angle = ent.angles - e.angles; // relative angles
-       ent.aiment_classname = strzone(e.classname);
-       ent.aiment_deadflag = e.deadflag;
-}
-void UnsetMovetypeFollow(entity ent)
-{
-       ent.movetype = MOVETYPE_FLY;
-       PROJECTILE_MAKETRIGGER(ent);
-       ent.aiment = world;
-}
-float LostMovetypeFollow(entity ent)
-{
-/*
-       if(ent.movetype != MOVETYPE_FOLLOW)
-               if(ent.aiment)
-                       error("???");
-*/
-       if(ent.aiment)
-       {
-               if(ent.aiment.classname != ent.aiment_classname)
-                       return 1;
-               if(ent.aiment.deadflag != ent.aiment_deadflag)
-                       return 1;
-       }
-       return 0;
-}
-
 .float hook_length;
 .float hook_switchweapon;
 
@@ -119,12 +82,12 @@ float GrapplingHookSend(entity to, float sf)
 {
        WriteByte(MSG_ENTITY, ENT_CLIENT_HOOK);
        sf = sf & 0x7F;
-       if(sound_allowed(MSG_BROADCAST, self.owner))
+       if(sound_allowed(MSG_BROADCAST, self.realowner))
                sf |= 0x80;
        WriteByte(MSG_ENTITY, sf);
        if(sf & 1)
        {
-               WriteByte(MSG_ENTITY, num_for_edict(self.owner));
+               WriteByte(MSG_ENTITY, num_for_edict(self.realowner));
        }
        if(sf & 2)
        {
@@ -145,14 +108,14 @@ void GrapplingHookThink()
 {
        float spd, dist, minlength, pullspeed, ropestretch, ropeairfriction, rubberforce, newlength, rubberforce_overstretch, s;
        vector dir, org, end, v0, dv, v, myorg, vs;
-       if(self.owner.health <= 0 || self.owner.hook != self)   // how did that happen?
+       if(self.realowner.health <= 0 || self.realowner.hook != self)   // how did that happen?
        {                                                                                                               // well, better fix it anyway
                remove(self);
                return;
        }
        if(LostMovetypeFollow(self))
        {
-               RemoveGrapplingHook(self.owner);
+               RemoveGrapplingHook(self.realowner);
                return;
        }
        if(self.aiment)
@@ -160,15 +123,15 @@ void GrapplingHookThink()
 
        self.nextthink = time;
 
-       s = self.owner.cvar_cl_gunalign;
+       s = self.realowner.cvar_cl_gunalign;
        if(s != 1 && s != 2 && s != 4)
                s = 3; // default value
        --s;
        vs = hook_shotorigin[s];
 
-       makevectors(self.owner.v_angle);
-       org = self.owner.origin + self.owner.view_ofs + v_forward * vs_x + v_right * -vs_y + v_up * vs_z;
-       myorg = WarpZone_RefSys_TransformOrigin(self.owner, self, org);
+       makevectors(self.realowner.v_angle);
+       org = self.realowner.origin + self.realowner.view_ofs + v_forward * vs_x + v_right * -vs_y + v_up * vs_z;
+       myorg = WarpZone_RefSys_TransformOrigin(self.realowner, self, org);
 
        if(self.hook_length < 0)
                self.hook_length = vlen(myorg - self.origin);
@@ -202,10 +165,10 @@ void GrapplingHookThink()
 
                if(autocvar_g_grappling_hook_tarzan)
                {
-                       v = v0 = WarpZone_RefSys_TransformVelocity(self.owner, self, self.owner.velocity);
+                       v = v0 = WarpZone_RefSys_TransformVelocity(self.realowner, self, self.realowner.velocity);
 
                        // first pull the rope...
-                       if(self.owner.hook_state & HOOK_PULLING)
+                       if(self.realowner.hook_state & HOOK_PULLING)
                        {
                                newlength = self.hook_length;
                                newlength = max(newlength - pullspeed * frametime, minlength);
@@ -220,7 +183,7 @@ void GrapplingHookThink()
                                self.hook_length = newlength;
                        }
 
-                       if(self.owner.hook_state & HOOK_RELEASING)
+                       if(self.realowner.hook_state & HOOK_RELEASING)
                        {
                                newlength = dist;
                                self.hook_length = newlength;
@@ -240,15 +203,15 @@ void GrapplingHookThink()
                                                v = v - dv * 0.5;
                                                self.aiment.velocity = self.aiment.velocity - dv * 0.5;
                                                self.aiment.flags &~= FL_ONGROUND;
-                                               self.aiment.pusher = self.owner;
+                                               self.aiment.pusher = self.realowner;
                                                self.aiment.pushltime = time + autocvar_g_maxpushtime;
                                        }
                                }
 
-                               self.owner.flags &~= FL_ONGROUND;
+                               self.realowner.flags &~= FL_ONGROUND;
                        }
 
-                       self.owner.velocity = WarpZone_RefSys_TransformVelocity(self, self.owner, v);
+                       self.realowner.velocity = WarpZone_RefSys_TransformVelocity(self, self.realowner, v);
                }
                else
                {
@@ -260,15 +223,15 @@ void GrapplingHookThink()
                                spd = pullspeed;
                        if(spd < 50)
                                spd = 0;
-                       self.owner.velocity = dir*spd;
-                       self.owner.movetype = MOVETYPE_FLY;
+                       self.realowner.velocity = dir*spd;
+                       self.realowner.movetype = MOVETYPE_FLY;
 
-                       self.owner.flags &~= FL_ONGROUND;
+                       self.realowner.flags &~= FL_ONGROUND;
                }
        }
 
        makevectors(self.angles_x * '-1 0 0' + self.angles_y * '0 1 0');
-       myorg = WarpZone_RefSys_TransformOrigin(self, self.owner, self.origin); // + v_forward * (-9);
+       myorg = WarpZone_RefSys_TransformOrigin(self, self.realowner, self.origin); // + v_forward * (-9);
 
        if(myorg != self.hook_start)
        {
@@ -288,7 +251,7 @@ void GrapplingHookTouch (void)
                return;
        if(SUB_NoImpactCheck())
        {
-               RemoveGrapplingHook(self.owner);
+               RemoveGrapplingHook(self.realowner);
                return;
        }
        PROJECTILE_TOUCH;
@@ -302,7 +265,7 @@ void GrapplingHookTouch (void)
                        WarpZone_RefSys_BeginAddingIncrementally(self, self.aiment);
                }
 
-       //self.owner.disableclientprediction = TRUE;
+       //self.realowner.disableclientprediction = TRUE;
 }
 
 void GrapplingHook_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
@@ -312,12 +275,12 @@ void GrapplingHook_Damage (entity inflictor, entity attacker, float damage, floa
                self.health = self.health - damage;
                if (self.health <= 0)
                {
-                       if(attacker != self.owner)
+                       if(attacker != self.realowner)
                        {
-                               self.owner.pusher = attacker;
-                               self.owner.pushltime = time + autocvar_g_maxpushtime;
+                               self.realowner.pusher = attacker;
+                               self.realowner.pushltime = time + autocvar_g_maxpushtime;
                        }
-                       RemoveGrapplingHook(self.owner);
+                       RemoveGrapplingHook(self.realowner);
                }
        }
 }
@@ -353,7 +316,7 @@ void FireGrapplingHook (void)
        pointparticles(particleeffectnum("grapple_muzzleflash"), org, '0 0 0', 1);
 
        missile = WarpZone_RefSys_SpawnSameRefSys(self);
-       missile.owner = self;
+       missile.owner = missile.realowner = self;
        self.hook = missile;
        missile.classname = "grapplinghook";
 
index c16608821abf47ee661137a9ce5203b023b39486..8b7806e566e91968bf6cc1211fa759aa4d27ac02 100644 (file)
@@ -3086,3 +3086,40 @@ void defer(float fdelay, void() func)
     e.think     = defer_think;
     e.nextthink = time + fdelay;
 }
+
+.string aiment_classname;
+.float aiment_deadflag;
+void SetMovetypeFollow(entity ent, entity e)
+{
+       // FIXME this may not be warpzone aware
+       ent.movetype = MOVETYPE_FOLLOW; // make the hole follow
+       ent.solid = SOLID_NOT; // MOVETYPE_FOLLOW is always non-solid - this means this cannot be teleported by warpzones any more! Instead, we must notice when our owner gets teleported.
+       ent.aiment = e; // make the hole follow bmodel
+       ent.punchangle = e.angles; // the original angles of bmodel
+       ent.view_ofs = ent.origin - e.origin; // relative origin
+       ent.v_angle = ent.angles - e.angles; // relative angles
+       ent.aiment_classname = strzone(e.classname);
+       ent.aiment_deadflag = e.deadflag;
+}
+void UnsetMovetypeFollow(entity ent)
+{
+       ent.movetype = MOVETYPE_FLY;
+       PROJECTILE_MAKETRIGGER(ent);
+       ent.aiment = world;
+}
+float LostMovetypeFollow(entity ent)
+{
+/*
+       if(ent.movetype != MOVETYPE_FOLLOW)
+               if(ent.aiment)
+                       error("???");
+*/
+       if(ent.aiment)
+       {
+               if(ent.aiment.classname != ent.aiment_classname)
+                       return 1;
+               if(ent.aiment.deadflag != ent.aiment_deadflag)
+                       return 1;
+       }
+       return 0;
+}
index ba1f8accc348c5fe2692f219531c4c6a2af78c50..c5cd4ccba417fa108dd3507282674d9cf761765c 100644 (file)
@@ -900,7 +900,7 @@ void spawnfunc_onslaught_generator()
        self.nextthink = time + 0.2;
        InitializeEntity(self, onslaught_generator_delayed, INITPRIO_LAST);
 
-       WaypointSprite_SpawnFixed(string_null, e.origin + '0 0 1' * e.maxs_z, self, sprite);
+       WaypointSprite_SpawnFixed(string_null, e.origin + '0 0 1' * e.maxs_z, self, sprite, RADARICON_NONE, '0 0 0');
        WaypointSprite_UpdateRule(self.sprite, COLOR_TEAM2, SPRITERULE_TEAMPLAY);
        WaypointSprite_UpdateMaxHealth(self.sprite, self.max_health);
        WaypointSprite_UpdateHealth(self.sprite, self.health);
@@ -1283,7 +1283,7 @@ void spawnfunc_onslaught_controlpoint()
 
        waypoint_spawnforitem(self);
 
-       WaypointSprite_SpawnFixed(string_null, e.origin + '0 0 1' * e.maxs_z, self, sprite);
+       WaypointSprite_SpawnFixed(string_null, e.origin + '0 0 1' * e.maxs_z, self, sprite, RADARICON_NONE, '0 0 0');
        WaypointSprite_UpdateRule(self.sprite, COLOR_TEAM2, SPRITERULE_TEAMPLAY);
 
        onslaught_updatelinks();
index 89feff9a49e3bbdf77de224226fd569adf8cfb9f..8a6235127cbcd5d721a9020d3609219b62979974 100644 (file)
@@ -1,3 +1,4 @@
+#ifdef SVQC 
 .vector moveto;
 
 /**
@@ -161,10 +162,14 @@ void movelib_update(vector dir,float force)
 }
 */
 
+/*
 void movelib_move_simple(vector newdir,float velo,float blendrate)
 {
     self.velocity = self.velocity * (1 - blendrate) + (newdir * blendrate) * velo;
 }
+*/
+#define movelib_move_simple(newdir,velo,blendrate) \
+    self.velocity = self.velocity * (1 - blendrate) + (newdir * blendrate) * velo
 
 void movelib_beak_simple(float force)
 {
@@ -183,6 +188,8 @@ void movelib_beak_simple(float force)
 Pitches and rolls the entity to match the gound.
 Yed need to set v_up and v_forward (generally by calling makevectors) before calling this.
 **/
+#endif
+
 void movelib_groundalign4point(float spring_length, float spring_up, float blendrate)
 {
     vector a, b, c, d, e, r, push_angle, ahead, side;
index f56dc59f18f15979d5cdd8e5defb06826babdaf9..c3d9272598fa720683113018f14efc241237ab8d 100644 (file)
@@ -88,11 +88,7 @@ void freezetag_Freeze(entity attacker)
        RemoveGrapplingHook(self);
 
        // add waypoint
-       WaypointSprite_Spawn("freezetag_frozen", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attached, TRUE);
-       if(self.waypointsprite_attached)
-       {
-               WaypointSprite_UpdateTeamRadar(self.waypointsprite_attached, RADARICON_WAYPOINT, '0.25 0.90 1');
-       }
+       WaypointSprite_Spawn("freezetag_frozen", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attached, TRUE, RADARICON_WAYPOINT, '0.25 0.90 1');
 
        if(attacker == self)
        {
index 85a29031a8ec8ecc8a55bb9a60f3f6a8c7613e9a..e55f979960eab8c4ceb7f2acc0276e013bda7a64 100644 (file)
@@ -4,6 +4,8 @@ void ka_RespawnBall(void);
 void ka_DropEvent(entity);
 void ka_TimeScoring(void);
 
+entity ka_ball;
+
 float ka_ballcarrier_waypointsprite_visible_for_player(entity);
 
 void ka_Initialize() // run at the start of a match, initiates game mode
@@ -50,6 +52,7 @@ void ka_SpawnBall() // loads various values for the ball, runs only once at star
        e.reset = ka_Reset;
        e.touch = ka_TouchEvent;
        e.owner = world;
+       ka_ball = e;
 
        InitializeEntity(e, ka_RespawnBall, INITPRIO_SETLOCATION); // is this the right priority? Neh, I have no idea.. Well-- it works! So. 
 }
@@ -72,8 +75,7 @@ void ka_RespawnBall() // runs whenever the ball needs to be relocated
                pointparticles(particleeffectnum("electro_combo"), oldballorigin, '0 0 0', 1);
                pointparticles(particleeffectnum("electro_combo"), self.origin, '0 0 0', 1);
 
-               WaypointSprite_Spawn("ka-ball", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attachedforcarrier, FALSE);
-               WaypointSprite_UpdateTeamRadar(self.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '0 1 1');
+               WaypointSprite_Spawn("ka-ball", 0, 0, self, '0 0 64', world, self.team, self, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAGCARRIER, '0 1 1');
                WaypointSprite_Ping(self.waypointsprite_attachedforcarrier);    
 
                sound(self, CHAN_AUTO, "keepaway/respawn.wav", VOL_BASE, ATTN_NONE); // ATTN_NONE (it's a sound intended to be heard anywhere) 
@@ -132,10 +134,9 @@ void ka_TouchEvent() // runs any time that the ball comes in contact with someth
        PlayerScore_Add(other, SP_KEEPAWAY_PICKUPS, 1);
 
        // waypoints
-       WaypointSprite_AttachCarrier("ka-ballcarrier", other);
+       WaypointSprite_AttachCarrier("ka-ballcarrier", other, RADARICON_FLAGCARRIER, '1 0 0');
        other.waypointsprite_attachedforcarrier.waypointsprite_visible_for_player = ka_ballcarrier_waypointsprite_visible_for_player;
        WaypointSprite_UpdateRule(other.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
-       WaypointSprite_UpdateTeamRadar(other.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '1 0 0');
        WaypointSprite_Ping(other.waypointsprite_attachedforcarrier);   
        WaypointSprite_Kill(self.waypointsprite_attachedforcarrier);
 }
@@ -175,9 +176,8 @@ void ka_DropEvent(entity plyr) // runs any time that a player is supposed to los
        // PlayerScore_Add(plyr, SP_KEEPAWAY_DROPS, 1); Not anymore, this is 100% the same as pickups and is useless.
        
        // waypoints
-       WaypointSprite_Spawn("ka-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE);
+       WaypointSprite_Spawn("ka-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAGCARRIER, '0 1 1');
        WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
-       WaypointSprite_UpdateTeamRadar(ball.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, '0 1 1');
        WaypointSprite_Ping(ball.waypointsprite_attachedforcarrier);    
        WaypointSprite_Kill(plyr.waypointsprite_attachedforcarrier);
 }
index 85623f79d8a3a17518177b351f5f79aa788e205d..32e4116aa1273e342491fc34a48288c0d901796a 100644 (file)
@@ -350,7 +350,7 @@ void kh_Key_AssignTo(entity key, entity player)  // runs every time a key is pic
                if(key.kh_next == world)
                {
                        // player is now a key carrier
-                       WaypointSprite_AttachCarrier("", player);
+                       WaypointSprite_AttachCarrier("", player, RADARICON_FLAGCARRIER, colormapPaletteColor(player.team - 1, 0));
                        player.waypointsprite_attachedforcarrier.waypointsprite_visible_for_player = kh_KeyCarrier_waypointsprite_visible_for_player;
                        WaypointSprite_UpdateRule(player.waypointsprite_attachedforcarrier, player.team, SPRITERULE_TEAMPLAY);
                        if(player.team == COLOR_TEAM1)
@@ -361,7 +361,6 @@ void kh_Key_AssignTo(entity key, entity player)  // runs every time a key is pic
                                WaypointSprite_UpdateSprites(player.waypointsprite_attachedforcarrier, "keycarrier-yellow", "keycarrier-friend", "keycarrier-yellow");
                        else if(player.team == COLOR_TEAM4)
                                WaypointSprite_UpdateSprites(player.waypointsprite_attachedforcarrier, "keycarrier-pink", "keycarrier-friend", "keycarrier-pink");
-                       WaypointSprite_UpdateTeamRadar(player.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, colormapPaletteColor(player.team - 1, 0));
                        if(!kh_no_radar_circles)
                                WaypointSprite_Ping(player.waypointsprite_attachedforcarrier);
                }
@@ -751,9 +750,8 @@ void kh_Key_Spawn(entity initial_owner, float angle, float i)  // runs every tim
 
        centerprint(initial_owner, strcat("You are starting with the ", key.netname, "\n"));  // message to player at start of round
 
-       WaypointSprite_Spawn("key-dropped", 0, 0, key, '0 0 1' * KH_KEY_WP_ZSHIFT, world, key.team, key, waypointsprite_attachedforcarrier, FALSE);
+       WaypointSprite_Spawn("key-dropped", 0, 0, key, '0 0 1' * KH_KEY_WP_ZSHIFT, world, key.team, key, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAG, '0 1 1');
        key.waypointsprite_attachedforcarrier.waypointsprite_visible_for_player = kh_Key_waypointsprite_visible_for_player;
-       WaypointSprite_UpdateTeamRadar(key.waypointsprite_attachedforcarrier, RADARICON_FLAG, '0 1 1');
 
        kh_Key_AssignTo(key, initial_owner);
 }
index 13e8eea40a9103424f89eb187af775d0903f247f..1cfbbe7b73e95ebb1553a113db42eb0a05cede25 100644 (file)
@@ -166,9 +166,8 @@ void GiveBall (entity plyr, entity ball)
        ball.effects |= EF_NOSHADOW;
        ball.scale = 1; // scale down.
 
-       WaypointSprite_AttachCarrier("nb-ball", plyr);
+       WaypointSprite_AttachCarrier("nb-ball", plyr, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
        WaypointSprite_UpdateRule(plyr.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
-       WaypointSprite_UpdateTeamRadar(plyr.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
 
        if (g_nexball_basketball_delay_hold)
        {
@@ -201,10 +200,8 @@ void DropBall (entity ball, vector org, vector vel)
        }
 
        WaypointSprite_Kill(ball.owner.waypointsprite_attachedforcarrier);
-       //WaypointSprite_AttachCarrier("nb-ball", ball);
-       WaypointSprite_Spawn("nb-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE); // no health bar please
+       WaypointSprite_Spawn("nb-ball", 0, 0, ball, '0 0 64', world, ball.team, ball, waypointsprite_attachedforcarrier, FALSE, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); // no health bar please
        WaypointSprite_UpdateRule(ball.waypointsprite_attachedforcarrier, 0, SPRITERULE_DEFAULT);
-       WaypointSprite_UpdateTeamRadar(ball.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
 
        ball.owner.ballcarried = world;
        ball.owner = world;
@@ -491,8 +488,7 @@ void SpawnBall (void)
        precache_sound (self.noise1);
        precache_sound (self.noise2);
 
-       WaypointSprite_AttachCarrier("nb-ball", self); // the ball's team is not set yet, no rule update needed
-       WaypointSprite_UpdateTeamRadar(self.waypointsprite_attachedforcarrier, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR);
+       WaypointSprite_AttachCarrier("nb-ball", self, RADARICON_FLAGCARRIER, BALL_SPRITECOLOR); // the ball's team is not set yet, no rule update needed
 
        self.reset = ball_restart;
        self.think = InitBall;
index 0ce3d515a1d537837699d88b825fc9216dad9276..a0f750b05beef72ba6ee7b2daa907d21dbc7b32e 100644 (file)
@@ -355,7 +355,7 @@ void Portal_Disconnect(entity teleporter, entity destination)
 
 void Portal_Connect(entity teleporter, entity destination)
 {
-       teleporter.portal_transform = AnglesTransform_Divide(AnglesTransform_TurnDirectionFR(destination.mangle), teleporter.mangle);
+       teleporter.portal_transform = AnglesTransform_RightDivide(AnglesTransform_TurnDirectionFR(destination.mangle), teleporter.mangle);
 
        teleporter.enemy = destination;
        destination.enemy = teleporter;
index 488dd10206bc1c4f11d9c5b51beee49c14fb50aa..58d40dbea8f66c07b94bc1f035ab3e1046daa681 100644 (file)
@@ -30,6 +30,7 @@ mutators/mutator_dodging.qh
 
 //// tZork Turrets ////
 tturrets/include/turrets_early.qh
+vehicles/vehicles_def.qh
 
 campaign.qh
 ../common/campaign_common.qh
index 9817b3b0e1afaa45675b4755f45989da50afe0d6..80cb96b103b45e0b77927f8c49709e919cd901f4 100644 (file)
@@ -805,9 +805,9 @@ void spawnfunc_trigger_race_checkpoint()
        if(!self.race_penalty)
        {
                if(self.race_checkpoint)
-                       WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite);
+                       WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite, RADARICON_NONE, '1 0.5 0');
                else
-                       WaypointSprite_SpawnFixed("race-finish", o, self, sprite);
+                       WaypointSprite_SpawnFixed("race-finish", o, self, sprite, RADARICON_NONE, '1 0.5 0');
        }
 
        self.sprite.waypointsprite_visible_for_player = race_waypointsprite_visible_for_player;
@@ -851,9 +851,9 @@ void spawnfunc_target_checkpoint() // defrag entity
        race_timed_checkpoint = 1;
 
        if(self.race_checkpoint == 0)
-               WaypointSprite_SpawnFixed("race-start", o, self, sprite);
+               WaypointSprite_SpawnFixed("race-start", o, self, sprite, RADARICON_NONE, '1 0.5 0');
        else
-               WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite);
+               WaypointSprite_SpawnFixed("race-checkpoint", o, self, sprite, RADARICON_NONE, '1 0.5 0');
 
        self.sprite.waypointsprite_visible_for_player = race_waypointsprite_visible_for_player;
 
index d512cf95f2c2183999edaca51731c229fbcc66a5..fe47fa305bdccb74daf88b9f8453440f909ab28c 100644 (file)
@@ -424,7 +424,7 @@ vector steerlib_beamsteer(vector dir, float length, float step, float step_up, f
     vr = vectoangles(dir);
     //vr_x *= -1;
 
-    tracebox(self.origin , self.mins,self.maxs,self.origin +  (dir * length) ,MOVE_NOMONSTERS,self);
+    tracebox(self.origin + '0 0 1' * step_up, self.mins, self.maxs, ('0 0 1' * step_up) + self.origin +  (dir * length), MOVE_NOMONSTERS, self);
     if(trace_fraction == 1.0)
     {
         //te_lightning1(self,self.origin,self.origin +  (dir * length));
index 5a591e03532d7ab0847c1c2ec656b900abb9c485..02660fc52a97c8f291f98d4728a92053ae9d563a 100644 (file)
@@ -198,13 +198,9 @@ void Item_RespawnCountdown (void)
                        }
                        if(name)
                        {
-                               WaypointSprite_Spawn(name, 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, TRUE);
+                               WaypointSprite_Spawn(name, 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, TRUE, RADARICON_POWERUP, rgb);
                                if(self.waypointsprite_attached)
-                               {
-                                       WaypointSprite_UpdateTeamRadar(self.waypointsprite_attached, RADARICON_POWERUP, rgb);
-                                       //WaypointSprite_UpdateMaxHealth(self.waypointsprite_attached, ITEM_RESPAWN_TICKS + 1);
                                        WaypointSprite_UpdateBuildFinished(self.waypointsprite_attached, time + ITEM_RESPAWN_TICKS);
-                               }
                        }
                }
                sound (self, CHAN_TRIGGER, "misc/itemrespawncountdown.wav", VOL_BASE, ATTN_NORM);       // play respawn sound
index fbb803294269e5e07bf1a36a0d2675ea28645f4b..a2836264de0c2d7bc1d90f286b0094773edcbb93 100644 (file)
@@ -304,6 +304,9 @@ void spawnfunc_trigger_teleport (void)
 void WarpZone_PostTeleportPlayer_Callback(entity pl)
 {
        UpdateCSQCProjectileAfterTeleport(pl);
+       // "disown" projectiles after teleport
+       if(pl.owner == pl.realowner)
+               pl.owner = world;
        if(pl.classname == "player")
        {
                // reset tracking of oldvelocity for impact damage (sudden velocity changes)
index 8cdd0f5097b581f00cda055d8a70d8c27d976fd7..d52c00307c0474f5ff59b7a6e81c0ddf79291826 100644 (file)
@@ -2,8 +2,8 @@
 #define TTURRETS_ENABLED
 
 #ifdef TTURRETS_ENABLED
-
-#message "with tZork turrets"
+#ifdef SVQC
+//#message "with tZork turrets"
 
 float turret_count;
 
@@ -37,6 +37,8 @@ vector real_origin(entity ent);
 #define TSF_NO_PATHBREAK  8
 /// Dont respawn
 #define TSL_NO_RESPAWN    16
+/// Let this turret roam when idle.
+#define TSL_ROAM          32
 
 /// target selection flags
 .float target_select_flags;
@@ -340,9 +342,10 @@ vector real_origin(entity ent);
 .float target_select_playerbias;
 /// Field of view
 //.float target_select_fov;
-/// Last thimestamp this surret aquierd a valid target
+/// Last timestamp this turret aquierd a valid target
 .float target_select_time;
-
+/// Throttle re-validation of current target
+.float target_validate_time;
 /*
 * Aim refers to real aiming, not gun pos (thats done by track)
 */
@@ -399,33 +402,20 @@ void turret_fire();
 .void() turret_diehook;
 .void() turret_respawnhook;
 
-/*
-#define TEH_THINK 2
-#define TEH_DAMAGE 4
-#define TEH_DIE 8
-#define TEH_RESPAWN 16
-#define TEH_TRACK 32
-#define TEH_AIM 64
-#define TEH_SELECT 128
-.float(float event_id) turret_eventhook;
-*/
-
-
 /*
 * Target selection, preferably but not nessesarely
 * return a normalized result.
 */
 /// Function to use for target evaluation. usualy turret_stdproc_targetscore_generic
-.float(entity e_turret, entity e_target) turret_score_target;
-
+.float(entity _turret, entity _target) turret_score_target;
 
 /*
 * Target selection
 */
 /// Generic, fairly smart, bias-aware target selection.
-float   turret_stdproc_targetscore_generic(entity e_turret, entity e_target);
+float   turret_stdproc_targetscore_generic(entity _turret, entity _target);
 /// Experimental supportunits targetselector
-float   turret_stdproc_targetscore_support(entity e_turret,entity e_target);
+float   turret_stdproc_targetscore_support(entity _turret,entity _target);
 
 /*
 * Aim functions
@@ -464,8 +454,35 @@ void turret_do_updates(entity e_turret);
 .vector tur_shotdir_updated;
 
 void turrets_precash();
-
-
+#endif // SVQC
+
+// common
+.float turret_type;
+float TID_COMMON        = 1;
+float TID_EWHEEL        = 2;
+float TID_FLAC          = 3;
+float TID_FUSION        = 4;
+float TID_HELLION       = 5;
+float TID_HK            = 6;
+float TID_MACHINEGUN    = 7;
+float TID_MLRS          = 8;
+float TID_PHASER        = 9;
+float TID_PLASMA        = 10;
+float TID_PLASMA_DUAL   = 11;
+float TID_TESLA         = 12;
+float TID_WALKER        = 13;
+float TID_LAST          = 13;
+
+float TNSF_UPDATE       = 2;
+float TNSF_STATUS       = 4;
+float TNSF_SETUP        = 8;
+float TNSF_ANG          = 16;
+float TNSF_AVEL         = 32;
+float TNSF_MOVE         = 64;
+.float anim_start_time;
+float TNSF_ANIM         = 128;
+
+float TNSF_FULL_UPDATE  = 16777215;
 
 #endif // TTURRETS_ENABLED
 
index a1a2ed88d5c3cafe9e8f4a4d8b401944a734a009..88358e771e3c2392fb63a2d5ddd3a023bc74bd7d 100644 (file)
 /*
-* Trow a turret gib
+* Spawn a boom, trow fake bits arround
+* and hide the real ones.
 */
-void turret_gib_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
+void turret_hide()
 {
-    self.velocity += vforce;
+    self.effects   |= EF_NODRAW;
+    self.nextthink = time + self.respawntime - 0.2;
+    self.think     = turret_stdproc_respawn;
 }
 
-void turret_trowgib(
-    vector v_from, vector v_to, vector v_colormod,
-    string smodel,
-    float f_lifetime, float f_fadetime, float b_burn)
-{
-    local entity gib;
-    local entity burn;
-
-    gib = spawn();
-
-    gib.classname = "turret_gib";
-    setmodel(gib, smodel);
-    setorigin(gib, v_from);
-    SUB_SetFade(gib,time + f_lifetime, 2);
-
-    gib.solid              = SOLID_BBOX;
-    gib.movetype           = MOVETYPE_BOUNCE;
-    gib.takedamage         = DAMAGE_YES;
-    gib.event_damage       = turret_gib_damage;
-    gib.health             = -1;
-    gib.effects            = EF_LOWPRECISION;
-    gib.flags              = FL_NOTARGET;
-    gib.colormod           = v_colormod;
-    gib.velocity           = v_to;
-
-    if (b_burn)
-    {
-        burn = spawn();
-        burn.effects        = EF_LOWPRECISION;//|EF_FLAME;
-        setattachment(burn,gib,"");
-        setorigin(burn,(gib.mins + gib.maxs) * 0.5);
-        SUB_SetFade(burn,time + (f_lifetime * 0.5), 2);
-    }
-}
-
-void turret_gib_boom()
-{
-    entity gib;
-    float i;
-    string s;
-
-    for (i = 1; i < 5; i = i +1)
-    {
-        gib = spawn();
-        gib.classname = "turret_gib";
-
-        s = strcat("models/turrets/head-gib",ftos(i));
-        s = strcat(s,".md3");
-        setmodel(gib, s);
-
-        setorigin(gib,self.origin);
-
-        SUB_SetFade(gib,time + 5,2);
-
-        gib.solid              = SOLID_BBOX;
-        gib.movetype           = MOVETYPE_BOUNCE;
-        gib.gravity            = 0.5;
-        gib.damageforcescale   = 2;
-        gib.takedamage         = DAMAGE_YES;
-        gib.event_damage       = turret_gib_damage;
-        gib.health             = -1;
-        gib.effects            = EF_LOWPRECISION;
-        gib.flags              = FL_NOTARGET;
-        gib.velocity           = self.velocity + (randomvec() * 700);
-        gib.avelocity          = randomvec() * 64;
-    }
-
-    WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
-    WriteByte (MSG_BROADCAST, 78);
-    WriteCoord (MSG_BROADCAST, self.origin_x);
-    WriteCoord (MSG_BROADCAST, self.origin_y);
-    WriteCoord (MSG_BROADCAST, self.origin_z);
-
-    remove(self);
-}
-
-void turret_trowgib2(
-    vector v_from, vector v_to, vector v_colormod,
-    entity e_mimic, float boomtime)
-{
-    entity gib;
-
-    gib = spawn();
-
-    gib.classname = "turret_gib";
-    setmodel(gib,e_mimic.model);
-    setorigin(gib,v_from);
-
-    gib.solid              = SOLID_BBOX;
-
-    gib.movetype           = MOVETYPE_BOUNCE;
-    gib.gravity            = 0.75;
-    gib.damageforcescale   = 2;
-    gib.takedamage         = DAMAGE_YES;
-    gib.event_damage       = turret_gib_damage;
-    gib.health             = -1;
-    gib.effects            = EF_LOWPRECISION;
-    gib.flags              = FL_NOTARGET;
-    gib.colormod           = v_colormod;
-    gib.velocity           = v_to;
-    gib.avelocity          = randomvec() * 32;
-    gib.think              = turret_gib_boom;
-    gib.nextthink          = boomtime;
-    //gib.effects            = EF_FLAME;
-
-
-}
-/*
-* Spawn a boom, trow fake bits arround
-* and hide the real ones.
-*/
 void turret_stdproc_die()
 {
-    vector org2;
-    vector t_dir;
-
     self.deadflag           = DEAD_DEAD;
     self.tur_head.deadflag  = self.deadflag;
 
-    sound (self, CHAN_PLAYER, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    org2 = self.origin + '0 0 40';
-
-// Explotion grafix
-    WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
-    WriteByte (MSG_BROADCAST, 78);
-    WriteCoord (MSG_BROADCAST, org2_x);
-    WriteCoord (MSG_BROADCAST, org2_y);
-    WriteCoord (MSG_BROADCAST, org2_z);
-
 // Unsolidify and hide real parts
     self.solid              = SOLID_NOT;
     self.tur_head.solid     = self.solid;
 
-    self.alpha             = -1;
-    self.tur_head.alpha    = self.alpha;
-    self.customizeentityforclient = SUB_False;
-    self.tur_head.customizeentityforclient = SUB_False;
-
     self.event_damage           = SUB_Null;
     self.takedamage             = DAMAGE_NO;
 
-    self.effects            = 0;
-    self.tur_head.effects   = self.effects;
     self.health             = 0;
 
-// Trow fake parts arround
-    // base
-    if not(self.damage_flags & TFL_DMG_DEATH_NOGIBS)
-    {
-        makevectors(self.angles);
-        if (random() > 0.5)
-        {
-            turret_trowgib(self.origin, '0 0 0', '1 1 1', "models/turrets/base-gib2.md3", min(self.respawntime, 20), 1, 1);
-            
-            t_dir = (v_up * 700) + (randomvec() * 300);            
-            turret_trowgib(self.origin, t_dir, '1 1 1', "models/turrets/base-gib3.md3", min(self.respawntime, 10), 1, 1);
-            
-            t_dir = (v_up * 700) + (randomvec() * 300);
-            turret_trowgib(self.origin, t_dir, '1 1 1', "models/turrets/base-gib4.md3", min(self.respawntime, 10), 1, 1);
-        }
-        else
-        {
-            turret_trowgib(self.origin, '0 0 0', '1 1 1', "models/turrets/base-gib1.md3", min(self.respawntime, 20), 1, 1);
-        }
-
-        // Blow the top part up into the air
-        turret_trowgib2( self.origin + (v_up * 50), v_up * 150 + randomvec() * 50, '0.2 0.2 0.2', self.tur_head,time + 0.5 + (random() * 0.5));
-    }
-
 // Go boom
     //RadiusDamage (self,self, min(self.ammo,50),min(self.ammo,50) * 0.25,250,world,min(self.ammo,50)*5,DEATH_TURRET,world);
 
@@ -189,52 +37,26 @@ void turret_stdproc_die()
     else
     {
                // Setup respawn
-        self.nextthink      = time + self.respawntime;
-        self.think          = turret_stdproc_respawn;
+        self.SendFlags      |= TNSF_STATUS;
+        self.nextthink      = time + 0.2;
+        self.think          = turret_hide;
         
         if (self.turret_diehook)
             self.turret_diehook();
     }
 }
 
-var const float SUB_NullFloat();
 void turret_stdproc_respawn()
 {
     // Make sure all parts belong to the same team since
     // this function doubles as "teamchange" function.
-
     self.tur_head.team         = self.team;
-       self.colormod           = '0 0 0';
-
-       switch(self.team)
-       {
-        case COLOR_TEAM1: // Red
-            self.colormod = '1.4 0.8 0.8';
-            break;
-
-        case COLOR_TEAM2: // Blue
-            self.colormod = '0.8 0.8 1.4';
-            break;
-
-        case COLOR_TEAM3: // Yellow
-            self.colormod = '1.4 1.4 0.6';
-            break;
-
-        case COLOR_TEAM4: // Pink
-            self.colormod = '1.4 0.6 1.4';
-            break;
-       }
 
+    self.effects             &~= EF_NODRAW;
     self.deadflag           = DEAD_NO;
     self.effects            = EF_LOWPRECISION;
-    self.tur_head.effects   = self.effects;
     self.solid              = SOLID_BBOX;
-    self.alpha                                 = 1;
-    self.tur_head.alpha     = self.alpha;
     
-    self.customizeentityforclient                      = SUB_NullFloat;
-    self.tur_head.customizeentityforclient     = SUB_NullFloat;
-
     self.takedamage                    = DAMAGE_AIM;
     self.event_damage           = turret_stdproc_damage;
 
@@ -249,10 +71,11 @@ void turret_stdproc_respawn()
 
     self.nextthink  = time + self.ticrate;
     self.think      = turret_think;
+    
+    self.SendFlags  = TNSF_FULL_UPDATE;
 
     if (self.turret_respawnhook)
         self.turret_respawnhook();
-
 }
 
 /*
@@ -260,7 +83,6 @@ void turret_stdproc_respawn()
 */
 void turret_stdproc_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector vforce)
 {
-
     // Enougth allready!
     if (self.health <= 0)
         return;
@@ -289,12 +111,13 @@ void turret_stdproc_damage (entity inflictor, entity attacker, float damage, flo
     {
         self.tur_head.angles_x = self.tur_head.angles_x + (-0.5 + random()) * damage;
         self.tur_head.angles_y = self.tur_head.angles_y + (-0.5 + random()) * damage;
+        
+        self.SendFlags  |= TNSF_ANG;
+
     }
 
     if (self.turrcaps_flags & TFL_TURRCAPS_MOVE)
         self.velocity = self.velocity + vforce;
-
-    // FIXME: Better damage feedback?
     
     if (self.health <= 0)
     {
@@ -304,4 +127,6 @@ void turret_stdproc_damage (entity inflictor, entity attacker, float damage, flo
         self.nextthink = time;
         self.think = turret_stdproc_die;
     }
+    
+    self.SendFlags  |= TNSF_STATUS;
 }
index 9536064dfe2cc290db536be5e981669dcc4012b3..2bc9f929adfdd915daa7ef1a642a745a1d000e2b 100644 (file)
@@ -1,23 +1,79 @@
 #define cvar_base "g_turrets_unit_"
-
-/*
-float turret_customizeentityforclient()
-{
+.float clientframe;
+void turrets_setframe(float _frame, float client_only)
+{        
+    if((client_only ? self.clientframe : self.frame ) != _frame)
+    {
+        self.SendFlags |= TNSF_ANIM;
+        self.anim_start_time = time;
+    }
+    
+     if(client_only)
+        self.clientframe = _frame;
+    else
+        self.frame = _frame;
+   
 }
 
-float Turret_SendEntity(entity to, float sf)
+float turret_send(entity to, float sf)
 {
+       
+       WriteByte(MSG_ENTITY, ENT_CLIENT_TURRET);    
+       WriteByte(MSG_ENTITY, sf);
+       if(sf & TNSF_SETUP)
+       {
+           WriteByte(MSG_ENTITY, self.turret_type);
+           
+           WriteCoord(MSG_ENTITY, self.origin_x);
+           WriteCoord(MSG_ENTITY, self.origin_y);
+           WriteCoord(MSG_ENTITY, self.origin_z);
+           
+           WriteAngle(MSG_ENTITY, self.angles_x);
+           WriteAngle(MSG_ENTITY, self.angles_y);
+    }
+    
+    if(sf & TNSF_ANG)
+    {
+        WriteShort(MSG_ENTITY, rint(self.tur_head.angles_x));
+        WriteShort(MSG_ENTITY, rint(self.tur_head.angles_y));
+    }
+    
+    if(sf & TNSF_AVEL)
+    {        
+        WriteShort(MSG_ENTITY, rint(self.tur_head.avelocity_x));
+        WriteShort(MSG_ENTITY, rint(self.tur_head.avelocity_y));
+    }
+    
+    if(sf & TNSF_MOVE)
+    {
+        WriteShort(MSG_ENTITY, rint(self.origin_x));
+        WriteShort(MSG_ENTITY, rint(self.origin_y));
+        WriteShort(MSG_ENTITY, rint(self.origin_z));
 
-       WriteByte(MSG_ENTITY, ENT_CLIENT_TURRET);
-       WriteCoord(MSG_ENTITY, self.tur_head.angles_x);
-       WriteCoord(MSG_ENTITY, self.tur_head.angles_y);
-    WriteByte(MSG_ENTITY, self.tur_head.frame);
-
-       //WriteCoord(MSG_ENTITY, self.tur_head.angles_z);
-
+        WriteShort(MSG_ENTITY, rint(self.velocity_x));
+        WriteShort(MSG_ENTITY, rint(self.velocity_y));
+        WriteShort(MSG_ENTITY, rint(self.velocity_z));        
+        
+        WriteShort(MSG_ENTITY, rint(self.angles_y));        
+    }
+    
+    if(sf & TNSF_ANIM)
+    {
+        WriteCoord(MSG_ENTITY, self.anim_start_time);
+        WriteByte(MSG_ENTITY, self.frame);
+    }
+    
+    if(sf & TNSF_STATUS)
+    {        
+        WriteByte(MSG_ENTITY, self.team);
+        if(self.health <= 0)
+            WriteByte(MSG_ENTITY, 0);
+        else
+            WriteByte(MSG_ENTITY, rint((self.health / self.tur_health) * 255)); // Send health as 0-255 insted of real value, where 255 = 100%
+    }
+    
        return TRUE;
 }
-*/
 
 void load_unit_settings(entity ent, string unitname, float is_reload)
 {
@@ -84,7 +140,6 @@ void load_unit_settings(entity ent, string unitname, float is_reload)
             ent.turret_respawnhook();
 }
 
-
 /**
 ** updates enemy distances, predicted impact point/time
 ** and updated aim<->predict impact distance.
@@ -116,8 +171,6 @@ void turret_do_updates(entity t_turret)
             self.tur_dist_impact_to_aimpos = 0;
         else
             self.tur_dist_impact_to_aimpos = vlen(trace_endpos - self.tur_aimpos);
-
-
     }
     else
         tracebox(self.tur_shotorg, '-1 -1 -1','1 1 1', self.tur_shotorg + (self.tur_shotdir_updated * self.tur_dist_aimpos),MOVE_NORMAL,self);
@@ -199,12 +252,16 @@ vector turret_fovsearch_random()
 ** Handles head rotation according to
 ** the units .track_type and .track_flags
 **/
+.float turret_framecounter;
 void turret_stdproc_track()
 {
     vector target_angle; // This is where we want to aim
     vector move_angle;   // This is where we can aim
     float f_tmp;
-
+    vector v1, v2;
+    v1 = self.tur_head.angles;
+    v2 = self.tur_head.avelocity;
+    
     if (self.track_flags == TFL_TRACK_NO)
         return;
 
@@ -226,8 +283,11 @@ void turret_stdproc_track()
     self.tur_head.angles_y = anglemods(self.tur_head.angles_y);
 
     // Find the diffrence between where we currently aim and where we want to aim
-    move_angle = target_angle - (self.angles + self.tur_head.angles);
-    move_angle = shortangle_vxy(move_angle,(self.angles + self.tur_head.angles));
+    //move_angle = target_angle - (self.angles + self.tur_head.angles);
+    //move_angle = shortangle_vxy(move_angle,(self.angles + self.tur_head.angles));
+    
+    move_angle = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(self.angles), AnglesTransform_FromAngles(target_angle))) - self.tur_head.angles; 
+    move_angle = shortangle_vxy(move_angle, self.tur_head.angles);
 
     switch(self.track_type)
     {
@@ -252,7 +312,10 @@ void turret_stdproc_track()
                 if(self.tur_head.angles_y  < -self.aim_maxrot)
                     self.tur_head.angles_y = self.aim_maxrot;
             }
-
+            
+            // CSQC
+            self.SendFlags  = TNSF_ANG;
+            
             return;
 
         case TFL_TRACKTYPE_FLUIDINERTIA:
@@ -278,12 +341,16 @@ void turret_stdproc_track()
         {
             self.tur_head.avelocity_x = 0;
             self.tur_head.angles_x = self.aim_maxpitch;
+            
+            self.SendFlags  |= TNSF_ANG;
         }
         
         if((self.tur_head.angles_x + self.tur_head.avelocity_x * self.ticrate) < -self.aim_maxpitch)
         {
             self.tur_head.avelocity_x = 0;
             self.tur_head.angles_x = -self.aim_maxpitch;
+                        
+            self.SendFlags  |= TNSF_ANG;
         }
     }
 
@@ -296,14 +363,28 @@ void turret_stdproc_track()
         {
             self.tur_head.avelocity_y = 0;
             self.tur_head.angles_y = self.aim_maxrot;
+            
+            self.SendFlags  |= TNSF_ANG;
         }
 
         if((self.tur_head.angles_y + self.tur_head.avelocity_y * self.ticrate) < -self.aim_maxrot)
         {
             self.tur_head.avelocity_y = 0;
             self.tur_head.angles_y = -self.aim_maxrot;
+            
+            self.SendFlags  |= TNSF_ANG;
         }
     }
+        
+    self.SendFlags  |= TNSF_AVEL;
+    
+    // Force a angle update every 10'th frame
+    self.turret_framecounter += 1;
+    if(self.turret_framecounter >= 10)
+    {        
+        self.SendFlags |= TNSF_ANG;
+        self.turret_framecounter = 0;
+    }            
 }
 
 
@@ -607,7 +688,7 @@ void turret_think()
     entity e;
 
     self.nextthink = time + self.ticrate;
-
+    
     // ONS uses somewhat backwards linking.
     if (teamplay)
     {
@@ -636,10 +717,6 @@ void turret_think()
     if not (self.spawnflags & TSF_NO_AMMO_REGEN)
     if (self.ammo < self.ammo_max)
         self.ammo = min(self.ammo + self.ammo_recharge, self.ammo_max);
-
-    if (self.health < (self.tur_health * 0.5))
-               if(random() < 0.25)
-                       te_spark(self.origin + '0 0 40', randomvec() * 256 + '0 0 256', 16);
                        
     // Inactive turrets needs to run the think loop,
     // So they can handle animation and wake up if need be.
@@ -726,9 +803,11 @@ void turret_think()
             do_target_scan = 1;
 
         // Old target (if any) invalid?
+        if(self.target_validate_time < time)
         if (turret_validate_target(self, self.enemy, self.target_validate_flags) <= 0)
         {
                self.enemy = world;
+               self.target_validate_time = time + 0.5;
                do_target_scan = 1;
         }
 
@@ -830,9 +909,10 @@ void turret_stdproc_use()
 
 void turret_link()
 {
-    //Net_LinkEntity(self, FALSE, 0, Turret_SendEntity);
+    Net_LinkEntity(self, TRUE, 0, turret_send);
     self.think      = turret_think;
     self.nextthink  = time;
+    self.tur_head.effects = EF_NODRAW;
 }
 
 void turrets_manager_think()
@@ -863,15 +943,21 @@ void turrets_manager_think()
 * (unless you have a very good reason not to)
 * if the return value is 0, the turret should be removed.
 */
-float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base, string head)
+float turret_stdproc_init (string cvar_base_name, string base, string head, float _turret_type)
 {
        entity e, ee;
 
     // Are turrets allowed?
     if (autocvar_g_turrets == 0)
         return 0;
-
-
+    
+    if(_turret_type < 1 || _turret_type > TID_LAST)
+    {
+        dprint("Invalid / Unkown turret type\"", ftos(_turret_type), "\", aborting!\n");
+        return 0;
+    }    
+    self.turret_type = _turret_type;
+    
     e = find(world, classname, "turret_manager");
     if not (e)
     {
@@ -895,17 +981,20 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
         e.nextthink = time + 2;
     }
 
+    /*
     if(csqc_shared)
     {
         dprint("WARNING: turret requested csqc_shared but this is not implemented. Expect strange things to happen.\n");
         csqc_shared = 0;
     }
-
+    */
+    
     if not (self.spawnflags & TSF_SUSPENDED)
         droptofloor_builtin();
 
     // Terrainbase spawnflag. This puts a enlongated model
     // under the turret, so it looks ok on uneaven surfaces.
+    /*  TODO: Handle this with CSQC
     if (self.spawnflags & TSF_TERRAINBASE)
     {
         entity tb;
@@ -914,10 +1003,13 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
         setorigin(tb,self.origin);
         tb.solid = SOLID_BBOX;
     }
+    */
 
     self.cvar_basename = cvar_base_name;
-    load_unit_settings(self,self.cvar_basename, 0);
+    load_unit_settings(self, self.cvar_basename, 0);
 
+    self.effects = EF_NODRAW;
+    
     // Handle turret teams.
     if (autocvar_g_assault != 0)
     {
@@ -1107,7 +1199,6 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
 
     self.target_validate_flags = self.target_select_flags;
 
-
 // Ammo stuff
     if not (self.ammo_max)
         self.ammo_max = self.shot_dmg * 10;
@@ -1134,8 +1225,11 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
 
 // Offsets & origins
     if (!self.tur_shotorg)   self.tur_shotorg = '50 0 50';
+    
+    if (!self.health)
+        self.health = 150;
 
-// Gane hooks
+// Game hooks
        if(MUTATOR_CALLHOOK(TurretSpawn))
                return 0;
 
@@ -1156,9 +1250,6 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
     setorigin(self.tur_head, '0 0 0');
     setattachment(self.tur_head, self, "tag_head");
 
-    if (!self.health)
-        self.health = 150;
-
     self.tur_health          = self.health;
     self.solid               = SOLID_BBOX;
     self.tur_head.solid      = SOLID_NOT;
@@ -1185,35 +1276,19 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
     else
         self.idle_aim  = '0 0 0';
 
-    // Team color
-    if (self.team == COLOR_TEAM1) self.colormod = '1.4 0.8 0.8';
-    if (self.team == COLOR_TEAM2) self.colormod = '0.8 0.8 1.4';
-
     // Attach stdprocs. override when and what needed
+    self.turret_firecheckfunc   = turret_stdproc_firecheck;
+    self.turret_firefunc        = turret_stdproc_fire;
+    self.event_damage           = turret_stdproc_damage;
+    
     if (self.turrcaps_flags & TFL_TURRCAPS_SUPPORT)
-    {
         self.turret_score_target    = turret_stdproc_targetscore_support;
-        self.turret_firecheckfunc   = turret_stdproc_firecheck;
-        self.turret_firefunc        = turret_stdproc_fire;
-        self.event_damage           = turret_stdproc_damage;
-    }
     else
-    {
         self.turret_score_target    = turret_stdproc_targetscore_generic;
-        self.turret_firecheckfunc   = turret_stdproc_firecheck;
-        self.turret_firefunc        = turret_stdproc_fire;
-        self.event_damage           = turret_stdproc_damage;
-    }
 
     self.use = turret_stdproc_use;
     self.bot_attack = TRUE;
 
-    // Initiate the main AI loop
-    if(csqc_shared)
-        self.think     = turret_link;
-    else
-        self.think     = turret_think;
-
     ++turret_count;
     self.nextthink = time + 1;
     self.nextthink +=  turret_count * sys_frametime;
@@ -1244,8 +1319,13 @@ float turret_stdproc_init (string cvar_base_name, float csqc_shared, string base
         activator = ee;
         self.use();
     }
-       
+    
+       turret_link();
        turret_stdproc_respawn();
+           
+    if (!turret_tag_fire_update())
+        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
+    
     return 1;
 }
 
index 7b2875d7dc980d3dbc1b46163d3abcd278d76b6e..f97f1091faeea7353b472af2e194537275a0812d 100644 (file)
@@ -221,34 +221,6 @@ void turrets_precache_debug_models()
 
 void turrets_precash()
 {
-    precache_model ("models/turrets/base-gib1.md3");
-    precache_model ("models/turrets/base-gib2.md3");
-    precache_model ("models/turrets/base-gib3.md3");
-    precache_model ("models/turrets/base-gib4.md3");
-
-    precache_model ("models/turrets/head-gib1.md3");
-    precache_model ("models/turrets/head-gib2.md3");
-    precache_model ("models/turrets/head-gib3.md3");
-    precache_model ("models/turrets/head-gib4.md3");
-    precache_model ("models/turrets/terrainbase.md3");
-
-    //precache_model ("models/turrets/base.md3");
-    //precache_model ("models/turrets/flac.md3");
-    //precache_model ("models/turrets/pd_proj.md3");
-    //precache_model ("models/turrets/reactor.md3");
-    //precache_model ("models/turrets/mlrs_rocket.md3");
-    //precache_model ("models/turrets/hellion.md3");
-    //precache_model ("models/turrets/hunter2.md3");
-    //precache_model ("models/turrets/hk.md3");
-    //precache_model ("models/turrets/machinegun.md3");
-    //precache_model ("models/turrets/rocket.md3");
-    //precache_model ("models/turrets/mlrs.md3");
-    //precache_model ("models/turrets/phaser.md3");
-    //precache_model ("models/turrets/phaser_beam.md3");
-    //precache_model ("models/turrets/plasmad.md3");
-    //precache_model ("models/turrets/plasma.md3");
-    //precache_model ("models/turrets/tesla_head.md3");
-    //precache_model ("models/turrets/tesla_base.md3");
     #ifdef TURRET_DEBUG
        turrets_precache_debug_models();
        #endif
index 32c7856a3d25d5f19066ba2b09123f1ef8e945c2..316d45bbced89e0e467e7f8436bd5ecd7536a85e 100644 (file)
@@ -1,28 +1,14 @@
-/*
-.float target_select_flags; /// target selection flags
-float TFL_TARGETSELECT_NO            = 1;   /// Dont select a target on its own.
-float TFL_TARGETSELECT_LOS           = 2;   /// Need line of sight
-float TFL_TARGETSELECT_PLAYERS       = 4;   /// Players are valid targets
-float TFL_TARGETSELECT_MISSILES      = 8;   /// Missiles are valid targets
-float TFL_TARGETSELECT_TRIGGERTARGET = 16;  /// Responds to turret_trigger_target events
-float TFL_TARGETSELECT_ANGLELIMITS   = 32;  /// Angular limitations of turret head limits target selection
-float TFL_TARGETSELECT_RANGELIMTS    = 64;  /// Range limits apply in targetselection
-float TFL_TARGETSELECT_TEAMCHECK     = 128; /// Consider team own <-> targets team
-float TFL_TARGETSELECT_NOBUILTIN     = 256; /// Cant select targets on its own. needs to be triggerd or slaved.
-float TFL_TARGETSELECT_OWNTEAM       = 512;
-*/
-
-float turret_stdproc_targetscore_support(entity e_turret,entity e_target)
+float turret_stdproc_targetscore_support(entity _turret,entity _target)
 {
     float score;        // Total score
-    float s_score,d_score;
+    float s_score, d_score;
 
-    if (e_turret.enemy == e_target) s_score = 1;
+    if (_turret.enemy == _target) s_score = 1;
 
-    d_score = min(e_turret.target_range_optimal,tvt_dist) / max(e_turret.target_range_optimal,tvt_dist);
+    d_score = min(_turret.target_range_optimal,tvt_dist) / max(_turret.target_range_optimal,tvt_dist);
 
-    score = (d_score * e_turret.target_select_rangebias) +
-            (s_score * e_turret.target_select_samebias);
+    score = (d_score * _turret.target_select_rangebias) +
+            (s_score * _turret.target_select_samebias);
 
     return score;
 }
@@ -30,58 +16,35 @@ float turret_stdproc_targetscore_support(entity e_turret,entity e_target)
 /*
 * Generic bias aware score system.
 */
-float turret_stdproc_targetscore_generic(entity e_turret, entity e_target)
+float turret_stdproc_targetscore_generic(entity _turret, entity _target)
 {
-    //vector v_tmp;
     float d_dist;       // Defendmode Distance
-
     float score;        // Total score
-
     float d_score;      // Distance score
     float a_score;      // Angular score
     float m_score;      // missile score
     float p_score;      // player score
-    //float da_score;   // Distance from aimpoint score
-
     float ikr;          // ideal kill range
 
-    /*
-    if(!e_target) 
-               return 0;
-       */
-
-    if (e_turret.tur_defend)
+    if (_turret.tur_defend)
     {
-        d_dist = vlen(real_origin(e_target) - e_turret.tur_defend.origin);
-        ikr = vlen(e_turret.origin - e_turret.tur_defend.origin);
-        d_score = 1 - d_dist / e_turret.target_range;
+        d_dist = vlen(real_origin(_target) - _turret.tur_defend.origin);
+        ikr = vlen(_turret.origin - _turret.tur_defend.origin);
+        d_score = 1 - d_dist / _turret.target_range;
     }
     else
     {
         // Make a normlized value base on the targets distance from our optimal killzone
-        ikr = e_turret.target_range_optimal;
-        d_score = min(ikr,tvt_dist) / max(ikr,tvt_dist);
+        ikr = _turret.target_range_optimal;
+        d_score = min(ikr, tvt_dist) / max(ikr, tvt_dist);
     }
 
-    /*
-    // Determine the maximum time it could take this turrent to aim at someting.
-    max_aim_delay = (max(e_turret.aim_maxrot,e_turret.aim_maxpitch) / e_turret.aim_speed * 2);
-
-    // Find out how long it would take to aim at this taget.
-    aim_delay = (thadf+0.01) / e_turret.aim_speed;
-
-    // Turn this info into a normalized value.
-    aim_delay = (min(max_aim_delay,aim_delay) / max_aim_delay);
-    a_score = 1 - aim_delay;
-    */
-
-    //a_score = 1 - (tvt_thadf / max(e_turret.aim_maxrot,e_turret.aim_maxpitch));
-    a_score = 1 - tvt_thadf / e_turret.aim_maxrot;
+    a_score = 1 - tvt_thadf / _turret.aim_maxrot;
 
-    if ((e_turret.target_select_missilebias > 0) && (e_target.flags & FL_PROJECTILE))
+    if ((_turret.target_select_missilebias > 0) && (_target.flags & FL_PROJECTILE))
         m_score = 1;
 
-    if ((e_turret.target_select_playerbias > 0) && (e_target.flags & FL_CLIENT))
+    if ((_turret.target_select_playerbias > 0) && (_target.flags & FL_CLIENT))
         p_score = 1;
 
     d_score = max(d_score, 0);
@@ -89,12 +52,12 @@ float turret_stdproc_targetscore_generic(entity e_turret, entity e_target)
     m_score = max(m_score, 0);
     p_score = max(p_score, 0);
 
-    score = (d_score * e_turret.target_select_rangebias) +
-            (a_score * e_turret.target_select_anglebias) +
-            (m_score * e_turret.target_select_missilebias) +
-            (p_score * e_turret.target_select_playerbias);
+    score = (d_score * _turret.target_select_rangebias) +
+            (a_score * _turret.target_select_anglebias) +
+            (m_score * _turret.target_select_missilebias) +
+            (p_score * _turret.target_select_playerbias);
 
-    if(e_turret.target_range < vlen(e_turret.tur_shotorg - real_origin(e_target)))
+    if(_turret.target_range < vlen(_turret.tur_shotorg - real_origin(_target)))
     {
         dprint("Wtf?\n");
         score *= 0.001;
@@ -105,28 +68,28 @@ float turret_stdproc_targetscore_generic(entity e_turret, entity e_target)
     string sdt,sat,smt,spt;
 
     sd = ftos(d_score);
-    d_score *= e_turret.target_select_rangebias;
+    d_score *= _turret.target_select_rangebias;
     sdt = ftos(d_score);
 
     //sv = ftos(v_score);
-    //v_score *= e_turret.target_select_samebias;
+    //v_score *= _turret.target_select_samebias;
     //svt = ftos(v_score);
 
     sa = ftos(a_score);
-    a_score *= e_turret.target_select_anglebias;
+    a_score *= _turret.target_select_anglebias;
     sat = ftos(a_score);
 
     sm = ftos(m_score);
-    m_score *= e_turret.target_select_missilebias;
+    m_score *= _turret.target_select_missilebias;
     smt = ftos(m_score);
 
     sp = ftos(p_score);
-    p_score *= e_turret.target_select_playerbias;
+    p_score *= _turret.target_select_playerbias;
     spt = ftos(p_score);
 
 
     ss = ftos(score);
-    bprint("^3Target scores^7 \[  ",e_turret.netname, "  \] ^3for^7 \[  ", e_target.netname,"  \]\n");
+    bprint("^3Target scores^7 \[  ",_turret.netname, "  \] ^3for^7 \[  ", _target.netname,"  \]\n");
     bprint("^5Range:\[  ",sd,  "  \]^2+bias:\[  ",sdt,"  \]\n");
     bprint("^5Angle:\[  ",sa,  "  \]^2+bias:\[  ",sat,"  \]\n");
     bprint("^5Missile:\[  ",sm,"  \]^2+bias:\[  ",smt,"  \]\n");
@@ -139,29 +102,29 @@ float turret_stdproc_targetscore_generic(entity e_turret, entity e_target)
 }
 
 /*
-float turret_stdproc_targetscore_close(entity e_turret,entity e_target)
+float turret_stdproc_targetscore_close(entity _turret,entity _target)
 {
-    return 1 - (tvt_dist / e_turret.target_range);
+    return 1 - (tvt_dist / _turret.target_range);
 }
 
-float turret_stdproc_targetscore_far (entity e_turret,entity e_target)
+float turret_stdproc_targetscore_far (entity _turret,entity _target)
 {
-    return  tvt_dist / e_turret.target_range;
+    return  tvt_dist / _turret.target_range;
 }
 
-float turret_stdproc_targetscore_optimal(entity e_turret,entity e_target)
+float turret_stdproc_targetscore_optimal(entity _turret,entity _target)
 {
-    return  min(e_turret.target_range_optimal,tvt_dist) / max(e_turret.target_range_optimal,tvt_dist);
+    return  min(_turret.target_range_optimal,tvt_dist) / max(_turret.target_range_optimal,tvt_dist);
 }
 
-float turret_stdproc_score_angular(entity e_turret,entity e_target)
+float turret_stdproc_score_angular(entity _turret,entity _target)
 {
-    return 1 - (tvt_thadf / e_turret.aim_maxrot);
+    return 1 - (tvt_thadf / _turret.aim_maxrot);
 }
 
-float turret_stdproc_targetscore_defend(entity e_turret,entity e_target)
+float turret_stdproc_targetscore_defend(entity _turret,entity _target)
 {
     return 0;
-    //min(e_target.origin,e_turret.tur_defend.origin) / max(e_target.origin,e_turret.tur_defend.origin);
+    //min(_target.origin,_turret.tur_defend.origin) / max(_target.origin,_turret.tur_defend.origin);
 }
 */
index 8a581ea39995a28d02fb5a30671317c5bf718d1f..481b4a285d4d3f5816ab37d01cd24db31652d364 100644 (file)
@@ -33,6 +33,15 @@ void turret_checkpoint_use()
 {
 }
 
+#if 0
+void turret_checkpoint_think()
+{
+    if(self.enemy)
+        te_lightning1(self,self.origin, self.enemy.origin);
+    
+    self.nextthink = time + 0.25;
+}
+#endif
 /*QUAKED turret_checkpoint (1 0 1) (-32 -32 -32) (32 32 32)
 -----------KEYS------------
 target: .targetname of next waypoint in chain.
@@ -42,24 +51,28 @@ wait:   Pause at this point # seconds.
 If a loop is of targets are formed, any unit entering this loop will patrol it indefinitly.
 If the checkpoint chain in not looped, the unit will go "Roaming" when the last point is reached.
 */
+//float tc_acum;
 void turret_checkpoint_init()
 {
-    traceline(self.origin, self.origin - '0 0 1024', MOVE_WORLDONLY, self);
-    setorigin(self,trace_endpos + '0 0 8');
+    traceline(self.origin + '0 0 16', self.origin - '0 0 1024', MOVE_WORLDONLY, self);
+    setorigin(self, trace_endpos + '0 0 32');
 
     if(self.target != "")
     {
-        self.enemy = find(world,targetname,self.target);
+        self.enemy = find(world, targetname, self.target);
         if(self.enemy == world)
             dprint("A turret_checkpoint faild to find its target!\n");
     }
+    //self.think = turret_checkpoint_think;
+    //self.nextthink = time + tc_acum + 0.25;
+    //tc_acum += 0.25;
 }
 
 void spawnfunc_turret_checkpoint()
 {
     setorigin(self,self.origin);
     self.think = turret_checkpoint_init;
-    self.nextthink = time + 0.1;
+    self.nextthink = time + 0.2;    
 }
 
 // Compat.
index 02c0ffa6016291288e71014f89b9dd53574f9c57..a58fe449117138649ff10b6211a2f340453627d8 100644 (file)
@@ -4,36 +4,17 @@
 #define ewheel_amin_bck_slow 3
 #define ewheel_amin_bck_fast 4
 
-float ewheel_speed_fast;
-float ewheel_speed_slow;
-float ewheel_speed_slower;
-float ewheel_speed_stop;
-
-void turret_ewheel_loadcvars()
-{
-    ewheel_speed_fast   = autocvar_g_turrets_unit_ewheel_speed_fast;
-    ewheel_speed_slow   = autocvar_g_turrets_unit_ewheel_speed_slow;
-    ewheel_speed_slower = autocvar_g_turrets_unit_ewheel_speed_slower;
-    ewheel_speed_stop   = autocvar_g_turrets_unit_ewheel_speed_stop;
-}
-
 void turret_ewheel_projectile_explode()
 {
-    vector org2;
-
-    org2 = findbetterlocation (self.origin, 8);
-    pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1);
-    //w_deathtypestring = "saw the eweel. to late.";
 #ifdef TURRET_DEBUG
     float d;
 
-    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_EWHEEL, world);
     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d;
     self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
 #else
-    RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_EWHEEL, world);
 #endif
-    sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
 
     remove (self);
 }
@@ -76,10 +57,10 @@ void ewheel_attack()
     }
 
 }
-
+//#define EWHEEL_FANCYPATH
 void ewheel_move_path()
 {
-
+#ifdef EWHEEL_FANCYPATH
     // Are we close enougth to a path node to switch to the next?
     if (vlen(self.origin  - self.pathcurrent.origin) < 64)
         if (self.pathcurrent.path_next == world)
@@ -105,7 +86,10 @@ void ewheel_move_path()
         else
             self.pathcurrent = self.pathcurrent.path_next;
 
-
+#else
+    if (vlen(self.origin - self.pathcurrent.origin) < 64)    
+        self.pathcurrent = self.pathcurrent.enemy;
+#endif
 
     if (self.pathcurrent)
     {
@@ -113,15 +97,15 @@ void ewheel_move_path()
         self.moveto = self.pathcurrent.origin;
         self.steerto = steerlib_attract2(self.moveto, 0.5, 500, 0.95);
 
-        movelib_move_simple(v_forward, ewheel_speed_fast, 0.4);
-
-        return;
+        movelib_move_simple(v_forward, autocvar_g_turrets_unit_ewheel_speed_fast, 0.4);
     }
 }
 
 void  ewheel_move_enemy()
 {
 
+    float newframe;
+    
     self.steerto = steerlib_arrive(self.enemy.origin,self.target_range_optimal);
 
     //self.steerto = steerlib_standoff(self.enemy.origin,self.target_range_optimal);
@@ -132,75 +116,75 @@ void  ewheel_move_enemy()
     {
         if ( self.tur_head.spawnshieldtime < 1 )
         {
-            self.frame = ewheel_amin_fwd_fast;
-            movelib_move_simple(v_forward, ewheel_speed_fast, 0.4);
+            newframe = ewheel_amin_fwd_fast;
+            movelib_move_simple(v_forward, autocvar_g_turrets_unit_ewheel_speed_fast, 0.4);
         }
         else if (self.tur_head.spawnshieldtime < 2)
         {
 
-            self.frame = ewheel_amin_fwd_slow;
-            movelib_move_simple(v_forward, ewheel_speed_slow, 0.4);
+            newframe = ewheel_amin_fwd_slow;
+            movelib_move_simple(v_forward, autocvar_g_turrets_unit_ewheel_speed_slow, 0.4);
        }
         else
         {
-            self.frame = ewheel_amin_fwd_slow;
-            movelib_move_simple(v_forward, ewheel_speed_slower, 0.4);
+            newframe = ewheel_amin_fwd_slow;
+            movelib_move_simple(v_forward, autocvar_g_turrets_unit_ewheel_speed_slower, 0.4);
         }
     }
     else if (self.tur_dist_enemy < self.target_range_optimal * 0.5)
     {
-        self.frame = ewheel_amin_bck_slow;
-        movelib_move_simple(v_forward * -1, ewheel_speed_slow, 0.4);
+        newframe = ewheel_amin_bck_slow;
+        movelib_move_simple(v_forward * -1, autocvar_g_turrets_unit_ewheel_speed_slow, 0.4);
     }
     else
     {
-        self.frame = ewheel_amin_stop;
-        movelib_beak_simple(ewheel_speed_stop);
+        newframe = ewheel_amin_stop;
+        movelib_beak_simple(autocvar_g_turrets_unit_ewheel_speed_stop);
+    }
+    
+    if(self.frame != newframe)
+    {
+        self.frame = newframe;
+        self.SendFlags |= TNSF_ANIM;
+        self.anim_start_time = time;
     }
 }
 
 
 void ewheel_move_idle()
 {
+    if(self.frame != 0)
+    {
+        self.SendFlags |= TNSF_ANIM;
+        self.anim_start_time = time;
+    }
+
     self.frame = 0;
     if (vlen(self.velocity))
-        movelib_beak_simple(ewheel_speed_stop);
+        movelib_beak_simple(autocvar_g_turrets_unit_ewheel_speed_stop);
 }
 
 void ewheel_postthink()
 {
     float vz;
-    vector wish_angle,real_angle;
-
-    /*
-    if(self.enemy)
-        dprint("enemy!\n");
-    else
-        dprint("nothign =(!\n");
-    */
+    vector wish_angle, real_angle;
 
     vz = self.velocity_z;
 
     self.angles_x = anglemods(self.angles_x);
     self.angles_y = anglemods(self.angles_y);
 
-    //self.angles_x *= -1;
     fixedmakevectors(self.angles);
-    //self.angles_x *= -1;
 
     wish_angle = normalize(self.steerto);
     wish_angle = vectoangles(wish_angle);
     real_angle = wish_angle - self.angles;
-    real_angle = shortangle_vxy(real_angle,self.tur_head.angles);
+    real_angle = shortangle_vxy(real_angle, self.tur_head.angles);
 
     self.tur_head.spawnshieldtime = fabs(real_angle_y);
-    real_angle_y  = bound(-self.tur_head.aim_speed,real_angle_y,self.tur_head.aim_speed);
+    real_angle_y  = bound(-self.tur_head.aim_speed, real_angle_y, self.tur_head.aim_speed);
     self.angles_y = (self.angles_y + real_angle_y);
 
-    // Simulate banking
-    self.angles_z -= self.angles_z * frametime * 2;
-    self.angles_z = bound(-45,self.angles_z  + ((real_angle_y * -25) * frametime),45);
-
     if(self.enemy)
         ewheel_move_enemy();
     else if(self.pathcurrent)
@@ -210,6 +194,9 @@ void ewheel_postthink()
 
 
     self.velocity_z = vz;
+    
+    if(vlen(self.velocity))
+        self.SendFlags |= TNSF_MOVE;
 }
 
 void ewheel_respawnhook()
@@ -217,7 +204,7 @@ void ewheel_respawnhook()
     entity e;
 
     // Respawn is called & first spawn to, to set team. need to make sure we do not move the initial spawn.
-    if(self.movetype  != MOVETYPE_WALK)
+    if(self.movetype != MOVETYPE_WALK)
                return;
                
     self.velocity = '0 0 0';
@@ -238,8 +225,13 @@ void ewheel_respawnhook()
             dprint("Warning: not a turrret path\n");
         else
         {
+
+#ifdef EWHEEL_FANCYPATH
             self.pathcurrent = WALKER_PATH(self.origin,e.origin);
             self.pathgoal = e;
+#else
+            self.pathcurrent  = e;
+#endif
         }
     }
 }
@@ -248,11 +240,10 @@ void ewheel_diehook()
 {
     self.velocity = '0 0 0';
 
-    turret_trowgib2(self.origin, self.velocity + '0 0 400', '-0.6 -0.2 -02', self, 3 + time + random() * 2);
-
+#ifdef EWHEEL_FANCYPATH
     if (self.pathcurrent)
         pathlib_deletepath(self.pathcurrent.owner);
-
+#endif
     self.pathcurrent = world;
 }
 
@@ -260,7 +251,8 @@ void turret_ewheel_dinit()
 {
     entity e;
 
-    if (self.netname == "")      self.netname     = "eWheel Turret";
+    if (self.netname == "")      
+        self.netname     = "eWheel Turret";
 
     if (self.target != "")
     {
@@ -283,16 +275,15 @@ void turret_ewheel_dinit()
 
     self.turret_diehook = ewheel_diehook;
 
-    if (turret_stdproc_init("ewheel_std",0,"models/turrets/ewheel-base2.md3","models/turrets/ewheel-gun1.md3") == 0)
+    if (turret_stdproc_init("ewheel_std", "models/turrets/ewheel-base2.md3", "models/turrets/ewheel-gun1.md3", TID_EWHEEL) == 0)
     {
         remove(self);
         return;
     }
 
     self.target_select_flags   = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
-    self.target_select_flags   = TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
-    self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;// | TFL_TARGETSELECT_LOS;
-    self.target_validate_flags = TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;// | TFL_TARGETSELECT_LOS;
+    self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
+
     self.damage_flags          |= TFL_DMG_DEATH_NOGIBS;
 
     self.iscreature = TRUE;
@@ -314,9 +305,6 @@ void turret_ewheel_dinit()
     self.tur_head.aim_speed = autocvar_g_turrets_unit_ewheel_turnrate;
     self.tur_head.aim_speed = self.tur_head.aim_speed / (1 / self.ticrate);
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     //setorigin(self,self.origin + '0 0 128');
     if (self.target != "")
     {
@@ -331,8 +319,12 @@ void turret_ewheel_dinit()
             dprint("Warning: not a turrret path\n");
         else
         {
+#ifdef EWHEEL_FANCYPATH
             self.pathcurrent = WALKER_PATH(self.origin, e.origin);
             self.pathgoal = e;
+#else
+            self.pathcurrent = e;
+#endif
         }
     }
 }
@@ -344,12 +336,6 @@ void spawnfunc_turret_ewheel()
     precache_model ("models/turrets/ewheel-base2.md3");
     precache_model ("models/turrets/ewheel-gun1.md3");
 
-    precache_model ("models/pathlib/goodsquare.md3");
-    precache_model ("models/pathlib/badsquare.md3");
-    precache_model ("models/pathlib/square.md3");
-
-    turret_ewheel_loadcvars();
-
     self.think = turret_ewheel_dinit;
     self.nextthink = time + 0.5;
 }
index 0c874fb504d99f5d14534a6978b9a7bb9b975448..cf921322238a6e830c89a4a1d0021ceb0b3bd7d7 100644 (file)
@@ -38,43 +38,21 @@ void turret_flac_attack()
 
 void turret_flac_projectile_explode()
 {
-    float ftmp;
-
-    // FIXME: tur_impacttime is not accurate enougth, this is a dirty hakk to make flac work.
-
-    //w_deathtypestring = "got caught in the flack.";
-
-
-
     if( (self.enemy != world) &&
         (vlen(self.origin - self.enemy.origin) < self.owner.shot_radius * 3) )
     {
         // OMG HAXX!
         setorigin(self,self.enemy.origin + randomvec() * self.owner.shot_radius);
     }
-
-
-
-    te_explosion (self.origin);
-
-    ftmp = crandom();
-    if (ftmp<-0.7)
-        sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
-    else if (ftmp<0.4)
-        sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
-    else if (ftmp<1)
-        sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
-
-
     self.event_damage = SUB_Null;
 
-
 #ifdef TURRET_DEBUG
-    ftmp = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    float ftmp;
+    ftmp = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_FLAC, world);
     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + ftmp; //self.owner.shot_dmg;
     self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
 #else
-    RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_FLAC, world);
 #endif
 
     remove (self);
@@ -89,7 +67,7 @@ void turret_flac_dinit()
     self.ammo_flags     = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
     self.aim_flags      = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE;
 
-    if (turret_stdproc_init("flac_std",0,"models/turrets/base.md3","models/turrets/flac.md3") == 0)
+    if (turret_stdproc_init("flac_std", "models/turrets/base.md3", "models/turrets/flac.md3", TID_FLAC) == 0)
     {
         remove(self);
         return;
@@ -99,8 +77,6 @@ void turret_flac_dinit()
     self.damage_flags |= TFL_DMG_HEADSHAKE;
     self.target_select_flags |= TFL_TARGETSELECT_NOTURRETS | TFL_TARGETSELECT_MISSILESONLY;
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
 
     // Our fire routine
     self.turret_firefunc  = turret_flac_attack;
index 03b0c40ad91cc49b873ee48344a18c250d6eeb0a..e499a29c617e80f4851f82e047fdc4c2c5bdc6db 100644 (file)
@@ -68,7 +68,7 @@ void turret_fusionreactor_dinit()
     self.track_flags         = TFL_TRACK_NO;
     // self.turret_respawnhook  = turret_fusionreactor_respawnhook;
 
-    if (turret_stdproc_init("fusreac_std",0,"models/turrets/base.md3","models/turrets/reactor.md3") == 0)
+    if (turret_stdproc_init("fusreac_std", "models/turrets/base.md3", "models/turrets/reactor.md3", TID_FUSION) == 0)
     {
         remove(self);
         return;
index 1e2890f6ea6c9bce6d1653bd1b5989d9c4b5c8b4..b1dc47bf1c794c0d064cdc7db08cdb251afa8030 100644 (file)
@@ -135,7 +135,6 @@ void turret_hellion_missile_think()
 
 void turret_hellion_missile_explode()
 {
-    vector org2;
     float d;
 
     if(self.event_damage != SUB_Null)
@@ -146,19 +145,8 @@ void turret_hellion_missile_explode()
         return;
     }
 
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    org2 = findbetterlocation (self.origin, 16);
-
-    // LordHavoc: TE_TEI_BIGEXPLOSION
-    WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
-    WriteByte (MSG_BROADCAST, 78);
-    WriteCoord (MSG_BROADCAST, org2_x);
-    WriteCoord (MSG_BROADCAST, org2_y);
-    WriteCoord (MSG_BROADCAST, org2_z);
-
-    //w_deathtypestring = "could not dodge the twin missiles.";
     self.event_damage = SUB_Null;
-    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_HELLION, world);
 
 #ifdef TURRET_DEBUG
     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
@@ -188,15 +176,12 @@ void turret_hellion_dinit()
     self.firecheck_flags = TFL_FIRECHECK_WORLD | TFL_FIRECHECK_DEAD | TFL_FIRECHECK_DISTANCES | TFL_FIRECHECK_TEAMCECK | TFL_FIRECHECK_REFIRE | TFL_FIRECHECK_AFF | TFL_FIRECHECK_OWM_AMMO;
     self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
 
-    if (turret_stdproc_init("hellion_std",0,"models/turrets/base.md3","models/turrets/hellion.md3") == 0)
+    if (turret_stdproc_init("hellion_std", "models/turrets/base.md3", "models/turrets/hellion.md3", TID_HELLION) == 0)
     {
         remove(self);
         return;
     }
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     self.turret_firefunc  = turret_hellion_attack;
     self.turret_postthink = turret_hellion_postthink;
 }
index 2b8e0f6a38089da861aa43ef9c2f1524a0163cd4..a9ecd2a39f60b0d48d85d7ac373da330760120a6 100644 (file)
@@ -324,7 +324,6 @@ void turret_hk_missile_think()
 
 void turret_hk_missile_explode()
 {
-    vector org2;
     float d;
 
     if(self.event_damage != SUB_Null)
@@ -338,20 +337,8 @@ void turret_hk_missile_explode()
     if ((other == self.owner)||(other == self.owner.tur_head))
         return;
 
-    //w_deathtypestring = "got hunted to extinction";
-    //vector   org2;
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    org2 = findbetterlocation (self.origin, 16);
-
-    // LordHavoc: TE_TEI_BIGEXPLOSION
-    WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
-    WriteByte (MSG_BROADCAST, 78);
-    WriteCoord (MSG_BROADCAST, org2_x);
-    WriteCoord (MSG_BROADCAST, org2_y);
-    WriteCoord (MSG_BROADCAST, org2_z);
-
     self.event_damage = SUB_Null;
-    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_HK, world);
 
 #ifdef TURRET_DEBUG
     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
@@ -408,7 +395,7 @@ void turret_hk_dinit()
 
     self.shoot_flags = TFL_SHOOT_CLEARTARGET;
 
-    if (turret_stdproc_init("hk_std",0,"models/turrets/base.md3","models/turrets/hk.md3") == 0)
+    if (turret_stdproc_init("hk_std", "models/turrets/base.md3", "models/turrets/hk.md3", TID_HK) == 0)
     {
         remove(self);
         return;
@@ -416,10 +403,6 @@ void turret_hk_dinit()
 
     self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_TEAMCHECK;
 
-
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     // Our fire routine
     self.turret_firefunc  = turret_hk_attack;
 
index f6426fce25efdab96a268ee0f6b1a513db1bd7ae..f96d3b93cc79911ba5e7036da81f49a92858f6ec 100644 (file)
@@ -5,13 +5,9 @@ void turret_machinegun_attack();
 //.float bulletcounter;
 void turret_machinegun_attack()
 {
-    sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
-    fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, autocvar_g_balance_uzi_bulletconstant);
+    fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET_MACHINEGUN, 0, 1, autocvar_g_balance_uzi_bulletconstant);
     endFireBallisticBullet();
 
-    //w_deathtypestring = "had an alergic reaction due to 10 kilos of led";
-    te_smallflash(self.tur_shotorg);
-
     UziFlash();
     setattachment(self.muzzle_flash, self.tur_head, "tag_fire");
 }
@@ -28,7 +24,7 @@ void turret_machinegun_std_init()
        if not (autocvar_g_antilag_bullets)
                self.turrcaps_flags |= TFL_TURRCAPS_HITSCAN;
 
-    if (turret_stdproc_init("machinegun_std",0,"models/turrets/base.md3","models/turrets/machinegun.md3") == 0)
+    if (turret_stdproc_init("machinegun_std", "models/turrets/base.md3", "models/turrets/machinegun.md3", TID_MACHINEGUN) == 0)
     {
         remove(self);
         return;
@@ -36,9 +32,6 @@ void turret_machinegun_std_init()
 
     self.damage_flags |= TFL_DMG_HEADSHAKE;
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     // Our fire routine
     self.turret_firefunc  = turret_machinegun_attack;
 
index 499d6de2352c15c55d591d762cca0d40eb1f32f1..ee34c94add23888bc4ca177987fb3e9c07d01775 100644 (file)
@@ -61,7 +61,6 @@ void turret_mlrs_rocket_touch()
 
 void turret_mlrs_rocket_explode()
 {
-    vector org2;
 
     if(self.event_damage != SUB_Null)
     {
@@ -71,19 +70,14 @@ void turret_mlrs_rocket_explode()
         return;
     }
 
-
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    org2 = findbetterlocation (self.origin, 16);
-    pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
-    //w_deathtypestring = "dident escape the rocket barrage";
 #ifdef TURRET_DEBUG
     float d;
 
-    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_MLRS, world);
     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
     self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
 #else
-    RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    RadiusDamage (self, self.owner, self.owner.shot_dmg, self.owner.shot_dmg * 0.5, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_MLRS, world);
 #endif
 
     // Target dead, Tell turret.
@@ -101,7 +95,7 @@ void turret_mlrs_dinit()
     self.ammo_flags = TFL_AMMO_ROCKETS | TFL_AMMO_RECHARGE;
     self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE;// | TFL_AIM_GROUND2;
 
-    if (turret_stdproc_init("mlrs_std",0,"models/turrets/base.md3","models/turrets/mlrs.md3") == 0)
+    if (turret_stdproc_init("mlrs_std", "models/turrets/base.md3", "models/turrets/mlrs.md3", TID_MLRS) == 0)
     {
         remove(self);
         return;
@@ -111,9 +105,6 @@ void turret_mlrs_dinit()
     self.shoot_flags  |= TFL_SHOOT_VOLLYALWAYS;
     self.volly_counter = self.shot_volly;
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     // Our fire routine
     self.turret_firefunc  = turret_mlrs_attack;
     self.turret_postthink = turret_mlrs_postthink;
index 9c5ca071d8d5ce8489f233986ba62fe6577a2684..b1c7d34c87b4929925a09b421579cd14a5687c34 100644 (file)
@@ -68,7 +68,7 @@ void beam_think()
                     self.shot_force,
                     oldself.shot_dmg,
                     0.75,
-                    DEATH_TURRET);
+                    DEATH_TURRET_PHASER);
     self = oldself;
     self.scale = vlen(self.owner.tur_shotorg - trace_endpos) / 256;
 
@@ -116,15 +116,12 @@ void turret_phaser_dinit()
     self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
     self.aim_flags = TFL_AIM_LEAD;
 
-    if (turret_stdproc_init("phaser_std",0,"models/turrets/base.md3","models/turrets/phaser.md3") == 0)
+    if (turret_stdproc_init("phaser_std", "models/turrets/base.md3","models/turrets/phaser.md3", TID_PHASER) == 0)
     {
         remove(self);
         return;
     }
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     self.turret_firecheckfunc = turret_phaser_firecheck;
     self.turret_firefunc  = turret_phaser_attack;
     self.turret_postthink = turret_phaser_postthink;
index 63466084a54d88a1bda1ef292bcb3f24f1a4dc8f..ff1221992c0c2ba09308386c2f01627c31da9fda 100644 (file)
@@ -84,31 +84,17 @@ void turret_plasma_dual_attack()
 
 void turret_plasma_projectile_explode()
 {
-    vector org2;
-
-    org2 = findbetterlocation (self.origin, 8);
-    WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);
-    WriteByte (MSG_BROADCAST, 79);
-    WriteCoord (MSG_BROADCAST, org2_x);
-    WriteCoord (MSG_BROADCAST, org2_y);
-    WriteCoord (MSG_BROADCAST, org2_z);
-    WriteCoord (MSG_BROADCAST, 0);             // SeienAbunae: groan... Useless clutter
-    WriteCoord (MSG_BROADCAST, 0);
-    WriteCoord (MSG_BROADCAST, 0);
-    WriteByte (MSG_BROADCAST, 155);
-
     self.event_damage = SUB_Null;
     //w_deathtypestring = "ate to much plasma";
 #ifdef TURRET_DEBUG
     float d;
 
-    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_PLASMA, world);
     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;
     self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;
 #else
-    RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);
+    RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET_PLASMA, world);
 #endif
-    sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
 
     remove (self);
 }
@@ -124,7 +110,7 @@ void turret_plasma_std_init()
     self.aim_flags      = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_GROUND2;
     self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_MEDPROJ | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MISSILEKILL;
 
-    if (turret_stdproc_init("plasma_std",FALSE,"models/turrets/base.md3","models/turrets/plasma.md3") == 0)
+    if (turret_stdproc_init("plasma_std", "models/turrets/base.md3", "models/turrets/plasma.md3", TID_PLASMA) == 0)
     {
         remove(self);
         return;
@@ -133,9 +119,6 @@ void turret_plasma_std_init()
     self.damage_flags    |= TFL_DMG_HEADSHAKE;
     self.firecheck_flags |= TFL_FIRECHECK_AFF;
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     // Our fireing routine
     self.turret_firefunc  = turret_plasma_attack;
 
@@ -156,7 +139,7 @@ void turret_plasma_dual_init()
     self.aim_flags      = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE  | TFL_AIM_GROUND2 ;
     self.turrcaps_flags = TFL_TURRCAPS_RADIUSDMG | TFL_TURRCAPS_MEDPROJ | TFL_TURRCAPS_PLAYERKILL;
 
-    if (turret_stdproc_init("plasma_dual",0,"models/turrets/base.md3","models/turrets/plasmad.md3") == 0)
+    if (turret_stdproc_init("plasma_dual", "models/turrets/base.md3", "models/turrets/plasmad.md3", TID_PLASMA_DUAL) == 0)
     {
         remove(self);
         return;
@@ -165,9 +148,6 @@ void turret_plasma_dual_init()
     self.damage_flags    |= TFL_DMG_HEADSHAKE;
     self.firecheck_flags |= TFL_FIRECHECK_AFF;
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     // Our fireing routine
     self.turret_firefunc  = turret_plasma_dual_attack;
 
index 443cd8b5626ef15645bdb0beb8c76c6811979dae..23c34dc5db023f6499b5f493690589c52f793ba2 100644 (file)
@@ -35,11 +35,9 @@ entity toast(entity from, float range, float damage)
     }
 
     if (etarget)
-    {
-        te_smallflash(etarget.origin);
+    {        
         te_csqc_lightningarc(from.origin,etarget.origin);
-        dprint("DMG:",ftos(damage),"\n");
-        Damage(etarget, self, self, damage, DEATH_TURRET, etarget.origin, '0 0 0');
+        Damage(etarget, self, self, damage, DEATH_TURRET_TESLA, etarget.origin, '0 0 0');
         etarget.railgunhit = 1;
     }
 
@@ -145,7 +143,7 @@ void turret_tesla_dinit()
     self.aim_flags           = TFL_AIM_NO;
     self.track_flags         = TFL_TRACK_NO;
 
-    if (turret_stdproc_init("tesla_std",0,"models/turrets/tesla_base.md3","models/turrets/tesla_head.md3") == 0)
+    if (turret_stdproc_init("tesla_std", "models/turrets/tesla_base.md3", "models/turrets/tesla_head.md3", TID_TESLA) == 0)
     {
         remove(self);
         return;
@@ -155,9 +153,6 @@ void turret_tesla_dinit()
     self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
                                  TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     self.turret_firefunc      = turret_tesla_fire;
     self.turret_postthink     = turret_tesla_postthink;
     self.turret_firecheckfunc = turret_tesla_firecheck;
index d1d48c46cdb82b4f5d90746ea7ab8c5d42afe041..2a9078887d4c42700f2957a021552db453f266fd 100644 (file)
 #define ANIM_MEELE      9
 #define ANIM_SWIM       10
 #define ANIM_ROAM       11
-
 .float animflag;
-.entity wkr_spawn;
 
 #define WALKER_MIN '-70 -70 0'
 #define WALKER_MAX '70 70 95'
 
 #define WALKER_PATH(s,e) pathlib_astar(s,e)
 
-float walker_meele_dmg;
-float walker_meele_force;
-
-float walker_speed_stop;
-float walker_speed_walk;
-float walker_speed_run;
-float walker_speed_jump;
-float walker_speed_roam;
-float walker_speed_swim;
-
-float walker_std_rocket_dmg;
-float walker_std_rocket_radius;
-float walker_std_rocket_force;
-float walker_std_rocket_speed;
-float walker_std_rocket_turnrate;
-
-void walker_loadcvars()
-{
-    walker_meele_dmg    = autocvar_g_turrets_unit_walker_std_meele_dmg;
-    walker_meele_force  = autocvar_g_turrets_unit_walker_std_meele_force;
-
-    walker_speed_stop   = autocvar_g_turrets_unit_walker_speed_stop;
-    walker_speed_walk   = autocvar_g_turrets_unit_walker_speed_walk;
-    walker_speed_run    = autocvar_g_turrets_unit_walker_speed_run;
-    walker_speed_jump   = autocvar_g_turrets_unit_walker_speed_jump;
-    walker_speed_roam   = autocvar_g_turrets_unit_walker_speed_roam;
-    walker_speed_swim   = autocvar_g_turrets_unit_walker_speed_swim;
-
-    walker_std_rocket_dmg       = autocvar_g_turrets_unit_walker_std_rocket_dmg;
-    walker_std_rocket_radius    = autocvar_g_turrets_unit_walker_std_rocket_radius;
-    walker_std_rocket_force     = autocvar_g_turrets_unit_walker_std_rocket_force;
-    walker_std_rocket_speed     = autocvar_g_turrets_unit_walker_std_rocket_speed;
-    walker_std_rocket_turnrate  = autocvar_g_turrets_unit_walker_std_rocket_turnrate;
-
-}
-
-
-
 float walker_firecheck()
 {
     if (self.animflag == ANIM_MEELE)
@@ -69,157 +29,28 @@ void walker_meele_do_dmg()
 {
     vector where;
     entity e;
+    
     makevectors(self.angles);
     where = self.origin + v_forward * 128;
 
-    //w_deathtypestring = "tried to hug the cute spider thingy.";
     e = findradius(where,32);
-    while (e)
+    while (e) 
     {
         if (turret_validate_target(self,e,self.target_validate_flags))
             if (e != self && e.owner != self)
-                Damage(e, self, self, walker_meele_dmg ,DEATH_TURRET,'0 0 0', v_forward * walker_meele_force);
+                Damage(e, self, self, autocvar_g_turrets_unit_walker_std_meele_dmg ,DEATH_TURRET_WALKER_MEELE,'0 0 0', v_forward * autocvar_g_turrets_unit_walker_std_meele_force);
 
         e = e.chain;
     }
 }
-void walker_setnoanim()
-{
-    self.frame = ANIM_NO;
-    self.animflag = self.owner.frame;
-    dprint("walker_setnoanim\n");
-
-}
 
-void walker_dly_meele_do_dmg()
+void walker_setnoanim()
 {
-    walker_meele_do_dmg();
-    dprint("walker_dly_meele_do_dmg\n");
-
+    turrets_setframe(ANIM_NO, FALSE);
+    self.animflag = self.frame;
 }
-
-void walker_animate()
-{
-    vector real_angle;
-    float  vz;
-
-    real_angle = vectoangles(self.steerto) - self.angles;
-    vz         = self.velocity_z;
-
-    if (self.tur_head.frame != 0)
-        self.tur_head.frame = self.tur_head.frame +1;
-
-    if (self.tur_head.frame > 12)
-        self.tur_head.frame = 0;
-
-    switch (self.animflag)
-    {
-
-    case ANIM_NO:
-        self.frame = 0;
-        movelib_beak_simple(walker_speed_stop);
-        break;
-
-    /*
-    case ANIM_REVERSE:
-        if ((self.frame < 5) || (self.frame > 25))
-            self.frame = 25;
-
-        self.frame = self.frame -1;
-        movelib_move_simple(v_forward * -1, walker_speed_walk, 0.6);
-
-        if (self.frame < 5)
-            self.frame = 25;
-
-        break;
-    */
-
-    case ANIM_TURN:
-        self.frame = ANIM_TURN;
-        self.angles_y += bound(-15, shortangle_f(real_angle_y, self.angles_y), 15);
-        movelib_beak_simple(walker_speed_stop);
-        break;
-
-    case ANIM_WALK:
-        self.frame = ANIM_WALK;
-        self.angles_y += bound(-10, shortangle_f(real_angle_y, self.angles_y), 10);
-        movelib_move_simple(v_forward, walker_speed_walk, 0.6);
-        break;
-
-    case ANIM_RUN:
-        self.frame = ANIM_RUN;
-        self.angles_y += bound(-5, shortangle_f(real_angle_y, self.angles_y), 5);
-        movelib_move_simple(v_forward, walker_speed_run, 0.6);
-        break;
-
-    case ANIM_STRAFE_L:
-        self.frame = ANIM_STRAFE_L;
-        self.angles_y += bound(-2.5, shortangle_f(real_angle_y, self.angles_y), 2.5);
-        movelib_move_simple(v_right * -1, walker_speed_walk, 0.8);
-        break;
-
-    case ANIM_STRAFE_R:
-        self.frame = ANIM_STRAFE_R;
-        self.angles_y += bound(-2.5, shortangle_f(real_angle_y, self.angles_y), 2.5);
-        movelib_move_simple(v_right, walker_speed_walk, 0.8);
-        break;
-
-    case ANIM_JUMP:
-        self.frame = ANIM_JUMP;
-        self.velocity += '0 0 1' * walker_speed_jump;
-        break;
-
-    case ANIM_LAND:
-        self.frame = ANIM_LAND;
-        break;
-
-    case ANIM_PAIN:
-        if(self.frame != ANIM_PAIN)
-            defer(0.25,walker_setnoanim);
-
-        self.frame = ANIM_PAIN;
-
-        break;
-
-    case ANIM_MEELE:
-        if(self.frame != ANIM_MEELE)
-        {
-            defer(0.41, walker_setnoanim);
-            defer(0.21, walker_dly_meele_do_dmg);
-        }
-
-        self.frame = ANIM_MEELE;
-        movelib_beak_simple(walker_speed_stop);
-        break;
-
-    case ANIM_SWIM:
-        self.frame = ANIM_SWIM;
-        self.angles_y += bound(-10, shortangle_f(real_angle_y, self.angles_y), 10);
-        self.angles_x += bound(-10, shortangle_f(real_angle_x, self.angles_x), 10);
-        movelib_move_simple(v_forward, walker_speed_swim, 0.3);
-        vz = self.velocity_z + sin(time * 4) * 8;
-        break;
-
-    case ANIM_ROAM:
-        self.frame = ANIM_ROAM;
-        self.angles_y += bound(-5, shortangle_f(real_angle_y, self.angles_y), 5);
-        movelib_move_simple(v_forward ,walker_speed_roam, 0.5);
-        break;
-
-    }
-
-    self.velocity_z = vz;
-
-    if (self.flags & FL_ONGROUND)
-        movelib_groundalign4point(300, 100, 0.25);
-
-}
-
-
 void walker_rocket_explode()
 {
-    vector org2;
-
     if (self.event_damage != SUB_Null)
     {
         self.event_damage = SUB_Null;
@@ -228,11 +59,7 @@ void walker_rocket_explode()
         return;
     }
 
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    org2 = findbetterlocation (self.origin, 16);
-
-    pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
-    RadiusDamage (self, self.owner, walker_std_rocket_dmg, 0, walker_std_rocket_radius, world,walker_std_rocket_force, DEATH_TURRET, world);
+    RadiusDamage (self, self.owner, autocvar_g_turrets_unit_walker_std_rocket_dmg, 0, autocvar_g_turrets_unit_walker_std_rocket_radius, world,autocvar_g_turrets_unit_walker_std_rocket_force, DEATH_TURRET_WALKER_ROCKET, world);
 
     remove (self);
 }
@@ -245,7 +72,7 @@ void walker_rocket_damage (entity inflictor, entity attacker, float damage, floa
         walker_rocket_explode();
 }
 
-#define WALKER_ROCKET_MOVE movelib_move_simple(newdir, walker_std_rocket_speed, walker_std_rocket_turnrate); UpdateCSQCProjectile(self)
+#define WALKER_ROCKET_MOVE movelib_move_simple(newdir, autocvar_g_turrets_unit_walker_std_rocket_speed, autocvar_g_turrets_unit_walker_std_rocket_turnrate); UpdateCSQCProjectile(self)
 void walker_rocket_loop();
 void walker_rocket_think()
 {
@@ -262,9 +89,9 @@ void walker_rocket_think()
     if (self.cnt < time)
     {
         if (edist < 1000)
-            self.tur_shotorg = randomvec() * min(edist,64);
+            self.tur_shotorg = randomvec() * min(edist, 64);
         else
-            self.tur_shotorg = randomvec() * min(edist,256);
+            self.tur_shotorg = randomvec() * min(edist, 256);
 
         self.cnt = time + 0.5;
     }
@@ -272,39 +99,32 @@ void walker_rocket_think()
     if (edist < 256)
         self.tur_shotorg = '0 0 0';
 
-
     if (self.tur_health < time)
     {
-        self.think = walker_rocket_explode;
-        self.nextthink = time;
+        self.think      = walker_rocket_explode;
+        self.nextthink  = time;
         return;
     }
 
-    if (self.shot_dmg != 1337)
-        if (random() < 0.01)
-        {
-            walker_rocket_loop();
-            return;
-        }
+    if (self.shot_dmg != 1337 && random() < 0.01)
+    {
+        walker_rocket_loop();
+        return;
+    }
 
     m_speed = vlen(self.velocity);
 
     // Enemy dead? just keep on the current heading then.
-    if ((self.enemy == world) || (self.enemy.deadflag != DEAD_NO))
-    {
-        // Make sure we dont return to tracking a respawned entity
+    if (self.enemy == world || self.enemy.deadflag != DEAD_NO)
         self.enemy = world;
-    }
 
     if (self.enemy)
     {
-        itime = max(edist / m_speed,1);
+        itime = max(edist / m_speed, 1);
         newdir = steerlib_pull(self.enemy.origin + self.tur_shotorg);
     }
     else
-    {
         newdir  = normalize(self.velocity);
-    }
 
     WALKER_ROCKET_MOVE;
 }
@@ -320,7 +140,7 @@ void walker_rocket_loop3()
         return;
     }
 
-    if (vlen(self.origin - self.tur_shotorg) < 128 )
+    if (vlen(self.origin - self.tur_shotorg) < 100 )
     {
         self.think = walker_rocket_think;
         return;
@@ -344,7 +164,7 @@ void walker_rocket_loop2()
         return;
     }
 
-    if (vlen(self.origin - self.tur_shotorg) < 128 )
+    if (vlen(self.origin - self.tur_shotorg) < 100 )
     {
         self.tur_shotorg = self.origin - '0 0 200';
         self.think = walker_rocket_loop3;
@@ -358,20 +178,16 @@ void walker_rocket_loop2()
 void walker_rocket_loop()
 {
     self.nextthink = time;
-    self.tur_shotorg = self.origin + '0 0 400';
+    self.tur_shotorg = self.origin + '0 0 300';
     self.think = walker_rocket_loop2;
     self.shot_dmg = 1337;
 }
 
 void walker_fire_rocket(vector org)
 {
-
     entity rocket;
-
-
-    //self.angles_x *= -1;
     fixedmakevectors(self.angles);
-    //self.angles_x *= -1;
 
     te_explosion (org);
 
@@ -383,12 +199,9 @@ void walker_fire_rocket(vector org)
 
     rocket.classname          = "walker_rocket";
     rocket.owner              = self;
-
     rocket.bot_dodge          = TRUE;
     rocket.bot_dodgerating    = 50;
-
     rocket.takedamage         = DAMAGE_YES;
-
     rocket.damageforcescale   = 2;
     rocket.health             = 25;
     rocket.tur_shotorg        = randomvec() * 512;
@@ -402,9 +215,9 @@ void walker_fire_rocket(vector org)
 
     rocket.event_damage       = walker_rocket_damage;
 
-    rocket.nextthink          = time;// + 0.25;
+    rocket.nextthink          = time;
     rocket.movetype           = MOVETYPE_FLY;
-    rocket.velocity           = normalize((v_forward + v_up * 0.5) + (randomvec() * 0.2)) * walker_std_rocket_speed;
+    rocket.velocity           = normalize((v_forward + v_up * 0.5) + (randomvec() * 0.2)) * autocvar_g_turrets_unit_walker_std_rocket_speed;
     rocket.angles             = vectoangles(rocket.velocity);
     rocket.touch              = walker_rocket_explode;
     rocket.flags              = FL_PROJECTILE;
@@ -414,42 +227,43 @@ void walker_fire_rocket(vector org)
     CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
 }
 
-void rv_think()
+.vector enemy_last_loc;
+.float enemy_last_time;
+void walker_move_to(vector _target, float _dist)
 {
-    float f;
-    vector org;
-    entity oldself;
-
-    if (self.owner.deadflag != DEAD_NO)
+    switch (self.waterlevel)
     {
-        remove(self);
-        return;
+    case WATERLEVEL_NONE:
+        if (_dist > 500)
+            self.animflag = ANIM_RUN;
+        else
+            self.animflag = ANIM_WALK;
+    case WATERLEVEL_WETFEET:
+    case WATERLEVEL_SWIMMING:
+        if (self.animflag != ANIM_SWIM)
+            self.animflag = ANIM_WALK;
+        else
+            self.animflag = ANIM_SWIM;
+        break;
+    case WATERLEVEL_SUBMERGED:
+        self.animflag = ANIM_SWIM;
     }
 
-    self.cnt = self.cnt -1;
+    self.moveto = _target;
+    self.steerto = steerlib_attract2(self.moveto, 0.5, 500, 0.95);
 
-    if (self.cnt < 0)
+    if(self.enemy)
     {
-        remove(self);
-        return;
+        self.enemy_last_loc = _target;
+        self.enemy_last_time = time;        
     }
-
-    if (self.cnt > 1)
-        f = gettagindex(self.owner,"tag_rocket01");
-    else
-        f = gettagindex(self.owner,"tag_rocket02");
-
-    org = gettaginfo(self.owner,f);
-
-    self.nextthink = time + 0.2;
-    oldself = self;
-    self = self.owner;
-    walker_fire_rocket(org);
-    self = oldself;
 }
 
+//#define WALKER_FANCYPATHING
+
 void walker_move_path()
 {
+#ifdef WALKER_FANCYPATHING
     // Are we close enougth to a path node to switch to the next?
     if (vlen(self.origin  - self.pathcurrent.origin) < 64)
         if (self.pathcurrent.path_next == world)
@@ -475,179 +289,260 @@ void walker_move_path()
         else
             self.pathcurrent = self.pathcurrent.path_next;
 
-    switch (self.waterlevel)
-    {
-    case 0:
-        self.animflag = ANIM_WALK;
-    case 1:
-    case 2:
-        if (self.animflag == ANIM_WALK)
-            self.animflag = ANIM_WALK;
-        else
-            self.animflag = ANIM_SWIM;
-        break;
-    case 3:
-        self.animflag = ANIM_SWIM;
-    }
-
     self.moveto = self.pathcurrent.origin;
     self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95);
+    walker_move_to(self.moveto, 0);
 
+#else
+    if (vlen(self.origin - self.pathcurrent.origin) < 64)    
+        self.pathcurrent = self.pathcurrent.enemy;
+    
+    if(!self.pathcurrent)
+        return;
+    
+    self.moveto = self.pathcurrent.origin;
+    self.steerto = steerlib_attract2(self.moveto, 0.5, 500, 0.95);
+    walker_move_to(self.moveto, 0);
+#endif
 }
 
-void walker_move_enemy()
-{
-    switch (self.waterlevel)
-    {
-    case 0:
-        if (self.tur_dist_enemy > 500)
-            self.animflag = ANIM_RUN;
-        else
-            self.animflag = ANIM_WALK;
-    case 1:
-    case 2:
-        if (self.animflag != ANIM_SWIM)
-            self.animflag = ANIM_WALK;
-        else
-            self.animflag = ANIM_SWIM;
-        break;
-    case 3:
-        self.animflag = ANIM_SWIM;
-    }
-
-    self.moveto = self.enemy.origin;
-    self.steerto = steerlib_attract2(self.moveto,0.5,500,0.95);
-
-}
-
-void walker_move_idle_pause()
-{
-    self.moveto   = self.origin;
-    self.steerto  = v_forward;
-    self.animflag = ANIM_NO;
-}
-
-void walker_move_idle_roam()
-{
-}
-
-void walker_move_idle()
-{
-}
-
-float walker_attack_meele()
-{
-
-    vector wish_angle;
-
-
-    if (self.animflag == ANIM_SWIM || self.animflag == ANIM_MEELE)
-        return 0;
-
-    wish_angle = angleofs(self,self.enemy);
-
-    if (self.tur_dist_enemy > autocvar_g_turrets_unit_walker_std_meele_range)
-        return 0;
-    else
-        if (fabs(wish_angle_y) > 15)
-            return 0;
-
-    self.moveto   = self.enemy.origin;
-    self.steerto  = steerlib_attract2(self.moveto,0.5,500,0.95);
-    self.animflag = ANIM_MEELE;
-
-    return 1;
-}
-
-float walker_attack_rockets()
-{
-    if (self.tur_head.attack_finished_single > time)
-        return 0;
-
-    if (self.tur_dist_enemy < autocvar_g_turrets_unit_walker_std_rockets_range_min)
-        return 0;
-
-    if (self.tur_dist_enemy > autocvar_g_turrets_unit_walker_std_rockets_range)
-        return 0;
-
-    entity rv;
+.float idletime;
 
-    rv           = spawn();
-    rv.think     = rv_think;
-    rv.nextthink = time;
-    rv.cnt       = 4;
-    rv.owner     = self;
 
-    self.tur_head.attack_finished_single = time + autocvar_g_turrets_unit_walker_std_rocket_refire;
-
-    return 1;
-}
 
 void walker_postthink()
 {
-
-    //self.angles_x *= -1;
     fixedmakevectors(self.angles);
-    //self.angles_x *= -1;
 
-    if ((self.spawnflags & TSF_NO_PATHBREAK) && self.pathcurrent)
+    if (self.spawnflags & TSF_NO_PATHBREAK && self.pathcurrent)
         walker_move_path();
     else if (self.enemy == world)
     {
         if(self.pathcurrent)
             walker_move_path();
         else
-            walker_move_idle_pause();
+        {
+            if(self.enemy_last_time != 0)
+            {
+                if(vlen(self.origin - self.enemy_last_loc) < 128 || time - self.enemy_last_time > 10)
+                    self.enemy_last_time = 0;
+                else                
+                    walker_move_to(self.enemy_last_loc, 0);
+            }
+            else
+            {        
+                if(self.animflag != ANIM_NO)
+                {                    
+                    traceline(self.origin + '0 0 64', self.origin + '0 0 64' + v_forward * 128, MOVE_NORMAL, self);
+                    
+                    if(trace_fraction != 1.0)
+                        self.tur_head.idletime = -1337;
+                    else
+                    {
+                        traceline(trace_endpos, trace_endpos - '0 0 256', MOVE_NORMAL, self);            
+                        if(trace_fraction == 1.0)
+                            self.tur_head.idletime = -1337;
+                    }
+                    
+                    if(self.tur_head.idletime == -1337)
+                    {
+                        self.moveto = self.origin + randomvec() * 256;        
+                        self.tur_head.idletime = 0;
+                    }
+
+                    self.moveto = self.moveto * 0.9 + ((self.origin + v_forward * 500) + randomvec() * 400) * 0.1;
+                    self.moveto_z = self.origin_z + 64;            
+                    walker_move_to(self.moveto, 0);
+                }         
+                
+                if(self.idletime < time)
+                {
+                    if(random() < 0.5 || !(self.spawnflags & TSL_ROAM))
+                    {
+                        self.idletime = time + 1 + random() * 5;
+                        self.moveto = self.origin;
+                        self.animflag = ANIM_NO;
+                    }
+                    else
+                    {
+                        self.animflag = ANIM_WALK;
+                        self.idletime = time + 4 + random() * 2;
+                        self.moveto = self.origin + randomvec() * 256;        
+                        self.tur_head.moveto = self.moveto;
+                        self.tur_head.idletime = 0;
+                    }
+                }
+            }            
+        }
     }
     else
     {
-        if not (self.animflag == ANIM_MEELE)
-            if not (walker_attack_rockets())
-                walker_attack_meele();
+        if (self.tur_dist_enemy < autocvar_g_turrets_unit_walker_std_meele_range && self.animflag != ANIM_MEELE)
+        {
+            vector wish_angle;
+            
+            wish_angle = angleofs(self, self.enemy);    
+            if (self.animflag != ANIM_SWIM)
+            if (fabs(wish_angle_y) < 15)
+            {
+                self.moveto   = self.enemy.origin;
+                self.steerto  = steerlib_attract2(self.moveto, 0.5, 500, 0.95);
+                self.animflag = ANIM_MEELE;
+            }
+        }
+        else if (self.tur_head.attack_finished_single < time)
+        {            
+            if(self.tur_head.shot_volly)
+            {
+                self.animflag = ANIM_NO;
+                
+                self.tur_head.shot_volly = self.tur_head.shot_volly -1;
+                if(self.tur_head.shot_volly == 0)
+                    self.tur_head.attack_finished_single = time + autocvar_g_turrets_unit_walker_std_rocket_refire;
+                else
+                    self.tur_head.attack_finished_single = time + 0.2;
+                
+                if(self.tur_head.shot_volly > 1)
+                    walker_fire_rocket(gettaginfo(self, gettagindex(self, "tag_rocket01")));
+                else
+                    walker_fire_rocket(gettaginfo(self, gettagindex(self, "tag_rocket02")));
+            }
+            else
+            {
+                if (self.tur_dist_enemy > autocvar_g_turrets_unit_walker_std_rockets_range_min)        
+                if (self.tur_dist_enemy < autocvar_g_turrets_unit_walker_std_rockets_range)
+                    self.tur_head.shot_volly = 4;
+            }
+        }
+        else
+        {            
+            if (self.animflag != ANIM_MEELE)
+                walker_move_to(self.enemy.origin, self.tur_dist_enemy);
+        }
+    }
 
-        if not (self.animflag == ANIM_MEELE)
-            walker_move_enemy();
+    //if(self.animflag != ANIM_NO)
+    {
+        vector real_angle;
+        float turny, turnx;
+        float  vz;
+
+        real_angle = vectoangles(self.steerto) - self.angles;
+        vz         = self.velocity_z;
+            
+        switch (self.animflag)
+        {
+            case ANIM_NO:
+                movelib_beak_simple(autocvar_g_turrets_unit_walker_speed_stop);
+                break;
+
+            case ANIM_TURN:
+                turny = autocvar_g_turrets_unit_walker_turn;
+                movelib_beak_simple(autocvar_g_turrets_unit_walker_speed_stop);
+                break;
+
+            case ANIM_WALK:
+                turny = autocvar_g_turrets_unit_walker_turn_walk;
+                movelib_move_simple(v_forward, autocvar_g_turrets_unit_walker_speed_walk, 0.6);
+                break;
+
+            case ANIM_RUN:
+                turny = autocvar_g_turrets_unit_walker_turn_run;
+                movelib_move_simple(v_forward, autocvar_g_turrets_unit_walker_speed_run, 0.6);
+                break;
+
+            case ANIM_STRAFE_L:
+                turny = autocvar_g_turrets_unit_walker_turn_strafe;
+                movelib_move_simple(v_right * -1, autocvar_g_turrets_unit_walker_speed_walk, 0.8);
+                break;
+
+            case ANIM_STRAFE_R:
+                turny = autocvar_g_turrets_unit_walker_turn_strafe;
+                movelib_move_simple(v_right, autocvar_g_turrets_unit_walker_speed_walk, 0.8);
+                break;
+
+            case ANIM_JUMP:
+                self.velocity += '0 0 1' * autocvar_g_turrets_unit_walker_speed_jump;
+                break;
+
+            case ANIM_LAND:
+                break;
+
+            case ANIM_PAIN:
+                if(self.frame != ANIM_PAIN)
+                    defer(0.25, walker_setnoanim);
+                
+                break;
+
+            case ANIM_MEELE:
+                if(self.frame != ANIM_MEELE)
+                {
+                    defer(0.41, walker_setnoanim);
+                    defer(0.21, walker_meele_do_dmg);
+                }
+
+                movelib_beak_simple(autocvar_g_turrets_unit_walker_speed_stop);
+                break;
+
+            case ANIM_SWIM:
+                turny = autocvar_g_turrets_unit_walker_turn_swim;
+                turnx = autocvar_g_turrets_unit_walker_turn_swim;
+                
+                self.angles_x += bound(-10, shortangle_f(real_angle_x, self.angles_x), 10);
+                movelib_move_simple(v_forward, autocvar_g_turrets_unit_walker_speed_swim, 0.3);
+                vz = self.velocity_z + sin(time * 4) * 8;
+                break;
+
+            case ANIM_ROAM:
+                turny = autocvar_g_turrets_unit_walker_turn_walk;
+                movelib_move_simple(v_forward ,autocvar_g_turrets_unit_walker_speed_roam, 0.5);
+                break;
+        }
+            
+        if(turny)
+        {        
+            turny = bound( turny * -1, shortangle_f(real_angle_y, self.angles_y), turny );
+            self.angles_y += turny;
+        }
+
+        if(turnx)
+        {        
+            turnx = bound( turnx * -1, shortangle_f(real_angle_x, self.angles_x), turnx );
+            self.angles_x += turnx;
+        }
+
+        self.velocity_z = vz;        
     }
 
+    
+    if(self.origin != self.oldorigin)
+        self.SendFlags |= TNSF_MOVE;
+    
+    self.oldorigin = self.origin;
+    turrets_setframe(self.animflag, FALSE);
 
-    walker_animate();
 }
 
 void walker_attack()
 {
     sound (self, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
-    fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated,self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET, 0, 1, autocvar_g_balance_uzi_bulletconstant);
+    fireBallisticBullet (self.tur_shotorg, self.tur_shotdir_updated, self.shot_spread, self.shot_speed, 5, self.shot_dmg, 0, self.shot_force, DEATH_TURRET_WALKER_GUN, 0, 1, autocvar_g_balance_uzi_bulletconstant);
     endFireBallisticBullet();
-    if (self.misc_bulletcounter == 2)
-    {
-
-               UziFlash();
-               setattachment(self.muzzle_flash, self.tur_head, "tag_fire");
-
-        self.misc_bulletcounter = 0;
-    }
-
-    self.misc_bulletcounter = self.misc_bulletcounter + 1;
-    self.tur_head.frame    = self.tur_head.frame + 1;
+    pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg, self.tur_shotdir_updated * 1000, 1);
 }
 
 
 void walker_respawnhook()
 {
-    vector vtmp;
     entity e;
 
     // Respawn is called & first spawn to, to set team. need to make sure we do not move the initial spawn.
     if(self.movetype  != MOVETYPE_WALK)
                return;
                
-    setorigin(self, self.wkr_spawn.origin);
-
-    self.angles = self.wkr_spawn.angles;
-    vtmp = self.wkr_spawn.origin;
-    vtmp_z += self.wkr_spawn.maxs_z;
-    setorigin(self,vtmp);
-
+    setorigin(self, self.pos1);
+    self.angles = self.pos2;
+    
     if (self.target != "")
     {
         e = find(world,targetname,self.target);
@@ -669,17 +564,12 @@ void walker_respawnhook()
 
 void walker_diehook()
 {
-    turret_trowgib2(self.origin, self.velocity + v_up * 200, '-0.6 -0.2 -02', self,time + random() * 1);
-    turret_trowgib2(self.origin + '0 0 64', self.velocity + v_forward * 150 + v_up * 150, '-0.2 -0.2 -02', self.tur_head, 3 + time + random() * 2);
-
+#ifdef self.pathcurrent
     if (self.pathcurrent)
         pathlib_deletepath(self.pathcurrent.owner);
+#endif
 
     self.pathcurrent = world;
-
-    if (self.damage_flags & TFL_DMG_DEATH_NORESPAWN)
-        remove(self.wkr_spawn);
-
 }
 
 void turret_walker_dinit()
@@ -688,7 +578,6 @@ void turret_walker_dinit()
     entity e;
 
     if (self.netname == "")      self.netname     = "Walker Turret";
-    self.wkr_spawn = spawn();
 
     self.ammo_flags = TFL_AMMO_BULLETS | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
     self.turrcaps_flags = TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MOVE ;
@@ -704,15 +593,12 @@ void turret_walker_dinit()
     self.turret_diehook = walker_diehook;
 
     self.ticrate = 0.05;
-    if (turret_stdproc_init("walker_std",FALSE,"models/turrets/walker_body.md3","models/turrets/walker_head_minigun.md3") == 0)
+    if (turret_stdproc_init("walker_std", "models/turrets/walker_body.md3", "models/turrets/walker_head_minigun.md3", TID_WALKER) == 0)
     {
         remove(self);
         return;
     }
 
-    if (!turret_tag_fire_update())
-        dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
-
     self.damage_flags |= TFL_DMG_DEATH_NOGIBS;
     self.target_select_flags   = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
     self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_LOS;
@@ -722,20 +608,15 @@ void turret_walker_dinit()
     self.solid      = SOLID_SLIDEBOX;
     self.takedamage = DAMAGE_AIM;
 
-    setmodel(self.wkr_spawn,"models/turrets/walker_spawn.md3");
-
-    self.wkr_spawn.angles   = self.angles;
-    self.wkr_spawn.solid    = SOLID_NOT;
 
     setsize(self, WALKER_MIN, WALKER_MAX);
 
-    setorigin(self,self.origin);
-    //traceline(self.origin + '0 0 128', self.origin - '0 0 10000', MOVE_NORMAL, self);
+    setorigin(self, self.origin);
     tracebox(self.origin + '0 0 128', self.mins,self.maxs,self.origin - '0 0 10000', MOVE_NORMAL, self);
-
-    setorigin(self.wkr_spawn, trace_endpos + '0 0 4');
-    setorigin(self, self.wkr_spawn.origin);
-
+    setorigin(self, trace_endpos + '0 0 4');
+    self.pos1 = self.origin;
+    self.pos2 = self.angles;
+    
     self.idle_aim = '0 0 0';
     self.turret_firecheckfunc = walker_firecheck;
     self.turret_firefunc      = walker_attack;
@@ -743,7 +624,7 @@ void turret_walker_dinit()
 
     if (self.target != "")
     {
-        e = find(world,targetname,self.target);
+        e = find(world, targetname, self.target);
         if (!e)
         {
             dprint("Initital waypoint for walker does NOT exsist, fix your map!\n");
@@ -754,8 +635,12 @@ void turret_walker_dinit()
             dprint("Warning: not a turrret path\n");
         else
         {
-            self.pathcurrent = WALKER_PATH(self.origin,e.origin);
+#ifdef WALKER_FANCYPATHING
+            self.pathcurrent = WALKER_PATH(self.origin, e.origin);
             self.pathgoal = e;
+#else
+            self.pathcurrent = e;
+#endif
         }
     }
 }
@@ -763,14 +648,10 @@ void turret_walker_dinit()
 
 void spawnfunc_turret_walker()
 {
-    walker_loadcvars();
-
     g_turrets_common_precash();
 
     precache_model ("models/turrets/walker_head_minigun.md3");
     precache_model ("models/turrets/walker_body.md3");
-    precache_model ("models/turrets/walker_props.md3");
-    precache_model ("models/turrets/walker_spawn.md3");
     precache_model ( "models/turrets/rocket.md3");
     precache_sound ( "weapons/rocket_impact.wav" );
 
diff --git a/qcsrc/server/vehicles/bumblebee.qc b/qcsrc/server/vehicles/bumblebee.qc
new file mode 100644 (file)
index 0000000..80aa8bd
--- /dev/null
@@ -0,0 +1,372 @@
+#ifdef SVQC
+// Auto cvars
+float autocvar_g_vehicle_bumblebee_speed_forward;
+float autocvar_g_vehicle_bumblebee_speed_strafe;
+float autocvar_g_vehicle_bumblebee_speed_up;
+float autocvar_g_vehicle_bumblebee_speed_down;
+float autocvar_g_vehicle_bumblebee_turnspeed;
+float autocvar_g_vehicle_bumblebee_pitchspeed;
+float autocvar_g_vehicle_bumblebee_pitchlimit;
+float autocvar_g_vehicle_bumblebee_friction;
+
+float autocvar_g_vehicle_bumblebee_energy;
+float autocvar_g_vehicle_bumblebee_energy_regen;
+float autocvar_g_vehicle_bumblebee_energy_regen_pause;
+
+float autocvar_g_vehicle_bumblebee_health;
+float autocvar_g_vehicle_bumblebee_health_regen;
+float autocvar_g_vehicle_bumblebee_health_regen_pause;
+
+float autocvar_g_vehicle_bumblebee_shield;
+float autocvar_g_vehicle_bumblebee_shield_regen;
+float autocvar_g_vehicle_bumblebee_shield_regen_pause;
+
+float autocvar_g_vehicle_bumblebee_cannon_cost;
+float autocvar_g_vehicle_bumblebee_cannon_damage;
+float autocvar_g_vehicle_bumblebee_cannon_radius;
+float autocvar_g_vehicle_bumblebee_cannon_refire;
+float autocvar_g_vehicle_bumblebee_cannon_speed;
+float autocvar_g_vehicle_bumblebee_cannon_spread;
+float autocvar_g_vehicle_bumblebee_cannon_force;
+
+float autocvar_g_vehicle_bumblebee_cannon_turnspeed;
+float autocvar_g_vehicle_bumblebee_cannon_pitchlimit_down;
+float autocvar_g_vehicle_bumblebee_cannon_pitchlimit_up;
+float autocvar_g_vehicle_bumblebee_cannon_turnlimit_in;
+float autocvar_g_vehicle_bumblebee_cannon_turnlimit_out;
+
+float autocvar_g_vehicle_bumblebee_respawntime;
+
+float autocvar_g_vehicle_bumblebee_blowup_radius;
+float autocvar_g_vehicle_bumblebee_blowup_coredamage;
+float autocvar_g_vehicle_bumblebee_blowup_edgedamage;
+float autocvar_g_vehicle_bumblebee_blowup_forceintensity;
+
+#define BUMB_MIN '-120 -120 -40'
+#define BUMB_MAX '120 120 40'
+
+.entity gunner1;
+//.entity gunner2;
+.vector lastaim;
+float bumb_gunner_frame()
+{
+    entity vehic, gun, gunner;
+    float ftmp, ftmp2;
+    vector vtmp;
+
+    vehic   = self.vehicle;
+    gun     = self.vehicle.gun1;
+    gunner  = self;
+
+    self    = vehic;
+    vehic.solid = SOLID_NOT;
+    crosshair_trace(gunner);
+
+    //vtmp = gettaginfo(vehic, gettagindexvehic, "tag_hardpoint01"));
+    vtmp = gettaginfo(gun, gettagindex(gun, "muzzle"));
+    vtmp = vectoangles(normalize(trace_endpos - vtmp)); // Find the direction & angle
+    vtmp = shortangle_vxy(vtmp - (vehic.angles + gun.angles), vehic.angles + gun.angles);     // Find aim offset
+
+    // Bind to aimspeed
+    ftmp2 = autocvar_g_vehicle_bumblebee_cannon_turnspeed * frametime; ftmp = -ftmp2;
+    vtmp_x = bound(ftmp, vtmp_x, ftmp2);
+    vtmp_y = bound(ftmp, vtmp_y, ftmp2);
+    // Bind to limts
+    gun.angles_x = bound(-autocvar_g_vehicle_bumblebee_cannon_pitchlimit_down, vtmp_x + gun.angles_x, autocvar_g_vehicle_bumblebee_cannon_pitchlimit_up);
+    gun.angles_y = bound(-autocvar_g_vehicle_bumblebee_cannon_turnlimit_in,  vtmp_y + gun.angles_y, autocvar_g_vehicle_bumblebee_cannon_turnlimit_out);
+
+    if(gunner.BUTTON_ATCK && gun.cnt <= time)
+    {
+        vtmp = gettaginfo(gun, gettagindex(gun, "muzzle"));
+        v_forward = normalize(v_forward);
+        vtmp += v_forward * 50;
+
+        fireBullet (vtmp, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
+            autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_SBMINIGUN, 0);
+
+        gun.cnt = time + 0.1;
+    }
+
+    setorigin(gunner, vehic.origin);
+    gunner.velocity = vehic.velocity;
+
+    vehic.solid = SOLID_BBOX;
+    gunner.BUTTON_ATCK = gunner.BUTTON_ATCK2 = gunner.BUTTON_CROUCH = 0;
+    self = gunner;
+    return 1;
+}
+
+void bumb_gunner_enter()
+{
+    if(self.gunner1 != world)
+        return;
+
+    self.gunner1         = other;
+    self.gunner1.vehicle = self;
+
+    msg_entity = other;
+    WriteByte (MSG_ONE, SVC_SETVIEWPORT);
+    WriteEntity(MSG_ONE, self.gun1);
+    WriteByte (MSG_ONE, SVC_SETVIEWANGLES);
+    if(self.tur_head)
+    {
+        WriteAngle(MSG_ONE, self.gun1.angles_x + self.angles_x); // tilt
+        WriteAngle(MSG_ONE, self.gun1.angles_y + self.angles_y); // yaw
+        WriteAngle(MSG_ONE, 0);                                  // roll
+    }
+    other.PlayerPhysplug = bumb_gunner_frame;
+}
+
+float bumb_pilot_frame()
+{
+    entity pilot, gunner, vehic;
+    vector newvel;
+
+    pilot = self;
+    vehic = self.vehicle;
+    self   = vehic;
+
+    if(pilot.BUTTON_USE && vehic.deadflag == DEAD_NO)
+    {
+        self = vehic;
+        vehicles_exit(VHEF_NORMAL);
+        self = pilot;
+        return 0;
+    }
+
+    if(vehic.deadflag != DEAD_NO)
+    {
+        self = pilot;
+        pilot.BUTTON_ATCK = pilot.BUTTON_ATCK2 = 0;
+        return 1;
+    }
+
+    crosshair_trace(pilot);
+
+    vector vang;
+    float ftmp;
+
+    vang = vehic.angles;
+    newvel = vectoangles(normalize(trace_endpos - self.origin + '0 0 32'));
+    vang_x *= -1;
+    newvel_x *= -1;
+    if(newvel_x > 180)  newvel_x -= 360;
+    if(newvel_x < -180) newvel_x += 360;
+    if(newvel_y > 180)  newvel_y -= 360;
+    if(newvel_y < -180) newvel_y += 360;
+
+    ftmp = shortangle_f(pilot.v_angle_y - vang_y, vang_y);
+    if(ftmp > 180)  ftmp -= 360; if(ftmp < -180) ftmp += 360;
+    vehic.avelocity_y = bound(-autocvar_g_vehicle_bumblebee_turnspeed, ftmp + vehic.avelocity_y * 0.9, autocvar_g_vehicle_bumblebee_turnspeed);
+
+    // Pitch
+    ftmp = 0;
+    if(pilot.movement_x > 0 && vang_x < autocvar_g_vehicle_bumblebee_pitchlimit) ftmp = 5;
+    else if(pilot.movement_x < 0 && vang_x > -autocvar_g_vehicle_bumblebee_pitchlimit) ftmp = -20;
+
+    newvel_x = bound(-autocvar_g_vehicle_bumblebee_pitchlimit, newvel_x , autocvar_g_vehicle_bumblebee_pitchlimit);
+    ftmp = vang_x - bound(-autocvar_g_vehicle_bumblebee_pitchlimit, newvel_x + ftmp, autocvar_g_vehicle_bumblebee_pitchlimit);
+    vehic.avelocity_x = bound(-autocvar_g_vehicle_bumblebee_pitchspeed, ftmp + vehic.avelocity_x * 0.9, autocvar_g_vehicle_bumblebee_pitchspeed);
+
+    vehic.angles_x = anglemods(vehic.angles_x);
+    vehic.angles_y = anglemods(vehic.angles_y);
+    vehic.angles_z = anglemods(vehic.angles_z);
+
+    makevectors('0 1 0' * vehic.angles_y);
+    newvel = vehic.velocity * -autocvar_g_vehicle_bumblebee_friction;
+
+    if(pilot.movement_x != 0)
+    {
+        if(pilot.movement_x > 0)
+            newvel += v_forward  * autocvar_g_vehicle_bumblebee_speed_forward;
+        else if(pilot.movement_x < 0)
+            newvel -= v_forward  * autocvar_g_vehicle_bumblebee_speed_forward;
+    }
+
+    if(pilot.movement_y != 0)
+    {
+        if(pilot.movement_y < 0)
+            newvel -= v_right * autocvar_g_vehicle_bumblebee_speed_strafe;
+        else if(pilot.movement_y > 0)
+            newvel += v_right * autocvar_g_vehicle_bumblebee_speed_strafe;
+        ftmp = newvel * v_right;
+        ftmp *= frametime * 0.1;
+        vehic.angles_z = bound(-15, vehic.angles_z + ftmp, 15);
+    }
+    else
+    {
+        vehic.angles_z *= 0.95;
+        if(vehic.angles_z >= -1 && vehic.angles_z <= -1)
+            vehic.angles_z = 0;
+    }
+
+    if(pilot.BUTTON_CROUCH)
+        newvel -=   v_up * autocvar_g_vehicle_bumblebee_speed_down;
+    else if (pilot.BUTTON_JUMP)
+        newvel +=  v_up * autocvar_g_vehicle_bumblebee_speed_up;
+
+    vehic.velocity  += newvel * frametime;
+    pilot.velocity = pilot.movement  = vehic.velocity;
+    setorigin(pilot,vehic.origin + '0 0 32');
+
+
+    if(vehic.vehicle_flags  & VHF_SHIELDREGEN)
+        vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_bumblebee_shield, autocvar_g_vehicle_bumblebee_shield_regen_pause, autocvar_g_vehicle_bumblebee_shield_regen, frametime);
+
+    if(vehic.vehicle_flags  & VHF_HEALTHREGEN)
+        vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_bumblebee_health, autocvar_g_vehicle_bumblebee_health_regen_pause, autocvar_g_vehicle_bumblebee_health_regen, frametime);
+
+    if(vehic.vehicle_flags  & VHF_ENERGYREGEN)
+        vehicles_regen(cnt, vehicle_energy, autocvar_g_vehicle_bumblebee_energy, autocvar_g_vehicle_bumblebee_energy_regen_pause, autocvar_g_vehicle_bumblebee_energy_regen, frametime);
+
+    VEHICLE_UPDATE_PLAYER(health, bumblebee);
+    VEHICLE_UPDATE_PLAYER(energy, bumblebee);
+    if(vehic.vehicle_flags & VHF_HASSHIELD)
+        VEHICLE_UPDATE_PLAYER(shield, bumblebee);
+
+    pilot.BUTTON_ATCK = pilot.BUTTON_ATCK2 = pilot.BUTTON_CROUCH = 0;
+    self = pilot;
+
+    return 1;
+}
+
+void bumb_think()
+{
+    self.velocity = self.velocity * 0.99;
+    self.nextthink = time + 0.1;
+}
+
+void bumb_enter()
+{
+    self.touch  = bumb_gunner_enter;
+}
+
+void bumb_exit(float eject)
+{
+    self.owner = world;
+    self.touch = vehicles_touch;
+}
+
+void bumb_spawn()
+{
+    self.vehicle_health = autocvar_g_vehicle_bumblebee_health;
+    self.vehicle_shield = autocvar_g_vehicle_bumblebee_shield;
+    self.movetype       = MOVETYPE_TOSS;
+    self.solid          = SOLID_BBOX;
+    //self.vehicle_energy = 1;
+    self.movetype = MOVETYPE_FLY;
+    setorigin(self, self.origin + '0 0 25');
+}
+
+void bumb_die()
+{
+    self.health       = 0;
+    self.event_damage = SUB_Null;
+    self.iscreature   = FALSE;
+    self.solid        = SOLID_CORPSE;
+    self.takedamage   = DAMAGE_NO;
+    self.deadflag     = DEAD_DYING;
+    self.movetype     = MOVETYPE_BOUNCE;
+
+    pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
+}
+
+void bumb_dinit()
+{
+    if not (vehicle_initialize(
+             "Bumblebee",
+             "models/vehicles/bumblebee_body.dpm",
+             "",
+             "models/vehicles/spiderbot_cockpit.dpm",
+             "", "", "tag_viewport",
+             HUD_BUMBLEBEE,
+             BUMB_MIN, BUMB_MAX,
+             FALSE,
+             bumb_spawn, autocvar_g_vehicle_bumblebee_respawntime,
+             bumb_pilot_frame,
+             bumb_enter, bumb_exit,
+             bumb_die,   bumb_think,
+             FALSE))
+    {
+        remove(self);
+        return;
+    }
+    self.gun1 = spawn();
+    setmodel(self.gun1, "models/vehicles/bumblebee_ray.dpm");
+    setattachment(self.gun1, self, "tag_hardpoint03");
+
+    self.gun1 = spawn();
+    self.gun2 = spawn();
+
+    self.gun1.owner = self;
+    self.gun2.owner = self;
+
+    setmodel(self.gun1, "models/vehicles/bumblebee_plasma_right.dpm");
+    setmodel(self.gun2, "models/vehicles/bumblebee_plasma_left.dpm");
+
+    setattachment(self.gun1, self, "tag_hardpoint01");
+    setattachment(self.gun2, self, "tag_hardpoint02");
+
+    vector ofs;
+    ofs = gettaginfo(self, gettagindex(self, "tag_hardpoint01"));
+    ofs -= self.origin;
+    setattachment(self.gun1, self, "");
+    setorigin(self.gun1, ofs);
+
+    ofs = gettaginfo(self, gettagindex(self, "tag_hardpoint02"));
+    ofs -= self.origin;
+    setattachment(self.gun2, self, "");
+    setorigin(self.gun2, ofs);
+
+
+}
+
+void spawnfunc_vehicle_bumblebee()
+{
+
+    precache_model ("models/vehicles/bumblebee_body.dpm");
+    precache_model ("models/vehicles/bumblebee_plasma_left.dpm");
+    precache_model ("models/vehicles/bumblebee_plasma_right.dpm");
+    precache_model ("models/vehicles/bumblebee_ray.dpm");
+
+    //vehicles_configcheck("vehicle_bumblebee.cfg", autocvar_g_vehicle_bumblebee_health);
+
+    if(autocvar_g_vehicle_bumblebee_energy)
+        if(autocvar_g_vehicle_bumblebee_energy_regen)
+            self.vehicle_flags |= VHF_ENERGYREGEN;
+
+    if(autocvar_g_vehicle_bumblebee_shield)
+        self.vehicle_flags |= VHF_HASSHIELD;
+
+    if(autocvar_g_vehicle_bumblebee_shield_regen)
+        self.vehicle_flags |= VHF_SHIELDREGEN;
+
+    if(autocvar_g_vehicle_bumblebee_health_regen)
+        self.vehicle_flags |= VHF_HEALTHREGEN;
+
+    self.think = bumb_dinit;
+    self.nextthink = time + 1;
+}
+#endif // SVQC
+
+#ifdef CSQC
+void bumblebee_draw()
+{
+
+}
+
+void bumblebee_draw2d()
+{
+
+}
+
+void bumblebee_read_extra()
+{
+
+}
+
+void vehicle_bumblebee_assemble()
+{
+
+}
+#endif //CSQC
diff --git a/qcsrc/server/vehicles/collision.qc b/qcsrc/server/vehicles/collision.qc
new file mode 100644 (file)
index 0000000..11488a0
--- /dev/null
@@ -0,0 +1,55 @@
+vector collision_force;
+vector collision_angle;
+
+vector bb1[9];
+vector bb2[9];
+
+float collision_run()
+{
+    vector vtmp, vmin, vmax, vrot, vforce, vtmp2, vtmp3;
+    float i, fvel, bcol;
+
+
+    // Extract the 8 bbox corners from mins/maxs for self
+    vmax = self.maxs;
+    vmin = self.mins;
+    bb1[0] = vmax;
+    vtmp   = vmax; vtmp_x = vmin_x; bb1[1] = vtmp;
+    vtmp   = vmax; vtmp_y = vmin_y; bb1[2] = vtmp;
+    vtmp   = vmin; vtmp_z = vmax_z; bb1[3] = vtmp;
+    bb1[4] = vmin;
+    vtmp   = vmin; vtmp_x = vmax_x; bb1[5] = vtmp;
+    vtmp   = vmin; vtmp_y = vmax_y; bb1[6] = vtmp;
+    vtmp   = vmax; vtmp_z = vmin_z; bb1[7] = vtmp;
+
+    makevectors(self.angles + '-2 0 0' * self.angles_x);
+    bcol = 0;
+
+    // Pass1: Transform by rotation, ajust points by impact/s
+    for(i = 8; i >= 0; --i)
+    {
+        vtmp = bb1[i];
+        vtmp = self.origin + vtmp_x * v_forward - vtmp_y * v_right + vtmp_z * v_up;
+        traceline(self.origin, vtmp, MOVE_WORLDONLY, self);
+        te_lightning1(world,self.origin,vtmp);
+        if(trace_fraction != 1.0)
+        {
+            vforce += (trace_endpos - vtmp);
+            vtmp3 = self.origin + self.velocity * frametime;
+            vtmp2 =  vectoangles(normalize(vtmp - vtmp3));
+            vrot   += (vectoangles(normalize(trace_endpos - vtmp3)) - vtmp2);
+            bcol += 1;
+        }
+    }
+
+    if(bcol)
+    {
+
+        vtmp = self.origin + self.velocity * frametime;
+        self.angles += vrot * frametime;
+        self.velocity += vforce * frametime;
+
+    }
+
+}
+
diff --git a/qcsrc/server/vehicles/network.qc b/qcsrc/server/vehicles/network.qc
new file mode 100644 (file)
index 0000000..688aa7c
--- /dev/null
@@ -0,0 +1,237 @@
+#ifdef VEHICLES_CSQC
+// SendFlags
+float VSF_SETUP       = 1;          /// Send vehicle type etc
+float VSF_ORIGIN      = 2;          /// Send location
+float VSF_MOVEMENT    = 4;          /// Send movement update (and angles)
+float VSF_AVEL        = 8;          /// Send Angular velocity
+float VSF_STATS       = 16;         /// Send ammo, health etc
+float VSF_EXTRA       = 32;         /// Send additional data (turret rotations etc). Handeld per vehicle type.
+float VSF_ANIMINFO    = 64;         /// Animation info
+float VSF_FULL_UPDATE = 16777215;    /// Send everything
+
+float VSX_FAR   = 1;
+float VSX_OWNER = 2;
+float VSX_GUN1  = 4;
+float VSX_GUN2  = 8;
+
+#ifdef SVQC
+#define VSX_FARDISTANCE 2000
+float send_vehile(entity to, float sf)
+{
+       float dist, xf;
+
+    var void WriteFunc(float, float);
+
+    dist = vlen(self.origin - to.origin);
+    if(to == self.owner)
+        xf |= VSX_OWNER;
+    else if(dist > VSX_FARDISTANCE)
+        xf |= VSX_FAR;
+
+       // Always send a movement and origin to owner
+       if(to == self.owner)
+           sf |= VSF_ORIGIN | VSF_MOVEMENT;
+
+       WriteByte(MSG_ENTITY, ENT_CLIENT_VEHICLE);
+
+       // We need to know client-side what was sent
+       WriteByte(MSG_ENTITY, sf);
+       WriteByte(MSG_ENTITY, xf);
+
+       if(sf & VSF_SETUP)
+       {
+        WriteByte(MSG_ENTITY,  self.hud);        //vehicle type = hud
+        WriteByte(MSG_ENTITY,  self.team);
+        WriteShort(MSG_ENTITY, self.colormap);
+        WriteShort(MSG_ENTITY, self.vehicle_flags);
+       }
+
+    if(sf & VSF_ORIGIN)
+    {
+        WriteFunc = ((xf & VSX_FAR) ? WriteShort : WriteCoord);
+        WriteFunc(MSG_ENTITY, self.origin_x);
+        WriteFunc(MSG_ENTITY, self.origin_y);
+        WriteFunc(MSG_ENTITY, self.origin_z);
+    }
+
+    if(sf & VSF_MOVEMENT)
+    {
+        WriteFunc = ((xf & VSX_FAR) ? WriteShort : WriteCoord);
+        WriteFunc(MSG_ENTITY, self.velocity_x);
+        WriteFunc(MSG_ENTITY, self.velocity_y);
+        WriteFunc(MSG_ENTITY, self.velocity_z);
+
+        WriteFunc = ((xf & VSX_FAR) ? WriteShort : WriteAngle);
+        WriteFunc(MSG_ENTITY, self.angles_x);
+        WriteFunc(MSG_ENTITY, self.angles_y);
+        WriteFunc(MSG_ENTITY, self.angles_z);
+    }
+
+    if(sf & VSF_AVEL)
+    {
+        WriteFunc = ((xf & VSX_FAR) ? WriteShort : WriteCoord);
+        WriteFunc(MSG_ENTITY, self.avelocity_x);
+        WriteFunc(MSG_ENTITY, self.avelocity_y);
+        WriteFunc(MSG_ENTITY, self.avelocity_z);
+    }
+
+    if(sf & VSF_STATS)
+    {
+        WriteByte(MSG_ENTITY, self.vehicle_health);
+        if(xf & VSX_OWNER)
+        {
+            WriteByte(MSG_ENTITY, self.vehicle_shield);
+            WriteByte(MSG_ENTITY, self.vehicle_energy);
+
+            WriteByte(MSG_ENTITY, self.vehicle_ammo1);
+            WriteByte(MSG_ENTITY, self.vehicle_reload1);
+
+            WriteByte(MSG_ENTITY, self.vehicle_ammo2);
+            WriteByte(MSG_ENTITY, self.vehicle_reload2);
+
+        }
+    }
+
+    if(sf & VSF_EXTRA)
+        self.vehile_send_exta(to, sf);
+
+    return TRUE;
+}
+
+void net_link_vehile()
+{
+    self.SendFlags = 0xFFFFFF;
+    Net_LinkEntity(self, FALSE, 0, send_vehile);
+}
+#endif // SVQC
+
+#ifdef CSQC
+void vehicle_spiderbot_assemble()
+{
+
+}
+
+void vehicle_raptor_assemble()
+{
+
+}
+
+void vehicle_bumblebee_assemble()
+{
+
+}
+
+.float lastupdate;
+void read_vehicle(float bIsNew)
+{
+    float sf, xf;
+    var float ReadFunc();
+
+    sf = ReadByte();
+    xf = ReadByte();
+
+    if(xf & VSX_OWNER)
+        vehicle = self;
+
+       if(sf & VSF_SETUP)
+       {
+        self.vehicle_hud   = ReadByte();
+        self.team          = ReadByte();
+        self.colormap      = ReadShort();
+        self.vehicle_flags = ReadShort();
+
+        switch(self.vehicle_hud)
+        {
+            case HUD_WAKIZASHI:
+                vehicle_racer_assemble();
+                break;
+            case HUD_SPIDERBOT:
+                vehicle_spiderbot_assemble();
+                break;
+            case HUD_RAPTOR:
+                vehicle_raptor_assemble();
+                break;
+            case HUD_BUMBLEBEE:
+                vehicle_bumblebee_assemble();
+                break;
+            default:
+                break;
+        }
+       }
+
+       if(self.vehicle_hud == HUD_WAKIZASHI && xf & VSX_OWNER)
+       {
+
+        vehicle_hudmodel.owner  = self;
+       }
+
+    //if(xf & VSX_FAR)
+    //    dprint("Client vehicle faaar set\n");
+
+    if(sf & VSF_ORIGIN)
+    {
+        ReadFunc = ((xf & VSX_FAR) ? ReadShort : ReadCoord);
+        self.origin_x = ReadFunc();
+        self.origin_y = ReadFunc();
+        self.origin_z = ReadFunc();
+
+        setorigin(self, self.origin);
+        //self.lastupdate = time;
+    }
+
+    if(sf & VSF_MOVEMENT)
+    {
+        ReadFunc = ((xf & VSX_FAR) ? ReadShort : ReadCoord);
+        self.velocity_x  = ReadFunc();
+        self.velocity_y  = ReadFunc();
+        self.velocity_z  = ReadFunc();
+
+        ReadFunc = ((sf & VSX_FAR) ? ReadShort : ReadAngle);
+        self.angles_x = ReadFunc();
+        self.angles_y = ReadFunc();
+        self.angles_z = ReadFunc();
+
+        //self.lastupdate = time;
+        // self.move_velocity  = self.velocity;
+        // self.move_angles    = self.angles;
+    }
+
+    if(sf & VSF_AVEL)
+    {
+        ReadFunc = ((xf & VSX_FAR) ? ReadShort : ReadCoord);
+        self.avelocity_x = ReadFunc();
+        self.avelocity_y = ReadFunc();
+        self.avelocity_z = ReadFunc();
+
+        // self.move_avelocity  = self.avelocity;
+    }
+
+    if(sf & VSF_STATS)
+    {
+        self.vehicle_health = ReadByte();
+        if(xf & VSX_OWNER)
+        {
+            self.vehicle_shield  = ReadByte();
+            self.vehicle_energy  = ReadByte();
+            self.vehicle_ammo1   = ReadByte();
+            self.vehicle_reload1 = ReadByte();
+            self.vehicle_ammo2   = ReadByte();
+            self.vehicle_reload2 = ReadByte();
+        }
+    }
+
+    if(sf & VSF_EXTRA)
+        self.vehile_read_exta(sf);
+
+}
+
+#endif // CSQC
+#else
+#ifdef CSQC
+.float lastupdate;
+void read_vehicle(float bIsNew)
+{
+
+}
+#endif
+#endif // VEHICLES_CSQC
index 09efab4bfc629ef2d81d50b387f636c168f28f47..c20ba7acfdb13a87351cd8960d0b2724ee5243b9 100644 (file)
-#define RACER_MIN '-80 -80 -40'
-#define RACER_MAX '80 80 40'
-#define RACER_TICRATE 0.05
+#define RACER_MIN '-120 -120 -40'
+#define RACER_MAX '120 120 40'
 
+#ifdef SVQC
 void racer_exit(float eject);
 void racer_enter();
-//void racer_think();
 
-float racer_power_air;
-float racer_power_solid;
-float racer_power_min;
-float racer_anglestabilizer;
-float racer_springlength;
-
-float racer_healthmax;
-float racer_shieldmax;
-float racer_energymax;
-
-float racer_pitchspeed;
-float racer_turnspeed;
-float racer_turnroll;
-float racer_speed_forward;
-float racer_speed_strafe;
-
-float racer_afterburn_cost;
-
-float  jetfromtag_power;
-float  jetfromtag_normpower;
-vector jetfromtag_origin;
-float  jetfromtag_groundcontact;
-
-void racer_loadsettings()
-{
-    racer_power_min         = autocvar_g_vehicle_racer_power_min   * 0.25;
-    racer_power_air         = autocvar_g_vehicle_racer_power_air   * 0.25;
-    racer_power_solid       = autocvar_g_vehicle_racer_power_solid * 0.25;
-
-    racer_springlength      = autocvar_g_vehicle_racer_springlength;
-    racer_anglestabilizer   = autocvar_g_vehicle_racer_anglestabilizer;
-    racer_pitchspeed        = autocvar_g_vehicle_racer_pitchspeed;
-    racer_turnspeed         = autocvar_g_vehicle_racer_turnspeed;
-    racer_turnroll          = autocvar_g_vehicle_racer_turnroll;
-    racer_speed_forward     = autocvar_g_vehicle_racer_speed_forward;
-    racer_speed_strafe      = autocvar_g_vehicle_racer_speed_strafe;
-
-    racer_afterburn_cost    = autocvar_g_vehicle_racer_afterburn_cost;
-
-    racer_healthmax = autocvar_g_vehicle_racer_health;
-    racer_shieldmax = autocvar_g_vehicle_racer_shield;
-    racer_energymax = autocvar_g_vehicle_racer_energy;
-
-}
-
-vector racer_jetfromtag(string tagname)
-{
-    vector force_dir;
-    float  air_frac, solid_frac, air_pwr, solid_pwr;
-
-    jetfromtag_origin = gettaginfo(self,gettagindex(self,tagname));
-    v_forward  = normalize(v_forward) * -1;
-
-    force_dir = jetfromtag_origin - (v_forward  * racer_springlength);
-    traceline(jetfromtag_origin, force_dir, MOVE_NORMAL, self);
-    //te_lightning1(world,jetfromtag_origin, force_dir);
-
-    //trace_fraction *= trace_fraction;
-
-    solid_frac = 1 - trace_fraction;
-    air_frac = trace_fraction;
-
-    if (trace_fraction != 1.0)
-        jetfromtag_groundcontact = 1;
-
-    solid_pwr = solid_frac * racer_power_solid;
-    air_pwr   = air_frac * racer_power_air;
-
-    jetfromtag_power     = solid_pwr + air_pwr;
-    jetfromtag_normpower = jetfromtag_power / (racer_power_air + racer_power_solid);
-
-    //te_lightning1(world,jetfromtag_origin,jetfromtag_origin + normalize(self.origin - force_dir) * max(jetfromtag_power, racer_power_min));
-    //return normalize(self.origin - force_dir) * max(jetfromtag_power, racer_power_min);
-    return v_forward  * max(jetfromtag_power, racer_power_min);
-}
+// Auto cvars
+float autocvar_g_vehicle_racer_speed_afterburn;
+float autocvar_g_vehicle_racer_afterburn_cost;
+
+float autocvar_g_vehicle_racer_anglestabilizer;
+float autocvar_g_vehicle_racer_downforce;
+
+float autocvar_g_vehicle_racer_speed_forward;
+float autocvar_g_vehicle_racer_speed_strafe;
+float autocvar_g_vehicle_racer_springlength;
+float autocvar_g_vehicle_racer_upforcedamper;
+float autocvar_g_vehicle_racer_friction;
+
+float autocvar_g_vehicle_racer_hovertype;
+float autocvar_g_vehicle_racer_hoverpower;
+
+float autocvar_g_vehicle_racer_turnroll;
+float autocvar_g_vehicle_racer_turnspeed;
+float autocvar_g_vehicle_racer_pitchspeed;
+
+float autocvar_g_vehicle_racer_energy;
+float autocvar_g_vehicle_racer_energy_regen;
+float autocvar_g_vehicle_racer_energy_regen_pause;
+
+float autocvar_g_vehicle_racer_health;
+float autocvar_g_vehicle_racer_health_regen;
+float autocvar_g_vehicle_racer_health_regen_pause;
+
+float autocvar_g_vehicle_racer_shield;
+float autocvar_g_vehicle_racer_shield_regen;
+float autocvar_g_vehicle_racer_shield_regen_pause;
+
+float autocvar_g_vehicle_racer_cannon_cost;
+float autocvar_g_vehicle_racer_cannon_damage;
+float autocvar_g_vehicle_racer_cannon_radius;
+float autocvar_g_vehicle_racer_cannon_refire;
+float autocvar_g_vehicle_racer_cannon_speed;
+float autocvar_g_vehicle_racer_cannon_spread;
+float autocvar_g_vehicle_racer_cannon_force;
+
+float autocvar_g_vehicle_racer_rocket_accel;
+float autocvar_g_vehicle_racer_rocket_damage;
+float autocvar_g_vehicle_racer_rocket_radius;
+float autocvar_g_vehicle_racer_rocket_force;
+float autocvar_g_vehicle_racer_rocket_refire;
+float autocvar_g_vehicle_racer_rocket_speed;
+float autocvar_g_vehicle_racer_rocket_turnrate;
+
+float autocvar_g_vehicle_racer_rocket_locktarget;
+float autocvar_g_vehicle_racer_rocket_locking_time;
+float autocvar_g_vehicle_racer_rocket_locking_releasetime;
+float autocvar_g_vehicle_racer_rocket_locked_time;
+float autocvar_g_vehicle_racer_rocket_locked_maxangle;
+
+float autocvar_g_vehicle_racer_respawntime;
+
+float autocvar_g_vehicle_racer_blowup_radius;
+float autocvar_g_vehicle_racer_blowup_coredamage;
+float autocvar_g_vehicle_racer_blowup_edgedamage;
+float autocvar_g_vehicle_racer_blowup_forceintensity;
+
+var vector racer_force_from_tag(string tag_name, float spring_length, float max_power);
 
 void racer_align4point()
 {
-    vector push_vector;
+    vector push_vector, v_add;
     float fl_push, fr_push, bl_push, br_push;
 
-    jetfromtag_groundcontact = 0;
 
-    push_vector = racer_jetfromtag("tag_engine_fr");
-    fr_push = jetfromtag_normpower;
-    traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
-    if(trace_fraction != 1)
-        self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
+    push_vector  = racer_force_from_tag("tag_engine_fr", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+    fr_push      = force_fromtag_normpower;
+    //vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier);
+
+    push_vector += racer_force_from_tag("tag_engine_fl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+    fl_push      = force_fromtag_normpower;
+    //vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier);
 
-    push_vector += racer_jetfromtag("tag_engine_fl");
-    fl_push = jetfromtag_normpower;
-    traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
-    if(trace_fraction != 1)
-        self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
+    push_vector += racer_force_from_tag("tag_engine_br", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+    br_push      = force_fromtag_normpower;
+    //vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier);
 
-    push_vector += racer_jetfromtag("tag_engine_br");
-    br_push = jetfromtag_normpower;
-    traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
-    if(trace_fraction != 1)
-        self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
+    push_vector += racer_force_from_tag("tag_engine_bl", autocvar_g_vehicle_racer_springlength, autocvar_g_vehicle_racer_hoverpower);
+    bl_push      = force_fromtag_normpower;
+    //vehicles_sweap_collision(force_fromtag_origin, self.velocity, frametime, v_add, autocvar_g_vehicle_racer_collision_multiplier);
 
-    push_vector += racer_jetfromtag("tag_engine_bl");
-    bl_push = jetfromtag_normpower;
-    traceline(jetfromtag_origin, jetfromtag_origin + self.velocity * frametime, MOVE_NORMAL,self);
-    if(trace_fraction != 1)
-        self.velocity += normalize(self.origin - trace_endpos) * (vlen(self.velocity) * 1.25);
+    self.velocity += (push_vector * frametime);
 
-    self.velocity =  self.velocity + (push_vector * frametime);
-    self.velocity_z -= autocvar_sv_gravity * frametime;
+    // Anti ocilation
+    if(self.velocity_z  > 0)
+        self.velocity_z *= 1 - (autocvar_g_vehicle_racer_upforcedamper * frametime);
 
-    push_vector_x = (fl_push - bl_push);
+    self.velocity   += v_add;
+    //self.velocity_z -= autocvar_sv_gravity * frametime;
+
+    push_vector_x =  (fl_push - bl_push);
     push_vector_x += (fr_push - br_push);
     push_vector_x *= 360;
 
@@ -124,105 +107,42 @@ void racer_align4point()
     push_vector_z += (br_push - bl_push);
     push_vector_z *= 360;
 
-    //if (push_vector_z != 0)
-        if(self.angles_z > 0)
-            self.angles_z = max(0, self.angles_z - (racer_anglestabilizer * frametime));
-        else
-            self.angles_z = min(0, self.angles_z + (racer_anglestabilizer * frametime));
-    //else
-        self.angles_z += push_vector_z * frametime;
+    // Apply angle diffrance
+    self.angles_z += push_vector_z * frametime;
+    self.angles_x += push_vector_x * frametime;
 
-    //if (push_vector_x != 0)
-        if(self.angles_x > 0)
-            self.angles_x = max(0, self.angles_x - (racer_anglestabilizer * frametime));
-        else
-            self.angles_x = min(0, self.angles_x + (racer_anglestabilizer * frametime));
-    //else
-        self.angles_x += push_vector_x * frametime;
-}
-
-void racer_bolt_explode()
-{
-    vector org2;
-
-    org2 = findbetterlocation (self.origin, 8);
-    pointparticles(particleeffectnum("laser_impact"), org2, trace_plane_normal * 1000, 1);
-    RadiusDamage (self, self.realowner, autocvar_g_vehicle_racer_laser_damage, 0, autocvar_g_vehicle_racer_laser_radius, world, 150, DEATH_WAKIGUN, world);
-    sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
-
-    remove (self);
-}
-
-void racer_rocket_explode()
-{
-    vector org2;
-
-    //if not(self.owner)
-    //    self.owner = self.realowner;
-
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    org2 = findbetterlocation (self.origin, 16);
-    pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
-    RadiusDamage (self, self.realowner ,autocvar_g_vehicle_racer_rocket_damage, 0, autocvar_g_vehicle_racer_rocket_radius, world, 150, DEATH_WAKIROCKET, world);
-
-    remove (self);
-}
-
-void racer_rocket_touch()
-{
-    if(other.owner == self.owner)
-        return;
-
-    PROJECTILE_TOUCH;
-    /*
-    if(pointcontents(self.origin) == CONTENT_SKY)
-    {
-        self.think = SUB_Remove;
-        self.nextthink = time;
-        return;
-    }
-    */
-
-    racer_rocket_explode();
+    // Apply stabilizer
+    self.angles_x *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * frametime);
+    self.angles_z *= 1 - (autocvar_g_vehicle_racer_anglestabilizer * frametime);
 }
 
 void racer_fire_cannon(string tagname)
 {
+    vector v;
     entity bolt;
 
-    bolt = spawn();
-    bolt.solid           = SOLID_TRIGGER;
-    bolt.movetype        = MOVETYPE_FLYMISSILE;
-    bolt.flags           = FL_PROJECTILE | FL_NOTARGET;
-    bolt.owner           = self;
-    bolt.realowner       = self.owner;
-    bolt.touch           = racer_bolt_explode;
-    bolt.think           = racer_bolt_explode;
-    bolt.nextthink       = time + 9;
-    bolt.bot_dodge       = TRUE;
-    bolt.bot_dodgerating = autocvar_g_vehicle_racer_laser_damage;
-    setorigin(bolt, gettaginfo(self,gettagindex(self,tagname)));
+    v = gettaginfo(self, gettagindex(self, tagname));
+    bolt = vehicles_projectile("wakizashi_gun_muzzleflash", "weapons/lasergun_fire.wav",
+                           v, normalize(v_forward + randomvec() * autocvar_g_vehicle_racer_cannon_spread) * autocvar_g_vehicle_racer_cannon_speed,
+                           autocvar_g_vehicle_racer_cannon_damage, autocvar_g_vehicle_racer_cannon_radius, autocvar_g_vehicle_racer_cannon_force,  0,
+                           DEATH_WAKIGUN, PROJECTILE_WAKICANNON, 0, TRUE, TRUE);
 
-    vector v;
-       // FIXME this uses prydon cursor
-    v = normalize(self.owner.cursor_trace_endpos - bolt.origin);
+       // Fix z-aim (for chase mode)
+    v = normalize(trace_endpos - bolt.origin);
     v_forward_z = v_z * 0.5;
-
-    bolt.velocity = v_forward * autocvar_g_vehicle_racer_laser_speed;
-
-    CSQCProjectile(bolt, TRUE, PROJECTILE_LASER, TRUE);
+    bolt.velocity = v_forward * autocvar_g_vehicle_racer_cannon_speed;
 }
 
 void racer_rocket_groundhugger()
 {
-    vector newdir,olddir;
-    float oldspeed, newspeed;
+    vector olddir, newdir;
+    float oldvel, newvel;
 
     self.nextthink  = time;
 
-    if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time))
+    if(self.owner.deadflag != DEAD_NO || self.cnt < time)
     {
-        racer_rocket_explode();
+        self.use();
         return;
     }
 
@@ -232,35 +152,45 @@ void racer_rocket_groundhugger()
         return;
     }
 
-    olddir   = normalize(self.velocity);
-    oldspeed = vlen(self.velocity);
+    olddir = normalize(self.velocity);
+    oldvel = vlen(self.velocity);
+    newvel = oldvel + self.lip;
 
-    tracebox(self.origin, self.mins, self.maxs, self.origin + olddir * 512, MOVE_WORLDONLY,self);
-    if(trace_fraction >= 0.35)
+    tracebox(self.origin, self.mins, self.maxs, self.origin + olddir * 64, MOVE_WORLDONLY,self);
+    if(trace_fraction <= 0.5)
     {
-        traceline(trace_endpos, trace_endpos - '0 0 512', MOVE_NORMAL, self);
-        if(trace_fraction != 1.0)
-            newdir = trace_endpos + '0 0 32';
-
-        newdir = normalize(newdir - self.origin);
+        // Hitting somethign soon, just speed ahead
+        self.velocity = olddir * newvel;
+        UpdateCSQCProjectile(self);
+        return;
     }
 
-    newspeed = oldspeed + self.lip;
-    self.velocity = normalize(olddir + newdir * self.wait) * newspeed;
+    traceline(trace_endpos, trace_endpos - '0 0 64', MOVE_NORMAL, self);
+    if(trace_fraction != 1.0)
+    {
+        newdir = normalize(trace_endpos + '0 0 64' - self.origin) * autocvar_g_vehicle_racer_rocket_turnrate;
+        self.velocity = normalize(olddir + newdir) * newvel;
+    }
+    else
+    {
+        self.velocity = olddir * newvel;
+        self.velocity_z -= 1600 * sys_frametime; // 2x grav looks better for this one
+    }
 
     UpdateCSQCProjectile(self);
+    return;
 }
 
-void racer_rocket_think()
+void racer_rocket_tracker()
 {
-    vector newdir,olddir, eorg, edir;
-    float oldspeed, newspeed, dist;
+    vector olddir, newdir;
+    float oldvel, newvel;
 
     self.nextthink  = time;
 
-    if ((self.owner.deadflag != DEAD_NO) || (self.cnt < time))
+    if (self.owner.deadflag != DEAD_NO || self.cnt < time)
     {
-        racer_rocket_explode();
+        self.use();
         return;
     }
 
@@ -271,115 +201,71 @@ void racer_rocket_think()
     }
 
     olddir = normalize(self.velocity);
-    oldspeed = vlen(self.velocity);
-    fixedmakevectors(olddir);
-    eorg = 0.5 * (self.enemy.absmin + self.enemy.absmax);
-    edir = normalize(eorg - self.origin);
-    dist = vlen(self.origin - self.enemy.origin);
+    oldvel = vlen(self.velocity);
+    newvel = oldvel + self.lip;
+    makevectors(vectoangles(olddir));
+
+    traceline(self.origin, self.origin + v_forward * 64 - '0 0 32', MOVE_NORMAL, self);
+    newdir = normalize(self.enemy.origin - self.origin);
 
-    if(dist > 512)
+    if(vlen(newdir - v_forward) > autocvar_g_vehicle_racer_rocket_locked_maxangle)
     {
-        vector ddir;
-        float p;
-        p = dist / self.delay;
-        p = max(0.05, p * 0.25);
-        ddir = steerlib_traceavoid(p, oldspeed * 0.25);
-        edir += ddir * 0.95;
+        //bprint("Target lost!\n");
+        //dprint("OF:", ftos(vlen(newdir - v_forward)), "\n");
+        self.think = racer_rocket_groundhugger;
+        return;
     }
 
-    newdir = normalize(olddir + edir * self.wait);
-    newspeed = oldspeed + self.lip;
-    self.velocity = normalize(olddir + newdir * self.wait) * newspeed;
+    if(trace_fraction != 1.0)
+        newdir_z += 16 * sys_frametime;
+
+    self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_racer_rocket_turnrate) * newvel;
+    self.velocity_z -= 800 * sys_frametime;
 
     UpdateCSQCProjectile(self);
+    return;
 }
 
-void racer_fire_rocket(string tagname)
+void racer_fire_rocket(string tagname, entity trg)
 {
+    vector v;
     entity rocket;
 
-    rocket = spawn();
-    setsize (rocket, '-1 -1 -1', '1 1 1');
-    rocket.lip             = autocvar_g_vehicle_racer_rocket_accel * sys_frametime;
-    rocket.wait            = autocvar_g_vehicle_racer_rocket_turnrate;
-    rocket.solid           = SOLID_BBOX;
-    rocket.movetype        = MOVETYPE_FLYMISSILE;
-    rocket.flags           = FL_PROJECTILE;
-    rocket.owner           = self;
-    rocket.realowner       = self.owner;
-    rocket.touch           = racer_rocket_touch;
-    rocket.bot_dodge       = TRUE;
-    rocket.bot_dodgerating = autocvar_g_vehicle_racer_rocket_damage;
-    setorigin(rocket, gettaginfo(self,gettagindex(self,tagname)));
-
-    /*
-    if( (self.tur_head.gun1) && (self.tur_head.cnt > time))
-        rocket.enemy = self.tur_head.gun1;
-
-    if(rocket.enemy)
-    {
-        rocket.delay           = vlen(rocket.enemy.origin  - rocket.origin);
-        rocket.cnt             = time + 9;
-        rocket.velocity = v_forward * autocvar_g_vehicle_racer_rocket_speed;
-        rocket.think = racer_rocket_think;
-        rocket.nextthink = time;
-        CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
-    }
-    else
-    {
-    */
-        rocket.cnt             = time + 9;
-        rocket.velocity = v_forward * autocvar_g_vehicle_racer_rocket_speed;
-        rocket.think = racer_rocket_groundhugger;
-        rocket.nextthink = time;
-        CSQCProjectile(rocket, TRUE, PROJECTILE_ROCKET, TRUE);
-    //}
-}
-
-float racer_customizeentityforclient()
-{
+    v = gettaginfo(self, gettagindex(self, tagname));
+    rocket = vehicles_projectile("wakizashi_rocket_launch", "weapons/rocket_fire.wav",
+                           v, v_forward * autocvar_g_vehicle_racer_rocket_speed,
+                           autocvar_g_vehicle_racer_rocket_damage, autocvar_g_vehicle_racer_rocket_radius, autocvar_g_vehicle_racer_rocket_force, 3,
+                           DEATH_WAKIROCKET, PROJECTILE_WAKIROCKET, 20, FALSE, FALSE);
 
-    if(self.deadflag == DEAD_DEAD)
-        return FALSE;
+    rocket.lip              = autocvar_g_vehicle_racer_rocket_accel * sys_frametime;
+    rocket.wait             = autocvar_g_vehicle_racer_rocket_turnrate;
+    rocket.nextthink        = time;
+    rocket.enemy            = trg;
+    rocket.cnt              = time + 15;
 
-    /*
-    if(other == self.owner)
-        self.alpha = -1;
+    if(trg)
+        rocket.think            = racer_rocket_tracker;
     else
-        self.alpha = 1;
-    */
-
-    return TRUE;
+        rocket.think            = racer_rocket_groundhugger;
 }
 
-float racer_pplug()
+float racer_frame()
 {
     entity player, racer;
-    float ftmp, ftmp2;
     vector df;
-
-    if(autocvar_g_vehicle_racer_reload)
-    {
-        racer_loadsettings();
-        cvar_set("g_vehicle_racer_reload","0");
-    }
-
-    player          = self;
-    racer           = self.vehicle;
-
-    player.BUTTON_ZOOM = 0;
-    player.BUTTON_CROUCH = 0;
-
-    self = racer;
-
-    if(player.BUTTON_USE)
-    {
-        self = racer;
-        racer_exit(0);
-        self = player;
-        return 0;
-    }
-
+    float ftmp;
+
+       if(intermission_running)
+               return 1;
+
+    player  = self;
+    racer   = self.vehicle;
+    self    = racer;
+    
+    player.BUTTON_ZOOM = player.BUTTON_CROUCH = 0;
+    
+    vehicles_painframe();
+    
     if(racer.deadflag != DEAD_NO)
     {
         self = player;
@@ -387,66 +273,100 @@ float racer_pplug()
         return 1;
     }
 
-
     racer_align4point();
 
-    racer.angles_x *= -1;
-    makevectors(racer.angles);
+    crosshair_trace(player);
 
-    // Rotate Body
-    ftmp = racer_turnspeed * sys_frametime;
-    ftmp2 = ftmp * -1;
+    racer.angles_x *= -1;
 
-    ftmp = bound(ftmp2, shortangle_f(player.v_angle_y - racer.angles_y, racer.angles_y), ftmp);
-    ftmp2 = anglemods(racer.angles_y + ftmp);
+    // Yaw
+    ftmp = autocvar_g_vehicle_racer_turnspeed * frametime;
+    ftmp = bound(-ftmp, shortangle_f(player.v_angle_y - racer.angles_y, racer.angles_y), ftmp);
+    racer.angles_y = anglemods(racer.angles_y + ftmp);
 
     // Roll
-    ftmp = bound(-45, shortangle_f(player.v_angle_z + ((racer.angles_y - ftmp2) * racer_turnroll), racer.angles_z), 45);
-    ftmp = anglemods(racer.angles_z + ftmp);
-    racer.angles_z = bound(-85, ftmp, 85);
-
-    // Turn
-    racer.angles_y = ftmp2;
+    racer.angles_z += -ftmp * autocvar_g_vehicle_racer_turnroll * frametime;
 
-    // Pitch Body
-    ftmp = racer_pitchspeed * sys_frametime;
-    ftmp2 = ftmp * -1;
+    // Pitch
+    ftmp = autocvar_g_vehicle_racer_pitchspeed  * frametime;
+    ftmp = bound(-ftmp, shortangle_f(player.v_angle_x - racer.angles_x, racer.angles_x), ftmp);
+    racer.angles_x = bound(-30, anglemods(racer.angles_x + ftmp), 30);
 
-    ftmp = bound(ftmp2,shortangle_f(player.v_angle_x - racer.angles_x,racer.angles_x),ftmp);
-    racer.angles_x = anglemods(racer.angles_x + ftmp);
+    makevectors(racer.angles);
     racer.angles_x *= -1;
 
-    df = racer.velocity * -0.5;
+
+    ftmp = racer.velocity_z;
+    df = racer.velocity * -autocvar_g_vehicle_racer_friction;
+    racer.velocity_z = ftmp;
 
     if(player.movement_x != 0)
     {
         if(player.movement_x > 0)
-            df += v_forward  * racer_speed_forward;
+            df += v_forward  * autocvar_g_vehicle_racer_speed_forward;
         else if(player.movement_x < 0)
-            df -= v_forward  * racer_speed_forward;
+            df -= v_forward  * autocvar_g_vehicle_racer_speed_forward;
     }
 
     if(player.movement_y != 0)
     {
         if(player.movement_y < 0)
-            df -= v_right * racer_speed_strafe;
+            df -= v_right * autocvar_g_vehicle_racer_speed_strafe;
         else if(player.movement_y > 0)
-            df += v_right * racer_speed_strafe;
+            df += v_right * autocvar_g_vehicle_racer_speed_strafe;
     }
-
-    // limit _z to avoid flying on normal thrust
-    if(df_z > 0)
-        df_z = min(df_z,700);
-
-
+    
+    if(vlen(player.movement) != 0)
+    {
+        if(self.sound_nexttime < time || self.sounds != 1)
+        {        
+            self.sounds = 1;
+            self.sound_nexttime = time + 10.922667; //soundlength("vehicles/racer_move.wav");
+            sound (self, CHAN_TRIGGER, "vehicles/racer_move.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+        }
+    }
+    else
+    {        
+        if(self.sound_nexttime < time || self.sounds != 0)
+        {        
+            self.sounds = 0;
+            self.sound_nexttime = time + 11.888604; //soundlength("vehicles/racer_idle.wav");
+            sound (self, CHAN_TRIGGER, "vehicles/racer_idle.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+        }        
+    }
+    
     // Afterburn
-    if (player.BUTTON_JUMP)
-    if(racer.vehicle_energy >= (racer_afterburn_cost * frametime))
+    if (player.BUTTON_JUMP && racer.vehicle_energy >= (autocvar_g_vehicle_racer_afterburn_cost * frametime))
     {
-        racer.wait = time + autocvar_g_vehicle_racer_energy_usepause;
-        racer.vehicle_energy -= racer_afterburn_cost * frametime;
+        if(time - racer.wait > 0.2)
+            pointparticles(particleeffectnum("wakizashi_booster_smoke"), self.origin, '0 0 0', 1);            
+        
+        racer.wait = time;
+        racer.vehicle_energy -= autocvar_g_vehicle_racer_afterburn_cost * frametime;
         df += (v_forward * autocvar_g_vehicle_racer_speed_afterburn);
+        
+        if(self.invincible_finished < time)
+        {            
+            traceline(self.origin, self.origin - '0 0 256', MOVE_NORMAL, self);
+            if(trace_fraction != 1.0)
+                pointparticles(particleeffectnum("smoke_small"), trace_endpos, '0 0 0', 1);
+            
+            self.invincible_finished = time + 0.1 + (random() * 0.1);
+        }
+
+        if(self.strength_finished < time)
+        {        
+            //self.sounds = 2;
+            self.strength_finished = time + 10.922667; //soundlength("vehicles/racer_boost.wav");
+            sound (self, CHAN_PAIN, "vehicles/racer_boost.wav", VOL_VEHICLEENGINE, ATTN_NORM);            
+        }        
+    }
+    else
+    {
+        self.strength_finished = 0;
+        sound (self, CHAN_PAIN, "misc/null.wav", VOL_VEHICLEENGINE, ATTN_NORM);
     }
+        
 
     racer.velocity  += df * frametime;
 
@@ -454,23 +374,14 @@ float racer_pplug()
     racer.velocity  = racer.velocity - df;
     player.movement = racer.velocity;
 
-    /*
-    // for homing rockets
-       // FIXME this uses prydon cursor
-    if(self.owner.cursor_trace_ent)
-    {
-        self.tur_head.gun1 = self.owner.cursor_trace_ent;
-        self.tur_head.cnt = time + 1;
-    }
-    */
-
     if(player.BUTTON_ATCK)
     if(time > racer.attack_finished_single)
-    if(racer.vehicle_energy >= autocvar_g_vehicle_racer_laser_cost)
+    if(racer.vehicle_energy >= autocvar_g_vehicle_racer_cannon_cost)
     {
-        racer.vehicle_energy -= autocvar_g_vehicle_racer_laser_cost;
-        racer.wait = time + autocvar_g_vehicle_racer_energy_usepause;
+        racer.vehicle_energy -= autocvar_g_vehicle_racer_cannon_cost;
+        racer.wait = time;
 
+        crosshair_trace(player);
         if(racer.cnt)
         {
             racer_fire_cannon("tag_fire1");
@@ -481,306 +392,189 @@ float racer_pplug()
             racer_fire_cannon("tag_fire2");
             racer.cnt = 1;
         }
-        racer.attack_finished_single = time + autocvar_g_vehicle_racer_laser_refire;
+        racer.attack_finished_single = time + autocvar_g_vehicle_racer_cannon_refire;
+        //self.owner.vehicle_energy = racer.vehicle_energy / autocvar_g_vehicle_racer_energy;
     }
 
-    if(player.BUTTON_ATCK2)
-    if(time > racer.delay)
+    if(autocvar_g_vehicle_racer_rocket_locktarget)
     {
-        racer_fire_rocket("tag_rocket_r");
-        racer_fire_rocket("tag_rocket_l");
-        racer.delay = time + autocvar_g_vehicle_racer_rocket_refire;
-        racer.lip = time;
+        vehicles_locktarget((1 / autocvar_g_vehicle_racer_rocket_locking_time) * frametime,
+                         (1 / autocvar_g_vehicle_racer_rocket_locking_releasetime) * frametime,
+                         autocvar_g_vehicle_racer_rocket_locked_time);
 
+        if(self.lock_target)
+        {
+            if(racer.lock_strength == 1)
+                UpdateAuxiliaryXhair(player, real_origin(self.lock_target), '1 0 0', 0);
+            else if(self.lock_strength > 0.5)
+                UpdateAuxiliaryXhair(player, real_origin(self.lock_target), '0 1 0', 0);
+            else if(self.lock_strength < 0.5)
+                UpdateAuxiliaryXhair(player, real_origin(self.lock_target), '0 0 1', 0);
+        }
     }
 
-    player.vehicle_reload1 = (time - racer.lip) / (racer.delay-racer.lip);
-    vehicle_stdproc_shiledregen(racer_shieldmax, frametime);
-    vehicle_stdproc_healthregen(racer_healthmax, frametime);
-
-    if (racer.wait < time)
-        vehicle_stdproc_energyregen(racer_energymax, frametime);
-    else
-        player.vehicle_energy = (racer.vehicle_energy / racer_energymax);
-
-    self = player;
+    if(time > racer.delay)
+    if(player.BUTTON_ATCK2)
+    {
+        self.misc_bulletcounter += 1;
+        racer.delay = time + 0.3;
+        if(self.misc_bulletcounter == 1)
+            racer_fire_rocket("tag_rocket_r", (self.lock_strength == 1 && self.lock_target) ? self.lock_target : world);
+        else if(self.misc_bulletcounter == 2)
+        {
+            racer_fire_rocket("tag_rocket_l", (self.lock_strength == 1 && self.lock_target) ? self.lock_target : world);
+            self.lock_strength  = 0;
+            self.lock_target    = world;
+            self.misc_bulletcounter = 0;
 
-    player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
-    setorigin(player,racer.origin + '0 0 32');
-    player.velocity = racer.velocity;
+            racer.delay = time + autocvar_g_vehicle_racer_rocket_refire;
+            racer.lip = time;
+        }
+    }
+    player.vehicle_reload1 = bound(0, 100 * ((time - racer.lip) / (racer.delay - racer.lip)), 100);
 
-    return 1;
-}
+    if(self.vehicle_flags  & VHF_SHIELDREGEN)
+        vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_racer_shield, autocvar_g_vehicle_racer_shield_regen_pause, autocvar_g_vehicle_racer_shield_regen, frametime);
 
-void racer_exitthink()
-{
-    float a, b, c;
+    if(self.vehicle_flags  & VHF_HEALTHREGEN)
+        vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_racer_health, autocvar_g_vehicle_racer_health_regen_pause, autocvar_g_vehicle_racer_health_regen, frametime);
 
-    self.nextthink = time;
+    if(self.vehicle_flags  & VHF_ENERGYREGEN)
+        vehicles_regen(wait, vehicle_energy, autocvar_g_vehicle_racer_energy, autocvar_g_vehicle_racer_energy_regen_pause, autocvar_g_vehicle_racer_energy_regen, frametime);
 
-    a = racer_anglestabilizer;
-    b = racer_springlength;
-    c = racer_power_solid;
 
-    racer_anglestabilizer = 36;
-    racer_springlength = 96;
-    racer_power_solid = 300;
+    VEHICLE_UPDATE_PLAYER(health, racer);
+    VEHICLE_UPDATE_PLAYER(energy, racer);
 
-    racer_align4point();
+    if(self.vehicle_flags & VHF_HASSHIELD)
+        VEHICLE_UPDATE_PLAYER(shield, racer);
 
-    if(self.velocity_z < 0)
-        self.velocity_z *= 0.95;
 
-    racer_anglestabilizer = a;
-    racer_springlength = b;
-    racer_power_solid = c;
+    player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
+    setorigin(player,racer.origin + '0 0 32');
+    player.velocity = racer.velocity;
 
-    self.velocity_x *= 0.95;
-    self.velocity_y *= 0.95;
+    self = player;
+    return 1;
 }
 
-void racer_spawnthink()
+void racer_think()
 {
-    float a, b, c;
-    vector dorg;
-
-    self.nextthink = time;
-
-    a = racer_anglestabilizer;
-    b = racer_springlength;
-    c = racer_power_solid;
-
-    racer_anglestabilizer = 36;
-    racer_springlength = 96;
-    racer_power_solid = 300;
-
-    // self.velocity_z += sin(time * 128) * 4;
-
-    racer_align4point();
+    /*
+    float a, b, c;a = autocvar_g_vehicle_racer_anglestabilizer;
+    b = autocvar_g_vehicle_racer_springlength;
+    c = autocvar_g_vehicle_racer_hoverpower;
 
-    if(self.velocity_z < 0)
-        self.velocity_z *= 0.98;
+    autocvar_g_vehicle_racer_anglestabilizer = 36;
+    autocvar_g_vehicle_racer_springlength = 96;
+    autocvar_g_vehicle_racer_hoverpower = 300;
+    */
 
-    racer_anglestabilizer = a;
-    racer_springlength = b;
-    racer_power_solid = c;
+    racer_align4point(); //time - self.nextthink);
 
-    self.velocity_x *= 0.95;
-    self.velocity_y *= 0.95;
+    /*
+    //if(self.velocity_z > 0)
+    //    self.velocity_z *= 0.95;
 
-    dorg = self.pos1 - self.origin ;
+    autocvar_g_vehicle_racer_anglestabilizer = a;
+    autocvar_g_vehicle_racer_springlength = b;
+    autocvar_g_vehicle_racer_hoverpower = c;
+    */
 
-    self.velocity_x = bound(-32, self.velocity_x + dorg_x, 32);
-    self.velocity_y = bound(-32, self.velocity_y + dorg_y, 32);
+    self.velocity_x *= 0.9;
+    self.velocity_y *= 0.9;
+    self.velocity_z *= 0.8;
+    self.velocity_z += sin(time * 2) * 16;
+    self.nextthink = time; // + 0.05;
 }
 
 void racer_enter()
 {
-    self.owner = other;
-
-
-    self.nextthink = 0;
-    self.flags               = 0;
-    self.vehicle_hudmodel.viewmodelforclient = self.owner;
-    self.colormap             = self.owner.colormap;
-
-    self.owner.PlayerPhysplug = racer_pplug;
-    self.owner.takedamage     = DAMAGE_NO;
-    self.owner.event_damage   = SUB_Null;
-    self.owner.vehicle        = self;
-    self.owner.angles = self.angles;
-    self.owner.solid          = SOLID_NOT;
-    self.owner.movetype       = MOVETYPE_NOCLIP;
-    self.owner.alpha          = -1;
-    self.owner.hud            = HUD_WAKIZASHI;
-    self.owner.effects        |= EF_NODRAW;
-    self.owner.view_ofs = '0 0 0';
-
+    self.movetype = MOVETYPE_BOUNCE;
     self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_racer_health);
     self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_racer_shield);
-
-    setorigin(other,self.origin + '0 0 32');
-    other.velocity = self.velocity;
-
-    other.flags &~= FL_ONGROUND;
-    msg_entity = other;
-    WriteByte (MSG_ONE, SVC_SETVIEWPORT);
-    WriteEntity( MSG_ONE, self.vehicle_viewport);
-
-    WriteByte (MSG_ONE, SVC_SETVIEWANGLES); // 10 = SVC_SETVIEWANGLES
-    WriteAngle(MSG_ONE,  self.angles_x * -1);    // tilt
-    WriteAngle(MSG_ONE,  self.angles_y);    // yaw
-    WriteAngle(MSG_ONE,  0);                // roll
-}
-
-void racer_spawn();
-void racer_return()
-{
-    pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1);
-    self.enemy.think = racer_spawn;
-    self.enemy.nextthink = time;
-    remove(self);
+    
+    if(self.owner.flagcarried)
+       setorigin(self.owner.flagcarried, '-190 0 96');
 }
 
 void racer_exit(float eject)
 {
-       self.colormap   = 1024;
-       self.flags      = FL_NOTARGET;
-
+    vector spot;
+    
+    self.think      = racer_think;
+    self.nextthink  = time;
+    self.movetype   = MOVETYPE_TOSS;
+    sound (self, CHAN_PAIN, "misc/null.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+    
     if not (self.owner)
         return;
 
-    msg_entity = self.owner;
-    WriteByte (MSG_ONE, SVC_SETVIEWPORT);
-    WriteEntity( MSG_ONE, self.owner);
-
-    WriteByte (MSG_ONE, SVC_SETVIEWANGLES);    // 10 = SVC_SETVIEWANGLES
-    WriteAngle(MSG_ONE,  0);                   // tilt
-    WriteAngle(MSG_ONE,  self.angles_y); // yaw
-    WriteAngle(MSG_ONE,  0);                   // roll
-
-    if (self.deadflag == DEAD_NO)
-    {
-        self.think = racer_exitthink;
-        self.nextthink = time;
-    }
-
-    self.owner.takedamage     = DAMAGE_AIM;
-    self.owner.solid          = SOLID_SLIDEBOX;
-    self.owner.movetype       = MOVETYPE_WALK;
-
-    setsize(self.owner,PL_MIN,PL_MAX);
-
-    self.owner.effects        &~= EF_NODRAW;
-    self.owner.alpha          = 1;
-    self.owner.PlayerPhysplug = SUB_Null;
-    self.owner.vehicle        = world;
-       self.owner.view_ofs       = PL_VIEW_OFS;
-       self.owner.event_damage   = PlayerDamage;
-       self.owner.hud            = HUD_NORMAL;
-
-    self.vehicle_hudmodel.viewmodelforclient = self;
-
+       makevectors(self.angles);
        if(eject)
        {
-           makevectors(self.angles);
-           setorigin(self.owner,self.origin + v_forward * 100);
+           spot = self.origin + v_forward * 100 + '0 0 64';
+           spot = vehicles_findgoodexit(spot);
+           setorigin(self.owner , spot);
            self.owner.velocity = (v_up + v_forward * 0.25) * 750;
        }
        else
        {
-           self.owner.velocity = (v_forward) * -150;
-        setorigin(self.owner,self.origin - v_forward * 128);
+           spot = self.origin - v_forward * 200 + '0 0 64';
+           spot = vehicles_findgoodexit(spot);
+           setorigin(self.owner , spot);
        }
-
+       
     self.owner = world;
-
-    if (self.deadflag != DEAD_NO)
-    {
-        entity ret;
-        ret = spawn();
-        ret.enemy = self;
-        ret.think = racer_return;
-        ret.nextthink = time + autocvar_g_vehicle_racer_respawntime;
-    }
-}
-
-void racer_touch()
-{
-    if(self.owner)
-    {
-        if(vlen(self.velocity) == 0)
-            return;
-
-        if(other.classname != "player")
-            return;
-
-        vector a;
-        a = normalize(other.origin - self.origin);
-        a = a - normalize(self.velocity);
-
-        return;
-    }
-
-    if(other.classname != "player")
-        return;
-
-    if(other.deadflag != DEAD_NO)
-        return;
-
-    if(other.vehicle != world)
-        return;
-
-    racer_enter();
 }
 
 void racer_spawn()
 {
-    self.think = racer_spawnthink;
-    self.nextthink = time;
-
-    self.flags      = FL_NOTARGET;
-    self.effects   = 0;
+    self.think          = racer_think;
+    self.nextthink      = time;
+    self.vehicle_health = autocvar_g_vehicle_racer_health;
+    self.vehicle_shield = autocvar_g_vehicle_racer_shield;
 
-    self.vehicle_health = racer_healthmax;
-    self.vehicle_shield = racer_shieldmax;
+    self.movetype       = MOVETYPE_TOSS;
+    self.solid          = SOLID_SLIDEBOX;
+    self.delay          = time;
+    self.scale          = 0.5;
 
-    self.event_damage = vehicle_stdproc_damage;
-    self.touch      = racer_touch;
-
-    self.iscreature = TRUE;
-    self.scale      = 0.5;
-    self.movetype   = MOVETYPE_FLY;
-    self.solid      = SOLID_SLIDEBOX;
-    self.takedamage = DAMAGE_AIM;
-
-    self.alpha = 1;
-       self.colormap = 1024;
-       self.deadflag    = DEAD_NO;
-    self.bot_attack = TRUE;
-
-    self.vehicle_energy = 1;
-    self.vehicle_hudmodel.viewmodelforclient = self;
-
-    setorigin(self, self.pos1);
-    self.angles = self.pos2;
-
-    setsize(self,RACER_MIN * 0.5,RACER_MAX * 0.5);
-    pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
-    self.delay = time;
+    setsize(self, RACER_MIN * 0.5, RACER_MAX * 0.5);
 }
 
 
 void racer_blowup()
 {
-
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
-
     self.deadflag    = DEAD_DEAD;
     self.vehicle_exit(VHEF_NORMAL);
-    RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_WAKIBLOWUP, world);
 
-    self.alpha = -1;
+    RadiusDamage (self, self, autocvar_g_vehicle_racer_blowup_coredamage,
+                                       autocvar_g_vehicle_racer_blowup_edgedamage,
+                                       autocvar_g_vehicle_racer_blowup_radius, world,
+                                       autocvar_g_vehicle_racer_blowup_forceintensity,
+                                       DEATH_WAKIBLOWUP, world);
+
     self.nextthink  = time + autocvar_g_vehicle_racer_respawntime;
     self.think      = racer_spawn;
     self.movetype   = MOVETYPE_NONE;
     self.effects    = EF_NODRAW;
 
-    self.avelocity_z  = 0;
-    self.colormod = '0 0 0';
+    self.colormod  = '0 0 0';
+    self.avelocity = '0 0 0';
+    self.velocity  = '0 0 0';
 
-    setorigin(self,self.pos1);
+    setorigin(self, self.pos1);
+       self.think     = racer_spawn;
+       self.nextthink = time + autocvar_g_vehicle_racer_respawntime;
 }
 
-void racer_dietouch()
+void racer_deadtouch()
 {
-    if(self.wait > time)
-        return;
-
-    self.wait = time + 0.75;
-
-    pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
+    self.avelocity_x *= 0.7;
+    self.cnt -= 1;
+    if(self.cnt <= 0)
+        racer_blowup();
 }
 
 void racer_die()
@@ -788,111 +582,94 @@ void racer_die()
     self.health       = 0;
     self.event_damage = SUB_Null;
     self.iscreature   = FALSE;
-    self.solid        = SOLID_NOT;
+    self.solid        = SOLID_CORPSE;
     self.takedamage   = DAMAGE_NO;
-    self.touch        = racer_dietouch;
     self.deadflag     = DEAD_DYING;
     self.movetype     = MOVETYPE_BOUNCE;
-    self.wait = time;
-
-    pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
-
-    self.velocity     += '0 0 128';
+    self.wait         = time;
+    self.cnt          = 1 + random() * 2;
+    self.touch        = racer_deadtouch;
+    
+    pointparticles(particleeffectnum("explosion_medium"), self.origin, '0 0 0', 1);    
 
     if(random() < 0.5)
-        self.avelocity_z  = 16;
+        self.avelocity_z  = 32;
     else
-        self.avelocity_z  = -16;
+        self.avelocity_z  = -32;
 
-    self.colormod = '-0.5 -0.5 -0.5';
+    self.avelocity_x = -vlen(self.velocity) * 0.2;
+    self.velocity   += '0 0 700';
+    self.colormod    = '-0.5 -0.5 -0.5';
 
        self.think     = racer_blowup;
-       self.nextthink = time + 3;
+       self.nextthink = 2 + time + random() * 3;
 }
 
 void racer_dinit()
 {
+    if not (vehicle_initialize(
+             "Wakizashi",
+             "models/vehicles/wakizashi.dpm",
+             "",
+             "models/vehicles/wakizashi_cockpit.dpm",
+             "", "", "tag_viewport",
+             HUD_WAKIZASHI,
+             0.5 * RACER_MIN, 0.5 * RACER_MAX,
+             FALSE,
+             racer_spawn, autocvar_g_vehicle_racer_respawntime,
+             racer_frame,
+             racer_enter, racer_exit,
+             racer_die,   racer_think,
+             TRUE))
+    {
+        remove(self);
+        return;
+    }
 
-    tracebox(self.origin + '0 0 100', RACER_MIN * 0.5, RACER_MAX * 0.5, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
-    setorigin(self,trace_endpos);
-
-    if (self.netname == "")
-        self.netname     = "Race PoD";
-
-    self.cvar_basename      = "g_vehicle_racer";
-
-    self.vehicle_viewport   = spawn();
-    self.vehicle_hudmodel   = spawn();
-    //self.ccamera            = spawn();
-
-    setorigin(self, self.origin);
-
-    setmodel(self,"models/vehicles/wakizashi.dpm");
-    setmodel(self.vehicle_hudmodel, "models/vehicles/wakizashi_cockpit.dpm");
-    setmodel (self.vehicle_viewport, "null");
+    if(autocvar_g_vehicle_racer_hovertype != 0)
+        racer_force_from_tag = vehicles_force_fromtag_maglev;
+    else
+        racer_force_from_tag = vehicles_force_fromtag_hover;
 
+    // FIXME: this be hakkz, fix the models insted (scale body, add tag_viewport to the hudmodel).
+    self.scale = 0.5;
     setattachment(self.vehicle_hudmodel, self, "");
     setattachment(self.vehicle_viewport, self, "tag_viewport");
 
-    self.vehicle_hudmodel.viewmodelforclient = self;
-    self.customizeentityforclient            = racer_customizeentityforclient;
-
-    self.tur_head     = spawn();
-
-    self.pos1         = self.origin;
-    self.pos2         = self.angles;
-    self.angles       = '0 0 0';
-    self.angles       = self.pos1;
-
-    self.vehicle_die  = racer_die;
-    self.vehicle_exit = racer_exit;
-
-    addstat(STAT_HUD, AS_INT,  hud);
-       addstat(STAT_VEHICLESTAT_HEALTH,  AS_FLOAT, vehicle_health);
-       addstat(STAT_VEHICLESTAT_SHIELD,  AS_FLOAT, vehicle_shield);
-       addstat(STAT_VEHICLESTAT_ENERGY,  AS_FLOAT, vehicle_energy);
-
-       addstat(STAT_VEHICLESTAT_AMMO1,   AS_INT,   vehicle_ammo1);
-       addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1);
-
-       addstat(STAT_VEHICLESTAT_AMMO2,   AS_INT,   vehicle_ammo2);
-       addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
-
-    racer_spawn();
+    self.mass               = 900;
 }
 
 void spawnfunc_vehicle_racer()
 {
-    g_turrets_common_precash();
-    racer_loadsettings();
-
-    self.vehicle_flags      = VHF_HASSHIELD | VHF_SHIELDREGEN;
-
-    /*
-    traceline(self.origin,self.origin - '0 0 2048',MOVE_WORLDONLY,self);
-    if(trace_startsolid)
-    {
-        dprint("WARNING: vehicle_racer placed in solid\n");
-        traceline(self.origin + '0 0 512' ,self.origin - '0 0 2048',MOVE_WORLDONLY,self);
-        if(trace_startsolid || trace_fraction == 1.0)
-        {
-            dprint("ERROR: vehicle_racer placed in more then 512 units into solid\n");
-            remove(self);
-            return;
-        }
-    }
-    */
+    self.vehicle_flags |= VHF_DMGSHAKE;
+    self.vehicle_flags |= VHF_DMGROLL;
 
-    if(trace_fraction != 1.0)
-        setorigin(self,trace_endpos + '0 0 128');
-    else
-        dprint("WARNING: vehicle_racer placed more then 2048 units above ground.\n");
+    precache_sound ("weapons/lasergun_fire.wav");
+    precache_sound ("weapons/rocket_fire.wav");
+    
+    precache_sound ("vehicles/racer_idle.wav");
+    precache_sound ("vehicles/racer_move.wav");
+    precache_sound ("vehicles/racer_boost.wav");
 
+    precache_model ("models/vhshield.md3");
     precache_model ("models/vehicles/wakizashi.dpm");
     precache_model ("models/vehicles/wakizashi_cockpit.dpm");
-    precache_model ("maps/bspmodel.bsp");
 
+    vehicles_configcheck("vehicle_racer.cfg", autocvar_g_vehicle_racer_health);
+    if(autocvar_g_vehicle_racer_energy)
+        if(autocvar_g_vehicle_racer_energy_regen)
+            self.vehicle_flags |= VHF_ENERGYREGEN;
+
+    if(autocvar_g_vehicle_racer_shield)
+        self.vehicle_flags |= VHF_HASSHIELD;
+
+    if(autocvar_g_vehicle_racer_shield_regen)
+        self.vehicle_flags |= VHF_SHIELDREGEN;
+
+    if(autocvar_g_vehicle_racer_health_regen)
+        self.vehicle_flags |= VHF_HEALTHREGEN;
 
     self.think = racer_dinit;
-    self.nextthink = time + 1;
+    self.nextthink = time + (autocvar_g_vehicles_delayspawn ? autocvar_g_vehicle_racer_respawntime + (random() * autocvar_g_vehicles_delayspawn_jitter) : 0.5);
 }
+#endif // SVQC
index 6ed8ca81521d51d78dbd792b20df285b2473fb28..33b5e7d5a2632673b461c651cf7de3467dd432b7 100644 (file)
-#define RAPTOR_MIN '-40 -40 0'
-#define RAPTOR_MAX '40 40 40'
-
-float raptor_movestyle;
-float raptor_turnspeed;
-float raptor_turnroll;
-float raptor_pitchspeed;
-float raptor_speed_forward;
-float raptor_speed_strafe;
-float raptor_speed_up;
-float raptor_speed_down;
-
-float raptor_bomblet_waves;
-float raptor_bomblet_wavefirst;
-float raptor_bomblet_wavenext;
-float raptor_bomblet_wawespread;
-float raptor_bomblets;
-float raptor_bomblet_damage;
-float raptor_bomblet_edgedamage;
-float raptor_bomblet_radius;
-float raptor_bomblet_force;
-float raptor_bombs_refire;
-
-float raptor_beam_dps;
-float raptor_beam_fops;
-float raptor_beam_aps;
-float raptor_beam_size;
-float raptor_beam_leangth;
-float raptor_beam_refire;
-
-float raptor_shield_max;
-float raptor_shield_regen;
-
-float raptor_health_max;
-float raptor_health_regen;
-
-float raptor_energy_max;
-float raptor_energy_regen;
+#ifdef SVQC
+#define RAPTOR_MIN '-80 -80 0'
+#define RAPTOR_MAX '80 80 70'
+
+float autocvar_g_vehicle_raptor_respawntime;
+
+float autocvar_g_vehicle_raptor_movestyle;
+float autocvar_g_vehicle_raptor_turnspeed;
+float autocvar_g_vehicle_raptor_pitchspeed;
+float autocvar_g_vehicle_raptor_pitchlimit;
+
+float autocvar_g_vehicle_raptor_speed_forward;
+float autocvar_g_vehicle_raptor_speed_strafe;
+float autocvar_g_vehicle_raptor_speed_up;
+float autocvar_g_vehicle_raptor_speed_down;
+float autocvar_g_vehicle_raptor_friction;
+
+float autocvar_g_vehicle_raptor_bomblets;
+float autocvar_g_vehicle_raptor_bomblet_alt;
+float autocvar_g_vehicle_raptor_bomblet_time;
+float autocvar_g_vehicle_raptor_bomblet_damage;
+float autocvar_g_vehicle_raptor_bomblet_spread;
+float autocvar_g_vehicle_raptor_bomblet_edgedamage;
+float autocvar_g_vehicle_raptor_bomblet_radius;
+float autocvar_g_vehicle_raptor_bomblet_force;
+float autocvar_g_vehicle_raptor_bomblet_explode_delay;
+float autocvar_g_vehicle_raptor_bombs_refire;
+
+float autocvar_g_vehicle_raptor_cannon_turnspeed;
+float autocvar_g_vehicle_raptor_cannon_turnlimit;
+float autocvar_g_vehicle_raptor_cannon_pitchlimit_up;
+float autocvar_g_vehicle_raptor_cannon_pitchlimit_down;
+
+float autocvar_g_vehicle_raptor_cannon_locktarget;
+float autocvar_g_vehicle_raptor_cannon_locking_time;
+float autocvar_g_vehicle_raptor_cannon_locking_releasetime;
+float autocvar_g_vehicle_raptor_cannon_locked_time;
+float autocvar_g_vehicle_raptor_cannon_predicttarget;
+
+float autocvar_g_vehicle_raptor_cannon_cost;
+float autocvar_g_vehicle_raptor_cannon_damage;
+float autocvar_g_vehicle_raptor_cannon_radius;
+float autocvar_g_vehicle_raptor_cannon_refire;
+float autocvar_g_vehicle_raptor_cannon_speed;
+float autocvar_g_vehicle_raptor_cannon_spread;
+float autocvar_g_vehicle_raptor_cannon_force;
+
+float autocvar_g_vehicle_raptor_energy;
+float autocvar_g_vehicle_raptor_energy_regen;
+float autocvar_g_vehicle_raptor_energy_regen_pause;
+
+float autocvar_g_vehicle_raptor_health;
+float autocvar_g_vehicle_raptor_health_regen;
+float autocvar_g_vehicle_raptor_health_regen_pause;
+
+float autocvar_g_vehicle_raptor_shield;
+float autocvar_g_vehicle_raptor_shield_regen;
+float autocvar_g_vehicle_raptor_shield_regen_pause;
 
 void raptor_spawn();
-void raptor_return();
-float raptor_pplug();
+float raptor_frame();
 float raptor_takeoff();
-float raptor_land();
 
 .entity bomb1;
 .entity bomb2;
 
 float raptor_altitude(float amax)
 {
-       tracebox(self.origin, self.mins, self.maxs, '0 0 -1' * amax, TRUE, self);
-       if(trace_fraction == 1)
-        return amax+1;
-    else
-        return vlen(self.origin - trace_endpos);
+       tracebox(self.origin, self.mins, self.maxs, self.origin - ('0 0 1' * amax), TRUE, self);
+    return vlen(self.origin - trace_endpos);
 }
 
-void raptor_loadsettings()
-{
-    raptor_movestyle     = CCVAR("_movestyle");
-    raptor_turnspeed     = CCVAR("_turnspeed");
-    raptor_turnroll      = CCVAR("_turnroll");
-    raptor_pitchspeed    = CCVAR("_pitchspeed");
-    raptor_speed_forward = CCVAR("_speed_forward");
-    raptor_speed_strafe  = CCVAR("_speed_strafe");
-    raptor_speed_up      = CCVAR("_speed_up");
-    raptor_speed_down    = CCVAR("_speed_down");
-
-    raptor_bomblet_waves      = CCVAR("_bomblet_waves ");
-    raptor_bomblet_wavefirst  = CCVAR("_bomblet_wavefirst");
-    raptor_bomblet_wavenext   = CCVAR("_bomblet_wavenext");
-    raptor_bomblet_wawespread = CCVAR("_bomblet_wawespread");
-    raptor_bomblets           = CCVAR("_bomblets");
-    raptor_bomblet_damage     = CCVAR("_bomblet_damage");
-    raptor_bomblet_edgedamage = CCVAR("_bomblet_edgedamage");
-    raptor_bomblet_radius     = CCVAR("_bomblet_radius");
-    raptor_bomblet_force      = CCVAR("_bomblet_force ");
-    raptor_bombs_refire       = CCVAR("_bombs_refire");
-
-    raptor_beam_dps     = CCVAR("_beam_dps");
-    raptor_beam_fops    = CCVAR("_beam_fops");
-    raptor_beam_aps     = CCVAR("_beam_aps");
-    raptor_beam_size    = CCVAR("_beam_size");
-    raptor_beam_leangth = CCVAR("_beam_length");
-    raptor_beam_refire  = CCVAR("_beam_refire");
-
-    raptor_shield_max    = CCVAR("_shield");
-    raptor_shield_regen  = CCVAR("_shield_regen");
-
-    raptor_health_max    = CCVAR("_health");
-    raptor_health_regen  = CCVAR("_health_regen");
-
-    raptor_energy_max    = CCVAR("_energy");
-    raptor_energy_regen  = CCVAR("_energy_regen");
-}
 
-void raptor_bombs_return()
+void raptor_bomblet_boom()
 {
-    self.owner.bomb1.alpha = 1;
-    self.owner.bomb2.alpha = 1;
+    RadiusDamage (self, self.realowner, autocvar_g_vehicle_raptor_bomblet_damage,
+                                    autocvar_g_vehicle_raptor_bomblet_edgedamage,
+                                    autocvar_g_vehicle_raptor_bomblet_radius, world,
+                                    autocvar_g_vehicle_raptor_bomblet_force, DEATH_RAPTOR_BOMB, world);
     remove(self);
 }
 
-void raptor_bomblet_boom()
+void raptor_bomblet_touch()
 {
-    if(other.enemy == self.enemy)
+    if(other == self.owner)
         return;
 
-    pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
-    RadiusDamage (self, self.enemy, raptor_bomblet_damage, raptor_bomblet_edgedamage, raptor_bomblet_radius, world, raptor_bomblet_force, DEATH_SBROCKET, world);
-    remove(self);
+    PROJECTILE_TOUCH;
+    self.think = raptor_bomblet_boom;
+    self.nextthink = time + random() * autocvar_g_vehicle_raptor_bomblet_explode_delay;
 }
 
 void raptor_bomb_burst()
 {
-    self.angles = vectoangles(self.velocity);
-
-    if(self.cnt < time)
+    if(self.cnt > time)
+    if(autocvar_g_vehicle_raptor_bomblet_alt)
     {
-        entity bomblet;
-        float i,v;
-        vector d;
-
-        makevectors(self.angles);
-        v = vlen(self.velocity) + random();
-        d = normalize(self.velocity);
-        pointparticles(particleeffectnum("rocket_explode"), self.origin, '0 0 0', 1);
-
-        for(i = 0; i < raptor_bomblets; ++i)
-        {
-
-            bomblet = spawn();
-            setorigin(bomblet,self.origin);
-
-            setmodel(bomblet,"models/vehicles/raptor_bomb.dpm");
-            bomblet.scale = 0.5;
-
-            bomblet.owner = self.owner;
-            bomblet.enemy = self.enemy;
-
-            bomblet.solid = SOLID_TRIGGER;
-            bomblet.movetype    = MOVETYPE_BOUNCE;
-            bomblet.touch = raptor_bomblet_boom;
-
-            bomblet.think = raptor_bomblet_boom;
-            bomblet.nextthink = time + 5;
-
-            //bomblet.modelflags = MF_ROCKET;
-            bomblet.modelflags = MF_GRENADE;
-
-            bomblet.velocity =  normalize(d + randomvec() * raptor_bomblet_wawespread) * v;
-
-            bomblet.angles = vectoangles(bomblet.velocity);
-        }
-
-        self.wait -= 1;
-        if(self.wait <= 0)
+        self.nextthink = time;
+        traceline(self.origin, self.origin + (normalize(self.velocity) * autocvar_g_vehicle_raptor_bomblet_alt), MOVE_NORMAL, self);
+        if((trace_fraction == 1.0) || (vlen(self.origin - self.owner.origin) < autocvar_g_vehicle_raptor_bomblet_radius))
         {
-            remove(self);
+            UpdateCSQCProjectile(self);
             return;
         }
-
-        self.cnt = time + raptor_bomblet_wavenext;
     }
 
-    self.nextthink = time;
-}
+    entity bomblet;
+    float i;
 
-void raptor_bomb_touch()
-{
-    raptor_bomb_burst();
+    Damage_DamageInfo(self.origin, 0, 0, 0, '0 0 0', DEATH_RAPTOR_BOMB_SPLIT, self);
+
+    for(i = 0; i < autocvar_g_vehicle_raptor_bomblets; ++i)
+    {
+        bomblet = spawn();
+        setorigin(bomblet, self.origin);
+
+        bomblet.movetype    = MOVETYPE_TOSS;
+        bomblet.touch       = raptor_bomblet_touch;
+        bomblet.think       = raptor_bomblet_boom;
+        bomblet.nextthink   = time + 5;
+        bomblet.owner       = self.owner;
+        bomblet.realowner   = self.realowner;
+        bomblet.velocity    = normalize(normalize(self.velocity) + (randomvec() * autocvar_g_vehicle_raptor_bomblet_spread)) * vlen(self.velocity);
+
+        PROJECTILE_MAKETRIGGER(bomblet);
+        CSQCProjectile(bomblet, TRUE, PROJECTILE_RAPTORBOMBLET, TRUE);
+    }
+
+    remove(self);
 }
 
 void raptor_bombdrop()
 {
     entity bomb_1, bomb_2;
 
-    self.bomb1.alpha = 0.25;
-    self.bomb2.alpha = 0.25;
-
     bomb_1 = spawn();
     bomb_2 = spawn();
 
-    setmodel(bomb_1,"models/vehicles/raptor_bomb.dpm");
-    setmodel(bomb_2,"models/vehicles/raptor_bomb.dpm");
-
     setorigin(bomb_1, gettaginfo(self, gettagindex(self, "bombmount_left")));
     setorigin(bomb_2, gettaginfo(self, gettagindex(self, "bombmount_right")));
 
-    bomb_1.movetype  = bomb_2.movetype    = MOVETYPE_TOSS;
-    bomb_1.velocity  = bomb_2.velocity    = self.velocity;
-    bomb_1.touch     = bomb_2.touch       = raptor_bomb_touch;
-    bomb_1.think     = bomb_2.think       = raptor_bomb_burst;
-    bomb_1.nextthink = bomb_2.nextthink   = time;
-    bomb_1.cnt       = bomb_2.cnt         = time + raptor_bomblet_wavefirst;
-    bomb_1.wait       = bomb_2.wait       = raptor_bomblet_waves;
-
-    bomb_1.avelocity = bomb_2.avelocity   = '0 0 180';
-    bomb_1.owner     = bomb_2.owner       = self;
-    bomb_1.enemy     = bomb_2.enemy       = self.owner;
-    bomb_1.angles    = bomb_2.angles      = self.angles;
+    bomb_1.movetype     = bomb_2.movetype   = MOVETYPE_BOUNCE;
+    bomb_1.velocity     = bomb_2.velocity   = self.velocity;
+    bomb_1.touch        = bomb_2.touch      = raptor_bomb_burst;
+    bomb_1.think        = bomb_2.think      = raptor_bomb_burst;
+    bomb_1.cnt          = bomb_2.cnt        = time + 10;
+
+    if(autocvar_g_vehicle_raptor_bomblet_alt)
+        bomb_1.nextthink = bomb_2.nextthink  = time;
+    else
+        bomb_1.nextthink = bomb_2.nextthink  = time + autocvar_g_vehicle_raptor_bomblet_time;
+
+    bomb_1.owner     = bomb_2.owner      = self;
+    bomb_1.realowner = bomb_2.realowner  = self.owner;
     bomb_1.solid     = bomb_2.solid      = SOLID_BBOX;
+    bomb_1.gravity   = bomb_2.gravity    = 1;
 
-    bomb_1 = spawn();
-    bomb_1.owner = self;
-    bomb_1.think = raptor_bombs_return;
-    bomb_1.nextthink = time + raptor_bombs_refire;
+    PROJECTILE_MAKETRIGGER(bomb_1);
+    PROJECTILE_MAKETRIGGER(bomb_2);
+
+    CSQCProjectile(bomb_1, TRUE, PROJECTILE_RAPTORBOMB, TRUE);
+    CSQCProjectile(bomb_2, TRUE, PROJECTILE_RAPTORBOMB, TRUE);
 }
 
-void raptor_animator_think()
+
+void raptor_fire_cannon(entity gun, string tagname)
 {
-    self.owner.frame += 1;
-    if(self.owner.frame == self.cnt)
-        remove(self);
-    else
-        self.nextthink = time + self.wait;
+    vehicles_projectile("raptor_cannon_muzzleflash", "weapons/lasergun_fire.wav",
+                           gettaginfo(gun, gettagindex(gun, tagname)), normalize(v_forward + randomvec() * autocvar_g_vehicle_raptor_cannon_spread) * autocvar_g_vehicle_raptor_cannon_speed,
+                           autocvar_g_vehicle_raptor_cannon_damage, autocvar_g_vehicle_raptor_cannon_radius, autocvar_g_vehicle_raptor_cannon_force,  0,
+                           DEATH_RAPTOR_CANNON, PROJECTILE_RAPTORCANNON, 0, TRUE, TRUE);
 }
 
-void raptor_setanim(float start, float end, float length)
+void raptor_think()
 {
-    entity ani;
-    if(self.tur_head.enemy)
-        ani = self.tur_head.enemy;
-    else
-        ani = spawn();
-
-    self.tur_head.enemy = ani;
-    ani.owner = self;
-    self.frame = start;
-    ani.cnt = end;
-    ani.wait = sys_frametime / length;
-    ani.think = raptor_animator_think;
-    ani.nextthink = time + ani.wait;
 }
 
-void raptor_beam (vector start, vector end, vector smin, vector smax, float bforce, float f_dmg, float deathtype)
+void raptor_enter()
 {
-    vector hitloc, force, endpoint, dir;
-    entity ent;
+    self.owner.PlayerPhysplug = raptor_takeoff;
+    self.movetype       = MOVETYPE_BOUNCEMISSILE;
+    self.solid          = SOLID_SLIDEBOX;
+    self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_raptor_health);
+    self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_raptor_shield);
+    self.velocity_z = 1; // Nudge upwards to takeoff sequense can work.
+    self.tur_head.exteriormodeltoclient = self.owner;
 
-    dir = normalize(end - start);
-    force = dir * bforce;
+    self.delay = time + autocvar_g_vehicle_raptor_bombs_refire;
+    self.lip   = time;
 
-    // go a little bit into the wall because we need to hit this wall later
-    end = end + dir;
+    if(self.owner.flagcarried)
+       setorigin(self.owner.flagcarried, '-20 0 96');
 
-    // trace multiple times until we hit a wall, each obstacle will be made unsolid.
-    // note down which entities were hit so we can damage them later
-    while (1)
-    {
-        tracebox(start, smin, smax, end, FALSE, world);
-
-        // if it is world we can't hurt it so stop now
-        if (trace_ent == world || trace_fraction == 1)
-            break;
-
-        if (trace_ent.solid == SOLID_BSP)
-            break;
-
-        // make the entity non-solid so we can hit the next one
-        trace_ent.railgunhit = TRUE;
-        trace_ent.railgunhitloc = end;
-        trace_ent.railgunhitsolidbackup = trace_ent.solid;
-
-        // make the entity non-solid
-        trace_ent.solid = SOLID_NOT;
-    }
-
-    endpoint = trace_endpos;
-
-    // find all the entities the railgun hit and hurt them
-    ent = findchainfloat(railgunhit, TRUE);
-    while (ent)
-    {
-        // get the details we need to call the damage function
-        ent.solid = ent.railgunhitsolidbackup;
-        hitloc = ent.railgunhitloc;
-        ent.railgunhitloc = '0 0 0';
-        ent.railgunhitsolidbackup = SOLID_NOT;
-        ent.railgunhit = FALSE;
-
-        // apply the damage
-        if (ent.takedamage)
-            Damage (ent, self, self, f_dmg, deathtype, hitloc, force);
-
-        ent = ent.chain;
-    }
-    trace_endpos = endpoint;
 }
 
-
-void raptor_enter()
+void raptor_land()
 {
-    // Remove this when bots know how to use vehicles
-    if (clienttype(other) != CLIENTTYPE_REAL)
-        return;
-
-    if(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;
+    float hgt;
+    
+    hgt = raptor_altitude(512);
+    self.velocity = (self.velocity * 0.9) + ('0 0 -1800' * (hgt / 256) * sys_frametime);
+    self.angles_x *= 0.95;
+    self.angles_z *= 0.95;
 
-    self.velocity = '0 0 1';
+    if(hgt < 128)
+        if(self.frame != 0)
+            self.frame = max(self.frame - 0.25, 0);
 
-    setorigin(other,self.origin + '0 0 32');
-    other.velocity = self.velocity;
+    self.bomb1.gun1.avelocity_y = 90 + ((self.frame / 25) * 2000);
+    self.bomb1.gun2.avelocity_y = -self.bomb1.gun1.avelocity_y;
 
-    other.flags &~= FL_ONGROUND;
-    msg_entity = other;
-    WriteByte (MSG_ONE, SVC_SETVIEWPORT);
-    WriteEntity( MSG_ONE, self.vehicle_viewport);
+    if(hgt < 16)
+    {
+        self.movetype   = MOVETYPE_TOSS;
+        self.think      = raptor_think;
+    }
 
-    WriteByte (MSG_ONE, SVC_SETVIEWANGLES);     // 10 = SVC_SETVIEWANGLES
-    WriteAngle(MSG_ONE,  self.angles_x * -1);   // tilt
-    WriteAngle(MSG_ONE,  self.angles_y);        // yaw
-    WriteAngle(MSG_ONE,  0);                    // roll
+    self.nextthink  = time;
 }
 
 void raptor_exit(float eject)
 {
-       self.colormap   = 1024;
-       self.flags      = FL_NOTARGET;
-
-    if not (self.owner)
-        return;
-
-    msg_entity = self.owner;
-    WriteByte (MSG_ONE, SVC_SETVIEWPORT);
-    WriteEntity( MSG_ONE, self.owner);
+    vector spot;
+    self.tur_head.exteriormodeltoclient = world;
 
-    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)
+    if(self.deadflag == DEAD_NO)
     {
-        //self.think = racer_exitthink;
-        self.nextthink = time;
+        self.think      = raptor_land;
+        self.nextthink  = time;
     }
 
-    self.owner.takedamage     = DAMAGE_AIM;
-    self.owner.solid          = SOLID_SLIDEBOX;
-    self.owner.movetype       = MOVETYPE_WALK;
-
-    setsize(self.owner,PL_MIN,PL_MAX);
-
-    self.owner.effects        &~= EF_NODRAW;
-    self.owner.alpha          = 1;
-    self.owner.PlayerPhysplug = SUB_Null;
-    self.owner.vehicle        = world;
-       self.owner.view_ofs       = PL_VIEW_OFS;
-       self.owner.event_damage   = PlayerDamage;
-       self.owner.hud            = HUD_NORMAL;
-       //self.exteriormodeltoclient = self;
-
-    self.vehicle_hudmodel.viewmodelforclient = self;
+    if not (self.owner)
+        return;
 
+       makevectors(self.angles);
        if(eject)
        {
-           makevectors(self.angles);
-           setorigin(self.owner,self.origin + v_forward * 100);
+           spot = self.origin + v_forward * 100 + '0 0 64';
+           spot = vehicles_findgoodexit(spot);
+           setorigin(self.owner , spot);
            self.owner.velocity = (v_up + v_forward * 0.25) * 750;
        }
        else
        {
-           self.owner.velocity = (v_forward) * -150;
-        setorigin(self.owner,self.origin - v_forward * 128);
+           spot = self.origin - v_forward * 200 + '0 0 64';
+           spot = vehicles_findgoodexit(spot);
+           setorigin(self.owner , spot);
        }
-
+       
     self.owner = world;
-
-    if (self.deadflag != DEAD_NO)
-    {
-        entity ret;
-        ret = spawn();
-        ret.enemy = self;
-        ret.think = raptor_return;
-        ret.nextthink = time + autocvar_g_vehicle_racer_respawntime;
-    }
 }
 
-
-float raptor_pplug()
+float raptor_takeoff()
 {
-    entity player, vhic;
-    float ftmp, ftmp2, energy_used;
-    vector df;
-
-
-    if(autocvar_g_vehicle_raptor_reload)
-    {
-        raptor_loadsettings();
-        cvar_set("g_vehicle_raptor_reload","0");
-    }
-
+    entity player, raptor;
+    
     player = self;
-    vhic   = self.vehicle;
-    self    = vhic;
-
-    if(player.BUTTON_USE)
+    raptor = self.vehicle;
+    self   = raptor;
+    if(self.sound_nexttime < time)
+    {        
+        self.sound_nexttime = time + 7.955812; //soundlength("vehicles/raptor_fly.wav");
+        sound (self, CHAN_TRIGGER, "vehicles/raptor_speed.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+    }   
+
+    // Takeoff sequense
+    if(raptor.frame < 25)
     {
-        self = vhic;
-        raptor_exit(0);
-        self = player;
-        return 0;
-    }
+        raptor.frame += 0.25;
+        raptor.velocity_z = min(raptor.velocity_z * 1.5, 256);
+        self.bomb1.gun1.avelocity_y = 90 + ((raptor.frame / 25) * 25000);
+        self.bomb1.gun2.avelocity_y = -self.bomb1.gun1.avelocity_y;
+        player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
 
-    if(vhic.deadflag != DEAD_NO)
-    {
-        self = player;
-        player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
-        return 1;
+        setorigin(player, raptor.origin + '0 0 32');
     }
+    else
+        player.PlayerPhysplug = raptor_frame;
+
+    if(self.vehicle_flags  & VHF_SHIELDREGEN)
+        vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_raptor_shield, autocvar_g_vehicle_raptor_shield_regen_pause, autocvar_g_vehicle_raptor_shield_regen, frametime);
 
-    vhic.angles_x *= -1;
-    // Rotate Body
-    ftmp = raptor_turnspeed * sys_frametime;
+    if(self.vehicle_flags  & VHF_HEALTHREGEN)
+        vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_raptor_health, autocvar_g_vehicle_raptor_health_regen_pause, autocvar_g_vehicle_raptor_health_regen, frametime);
 
-    ftmp = bound(-ftmp, shortangle_f(player.v_angle_y - vhic.angles_y, vhic.angles_y), ftmp);
+    if(self.vehicle_flags  & VHF_ENERGYREGEN)
+        vehicles_regen(cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, frametime);
 
-    // Roll
-    //ftmp = bound(-90,shortangle_f(player.v_angle_z + ((vhic.angles_y - ftmp2) * raptor_turnroll), vhic.angles_z),90);
-    //ftmp = safeangle(vhic.angles_z + ftmp);
-    //vhic.angles_z = ftmp;
 
-    // Turn
-    vhic.angles_y = anglemods(vhic.angles_y + ftmp);
+    raptor.bomb1.alpha = raptor.bomb2.alpha = (time - raptor.lip) / (raptor.delay - raptor.lip);
+    player.vehicle_reload2 = bound(0, raptor.bomb1.alpha * 100, 100);
 
-    // Pitch Body
-    ftmp = raptor_pitchspeed  * sys_frametime;
+    VEHICLE_UPDATE_PLAYER(health, raptor);
+    VEHICLE_UPDATE_PLAYER(energy, raptor);
+    if(self.vehicle_flags & VHF_HASSHIELD)
+        VEHICLE_UPDATE_PLAYER(shield, raptor);
 
-    ftmp = bound(-ftmp, shortangle_f(player.v_angle_x - vhic.angles_x,vhic.angles_x), ftmp);
+    player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
+    self = player;
+    return 1;
+}
 
-    vhic.angles_x = bound(-60,anglemods(vhic.angles_x + ftmp),60);
-    vhic.angles_x *= -1;
+float raptor_frame()
+{
+    entity player, raptor;
+    float ftmp, ftmp2;
+    vector df;
+    
+       if(intermission_running)
+               return 1;
 
-    if(raptor_movestyle == 1)
+    player = self;
+    raptor = self.vehicle;
+    self   = raptor;
+    vehicles_painframe();
+    /*
+    ftmp = vlen(self.velocity);
+    if(ftmp > autocvar_g_vehicle_raptor_speed_forward) 
+        ftmp = 1;
+    else  
+        ftmp = ftmp / autocvar_g_vehicle_raptor_speed_forward;
+    */
+        
+    if(self.sound_nexttime < time)
+    {        
+        self.sound_nexttime = time + 7.955812; 
+        //sound (self.tur_head, CHAN_TRIGGER, "vehicles/raptor_fly.wav", 1 - ftmp,   ATTN_NORM );
+        sound (self, CHAN_TRIGGER, "vehicles/raptor_speed.wav", 1, ATTN_NORM);        
+        self.wait = ftmp;
+    }        
+    /*
+    else if(fabs(ftmp - self.wait) > 0.2)
     {
-        ftmp = vhic.angles_z;
-        vhic.angles_z = 0;
-        ftmp2 = vhic.angles_x;
-        vhic.angles_x = 0;
-        fixedmakevectors(vhic.angles);
-        vhic.angles_z = ftmp;
-        vhic.angles_x = ftmp2;
+        sound (self.tur_head, CHAN_TRIGGER, "", 1 - ftmp,   ATTN_NORM );
+        sound (self, CHAN_TRIGGER, "", ftmp, ATTN_NORM);        
+        self.wait = ftmp;
+    }
+    */
+    
+    if(raptor.deadflag != DEAD_NO)
+    {
+        self = player;
+        player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
+        return 1;
     }
+    crosshair_trace(player);
+
+    vector vang;
+    vang = raptor.angles;
+    df = vectoangles(normalize(trace_endpos - self.origin + '0 0 32'));
+    vang_x *= -1;
+    df_x *= -1;
+    if(df_x > 180)  df_x -= 360;
+    if(df_x < -180) df_x += 360;
+    if(df_y > 180)  df_y -= 360;
+    if(df_y < -180) df_y += 360;
+
+    ftmp = shortangle_f(player.v_angle_y - vang_y, vang_y);
+    if(ftmp > 180)  ftmp -= 360; if(ftmp < -180) ftmp += 360;
+    raptor.avelocity_y = bound(-autocvar_g_vehicle_raptor_turnspeed, ftmp + raptor.avelocity_y * 0.9, autocvar_g_vehicle_raptor_turnspeed);
+
+    // Pitch
+    ftmp = 0;
+    if(player.movement_x > 0 && vang_x < autocvar_g_vehicle_raptor_pitchlimit) ftmp = 5;
+    else if(player.movement_x < 0 && vang_x > -autocvar_g_vehicle_raptor_pitchlimit) ftmp = -20;
+
+    df_x = bound(-autocvar_g_vehicle_raptor_pitchlimit, df_x , autocvar_g_vehicle_raptor_pitchlimit);
+    ftmp = vang_x - bound(-autocvar_g_vehicle_raptor_pitchlimit, df_x + ftmp, autocvar_g_vehicle_raptor_pitchlimit);
+    raptor.avelocity_x = bound(-autocvar_g_vehicle_raptor_pitchspeed, ftmp + raptor.avelocity_x * 0.9, autocvar_g_vehicle_raptor_pitchspeed);
+
+    raptor.angles_x = anglemods(raptor.angles_x);
+    raptor.angles_y = anglemods(raptor.angles_y);
+    raptor.angles_z = anglemods(raptor.angles_z);
+
+    if(autocvar_g_vehicle_raptor_movestyle == 1)
+        makevectors('0 1 0' * raptor.angles_y);
     else
-        fixedmakevectors(vhic.angles);
+        makevectors(player.v_angle);
 
-    df = vhic.velocity * -1;
+    df = raptor.velocity * -autocvar_g_vehicle_raptor_friction;
 
     if(player.movement_x != 0)
     {
         if(player.movement_x > 0)
-            df += v_forward  * raptor_speed_forward;
+            df += v_forward  * autocvar_g_vehicle_raptor_speed_forward;
         else if(player.movement_x < 0)
-            df -= v_forward  * raptor_speed_forward;
+            df -= v_forward  * autocvar_g_vehicle_raptor_speed_forward;
     }
 
     if(player.movement_y != 0)
     {
         if(player.movement_y < 0)
-            df -= v_right * raptor_speed_strafe;
+            df -= v_right * autocvar_g_vehicle_raptor_speed_strafe;
         else if(player.movement_y > 0)
-            df += v_right * raptor_speed_strafe;
+            df += v_right * autocvar_g_vehicle_raptor_speed_strafe;
 
-        vhic.angles_z = bound(-30,vhic.angles_z + (player.movement_y / raptor_speed_strafe),30);
+        raptor.angles_z = bound(-30,raptor.angles_z + (player.movement_y / autocvar_g_vehicle_raptor_speed_strafe),30);
     }
     else
     {
-        vhic.angles_z *= 0.95;
-        if(vhic.angles_z >= -1 && vhic.angles_z <= -1)
-            vhic.angles_z = 0;
+        raptor.angles_z *= 0.95;
+        if(raptor.angles_z >= -1 && raptor.angles_z <= -1)
+            raptor.angles_z = 0;
     }
 
     if(player.BUTTON_CROUCH)
-        df -=   v_up * raptor_speed_down;
+        df -=   v_up * autocvar_g_vehicle_raptor_speed_down;
     else if (player.BUTTON_JUMP)
-        df +=  v_up * raptor_speed_up;
-    //else
-        //df_z = vhic.velocity_z * -1;
-
-    vhic.velocity  += df * frametime;
-    player.velocity = player.movement  = vhic.velocity;
-    setorigin(player,vhic.origin + '0 0 32');
-
-    // Aim the gunz
-    /*
-    vector target_angle, move_angle, org1, org2, targ;
-
-    makevectors(player.v_angle);
+        df +=  v_up * autocvar_g_vehicle_raptor_speed_up;
 
-    //targ = (vhic.origin + player.view_ofs) + v_forward * MAX_SHOT_DISTANCE;
-    targ = player.cursor_trace_endpos;
+    raptor.velocity  += df * frametime;
+    player.velocity = player.movement  = raptor.velocity;
+    setorigin(player, raptor.origin + '0 0 32');
 
-    org1 = gettaginfo(vhic.gun1,gettagindex(vhic.gun1, "fire1"));
-    org2 = gettaginfo(vhic.gun2,gettagindex(vhic.gun2, "fire1"));
+    vector vf, ad;
+    // Target lock & predict
+    if(autocvar_g_vehicle_raptor_cannon_locktarget)
+    {
 
-    traceline(vhic.origin + player.view_ofs, targ, FALSE, vhic);
-    targ = trace_endpos;
+        vehicles_locktarget((1 / autocvar_g_vehicle_raptor_cannon_locking_time) * frametime,
+                             (1 / autocvar_g_vehicle_raptor_cannon_locking_releasetime) * frametime,
+                             autocvar_g_vehicle_raptor_cannon_locked_time);
 
-    // Find the direction
-    target_angle = vectoangles(normalize(targ - org1)); // And make a angle
+        if(self.lock_target != world)
+        if(autocvar_g_vehicle_raptor_cannon_predicttarget)
+        if(self.lock_strength == 1)
+        {
+            float i, distance, impact_time;
+
+            vf = real_origin(raptor.lock_target);
+            ad = vf;
+            for(i = 0; i < 4; ++i)
+            {
+                distance = vlen(ad - raptor.origin);
+                impact_time = distance / autocvar_g_vehicle_raptor_cannon_speed;
+                ad = vf + raptor.lock_target.velocity * impact_time;
+            }
+            trace_endpos = ad;
+        }
 
-    // Find the diffrence between where we currently aim and where we want to aim
-    move_angle = target_angle - (vhic.angles + vhic.gun1.angles);
-    move_angle = shortangle_vxy(move_angle,(vhic.angles + vhic.gun1.angles));
-    vhic.gun1.angles_x = bound(-10, move_angle_x + vhic.gun1.angles_x, 10);
-    vhic.gun1.angles_y = bound(-15, move_angle_y + vhic.gun1.angles_y, 15);
+        if(self.lock_target)
+        {
+            if(raptor.lock_strength == 1)
+                UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '1 0 0', 1);
+            else if(self.lock_strength > 0.5)
+                UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '0 1 0', 1);
+            else if(self.lock_strength < 0.5)
+                UpdateAuxiliaryXhair(player, real_origin(raptor.lock_target), '0 0 1', 1);
+        }
+    }
 
-    // Find the direction
-    target_angle = vectoangles(normalize(targ - org2)); // And make a angle
+    // Aim the gunz
+    ftmp2 = autocvar_g_vehicle_raptor_cannon_turnspeed * frametime;
+    ftmp = -ftmp2;
+
+    // Gun1
+    df = gettaginfo(raptor.gun1, gettagindex(raptor.gun1, "fire1"));
+    //ad = df;
+    //vf = v_forward;
+    df = vectoangles(normalize(trace_endpos - df)); // Find the direction & angle    
+    df = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(raptor.angles), AnglesTransform_FromAngles(df))) - raptor.gun1.angles;
+    df = shortangle_vxy(df, raptor.gun1.angles);
+        
+    // Bind to aimspeed
+    df_x = bound(ftmp, df_x, ftmp2);
+    df_y = bound(ftmp, df_y, ftmp2);
+    // Bind to limts
+    raptor.gun1.angles_x = bound(-autocvar_g_vehicle_raptor_cannon_pitchlimit_down, df_x + raptor.gun1.angles_x, autocvar_g_vehicle_raptor_cannon_pitchlimit_up);
+    raptor.gun1.angles_y = bound(-autocvar_g_vehicle_raptor_cannon_turnlimit,  df_y + raptor.gun1.angles_y, autocvar_g_vehicle_raptor_cannon_turnlimit);
+
+    // Gun2
+    df = gettaginfo(raptor.gun2, gettagindex(raptor.gun2, "fire1"));
+    //ad += df;
+    //vf += v_forward;
+    df = vectoangles(normalize(trace_endpos - df)); // Find the direction & angle    
+    df = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(raptor.angles), AnglesTransform_FromAngles(df))) - raptor.gun2.angles;
+    df = shortangle_vxy(df, raptor.gun2.angles);
+    
+    // Bind to aimspeed
+    df_x = bound(ftmp, df_x, ftmp2);
+    df_y = bound(ftmp, df_y, ftmp2);
+    // Bind to limts
+    raptor.gun2.angles_x = bound(-autocvar_g_vehicle_raptor_cannon_pitchlimit_down, df_x + raptor.gun2.angles_x, autocvar_g_vehicle_raptor_cannon_pitchlimit_up);
+    raptor.gun2.angles_y = bound(-autocvar_g_vehicle_raptor_cannon_turnlimit,  df_y + raptor.gun2.angles_y, autocvar_g_vehicle_raptor_cannon_turnlimit);
 
-    move_angle = target_angle - (vhic.angles + vhic.gun2.angles);
-    move_angle = shortangle_vxy(move_angle,(vhic.angles + vhic.gun2.angles));
-    vhic.gun2.angles_x = bound(-15,move_angle_x + vhic.gun2.angles_x,15);
-    vhic.gun2.angles_y = bound(-20,move_angle_y + vhic.gun2.angles_y,20);
-       */
+    /*
+    ad = ad * 0.5;
+    v_forward = vf * 0.5;
+    traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, raptor);
+    UpdateAuxiliaryXhair(player, trace_endpos, '0 1 0', 0);
+    */
+    
     if(player.BUTTON_ATCK)
-    if(vhic.vehicle_energy > (raptor_beam_aps * sys_frametime))
+    if(raptor.attack_finished_single <= time)
+    if(raptor.vehicle_energy > autocvar_g_vehicle_raptor_cannon_cost)
     {
-        vector start;
-        self = player;
-
-        start = gettaginfo(vhic.gun1, gettagindex(vhic.gun1, "fire1"));
-        traceline(start, start + v_forward * MAX_SHOT_DISTANCE, TRUE, player);
-        te_lightning1(vhic.gun1, start, trace_endpos);
-        raptor_beam(start, trace_endpos, '-1 -1 -1' * raptor_beam_size, '1 1 1' * raptor_beam_size, raptor_beam_fops * sys_frametime, raptor_beam_dps * sys_frametime, DEATH_SBROCKET);
-
-
-        start = gettaginfo(vhic.gun2, gettagindex(vhic.gun2, "fire1"));
-        traceline(start, start + v_forward * MAX_SHOT_DISTANCE, TRUE, player);
-        te_lightning1(vhic.gun2, start, trace_endpos);
-        raptor_beam(start, trace_endpos, '-1 -1 -1' * raptor_beam_size, '1 1 1' * raptor_beam_size, raptor_beam_fops * sys_frametime, raptor_beam_dps * sys_frametime, DEATH_SBROCKET);
-
-        self = vhic;
-
-        vhic.vehicle_energy -= raptor_beam_aps * sys_frametime;
-        vhic.cnt = time + 1;
+        raptor.misc_bulletcounter += 1;
+        raptor.attack_finished_single = time + autocvar_g_vehicle_raptor_cannon_refire;
+        if(raptor.misc_bulletcounter <= 2)
+            raptor_fire_cannon(self.gun1, "fire1");
+        else if(raptor.misc_bulletcounter == 3)
+            raptor_fire_cannon(self.gun2, "fire1");
+        else
+        {
+            raptor.attack_finished_single = time + autocvar_g_vehicle_raptor_cannon_refire * 2;
+            raptor_fire_cannon(self.gun2, "fire1");
+            raptor.misc_bulletcounter = 0;
+        }
+        raptor.vehicle_energy -= autocvar_g_vehicle_raptor_cannon_cost;
+        self.cnt = time;
     }
 
-    if(vhic.cnt < time)
-        vhic.vehicle_energy = min(vhic.vehicle_energy += raptor_energy_regen * frametime, raptor_energy_max);
+    if(self.vehicle_flags  & VHF_SHIELDREGEN)
+        vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_raptor_shield, autocvar_g_vehicle_raptor_shield_regen_pause, autocvar_g_vehicle_raptor_shield_regen, frametime);
 
-    player.vehicle_energy = vhic.vehicle_energy / raptor_energy_max;
+    if(self.vehicle_flags  & VHF_HEALTHREGEN)
+        vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_raptor_health, autocvar_g_vehicle_raptor_health_regen_pause, autocvar_g_vehicle_raptor_health_regen, frametime);
 
+    if(self.vehicle_flags  & VHF_ENERGYREGEN)
+        vehicles_regen(cnt, vehicle_energy, autocvar_g_vehicle_raptor_energy, autocvar_g_vehicle_raptor_energy_regen_pause, autocvar_g_vehicle_raptor_energy_regen, frametime);
 
+
+    if(time > raptor.delay)
     if(player.BUTTON_ATCK2)
-    if(time > vhic.delay)
     {
         raptor_bombdrop();
-        vhic.delay = time + raptor_bombs_refire;
+        raptor.delay = time + autocvar_g_vehicle_raptor_bombs_refire;
+        raptor.lip   = time;
     }
 
-    player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
-    vehicle_stdproc_shiledregen(raptor_shield_max, frametime);
-    vehicle_stdproc_healthregen(raptor_health_max, frametime);
-
-    self = player;
-
-    return 1;
-}
+    raptor.bomb1.alpha = raptor.bomb2.alpha = (time - raptor.lip) / (raptor.delay - raptor.lip);
+    player.vehicle_reload2 = bound(0, raptor.bomb1.alpha * 100, 100);
 
-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;
+    VEHICLE_UPDATE_PLAYER(health, raptor);
+    VEHICLE_UPDATE_PLAYER(energy, raptor);
+    if(self.vehicle_flags & VHF_HASSHIELD)
+        VEHICLE_UPDATE_PLAYER(shield, raptor);
 
+    player.BUTTON_ATCK = player.BUTTON_ATCK2 = player.BUTTON_CROUCH = 0;
     return 1;
 }
 
-float raptor_land()
+void raptor_blowup()
 {
-    return 0;
-}
+    self.deadflag    = DEAD_DEAD;
+    self.vehicle_exit(VHEF_NORMAL);
+    RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_WAKIBLOWUP, world);
 
-void raptor_return()
-{
-    pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1);
-    self.enemy.think = raptor_spawn;
-    self.enemy.nextthink = time;
-    remove(self);
-}
+    self.alpha          = -1;
+    self.movetype       = MOVETYPE_NONE;
+    self.effects        = EF_NODRAW;
+    self.colormod       = '0 0 0';
+    self.avelocity      = '0 0 0';
+    self.velocity       = '0 0 0';
 
-void raptor_think()
-{
+    setorigin(self, self.pos1);
+    self.touch = SUB_Null;
+    self.nextthink = 0;
 }
 
-void raptor_touch()
+void raptor_diethink()
 {
-    if(self.owner)
+    if(random() < 0.1)
     {
-        if(vlen(self.velocity) == 0)
-            return;
-
-        if(other.classname != "player")
-            return;
-
-        return;
+        sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+        pointparticles(particleeffectnum("explosion_small"), randomvec() * 80 + (self.origin + '0 0 100'), '0 0 0', 1);
     }
-
-    if(other.classname != "player")
-        return;
-
-    if(other.deadflag != DEAD_NO)
-        return;
-
-    if(other.vehicle != world)
-        return;
-
-    raptor_enter();
+    self.nextthink = time + 0.1;
 }
 
 void raptor_die()
@@ -668,148 +574,120 @@ void raptor_die()
     self.health       = 0;
     self.event_damage = SUB_Null;
     self.iscreature   = FALSE;
-    self.solid        = SOLID_NOT;
+    self.solid        = SOLID_CORPSE;
     self.takedamage   = DAMAGE_NO;
-    //self.touch        = racer_dietouch;
     self.deadflag     = DEAD_DYING;
     self.movetype     = MOVETYPE_BOUNCE;
-    self.wait = time;
-
-    pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
+    self.think        = raptor_diethink;
+    self.nextthink    = time;
+    
+    pointparticles(particleeffectnum("explosion_medium"), findbetterlocation (self.origin, 16), '0 0 0', 1);
 
-    self.velocity     += '0 0 128';
+    self.velocity_z += 600;
 
-    if(random() < 0.5)
-        self.avelocity_z  = 45;
-    else
-        self.avelocity_z  = -45;
+    self.avelocity = '0 0.5 1' * (random() * 400);
+    self.avelocity -= '0 0.5 1' * (random() * 400);
 
     self.colormod = '-0.5 -0.5 -0.5';
-
-       self.think     = raptor_spawn;
-       self.nextthink = time + 5;
+       self.touch     = raptor_blowup;
 }
 
 void raptor_spawn()
 {
-    self.flags     = FL_NOTARGET;
-    self.effects   = 0;
-
-    self.vehicle_health = raptor_health_max;
-    self.vehicle_shield = raptor_shield_max;
-
-    self.event_damage = vehicle_stdproc_damage;
-    self.touch      = raptor_touch;
-
-    self.iscreature = TRUE;
-    self.movetype   = MOVETYPE_FLY;
-    self.solid      = SOLID_SLIDEBOX;
-    self.takedamage = DAMAGE_AIM;
-
-    self.alpha = 1;
-       self.colormap = 1024;
-       self.deadflag    = DEAD_NO;
-    self.bot_attack = TRUE;
-
-    self.colormod = '1 1 1';
-    self.avelocity = '0 0 0';
-    self.velocity = '0 0 0';
-
+    self.frame          = 0;
+    self.vehicle_health = autocvar_g_vehicle_raptor_health;
+    self.vehicle_shield = autocvar_g_vehicle_raptor_shield;
+    self.movetype       = MOVETYPE_TOSS;
+    self.solid          = SOLID_SLIDEBOX;
     self.vehicle_energy = 1;
-    self.vehicle_hudmodel.viewmodelforclient = self;
 
-    setorigin(self, self.pos1);
-    self.angles = self.pos2;
+    self.bomb1.gun1.avelocity_y = 90;
+    self.bomb1.gun2.avelocity_y = -90;
 
-    setsize(self,RAPTOR_MIN ,RAPTOR_MAX );
-    pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
+    setsize(self, RAPTOR_MIN, RAPTOR_MAX );
     self.delay = time;
 }
 
-float raptor_customizeentityforclient()
+// If we dont do this ever now and then, the raptors rotors
+// stop working, presumably due to angle overflow. cute.
+void raptor_rotor_anglefix()
 {
-    if(self.deadflag == DEAD_DEAD)
-        return FALSE;
-
-    /*
-    if(other == self.owner)
-        self.alpha = -1;
-    else
-        self.alpha = 1;
-    */
-
-    return TRUE;
+    self.gun1.angles_y = anglemods(self.gun1.angles_y);
+    self.gun2.angles_y = anglemods(self.gun2.angles_y);
+    self.nextthink = time + 15;
 }
 
 void raptor_dinit()
 {
+    entity spinner;
+    vector ofs;
+
+    if not (vehicle_initialize(
+             "Raptor",
+             "models/vehicles/raptor.dpm",
+             "",
+             "models/vehicles/raptor_cockpit.dpm",
+             "", "tag_hud", "tag_camera",
+             HUD_RAPTOR,
+             RAPTOR_MIN, RAPTOR_MAX,
+             FALSE,
+             raptor_spawn, autocvar_g_vehicle_raptor_respawntime,
+             raptor_frame,
+             raptor_enter, raptor_exit,
+             raptor_die,   raptor_think,
+             FALSE))
+    {
+        remove(self);
+        return;
+    }
 
-    if (self.netname == "")
-        self.netname     = "Raptor";
-
-    setorigin(self, self.origin);
+    //FIXME: Camera is in a bad place in HUD model.
+    //setorigin(self.vehicle_viewport, '25 0 5');
 
     self.frame = 0;
 
-    setmodel(self,"models/vehicles/raptor.dpm");
-
     self.bomb1 = spawn();
     self.bomb2 = spawn();
+    self.gun1  = spawn();
+    self.gun2  = spawn();
 
-    setmodel(self.bomb1,"models/vehicles/raptor_bomb.dpm");
-    setmodel(self.bomb2,"models/vehicles/raptor_bomb.dpm");
+    setmodel(self.bomb1,"models/vehicles/clusterbomb_folded.md3");
+    setmodel(self.bomb2,"models/vehicles/clusterbomb_folded.md3");
+    setmodel(self.gun1, "models/vehicles/raptor_gun.dpm");
+    setmodel(self.gun2, "models/vehicles/raptor_gun.dpm");
+    setmodel(self.tur_head, "models/vehicles/raptor_body.dpm");
 
     setattachment(self.bomb1, self,"bombmount_left");
     setattachment(self.bomb2, self,"bombmount_right");
+    setattachment(self.tur_head, self,"root");
 
 
-    if not (self.vehicle_hudmodel)
-    {
-        self.vehicle_hudmodel   = spawn();
-        setmodel(self.vehicle_hudmodel, "models/vehicles/raptor_cockpit.dpm");
-        //setattachment(self.vehicle_hudmodel, self, "tag_viewport");
-        setattachment(self.vehicle_hudmodel, self, "tag_hud");
-    }
+    // FIXME Guns mounts to angled bones
+    self.bomb1.angles = self.angles;
+    self.angles = '0 0 0';
+    // This messes up gun-aim, so work arround it.
+    //setattachment(self.gun1, self, "gunmount_left");
+    ofs = gettaginfo(self, gettagindex(self, "gunmount_left"));
+    ofs -= self.origin;
+    setattachment(self.gun1, self, "");
+    setorigin(self.gun1, ofs);
 
-    if not (self.vehicle_viewport)
-    {
-        self.vehicle_viewport   = spawn();
-        setmodel (self.vehicle_viewport, "null");
-        setattachment(self.vehicle_viewport, self.vehicle_hudmodel, "tag_camera");
-    }
+    //setattachment(self.gun2, self, "gunmount_right");
+    ofs = gettaginfo(self, gettagindex(self, "gunmount_right"));
+    ofs -= self.origin;
+    setattachment(self.gun2, self, "");
+    setorigin(self.gun2, ofs);
 
-    if not (self.gun1)
-    {
-        self.gun1   = spawn();
-        setmodel(self.gun1, "models/vehicles/raptor_gun.dpm");
-        setattachment(self.gun1, self, "gunmount_left");
-    }
-
-    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;
+    self.angles = self.bomb1.angles;
+    self.bomb1.angles = '0 0 0';
 
-
-    entity spinner;
     spinner = spawn();
     spinner.owner = self;
     setmodel(spinner,"models/vehicles/spinner.dpm");
     setattachment(spinner, self, "engine_left");
     spinner.movetype = MOVETYPE_NOCLIP;
     spinner.avelocity = '0 90 0';
+    self.bomb1.gun1 = spinner;
 
     spinner = spawn();
     spinner.owner = self;
@@ -817,76 +695,46 @@ void raptor_dinit()
     setattachment(spinner, self, "engine_right");
     spinner.movetype = MOVETYPE_NOCLIP;
     spinner.avelocity = '0 -90 0';
+    self.bomb1.gun2 = spinner;
 
-    addstat(STAT_HUD, AS_INT,  hud);
-       addstat(STAT_VEHICLESTAT_HEALTH,  AS_FLOAT, vehicle_health);
-       addstat(STAT_VEHICLESTAT_SHIELD,  AS_FLOAT, vehicle_shield);
-       addstat(STAT_VEHICLESTAT_ENERGY,  AS_FLOAT, vehicle_energy);
-
-       addstat(STAT_VEHICLESTAT_AMMO1,   AS_INT,   vehicle_ammo1);
-       addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1);
-
-       addstat(STAT_VEHICLESTAT_AMMO2,   AS_INT,   vehicle_ammo2);
-       addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
+    // Sigh.
+    self.bomb1.think = raptor_rotor_anglefix;
+    self.bomb1.nextthink = time;
 
-    raptor_spawn();
+    self.mass               = 1 ;
 }
 
 void spawnfunc_vehicle_raptor()
 {
-    self.cvar_basename      = "g_vehicle_raptor";
-    raptor_loadsettings();
+    vehicles_configcheck("vehicle_raptor.cfg", autocvar_g_vehicle_raptor_health);
 
-    self.vehicle_flags      = VHF_HASSHIELD | VHF_SHIELDREGEN;
+    self.vehicle_flags |= VHF_DMGSHAKE;
+    self.vehicle_flags |= VHF_DMGROLL;
+   
+    if(autocvar_g_vehicle_raptor_shield)
+        self.vehicle_flags |= VHF_HASSHIELD;
 
-    traceline(self.origin, self.origin - '0 0 2048', MOVE_WORLDONLY, self);
-    if(trace_startsolid)
-    {
-        dprint("WARNING: vehicle_raptor placed in solid\n");
-        traceline(self.origin + '0 0 512' ,self.origin - '0 0 2048',MOVE_WORLDONLY,self);
-        if(trace_startsolid || trace_fraction == 1.0)
-        {
-            dprint("ERROR: vehicle_raptor placed in more then 512 units into solid\n");
-            remove(self);
-            return;
-        }
-    }
+    if(autocvar_g_vehicle_raptor_shield_regen)
+        self.vehicle_flags |= VHF_SHIELDREGEN;
 
-    if(trace_fraction != 1.0)
-        setorigin(self,trace_endpos + '0 0 8');
-    else
-        dprint("WARNING: vehicle_racer placed more then 2048 units above ground.\n");
+    if(autocvar_g_vehicle_raptor_health_regen)
+        self.vehicle_flags |= VHF_HEALTHREGEN;
+
+    if(autocvar_g_vehicle_raptor_energy_regen)
+        self.vehicle_flags |= VHF_ENERGYREGEN;
 
     precache_model ("models/vehicles/raptor.dpm");
     precache_model ("models/vehicles/raptor_gun.dpm");
     precache_model ("models/vehicles/spinner.dpm");
     precache_model ("models/vehicles/raptor_cockpit.dpm");
-    precache_model ("models/vehicles/raptor_bomb.dpm");
-
-
+    //precache_model ("models/vehicles/clusterbomb.md3");
+    precache_model ("models/vehicles/clusterbomb_folded.md3");
+    precache_model ("models/vehicles/raptor_body.dpm");
+    
+    precache_sound ("vehicles/raptor_fly.wav");
+    precache_sound ("vehicles/raptor_speed.wav");
+    
     self.think = raptor_dinit;
-    self.nextthink = time + 1;
-}
-
-
-void spawnfunc_vehicle_raptor2()
-{
-    entity iqm,dpm,md3;
-
-    precache_model ("models/vehicles/test.iqm");
-    precache_model ("models/vehicles/test.dpm");
-    precache_model ("models/vehicles/test.md3");
-
-    iqm = spawn();
-    dpm = spawn();
-    md3 = spawn();
-    iqm.scale = md3.scale = dpm.scale = 10;
-
-    //setmodel(iqm,"models/vehicles/test.iqm");
-    //setmodel(dpm,"models/vehicles/test.dpm");
-    setmodel(md3,"models/vehicles/test.md3");
-
-    setorigin(iqm, self.origin + '0 0 16');
-    setorigin(dpm, self.origin + '0 20 32');
-    setorigin(iqm, self.origin + '0 40 48');
+    self.nextthink = time + (autocvar_g_vehicles_delayspawn ? autocvar_g_vehicle_raptor_respawntime + (random() * autocvar_g_vehicles_delayspawn_jitter) : 0.5);
 }
+#endif // SVQC
index 08b9459911cf0f50fbf2fb7c8181eae9772a7271..96ea14067ce66886c12a1aba8d8d8cba3dfd6a97 100644 (file)
@@ -1,71 +1,74 @@
-const vector spiderbot_MIN = '-75 -75 0';
-const vector spiderbot_MAX  = '75 75 100';
-
-#define spiderbot_spawnpnt wkr_spawn
+const vector SPIDERBOT_MIN = '-75 -75 10';
+const vector SPIDERBOT_MAX  = '75 75 125';
+
+#ifdef SVQC
+float autocvar_g_vehicle_spiderbot_respawntime;
+
+float autocvar_g_vehicle_spiderbot_speed_stop;
+float autocvar_g_vehicle_spiderbot_speed_strafe;
+float autocvar_g_vehicle_spiderbot_speed_walk;
+float autocvar_g_vehicle_spiderbot_turnspeed;
+float autocvar_g_vehicle_spiderbot_movement_inertia;
+
+float autocvar_g_vehicle_spiderbot_springlength;
+float autocvar_g_vehicle_spiderbot_springup;
+float autocvar_g_vehicle_spiderbot_springblend;
+
+float autocvar_g_vehicle_spiderbot_head_pitchlimit_down;
+float autocvar_g_vehicle_spiderbot_head_pitchlimit_up;
+float autocvar_g_vehicle_spiderbot_head_pitchspeed;
+float autocvar_g_vehicle_spiderbot_head_turnlimit;
+float autocvar_g_vehicle_spiderbot_head_turnspeed;
+
+//float autocvar_g_vehicle_spiderbot_energy;
+//float autocvar_g_vehicle_spiderbot_energy_regen;
+//float autocvar_g_vehicle_spiderbot_energy_regen_pause;
+
+float autocvar_g_vehicle_spiderbot_health;
+float autocvar_g_vehicle_spiderbot_health_regen;
+float autocvar_g_vehicle_spiderbot_health_regen_pause;
+
+float autocvar_g_vehicle_spiderbot_shield;
+float autocvar_g_vehicle_spiderbot_shield_regen;
+float autocvar_g_vehicle_spiderbot_shield_regen_pause;
+
+float autocvar_g_vehicle_spiderbot_minigun_damage;
+float autocvar_g_vehicle_spiderbot_minigun_refire;
+float autocvar_g_vehicle_spiderbot_minigun_spread;
+float autocvar_g_vehicle_spiderbot_minigun_ammo_cost;
+float autocvar_g_vehicle_spiderbot_minigun_ammo_max;
+float autocvar_g_vehicle_spiderbot_minigun_ammo_regen;
+float autocvar_g_vehicle_spiderbot_minigun_ammo_regen_pause;
+
+float autocvar_g_vehicle_spiderbot_rocket_damage;
+float autocvar_g_vehicle_spiderbot_rocket_force;
+float autocvar_g_vehicle_spiderbot_rocket_radius;
+float autocvar_g_vehicle_spiderbot_rocket_speed;
+float autocvar_g_vehicle_spiderbot_rocket_refire;
+float autocvar_g_vehicle_spiderbot_rocket_reload;
+float autocvar_g_vehicle_spiderbot_rocket_health;
+float autocvar_g_vehicle_spiderbot_rocket_noise;
+float autocvar_g_vehicle_spiderbot_rocket_turnrate;
+float autocvar_g_vehicle_spiderbot_rocket_lifetime;
 
 void spiderbot_exit(float eject);
 void spiderbot_enter();
-
-void spiderbot_rocket_explode()
-{
-    vector org2;
-
-    if(self.event_damage != SUB_Null)
-    {
-        self.event_damage = SUB_Null;
-        self.think = spiderbot_rocket_explode;
-        self.nextthink = time;
-        return;
-    }
-
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    org2 = findbetterlocation (self.origin, 16);
-    pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
-    w_deathtypestring = "dident escape the rocket barrage";
-
-    if(!self.owner)
-        self.owner = self.realowner;
-
-    RadiusDamage (self, self.owner,
-        autocvar_g_vehicle_spiderbot_rocket_damage,
-        autocvar_g_vehicle_spiderbot_rocket_edgedamage,
-        autocvar_g_vehicle_spiderbot_rocket_radius, world,
-        autocvar_g_vehicle_spiderbot_rocket_force, DEATH_SBROCKET, world);
-
-    remove (self);
-}
-
-void spiderbot_rocket_touch()
-{
-    if(self.owner)
-    {
-        if(other == self.owner.vehicle)
-            return;
-
-        if(other == self.owner.vehicle.tur_head)
-            return;
-    }
-
-    PROJECTILE_TOUCH;
-    spiderbot_rocket_explode();
-}
+void spiderbot_spawn();
 
 void spiderbot_rocket_unguided()
 {
-    vector newdir,olddir;
+    vector newdir, olddir;
 
     self.nextthink  = time;
 
-
     olddir = normalize(self.velocity);
     newdir = normalize(self.pos1 - self.origin) + randomvec() * autocvar_g_vehicle_spiderbot_rocket_noise;
     self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_spiderbot_rocket_turnrate) * autocvar_g_vehicle_spiderbot_rocket_speed;
 
     UpdateCSQCProjectile(self);
 
-    if (self.owner.deadflag != DEAD_NO || self.cnt < time)
-        spiderbot_rocket_explode();
-
+    if (self.owner.deadflag != DEAD_NO || self.cnt < time || vlen(self.pos1 - self.origin) < 16)
+        self.use();
 }
 
 void spiderbot_rocket_guided()
@@ -74,10 +77,10 @@ void spiderbot_rocket_guided()
 
     self.nextthink  = time;
 
-    if not (self.owner.vehicle)
+    if not (self.realowner.vehicle)
         self.think = spiderbot_rocket_unguided;
 
-    crosshair_trace(self.owner);
+    crosshair_trace(self.realowner);
     olddir = normalize(self.velocity);
     newdir = normalize(trace_endpos - self.origin) + randomvec() * autocvar_g_vehicle_spiderbot_rocket_noise;
     self.velocity = normalize(olddir + newdir * autocvar_g_vehicle_spiderbot_rocket_turnrate) * autocvar_g_vehicle_spiderbot_rocket_speed;
@@ -85,26 +88,17 @@ void spiderbot_rocket_guided()
     UpdateCSQCProjectile(self);
 
     if (self.owner.deadflag != DEAD_NO || self.cnt < time)
-        spiderbot_rocket_explode();
-}
-
-void spiderbot_rocket_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
-{
-    self.health -= damage;
-    self.velocity += force;
-    if(self.health < 1)
-        spiderbot_rocket_explode();
+        self.use();
 }
 
 void spiderbot_guide_release()
 {
     entity rkt;
-    rkt = findchainentity(owner,self.owner);
+    rkt = findchainentity(realowner, self.owner);
     if not (rkt)
         return;
 
     crosshair_trace(self.owner);
-
     while(rkt)
     {
         if(rkt.think == spiderbot_rocket_guided)
@@ -112,13 +106,14 @@ void spiderbot_guide_release()
             rkt.pos1 = trace_endpos;
             rkt.think = spiderbot_rocket_unguided;
         }
-
         rkt = rkt.chain;
     }
 }
 
 void spiderbot_rocket_do()
 {
+
+    vector v;
     entity rocket;
 
     if (self.owner.BUTTON_ATCK2)
@@ -131,7 +126,6 @@ void spiderbot_rocket_do()
 
             return;
         }
-
         self.wait = 1;
     }
     else
@@ -151,33 +145,20 @@ void spiderbot_rocket_do()
     if not (self.owner.BUTTON_ATCK2)
         return;
 
-    sound (self, CHAN_WEAPON, "weapons/rocket_fire.wav", VOL_BASE, ATTN_NORM);
-    rocket                    = spawn ();
-    setsize (rocket, '-1 -1 -1', '1 1 1'); // give it some size so it can be shot
-    setorigin(rocket,gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire")));
-    te_explosion (rocket.origin);
-
     crosshair_trace(self.owner);
 
-    rocket.classname       = "spiderbot_rocket";
-    rocket.bot_dodge       = TRUE;
-    rocket.bot_dodgerating = autocvar_g_vehicle_spiderbot_rocket_damage;
-    rocket.cnt             = time + autocvar_g_vehicle_spiderbot_rocket_lifetime;
-    rocket.health          = autocvar_g_vehicle_spiderbot_rocket_health;
-    rocket.takedamage      = DAMAGE_AIM;
-    rocket.event_damage    = spiderbot_rocket_damage;
-    rocket.owner           = self.owner;
-    rocket.nextthink       = time;
-    rocket.movetype        = MOVETYPE_FLYMISSILE;
-    rocket.velocity        = normalize(v_forward + (v_up * 0.5) + randomvec() * 0.25) * autocvar_g_vehicle_spiderbot_rocket_speed;
-    rocket.angles          = vectoangles(rocket.velocity);
-    rocket.think           = spiderbot_rocket_guided;
-    rocket.touch           = spiderbot_rocket_touch;
-    rocket.flags           = FL_PROJECTILE;
-    rocket.solid           = SOLID_TRIGGER;
-    rocket.pos1            = trace_endpos;
-
-       CSQCProjectile(rocket, FALSE, PROJECTILE_ROCKET, FALSE); // no culling, has fly sound
+    v = gettaginfo(self.tur_head,gettagindex(self.tur_head,"tag_fire"));
+    rocket = vehicles_projectile("spiderbot_rocket_launch", "weapons/rocket_fire.wav",
+                           v, normalize(v_forward) * autocvar_g_vehicle_spiderbot_rocket_speed,
+                           autocvar_g_vehicle_spiderbot_rocket_damage, autocvar_g_vehicle_spiderbot_rocket_radius, autocvar_g_vehicle_spiderbot_rocket_force, 1,
+                           DEATH_SBROCKET, PROJECTILE_SPIDERROCKET, autocvar_g_vehicle_spiderbot_rocket_health, FALSE, FALSE);
+
+    rocket.cnt        = time + 15;
+    rocket.classname  = "spiderbot_rocket";
+    rocket.pos1       = trace_endpos;
+    rocket.think      = spiderbot_rocket_guided;
+    rocket.nextthink  = time;
+    rocket.cnt        = time + autocvar_g_vehicle_spiderbot_rocket_lifetime;
 
     self.tur_head.frame += 1;
     if (self.tur_head.frame == 9)
@@ -188,159 +169,85 @@ void spiderbot_rocket_do()
     self.gun2.cnt = time + self.attack_finished_single;
 }
 
-/*
-void spiderbot_minigun_fire_Flash_Go() {
-       if (self.frame > 10)
-       {
-               self.alpha = -1;
-               setmodel(self,"");
-               return;
-       }
-
-       self.frame = self.frame + 2;
-       self.alpha = self.alpha - 0.2;
-       self.scale -= 0.01;
-       self.nextthink = time + 0.02;
-}
-*/
-
-void spiderbot_minigun_fire(entity gun, float trail)
-{
-    vector v;
-    
-    v = gettaginfo(gun,gettagindex(gun,"barrels"));
-    v_forward = normalize(v_forward);
-
-    sound (gun, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
-
-    fireBullet (v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
-        autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_SBMINIGUN, 0);
-
-
-       UziFlash();
-       setattachment(self.muzzle_flash, self.tur_head, "tag_fire");
-
-    if(trail)
-        trailparticles(self, particleeffectnum("EF_MGTURRETTRAIL"), v, trace_endpos);
-}
-
-void spiderbot_miniguns_do()
-{
-    float ftmp;
-
-    if((self.vehicle_reload1 == 1) || (!self.owner.BUTTON_ATCK))
-    {
-
-        ftmp = 1 / autocvar_g_vehicle_spiderbot_minigun_cooldown * sys_frametime;
-        self.owner.vehicle_reload1 = max(self.owner.vehicle_reload1 - ftmp, 0);
-        if(self.owner.vehicle_reload1 <= 0)
-            self.vehicle_reload1 = 0;
-
-        return ;
-    }
-
-    if (self.owner.BUTTON_ATCK)
-    {
-
-        // Animate miniguns
-        self.gun1.angles_z += (1440 * sys_frametime);
-        self.gun2.angles_z -= (1440 * sys_frametime);
-        if(self.gun1.angles_z >= 360)
-        {
-            self.gun1.angles_z = 0;
-            self.gun2.angles_z = 360;
-        }
-
-        if (self.tur_head.attack_finished_single < time)
-        {
-            // Fire bullets, alternating trails left<->right
-            self = self.owner;
-            if(self.misc_bulletcounter == 1)
-            {
-                spiderbot_minigun_fire(self.vehicle.gun1, 0);
-                spiderbot_minigun_fire(self.vehicle.gun2, 1);
-                self.misc_bulletcounter = 0;
-            }
-            else
-            {
-                spiderbot_minigun_fire(self.vehicle.gun1, 1);
-                spiderbot_minigun_fire(self.vehicle.gun2, 0);
-                self.misc_bulletcounter += 1;
-            }
-
-            self = self.vehicle;
-
-            ftmp = autocvar_g_vehicle_spiderbot_minigun_refire / autocvar_g_vehicle_spiderbot_minigun_heat;
-            self.owner.vehicle_reload1 +=  ftmp;
-
-            if(self.owner.vehicle_reload1 >= 1)
-            {
-                self.vehicle_reload1 = 1;
-                self.owner.vehicle_reload1 = 1;
-                self.tur_head.attack_finished_single = autocvar_g_vehicle_spiderbot_minigun_cooldown + time;
-            }
-            else
-                self.tur_head.attack_finished_single = autocvar_g_vehicle_spiderbot_minigun_refire + time;
-        }
-
-        self = self.owner;
-        return;
-    }
-}
-
-float spiderbot_pplug()
+float spiderbot_frame()
 {
     vector ad;
-    entity player,spider;
+    entity player, spider;
     float ftmp;
 
-    if not (self.owner)
-    {
-    }
-
+       if(intermission_running)
+               return 1;
+               
     player = self;
     spider = self.vehicle;
+    self   = spider;
 
-    player.BUTTON_ZOOM = 0;
-    player.BUTTON_CROUCH = 0;
-    player.switchweapon = 0;
-
-    if(player.BUTTON_USE)
-    {
-        self = spider;
-        spiderbot_exit(0);
-        self = player;
-        return 0;
-    }
+    vehicles_painframe();
+    
+    player.BUTTON_ZOOM      = 0;
+    player.BUTTON_CROUCH    = 0;
+    player.switchweapon     = 0;
 
     crosshair_trace(player);
-    ad = vectoangles(normalize(trace_endpos - gettaginfo(spider.tur_head,gettagindex(spider.tur_head,"tag_hud")))) - (spider.tur_head.angles + spider.angles);
+    //UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload2) + ('0 1 0' * (1 - player.vehicle_reload2)), 2);
 
-    fixedmakevectors(spider.angles);
-    if(ad_x > 180) ad_x -= 360;
+    //player.v_angle_x *= -1;
+    //gettaginfo(spider.tur_head, 0);
+    //ad = player.v_angle - vectoangles2(v_forward, v_up);
+    //ad = player.v_angle - (spider.tur_head.angles + spider.angles);
+    //player.v_angle_x *= -1;
+    ad = AnglesTransform_ToAngles(AnglesTransform_LeftDivide(AnglesTransform_FromAngles(spider.angles), AnglesTransform_FromVAngles(player.v_angle))) - spider.tur_head.angles;
+
+    if(ad_x > 180)  ad_x -= 360;
     if(ad_x < -180) ad_x += 360;
-    if(ad_y > 180) ad_y -= 360;
+    if(ad_y > 180)  ad_y -= 360;
     if(ad_y < -180) ad_y += 360;
-
+    
     // Rotate head
     ftmp = autocvar_g_vehicle_spiderbot_head_turnspeed * sys_frametime;
     ad_y = bound(-ftmp, ad_y, ftmp);
     spider.tur_head.angles_y = bound(autocvar_g_vehicle_spiderbot_head_turnlimit * -1, spider.tur_head.angles_y + ad_y, autocvar_g_vehicle_spiderbot_head_turnlimit);
 
     // Pitch head
+#if 0 // Enable to pich by cross-trace (more precise in chase, but less predictable)
+    ad = vectoangles(normalize(trace_endpos - gettaginfo(spider.tur_head,gettagindex(spider.tur_head,"tag_hud")))) - (spider.tur_head.angles + spider.angles);
+    if(ad_x > 180) ad_x -= 360;
+    if(ad_x < -180) ad_x += 360;
+#endif
     ftmp = autocvar_g_vehicle_spiderbot_head_pitchspeed * sys_frametime;
-    ad_x = bound(-ftmp, ad_x, ftmp);
+    ad_x = bound(ftmp * -1, ad_x, ftmp);
     spider.tur_head.angles_x = bound(autocvar_g_vehicle_spiderbot_head_pitchlimit_down, spider.tur_head.angles_x + ad_x, autocvar_g_vehicle_spiderbot_head_pitchlimit_up);
 
     // Turn Body
     ftmp = autocvar_g_vehicle_spiderbot_turnspeed * sys_frametime;
     ftmp = bound(-ftmp, spider.tur_head.angles_y, ftmp);
 
-    self = spider;
+    makevectors(spider.angles + '-2 0 0' * spider.angles_x);
+
+/*
+    vector ofs;
+    ofs = self.origin + v_up * 128;
+    te_lightning1(world, ofs, ofs + v_up * 32);
+    te_lightning1(world, ofs, ofs + v_right * 128);
+    te_lightning1(world, ofs, ofs + v_forward * 256);
+*/
+
+    movelib_groundalign4point(autocvar_g_vehicle_spiderbot_springlength, autocvar_g_vehicle_spiderbot_springup, autocvar_g_vehicle_spiderbot_springblend);
+
     if(spider.flags & FL_ONGROUND)
     {
-        if(player.BUTTON_JUMP && self.tur_head.wait < time)
+        if(spider.frame == 4 && self.tur_head.wait != 0)
         {
+            sound (self, CHAN_TRIGGER, "vehicles/spiderbot_land.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+            spider.frame = 5;            
+        }
+        
+        if(player.BUTTON_JUMP && self.tur_head.wait < time)
+        {        
+            sound (self, CHAN_TRIGGER, "vehicles/spiderbot_jump.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+            //dprint("spiderbot_jump:", ftos(soundlength("vehicles/spiderbot_jump.wav")), "\n");
+            self.delay = 0;
+
             self.tur_head.wait = time + 2;
             player.BUTTON_JUMP = 0;
             spider.velocity   = v_forward * 700 + v_up * 600;
@@ -350,6 +257,13 @@ float spiderbot_pplug()
         {
             if(vlen(player.movement) == 0)
             {
+                if(self.sound_nexttime < time || self.delay != 3)
+                {                        
+                    self.delay = 3;
+                    self.sound_nexttime = time + 6.486500; //soundlength("vehicles/spiderbot_idle.wav");
+                    //dprint("spiderbot_idle:", ftos(soundlength("vehicles/spiderbot_idle.wav")), "\n");
+                    sound (self, CHAN_TRIGGER, "vehicles/spiderbot_idle.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+                }                
                 movelib_beak_simple(autocvar_g_vehicle_spiderbot_speed_stop);
                 spider.frame = 5;
             }
@@ -372,6 +286,14 @@ float spiderbot_pplug()
                     }
                     player.movement_y = 0;
                     movelib_move_simple(normalize(v_forward * player.movement_x),autocvar_g_vehicle_spiderbot_speed_walk,autocvar_g_vehicle_spiderbot_movement_inertia);
+
+                    if(self.sound_nexttime < time || self.delay != 1)
+                    {                        
+                        self.delay = 1;
+                        self.sound_nexttime = time + 6.486500; //soundlength("vehicles/spiderbot_walk.wav");
+                        sound (self, CHAN_TRIGGER, "vehicles/spiderbot_walk.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+                        //dprint("spiderbot_walk:", ftos(soundlength("vehicles/spiderbot_walk.wav")), "\n");
+                    }
                 }
                 else if(player.movement_y != 0)
                 {
@@ -386,31 +308,103 @@ float spiderbot_pplug()
                         spider.frame = 3;
                     }
                     movelib_move_simple(normalize(v_right * player.movement_y),autocvar_g_vehicle_spiderbot_speed_strafe,autocvar_g_vehicle_spiderbot_movement_inertia);
+                    if(self.sound_nexttime < time || self.delay != 2)
+                    {                        
+                        self.delay = 2;
+                        self.sound_nexttime = time + 6.486500; //soundlength("vehicles/spiderbot_strafe.wav");
+                        sound (self, CHAN_TRIGGER, "vehicles/spiderbot_strafe.wav", VOL_VEHICLEENGINE, ATTN_NORM);
+                        //dprint("spiderbot_strafe:", ftos(soundlength("vehicles/spiderbot_strafe.wav")), "\n");
+                    }
                 }
-
             }
         }
-        movelib_groundalign4point(300,100,0.25);
     }
 
-    spiderbot_miniguns_do();
+    self.angles_x = bound(-45, self.angles_x, 45);
+    self.angles_z = bound(-45, self.angles_z, 45);
+
+    if(player.BUTTON_ATCK)
+    {
+        spider.cnt = time;
+        if(spider.vehicle_ammo1 >= autocvar_g_vehicle_spiderbot_minigun_ammo_cost && spider.tur_head.attack_finished_single <= time)
+        {
+            entity gun;
+            vector v;
+            spider.misc_bulletcounter += 1;
+
+            self = player;
+
+            mod(spider.misc_bulletcounter, 2) ? gun = spider.gun1 : gun = spider.gun2;
+            v = gettaginfo(gun, gettagindex(gun, "barrels"));
+            v_forward = normalize(v_forward);
+            v += v_forward * 50;
+
+            fireBullet (v, v_forward, autocvar_g_vehicle_spiderbot_minigun_spread, autocvar_g_vehicle_spiderbot_minigun_damage,
+                autocvar_g_vehicle_spiderbot_minigun_spread, DEATH_SBMINIGUN, 0);
+
+            sound (gun, CHAN_WEAPON, "weapons/uzi_fire.wav", VOL_BASE, ATTN_NORM);
+            trailparticles(self, particleeffectnum("spiderbot_minigun_trail"), v, trace_endpos);
+            pointparticles(particleeffectnum("spiderbot_minigun_muzzleflash"), v, v_forward * 2500, 1);
+
+            self = spider;
+
+            spider.vehicle_ammo1 -= autocvar_g_vehicle_spiderbot_minigun_ammo_cost;
+            spider.tur_head.attack_finished_single = time + autocvar_g_vehicle_spiderbot_minigun_refire;
+            player.vehicle_ammo1 = (spider.vehicle_ammo1 / autocvar_g_vehicle_spiderbot_minigun_ammo_max) * 100;
+        }
+    }
+    else
+        vehicles_regen(cnt, vehicle_ammo1, autocvar_g_vehicle_spiderbot_minigun_ammo_max,
+                                           autocvar_g_vehicle_spiderbot_minigun_ammo_regen_pause,
+                                           autocvar_g_vehicle_spiderbot_minigun_ammo_regen, frametime);
+
     spiderbot_rocket_do();
-    vehicle_stdproc_shiledregen(CCVAR("_shield"), frametime);
-    vehicle_stdproc_healthregen(CCVAR("_health"), frametime);
+
+    if(self.vehicle_flags  & VHF_SHIELDREGEN)
+        vehicles_regen(dmg_time, vehicle_shield, autocvar_g_vehicle_spiderbot_shield, autocvar_g_vehicle_spiderbot_shield_regen_pause, autocvar_g_vehicle_spiderbot_shield_regen, frametime);
+
+    if(self.vehicle_flags  & VHF_HEALTHREGEN)
+        vehicles_regen(dmg_time, vehicle_health, autocvar_g_vehicle_spiderbot_health, autocvar_g_vehicle_spiderbot_health_regen_pause, autocvar_g_vehicle_spiderbot_health_regen, frametime);
 
     player.BUTTON_ATCK = player.BUTTON_ATCK2 = 0;
     player.vehicle_ammo2 = spider.tur_head.frame;
 
     if(spider.gun2.cnt <= time)
-        player.vehicle_reload2 = 1;
+        player.vehicle_reload2 = 100;
     else
-        player.vehicle_reload2 = 1 - ((spider.gun2.cnt - time) / spider.attack_finished_single);
+        player.vehicle_reload2 = 100 - ((spider.gun2.cnt - time) / spider.attack_finished_single) * 100;
 
-    setorigin(player,spider.origin + '0 0 64');
+    setorigin(player, spider.origin + '0 0 1' * SPIDERBOT_MAX_z);
     player.velocity = spider.velocity;
 
-    self = player;
+    VEHICLE_UPDATE_PLAYER(health, spiderbot);
+
+    if(self.vehicle_flags & VHF_HASSHIELD)
+        VEHICLE_UPDATE_PLAYER(shield, spiderbot);
+
+#if 1 // 0 to enable per-gun impact aux crosshairs
+    // Avarage gun impact point's -> aux cross
+    vector vf;
+    ad = gettaginfo(spider.gun1, gettagindex(spider.gun1, "barrels"));
+    vf = v_forward;
+    ad += gettaginfo(spider.gun2, gettagindex(spider.gun2, "barrels"));
+    vf += v_forward;
+    ad = ad * 0.5;
+    v_forward = vf * 0.5;
+    traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, spider);
+    UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload1) + ('0 1 0' * (1 - player.vehicle_reload1)), 0);
+
+#else
+    ad = gettaginfo(spider.gun1, gettagindex(spider.gun1, "barrels"));
+    traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, spider);
+    UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload1) + ('0 1 0' * (1 - player.vehicle_reload1)), 0);
+
+    ad = gettaginfo(spider.gun2, gettagindex(spider.gun2, "barrels"));
+    traceline(ad, ad + v_forward * MAX_SHOT_DISTANCE, MOVE_NORMAL, spider);
+    UpdateAuxiliaryXhair(player, trace_endpos, ('1 0 0' * player.vehicle_reload1) + ('0 1 0' * (1 - player.vehicle_reload1)), 1);
+#endif
 
+    self = player;
     return 1;
 }
 
@@ -424,71 +418,23 @@ void spiderbot_think()
 
 void spiderbot_enter()
 {
-    // Remove this when bots know how to use the spiderbot
-    if (clienttype(other) != CLIENTTYPE_REAL)
-        return;
-
-    self.colormod = self.tur_head.colormod = '0 0 0';
-
-    if(teamplay)
-    if(self.team)
-    if(self.team != other.team)
-        return;
+    self.movetype   = MOVETYPE_WALK;
 
-    self.owner = other;
-    self.switchweapon = other.switchweapon;
-
-    self.event_damage         = vehicle_stdproc_damage ;
-    self.colormap             = self.owner.colormap;
-    self.tur_head.colormap    = self.owner.colormap;
-    self.vehicle_hudmodel.viewmodelforclient = self.owner;
-    self.nextthink            = 0;
-    self.owner.angles         = self.angles;
-    self.owner.takedamage     = DAMAGE_NO;
-    self.owner.solid          = SOLID_NOT;
-    self.owner.movetype       = MOVETYPE_NOCLIP;
-    self.owner.alpha          = -1;
-    self.owner.PlayerPhysplug = spiderbot_pplug;
-    self.owner.vehicle        = self;
-    self.owner.event_damage   = SUB_Null;
-    self.owner.hud            = HUD_SPIDERBOT;
     self.owner.vehicle_health = (self.vehicle_health / autocvar_g_vehicle_spiderbot_health);
     self.owner.vehicle_shield = (self.vehicle_shield / autocvar_g_vehicle_spiderbot_shield);
-    self.owner.view_ofs       = '0 0 0';
-    self.owner.vehicle_ammo1 = self.vehicle_ammo1;
-    self.owner.vehicle_ammo2 = self.vehicle_ammo2;
-    self.owner.vehicle_reload1 = self.vehicle_reload1;
-    self.owner.vehicle_reload2 = self.vehicle_reload2;
-
-    //if(other.flags & FL_ONGROUND)
-        other.flags &~= FL_ONGROUND;
-
-    //if(self.flags & FL_ONGROUND)
-        self.flags &~= FL_ONGROUND;
-
-    self.team                 = self.owner.team;
-    self.flags               -= FL_NOTARGET;
 
-    if(clienttype(other) == CLIENTTYPE_REAL)
+    if(self.owner.flagcarried)
     {
-        msg_entity = other;
-        WriteByte (MSG_ONE, SVC_SETVIEWPORT);
-        WriteEntity(MSG_ONE, self.vehicle_viewport);
-
-        WriteByte (MSG_ONE, SVC_SETVIEWANGLES);  // 10 = SVC_SETVIEWANGLES
-        WriteAngle(MSG_ONE, self.tur_head.angles_x + self.angles_x);    // tilt
-        WriteAngle(MSG_ONE, self.tur_head.angles_y + self.angles_y);    // yaw
-        WriteAngle(MSG_ONE, 0);    // roll
+        setattachment(self.owner.flagcarried, self.tur_head, ""); 
+        setorigin(self.owner.flagcarried, '-20 0 120'); 
     }
 }
 
 void spiderbot_exit(float eject)
 {
     entity e;
-    self.frame = 5;
-
-    self.flags      |= FL_NOTARGET;
-
+    vector spot;
+    
     e = findchain(classname,"spiderbot_rocket");
     while(e)
     {
@@ -500,256 +446,198 @@ void spiderbot_exit(float eject)
         e = e.chain;
     }
 
-    self.owner.switchweapon = self.switchweapon;
-
-    self.velocity = '0 0 0';
-    if(clienttype(self.owner) == CLIENTTYPE_REAL)
-    {
-        msg_entity = self.owner;
-        WriteByte (MSG_ONE, SVC_SETVIEWPORT);
-        WriteEntity( MSG_ONE, self.owner);
-
-        WriteByte (MSG_ONE, SVC_SETVIEWANGLES);  // 10 = SVC_SETVIEWANGLES
-        WriteAngle(MSG_ONE, 0);    // tilt
-        WriteAngle(MSG_ONE, self.angles_y);    // yaw
-        WriteAngle(MSG_ONE, 0);    // roll
-    }
-
-    self.think = spiderbot_think;
-    self.nextthink = time;
-    self.owner.takedamage     = DAMAGE_AIM;
-    self.owner.solid          = SOLID_SLIDEBOX;
-    self.owner.movetype       = MOVETYPE_WALK;
-
-    setsize(self.owner,PL_MIN,PL_MAX);
-
-    self.owner.alpha          = 1;
-    self.owner.PlayerPhysplug = SUB_Null;
-    self.owner.vehicle        = world;
-       self.owner.view_ofs       = PL_VIEW_OFS;
-       self.owner.hud            = HUD_NORMAL;
-       self.owner.event_damage   = PlayerDamage;
-
-       self.colormap            = 1024;
-       self.tur_head.colormap   = 1024;
-
-    if not (teamplay)
-        self.team                = 0;
-    else
-    {
-        self.team = self.spiderbot_spawnpnt.team ;
-        if (self.team == COLOR_TEAM1) self.colormod = '1.4 0.8 0.8';
-        if (self.team == COLOR_TEAM2) self.colormod = '0.8 0.8 1.4';
-        self.tur_head.colormod = self.colormod;
-    }
-
-       self.vehicle_hudmodel.viewmodelforclient = self;
-       self.tur_head.nodrawtoclient             = self;
-
-    setattachment(self.owner,world,"");
+    self.velocity   = '0 0 0';
+    self.think      = spiderbot_think;
+    self.nextthink  = time;
+    self.frame      = 5;
+    self.movetype   = MOVETYPE_WALK;
+    
+    if not (self.owner)
+        return;
 
        makevectors(self.angles);
        if(eject)
        {
-           setorigin(self.owner,self.origin + v_forward * 100 + '0 0 64');
+           spot = self.origin + v_forward * 100 + '0 0 64';
+           spot = vehicles_findgoodexit(spot);
+           setorigin(self.owner , spot);
            self.owner.velocity = (v_up + v_forward * 0.25) * 750;
        }
        else
-        setorigin(self.owner,self.origin - v_forward * 200 + '0 0 64');
-
+       {
+           spot = self.origin - v_forward * 200 + '0 0 64';
+           spot = vehicles_findgoodexit(spot);
+           setorigin(self.owner , spot);
+       }
+        
     self.owner = world;
 }
 
-float spiderbot_crushable(entity e)
+void spiderbot_spawn()
 {
-    if(e.classname == "corpse")
-        return 1;
-
-    if(e.classname == "player")
-        return 1;
-
-    if(e.classname == "monster_zombie")
-        return 1;
-
-    return 0;
+    self.frame              = 5;
+    self.tur_head.frame     = 1;
+    self.think              = spiderbot_think;
+    self.nextthink          = time;
+    self.vehicle_health     = autocvar_g_vehicle_spiderbot_health;
+    self.vehicle_shield     = autocvar_g_vehicle_spiderbot_shield;
+    self.movetype           = MOVETYPE_WALK;
+    self.solid              = SOLID_SLIDEBOX;
+    self.alpha              = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1;
+    self.tur_head.angles    = '0 0 0';
+
+    setorigin(self, self.pos1 + '0 0 128');
+    self.angles = self.pos2;
 }
 
-void spiderbot_touch()
+void spiderbot_headfade()
 {
-    if(self.owner)
-    {
-        if(vlen(self.velocity) == 0)
-            return;
+       self.think = spiderbot_headfade;
+       self.nextthink = self.fade_time;
+       self.alpha = 1 - (time - self.fade_time) * self.fade_rate;
 
-        if not (spiderbot_crushable(other))
-            return;
-
-        //todo: add check for velocity/angle here (so we dont cush players runing into us from behind)
-
-        Damage(other,self,self.owner,autocvar_g_vehicle_spiderbot_crush_dmg,DEATH_SBCRUSH,'0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicle_spiderbot_crush_force );
-        return;
+    if(self.cnt < time || self.alpha < 0.1)
+    {
+        if(self.alpha > 0.1)
+        {
+            sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+            pointparticles(particleeffectnum("explosion_big"), self.origin + '0 0 100', '0 0 0', 1);
+        }
+        remove(self);
     }
-
-    if(other.classname != "player")
-        return;
-
-    if(other.deadflag != DEAD_NO)
-        return;
-
-    if(other.vehicle != world)
-        return;
-
-    spiderbot_enter();
-}
-
-float spiderbot_customizeentityforclient()
-{
-    if(self.deadflag == DEAD_DEAD)
-        return FALSE;
-
-    return TRUE;
-}
-
-void spiderbot_spawn()
-{
-    self.frame = 5;
-    self.think = spiderbot_think;
-    self.nextthink = time;
-
-    setsize(self,spiderbot_MIN,spiderbot_MAX);
-
-    self.owner = world;
-    self.velocity = '0 0 0';
-    self.vehicle_health = CCVAR("_health");
-    self.vehicle_shield = CCVAR("_shield");
-    self.event_damage = vehicle_stdproc_damage;
-    self.iscreature = TRUE;
-    self.movetype   = MOVETYPE_WALK;
-    self.solid      = SOLID_SLIDEBOX;
-    self.takedamage = DAMAGE_AIM;
-    self.touch      = spiderbot_touch;
-    self.alpha      = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = 1;
-    self.tur_head.angles = '0 0 0';
-       self.colormap = 1024;
-       self.tur_head.colormap = 1024;
-       self.deadflag    = DEAD_NO;
-    self.bot_attack = TRUE;
-    self.flags      |= FL_NOTARGET;
-    self.vehicle_hudmodel.viewmodelforclient = self;
-    self.tur_head.frame = 1;
-
-    setorigin(self,self.spiderbot_spawnpnt.origin + '0 0 1.25' * spiderbot_MAX_z);
-    self.angles = self.spiderbot_spawnpnt.angles;
-
-    if (self.team == COLOR_TEAM1)
-        self.colormod = '1.4 0.8 0.8';
-    else if (self.team == COLOR_TEAM2)
-        self.colormod = '0.8 0.8 1.4';
-    else
-        self.colormod = '0 0 0';
-
-    self.tur_head.colormod = self.colormod;
-
-
-    pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
 }
 
 void spiderbot_blowup()
 {
-    sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
-    pointparticles(particleeffectnum("rocket_explode"), findbetterlocation (self.origin, 16), '0 0 0', 1);
+    if(self.cnt > time)
+    {
+        if(random() < 0.1)
+        {
+            sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
+            pointparticles(particleeffectnum("explosion_small"), randomvec() * 80 + (self.origin + '0 0 100'), '0 0 0', 1);
+        }
+        self.nextthink = time + 0.1;
+        return;
+    }
+    
+    entity h, g1, g2, b;
+    b = spawn();
+    h = spawn();
+    g1 = spawn();
+    g2 = spawn();
+
+    setmodel(b,  "models/vehicles/spiderbot.dpm");
+    setmodel(h,  "models/vehicles/spiderbot_top.dpm");
+    setmodel(g1, "models/vehicles/spiderbot_barrels.dpm");
+    setmodel(g2, "models/vehicles/spiderbot_barrels.dpm");
+
+    setorigin(b, self.origin);
+    b.frame         = 11;
+    b.angles        = self.angles;
+    setsize(b, self.mins, self.maxs);
+
+    setorigin(h, gettaginfo(self, gettagindex(self, "tag_head")));
+    h.movetype      = MOVETYPE_BOUNCE;
+    h.solid         = SOLID_BBOX;
+    h.velocity      = v_up * (500 + random() * 500) + randomvec() * 128;
+    h.modelflags    = MF_ROCKET;
+    h.effects       = EF_FLAME | EF_LOWPRECISION;
+    h.avelocity     = randomvec() * 360;
+
+    h.alpha         = 1;
+    h.cnt           = time + (3.5 * random());
+    h.fade_rate     = 1 / min(autocvar_g_vehicle_spiderbot_respawntime, 10);
+    h.fade_time     = time;
+    h.think         = spiderbot_headfade;
+    h.nextthink     = time;
+
+    setorigin(g1, gettaginfo(self.tur_head, gettagindex(self.tur_head, "tag_hardpoint01")));
+    g1.movetype     = MOVETYPE_TOSS;
+    g1.solid        = SOLID_CORPSE;
+    g1.velocity     = v_forward * 700 + (randomvec() * 32);
+    g1.avelocity    = randomvec() * 180;
+
+    setorigin(g2, gettaginfo(self.tur_head, gettagindex(self.tur_head, "tag_hardpoint02")));
+    g2.movetype     = MOVETYPE_TOSS;
+    g2.solid        = SOLID_CORPSE;
+    g2.velocity     = v_forward * 700 + (randomvec() * 32);
+    g2.avelocity    = randomvec() * 180;
+
+    h.colormod = b.colormod = g1.colormod = g2.colormod = '-2 -2 -2';
+
+    SUB_SetFade(b,  time + 5, min(autocvar_g_vehicle_spiderbot_respawntime, 1));
+    //SUB_SetFade(h,  time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
+    SUB_SetFade(g1, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
+    SUB_SetFade(g2, time, min(autocvar_g_vehicle_spiderbot_respawntime, 10));
 
     RadiusDamage (self, self, 250, 15, 250, world, 250, DEATH_SBBLOWUP, world);
 
     self.alpha = self.tur_head.alpha = self.gun1.alpha = self.gun2.alpha = -1;
-    self.nextthink  = time + autocvar_g_vehicle_spiderbot_respawntime;
-    self.think      = spiderbot_spawn;
     self.movetype   = MOVETYPE_NONE;
-
-    setorigin(self, self.tur_aimpos);
+    self.deadflag   = DEAD_DEAD;
+    self.solid      = SOLID_NOT;
+    self.tur_head.effects  &~=  EF_FLAME;
+       self.vehicle_hudmodel.viewmodelforclient = self;
 }
 
 void spiderbot_die()
 {
-
-    self.health = 0;
-    self.event_damage = SUB_Null;
-    self.iscreature = FALSE;
-    self.solid      = SOLID_NOT;
-    self.takedamage = DAMAGE_NO;
-    self.touch      = SUB_Null;
-    self.nextthink  = time + random() * 2;
-    self.think      = spiderbot_blowup;
-    self.deadflag    = DEAD_DEAD;
-       self.vehicle_hudmodel.viewmodelforclient = self;
-       self.frame = 0;
-       self.tur_head.frame = 1;
-
+    self.health             = 0;
+    self.event_damage       = SUB_Null;
+    self.takedamage         = DAMAGE_NO;
+    self.touch              = SUB_Null;
+    self.cnt                = 3.4 + time + random() * 2;
+    self.think              = spiderbot_blowup;
+    self.nextthink          = time;
+    self.deadflag           = DEAD_DYING;
+       self.frame              = 5;
+       self.tur_head.effects  |= EF_FLAME;
+       self.colormod           = self.tur_head.colormod = '-1 -1 -1';
+       self.frame              = 10;
+       self.movetype           = MOVETYPE_TOSS;
 }
 
 void vewhicle_spiderbot_dinit()
 {
+    if not (vehicle_initialize(
+             "Spiderbot",
+             "models/vehicles/spiderbot.dpm",
+             "models/vehicles/spiderbot_top.dpm",
+             "models/vehicles/spiderbot_cockpit.dpm",
+             "tag_head", "tag_hud", "",
+             HUD_SPIDERBOT,
+             SPIDERBOT_MIN, SPIDERBOT_MAX,
+             FALSE,
+             spiderbot_spawn, autocvar_g_vehicle_spiderbot_respawntime,
+             spiderbot_frame,
+             spiderbot_enter, spiderbot_exit,
+             spiderbot_die,   spiderbot_think,
+             FALSE))
+    {
+        remove(self);
+        return;
+    }
 
-    self.spiderbot_spawnpnt = spawn();
-    self.spiderbot_spawnpnt.angles = self.angles;
-
-    setorigin(self,self.origin);
-    tracebox(self.origin + '0 0 100', spiderbot_MIN, spiderbot_MAX, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
-    setorigin(self.spiderbot_spawnpnt,trace_endpos);
-
-    if(self.team && !teamplay)
-        self.team = 0;
-    else
-        self.spiderbot_spawnpnt.team = self.team;
-
-    addstat(STAT_HUD, AS_INT,  hud);
-       addstat(STAT_VEHICLESTAT_HEALTH,  AS_FLOAT, vehicle_health);
-       addstat(STAT_VEHICLESTAT_SHIELD,  AS_FLOAT, vehicle_shield);
-       addstat(STAT_VEHICLESTAT_ENERGY,  AS_FLOAT, vehicle_energy);
-       addstat(STAT_VEHICLESTAT_AMMO1,   AS_INT,   vehicle_ammo1);
-       addstat(STAT_VEHICLESTAT_RELOAD1, AS_FLOAT, vehicle_reload1);
-       addstat(STAT_VEHICLESTAT_AMMO2,   AS_INT,   vehicle_ammo2);
-       addstat(STAT_VEHICLESTAT_RELOAD2, AS_FLOAT, vehicle_reload2);
-
-    if (self.netname == "")
-        self.netname     = "spiderbot";
 
-    self.tur_head           = spawn();
     self.gun1               = spawn();
     self.gun2               = spawn();
-    self.vehicle_viewport   = spawn();
-    self.vehicle_hudmodel   = spawn();
-    self.vehicle_flags      = VHF_HASSHIELD | VHF_SHIELDREGEN | VHF_HEALTHREGEN | VHF_DEATHEJECT;
-    self.cvar_basename      = "g_vehicle_spiderbot";
-    self.gravity            = 2;
 
-    setmodel(self, "models/vehicles/spiderbot.dpm");
-    setmodel(self.tur_head, "models/vehicles/spiderbot_top.dpm");
     setmodel(self.gun1, "models/vehicles/spiderbot_barrels.dpm");
     setmodel(self.gun2, "models/vehicles/spiderbot_barrels.dpm");
-    setmodel(self.vehicle_hudmodel, "models/vehicles/spiderbot_cockpit.dpm");
-    setmodel(self.vehicle_viewport, "null");
-
-    setattachment(self.tur_head, self, "tag_head");
-    setattachment(self.vehicle_hudmodel, self.tur_head, "tag_hud");
-    setattachment(self.vehicle_viewport, self.vehicle_hudmodel, "");
 
     setattachment(self.gun1, self.tur_head, "tag_hardpoint01");
     setattachment(self.gun2, self.tur_head, "tag_hardpoint02");
 
-    self.tur_head.owner = self;
-    self.customizeentityforclient          = spiderbot_customizeentityforclient;
-
-    self.tur_aimpos = self.origin;
-
-    spiderbot_spawn();
-
-    self.vehicle_die = spiderbot_die;
-    self.vehicle_exit = spiderbot_exit;
+    self.gravity            = 2;
+    self.mass               = 5000;
 }
 
 void spawnfunc_vehicle_spiderbot()
 {
+    self.vehicle_flags |= VHF_DMGSHAKE;
+    //self.vehicle_flags |= VHF_DMGROLL;
+    //self.vehicle_flags |= VHF_DMGHEADROLL;
+    
     precache_model ( "models/vhshield.md3");
     precache_model ( "models/vehicles/spiderbot.dpm");
     precache_model ( "models/vehicles/spiderbot_top.dpm");
@@ -757,9 +645,27 @@ void spawnfunc_vehicle_spiderbot()
     precache_model ( "models/vehicles/spiderbot_cockpit.dpm");
     precache_model ( "models/uziflash.md3");
 
-    precache_sound ( "weapons/rocket_impact.wav" );
-
-    //self.team                = -1;
-    self.think = vewhicle_spiderbot_dinit;
-    self.nextthink = time + 0.5;
+    precache_sound ( "weapons/uzi_fire.wav" );
+    precache_sound ( "weapons/rocket_impact.wav");
+    
+    precache_sound ( "vehicles/spiderbot_die.wav");
+    precache_sound ( "vehicles/spiderbot_idle.wav");
+    precache_sound ( "vehicles/spiderbot_jump.wav");
+    precache_sound ( "vehicles/spiderbot_strafe.wav");
+    precache_sound ( "vehicles/spiderbot_walk.wav");
+    precache_sound ( "vehicles/spiderbot_land.wav");
+
+    vehicles_configcheck("vehicle_spiderbot.cfg", autocvar_g_vehicle_spiderbot_health);
+    if(autocvar_g_vehicle_spiderbot_shield)
+        self.vehicle_flags |= VHF_HASSHIELD;
+
+    if(autocvar_g_vehicle_spiderbot_shield_regen)
+        self.vehicle_flags |= VHF_SHIELDREGEN;
+
+    if(autocvar_g_vehicle_spiderbot_health_regen)
+        self.vehicle_flags |= VHF_HEALTHREGEN;
+    
+    self.think = vewhicle_spiderbot_dinit;    
+    self.nextthink = time + (autocvar_g_vehicles_delayspawn ? autocvar_g_vehicle_spiderbot_respawntime + (random() * autocvar_g_vehicles_delayspawn_jitter) : 0.5);
 }
+#endif // SVQC
index 7cc2949f6d90413957bb270bd598b4264597bfc6..751023014c5ea9d4acf8f9503a6c73b8132a31c4 100644 (file)
-void vehicle_stdproc_enter()
+float autocvar_g_vehicles_crush_dmg;
+float autocvar_g_vehicles_crush_force;
+float autocvar_g_vehicles_delayspawn;
+float autocvar_g_vehicles_delayspawn_jitter;
+float autocvar_g_vehicles_allow_flagcarry;
+
+void vehicles_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force);
+void vehicles_return();
+void vehicles_enter();
+void vehicles_touch();
+void vehicles_reset_colors();
+void vehicles_clearrturn();
+void vehicles_setreturn();
+
+
+/** AuxiliaryXhair*
+    Send additional points of interest to be drawn, to vehicle owner
+**/
+float MAX_AXH = 4;
+.entity AuxiliaryXhair[MAX_AXH];
+
+float SendAuxiliaryXhair(entity to, float sf)
 {
+
+       WriteByte(MSG_ENTITY, ENT_CLIENT_AUXILIARYXHAIR);
+
+       WriteByte(MSG_ENTITY, self.cnt);
+
+       WriteCoord(MSG_ENTITY, self.origin_x);
+       WriteCoord(MSG_ENTITY, self.origin_y);
+       WriteCoord(MSG_ENTITY, self.origin_z);
+
+    WriteByte(MSG_ENTITY, rint(self.colormod_x * 255));
+    WriteByte(MSG_ENTITY, rint(self.colormod_y * 255));
+    WriteByte(MSG_ENTITY, rint(self.colormod_z * 255));
+
+    return TRUE;
 }
 
-void vehicle_stdproc_exit(float eject)
+void UpdateAuxiliaryXhair(entity own, vector loc, vector clr, float axh_id)
 {
+    entity axh;
+
+    axh_id = bound(0, axh_id, MAX_AXH);
+    axh = own.AuxiliaryXhair[axh_id];
+
+    if(axh == world || wasfreed(axh))  // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?)
+    {
+        axh                     = spawn();
+        axh.cnt                 = axh_id;
+        axh.drawonlytoclient    = own;
+        axh.owner               = own;
+        Net_LinkEntity(axh, FALSE, 0, SendAuxiliaryXhair);
+    }
+
+    setorigin(axh, loc);
+    axh.colormod            = clr;
+    axh.SendFlags           = 0x01;
+    own.AuxiliaryXhair[axh_id] = axh;
 }
 
-void vehicle_stdproc_shiledregen(float rmax, float dt)
+/*
+// SVC_TEMPENTITY based, horrible with even 50 ping. hm.
+// WriteByte(MSG_ONE, SVC_TEMPENTITY) uses reliable messagess, never use for thinsg that need continous updates.
+void SendAuxiliaryXhair2(entity own, vector loc, vector clr, float axh_id)
 {
-    if(self.vehicle_shield < rmax)
-    if(self.dmg_time + CCVAR("_shield_regen_dmgpause") < time)
+       msg_entity = own;
+
+       WriteByte(MSG_ONE, SVC_TEMPENTITY);
+       WriteByte(MSG_ONE, TE_CSQC_AUXILIARYXHAIR);
+
+       WriteByte(MSG_ONE, axh_id);
+
+       WriteCoord(MSG_ONE, loc_x);
+       WriteCoord(MSG_ONE, loc_y);
+       WriteCoord(MSG_ONE, loc_z);
+
+    WriteByte(MSG_ONE, rint(clr_x * 255));
+    WriteByte(MSG_ONE, rint(clr_y * 255));
+    WriteByte(MSG_ONE, rint(clr_z * 255));
+
+}
+*/
+// End AuxiliaryXhair
+
+/**
+    Notifies the client that he enterd a vehicle, and sends 
+    realavent data.
+    
+    only sends vehicle_id atm (wich is a HUD_* constant, ex. HUD_SPIDERBOT)
+**/
+void CSQCVehicleSetup(entity own, float vehicle_id)
+{
+       msg_entity = own;
+
+       WriteByte(MSG_ONE, SVC_TEMPENTITY);
+       WriteByte(MSG_ONE, TE_CSQC_VEHICLESETUP);
+       WriteByte(MSG_ONE, vehicle_id);
+}
+
+/** vehicles_locktarget
+
+    Generic target locking.
+
+    Figure out if what target is "locked" (if any), for missile tracking as such.
+
+    after calling, "if(self.lock_target != world && self.lock_strength == 1)" mean
+    you have a locked in target.
+
+    Exspects a crosshair_trace() or equivalent to be
+    dont before calling.
+
+**/
+.entity lock_target;
+.float  lock_strength;
+.float  lock_time;
+.float  lock_soundtime;
+void vehicles_locktarget(float incr, float decr, float _lock_time)
+{
+    if(self.lock_target && self.lock_target.deadflag != DEAD_NO)
     {
-        self.vehicle_shield = min(self.vehicle_shield + CCVAR("_shield_regen") * dt, rmax);
+        self.lock_target    = world;
+        self.lock_strength  = 0;
+        self.lock_time      = 0;
+    }
 
-        if(self.owner)
-            self.owner.vehicle_shield = self.vehicle_shield / rmax;
+    if(self.lock_time > time)
+    {
+        if(self.lock_target)
+        if(self.lock_soundtime < time)
+        {
+            self.lock_soundtime = time + 0.5;
+            play2(self.owner, "vehicles/locked.wav");
+        }
+        
+        return;
+    }
+
+    if(trace_ent != world)
+    {
+        if(teamplay && trace_ent.team == self.team)
+            trace_ent = world;
+
+        if(trace_ent.deadflag != DEAD_NO)
+            trace_ent = world;
+
+        if not (trace_ent.vehicle_flags & VHF_ISVEHICLE || trace_ent.turrcaps_flags & TFL_TURRCAPS_ISTURRET)
+            trace_ent = world;
     }
+
+    if(self.lock_target == world && trace_ent != world)
+        self.lock_target = trace_ent;
+    
+    if(self.lock_target && trace_ent == self.lock_target) 
+    {            
+        if(self.lock_strength != 1 && self.lock_strength + incr >= 1)
+        {
+            play2(self.owner, "vehicles/lock.wav");
+            self.lock_soundtime = time + 0.8;
+        }        
+        else if (self.lock_strength != 1 && self.lock_soundtime < time)
+        {            
+            play2(self.owner, "vehicles/locking.wav");
+            self.lock_soundtime = time + 0.3;
+        }
+        
+    }    
+        
+    // Have a locking target
+    // Trace hit current target
+    if(trace_ent == self.lock_target && trace_ent != world)
+    {
+        self.lock_strength = min(self.lock_strength + incr, 1);
+        if(self.lock_strength == 1)
+            self.lock_time = time + _lock_time;
+    }
+    else
+    {
+        if(trace_ent)
+            self.lock_strength = max(self.lock_strength - decr * 2, 0);
+        else
+            self.lock_strength = max(self.lock_strength - decr, 0);
+
+        if(self.lock_strength == 0)
+            self.lock_target = world;
+    }
+}
+
+#define VEHICLE_UPDATE_PLAYER(fld,vhname) \
+self.owner.vehicle_##fld = (self.vehicle_##fld / autocvar_g_vehicle_##vhname##_##fld) * 100
+
+#define vehicles_sweap_collision(orig,vel,dt,acm,mult) \
+traceline(orig, orig + vel * dt, MOVE_NORMAL, self); \
+if(trace_fraction != 1) \
+    acm += normalize(self.origin - trace_endpos) * (vlen(vel) * mult)
+
+// Hover movement support
+float  force_fromtag_power;
+float  force_fromtag_normpower;
+vector force_fromtag_origin;
+vector vehicles_force_fromtag_hover(string tag_name, float spring_length, float max_power)
+{
+    force_fromtag_origin = gettaginfo(self, gettagindex(self, tag_name));
+    v_forward  = normalize(v_forward) * -1;
+    traceline(force_fromtag_origin, force_fromtag_origin - (v_forward  * spring_length), MOVE_NORMAL, self);
+
+    force_fromtag_power = (1 - trace_fraction) * max_power;
+    force_fromtag_normpower = force_fromtag_power / max_power;
+
+    return v_forward  * force_fromtag_power;
 }
 
-void vehicle_stdproc_healthregen(float rmax, float dt)
+// Experimental hovermode wich uses attraction/repulstion from surface insted of gravity/repulsion
+// Can possibly be use to move abt any surface (inclusing walls/celings)
+vector vehicles_force_fromtag_maglev(string tag_name, float spring_length, float max_power)
 {
 
-    if(self.dmg_time + CCVAR("_health_regen_dmgpause") < time)
-    if(self.vehicle_health < rmax)
+    force_fromtag_origin = gettaginfo(self, gettagindex(self, tag_name));
+    v_forward  = normalize(v_forward) * -1;
+    traceline(force_fromtag_origin, force_fromtag_origin - (v_forward  * spring_length), MOVE_NORMAL, self);
+
+    // TODO - this may NOT be compatible with wall/celing movement, unhardcode 0.25 (engine count multiplier)
+    if(trace_fraction == 1.0)
     {
-        self.vehicle_health = min(self.vehicle_health + CCVAR("_health_regen") * dt, rmax);
+        force_fromtag_normpower = -0.25;
+        return '0 0 -200';
+    }
 
-        if(self.owner)
-            self.owner.vehicle_health = self.vehicle_health / rmax;
+    force_fromtag_power = ((1 - trace_fraction) - trace_fraction) * max_power;
+    force_fromtag_normpower = force_fromtag_power / max_power;
+
+    return v_forward  * force_fromtag_power;
+}
+
+// Generic vehile projectile system
+void vehicles_projectile_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
+    // Ignore damage from oterh projectiles from my owner (dont mess up volly's)
+    if(inflictor.owner == self.owner)
+        return; 
+    
+    self.health -= damage;
+    self.velocity += force;
+    if(self.health < 1)
+    {
+        self.takedamage = DAMAGE_NO;
+        self.event_damage = SUB_Null;
+        self.think = self.use;
+        self.nextthink = time;
+    }
+
+}
+
+void vehicles_projectile_explode()
+{
+    if(self.owner && other != world)
+    {
+        if(other == self.owner.vehicle)
+            return;
+
+        if(other == self.owner.vehicle.tur_head)
+            return;
+    }
+
+       PROJECTILE_TOUCH;
+
+       self.event_damage = SUB_Null;
+    RadiusDamage (self, self.realowner, self.shot_dmg, 0, self.shot_radius, self, self.shot_force, self.totalfrags, other);
+
+    remove (self);
+}
+
+entity vehicles_projectile(string _mzlfx, string _mzlsound,
+                           vector _org, vector _vel,
+                           float _dmg, float _radi, float _force,  float _size,
+                           float _deahtype, float _projtype, float _health,
+                           float _cull, float _clianim)
+{
+    entity proj;
+
+    proj = spawn();
+
+    PROJECTILE_MAKETRIGGER(proj);
+    setorigin(proj, _org);
+
+    proj.shot_dmg         = _dmg;
+    proj.shot_radius      = _radi;
+    proj.shot_force       = _force;
+    proj.totalfrags       = _deahtype;
+    proj.solid            = SOLID_BBOX;
+    proj.movetype         = MOVETYPE_FLYMISSILE;
+    proj.flags            = FL_PROJECTILE;
+    proj.bot_dodge        = TRUE;
+    proj.bot_dodgerating  = _dmg;
+    proj.velocity         = _vel;
+    proj.touch            = vehicles_projectile_explode;
+    proj.use              = vehicles_projectile_explode;
+    proj.owner            = self;
+    proj.realowner        = self.owner;
+    proj.think            = SUB_Remove;
+    proj.nextthink        = time + 30;
+
+    if(_health)
+    {
+        proj.takedamage       = DAMAGE_AIM;
+        proj.event_damage     = vehicles_projectile_damage;
+        proj.health           = _health;
+    }
+    else
+        proj.flags           = FL_PROJECTILE | FL_NOTARGET;
+
+    if(_mzlsound)
+        sound (self, CHAN_WEAPON, _mzlsound, VOL_BASE, ATTN_NORM);
+
+    if(_mzlfx)
+        pointparticles(particleeffectnum(_mzlfx), proj.origin, proj.velocity, 1);
+
+
+    setsize (proj, '-1 -1 -1' * _size, '1 1 1' * _size);
+
+    CSQCProjectile(proj, _clianim, _projtype, _cull);
+
+    return proj;
+}
+// End generic vehile projectile system
+
+/** vehicles_spawn
+    Exetuted for all vehicles on (re)spawn.
+    Sets defaults for newly spawned units.
+**/
+void vehicles_spawn()
+{
+    dprint("Spawning vehicle: ", self.netname, "\n");
+
+    // De-own & reset
+    self.vehicle_hudmodel.viewmodelforclient = self;
+
+    self.owner              = world;
+    self.touch              = vehicles_touch;
+    self.event_damage       = vehicles_damage;
+    self.iscreature         = TRUE;
+    self.movetype           = MOVETYPE_WALK;
+    self.solid              = SOLID_SLIDEBOX;
+    self.takedamage         = DAMAGE_AIM;
+       self.deadflag           = DEAD_NO;
+    self.bot_attack         = TRUE;
+    self.flags              = FL_NOTARGET;
+    self.avelocity          = '0 0 0';
+    self.velocity           = '0 0 0';
+
+    // Reset locking
+    self.lock_strength      = 0;
+    self.lock_target        = world;
+    self.misc_bulletcounter = 0;
+
+    // Return to spawn
+    self.angles             = self.pos2;
+    setorigin(self, self.pos1 + '0 0 128');
+    // Show it
+    pointparticles(particleeffectnum("teleport"), self.origin + '0 0 64', '0 0 0', 1);
+
+    vehicles_reset_colors();
+    self.vehicle_spawn();
+}
+
+// Better way of determening whats crushable needed! (fl_crushable?)
+float vehicles_crushable(entity e)
+{
+    if(e.classname == "player")
+        return TRUE;
+
+    if(e.classname == "monster_zombie")
+        return TRUE;
+
+    return FALSE;
+}
+
+void vehicles_touch()
+{
+    // Vehicle currently in use
+    if(self.owner)
+    {
+        // Colided with world?
+        if(other == world)
+        {
+        }
+        else
+        {
+            if(other.vehicle_flags & VHF_ISVEHICLE)
+            {
+                //other.velocity += self.velocity * (self.mass / other.mass);
+            }
+            else if(vehicles_crushable(other))
+            {
+                if(vlen(self.velocity) != 0)
+                    Damage(other, self, self.owner, autocvar_g_vehicles_crush_dmg, DEATH_VHCRUSH, '0 0 0', normalize(other.origin - self.origin) * autocvar_g_vehicles_crush_force);
+            }
+        }
+        return;
+    }
+
+    if(other.classname != "player")
+        return;
+
+    if(other.deadflag != DEAD_NO)
+        return;
+
+    if(other.vehicle != world)
+        return;
+
+    // Remove this when bots know how to use vehicles.
+    if (clienttype(other) != CLIENTTYPE_REAL)
+        return;
+
+    vehicles_enter();
+}
+
+void vehicles_enter()
+{
+   // Remove this when bots know how to use vehicles
+    if (clienttype(other) != CLIENTTYPE_REAL)
+        return;
+
+    if(self.phase > time)
+        return;
+
+    if(teamplay)
+    if(self.team)
+    if(self.team != other.team)
+        return;
+
+    self.vehicle_ammo1   = 0;
+    self.vehicle_ammo2   = 0;
+    self.vehicle_reload1 = 0;
+    self.vehicle_reload2 = 0;
+    self.vehicle_energy  = 0;
+
+    self.owner          = other;
+    self.switchweapon   = other.switchweapon;
+
+    // .viewmodelforclient works better.
+    //self.vehicle_hudmodel.drawonlytoclient = self.owner;
+
+    self.vehicle_hudmodel.viewmodelforclient = self.owner;
+
+    self.event_damage         = vehicles_damage;
+    self.nextthink            = 0;
+    self.owner.angles         = self.angles;
+    self.owner.takedamage     = DAMAGE_NO;
+    self.owner.solid          = SOLID_NOT;
+    self.owner.movetype       = MOVETYPE_NOCLIP;
+    self.owner.alpha          = -1;
+    self.owner.vehicle        = self;
+    self.owner.event_damage   = SUB_Null;
+    self.owner.view_ofs       = '0 0 0';
+    self.colormap             = self.owner.colormap;
+    if(self.tur_head)
+        self.tur_head.colormap    = self.owner.colormap;
+
+    self.owner.hud            = self.hud;
+    self.owner.PlayerPhysplug = self.PlayerPhysplug;
+
+    self.owner.vehicle_ammo1    = self.vehicle_ammo1;
+    self.owner.vehicle_ammo2    = self.vehicle_ammo2;
+    self.owner.vehicle_reload1  = self.vehicle_reload1;
+    self.owner.vehicle_reload2  = self.vehicle_reload2;
+
+    // Cant do this, hides attached objects too.
+    //self.exteriormodeltoclient = self.owner;
+    //self.tur_head.exteriormodeltoclient = self.owner;
+
+    other.flags &~= FL_ONGROUND;
+    self.flags  &~= FL_ONGROUND;
+
+    self.team                 = self.owner.team;
+    self.flags               -= FL_NOTARGET;
+
+    msg_entity = other;
+    WriteByte (MSG_ONE, SVC_SETVIEWPORT);
+    WriteEntity(MSG_ONE, self.vehicle_viewport);
+
+    WriteByte (MSG_ONE, SVC_SETVIEWANGLES);
+    if(self.tur_head)
+    {
+        WriteAngle(MSG_ONE, self.tur_head.angles_x + self.angles_x); // tilt
+        WriteAngle(MSG_ONE, self.tur_head.angles_y + self.angles_y); // yaw
+        WriteAngle(MSG_ONE, 0);                                      // roll
+    }
+    else
+    {
+        WriteAngle(MSG_ONE,  self.angles_x * -1); // tilt
+        WriteAngle(MSG_ONE,  self.angles_y);      // yaw
+        WriteAngle(MSG_ONE,  0);                  // roll
+    }
+
+    vehicles_clearrturn();
+
+    CSQCVehicleSetup(self.owner, self.hud);
+    
+    if(other.flagcarried)
+    {
+        if(!autocvar_g_vehicles_allow_flagcarry)
+            DropFlag(other.flagcarried, world, world);
+        else
+        {            
+            other.flagcarried.scale = 1;
+            setattachment(other.flagcarried, self, ""); 
+            setorigin(other, '0 0 96');
+        }
+    }
+    
+    self.vehicle_enter();
+}
+
+/** vehicles_findgoodexit
+    Locates a valid location for the player to exit the vehicle.
+    Will first try prefer_spot, then up 100 random spots arround the vehicle
+    wich are in direct line of sight and empty enougth to hold a players bbox
+**/
+vector vehicles_findgoodexit(vector prefer_spot)
+{
+    //vector exitspot;
+    float mysize;
+    
+    tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, prefer_spot, MOVE_NORMAL, self.owner);
+    if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+        return prefer_spot;
+    
+    mysize = vlen(self.maxs - self.mins);
+    float i;
+    vector v, v2;
+    v2 = 0.5 * (self.absmin + self.absmax);
+    for(i = 0; i < 100; ++i)
+    {        
+        v = randomvec();
+        v_z = 0;
+        v = v2 + normalize(v) * mysize;
+        tracebox(v2, PL_MIN, PL_MAX, v, MOVE_NORMAL, self.owner);
+        if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+            return v;
+    }
+    
+    /*
+    exitspot = (self.origin + '0 0 48') + v_forward * mysize;
+    tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+    if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+        return exitspot;
+    
+    exitspot = (self.origin + '0 0 48') - v_forward * mysize;
+    tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+    if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+        return exitspot;
+
+    exitspot = (self.origin + '0 0 48') + v_right * mysize;
+    tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+    if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+        return exitspot;
+    
+    exitspot = (self.origin + '0 0 48') - v_right * mysize;
+    tracebox(self.origin + '0 0 32', PL_MIN, PL_MAX, exitspot, MOVE_NORMAL, self.owner);
+    if(trace_fraction == 1.0 && !trace_startsolid && !trace_allsolid)
+        return exitspot;
+    */
+    
+    return self.origin;
+}
+
+/** vehicles_exit
+    Standarrd vehicle release fucntion.
+    custom code goes in self.vehicle_exit
+**/
+void vehicles_exit(float eject)
+{      
+    entity oldself;
+    if(self.flags & FL_CLIENT)
+    {
+        oldself = self;
+        self = self.vehicle;
+    }
+    
+       self.flags |= FL_NOTARGET;
+
+    if (self.owner)
+    {
+        msg_entity = self.owner;
+        WriteByte (MSG_ONE, SVC_SETVIEWPORT);
+        WriteEntity( MSG_ONE, self.owner);
+
+        WriteByte (MSG_ONE, SVC_SETVIEWANGLES);
+        WriteAngle(MSG_ONE, 0);                 // pich
+        WriteAngle(MSG_ONE, self.angles_y);     // yaw
+        WriteAngle(MSG_ONE, 0);                 // roll
+
+        setsize(self.owner, PL_MIN,PL_MAX);
+
+        self.owner.takedamage     = DAMAGE_AIM;
+        self.owner.solid          = SOLID_SLIDEBOX;
+        self.owner.movetype       = MOVETYPE_WALK;
+        self.owner.effects        &~= EF_NODRAW;
+        self.owner.alpha          = 1;
+        self.owner.PlayerPhysplug = SUB_Null;
+        self.owner.vehicle        = world;
+        self.owner.view_ofs       = PL_VIEW_OFS;
+        self.owner.event_damage   = PlayerDamage;
+        self.owner.hud            = HUD_NORMAL;
+        self.owner.switchweapon   = self.switchweapon;
+        //self.owner.BUTTON_USE     = 0;
+    }
+
+    if(self.deadflag == DEAD_NO)
+        self.avelocity          = '0 0 0';
+
+    self.vehicle_hudmodel.viewmodelforclient = self;
+       self.tur_head.nodrawtoclient             = world;
+    vehicles_setreturn();
+
+    self.phase = time + 1;
+
+    if(!teamplay)
+        self.team = 0;
+
+    if(self.owner.flagcarried)
+    {
+        self.owner.flagcarried.scale = 0.6;
+        setattachment(self.owner.flagcarried, self.owner, ""); 
+        setorigin(self.owner.flagcarried, FLAG_CARRY_POS);
     }
+    
+    sound (self, CHAN_TRIGGER, "misc/null.wav", 1, ATTN_NORM);
+    self.vehicle_exit(eject);
+    self.owner = world;
+    
+    if(oldself)
+        self = oldself;
 }
 
-void vehicle_stdproc_energyregen(float rmax, float dt)
+
+void vehicles_regen(.float timer, .float regen_field, float field_max, float rpause, float regen, float delta_time)
 {
-    if(self.vehicle_energy < rmax)
+    if(self.regen_field < field_max)
+    if(self.timer + rpause < time)
     {
-        self.vehicle_energy = min(self.vehicle_energy + CCVAR("_energy_regen") * dt, rmax);
+        self.regen_field = min(self.regen_field + regen * delta_time, field_max);
 
         if(self.owner)
-            self.owner.vehicle_energy = self.vehicle_energy / rmax;
+            self.owner.regen_field = (self.regen_field / field_max) * 100;
     }
 }
 
 void shieldhit_think()
 {
-    self.alpha = self.alpha - 0.2;
+    self.alpha -= 0.1;
     if (self.alpha <= 0)
     {
-        setmodel(self,"");
+        //setmodel(self, "");
         self.alpha = -1;
     }
     else
@@ -56,65 +661,354 @@ void shieldhit_think()
     }
 }
 
-void vehicle_stdproc_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+void vehicles_painframe()
 {
+//.float       pain_finished;                  //Added by Supajoe
+    
+    if(self.owner.vehicle_health <= 50)
+    if(self.pain_frame < time)
+    {  
+        float _ftmp;  
+        _ftmp = self.owner.vehicle_health / 50;
+        self.pain_frame = time + 0.1 + (random() * 0.5 * _ftmp);
+        pointparticles(particleeffectnum("smoke_small"), (self.origin + (randomvec() * 80)), '0 0 0', 1);
+        
+        if(self.vehicle_flags & VHF_DMGSHAKE)
+            self.velocity += randomvec() * 30;
+        
+        if(self.vehicle_flags & VHF_DMGROLL)
+            if(self.vehicle_flags & VHF_DMGHEADROLL)
+                self.tur_head.angles += randomvec();
+            else
+                self.angles += randomvec();
+        
+    }    
+}
 
-    float ddmg_take;
-
+void vehicles_damage(entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
+{
     self.dmg_time = time;
 
     if((self.vehicle_flags & VHF_HASSHIELD) && (self.vehicle_shield > 0))
     {
-
-        
-        if (wasfreed(self.tur_head.enemy) || self.tur_head.enemy == world)
+        if (wasfreed(self.vehicle_shieldent) || self.vehicle_shieldent == world)
         {
-            self.tur_head.enemy = spawn();
-            self.tur_head.enemy.effects = EF_LOWPRECISION;
+            self.vehicle_shieldent = spawn();
+            self.vehicle_shieldent.effects = EF_LOWPRECISION;
+
+            setmodel(self.vehicle_shieldent, "models/vhshield.md3");
+            setattachment(self.vehicle_shieldent, self, "");
+            setorigin(self.vehicle_shieldent, real_origin(self) - self.origin);
+            self.vehicle_shieldent.scale       = 256 / vlen(self.maxs - self.mins);
+            self.vehicle_shieldent.think       = shieldhit_think;
         }
 
-        setmodel(self.tur_head.enemy, "models/vhshield.md3");
-        setattachment(self.tur_head.enemy, self, "");
 
-        self.tur_head.enemy.colormod = '1 1 1';
-        self.tur_head.enemy.alpha = 0.45;
-        self.tur_head.enemy.scale  = (256 / vlen(self.maxs - self.mins));
-        self.tur_head.enemy.angles = vectoangles(normalize(hitloc - self.origin)) - self.angles;
-        self.tur_head.enemy.think = shieldhit_think;
-        self.tur_head.enemy.nextthink = time;
+        self.vehicle_shieldent.colormod    = '1 1 1';
+        self.vehicle_shieldent.alpha       = 0.45;
+        self.vehicle_shieldent.angles      = vectoangles(normalize(hitloc - (self.origin + self.vehicle_shieldent.origin))) - self.angles;
+        self.vehicle_shieldent.nextthink   = time;
 
         self.vehicle_shield -= damage;
+
         if(self.vehicle_shield < 0)
         {
-            self.tur_head.enemy.colormod = '10 0 -1';
-            ddmg_take = fabs(self.vehicle_shield);
-            self.vehicle_shield = 0;
-            self.tur_head.enemy.alpha = 0.75;
-            self.vehicle_health -= ddmg_take;
+            self.vehicle_shieldent.colormod = '2 0 0';
+            self.vehicle_shield             = 0;
+            self.vehicle_shieldent.alpha    = 0.75;
+            self.vehicle_health            -= fabs(self.vehicle_shield);
         }
     }
     else
         self.vehicle_health -= damage;
 
-    if(self.owner)
-    {
-        self.owner.vehicle_health = self.vehicle_health / CCVAR("_health");
-
-        if(self.vehicle_flags & VHF_HASSHIELD)
-            self.owner.vehicle_shield = self.vehicle_shield / cvar(strcat(self.cvar_basename,"_shield"));
-
-    }
+    self.velocity += force; // * (vlen(force) / self.mass);
 
     if(self.vehicle_health <= 0)
     {
         if(self.owner)
             if(self.vehicle_flags & VHF_DEATHEJECT)
-                self.vehicle_exit(VHEF_EJECT);
+                vehicles_exit(VHEF_EJECT);
+            else
+                vehicles_exit(VHEF_RELESE);
 
         self.vehicle_die();
+        vehicles_setreturn();
+    }
+}
+
+void vehicles_clearrturn()
+{
+    entity ret;
+    // Remove "return helper", if any.
+    ret = findchain(classname, "vehicle_return");
+    while(ret)
+    {
+        if(ret.enemy == self)
+        {
+            ret.classname   = "";
+            ret.think       = SUB_Remove;
+            ret.nextthink   = time + 0.1;            
+            
+            if(ret.waypointsprite_attached)
+                WaypointSprite_Kill(ret.waypointsprite_attached);
+            
+            return;
+        }
+        ret = ret.chain;
+    }
+}
+
+void vehicles_return()
+{
+    pointparticles(particleeffectnum("teleport"), self.enemy.origin + '0 0 64', '0 0 0', 1);
+
+    self.enemy.think     = vehicles_spawn;
+    self.enemy.nextthink = time;
+
+    if(self.waypointsprite_attached)
+        WaypointSprite_Kill(self.waypointsprite_attached);
+            
+    remove(self);
+}
+
+void vehicles_showwp_goaway()
+{
+    if(self.waypointsprite_attached)
+        WaypointSprite_Kill(self.waypointsprite_attached);
+            
+    remove(self);
+    
+}
+
+void vehicles_showwp()
+{
+    entity oldself;
+    vector rgb;
+    
+    if(self.cnt)
+    {        
+        self.think      = vehicles_return;
+        self.nextthink  = self.cnt;
+    }    
+    else
+    {
+        self.think      = vehicles_return;
+        self.nextthink  = time +1;
+        
+        oldself = self;
+        self = spawn();
+        setmodel(self, "null");
+        self.team = oldself.enemy.team;
+        self.enemy = oldself.enemy;
+        setorigin(self, oldself.enemy.pos1);
+        
+        self.nextthink = time + 5;
+        self.think = vehicles_showwp_goaway;
+    }
+    
+    if(teamplay && self.team)
+           rgb = TeamColor(self.team);
+    else
+           rgb = '1 1 1';
+    WaypointSprite_Spawn("vehicle", 0, 0, self, '0 0 64', world, 0, self, waypointsprite_attached, TRUE, RADARICON_POWERUP, rgb);
+    if(self.waypointsprite_attached)
+    {        
+        WaypointSprite_UpdateRule(self.waypointsprite_attached, self.enemy.team, SPRITERULE_DEFAULT);        
+        if(oldself == world)
+            WaypointSprite_UpdateBuildFinished(self.waypointsprite_attached, self.nextthink);        
+        WaypointSprite_Ping(self.waypointsprite_attached);
+    }    
+    
+    if(oldself != world)
+        self = oldself;
+}
+
+void vehicles_setreturn()
+{
+    entity ret;
+    
+    vehicles_clearrturn();
+
+    ret = spawn();
+    ret.classname   = "vehicle_return";
+    ret.enemy       = self;    
+    ret.team        = self.team;
+    ret.think       = vehicles_showwp;        
+    
+    if(self.deadflag != DEAD_NO)
+    {
+        ret.cnt         = time + self.vehicle_respawntime;
+        ret.nextthink   = min(time + self.vehicle_respawntime, time + self.vehicle_respawntime - 5);        
+    }        
+    else
+    {
+        ret.nextthink   = min(time + self.vehicle_respawntime, time + self.vehicle_respawntime - 1);        
+    }
+        
+    
+    
+    setmodel(ret, "null");
+    setorigin(ret, self.pos1 + '0 0 96');
+       
+}
+
+void vehicles_configcheck(string  configname, float check_cvar)
+{
+    if(check_cvar == 0)
+        localcmd(strcat("exec ", configname, "\n"));
+}
+
+void vehicles_reset_colors()
+{
+    entity e;
+    float _effects, _colormap;
+    vector _glowmod, _colormod;
+
+    if(autocvar_g_nodepthtestplayers)
+        _effects = EF_NODEPTHTEST;
+
+    if(autocvar_g_fullbrightplayers)
+        _effects |= EF_FULLBRIGHT;
+
+    if(self.team)
+        _colormap = 1024 + (self.team - 1) * 17;
+    else
+        _colormap = 1024;
+
+    _glowmod  = '0 0 0';
+    _colormod = '0 0 0';
+
+    // Find all ents attacked to main model and setup effects, colormod etc.
+    e = findchainentity(tag_entity, self);
+    while(e)
+    {
+        if(e != self.vehicle_shieldent)
+        {
+            e.effects   = _effects; //  | EF_LOWPRECISION;
+            e.colormod  = _colormod;
+            e.colormap  = _colormap;
+            e.alpha     = 1;
+        }
+        e = e.chain;
+    }
+
+    self.vehicle_hudmodel.effects  = self.effects  = _effects; // | EF_LOWPRECISION;
+    self.vehicle_hudmodel.colormod = self.colormod = _colormod;
+    self.vehicle_hudmodel.colormap = self.colormap = _colormap;
+    self.vehicle_viewport.effects = (EF_ADDITIVE | EF_DOUBLESIDED | EF_FULLBRIGHT | EF_NODEPTHTEST | EF_NOGUNBOB | EF_NOSHADOW | EF_LOWPRECISION | EF_SELECTABLE | EF_TELEPORT_BIT);
+
+    self.alpha     = 1;
+    self.avelocity = '0 0 0';
+    self.velocity  = '0 0 0';
+    self.effects   = _effects;
+}
+
+float vehicle_initialize(string  net_name,
+                         string  bodymodel,
+                         string  topmodel,
+                         string  hudmodel,
+                         string  toptag,
+                         string  hudtag,
+                         string  viewtag,
+                         float   vhud,
+                         vector  min_s,
+                         vector  max_s,
+                         float   nodrop,
+                         void()  spawnproc,
+                         float   _respawntime,
+                         float() physproc,
+                         void()  enterproc,
+                         void(float extflag) exitfunc,
+                         void() dieproc,
+                         void() thinkproc,
+                         float  use_csqc)
+{
+    addstat(STAT_HUD, AS_INT,  hud);
+       addstat(STAT_VEHICLESTAT_HEALTH,  AS_INT, vehicle_health);
+       addstat(STAT_VEHICLESTAT_SHIELD,  AS_INT, vehicle_shield);
+       addstat(STAT_VEHICLESTAT_ENERGY,  AS_INT, vehicle_energy);
+
+       addstat(STAT_VEHICLESTAT_AMMO1,   AS_INT,   vehicle_ammo1);
+       addstat(STAT_VEHICLESTAT_RELOAD1, AS_INT, vehicle_reload1);
+
+       addstat(STAT_VEHICLESTAT_AMMO2,   AS_INT,   vehicle_ammo2);
+       addstat(STAT_VEHICLESTAT_RELOAD2, AS_INT, vehicle_reload2);
+
+    if(bodymodel == "")
+        error("vehicles: missing bodymodel!");
+
+    if(hudmodel == "")
+        error("vehicles: missing hudmodel!");
+
+    if(net_name == "")
+        self.netname = self.classname;
+    else
+        self.netname = net_name;
+
+    if(self.team && !teamplay)
+        self.team = 0;
+
+    self.vehicle_flags |= VHF_ISVEHICLE;
+    
+    setmodel(self, bodymodel);
+
+    self.vehicle_viewport   = spawn();
+    self.vehicle_hudmodel   = spawn();
+    self.tur_head           = spawn();
+    self.tur_head.owner     = self;
+    self.takedamage         = DAMAGE_AIM;
+    self.bot_attack         = TRUE;
+    self.iscreature         = TRUE;
+    self.hud                = vhud;
+
+    self.vehicle_die         = dieproc;
+    self.vehicle_exit        = exitfunc;
+    self.vehicle_enter       = enterproc;
+    self.PlayerPhysplug      = physproc;
+    self.event_damage        = vehicles_damage;
+    self.touch               = vehicles_touch;
+    self.think               = vehicles_spawn;    
+    self.nextthink           = time;        
+    self.vehicle_respawntime = _respawntime;
+    self.vehicle_spawn       = spawnproc;
+
+    if(autocvar_g_nodepthtestplayers)
+        self.effects = self.effects | EF_NODEPTHTEST;
+
+    if(autocvar_g_fullbrightplayers)
+        self.effects = self.effects | EF_FULLBRIGHT;
+
+    setmodel(self.vehicle_hudmodel, hudmodel);
+    setmodel(self.vehicle_viewport, "null");
+
+
+    if(topmodel != "")
+    {
+        setmodel(self.tur_head, topmodel);
+        setattachment(self.tur_head, self, toptag);
+        setattachment(self.vehicle_hudmodel, self.tur_head, hudtag);
+        setattachment(self.vehicle_viewport, self.vehicle_hudmodel, viewtag);
+    }
+    else
+    {
+        setattachment(self.tur_head, self, "");
+        setattachment(self.vehicle_hudmodel, self, hudtag);
+        setattachment(self.vehicle_viewport, self.vehicle_hudmodel, viewtag);
+    }
+
+    setsize(self, min_s, max_s);
+    if not (nodrop)
+    {
+        setorigin(self, self.origin);
+        tracebox(self.origin + '0 0 100', min_s, max_s, self.origin - '0 0 10000', MOVE_WORLDONLY, self);
+        setorigin(self, trace_endpos);
     }
 
+    self.pos1 = self.origin;
+    self.pos2 = self.angles;
 
+    return TRUE;
 }
 
 void bugmenot()
@@ -123,5 +1017,5 @@ void bugmenot()
     self.vehicle_enter      = self.vehicle_exit;
     self.vehicle_die        = self.vehicle_exit;
     self.vehicle_spawn      = self.vehicle_exit;
-    //self.vehicle_message    = self.vehicle_exit;
+    self.AuxiliaryXhair     = self.AuxiliaryXhair;
 }
index 8e452478e29ae2d344f1dd507efda99fc7d47322..79fc9cbf9a9ddd9c5d86213d550dab00bf48007d 100644 (file)
@@ -1,61 +1,8 @@
-//#define VEHICLES_ENABLED
 #ifdef VEHICLES_ENABLED
-
-#message "with tZork vehicles (experimental)"
-
-float SVC_SETVIEWPORT = 5;    // Net.Protocol 0x05
-float SVC_SETVIEWANGLES = 10; // Net.Protocol 0x0A
-float SVC_UPDATEENTITY = 128; // Net.Protocol 0x80
-
-#define CCVAR(part) cvar(strcat(self.cvar_basename,part))
-//.string cvar_basename;
-
-.float vehicle_flags;
-#define VHF_HASSHIELD   2
-#define VHF_SHIELDREGEN 4
-#define VHF_HEALTHREGEN 8
-#define VHF_DEATHEJECT  16
-#define VHF_ENERGYREGEN 32
-
-.float hud;
-
-.entity gun1;
-.entity gun2;
-
-.entity shield;
-
-.float vehicle_health;
-.float vehicle_shield;
-.float vehicle_energy;
-
-.float vehicle_ammo1;
-.float vehicle_reload1;
-
-.float vehicle_ammo2;
-.float vehicle_reload2;
-
-.entity vehicle;
-.entity vehicle_viewport;
-.entity vehicle_hudmodel;
-
-//.float anim_start;
-//.float anim_end;
-
-.float dmg_time;
-
-#define VHEF_NORMAL 0
-#define VHEF_EJECT 1
-
-var .void(float exit_flags) vehicle_exit;
-var .void() vehicle_enter;
-var .void() vehicle_die;
-var .void() vehicle_spawn;
-//var .float(float message) vehicle_message;
-
 #include "vehicles.qc"
 
-#include "spiderbot.qc"
 #include "racer.qc"
+#include "spiderbot.qc"
 #include "raptor.qc"
-
+//#include "bumblebee.qc"
 #endif
diff --git a/qcsrc/server/vehicles/vehicles_def.qh b/qcsrc/server/vehicles/vehicles_def.qh
new file mode 100644 (file)
index 0000000..dcb1854
--- /dev/null
@@ -0,0 +1,65 @@
+// #define VEHICLES_USE_ODE
+#define VEHICLES_ENABLED
+#ifdef VEHICLES_ENABLED
+
+//#message "with tZork vehicles (experimental)"
+
+.float vehicle_flags;
+float VHF_ISVEHICLE     = 2;    /// Indicates vehicle
+float VHF_HASSHIELD     = 4;    /// Vehicle has shileding
+float VHF_SHIELDREGEN   = 8;    /// Vehicles shield regenerates
+float VHF_HEALTHREGEN   = 16;   /// Vehicles health regenerates
+float VHF_ENERGYREGEN   = 32;   /// Vehicles energy regenerates
+float VHF_DEATHEJECT    = 64;   /// Vehicle ejects pilot upon fatal damage
+float VHF_MOVE_GROUND   = 128;  /// Vehicle moves on gound
+float VHF_MOVE_HOVER    = 256;  /// Vehicle hover close to gound
+float VHF_MOVE_FLY      = 512;  /// Vehicle is airborn
+float VHF_DMGSHAKE      = 1024;
+float VHF_DMGROLL       = 2048;
+float VHF_DMGHEADROLL   = 4096;
+
+.entity gun1;
+.entity gun2;
+
+.float vehicle_health;      /// If self is player this is 0..100 indicating precentage of health left on vehicle. If self is vehile, this is the real health value.
+.float vehicle_energy;      /// If self is player this is 0..100 indicating precentage of energy left on vehicle. If self is vehile, this is the real energy value.
+.float vehicle_shield;      /// If self is player this is 0..100 indicating precentage of shield left on vehicle. If self is vehile, this is the real shield value.
+.entity vehicle_shieldent;  /// Entity to disply the shild effect on damage
+
+.float vehicle_ammo1;   /// If self is player this field's use depends on the individual vehile. If self is vehile, this is the real ammo1 value.
+.float vehicle_reload1; /// If self is player this field's use depends on the individual vehile. If self is vehile, this is the real reload1 value.
+.float vehicle_ammo2;   /// If self is player this field's use depends on the individual vehile. If self is vehile, this is the real ammo2 value.
+.float vehicle_reload2; /// If self is player this field's use depends on the individual vehile. If self is vehile, this is the real reload2 value.
+
+.entity vehicle;
+.entity vehicle_viewport;
+.entity vehicle_hudmodel;
+
+.float sound_nexttime;
+#define VOL_VEHICLEENGINE 1
+
+.float hud;
+.float dmg_time;
+.float  vehicle_respawntime;
+.void() vehicle_spawn;
+
+void vehicles_exit(float eject);
+var .void(float exit_flags) vehicle_exit;
+float VHEF_NORMAL = 0;  /// User pressed exit key
+float VHEF_EJECT  = 1;  /// User pressed exit key 3 times fast (not implemented) or vehile is dying
+float VHEF_RELESE = 2;  /// Release ownership, client possibly allready dissconnected / went spec / changed team / used "kill" (not implemented)
+
+float SVC_SETVIEWPORT   = 5;   // Net.Protocol 0x05
+float SVC_SETVIEWANGLES = 10;  // Net.Protocol 0x0A
+float SVC_UPDATEENTITY  = 128; // Net.Protocol 0x80
+
+var .void() vehicle_enter;  /// Vehicles custom funciton to be executed when owner exit it
+var .void() vehicle_die;    /// Vehicles custom function to be executed when vehile die
+var .void() vehicle_spawn;  /// Vehicles custom fucntion to be efecuted when vehicle (re)spawns
+
+#ifdef VEHICLES_USE_ODE
+void(entity e, float physics_enabled) physics_enable = #540; // enable or disable physics on object
+void(entity e, vector force, vector force_pos) physics_addforce = #541; // apply a force from certain origin, length of force vector is power of force
+void(entity e, vector torque) physics_addtorque = #542; // add relative torque
+#endif  // VEHICLES_USE_ODE
+#endif  // VEHICLES_ENABLED
index 1efd6132d084e217b586015bf4910fb61446ebcc..3816594a97fda0a1ab824941f9947ecc3e6ee72a 100644 (file)
@@ -30,6 +30,7 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f
        local entity ent, endent;
        local float endq3surfaceflags;
        float totaldmg;
+       entity o;
 
        float length;
        vector beampos;
@@ -52,12 +53,18 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f
        // trace multiple times until we hit a wall, each obstacle will be made
        // non-solid so we can hit the next, while doing this we spawn effects and
        // note down which entities were hit so we can damage them later
+       o = self;
        while (1)
        {
                if(self.antilag_debug)
-                       WarpZone_traceline_antilag (self, start, end, FALSE, self, self.antilag_debug);
+                       WarpZone_traceline_antilag (self, start, end, FALSE, o, self.antilag_debug);
                else
-                       WarpZone_traceline_antilag (self, start, end, FALSE, self, ANTILAG_LATENCY(self));
+                       WarpZone_traceline_antilag (self, start, end, FALSE, o, ANTILAG_LATENCY(self));
+               if(o && WarpZone_trace_firstzone)
+               {
+                       o = world;
+                       continue;
+               }
 
                // if it is world we can't hurt it so stop now
                if (trace_ent == world || trace_fraction == 1)
@@ -127,7 +134,7 @@ void FireRailgunBullet (vector start, vector end, float bdamage, float bforce, f
                f = ExponentialFalloff(mindist, maxdist, halflifedist, ent.railgundistance);
                ffs = ExponentialFalloff(mindist, maxdist, forcehalflifedist, ent.railgundistance);
 
-               if(accuracy_isgooddamage(self.owner, ent))
+               if(accuracy_isgooddamage(self.realowner, ent))
                        totaldmg += bdamage * f;
 
                // apply the damage
@@ -178,8 +185,8 @@ void W_BallisticBullet_Hit (void)
                damage_headshotbonus = self.dmg_edge * f;
                railgun_start = self.origin - 2 * frametime * self.velocity;
                railgun_end = self.origin + 2 * frametime * self.velocity;
-               g = accuracy_isgooddamage(self.owner, other);
-               Damage(other, self, self.owner, self.dmg * f, self.projectiledeathtype, self.origin, self.dmg_force * normalize(self.velocity) * f);
+               g = accuracy_isgooddamage(self.realowner, other);
+               Damage(other, self, self.realowner, self.dmg * f, self.projectiledeathtype, self.origin, self.dmg_force * normalize(self.velocity) * f);
                damage_headshotbonus = 0;
 
                if(headshot)
@@ -187,9 +194,9 @@ void W_BallisticBullet_Hit (void)
                if(self.dmg_edge > 0)
                {
                        if(headshot)
-                               AnnounceTo(self.owner, "headshot");
+                               AnnounceTo(self.realowner, "headshot");
                        if(yoda)
-                               AnnounceTo(self.owner, "awesome");
+                               AnnounceTo(self.realowner, "awesome");
                }
 
                // calculate hits for ballistic weapons
@@ -198,7 +205,7 @@ void W_BallisticBullet_Hit (void)
                        // do not exceed 100%
                        q = min(self.dmg * q, self.dmg_total + f * self.dmg) - self.dmg_total;
                        self.dmg_total += f * self.dmg;
-                       accuracy_add(self.owner, self.owner.weapon, 0, q);
+                       accuracy_add(self.realowner, self.realowner.weapon, 0, q);
                }
        }
 
@@ -359,7 +366,7 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
        entity proj;
        proj = spawn();
        proj.classname = "bullet";
-       proj.owner = self;
+       proj.owner = proj.realowner = self;
        PROJECTILE_MAKETRIGGER(proj);
        if(gravityfactor > 0)
        {
@@ -431,7 +438,16 @@ void fireBallisticBullet(vector start, vector dir, float spread, float pSpeed, f
                        trace_fraction = 0;
                        fireBallisticBullet_trace_callback_ent = self;
                        fireBallisticBullet_trace_callback_eff = eff;
-                       WarpZone_TraceToss_ThroughZone(self, oldself, world, fireBallisticBullet_trace_callback);
+                       // FIXME can we somehow do this with just ONE trace?
+                       WarpZone_TraceToss(self, self.owner);
+                       if(self.owner && WarpZone_trace_firstzone)
+                       {
+                               self.owner = world;
+                               self.velocity = v0;
+                               self.gravity = g0;
+                               continue;
+                       }
+                       WarpZone_TraceToss_ThroughZone(self, self.owner, world, fireBallisticBullet_trace_callback);
                        self.velocity = v0;
                        self.gravity = g0;
 
@@ -517,11 +533,10 @@ void fireBullet (vector start, vector dir, float spread, float damage, float for
 
        if ((trace_fraction != 1.0) && (pointcontents (trace_endpos) != CONTENT_SKY))
        {
-               pointparticles(particleeffectnum("TE_KNIGHTSPIKE"),end,trace_plane_normal * 2500,1);
-               if (trace_ent.solid == SOLID_BSP && !(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT))
-                       Damage_DamageInfo(trace_endpos, damage, 0, 0, dir * max(1, force), dtype, self);
+               if not (trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
+                       Damage_DamageInfo(trace_endpos, damage, 0, 0, dir * max(1, force), dtype, self);                    
+
                Damage (trace_ent, self, self, damage, dtype, trace_endpos, dir * force);
-               //void(float effectnum, vector org, vector vel, float howmany) pointparticles = #337; // same as in CSQC
        }
        trace_endpos = end;
 }
index 711c44c8bf363a39bd8672e5c9908c6b2993f9db..bf81e8c1e368ee1eda8630c604ca092ec42b0783 100644 (file)
@@ -16,7 +16,7 @@ void W_Plasma_TriggerCombo(vector org, float rad, entity own)
                if (e.classname == "plasma")
                {
                        // change owner to whoever caused the combo explosion
-                       e.owner = own;
+                       e.realowner = own;
                        e.takedamage = DAMAGE_NO;
                        e.classname = "plasma_chain";
                        e.think = W_Plasma_Explode_Combo;
@@ -30,21 +30,21 @@ void W_Plasma_Explode (void)
 {
        if(other.takedamage == DAMAGE_AIM)
                if(other.classname == "player")
-                       if(IsDifferentTeam(self.owner, other))
+                       if(IsDifferentTeam(self.realowner, other))
                                if(other.deadflag == DEAD_NO)
                                        if(IsFlying(other))
-                                               AnnounceTo(self.owner, "electrobitch");
+                                               AnnounceTo(self.realowner, "electrobitch");
 
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
        if (self.movetype == MOVETYPE_BOUNCE)
        {
-               RadiusDamage (self, self.owner, autocvar_g_balance_electro_secondary_damage, autocvar_g_balance_electro_secondary_edgedamage, autocvar_g_balance_electro_secondary_radius, world, autocvar_g_balance_electro_secondary_force, self.projectiledeathtype, other);
+               RadiusDamage (self, self.realowner, autocvar_g_balance_electro_secondary_damage, autocvar_g_balance_electro_secondary_edgedamage, autocvar_g_balance_electro_secondary_radius, world, autocvar_g_balance_electro_secondary_force, self.projectiledeathtype, other);
        }
        else
        {
-               W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_primary_comboradius, self.owner);
-               RadiusDamage (self, self.owner, autocvar_g_balance_electro_primary_damage, autocvar_g_balance_electro_primary_edgedamage, autocvar_g_balance_electro_primary_radius, world, autocvar_g_balance_electro_primary_force, self.projectiledeathtype, other);
+               W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_primary_comboradius, self.realowner);
+               RadiusDamage (self, self.realowner, autocvar_g_balance_electro_primary_damage, autocvar_g_balance_electro_primary_edgedamage, autocvar_g_balance_electro_primary_radius, world, autocvar_g_balance_electro_primary_force, self.projectiledeathtype, other);
        }
 
        remove (self);
@@ -52,10 +52,10 @@ void W_Plasma_Explode (void)
 
 void W_Plasma_Explode_Combo (void)
 {
-       W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_combo_comboradius, self.owner);
+       W_Plasma_TriggerCombo(self.origin, autocvar_g_balance_electro_combo_comboradius, self.realowner);
 
        self.event_damage = SUB_Null;
-       RadiusDamage (self, self.owner, autocvar_g_balance_electro_combo_damage, autocvar_g_balance_electro_combo_edgedamage, autocvar_g_balance_electro_combo_radius, world, autocvar_g_balance_electro_combo_force, WEP_ELECTRO | HITTYPE_BOUNCE, world); // use THIS type for a combo because primary can't bounce
+       RadiusDamage (self, self.realowner, autocvar_g_balance_electro_combo_damage, autocvar_g_balance_electro_combo_edgedamage, autocvar_g_balance_electro_combo_radius, world, autocvar_g_balance_electro_combo_force, WEP_ELECTRO | HITTYPE_BOUNCE, world); // use THIS type for a combo because primary can't bounce
        remove (self);
 }
 
@@ -92,7 +92,7 @@ void W_Plasma_Damage (entity inflictor, entity attacker, float damage, float dea
                if (inflictor.classname == "plasma_chain" || inflictor.classname == "plasma_prim")
                {
                        // change owner to whoever caused the combo explosion
-                       self.owner = inflictor.owner;
+                       self.realowner = inflictor.realowner;
                        self.classname = "plasma_chain";
                        self.think = W_Plasma_Explode_Combo;
                        self.nextthink = time + min(autocvar_g_balance_electro_combo_radius, vlen(self.origin - inflictor.origin)) / autocvar_g_balance_electro_combo_speed; // delay combo chains, looks cooler
@@ -118,7 +118,7 @@ void W_Electro_Attack()
 
        proj = spawn ();
        proj.classname = "plasma_prim";
-       proj.owner = self;
+       proj.owner = proj.realowner = self;
        proj.bot_dodge = TRUE;
        proj.bot_dodgerating = autocvar_g_balance_electro_primary_damage;
        proj.use = W_Plasma_Explode;
@@ -157,7 +157,7 @@ void W_Electro_Attack2()
 
        proj = spawn ();
        proj.classname = "plasma";
-       proj.owner = self;
+       proj.owner = proj.realowner = self;
        proj.use = W_Plasma_Explode;
        proj.think = adaptor_think2use_hittype_splash;
        proj.bot_dodge = TRUE;
@@ -200,12 +200,12 @@ float lgbeam_send(entity to, float sf)
 {
        WriteByte(MSG_ENTITY, ENT_CLIENT_LGBEAM);
        sf = sf & 0x7F;
-       if(sound_allowed(MSG_BROADCAST, self.owner))
+       if(sound_allowed(MSG_BROADCAST, self.realowner))
                sf |= 0x80;
        WriteByte(MSG_ENTITY, sf);
        if(sf & 1)
        {
-               WriteByte(MSG_ENTITY, num_for_edict(self.owner));
+               WriteByte(MSG_ENTITY, num_for_edict(self.realowner));
                WriteCoord(MSG_ENTITY, autocvar_g_balance_electro_primary_range);
        }
        if(sf & 2)
@@ -226,18 +226,19 @@ float lgbeam_send(entity to, float sf)
 .float prevlgfire;
 float lgbeam_checkammo()
 {
-       if(self.owner.items & IT_UNLIMITED_WEAPON_AMMO)
+       if(self.realowner.items & IT_UNLIMITED_WEAPON_AMMO)
                return TRUE;
        else if(autocvar_g_balance_electro_reload_ammo)
-               return self.owner.clip_load > 0;
+               return self.realowner.clip_load > 0;
        else
-               return self.owner.ammo_cells > 0;
+               return self.realowner.ammo_cells > 0;
 }
 
+entity lgbeam_owner_ent;
 void lgbeam_think()
 {
        entity owner_player;
-       owner_player = self.owner;
+       owner_player = self.realowner;
 
        owner_player.prevlgfire = time;
        if (self != owner_player.lgbeam)
@@ -281,7 +282,12 @@ void lgbeam_think()
        }
 
        W_SetupShot_Range(owner_player, TRUE, 0, "", 0, autocvar_g_balance_electro_primary_damage * dt, autocvar_g_balance_electro_primary_range);
-       WarpZone_traceline_antilag(owner_player, w_shotorg, w_shotend, MOVE_NORMAL, owner_player, ANTILAG_LATENCY(owner_player));
+       if(!lgbeam_owner_ent)
+       {
+               lgbeam_owner_ent = spawn();
+               lgbeam_owner_ent.classname = "lgbeam_owner_ent";
+       }
+       WarpZone_traceline_antilag(lgbeam_owner_ent, w_shotorg, w_shotend, MOVE_NORMAL, lgbeam_owner_ent, ANTILAG_LATENCY(owner_player));
 
        // apply the damage
        if(trace_ent)
@@ -323,7 +329,7 @@ void W_Electro_Attack3 (void)
        beam.classname = "lgbeam";
        beam.solid = SOLID_NOT;
        beam.think = lgbeam_think;
-       beam.owner = self;
+       beam.owner = beam.realowner = self;
        beam.movetype = MOVETYPE_NONE;
        beam.shot_spread = 0;
        beam.bot_dodge = TRUE;
index 4408ccf88f202ec907dc5252f9bb4545a8a5fa35..2cf5981f31b1ac5e84358d802d46b600514c3a15 100644 (file)
@@ -18,7 +18,7 @@ void W_Fireball_Explode (void)
        self.takedamage = DAMAGE_NO;
 
        // 1. dist damage
-       d = (self.owner.health + self.owner.armorvalue);
+       d = (self.realowner.health + self.realowner.armorvalue);
        RadiusDamage (self, self.realowner, autocvar_g_balance_fireball_primary_damage, autocvar_g_balance_fireball_primary_edgedamage, autocvar_g_balance_fireball_primary_radius, world, autocvar_g_balance_fireball_primary_force, self.projectiledeathtype, other);
        if(self.realowner.health + self.realowner.armorvalue >= d)
        if(!self.cnt)
@@ -28,7 +28,7 @@ void W_Fireball_Explode (void)
                // 2. bfg effect
                // NOTE: this cannot be made warpzone aware by design. So, better intentionally ignore warpzones here.
                for(e = findradius(self.origin, autocvar_g_balance_fireball_primary_bfgradius); e; e = e.chain)
-               if(e != self.owner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.owner || IsDifferentTeam(e, self))
+               if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.realowner || IsDifferentTeam(e, self))
                {
                        // can we see fireball?
                        traceline(e.origin + e.view_ofs, self.origin, MOVE_NORMAL, e);
@@ -73,7 +73,7 @@ void W_Fireball_LaserPlay(float dt, float dist, float damage, float edgedamage,
 
        RandomSelection_Init();
        for(e = WarpZone_FindRadius(self.origin, dist, TRUE); e; e = e.chain)
-       if(e != self.owner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.owner || IsDifferentTeam(e, self))
+       if(e != self.realowner) if(e.takedamage == DAMAGE_AIM) if(e.classname != "player" || !self.realowner || IsDifferentTeam(e, self))
        {
                p = e.origin;
                p_x += e.mins_x + random() * (e.maxs_x - e.mins_x);
index 02ba362aee0ca7e28a96dcc7d7ff3169374a8b39..537f62a783162468aa8782f2a81b33a76dd3b7be 100644 (file)
@@ -9,10 +9,10 @@ void W_Grenade_Explode (void)
 {
        if(other.takedamage == DAMAGE_AIM)
                if(other.classname == "player")
-                       if(IsDifferentTeam(self.owner, other))
+                       if(IsDifferentTeam(self.realowner, other))
                                if(other.deadflag == DEAD_NO)
                                        if(IsFlying(other))
-                                               AnnounceTo(self.owner, "airshot");
+                                               AnnounceTo(self.realowner, "airshot");
 
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
@@ -20,7 +20,7 @@ void W_Grenade_Explode (void)
        if(self.movetype == MOVETYPE_NONE)
                self.velocity = self.oldvelocity;
 
-       RadiusDamage (self, self.owner, autocvar_g_balance_grenadelauncher_primary_damage, autocvar_g_balance_grenadelauncher_primary_edgedamage, autocvar_g_balance_grenadelauncher_primary_radius, world, autocvar_g_balance_grenadelauncher_primary_force, self.projectiledeathtype, other);
+       RadiusDamage (self, self.realowner, autocvar_g_balance_grenadelauncher_primary_damage, autocvar_g_balance_grenadelauncher_primary_edgedamage, autocvar_g_balance_grenadelauncher_primary_radius, world, autocvar_g_balance_grenadelauncher_primary_force, self.projectiledeathtype, other);
 
        remove (self);
 }
@@ -29,10 +29,10 @@ void W_Grenade_Explode2 (void)
 {
        if(other.takedamage == DAMAGE_AIM)
                if(other.classname == "player")
-                       if(IsDifferentTeam(self.owner, other))
+                       if(IsDifferentTeam(self.realowner, other))
                                if(other.deadflag == DEAD_NO)
                                        if(IsFlying(other))
-                                               AnnounceTo(self.owner, "airshot");
+                                               AnnounceTo(self.realowner, "airshot");
 
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
@@ -40,7 +40,7 @@ void W_Grenade_Explode2 (void)
        if(self.movetype == MOVETYPE_NONE)
                self.velocity = self.oldvelocity;
 
-       RadiusDamage (self, self.owner, autocvar_g_balance_grenadelauncher_secondary_damage, autocvar_g_balance_grenadelauncher_secondary_edgedamage, autocvar_g_balance_grenadelauncher_secondary_radius, world, autocvar_g_balance_grenadelauncher_secondary_force, self.projectiledeathtype, other);
+       RadiusDamage (self, self.realowner, autocvar_g_balance_grenadelauncher_secondary_damage, autocvar_g_balance_grenadelauncher_secondary_edgedamage, autocvar_g_balance_grenadelauncher_secondary_radius, world, autocvar_g_balance_grenadelauncher_secondary_force, self.projectiledeathtype, other);
 
        remove (self);
 }
@@ -170,7 +170,7 @@ void W_Grenade_Attack (void)
        pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        gren = spawn ();
-       gren.owner = self;
+       gren.owner = gren.realowner = self;
        gren.classname = "grenade";
        gren.bot_dodge = TRUE;
        gren.bot_dodgerating = autocvar_g_balance_grenadelauncher_primary_damage;
@@ -217,7 +217,7 @@ void W_Grenade_Attack2 (void)
        pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        gren = spawn ();
-       gren.owner = self;
+       gren.owner = gren.realowner = self;
        gren.classname = "grenade";
        gren.bot_dodge = TRUE;
        gren.bot_dodgerating = autocvar_g_balance_grenadelauncher_secondary_damage;
@@ -301,7 +301,7 @@ float w_glauncher(float req)
                        if (cvar("g_balance_grenadelauncher_secondary_remote_detonateprimary"))
                        {
                                nadefound = 0;
-                               for(nade = world; (nade = find(nade, classname, "grenade")); ) if(nade.owner == self)
+                               for(nade = world; (nade = find(nade, classname, "grenade")); ) if(nade.realowner == self)
                                {
                                        if(!nade.gl_detonate_later)
                                        {
index 7b474d6956f04f09ac86e80d45509a60f422b471..5dec80c8691388d203ef15e1a8b327d773937238 100644 (file)
@@ -10,9 +10,9 @@ void W_HLAC_Touch (void)
        self.event_damage = SUB_Null;
        
        if(self.projectiledeathtype & HITTYPE_SECONDARY)
-               RadiusDamage (self, self.owner, autocvar_g_balance_hlac_secondary_damage, autocvar_g_balance_hlac_secondary_edgedamage, autocvar_g_balance_hlac_secondary_radius, world, autocvar_g_balance_hlac_secondary_force, self.projectiledeathtype, other);
+               RadiusDamage (self, self.realowner, autocvar_g_balance_hlac_secondary_damage, autocvar_g_balance_hlac_secondary_edgedamage, autocvar_g_balance_hlac_secondary_radius, world, autocvar_g_balance_hlac_secondary_force, self.projectiledeathtype, other);
        else
-               RadiusDamage (self, self.owner, autocvar_g_balance_hlac_primary_damage, autocvar_g_balance_hlac_primary_edgedamage, autocvar_g_balance_hlac_primary_radius, world, autocvar_g_balance_hlac_primary_force, self.projectiledeathtype, other);
+               RadiusDamage (self, self.realowner, autocvar_g_balance_hlac_primary_damage, autocvar_g_balance_hlac_primary_edgedamage, autocvar_g_balance_hlac_primary_radius, world, autocvar_g_balance_hlac_primary_force, self.projectiledeathtype, other);
 
        remove (self);
 }
@@ -38,7 +38,7 @@ void W_HLAC_Attack (void)
        }
 
        missile = spawn ();
-       missile.owner = self;
+       missile.owner = missile.realowner = self;
        missile.classname = "hlacbolt";
        missile.bot_dodge = TRUE;
 
@@ -81,7 +81,7 @@ void W_HLAC_Attack2f (void)
        pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        missile = spawn ();
-       missile.owner = self;
+       missile.owner = missile.realowner = self;
        missile.classname = "hlacbolt";
        missile.bot_dodge = TRUE;
 
index 80c40b10fd8704cc94f46ec2640d30fafc1f834c..bce4aad8fa11da202542e8e11449e4dafe521334 100644 (file)
@@ -23,7 +23,7 @@ void W_Hook_ExplodeThink (void)
        f = self.dmg_last - dmg_remaining_next;
        self.dmg_last = dmg_remaining_next;
 
-       RadiusDamage (self, self.owner, self.dmg * f, self.dmg_edge * f, self.dmg_radius, self.owner, self.dmg_force * f, self.projectiledeathtype, world);
+       RadiusDamage (self, self.realowner, self.dmg * f, self.dmg_edge * f, self.dmg_radius, self.realowner, self.dmg_force * f, self.projectiledeathtype, world);
        self.projectiledeathtype |= HITTYPE_BOUNCE;
        //RadiusDamage (self, world, self.dmg * f, self.dmg_edge * f, self.dmg_radius, world, self.dmg_force * f, self.projectiledeathtype, world);
 
@@ -66,7 +66,7 @@ void W_Hook_Attack2()
        W_SetupShot (self, FALSE, 4, "weapons/hookbomb_fire.wav", CHAN_WEAPON, autocvar_g_balance_hook_secondary_damage);
 
        gren = spawn ();
-       gren.owner = self;
+       gren.owner = gren.realowner = self;
        gren.classname = "hookbomb";
        gren.bot_dodge = TRUE;
        gren.bot_dodgerating = autocvar_g_balance_hook_secondary_damage;
index a7e5c4df7d272f785e3dd2fc7d4e576eed97806e..47e79bcaabee8ba211071a692ec0c07ab03ba76e 100644 (file)
@@ -10,9 +10,9 @@ void W_Laser_Touch (void)
 
        self.event_damage = SUB_Null;
        if (self.dmg)
-               RadiusDamage (self, self.owner, autocvar_g_balance_laser_secondary_damage, autocvar_g_balance_laser_secondary_edgedamage, autocvar_g_balance_laser_secondary_radius, world, autocvar_g_balance_laser_secondary_force, self.projectiledeathtype, other);
+               RadiusDamage (self, self.realowner, autocvar_g_balance_laser_secondary_damage, autocvar_g_balance_laser_secondary_edgedamage, autocvar_g_balance_laser_secondary_radius, world, autocvar_g_balance_laser_secondary_force, self.projectiledeathtype, other);
        else
-               RadiusDamage (self, self.owner, autocvar_g_balance_laser_primary_damage, autocvar_g_balance_laser_primary_edgedamage, autocvar_g_balance_laser_primary_radius, world, autocvar_g_balance_laser_primary_force, self.projectiledeathtype, other);
+               RadiusDamage (self, self.realowner, autocvar_g_balance_laser_primary_damage, autocvar_g_balance_laser_primary_edgedamage, autocvar_g_balance_laser_primary_radius, world, autocvar_g_balance_laser_primary_force, self.projectiledeathtype, other);
 
        remove (self);
 }
@@ -52,7 +52,7 @@ void W_Laser_Attack (float issecondary)
        pointparticles(particleeffectnum("laser_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        missile = spawn ();
-       missile.owner = self;
+       missile.owner = missile.realowner = self;
        missile.classname = "laserbolt";
        missile.dmg = 0;
        if(!nodamage)
@@ -95,12 +95,12 @@ float gauntletbeam_send(entity to, float sf)
 {
        WriteByte(MSG_ENTITY, ENT_CLIENT_GAUNTLET);
        sf = sf & 0x7F;
-       if(sound_allowed(MSG_BROADCAST, self.owner))
+       if(sound_allowed(MSG_BROADCAST, self.realowner))
                sf |= 0x80;
        WriteByte(MSG_ENTITY, sf);
        if(sf & 1)
        {
-               WriteByte(MSG_ENTITY, num_for_edict(self.owner));
+               WriteByte(MSG_ENTITY, num_for_edict(self.realowner));
        }
        if(sf & 2)
        {
@@ -118,6 +118,7 @@ float gauntletbeam_send(entity to, float sf)
 }
 .entity gauntletbeam;
 .float prevgauntletfire;
+entity lgbeam_owner_ent;
 void gauntletbeam_think()
 {
        float damage, myforce, myradius;
@@ -125,8 +126,8 @@ void gauntletbeam_think()
        myforce = autocvar_g_balance_laser_secondary_force;
        myradius = autocvar_g_balance_laser_secondary_radius;
 
-       self.owner.prevgauntletfire = time;
-       if (self.owner.weaponentity.state != WS_INUSE || self != self.owner.gauntletbeam || self.owner.deadflag != DEAD_NO || !self.owner.BUTTON_ATCK2)
+       self.realowner.prevgauntletfire = time;
+       if (self.realowner.weaponentity.state != WS_INUSE || self != self.realowner.gauntletbeam || self.realowner.deadflag != DEAD_NO || !self.realowner.BUTTON_ATCK2)
        {
                remove(self);
                return;
@@ -134,13 +135,18 @@ void gauntletbeam_think()
 
        self.nextthink = time;
 
-       makevectors(self.owner.v_angle);
+       makevectors(self.realowner.v_angle);
 
        float dt;
        dt = frametime;
 
-       W_SetupShot_Range(self.owner, TRUE, 0, "", 0, damage * dt, myradius);
-       WarpZone_traceline_antilag(self.owner, w_shotorg, w_shotend, MOVE_NORMAL, self.owner, ANTILAG_LATENCY(self.owner));
+       W_SetupShot_Range(self.realowner, TRUE, 0, "", 0, damage * dt, myradius);
+       if(!lgbeam_owner_ent)
+       {
+               lgbeam_owner_ent = spawn();
+               lgbeam_owner_ent.classname = "lgbeam_owner_ent";
+       }
+       WarpZone_traceline_antilag(lgbeam_owner_ent, w_shotorg, w_shotend, MOVE_NORMAL, lgbeam_owner_ent, ANTILAG_LATENCY(self.owner));
 
        // apply the damage
        if(trace_ent)
index ae8db2fedae929cb6a200302978eb9d285fb2cd0..5362f1758640c390fec719da016ae65bbf88664b 100644 (file)
@@ -11,7 +11,7 @@ void spawnfunc_weapon_minelayer (void)
        weapon_defaultspawnfunc(WEP_MINE_LAYER);
 }
 
-void W_Mine_Stick ()
+void W_Mine_Stick (entity to)
 {
        spamsound (self, CHAN_PROJECTILE, "weapons/mine_stick.wav", VOL_BASE, ATTN_NORM);
 
@@ -25,6 +25,7 @@ void W_Mine_Stick ()
        newmine.bot_dodgerating = self.bot_dodgerating;
 
        newmine.owner = self.owner;
+       newmine.realowner = self.realowner;
        setsize(newmine, '-4 -4 -4', '4 4 4');
        setorigin(newmine, self.origin);
        setmodel(newmine, "models/mine.md3");
@@ -51,27 +52,30 @@ void W_Mine_Stick ()
 
        remove(self);
        self = newmine;
+
+       if(to)
+               SetMovetypeFollow(self, to);
 }
 
 void W_Mine_Explode ()
 {
        if(other.takedamage == DAMAGE_AIM)
                if(other.classname == "player")
-                       if(IsDifferentTeam(self.owner, other))
+                       if(IsDifferentTeam(self.realowner, other))
                                if(other.deadflag == DEAD_NO)
                                        if(IsFlying(other))
-                                               AnnounceTo(self.owner, "airshot");
+                                               AnnounceTo(self.realowner, "airshot");
 
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
 
-       RadiusDamage (self, self.owner, autocvar_g_balance_minelayer_damage, autocvar_g_balance_minelayer_edgedamage, autocvar_g_balance_minelayer_radius, world, autocvar_g_balance_minelayer_force, self.projectiledeathtype, other);
+       RadiusDamage (self, self.realowner, autocvar_g_balance_minelayer_damage, autocvar_g_balance_minelayer_edgedamage, autocvar_g_balance_minelayer_radius, world, autocvar_g_balance_minelayer_force, self.projectiledeathtype, other);
 
-       if (self.owner.weapon == WEP_MINE_LAYER)
+       if (self.realowner.weapon == WEP_MINE_LAYER)
        {
                entity oldself;
                oldself = self;
-               self = self.owner;
+               self = self.realowner;
                if (!weapon_action(WEP_MINE_LAYER, WR_CHECKAMMO1))
                {
                        self.cnt = WEP_MINE_LAYER;
@@ -80,7 +84,7 @@ void W_Mine_Explode ()
                }
                self = oldself;
        }
-       self.owner.minelayer_mines -= 1;
+       self.realowner.minelayer_mines -= 1;
        remove (self);
 }
 
@@ -89,16 +93,16 @@ void W_Mine_DoRemoteExplode ()
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
 
-       if(self.movetype == MOVETYPE_NONE)
+       if(self.movetype == MOVETYPE_NONE || self.movetype == MOVETYPE_FOLLOW)
                self.velocity = self.oldvelocity;
 
-       RadiusDamage (self, self.owner, autocvar_g_balance_minelayer_remote_damage, autocvar_g_balance_minelayer_remote_edgedamage, autocvar_g_balance_minelayer_remote_radius, world, autocvar_g_balance_minelayer_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
+       RadiusDamage (self, self.realowner, autocvar_g_balance_minelayer_remote_damage, autocvar_g_balance_minelayer_remote_edgedamage, autocvar_g_balance_minelayer_remote_radius, world, autocvar_g_balance_minelayer_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
 
-       if (self.owner.weapon == WEP_MINE_LAYER)
+       if (self.realowner.weapon == WEP_MINE_LAYER)
        {
                entity oldself;
                oldself = self;
-               self = self.owner;
+               self = self.realowner;
                if (!weapon_action(WEP_MINE_LAYER, WR_CHECKAMMO1))
                {
                        self.cnt = WEP_MINE_LAYER;
@@ -107,16 +111,16 @@ void W_Mine_DoRemoteExplode ()
                }
                self = oldself;
        }
-       self.owner.minelayer_mines -= 1;
+       self.realowner.minelayer_mines -= 1;
        remove (self);
 }
 
 void W_Mine_RemoteExplode ()
 {
-       if(self.owner.deadflag == DEAD_NO)
+       if(self.realowner.deadflag == DEAD_NO)
                if((self.spawnshieldtime >= 0)
                        ? (time >= self.spawnshieldtime) // timer
-                       : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > autocvar_g_balance_minelayer_remote_radius) // safety device
+                       : (vlen(NearestPointOnBox(self.realowner, self.origin) - self.origin) > autocvar_g_balance_minelayer_remote_radius) // safety device
                )
                {
                        W_Mine_DoRemoteExplode();
@@ -132,7 +136,7 @@ void W_Mine_ProximityExplode ()
                head = findradius(self.origin, autocvar_g_balance_minelayer_radius);
                while(head)
                {
-                       if(head == self.owner || !IsDifferentTeam(head, self.owner))
+                       if(head == self.realowner || !IsDifferentTeam(head, self.realowner))
                                return;
                        head = head.chain;
                }
@@ -146,7 +150,7 @@ float W_Mine_Count(entity e)
 {
        float minecount;
        entity mine;
-       for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == e)
+       for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.realowner == e)
                minecount += 1;
                
        return minecount;
@@ -157,6 +161,15 @@ void W_Mine_Think (void)
        entity head;
 
        self.nextthink = time;
+
+       if(self.movetype == MOVETYPE_FOLLOW)
+       {
+               if(LostMovetypeFollow(self))
+               {
+                       UnsetMovetypeFollow(self);
+                       self.movetype = MOVETYPE_NONE;
+               }
+       }
        
        // our lifetime has expired, it's time to die - mine_time just allows us to play a sound for this
        // TODO: replace this mine_trigger.wav sound with a real countdown
@@ -170,7 +183,7 @@ void W_Mine_Think (void)
 
        // a player's mines shall explode if he disconnects or dies
        // TODO: Do this on team change too -- Samual: But isn't a player killed when they switch teams?
-       if(self.owner.classname != "player" || self.owner.deadflag != DEAD_NO)
+       if(self.realowner.classname != "player" || self.realowner.deadflag != DEAD_NO)
        {
                other = world;
                self.projectiledeathtype |= HITTYPE_BOUNCE;
@@ -183,7 +196,7 @@ void W_Mine_Think (void)
        while(head)
        {
                if(head.classname == "player" && head.deadflag == DEAD_NO)
-               if(head != self.owner && IsDifferentTeam(head, self.owner)) // don't trigger for team mates
+               if(head != self.realowner && IsDifferentTeam(head, self.realowner)) // don't trigger for team mates
                if(!self.mine_time)
                {
                        spamsound (self, CHAN_PROJECTILE, "weapons/mine_trigger.wav", VOL_BASE, ATTN_NORM);
@@ -200,19 +213,28 @@ void W_Mine_Think (void)
        }
 
        // remote detonation
-       if (self.owner.weapon == WEP_MINE_LAYER)
-       if (self.owner.deadflag == DEAD_NO)
+       if (self.realowner.weapon == WEP_MINE_LAYER)
+       if (self.realowner.deadflag == DEAD_NO)
        if (self.minelayer_detonate)
                W_Mine_RemoteExplode();
 }
 
 void W_Mine_Touch (void)
 {
+       if(self.movetype == MOVETYPE_NONE || self.movetype == MOVETYPE_FOLLOW)
+               return; // we're already a stuck mine, why do we get called? TODO does this even happen?
+
        PROJECTILE_TOUCH;
-       if(!other || (other.takedamage != DAMAGE_AIM && other.movetype == MOVETYPE_NONE))
-               W_Mine_Stick();
-       else if(self.movetype != MOVETYPE_NONE) // don't unstick a locked mine when someone touches it
-               self.velocity = '0 0 0';
+
+       if(other && other.classname == "player" && other.deadflag == DEAD_NO)
+       {
+               // hit a player
+               // don't stick
+       }
+       else
+       {
+               W_Mine_Stick(other);
+       }
 }
 
 void W_Mine_Damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
@@ -249,7 +271,7 @@ void W_Mine_Attack (void)
        pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        mine = WarpZone_RefSys_SpawnSameRefSys(self);
-       mine.owner = self;
+       mine.owner = mine.realowner = self;
        if(autocvar_g_balance_minelayer_detonatedelay >= 0)
                mine.spawnshieldtime = time + autocvar_g_balance_minelayer_detonatedelay;
        else
@@ -301,7 +323,7 @@ float W_PlacedMines(float detonate)
        entity mine;
        float minfound;
 
-       for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.owner == self)
+       for(mine = world; (mine = find(mine, classname, "mine")); ) if(mine.realowner == self)
        {
                if(detonate)
                {
@@ -343,7 +365,7 @@ float w_minelayer(float req)
                        mine = find(world, classname, "mine");
                        while (mine)
                        {
-                               if (mine.owner != self)
+                               if (mine.realowner != self)
                                {
                                        mine = find(mine, classname, "mine");
                                        continue;
@@ -374,7 +396,7 @@ float w_minelayer(float req)
                        mine = find(world, classname, "mine");
                        while (mine)
                        {
-                               if (mine.owner != self)
+                               if (mine.realowner != self)
                                {
                                        mine = find(mine, classname, "mine");
                                        continue;
index 7ea3fe851c9a0115db4cac50f2b9ffa1caf10000..bf83fed40d9116d34ef24f1f8d385c286b6a4539 100644 (file)
@@ -287,7 +287,7 @@ float w_minstanex(float req)
                precache_sound("weapons/neximpact.wav");
        }
        else if (req == WR_SUICIDEMESSAGE)
-               w_deathtypestring = _("%s did the impossible");
+               w_deathtypestring = _("%s is now thinking with portals");
        else if (req == WR_KILLMESSAGE)
                w_deathtypestring = _("%s has been vaporized by %s");
        return TRUE;
index 04a1151910bf0f290a7f91eee114aeb97a8a9fc8..fbe4388c692edc765f848dcd6648a671dfec3026 100644 (file)
@@ -250,7 +250,7 @@ float w_nex(float req)
                precache_sound("weapons/neximpact.wav");
        }
        else if (req == WR_SUICIDEMESSAGE)
-               w_deathtypestring = _("%s did the impossible");
+               w_deathtypestring = _("%s is now thinking with portals");
        else if (req == WR_KILLMESSAGE)
                w_deathtypestring = _("%s has been vaporized by %s");
        return TRUE;
index d6e92a53728203ff5f648e797e2304e00a652fc1..d4b61a87848c9c9265616f7334099940a7cd55ea 100644 (file)
@@ -9,42 +9,42 @@ REGISTER_WEAPON(PORTO, w_porto, 0, 0, WEP_TYPE_OTHER, 0, "porto" , "porto", _("P
 
 void W_Porto_Success (void)
 {
-       if(self.owner == world)
+       if(self.realowner == world)
        {
                objerror("Cannot succeed successfully: no owner\n");
                return;
        }
 
-       self.owner.porto_current = world;
+       self.realowner.porto_current = world;
        remove(self);
 }
 
 string W_ThrowNewWeapon(entity own, float wpn, float doreduce, vector org, vector velo);
 void W_Porto_Fail (float failhard)
 {
-       if(self.owner == world)
+       if(self.realowner == world)
        {
                objerror("Cannot fail successfully: no owner\n");
                return;
        }
 
        // no portals here!
-       Portal_ClearWithID(self.owner, self.portal_id);
-       self.owner.porto_current = world;
+       Portal_ClearWithID(self.realowner, self.portal_id);
+       self.realowner.porto_current = world;
 
-       if(!failhard && self.owner.playerid == self.playerid && self.owner.deadflag == DEAD_NO && !(self.owner.weapons & WEPBIT_PORTO))
+       if(!failhard && self.realowner.playerid == self.playerid && self.realowner.deadflag == DEAD_NO && !(self.realowner.weapons & WEPBIT_PORTO))
        {
                setsize (self, '-16 -16 0', '16 16 32');
                setorigin(self, self.origin + trace_plane_normal);
                if(move_out_of_solid(self))
                {
                        self.flags = FL_ITEM;
-                       self.velocity = trigger_push_calculatevelocity(self.origin, self.owner, 128);
+                       self.velocity = trigger_push_calculatevelocity(self.origin, self.realowner, 128);
                        tracetoss(self, self);
-                       if(vlen(trace_endpos - self.owner.origin) < 128)
+                       if(vlen(trace_endpos - self.realowner.origin) < 128)
                        {
-                               W_ThrowNewWeapon(self.owner, WEP_PORTO, 0, self.origin, self.velocity);
-                               centerprint(self.owner, "^1Portal deployment failed.\n\n^2Catch it to try again!");
+                               W_ThrowNewWeapon(self.realowner, WEP_PORTO, 0, self.origin, self.velocity);
+                               centerprint(self.realowner, "^1Portal deployment failed.\n\n^2Catch it to try again!");
                        }
                }
        }
@@ -66,7 +66,7 @@ void W_Porto_Remove (entity p)
 void W_Porto_Think (void)
 {
        trace_plane_normal = '0 0 0';
-       if(self.owner.playerid != self.playerid)
+       if(self.realowner.playerid != self.playerid)
                remove(self);
        else
                W_Porto_Fail(0);
@@ -93,7 +93,7 @@ void W_Porto_Touch (void)
                        return;
        }
 
-       if(self.owner.playerid != self.playerid)
+       if(self.realowner.playerid != self.playerid)
        {
                sound(self, CHAN_PROJECTILE, "porto/unsupported.wav", VOL_BASE, ATTN_NORM);
                remove(self);
@@ -113,11 +113,11 @@ void W_Porto_Touch (void)
        else if(self.effects & EF_RED)
        {
                self.effects += EF_BLUE - EF_RED;
-               if(Portal_SpawnInPortalAtTrace(self.owner, self.right_vector, self.portal_id))
+               if(Portal_SpawnInPortalAtTrace(self.realowner, self.right_vector, self.portal_id))
                {
                        sound(self, CHAN_PROJECTILE, "porto/create.wav", VOL_BASE, ATTN_NORM);
                        trace_plane_normal = norm;
-                       centerprint(self.owner, "^1In^7-portal created.");
+                       centerprint(self.realowner, "^1In^7-portal created.");
                        self.right_vector = self.right_vector - 2 * trace_plane_normal * (self.right_vector * norm);
                        self.angles = vectoangles(self.velocity - 2 * trace_plane_normal * (self.velocity * norm));
                        CSQCProjectile(self, TRUE, PROJECTILE_PORTO_BLUE, TRUE); // change type
@@ -131,13 +131,13 @@ void W_Porto_Touch (void)
        }
        else
        {
-               if(self.owner.portal_in.portal_id == self.portal_id)
+               if(self.realowner.portal_in.portal_id == self.portal_id)
                {
-                       if(Portal_SpawnOutPortalAtTrace(self.owner, self.right_vector, self.portal_id))
+                       if(Portal_SpawnOutPortalAtTrace(self.realowner, self.right_vector, self.portal_id))
                        {
                                sound(self, CHAN_PROJECTILE, "porto/create.wav", VOL_BASE, ATTN_NORM);
                                trace_plane_normal = norm;
-                               centerprint(self.owner, "^4Out^7-portal created.");
+                               centerprint(self.realowner, "^4Out^7-portal created.");
                                W_Porto_Success();
                        }
                        else
@@ -168,7 +168,7 @@ void W_Porto_Attack (void)
        //pointparticles(particleeffectnum("grenadelauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        gren = spawn ();
-       gren.owner = self;
+       gren.owner = gren.realowner = self;
        gren.playerid = self.playerid;
        gren.classname = "porto";
        gren.bot_dodge = TRUE;
index d65c4bc38ad19203cf63dade61b70c4aa88024e7..0269fd18fc8bff348f1e6e168f595a88270e4673 100644 (file)
@@ -7,10 +7,10 @@ REGISTER_WEAPON(ROCKET_LAUNCHER, w_rlauncher, IT_ROCKETS, 9, WEP_FLAG_NORMAL | W
 
 void W_Rocket_Unregister()
 {
-       if(self.owner && self.owner.lastrocket == self)
+       if(self.realowner && self.realowner.lastrocket == self)
        {
-               self.owner.lastrocket = world;
-               // self.owner.rl_release = 1;
+               self.realowner.lastrocket = world;
+               // self.realowner.rl_release = 1;
        }
 }
 
@@ -20,23 +20,23 @@ void W_Rocket_Explode ()
 
        if(other.takedamage == DAMAGE_AIM)
                if(other.classname == "player")
-                       if(IsDifferentTeam(self.owner, other))
+                       if(IsDifferentTeam(self.realowner, other))
                                if(other.deadflag == DEAD_NO)
                                        if(IsFlying(other))
-                                               AnnounceTo(self.owner, "airshot");
+                                               AnnounceTo(self.realowner, "airshot");
 
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
 
-       RadiusDamage (self, self.owner, autocvar_g_balance_rocketlauncher_damage, autocvar_g_balance_rocketlauncher_edgedamage, autocvar_g_balance_rocketlauncher_radius, world, autocvar_g_balance_rocketlauncher_force, self.projectiledeathtype, other);
+       RadiusDamage (self, self.realowner, autocvar_g_balance_rocketlauncher_damage, autocvar_g_balance_rocketlauncher_edgedamage, autocvar_g_balance_rocketlauncher_radius, world, autocvar_g_balance_rocketlauncher_force, self.projectiledeathtype, other);
 
-       if (self.owner.weapon == WEP_ROCKET_LAUNCHER)
+       if (self.realowner.weapon == WEP_ROCKET_LAUNCHER)
        {
-               if(self.owner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
+               if(self.realowner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
                {
-                       self.owner.cnt = WEP_ROCKET_LAUNCHER;
-                       ATTACK_FINISHED(self.owner) = time;
-                       self.owner.switchweapon = w_getbestweapon(self.owner);
+                       self.realowner.cnt = WEP_ROCKET_LAUNCHER;
+                       ATTACK_FINISHED(self.realowner) = time;
+                       self.realowner.switchweapon = w_getbestweapon(self.realowner);
                }
        }
        remove (self);
@@ -49,15 +49,15 @@ void W_Rocket_DoRemoteExplode ()
        self.event_damage = SUB_Null;
        self.takedamage = DAMAGE_NO;
 
-       RadiusDamage (self, self.owner, autocvar_g_balance_rocketlauncher_remote_damage, autocvar_g_balance_rocketlauncher_remote_edgedamage, autocvar_g_balance_rocketlauncher_remote_radius, world, autocvar_g_balance_rocketlauncher_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
+       RadiusDamage (self, self.realowner, autocvar_g_balance_rocketlauncher_remote_damage, autocvar_g_balance_rocketlauncher_remote_edgedamage, autocvar_g_balance_rocketlauncher_remote_radius, world, autocvar_g_balance_rocketlauncher_remote_force, self.projectiledeathtype | HITTYPE_BOUNCE, world);
 
-       if (self.owner.weapon == WEP_ROCKET_LAUNCHER)
+       if (self.realowner.weapon == WEP_ROCKET_LAUNCHER)
        {
-               if(self.owner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
+               if(self.realowner.ammo_rockets < autocvar_g_balance_rocketlauncher_ammo)
                {
-                       self.owner.cnt = WEP_ROCKET_LAUNCHER;
-                       ATTACK_FINISHED(self.owner) = time;
-                       self.owner.switchweapon = w_getbestweapon(self.owner);
+                       self.realowner.cnt = WEP_ROCKET_LAUNCHER;
+                       ATTACK_FINISHED(self.realowner) = time;
+                       self.realowner.switchweapon = w_getbestweapon(self.realowner);
                }
        }
        remove (self);
@@ -110,19 +110,19 @@ entity FindLaserTarget(entity e, float dist_variance, float dot_variance)
                head = find(head, classname, "laser_target");
        }
 
-       //bprint(selected.owner.netname);
+       //bprint(selected.realowner.netname);
        //bprint("\n");
        return selected;
 }
 
 void W_Rocket_RemoteExplode()
 {
-       if(self.owner.deadflag == DEAD_NO)
-       if(self.owner.lastrocket)
+       if(self.realowner.deadflag == DEAD_NO)
+       if(self.realowner.lastrocket)
        {
                if((self.spawnshieldtime >= 0)
                        ? (time >= self.spawnshieldtime) // timer
-                       : (vlen(NearestPointOnBox(self.owner, self.origin) - self.origin) > autocvar_g_balance_rocketlauncher_remote_radius) // safety device
+                       : (vlen(NearestPointOnBox(self.realowner, self.origin) - self.origin) > autocvar_g_balance_rocketlauncher_remote_radius) // safety device
                )
                {
                        W_Rocket_DoRemoteExplode();
@@ -175,14 +175,14 @@ void W_Rocket_Think (void)
                self.velocity = self.velocity + v_forward * min(autocvar_g_balance_rocketlauncher_speedaccel * g_weaponspeedfactor * frametime, velspeed);
 
        // laser guided, or remote detonation
-       if (self.owner.weapon == WEP_ROCKET_LAUNCHER)
+       if (self.realowner.weapon == WEP_ROCKET_LAUNCHER)
        {
-               if(self == self.owner.lastrocket)
-               if not(self.owner.rl_release)
+               if(self == self.realowner.lastrocket)
+               if not(self.realowner.rl_release)
                if not(self.BUTTON_ATCK2)
                if(autocvar_g_balance_rocketlauncher_guiderate)
                if(time > self.pushltime)
-               if(self.owner.deadflag == DEAD_NO)
+               if(self.realowner.deadflag == DEAD_NO)
                {
                        f = autocvar_g_balance_rocketlauncher_guideratedelay;
                        if(f)
@@ -192,9 +192,9 @@ void W_Rocket_Think (void)
 
                        velspeed = vlen(self.velocity);
 
-                       makevectors(self.owner.v_angle);
-                       desireddir = WarpZone_RefSys_TransformVelocity(self.owner, self, v_forward);
-                       desiredorigin = WarpZone_RefSys_TransformOrigin(self.owner, self, self.owner.origin + self.owner.view_ofs);
+                       makevectors(self.realowner.v_angle);
+                       desireddir = WarpZone_RefSys_TransformVelocity(self.realowner, self, v_forward);
+                       desiredorigin = WarpZone_RefSys_TransformOrigin(self.realowner, self, self.realowner.origin + self.realowner.view_ofs);
                        olddir = normalize(self.velocity);
 
                        // now it gets tricky... we want to move like some curve to approximate the target direction
@@ -209,7 +209,7 @@ void W_Rocket_Think (void)
                        {
                                pointparticles(particleeffectnum("rocket_guide"), self.origin, self.velocity, 1);
                                // TODO add a better sound here
-                               sound (self.owner, CHAN_WEAPON2, "weapons/rocket_mode.wav", VOL_BASE, ATTN_NORM);
+                               sound (self.realowner, CHAN_WEAPON2, "weapons/rocket_mode.wav", VOL_BASE, ATTN_NORM);
                                self.count = 1;
                        }
                }
@@ -255,7 +255,7 @@ void W_Rocket_Attack (void)
        pointparticles(particleeffectnum("rocketlauncher_muzzleflash"), w_shotorg, w_shotdir * 1000, 1);
 
        missile = WarpZone_RefSys_SpawnSameRefSys(self);
-       missile.owner = self;
+       missile.owner = missile.realowner = self;
        self.lastrocket = missile;
        if(autocvar_g_balance_rocketlauncher_detonatedelay >= 0)
                missile.spawnshieldtime = time + autocvar_g_balance_rocketlauncher_detonatedelay;
@@ -328,7 +328,7 @@ float w_rlauncher(float req)
                        missile = find(world, classname, "rocket");
                        while (missile)
                        {
-                               if (missile.owner != self)
+                               if (missile.realowner != self)
                                {
                                        missile = find(missile, classname, "rocket");
                                        continue;
@@ -359,7 +359,7 @@ float w_rlauncher(float req)
                        missile = find(world, classname, "rocket");
                        while (missile)
                        {
-                               if (missile.owner != self)
+                               if (missile.realowner != self)
                                {
                                        missile = find(missile, classname, "rocket");
                                        continue;
@@ -424,7 +424,7 @@ float w_rlauncher(float req)
                        if (self.BUTTON_ATCK2)
                        {
                                rockfound = 0;
-                               for(rock = world; (rock = find(rock, classname, "rocket")); ) if(rock.owner == self)
+                               for(rock = world; (rock = find(rock, classname, "rocket")); ) if(rock.realowner == self)
                                {
                                        if(!rock.rl_detonate_later)
                                        {
index a4f4383227506ecc0c0d7bb0100fd39c70c7a506..aa07f82881e9648c868edea7f931f57ddb37fd01 100644 (file)
@@ -13,7 +13,7 @@ REGISTER_WEAPON(SEEKER, w_seeker, IT_ROCKETS, 8, WEP_FLAG_RELOADABLE | WEP_TYPE_
 void Seeker_Missile_Explode ()
 {
        self.event_damage = SUB_Null;
-       RadiusDamage (self, self.owner, autocvar_g_balance_seeker_missile_damage, autocvar_g_balance_seeker_missile_edgedamage, autocvar_g_balance_seeker_missile_radius, world, autocvar_g_balance_seeker_missile_force, self.projectiledeathtype, other);
+       RadiusDamage (self, self.realowner, autocvar_g_balance_seeker_missile_damage, autocvar_g_balance_seeker_missile_edgedamage, autocvar_g_balance_seeker_missile_radius, world, autocvar_g_balance_seeker_missile_force, self.projectiledeathtype, other);
 
        remove (self);
 }
@@ -125,7 +125,7 @@ void Seeker_Missile_Damage (entity inflictor, entity attacker, float damage, flo
        if (self.health <= 0)
                return;
 
-       if (self.owner == attacker)
+       if (self.realowner == attacker)
                self.health = self.health - (damage * 0.25);
        else
                self.health = self.health - damage;
@@ -173,7 +173,7 @@ void Seeker_Fire_Missile(vector f_diff, entity m_target)
        //self.detornator         = FALSE;
 
        missile                 = spawn();
-       missile.owner           = self;
+       missile.owner           = missile.realowner = self;
        missile.classname       = "seeker_missile";
        missile.bot_dodge       = TRUE;
        missile.bot_dodgerating = autocvar_g_balance_seeker_missile_damage;
@@ -217,7 +217,7 @@ void Seeker_Flac_Explode ()
 {
        self.event_damage = SUB_Null;
 
-       RadiusDamage (self, self.owner, autocvar_g_balance_seeker_flac_damage, autocvar_g_balance_seeker_flac_edgedamage, autocvar_g_balance_seeker_flac_radius, world, autocvar_g_balance_seeker_flac_force, self.projectiledeathtype, other);
+       RadiusDamage (self, self.realowner, autocvar_g_balance_seeker_flac_damage, autocvar_g_balance_seeker_flac_edgedamage, autocvar_g_balance_seeker_flac_radius, world, autocvar_g_balance_seeker_flac_force, self.projectiledeathtype, other);
 
        remove (self);
 }
@@ -294,7 +294,7 @@ entity Seeker_Tagged_Info(entity isowner, entity istarget)
 {
        entity tag;
        for(tag = world; (tag = find(tag, classname, "tag_tracker")); ) 
-               if ((tag.owner == isowner) && (tag.tag_target == istarget))
+               if ((tag.realowner == isowner) && (tag.tag_target == istarget))
                        return tag;
                
        return world;
@@ -304,7 +304,7 @@ void Seeker_Attack()
 {
        entity tracker, closest_target;
        
-       for(tracker = world; (tracker = find(tracker, classname, "tag_tracker")); ) if (tracker.owner == self)
+       for(tracker = world; (tracker = find(tracker, classname, "tag_tracker")); ) if (tracker.realowner == self)
        {
                if (closest_target)
                {
@@ -328,7 +328,7 @@ void Seeker_Vollycontroller_Think() // TODO: Merge this with Seeker_Attack
        entity oldself,oldenemy;
        self.cnt = self.cnt - 1;
 
-       if((!(self.owner.items & IT_UNLIMITED_AMMO) && self.owner.ammo_rockets < autocvar_g_balance_seeker_missile_ammo) || (self.cnt <= -1) || (self.owner.deadflag != DEAD_NO) || (self.owner.switchweapon != WEP_SEEKER))
+       if((!(self.realowner.items & IT_UNLIMITED_AMMO) && self.realowner.ammo_rockets < autocvar_g_balance_seeker_missile_ammo) || (self.cnt <= -1) || (self.realowner.deadflag != DEAD_NO) || (self.realowner.switchweapon != WEP_SEEKER))
        {
                remove(self);
                return;
@@ -337,7 +337,7 @@ void Seeker_Vollycontroller_Think() // TODO: Merge this with Seeker_Attack
        self.nextthink = time + autocvar_g_balance_seeker_missile_delay;
        
        oldself = self;
-       self = self.owner;
+       self = self.realowner;
        
        oldenemy = self.enemy;
        self.enemy = oldself.enemy;
@@ -367,7 +367,7 @@ void Seeker_Vollycontroller_Think() // TODO: Merge this with Seeker_Attack
 void Seeker_Tracker_Think() 
 {
        // commit suicide if: You die OR target dies OR you switch away from the seeker OR commit suicide if lifetime is up
-       if ((self.owner.deadflag != DEAD_NO) || (self.tag_target.deadflag != DEAD_NO) || (self.owner.switchweapon != WEP_SEEKER)
+       if ((self.realowner.deadflag != DEAD_NO) || (self.tag_target.deadflag != DEAD_NO) || (self.realowner.switchweapon != WEP_SEEKER)
        || (time > self.tag_time + autocvar_g_balance_seeker_tag_tracker_lifetime))
        {
                if (self)
@@ -387,7 +387,7 @@ void Seeker_Tracker_Think()
 // ============================
 void Seeker_Tag_Explode ()
 {
-       //if(other==self.owner)
+       //if(other==self.realowner)
        //    return;
        Damage_DamageInfo(self.origin, 0, 0, 0, self.velocity, WEP_SEEKER | HITTYPE_BOUNCE, self);
 
@@ -409,7 +409,7 @@ void Seeker_Tag_Touch()
        vector org2;
        entity e;
        
-       dir     = normalize (self.owner.origin - self.origin);
+       dir     = normalize (self.realowner.origin - self.origin);
        org2    = findbetterlocation (self.origin, 8);
 
        te_knightspike(org2);
@@ -420,7 +420,7 @@ void Seeker_Tag_Touch()
        if (other.takedamage == DAMAGE_AIM && other.deadflag == DEAD_NO)
        {
                // check to see if this person is already tagged by me
-               entity tag = Seeker_Tagged_Info(self.owner, other);
+               entity tag = Seeker_Tagged_Info(self.realowner, other);
                
                if (tag != world)
                {
@@ -431,11 +431,12 @@ void Seeker_Tag_Touch()
                }
                else
                {               
-                       //sprint(self.owner, strcat("You just tagged ^2", other.netname, "^7 with a tracking device!\n"));
+                       //sprint(self.realowner, strcat("You just tagged ^2", other.netname, "^7 with a tracking device!\n"));
                        e             = spawn();
                        e.cnt         = autocvar_g_balance_seeker_missile_count;
                        e.classname   = "tag_tracker";
                        e.owner       = self.owner;
+                       e.realowner   = self.realowner;
                        
                        if      (autocvar_g_balance_seeker_type == 1)
                        {
@@ -454,7 +455,7 @@ void Seeker_Tag_Touch()
                
                if      (autocvar_g_balance_seeker_type == 1)
                {
-                       WaypointSprite_Spawn("tagged-target", autocvar_g_balance_seeker_tag_tracker_lifetime, 0, other, '0 0 64', self.owner, 0, other, wps_tag_tracker, TRUE);
+                       WaypointSprite_Spawn("tagged-target", autocvar_g_balance_seeker_tag_tracker_lifetime, 0, other, '0 0 64', self.realowner, 0, other, wps_tag_tracker, TRUE, RADARICON_TAGGED, '0.5 1 0');
                        WaypointSprite_UpdateRule(other.wps_tag_tracker, 0, SPRITERULE_DEFAULT);
                }
        }
@@ -471,7 +472,7 @@ void Seeker_Fire_Tag()
        W_SetupShot_ProjectileSize (self, '-2 -2 -2', '2 2 2', FALSE, 2, "weapons/tag_fire.wav", CHAN_WEAPON, autocvar_g_balance_seeker_missile_damage * autocvar_g_balance_seeker_missile_count);
 
        missile                 = spawn();
-       missile.owner           = self;
+       missile.owner           = missile.realowner = self;
        missile.classname       = "seeker_tag";
        missile.bot_dodge       = TRUE;
        missile.bot_dodgerating = 50;
@@ -480,7 +481,6 @@ void Seeker_Fire_Tag()
        missile.nextthink       = time + autocvar_g_balance_seeker_tag_lifetime;
        missile.movetype        = MOVETYPE_FLY;
        missile.solid           = SOLID_BBOX;
-       missile.owner           = self;
 
        missile.takedamage       = DAMAGE_YES;
        missile.event_damage    = Seeker_Tag_Explode;
index 635b1ccf8b959ac753e4f06ef493605e9049b973..a7da4eb5ad794c4cd9de5880e1c03480ce95fc37 100644 (file)
@@ -46,13 +46,14 @@ void W_Shotgun_Attack (void)
        W_AttachToShotorg(flash, '5 0 0');
 }
 
+entity lgbeam_owner_ent;
 void shotgun_meleethink (void)
 {
        // store time when we started swinging down inside self.cnt
        if(!self.cnt)
                self.cnt = time;
 
-       makevectors(self.owner.v_angle);
+       makevectors(self.realowner.v_angle);
        vector angle;
        angle = v_forward;
 
@@ -63,21 +64,26 @@ void shotgun_meleethink (void)
        float f;
        f = (self.cnt + meleetime - time) / meleetime * 2 - 1;
        vector targpos;
-       targpos = self.owner.origin + self.owner.view_ofs + angle * autocvar_g_balance_shotgun_secondary_melee_range + v_right * f * autocvar_g_balance_shotgun_secondary_melee_swing + v_up * f * autocvar_g_balance_shotgun_secondary_melee_swing;
+       targpos = self.realowner.origin + self.realowner.view_ofs + angle * autocvar_g_balance_shotgun_secondary_melee_range + v_right * f * autocvar_g_balance_shotgun_secondary_melee_swing + v_up * f * autocvar_g_balance_shotgun_secondary_melee_swing;
 
-       WarpZone_traceline_antilag(self.owner, self.owner.origin + self.owner.view_ofs, targpos, FALSE, self.owner, ANTILAG_LATENCY(self.owner));
+       if(!lgbeam_owner_ent)
+       {
+               lgbeam_owner_ent = spawn();
+               lgbeam_owner_ent.classname = "lgbeam_owner_ent";
+       }
+       WarpZone_traceline_antilag(lgbeam_owner_ent, self.realowner.origin + self.realowner.view_ofs, targpos, FALSE, lgbeam_owner_ent, ANTILAG_LATENCY(self.realowner));
 
        // apply the damage, also remove self
        if(trace_fraction < 1 && trace_ent.takedamage == DAMAGE_AIM && (trace_ent.classname == "player" || trace_ent.classname == "body"))
        {
                vector force;
                force = angle * autocvar_g_balance_shotgun_secondary_force;
-               if(accuracy_isgooddamage(self.owner, trace_ent))
-                       accuracy_add(self.owner, WEP_SHOTGUN, 0, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1));
-               Damage (trace_ent, self.owner, self.owner, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1), WEP_SHOTGUN | HITTYPE_SECONDARY , self.owner.origin + self.owner.view_ofs, force);
+               if(accuracy_isgooddamage(self.realowner, trace_ent))
+                       accuracy_add(self.realowner, WEP_SHOTGUN, 0, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1));
+               Damage (trace_ent, self.realowner, self.realowner, autocvar_g_balance_shotgun_secondary_damage * min(1, f + 1), WEP_SHOTGUN | HITTYPE_SECONDARY , self.realowner.origin + self.realowner.view_ofs, force);
                remove(self);
        }
-       else if(time >= self.cnt + meleetime || (self.owner.deadflag != DEAD_NO && autocvar_g_balance_shotgun_secondary_melee_no_doubleslap)) // missed or owner died, remove ent
+       else if(time >= self.cnt + meleetime || (self.realowner.deadflag != DEAD_NO && autocvar_g_balance_shotgun_secondary_melee_no_doubleslap)) // missed or owner died, remove ent
                remove(self);
        else // continue swinging the weapon in hope of hitting someone :)
                self.nextthink = time;
@@ -90,7 +96,7 @@ void W_Shotgun_Attack2 (void)
 
        entity meleetemp;
        meleetemp = spawn();
-       meleetemp.owner = self;
+       meleetemp.owner = meleetemp.realowner = self;
        meleetemp.think = shotgun_meleethink;
        meleetemp.nextthink = time + autocvar_g_balance_shotgun_secondary_melee_delay;
        W_SetupShot_Range(self, TRUE, 0, "", 0, autocvar_g_balance_shotgun_secondary_damage, autocvar_g_balance_shotgun_secondary_melee_range);
@@ -200,7 +206,7 @@ float w_shotgun(float req)
                precache_sound("weapons/ric3.wav");
        }
        else if (req == WR_SUICIDEMESSAGE)
-               w_deathtypestring = _("%s did the impossible");
+               w_deathtypestring = _("%s is now thinking with portals");
        else if (req == WR_KILLMESSAGE)
        {
                if(w_deathtype & HITTYPE_SECONDARY)
index f49f6324b2046119547b21734294afe486f7b80a..46197204026359c0de9a914c109e63da86d15779 100644 (file)
@@ -83,7 +83,7 @@ float W_Tuba_NoteSendEntity(entity to, float sf)
                WriteCoord(MSG_ENTITY, self.origin_x);
                WriteCoord(MSG_ENTITY, self.origin_y);
                WriteCoord(MSG_ENTITY, self.origin_z);
-               WriteByte(MSG_ENTITY, self.owner != to);
+               WriteByte(MSG_ENTITY, self.realowner != to);
        }
        return TRUE;
 }
@@ -97,30 +97,30 @@ void W_Tuba_NoteThink()
        entity e;
        if(time > self.teleport_time)
        {
-               self.owner.tuba_note = world;
+               self.realowner.tuba_note = world;
                remove(self);
                return;
        }
        self.nextthink = time;
        dist_mult = autocvar_g_balance_tuba_attenuation / autocvar_snd_soundradius;
        FOR_EACH_REALCLIENT(e)
-       if(e != self.owner)
+       if(e != self.realowner)
        {
                v = self.origin - (e.origin + e.view_ofs);
                vol0 = max(0, 1 - vlen(v) * dist_mult);
                dir0 = normalize(v);
-               v = self.owner.origin - (e.origin + e.view_ofs);
+               v = self.realowner.origin - (e.origin + e.view_ofs);
                vol1 = max(0, 1 - vlen(v) * dist_mult);
                dir1 = normalize(v);
                if(fabs(vol0 - vol1) > 0.005) // 0.5 percent change in volume
                {
-                       setorigin(self, self.owner.origin);
+                       setorigin(self, self.realowner.origin);
                        self.SendFlags |= 1;
                        break;
                }
                if(dir0 * dir1 < 0.9994) // 2 degrees change in angle
                {
-                       setorigin(self, self.owner.origin);
+                       setorigin(self, self.realowner.origin);
                        self.SendFlags |= 1;
                        break;
                }
@@ -161,7 +161,7 @@ void W_Tuba_Attack(float hittype)
        if not(self.tuba_note)
        {
                self.tuba_note = spawn();
-               self.tuba_note.owner = self;
+               self.tuba_note.owner = self.tuba_note.realowner = self;
                self.tuba_note.cnt = n;
                self.tuba_note.think = W_Tuba_NoteThink;
                self.tuba_note.nextthink = time;
index 2f5b9bc7833badd1167a4205bc32c940e7550a1c..9d4fbca1a5d759e5b0b4c0780ec26430051326d5 100644 (file)
@@ -15,7 +15,7 @@ void UZI_Flash_Go()
        {
                self.think = SUB_Remove;
                self.nextthink = time;
-               self.owner.muzzle_flash = world;
+               self.realowner.muzzle_flash = world;
                return;
        }
        
@@ -36,7 +36,7 @@ void UziFlash()
        self.muzzle_flash.alpha = 0.75;
        self.muzzle_flash.angles_z = random() * 180;
        self.muzzle_flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION;
-       self.muzzle_flash.owner = self;
+       self.muzzle_flash.owner = self.muzzle_flash.realowner = self;
 }
 
 void W_UZI_Attack (float deathtype)
@@ -314,7 +314,7 @@ float w_uzi(float req)
                precache_sound("weapons/ric3.wav");
        }
        else if (req == WR_SUICIDEMESSAGE)
-               w_deathtypestring = _("%s did the impossible");
+               w_deathtypestring = _("%s is now thinking with portals");
        else if (req == WR_KILLMESSAGE)
        {
                if(w_deathtype & HITTYPE_SECONDARY)
index 24fdcb336729c9ed81f9731a67fcfc20167e85e7..836a853570bef941b74612a13d03d84e2d774cfc 100644 (file)
@@ -82,6 +82,7 @@ void WaypointSprite_UpdateTeamRadar(entity e, float icon, vector col)
 }
 
 .float waypointsprite_pingtime;
+.float waypointsprite_helpmetime;
 void WaypointSprite_Ping(entity e)
 {
        // anti spam
@@ -93,6 +94,15 @@ void WaypointSprite_Ping(entity e)
        e.SendFlags |= 32;
 }
 
+float waypointsprite_limitedrange, waypointsprite_deployed_lifetime, waypointsprite_deadlifetime;
+
+void WaypointSprite_HelpMePing(entity e)
+{
+       WaypointSprite_Ping(e);
+       e.waypointsprite_helpmetime = time + waypointsprite_deployed_lifetime;
+       e.SendFlags |= 32;
+}
+
 void WaypointSprite_FadeOutIn(entity e, float t)
 {
        if(!e.fade_time)
@@ -115,7 +125,6 @@ void WaypointSprite_FadeOutIn(entity e, float t)
        e.SendFlags |= 16;
 }
 
-float waypointsprite_limitedrange, waypointsprite_deployed_lifetime, waypointsprite_deadlifetime;
 void WaypointSprite_Init()
 {
        waypointsprite_limitedrange = autocvar_g_waypointsprite_limitedrange;
@@ -280,6 +289,13 @@ float WaypointSprite_SendEntity(entity to, float sendflags)
                WriteByte(MSG_ENTITY, self.colormod_x * 255.0);
                WriteByte(MSG_ENTITY, self.colormod_y * 255.0);
                WriteByte(MSG_ENTITY, self.colormod_z * 255.0);
+
+               dt = (self.waypointsprite_helpmetime - time) / 0.1;
+               if(dt < 0)
+                       dt = 0;
+               if(dt > 255)
+                       dt = 255;
+               WriteByte(MSG_ENTITY, dt);
        }
 
        return TRUE;
@@ -299,7 +315,8 @@ entity WaypointSprite_Spawn(
        entity ref, vector ofs, // position
        entity showto, float t, // show to whom? Use a flag to indicate a team
        entity own, .entity ownfield, // remove when own gets killed
-       float hideable // true when it should be controlled by cl_hidewaypoints
+       float hideable, // true when it should be controlled by cl_hidewaypoints
+       float icon, vector rgb // initial icon and color
 )
 {
        entity wp;
@@ -333,6 +350,8 @@ entity WaypointSprite_Spawn(
        wp.customizeentityforclient = WaypointSprite_Customize;
        wp.waypointsprite_visible_for_player = WaypointSprite_visible_for_player;
        wp.reset2 = WaypointSprite_Reset;
+       wp.cnt = icon;
+       wp.colormod = rgb;
        Net_LinkEntity(wp, FALSE, 0, WaypointSprite_SendEntity);
        return wp;
 }
@@ -341,17 +360,19 @@ entity WaypointSprite_SpawnFixed(
        string spr,
        vector ofs,
        entity own,
-       .entity ownfield
+       .entity ownfield,
+       float icon, vector rgb // initial icon and color
 )
 {
-       return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, own, ownfield, TRUE);
+       return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, own, ownfield, TRUE, icon, rgb);
 }
 
 .entity waypointsprite_deployed_fixed;
 entity WaypointSprite_DeployFixed(
        string spr,
        float limited_range,
-       vector ofs
+       vector ofs,
+       float icon, vector rgb // initial icon and color
 )
 {
        float t, maxdistance;
@@ -363,23 +384,25 @@ entity WaypointSprite_DeployFixed(
                maxdistance = waypointsprite_limitedrange;
        else
                maxdistance = 0;
-       return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, world, ofs, world, t, self, waypointsprite_deployed_fixed, FALSE);
+       return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, world, ofs, world, t, self, waypointsprite_deployed_fixed, FALSE, icon, rgb);
 }
 
 .entity waypointsprite_deployed_personal;
 entity WaypointSprite_DeployPersonal(
        string spr,
-       vector ofs
+       vector ofs,
+       float icon, vector rgb // initial icon and color
 )
 {
-       return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, self, waypointsprite_deployed_personal, FALSE);
+       return WaypointSprite_Spawn(spr, 0, 0, world, ofs, world, 0, self, waypointsprite_deployed_personal, FALSE, icon, rgb);
 }
 
 .entity waypointsprite_attached;
 .entity waypointsprite_attachedforcarrier;
 entity WaypointSprite_Attach(
        string spr,
-       float limited_range
+       float limited_range,
+       float icon, vector rgb // initial icon and color
 )
 {
        float t, maxdistance;
@@ -393,17 +416,18 @@ entity WaypointSprite_Attach(
                maxdistance = waypointsprite_limitedrange;
        else
                maxdistance = 0;
-       return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, self, '0 0 64', world, t, self, waypointsprite_attached, FALSE);
+       return WaypointSprite_Spawn(spr, waypointsprite_deployed_lifetime, maxdistance, self, '0 0 64', world, t, self, waypointsprite_attached, FALSE, icon, rgb);
 }
 
 entity WaypointSprite_AttachCarrier(
        string spr,
-       entity carrier
+       entity carrier,
+       float icon, vector rgb // initial icon and color
 )
 {
        entity e;
        WaypointSprite_Kill(carrier.waypointsprite_attached); // FC overrides attached
-       e = WaypointSprite_Spawn(spr, 0, 0, carrier, '0 0 64', world, carrier.team, carrier, waypointsprite_attachedforcarrier, FALSE);
+       e = WaypointSprite_Spawn(spr, 0, 0, carrier, '0 0 64', world, carrier.team, carrier, waypointsprite_attachedforcarrier, FALSE, icon, rgb);
        if(e)
        {
                WaypointSprite_UpdateMaxHealth(e, '1 0 0' * healtharmor_maxdamage(start_health, start_armorvalue, autocvar_g_balance_armor_blockpercent) * 2);
index 56f72bfd75bfee9235523ff55ffe8c418a732b83..3233f6a31cef9d6fbe6b5a14decc5af1654c05e8 100644 (file)
@@ -84,11 +84,16 @@ vector AnglesTransform_TurnDirectionFU(vector transform)
        return transform;
 }
 
-vector AnglesTransform_Divide(vector to_transform, vector from_transform)
+vector AnglesTransform_RightDivide(vector to_transform, vector from_transform)
 {
        return AnglesTransform_Multiply(to_transform, AnglesTransform_Invert(from_transform));
 }
 
+vector AnglesTransform_LeftDivide(vector from_transform, vector to_transform)
+{
+       return AnglesTransform_Multiply(AnglesTransform_Invert(from_transform), to_transform);
+}
+
 vector AnglesTransform_Normalize(vector t, float minimize_roll)
 {
        float need_flip;
index 045fb24b3afcc196759e661a2d5bb6e96fb80b00..b1c8a85e9da5916983322a5fad1016216e3250d1 100644 (file)
@@ -11,11 +11,12 @@ void fixedmakevectors(vector a);
 #endif
 
 vector AnglesTransform_Apply(vector transform, vector v);
-vector AnglesTransform_Multiply(vector t1, vector t2);
+vector AnglesTransform_Multiply(vector t1, vector t2); // A B
 vector AnglesTransform_Invert(vector transform);
 vector AnglesTransform_TurnDirectionFU(vector transform);
 vector AnglesTransform_TurnDirectionFR(vector transform);
-vector AnglesTransform_Divide(vector to_transform, vector from_transform);
+vector AnglesTransform_RightDivide(vector to_transform, vector from_transform); // A B^-1
+vector AnglesTransform_LeftDivide(vector from_transform, vector to_transform); // A^-1 B
 
 vector AnglesTransform_Normalize(vector t, float minimize_roll); // makes sure all angles are in their range: yaw in -180..180, pitch in -90..90, roll in -180..180 (or if minimize_roll is set, pitch in -180..180, roll in -90..90)
 
index 62e74682090c725e544ce7725e57bc8ba2a06294..bb4f965f77ad5a49e5e0a780e5fc5c6c0334fa28 100644 (file)
@@ -52,7 +52,7 @@ vector WarpZone_camera_transform(vector org, vector ang)
 
 void WarpZone_SetUp(entity e, vector my_org, vector my_ang, vector other_org, vector other_ang)
 {
-       e.warpzone_transform = AnglesTransform_Divide(other_ang, AnglesTransform_TurnDirectionFR(my_ang));
+       e.warpzone_transform = AnglesTransform_RightDivide(other_ang, AnglesTransform_TurnDirectionFR(my_ang));
        e.warpzone_shift = AnglesTransform_PrePostShift_GetPostShift(my_org, e.warpzone_transform, other_org);
        e.warpzone_origin = my_org;
        e.warpzone_targetorigin = other_org;
@@ -230,7 +230,7 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
                        break;
        }
        if((contentshack = (forent.dphitcontentsmask && !(forent.dphitcontentsmask & DPCONTENTS_SOLID))))
-               forent.dphitcontentsmask |= DPCONTENTS_SOLID;
+               BITSET_ASSIGN(forent.dphitcontentsmask, DPCONTENTS_SOLID);
 
        // if starting in warpzone, first transform
        wz = WarpZone_Find(org + mi, org + ma);
@@ -304,7 +304,7 @@ void WarpZone_TraceBox_ThroughZone(vector org, vector mi, vector ma, vector end,
        WarpZone_MakeAllOther();
 :fail
        if(contentshack)
-               forent.dphitcontentsmask &~= DPCONTENTS_SOLID;
+               BITCLR_ASSIGN(forent.dphitcontentsmask, DPCONTENTS_SOLID);
        trace_startsolid = sol;
        v_forward = vf;
        v_right = vr;
index 72485f25c4bc91ef64d1af1ab4c81576a407a6da..1dc12b8cfe97f60bc75d5139bb653a04b1eacf3e 100644 (file)
@@ -4,8 +4,6 @@
 float warpzone_warpzones_exist;
 float warpzone_cameras_exist;
 
-const void func_null(void); // never assign to this one please
-
 .float warpzone_isboxy;
 .vector warpzone_shift;
 .vector warpzone_origin;
@@ -71,3 +69,22 @@ vector WarpZone_RefSys_TransformVelocity(entity from, entity to, vector vel);
 vector WarpZone_RefSys_TransformAngles(entity from, entity to, vector ang);
 vector WarpZone_RefSys_TransformVAngles(entity from, entity to, vector ang);
 entity WarpZone_RefSys_SpawnSameRefSys(entity me);
+
+#ifndef BITCLR
+# define BITCLR(a,b) ((a) - ((a) & (b)))
+#endif
+#ifndef BITSET
+# define BITSET(a,b) ((a) | (b))
+#endif
+#ifndef BITXOR
+# define BITXOR(a,b) (((a) | (b)) - ((a) & (b)))
+#endif
+#ifndef BITCLR_ASSIGN
+# define BITCLR_ASSIGN(a,b) ((a) = (a) - ((a) & (b)))
+#endif
+#ifndef BITSET_ASSIGN
+# define BITSET_ASSIGN(a,b) ((a) |= (b))
+#endif
+#ifndef BITXOR_ASSIGN
+# define BITXOR_ASSIGN(a,b) ((a) = ((a) | (b)) - ((a) & (b)))
+#endif
index 29f5dc8db11aaf218354895ed5bba94f53e76397..1ec66022144fbf74bf67a1fa9196627e108cddc7 100644 (file)
@@ -1,3 +1,10 @@
+// for think function
+.vector warpzone_save_origin;
+.vector warpzone_save_angles;
+.vector warpzone_save_eorigin;
+.vector warpzone_save_eangles;
+
+// for all entities
 .vector warpzone_oldorigin, warpzone_oldvelocity, warpzone_oldangles;
 .float warpzone_teleport_time;
 .entity warpzone_teleport_zone;
@@ -22,13 +29,10 @@ void WarpZone_TeleportPlayer(entity teleporter, entity player, vector to, vector
        player.fixangle = TRUE;
        player.velocity = to_velocity;
 
-       if(player.effects & EF_TELEPORT_BIT)
-               player.effects &~= EF_TELEPORT_BIT;
-       else
-               player.effects |= EF_TELEPORT_BIT;
+       BITXOR_ASSIGN(player.effects, EF_TELEPORT_BIT);
 
        if(player.classname == "player")
-               player.flags &~= FL_ONGROUND;
+               BITCLR_ASSIGN(player.flags, FL_ONGROUND);
 
        WarpZone_PostTeleportPlayer_Callback(player);
 }
@@ -171,11 +175,11 @@ float WarpZone_Send(entity to, float sendflags)
        // we must send this flag for clientside to match properly too
        f = 0;
        if(self.warpzone_isboxy)
-               f |= 1;
+               BITSET_ASSIGN(f, 1);
        if(self.warpzone_fadestart)
-               f |= 2;
+               BITSET_ASSIGN(f, 2);
        if(self.origin != '0 0 0')
-               f |= 4;
+               BITSET_ASSIGN(f, 4);
        WriteByte(MSG_ENTITY, f);
 
        // we need THESE to render the warpzone (and cull properly)...
@@ -224,9 +228,9 @@ float WarpZone_Camera_Send(entity to, float sendflags)
        WriteByte(MSG_ENTITY, ENT_CLIENT_WARPZONE_CAMERA);
 
        if(self.warpzone_fadestart)
-               f |= 2;
+               BITSET_ASSIGN(f, 2);
        if(self.origin != '0 0 0')
-               f |= 4;
+               BITSET_ASSIGN(f, 4);
        WriteByte(MSG_ENTITY, f);
 
        // we need THESE to render the warpzone (and cull properly)...
@@ -369,6 +373,22 @@ void WarpZonePosition_InitStep_FindTarget()
        self.enemy.aiment = self;
 }
 
+void WarpZoneCamera_Think(void)
+{
+       if(self.warpzone_save_origin != self.origin
+       || self.warpzone_save_angles != self.angles
+       || self.warpzone_save_eorigin != self.enemy.origin
+       || self.warpzone_save_eangles != self.enemy.angles)
+       {
+               WarpZone_Camera_SetUp(self, self.enemy.origin, self.enemy.angles);
+               self.warpzone_save_origin = self.origin;
+               self.warpzone_save_angles = self.angles;
+               self.warpzone_save_eorigin = self.enemy.origin;
+               self.warpzone_save_eangles = self.enemy.angles;
+       }
+       self.nextthink = time;
+}
+
 void WarpZoneCamera_InitStep_FindTarget()
 {
        entity e;
@@ -390,6 +410,13 @@ void WarpZoneCamera_InitStep_FindTarget()
        warpzone_cameras_exist = 1;
        WarpZone_Camera_SetUp(self, self.enemy.origin, self.enemy.angles);
        self.SendFlags = 0xFFFFFF;
+       if(self.spawnflags & 1)
+       {
+               self.think = WarpZoneCamera_Think;
+               self.nextthink = time;
+       }
+       else
+               self.nextthink = 0;
 }
 
 void WarpZone_InitStep_UpdateTransform()
@@ -411,7 +438,7 @@ void WarpZone_InitStep_UpdateTransform()
                tex = getsurfacetexture(self, i_s);
                if not(tex)
                        break; // this is beyond the last one
-               if(tex == "textures/common/trigger")
+               if(tex == "textures/common/trigger" || tex == "trigger")
                        continue;
                n_t = getsurfacenumtriangles(self, i_s);
                for(i_t = 0; i_t < n_t; ++i_t)
@@ -514,6 +541,7 @@ void WarpZone_InitStep_FindTarget()
        }
 }
 
+void WarpZone_Think();
 void WarpZone_InitStep_FinalizeTransform()
 {
        if(!self.enemy || self.enemy.enemy != self)
@@ -526,6 +554,13 @@ void WarpZone_InitStep_FinalizeTransform()
        WarpZone_SetUp(self, self.warpzone_origin, self.warpzone_angles, self.enemy.warpzone_origin, self.enemy.warpzone_angles);
        self.touch = WarpZone_Touch;
        self.SendFlags = 0xFFFFFF;
+       if(self.spawnflags & 1)
+       {
+               self.think = WarpZone_Think;
+               self.nextthink = time;
+       }
+       else
+               self.nextthink = 0;
 }
 
 float warpzone_initialized;
@@ -553,6 +588,11 @@ void spawnfunc_trigger_warpzone(void)
        //              the map, with another killtarget to designate its
        //              orientation
 
+#ifndef WARPZONE_USE_FIXANGLE
+       // used when teleporting
+       precache_model("null");
+#endif
+
        if(!self.scale)
                self.scale = self.modelscale;
        if(!self.scale)
@@ -572,7 +612,7 @@ void spawnfunc_trigger_warpzone(void)
                setsize(self, self.mins, self.maxs);
        self.SendEntity = WarpZone_Send;
        self.SendFlags = 0xFFFFFF;
-       self.effects |= EF_NODEPTHTEST;
+       BITSET_ASSIGN(self.effects, EF_NODEPTHTEST);
        self.warpzone_next = warpzone_first;
        warpzone_first = self;
 }
@@ -616,6 +656,31 @@ void WarpZones_Reconnect()
        self = e;
 }
 
+void WarpZone_Think()
+{
+       if(self.warpzone_save_origin != self.origin
+       || self.warpzone_save_angles != self.angles
+       || self.warpzone_save_eorigin != self.enemy.origin
+       || self.warpzone_save_eangles != self.enemy.angles)
+       {
+               entity oldself;
+               oldself = self;
+               WarpZone_InitStep_UpdateTransform();
+               self = self.enemy;
+               WarpZone_InitStep_UpdateTransform();
+               self = oldself;
+               WarpZone_InitStep_FinalizeTransform();
+               self = self.enemy;
+               WarpZone_InitStep_FinalizeTransform();
+               self = oldself;
+               self.warpzone_save_origin = self.origin;
+               self.warpzone_save_angles = self.angles;
+               self.warpzone_save_eorigin = self.enemy.origin;
+               self.warpzone_save_eangles = self.enemy.angles;
+       }
+       self.nextthink = time;
+}
+
 void WarpZone_StartFrame()
 {
        entity e;
diff --git a/scripts/vehicles.shader b/scripts/vehicles.shader
new file mode 100644 (file)
index 0000000..023e277
--- /dev/null
@@ -0,0 +1,48 @@
+spiderbot
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/spiderbot.tga
+               rgbgen lightingDiffuse
+       }
+}
+wakazachi
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/wakazachi.tga
+               rgbgen lightingDiffuse
+       }
+}
+cockpit
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map textures/cockpit.tga
+               rgbgen lightingDiffuse
+       }
+}
+vehicles/tracercore
+{
+       surfaceparm nonsolid
+       surfaceparm nolightmap
+       deformVertexes autosprite
+       {
+       map models/vehicles/tracercore.tga
+               blendfunc add
+               rgbGen lightingDiffuse
+       }
+       }
+vehicles/tracertrail
+{
+       surfaceparm nonsolid
+       surfaceparm nolightmap
+       cull none
+       deformVertexes autosprite2
+       {
+               map models/vehicles/tracertrail.tga
+               blendfunc add
+               rgbGen lightingDiffuse
+       }
+}
+       
\ No newline at end of file
diff --git a/scripts/vrockets.shader b/scripts/vrockets.shader
new file mode 100644 (file)
index 0000000..4425994
--- /dev/null
@@ -0,0 +1,16 @@
+models/vehicles/rockets
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map models/vehicles/rockets.tga
+               rgbgen lightingDiffuse
+       }
+}
+rockets
+{
+       dpreflectcube cubemaps/default/sky
+       {
+               map models/vehicles/rockets.tga
+               rgbgen lightingDiffuse
+       }
+}
\ No newline at end of file
diff --git a/sound/vehicles/alarm.wav b/sound/vehicles/alarm.wav
new file mode 100644 (file)
index 0000000..95b4f55
Binary files /dev/null and b/sound/vehicles/alarm.wav differ
diff --git a/sound/vehicles/alarm_shield.wav b/sound/vehicles/alarm_shield.wav
new file mode 100644 (file)
index 0000000..8e46d62
Binary files /dev/null and b/sound/vehicles/alarm_shield.wav differ
diff --git a/sound/vehicles/lock.wav b/sound/vehicles/lock.wav
new file mode 100644 (file)
index 0000000..54a0a0d
Binary files /dev/null and b/sound/vehicles/lock.wav differ
diff --git a/sound/vehicles/locked.wav b/sound/vehicles/locked.wav
new file mode 100644 (file)
index 0000000..e846776
Binary files /dev/null and b/sound/vehicles/locked.wav differ
diff --git a/sound/vehicles/locking.wav b/sound/vehicles/locking.wav
new file mode 100644 (file)
index 0000000..210d88e
Binary files /dev/null and b/sound/vehicles/locking.wav differ
diff --git a/sound/vehicles/racer_boost.wav b/sound/vehicles/racer_boost.wav
new file mode 100644 (file)
index 0000000..93149e4
Binary files /dev/null and b/sound/vehicles/racer_boost.wav differ
diff --git a/sound/vehicles/racer_idle.wav b/sound/vehicles/racer_idle.wav
new file mode 100644 (file)
index 0000000..025332a
Binary files /dev/null and b/sound/vehicles/racer_idle.wav differ
diff --git a/sound/vehicles/racer_move.wav b/sound/vehicles/racer_move.wav
new file mode 100644 (file)
index 0000000..193a5e2
Binary files /dev/null and b/sound/vehicles/racer_move.wav differ
diff --git a/sound/vehicles/raptor_fly.wav b/sound/vehicles/raptor_fly.wav
new file mode 100644 (file)
index 0000000..88c8609
Binary files /dev/null and b/sound/vehicles/raptor_fly.wav differ
diff --git a/sound/vehicles/raptor_speed.wav b/sound/vehicles/raptor_speed.wav
new file mode 100644 (file)
index 0000000..439eebc
Binary files /dev/null and b/sound/vehicles/raptor_speed.wav differ
diff --git a/sound/vehicles/spiderbot_die.wav b/sound/vehicles/spiderbot_die.wav
new file mode 100644 (file)
index 0000000..10b3d6e
Binary files /dev/null and b/sound/vehicles/spiderbot_die.wav differ
diff --git a/sound/vehicles/spiderbot_idle.wav b/sound/vehicles/spiderbot_idle.wav
new file mode 100644 (file)
index 0000000..fdc20e7
Binary files /dev/null and b/sound/vehicles/spiderbot_idle.wav differ
diff --git a/sound/vehicles/spiderbot_jump.wav b/sound/vehicles/spiderbot_jump.wav
new file mode 100644 (file)
index 0000000..6044499
Binary files /dev/null and b/sound/vehicles/spiderbot_jump.wav differ
diff --git a/sound/vehicles/spiderbot_land.wav b/sound/vehicles/spiderbot_land.wav
new file mode 100644 (file)
index 0000000..d797e1f
Binary files /dev/null and b/sound/vehicles/spiderbot_land.wav differ
diff --git a/sound/vehicles/spiderbot_strafe.wav b/sound/vehicles/spiderbot_strafe.wav
new file mode 100644 (file)
index 0000000..3f13220
Binary files /dev/null and b/sound/vehicles/spiderbot_strafe.wav differ
diff --git a/sound/vehicles/spiderbot_walk.wav b/sound/vehicles/spiderbot_walk.wav
new file mode 100644 (file)
index 0000000..6b7638a
Binary files /dev/null and b/sound/vehicles/spiderbot_walk.wav differ
diff --git a/textures/cockpit_gloss.tga b/textures/cockpit_gloss.tga
new file mode 100644 (file)
index 0000000..422b5bd
Binary files /dev/null and b/textures/cockpit_gloss.tga differ
diff --git a/textures/cockpit_reflect.tga b/textures/cockpit_reflect.tga
new file mode 100644 (file)
index 0000000..ea39a45
Binary files /dev/null and b/textures/cockpit_reflect.tga differ
diff --git a/textures/raptor.jpg b/textures/raptor.jpg
deleted file mode 100644 (file)
index 8a1cdce..0000000
Binary files a/textures/raptor.jpg and /dev/null differ
diff --git a/textures/raptor.tga b/textures/raptor.tga
new file mode 100644 (file)
index 0000000..2037f7b
Binary files /dev/null and b/textures/raptor.tga differ
diff --git a/textures/raptor_cockpit.jpg b/textures/raptor_cockpit.jpg
deleted file mode 100644 (file)
index fd999b5..0000000
Binary files a/textures/raptor_cockpit.jpg and /dev/null differ
diff --git a/textures/spiderbot_reflect.tga b/textures/spiderbot_reflect.tga
new file mode 100644 (file)
index 0000000..a2a4a04
Binary files /dev/null and b/textures/spiderbot_reflect.tga differ
diff --git a/textures/wakazachi_gloss.jpg b/textures/wakazachi_gloss.jpg
new file mode 100644 (file)
index 0000000..2c7878c
Binary files /dev/null and b/textures/wakazachi_gloss.jpg differ
diff --git a/textures/wakazachi_glow.tga b/textures/wakazachi_glow.tga
new file mode 100644 (file)
index 0000000..89e4813
Binary files /dev/null and b/textures/wakazachi_glow.tga differ
diff --git a/textures/wakazachi_reflect.tga b/textures/wakazachi_reflect.tga
new file mode 100644 (file)
index 0000000..cb88c1a
Binary files /dev/null and b/textures/wakazachi_reflect.tga differ
index 607553c8e07243b67ce13217173d3d062dfc4eca..e08374945e4c55fff8631bd7521197596544561f 100644 (file)
@@ -8,6 +8,12 @@ set g_turrets_unit_walker_speed_swim 200
 set g_turrets_unit_walker_speed_jump 800
 set g_turrets_unit_walker_speed_stop 90
 
+set g_turrets_unit_walker_turn 20
+set g_turrets_unit_walker_turn_walk 15
+set g_turrets_unit_walker_turn_run 7
+set g_turrets_unit_walker_turn_swim 10
+set g_turrets_unit_walker_turn_strafe 5
+
 // Main machineguns prop's
 set g_turrets_unit_walker_std_shot_dmg 5
 set g_turrets_unit_walker_std_shot_refire 0.05
@@ -45,11 +51,11 @@ set g_turrets_unit_walker_std_track_type 1
 set g_turrets_unit_walker_std_rockets_range     4000
 set g_turrets_unit_walker_std_rockets_range_min 500
 set g_turrets_unit_walker_std_rocket_refire     10
-set g_turrets_unit_walker_std_rocket_dmg        50
+set g_turrets_unit_walker_std_rocket_dmg        45
 set g_turrets_unit_walker_std_rocket_radius     150
 set g_turrets_unit_walker_std_rocket_force      150
-set g_turrets_unit_walker_std_rocket_turnrate    0.4
-set g_turrets_unit_walker_std_rocket_speed      900
+set g_turrets_unit_walker_std_rocket_turnrate   0.05
+set g_turrets_unit_walker_std_rocket_speed      1000
 
 // Meele attack. Only happens when theres a target directly in front
 set g_turrets_unit_walker_std_meele_range 100
diff --git a/vehicle_bumblebee.cfg b/vehicle_bumblebee.cfg
new file mode 100644 (file)
index 0000000..0d4feb3
--- /dev/null
@@ -0,0 +1,40 @@
+set g_vehicle_bumblebee_speed_forward            400
+set g_vehicle_bumblebee_speed_strafe             200
+set g_vehicle_bumblebee_speed_up                 200
+set g_vehicle_bumblebee_speed_down               200
+set g_vehicle_bumblebee_turnspeed                72
+set g_vehicle_bumblebee_pitchspeed               36
+set g_vehicle_bumblebee_pitchlimit               15
+set g_vehicle_bumblebee_friction                 0.75
+
+set g_vehicle_bumblebee_energy                   500
+set g_vehicle_bumblebee_energy_regen             50
+set g_vehicle_bumblebee_energy_regen_pause       1
+
+set g_vehicle_bumblebee_health                   750
+set g_vehicle_bumblebee_health_regen             25
+set g_vehicle_bumblebee_health_regen_pause       5
+
+set g_vehicle_bumblebee_shield                   250
+set g_vehicle_bumblebee_shield_regen             100
+set g_vehicle_bumblebee_shield_regen_pause       2
+
+set g_vehicle_bumblebee_cannon_cost              10
+set g_vehicle_bumblebee_cannon_damage            75
+set g_vehicle_bumblebee_cannon_radius            150
+set g_vehicle_bumblebee_cannon_refire            1.5
+set g_vehicle_bumblebee_cannon_speed             5000
+set g_vehicle_bumblebee_cannon_spread            0.0125
+set g_vehicle_bumblebee_cannon_force             400
+set g_vehicle_bumblebee_cannon_turnspeed         90
+set g_vehicle_bumblebee_cannon_pitchlimit_down   60
+set g_vehicle_bumblebee_cannon_pitchlimit_up     60
+set g_vehicle_bumblebee_cannon_turnlimit_in      5
+set g_vehicle_bumblebee_cannon_turnlimit_out     45
+
+set g_vehicle_bumblebee_respawntime              10
+
+set g_vehicle_bumblebee_blowup_radius            500
+set g_vehicle_bumblebee_blowup_coredamage        500
+set g_vehicle_bumblebee_blowup_edgedamage        100
+set g_vehicle_bumblebee_blowup_forceintensity    600
\ No newline at end of file
index 1ab10cdae6f38a5e60698d4f69e5e06b7501f5d4..af6587546def9aa83b5581a4eb2efbc746754923 100644 (file)
@@ -1,54 +1,64 @@
-set g_vehicle_racer_reload             1
+set g_vehicle_racer_respawntime                    25
 
-set g_vehicle_racer_respawntime                   10
-set g_vehicle_racer_health                250
+set g_vehicle_racer_health              190
+set g_vehicle_racer_health_regen        0
+set g_vehicle_racer_health_regen_pause  0
 
-set g_vehicle_racer_shield                  100
-set g_vehicle_racer_shield_block            1
-set g_vehicle_racer_shield_regen            50
-set g_vehicle_racer_shield_regen_dmgpause   0.25
-set g_vehicle_racer_shield_regen_energyrate 2
+set g_vehicle_racer_shield              75
+set g_vehicle_racer_shield_regen        25
+set g_vehicle_racer_shield_regen_pause  1
 
-set g_vehicle_racer_energy          150
-set g_vehicle_racer_energy_regen    50
-set g_vehicle_racer_energy_usepause 1
+set g_vehicle_racer_energy              125
+set g_vehicle_racer_energy_regen        40
+set g_vehicle_racer_energy_regen_pause  1
 
-set g_vehicle_racer_speed_stop           2000
-set g_vehicle_racer_speed_forward        1600
-set g_vehicle_racer_speed_strafe         750
+set g_vehicle_racer_speed_stop          2000
+set g_vehicle_racer_speed_forward       800
+set g_vehicle_racer_speed_strafe        500
+set g_vehicle_racer_speed_afterburn     2000
+set g_vehicle_racer_friction            0.4
+set g_vehicle_racer_afterburn_cost      60      // energy consumed per second
 
-set g_vehicle_racer_speed_afterburn      3500
-set g_vehicle_racer_speed_afterburn_emin 25
-set g_vehicle_racer_speed_afterburn_cost 50
+set g_vehicle_racer_hovertype           0       // 0 = hover, != 0 = maglev
+set g_vehicle_racer_hoverpower          5000    // NOTE!! x 4 (4 engines)
+set g_vehicle_racer_upforcedamper       10
 
-set g_vehicle_racer_power_min          0
-set g_vehicle_racer_power_air          0
-set g_vehicle_racer_power_solid        8000
+set g_vehicle_racer_downforce            0.01
+set g_vehicle_racer_springlength         65
+set g_vehicle_racer_collision_multiplier 0.05
+set g_vehicle_racer_anglestabilizer      1.75
 
-set g_vehicle_racer_drag               0.25
-set g_vehicle_racer_dragexp            0.9
-
-set g_vehicle_racer_downforce          0.01
+set g_vehicle_racer_turnspeed          200
+set g_vehicle_racer_pitchspeed         100
+set g_vehicle_racer_maxpitch           25
+set g_vehicle_racer_turnroll           32
 
-set g_vehicle_racer_springlength       125
-set g_vehicle_racer_anglestabilizer    18
+set g_vehicle_racer_cannon_speed        9000
+set g_vehicle_racer_cannon_damage       20
+set g_vehicle_racer_cannon_radius       100
+set g_vehicle_racer_cannon_refire       0.1
+set g_vehicle_racer_cannon_cost         4
+set g_vehicle_racer_cannon_spread       0.0125
+set g_vehicle_racer_cannon_force        50
 
-set g_vehicle_racer_turnspeed          180
-set g_vehicle_racer_pitchspeed         360
-set g_vehicle_racer_maxpitch           25
-set g_vehicle_racer_turnroll           0.3
-
-set g_vehicle_racer_laser_speed        18000
-set g_vehicle_racer_laser_damage       20
-set g_vehicle_racer_laser_radius       100
-set g_vehicle_racer_laser_refire       0.05
-set g_vehicle_racer_laser_cost         2
-
-set g_vehicle_racer_rocket_speed       1500
-set g_vehicle_racer_rocket_accel       1500
-set g_vehicle_racer_rocket_turnrate    0.5
-set g_vehicle_racer_rocket_damage      200
-set g_vehicle_racer_rocket_radius      100
-set g_vehicle_racer_rocket_refire      5
+set g_vehicle_racer_rocket_speed       1000
+set g_vehicle_racer_rocket_accel       1400
+set g_vehicle_racer_rocket_turnrate    0.17
+set g_vehicle_racer_rocket_damage      160
+set g_vehicle_racer_rocket_force       350
+set g_vehicle_racer_rocket_radius      125
+set g_vehicle_racer_rocket_refire      6
 set g_vehicle_racer_rocket_cost        0
 
+set g_vehicle_racer_rocket_locktarget           1
+set g_vehicle_racer_rocket_locking_time         0.4
+set g_vehicle_racer_rocket_locking_releasetime  1.6
+set g_vehicle_racer_rocket_locked_time          5
+set g_vehicle_racer_rocket_locked_maxangle      1.46
+
+set g_vehicle_racer_blowup_radius           250
+set g_vehicle_racer_blowup_coredamage       250
+set g_vehicle_racer_blowup_edgedamage       15
+set g_vehicle_racer_blowup_forceintensity   250
+
+set g_vehicle_racer_mass                    900
index cbc3a1a69ca8778cb3ae5106b2a60d259c430c4a..e502c8db2ea4952d470127cf0021d3c6111d242a 100644 (file)
@@ -1,37 +1,61 @@
-set g_vehicle_raptor_reload             1
+set g_vehicle_raptor_respawntime 35
 
+// 0: go where player aims, +forward etc relative to aim angles
+// 1: ignore aim for up/down movement. +forward always moved forward, +jump always moves up
 set g_vehicle_raptor_movestyle 1
-set g_vehicle_raptor_turnspeed 90
+
 set g_vehicle_raptor_turnroll 0.1
-set g_vehicle_raptor_pitchspeed 45
-set g_vehicle_raptor_speed_forward 1500
-set g_vehicle_raptor_speed_strafe 1500
-set g_vehicle_raptor_speed_up 1250
-set g_vehicle_raptor_speed_down 1400
-
-set g_vehicle_raptor_bomblet_waves  2
-set g_vehicle_raptor_bomblet_wavefirst  0.5
-set g_vehicle_raptor_bomblet_wavenext   0.3
-set g_vehicle_raptor_bomblet_wawespread 0.3
-set g_vehicle_raptor_bomblets       3
-set g_vehicle_raptor_bomblet_damage 90
-set g_vehicle_raptor_bomblet_edgedamage 40
-set g_vehicle_raptor_bomblet_radius 250
-set g_vehicle_raptor_bomblet_force  300
-set g_vehicle_raptor_bombs_refire   1
-
-set g_vehicle_raptor_beam_dps     200
-set g_vehicle_raptor_beam_fops    150
-set g_vehicle_raptor_beam_aps     100
-set g_vehicle_raptor_beam_size    8
-set g_vehicle_raptor_beam_leangth 1
-set g_vehicle_raptor_beam_refire  2
-
-set g_vehicle_raptor_shield   250
-set g_vehicle_raptor_shield_regen 50
-
-set g_vehicle_raptor_health   250
-set g_vehicle_raptor_health_regen 10
-
-set g_vehicle_raptor_energy   300
-set g_vehicle_raptor_energy_regen 50
\ No newline at end of file
+
+set g_vehicle_raptor_turnspeed  80
+set g_vehicle_raptor_pitchspeed 40
+set g_vehicle_raptor_pitchlimit 35
+
+set g_vehicle_raptor_speed_forward 900
+set g_vehicle_raptor_speed_strafe  700
+set g_vehicle_raptor_speed_up      500
+set g_vehicle_raptor_speed_down    800
+set g_vehicle_raptor_friction      0.7
+
+set g_vehicle_raptor_bomblets           8
+set g_vehicle_raptor_bomblet_alt        750
+set g_vehicle_raptor_bomblet_time       0.5
+set g_vehicle_raptor_bomblet_spread     0.4
+set g_vehicle_raptor_bomblet_damage     50
+set g_vehicle_raptor_bomblet_edgedamage 20
+set g_vehicle_raptor_bomblet_radius     310
+set g_vehicle_raptor_bomblet_force      150
+set g_vehicle_raptor_bomblet_explode_delay 0.4
+set g_vehicle_raptor_bombs_refire       5
+
+set g_vehicle_raptor_cannon_turnspeed 90
+set g_vehicle_raptor_cannon_turnlimit 20
+set g_vehicle_raptor_cannon_pitchlimit_up   12
+set g_vehicle_raptor_cannon_pitchlimit_down 32
+
+set g_vehicle_raptor_cannon_locktarget          1
+set g_vehicle_raptor_cannon_locking_time        0.4
+set g_vehicle_raptor_cannon_locking_releasetime 1.6
+set g_vehicle_raptor_cannon_locked_time         5
+set g_vehicle_raptor_cannon_predicttarget       1
+
+set g_vehicle_raptor_cannon_cost     1
+set g_vehicle_raptor_cannon_damage   25
+set g_vehicle_raptor_cannon_radius   60
+set g_vehicle_raptor_cannon_refire   0.05
+set g_vehicle_raptor_cannon_speed    12000
+set g_vehicle_raptor_cannon_spread   0.01
+set g_vehicle_raptor_cannon_force    50
+
+set g_vehicle_raptor_energy             30
+set g_vehicle_raptor_energy_regen       15
+set g_vehicle_raptor_energy_regen_pause 0.8
+
+set g_vehicle_raptor_health             150
+set g_vehicle_raptor_health_regen       0
+set g_vehicle_raptor_health_regen_pause 0
+
+set g_vehicle_raptor_shield             120
+set g_vehicle_raptor_shield_regen       25
+set g_vehicle_raptor_shield_regen_pause 1.5
+
+set g_vehicle_raptor_mass              2200
index d25ce205bcb7164ea0893ead6d0e955f9f4be24b..10a09454c65577f19a249219a7144bf25324ce67 100644 (file)
@@ -1,47 +1,60 @@
-set g_vehicle_spiderbot_respawntime                      30
-set g_vehicle_spiderbot_health                875
-set g_vehicle_spiderbot_health_regen             10
-set g_vehicle_spiderbot_health_regen_dmgpause 10
+set g_vehicle_spiderbot_respawntime                      45
 
-set g_vehicle_spiderbot_shield                125
+set g_vehicle_spiderbot_health                850
+set g_vehicle_spiderbot_health_regen             15
+set g_vehicle_spiderbot_health_regen_pause    10
+
+set g_vehicle_spiderbot_shield                150
 set g_vehicle_spiderbot_shield_block          1
 set g_vehicle_spiderbot_shield_regen          25
-set g_vehicle_spiderbot_shield_regen_dmgpause 0.25
+set g_vehicle_spiderbot_shield_regen_pause    0.2
+
+set g_vehicle_spiderbot_energy              0
+set g_vehicle_spiderbot_energy_regen        0
+set g_vehicle_spiderbot_energy_regen_pause  0
 
-set g_vehicle_spiderbot_turnspeed            90
+set g_vehicle_spiderbot_turnspeed            180
 set g_vehicle_spiderbot_head_turnspeed       120
 set g_vehicle_spiderbot_head_turnlimit       120
-set g_vehicle_spiderbot_head_pitchspeed      60
-set g_vehicle_spiderbot_head_pitchlimit_up   8
-set g_vehicle_spiderbot_head_pitchlimit_down -24
+set g_vehicle_spiderbot_head_pitchspeed      70
+set g_vehicle_spiderbot_head_pitchlimit_up   24
+set g_vehicle_spiderbot_head_pitchlimit_down -16
 
 set g_vehicle_spiderbot_speed_stop         50
 set g_vehicle_spiderbot_speed_walk         400
 set g_vehicle_spiderbot_speed_strafe       300
 set g_vehicle_spiderbot_movement_inertia   0.25
 
-set g_vehicle_spiderbot_minigun_damage         25
+set g_vehicle_spiderbot_minigun_damage         16
 set g_vehicle_spiderbot_minigun_spread         0.015
 set g_vehicle_spiderbot_minigun_speed          50000
 set g_vehicle_spiderbot_minigun_refire         0.05
+set g_vehicle_spiderbot_minigun_ammo_cost      1
+set g_vehicle_spiderbot_minigun_ammo_max       200
+set g_vehicle_spiderbot_minigun_ammo_regen     15
+set g_vehicle_spiderbot_minigun_ammo_regen_pause 1
 
-set g_vehicle_spiderbot_minigun_heat           10
-set g_vehicle_spiderbot_minigun_cooldown       10
+set g_vehicle_spiderbot_springlength         150
+set g_vehicle_spiderbot_springup             5
+set g_vehicle_spiderbot_springblend         0.15
 
 set g_vehicle_spiderbot_rocket_health     100
 set g_vehicle_spiderbot_rocket_damage     75
 set g_vehicle_spiderbot_rocket_edgedamage 15
 set g_vehicle_spiderbot_rocket_force      150
 set g_vehicle_spiderbot_rocket_radius     150
-set g_vehicle_spiderbot_rocket_reload     2.5
-set g_vehicle_spiderbot_rocket_refire     0.15
-set g_vehicle_spiderbot_rocket_speed      900
-set g_vehicle_spiderbot_rocket_turnrate   0.25
-set g_vehicle_spiderbot_rocket_noise      0.25
+set g_vehicle_spiderbot_rocket_reload     4
+set g_vehicle_spiderbot_rocket_refire     0.2
+set g_vehicle_spiderbot_rocket_speed      1750
+set g_vehicle_spiderbot_rocket_turnrate   0.2
+set g_vehicle_spiderbot_rocket_noise      0.3
 set g_vehicle_spiderbot_rocket_lifetime   30
 
 set g_vehicle_spiderbot_crush_dmg         50
 set g_vehicle_spiderbot_crush_force       50
 
+set g_vehicle_spiderbot_mass              5000
+
+
 set cl_vehicle_spiderbot_cross_alpha 0.4
 set cl_vehicle_spiderbot_cross_size  1
diff --git a/vehicles.cfg b/vehicles.cfg
new file mode 100644 (file)
index 0000000..e002321
--- /dev/null
@@ -0,0 +1,19 @@
+set g_vehicles 1
+
+exec vehicle_racer.cfg
+exec vehicle_raptor.cfg
+exec vehicle_spiderbot.cfg
+exec vehicle_bumblebee.cfg
+
+//set g_vehicle_racer_respawntime     10
+//set g_vehicle_spiderbot_respawntime 10
+//set g_vehicle_raptor_respawntime    10
+
+set g_vehicles_crush_dmg 70
+set g_vehicles_crush_force 50
+
+set cl_vehicles_hudscale 0.5way
+
+set g_vehicles_delayspawn 1
+set g_vehicles_delayspawn_jitter 10
+set g_vehicles_allow_flagcarry 1
index 2a17bfb0789fdd460ed6e0b217a2c46a70b72a1f..462378e9b78065a0fa4594a7a9bf41dd8db2a9ed 100644 (file)
@@ -84,6 +84,7 @@ Lord Canistra
 Nikoli
 
 **Active Contributors
+Ant "Antibody" Zucaro
 Antonio "terencehill" Piu
 Ben "MooKow" Banker
 Calinou