diff --git a/README.md b/README.md index 506f3b04..2fb8efa0 100644 --- a/README.md +++ b/README.md @@ -161,7 +161,7 @@ sound files are found in `fortress/sound/hitaudio/` and `fortress/sound/announc * Server option for making all walls block EMP. Off by default. `localinfo walls_block_emp 1` or `localinfo wbe 1`. (SPAWNFLAG_BLOCK_EMP 4096 will work regardless) * Server option for setting detpack to solid (blocking). Off by default. `localinfo solid_detpack 1` or `localinfo sdp 1`. * Server option for overriding map class restrictions (except civilian). `serverinfo override_mapclasses 1` or `serverinfo omc 1`. -* Option for maximum grenades for all classes. `localinfo max_gren1_ `, short `localinfo mg1_ `. Works for gren1s and gren2s. Eg `localinfo max_gren1_scout 0` to remove caltrops or `localinfo mg2_9 2` to reduce max EMPs to 2. +* Option for maximum grenades for all classes. `localinfo max_gren1_ `, short `localinfo mg1_ `. Works for gren1s and gren2s. Eg `localinfo max_gren1_scout 0` to remove caltrops or `localinfo mg2_9 2` to reduce max EMPs to 2. Set to -1 for default. * Option to fully restock player's clip and finish reload immediately if in progress. `localinfo stock_reload 1` (`localinfo srd 1`) will trigger only on flag capture (with stock_on_cap enabled). `2` will trigger whenever any tfgoal gives you the appropriate ammo. * Option for statusbar flaginfo. `setinfo sbflaginfo 1` (default). Setting it to `2` will skip the tf tips on respawn and show flag info all the time. * Admin system created to allow for easy setup of pub/clan/quad/duel games, kick players etc `localinfo adminpwd ` and `cmd adminpwd ; wait; adminmenu` @@ -177,6 +177,7 @@ sound files are found in `fortress/sound/hitaudio/` and `fortress/sound/announc * Keys and flags glow their colour. * Option to adjust conussion grenade effect time in seconds. `localinfo cussgrentime`. * Option to fully restock player on cap. `localinfo stock_on_cap on`. +* Option to strip ammo and grens from defenders within 1500 units of cap point when flag is capped. `localinfo cap_strip 1`. * Option for packs to fully restock health and armor of player. `localinfo stockfull on`. * Automatic server-side mvd recording of clan matches. Requires `localinfo serverdemo on`. * Map vote (4 random maps + current map) during last few minutes of game (shown for newly spawned or toggled with /togglevote). diff --git a/csqc/csextradefs.qc b/csqc/csextradefs.qc index e9027f88..1e4db845 100644 --- a/csqc/csextradefs.qc +++ b/csqc/csextradefs.qc @@ -115,6 +115,8 @@ float vote_list_offset; entity current_vote; string vote_list_filter; float zoomed_in; +float pick_up_time; +float flag_team; float slot_history[MAX_SLOT_HISTORY_SIZE]; float slot_history_top, slot_under_stack; @@ -412,7 +414,7 @@ enum PanelID:float { HUDP_GRENTIMER, HUDP_MOTD, HUDP_GAME_MODE, - HUDP_READY, + HUDP_NOTIFICATION, HUDP_HEALTH, HUDP_FACE, HUDP_AMMO, diff --git a/csqc/events.qc b/csqc/events.qc index ce995b99..b15e7733 100644 --- a/csqc/events.qc +++ b/csqc/events.qc @@ -355,6 +355,10 @@ void() CSQC_Parse_Event = { local float weapon = readfloat(); FO_ReloadSound(weapon); break; + case MSG_FLAG_PICKUP: + flag_team = readfloat(); + pick_up_time = time; + break; } } diff --git a/csqc/hud.qc b/csqc/hud.qc index 94d154d3..01dd92bb 100644 --- a/csqc/hud.qc +++ b/csqc/hud.qc @@ -26,7 +26,7 @@ void FO_Hud_Editor_LoadDefaultSettings() getHudPanel(HUDP_GAME_MODE)->Position = [width - getHudPanel(HUDP_GAME_MODE)->FillSize.x, 30]; getHudPanel(HUDP_GAME_MODE)->Orientation = FO_HUD_INSERT_AFTER; getHudPanel(HUDP_MOTD)->Position = [(width / 2) - (getHudPanel(HUDP_MOTD)->FillSize.x / 2), 30]; - getHudPanel(HUDP_READY)->Position = [(width / 2) - (getHudPanel(HUDP_READY)->FillSize.x / 2), 30]; + getHudPanel(HUDP_NOTIFICATION)->Position = [(width / 2) - (getHudPanel(HUDP_NOTIFICATION)->FillSize.x / 2), 30]; getHudPanel(HUDP_MENU_HINT)->Position = [(width / 2) - (getHudPanel(HUDP_MENU)->FillSize.x / 2), 80]; getHudPanel(HUDP_MENU_HINT)->Orientation = FO_HUD_INSERT_MIDDLE; getHudPanel(HUDP_MENU)->Position = [(width / 2) - (getHudPanel(HUDP_MENU)->FillSize.x / 2), 120]; diff --git a/csqc/hud_helpers.qc b/csqc/hud_helpers.qc index 7f7afc23..fab0a72e 100644 --- a/csqc/hud_helpers.qc +++ b/csqc/hud_helpers.qc @@ -257,7 +257,7 @@ void FO_Hud_InitSystemPanels() { if (panel->System) { switch (panel->id) { case HUDP_MOTD: - case HUDP_READY: + case HUDP_NOTIFICATION: FO_Hud_ShowPanel(i); break; diff --git a/csqc/status.qc b/csqc/status.qc index 6999f0d1..380e14f5 100644 --- a/csqc/status.qc +++ b/csqc/status.qc @@ -508,7 +508,7 @@ void(PanelID panelid, string text) drawGameModePanel = { } } -void(PanelID panelid, string text) drawReadyPanel = { +void(PanelID panelid, string text) drawNotificationPanel = { FO_Hud_Panel* panel = getHudPanel(panelid); vector position = getPanelPosition(panel); @@ -520,7 +520,7 @@ void(PanelID panelid, string text) drawReadyPanel = { local float pos_aligned; local string message = ""; if (fo_hud_editor) { - message = "Ready Status"; + message = "Notification panel"; if (hud_panel(panelid, position, size, 0.3, panel.Display)) { // click event } @@ -606,6 +606,49 @@ void(PanelID panelid, string text) drawReadyPanel = { } } } + } else if (pick_up_time && time < pick_up_time + 1.5) { + local vector alert_text_size = MENU_TEXT_MEDIUM * panel.Scale; + local vector alert_text_position; + alert_text_position.y = ScreenSize.y / 3; + alert_text_position.x = (ScreenSize.x / 2) - (size.x / 2); + + local string flag_team_str = "the"; + local vector menu_text_color = MENU_TEXT_4; + + switch(flag_team) { + case 1: + flag_team_str = "blue's"; + menu_text_color = MENU_TEXT_BLUE_FO; + break; + case 2: + flag_team_str = "red's"; + menu_text_color = MENU_TEXT_RED_FO; + break; + case 3: + flag_team_str = "yellow's"; + menu_text_color = MENU_TEXT_YELLOW_FO; + break; + case 4: + flag_team_str = "green's"; + menu_text_color = MENU_TEXT_GREEN_FO; + break; + } + + local string alert_text_message = sprintf("You got %s flag!", flag_team_str); + + pos_aligned = GetTextAlignOffset( + alert_text_position.x, + size.x, + padding, + alert_text_message, + alert_text_size.x, + panel.Orientation + ); + + HRC_drawstring( + [pos_aligned, alert_text_position.y], + alert_text_message, alert_text_size, menu_text_color, 1, 0 + ); } } if(message) { @@ -1110,7 +1153,7 @@ var FO_Hud_Panel Hud_Panels[] = { {HUDP_GRENTIMER, "grentimer", FO_HUD_GRENTIMER_NAME, '100 110', '26 26', 1,0,1,0,0, drawGrenTimerPanel, {return "";}}, {HUDP_MOTD, "motd", FO_HUD_MOTD_NAME, '150 100', '100 24', 1,0,1,0,0, drawMOTDPanel, {return SBAR.MOTD;}}, {HUDP_GAME_MODE, "gamemode", FO_HUD_GAME_MODE_NAME, '100 140', '100 10', 1,0,1,0,0, drawGameModePanel, {return "";}}, - {HUDP_READY, "ready", FO_HUD_READY_NAME, '10 100', '100 10', 2,0,1,FO_HUD_INSERT_MIDDLE, 1, drawReadyPanel, {return SBAR.Hint;}}, + {HUDP_NOTIFICATION, "notification", FO_HUD_NOTIFICATION_NAME, '10 100', '100 10', 2,0,1,FO_HUD_INSERT_MIDDLE, 1, drawNotificationPanel, {return SBAR.Hint;}}, {HUDP_HEALTH, "health", FO_HUD_HEALTH_NAME, '-22 -2', '72 24', 1,0,1,0,0, drawHealthArmourTextPanel, {return ftos(getstatf(STAT_HEALTH));}, 0, 34}, {HUDP_FACE, "face", FO_HUD_FACE_NAME, '-70 -2', '24 24', 1,0,1,0,0, drawFacePanel, {return "";}, 0, 34}, {HUDP_AMMO, "ammo", FO_HUD_AMMO_NAME, '90 -2', '72 24', 1,0,1,0,0, drawAmmoTextPanel, {return ftos(WP_CurrentAmmo());}, 0, 34}, diff --git a/share/commondefs.qc b/share/commondefs.qc index ea918842..e85fa2ad 100644 --- a/share/commondefs.qc +++ b/share/commondefs.qc @@ -213,6 +213,7 @@ const float SERVER_FRAME_MS = SERVER_FRAME_DT * 1000.0; #define MSG_LOGIN 26 #define MSG_HITFLAG 27 #define MSG_RELOADSOUND 28 +#define MSG_FLAG_PICKUP 29 #define FLAGINFO_HOME 1 #define FLAGINFO_CARRIED 2 diff --git a/share/defs.h b/share/defs.h index 414687d7..a96d8bcd 100644 --- a/share/defs.h +++ b/share/defs.h @@ -976,7 +976,7 @@ enum { #define PC_DEMOMAN_GRENADE_INIT_1 4 #define PC_DEMOMAN_GRENADE_INIT_2 4 #define PC_DEMOMAN_GRENADE_MAX_1 4 -#define PC_DEMOMAN_GRENADE_MAX_2 4 +#define PC_DEMOMAN_GRENADE_MAX_2 1 #define PC_DEMOMAN_TF_ITEMS 0 // Class Details for COMBAT MEDIC @@ -1003,7 +1003,7 @@ enum { #define PC_MEDIC_GRENADE_INIT_1 3 #define PC_MEDIC_GRENADE_INIT_2 3 #define PC_MEDIC_GRENADE_MAX_1 4 -#define PC_MEDIC_GRENADE_MAX_2 3 +#define PC_MEDIC_GRENADE_MAX_2 2 #define PC_MEDIC_TF_ITEMS 0 #define PC_MEDIC_REGEN_TIME 3 // Number of seconds between each regen. #define PC_MEDIC_REGEN_AMOUNT 2 // Amount of health regenerated each regen. @@ -1043,7 +1043,6 @@ enum { #define PC_HVYWEAP_TF_ITEMS 0 #define PC_HVYWEAP_CELL_FIRE 7 - // Class Details for PYRO #define PC_PYRO_SKIN 21 #define PC_PYRO_MAXHEALTH 100 @@ -1065,7 +1064,7 @@ enum { #define PC_PYRO_GRENADE_INIT_1 1 #define PC_PYRO_GRENADE_INIT_2 4 #define PC_PYRO_GRENADE_MAX_1 4 -#define PC_PYRO_GRENADE_MAX_2 4 +#define PC_PYRO_GRENADE_MAX_2 1 #define PC_PYRO_TF_ITEMS 0 #define PC_PYRO_AIRBLAST_RANGE 400 #define PC_PYRO_AIRBLAST_CELLS 55 @@ -1100,7 +1099,7 @@ enum { #define PC_SPY_GRENADE_INIT_1 2 #define PC_SPY_GRENADE_INIT_2 2 #define PC_SPY_GRENADE_MAX_1 4 -#define PC_SPY_GRENADE_MAX_2 2 +#define PC_SPY_GRENADE_MAX_2 1 #define PC_SPY_TF_ITEMS 0 #define PC_SPY_CELL_REGEN_TIME 5 #define PC_SPY_CELL_REGEN_AMOUNT 1 @@ -1129,7 +1128,7 @@ enum { #define PC_ENGINEER_GRENADE_INIT_1 2 #define PC_ENGINEER_GRENADE_INIT_2 2 #define PC_ENGINEER_GRENADE_MAX_1 4 -#define PC_ENGINEER_GRENADE_MAX_2 4 +#define PC_ENGINEER_GRENADE_MAX_2 2 #define PC_ENGINEER_TF_ITEMS 0 #define PC_ENGINEER_RAILSPEED 1500 @@ -1396,7 +1395,7 @@ enum { #define FO_HUD_MOTD_NAME "MOTD" #define FO_HUD_MENU_HINT_NAME "Menu Hints" #define FO_HUD_GAME_MODE_NAME "Game Mode" -#define FO_HUD_READY_NAME "Ready Status" +#define FO_HUD_NOTIFICATION_NAME "Notification" #define FO_HUD_SHOWSCORES_NAME "Show Scores" #define FO_HUD_MAP_MENU_NAME "Map Menu" #define FO_HUD_HEALTH_NAME "Health" diff --git a/ssqc/client.qc b/ssqc/client.qc index 1f8db602..5854eaa5 100644 --- a/ssqc/client.qc +++ b/ssqc/client.qc @@ -203,6 +203,15 @@ float CF_GetSetting(string ps_short, string ps_setting, string ps_default) { return FO_GetUserSetting(world, ps_short, ps_setting, ps_default); }; +float FO_GetGrenadeSetting(string ps_short, string ps_setting, string ps_default) { + local float max_gren_setting = CF_GetSetting(ps_short, ps_setting, ps_default); + + if (max_gren_setting == -1) + return stof(ps_default); + + return max_gren_setting; +}; + void InitPrematch() { localcmd ("serverinfo status Standby\n"); @@ -223,13 +232,47 @@ void InitPrematch() } } +typedef struct { + int player_class; + string short_max_gren1; + string setting_max_gren1; + float default_max_gren1; + string short_max_gren2; + string setting_max_gren2; + float default_max_gren2; +} GrenConfig; + +GrenConfig GrenConfigs[10] = { + {0, "", "", 0, "", "", 0}, + {1, "mg1_1", "max_gren1_scout", PC_SCOUT_GRENADE_MAX_1, "mg2_1", "max_gren2_scout", PC_SCOUT_GRENADE_MAX_2}, + {2, "mg1_2", "max_gren1_sniper", PC_SNIPER_GRENADE_MAX_1, "mg2_2", "max_gren2_sniper", PC_SNIPER_GRENADE_MAX_2}, + {3, "mg1_3", "max_gren1_soldier", PC_SOLDIER_GRENADE_MAX_1, "mg2_3", "max_gren2_soldier", PC_SOLDIER_GRENADE_MAX_2}, + {4, "mg1_4", "max_gren1_demoman", PC_DEMOMAN_GRENADE_MAX_1, "mg2_4", "max_gren2_demoman", PC_DEMOMAN_GRENADE_MAX_2}, + {5, "mg1_5", "max_gren1_medic", PC_MEDIC_GRENADE_MAX_1, "mg2_5", "max_gren2_medic", PC_MEDIC_GRENADE_MAX_2}, + {6, "mg1_6", "max_gren1_hwguy", PC_HVYWEAP_GRENADE_MAX_1, "mg2_6", "max_gren2_hwguy", PC_HVYWEAP_GRENADE_MAX_2}, + {7, "mg1_7", "max_gren1_pyro", PC_PYRO_GRENADE_MAX_1, "mg2_7", "max_gren2_pyro", PC_PYRO_GRENADE_MAX_2}, + {8, "mg1_8", "max_gren1_spy", PC_SPY_GRENADE_MAX_1, "mg2_8", "max_gren2_spy", PC_SPY_GRENADE_MAX_2}, + {9, "mg1_9", "max_gren1_engineer", PC_ENGINEER_GRENADE_MAX_1, "mg2_9", "max_gren2_engineer", PC_ENGINEER_GRENADE_MAX_2} +}; + static void SetAllRoles(float pc, float gren, float limit) { - if (gren == 1) + if (pc < 1 || pc > 9) return; + + GrenConfig config = GrenConfigs[pc]; + + if (gren == 1) { + limit = FO_GetGrenadeSetting(config.short_max_gren1, + config.setting_max_gren1, ftos(limit)); + Role_None.gren1_limits[pc] = Role_Attack.gren1_limits[pc] = Role_Defence.gren1_limits[pc] = limit; - else + } else if (gren == 2) { + limit = FO_GetGrenadeSetting(config.short_max_gren2, + config.setting_max_gren2, ftos(limit)); + Role_None.gren2_limits[pc] = Role_Attack.gren2_limits[pc] = Role_Defence.gren2_limits[pc] = limit; + } } static float NB_UseMinPing() { @@ -250,11 +293,11 @@ void ActivateOrgGame() { for (i = 1; i <= 9; i++) // 3 gren spawn SetAllRoles(i, 1, 3); - SetAllRoles(4, 2, CF_GetSetting("mg2_4", "max_gren2_demoman", ftos(1))); // 1 mirv for demoman - SetAllRoles(6, 2, CF_GetSetting("mg2_6", "max_gren2_hwguy", ftos(1))); // 1 mirv for hwguy - SetAllRoles(9, 2, CF_GetSetting("mg2_9", "max_gren2_engineer", ftos(1))); // 1 emp for engineer - SetAllRoles(9, 1, CF_GetSetting("mg1_9", "max_gren1_engineer", ftos(4))); // 4 gren1 for engineer - SetAllRoles(3, 1, CF_GetSetting("mg1_3", "max_gren1_soldier", ftos(4))); // 4 gren1 for soldier + SetAllRoles(4, 2, 1); // 1 mirv for demoman + SetAllRoles(6, 2, 1); // 1 mirv for hwguy + SetAllRoles(9, 2, 1); // 1 emp for engineer + SetAllRoles(9, 1, 4); // 4 gren1 for engineer + SetAllRoles(3, 1, 4); // 4 gren1 for soldier PC_PYRO_AIRBLAST_COOLDOWN = 10; PC_ENGINEER_GRENADE_TYPE_2_RANGE = 200; @@ -599,13 +642,16 @@ void () DecodeLevelParms = { // stock on cap [on] stock_on_cap = CF_GetSetting("soc", "stock_on_cap", "on"); + // stock on cap [off] + cap_strip = CF_GetSetting("cs", "cap_strip", "off"); + // stock clip to full for reloading guns [on] stock_reload = CF_GetSetting("srd", "stock_reload", "on"); // display class tips [on] classtips = CF_GetSetting("ct", "classtips", "on"); - // concussion grenade effect time [19] + // concussion grenade effect time [10] cussgrentime = CF_GetSetting("cgt", "cussgrentime", "10"); // concussion grenade effect time proportional to distance from explosion @@ -698,39 +744,27 @@ void () DecodeLevelParms = { // override map-set class restrictions [off] override_mapclasses = CF_GetSetting("omc", "override_mapclasses", "off"); - // Maximum number of primary grenades per class - /* - max_gren1_scout = CF_GetSetting("mg1_1", "max_gren1_scout", ftos(PC_SCOUT_GRENADE_MAX_1)); - max_gren1_sniper = CF_GetSetting("mg1_2", "max_gren1_sniper", ftos(PC_SNIPER_GRENADE_MAX_1)); - max_gren1_soldier = CF_GetSetting("mg1_3", "max_gren1_soldier", ftos(PC_SOLDIER_GRENADE_MAX_1)); - max_gren1_demoman = CF_GetSetting("mg1_4", "max_gren1_demoman", ftos(PC_DEMOMAN_GRENADE_MAX_1)); - max_gren1_medic = CF_GetSetting("mg1_5", "max_gren1_medic", ftos(PC_MEDIC_GRENADE_MAX_1)); - max_gren1_hwguy = CF_GetSetting("mg1_6", "max_gren1_hwguy", ftos(PC_HVYWEAP_GRENADE_MAX_1)); - max_gren1_pyro = CF_GetSetting("mg1_7", "max_gren1_pyro", ftos(PC_PYRO_GRENADE_MAX_1)); - max_gren1_spy = CF_GetSetting("mg1_8", "max_gren1_spy", ftos(PC_SPY_GRENADE_MAX_1)); - max_gren1_engineer = CF_GetSetting("mg2_9", "max_gren1_engineer", ftos(PC_ENGINEER_GRENADE_MAX_1)); - */ - Role_None.gren1_limits[0] = 0; - Role_None.gren1_limits[1] = CF_GetSetting("mg1_1", "max_gren1_scout", ftos(PC_SCOUT_GRENADE_MAX_1)); - Role_None.gren1_limits[2] = CF_GetSetting("mg1_2", "max_gren1_sniper", ftos(PC_SNIPER_GRENADE_MAX_1)); - Role_None.gren1_limits[3] = CF_GetSetting("mg1_3", "max_gren1_soldier", ftos(PC_SOLDIER_GRENADE_MAX_1)); - Role_None.gren1_limits[4] = CF_GetSetting("mg1_4", "max_gren1_demoman", ftos(PC_DEMOMAN_GRENADE_MAX_1)); - Role_None.gren1_limits[5] = CF_GetSetting("mg1_5", "max_gren1_medic", ftos(PC_MEDIC_GRENADE_MAX_1)); - Role_None.gren1_limits[6] = CF_GetSetting("mg1_6", "max_gren1_hwguy", ftos(PC_HVYWEAP_GRENADE_MAX_1)); - Role_None.gren1_limits[7] = CF_GetSetting("mg1_7", "max_gren1_pyro", ftos(PC_PYRO_GRENADE_MAX_1)); - Role_None.gren1_limits[8] = CF_GetSetting("mg1_8", "max_gren1_spy", ftos(PC_SPY_GRENADE_MAX_1)); - Role_None.gren1_limits[9] = CF_GetSetting("mg1_9", "max_gren1_engineer", ftos(PC_ENGINEER_GRENADE_MAX_1)); + Role_None.gren1_limits[0] = 0; + Role_None.gren1_limits[1] = FO_GetGrenadeSetting("mg1_1", "max_gren1_scout", ftos(PC_SCOUT_GRENADE_MAX_1)); + Role_None.gren1_limits[2] = FO_GetGrenadeSetting("mg1_2", "max_gren1_sniper", ftos(PC_SNIPER_GRENADE_MAX_1)); + Role_None.gren1_limits[3] = FO_GetGrenadeSetting("mg1_3", "max_gren1_soldier", ftos(PC_SOLDIER_GRENADE_MAX_1)); + Role_None.gren1_limits[4] = FO_GetGrenadeSetting("mg1_4", "max_gren1_demoman", ftos(PC_DEMOMAN_GRENADE_MAX_1)); + Role_None.gren1_limits[5] = FO_GetGrenadeSetting("mg1_5", "max_gren1_medic", ftos(PC_MEDIC_GRENADE_MAX_1)); + Role_None.gren1_limits[6] = FO_GetGrenadeSetting("mg1_6", "max_gren1_hwguy", ftos(PC_HVYWEAP_GRENADE_MAX_1)); + Role_None.gren1_limits[7] = FO_GetGrenadeSetting("mg1_7", "max_gren1_pyro", ftos(PC_PYRO_GRENADE_MAX_1)); + Role_None.gren1_limits[8] = FO_GetGrenadeSetting("mg1_8", "max_gren1_spy", ftos(PC_SPY_GRENADE_MAX_1)); + Role_None.gren1_limits[9] = FO_GetGrenadeSetting("mg1_9", "max_gren1_engineer", ftos(PC_ENGINEER_GRENADE_MAX_1)); // Maximum number of secondary grenades per class - Role_None.gren2_limits[1] = CF_GetSetting("mg2_1", "max_gren2_scout", ftos(PC_SCOUT_GRENADE_MAX_2)); - Role_None.gren2_limits[2] = CF_GetSetting("mg2_2", "max_gren2_sniper", ftos(PC_SNIPER_GRENADE_MAX_2)); - Role_None.gren2_limits[3] = CF_GetSetting("mg2_3", "max_gren2_soldier", ftos(PC_SOLDIER_GRENADE_MAX_2)); - Role_None.gren2_limits[4] = CF_GetSetting("mg2_4", "max_gren2_demoman", ftos(PC_DEMOMAN_GRENADE_MAX_2)); - Role_None.gren2_limits[5] = CF_GetSetting("mg2_5", "max_gren2_medic", ftos(PC_MEDIC_GRENADE_MAX_2)); - Role_None.gren2_limits[6] = CF_GetSetting("mg2_6", "max_gren2_hwguy", ftos(PC_HVYWEAP_GRENADE_MAX_2)); - Role_None.gren2_limits[7] = CF_GetSetting("mg2_7", "max_gren2_pyro", ftos(PC_PYRO_GRENADE_MAX_2)); - Role_None.gren2_limits[8] = CF_GetSetting("mg2_8", "max_gren2_spy", ftos(PC_SPY_GRENADE_MAX_2)); - Role_None.gren2_limits[9] = CF_GetSetting("mg2_9", "max_gren2_engineer", ftos(PC_ENGINEER_GRENADE_MAX_2)); + Role_None.gren2_limits[1] = FO_GetGrenadeSetting("mg2_1", "max_gren2_scout", ftos(PC_SCOUT_GRENADE_MAX_2)); + Role_None.gren2_limits[2] = FO_GetGrenadeSetting("mg2_2", "max_gren2_sniper", ftos(PC_SNIPER_GRENADE_MAX_2)); + Role_None.gren2_limits[3] = FO_GetGrenadeSetting("mg2_3", "max_gren2_soldier", ftos(PC_SOLDIER_GRENADE_MAX_2)); + Role_None.gren2_limits[4] = FO_GetGrenadeSetting("mg2_4", "max_gren2_demoman", ftos(PC_DEMOMAN_GRENADE_MAX_2)); + Role_None.gren2_limits[5] = FO_GetGrenadeSetting("mg2_5", "max_gren2_medic", ftos(PC_MEDIC_GRENADE_MAX_2)); + Role_None.gren2_limits[6] = FO_GetGrenadeSetting("mg2_6", "max_gren2_hwguy", ftos(PC_HVYWEAP_GRENADE_MAX_2)); + Role_None.gren2_limits[7] = FO_GetGrenadeSetting("mg2_7", "max_gren2_pyro", ftos(PC_PYRO_GRENADE_MAX_2)); + Role_None.gren2_limits[8] = FO_GetGrenadeSetting("mg2_8", "max_gren2_spy", ftos(PC_SPY_GRENADE_MAX_2)); + Role_None.gren2_limits[9] = FO_GetGrenadeSetting("mg2_9", "max_gren2_engineer", ftos(PC_ENGINEER_GRENADE_MAX_2)); // disable resupply giving grenades (1-bit for gren1, 2-bit for gren2) disable_resup_gren = CF_GetSetting("drg", "disable_resup_gren", "0"); @@ -905,6 +939,7 @@ void () DecodeLevelParms = { spawnfull = TRUE; stockfull = TRUE; stock_on_cap = TRUE; + cap_strip = FALSE; stock_reload = TRUE; classtips = TRUE; sniperpower = TRUE; @@ -973,6 +1008,7 @@ void () DecodeLevelParms = { spawnfull = FALSE; stockfull = FALSE; stock_on_cap = FALSE; + cap_strip = FALSE; stock_reload = FALSE; classtips = FALSE; sniperpower = FALSE; @@ -1037,6 +1073,7 @@ void () DecodeLevelParms = { spawnfull = FALSE; stockfull = FALSE; stock_on_cap = FALSE; + cap_strip = FALSE; stock_reload = FALSE; classtips = FALSE; nohitsounds = TRUE; @@ -1612,7 +1649,7 @@ void () ResetPlayers = { // DuelWin(te); // return; //} - } + } RemovePlayerOwnedEnts(); setspawnparms(self); PutClientInServer(); diff --git a/ssqc/qw.qc b/ssqc/qw.qc index 1453b2e8..96e73c72 100644 --- a/ssqc/qw.qc +++ b/ssqc/qw.qc @@ -534,26 +534,6 @@ float drop_grenades; float drop_grenpack; float drop_gren1; float drop_gren2; -/* -float max_gren1_scout; -float max_gren1_sniper; -float max_gren1_soldier; -float max_gren1_demoman; -float max_gren1_medic; -float max_gren1_hwguy; -float max_gren1_pyro; -float max_gren1_spy; -float max_gren1_engineer; -float max_gren2_scout; -float max_gren2_sniper; -float max_gren2_soldier; -float max_gren2_demoman; -float max_gren2_medic; -float max_gren2_hwguy; -float max_gren2_pyro; -float max_gren2_spy; -float max_gren2_engineer; -*/ float max_active_gren2_soldier; float id_extended; float remember_weapon; @@ -581,6 +561,7 @@ float scoutdash; float spawnfull; float stockfull; float stock_on_cap; +float cap_strip; float stock_reload; float classtips; float cussgrentime; diff --git a/ssqc/scout.qc b/ssqc/scout.qc index 019979b1..94b7c5a1 100644 --- a/ssqc/scout.qc +++ b/ssqc/scout.qc @@ -830,9 +830,6 @@ void (entity inflictor, entity attacker, float bounce, local entity te; local vector org; - //if (NewBalanceActive() && inflictor.owner.playerclass == PC_MEDIC) - // actual_cuss_time = 2; - head = findradius(inflictor.origin, bounce + 40); while (head) { if (head != ignore) { diff --git a/ssqc/status.qc b/ssqc/status.qc index 792044dd..19d40cf9 100644 --- a/ssqc/status.qc +++ b/ssqc/status.qc @@ -964,6 +964,17 @@ void UpdateClientStatusBar(entity pl) multicast('0 0 0', MULTICAST_ONE_NOSPECS); } +void (entity pl, float flag_team) UpdateClientFlagPickUp = { + if(!infokeyf(pl, INFOKEY_P_CSQCACTIVE)) + return; + + msg_entity = pl; + WriteByte(MSG_MULTICAST, SVC_CGAMEPACKET); + WriteByte(MSG_MULTICAST, MSG_FLAG_PICKUP); + WriteFloat(MSG_MULTICAST, flag_team); + multicast('0 0 0', MULTICAST_ONE_NOSPECS); +} + void (entity pl) RefreshStatusBar = { local string pad; local string s1 = ""; // will be used for grenade timers diff --git a/ssqc/teamplay.qc b/ssqc/teamplay.qc index c3dbab63..05fe9ae7 100644 --- a/ssqc/teamplay.qc +++ b/ssqc/teamplay.qc @@ -39,7 +39,6 @@ static void ApplyRadius(vector org, float rad, void RemovePrimedGrenades(entity player); -/* Disabled new-balance remove chaser ammo mechanic static void EffStrip(entity player) { player.ammo_cells = 0; player.ammo_rockets = 0; @@ -55,7 +54,7 @@ static void EffStrip(entity player) { stuffcmd(player, "bf\n"); sprint(player, PRINT_HIGH, msg, "\n"); centerprint(player, msg); -}*/ +} float IsEngEnt(entity ent); void RemoveEngEnt(entity bld, float explode); @@ -95,10 +94,10 @@ static int(entity p) FilOwnerTeamNEQ[] = { }; void TeamPlay_Cap(vector origin, entity player) { - if (!org_game || !new_balance) + if (!org_game || !new_balance || !cap_strip) return; - //ApplyRadius(origin, 1500, - // FilTeamNEQ[player.team_no - 1], EffStrip, - // FilOwnerTeamNEQ[player.team_no - 1], EffRemove); + ApplyRadius(origin, 1500, + FilTeamNEQ[player.team_no - 1], EffStrip, + FilOwnerTeamNEQ[player.team_no - 1], EffRemove); } diff --git a/ssqc/tfort.qc b/ssqc/tfort.qc index 2423a696..359b828d 100644 --- a/ssqc/tfort.qc +++ b/ssqc/tfort.qc @@ -604,6 +604,7 @@ void () TeamFortress_ShowTF = { CF_PrintSetting("Spawn with full health/armor", spawnfull, "", 1); CF_PrintSetting("Stock players with full health/armor", stockfull, "", 1); CF_PrintSetting("Stock player on cap", stock_on_cap, "", 1); + CF_PrintSetting("Strip chasers on cap", cap_strip, "", 1); CF_PrintSetting("Stock reloadable clip", stock_reload, "", 1); CF_PrintSetting("Old dropflag behaviour", old_dropflag, "", 1); CF_PrintSetting("Remember weapon", remember_weapon, "", 1); diff --git a/ssqc/tfortmap.qc b/ssqc/tfortmap.qc index 3a9eed67..03b6763c 100644 --- a/ssqc/tfortmap.qc +++ b/ssqc/tfortmap.qc @@ -950,7 +950,8 @@ void (entity Goal, entity Player, entity AP, float addb) Apply_Results = { if (stock_on_cap) { if (Player == AP) { - TeamPlay_Cap(AP.origin, AP); + if (cap_strip) + TeamPlay_Cap(AP.origin, AP); if (Player.health > 0) { T_Heal(Player, Player.max_health, 0); @@ -2276,6 +2277,7 @@ void (entity Item, entity AP, entity Goal) tfgoalitem_GiveToPlayer = { DoItemGroupWork(Item, AP); AP.goalrunningtime = gametime; AP.has_flag = TRUE; + UpdateClientFlagPickUp(AP, Item.skin); LogEventPickupGoal(AP); }; diff --git a/ssqc/world.qc b/ssqc/world.qc index ab5f5dd4..e194f42a 100644 --- a/ssqc/world.qc +++ b/ssqc/world.qc @@ -332,7 +332,7 @@ void () worldspawn = { clientstat(STAT_TEAMNO, EV_FLOAT, team_no); clientstat(STAT_ALL_TIME, EV_FLOAT, all_time); clientstat(STAT_FLAGS, EV_FLOAT, stat_flags); - clientstat(STAT_SPAWN_GEN,EV_FLOAT, spawn_gen); + clientstat(STAT_SPAWN_GEN, EV_FLOAT, spawn_gen); globalstat(STAT_ROUND_END, EV_FLOAT, "round_end_time"); globalstat(STAT_PAUSED, EV_FLOAT, "cs_paused");