]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Merge branch 'master' into TimePath/features/jetpack_jump
authorTimePath <andrew.hardaker1995@gmail.com>
Wed, 24 Dec 2014 03:43:49 +0000 (14:43 +1100)
committerTimePath <andrew.hardaker1995@gmail.com>
Wed, 24 Dec 2014 03:43:49 +0000 (14:43 +1100)
Conflicts:
qcsrc/server/cl_physics.qc

39 files changed:
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
qcsrc/common/notifications.qh
qcsrc/common/weapons/w_arc.qc
qcsrc/common/weapons/w_minelayer.qc
qcsrc/common/weapons/w_porto.qc
qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.c
qcsrc/menu/xonotic/dialog_settings.c
qcsrc/menu/xonotic/dialog_settings_audio.c
qcsrc/menu/xonotic/dialog_settings_effects.c
qcsrc/menu/xonotic/dialog_settings_game.c
qcsrc/menu/xonotic/dialog_settings_input.c
qcsrc/menu/xonotic/dialog_settings_misc.c
qcsrc/menu/xonotic/dialog_settings_user.c
qcsrc/menu/xonotic/dialog_settings_video.c
qcsrc/server/cl_client.qc
qcsrc/server/cl_physics.qc
qcsrc/server/command/cmd.qc
qcsrc/server/command/sv_cmd.qc
qcsrc/server/g_triggers.qc
qcsrc/server/item_key.qc
qcsrc/server/mutators/gamemode_assault.qc
qcsrc/server/mutators/gamemode_onslaught.qc
qcsrc/server/mutators/mutator_superspec.qc
qcsrc/server/playerstats.qc [deleted file]
qcsrc/server/t_items.qc
qcsrc/server/t_plats.qc
sound/weapons/arc_fire.ogg [new file with mode: 0644]
sound/weapons/arc_loop.ogg [new file with mode: 0644]
sound/weapons/arc_loop_overheat.ogg [new file with mode: 0644]
sound/weapons/arc_stop.ogg [new file with mode: 0644]
xonotic-credits.txt

index c899cbbcfb8ba31d605252323c4692cd187d9d8e..cbb8014bc0a0983e99e5fb943c746e09d73e76ee 100644 (file)
@@ -1228,8 +1228,6 @@ volume 1
 // sucks less than the old one
 cl_decals_newsystem 1
 
-seta cl_cubemaps_extra 1
-
 set sv_q3acompat_machineshotgunswap 0 "shorthand for swapping machinegun and shotgun (for Q3A map compatibility in mapinfo files)"
 
 set g_movement_highspeed 1 "movement speed modification factor (only changes movement when above maxspeed)"
index ea5b3f731732e340117acd6c45ee97a6c3134f0d..d9874d909f8a2a44301d86da7e2f33e0563d4a02 100644 (file)
@@ -9041,15 +9041,6 @@ effect arc_lightning // impact sparks (underwater)
        airfriction 5
        liquidfriction 5
 
-effect arc_beam // beam core
-       type beam
-       countabsolute 1
-       tex 200 200
-       color 0xFFFFFF 0xFFFFFF
-       size 4 4
-       alpha 512 512 0
-       time 0.005 0.005
-
 effect arc_beam // sparks on beam
        type spark
        stretchfactor 1
index e8b15b429044a51a763aa5e719dae53ee36af06f..a514ce5cb67d9f2eb563ff8d4220d3a510ee61f7 100644 (file)
@@ -6,7 +6,6 @@ cl_particles_quality 1.0
 cl_damageeffect 1
 cl_spawn_point_particles 1
 cl_playerdetailreduction 4.0
-cl_cubemaps_extra 1
 gl_flashblend 0
 gl_picmip -1
 mod_q3bsp_nolightmaps 0
index d079d5fc44ddc8f97e37f6206aaf293d5cc2e5a9..b7e9a98a3a7a78fa396023d1f3fe615cd4cb4c4a 100644 (file)
@@ -6,7 +6,6 @@ cl_particles_quality 0.4
 cl_damageeffect 0
 cl_spawn_point_particles 0
 cl_playerdetailreduction 4
-cl_cubemaps_extra 0
 gl_flashblend 1
 gl_picmip 1
 mod_q3bsp_nolightmaps 1
index 84df44948e2e4b602f96c4db88e07c60fefb1b3f..66eed5aa5d55dc897c6cd748848cd5ed82cb3efe 100644 (file)
@@ -6,7 +6,6 @@ cl_particles_quality 0.8
 cl_damageeffect 0
 cl_spawn_point_particles 0
 cl_playerdetailreduction 4
-cl_cubemaps_extra 0
 gl_flashblend 0
 gl_picmip 0
 mod_q3bsp_nolightmaps 0
index 27756437effdb9292acc2b070a844a6f6deea0f5..63dcd134a066f0c4255c4ad380f085249e177d0a 100644 (file)
@@ -6,7 +6,6 @@ cl_particles_quality 1.0
 cl_damageeffect 1
 cl_spawn_point_particles 1
 cl_playerdetailreduction 4
-cl_cubemaps_extra 0
 gl_flashblend 0
 gl_picmip 0
 mod_q3bsp_nolightmaps 0
index 79f2b6f1794318f208a39f0ab1a57bc51a6b6019..9018ee2c94375ba8740fa35f3357f55ff1d3cf15 100644 (file)
@@ -6,7 +6,6 @@ cl_particles_quality 0.4
 cl_damageeffect 0
 cl_spawn_point_particles 0
 cl_playerdetailreduction 4
-cl_cubemaps_extra 0
 gl_flashblend 1
 gl_picmip 1337
 mod_q3bsp_nolightmaps 1
index bbe0fcc611887c89216813ac4ff4cf18a56778f8..0cf3a899cbcebf5fa385a66ffd3fc07f326ca3c0 100644 (file)
@@ -6,7 +6,6 @@ cl_particles_quality 1.0
 cl_damageeffect 2
 cl_spawn_point_particles 1
 cl_playerdetailreduction 0
-cl_cubemaps_extra 1
 gl_flashblend 0
 gl_picmip -1
 mod_q3bsp_nolightmaps 0
index 249a13447cdcfa3a3b03e25561956701e28f3c50..5909f3b83dc956b18141d4c0111b251c60080813 100644 (file)
@@ -6,7 +6,6 @@ cl_particles_quality 1.0
 cl_damageeffect 2
 cl_spawn_point_particles 1
 cl_playerdetailreduction 0
-cl_cubemaps_extra 1
 gl_flashblend 0
 gl_picmip -1
 mod_q3bsp_nolightmaps 0
index a17f703ff5fb5d76247e75acb37e58e8a42ee21e..0bfd2e5f3075f60746f5160b137ece590c4f43cc 100644 (file)
@@ -340,6 +340,11 @@ void Send_Notification_WOCOVA(
 
 #define MSG_INFO_NOTIFICATIONS \
     MSG_INFO_NOTIF(2, INFO_CHAT_NOSPECTATORS,              0, 0, "", "",                            "",                     _("^F4NOTE: ^BGSpectator chat is not sent to players during the match"), "") \
+    MSG_INFO_NOTIF(2, INFO_COINTOSS,                       1, 0, "s1", "",                          "",                     _("^F2Throwing coin... Result: %s^F2!"), "") \
+    MSG_INFO_NOTIF(1, INFO_JETPACK_NOFUEL,                 0, 0, "", "",                            "",                     _("^BGYou don't have any fuel for the ^F1Jetpack"), "") \
+    MSG_INFO_NOTIF(2, INFO_SUPERSPEC_MISSING_UID,          0, 0, "", "",                            "",                     _("^F2You lack a UID, superspec options will not be saved/restored"), "") \
+    MSG_INFO_NOTIF(1, INFO_CA_JOIN_LATE,                   0, 0, "", "",                            "",                     _("^F1Round already started, you will join the game in the next round"), "") \
+    MSG_INFO_NOTIF(1, INFO_CA_LEAVE,                       0, 0, "", "",                            "",                     _("^F2You will spectate in the next round"), "") \
     MULTITEAM_INFO(1, INFO_CTF_CAPTURE_, 2,                1, 0, "s1", "s1",                        "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag"), "") \
     MULTITEAM_INFO(1, INFO_CTF_CAPTURE_BROKEN_, 2,         2, 2, "s1 f1p2dec s2 f2p2dec", "s1",     "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds, breaking ^BG%s^BG's previous record of ^F2%s^BG seconds"), "") \
     MULTITEAM_INFO(1, INFO_CTF_CAPTURE_TIME_, 2,           1, 1, "s1 f1p2dec", "s1",                "notify_%s_captured",   _("^BG%s^BG captured the ^TC^TT^BG flag in ^F1%s^BG seconds"), "") \
@@ -438,8 +443,6 @@ void Send_Notification_WOCOVA(
     MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VH_WAKI_ROCKET,      2, 1, "s1 s2loc spree_lost", "s1",       "notify_death",         _("^BG%s^K1 couldn't find shelter from a Racer rocket%s%s"), "") \
     MSG_INFO_NOTIF(1, INFO_DEATH_SELF_VOID,                2, 1, "s1 s2loc spree_lost", "s1",       "notify_void",          _("^BG%s^K1 was in the wrong place%s%s"), "") \
     MULTITEAM_INFO(1, INFO_DEATH_TEAMKILL_, 4,             3, 1, "s1 s2 s3loc spree_end", "s2 s1",  "notify_teamkill_%s",   _("^BG%s^K1 was betrayed by ^BG%s^K1%s%s"), "") \
-    MSG_INFO_NOTIF(1, INFO_CA_JOIN_LATE,                   0, 0, "", "",                            "",                     _("^F1Round already started, you will join the game in the next round"), "") \
-    MSG_INFO_NOTIF(1, INFO_CA_LEAVE,                       0, 0, "", "",                            "",                     _("^F2You will spectate in the next round"), "") \
     MSG_INFO_NOTIF(1, INFO_DOMINATION_CAPTURE_TIME,        2, 2, "s1 s2 f1 f2", "",                 "",                     _("^BG%s^BG%s^BG (%s points every %s seconds)"), "") \
     MSG_INFO_NOTIF(1, INFO_FREEZETAG_FREEZE,               2, 0, "s1 s2", "",                       "",                     _("^BG%s^K1 was frozen by ^BG%s"), "") \
     MSG_INFO_NOTIF(1, INFO_FREEZETAG_REVIVED,              2, 0, "s1 s2", "",                       "",                     _("^BG%s^K3 was revived by ^BG%s"), "") \
@@ -530,6 +533,7 @@ void Send_Notification_WOCOVA(
     MSG_INFO_NOTIF(1, INFO_WEAPON_KLEINBOTTLE_SUICIDE,           2, 1, "s1 s2loc spree_lost", "s1",                 "weapontuba",             _("^BG%s^K1 hurt their own ears with the @!#%%'n Klein Bottle%s%s"), "") \
     MSG_INFO_NOTIF(1, INFO_WEAPON_MACHINEGUN_MURDER_SNIPE,       3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponuzi",              _("^BG%s%s^K1 was sniped by ^BG%s^K1's Machine Gun%s%s"), "") \
     MSG_INFO_NOTIF(1, INFO_WEAPON_MACHINEGUN_MURDER_SPRAY,       3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponuzi",              _("^BG%s%s^K1 was riddled full of holes by ^BG%s^K1's Machine Gun%s%s"), "") \
+    MSG_INFO_NOTIF(1, INFO_WEAPON_MINELAYER_LIMIT,               0, 1, "f1", "",                                    "",                       _("^BGYou cannot place more than ^F2%s^BG mines at a time"), "") \
     MSG_INFO_NOTIF(1, INFO_WEAPON_MINELAYER_MURDER,              3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weaponminelayer",        _("^BG%s%s^K1 got too close to ^BG%s^K1's mine%s%s"), "") \
     MSG_INFO_NOTIF(1, INFO_WEAPON_MINELAYER_SUICIDE,             2, 1, "s1 s2loc spree_lost", "s1",                 "weaponminelayer",        _("^BG%s^K1 forgot about their mine%s%s"), "") \
     MSG_INFO_NOTIF(1, INFO_WEAPON_MORTAR_MURDER_BOUNCE,          3, 2, "spree_inf s1 s2 s3loc spree_end", "s2 s1",  "weapongrenadelauncher",  _("^BG%s%s^K1 got too close to ^BG%s^K1's Mortar grenade%s%s"), "") \
@@ -583,6 +587,7 @@ void Send_Notification_WOCOVA(
     MSG_CENTER_NOTIF(1, CENTER_ROUND_TIED,                  0, 0, "",             CPID_ROUND,          "0 0", _("^BGRound tied"), "") \
     MSG_CENTER_NOTIF(1, CENTER_ROUND_OVER,                  0, 0, "",             CPID_ROUND,          "0 0", _("^BGRound over, there's no winner"), "") \
     MSG_CENTER_NOTIF(1, CENTER_CAMPCHECK,                   0, 0, "",             CPID_CAMPCHECK,      "0 0", _("^F2Don't camp!"), "") \
+    MSG_CENTER_NOTIF(1, CENTER_COINTOSS,                    1, 0, "s1",           NO_CPID,             "0 0", _("^F2Throwing coin... Result: %s^F2!"), "") \
     MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_FREE,      0, 0, "",             CPID_CTF_CAPSHIELD,  "0 0", _("^BGYou are now free.\n^BGFeel free to ^F2try to capture^BG the flag again\n^BGif you think you will succeed."), "") \
     MSG_CENTER_NOTIF(1, CENTER_CTF_CAPTURESHIELD_SHIELDED,  0, 0, "",             CPID_CTF_CAPSHIELD,  "0 0", _("^BGYou are now ^F1shielded^BG from the flag\n^BGfor ^F2too many unsuccessful attempts^BG to capture.\n^BGMake some defensive scores before trying again."), "") \
     MULTITEAM_CENTER(1, CENTER_CTF_CAPTURE_, 2,             0, 0, "",             CPID_CTF_LOWPRIO,    "0 0", _("^BGYou captured the ^TC^TT^BG flag!"), "") \
@@ -684,6 +689,7 @@ void Send_Notification_WOCOVA(
     MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_SCAN,                0, 1, "",              CPID_KEYHUNT_OTHER,    "f1 0", _("^BGScanning frequency range..."), "") \
     MULTITEAM_CENTER(1, CENTER_KEYHUNT_START_, 4,           0, 0, "",              CPID_KEYHUNT,          "0 0", _("^BGYou are starting with the ^TC^TT Key"), "") \
     MSG_CENTER_NOTIF(1, CENTER_KEYHUNT_WAIT,                0, 1, "missing_teams", CPID_KEYHUNT_OTHER,    "0 0", _("^BGWaiting for players to join...\nNeed active players for: %s"), "") \
+    MSG_CENTER_NOTIF(1, CENTER_LMS_NOLIVES,                 0, 0, "",              CPID_LMS,              "0 0", _("^BGYou have no lives left, you must wait until the next match"), "") \
     MSG_CENTER_NOTIF(1, CENTER_MISSING_TEAMS,               0, 1, "missing_teams", CPID_MISSING_TEAMS,    "-1 0", _("^BGWaiting for players to join...\nNeed active players for: %s"), "") \
     MSG_CENTER_NOTIF(1, CENTER_MISSING_PLAYERS,             0, 1, "f1",            CPID_MISSING_PLAYERS,  "-1 0", _("^BGWaiting for %s player(s) to join..."), "") \
     MSG_CENTER_NOTIF(1, CENTER_INSTAGIB_FINDAMMO,           0, 0, "",              CPID_INSTAGIB_FINDAMMO,"1 9", _("^F4^COUNT^BG left to find some ammo!"), "") \
@@ -693,8 +699,13 @@ void Send_Notification_WOCOVA(
     MSG_CENTER_NOTIF(1, CENTER_NIX_COUNTDOWN,               0, 2, "item_wepname",  CPID_NIX,              "1 f2", _("^F2^COUNT^BG until weapon change...\nNext weapon: ^F1%s"), "") \
     MSG_CENTER_NOTIF(1, CENTER_NIX_NEWWEAPON,               0, 1, "item_wepname",  CPID_NIX,              "0 0", _("^F2Active weapon: ^F1%s"), "") \
     MSG_CENTER_NOTIF(1, CENTER_NADE,                        0, 0, "",              NO_CPID,               "0 0", _("^BGPress ^F2DROPWEAPON^BG again to toss the grenade!"), "") \
+    MSG_CENTER_NOTIF(1, CENTER_ONS_NOTSHIELDED,             0, 0, "",              CPID_ONSLAUGHT,        "0 0", _("^K1Your generator is NOT shielded!\n^BGRe-capture controlpoints to shield it!"), "") \
     MSG_CENTER_NOTIF(1, CENTER_OVERTIME_FRAG,               0, 0, "",              CPID_OVERTIME,         "0 0", _("^F2Now playing ^F4OVERTIME^F2!\nKeep fragging until we have a winner!"), _("^F2Now playing ^F4OVERTIME^F2!\nKeep scoring until we have a winner!")) \
+    MSG_CENTER_NOTIF(1, CENTER_OVERTIME_CONTROLPOINT,       0, 0, "",              CPID_OVERTIME,         "5 0", _("^F2Now playing ^F4OVERTIME^F2!\n\nGenerators are now decaying.\nThe more control points your team holds,\nthe faster the enemy generator decays"), "") \
     MSG_CENTER_NOTIF(1, CENTER_OVERTIME_TIME,               0, 1, "f1time",        CPID_OVERTIME,         "0 0", _("^F2Now playing ^F4OVERTIME^F2!\n^BGAdded ^F4%s^BG to the game!"), "") \
+    MSG_CENTER_NOTIF(1, CENTER_PORTO_CREATED_IN,            0, 0, "",              NO_CPID,               "0 0", _("^K1In^BG-portal created"), "") \
+    MSG_CENTER_NOTIF(1, CENTER_PORTO_CREATED_OUT,           0, 0, "",              NO_CPID,               "0 0", _("^F3Out^BG-portal created"), "") \
+    MSG_CENTER_NOTIF(1, CENTER_PORTO_FAILED,                0, 0, "",              NO_CPID,               "0 0", _("^K1Portal deployment failed.\n\n^F2Catch it to try again!"), "") \
     MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_INVISIBILITY,      0, 0, "",              CPID_POWERUP,          "0 0", _("^F2Invisibility has worn off"), "") \
     MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_SHIELD,            0, 0, "",              CPID_POWERUP,          "0 0", _("^F2Shield has worn off"), "") \
     MSG_CENTER_NOTIF(1, CENTER_POWERDOWN_SPEED,             0, 0, "",              CPID_POWERUP,          "0 0", _("^F2Speed has worn off"), "") \
@@ -716,7 +727,8 @@ void Send_Notification_WOCOVA(
     MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_SPECTATE,         0, 1, "",              CPID_TEAMCHANGE,       "1 f1", _("^K1Spectating in ^COUNT"), "") \
     MSG_CENTER_NOTIF(1, CENTER_TEAMCHANGE_SUICIDE,          0, 1, "",              CPID_TEAMCHANGE,       "1 f1", _("^K1Suicide in ^COUNT"), "") \
     MSG_CENTER_NOTIF(1, CENTER_TIMEOUT_BEGINNING,           0, 1, "",              CPID_TIMEOUT,          "1 f1", _("^F4Timeout begins in ^COUNT"), "") \
-    MSG_CENTER_NOTIF(1, CENTER_TIMEOUT_ENDING,              0, 1, "",              CPID_TIMEOUT,          "1 f1", _("^F4Timeout ends in ^COUNT"), "")
+    MSG_CENTER_NOTIF(1, CENTER_TIMEOUT_ENDING,              0, 1, "",              CPID_TIMEOUT,          "1 f1", _("^F4Timeout ends in ^COUNT"), "") \
+    MSG_CENTER_NOTIF(1, CENTER_WEAPON_MINELAYER_LIMIT,      0, 1, "f1",            NO_CPID,               "0 0",  _("^BGYou cannot place more than ^F2%s^BG mines at a time"), "") 
 
 #define MULTITEAM_MULTI2(default,prefix,anncepre,infopre,centerpre) \
     MSG_MULTI_NOTIF(default, prefix##RED, anncepre##RED, infopre##RED, centerpre##RED) \
@@ -825,6 +837,7 @@ void Send_Notification_WOCOVA(
     MSG_MULTI_NOTIF(1, ITEM_WEAPON_NOAMMO,                   NO_MSG,        INFO_ITEM_WEAPON_NOAMMO,                   CENTER_ITEM_WEAPON_NOAMMO) \
     MSG_MULTI_NOTIF(1, ITEM_WEAPON_PRIMORSEC,                NO_MSG,        INFO_ITEM_WEAPON_PRIMORSEC,                CENTER_ITEM_WEAPON_PRIMORSEC) \
     MSG_MULTI_NOTIF(1, ITEM_WEAPON_UNAVAILABLE,              NO_MSG,        INFO_ITEM_WEAPON_UNAVAILABLE,              CENTER_ITEM_WEAPON_UNAVAILABLE) \
+    MSG_MULTI_NOTIF(1, MULTI_COINTOSS,                       NO_MSG,        INFO_COINTOSS,                             CENTER_COINTOSS) \
     MSG_MULTI_NOTIF(1, MULTI_COUNTDOWN_BEGIN,                ANNCE_BEGIN,   NO_MSG,                                    CENTER_COUNTDOWN_BEGIN) \
     MSG_MULTI_NOTIF(1, MULTI_INSTAGIB_FINDAMMO,              ANNCE_NUM_10,  NO_MSG,                                    CENTER_INSTAGIB_FINDAMMO_FIRST) \
     MSG_MULTI_NOTIF(1, WEAPON_ACCORDEON_MURDER,              NO_MSG,        INFO_WEAPON_ACCORDEON_MURDER,              NO_MSG) \
@@ -858,6 +871,7 @@ void Send_Notification_WOCOVA(
     MSG_MULTI_NOTIF(1, WEAPON_KLEINBOTTLE_SUICIDE,           NO_MSG,        INFO_WEAPON_KLEINBOTTLE_SUICIDE,           CENTER_DEATH_SELF_GENERIC) \
     MSG_MULTI_NOTIF(1, WEAPON_MACHINEGUN_MURDER_SNIPE,       NO_MSG,        INFO_WEAPON_MACHINEGUN_MURDER_SNIPE,       NO_MSG) \
     MSG_MULTI_NOTIF(1, WEAPON_MACHINEGUN_MURDER_SPRAY,       NO_MSG,        INFO_WEAPON_MACHINEGUN_MURDER_SPRAY,       NO_MSG) \
+    MSG_MULTI_NOTIF(1, WEAPON_MINELAYER_LIMIT,               NO_MSG,        INFO_WEAPON_MINELAYER_LIMIT,               CENTER_WEAPON_MINELAYER_LIMIT) \
     MSG_MULTI_NOTIF(1, WEAPON_MINELAYER_MURDER,              NO_MSG,        INFO_WEAPON_MINELAYER_MURDER,              NO_MSG) \
     MSG_MULTI_NOTIF(1, WEAPON_MINELAYER_SUICIDE,             NO_MSG,        INFO_WEAPON_MINELAYER_SUICIDE,             CENTER_DEATH_SELF_GENERIC) \
     MSG_MULTI_NOTIF(1, WEAPON_MORTAR_MURDER_BOUNCE,          NO_MSG,        INFO_WEAPON_MORTAR_MURDER_BOUNCE,          NO_MSG) \
index 83cd7975534c0f93b578079db99f35027a4f3853..80fcf5524b15afed5294ed374eac22bfa73bef48 100644 (file)
@@ -264,7 +264,7 @@ void W_Arc_Beam_Think(void)
                        {
                                pointparticles( particleeffectnum("arc_overheat"), 
                                        self.beam_start, self.beam_wantdir, 1 );
-                               sound(self, CH_WEAPON_A, "weapons/strength_fire.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_WEAPON_A, "weapons/arc_stop.wav", VOL_BASE, ATTN_NORM);
                        }
                }
                
@@ -577,7 +577,7 @@ void W_Arc_Beam(float burst)
        // only play fire sound if 1 sec has passed since player let go the fire button
        if(time - self.beam_prev > 1)
        {
-               sound(self, CH_WEAPON_A, "weapons/lgbeam_fire.wav", VOL_BASE, ATTN_NORM);
+               sound(self, CH_WEAPON_A, "weapons/arc_fire.wav", VOL_BASE, ATTN_NORM);
        }
 
        entity beam = self.arc_beam = spawn();
@@ -613,7 +613,7 @@ void Arc_Smoke()
                        if ( !self.arc_smoke_sound )
                        {
                                self.arc_smoke_sound = 1;
-                               sound(self, CH_SHOTS_SINGLE, "weapons/gauntletbeam_fly.wav", VOL_BASE, ATTN_NORM);
+                               sound(self, CH_SHOTS_SINGLE, "weapons/arc_loop_overheat.wav", VOL_BASE, ATTN_NORM);
                        }
                }
        }
@@ -697,6 +697,7 @@ float W_Arc(float req)
                        
                        if(self.arc_BUTTON_ATCK_prev != 0)
                        {
+                               sound(self, CH_WEAPON_A, "weapons/arc_stop.wav", VOL_BASE, ATTN_NORM);
                                weapon_thinkf(WFRAME_FIRE1, WEP_CVAR(arc, beam_animtime), w_ready);
                                ATTACK_FINISHED(self) = time + WEP_CVAR(arc, beam_refire) * W_WeaponRateFactor();
                        }
@@ -720,9 +721,10 @@ float W_Arc(float req)
                        precache_model("models/weapons/g_arc.md3");
                        precache_model("models/weapons/v_arc.md3");
                        precache_model("models/weapons/h_arc.iqm");
-                       precache_sound("weapons/lgbeam_fire.wav");
-                       precache_sound("weapons/gauntletbeam_fly.wav");
-                       precache_sound("weapons/strength_fire.wav");
+                       precache_sound("weapons/arc_fire.wav");
+                       precache_sound("weapons/arc_loop.wav");
+                       precache_sound("weapons/arc_stop.wav");
+                       precache_sound("weapons/arc_loop_overheat.wav");
                        if(!arc_shotorigin[0])
                        {
                                arc_shotorigin[0] = shotorg_adjust_values(CL_Weapon_GetShotOrg(WEP_ARC), FALSE, FALSE, 1);
@@ -1183,7 +1185,7 @@ void Ent_ReadArcBeam(float isnew)
                self.draw = Draw_ArcBeam;
                self.entremove = Remove_ArcBeam;
                self.move_time = time;
-               loopsound(self, CH_SHOTS_SINGLE, "weapons/lgbeam_fly.wav", VOL_BASE, ATTEN_NORM);
+               loopsound(self, CH_SHOTS_SINGLE, "weapons/arc_loop.wav", VOL_BASE, ATTEN_NORM);
 
                flash = spawn();
                flash.owner = self;
@@ -1274,7 +1276,7 @@ void Ent_ReadArcBeam(float isnew)
                {
                        case ARC_BT_MISS:
                        {
-                               self.beam_color = '-1 -1 1';
+                               self.beam_color = '1 1';
                                self.beam_alpha = 0.5;
                                self.beam_thickness = 8;
                                self.beam_traileffect = particleeffectnum("arc_beam");
@@ -1290,7 +1292,6 @@ void Ent_ReadArcBeam(float isnew)
                                self.beam_muzzlelight[3] = 1;
                                if(self.beam_muzzleeffect >= 0)
                                {
-                                       self.beam_image = "particles/lgbeam";
                                        setmodel(flash, "models/flash.md3");
                                        flash.alpha = self.beam_alpha;
                                        flash.colormod = self.beam_color;
@@ -1300,7 +1301,7 @@ void Ent_ReadArcBeam(float isnew)
                        }
                        case ARC_BT_WALL: // grenadelauncher_muzzleflash healray_muzzleflash
                        {
-                               self.beam_color = '0.5 0.5 1';
+                               self.beam_color = '1 1 1';
                                self.beam_alpha = 0.5;
                                self.beam_thickness = 8;
                                self.beam_traileffect = particleeffectnum("arc_beam");
@@ -1326,7 +1327,7 @@ void Ent_ReadArcBeam(float isnew)
                        }
                        case ARC_BT_HEAL:
                        {
-                               self.beam_color = '0 1 0';
+                               self.beam_color = '1 1 1';
                                self.beam_alpha = 0.5;
                                self.beam_thickness = 8;
                                self.beam_traileffect = particleeffectnum("arc_beam_heal");
@@ -1343,7 +1344,6 @@ void Ent_ReadArcBeam(float isnew)
                                self.beam_image = "particles/lgbeam";
                                if(self.beam_muzzleeffect >= 0)
                                {
-                                       self.beam_image = "particles/lgbeam";
                                        setmodel(flash, "models/flash.md3");
                                        flash.alpha = self.beam_alpha;
                                        flash.colormod = self.beam_color;
@@ -1353,7 +1353,7 @@ void Ent_ReadArcBeam(float isnew)
                        }
                        case ARC_BT_HIT:
                        {
-                               self.beam_color = '1 0 1';
+                               self.beam_color = '1 1 1';
                                self.beam_alpha = 0.5;
                                self.beam_thickness = 8;
                                self.beam_traileffect = particleeffectnum("arc_beam");
@@ -1370,7 +1370,6 @@ void Ent_ReadArcBeam(float isnew)
                                self.beam_image = "particles/lgbeam";
                                if(self.beam_muzzleeffect >= 0)
                                {
-                                       self.beam_image = "particles/lgbeam";
                                        setmodel(flash, "models/flash.md3");
                                        flash.alpha = self.beam_alpha;
                                        flash.colormod = self.beam_color;
@@ -1380,7 +1379,7 @@ void Ent_ReadArcBeam(float isnew)
                        }
                        case ARC_BT_BURST_MISS:
                        {
-                               self.beam_color = '-1 -1 1';
+                               self.beam_color = '1 1';
                                self.beam_alpha = 0.5;
                                self.beam_thickness = 14;
                                self.beam_traileffect = particleeffectnum("arc_beam");
@@ -1395,15 +1394,18 @@ void Ent_ReadArcBeam(float isnew)
                                self.beam_muzzlelight[2] = 1;
                                self.beam_muzzlelight[3] = 1;
                                self.beam_image = "particles/lgbeam";
-                               setmodel(flash, "models/flash.md3");
-                               flash.alpha = self.beam_alpha;
-                               flash.colormod = self.beam_color;
-                               flash.scale = 0.5;
+                               if(self.beam_muzzleeffect >= 0)
+                               {
+                                       setmodel(flash, "models/flash.md3");
+                                       flash.alpha = self.beam_alpha;
+                                       flash.colormod = self.beam_color;
+                                       flash.scale = 0.5;
+                               }
                                break;
                        }
                        case ARC_BT_BURST_WALL:
                        {
-                               self.beam_color = '0.5 0.5 1';
+                               self.beam_color = '1 1 1';
                                self.beam_alpha = 0.5;
                                self.beam_thickness = 14;
                                self.beam_traileffect = particleeffectnum("arc_beam");
@@ -1420,7 +1422,6 @@ void Ent_ReadArcBeam(float isnew)
                                self.beam_image = "particles/lgbeam";
                                if(self.beam_muzzleeffect >= 0)
                                {
-                                       self.beam_image = "particles/lgbeam";
                                        setmodel(flash, "models/flash.md3");
                                        flash.alpha = self.beam_alpha;
                                        flash.colormod = self.beam_color;
@@ -1430,7 +1431,7 @@ void Ent_ReadArcBeam(float isnew)
                        }
                        case ARC_BT_BURST_HEAL:
                        {
-                               self.beam_color = '0 1 0';
+                               self.beam_color = '1 1 1';
                                self.beam_alpha = 0.5;
                                self.beam_thickness = 14;
                                self.beam_traileffect = particleeffectnum("arc_beam_heal");
@@ -1447,7 +1448,6 @@ void Ent_ReadArcBeam(float isnew)
                                self.beam_image = "particles/lgbeam";
                                if(self.beam_muzzleeffect >= 0)
                                {
-                                       self.beam_image = "particles/lgbeam";
                                        setmodel(flash, "models/flash.md3");
                                        flash.alpha = self.beam_alpha;
                                        flash.colormod = self.beam_color;
@@ -1457,7 +1457,7 @@ void Ent_ReadArcBeam(float isnew)
                        }
                        case ARC_BT_BURST_HIT:
                        {
-                               self.beam_color = '1 0 1';
+                               self.beam_color = '1 1 1';
                                self.beam_alpha = 0.5;
                                self.beam_thickness = 14;
                                self.beam_traileffect = particleeffectnum("arc_beam");
@@ -1474,7 +1474,6 @@ void Ent_ReadArcBeam(float isnew)
                                self.beam_image = "particles/lgbeam";
                                if(self.beam_muzzleeffect >= 0)
                                {
-                                       self.beam_image = "particles/lgbeam";
                                        setmodel(flash, "models/flash.md3");
                                        flash.alpha = self.beam_alpha;
                                        flash.colormod = self.beam_color;
@@ -1503,7 +1502,6 @@ void Ent_ReadArcBeam(float isnew)
                                self.beam_image = "particles/lgbeam";
                                if(self.beam_muzzleeffect >= 0)
                                {
-                                       self.beam_image = "particles/lgbeam";
                                        setmodel(flash, "models/flash.md3");
                                        flash.alpha = self.beam_alpha;
                                        flash.colormod = self.beam_color;
@@ -1531,7 +1529,7 @@ float W_Arc(float req)
                }
                case WR_INIT:
                {
-                       precache_sound("weapons/lgbeam_fly.wav");
+                       precache_sound("weapons/arc_loop.wav");
                        return TRUE;
                }
                case WR_ZOOMRETICLE:
index 970192e31c094bd648ff25264bc1373f0a688aa1..2dac41e1badd5a236b30bba74ebddbb4c2b84930 100644 (file)
@@ -318,7 +318,7 @@ void W_MineLayer_Attack(void)
                if(self.minelayer_mines >= WEP_CVAR(minelayer, limit))
                {
                        // the refire delay keeps this message from being spammed
-                       sprint(self, strcat("minelayer: You cannot place more than ^2", ftos(WEP_CVAR(minelayer, limit)), " ^7mines at a time\n") );
+                       Send_Notification(NOTIF_ONE, self, MSG_MULTI, WEAPON_MINELAYER_LIMIT, WEP_CVAR(minelayer, limit));
                        play2(self, "weapons/unavailable.wav");
                        return;
                }
index 49fb47e43e9d7626a31ffc4d5a1f3be82d6e5cd2..e1fb82f8f2bd427a0eb7767e43d5434f5fc7fb7d 100644 (file)
@@ -81,7 +81,7 @@ void W_Porto_Fail(float failhard)
                        if(vlen(trace_endpos - self.realowner.origin) < 128)
                        {
                                W_ThrowNewWeapon(self.realowner, WEP_PORTO, 0, self.origin, self.velocity);
-                               centerprint(self.realowner, "^1Portal deployment failed.\n\n^2Catch it to try again!");
+                               Send_Notification(NOTIF_ONE, self.realowner, MSG_CENTER, CENTER_PORTO_FAILED);
                        }
                }
        }
@@ -157,7 +157,7 @@ void W_Porto_Touch(void)
                {
                        sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTEN_NORM);
                        trace_plane_normal = norm;
-                       centerprint(self.realowner, "^1In^7-portal created.");
+                       Send_Notification(NOTIF_ONE, self.realowner, MSG_CENTER, CENTER_PORTO_CREATED_IN);
                        W_Porto_Success();
                }
                else
@@ -174,7 +174,7 @@ void W_Porto_Touch(void)
                {
                        sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTEN_NORM);
                        trace_plane_normal = norm;
-                       centerprint(self.realowner, "^4Out^7-portal created.");
+                       Send_Notification(NOTIF_ONE, self.realowner, MSG_CENTER, CENTER_PORTO_CREATED_OUT);
                        W_Porto_Success();
                }
                else
@@ -191,7 +191,7 @@ void W_Porto_Touch(void)
                {
                        sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTEN_NORM);
                        trace_plane_normal = norm;
-                       centerprint(self.realowner, "^1In^7-portal created.");
+                       Send_Notification(NOTIF_ONE, self.realowner, MSG_CENTER, CENTER_PORTO_CREATED_IN);
                        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
@@ -212,7 +212,7 @@ void W_Porto_Touch(void)
                        {
                                sound(self, CH_SHOTS, "porto/create.wav", VOL_BASE, ATTEN_NORM);
                                trace_plane_normal = norm;
-                               centerprint(self.realowner, "^4Out^7-portal created.");
+                               Send_Notification(NOTIF_ONE, self.realowner, MSG_CENTER, CENTER_PORTO_CREATED_OUT);
                                W_Porto_Success();
                        }
                        else
index a22cde1af0d70165819a41087f2d7b2d7dfc1ef7..368ac1ca54bd14f237c4064fb99519a497ac7657 100644 (file)
@@ -98,6 +98,8 @@ string XonoticMutatorsDialog_toString(entity me)
                s = strcat(s, ", ", _("Blood loss"));
        if(cvar("g_jetpack"))
                s = strcat(s, ", ", _("Jet pack"));
+       if(cvar("g_buffs"))
+               s = strcat(s, ", ", _("Buffs"));
        if(cvar("g_overkill"))
                s = strcat(s, ", ", _("Overkill"));
        if(cvar("g_powerups") == 0)
@@ -168,6 +170,9 @@ void XonoticMutatorsDialog_fill(entity me)
        me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_cloaked", _("Cloaked")));
+       me.TR(me);
+               me.TDempty(me, 0.2);
+               me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_buffs", _("Buffs")));
        me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 1.8, e = makeXonoticCheckBox(0, "g_midair", _("Midair")));
index f7003b44d1c5ae94504cf0fc8fb7f75c8c8ca6a6..a992e80593e4b14b62b86aa96f683f5d4df4695e 100644 (file)
@@ -4,7 +4,7 @@ CLASS(XonoticSettingsDialog) EXTENDS(XonoticDialog)
        ATTRIB(XonoticSettingsDialog, title, string, _("Settings"))
        ATTRIB(XonoticSettingsDialog, color, vector, SKINCOLOR_DIALOG_SETTINGS)
        ATTRIB(XonoticSettingsDialog, intendedWidth, float, 0.96)
-       ATTRIB(XonoticSettingsDialog, rows, float, 17)
+       ATTRIB(XonoticSettingsDialog, rows, float, 18)
        ATTRIB(XonoticSettingsDialog, columns, float, 6)
 ENDCLASS(XonoticSettingsDialog)
 #endif
index 4db408c7382b3fe9096854507ef55c87d6061bfd..39bee32426c84bd771755266fc67bf3ab9d01e8d 100644 (file)
@@ -3,7 +3,7 @@ CLASS(XonoticAudioSettingsTab) EXTENDS(XonoticTab)
        METHOD(XonoticAudioSettingsTab, fill, void(entity))
        ATTRIB(XonoticAudioSettingsTab, title, string, _("Audio"))
        ATTRIB(XonoticAudioSettingsTab, intendedWidth, float, 0.9)
-       ATTRIB(XonoticAudioSettingsTab, rows, float, 14.5)
+       ATTRIB(XonoticAudioSettingsTab, rows, float, 15.5)
        ATTRIB(XonoticAudioSettingsTab, columns, float, 6.2) // added extra .2 for center space
 ENDCLASS(XonoticAudioSettingsTab)
 entity makeXonoticAudioSettingsTab();
index f6b79eb8f340ec651ffb241b269c55cae4ae8968..59b4860af4c88c1051eaafc5d238b9af7e3572bb 100644 (file)
@@ -3,7 +3,7 @@ CLASS(XonoticEffectsSettingsTab) EXTENDS(XonoticTab)
        METHOD(XonoticEffectsSettingsTab, fill, void(entity))
        ATTRIB(XonoticEffectsSettingsTab, title, string, _("Effects"))
        ATTRIB(XonoticEffectsSettingsTab, intendedWidth, float, 0.9)
-       ATTRIB(XonoticEffectsSettingsTab, rows, float, 14.5)
+       ATTRIB(XonoticEffectsSettingsTab, rows, float, 15.5)
        ATTRIB(XonoticEffectsSettingsTab, columns, float, 6.2) // added extra .2 for center space
 ENDCLASS(XonoticEffectsSettingsTab)
 entity makeXonoticEffectsSettingsTab();
@@ -130,23 +130,22 @@ void XonoticEffectsSettingsTab_fill(entity me)
                        e.configureXonoticTextSliderValues(e);
                        setDependentAND(e, "vid_gl20", 1, 1, "r_water", 1, 1);
        me.TR(me);
-               me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "cl_particles", _("Particles")));
-               me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "cl_spawn_point_particles", _("Spawnpoint effects")));
-                       makeMulti(e, "cl_spawn_event_particles");
-                       setDependent(e, "cl_particles", 1, 1);
+               me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "cl_decals", _("Decals")));
+               me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "cl_decals_models", _("Decals on models")));
+                       setDependent(e, "cl_decals", 1, 1);
        me.TR(me);
-               me.TDempty(me, 0.2);
-               me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Quality:")));
-                       setDependent(e, "cl_particles", 1, 1);
-               me.TD(me, 1, 2, e = makeXonoticParticlesSlider());
-                       setDependent(e, "cl_particles", 1, 1);
-               me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Distance:")));
-                       setDependent(e, "cl_particles", 1, 1);
-               me.TD(me, 1, 2, e = makeXonoticSlider(200, 500, 20, "r_drawparticles_drawdistance"));
-                       setDependent(e, "cl_particles", 1, 1);
-               me.TR(me);
+                       setDependent(e, "cl_decals", 1, 1);
+               me.TD(me, 1, 2, e = makeXonoticSlider(200, 500, 20, "r_drawdecals_drawdistance"));
+                       setDependent(e, "cl_decals", 1, 1);
+       me.TR(me);
+               me.TDempty(me, 0.2);
+               me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Time:")));
+                       setDependent(e, "cl_decals", 1, 1);
+               me.TD(me, 1, 2, e = makeXonoticSlider(1, 20, 1, "cl_decals_fadetime"));
+                       setDependent(e, "cl_decals", 1, 1);
+       me.TR(me);
                me.TDempty(me, 0.2);
                me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Damage effects:")));
                me.TD(me, 1, 2, e = makeXonoticTextSlider("cl_damageeffect"));
@@ -180,7 +179,6 @@ void XonoticEffectsSettingsTab_fill(entity me)
                me.TD(me, 1, 2.8, e = makeXonoticCheckBox(0, "r_coronas_occlusionquery", _("Fade corona according to visibility")));
                        setDependent(e, "r_coronas", 1, 1);
        me.TR(me);
-               me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "cl_cubemaps_extra", _("Extra reflective effects")));
        me.TR(me);
                me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "r_bloom", _("Bloom")));
                me.TD(me, 1, 2, e = makeXonoticCheckBoxEx(0.5, 0, "hud_postprocessing_maxbluralpha", _("Extra postprocessing effects")));
@@ -194,21 +192,22 @@ void XonoticEffectsSettingsTab_fill(entity me)
                me.TD(me, 1, 2, s);
        me.TR(me);
        me.TR(me);
-               me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "cl_decals", _("Decals")));
-               me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "cl_decals_models", _("Decals on models")));
-                       setDependent(e, "cl_decals", 1, 1);
+               me.TD(me, 1, 1, e = makeXonoticCheckBox(0, "cl_particles", _("Particles")));
+               me.TD(me, 1, 2, e = makeXonoticCheckBox(0, "cl_spawn_point_particles", _("Spawnpoint effects")));
+                       makeMulti(e, "cl_spawn_event_particles");
+                       setDependent(e, "cl_particles", 1, 1);
        me.TR(me);
                me.TDempty(me, 0.2);
-               me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Distance:")));
-                       setDependent(e, "cl_decals", 1, 1);
-               me.TD(me, 1, 2, e = makeXonoticSlider(200, 500, 20, "r_drawdecals_drawdistance"));
-                       setDependent(e, "cl_decals", 1, 1);
+               me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Quality:")));
+                       setDependent(e, "cl_particles", 1, 1);
+               me.TD(me, 1, 2, e = makeXonoticParticlesSlider());
+                       setDependent(e, "cl_particles", 1, 1);
        me.TR(me);
                me.TDempty(me, 0.2);
-               me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Time:")));
-                       setDependent(e, "cl_decals", 1, 1);
-               me.TD(me, 1, 2, e = makeXonoticSlider(1, 20, 1, "cl_decals_fadetime"));
-                       setDependent(e, "cl_decals", 1, 1);
+               me.TD(me, 1, 0.8, e = makeXonoticTextLabel(0, _("Distance:")));
+                       setDependent(e, "cl_particles", 1, 1);
+               me.TD(me, 1, 2, e = makeXonoticSlider(200, 500, 20, "r_drawparticles_drawdistance"));
+                       setDependent(e, "cl_particles", 1, 1);
 
        me.gotoRC(me, me.rows - 1, 0);
                me.TD(me, 1, me.columns, makeXonoticCommandButton(_("Apply immediately"), '0 0 0', "vid_restart", COMMANDBUTTON_APPLY));
index b75c1ac49a3617d84aec5ad8e431971a93cf0d26..2f48c2a500a34cc218c450df3cfd11b699c227f6 100644 (file)
@@ -3,7 +3,7 @@ CLASS(XonoticGameSettingsTab) EXTENDS(XonoticTab)
        METHOD(XonoticGameSettingsTab, fill, void(entity))
        ATTRIB(XonoticGameSettingsTab, title, string, _("Game"))
        ATTRIB(XonoticGameSettingsTab, intendedWidth, float, 0.9)
-       ATTRIB(XonoticGameSettingsTab, rows, float, 14.5)
+       ATTRIB(XonoticGameSettingsTab, rows, float, 15.5)
        ATTRIB(XonoticGameSettingsTab, columns, float, 6.5)
 ENDCLASS(XonoticGameSettingsTab)
 entity makeXonoticGameSettingsTab();
@@ -21,7 +21,7 @@ entity makeXonoticGameSettingsTab()
 void XonoticGameSettingsTab_fill(entity me)
 {
        entity mc;
-       mc = makeXonoticTabController(me.rows - 1.5);
+       mc = makeXonoticTabController(me.rows - 2.5);
        
        me.TR(me);
                me.TDempty(me, 0.25);
index 12a662cf9ea74df91c918cb67f5cbaaf50b5e52a..57b6cef630d6e171bb2c31441b26a88338049b02 100644 (file)
@@ -3,7 +3,7 @@ CLASS(XonoticInputSettingsTab) EXTENDS(XonoticTab)
        METHOD(XonoticInputSettingsTab, fill, void(entity))
        ATTRIB(XonoticInputSettingsTab, title, string, _("Input"))
        ATTRIB(XonoticInputSettingsTab, intendedWidth, float, 0.9)
-       ATTRIB(XonoticInputSettingsTab, rows, float, 14.5)
+       ATTRIB(XonoticInputSettingsTab, rows, float, 15.5)
        ATTRIB(XonoticInputSettingsTab, columns, float, 6.2) // added extra .2 for center space
 ENDCLASS(XonoticInputSettingsTab)
 entity makeXonoticInputSettingsTab();
@@ -32,8 +32,8 @@ void XonoticInputSettingsTab_fill(entity me)
        me.TR(me);
                me.TD(me, 1, 3, e = makeXonoticHeaderLabel(_("Key Bindings")));
        me.TR(me);
-               me.TD(me, me.rows - 4, 3, kb);
-       me.gotoRC(me, me.rows - 3, 0);
+               me.TD(me, me.rows - 3, 3, kb);
+       me.gotoRC(me, me.rows - 2, 0);
                me.TD(me, 1, 1, e = makeXonoticButton(_("Change key..."), '0 0 0'));
                        e.onClick = KeyBinder_Bind_Change;
                        e.onClickEntity = kb;
index 1deda87df078a26c24569b2bf1dd6cb54155b1b6..2ea9c1e9c263418960a277dbd04563f0fb351501 100644 (file)
@@ -3,7 +3,7 @@ CLASS(XonoticMiscSettingsTab) EXTENDS(XonoticTab)
        METHOD(XonoticMiscSettingsTab, fill, void(entity))
        ATTRIB(XonoticMiscSettingsTab, title, string, _("Misc"))
        ATTRIB(XonoticMiscSettingsTab, intendedWidth, float, 0.9)
-       ATTRIB(XonoticMiscSettingsTab, rows, float, 14.5)
+       ATTRIB(XonoticMiscSettingsTab, rows, float, 15.5)
        ATTRIB(XonoticMiscSettingsTab, columns, float, 6.2)
 ENDCLASS(XonoticMiscSettingsTab)
 entity makeXonoticMiscSettingsTab();
index b3f888594eae083f767a4a36df28e50843bd0650..180efccb9bdd323ba86ef8cedc490175e46cd233 100644 (file)
@@ -3,7 +3,7 @@ CLASS(XonoticUserSettingsTab) EXTENDS(XonoticTab)
        METHOD(XonoticUserSettingsTab, fill, void(entity))
        ATTRIB(XonoticUserSettingsTab, title, string, _("User"))
        ATTRIB(XonoticUserSettingsTab, intendedWidth, float, 0.9)
-       ATTRIB(XonoticUserSettingsTab, rows, float, 14.5)
+       ATTRIB(XonoticUserSettingsTab, rows, float, 15.5)
        ATTRIB(XonoticUserSettingsTab, columns, float, 6)
 ENDCLASS(XonoticUserSettingsTab)
 entity makeXonoticUserSettingsTab();
index a4e8434136963b3d7c00723f62f325756c81d92d..36929cbd716a669170fb8cd06903ba214e05a69b 100644 (file)
@@ -3,7 +3,7 @@ CLASS(XonoticVideoSettingsTab) EXTENDS(XonoticTab)
        METHOD(XonoticVideoSettingsTab, fill, void(entity))
        ATTRIB(XonoticVideoSettingsTab, title, string, _("Video"))
        ATTRIB(XonoticVideoSettingsTab, intendedWidth, float, 0.9)
-       ATTRIB(XonoticVideoSettingsTab, rows, float, 14.5)
+       ATTRIB(XonoticVideoSettingsTab, rows, float, 15.5)
        ATTRIB(XonoticVideoSettingsTab, columns, float, 6.2) // added extra .2 for center space
        ATTRIB(XonoticVideoSettingsTab, name, string, "videosettings")
 ENDCLASS(XonoticVideoSettingsTab)
index a933990e858facb02b906da9e21462b8aafe1e83..01092c886fd1fb97fe58ec8bfa716367964315ac 100644 (file)
@@ -1562,7 +1562,7 @@ void player_regen (void)
                mina = autocvar_g_balance_armor_regenstable;
                limith = autocvar_g_balance_health_limit;
                limita = autocvar_g_balance_armor_limit;
-               
+
                max_mod = regen_mod_max;
                regen_mod = regen_mod_regen;
                rot_mod = regen_mod_rot;
@@ -1756,7 +1756,6 @@ float SpectateUpdate()
        return 1;
 }
 
-
 float SpectateSet()
 {
        if(self.enemy.classname != "player")
@@ -2627,8 +2626,6 @@ void PlayerPostThink (void)
        }
        */
 
-       //pointparticles(particleeffectnum("machinegun_impact"), self.origin + self.view_ofs + '0 0 7', '0 0 0', 1);
-
        if(self.waypointsprite_attachedforcarrier)
                WaypointSprite_UpdateHealth(self.waypointsprite_attachedforcarrier, '1 0 0' * healtharmor_maxdamage(self.health, self.armorvalue, autocvar_g_balance_armor_blockpercent, DEATH_WEAPON));
 
index 34e3e8f5d2791f7705bb70a24eade0e751a2ebaa..900f65bc8ab3dcbbe698f23ab906e7b5320f7601 100644 (file)
@@ -172,10 +172,10 @@ void CheckPlayerJump()
                if (self.jetpack_stopped) { }
                else if (!has_fuel)
                {
-                       if (was_flying)
-                               sprint(self, "You ran out of fuel for the ^2Jetpack\n");
+                       if (was_flying) // TODO: ran out of fuel message
+                               Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_JETPACK_NOFUEL);
                        else
-                               sprint(self, "You don't have any fuel for the ^2Jetpack\n");
+                               Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_JETPACK_NOFUEL);
                        self.jetpack_stopped = TRUE;
                        self.items &= ~IT_USING_JETPACK;
                }
@@ -1148,6 +1148,10 @@ void SV_PlayerPhysics()
        }
        else if (self.flags & FL_ONGROUND)
        {
+               // we get here if we ran out of ammo
+               if((self.items & IT_JETPACK) && self.BUTTON_HOOK && !(buttons_prev & 32) && self.ammo_fuel < 0.01)
+                       Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_JETPACK_NOFUEL);
+
                // walking
                makevectors(self.v_angle_y * '0 1 0');
                wishvel = v_forward * self.movement_x + v_right * self.movement_y;
@@ -1213,6 +1217,9 @@ void SV_PlayerPhysics()
        else
        {
                float wishspeed0;
+               // we get here if we ran out of ammo
+               if((self.items & IT_JETPACK) && self.BUTTON_HOOK && !(buttons_prev & 32) && self.ammo_fuel < 0.01)
+                       Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_JETPACK_NOFUEL);
 
                if(maxspd_mod < 1)
                {
index 7d67c4f30d621c751f0cb5ed9c627451f9a71a77..898e7db18faf59a78afe5988320a8a21baa02ccb 100644 (file)
@@ -150,7 +150,7 @@ void ClientCommand_join(float request)
                {
                        if(IS_CLIENT(self))
                        {
-                               if(!IS_PLAYER(self) && !lockteams)
+                               if(!IS_PLAYER(self) && !lockteams && !gameover)
                                {
                                        if(self.caplayer)
                                                return;
@@ -468,7 +468,7 @@ void ClientCommand_selectteam(float request, float argc)
                                                                                        GetTeamCounts(self);
                                                                                        if(!TeamSmallerEqThanTeam(Team_TeamToNumber(selection), Team_TeamToNumber(self.team), self))
                                                                                        {
-                                                                                               sprint(self, "Cannot change to a larger/better/shinier team\n");
+                                                                                               Send_Notification(NOTIF_ONE, self, MSG_INFO, INFO_TEAMCHANGE_LARGERTEAM);
                                                                                                return;
                                                                                        }
                                                                                }
index edeb571c0dd62f0ec374699f2ac8c82e37233d01..27ed6b8694e16ce8406b98b76cb7d95f020a19f7 100644 (file)
@@ -478,14 +478,11 @@ void GameCommand_cointoss(float request, float argc)
        {
                case CMD_REQUEST_COMMAND:
                {
-                       entity client;
-                       string result1 = (argv(2) ? strcat("^7", argv(1), "^3!\n") : "^1HEADS^3!\n");
-                       string result2 = (argv(2) ? strcat("^7", argv(2), "^3!\n") : "^4TAILS^3!\n");
+                       string result1 = (argv(2) ? strcat("^7", argv(1)) : "^1HEADS");
+                       string result2 = (argv(2) ? strcat("^7", argv(2)) : "^4TAILS");
                        string choice = ((random() > 0.5) ? result1 : result2);
-
-                       FOR_EACH_CLIENT(client)
-                               centerprint(client, strcat("^3Throwing coin... Result: ", choice));
-                       bprint(strcat("^3Throwing coin... Result: ", choice));
+                       
+                       Send_Notification(NOTIF_ALL, world, MSG_MULTI, MULTI_COINTOSS, choice);
                        return;
                }
 
index 3a7bb364c5e9347eaf60f23cfbb1990eddba70f9..f203fdf4fa1ce3693f747f109e309fa0d200a70e 100644 (file)
@@ -61,14 +61,13 @@ void SUB_UseTargets()
 //
 // print the message
 //
-       if (IS_PLAYER(activator) && self.message != "")
+       if(self)
+       if(IS_PLAYER(activator) && self.message != "")
+       if(IS_REAL_CLIENT(activator))
        {
-               if(IS_REAL_CLIENT(activator))
-               {
-                       centerprint (activator, self.message);
-                       if (self.noise == "")
-                               play2(activator, "misc/talk.wav");
-               }
+               centerprint(activator, self.message);
+               if (self.noise == "")
+                       play2(activator, "misc/talk.wav");
        }
 
 //
@@ -205,8 +204,8 @@ void multi_use()
 
 void multi_touch()
 {
-       if (!(self.spawnflags & 2))
-               if (!other.iscreature)
+       if(!(self.spawnflags & 2))
+       if(!other.iscreature)
                        return;
 
        if(self.team)
@@ -378,32 +377,26 @@ void spawnfunc_trigger_delay()
 
 void counter_use()
 {
-       self.count = self.count - 1;
+       self.count -= 1;
        if (self.count < 0)
                return;
 
-       if (self.count != 0)
+       if (self.count == 0)
        {
-               if (IS_PLAYER(activator)
-               && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0)
-               {
-                       if (self.count >= 4)
-                               centerprint (activator, "There are more to go...");
-                       else if (self.count == 3)
-                               centerprint (activator, "Only 3 more to go...");
-                       else if (self.count == 2)
-                               centerprint (activator, "Only 2 more to go...");
-                       else
-                               centerprint (activator, "Only 1 more to go...");
-               }
-               return;
-       }
+               if(IS_PLAYER(activator) && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0)
+                       Send_Notification(NOTIF_ONE, activator, MSG_CENTER, CENTER_SEQUENCE_COMPLETED);
 
-       if (IS_PLAYER(activator)
-       && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0)
-               centerprint(activator, "Sequence completed!");
-       self.enemy = activator;
-       multi_trigger ();
+               self.enemy = activator;
+               multi_trigger ();
+       }
+       else
+       {
+               if(IS_PLAYER(activator) && (self.spawnflags & SPAWNFLAG_NOMESSAGE) == 0)
+               if(self.count >= 4)
+                       Send_Notification(NOTIF_ONE, activator, MSG_CENTER, CENTER_SEQUENCE_COUNTER);
+               else
+                       Send_Notification(NOTIF_ONE, activator, MSG_CENTER, CENTER_SEQUENCE_COUNTER_FEWMORE, self.count);
+       }
 }
 
 void counter_reset()
@@ -2059,9 +2052,9 @@ string trigger_magicear_processmessage_forallears(entity source, float teamsay,
        for(ear = magicears; ear; ear = ear.enemy)
        {
                msgout = trigger_magicear_processmessage(ear, source, teamsay, privatesay, msgin);
-               if (!(ear.spawnflags & 64))
-                       if(magicear_matched)
-                               return msgout;
+               if(!(ear.spawnflags & 64))
+               if(magicear_matched)
+                       return msgout;
                msgin = msgout;
        }
        return msgin;
index f181f376448761b3aa8ffd169369d62ba84105c2..79003853a6deef93d6ce20e93f5beecfb183518e 100644 (file)
@@ -333,12 +333,12 @@ void trigger_keylock_touch(void) {
                if (key_used) {
                        // one or more keys were given, but others are still missing!
                        play2(other, self.noise1);
-                       centerprint(other, strcat("You also need ", item_keys_keylist(self.itemkeys), "!"));
+                       Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_LOCKED_ALSONEED, item_keys_keylist(self.itemkeys));
                        other.key_door_messagetime = time + 2;
                } else if (other.key_door_messagetime <= time) {
                        // no keys were given
                        play2(other, self.noise2);
-                       centerprint(other, strcat("You need ", item_keys_keylist(self.itemkeys), "!"));
+                       Send_Notification(NOTIF_ONE, other, MSG_CENTER, CENTER_DOOR_LOCKED_NEED, item_keys_keylist(self.itemkeys));
                        other.key_door_messagetime = time + 2;
                }
 
index 1eb2b77cb7d97dca6f1273a3428e51bd57591d6e..8a8c50b38b8ab18ab31f40ee71b1fe39f4119937 100644 (file)
@@ -63,20 +63,13 @@ void assault_objective_decrease_use()
                        PlayerTeamScore_Add(activator, SP_ASSAULT_OBJECTIVES, ST_ASSAULT_OBJECTIVES, 1);
                        self.enemy.health = -1;
 
-                       entity oldself, oldactivator;
+                       entity oldself, oldactivator, head;
 
                        oldself = self;
                        self = oldself.enemy;
                        if(self.message)
-                       {
-                               entity player;
-                               string s;
-                               FOR_EACH_PLAYER(player)
-                               {
-                                       s = strcat(self.message, "\n");
-                                       centerprint(player, s);
-                               }
-                       }
+                       FOR_EACH_PLAYER(head)
+                               centerprint(head, self.message);
 
                        oldactivator = activator;
                        activator = oldself;
@@ -523,9 +516,9 @@ void havocbot_ast_reset_role(entity bot)
 MUTATOR_HOOKFUNCTION(assault_PlayerSpawn)
 {
        if(self.team == assault_attacker_team)
-               centerprint(self, "You are attacking!");
+               Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_ASSAULT_ATTACKING);
        else
-               centerprint(self, "You are defending!");
+               Send_Notification(NOTIF_ONE, self, MSG_CENTER, CENTER_ASSAULT_DEFENDING);
 
        return FALSE;
 }
index dc2398609f1d08e821514e7bd6b51ceaf813a871..74cba2897387862d8893b708cd263c1c8b8c8c69 100644 (file)
@@ -391,8 +391,7 @@ void onslaught_generator_think()
                {
                        if (!overtime_msg_time)
                        {
-                               FOR_EACH_PLAYER(e)
-                                       centerprint(e, "^3Now playing ^1OVERTIME^3!\n^3Generators start now to decay.\n^3The more control points your team holds,\n^3the faster the enemy generator decays.");
+                               Send_Notification(NOTIF_ALL, world, MSG_CENTER, CENTER_OVERTIME_CONTROLPOINT);
                                overtime_msg_time = time;
                        }
                        // self.max_health / 300 gives 5 minutes of overtime.
@@ -423,9 +422,9 @@ void onslaught_generator_think()
             self.wait = time + 5;
             FOR_EACH_REALPLAYER(e)
             {
-                if(e.team == self.team)
+                               if(SAME_TEAM(e, self))
                 {
-                    centerprint(e, "^1Your generator is NOT shielded!\n^7Re-capture controlpoints to shield it!");
+                                       Send_Notification(NOTIF_ONE, e, MSG_CENTER, CENTER_ONS_NOTSHIELDED);
                     soundto(MSG_ONE, e, CHAN_AUTO, "kh/alarm.wav", VOL_BASE, ATTEN_NONE);    // FIXME: Uniqe sound?
                 }
             }
index c323262f069b7a198f7e29ca75b20c4d186408cc..74e17a6a1422fb5b97bb989920dfdb8fa8a13891 100644 (file)
@@ -429,9 +429,7 @@ MUTATOR_HOOKFUNCTION(superspec_BuildMutatorsPrettyString)
 void superspec_hello()
 {
        if(self.enemy.crypto_idfp == "")
-               centerprint(self.enemy, "Your client have/allow no crypto id, superspec options will not be saved/restored.");
-       else
-               centerprint(self.enemy, sprintf("Hello %s\nSince your client has a Crypto ID, your superspec preferences will be persisted on this server.", self.enemy.netname));
+               Send_Notification(NOTIF_ONE_ONLY, self.enemy, MSG_INFO, INFO_SUPERSPEC_MISSING_UID);
 
        remove(self);
 }
diff --git a/qcsrc/server/playerstats.qc b/qcsrc/server/playerstats.qc
deleted file mode 100644 (file)
index 8ba3211..0000000
+++ /dev/null
@@ -1,481 +0,0 @@
-float playerstats_db;
-string teamstats_last;
-string playerstats_last;
-string events_last;
-.float playerstats_addedglobalinfo;
-.string playerstats_id;
-
-// Note that _time isn't mentioned here. That one is special.
-#define ALL_ANTICHEATS \
-       ANTICHEAT("speedhack"); \
-       ANTICHEAT("speedhack_m1"); \
-       ANTICHEAT("speedhack_m2"); \
-       ANTICHEAT("speedhack_m3"); \
-       ANTICHEAT("speedhack_m4"); \
-       ANTICHEAT("speedhack_m5"); \
-       ANTICHEAT("div0_strafebot_old"); \
-       ANTICHEAT("div0_strafebot_new"); \
-       ANTICHEAT("div0_evade"); \
-       ANTICHEAT("idle_snapaim"); \
-       ANTICHEAT("idle_snapaim_signal"); \
-       ANTICHEAT("idle_snapaim_noise"); \
-       ANTICHEAT("idle_snapaim_m2"); \
-       ANTICHEAT("idle_snapaim_m3"); \
-       ANTICHEAT("idle_snapaim_m4"); \
-       ANTICHEAT("idle_snapaim_m7"); \
-       ANTICHEAT("idle_snapaim_m10");
-
-void PlayerStats_Init() // initiated before InitGameplayMode so that scores are added properly
-{
-       string uri;
-       playerstats_db = -1;
-       playerstats_waitforme = TRUE;
-       uri = autocvar_g_playerstats_uri;
-       if(uri == "")
-               return;
-       playerstats_db = db_create();
-       if(playerstats_db >= 0)
-               playerstats_waitforme = FALSE; // must wait for it at match end
-
-       serverflags |= SERVERFLAG_PLAYERSTATS;
-
-       PlayerStats_AddEvent(PLAYERSTATS_ALIVETIME);
-       PlayerStats_AddEvent(PLAYERSTATS_AVGLATENCY);
-       PlayerStats_AddEvent(PLAYERSTATS_WINS);
-       PlayerStats_AddEvent(PLAYERSTATS_MATCHES);
-       PlayerStats_AddEvent(PLAYERSTATS_JOINS);
-       PlayerStats_AddEvent(PLAYERSTATS_SCOREBOARD_VALID);
-       PlayerStats_AddEvent(PLAYERSTATS_SCOREBOARD_POS);
-       PlayerStats_AddEvent(PLAYERSTATS_RANK);
-
-    // accuracy stats
-    entity w;
-    float i;
-    for(i = WEP_FIRST; i <= WEP_LAST; ++i)
-    {
-        w = get_weaponinfo(i);
-
-        PlayerStats_AddEvent(strcat("acc-", w.netname, "-hit"));
-        PlayerStats_AddEvent(strcat("acc-", w.netname, "-fired"));
-
-        PlayerStats_AddEvent(strcat("acc-", w.netname, "-cnt-hit"));
-        PlayerStats_AddEvent(strcat("acc-", w.netname, "-cnt-fired"));
-
-        PlayerStats_AddEvent(strcat("acc-", w.netname, "-frags"));
-    }
-
-       PlayerStats_AddEvent("anticheat-_time");
-#define ANTICHEAT(name) \
-       PlayerStats_AddEvent("anticheat-" name)
-       ALL_ANTICHEATS
-#undef ANTICHEAT
-
-       PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_3);
-       PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_5);
-       PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_10);
-       PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_15);
-       PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_20);
-       PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_25);
-       PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_KILL_SPREE_30);
-       PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_BOTLIKE);
-       PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_FIRSTBLOOD);
-       PlayerStats_AddEvent(PLAYERSTATS_ACHIEVEMENT_FIRSTVICTIM);
-}
-
-void PlayerStats_AddPlayer(entity e)
-{
-       string s;
-
-       if(playerstats_db < 0)
-               return;
-       if(e.playerstats_id)
-               return;
-
-       s = string_null;
-       if(e.crypto_idfp != "" && e.cvar_cl_allow_uidtracking == 1)
-               s = e.crypto_idfp;
-       else if(IS_BOT_CLIENT(e))
-               s = sprintf("bot#%g#%s", skill, e.cleanname);
-
-       if((s == "") || find(world, playerstats_id, s)) // already have one of the ID - next one can't be tracked then!
-       {
-               if(IS_BOT_CLIENT(e))
-                       s = sprintf("bot#%d", e.playerid);
-               else
-                       s = sprintf("player#%d", e.playerid);
-       }
-
-       e.playerstats_id = strzone(s);
-
-       string key;
-       key = sprintf("%s:*", e.playerstats_id);
-
-       string p;
-       p = db_get(playerstats_db, key);
-       if(p == "")
-       {
-               if(playerstats_last)
-               {
-                       db_put(playerstats_db, key, playerstats_last);
-                       strunzone(playerstats_last);
-               }
-               else
-                       db_put(playerstats_db, key, "#");
-               playerstats_last = strzone(e.playerstats_id);
-       }
-}
-
-void PlayerStats_AddTeam(float t)
-{
-       if(playerstats_db < 0)
-               return;
-
-       string key;
-       key = sprintf("%d", t);
-
-       string p;
-       p = db_get(playerstats_db, key);
-       if(p == "")
-       {
-               if(teamstats_last)
-               {
-                       db_put(playerstats_db, key, teamstats_last);
-                       strunzone(teamstats_last);
-               }
-               else
-                       db_put(playerstats_db, key, "#");
-               teamstats_last = strzone(key);
-       }
-}
-
-void PlayerStats_AddEvent(string event_id)
-{
-       if(playerstats_db < 0)
-               return;
-
-       string key;
-       key = sprintf("*:%s", event_id);
-
-       string p;
-       p = db_get(playerstats_db, key);
-       if(p == "")
-       {
-               if(events_last)
-               {
-                       db_put(playerstats_db, key, events_last);
-                       strunzone(events_last);
-               }
-               else
-                       db_put(playerstats_db, key, "#");
-               events_last = strzone(event_id);
-       }
-}
-
-float PlayerStats_Event(entity e, string event_id, float value)
-{
-       if((e.playerstats_id == "") || playerstats_db < 0)
-               return 0;
-
-       string key;
-       float val;
-       key = sprintf("%s:%s", e.playerstats_id, event_id);
-       val = stof(db_get(playerstats_db, key));
-       val += value;
-       db_put(playerstats_db, key, ftos(val));
-       return val;
-}
-
-float PlayerStats_TeamScore(float t, string event_id, float value)
-{
-       if(playerstats_db < 0)
-               return 0;
-
-       string key;
-       float val;
-       key = sprintf("team#%d:%s", t, event_id);
-       val = stof(db_get(playerstats_db, key));
-       val += value;
-       db_put(playerstats_db, key, ftos(val));
-       return val;
-}
-
-/*
-       format spec:
-
-       A collection of lines of the format <key> SPACE <value> NEWLINE, where
-       <key> is always a single character.
-
-       The following keys are defined:
-
-       V: format version (always a fixed number) - this MUST be the first line!
-       #: comment (MUST be ignored by any parser)
-       R: release information on the server
-       T: time at which the game ended
-       G: game type
-       O: mod name (icon request) as in server browser
-       M: map name
-       I: match ID (see "matchid" in g_world.qc
-       S: "hostname" of the server
-       C: number of "unpure" cvar changes
-       U: UDP port number of the server
-       D: duration of the match
-       P: player ID of an existing player; this also sets the owner for all following "n", "e" and "t" lines (lower case!)
-       Q: team number of an existing team (format: team#NN); this also sets the owner for all following "e" lines (lower case!)
-       n: nickname of the player (optional)
-       t: team ID
-       i: player index
-       e: followed by an event name, a space, and the event count/score
-               event names can be:
-                       alivetime: total playing time of the player
-                       avglatency: average network latency compounded throughout the match
-                       wins: number of games won (can only be set if matches is set)
-                       matches: number of matches played to the end (not aborted by map switch)
-                       joins: number of matches joined (always 1 unless player never played during the match)
-                       scoreboardvalid: set to 1 if the player was there at the end of the match
-                       total-<scoreboardname>: total score of that scoreboard item
-                       scoreboard-<scoreboardname>: end-of-game score of that scoreboard item (can differ in non-team games)
-                       achievement-<achievementname>: achievement counters (their "count" is usually 1 if nonzero at all)
-                       kills-<index>: number of kills against the indexed player
-                       rank <number>: rank of player
-                       acc-<weapon netname>-hit: total damage dealt
-                       acc-<weapon netname>-fired: total damage that all fired projectiles *could* have dealt
-                       acc-<weapon netname>-cnt-hit: amount of shots that actually hit
-                       acc-<weapon netname>-cnt-fired: amount of fired shots
-                       acc-<weapon netname>-frags: amount of frags dealt by weapon
-
-       Response format (not used yet): see https://gist.github.com/4284222
-*/
-
-void PlayerStats_ready(entity fh, entity pass, float status)
-{
-       string t, tn;
-       string p, pn;
-       string e, en;
-       string nn, tt;
-       string s;
-
-       switch(status)
-       {
-               case URL_READY_CANWRITE:
-                       url_fputs(fh, "V 7\n");
-#ifdef WATERMARK
-                       url_fputs(fh, sprintf("R %s\n", WATERMARK));
-#endif
-                       url_fputs(fh, sprintf("T %s.%06d\n", strftime(FALSE, "%s"), floor(random() * 1000000)));
-                       url_fputs(fh, sprintf("G %s\n", GetGametype()));
-                       url_fputs(fh, sprintf("O %s\n", modname));
-                       url_fputs(fh, sprintf("M %s\n", GetMapname()));
-                       url_fputs(fh, sprintf("I %s\n", matchid));
-                       url_fputs(fh, sprintf("S %s\n", cvar_string("hostname")));
-                       url_fputs(fh, sprintf("C %d\n", cvar_purechanges_count));
-                       url_fputs(fh, sprintf("U %d\n", cvar("port")));
-                       url_fputs(fh, sprintf("D %f\n", max(0, time - game_starttime)));
-                       if(teamplay)
-                       {
-                               for(t = teamstats_last; (tn = db_get(playerstats_db, sprintf("%d", stof(t)))) != ""; t = tn)
-                               {
-                                       url_fputs(fh, sprintf("Q team#%s\n", t));
-                                       for(e = events_last; (en = db_get(playerstats_db, sprintf("*:%s", e))) != ""; e = en)
-                                       {
-                                               float v;
-                                               v = stof(db_get(playerstats_db, sprintf("team#%d:%s", stof(t), e)));
-                                               if(v != 0)
-                                                       url_fputs(fh, sprintf("e %s %g\n", e, v));
-                                       }
-                               }
-                       }
-                       for(p = playerstats_last; (pn = db_get(playerstats_db, sprintf("%s:*", p))) != ""; p = pn)
-                       {
-                               url_fputs(fh, sprintf("P %s\n", p));
-                               nn = db_get(playerstats_db, sprintf("%s:_playerid", p));
-                               if(nn != "")
-                                       url_fputs(fh, sprintf("i %s\n", nn));
-                               nn = db_get(playerstats_db, sprintf("%s:_netname", p));
-                               if(nn != "")
-                                       url_fputs(fh, sprintf("n %s\n", nn));
-                               if(teamplay)
-                               {
-                                       tt = db_get(playerstats_db, sprintf("%s:_team", p));
-                                       url_fputs(fh, sprintf("t %s\n", tt));
-                               }
-                               for(e = events_last; (en = db_get(playerstats_db, sprintf("*:%s", e))) != ""; e = en)
-                               {
-                                       float v;
-                                       v = stof(db_get(playerstats_db, sprintf("%s:%s", p, e)));
-                                       if(v != 0)
-                                               url_fputs(fh, sprintf("e %s %g\n", e, v));
-                               }
-                       }
-                       url_fputs(fh, "\n");
-                       url_fclose(fh);
-                       break;
-               case URL_READY_CANREAD:
-                       // url_fclose is processing, we got a response for writing the data
-                       // this must come from HTTP
-                       print("Got response from player stats server:\n");
-                       while((s = url_fgets(fh)))
-                               print("  ", s, "\n");
-                       print("End of response.\n");
-                       url_fclose(fh);
-                       break;
-               case URL_READY_CLOSED:
-                       // url_fclose has finished
-                       print("Player stats written\n");
-                       playerstats_waitforme = TRUE;
-                       db_close(playerstats_db);
-                       playerstats_db = -1;
-                       break;
-               case URL_READY_ERROR:
-               default:
-                       print("Player stats writing failed: ", ftos(status), "\n");
-                       playerstats_waitforme = TRUE;
-                       if(playerstats_db >= 0)
-                       {
-                               db_close(playerstats_db);
-                               playerstats_db = -1;
-                       }
-                       break;
-       }
-}
-
-//#NO AUTOCVARS START
-void PlayerStats_Shutdown()
-{
-       string uri;
-
-       if(playerstats_db < 0)
-               return;
-
-       uri = autocvar_g_playerstats_uri;
-       if(uri != "")
-       {
-               playerstats_waitforme = FALSE;
-               url_multi_fopen(uri, FILE_APPEND, PlayerStats_ready, world);
-       }
-       else
-       {
-               playerstats_waitforme = TRUE;
-               db_close(playerstats_db);
-               playerstats_db = -1;
-       }
-}
-//#NO AUTOCVARS END
-
-void PlayerStats_Accuracy(entity p)
-{
-    entity a, w;
-    a = p.accuracy;
-    float i;
-
-    for(i = WEP_FIRST; i <= WEP_LAST; ++i)
-    {
-        w = get_weaponinfo(i);
-
-        PlayerStats_Event(p, strcat("acc-", w.netname, "-hit"), a.(accuracy_hit[i-1]));
-        PlayerStats_Event(p, strcat("acc-", w.netname, "-fired"), a.(accuracy_fired[i-1]));
-
-        PlayerStats_Event(p, strcat("acc-", w.netname, "-cnt-hit"), a.(accuracy_cnt_hit[i-1]));
-        PlayerStats_Event(p, strcat("acc-", w.netname, "-cnt-fired"), a.(accuracy_cnt_fired[i-1]));
-
-        PlayerStats_Event(p, strcat("acc-", w.netname, "-frags"), a.(accuracy_frags[i-1]));
-    }
-    //backtrace(strcat("adding player stat accuracy for ", p.netname, ".\n"));
-}
-
-void PlayerStats_Anticheat(entity p)
-{
-       entity oldself = self;
-       self = p;
-
-       float t0 = PlayerStats_Event(p, "anticheat-_time", 0);
-       float dt = anticheat_getvalue("_time");
-       PlayerStats_Event(p, "anticheat-_time", dt);
-       float f = dt / (t0 + dt);
-#define ANTICHEAT(name) do { \
-               float prev = PlayerStats_Event(p, "anticheat-" name, 0); \
-               float change = (anticheat_getvalue(name) - prev) * f; \
-               PlayerStats_Event(p, "anticheat-" name, change); \
-       } while(0)
-       ALL_ANTICHEATS
-#undef ANTICHEAT
-       self = oldself;
-}
-
-void PlayerStats_AddGlobalInfo(entity p)
-{
-       if(playerstats_db < 0)
-               return;
-       if((p.playerstats_id == "") || playerstats_db < 0)
-               return;
-       p.playerstats_addedglobalinfo = TRUE;
-
-       // add global info!
-       if(p.alivetime)
-       {
-               PlayerStats_Event(p, PLAYERSTATS_ALIVETIME, time - p.alivetime);
-               p.alivetime = 0;
-       }
-
-       db_put(playerstats_db, sprintf("%s:_playerid", p.playerstats_id), ftos(p.playerid));
-
-       if(p.cvar_cl_allow_uid2name == 1 || IS_BOT_CLIENT(p))
-               db_put(playerstats_db, sprintf("%s:_netname", p.playerstats_id), p.netname);
-
-       if(teamplay)
-               db_put(playerstats_db, sprintf("%s:_team", p.playerstats_id), ftos(p.team));
-
-       if(stof(db_get(playerstats_db, sprintf("%d:%s", p.playerstats_id, PLAYERSTATS_ALIVETIME))) > 0)
-               PlayerStats_Event(p, PLAYERSTATS_JOINS, 1);
-
-       PlayerStats_Accuracy(p);
-
-       PlayerStats_Anticheat(p);
-
-       if(IS_REAL_CLIENT(p))
-       {
-               if(p.latency_cnt)
-               {
-                       float latency = (p.latency_sum / p.latency_cnt);
-                       if(latency) { PlayerStats_Event(p, PLAYERSTATS_AVGLATENCY, latency); }
-               }
-       }
-
-       strunzone(p.playerstats_id);
-       p.playerstats_id = string_null;
-}
-
-.float scoreboard_pos;
-void PlayerStats_EndMatch(float finished)
-{
-       entity p;
-       PlayerScore_Sort(score_dummyfield, 0, 0, 0);
-       PlayerScore_Sort(scoreboard_pos, 1, 1, 1);
-       if(teamplay)
-               PlayerScore_TeamStats();
-       FOR_EACH_CLIENT(p)
-       {
-               // add personal score rank
-               PlayerStats_Event(p, PLAYERSTATS_RANK, p.score_dummyfield);
-
-               if(!p.scoreboard_pos)
-                       continue;
-
-               // scoreboard is valid!
-               PlayerStats_Event(p, PLAYERSTATS_SCOREBOARD_VALID, 1);
-
-               // add scoreboard position
-               PlayerStats_Event(p, PLAYERSTATS_SCOREBOARD_POS, p.scoreboard_pos);
-
-               // add scoreboard data
-               PlayerScore_PlayerStats(p);
-
-               // if the match ended normally, add winning info
-               if(finished)
-               {
-                       PlayerStats_Event(p, PLAYERSTATS_WINS, p.winning);
-                       PlayerStats_Event(p, PLAYERSTATS_MATCHES, 1);
-               }
-       }
-}
-
-#undef ALL_ANTICHEATS
index de110cd476c2a8c62fbfc56a91f420e646e26442..4455d3fb46a3128ecf541c8d4558286341eb8a4e 100644 (file)
@@ -599,7 +599,7 @@ float Item_GiveTo(entity item, entity player)
        {
                pickedup = TRUE;
                player.items |= it;
-               sprint (player, strcat("You got the ^2", item.netname, "\n"));
+               Send_Notification(NOTIF_ONE, player, MSG_INFO, INFO_ITEM_WEAPON_GOT, item.netname);
        }
 
        if (item.strength_finished)
index 353e5e9feb4f4b64c146cb2f456c49181b13fa93..315abe152f50b2d9074b28d1e214fa8d1f199053 100644 (file)
@@ -1176,7 +1176,7 @@ void door_touch()
        if (!(self.owner.dmg) && (self.owner.message != ""))
        {
                if (IS_CLIENT(other))
-                       centerprint (other, self.owner.message);
+                       centerprint(other, self.owner.message);
                play2(other, "misc/talk.wav");
        }
 }
@@ -1849,7 +1849,7 @@ void secret_touch()
        if (self.message)
        {
                if (IS_CLIENT(other))
-                       centerprint (other, self.message);
+                       centerprint(other, self.message);
                play2(other, "misc/talk.wav");
        }
 }
diff --git a/sound/weapons/arc_fire.ogg b/sound/weapons/arc_fire.ogg
new file mode 100644 (file)
index 0000000..ba388e1
Binary files /dev/null and b/sound/weapons/arc_fire.ogg differ
diff --git a/sound/weapons/arc_loop.ogg b/sound/weapons/arc_loop.ogg
new file mode 100644 (file)
index 0000000..4489e91
Binary files /dev/null and b/sound/weapons/arc_loop.ogg differ
diff --git a/sound/weapons/arc_loop_overheat.ogg b/sound/weapons/arc_loop_overheat.ogg
new file mode 100644 (file)
index 0000000..6178b34
Binary files /dev/null and b/sound/weapons/arc_loop_overheat.ogg differ
diff --git a/sound/weapons/arc_stop.ogg b/sound/weapons/arc_stop.ogg
new file mode 100644 (file)
index 0000000..bbf69ce
Binary files /dev/null and b/sound/weapons/arc_stop.ogg differ
index 6a810c9ba973e7a057234bc1023fa367af1f3102..d3d6c11ac1e616c30a4c0ee8f9e98f186d2a854d 100644 (file)
@@ -31,6 +31,7 @@ Severin "sev" Meyer
 Soelen
 Sydes
 unfa
+TimePath
 
 
 *Website
@@ -125,7 +126,6 @@ Erik "Ablu" Schilling
 Jope "Sless" Withers
 Mattia "Melanosuchus" Basaglia
 Robert "ai" Kuroto
-TimePath
 
 
 **Translators