From: Mario Date: Thu, 9 Jul 2015 01:38:50 +0000 (+0000) Subject: Merge branch 'packer-/impure_team_cvars' into 'master' X-Git-Tag: xonotic-v0.8.1~51 X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=commitdiff_plain;h=b2fa86504c5f79fb70897d94a4a3c88333f96407;hp=3b9f57b90e2e977b873f83fdeb4f24046190b53b Merge branch 'packer-/impure_team_cvars' into 'master' add g_tdm_teams_override and g_domination_teams_override to cvar whitelist Modifying default team number for gametype tdm or dom makes server impure g_tdm_teams_override "3" // "0" g_domination_teams_override "3" // "0" ca, freezetag and keyhunt are already whitelisted grep teams_override g_world.qc BADCVAR("g_ca_teams_override"); BADCVAR("g_freezetag_teams_override"); BADCVAR("g_keyhunt_teams_override"); See merge request !139 --- diff --git a/_hud_common.cfg b/_hud_common.cfg index 5aa1bbfeea..b74eff9607 100644 --- a/_hud_common.cfg +++ b/_hud_common.cfg @@ -38,6 +38,9 @@ seta hud_panel_engineinfo_framecounter_exponentialmovingaverage 1 "use an averag seta hud_panel_engineinfo_framecounter_exponentialmovingaverage_new_weight 0.1 "weight of latest data point" seta hud_panel_engineinfo_framecounter_exponentialmovingaverage_instantupdate_change_threshold 0.5 "threshold for fps change when to update instantly, to make big fps changes update faster" +seta hud_panel_physics_acceleration_movingaverage 1 "use an averaging method for calculating acceleration instead of the real value" +seta hud_panel_phisics_update_interval 0.0666 "how often (in seconds) numeric values get updated on screen" + // hud panel aliases alias hud_panel_radar_rotate "toggle hud_panel_radar_rotation 0 1 2 3 4" alias +hud_panel_radar_maximized "cl_cmd hud radar 1" diff --git a/gfx/menu/luma/crosshairbutton_c.tga b/gfx/menu/luma/crosshairbutton_c.tga deleted file mode 100644 index ecfd0a86e0..0000000000 Binary files a/gfx/menu/luma/crosshairbutton_c.tga and /dev/null differ diff --git a/gfx/menu/luma/crosshairbutton_d.tga b/gfx/menu/luma/crosshairbutton_d.tga deleted file mode 100644 index 4e7901ebc6..0000000000 Binary files a/gfx/menu/luma/crosshairbutton_d.tga and /dev/null differ diff --git a/gfx/menu/luma/crosshairbutton_f.tga b/gfx/menu/luma/crosshairbutton_f.tga deleted file mode 100644 index 604a935bc9..0000000000 Binary files a/gfx/menu/luma/crosshairbutton_f.tga and /dev/null differ diff --git a/gfx/menu/luma/crosshairbutton_n.tga b/gfx/menu/luma/crosshairbutton_n.tga deleted file mode 100644 index 4e7901ebc6..0000000000 Binary files a/gfx/menu/luma/crosshairbutton_n.tga and /dev/null differ diff --git a/gfx/menu/luma/skinvalues.txt b/gfx/menu/luma/skinvalues.txt index 1e87e8869e..5a36d90e07 100644 --- a/gfx/menu/luma/skinvalues.txt +++ b/gfx/menu/luma/skinvalues.txt @@ -33,8 +33,10 @@ COLOR_CAMPAIGN_SELECTABLE '0.96 0.99 1' // charmap ALPHA_CHARMAP_CHAR 0.85 COLOR_CHARMAP_CHAR '1 1 1' -ALPHA_CHARMAP_FOCUS 0.85 -COLOR_CHARMAP_FOCUS '0.09 0.42 0.69' + +// crosshairpicker +ALPHA_CROSSHAIRPICKER_CROSSHAIR 0.85 +COLOR_CROSSHAIRPICKER_CROSSHAIR '1 1 1' // checkbox COLOR_CHECKBOX_C '1 1 1' @@ -142,6 +144,9 @@ ALPHA_LISTBOX_SELECTED 1 COLOR_LISTBOX_SELECTED '0.97 0.56 0.27' ALPHA_LISTBOX_WAITING 0.8 COLOR_LISTBOX_WAITING '0.73 0.82 0.9' +ALPHA_LISTBOX_FOCUSED 0.8 +FADEALPHA_LISTBOX_FOCUSED 0.4 +COLOR_LISTBOX_FOCUSED '0.09 0.42 0.69' // mainmenu ALPHAS_MAINMENU '0.8 0.9 1' diff --git a/gfx/menu/luminos/crosshairbutton_c.tga b/gfx/menu/luminos/crosshairbutton_c.tga deleted file mode 100644 index 586f9b47ef..0000000000 Binary files a/gfx/menu/luminos/crosshairbutton_c.tga and /dev/null differ diff --git a/gfx/menu/luminos/crosshairbutton_d.tga b/gfx/menu/luminos/crosshairbutton_d.tga deleted file mode 100755 index cba9d88c48..0000000000 Binary files a/gfx/menu/luminos/crosshairbutton_d.tga and /dev/null differ diff --git a/gfx/menu/luminos/crosshairbutton_f.tga b/gfx/menu/luminos/crosshairbutton_f.tga deleted file mode 100644 index 57d7d933cc..0000000000 Binary files a/gfx/menu/luminos/crosshairbutton_f.tga and /dev/null differ diff --git a/gfx/menu/luminos/crosshairbutton_n.tga b/gfx/menu/luminos/crosshairbutton_n.tga deleted file mode 100755 index ac945355ef..0000000000 Binary files a/gfx/menu/luminos/crosshairbutton_n.tga and /dev/null differ diff --git a/gfx/menu/luminos/skinvalues.txt b/gfx/menu/luminos/skinvalues.txt index 77af6c8dc0..b9c69802e4 100755 --- a/gfx/menu/luminos/skinvalues.txt +++ b/gfx/menu/luminos/skinvalues.txt @@ -108,6 +108,9 @@ COLOR_LISTBOX_SELECTED '1 0.4375 0' ALPHA_LISTBOX_SELECTED 1 COLOR_LISTBOX_WAITING '1 1 1' ALPHA_LISTBOX_WAITING 0.5 +COLOR_LISTBOX_FOCUSED '0 0.25 0.5' +ALPHA_LISTBOX_FOCUSED 0.7 +FADEALPHA_LISTBOX_FOCUSED 0.3 // item: map list COLOR_MAPLIST_TITLE '1 1 1' @@ -170,9 +173,6 @@ COLOR_CHECKBOX_C '1 1 1' COLOR_CHECKBOX_F '1 1 1' COLOR_CHECKBOX_D '1 1 1' -// item: crosshair button -// uses "crosshairbutton" images - // dialog background colors // uses "border" images COLOR_DIALOG_MULTIPLAYER '1 1 1' @@ -221,8 +221,10 @@ ALPHA_KEYGRABBER_KEYS 0.7 // item: charmap ALPHA_CHARMAP_CHAR 0.85 COLOR_CHARMAP_CHAR '1 1 1' -ALPHA_CHARMAP_FOCUS 1 -COLOR_CHARMAP_FOCUS '0 0.25 0.5' + +// item: crosshairpicker +ALPHA_CROSSHAIRPICKER_CROSSHAIR 0.85 +COLOR_CROSSHAIRPICKER_CROSSHAIR '1 1 1' // item: radio button // uses "radiobutton" images diff --git a/gfx/menu/wickedx/crosshairbutton_c.tga b/gfx/menu/wickedx/crosshairbutton_c.tga deleted file mode 100644 index 1c294f77f5..0000000000 Binary files a/gfx/menu/wickedx/crosshairbutton_c.tga and /dev/null differ diff --git a/gfx/menu/wickedx/crosshairbutton_d.tga b/gfx/menu/wickedx/crosshairbutton_d.tga deleted file mode 100755 index 110faa18b5..0000000000 Binary files a/gfx/menu/wickedx/crosshairbutton_d.tga and /dev/null differ diff --git a/gfx/menu/wickedx/crosshairbutton_f.tga b/gfx/menu/wickedx/crosshairbutton_f.tga deleted file mode 100644 index 0031c35e35..0000000000 Binary files a/gfx/menu/wickedx/crosshairbutton_f.tga and /dev/null differ diff --git a/gfx/menu/wickedx/crosshairbutton_n.tga b/gfx/menu/wickedx/crosshairbutton_n.tga deleted file mode 100755 index ac945355ef..0000000000 Binary files a/gfx/menu/wickedx/crosshairbutton_n.tga and /dev/null differ diff --git a/gfx/menu/wickedx/skinvalues.txt b/gfx/menu/wickedx/skinvalues.txt index 8b56baa1f3..09ded4b087 100644 --- a/gfx/menu/wickedx/skinvalues.txt +++ b/gfx/menu/wickedx/skinvalues.txt @@ -108,6 +108,9 @@ COLOR_LISTBOX_SELECTED '0.875 0.375 0' ALPHA_LISTBOX_SELECTED 1 COLOR_LISTBOX_WAITING '1 1 1' ALPHA_LISTBOX_WAITING 0.5 +COLOR_LISTBOX_FOCUSED '0 0.375 0.75' +ALPHA_LISTBOX_FOCUSED 0.35 +FADEALPHA_LISTBOX_FOCUSED 0.75 // item: map list COLOR_MAPLIST_TITLE '1 1 1' @@ -170,9 +173,6 @@ COLOR_CHECKBOX_C '0.5 0.75 1' COLOR_CHECKBOX_F '0.5 0.75 1' COLOR_CHECKBOX_D '1 1 1' -// item: crosshair button -// uses "crosshairbutton" images - // dialog background colors // uses "border" images COLOR_DIALOG_MULTIPLAYER '1 1 1' @@ -221,8 +221,10 @@ ALPHA_KEYGRABBER_KEYS 0.7 // item: charmap ALPHA_CHARMAP_CHAR 0.85 COLOR_CHARMAP_CHAR '1 1 1' -ALPHA_CHARMAP_FOCUS 0.75 -COLOR_CHARMAP_FOCUS '0 0.375 0.75' + +// item: crosshairpicker +ALPHA_CROSSHAIRPICKER_CROSSHAIR 0.85 +COLOR_CROSSHAIRPICKER_CROSSHAIR '1 1 1' // item: radio button // uses "radiobutton" images diff --git a/gfx/menu/xaw/crosshairbutton_c.tga b/gfx/menu/xaw/crosshairbutton_c.tga deleted file mode 100644 index 646c64e695..0000000000 Binary files a/gfx/menu/xaw/crosshairbutton_c.tga and /dev/null differ diff --git a/gfx/menu/xaw/crosshairbutton_d.tga b/gfx/menu/xaw/crosshairbutton_d.tga deleted file mode 100644 index 110faa18b5..0000000000 Binary files a/gfx/menu/xaw/crosshairbutton_d.tga and /dev/null differ diff --git a/gfx/menu/xaw/crosshairbutton_f.tga b/gfx/menu/xaw/crosshairbutton_f.tga deleted file mode 100644 index d8f25efd89..0000000000 Binary files a/gfx/menu/xaw/crosshairbutton_f.tga and /dev/null differ diff --git a/gfx/menu/xaw/crosshairbutton_n.tga b/gfx/menu/xaw/crosshairbutton_n.tga deleted file mode 100644 index 5d678a6cd8..0000000000 Binary files a/gfx/menu/xaw/crosshairbutton_n.tga and /dev/null differ diff --git a/gfx/menu/xaw/skinvalues.txt b/gfx/menu/xaw/skinvalues.txt index 57c6f2a350..00df32498e 100644 --- a/gfx/menu/xaw/skinvalues.txt +++ b/gfx/menu/xaw/skinvalues.txt @@ -107,9 +107,6 @@ ALPHA_CREDITS_PERSON 1 ROWS_CREDITS 20 WIDTH_CREDITS 0.5 -// item: crosshair button -// uses "crosshairbutton" images - // item: cvar list ALPHA_CVARLIST_SAVED 1 ALPHA_CVARLIST_TEMPORARY 0.7 @@ -152,8 +149,11 @@ COLOR_LISTBOX_SELECTED '0 0 0' ALPHA_LISTBOX_SELECTED 1 COLOR_LISTBOX_WAITING '1 0 0' ALPHA_LISTBOX_WAITING 0.5 -COLOR_LISTBOX_BACKGROUND '0 0 0' -ALPHA_LISTBOX_BACKGROUND 0 +COLOR_LISTBOX_BACKGROUND '0 0 0' +ALPHA_LISTBOX_BACKGROUND 0 +COLOR_LISTBOX_FOCUSED '0 0 0' +ALPHA_LISTBOX_FOCUSED 0.3 +FADEALPHA_LISTBOX_FOCUSED 0.3 // item: map list COLOR_MAPLIST_TITLE '1 1 1' @@ -176,8 +176,10 @@ ALPHA_MODELTITLE 1 // item: charmap ALPHA_CHARMAP_CHAR 0.85 COLOR_CHARMAP_CHAR '1 1 1' -ALPHA_CHARMAP_FOCUS 0.5 -COLOR_CHARMAP_FOCUS '0 0 0' + +// item: crosshairpicker +ALPHA_CROSSHAIRPICKER_CROSSHAIR 0.85 +COLOR_CROSSHAIRPICKER_CROSSHAIR '1 1 1' // item: radio button // uses "radiobutton" images diff --git a/qcsrc/client/_all.qh b/qcsrc/client/_all.qh index c8ff79d58b..e758fdb7a7 100644 --- a/qcsrc/client/_all.qh +++ b/qcsrc/client/_all.qh @@ -1,5 +1,5 @@ -#ifndef CLIENT___H -#define CLIENT___H +#ifndef CLIENT_ALL_H +#define CLIENT_ALL_H #include "autocvars.qh" #include "defs.qh" diff --git a/qcsrc/client/autocvars.qh b/qcsrc/client/autocvars.qh index e35bf82dd2..90faef9411 100644 --- a/qcsrc/client/autocvars.qh +++ b/qcsrc/client/autocvars.qh @@ -282,10 +282,12 @@ float autocvar_hud_panel_notify_fontsize; float autocvar_hud_panel_notify_time; float autocvar_hud_panel_notify_icon_aspect; bool autocvar_hud_panel_physics; +float autocvar_hud_panel_physics_acceleration_movingaverage = 1; float autocvar_hud_panel_physics_acceleration_progressbar_mode; float autocvar_hud_panel_physics_acceleration_progressbar_scale; float autocvar_hud_panel_physics_acceleration_progressbar_nonlinear; float autocvar_hud_panel_physics_acceleration_max; +float autocvar_hud_panel_physics_update_interval; int autocvar_hud_panel_physics_progressbar; bool autocvar_hud_panel_physics_acceleration_vertical; int autocvar_hud_panel_physics_baralign; diff --git a/qcsrc/client/command/all.qc b/qcsrc/client/command/all.qc new file mode 100644 index 0000000000..dcace65938 --- /dev/null +++ b/qcsrc/client/command/all.qc @@ -0,0 +1,5 @@ +#include "../_all.qh" + +#include "../../common/command/all.qc" + +#include "cl_cmd.qc" diff --git a/qcsrc/client/command/all.qh b/qcsrc/client/command/all.qh new file mode 100644 index 0000000000..34fc423a40 --- /dev/null +++ b/qcsrc/client/command/all.qh @@ -0,0 +1,8 @@ +#ifndef CLIENT_COMMANDS_ALL_H +#define CLIENT_COMMANDS_ALL_H + +#include "../../common/command/all.qh" + +#include "cl_cmd.qh" + +#endif diff --git a/qcsrc/client/command/commands.qc b/qcsrc/client/command/commands.qc deleted file mode 100644 index dabf8f35ad..0000000000 --- a/qcsrc/client/command/commands.qc +++ /dev/null @@ -1,5 +0,0 @@ -#include "../_all.qh" - -#include "../../common/command/commands.qc" - -#include "cl_cmd.qc" diff --git a/qcsrc/client/command/commands.qh b/qcsrc/client/command/commands.qh deleted file mode 100644 index 65bf3dab93..0000000000 --- a/qcsrc/client/command/commands.qh +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef CLIENT_COMMANDS_H -#define CLIENT_COMMANDS_H - -#include "../../common/command/commands.qh" - -#include "cl_cmd.qh" - -#endif diff --git a/qcsrc/client/damage.qc b/qcsrc/client/damage.qc index 9241621382..39c422e1cc 100644 --- a/qcsrc/client/damage.qc +++ b/qcsrc/client/damage.qc @@ -5,13 +5,13 @@ #include "movetypes.qh" #include "prandom.qh" -#include "vehicles/vehicles.qh" +#include "vehicles/all.qh" #include "../common/constants.qh" #include "../common/deathtypes.qh" #include "../common/util.qh" -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" .entity tag_entity; diff --git a/qcsrc/client/hud.qc b/qcsrc/client/hud.qc index 33e9cb5f5f..b61fe2a5da 100644 --- a/qcsrc/client/hud.qc +++ b/qcsrc/client/hud.qc @@ -3909,6 +3909,7 @@ void HUD_InfoMessages(void) // vector acc_prevspeed; float acc_prevtime, acc_avg, top_speed, top_speed_time; +float physics_update_time, discrete_speed, discrete_acceleration; void HUD_Physics(void) { if(!autocvar__hud_configure) @@ -3996,8 +3997,23 @@ void HUD_Physics(void) acc_prevspeed = vel; acc_prevtime = time; - f = bound(0, f * 10, 1); - acc_avg = acc_avg * (1 - f) + acceleration * f; + if(autocvar_hud_panel_physics_acceleration_movingaverage) + { + f = bound(0, f * 10, 1); + acc_avg = acc_avg * (1 - f) + acceleration * f; + acceleration = acc_avg; + } + } + + int acc_decimals = 2; + if(time > physics_update_time) + { + // workaround for ftos_decimals returning a negative 0 + if(discrete_acceleration > -1 / pow(10, acc_decimals) && discrete_acceleration < 0) + discrete_acceleration = 0; + discrete_acceleration = acceleration; + discrete_speed = speed; + physics_update_time += autocvar_hud_panel_physics_update_interval; } //compute layout @@ -4051,7 +4067,7 @@ void HUD_Physics(void) //else //tmp_offset_x = 0; tmp_offset.y = (panel_size.y - tmp_size.y) / 2; - drawstring_aspect(panel_pos + speed_offset + tmp_offset, ftos(speed), tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + drawstring_aspect(panel_pos + speed_offset + tmp_offset, ftos(discrete_speed), tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); //draw speed unit if (speed_baralign) @@ -4141,7 +4157,7 @@ void HUD_Physics(void) f = acceleration/autocvar_hud_panel_physics_acceleration_max; if (autocvar_hud_panel_physics_acceleration_progressbar_nonlinear) - f = sqrt(f); + f = (f >= 0 ? sqrt(f) : -sqrt(-f)); if (acceleration_progressbar_scale) // allow progressbar to go out of panel bounds { @@ -4163,12 +4179,16 @@ void HUD_Physics(void) HUD_Panel_DrawProgressBar(panel_pos + acceleration_offset + tmp_offset, tmp_size, "accelbar", f, 0, acceleration_baralign, progressbar_color, autocvar_hud_progressbar_alpha * panel_fg_alpha, DRAWFLAG_NORMAL); } - tmp_size.x = panel_size.x; - tmp_size.y = panel_size.y * text_scale; - tmp_offset.x = 0; - tmp_offset.y = (panel_size.y - tmp_size.y) / 2; - if (autocvar_hud_panel_physics_text == 1 || autocvar_hud_panel_physics_text == 3) - drawstring_aspect(panel_pos + acceleration_offset + tmp_offset, strcat(ftos_decimals(acceleration, 2), "g"), tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + + if(autocvar_hud_panel_physics_text == 1 || autocvar_hud_panel_physics_text == 3) + { + tmp_size.x = panel_size.x; + tmp_size.y = panel_size.y * text_scale; + tmp_offset.x = 0; + tmp_offset.y = (panel_size.y - tmp_size.y) / 2; + + drawstring_aspect(panel_pos + acceleration_offset + tmp_offset, strcat(ftos_decimals(discrete_acceleration, acc_decimals), "g"), tmp_size, '1 1 1', panel_fg_alpha, DRAWFLAG_NORMAL); + } draw_endBoldFont(); } @@ -4296,15 +4316,23 @@ void HUD_CenterPrint (void) reset_centerprint_messages(); if (time > hud_configure_cp_generation_time) { - float r; - r = random(); - if (r > 0.75) - centerprint_generic(floor(r*1000), strcat(sprintf("^3Countdown message at time %s", seconds_tostring(time)), ", seconds left: ^COUNT"), 1, 10); - else if (r > 0.5) - centerprint_generic(0, sprintf("^1Multiline message at time %s that\n^1lasts longer than normal", seconds_tostring(time)), 20, 0); + if(HUD_PANEL(CENTERPRINT) == highlightedPanel) + { + float r; + r = random(); + if (r > 0.8) + centerprint_generic(floor(r*1000), strcat(sprintf("^3Countdown message at time %s", seconds_tostring(time)), ", seconds left: ^COUNT"), 1, 10); + else if (r > 0.55) + centerprint_generic(0, sprintf("^1Multiline message at time %s that\n^1lasts longer than normal", seconds_tostring(time)), 20, 0); + else + centerprint_hud(sprintf("Message at time %s", seconds_tostring(time))); + hud_configure_cp_generation_time = time + 1 + random()*4; + } else - centerprint_hud(sprintf("Message at time %s", seconds_tostring(time))); - hud_configure_cp_generation_time = time + 1 + random()*4; + { + centerprint_generic(0, sprintf("Centerprint message", seconds_tostring(time)), 10, 0); + hud_configure_cp_generation_time = time + 10 - random()*3; + } } } diff --git a/qcsrc/client/hud.qh b/qcsrc/client/hud.qh index f880a810f6..3b61cb4539 100644 --- a/qcsrc/client/hud.qh +++ b/qcsrc/client/hud.qh @@ -1,7 +1,7 @@ #ifndef HUD_H #define HUD_H -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" const int HUD_PANEL_MAX = 24; entity hud_panel[HUD_PANEL_MAX]; @@ -292,27 +292,18 @@ HUD_PANELS(HUD_PANEL) } while(0) // return smoothly faded pos and size of given panel when a dialog is active -#define HUD_Panel_UpdatePosSize_ForMenu() do { \ - vector menu_enable_pos; \ - vector menu_enable_size = '0 0 0'; \ - float menu_enable_maxsize_x = 0.3 * vid_conwidth; \ - float menu_enable_maxsize_y = 0.18 * vid_conheight; \ - if (panel_size.x > panel_size.y) { \ - if (panel_size.y > menu_enable_maxsize_y) { \ - menu_enable_size.y = menu_enable_maxsize_y; \ - menu_enable_size.x = panel_size.x * (menu_enable_maxsize_y/panel_size.y); \ - panel_size = (1 - autocvar__menu_alpha) * panel_size + (autocvar__menu_alpha) * menu_enable_size; \ - } \ - menu_enable_pos = eX * 0.5 * vid_conwidth - eX * 0.5 * panel_size.x + eY * (vid_conheight - menu_enable_maxsize_y);\ - } else { \ - if (panel_size.x > menu_enable_maxsize_x) { \ - menu_enable_size.x = menu_enable_maxsize_x; \ - menu_enable_size.y = panel_size.y * (menu_enable_maxsize_x/panel_size.x); \ - panel_size = (1 - autocvar__menu_alpha) * panel_size + (autocvar__menu_alpha) * menu_enable_size; \ - } \ - menu_enable_pos = eY * 0.5 * vid_conheight - eY * 0.5 * panel_size.y + eX * (vid_conwidth - menu_enable_maxsize_x);\ - } \ - panel_pos = (1 - autocvar__menu_alpha) * panel_pos + (autocvar__menu_alpha) * menu_enable_pos; \ +// don't center too wide panels, it doesn't work with different resolutions +#define HUD_Panel_UpdatePosSize_ForMenu() do { \ + vector menu_enable_size = panel_size; \ + float max_panel_width = 0.52 * vid_conwidth; \ + if(panel_size.x > max_panel_width) \ + { \ + menu_enable_size.x = max_panel_width; \ + menu_enable_size.y = panel_size.y * (menu_enable_size.x / panel_size.x); \ + } \ + vector menu_enable_pos = eX * (panel_bg_border + 0.5 * max_panel_width) + eY * 0.5 * vid_conheight - 0.5 * menu_enable_size; \ + panel_pos = (1 - autocvar__menu_alpha) * panel_pos + (autocvar__menu_alpha) * menu_enable_pos; \ + panel_size = (1 - autocvar__menu_alpha) * panel_size + (autocvar__menu_alpha) * menu_enable_size; \ } while(0) // Scale the pos and size vectors to absolute coordinates diff --git a/qcsrc/client/hud_config.qc b/qcsrc/client/hud_config.qc index 3352e643ab..4b55bb40e9 100644 --- a/qcsrc/client/hud_config.qc +++ b/qcsrc/client/hud_config.qc @@ -431,8 +431,7 @@ void HUD_Panel_SetPosSize(vector mySize) { panel = highlightedPanel; HUD_Panel_UpdatePosSize(); - vector resizeorigin; - resizeorigin = panel_click_resizeorigin; + vector resizeorigin = panel_click_resizeorigin; vector myPos; // minimum panel size cap @@ -565,7 +564,6 @@ void HUD_Panel_Arrow_Action(float nPrimary) if (hudShiftState & S_ALT) // resize { - highlightedAction = 1; if(nPrimary == K_UPARROW) resizeCorner = 1; else if(nPrimary == K_RIGHTARROW) @@ -602,7 +600,6 @@ void HUD_Panel_Arrow_Action(float nPrimary) } else // move { - highlightedAction = 2; vector pos; pos = panel_pos; if(nPrimary == K_UPARROW) @@ -744,15 +741,14 @@ float HUD_Panel_InputEvent(float bInputType, float nPrimary, float nSecondary) if (!menu_enabled) cvar_set("_hud_configure", "0"); } - else if(nPrimary == K_TAB && hudShiftState & S_CTRL) // select and highlight another panel + else if(nPrimary == K_TAB && hudShiftState & S_CTRL) // switch panel { if (bInputType == 1 || mouseClicked) return true; - //FIXME: if a panel is highlighted, has the same pos_x and lays in the same level - //of other panels then next consecutive ctrl-tab will select the highlighted panel too - //(it should only after every other panel of the hud) - //It's a minor bug anyway, we can live with it + // FIXME minor bug: if a panel is highlighted, has the same pos_x and + // lays in the same level of another panel then the next consecutive + // CTRL TAB presses will reselect once more the highlighted panel entity starting_panel; entity old_tab_panel = tab_panel; @@ -897,6 +893,12 @@ float HUD_Panel_InputEvent(float bInputType, float nPrimary, float nSecondary) highlightedPanel_backup = world; } } + else if(nPrimary == 's' && hudShiftState & S_CTRL) // save config + { + if (bInputType == 1 || mouseClicked) + return true; + localcmd("hud save myconfig\n"); + } else if(nPrimary == K_UPARROW || nPrimary == K_DOWNARROW || nPrimary == K_LEFTARROW || nPrimary == K_RIGHTARROW) { if (bInputType == 1) @@ -917,7 +919,7 @@ float HUD_Panel_InputEvent(float bInputType, float nPrimary, float nSecondary) if (highlightedPanel) HUD_Panel_EnableMenu(); } - else if(hit_con_bind) + else if(hit_con_bind || nPrimary == K_PAUSE) return false; return true; @@ -1176,6 +1178,8 @@ void HUD_Panel_Mouse() } else { + if(prevMouseClicked) + highlightedAction = 0; if(menu_enabled == 2) mouse_over_panel = 0; else diff --git a/qcsrc/client/main.qc b/qcsrc/client/main.qc index 5343c180cc..7648b12977 100644 --- a/qcsrc/client/main.qc +++ b/qcsrc/client/main.qc @@ -25,21 +25,23 @@ #include "waypointsprites.qh" #include "vehicles/bumblebee.qh" -#include "vehicles/vehicles.qh" +#include "vehicles/all.qh" #include "weapons/projectile.qh" #include "../common/buffs.qh" #include "../common/deathtypes.qh" #include "../common/mapinfo.qh" -#include "../common/monsters/monsters.qh" +#include "../common/monsters/all.qh" #include "../common/nades.qh" #include "../common/net_notice.qh" #include "../common/notifications.qh" #include "../common/stats.qh" #include "../common/teams.qh" -#include "../common/weapons/weapons.qh" +#include "../common/items/all.qh" + +#include "../common/weapons/all.qh" #include "../csqcmodellib/cl_model.qh" #include "../csqcmodellib/interpolate.qh" @@ -136,6 +138,7 @@ void CSQC_Init(void) // needs to be done so early because of the constants they create CALL_ACCUMULATED_FUNCTION(RegisterWeapons); CALL_ACCUMULATED_FUNCTION(RegisterMonsters); + CALL_ACCUMULATED_FUNCTION(RegisterItems); CALL_ACCUMULATED_FUNCTION(RegisterGametypes); CALL_ACCUMULATED_FUNCTION(RegisterNotifications); CALL_ACCUMULATED_FUNCTION(RegisterDeathtypes); @@ -856,6 +859,7 @@ void CSQC_Ent_Update(float bIsNewEntity) case ENT_CLIENT_WARPZONE_TELEPORTED: WarpZone_Teleported_Read(bIsNewEntity); break; case ENT_CLIENT_TRIGGER_MUSIC: Ent_ReadTriggerMusic(); break; case ENT_CLIENT_HOOK: Ent_ReadHook(bIsNewEntity, ENT_CLIENT_HOOK); break; + case ENT_CLIENT_INVENTORY: Inventory_Read(self); break; case ENT_CLIENT_ARC_BEAM: Ent_ReadArcBeam(bIsNewEntity); break; case ENT_CLIENT_ACCURACY: Ent_ReadAccuracy(); break; case ENT_CLIENT_AUXILIARYXHAIR: Net_AuXair2(bIsNewEntity); break; diff --git a/qcsrc/client/progs.src b/qcsrc/client/progs.src index 36d159c75e..8ba12b9e71 100644 --- a/qcsrc/client/progs.src +++ b/qcsrc/client/progs.src @@ -37,10 +37,10 @@ view.qc wall.qc waypointsprites.qc -command/commands.qc +command/all.qc vehicles/bumblebee.qc -vehicles/vehicles.qc +vehicles/all.qc weapons/projectile.qc // TODO @@ -55,9 +55,11 @@ weapons/projectile.qc // TODO ../common/urllib.qc ../common/util.qc -../common/monsters/monsters.qc +../common/items/all.qc -../common/weapons/weapons.qc // TODO +../common/monsters/all.qc + +../common/weapons/all.qc // TODO ../csqcmodellib/cl_model.qc ../csqcmodellib/cl_player.qc diff --git a/qcsrc/client/t_items.qc b/qcsrc/client/t_items.qc index f9ebb97866..ca631fcbd5 100644 --- a/qcsrc/client/t_items.qc +++ b/qcsrc/client/t_items.qc @@ -3,7 +3,7 @@ #include "movetypes.qh" #include "../common/buffs.qh" #include "../common/util.qh" -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" #include "../csqcmodellib/cl_model.qh" #include "../csqcmodellib/common.qh" diff --git a/qcsrc/client/vehicles/all.qc b/qcsrc/client/vehicles/all.qc new file mode 100644 index 0000000000..0af4d4b967 --- /dev/null +++ b/qcsrc/client/vehicles/all.qc @@ -0,0 +1,1054 @@ +#include "all.qh" +#include "../_all.qh" + +#include "../movetypes.qh" +#include "../movetypes.qh" +#include "../prandom.qh" +#include "../scoreboard.qh" +#include "../t_items.qh" + +#include "../../common/buffs.qh" +#include "../../common/constants.qh" +#include "../../common/stats.qh" +#include "../../common/util.qh" + +#include "../../csqcmodellib/cl_model.qh" + +.float cnt; + +const string hud_bg = "gfx/vehicles/frame.tga"; +const string hud_sh = "gfx/vehicles/vh-shield.tga"; + +const string hud_hp_bar = "gfx/vehicles/bar_up_left.tga"; +const string hud_hp_ico = "gfx/vehicles/health.tga"; +const string hud_sh_bar = "gfx/vehicles/bar_dwn_left.tga"; +const string hud_sh_ico = "gfx/vehicles/shield.tga"; + +const string hud_ammo1_bar = "gfx/vehicles/bar_up_right.tga"; +const string hud_ammo1_ico = "gfx/vehicles/bullets.tga"; +const string hud_ammo2_bar = "gfx/vehicles/bar_dwn_right.tga"; +const string hud_ammo2_ico = "gfx/vehicles/rocket.tga"; +const string hud_energy = "gfx/vehicles/energy.tga"; + +const int SBRM_FIRST = 1; +const int SBRM_VOLLY = 1; +const int SBRM_GUIDE = 2; +const int SBRM_ARTILLERY = 3; +const int SBRM_LAST = 3; + +const int RSM_FIRST = 1; +const int RSM_BOMB = 1; +const int RSM_FLARE = 2; +const int RSM_LAST = 2; + +entity dropmark; +float autocvar_cl_vehicles_hudscale = 0.5; +float autocvar_cl_vehicles_hudalpha = 0.75; + +const string raptor_ico = "gfx/vehicles/raptor.tga"; +const string raptor_gun = "gfx/vehicles/raptor_guns.tga"; +const string raptor_bomb = "gfx/vehicles/raptor_bombs.tga"; +const string raptor_drop = "gfx/vehicles/axh-dropcross.tga"; +string raptor_xhair; + + + +const int MAX_AXH = 4; +entity AuxiliaryXhairs[MAX_AXH]; + +entityclass(AuxiliaryXhair); +class(AuxiliaryXhair) .string axh_image; +class(AuxiliaryXhair) .float axh_fadetime; +class(AuxiliaryXhair) .float axh_drawflag; +class(AuxiliaryXhair) .float axh_scale; + +const string bumb_ico = "gfx/vehicles/bumb.tga"; +const string bumb_lgun = "gfx/vehicles/bumb_lgun.tga"; +const string bumb_rgun = "gfx/vehicles/bumb_rgun.tga"; + +const string bumb_gun_ico = "gfx/vehicles/bumb_side.tga"; +const string bumb_gun_gun = "gfx/vehicles/bumb_side_gun.tga"; + +const string spider_ico = "gfx/vehicles/sbot.tga"; +const string spider_rkt = "gfx/vehicles/sbot_rpods.tga"; +const string spider_mgun = "gfx/vehicles/sbot_mguns.tga"; +string spider_xhair; // = "gfx/vehicles/axh-special1.tga"; + +const string waki_ico = "gfx/vehicles/waki.tga"; +const string waki_eng = "gfx/vehicles/waki_e.tga"; +const string waki_gun = "gfx/vehicles/waki_guns.tga"; +const string waki_rkt = "gfx/vehicles/waki_rockets.tga"; +const string waki_xhair = "gfx/vehicles/axh-special1.tga"; + +float alarm1time; +float alarm2time; +int weapon2mode; + +void AuxiliaryXhair_Draw2D() +{ + vector loc, psize; + + psize = self.axh_scale * draw_getimagesize(self.axh_image); + loc = project_3d_to_2d(self.move_origin) - 0.5 * psize; + if (!(loc.z < 0 || loc.x < 0 || loc.y < 0 || loc.x > vid_conwidth || loc.y > vid_conheight)) + { + loc.z = 0; + psize.z = 0; + drawpic(loc, self.axh_image, psize, self.colormod, self.alpha, self.axh_drawflag); + } + + if(time - self.cnt > self.axh_fadetime) + self.draw2d = func_null; +} + +void Net_AuXair2(bool bIsNew) +{ + int axh_id = bound(0, ReadByte(), MAX_AXH); + entity axh = AuxiliaryXhairs[axh_id]; + + if(axh == world || wasfreed(axh)) // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?) + { + axh = spawn(); + axh.draw2d = func_null; + axh.drawmask = MASK_NORMAL; + axh.axh_drawflag = DRAWFLAG_ADDITIVE; + axh.axh_fadetime = 0.1; + axh.axh_image = "gfx/vehicles/axh-ring.tga"; + axh.axh_scale = 1; + axh.alpha = 1; + AuxiliaryXhairs[axh_id] = axh; + } + + axh.move_origin_x = ReadCoord(); + axh.move_origin_y = ReadCoord(); + axh.move_origin_z = ReadCoord(); + axh.colormod_x = ReadByte() / 255; + axh.colormod_y = ReadByte() / 255; + axh.colormod_z = ReadByte() / 255; + axh.cnt = time; + axh.draw2d = AuxiliaryXhair_Draw2D; +} + +void Net_VehicleSetup() +{ + int hud_id = ReadByte(); + + // Weapon update? + if(hud_id > HUD_VEHICLE_LAST) + { + weapon2mode = hud_id - HUD_VEHICLE_LAST; + return; + } + + // hud_id == 0 means we exited a vehicle, so stop alarm sound/s + if(hud_id == 0) + { + sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); + sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); + return; + } + + hud_id = bound(HUD_VEHICLE_FIRST, hud_id, HUD_VEHICLE_LAST); + + // Init auxiliary crosshairs + int i; + for(i = 0; i < MAX_AXH; ++i) + { + entity axh = AuxiliaryXhairs[i]; + if(axh != world && !wasfreed(axh)) // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?) + remove(axh); + + axh = spawn(); + axh.draw2d = func_null; + axh.drawmask = MASK_NORMAL; + axh.axh_drawflag = DRAWFLAG_NORMAL; + axh.axh_fadetime = 0.1; + axh.axh_image = "gfx/vehicles/axh-ring.tga"; + axh.axh_scale = 1; + axh.alpha = 1; + AuxiliaryXhairs[i] = axh; + } + + switch(hud_id) + { + case HUD_SPIDERBOT: + // Minigun1 + AuxiliaryXhairs[0].axh_image = "gfx/vehicles/axh-ring.tga"; + AuxiliaryXhairs[0].axh_scale = 0.25; + // Minigun2 + AuxiliaryXhairs[1].axh_image = "gfx/vehicles/axh-ring.tga"; + AuxiliaryXhairs[1].axh_scale = 0.25; + // Rocket + AuxiliaryXhairs[2].axh_image = "gfx/vehicles/axh-special1.tga"; + AuxiliaryXhairs[2].axh_scale = 0.5; + break; + + case HUD_WAKIZASHI: + AuxiliaryXhairs[0].axh_image = "gfx/vehicles/axh-bracket.tga"; + AuxiliaryXhairs[0].axh_scale = 0.25; + break; + + case HUD_RAPTOR: + AuxiliaryXhairs[0].axh_image = "gfx/vehicles/axh-special2.tga"; + AuxiliaryXhairs[0].axh_scale = 0.5; + //AuxiliaryXhair[0].alpha = 0.5; + + AuxiliaryXhairs[1].axh_image = "gfx/vehicles/axh-bracket.tga"; + AuxiliaryXhairs[1].axh_scale = 0.25; + //AuxiliaryXhair[1].alpha = 0.75; + //AuxiliaryXhair[1].axh_drawflag = DRAWFLAG_NORMAL; + break; + + case HUD_BUMBLEBEE: + // Raygun-locked + AuxiliaryXhairs[0].axh_image = "gfx/vehicles/axh-bracket.tga"; + AuxiliaryXhairs[0].axh_scale = 0.5; + + // Gunner1 + AuxiliaryXhairs[1].axh_image = "gfx/vehicles/axh-target.tga"; + AuxiliaryXhairs[1].axh_scale = 0.75; + + // Gunner2 + AuxiliaryXhairs[2].axh_image = "gfx/vehicles/axh-target.tga"; + AuxiliaryXhairs[2].axh_scale = 0.75; + break; + case HUD_BUMBLEBEE_GUN: + // Plasma cannons + AuxiliaryXhairs[0].axh_image = "gfx/vehicles/axh-bracket.tga"; + AuxiliaryXhairs[0].axh_scale = 0.25; + // Raygun + AuxiliaryXhairs[1].axh_image = "gfx/vehicles/axh-bracket.tga"; + AuxiliaryXhairs[1].axh_scale = 0.25; + break; + } +} +#define HUD_GETSTATS \ + int vh_health = getstati(STAT_VEHICLESTAT_HEALTH); \ + float shield = getstati(STAT_VEHICLESTAT_SHIELD); \ + noref int energy = getstati(STAT_VEHICLESTAT_ENERGY); \ + noref float ammo1 = getstati(STAT_VEHICLESTAT_AMMO1); \ + noref float reload1 = getstati(STAT_VEHICLESTAT_RELOAD1); \ + noref int ammo2 = getstati(STAT_VEHICLESTAT_AMMO2); \ + noref int reload2 = getstati(STAT_VEHICLESTAT_RELOAD2); + +void CSQC_BUMBLE_HUD() +{ +/* + drawpic(hudloc, waki_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL); + drawpic(hudloc, waki_b, picsize, '0 1 0' * health + '1 0 0' * (1 - health), 1, DRAWFLAG_NORMAL); + drawpic(hudloc, waki_r, picsize, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL); + drawpic(hudloc, waki_e, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); +*/ + if(autocvar_r_letterbox) + return; + + vector picsize, hudloc = '0 0 0', pic2size, picloc; + + // Fetch health & ammo stats + HUD_GETSTATS + + picsize = draw_getimagesize(hud_bg) * autocvar_cl_vehicles_hudscale; + hudloc.y = vid_conheight - picsize.y; + hudloc.x = vid_conwidth * 0.5 - picsize.x * 0.5; + + drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL); + + shield *= 0.01; + vh_health *= 0.01; + energy *= 0.01; + reload1 *= 0.01; + + pic2size = draw_getimagesize(bumb_ico) * (autocvar_cl_vehicles_hudscale * 0.8); + picloc = picsize * 0.5 - pic2size * 0.5; + + if(vh_health < 0.25) + drawpic(hudloc + picloc, bumb_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + else + drawpic(hudloc + picloc, bumb_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL); + + drawpic(hudloc + picloc, bumb_lgun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); + drawpic(hudloc + picloc, bumb_lgun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); + drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL); + +// Health bar + picsize = draw_getimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale; + picloc = '69 69 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - vh_health)), 0, vid_conwidth, vid_conheight); + drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL); + drawresetcliparea(); +// .. and icon + picsize = draw_getimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale; + picloc = '37 65 0' * autocvar_cl_vehicles_hudscale; + if(vh_health < 0.25) + { + if(alarm1time < time) + { + alarm1time = time + 2; + sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTEN_NONE); + } + + drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + } + else + { + drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + if(alarm1time) + { + sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); + alarm1time = 0; + } + } + +// Shield bar + picsize = draw_getimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale; + picloc = '69 140 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - shield)), 0, vid_conwidth, vid_conheight); + drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawresetcliparea(); +// .. and icon + picloc = '40 136 0' * autocvar_cl_vehicles_hudscale; + picsize = draw_getimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale; + if(shield < 0.25) + { + if(alarm2time < time) + { + alarm2time = time + 1; + sound(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTEN_NONE); + } + drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + } + else + { + drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + if(alarm2time) + { + sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); + alarm2time = 0; + } + } + + ammo1 *= 0.01; + ammo2 *= 0.01; + +// Gunner1 bar + picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale; + picloc = '450 69 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * ammo1, vid_conheight); + drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawresetcliparea(); + +// Right gunner slot occupied? + if(!AuxiliaryXhairs[1].draw2d) + { + shield = (picsize.x * 0.5) - (0.5 * stringwidth(_("No right gunner!"), false, '1 0 0' * picsize.y + '0 1 0' * picsize.y)); + drawfill(hudloc + picloc - '0.2 0.2 0', picsize + '0.4 0.4 0', '0.25 0.25 0.25', 0.75, DRAWFLAG_NORMAL); + drawstring(hudloc + picloc + '1 0 0' * shield, _("No right gunner!"), '1 0 0' * picsize.y + '0 1 0' * picsize.y, '1 0 0' + '0 1 1' * sin(time * 10), 1, DRAWFLAG_NORMAL); + } + +// .. and icon + picsize = 1.5 * draw_getimagesize(hud_energy) * autocvar_cl_vehicles_hudscale; + picloc = '664 60 0' * autocvar_cl_vehicles_hudscale; + if(ammo1 < 0.2) + drawpic(hudloc + picloc, hud_energy, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + else + drawpic(hudloc + picloc, hud_energy, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + +// Gunner2 bar + picsize = draw_getimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale; + picloc = '450 140 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * ammo2, vid_conheight); + drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawresetcliparea(); +// Left gunner slot occupied? + if(!AuxiliaryXhairs[2].draw2d) + { + shield = (picsize.x * 0.5) - (0.5 * stringwidth(_("No left gunner!"), false, '1 0 0' * picsize.y + '0 1 0' * picsize.y)); + drawfill(hudloc + picloc - '0.2 0.2 0', picsize + '0.4 0.4 0', '0.25 0.25 0.25', 0.75, DRAWFLAG_NORMAL); + drawstring(hudloc + picloc + '1 0 0' * shield, _("No left gunner!"), '1 0 0' * picsize.y + '0 1 0' * picsize.y, '1 0 0' + '0 1 1' * sin(time * 10), 1, DRAWFLAG_NORMAL); + } + +// .. and icon + picsize = 1.5 * draw_getimagesize(hud_energy) * autocvar_cl_vehicles_hudscale; + picloc = '664 130 0' * autocvar_cl_vehicles_hudscale; + if(ammo2 < 0.2) + drawpic(hudloc + picloc, hud_energy, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + else + drawpic(hudloc + picloc, hud_energy, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + + if (scoreboard_showscores) + HUD_DrawScoreboard(); + else + { + picsize = draw_getimagesize(waki_xhair); + picsize.x *= 0.5; + picsize.y *= 0.5; + drawpic('0.5 0 0' * (vid_conwidth - picsize.x) + '0 0.5 0' * (vid_conheight - picsize.y), waki_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + } + +} + +void CSQC_BUMBLE_GUN_HUD() +{ + + if(autocvar_r_letterbox) + return; + + vector picsize, hudloc = '0 0 0', pic2size, picloc; + + // Fetch health & ammo stats + HUD_GETSTATS + + picsize = draw_getimagesize(hud_bg) * autocvar_cl_vehicles_hudscale; + hudloc.y = vid_conheight - picsize.y; + hudloc.x = vid_conwidth * 0.5 - picsize.x * 0.5; + + drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL); + + shield *= 0.01; + vh_health *= 0.01; + energy *= 0.01; + reload1 *= 0.01; + + pic2size = draw_getimagesize(bumb_gun_ico) * (autocvar_cl_vehicles_hudscale * 0.8); + picloc = picsize * 0.5 - pic2size * 0.5; + + if(vh_health < 0.25) + drawpic(hudloc + picloc, bumb_gun_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + else + drawpic(hudloc + picloc, bumb_gun_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL); + + drawpic(hudloc + picloc, bumb_gun_gun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); + drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL); + +// Health bar + picsize = draw_getimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale; + picloc = '69 69 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - vh_health)), 0, vid_conwidth, vid_conheight); + drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL); + drawresetcliparea(); +// .. and icon + picsize = draw_getimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale; + picloc = '37 65 0' * autocvar_cl_vehicles_hudscale; + if(vh_health < 0.25) + { + if(alarm1time < time) + { + alarm1time = time + 2; + sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTEN_NONE); + } + + drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + } + else + { + drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + if(alarm1time) + { + sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); + alarm1time = 0; + } + } + +// Shield bar + picsize = draw_getimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale; + picloc = '69 140 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - shield)), 0, vid_conwidth, vid_conheight); + drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawresetcliparea(); +// .. and icon + picloc = '40 136 0' * autocvar_cl_vehicles_hudscale; + picsize = draw_getimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale; + if(shield < 0.25) + { + if(alarm2time < time) + { + alarm2time = time + 1; + sound(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTEN_NONE); + } + drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + } + else + { + drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + if(alarm2time) + { + sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); + alarm2time = 0; + } + } + +// Gun bar + picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale; + picloc = '450 69 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * energy, vid_conheight); + drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawresetcliparea(); + +// .. and icon + picsize = 1.5 * draw_getimagesize(hud_energy) * autocvar_cl_vehicles_hudscale; + picloc = '664 60 0' * autocvar_cl_vehicles_hudscale; + if(energy < 0.2) + drawpic(hudloc + picloc, hud_energy, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + else + drawpic(hudloc + picloc, hud_energy, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + + if (scoreboard_showscores) + HUD_DrawScoreboard(); + /* + else + { + picsize = draw_getimagesize(waki_xhair); + picsize_x *= 0.5; + picsize_y *= 0.5; + + + drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), waki_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + } + */ +} + + + +void CSQC_SPIDER_HUD() +{ + if(autocvar_r_letterbox) + return; + + vector picsize, hudloc = '0 0 0', pic2size, picloc; + int i; + + // Fetch health & ammo stats + HUD_GETSTATS + + picsize = draw_getimagesize(hud_bg) * autocvar_cl_vehicles_hudscale; + hudloc.y = vid_conheight - picsize.y; + hudloc.x = vid_conwidth * 0.5 - picsize.x * 0.5; + + drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL); + + ammo1 *= 0.01; + shield *= 0.01; + vh_health *= 0.01; + reload2 *= 0.01; + + pic2size = draw_getimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8); + picloc = picsize * 0.5 - pic2size * 0.5; + if(vh_health < 0.25) + drawpic(hudloc + picloc, spider_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + else + drawpic(hudloc + picloc, spider_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL); + drawpic(hudloc + picloc, spider_rkt, pic2size, '1 1 1' * reload2 + '1 0 0' * (1 - reload2), 1, DRAWFLAG_NORMAL); + drawpic(hudloc + picloc, spider_mgun, pic2size, '1 1 1' * ammo1 + '1 0 0' * (1 - ammo1), 1, DRAWFLAG_NORMAL); + drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL); + +// Health bar + picsize = draw_getimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale; + picloc = '69 69 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - vh_health)), 0, vid_conwidth, vid_conheight); + drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL); + drawresetcliparea(); +// .. and icon + picsize = draw_getimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale; + picloc = '37 65 0' * autocvar_cl_vehicles_hudscale; + if(vh_health < 0.25) + { + if(alarm1time < time) + { + alarm1time = time + 2; + sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTEN_NONE); + } + drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + } + else + { + drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + if(alarm1time) + { + sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); + alarm1time = 0; + } + } +// Shield bar + picsize = draw_getimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale; + picloc = '69 140 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - shield)), 0, vid_conwidth, vid_conheight); + drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawresetcliparea(); +// .. and icon + picloc = '40 136 0' * autocvar_cl_vehicles_hudscale; + picsize = draw_getimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale; + if(shield < 0.25) + { + if(alarm2time < time) + { + alarm2time = time + 1; + sound(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTEN_NONE); + } + drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + } + else + { + drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + if(alarm2time) + { + sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); + alarm2time = 0; + } + } + +// Minigun bar + picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale; + picloc = '450 69 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * ammo1, vid_conheight); + drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawresetcliparea(); +// .. and icon + picsize = draw_getimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale; + picloc = '664 60 0' * autocvar_cl_vehicles_hudscale; + if(ammo1 < 0.2) + drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + else + drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + +// Rocket ammo bar + picsize = draw_getimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale; + ammo1 = picsize.x / 8; + picloc = '450 140 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x, hudloc.y + picloc.y, picsize.x * reload2, vid_conheight); + drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawresetcliparea(); + +// .. and icons + pic2size = 0.35 * draw_getimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale; + picloc.x -= pic2size.x; + picloc.y += pic2size.y * 2.25; + if(ammo2 == 9) + { + for(i = 1; i < 9; ++i) + { + picloc.x += ammo1; + drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, ((8 * reload2 <= i) ? '0 0 0' : '1 1 1'), 0.75, DRAWFLAG_NORMAL); + } + } + else + { + for(i = 1; i < 9; ++i) + { + picloc.x += ammo1; + drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, ((i >= ammo2) ? '1 1 1' : '0 0 0'), 0.75, DRAWFLAG_NORMAL); + } + } + pic2size = draw_getimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale; + picloc = '664 130 0' * autocvar_cl_vehicles_hudscale; + if(ammo2 == 9) + drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + else + drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL); + + if (scoreboard_showscores) + HUD_DrawScoreboard(); + else + { + switch(weapon2mode) + { + case SBRM_VOLLY: + spider_xhair = "gfx/vehicles/axh-bracket.tga"; + break; + case SBRM_GUIDE: + spider_xhair = "gfx/vehicles/axh-cross.tga"; + break; + case SBRM_ARTILLERY: + spider_xhair = "gfx/vehicles/axh-tag.tga"; + break; + default: + spider_xhair= "gfx/vehicles/axh-tag.tga"; + } + + picsize = draw_getimagesize(spider_xhair); + picsize.x *= autocvar_cl_vehicle_spiderbot_cross_size; + picsize.y *= autocvar_cl_vehicle_spiderbot_cross_size; + + drawpic('0.5 0 0' * (vid_conwidth - picsize.x) + '0 0.5 0' * (vid_conheight - picsize.y), spider_xhair, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_ADDITIVE); + } +} + +void CSQC_RAPTOR_HUD() +{ + if(autocvar_r_letterbox) + return; + + vector picsize, hudloc = '0 0 0', pic2size, picloc; + + // Fetch health & ammo stats + HUD_GETSTATS + + picsize = draw_getimagesize(hud_bg) * autocvar_cl_vehicles_hudscale; + hudloc.y = vid_conheight - picsize.y; + hudloc.x = vid_conwidth * 0.5 - picsize.x * 0.5; + + drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL); + + ammo1 *= 0.01; + ammo2 *= 0.01; + shield *= 0.01; + vh_health *= 0.01; + energy *= 0.01; + reload1 = reload2 * 0.01; + //reload2 *= 0.01; + + pic2size = draw_getimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8); + picloc = picsize * 0.5 - pic2size * 0.5; + if(vh_health < 0.25) + drawpic(hudloc + picloc, raptor_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + else + drawpic(hudloc + picloc, raptor_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL); + drawpic(hudloc + picloc, raptor_bomb, pic2size, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL); + drawpic(hudloc + picloc, raptor_gun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); + drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL); + +// Health bar + picsize = draw_getimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale; + picloc = '69 69 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - vh_health)), 0, vid_conwidth, vid_conheight); + drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL); + drawresetcliparea(); +// .. and icon + picsize = draw_getimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale; + picloc = '37 65 0' * autocvar_cl_vehicles_hudscale; + if(vh_health < 0.25) + { + if(alarm1time < time) + { + alarm1time = time + 2; + sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTEN_NONE); + } + + drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + } + else + { + drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + if(alarm1time) + { + sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); + alarm1time = 0; + } + } + +// Shield bar + picsize = draw_getimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale; + picloc = '69 140 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - shield)), 0, vid_conwidth, vid_conheight); + drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawresetcliparea(); +// .. and icon + picloc = '40 136 0' * autocvar_cl_vehicles_hudscale; + picsize = draw_getimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale; + if(shield < 0.25) + { + if(alarm2time < time) + { + alarm2time = time + 1; + sound(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTEN_NONE); + } + drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + } + else + { + drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + if(alarm2time) + { + sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); + alarm2time = 0; + } + } + +// Gun bar + picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale; + picloc = '450 69 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * energy, vid_conheight); + drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawresetcliparea(); +// .. and icon + picsize = draw_getimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale; + picloc = '664 60 0' * autocvar_cl_vehicles_hudscale; + if(energy < 0.2) + drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + else + drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + +// Bomb bar + picsize = draw_getimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale; + picloc = '450 140 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x, hudloc.y + picloc.y, picsize.x * reload1, vid_conheight); + drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawresetcliparea(); +// .. and icon + pic2size = draw_getimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale; + picloc = '664 130 0' * autocvar_cl_vehicles_hudscale; + if(reload1 != 1) + drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + else + drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL); + + if(weapon2mode == RSM_FLARE) + { + raptor_xhair = "gfx/vehicles/axh-bracket.tga"; + } + else + { + raptor_xhair = "gfx/vehicles/axh-ring.tga"; + + // Bombing crosshair + if(!dropmark) + { + dropmark = spawn(); + dropmark.owner = self; + dropmark.gravity = 1; + } + + if(reload2 == 100) + { + vector where; + + setorigin(dropmark, pmove_org); + dropmark.velocity = pmove_vel; + tracetoss(dropmark, self); + + where = project_3d_to_2d(trace_endpos); + + setorigin(dropmark, trace_endpos); + picsize = draw_getimagesize(raptor_drop) * 0.2; + + if (!(where.z < 0 || where.x < 0 || where.y < 0 || where.x > vid_conwidth || where.y > vid_conheight)) + { + where.x -= picsize.x * 0.5; + where.y -= picsize.y * 0.5; + where.z = 0; + drawpic(where, raptor_drop, picsize, '0 2 0', 1, DRAWFLAG_ADDITIVE); + } + dropmark.cnt = time + 5; + } + else + { + vector where; + if(dropmark.cnt > time) + { + where = project_3d_to_2d(dropmark.origin); + picsize = draw_getimagesize(raptor_drop) * 0.25; + + if (!(where.z < 0 || where.x < 0 || where.y < 0 || where.x > vid_conwidth || where.y > vid_conheight)) + { + where.x -= picsize.x * 0.5; + where.y -= picsize.y * 0.5; + where.z = 0; + drawpic(where, raptor_drop, picsize, '2 0 0', 1, DRAWFLAG_ADDITIVE); + } + } + } + } + + if (scoreboard_showscores) + HUD_DrawScoreboard(); + else + { + picsize = draw_getimagesize(raptor_xhair); + picsize.x *= 0.5; + picsize.y *= 0.5; + + drawpic('0.5 0 0' * (vid_conwidth - picsize.x) + '0 0.5 0' * (vid_conheight - picsize.y), raptor_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + } +} + +void CSQC_WAKIZASHI_HUD() +{ +/* + drawpic(hudloc, waki_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL); + drawpic(hudloc, waki_b, picsize, '0 1 0' * health + '1 0 0' * (1 - health), 1, DRAWFLAG_NORMAL); + drawpic(hudloc, waki_r, picsize, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL); + drawpic(hudloc, waki_e, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); +*/ + if(autocvar_r_letterbox) + return; + + vector picsize, hudloc = '0 0 0', pic2size, picloc; + + // Fetch health & ammo stats + HUD_GETSTATS + + picsize = draw_getimagesize(hud_bg) * autocvar_cl_vehicles_hudscale; + hudloc.y = vid_conheight - picsize.y; + hudloc.x = vid_conwidth * 0.5 - picsize.x * 0.5; + + drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL); + + shield *= 0.01; + vh_health *= 0.01; + energy *= 0.01; + reload1 *= 0.01; + + pic2size = draw_getimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8); + picloc = picsize * 0.5 - pic2size * 0.5; + if(vh_health < 0.25) + drawpic(hudloc + picloc, waki_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + else + drawpic(hudloc + picloc, waki_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL); + drawpic(hudloc + picloc, waki_eng, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); + drawpic(hudloc + picloc, waki_gun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); + drawpic(hudloc + picloc, waki_rkt, pic2size, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL); + drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL); + +// Health bar + picsize = draw_getimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale; + picloc = '69 69 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - vh_health)), 0, vid_conwidth, vid_conheight); + drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL); + drawresetcliparea(); +// .. and icon + picsize = draw_getimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale; + picloc = '37 65 0' * autocvar_cl_vehicles_hudscale; + if(vh_health < 0.25) + { + if(alarm1time < time) + { + alarm1time = time + 2; + sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTEN_NONE); + } + + drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + } + else + { + drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + if(alarm1time) + { + sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); + alarm1time = 0; + } + } + + +// Shield bar + picsize = draw_getimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale; + picloc = '69 140 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - shield)), 0, vid_conwidth, vid_conheight); + drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawresetcliparea(); +// .. and icon + picloc = '40 136 0' * autocvar_cl_vehicles_hudscale; + picsize = draw_getimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale; + if(shield < 0.25) + { + if(alarm2time < time) + { + alarm2time = time + 1; + sound(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTEN_NONE); + } + drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + } + else + { + drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + if(alarm2time) + { + sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); + alarm2time = 0; + } + } + +// Gun bar + picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale; + picloc = '450 69 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * energy, vid_conheight); + drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawresetcliparea(); +// .. and icon + picsize = draw_getimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale; + picloc = '664 60 0' * autocvar_cl_vehicles_hudscale; + if(energy < 0.2) + drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + else + drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + +// Bomb bar + picsize = draw_getimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale; + picloc = '450 140 0' * autocvar_cl_vehicles_hudscale; + drawsetcliparea(hudloc.x + picloc.x, hudloc.y + picloc.y, picsize.x * reload1, vid_conheight); + drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + drawresetcliparea(); +// .. and icon + pic2size = draw_getimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale; + picloc = '664 130 0' * autocvar_cl_vehicles_hudscale; + if(reload1 != 1) + drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); + else + drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL); + + if (scoreboard_showscores) + HUD_DrawScoreboard(); + else + { + picsize = draw_getimagesize(waki_xhair); + picsize.x *= 0.5; + picsize.y *= 0.5; + + + drawpic('0.5 0 0' * (vid_conwidth - picsize.x) + '0 0.5 0' * (vid_conheight - picsize.y), waki_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); + } +} + +void Vehicles_Precache() +{ + precache_model("models/vehicles/bomblet.md3"); + precache_model("models/vehicles/clusterbomb.md3"); + precache_model("models/vehicles/clusterbomb_fragment.md3"); + precache_model("models/vehicles/rocket01.md3"); + precache_model("models/vehicles/rocket02.md3"); + + precache_sound ("vehicles/alarm.wav"); + precache_sound ("vehicles/alarm_shield.wav"); +} + +void RaptorCBShellfragDraw() +{ + if(wasfreed(self)) + return; + + Movetype_Physics_MatchTicrate(autocvar_cl_gibs_ticrate, autocvar_cl_gibs_sloppy); + self.move_avelocity += randomvec() * 15; + self.renderflags = 0; + + if(self.cnt < time) + self.alpha = bound(0, self.nextthink - time, 1); + + if(self.alpha < ALPHA_MIN_VISIBLE) + remove(self); +} + +void RaptorCBShellfragToss(vector _org, vector _vel, vector _ang) +{ + entity sfrag; + + sfrag = spawn(); + setmodel(sfrag, "models/vehicles/clusterbomb_fragment.md3"); + setorigin(sfrag, _org); + + sfrag.move_movetype = MOVETYPE_BOUNCE; + sfrag.gravity = 0.15; + sfrag.solid = SOLID_CORPSE; + + sfrag.draw = RaptorCBShellfragDraw; + + sfrag.move_origin = sfrag.origin = _org; + sfrag.move_velocity = _vel; + sfrag.move_avelocity = prandomvec() * vlen(sfrag.move_velocity); + sfrag.angles = self.move_angles = _ang; + + sfrag.move_time = time; + sfrag.damageforcescale = 4; + + sfrag.nextthink = time + 3; + sfrag.cnt = time + 2; + sfrag.alpha = 1; + sfrag.drawmask = MASK_NORMAL; +} diff --git a/qcsrc/client/vehicles/all.qh b/qcsrc/client/vehicles/all.qh new file mode 100644 index 0000000000..f92ab82b3d --- /dev/null +++ b/qcsrc/client/vehicles/all.qh @@ -0,0 +1,16 @@ +#ifndef VEHICLES_ALL_H +#define VEHICLES_ALL_H + +void RaptorCBShellfragDraw(); +void RaptorCBShellfragToss(vector _org, vector _vel, vector _ang); +void Vehicles_Precache(); +void Net_AuXair2(bool bIsNew); +void Net_VehicleSetup(); + +void CSQC_WAKIZASHI_HUD(); +void CSQC_SPIDER_HUD(); +void CSQC_RAPTOR_HUD(); +void CSQC_BUMBLE_HUD(); +void CSQC_BUMBLE_GUN_HUD(); + +#endif diff --git a/qcsrc/client/vehicles/vehicles.qc b/qcsrc/client/vehicles/vehicles.qc deleted file mode 100644 index 1582ecfcb8..0000000000 --- a/qcsrc/client/vehicles/vehicles.qc +++ /dev/null @@ -1,1054 +0,0 @@ -#include "vehicles.qh" -#include "../_all.qh" - -#include "../movetypes.qh" -#include "../movetypes.qh" -#include "../prandom.qh" -#include "../scoreboard.qh" -#include "../t_items.qh" - -#include "../../common/buffs.qh" -#include "../../common/constants.qh" -#include "../../common/stats.qh" -#include "../../common/util.qh" - -#include "../../csqcmodellib/cl_model.qh" - -.float cnt; - -const string hud_bg = "gfx/vehicles/frame.tga"; -const string hud_sh = "gfx/vehicles/vh-shield.tga"; - -const string hud_hp_bar = "gfx/vehicles/bar_up_left.tga"; -const string hud_hp_ico = "gfx/vehicles/health.tga"; -const string hud_sh_bar = "gfx/vehicles/bar_dwn_left.tga"; -const string hud_sh_ico = "gfx/vehicles/shield.tga"; - -const string hud_ammo1_bar = "gfx/vehicles/bar_up_right.tga"; -const string hud_ammo1_ico = "gfx/vehicles/bullets.tga"; -const string hud_ammo2_bar = "gfx/vehicles/bar_dwn_right.tga"; -const string hud_ammo2_ico = "gfx/vehicles/rocket.tga"; -const string hud_energy = "gfx/vehicles/energy.tga"; - -const int SBRM_FIRST = 1; -const int SBRM_VOLLY = 1; -const int SBRM_GUIDE = 2; -const int SBRM_ARTILLERY = 3; -const int SBRM_LAST = 3; - -const int RSM_FIRST = 1; -const int RSM_BOMB = 1; -const int RSM_FLARE = 2; -const int RSM_LAST = 2; - -entity dropmark; -float autocvar_cl_vehicles_hudscale = 0.5; -float autocvar_cl_vehicles_hudalpha = 0.75; - -const string raptor_ico = "gfx/vehicles/raptor.tga"; -const string raptor_gun = "gfx/vehicles/raptor_guns.tga"; -const string raptor_bomb = "gfx/vehicles/raptor_bombs.tga"; -const string raptor_drop = "gfx/vehicles/axh-dropcross.tga"; -string raptor_xhair; - - - -const int MAX_AXH = 4; -entity AuxiliaryXhairs[MAX_AXH]; - -entityclass(AuxiliaryXhair); -class(AuxiliaryXhair) .string axh_image; -class(AuxiliaryXhair) .float axh_fadetime; -class(AuxiliaryXhair) .float axh_drawflag; -class(AuxiliaryXhair) .float axh_scale; - -const string bumb_ico = "gfx/vehicles/bumb.tga"; -const string bumb_lgun = "gfx/vehicles/bumb_lgun.tga"; -const string bumb_rgun = "gfx/vehicles/bumb_rgun.tga"; - -const string bumb_gun_ico = "gfx/vehicles/bumb_side.tga"; -const string bumb_gun_gun = "gfx/vehicles/bumb_side_gun.tga"; - -const string spider_ico = "gfx/vehicles/sbot.tga"; -const string spider_rkt = "gfx/vehicles/sbot_rpods.tga"; -const string spider_mgun = "gfx/vehicles/sbot_mguns.tga"; -string spider_xhair; // = "gfx/vehicles/axh-special1.tga"; - -const string waki_ico = "gfx/vehicles/waki.tga"; -const string waki_eng = "gfx/vehicles/waki_e.tga"; -const string waki_gun = "gfx/vehicles/waki_guns.tga"; -const string waki_rkt = "gfx/vehicles/waki_rockets.tga"; -const string waki_xhair = "gfx/vehicles/axh-special1.tga"; - -float alarm1time; -float alarm2time; -int weapon2mode; - -void AuxiliaryXhair_Draw2D() -{ - vector loc, psize; - - psize = self.axh_scale * draw_getimagesize(self.axh_image); - loc = project_3d_to_2d(self.move_origin) - 0.5 * psize; - if (!(loc.z < 0 || loc.x < 0 || loc.y < 0 || loc.x > vid_conwidth || loc.y > vid_conheight)) - { - loc.z = 0; - psize.z = 0; - drawpic(loc, self.axh_image, psize, self.colormod, self.alpha, self.axh_drawflag); - } - - if(time - self.cnt > self.axh_fadetime) - self.draw2d = func_null; -} - -void Net_AuXair2(bool bIsNew) -{ - int axh_id = bound(0, ReadByte(), MAX_AXH); - entity axh = AuxiliaryXhairs[axh_id]; - - if(axh == world || wasfreed(axh)) // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?) - { - axh = spawn(); - axh.draw2d = func_null; - axh.drawmask = MASK_NORMAL; - axh.axh_drawflag = DRAWFLAG_ADDITIVE; - axh.axh_fadetime = 0.1; - axh.axh_image = "gfx/vehicles/axh-ring.tga"; - axh.axh_scale = 1; - axh.alpha = 1; - AuxiliaryXhairs[axh_id] = axh; - } - - axh.move_origin_x = ReadCoord(); - axh.move_origin_y = ReadCoord(); - axh.move_origin_z = ReadCoord(); - axh.colormod_x = ReadByte() / 255; - axh.colormod_y = ReadByte() / 255; - axh.colormod_z = ReadByte() / 255; - axh.cnt = time; - axh.draw2d = AuxiliaryXhair_Draw2D; -} - -void Net_VehicleSetup() -{ - int hud_id = ReadByte(); - - // Weapon update? - if(hud_id > HUD_VEHICLE_LAST) - { - weapon2mode = hud_id - HUD_VEHICLE_LAST; - return; - } - - // hud_id == 0 means we exited a vehicle, so stop alarm sound/s - if(hud_id == 0) - { - sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); - sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); - return; - } - - hud_id = bound(HUD_VEHICLE_FIRST, hud_id, HUD_VEHICLE_LAST); - - // Init auxiliary crosshairs - int i; - for(i = 0; i < MAX_AXH; ++i) - { - entity axh = AuxiliaryXhairs[i]; - if(axh != world && !wasfreed(axh)) // MADNESS? THIS IS QQQQCCCCCCCCC (wasfreed, why do you exsist?) - remove(axh); - - axh = spawn(); - axh.draw2d = func_null; - axh.drawmask = MASK_NORMAL; - axh.axh_drawflag = DRAWFLAG_NORMAL; - axh.axh_fadetime = 0.1; - axh.axh_image = "gfx/vehicles/axh-ring.tga"; - axh.axh_scale = 1; - axh.alpha = 1; - AuxiliaryXhairs[i] = axh; - } - - switch(hud_id) - { - case HUD_SPIDERBOT: - // Minigun1 - AuxiliaryXhairs[0].axh_image = "gfx/vehicles/axh-ring.tga"; - AuxiliaryXhairs[0].axh_scale = 0.25; - // Minigun2 - AuxiliaryXhairs[1].axh_image = "gfx/vehicles/axh-ring.tga"; - AuxiliaryXhairs[1].axh_scale = 0.25; - // Rocket - AuxiliaryXhairs[2].axh_image = "gfx/vehicles/axh-special1.tga"; - AuxiliaryXhairs[2].axh_scale = 0.5; - break; - - case HUD_WAKIZASHI: - AuxiliaryXhairs[0].axh_image = "gfx/vehicles/axh-bracket.tga"; - AuxiliaryXhairs[0].axh_scale = 0.25; - break; - - case HUD_RAPTOR: - AuxiliaryXhairs[0].axh_image = "gfx/vehicles/axh-special2.tga"; - AuxiliaryXhairs[0].axh_scale = 0.5; - //AuxiliaryXhair[0].alpha = 0.5; - - AuxiliaryXhairs[1].axh_image = "gfx/vehicles/axh-bracket.tga"; - AuxiliaryXhairs[1].axh_scale = 0.25; - //AuxiliaryXhair[1].alpha = 0.75; - //AuxiliaryXhair[1].axh_drawflag = DRAWFLAG_NORMAL; - break; - - case HUD_BUMBLEBEE: - // Raygun-locked - AuxiliaryXhairs[0].axh_image = "gfx/vehicles/axh-bracket.tga"; - AuxiliaryXhairs[0].axh_scale = 0.5; - - // Gunner1 - AuxiliaryXhairs[1].axh_image = "gfx/vehicles/axh-target.tga"; - AuxiliaryXhairs[1].axh_scale = 0.75; - - // Gunner2 - AuxiliaryXhairs[2].axh_image = "gfx/vehicles/axh-target.tga"; - AuxiliaryXhairs[2].axh_scale = 0.75; - break; - case HUD_BUMBLEBEE_GUN: - // Plasma cannons - AuxiliaryXhairs[0].axh_image = "gfx/vehicles/axh-bracket.tga"; - AuxiliaryXhairs[0].axh_scale = 0.25; - // Raygun - AuxiliaryXhairs[1].axh_image = "gfx/vehicles/axh-bracket.tga"; - AuxiliaryXhairs[1].axh_scale = 0.25; - break; - } -} -#define HUD_GETSTATS \ - int vh_health = getstati(STAT_VEHICLESTAT_HEALTH); \ - float shield = getstati(STAT_VEHICLESTAT_SHIELD); \ - noref int energy = getstati(STAT_VEHICLESTAT_ENERGY); \ - noref float ammo1 = getstati(STAT_VEHICLESTAT_AMMO1); \ - noref float reload1 = getstati(STAT_VEHICLESTAT_RELOAD1); \ - noref int ammo2 = getstati(STAT_VEHICLESTAT_AMMO2); \ - noref int reload2 = getstati(STAT_VEHICLESTAT_RELOAD2); - -void CSQC_BUMBLE_HUD() -{ -/* - drawpic(hudloc, waki_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL); - drawpic(hudloc, waki_b, picsize, '0 1 0' * health + '1 0 0' * (1 - health), 1, DRAWFLAG_NORMAL); - drawpic(hudloc, waki_r, picsize, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL); - drawpic(hudloc, waki_e, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); -*/ - if(autocvar_r_letterbox) - return; - - vector picsize, hudloc = '0 0 0', pic2size, picloc; - - // Fetch health & ammo stats - HUD_GETSTATS - - picsize = draw_getimagesize(hud_bg) * autocvar_cl_vehicles_hudscale; - hudloc.y = vid_conheight - picsize.y; - hudloc.x = vid_conwidth * 0.5 - picsize.x * 0.5; - - drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL); - - shield *= 0.01; - vh_health *= 0.01; - energy *= 0.01; - reload1 *= 0.01; - - pic2size = draw_getimagesize(bumb_ico) * (autocvar_cl_vehicles_hudscale * 0.8); - picloc = picsize * 0.5 - pic2size * 0.5; - - if(vh_health < 0.25) - drawpic(hudloc + picloc, bumb_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - else - drawpic(hudloc + picloc, bumb_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL); - - drawpic(hudloc + picloc, bumb_lgun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); - drawpic(hudloc + picloc, bumb_lgun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); - drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL); - -// Health bar - picsize = draw_getimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale; - picloc = '69 69 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - vh_health)), 0, vid_conwidth, vid_conheight); - drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL); - drawresetcliparea(); -// .. and icon - picsize = draw_getimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale; - picloc = '37 65 0' * autocvar_cl_vehicles_hudscale; - if(vh_health < 0.25) - { - if(alarm1time < time) - { - alarm1time = time + 2; - sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTEN_NONE); - } - - drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - } - else - { - drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - if(alarm1time) - { - sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); - alarm1time = 0; - } - } - -// Shield bar - picsize = draw_getimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale; - picloc = '69 140 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - shield)), 0, vid_conwidth, vid_conheight); - drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawresetcliparea(); -// .. and icon - picloc = '40 136 0' * autocvar_cl_vehicles_hudscale; - picsize = draw_getimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale; - if(shield < 0.25) - { - if(alarm2time < time) - { - alarm2time = time + 1; - sound(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTEN_NONE); - } - drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - } - else - { - drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - if(alarm2time) - { - sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); - alarm2time = 0; - } - } - - ammo1 *= 0.01; - ammo2 *= 0.01; - -// Gunner1 bar - picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale; - picloc = '450 69 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * ammo1, vid_conheight); - drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawresetcliparea(); - -// Right gunner slot occupied? - if(!AuxiliaryXhairs[1].draw2d) - { - shield = (picsize.x * 0.5) - (0.5 * stringwidth(_("No right gunner!"), false, '1 0 0' * picsize.y + '0 1 0' * picsize.y)); - drawfill(hudloc + picloc - '0.2 0.2 0', picsize + '0.4 0.4 0', '0.25 0.25 0.25', 0.75, DRAWFLAG_NORMAL); - drawstring(hudloc + picloc + '1 0 0' * shield, _("No right gunner!"), '1 0 0' * picsize.y + '0 1 0' * picsize.y, '1 0 0' + '0 1 1' * sin(time * 10), 1, DRAWFLAG_NORMAL); - } - -// .. and icon - picsize = 1.5 * draw_getimagesize(hud_energy) * autocvar_cl_vehicles_hudscale; - picloc = '664 60 0' * autocvar_cl_vehicles_hudscale; - if(ammo1 < 0.2) - drawpic(hudloc + picloc, hud_energy, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - else - drawpic(hudloc + picloc, hud_energy, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - -// Gunner2 bar - picsize = draw_getimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale; - picloc = '450 140 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * ammo2, vid_conheight); - drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawresetcliparea(); -// Left gunner slot occupied? - if(!AuxiliaryXhairs[2].draw2d) - { - shield = (picsize.x * 0.5) - (0.5 * stringwidth(_("No left gunner!"), false, '1 0 0' * picsize.y + '0 1 0' * picsize.y)); - drawfill(hudloc + picloc - '0.2 0.2 0', picsize + '0.4 0.4 0', '0.25 0.25 0.25', 0.75, DRAWFLAG_NORMAL); - drawstring(hudloc + picloc + '1 0 0' * shield, _("No left gunner!"), '1 0 0' * picsize.y + '0 1 0' * picsize.y, '1 0 0' + '0 1 1' * sin(time * 10), 1, DRAWFLAG_NORMAL); - } - -// .. and icon - picsize = 1.5 * draw_getimagesize(hud_energy) * autocvar_cl_vehicles_hudscale; - picloc = '664 130 0' * autocvar_cl_vehicles_hudscale; - if(ammo2 < 0.2) - drawpic(hudloc + picloc, hud_energy, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - else - drawpic(hudloc + picloc, hud_energy, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - - if (scoreboard_showscores) - HUD_DrawScoreboard(); - else - { - picsize = draw_getimagesize(waki_xhair); - picsize.x *= 0.5; - picsize.y *= 0.5; - drawpic('0.5 0 0' * (vid_conwidth - picsize.x) + '0 0.5 0' * (vid_conheight - picsize.y), waki_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - } - -} - -void CSQC_BUMBLE_GUN_HUD() -{ - - if(autocvar_r_letterbox) - return; - - vector picsize, hudloc = '0 0 0', pic2size, picloc; - - // Fetch health & ammo stats - HUD_GETSTATS - - picsize = draw_getimagesize(hud_bg) * autocvar_cl_vehicles_hudscale; - hudloc.y = vid_conheight - picsize.y; - hudloc.x = vid_conwidth * 0.5 - picsize.x * 0.5; - - drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL); - - shield *= 0.01; - vh_health *= 0.01; - energy *= 0.01; - reload1 *= 0.01; - - pic2size = draw_getimagesize(bumb_gun_ico) * (autocvar_cl_vehicles_hudscale * 0.8); - picloc = picsize * 0.5 - pic2size * 0.5; - - if(vh_health < 0.25) - drawpic(hudloc + picloc, bumb_gun_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - else - drawpic(hudloc + picloc, bumb_gun_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL); - - drawpic(hudloc + picloc, bumb_gun_gun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); - drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL); - -// Health bar - picsize = draw_getimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale; - picloc = '69 69 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - vh_health)), 0, vid_conwidth, vid_conheight); - drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL); - drawresetcliparea(); -// .. and icon - picsize = draw_getimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale; - picloc = '37 65 0' * autocvar_cl_vehicles_hudscale; - if(vh_health < 0.25) - { - if(alarm1time < time) - { - alarm1time = time + 2; - sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTEN_NONE); - } - - drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - } - else - { - drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - if(alarm1time) - { - sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); - alarm1time = 0; - } - } - -// Shield bar - picsize = draw_getimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale; - picloc = '69 140 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - shield)), 0, vid_conwidth, vid_conheight); - drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawresetcliparea(); -// .. and icon - picloc = '40 136 0' * autocvar_cl_vehicles_hudscale; - picsize = draw_getimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale; - if(shield < 0.25) - { - if(alarm2time < time) - { - alarm2time = time + 1; - sound(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTEN_NONE); - } - drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - } - else - { - drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - if(alarm2time) - { - sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); - alarm2time = 0; - } - } - -// Gun bar - picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale; - picloc = '450 69 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * energy, vid_conheight); - drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawresetcliparea(); - -// .. and icon - picsize = 1.5 * draw_getimagesize(hud_energy) * autocvar_cl_vehicles_hudscale; - picloc = '664 60 0' * autocvar_cl_vehicles_hudscale; - if(energy < 0.2) - drawpic(hudloc + picloc, hud_energy, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - else - drawpic(hudloc + picloc, hud_energy, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - - if (scoreboard_showscores) - HUD_DrawScoreboard(); - /* - else - { - picsize = draw_getimagesize(waki_xhair); - picsize_x *= 0.5; - picsize_y *= 0.5; - - - drawpic('0.5 0 0' * (vid_conwidth - picsize_x) + '0 0.5 0' * (vid_conheight - picsize_y), waki_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - } - */ -} - - - -void CSQC_SPIDER_HUD() -{ - if(autocvar_r_letterbox) - return; - - vector picsize, hudloc = '0 0 0', pic2size, picloc; - int i; - - // Fetch health & ammo stats - HUD_GETSTATS - - picsize = draw_getimagesize(hud_bg) * autocvar_cl_vehicles_hudscale; - hudloc.y = vid_conheight - picsize.y; - hudloc.x = vid_conwidth * 0.5 - picsize.x * 0.5; - - drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL); - - ammo1 *= 0.01; - shield *= 0.01; - vh_health *= 0.01; - reload2 *= 0.01; - - pic2size = draw_getimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8); - picloc = picsize * 0.5 - pic2size * 0.5; - if(vh_health < 0.25) - drawpic(hudloc + picloc, spider_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - else - drawpic(hudloc + picloc, spider_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL); - drawpic(hudloc + picloc, spider_rkt, pic2size, '1 1 1' * reload2 + '1 0 0' * (1 - reload2), 1, DRAWFLAG_NORMAL); - drawpic(hudloc + picloc, spider_mgun, pic2size, '1 1 1' * ammo1 + '1 0 0' * (1 - ammo1), 1, DRAWFLAG_NORMAL); - drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL); - -// Health bar - picsize = draw_getimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale; - picloc = '69 69 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - vh_health)), 0, vid_conwidth, vid_conheight); - drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL); - drawresetcliparea(); -// .. and icon - picsize = draw_getimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale; - picloc = '37 65 0' * autocvar_cl_vehicles_hudscale; - if(vh_health < 0.25) - { - if(alarm1time < time) - { - alarm1time = time + 2; - sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTEN_NONE); - } - drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - } - else - { - drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - if(alarm1time) - { - sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); - alarm1time = 0; - } - } -// Shield bar - picsize = draw_getimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale; - picloc = '69 140 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - shield)), 0, vid_conwidth, vid_conheight); - drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawresetcliparea(); -// .. and icon - picloc = '40 136 0' * autocvar_cl_vehicles_hudscale; - picsize = draw_getimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale; - if(shield < 0.25) - { - if(alarm2time < time) - { - alarm2time = time + 1; - sound(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTEN_NONE); - } - drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - } - else - { - drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - if(alarm2time) - { - sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); - alarm2time = 0; - } - } - -// Minigun bar - picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale; - picloc = '450 69 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * ammo1, vid_conheight); - drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawresetcliparea(); -// .. and icon - picsize = draw_getimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale; - picloc = '664 60 0' * autocvar_cl_vehicles_hudscale; - if(ammo1 < 0.2) - drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - else - drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - -// Rocket ammo bar - picsize = draw_getimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale; - ammo1 = picsize.x / 8; - picloc = '450 140 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x, hudloc.y + picloc.y, picsize.x * reload2, vid_conheight); - drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawresetcliparea(); - -// .. and icons - pic2size = 0.35 * draw_getimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale; - picloc.x -= pic2size.x; - picloc.y += pic2size.y * 2.25; - if(ammo2 == 9) - { - for(i = 1; i < 9; ++i) - { - picloc.x += ammo1; - drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, ((8 * reload2 <= i) ? '0 0 0' : '1 1 1'), 0.75, DRAWFLAG_NORMAL); - } - } - else - { - for(i = 1; i < 9; ++i) - { - picloc.x += ammo1; - drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, ((i >= ammo2) ? '1 1 1' : '0 0 0'), 0.75, DRAWFLAG_NORMAL); - } - } - pic2size = draw_getimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale; - picloc = '664 130 0' * autocvar_cl_vehicles_hudscale; - if(ammo2 == 9) - drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - else - drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL); - - if (scoreboard_showscores) - HUD_DrawScoreboard(); - else - { - switch(weapon2mode) - { - case SBRM_VOLLY: - spider_xhair = "gfx/vehicles/axh-bracket.tga"; - break; - case SBRM_GUIDE: - spider_xhair = "gfx/vehicles/axh-cross.tga"; - break; - case SBRM_ARTILLERY: - spider_xhair = "gfx/vehicles/axh-tag.tga"; - break; - default: - spider_xhair= "gfx/vehicles/axh-tag.tga"; - } - - picsize = draw_getimagesize(spider_xhair); - picsize.x *= autocvar_cl_vehicle_spiderbot_cross_size; - picsize.y *= autocvar_cl_vehicle_spiderbot_cross_size; - - drawpic('0.5 0 0' * (vid_conwidth - picsize.x) + '0 0.5 0' * (vid_conheight - picsize.y), spider_xhair, picsize, '1 1 1', autocvar_cl_vehicle_spiderbot_cross_alpha, DRAWFLAG_ADDITIVE); - } -} - -void CSQC_RAPTOR_HUD() -{ - if(autocvar_r_letterbox) - return; - - vector picsize, hudloc = '0 0 0', pic2size, picloc; - - // Fetch health & ammo stats - HUD_GETSTATS - - picsize = draw_getimagesize(hud_bg) * autocvar_cl_vehicles_hudscale; - hudloc.y = vid_conheight - picsize.y; - hudloc.x = vid_conwidth * 0.5 - picsize.x * 0.5; - - drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL); - - ammo1 *= 0.01; - ammo2 *= 0.01; - shield *= 0.01; - vh_health *= 0.01; - energy *= 0.01; - reload1 = reload2 * 0.01; - //reload2 *= 0.01; - - pic2size = draw_getimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8); - picloc = picsize * 0.5 - pic2size * 0.5; - if(vh_health < 0.25) - drawpic(hudloc + picloc, raptor_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - else - drawpic(hudloc + picloc, raptor_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL); - drawpic(hudloc + picloc, raptor_bomb, pic2size, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL); - drawpic(hudloc + picloc, raptor_gun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); - drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL); - -// Health bar - picsize = draw_getimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale; - picloc = '69 69 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - vh_health)), 0, vid_conwidth, vid_conheight); - drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL); - drawresetcliparea(); -// .. and icon - picsize = draw_getimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale; - picloc = '37 65 0' * autocvar_cl_vehicles_hudscale; - if(vh_health < 0.25) - { - if(alarm1time < time) - { - alarm1time = time + 2; - sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTEN_NONE); - } - - drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - } - else - { - drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - if(alarm1time) - { - sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); - alarm1time = 0; - } - } - -// Shield bar - picsize = draw_getimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale; - picloc = '69 140 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - shield)), 0, vid_conwidth, vid_conheight); - drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawresetcliparea(); -// .. and icon - picloc = '40 136 0' * autocvar_cl_vehicles_hudscale; - picsize = draw_getimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale; - if(shield < 0.25) - { - if(alarm2time < time) - { - alarm2time = time + 1; - sound(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTEN_NONE); - } - drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - } - else - { - drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - if(alarm2time) - { - sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); - alarm2time = 0; - } - } - -// Gun bar - picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale; - picloc = '450 69 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * energy, vid_conheight); - drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawresetcliparea(); -// .. and icon - picsize = draw_getimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale; - picloc = '664 60 0' * autocvar_cl_vehicles_hudscale; - if(energy < 0.2) - drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - else - drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - -// Bomb bar - picsize = draw_getimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale; - picloc = '450 140 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x, hudloc.y + picloc.y, picsize.x * reload1, vid_conheight); - drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawresetcliparea(); -// .. and icon - pic2size = draw_getimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale; - picloc = '664 130 0' * autocvar_cl_vehicles_hudscale; - if(reload1 != 1) - drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - else - drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL); - - if(weapon2mode == RSM_FLARE) - { - raptor_xhair = "gfx/vehicles/axh-bracket.tga"; - } - else - { - raptor_xhair = "gfx/vehicles/axh-ring.tga"; - - // Bombing crosshair - if(!dropmark) - { - dropmark = spawn(); - dropmark.owner = self; - dropmark.gravity = 1; - } - - if(reload2 == 100) - { - vector where; - - setorigin(dropmark, pmove_org); - dropmark.velocity = pmove_vel; - tracetoss(dropmark, self); - - where = project_3d_to_2d(trace_endpos); - - setorigin(dropmark, trace_endpos); - picsize = draw_getimagesize(raptor_drop) * 0.2; - - if (!(where.z < 0 || where.x < 0 || where.y < 0 || where.x > vid_conwidth || where.y > vid_conheight)) - { - where.x -= picsize.x * 0.5; - where.y -= picsize.y * 0.5; - where.z = 0; - drawpic(where, raptor_drop, picsize, '0 2 0', 1, DRAWFLAG_ADDITIVE); - } - dropmark.cnt = time + 5; - } - else - { - vector where; - if(dropmark.cnt > time) - { - where = project_3d_to_2d(dropmark.origin); - picsize = draw_getimagesize(raptor_drop) * 0.25; - - if (!(where.z < 0 || where.x < 0 || where.y < 0 || where.x > vid_conwidth || where.y > vid_conheight)) - { - where.x -= picsize.x * 0.5; - where.y -= picsize.y * 0.5; - where.z = 0; - drawpic(where, raptor_drop, picsize, '2 0 0', 1, DRAWFLAG_ADDITIVE); - } - } - } - } - - if (scoreboard_showscores) - HUD_DrawScoreboard(); - else - { - picsize = draw_getimagesize(raptor_xhair); - picsize.x *= 0.5; - picsize.y *= 0.5; - - drawpic('0.5 0 0' * (vid_conwidth - picsize.x) + '0 0.5 0' * (vid_conheight - picsize.y), raptor_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - } -} - -void CSQC_WAKIZASHI_HUD() -{ -/* - drawpic(hudloc, waki_s, picsize, '1 1 1', shield, DRAWFLAG_NORMAL); - drawpic(hudloc, waki_b, picsize, '0 1 0' * health + '1 0 0' * (1 - health), 1, DRAWFLAG_NORMAL); - drawpic(hudloc, waki_r, picsize, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL); - drawpic(hudloc, waki_e, picsize, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); -*/ - if(autocvar_r_letterbox) - return; - - vector picsize, hudloc = '0 0 0', pic2size, picloc; - - // Fetch health & ammo stats - HUD_GETSTATS - - picsize = draw_getimagesize(hud_bg) * autocvar_cl_vehicles_hudscale; - hudloc.y = vid_conheight - picsize.y; - hudloc.x = vid_conwidth * 0.5 - picsize.x * 0.5; - - drawpic(hudloc, hud_bg, picsize, '1 1 1', autocvar_cl_vehicles_hudalpha, DRAWFLAG_NORMAL); - - shield *= 0.01; - vh_health *= 0.01; - energy *= 0.01; - reload1 *= 0.01; - - pic2size = draw_getimagesize(spider_ico) * (autocvar_cl_vehicles_hudscale * 0.8); - picloc = picsize * 0.5 - pic2size * 0.5; - if(vh_health < 0.25) - drawpic(hudloc + picloc, waki_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - else - drawpic(hudloc + picloc, waki_ico, pic2size, '1 1 1' * vh_health + '1 0 0' * (1 - vh_health), 1, DRAWFLAG_NORMAL); - drawpic(hudloc + picloc, waki_eng, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); - drawpic(hudloc + picloc, waki_gun, pic2size, '1 1 1' * energy + '1 0 0' * (1 - energy), 1, DRAWFLAG_NORMAL); - drawpic(hudloc + picloc, waki_rkt, pic2size, '1 1 1' * reload1 + '1 0 0' * (1 - reload1), 1, DRAWFLAG_NORMAL); - drawpic(hudloc + picloc, hud_sh, pic2size, '1 1 1', shield, DRAWFLAG_NORMAL); - -// Health bar - picsize = draw_getimagesize(hud_hp_bar) * autocvar_cl_vehicles_hudscale; - picloc = '69 69 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - vh_health)), 0, vid_conwidth, vid_conheight); - drawpic(hudloc + picloc, hud_hp_bar, picsize, '1 1 1', 1 , DRAWFLAG_NORMAL); - drawresetcliparea(); -// .. and icon - picsize = draw_getimagesize(hud_hp_ico) * autocvar_cl_vehicles_hudscale; - picloc = '37 65 0' * autocvar_cl_vehicles_hudscale; - if(vh_health < 0.25) - { - if(alarm1time < time) - { - alarm1time = time + 2; - sound(self, CH_PAIN_SINGLE, "vehicles/alarm.wav", VOL_BASEVOICE, ATTEN_NONE); - } - - drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - } - else - { - drawpic(hudloc + picloc, hud_hp_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - if(alarm1time) - { - sound(self, CH_PAIN_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); - alarm1time = 0; - } - } - - -// Shield bar - picsize = draw_getimagesize(hud_sh_bar) * autocvar_cl_vehicles_hudscale; - picloc = '69 140 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x + (picsize.x * (1 - shield)), 0, vid_conwidth, vid_conheight); - drawpic(hudloc + picloc, hud_sh_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawresetcliparea(); -// .. and icon - picloc = '40 136 0' * autocvar_cl_vehicles_hudscale; - picsize = draw_getimagesize(hud_sh_ico) * autocvar_cl_vehicles_hudscale; - if(shield < 0.25) - { - if(alarm2time < time) - { - alarm2time = time + 1; - sound(self, CH_TRIGGER_SINGLE, "vehicles/alarm_shield.wav", VOL_BASEVOICE, ATTEN_NONE); - } - drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - } - else - { - drawpic(hudloc + picloc, hud_sh_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - if(alarm2time) - { - sound(self, CH_TRIGGER_SINGLE, "misc/null.wav", VOL_BASEVOICE, ATTEN_NONE); - alarm2time = 0; - } - } - -// Gun bar - picsize = draw_getimagesize(hud_ammo1_bar) * autocvar_cl_vehicles_hudscale; - picloc = '450 69 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x, picloc.y, picsize.x * energy, vid_conheight); - drawpic(hudloc + picloc, hud_ammo1_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawresetcliparea(); -// .. and icon - picsize = draw_getimagesize(hud_ammo1_ico) * autocvar_cl_vehicles_hudscale; - picloc = '664 60 0' * autocvar_cl_vehicles_hudscale; - if(energy < 0.2) - drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - else - drawpic(hudloc + picloc, hud_ammo1_ico, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - -// Bomb bar - picsize = draw_getimagesize(hud_ammo2_bar) * autocvar_cl_vehicles_hudscale; - picloc = '450 140 0' * autocvar_cl_vehicles_hudscale; - drawsetcliparea(hudloc.x + picloc.x, hudloc.y + picloc.y, picsize.x * reload1, vid_conheight); - drawpic(hudloc + picloc, hud_ammo2_bar, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - drawresetcliparea(); -// .. and icon - pic2size = draw_getimagesize(hud_ammo2_ico) * autocvar_cl_vehicles_hudscale; - picloc = '664 130 0' * autocvar_cl_vehicles_hudscale; - if(reload1 != 1) - drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 0 0' + '0 1 1' * sin(time * 8), 1, DRAWFLAG_NORMAL); - else - drawpic(hudloc + picloc, hud_ammo2_ico, pic2size, '1 1 1', 1, DRAWFLAG_NORMAL); - - if (scoreboard_showscores) - HUD_DrawScoreboard(); - else - { - picsize = draw_getimagesize(waki_xhair); - picsize.x *= 0.5; - picsize.y *= 0.5; - - - drawpic('0.5 0 0' * (vid_conwidth - picsize.x) + '0 0.5 0' * (vid_conheight - picsize.y), waki_xhair, picsize, '1 1 1', 1, DRAWFLAG_NORMAL); - } -} - -void Vehicles_Precache() -{ - precache_model("models/vehicles/bomblet.md3"); - precache_model("models/vehicles/clusterbomb.md3"); - precache_model("models/vehicles/clusterbomb_fragment.md3"); - precache_model("models/vehicles/rocket01.md3"); - precache_model("models/vehicles/rocket02.md3"); - - precache_sound ("vehicles/alarm.wav"); - precache_sound ("vehicles/alarm_shield.wav"); -} - -void RaptorCBShellfragDraw() -{ - if(wasfreed(self)) - return; - - Movetype_Physics_MatchTicrate(autocvar_cl_gibs_ticrate, autocvar_cl_gibs_sloppy); - self.move_avelocity += randomvec() * 15; - self.renderflags = 0; - - if(self.cnt < time) - self.alpha = bound(0, self.nextthink - time, 1); - - if(self.alpha < ALPHA_MIN_VISIBLE) - remove(self); -} - -void RaptorCBShellfragToss(vector _org, vector _vel, vector _ang) -{ - entity sfrag; - - sfrag = spawn(); - setmodel(sfrag, "models/vehicles/clusterbomb_fragment.md3"); - setorigin(sfrag, _org); - - sfrag.move_movetype = MOVETYPE_BOUNCE; - sfrag.gravity = 0.15; - sfrag.solid = SOLID_CORPSE; - - sfrag.draw = RaptorCBShellfragDraw; - - sfrag.move_origin = sfrag.origin = _org; - sfrag.move_velocity = _vel; - sfrag.move_avelocity = prandomvec() * vlen(sfrag.move_velocity); - sfrag.angles = self.move_angles = _ang; - - sfrag.move_time = time; - sfrag.damageforcescale = 4; - - sfrag.nextthink = time + 3; - sfrag.cnt = time + 2; - sfrag.alpha = 1; - sfrag.drawmask = MASK_NORMAL; -} diff --git a/qcsrc/client/vehicles/vehicles.qh b/qcsrc/client/vehicles/vehicles.qh deleted file mode 100644 index e8d3ddb4f7..0000000000 --- a/qcsrc/client/vehicles/vehicles.qh +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef VEHICLES_H -#define VEHICLES_H - -void RaptorCBShellfragDraw(); -void RaptorCBShellfragToss(vector _org, vector _vel, vector _ang); -void Vehicles_Precache(); -void Net_AuXair2(bool bIsNew); -void Net_VehicleSetup(); - -void CSQC_WAKIZASHI_HUD(); -void CSQC_SPIDER_HUD(); -void CSQC_RAPTOR_HUD(); -void CSQC_BUMBLE_HUD(); -void CSQC_BUMBLE_GUN_HUD(); - -#endif diff --git a/qcsrc/client/view.qc b/qcsrc/client/view.qc index 3ffb4066c5..d3bcf92447 100644 --- a/qcsrc/client/view.qc +++ b/qcsrc/client/view.qc @@ -9,7 +9,7 @@ #include "scoreboard.qh" #include "shownames.qh" #include "target_music.qh" -#include "vehicles/vehicles.qh" +#include "vehicles/all.qh" #include "waypointsprites.qh" #include "../common/constants.qh" @@ -19,7 +19,7 @@ #include "../common/teams.qh" #include "../common/util.qh" -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" #include "../csqcmodellib/cl_player.qh" diff --git a/qcsrc/client/waypointsprites.qc b/qcsrc/client/waypointsprites.qc index dc38219b51..aed0865dda 100644 --- a/qcsrc/client/waypointsprites.qc +++ b/qcsrc/client/waypointsprites.qc @@ -8,7 +8,7 @@ #include "../common/constants.qh" #include "../common/teams.qh" -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" #include "../csqcmodellib/interpolate.qh" diff --git a/qcsrc/common/command/all.qc b/qcsrc/common/command/all.qc new file mode 100644 index 0000000000..dc1c0441fa --- /dev/null +++ b/qcsrc/common/command/all.qc @@ -0,0 +1,3 @@ +#include "generic.qc" +#include "markup.qc" +#include "rpn.qc" diff --git a/qcsrc/common/command/all.qh b/qcsrc/common/command/all.qh new file mode 100644 index 0000000000..7eeb5c3233 --- /dev/null +++ b/qcsrc/common/command/all.qh @@ -0,0 +1,8 @@ +#ifndef COMMON_COMMANDS_ALL_H +#define COMMON_COMMANDS_ALL_H + +#include "generic.qh" +#include "markup.qh" +#include "rpn.qh" + +#endif diff --git a/qcsrc/common/command/commands.qc b/qcsrc/common/command/commands.qc deleted file mode 100644 index dc1c0441fa..0000000000 --- a/qcsrc/common/command/commands.qc +++ /dev/null @@ -1,3 +0,0 @@ -#include "generic.qc" -#include "markup.qc" -#include "rpn.qc" diff --git a/qcsrc/common/command/commands.qh b/qcsrc/common/command/commands.qh deleted file mode 100644 index d434a86555..0000000000 --- a/qcsrc/common/command/commands.qh +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef COMMON_COMMANDS_H -#define COMMON_COMMANDS_H - -#include "generic.qh" -#include "markup.qh" -#include "rpn.qh" - -#endif diff --git a/qcsrc/common/command/generic.qc b/qcsrc/common/command/generic.qc index f0b6d0de5a..6aa93a024e 100644 --- a/qcsrc/common/command/generic.qc +++ b/qcsrc/common/command/generic.qc @@ -241,6 +241,25 @@ void GenericCommand_dumpcommands(float request) } } +void GenericCommand_dumpitems(float request) +{ + switch(request) + { + case CMD_REQUEST_COMMAND: + { + Dump_Items(); + return; + } + + default: + case CMD_REQUEST_USAGE: + { + printf("\nUsage:^3 %s dumpitems", GetProgramCommandPrefix()); + return; + } + } +} + void GenericCommand_dumpnotifs(float request) { switch(request) @@ -651,6 +670,7 @@ void GenericCommand_(float request) #define GENERIC_COMMANDS(request,arguments,command) \ GENERIC_COMMAND("addtolist", GenericCommand_addtolist(request, arguments), "Add a string to a cvar") \ GENERIC_COMMAND("dumpcommands", GenericCommand_dumpcommands(request), "Dump all commands on the program to *_cmd_dump.txt") \ + GENERIC_COMMAND("dumpitems", GenericCommand_dumpitems(request), "Dump all items to the console") \ GENERIC_COMMAND("dumpnotifs", GenericCommand_dumpnotifs(request), "Dump all notifications into notifications_dump.txt") \ GENERIC_COMMAND("dumpweapons", GenericCommand_dumpweapons(request), "Dump all weapons into weapons_dump.txt") \ GENERIC_COMMAND("maplist", GenericCommand_maplist(request, arguments), "Automatic control of maplist") \ diff --git a/qcsrc/common/constants.qh b/qcsrc/common/constants.qh index 45a65abbe9..8c7cb6b3af 100644 --- a/qcsrc/common/constants.qh +++ b/qcsrc/common/constants.qh @@ -64,6 +64,7 @@ const int ENT_CLIENT_WARPZONE = 24; const int ENT_CLIENT_WARPZONE_CAMERA = 25; const int ENT_CLIENT_TRIGGER_MUSIC = 26; const int ENT_CLIENT_HOOK = 27; +const int ENT_CLIENT_INVENTORY = 28; const int ENT_CLIENT_ARC_BEAM = 29; // WEAPONTODO: fix numbers const int ENT_CLIENT_ACCURACY = 30; const int ENT_CLIENT_SHOWNAMES = 31; diff --git a/qcsrc/common/items/all.inc b/qcsrc/common/items/all.inc new file mode 100644 index 0000000000..2c4f1dea46 --- /dev/null +++ b/qcsrc/common/items/all.inc @@ -0,0 +1,7 @@ +#include "item/ammo.qc" +#include "item/armor.qc" +#include "item/buff.qc" +#include "item/health.qc" +#include "item/jetpack.qc" +#include "item/pickup.qc" +#include "item/powerup.qc" diff --git a/qcsrc/common/items/all.qc b/qcsrc/common/items/all.qc new file mode 100644 index 0000000000..fa198bb832 --- /dev/null +++ b/qcsrc/common/items/all.qc @@ -0,0 +1,14 @@ +#ifndef ALL_C +#define ALL_C +#include "all.qh" + +#include "all.inc" + +void Dump_Items() +{ + ITEMS_FOREACH(true, LAMBDA({ + ITEM_HANDLE(Show, it); + })); +} + +#endif diff --git a/qcsrc/common/items/all.qh b/qcsrc/common/items/all.qh new file mode 100644 index 0000000000..1786b42611 --- /dev/null +++ b/qcsrc/common/items/all.qh @@ -0,0 +1,19 @@ +#ifndef ALL_H +#define ALL_H + +const int MAX_ITEMS = 24; +entity ITEMS[MAX_ITEMS]; + +#define ITEMS_FOREACH(pred, body) do { \ + for (int i = 0; i < ITEM_COUNT; i++) { \ + const noref entity it = ITEMS[i]; \ + if (pred) { body } \ + } \ +} while(0) + +void RegisterItems(); +void Dump_Items(); + +#endif + +#include "inventory.qh" diff --git a/qcsrc/common/items/inventory.qh b/qcsrc/common/items/inventory.qh new file mode 100644 index 0000000000..89abc97cff --- /dev/null +++ b/qcsrc/common/items/inventory.qh @@ -0,0 +1,65 @@ +#ifndef INVENTORY_H +#define INVENTORY_H + +#include "all.qh" +#include "item/pickup.qh" + +entityclass(Inventory); +/** Stores counts of items, the id being the index */ +class(Inventory) .int inv_items[MAX_ITEMS]; + +/** Player inventory; Inventories also have one inventory for storing the previous state */ +.Inventory inventory; + +#ifdef CSQC +void Inventory_Read(Inventory data) +{ + const int bits = ReadInt24_t(); + ITEMS_FOREACH(bits & BIT(i), LAMBDA({ + .int fld = inv_items[i]; + int prev = data.(fld); + int next = data.(fld) = ReadByte(); + dprintf("%s: %.0f -> %.0f\n", ITEMS[i].m_name, prev, next); + })); +} +#endif + +#ifdef SVQC +void Inventory_Write(Inventory data) +{ + int bits = 0; + ITEMS_FOREACH(true, LAMBDA({ + .int fld = inv_items[i]; + bits = BITSET(bits, BIT(i), data.inventory.(fld) != (data.inventory.(fld) = data.(fld))); + })); + WriteInt24_t(MSG_ENTITY, bits); + ITEMS_FOREACH(bits & BIT(i), LAMBDA({ + WriteByte(MSG_ENTITY, data.inv_items[i]); + })); +} +#endif + +#ifdef SVQC +bool Inventory_Send(entity to, int sf) +{ + WriteByte(MSG_ENTITY, ENT_CLIENT_INVENTORY); + entity e = self.owner; + if (IS_SPEC(e)) e = e.enemy; + Inventory data = e.inventory; + Inventory_Write(data); + return true; +} + +void Inventory_new(entity e) +{ + Inventory inv = new(Inventory), bak = new(Inventory); + inv.classname = "inventory", bak.classname = "inventory"; + inv.inventory = bak; + inv.drawonlytoclient = e; + Net_LinkEntity((inv.owner = e).inventory = inv, false, 0, Inventory_Send); +} +void Inventory_delete(entity e) { remove(e.inventory.inventory); remove(e.inventory); } +void Inventory_update(entity e) { e.inventory.SendFlags = 0xFFFFFF; } +#endif + +#endif diff --git a/qcsrc/common/items/item.qh b/qcsrc/common/items/item.qh new file mode 100644 index 0000000000..da4e7a4537 --- /dev/null +++ b/qcsrc/common/items/item.qh @@ -0,0 +1,25 @@ +#ifndef GAMEITEM_H +#define GAMEITEM_H +#include "../oo.qh" +#define ITEM_HANDLE(signal, ...) __Item_Send_##signal(__VA_ARGS__) +CLASS(GameItem, Object) + ATTRIB(GameItem, m_id, int, 0) + METHOD(GameItem, show, void(entity this)) + void GameItem_show(entity this) { print("A game item\n"); } + void ITEM_HANDLE(Show, entity this) { this.show(this); } +ENDCLASS(GameItem) + + +int ITEM_COUNT; +#define REGISTER_ITEM(id, class, body) \ + entity ITEM_##id; \ + void RegisterItems_##id() { \ + const entity this = NEW(class); \ + ITEM_##id = this; \ + this.m_id = ITEM_COUNT; \ + ITEMS[ITEM_COUNT++] = this; \ + body \ + } \ + ACCUMULATE_FUNCTION(RegisterItems, RegisterItems_##id) + +#endif diff --git a/qcsrc/common/items/item/ammo.qc b/qcsrc/common/items/item/ammo.qc new file mode 100644 index 0000000000..032fcc3fea --- /dev/null +++ b/qcsrc/common/items/item/ammo.qc @@ -0,0 +1,70 @@ +#include "ammo.qh" +#ifdef SVQC + #include "../../../server/t_items.qh" +#endif + +#define WITH(it) this.m_##it; +#define CONFIGURE(...) MAP(WITH, __VA_ARGS__) +#define DEFINE(id, ...) \ + REGISTER_ITEM(id, Ammo, LAMBDA( \ + IF(SV, CONFIGURE \ + , respawntime = GET(g_pickup_respawntime_ammo) \ + , respawntimejitter = GET(g_pickup_respawntimejitter_ammo) \ + ) \ + UNWORDS(__VA_ARGS__) \ + )) + +DEFINE(Bullets + ,APPLY(CONFIGURE + , model = "models/items/a_bullets.mdl" + , name = "bullets" + ) + ,IF(SV, CONFIGURE + , botvalue = 2000 + , itemid = IT_NAILS + ) +) +DEFINE(Cells + ,APPLY(CONFIGURE + , model = "models/items/a_cells.md3" + , name = "cells" + ) + ,IF(SV, CONFIGURE + , botvalue = 2000 + , itemid = IT_CELLS + ) +) +DEFINE(Plasma + ,APPLY(CONFIGURE + , model = "models/items/a_cells.md3" + , name = "plasma" + ) + ,IF(SV, CONFIGURE + , botvalue = 2000 + , itemid = IT_PLASMA + ) +) +DEFINE(Rockets + ,APPLY(CONFIGURE + , model = "models/items/a_rockets.md3" + , name = "rockets" + ) + ,IF(SV, CONFIGURE + , botvalue = 3000 + , itemid = IT_ROCKETS + ) +) +DEFINE(Shells + ,APPLY(CONFIGURE + , model = "models/items/a_shells.md3" + , name = "shells" + ) + ,IF(SV, CONFIGURE + , botvalue = 500 + , itemid = IT_SHELLS + ) +) + +#undef WITH +#undef CONFIGURE +#undef DEFINE diff --git a/qcsrc/common/items/item/ammo.qh b/qcsrc/common/items/item/ammo.qh new file mode 100644 index 0000000000..41e2ac831c --- /dev/null +++ b/qcsrc/common/items/item/ammo.qh @@ -0,0 +1,9 @@ +#ifndef AMMO_H +#define AMMO_H +#include "pickup.qh" +CLASS(Ammo, Pickup) +#ifdef SVQC + ATTRIB(Ammo, m_pickupevalfunc, float(entity player, entity item), commodity_pickupevalfunc) +#endif +ENDCLASS(Ammo) +#endif diff --git a/qcsrc/common/items/item/armor.qc b/qcsrc/common/items/item/armor.qc new file mode 100644 index 0000000000..8fed098ac1 --- /dev/null +++ b/qcsrc/common/items/item/armor.qc @@ -0,0 +1,68 @@ +#include "armor.qh" +#ifdef SVQC + #include "../../../server/t_items.qh" +#endif + +#define WITH(it) this.m_##it; +#define CONFIGURE(...) MAP(WITH, __VA_ARGS__) +#define DEFINE(id, ...) REGISTER_ITEM(id, Armor, UNWORDS(__VA_ARGS__)) + +DEFINE(ArmorSmall + ,APPLY(CONFIGURE + , model = "models/items/item_armor_small.md3" + , sound = "misc/armor1.wav" + , name = "5 Armor" + ) + ,IF(SV, CONFIGURE + , botvalue = BOT_PICKUP_RATING_LOW + , itemid = IT_ARMOR_SHARD + , respawntime = GET(g_pickup_respawntime_short) + , respawntimejitter = GET(g_pickup_respawntimejitter_short) + ) +) + +DEFINE(ArmorMedium + ,APPLY(CONFIGURE + , model = "models/items/item_armor_medium.md3" + , sound = "misc/armor10.wav" + , name = "25 Armor" + ) + ,IF(SV, CONFIGURE + , botvalue = BOT_PICKUP_RATING_MID + , itemid = IT_ARMOR + , respawntime = GET(g_pickup_respawntime_medium) + , respawntimejitter = GET(g_pickup_respawntimejitter_medium) + ) +) + +DEFINE(ArmorBig + ,APPLY(CONFIGURE + , model = "models/items/item_armor_big.md3" + , sound = "misc/armor17_5.wav" + , name = "50 Armor" + ) + ,IF(SV, CONFIGURE + , botvalue = 20000 // FIXME: higher than BOT_PICKUP_RATING_HIGH? + , itemid = IT_ARMOR + , respawntime = GET(g_pickup_respawntime_long) + , respawntimejitter = GET(g_pickup_respawntimejitter_long) + ) +) + +DEFINE(ArmorLarge + ,APPLY(CONFIGURE + , model = "models/items/item_armor_large.md3" + , sound = "misc/armor25.wav" + , name = "100 Armor" + ) + ,IF(SV, CONFIGURE + , botvalue = BOT_PICKUP_RATING_HIGH + , itemid = IT_ARMOR + , respawntime = GET(g_pickup_respawntime_long) + , respawntimejitter = GET(g_pickup_respawntimejitter_long) + ) +) + +#undef WITH +#undef CONFIGURE +#undef DEFINE diff --git a/qcsrc/common/items/item/armor.qh b/qcsrc/common/items/item/armor.qh new file mode 100644 index 0000000000..48a80f886a --- /dev/null +++ b/qcsrc/common/items/item/armor.qh @@ -0,0 +1,9 @@ +#ifndef ARMOR_H +#define ARMOR_H +#include "pickup.qh" +CLASS(Armor, Pickup) +#ifdef SVQC + ATTRIB(Armor, m_pickupevalfunc, float(entity player, entity item), commodity_pickupevalfunc) +#endif +ENDCLASS(Armor) +#endif diff --git a/qcsrc/common/items/item/buff.qc b/qcsrc/common/items/item/buff.qc new file mode 100644 index 0000000000..d9420d1c3c --- /dev/null +++ b/qcsrc/common/items/item/buff.qc @@ -0,0 +1,3 @@ +#include "buff.qh" + +REGISTER_ITEM(DefaultBuff, Buff, LAMBDA()) diff --git a/qcsrc/common/items/item/buff.qh b/qcsrc/common/items/item/buff.qh new file mode 100644 index 0000000000..4ad93cb5f9 --- /dev/null +++ b/qcsrc/common/items/item/buff.qh @@ -0,0 +1,7 @@ +#ifndef BUFF_H +#define BUFF_H +#include "pickup.qh" +CLASS(Buff, Pickup) + ATTRIB(Buff, m_name, string, "Buff") +ENDCLASS(Buff) +#endif diff --git a/qcsrc/common/items/item/health.qc b/qcsrc/common/items/item/health.qc new file mode 100644 index 0000000000..08b422de1e --- /dev/null +++ b/qcsrc/common/items/item/health.qc @@ -0,0 +1,68 @@ +#include "health.qh" +#ifdef SVQC + #include "../../../server/t_items.qh" +#endif + +#define WITH(it) this.m_##it; +#define CONFIGURE(...) MAP(WITH, __VA_ARGS__) +#define DEFINE(id, ...) REGISTER_ITEM(id, Health, UNWORDS(__VA_ARGS__)) + +DEFINE(HealthSmall + ,APPLY(CONFIGURE + , model = "models/items/g_h1.md3" + , sound = "misc/minihealth.wav" + , name = "5 Health" + ) + ,IF(SV, CONFIGURE + , botvalue = BOT_PICKUP_RATING_LOW + , itemid = IT_5HP + , respawntime = GET(g_pickup_respawntime_short) + , respawntimejitter = GET(g_pickup_respawntimejitter_short) + ) +) + +DEFINE(HealthMedium + ,APPLY(CONFIGURE + , model = "models/items/g_h25.md3" + , sound = "misc/mediumhealth.wav" + , name = "25 Health" + ) + ,IF(SV, CONFIGURE + , botvalue = BOT_PICKUP_RATING_MID + , itemid = IT_25HP + , respawntime = GET(g_pickup_respawntime_short) + , respawntimejitter = GET(g_pickup_respawntimejitter_short) + ) +) + +DEFINE(HealthLarge + ,APPLY(CONFIGURE + , model = "models/items/g_h50.md3" + , sound = "misc/mediumhealth.wav" + , name = "50 Health" + ) + ,IF(SV, CONFIGURE + , botvalue = BOT_PICKUP_RATING_MID + , itemid = IT_25HP + , respawntime = GET(g_pickup_respawntime_medium) + , respawntimejitter = GET(g_pickup_respawntimejitter_medium) + ) +) + +DEFINE(HealthMega + ,APPLY(CONFIGURE + , model = "models/items/g_h100.md3" + , sound = "misc/megahealth.wav" + , name = "100 Health" + ) + ,IF(SV, CONFIGURE + , botvalue = BOT_PICKUP_RATING_HIGH + , itemid = IT_HEALTH + , respawntime = GET(g_pickup_respawntime_long) + , respawntimejitter = GET(g_pickup_respawntimejitter_long) + ) +) + +#undef WITH +#undef CONFIGURE +#undef DEFINE diff --git a/qcsrc/common/items/item/health.qh b/qcsrc/common/items/item/health.qh new file mode 100644 index 0000000000..15f1f8dd91 --- /dev/null +++ b/qcsrc/common/items/item/health.qh @@ -0,0 +1,9 @@ +#ifndef HEALTH_H +#define HEALTH_H +#include "pickup.qh" +CLASS(Health, Pickup) +#ifdef SVQC + ATTRIB(Health, m_pickupevalfunc, float(entity player, entity item), commodity_pickupevalfunc) +#endif +ENDCLASS(Health) +#endif diff --git a/qcsrc/common/items/item/jetpack.qc b/qcsrc/common/items/item/jetpack.qc new file mode 100644 index 0000000000..9ff4ed05cb --- /dev/null +++ b/qcsrc/common/items/item/jetpack.qc @@ -0,0 +1,56 @@ +#ifdef SVQC + #include "../../../server/t_items.qh" + #include "../../../server/constants.qh" +#endif + +#define WITH(it) this.m_##it; +#define CONFIGURE(...) MAP(WITH, __VA_ARGS__) +#define DEFINE(id, ...) REGISTER_ITEM(id, Pickup, UNWORDS(__VA_ARGS__)) + +DEFINE(Jetpack + ,APPLY(CONFIGURE + , model = "models/items/g_jetpack.md3" + , name = "Jet pack" + ) + ,IF(SV, CONFIGURE + , botvalue = BOT_PICKUP_RATING_LOW + , itemflags = FL_POWERUP + , itemid = IT_JETPACK + , pickupevalfunc = commodity_pickupevalfunc + , respawntime = GET(g_pickup_respawntime_powerup) + , respawntimejitter = GET(g_pickup_respawntimejitter_powerup) + ) +) + +DEFINE(JetpackFuel + ,APPLY(CONFIGURE + , model = "models/items/g_fuel.md3" + , name = "Fuel" + ) + ,IF(SV, CONFIGURE + , botvalue = BOT_PICKUP_RATING_LOW + , itemid = IT_FUEL + , pickupevalfunc = commodity_pickupevalfunc + , respawntime = GET(g_pickup_respawntime_ammo) + , respawntimejitter = GET(g_pickup_respawntimejitter_ammo) + ) +) + +DEFINE(JetpackRegen + ,APPLY(CONFIGURE + , model = "models/items/g_fuelregen.md3" + , name = "Fuel regenerator" + ) + ,IF(SV, CONFIGURE + , botvalue = BOT_PICKUP_RATING_LOW + , itemflags = FL_POWERUP + , itemid = IT_FUEL_REGEN + , pickupevalfunc = commodity_pickupevalfunc + , respawntime = GET(g_pickup_respawntime_powerup) + , respawntimejitter = GET(g_pickup_respawntimejitter_powerup) + ) +) + +#undef WITH +#undef CONFIGURE +#undef DEFINE diff --git a/qcsrc/common/items/item/pickup.qc b/qcsrc/common/items/item/pickup.qc new file mode 100644 index 0000000000..35aac2bff7 --- /dev/null +++ b/qcsrc/common/items/item/pickup.qc @@ -0,0 +1,13 @@ +#include "pickup.qh" + +#ifdef SVQC +bool ITEM_HANDLE(Pickup, entity this, entity item, entity player) { + bool b = this.giveTo(this, item, player); + if (b) { + dprintf("entity %i picked up %s\n", player, this.m_name); + player.inventory.inv_items[this.m_id]++; + Inventory_update(player); + } + return b; +} +#endif diff --git a/qcsrc/common/items/item/pickup.qh b/qcsrc/common/items/item/pickup.qh new file mode 100644 index 0000000000..1875517f13 --- /dev/null +++ b/qcsrc/common/items/item/pickup.qh @@ -0,0 +1,44 @@ +#ifndef PICKUP_H +#define PICKUP_H +#include "../item.qh" +CLASS(Pickup, GameItem) + ATTRIB(Pickup, m_model, string, string_null) + ATTRIB(Pickup, m_sound, string, "misc/itempickup.wav") + ATTRIB(Pickup, m_name, string, string_null) + METHOD(Pickup, show, void(entity this)) + void Pickup_show(entity this) { printf("%s: %s\n", etos(this), this.m_name); } +#ifdef SVQC + ATTRIB(Pickup, m_botvalue, int, 0) + ATTRIB(Pickup, m_itemflags, int, 0) + ATTRIB(Pickup, m_itemid, int, 0) + ATTRIB(Pickup, m_pickupevalfunc, float(entity player, entity item), generic_pickupevalfunc) + ATTRIB(Pickup, m_respawntime, float(), func_null) + ATTRIB(Pickup, m_respawntimejitter, float(), func_null) + METHOD(Pickup, giveTo, bool(entity this, entity item, entity player)) + bool Pickup_giveTo(entity this, entity item, entity player) { return Item_GiveTo(item, player); } + bool ITEM_HANDLE(Pickup, entity this, entity item, entity player); +#endif +ENDCLASS(Pickup) + +#ifdef SVQC +// For g_pickup_respawntime +#include "../../../server/defs.qh" +// Getters to dynamically retrieve the values of g_pickup_respawntime* +GETTER(float, g_pickup_respawntime_weapon) +GETTER(float, g_pickup_respawntime_superweapon) +GETTER(float, g_pickup_respawntime_ammo) +GETTER(float, g_pickup_respawntime_short) +GETTER(float, g_pickup_respawntime_medium) +GETTER(float, g_pickup_respawntime_long) +GETTER(float, g_pickup_respawntime_powerup) +GETTER(float, g_pickup_respawntimejitter_weapon) +GETTER(float, g_pickup_respawntimejitter_superweapon) +GETTER(float, g_pickup_respawntimejitter_ammo) +GETTER(float, g_pickup_respawntimejitter_short) +GETTER(float, g_pickup_respawntimejitter_medium) +GETTER(float, g_pickup_respawntimejitter_long) +GETTER(float, g_pickup_respawntimejitter_powerup) + +#endif + +#endif diff --git a/qcsrc/common/items/item/powerup.qc b/qcsrc/common/items/item/powerup.qc new file mode 100644 index 0000000000..f10a97e54f --- /dev/null +++ b/qcsrc/common/items/item/powerup.qc @@ -0,0 +1,40 @@ +#include "powerup.qh" +#include "../../../server/t_items.qh" + +#define WITH(it) this.m_##it; +#define CONFIGURE(...) MAP(WITH, __VA_ARGS__) +#define DEFINE(id, ...) \ + REGISTER_ITEM(id, Ammo, LAMBDA( \ + IF(SV, CONFIGURE \ + , botvalue = 100000 \ + , itemflags = FL_POWERUP \ + , respawntime = GET(g_pickup_respawntime_powerup) \ + , respawntimejitter = GET(g_pickup_respawntimejitter_powerup) \ + ) \ + UNWORDS(__VA_ARGS__) \ + )) + +DEFINE(Strength + ,APPLY(CONFIGURE + , model = "models/items/g_strength.md3" + , sound = "misc/powerup.wav" + , name = "Strength Powerup" + ) + ,IF(SV, CONFIGURE + , itemid = IT_STRENGTH + ) +) +DEFINE(Shield + ,APPLY(CONFIGURE + , model = "models/items/g_invincible.md3" + , sound = "misc/powerup_shield.wav" + , name = "Shield" + ) + ,IF(SV, CONFIGURE + , itemid = IT_INVINCIBLE + ) +) + +#undef WITH +#undef CONFIGURE +#undef DEFINE diff --git a/qcsrc/common/items/item/powerup.qh b/qcsrc/common/items/item/powerup.qh new file mode 100644 index 0000000000..d27c1e60f6 --- /dev/null +++ b/qcsrc/common/items/item/powerup.qh @@ -0,0 +1,12 @@ +#ifndef POWERUP_H +#define POWERUP_H +#include "pickup.qh" +CLASS(Powerup, Pickup) +ENDCLASS(Powerup) + +#ifdef SVQC +// For FL_POWERUP +#include "../../../server/constants.qh" +#endif + +#endif diff --git a/qcsrc/common/mapinfo.qc b/qcsrc/common/mapinfo.qc index c3f15d1937..2e692d7268 100644 --- a/qcsrc/common/mapinfo.qc +++ b/qcsrc/common/mapinfo.qc @@ -3,7 +3,7 @@ #include "../client/defs.qh" #include "util.qh" #include "buffs.qh" - #include "weapons/weapons.qh" + #include "weapons/all.qh" #include "mapinfo.qh" #elif defined(MENUQC) #elif defined(SVQC) @@ -11,7 +11,7 @@ #include "../dpdefs/dpextensions.qh" #include "util.qh" #include "buffs.qh" - #include "monsters/monsters.qh" + #include "monsters/all.qh" #include "mapinfo.qh" #endif diff --git a/qcsrc/common/monsters/all.qc b/qcsrc/common/monsters/all.qc new file mode 100644 index 0000000000..37dbcb3258 --- /dev/null +++ b/qcsrc/common/monsters/all.qc @@ -0,0 +1,47 @@ +#include "all.qh" + +#include "all.inc" + +// MONSTER PLUGIN SYSTEM +entity monster_info[MON_MAXCOUNT]; +entity dummy_monster_info; + +void register_monster(int id, float(float) func, int monsterflags, vector min_s, vector max_s, string modelname, string shortname, string mname) +{ + entity e; + monster_info[id - 1] = e = spawn(); + e.classname = "monster_info"; + e.monsterid = id; + e.netname = shortname; + e.monster_name = mname; + e.monster_func = func; + e.mdl = modelname; + e.spawnflags = monsterflags; + e.mins = min_s; + e.maxs = max_s; + e.model = strzone(strcat("models/monsters/", modelname)); +} +float m_null(float dummy) { return 0; } +void register_monsters_done() +{ + dummy_monster_info = spawn(); + dummy_monster_info.classname = "monster_info"; + dummy_monster_info.monsterid = 0; // you can recognize dummies by this + dummy_monster_info.netname = ""; + dummy_monster_info.monster_name = "Monster"; + dummy_monster_info.monster_func = m_null; + dummy_monster_info.mdl = ""; + dummy_monster_info.mins = '-0 -0 -0'; + dummy_monster_info.maxs = '0 0 0'; + dummy_monster_info.model = ""; +} +entity get_monsterinfo(int id) +{ + entity m; + if(id < MON_FIRST || id > MON_LAST) + return dummy_monster_info; + m = monster_info[id - 1]; + if(m) + return m; + return dummy_monster_info; +} diff --git a/qcsrc/common/monsters/all.qh b/qcsrc/common/monsters/all.qh new file mode 100644 index 0000000000..ce02312f1d --- /dev/null +++ b/qcsrc/common/monsters/all.qh @@ -0,0 +1,73 @@ +#ifndef MONSTERS_ALL_H +#define MONSTERS_ALL_H + +#include "../util.qh" + +// monster requests +const int MR_SETUP = 1; // (SERVER) setup monster data +const int MR_THINK = 2; // (SERVER) logic to run every frame +const int MR_DEATH = 3; // (SERVER) called when monster dies +const int MR_PRECACHE = 4; // (BOTH) precaches models/sounds used by this monster + +// functions: +entity get_monsterinfo(float id); + +// special spawn flags +const int MONSTER_RESPAWN_DEATHPOINT = 16; // re-spawn where we died +const int MONSTER_TYPE_FLY = 32; +const int MONSTER_TYPE_SWIM = 64; +const int MONSTER_SIZE_BROKEN = 128; // TODO: remove when bad models are replaced +const int MON_FLAG_SUPERMONSTER = 256; // incredibly powerful monster +const int MON_FLAG_RANGED = 512; // monster shoots projectiles +const int MON_FLAG_MELEE = 1024; + +// entity properties of monsterinfo: +.float monsterid; // MON_... +.string netname; // short name +.string monster_name; // human readable name +.float(float) monster_func; // m_... +.string mdl; // currently a copy of the model +.string model; // full name of model +.int spawnflags; +.vector mins, maxs; // monster hitbox size + +// other useful macros +#define MON_ACTION(monstertype,mrequest) (get_monsterinfo(monstertype)).monster_func(mrequest) +#define M_NAME(monstertype) (get_monsterinfo(monstertype)).monster_name + +// ===================== +// Monster Registration +// ===================== + +float m_null(float dummy); +void register_monster(float id, float(float) func, float monsterflags, vector min_s, vector max_s, string modelname, string shortname, string mname); +void register_monsters_done(); + +const int MON_MAXCOUNT = 24; +const int MON_FIRST = 1; +int MON_COUNT; +int MON_LAST; + +#define REGISTER_MONSTER_2(id,func,monsterflags,min_s,max_s,modelname,shortname,mname) \ + int id; \ + float func(float); \ + void RegisterMonsters_##id() \ + { \ + MON_LAST = (id = MON_FIRST + MON_COUNT); \ + ++MON_COUNT; \ + register_monster(id,func,monsterflags,min_s,max_s,modelname,shortname,mname); \ + } \ + ACCUMULATE_FUNCTION(RegisterMonsters, RegisterMonsters_##id) +#ifdef MENUQC +#define REGISTER_MONSTER(id,func,monsterflags,min_s,max_s,modelname,shortname,mname) \ + REGISTER_MONSTER_2(MON_##id,m_null,monsterflags,min_s,max_s,modelname,shortname,mname) +#else +#define REGISTER_MONSTER(id,func,monsterflags,min_s,max_s,modelname,shortname,mname) \ + REGISTER_MONSTER_2(MON_##id,func,monsterflags,min_s,max_s,modelname,shortname,mname) +#endif + +#include "all.inc" + +#undef REGISTER_MONSTER +ACCUMULATE_FUNCTION(RegisterMonsters, register_monsters_done); +#endif diff --git a/qcsrc/common/monsters/monsters.qc b/qcsrc/common/monsters/monsters.qc deleted file mode 100644 index 72c5ea870d..0000000000 --- a/qcsrc/common/monsters/monsters.qc +++ /dev/null @@ -1,47 +0,0 @@ -#include "monsters.qh" - -#include "all.inc" - -// MONSTER PLUGIN SYSTEM -entity monster_info[MON_MAXCOUNT]; -entity dummy_monster_info; - -void register_monster(int id, float(float) func, int monsterflags, vector min_s, vector max_s, string modelname, string shortname, string mname) -{ - entity e; - monster_info[id - 1] = e = spawn(); - e.classname = "monster_info"; - e.monsterid = id; - e.netname = shortname; - e.monster_name = mname; - e.monster_func = func; - e.mdl = modelname; - e.spawnflags = monsterflags; - e.mins = min_s; - e.maxs = max_s; - e.model = strzone(strcat("models/monsters/", modelname)); -} -float m_null(float dummy) { return 0; } -void register_monsters_done() -{ - dummy_monster_info = spawn(); - dummy_monster_info.classname = "monster_info"; - dummy_monster_info.monsterid = 0; // you can recognize dummies by this - dummy_monster_info.netname = ""; - dummy_monster_info.monster_name = "Monster"; - dummy_monster_info.monster_func = m_null; - dummy_monster_info.mdl = ""; - dummy_monster_info.mins = '-0 -0 -0'; - dummy_monster_info.maxs = '0 0 0'; - dummy_monster_info.model = ""; -} -entity get_monsterinfo(int id) -{ - entity m; - if(id < MON_FIRST || id > MON_LAST) - return dummy_monster_info; - m = monster_info[id - 1]; - if(m) - return m; - return dummy_monster_info; -} diff --git a/qcsrc/common/monsters/monsters.qh b/qcsrc/common/monsters/monsters.qh deleted file mode 100644 index 4aa1f7ef4c..0000000000 --- a/qcsrc/common/monsters/monsters.qh +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef MONSTERS_H -#define MONSTERS_H - -#include "../util.qh" - -// monster requests -const int MR_SETUP = 1; // (SERVER) setup monster data -const int MR_THINK = 2; // (SERVER) logic to run every frame -const int MR_DEATH = 3; // (SERVER) called when monster dies -const int MR_PRECACHE = 4; // (BOTH) precaches models/sounds used by this monster - -// functions: -entity get_monsterinfo(float id); - -// special spawn flags -const int MONSTER_RESPAWN_DEATHPOINT = 16; // re-spawn where we died -const int MONSTER_TYPE_FLY = 32; -const int MONSTER_TYPE_SWIM = 64; -const int MONSTER_SIZE_BROKEN = 128; // TODO: remove when bad models are replaced -const int MON_FLAG_SUPERMONSTER = 256; // incredibly powerful monster -const int MON_FLAG_RANGED = 512; // monster shoots projectiles -const int MON_FLAG_MELEE = 1024; - -// entity properties of monsterinfo: -.float monsterid; // MON_... -.string netname; // short name -.string monster_name; // human readable name -.float(float) monster_func; // m_... -.string mdl; // currently a copy of the model -.string model; // full name of model -.int spawnflags; -.vector mins, maxs; // monster hitbox size - -// other useful macros -#define MON_ACTION(monstertype,mrequest) (get_monsterinfo(monstertype)).monster_func(mrequest) -#define M_NAME(monstertype) (get_monsterinfo(monstertype)).monster_name - -// ===================== -// Monster Registration -// ===================== - -float m_null(float dummy); -void register_monster(float id, float(float) func, float monsterflags, vector min_s, vector max_s, string modelname, string shortname, string mname); -void register_monsters_done(); - -const int MON_MAXCOUNT = 24; -const int MON_FIRST = 1; -int MON_COUNT; -int MON_LAST; - -#define REGISTER_MONSTER_2(id,func,monsterflags,min_s,max_s,modelname,shortname,mname) \ - int id; \ - float func(float); \ - void RegisterMonsters_##id() \ - { \ - MON_LAST = (id = MON_FIRST + MON_COUNT); \ - ++MON_COUNT; \ - register_monster(id,func,monsterflags,min_s,max_s,modelname,shortname,mname); \ - } \ - ACCUMULATE_FUNCTION(RegisterMonsters, RegisterMonsters_##id) -#ifdef MENUQC -#define REGISTER_MONSTER(id,func,monsterflags,min_s,max_s,modelname,shortname,mname) \ - REGISTER_MONSTER_2(MON_##id,m_null,monsterflags,min_s,max_s,modelname,shortname,mname) -#else -#define REGISTER_MONSTER(id,func,monsterflags,min_s,max_s,modelname,shortname,mname) \ - REGISTER_MONSTER_2(MON_##id,func,monsterflags,min_s,max_s,modelname,shortname,mname) -#endif - -#include "all.inc" - -#undef REGISTER_MONSTER -ACCUMULATE_FUNCTION(RegisterMonsters, register_monsters_done); -#endif diff --git a/qcsrc/common/monsters/spawn.qc b/qcsrc/common/monsters/spawn.qc index 8aee54b980..5bfef1b8f5 100644 --- a/qcsrc/common/monsters/spawn.qc +++ b/qcsrc/common/monsters/spawn.qc @@ -3,7 +3,7 @@ #elif defined(SVQC) #include "../../dpdefs/progsdefs.qh" #include "../util.qh" - #include "monsters.qh" + #include "all.qh" #include "sv_monsters.qh" #include "spawn.qh" #include "../../server/autocvars.qh" diff --git a/qcsrc/common/monsters/sv_monsters.qc b/qcsrc/common/monsters/sv_monsters.qc index 3ff926bf61..ce254751bd 100644 --- a/qcsrc/common/monsters/sv_monsters.qc +++ b/qcsrc/common/monsters/sv_monsters.qc @@ -7,9 +7,9 @@ #include "../constants.qh" #include "../teams.qh" #include "../util.qh" - #include "monsters.qh" + #include "all.qh" #include "sv_monsters.qh" - #include "../weapons/weapons.qh" + #include "../weapons/all.qh" #include "../../server/autocvars.qh" #include "../../server/defs.qh" #include "../deathtypes.qh" diff --git a/qcsrc/common/oo.qh b/qcsrc/common/oo.qh new file mode 100644 index 0000000000..63b17089e4 --- /dev/null +++ b/qcsrc/common/oo.qh @@ -0,0 +1,71 @@ +#ifndef OO_H +#define OO_H + +#ifdef MENUQC + #define NULL (null_entity) +#else + #define NULL (world) +#endif + +.string classname; +.string vtblname; +.entity vtblbase; +entity spawnVtbl(entity this, entity base) +{ + entity vtbl = spawn(); + copyentity(this, vtbl); + vtbl.vtblname = vtbl.classname; + vtbl.classname = "vtbl"; + vtbl.vtblbase = base ? base : vtbl; // Top level objects use vtbl as base + return vtbl; +} + +entity Object_vtbl; +entity spawnObject(entity this, entity) +{ + this = spawn(); + this.classname = "Object"; + if (!Object_vtbl) Object_vtbl = spawnVtbl(this, NULL); + return this; +} + +// Classes have a `spawn##cname(entity, entity)` constructor +// The parameters are used as locals for [[accumulate]] + +// Macro to hide this implementation detail +#define NEW(cname) (spawn##cname(NULL, NULL)) + +#define CLASS(cname, base) \ +entity spawn##cname(entity this, entity basevtbl) { \ + this = NEW(base); basevtbl = base##_vtbl; \ +} + +#define METHOD(cname, name, prototype) \ +prototype cname##_##name; \ +.prototype name; \ +[[accumulate]] entity spawn##cname(entity this, entity basevtbl) { \ + this.name = cname##_##name; \ +} + +#define ATTRIB(cname, name, type, val) \ +.type name; \ +[[accumulate]] entity spawn##cname(entity this, entity basevtbl) { \ + this.name = val; \ +} + +#define ATTRIBARRAY(cname, name, type, cnt) \ +.type name[cnt]; + +#define ENDCLASS(cname) \ +.bool instanceOf##cname; \ +entity cname##_vtbl; \ +[[accumulate]] [[last]] entity spawn##cname(entity this, entity basevtbl) { \ + this.instanceOf##cname = true; \ + this.classname = #cname; \ + if (!cname##_vtbl) cname##_vtbl = spawnVtbl(this, basevtbl); \ + return this; \ +} + +#define SUPER(cname) (cname##_vtbl.vtblbase) + +#endif diff --git a/qcsrc/common/playerstats.qc b/qcsrc/common/playerstats.qc index 5890fb89e1..e46e12fa1e 100644 --- a/qcsrc/common/playerstats.qc +++ b/qcsrc/common/playerstats.qc @@ -6,7 +6,7 @@ #include "constants.qh" #include "util.qh" #include "urllib.qh" - #include "weapons/weapons.qh" + #include "weapons/all.qh" #include "../server/weapons/accuracy.qh" #include "../server/defs.qh" #include "playerstats.qh" diff --git a/qcsrc/common/util-pre.qh b/qcsrc/common/util-pre.qh index a1ac7dc7ad..9d60ae0a9a 100644 --- a/qcsrc/common/util-pre.qh +++ b/qcsrc/common/util-pre.qh @@ -51,7 +51,64 @@ [[deprecated("use true")]] [[alias("true")]] const bool TRUE; [[deprecated("use false")]] [[alias("false")]] const bool FALSE; +#ifdef GMQCC + #define OVERLOAD(F, ...) F##_##__VA_COUNT__(__VA_ARGS__) +#else + #define OVERLOAD_(F,_9,_8,_7,_6,_5,_4,_3,_2,_1,n,...) F##_##n + #define OVERLOAD(F, ...) OVERLOAD_(F,__VA_ARGS__,9,8,7,6,5,4,3,2,1)(__VA_ARGS__) +#endif + +#define LAMBDA(...) { __VA_ARGS__ ; } + +#define MAP(f, ...) OVERLOAD(MAP, f, __VA_ARGS__) +#define MAP_2(f, it) f(it) +#define MAP_3(f, it, ...) f(it)MAP_2(f, __VA_ARGS__) +#define MAP_4(f, it, ...) f(it)MAP_3(f, __VA_ARGS__) +#define MAP_5(f, it, ...) f(it)MAP_4(f, __VA_ARGS__) +#define MAP_6(f, it, ...) f(it)MAP_5(f, __VA_ARGS__) +#define MAP_7(f, it, ...) f(it)MAP_6(f, __VA_ARGS__) +#define MAP_8(f, it, ...) f(it)MAP_7(f, __VA_ARGS__) +#define MAP_9(f, it, ...) f(it)MAP_8(f, __VA_ARGS__) +#define MAP_10(f, it, ...) f(it)MAP_9(f, __VA_ARGS__) +#define MAP_11(f, it, ...) f(it)MAP_10(f, __VA_ARGS__) +#define MAP_12(f, it, ...) f(it)MAP_11(f, __VA_ARGS__) +#define MAP_13(f, it, ...) f(it)MAP_12(f, __VA_ARGS__) +#define MAP_14(f, it, ...) f(it)MAP_13(f, __VA_ARGS__) +#define MAP_15(f, it, ...) f(it)MAP_14(f, __VA_ARGS__) +#define MAP_16(f, it, ...) f(it)MAP_15(f, __VA_ARGS__) +#define MAP_17(f, it, ...) f(it)MAP_16(f, __VA_ARGS__) +#define MAP_18(f, it, ...) f(it)MAP_17(f, __VA_ARGS__) +#define MAP_19(f, it, ...) f(it)MAP_18(f, __VA_ARGS__) +#define MAP_20(f, it, ...) f(it)MAP_19(f, __VA_ARGS__) + +#define IDENTITY(it) it + +#define UNWORDS(...) MAP(IDENTITY, __VA_ARGS__) + +#define APPLY(f, ...) f(__VA_ARGS__) + +#ifdef SVQC + #define SV(f, ...) f(__VA_ARGS__) +#else + #define SV(f, ...) +#endif + +#ifdef CSQC + #define CL(f, ...) f(__VA_ARGS__) +#else + #define CL(f, ...) +#endif + +#define IF(cond, f, ...) cond(f, __VA_ARGS__) + +#define GET(name) name##get +#define GETTER(type, name) type GET(name)() { return name; } + #define BIT(n) (1 << (n)) -#define BITSET(var, mask, flag) (flag ? (var) | (mask) : (var) &~ (mask)) +#ifndef BRANCHLESS_BITSET + #define BITSET(var, mask, flag) (flag ? (var) | (mask) : (var) &~ (mask)) +#else + #define BITSET(var, mask, flag) ((var) ^ (-(flag) ^ (var)) & (mask)) +#endif #endif diff --git a/qcsrc/common/weapons/all.qc b/qcsrc/common/weapons/all.qc new file mode 100644 index 0000000000..847c8371d6 --- /dev/null +++ b/qcsrc/common/weapons/all.qc @@ -0,0 +1,375 @@ +#ifndef WEAPONS_ALL_C +#define WEAPONS_ALL_C + +#include "all.qh" + +#if defined(CSQC) + #include "../../dpdefs/csprogsdefs.qh" + #include "../../client/defs.qh" + #include "../constants.qh" + #include "../stats.qh" + #include "../../warpzonelib/anglestransform.qh" + #include "../../warpzonelib/mathlib.qh" + #include "../../warpzonelib/common.qh" + #include "../../warpzonelib/client.qh" + #include "../util.qh" + #include "../buffs.qh" + #include "../../client/autocvars.qh" + #include "../deathtypes.qh" + #include "../../csqcmodellib/interpolate.qh" + #include "../../client/movetypes.qh" + #include "../../client/main.qh" + #include "../../csqcmodellib/cl_model.qh" +#elif defined(MENUQC) +#elif defined(SVQC) + #include "../../dpdefs/progsdefs.qh" + #include "../../dpdefs/dpextensions.qh" + #include "../../warpzonelib/anglestransform.qh" + #include "../../warpzonelib/mathlib.qh" + #include "../../warpzonelib/common.qh" + #include "../../warpzonelib/util_server.qh" + #include "../../warpzonelib/server.qh" + #include "../constants.qh" + #include "../stats.qh" + #include "../teams.qh" + #include "../util.qh" + #include "../buffs.qh" + #include "../monsters/all.qh" + #include "config.qh" + #include "../../server/weapons/csqcprojectile.qh" + #include "../../server/weapons/tracing.qh" + #include "../../server/t_items.qh" + #include "../../server/autocvars.qh" + #include "../../server/constants.qh" + #include "../../server/defs.qh" + #include "../notifications.qh" + #include "../deathtypes.qh" + #include "../../server/mutators/mutators_include.qh" + #include "../mapinfo.qh" + #include "../../server/command/common.qh" + #include "../../csqcmodellib/sv_model.qh" + #include "../../server/portals.qh" + #include "../../server/g_hook.qh" +#endif +#ifndef MENUQC +#include "calculations.qc" +#endif +#include "all.inc" + +// WEAPON PLUGIN SYSTEM +entity weapon_info[WEP_MAXCOUNT]; +entity dummy_weapon_info; + +#if WEP_MAXCOUNT > 72 +# error Kein Weltraum links auf dem Gerät +#endif + +WepSet WepSet_FromWeapon(int a) { + a -= WEP_FIRST; +#if WEP_MAXCOUNT > 24 + if(a >= 24) { + a -= 24; +#if WEP_MAXCOUNT > 48 + if(a >= 24) { + a -= 24; + return '0 0 1' * power2of(a); + } +#endif + return '0 1 0' * power2of(a); + } +#endif + return '1 0 0' * power2of(a); +} +#ifdef SVQC +void WepSet_AddStat() +{ + addstat(STAT_WEAPONS, AS_INT, weapons_x); +#if WEP_MAXCOUNT > 24 + addstat(STAT_WEAPONS2, AS_INT, weapons_y); +#if WEP_MAXCOUNT > 48 + addstat(STAT_WEAPONS3, AS_INT, weapons_z); +#endif +#endif +} +void WriteWepSet(float dst, WepSet w) +{ +#if WEP_MAXCOUNT > 48 + WriteInt72_t(dst, w); +#elif WEP_MAXCOUNT > 24 + WriteInt48_t(dst, w); +#else + WriteInt24_t(dst, w.x); +#endif +} +#endif +#ifdef CSQC +WepSet WepSet_GetFromStat() +{ + WepSet w = '0 0 0'; + w.x = getstati(STAT_WEAPONS); +#if WEP_MAXCOUNT > 24 + w.y = getstati(STAT_WEAPONS2); +#if WEP_MAXCOUNT > 48 + w.z = getstati(STAT_WEAPONS3); +#endif +#endif + return w; +} +WepSet ReadWepSet() +{ +#if WEP_MAXCOUNT > 48 + return ReadInt72_t(); +#elif WEP_MAXCOUNT > 24 + return ReadInt48_t(); +#else + return ReadInt24_t() * '1 0 0'; +#endif +} +#endif + +void register_weapon( + int id, + WepSet bit, + bool(int) func, + .int ammotype, + int i, + int weapontype, + float pickupbasevalue, + vector clr, + string modelname, + string simplemdl, + string crosshair, + string wepimg, + string refname, + string wepname) +{ + entity e; + weapon_info[id - 1] = e = spawn(); + e.classname = "weapon_info"; + e.weapon = id; + e.weapons = bit; + e.weapon_func = func; + e.ammo_field = ammotype; + e.impulse = i; + e.spawnflags = weapontype; + e.bot_pickupbasevalue = pickupbasevalue; + e.wpcolor = clr; + e.wpmodel = strzone(strcat("wpn-", ftos(id))); + e.mdl = modelname; + e.model = strzone(strcat("models/weapons/g_", modelname, ".md3")); + e.w_simplemdl = strzone(simplemdl); // simpleitems weapon model/image + e.w_crosshair = strzone(car(crosshair)); + string s = cdr(crosshair); + e.w_crosshair_size = ((s != "") ? stof(s) : 1); // so that we can scale the crosshair from code (for compat) + e.model2 = strzone(wepimg); + e.netname = refname; + e.message = wepname; + + #ifdef CSQC + func(WR_INIT); + #endif +} +bool w_null(int dummy) +{ + return 0; +} +void register_weapons_done() +{ + dummy_weapon_info = spawn(); + dummy_weapon_info.classname = "weapon_info"; + dummy_weapon_info.weapon = 0; // you can recognize dummies by this + dummy_weapon_info.weapons = '0 0 0'; + dummy_weapon_info.netname = ""; + dummy_weapon_info.message = "AOL CD Thrower"; + dummy_weapon_info.weapon_func = w_null; + dummy_weapon_info.wpmodel = ""; + dummy_weapon_info.mdl = ""; + dummy_weapon_info.model = ""; + dummy_weapon_info.spawnflags = 0; + dummy_weapon_info.impulse = -1; + dummy_weapon_info.bot_pickupbasevalue = 0; + dummy_weapon_info.ammo_field = ammo_none; + + dummy_weapon_info.w_crosshair = "gfx/crosshair1"; + dummy_weapon_info.w_crosshair_size = 1; + dummy_weapon_info.model2 = ""; + + int i; + weaponorder_byid = ""; + for(i = WEP_MAXCOUNT; i >= 1; --i) + if(weapon_info[i-1]) + weaponorder_byid = strcat(weaponorder_byid, " ", ftos(i)); + weaponorder_byid = strzone(substring(weaponorder_byid, 1, strlen(weaponorder_byid) - 1)); +} +entity get_weaponinfo(int id) +{ + entity w; + if(id < WEP_FIRST || id > WEP_LAST) + return dummy_weapon_info; + w = weapon_info[id - 1]; + if(w) + return w; + return dummy_weapon_info; +} +string W_FixWeaponOrder(string order, float complete) +{ + return fixPriorityList(order, WEP_FIRST, WEP_LAST, 230 - WEP_FIRST, complete); +} +string W_NameWeaponOrder_MapFunc(string s) +{ + entity wi; + if(s == "0" || stof(s)) + { + wi = get_weaponinfo(stof(s)); + if(wi != dummy_weapon_info) + return wi.netname; + } + return s; +} + +string W_UndeprecateName(string s) +{ + switch ( s ) + { + case "nex" : return "vortex"; + case "rocketlauncher" : return "devastator"; + case "laser" : return "blaster"; + case "minstanex" : return "vaporizer"; + case "grenadelauncher": return "mortar"; + case "uzi" : return "machinegun"; + default : return s; + } +} +string W_NameWeaponOrder(string order) +{ + return mapPriorityList(order, W_NameWeaponOrder_MapFunc); +} +string W_NumberWeaponOrder_MapFunc(string s) +{ + int i; + if(s == "0" || stof(s)) + return s; + s = W_UndeprecateName(s); + for(i = WEP_FIRST; i <= WEP_LAST; ++i) + if(s == get_weaponinfo(i).netname) + return ftos(i); + return s; +} +string W_NumberWeaponOrder(string order) +{ + return mapPriorityList(order, W_NumberWeaponOrder_MapFunc); +} + +float W_FixWeaponOrder_BuildImpulseList_buf[WEP_MAXCOUNT]; +string W_FixWeaponOrder_BuildImpulseList_order; +void W_FixWeaponOrder_BuildImpulseList_swap(int i, int j, entity pass) +{ + float h; + h = W_FixWeaponOrder_BuildImpulseList_buf[i]; + W_FixWeaponOrder_BuildImpulseList_buf[i] = W_FixWeaponOrder_BuildImpulseList_buf[j]; + W_FixWeaponOrder_BuildImpulseList_buf[j] = h; +} +float W_FixWeaponOrder_BuildImpulseList_cmp(int i, int j, entity pass) +{ + entity e1, e2; + float d; + e1 = get_weaponinfo(W_FixWeaponOrder_BuildImpulseList_buf[i]); + e2 = get_weaponinfo(W_FixWeaponOrder_BuildImpulseList_buf[j]); + d = (e1.impulse + 9) % 10 - (e2.impulse + 9) % 10; + if(d != 0) + return -d; // high impulse first! + return + strstrofs(strcat(" ", W_FixWeaponOrder_BuildImpulseList_order, " "), sprintf(" %d ", W_FixWeaponOrder_BuildImpulseList_buf[i]), 0) + - + strstrofs(strcat(" ", W_FixWeaponOrder_BuildImpulseList_order, " "), sprintf(" %d ", W_FixWeaponOrder_BuildImpulseList_buf[j]), 0) + ; // low char index first! +} +string W_FixWeaponOrder_BuildImpulseList(string o) +{ + int i; + W_FixWeaponOrder_BuildImpulseList_order = o; + for(i = WEP_FIRST; i <= WEP_LAST; ++i) + W_FixWeaponOrder_BuildImpulseList_buf[i - WEP_FIRST] = i; + heapsort(WEP_LAST - WEP_FIRST + 1, W_FixWeaponOrder_BuildImpulseList_swap, W_FixWeaponOrder_BuildImpulseList_cmp, world); + o = ""; + for(i = WEP_FIRST; i <= WEP_LAST; ++i) + o = strcat(o, " ", ftos(W_FixWeaponOrder_BuildImpulseList_buf[i - WEP_FIRST])); + W_FixWeaponOrder_BuildImpulseList_order = string_null; + return substring(o, 1, -1); +} + +string W_FixWeaponOrder_AllowIncomplete(string order) +{ + return W_FixWeaponOrder(order, 0); +} + +string W_FixWeaponOrder_ForceComplete(string order) +{ + if(order == "") + order = W_NumberWeaponOrder(cvar_defstring("cl_weaponpriority")); + return W_FixWeaponOrder(order, 1); +} + +void W_RandomWeapons(entity e, float n) +{ + int i, j; + WepSet remaining; + WepSet result; + remaining = e.weapons; + result = '0 0 0'; + for(i = 0; i < n; ++i) + { + RandomSelection_Init(); + for(j = WEP_FIRST; j <= WEP_LAST; ++j) + if(remaining & WepSet_FromWeapon(j)) + RandomSelection_Add(world, j, string_null, 1, 1); + result |= WepSet_FromWeapon(RandomSelection_chosen_float); + remaining &= ~WepSet_FromWeapon(RandomSelection_chosen_float); + } + e.weapons = result; +} + +string GetAmmoPicture(.int ammotype) +{ + switch(ammotype) + { + case ammo_shells: return "ammo_shells"; + case ammo_nails: return "ammo_bullets"; + case ammo_rockets: return "ammo_rockets"; + case ammo_cells: return "ammo_cells"; + case ammo_plasma: return "ammo_cells"; + case ammo_fuel: return "ammo_fuel"; + default: return ""; // wtf, no ammo type? + } +} + +#ifdef CSQC +.int GetAmmoFieldFromNum(int i) +{ + switch(i) + { + case 0: return ammo_shells; + case 1: return ammo_nails; + case 2: return ammo_rockets; + case 3: return ammo_cells; + case 4: return ammo_plasma; + case 5: return ammo_fuel; + default: return ammo_none; + } +} + +int GetAmmoStat(.int ammotype) +{ + switch(ammotype) + { + case ammo_shells: return STAT_SHELLS; + case ammo_nails: return STAT_NAILS; + case ammo_rockets: return STAT_ROCKETS; + case ammo_cells: return STAT_CELLS; + case ammo_plasma: return STAT_PLASMA; + case ammo_fuel: return STAT_FUEL; + default: return -1; + } +} +#endif +#endif diff --git a/qcsrc/common/weapons/all.qh b/qcsrc/common/weapons/all.qh new file mode 100644 index 0000000000..154f8167e9 --- /dev/null +++ b/qcsrc/common/weapons/all.qh @@ -0,0 +1,217 @@ +#ifndef WEAPONS_ALL_H +#define WEAPONS_ALL_H + +#ifndef MENUQC +#include "calculations.qh" +#endif + +#include "../util.qh" +#ifdef SVQC +#include "../../server/bot/aim.qh" +#endif +const int MAX_SHOT_DISTANCE = 32768; + +// weapon pickup ratings for bot logic +const int BOT_PICKUP_RATING_LOW = 2500; +const int BOT_PICKUP_RATING_MID = 5000; +const int BOT_PICKUP_RATING_HIGH = 10000; + +// weapon flags +const int WEP_TYPE_OTHER = 0x00; // not for damaging people +const int WEP_TYPE_SPLASH = 0x01; // splash damage +const int WEP_TYPE_HITSCAN = 0x02; // hitscan +const int WEP_TYPEMASK = 0x0F; +const int WEP_FLAG_CANCLIMB = 0x10; // can be used for movement +const int WEP_FLAG_NORMAL = 0x20; // in "most weapons" set +const int WEP_FLAG_HIDDEN = 0x40; // hides from menu +const int WEP_FLAG_RELOADABLE = 0x80; // can has reload +const int WEP_FLAG_SUPERWEAPON = 0x100; // powerup timer +const int WEP_FLAG_MUTATORBLOCKED = 0x200; // hides from impulse 99 etc. (mutators are allowed to clear this flag) + +// weapon requests +const int WR_SETUP = 1; // (SERVER) setup weapon data +const int WR_THINK = 2; // (SERVER) logic to run every frame +const int WR_CHECKAMMO1 = 3; // (SERVER) checks ammo for weapon primary +const int WR_CHECKAMMO2 = 4; // (SERVER) checks ammo for weapon second +const int WR_AIM = 5; // (SERVER) runs bot aiming code for this weapon +const int WR_INIT = 6; // (BOTH) precaches models/sounds used by this weapon, also sets up weapon properties +const int WR_SUICIDEMESSAGE = 7; // (SERVER) notification number for suicide message (may inspect w_deathtype for details) +const int WR_KILLMESSAGE = 8; // (SERVER) notification number for kill message (may inspect w_deathtype for details) +const int WR_RELOAD = 9; // (SERVER) handles reloading for weapon +const int WR_RESETPLAYER = 10; // (SERVER) clears fields that the weapon may use +const int WR_IMPACTEFFECT = 11; // (CLIENT) impact effect for weapon explosion +const int WR_PLAYERDEATH = 12; // (SERVER) called whenever a player dies +const int WR_GONETHINK = 13; // (SERVER) logic to run when weapon is lost +const int WR_CONFIG = 14; // (ALL) dump weapon cvars to config in data directory (see: sv_cmd dumpweapons) +const int WR_ZOOMRETICLE = 15; // (CLIENT) weapon specific zoom reticle +const int WR_DROP = 16; // (SERVER) the weapon is dropped +const int WR_PICKUP = 17; // (SERVER) a weapon is picked up + +// variables: +string weaponorder_byid; + +// weapon sets +typedef vector WepSet; +WepSet WepSet_FromWeapon(int a); +#ifdef SVQC +void WepSet_AddStat(); +void WriteWepSet(float dest, WepSet w); +#endif +#ifdef CSQC +WepSet WepSet_GetFromStat(); +WepSet ReadWepSet(); +#endif + +// weapon name macros +#define WEP_FIRST 1 +#define WEP_MAXCOUNT 24 // Increase as needed. Can be up to three times as much. +int WEP_COUNT; +int WEP_LAST; +WepSet WEPSET_ALL; +WepSet WEPSET_SUPERWEAPONS; + +// functions: +entity get_weaponinfo(int id); +string W_FixWeaponOrder(string order, float complete); +string W_UndeprecateName(string s); +string W_NameWeaponOrder(string order); +string W_NumberWeaponOrder(string order); +string W_FixWeaponOrder_BuildImpulseList(string o); +string W_FixWeaponOrder_AllowIncomplete(string order); +string W_FixWeaponOrder_ForceComplete(string order); +void W_RandomWeapons(entity e, float n); + +string GetAmmoPicture(.int ammotype); + +#ifdef CSQC +.int GetAmmoFieldFromNum(int i); +int GetAmmoStat(.int ammotype); +#endif + +// ammo types +.int ammo_shells; +.int ammo_nails; +.int ammo_rockets; +.int ammo_cells; +.int ammo_plasma; +.int ammo_fuel; +.int ammo_none; + +// other useful macros +#define WEP_ACTION(wpn,wrequest) (get_weaponinfo(wpn)).weapon_func(wrequest) +#define WEP_AMMO(wpn) ((get_weaponinfo(WEP_##wpn)).ammo_field) // only used inside weapon files/with direct name, don't duplicate prefix +#define WEP_NAME(wpn) ((get_weaponinfo(wpn)).message) + + +// ====================== +// Configuration Macros +// ====================== + +// create cvars for weapon settings +#define WEP_ADD_CVAR_NONE(wepname,name) [[last]] float autocvar_g_balance_##wepname##_##name; + +#define WEP_ADD_CVAR_PRI(wepname,name) WEP_ADD_CVAR_NONE(wepname, primary_##name) +#define WEP_ADD_CVAR_SEC(wepname,name) WEP_ADD_CVAR_NONE(wepname, secondary_##name) +#define WEP_ADD_CVAR_BOTH(wepname,name) \ + WEP_ADD_CVAR_PRI(wepname, name) \ + WEP_ADD_CVAR_SEC(wepname, name) + +#define WEP_ADD_CVAR(wepid,wepname,mode,name) WEP_ADD_CVAR_##mode(wepname, name) + +// create properties for weapon settings +#define WEP_ADD_PROP(wepid,wepname,type,prop,name) \ + .type prop; \ + [[last]] type autocvar_g_balance_##wepname##_##name; + +// read cvars from weapon settings +#define WEP_CVAR(wepname,name) autocvar_g_balance_##wepname##_##name +#define WEP_CVAR_PRI(wepname,name) WEP_CVAR(wepname, primary_##name) +#define WEP_CVAR_SEC(wepname,name) WEP_CVAR(wepname, secondary_##name) +#define WEP_CVAR_BOTH(wepname,isprimary,name) ((isprimary) ? WEP_CVAR_PRI(wepname, name) : WEP_CVAR_SEC(wepname, name)) + +// set initialization values for weapon settings +#define WEP_SKIP_CVAR(unuseda,unusedb,unusedc,unusedd) /* skip cvars */ +#define WEP_SET_PROP(wepid,wepname,type,prop,name) get_weaponinfo(WEP_##wepid).##prop = autocvar_g_balance_##wepname##_##name; + + +// ===================== +// Weapon Registration +// ===================== + +bool w_null(int dummy); + +void register_weapon( + int id, + WepSet bit, + bool(int) func, + .int ammotype, + int i, + int weapontype, + float pickupbasevalue, + vector clr, + string modelname, + string simplemdl, + string crosshair, + string wepimg, + string refname, + string wepname); + +void register_weapons_done(); + +// entity properties of weaponinfo: +// fields which are explicitly/manually set are marked with "M", fields set automatically are marked with "A" +.int weapon; // M: WEP_id // WEP_... +.WepSet weapons; // A: WEPSET_id // WEPSET_... +.float(float) weapon_func; // M: function // w_... +..int ammo_field; // M: ammotype // main ammo field +.int impulse; // M: impulse // weapon impulse +.int spawnflags; // M: flags // WEPSPAWNFLAG_... combined +.float bot_pickupbasevalue; // M: rating // bot weapon priority +.vector wpcolor; // M: color // waypointsprite color +.string wpmodel; // A: wpn-id // wpn- sprite name +.string mdl; // M: modelname // name of model (without g_ v_ or h_ prefixes) +.string model; // A: modelname // full path to g_ model +.string w_simplemdl; // M: simplemdl // simpleitems weapon model/image +.string w_crosshair; // M: crosshair // per-weapon crosshair: "CrosshairImage Size" +.float w_crosshair_size; // A: crosshair // per-weapon crosshair size (argument two of "crosshair" field) +.string model2; // M: wepimg // "weaponfoobar" side view image file of weapon // WEAPONTODO: Move out of skin files, move to common files +.string netname; // M: refname // reference name name +.string message; // M: wepname // human readable name + + +// note: the fabs call is just there to hide "if result is constant" warning +#define REGISTER_WEAPON_2(id,bit,function,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname) \ + int id; \ + WepSet bit; \ + bool function(int); \ + void RegisterWeapons_##id() \ + { \ + WEP_LAST = (id = WEP_FIRST + WEP_COUNT); \ + bit = WepSet_FromWeapon(id); \ + WEPSET_ALL |= bit; \ + if((flags) & WEP_FLAG_SUPERWEAPON) \ + WEPSET_SUPERWEAPONS |= bit; \ + ++WEP_COUNT; \ + register_weapon(id,bit,function,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname); \ + } \ + ACCUMULATE_FUNCTION(RegisterWeapons, RegisterWeapons_##id) +#ifdef MENUQC +#define REGISTER_WEAPON(id,function,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname) \ + REGISTER_WEAPON_2(WEP_##id,WEPSET_##id,w_null,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname) +#else +#define REGISTER_WEAPON(id,function,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname) \ + REGISTER_WEAPON_2(WEP_##id,WEPSET_##id,function,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname) +#endif + +#include "all.inc" + +#undef WEP_ADD_CVAR_MO_PRI +#undef WEP_ADD_CVAR_MO_SEC +#undef WEP_ADD_CVAR_MO_BOTH +#undef WEP_ADD_CVAR_MO_NONE +#undef WEP_ADD_CVAR +#undef WEP_ADD_PROP +#undef REGISTER_WEAPON + +ACCUMULATE_FUNCTION(RegisterWeapons, register_weapons_done); +#endif diff --git a/qcsrc/common/weapons/config.qc b/qcsrc/common/weapons/config.qc index a314f036b3..0448f4874a 100644 --- a/qcsrc/common/weapons/config.qc +++ b/qcsrc/common/weapons/config.qc @@ -5,7 +5,7 @@ #include "../../dpdefs/dpextensions.qh" #include "../util.qh" #include "config.qh" - #include "weapons.qh" + #include "all.qh" #endif // ========================== diff --git a/qcsrc/common/weapons/weapons.qc b/qcsrc/common/weapons/weapons.qc deleted file mode 100644 index 58fdbaed44..0000000000 --- a/qcsrc/common/weapons/weapons.qc +++ /dev/null @@ -1,375 +0,0 @@ -#ifndef WEAPONS_C -#define WEAPONS_C - -#include "weapons.qh" - -#if defined(CSQC) - #include "../../dpdefs/csprogsdefs.qh" - #include "../../client/defs.qh" - #include "../constants.qh" - #include "../stats.qh" - #include "../../warpzonelib/anglestransform.qh" - #include "../../warpzonelib/mathlib.qh" - #include "../../warpzonelib/common.qh" - #include "../../warpzonelib/client.qh" - #include "../util.qh" - #include "../buffs.qh" - #include "../../client/autocvars.qh" - #include "../deathtypes.qh" - #include "../../csqcmodellib/interpolate.qh" - #include "../../client/movetypes.qh" - #include "../../client/main.qh" - #include "../../csqcmodellib/cl_model.qh" -#elif defined(MENUQC) -#elif defined(SVQC) - #include "../../dpdefs/progsdefs.qh" - #include "../../dpdefs/dpextensions.qh" - #include "../../warpzonelib/anglestransform.qh" - #include "../../warpzonelib/mathlib.qh" - #include "../../warpzonelib/common.qh" - #include "../../warpzonelib/util_server.qh" - #include "../../warpzonelib/server.qh" - #include "../constants.qh" - #include "../stats.qh" - #include "../teams.qh" - #include "../util.qh" - #include "../buffs.qh" - #include "../monsters/monsters.qh" - #include "config.qh" - #include "../../server/weapons/csqcprojectile.qh" - #include "../../server/weapons/tracing.qh" - #include "../../server/t_items.qh" - #include "../../server/autocvars.qh" - #include "../../server/constants.qh" - #include "../../server/defs.qh" - #include "../notifications.qh" - #include "../deathtypes.qh" - #include "../../server/mutators/mutators_include.qh" - #include "../mapinfo.qh" - #include "../../server/command/common.qh" - #include "../../csqcmodellib/sv_model.qh" - #include "../../server/portals.qh" - #include "../../server/g_hook.qh" -#endif -#ifndef MENUQC -#include "calculations.qc" -#endif -#include "all.inc" - -// WEAPON PLUGIN SYSTEM -entity weapon_info[WEP_MAXCOUNT]; -entity dummy_weapon_info; - -#if WEP_MAXCOUNT > 72 -# error Kein Weltraum links auf dem Gerät -#endif - -WepSet WepSet_FromWeapon(int a) { - a -= WEP_FIRST; -#if WEP_MAXCOUNT > 24 - if(a >= 24) { - a -= 24; -#if WEP_MAXCOUNT > 48 - if(a >= 24) { - a -= 24; - return '0 0 1' * power2of(a); - } -#endif - return '0 1 0' * power2of(a); - } -#endif - return '1 0 0' * power2of(a); -} -#ifdef SVQC -void WepSet_AddStat() -{ - addstat(STAT_WEAPONS, AS_INT, weapons_x); -#if WEP_MAXCOUNT > 24 - addstat(STAT_WEAPONS2, AS_INT, weapons_y); -#if WEP_MAXCOUNT > 48 - addstat(STAT_WEAPONS3, AS_INT, weapons_z); -#endif -#endif -} -void WriteWepSet(float dst, WepSet w) -{ -#if WEP_MAXCOUNT > 48 - WriteInt72_t(dst, w); -#elif WEP_MAXCOUNT > 24 - WriteInt48_t(dst, w); -#else - WriteInt24_t(dst, w.x); -#endif -} -#endif -#ifdef CSQC -WepSet WepSet_GetFromStat() -{ - WepSet w = '0 0 0'; - w.x = getstati(STAT_WEAPONS); -#if WEP_MAXCOUNT > 24 - w.y = getstati(STAT_WEAPONS2); -#if WEP_MAXCOUNT > 48 - w.z = getstati(STAT_WEAPONS3); -#endif -#endif - return w; -} -WepSet ReadWepSet() -{ -#if WEP_MAXCOUNT > 48 - return ReadInt72_t(); -#elif WEP_MAXCOUNT > 24 - return ReadInt48_t(); -#else - return ReadInt24_t() * '1 0 0'; -#endif -} -#endif - -void register_weapon( - int id, - WepSet bit, - bool(int) func, - .int ammotype, - int i, - int weapontype, - float pickupbasevalue, - vector clr, - string modelname, - string simplemdl, - string crosshair, - string wepimg, - string refname, - string wepname) -{ - entity e; - weapon_info[id - 1] = e = spawn(); - e.classname = "weapon_info"; - e.weapon = id; - e.weapons = bit; - e.weapon_func = func; - e.ammo_field = ammotype; - e.impulse = i; - e.spawnflags = weapontype; - e.bot_pickupbasevalue = pickupbasevalue; - e.wpcolor = clr; - e.wpmodel = strzone(strcat("wpn-", ftos(id))); - e.mdl = modelname; - e.model = strzone(strcat("models/weapons/g_", modelname, ".md3")); - e.w_simplemdl = strzone(simplemdl); // simpleitems weapon model/image - e.w_crosshair = strzone(car(crosshair)); - string s = cdr(crosshair); - e.w_crosshair_size = ((s != "") ? stof(s) : 1); // so that we can scale the crosshair from code (for compat) - e.model2 = strzone(wepimg); - e.netname = refname; - e.message = wepname; - - #ifdef CSQC - func(WR_INIT); - #endif -} -bool w_null(int dummy) -{ - return 0; -} -void register_weapons_done() -{ - dummy_weapon_info = spawn(); - dummy_weapon_info.classname = "weapon_info"; - dummy_weapon_info.weapon = 0; // you can recognize dummies by this - dummy_weapon_info.weapons = '0 0 0'; - dummy_weapon_info.netname = ""; - dummy_weapon_info.message = "AOL CD Thrower"; - dummy_weapon_info.weapon_func = w_null; - dummy_weapon_info.wpmodel = ""; - dummy_weapon_info.mdl = ""; - dummy_weapon_info.model = ""; - dummy_weapon_info.spawnflags = 0; - dummy_weapon_info.impulse = -1; - dummy_weapon_info.bot_pickupbasevalue = 0; - dummy_weapon_info.ammo_field = ammo_none; - - dummy_weapon_info.w_crosshair = "gfx/crosshair1"; - dummy_weapon_info.w_crosshair_size = 1; - dummy_weapon_info.model2 = ""; - - int i; - weaponorder_byid = ""; - for(i = WEP_MAXCOUNT; i >= 1; --i) - if(weapon_info[i-1]) - weaponorder_byid = strcat(weaponorder_byid, " ", ftos(i)); - weaponorder_byid = strzone(substring(weaponorder_byid, 1, strlen(weaponorder_byid) - 1)); -} -entity get_weaponinfo(int id) -{ - entity w; - if(id < WEP_FIRST || id > WEP_LAST) - return dummy_weapon_info; - w = weapon_info[id - 1]; - if(w) - return w; - return dummy_weapon_info; -} -string W_FixWeaponOrder(string order, float complete) -{ - return fixPriorityList(order, WEP_FIRST, WEP_LAST, 230 - WEP_FIRST, complete); -} -string W_NameWeaponOrder_MapFunc(string s) -{ - entity wi; - if(s == "0" || stof(s)) - { - wi = get_weaponinfo(stof(s)); - if(wi != dummy_weapon_info) - return wi.netname; - } - return s; -} - -string W_UndeprecateName(string s) -{ - switch ( s ) - { - case "nex" : return "vortex"; - case "rocketlauncher" : return "devastator"; - case "laser" : return "blaster"; - case "minstanex" : return "vaporizer"; - case "grenadelauncher": return "mortar"; - case "uzi" : return "machinegun"; - default : return s; - } -} -string W_NameWeaponOrder(string order) -{ - return mapPriorityList(order, W_NameWeaponOrder_MapFunc); -} -string W_NumberWeaponOrder_MapFunc(string s) -{ - int i; - if(s == "0" || stof(s)) - return s; - s = W_UndeprecateName(s); - for(i = WEP_FIRST; i <= WEP_LAST; ++i) - if(s == get_weaponinfo(i).netname) - return ftos(i); - return s; -} -string W_NumberWeaponOrder(string order) -{ - return mapPriorityList(order, W_NumberWeaponOrder_MapFunc); -} - -float W_FixWeaponOrder_BuildImpulseList_buf[WEP_MAXCOUNT]; -string W_FixWeaponOrder_BuildImpulseList_order; -void W_FixWeaponOrder_BuildImpulseList_swap(int i, int j, entity pass) -{ - float h; - h = W_FixWeaponOrder_BuildImpulseList_buf[i]; - W_FixWeaponOrder_BuildImpulseList_buf[i] = W_FixWeaponOrder_BuildImpulseList_buf[j]; - W_FixWeaponOrder_BuildImpulseList_buf[j] = h; -} -float W_FixWeaponOrder_BuildImpulseList_cmp(int i, int j, entity pass) -{ - entity e1, e2; - float d; - e1 = get_weaponinfo(W_FixWeaponOrder_BuildImpulseList_buf[i]); - e2 = get_weaponinfo(W_FixWeaponOrder_BuildImpulseList_buf[j]); - d = (e1.impulse + 9) % 10 - (e2.impulse + 9) % 10; - if(d != 0) - return -d; // high impulse first! - return - strstrofs(strcat(" ", W_FixWeaponOrder_BuildImpulseList_order, " "), sprintf(" %d ", W_FixWeaponOrder_BuildImpulseList_buf[i]), 0) - - - strstrofs(strcat(" ", W_FixWeaponOrder_BuildImpulseList_order, " "), sprintf(" %d ", W_FixWeaponOrder_BuildImpulseList_buf[j]), 0) - ; // low char index first! -} -string W_FixWeaponOrder_BuildImpulseList(string o) -{ - int i; - W_FixWeaponOrder_BuildImpulseList_order = o; - for(i = WEP_FIRST; i <= WEP_LAST; ++i) - W_FixWeaponOrder_BuildImpulseList_buf[i - WEP_FIRST] = i; - heapsort(WEP_LAST - WEP_FIRST + 1, W_FixWeaponOrder_BuildImpulseList_swap, W_FixWeaponOrder_BuildImpulseList_cmp, world); - o = ""; - for(i = WEP_FIRST; i <= WEP_LAST; ++i) - o = strcat(o, " ", ftos(W_FixWeaponOrder_BuildImpulseList_buf[i - WEP_FIRST])); - W_FixWeaponOrder_BuildImpulseList_order = string_null; - return substring(o, 1, -1); -} - -string W_FixWeaponOrder_AllowIncomplete(string order) -{ - return W_FixWeaponOrder(order, 0); -} - -string W_FixWeaponOrder_ForceComplete(string order) -{ - if(order == "") - order = W_NumberWeaponOrder(cvar_defstring("cl_weaponpriority")); - return W_FixWeaponOrder(order, 1); -} - -void W_RandomWeapons(entity e, float n) -{ - int i, j; - WepSet remaining; - WepSet result; - remaining = e.weapons; - result = '0 0 0'; - for(i = 0; i < n; ++i) - { - RandomSelection_Init(); - for(j = WEP_FIRST; j <= WEP_LAST; ++j) - if(remaining & WepSet_FromWeapon(j)) - RandomSelection_Add(world, j, string_null, 1, 1); - result |= WepSet_FromWeapon(RandomSelection_chosen_float); - remaining &= ~WepSet_FromWeapon(RandomSelection_chosen_float); - } - e.weapons = result; -} - -string GetAmmoPicture(.int ammotype) -{ - switch(ammotype) - { - case ammo_shells: return "ammo_shells"; - case ammo_nails: return "ammo_bullets"; - case ammo_rockets: return "ammo_rockets"; - case ammo_cells: return "ammo_cells"; - case ammo_plasma: return "ammo_cells"; - case ammo_fuel: return "ammo_fuel"; - default: return ""; // wtf, no ammo type? - } -} - -#ifdef CSQC -.int GetAmmoFieldFromNum(int i) -{ - switch(i) - { - case 0: return ammo_shells; - case 1: return ammo_nails; - case 2: return ammo_rockets; - case 3: return ammo_cells; - case 4: return ammo_plasma; - case 5: return ammo_fuel; - default: return ammo_none; - } -} - -int GetAmmoStat(.int ammotype) -{ - switch(ammotype) - { - case ammo_shells: return STAT_SHELLS; - case ammo_nails: return STAT_NAILS; - case ammo_rockets: return STAT_ROCKETS; - case ammo_cells: return STAT_CELLS; - case ammo_plasma: return STAT_PLASMA; - case ammo_fuel: return STAT_FUEL; - default: return -1; - } -} -#endif -#endif diff --git a/qcsrc/common/weapons/weapons.qh b/qcsrc/common/weapons/weapons.qh deleted file mode 100644 index 5f17ccb8f1..0000000000 --- a/qcsrc/common/weapons/weapons.qh +++ /dev/null @@ -1,217 +0,0 @@ -#ifndef WEAPONS_H -#define WEAPONS_H - -#ifndef MENUQC -#include "calculations.qh" -#endif - -#include "../util.qh" -#ifdef SVQC -#include "../../server/bot/aim.qh" -#endif -const int MAX_SHOT_DISTANCE = 32768; - -// weapon pickup ratings for bot logic -const int BOT_PICKUP_RATING_LOW = 2500; -const int BOT_PICKUP_RATING_MID = 5000; -const int BOT_PICKUP_RATING_HIGH = 10000; - -// weapon flags -const int WEP_TYPE_OTHER = 0x00; // not for damaging people -const int WEP_TYPE_SPLASH = 0x01; // splash damage -const int WEP_TYPE_HITSCAN = 0x02; // hitscan -const int WEP_TYPEMASK = 0x0F; -const int WEP_FLAG_CANCLIMB = 0x10; // can be used for movement -const int WEP_FLAG_NORMAL = 0x20; // in "most weapons" set -const int WEP_FLAG_HIDDEN = 0x40; // hides from menu -const int WEP_FLAG_RELOADABLE = 0x80; // can has reload -const int WEP_FLAG_SUPERWEAPON = 0x100; // powerup timer -const int WEP_FLAG_MUTATORBLOCKED = 0x200; // hides from impulse 99 etc. (mutators are allowed to clear this flag) - -// weapon requests -const int WR_SETUP = 1; // (SERVER) setup weapon data -const int WR_THINK = 2; // (SERVER) logic to run every frame -const int WR_CHECKAMMO1 = 3; // (SERVER) checks ammo for weapon primary -const int WR_CHECKAMMO2 = 4; // (SERVER) checks ammo for weapon second -const int WR_AIM = 5; // (SERVER) runs bot aiming code for this weapon -const int WR_INIT = 6; // (BOTH) precaches models/sounds used by this weapon, also sets up weapon properties -const int WR_SUICIDEMESSAGE = 7; // (SERVER) notification number for suicide message (may inspect w_deathtype for details) -const int WR_KILLMESSAGE = 8; // (SERVER) notification number for kill message (may inspect w_deathtype for details) -const int WR_RELOAD = 9; // (SERVER) handles reloading for weapon -const int WR_RESETPLAYER = 10; // (SERVER) clears fields that the weapon may use -const int WR_IMPACTEFFECT = 11; // (CLIENT) impact effect for weapon explosion -const int WR_PLAYERDEATH = 12; // (SERVER) called whenever a player dies -const int WR_GONETHINK = 13; // (SERVER) logic to run when weapon is lost -const int WR_CONFIG = 14; // (ALL) dump weapon cvars to config in data directory (see: sv_cmd dumpweapons) -const int WR_ZOOMRETICLE = 15; // (CLIENT) weapon specific zoom reticle -const int WR_DROP = 16; // (SERVER) the weapon is dropped -const int WR_PICKUP = 17; // (SERVER) a weapon is picked up - -// variables: -string weaponorder_byid; - -// weapon sets -typedef vector WepSet; -WepSet WepSet_FromWeapon(int a); -#ifdef SVQC -void WepSet_AddStat(); -void WriteWepSet(float dest, WepSet w); -#endif -#ifdef CSQC -WepSet WepSet_GetFromStat(); -WepSet ReadWepSet(); -#endif - -// weapon name macros -#define WEP_FIRST 1 -#define WEP_MAXCOUNT 24 // Increase as needed. Can be up to three times as much. -int WEP_COUNT; -int WEP_LAST; -WepSet WEPSET_ALL; -WepSet WEPSET_SUPERWEAPONS; - -// functions: -entity get_weaponinfo(int id); -string W_FixWeaponOrder(string order, float complete); -string W_UndeprecateName(string s); -string W_NameWeaponOrder(string order); -string W_NumberWeaponOrder(string order); -string W_FixWeaponOrder_BuildImpulseList(string o); -string W_FixWeaponOrder_AllowIncomplete(string order); -string W_FixWeaponOrder_ForceComplete(string order); -void W_RandomWeapons(entity e, float n); - -string GetAmmoPicture(.int ammotype); - -#ifdef CSQC -.int GetAmmoFieldFromNum(int i); -int GetAmmoStat(.int ammotype); -#endif - -// ammo types -.int ammo_shells; -.int ammo_nails; -.int ammo_rockets; -.int ammo_cells; -.int ammo_plasma; -.int ammo_fuel; -.int ammo_none; - -// other useful macros -#define WEP_ACTION(wpn,wrequest) (get_weaponinfo(wpn)).weapon_func(wrequest) -#define WEP_AMMO(wpn) ((get_weaponinfo(WEP_##wpn)).ammo_field) // only used inside weapon files/with direct name, don't duplicate prefix -#define WEP_NAME(wpn) ((get_weaponinfo(wpn)).message) - - -// ====================== -// Configuration Macros -// ====================== - -// create cvars for weapon settings -#define WEP_ADD_CVAR_NONE(wepname,name) [[last]] float autocvar_g_balance_##wepname##_##name; - -#define WEP_ADD_CVAR_PRI(wepname,name) WEP_ADD_CVAR_NONE(wepname, primary_##name) -#define WEP_ADD_CVAR_SEC(wepname,name) WEP_ADD_CVAR_NONE(wepname, secondary_##name) -#define WEP_ADD_CVAR_BOTH(wepname,name) \ - WEP_ADD_CVAR_PRI(wepname, name) \ - WEP_ADD_CVAR_SEC(wepname, name) - -#define WEP_ADD_CVAR(wepid,wepname,mode,name) WEP_ADD_CVAR_##mode(wepname, name) - -// create properties for weapon settings -#define WEP_ADD_PROP(wepid,wepname,type,prop,name) \ - .type prop; \ - [[last]] type autocvar_g_balance_##wepname##_##name; - -// read cvars from weapon settings -#define WEP_CVAR(wepname,name) autocvar_g_balance_##wepname##_##name -#define WEP_CVAR_PRI(wepname,name) WEP_CVAR(wepname, primary_##name) -#define WEP_CVAR_SEC(wepname,name) WEP_CVAR(wepname, secondary_##name) -#define WEP_CVAR_BOTH(wepname,isprimary,name) ((isprimary) ? WEP_CVAR_PRI(wepname, name) : WEP_CVAR_SEC(wepname, name)) - -// set initialization values for weapon settings -#define WEP_SKIP_CVAR(unuseda,unusedb,unusedc,unusedd) /* skip cvars */ -#define WEP_SET_PROP(wepid,wepname,type,prop,name) get_weaponinfo(WEP_##wepid).##prop = autocvar_g_balance_##wepname##_##name; - - -// ===================== -// Weapon Registration -// ===================== - -bool w_null(int dummy); - -void register_weapon( - int id, - WepSet bit, - bool(int) func, - .int ammotype, - int i, - int weapontype, - float pickupbasevalue, - vector clr, - string modelname, - string simplemdl, - string crosshair, - string wepimg, - string refname, - string wepname); - -void register_weapons_done(); - -// entity properties of weaponinfo: -// fields which are explicitly/manually set are marked with "M", fields set automatically are marked with "A" -.int weapon; // M: WEP_id // WEP_... -.WepSet weapons; // A: WEPSET_id // WEPSET_... -.float(float) weapon_func; // M: function // w_... -..int ammo_field; // M: ammotype // main ammo field -.int impulse; // M: impulse // weapon impulse -.int spawnflags; // M: flags // WEPSPAWNFLAG_... combined -.float bot_pickupbasevalue; // M: rating // bot weapon priority -.vector wpcolor; // M: color // waypointsprite color -.string wpmodel; // A: wpn-id // wpn- sprite name -.string mdl; // M: modelname // name of model (without g_ v_ or h_ prefixes) -.string model; // A: modelname // full path to g_ model -.string w_simplemdl; // M: simplemdl // simpleitems weapon model/image -.string w_crosshair; // M: crosshair // per-weapon crosshair: "CrosshairImage Size" -.float w_crosshair_size; // A: crosshair // per-weapon crosshair size (argument two of "crosshair" field) -.string model2; // M: wepimg // "weaponfoobar" side view image file of weapon // WEAPONTODO: Move out of skin files, move to common files -.string netname; // M: refname // reference name name -.string message; // M: wepname // human readable name - - -// note: the fabs call is just there to hide "if result is constant" warning -#define REGISTER_WEAPON_2(id,bit,function,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname) \ - int id; \ - WepSet bit; \ - bool function(int); \ - void RegisterWeapons_##id() \ - { \ - WEP_LAST = (id = WEP_FIRST + WEP_COUNT); \ - bit = WepSet_FromWeapon(id); \ - WEPSET_ALL |= bit; \ - if((flags) & WEP_FLAG_SUPERWEAPON) \ - WEPSET_SUPERWEAPONS |= bit; \ - ++WEP_COUNT; \ - register_weapon(id,bit,function,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname); \ - } \ - ACCUMULATE_FUNCTION(RegisterWeapons, RegisterWeapons_##id) -#ifdef MENUQC -#define REGISTER_WEAPON(id,function,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname) \ - REGISTER_WEAPON_2(WEP_##id,WEPSET_##id,w_null,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname) -#else -#define REGISTER_WEAPON(id,function,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname) \ - REGISTER_WEAPON_2(WEP_##id,WEPSET_##id,function,ammotype,impulse,flags,rating,color,modelname,simplemdl,crosshair,wepimg,refname,wepname) -#endif - -#include "all.inc" - -#undef WEP_ADD_CVAR_MO_PRI -#undef WEP_ADD_CVAR_MO_SEC -#undef WEP_ADD_CVAR_MO_BOTH -#undef WEP_ADD_CVAR_MO_NONE -#undef WEP_ADD_CVAR -#undef WEP_ADD_PROP -#undef REGISTER_WEAPON - -ACCUMULATE_FUNCTION(RegisterWeapons, register_weapons_done); -#endif diff --git a/qcsrc/menu/_all.qh b/qcsrc/menu/_all.qh index cc07017e12..a6903ae3dc 100644 --- a/qcsrc/menu/_all.qh +++ b/qcsrc/menu/_all.qh @@ -1,5 +1,5 @@ -#ifndef CLIENT___H -#define CLIENT___H +#ifndef CLIENT_ALL_H +#define CLIENT_ALL_H #include "../dpdefs/menudefs.qh" #include "../dpdefs/keycodes.qh" diff --git a/qcsrc/menu/classes.inc b/qcsrc/menu/classes.inc index 68b90d5863..5b0e417f94 100644 --- a/qcsrc/menu/classes.inc +++ b/qcsrc/menu/classes.inc @@ -34,7 +34,8 @@ #include "xonotic/colorpicker_string.qc" #include "xonotic/commandbutton.qc" #include "xonotic/credits.qc" -#include "xonotic/crosshairbutton.qc" +#include "xonotic/crosshairpicker.qc" +#include "xonotic/crosshairpreview.qc" #include "xonotic/cvarlist.qc" #include "xonotic/demolist.qc" #include "xonotic/dialog.qc" @@ -107,6 +108,7 @@ #include "xonotic/mainwindow.qc" #include "xonotic/maplist.qc" #include "xonotic/nexposee.qc" +#include "xonotic/picker.qc" #include "xonotic/playerlist.qc" #include "xonotic/playermodel.qc" #include "xonotic/playlist.qc" diff --git a/qcsrc/menu/command/all.qc b/qcsrc/menu/command/all.qc new file mode 100644 index 0000000000..711a747ea9 --- /dev/null +++ b/qcsrc/menu/command/all.qc @@ -0,0 +1,5 @@ +#include "../menu.qh" + +#include "../../common/command/all.qc" + +#include "menu_cmd.qc" diff --git a/qcsrc/menu/command/all.qh b/qcsrc/menu/command/all.qh new file mode 100644 index 0000000000..7f116ae9f1 --- /dev/null +++ b/qcsrc/menu/command/all.qh @@ -0,0 +1,8 @@ +#ifndef MENU_COMMANDS_ALL_H +#define MENU_COMMANDS_ALL_H + +#include "../../common/command/commands.qh" + +#include "menu_cmd.qh" + +#endif diff --git a/qcsrc/menu/command/commands.qc b/qcsrc/menu/command/commands.qc deleted file mode 100644 index 5b5911fa90..0000000000 --- a/qcsrc/menu/command/commands.qc +++ /dev/null @@ -1,5 +0,0 @@ -#include "../menu.qh" - -#include "../../common/command/commands.qc" - -#include "menu_cmd.qc" diff --git a/qcsrc/menu/command/commands.qh b/qcsrc/menu/command/commands.qh deleted file mode 100644 index 5ea300616b..0000000000 --- a/qcsrc/menu/command/commands.qh +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef MENU_COMMANDS_H -#define MENU_COMMANDS_H - -#include "../../common/command/commands.qh" - -#include "menu_cmd.qh" - -#endif diff --git a/qcsrc/menu/item/container.qc b/qcsrc/menu/item/container.qc index 449bb0675f..ac0655cfa6 100644 --- a/qcsrc/menu/item/container.qc +++ b/qcsrc/menu/item/container.qc @@ -14,6 +14,7 @@ CLASS(Container, Item) METHOD(Container, resizeNotifyLie, void(entity, vector, vector, vector, vector, .vector, .vector, .vector)) METHOD(Container, addItem, void(entity, entity, vector, vector, float)) METHOD(Container, addItemCentered, void(entity, entity, vector, float)) + METHOD(Container, addItemRightCentered, void(entity, entity, vector, float)) METHOD(Container, moveItemAfter, void(entity, entity, entity)) METHOD(Container, removeItem, void(entity, entity)) METHOD(Container, setFocus, void(entity, entity)) @@ -282,6 +283,11 @@ void Container_addItemCentered(entity me, entity other, vector theSize, float th me.addItem(me, other, '0.5 0.5 0' - 0.5 * theSize, theSize, theAlpha); } +void Container_addItemRightCentered(entity me, entity other, vector theSize, float theAlpha) +{ + me.addItem(me, other, '1 0.5 0' - 0.5 * theSize, theSize, theAlpha); +} + void Container_addItem(entity me, entity other, vector theOrigin, vector theSize, float theAlpha) { if(other.parent) diff --git a/qcsrc/menu/item/dialog.qc b/qcsrc/menu/item/dialog.qc index b6048ac682..77037ace61 100644 --- a/qcsrc/menu/item/dialog.qc +++ b/qcsrc/menu/item/dialog.qc @@ -130,12 +130,15 @@ void Dialog_configureDialog(entity me) { float absWidth, absHeight; - me.frame = NEW(BorderImage); - me.frame.configureBorderImage(me.frame, me.title, me.titleFontSize, me.color, me.backgroundImage, me.borderLines * me.titleHeight); - me.frame.zoomedOutTitleBarPosition = me.zoomedOutTitleBarPosition; - me.frame.zoomedOutTitleBar = me.zoomedOutTitleBar; - me.frame.alpha = me.alpha; - me.addItem(me, me.frame, '0 0 0', '1 1 0', 1); + if(me.isTabRoot) + { + me.frame = NEW(BorderImage); + me.frame.configureBorderImage(me.frame, me.title, me.titleFontSize, me.color, me.backgroundImage, me.borderLines * me.titleHeight); + me.frame.zoomedOutTitleBarPosition = me.zoomedOutTitleBarPosition; + me.frame.zoomedOutTitleBar = me.zoomedOutTitleBar; + me.frame.alpha = me.alpha; + me.addItem(me, me.frame, '0 0 0', '1 1 0', 1); + } if (!me.titleFontSize) me.titleHeight = 0; // no title bar @@ -155,7 +158,7 @@ void Dialog_configureDialog(entity me) me.fill(me); - if(me.closable && me.borderLines > 0) + if(me.isTabRoot && me.closable && me.borderLines > 0) { entity closebutton; closebutton = me.closeButton = me.frame.closeButton = NEW(Button); diff --git a/qcsrc/menu/item/listbox.qc b/qcsrc/menu/item/listbox.qc index 044c9e34a0..f7c17fa6bd 100644 --- a/qcsrc/menu/item/listbox.qc +++ b/qcsrc/menu/item/listbox.qc @@ -6,11 +6,14 @@ CLASS(ListBox, Item) METHOD(ListBox, configureListBox, void(entity, float, float)) METHOD(ListBox, draw, void(entity)) METHOD(ListBox, keyDown, float(entity, float, float, float)) + METHOD(ListBox, mouseMove, float(entity, vector)) METHOD(ListBox, mousePress, float(entity, vector)) METHOD(ListBox, mouseDrag, float(entity, vector)) METHOD(ListBox, mouseRelease, float(entity, vector)) METHOD(ListBox, focusLeave, void(entity)) ATTRIB(ListBox, focusable, float, 1) + ATTRIB(ListBox, focusedItem, int, -1) + ATTRIB(ListBox, focusedItemAlpha, float, 0.3) ATTRIB(ListBox, allowFocusSound, float, 1) ATTRIB(ListBox, selectedItem, int, 0) ATTRIB(ListBox, size, vector, '0 0 0') @@ -42,7 +45,7 @@ CLASS(ListBox, Item) ATTRIB(ListBox, lastClickedItem, float, -1) ATTRIB(ListBox, lastClickedTime, float, 0) - METHOD(ListBox, drawListBoxItem, void(entity, float, vector, float)) // item number, width/height, selected + METHOD(ListBox, drawListBoxItem, void(entity, int, vector, bool, bool)) // item number, width/height, isSelected, isFocused METHOD(ListBox, clickListBoxItem, void(entity, float, vector)) // item number, relative clickpos METHOD(ListBox, doubleClickListBoxItem, void(entity, float, vector)) // item number, relative clickpos METHOD(ListBox, setSelected, void(entity, float)) @@ -178,6 +181,22 @@ float ListBox_keyDown(entity me, float key, float ascii, float shift) return 0; return 1; } +float ListBox_mouseMove(entity me, vector pos) +{ + if(pos_x < 0) return 0; + if(pos_y < 0) return 0; + if(pos_x >= 1) return 0; + if(pos_y >= 1) return 0; + if(pos_x < 1 - me.controlWidth) + { + float x; + x = me.focusedItem; + me.focusedItem = me.getItemAtPos(me, me.scrollPos + pos.y); + if(x != me.focusedItem) + me.focusedItemAlpha = SKINALPHA_LISTBOX_FOCUSED; + } + return 1; +} float ListBox_mouseDrag(entity me, vector pos) { float hit; @@ -288,6 +307,7 @@ void ListBox_focusLeave(entity me) // by a mouse click on an item of the list // for example showing a dialog on right click me.pressed = 0; + me.focusedItem = -1; } void ListBox_updateControlTopBottom(entity me) { @@ -369,6 +389,7 @@ void ListBox_draw(entity me) draw_SetClip(); oldshift = draw_shift; oldscale = draw_scale; + float y; i = me.getItemAtPos(me, me.scrollPos); y = me.getItemStart(me, i) - me.scrollPos; @@ -378,7 +399,7 @@ void ListBox_draw(entity me) vector relSize = eX * (1 - me.controlWidth) + eY * me.getItemHeight(me, i); absSize = boxToGlobalSize(relSize, me.size); draw_scale = boxToGlobalSize(relSize, oldscale); - me.drawListBoxItem(me, i, absSize, (me.selectedItem == i)); + me.drawListBoxItem(me, i, absSize, (me.selectedItem == i), (me.focusedItem == i)); y += relSize.y; } draw_ClearClip(); @@ -398,8 +419,8 @@ void ListBox_doubleClickListBoxItem(entity me, float i, vector where) // template method } -void ListBox_drawListBoxItem(entity me, float i, vector absSize, float selected) +void ListBox_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { - draw_Text('0 0 0', sprintf(_("Item %d"), i), eX * (8 / absSize.x) + eY * (8 / absSize.y), (selected ? '0 1 0' : '1 1 1'), 1, 0); + draw_Text('0 0 0', sprintf(_("Item %d"), i), eX * (8 / absSize.x) + eY * (8 / absSize.y), (isSelected ? '0 1 0' : '1 1 1'), 1, 0); } #endif diff --git a/qcsrc/menu/menu.qc b/qcsrc/menu/menu.qc index 669e08fe72..d8a3ede2e7 100644 --- a/qcsrc/menu/menu.qc +++ b/qcsrc/menu/menu.qc @@ -2,7 +2,8 @@ #include "oo/classes.qc" #include "xonotic/util.qh" -#include "../common/weapons/weapons.qh" +#include "../common/items/all.qh" +#include "../common/weapons/all.qh" #include "../common/mapinfo.qh" /////////////////////////////////////////////// @@ -80,6 +81,7 @@ void m_init() // needs to be done so early because of the constants they create CALL_ACCUMULATED_FUNCTION(RegisterWeapons); + CALL_ACCUMULATED_FUNCTION(RegisterItems); CALL_ACCUMULATED_FUNCTION(RegisterGametypes); RegisterSLCategories(); diff --git a/qcsrc/menu/oo/base.qh b/qcsrc/menu/oo/base.qh index 5c74f0d6df..28b87ab7fc 100644 --- a/qcsrc/menu/oo/base.qh +++ b/qcsrc/menu/oo/base.qh @@ -1,71 +1,11 @@ #ifndef BASE_H #define BASE_H +#include "../../common/oo.qh" + #include "../../common/util.qh" #include "../../dpdefs/keycodes.qh" -#define NULL (null_entity) #define world NULL -.string classname; -.string vtblname; -.entity vtblbase; -entity spawnVtbl(entity this, entity base) -{ - entity vtbl = spawn(); - copyentity(this, vtbl); - vtbl.vtblname = vtbl.classname; - vtbl.classname = "vtbl"; - vtbl.vtblbase = base ? base : vtbl; // Top level objects use vtbl as base - return vtbl; -} - -entity Object_vtbl; -entity spawnObject(entity this, entity) -{ - this = spawn(); - this.classname = "Object"; - if (!Object_vtbl) Object_vtbl = spawnVtbl(this, null_entity); - return this; -} - -// Classes have a `spawn##cname(entity, entity)` constructor -// The parameters are used as locals for [[accumulate]] - -// Macro to hide this implementation detail -#define NEW(cname) (spawn##cname(null_entity, null_entity)) - -#define CLASS(cname, base) \ -entity spawn##cname(entity this, entity basevtbl) { \ - this = NEW(base); basevtbl = base##_vtbl; \ -} - -#define METHOD(cname, name, prototype) \ -prototype cname##_##name; \ -.prototype name; \ -[[accumulate]] entity spawn##cname(entity this, entity basevtbl) { \ - this.name = cname##_##name; \ -} - -#define ATTRIB(cname, name, type, val) \ -.type name; \ -[[accumulate]] entity spawn##cname(entity this, entity basevtbl) { \ - this.name = val; \ -} - -#define ATTRIBARRAY(cname, name, type, cnt) \ -.type name[cnt]; - -#define ENDCLASS(cname) \ -.bool instanceOf##cname; \ -entity cname##_vtbl; \ -[[last]] entity spawn##cname(entity this, entity basevtbl) { \ - this.instanceOf##cname = true; \ - this.classname = #cname; \ - if (!cname##_vtbl) cname##_vtbl = spawnVtbl(this, basevtbl); \ - return this; \ -} - -#define SUPER(cname) (cname##_vtbl.vtblbase) - -#endif \ No newline at end of file +#endif diff --git a/qcsrc/menu/progs.src b/qcsrc/menu/progs.src index abfb303dbc..2315616d17 100644 --- a/qcsrc/menu/progs.src +++ b/qcsrc/menu/progs.src @@ -9,7 +9,7 @@ oo/classes.qc draw.qc menu.qc -command/commands.qc +command/all.qc xonotic/util.qc @@ -21,8 +21,10 @@ xonotic/util.qc ../common/urllib.qc ../common/util.qc -../common/monsters/monsters.qc +../common/items/all.qc -../common/weapons/weapons.qc // TODO +../common/monsters/all.qc + +../common/weapons/all.qc // TODO ../warpzonelib/mathlib.qc diff --git a/qcsrc/menu/skin-customizables.inc b/qcsrc/menu/skin-customizables.inc index ee0e76f399..bf29683f63 100644 --- a/qcsrc/menu/skin-customizables.inc +++ b/qcsrc/menu/skin-customizables.inc @@ -144,9 +144,6 @@ SKINBEGIN SKINFLOAT(ROWS_CREDITS, 20); SKINFLOAT(WIDTH_CREDITS, 0.5); - // item: crosshair button - SKINSTRING(GFX_CROSSHAIRBUTTON, "crosshairbutton"); - // item: cvar list SKINFLOAT(ALPHA_CVARLIST_SAVED, 1); SKINFLOAT(ALPHA_CVARLIST_TEMPORARY, 0.7); @@ -191,6 +188,9 @@ SKINBEGIN SKINFLOAT(ALPHA_LISTBOX_WAITING, 0.5); SKINVECTOR(COLOR_LISTBOX_BACKGROUND, '0 0 0'); SKINFLOAT(ALPHA_LISTBOX_BACKGROUND, 0.5); + SKINVECTOR(COLOR_LISTBOX_FOCUSED, '0 0 1'); + SKINFLOAT(ALPHA_LISTBOX_FOCUSED, 0.7); + SKINFLOAT(FADEALPHA_LISTBOX_FOCUSED, 0.3); // item: map list SKINVECTOR(COLOR_MAPLIST_TITLE, '1 1 1'); @@ -211,11 +211,13 @@ SKINBEGIN SKINVECTOR(COLOR_MODELTITLE, '1 1 1'); SKINFLOAT(ALPHA_MODELTITLE, 1); - // item: player name editor + // item: special character picker SKINVECTOR(COLOR_CHARMAP_CHAR, '1 1 1'); SKINFLOAT(ALPHA_CHARMAP_CHAR, 1); - SKINVECTOR(COLOR_CHARMAP_FOCUS, '0 0 1'); - SKINFLOAT(ALPHA_CHARMAP_FOCUS, 0.5); + + // item: crosshair picker + SKINVECTOR(COLOR_CROSSHAIRPICKER_CROSSHAIR, '1 1 1'); + SKINFLOAT(ALPHA_CROSSHAIRPICKER_CROSSHAIR, 1); // item: radio button SKINSTRING(GFX_RADIOBUTTON, "radiobutton"); diff --git a/qcsrc/menu/xonotic/campaign.qc b/qcsrc/menu/xonotic/campaign.qc index 826a0b4f2d..e30c038a01 100644 --- a/qcsrc/menu/xonotic/campaign.qc +++ b/qcsrc/menu/xonotic/campaign.qc @@ -7,7 +7,7 @@ CLASS(XonoticCampaignList, XonoticListBox) METHOD(XonoticCampaignList, configureXonoticCampaignList, void(entity)) ATTRIB(XonoticCampaignList, rowsPerItem, float, 10) METHOD(XonoticCampaignList, draw, void(entity)) - METHOD(XonoticCampaignList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticCampaignList, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticCampaignList, doubleClickListBoxItem, void(entity, float, vector)) METHOD(XonoticCampaignList, resizeNotify, void(entity, vector, vector, vector, vector)) METHOD(XonoticCampaignList, setSelected, void(entity, float)) @@ -239,7 +239,7 @@ void XonoticCampaignList_doubleClickListBoxItem(entity me, float i, vector where { CampaignList_LoadMap(me, me); } -void XonoticCampaignList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected) +void XonoticCampaignList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { string s; vector theColor; @@ -265,6 +265,11 @@ void XonoticCampaignList_drawListBoxItem(entity me, int i, vector absSize, bool if(isSelected) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); + else if(isFocused) + { + me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); + } if(draw_PictureSize(strcat("/maps/", campaign_mapname[i])) == '0 0 0') draw_Picture(me.columnPreviewOrigin * eX, "nopreview_map", me.columnPreviewSize * eX + eY, '1 1 1', theAlpha); diff --git a/qcsrc/menu/xonotic/charmap.qc b/qcsrc/menu/xonotic/charmap.qc index d6bc524618..747d1f03b4 100644 --- a/qcsrc/menu/xonotic/charmap.qc +++ b/qcsrc/menu/xonotic/charmap.qc @@ -1,34 +1,27 @@ #ifndef CHARMAP_H #define CHARMAP_H -#include "../item.qc" -CLASS(XonoticCharmap, Item) +#include "picker.qc" +CLASS(XonoticCharmap, XonoticPicker) METHOD(XonoticCharmap, configureXonoticCharmap, void(entity, entity)) - METHOD(XonoticCharmap, mousePress, float(entity, vector)) - METHOD(XonoticCharmap, mouseRelease, float(entity, vector)) - METHOD(XonoticCharmap, mouseMove, float(entity, vector)) - METHOD(XonoticCharmap, mouseDrag, float(entity, vector)) - METHOD(XonoticCharmap, keyDown, float(entity, float, float, float)) METHOD(XonoticCharmap, focusLeave, void(entity)) METHOD(XonoticCharmap, resizeNotify, void(entity, vector, vector, vector, vector)) - METHOD(XonoticCharmap, draw, void(entity)) - ATTRIB(XonoticCharmap, focusable, float, 1) - - METHOD(XonoticCharmap, moveFocus, void(entity, vector, vector)) - METHOD(XonoticCharmap, enterChar, void(entity)) + METHOD(XonoticCharmap, keyDown, float(entity, float, float, float)) ATTRIB(XonoticCharmap, inputBox, entity, NULL) ATTRIB(XonoticCharmap, realFontSize, vector, '0 0 0') - ATTRIB(XonoticCharmap, realCellSize, vector, '0 0 0') - ATTRIB(XonoticCharmap, focusedCell, vector, '-1 -1 0') - ATTRIB(XonoticCharmap, previouslyFocusedCell, vector, '-1 -1 0') + + ATTRIB(XonoticCharmap, rows, float, 10) + ATTRIB(XonoticCharmap, columns, float, 14) + + METHOD(XonoticCharmap, cellSelect, void(entity, vector)) + METHOD(XonoticCharmap, cellIsValid, bool(entity, vector)) + METHOD(XonoticCharmap, cellDraw, void(entity, vector, vector)) + METHOD(XonoticCharmap, charOffset, vector) ENDCLASS(XonoticCharmap) entity makeXonoticCharmap(entity controlledInputBox); #endif #ifdef IMPLEMENTATION -const float CHARMAP_COLS = 14; -const float CHARMAP_ROWS = 10; - string CHARMAP = "★◆■▮▰▬◣◤◥◢◀▲▶▼" "🌍🌎🌏🚀🌌👽🔫⌖❇❈←↑→↓" @@ -46,11 +39,11 @@ string CHARMAP = "\xEE\x83\x8F\xEE\x83\x90\xEE\x83\x91\xEE\x83\x92\xEE\x83\x93\xEE\x83\x94\xEE\x83\x95" "\xEE\x83\x96\xEE\x83\x97\xEE\x83\x98\xEE\x83\x99\xEE\x83\x9A\xEE\x81\x9B\xEE\x81\x9D"; -string charmap_cellToChar(vector cell) +string charmap_cellToChar(entity me, vector cell) { - string character = substring(CHARMAP, cell.y * CHARMAP_COLS + cell.x, 1); + string character = substring(CHARMAP, cell.y * me.columns + cell.x, 1); - if (character != " ") + if(character != " ") return character; else return ""; @@ -67,7 +60,7 @@ entity makeXonoticCharmap(entity controlledInputBox) void XonoticCharmap_configureXonoticCharmap(entity me, entity controlledInputBox) { me.inputBox = controlledInputBox; - me.realCellSize = eX / CHARMAP_COLS + eY / CHARMAP_ROWS; + me.configureXonoticPicker(me); } void XonoticCharmap_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize) @@ -90,153 +83,38 @@ void XonoticCharmap_resizeNotify(entity me, vector relOrigin, vector relSize, ve if(me.realFontSize.x > maxFontWidth || me.realFontSize.y > maxFontHeight) me.realFontSize = eX * maxFontWidth + eY * maxFontHeight; -} - -float XonoticCharmap_mouseMove(entity me, vector coords) -{ - me.focusedCell_x = floor(coords.x * CHARMAP_COLS); - me.focusedCell_y = floor(coords.y * CHARMAP_ROWS); - if(me.focusedCell.x < 0 || me.focusedCell.y < 0 || - me.focusedCell.x >= CHARMAP_COLS || me.focusedCell.y >= CHARMAP_ROWS) - { - me.focusedCell = '-1 -1 0'; - return 0; - } - - return 1; + me.charOffset = eX * me.realCellSize.x / 2 + eY * ((me.realCellSize.y - me.realFontSize.y) / 2); } -float XonoticCharmap_mouseDrag(entity me, vector coords) -{ - return me.mouseMove(me, coords); -} - -float XonoticCharmap_mousePress(entity me, vector coords) -{ - me.mouseMove(me, coords); - - if(me.focusedCell.x >= 0) - { - me.pressed = 1; - me.previouslyFocusedCell = me.focusedCell; - } - - return 1; -} - -float XonoticCharmap_mouseRelease(entity me, vector coords) +float XonoticCharmap_keyDown(entity me, float key, float ascii, float shift) { - if(!me.pressed) - return 0; - - me.mouseMove(me, coords); - - if(me.focusedCell == me.previouslyFocusedCell) - me.enterChar(me); - - me.pressed = 0; - return 1; + if(SUPER(XonoticCharmap).keyDown(me, key, ascii, shift)) + return 1; + return me.inputBox.keyDown(me.inputBox, key, ascii, shift); } -float XonoticCharmap_keyDown(entity me, float key, float ascii, float shift) +void XonoticCharmap_cellSelect(entity me, vector cell) { - switch(key) - { - case K_LEFTARROW: - case K_KP_LEFTARROW: - me.moveFocus(me, me.focusedCell, '-1 0 0'); - return 1; - case K_RIGHTARROW: - case K_KP_RIGHTARROW: - me.moveFocus(me, me.focusedCell, '1 0 0'); - return 1; - case K_UPARROW: - case K_KP_UPARROW: - me.moveFocus(me, me.focusedCell, '0 -1 0'); - return 1; - case K_DOWNARROW: - case K_KP_DOWNARROW: - me.moveFocus(me, me.focusedCell, '0 1 0'); - return 1; - case K_HOME: - case K_KP_HOME: - me.focusedCell = '0 0 0'; - return 1; - case K_END: - case K_KP_END: - me.focusedCell_x = CHARMAP_COLS - 1; - me.focusedCell_y = CHARMAP_ROWS - 1; - return 1; - case K_ENTER: - case K_KP_ENTER: - case K_INS: - case K_KP_INS: - me.enterChar(me); - return 1; - default: - return me.inputBox.keyDown(me.inputBox, key, ascii, shift); - } + string character = charmap_cellToChar(me, cell); + if(character != "") + me.inputBox.enterText(me.inputBox, character); } -void XonoticCharmap_moveFocus(entity me, vector initialCell, vector step) +bool XonoticCharmap_cellIsValid(entity me, vector cell) { - me.focusedCell_x = mod(me.focusedCell.x + step.x + CHARMAP_COLS, CHARMAP_COLS); - me.focusedCell_y = mod(me.focusedCell.y + step.y + CHARMAP_ROWS, CHARMAP_ROWS); - - if(me.focusedCell != initialCell) // Recursion break - if(charmap_cellToChar(me.focusedCell) == "") - me.moveFocus(me, initialCell, step); + if(charmap_cellToChar(me, cell) == "") + return false; + return true; } -void XonoticCharmap_enterChar(entity me) +void XonoticCharmap_cellDraw(entity me, vector cell, vector cellPos) { - string character = charmap_cellToChar(me.focusedCell); - if(character != "") - me.inputBox.enterText(me.inputBox, character); + draw_CenterText(cellPos + me.charOffset, charmap_cellToChar(me, cell), me.realFontSize, SKINCOLOR_CHARMAP_CHAR, SKINALPHA_CHARMAP_CHAR, 0); } void XonoticCharmap_focusLeave(entity me) { me.inputBox.saveCvars(me.inputBox); } - -void XonoticCharmap_draw(entity me) -{ - string character; - vector cell, cellPos, charPos; - cell = '0 0 0'; - cellPos = '0 0 0'; - charPos = '0 0 0'; - - float CHAR_OFFSET_X = me.realCellSize.x / 2; - float CHAR_OFFSET_Y = (me.realCellSize.y - me.realFontSize.y) / 2; - - for(cell_y = 0; cell.y < CHARMAP_ROWS; ++cell.y) - { - charPos_y = cell.y / CHARMAP_ROWS + CHAR_OFFSET_Y; - for(cell_x = 0; cell.x < CHARMAP_COLS; ++cell.x) - { - character = charmap_cellToChar(cell); - - if(character == "") - continue; - - // Draw focused cell - if(cell == me.focusedCell && me.focused) - { - if(!me.pressed || me.focusedCell == me.previouslyFocusedCell) - { - cellPos_x = mod(me.focusedCell.x, CHARMAP_COLS) / CHARMAP_COLS; - cellPos_y = mod(me.focusedCell.y, CHARMAP_ROWS) / CHARMAP_ROWS; - draw_Fill(cellPos, me.realCellSize, SKINCOLOR_CHARMAP_FOCUS, SKINALPHA_CHARMAP_FOCUS); - } - } - - // Draw character - charPos_x = cell.x / CHARMAP_COLS + CHAR_OFFSET_X; - draw_CenterText(charPos, character, me.realFontSize, SKINCOLOR_CHARMAP_CHAR, SKINALPHA_CHARMAP_CHAR, 0); - } - } -} #endif diff --git a/qcsrc/menu/xonotic/credits.qc b/qcsrc/menu/xonotic/credits.qc index d7e17f5329..57320a0182 100644 --- a/qcsrc/menu/xonotic/credits.qc +++ b/qcsrc/menu/xonotic/credits.qc @@ -5,7 +5,7 @@ CLASS(XonoticCreditsList, XonoticListBox) METHOD(XonoticCreditsList, configureXonoticCreditsList, void(entity)) ATTRIB(XonoticCreditsList, rowsPerItem, float, 1) METHOD(XonoticCreditsList, draw, void(entity)) - METHOD(XonoticCreditsList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticCreditsList, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticCreditsList, resizeNotify, void(entity, vector, vector, vector, vector)) METHOD(XonoticCreditsList, keyDown, float(entity, float, float, float)) METHOD(XonoticCreditsList, destroy, void(entity)) @@ -59,7 +59,7 @@ void XonoticCreditsList_resizeNotify(entity me, vector relOrigin, vector relSize me.realFontSize_x = me.fontSize / (absSize.x * (1 - me.controlWidth)); me.realUpperMargin = 0.5 * (1 - me.realFontSize.y); } -void XonoticCreditsList_drawListBoxItem(entity me, float i, vector absSize, float isSelected) +void XonoticCreditsList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { // layout: Ping, Credits name, Map name, NP, TP, MP string s; diff --git a/qcsrc/menu/xonotic/crosshairbutton.qc b/qcsrc/menu/xonotic/crosshairbutton.qc deleted file mode 100644 index 466846f12d..0000000000 --- a/qcsrc/menu/xonotic/crosshairbutton.qc +++ /dev/null @@ -1,130 +0,0 @@ -#ifndef CROSSHAIRBUTTON_H -#define CROSSHAIRBUTTON_H -#include "../item/radiobutton.qc" -CLASS(XonoticCrosshairButton, RadioButton) - METHOD(XonoticCrosshairButton, configureXonoticCrosshairButton, void(entity, float, float)) - METHOD(XonoticCrosshairButton, setChecked, void(entity, float)) - METHOD(XonoticCrosshairButton, draw, void(entity)) - ATTRIB(XonoticCrosshairButton, fontSize, float, SKINFONTSIZE_NORMAL) - ATTRIB(XonoticCrosshairButton, image, string, SKINGFX_CROSSHAIRBUTTON) - - ATTRIB(XonoticCrosshairButton, useDownAsChecked, float, 1) - ATTRIB(XonoticCrosshairButton, src3, string, string_null) - ATTRIB(XonoticCrosshairButton, src4, string, string_null) - - ATTRIB(XonoticCrosshairButton, cvarName, string, string_null) - ATTRIB(XonoticCrosshairButton, cvarValueFloat, float, 0) - METHOD(XonoticCrosshairButton, loadCvars, void(entity)) - METHOD(XonoticCrosshairButton, saveCvars, void(entity)) -ENDCLASS(XonoticCrosshairButton) -entity makeXonoticCrosshairButton(float, float); -#endif - -#ifdef IMPLEMENTATION -entity makeXonoticCrosshairButton(float theGroup, float theCrosshair) -{ - entity me; - me = NEW(XonoticCrosshairButton); - me.configureXonoticCrosshairButton(me, theGroup, theCrosshair); - return me; -} -void XonoticCrosshairButton_configureXonoticCrosshairButton(entity me, float theGroup, float theCrosshair) -{ - me.cvarName = "crosshair"; - me.cvarValueFloat = theCrosshair; - me.loadCvars(me); - me.configureRadioButton(me, string_null, me.fontSize, me.image, theGroup, 0); - me.srcMulti = 1; - if(me.cvarValueFloat == -1) - me.src3 = strzone(strcat("/gfx/crosshair", cvar_string("crosshair"))); - else - me.src3 = strzone(strcat("/gfx/crosshair", ftos(me.cvarValueFloat))); - me.src4 = "/gfx/crosshairdot"; -} -void XonoticCrosshairButton_setChecked(entity me, float val) -{ - if(me.cvarValueFloat != -1) // preview shouldn't work as a button - if(val != me.checked) - { - me.checked = val; - me.saveCvars(me); - } -} -void XonoticCrosshairButton_loadCvars(entity me) -{ - if (!me.cvarName) - return; - - me.checked = (cvar(me.cvarName) == me.cvarValueFloat); -} -void XonoticCrosshairButton_saveCvars(entity me) -{ - if (!me.cvarName) - return; - - if(me.checked) - cvar_set(me.cvarName, ftos(me.cvarValueFloat)); - // TODO on an apply button, read _cl_color and execute the color command for it -} -void XonoticCrosshairButton_draw(entity me) -{ - vector sz, rgb; - float a; - - - if(me.cvarValueFloat == -1) - { - rgb = stov(cvar_string("crosshair_color")); - a = cvar("crosshair_alpha"); - } - else if(me.checked || me.focused) - { - a = 1; - rgb = '1 1 1'; - } - else - { - a = me.disabledAlpha; - rgb = '1 1 1'; - } - - if(me.cvarValueFloat == -1) // update the preview if this is the preview button - { - if(me.src3) - strunzone(me.src3); - me.src3 = strzone(strcat("/gfx/crosshair", cvar_string("crosshair"))); - me.focused = 1; - me.checked = 0; - } - - SUPER(XonoticCrosshairButton).draw(me); - - sz = draw_PictureSize(me.src3); - sz = globalToBoxSize(sz, me.size); - if(me.cvarValueFloat == -1) - { - sz = sz * cvar("crosshair_size"); // (6 * '1 1 0' + ...) * 0.08 here to make visible size changes happen also at bigger sizes - /* - if(sz_x > 0.95) - sz = sz * (0.95 / sz_x); - if(sz_y > 0.95) - sz = sz * (0.95 / sz_y); - */ - } - else // show the crosshair picker at full size - { - sz = sz * (0.95 / sz.x); - if(sz.y > 0.95) - sz = sz * (0.95 / sz.y); - } - - draw_Picture('0.5 0.5 0' - 0.5 * sz, me.src3, sz, rgb, a); - if(cvar("crosshair_dot")) - { - if(cvar("crosshair_dot_color_custom") && (cvar_string("crosshair_dot_color") != "0")) - rgb = stov(cvar_string("crosshair_dot_color")); - - draw_Picture('0.5 0.5 0' - 0.5 * sz * cvar("crosshair_dot_size"), me.src4, sz * cvar("crosshair_dot_size"), rgb, a * cvar("crosshair_dot_alpha")); - } -} -#endif diff --git a/qcsrc/menu/xonotic/crosshairpicker.qc b/qcsrc/menu/xonotic/crosshairpicker.qc new file mode 100644 index 0000000000..8922e7fbf4 --- /dev/null +++ b/qcsrc/menu/xonotic/crosshairpicker.qc @@ -0,0 +1,79 @@ +#ifndef CROSSHAIRPICKER_H +#define CROSSHAIRPICKER_H +#include "picker.qc" +CLASS(XonoticCrosshairPicker, XonoticPicker) + METHOD(XonoticCrosshairPicker, configureXonoticCrosshairPicker, void(entity)) + + ATTRIB(XonoticCrosshairPicker, rows, float, 3) + ATTRIB(XonoticCrosshairPicker, columns, float, 12) + + METHOD(XonoticCrosshairPicker, cellSelect, void(entity, vector)) + METHOD(XonoticCrosshairPicker, cellIsValid, bool(entity, vector)) + METHOD(XonoticCrosshairPicker, cellDraw, void(entity, vector, vector)) +ENDCLASS(XonoticCrosshairPicker) +entity makeXonoticCrosshairPicker(); +#endif + +#ifdef IMPLEMENTATION + +string crosshairpicker_cellToCrosshair(entity me, vector cell) +{ + if(cell.x < 0 || cell.x >= me.columns || cell.y < 0 || cell.y >= me.rows) + return ""; + return ftos(31 + cell.y * me.columns + cell.x); +} + +vector crosshairpicker_crosshairToCell(entity me, string crosshair_str) +{ + float crosshair = stof(crosshair_str) - 31; + if(crosshair - floor(crosshair) > 0) + return '-1 -1 0'; + return mod(crosshair, me.columns) * eX + floor(crosshair / me.columns) * eY; +} + +entity makeXonoticCrosshairPicker() +{ + entity me; + me = NEW(XonoticCrosshairPicker); + me.configureXonoticCrosshairPicker(me); + return me; +} + +void XonoticCrosshairPicker_configureXonoticCrosshairPicker(entity me) +{ + me.configureXonoticPicker(me); + SUPER(XonoticCrosshairPicker).cellSelect(me, crosshairpicker_crosshairToCell(me, cvar_string("crosshair"))); +} + +void XonoticCrosshairPicker_cellSelect(entity me, vector cell) +{ + cvar_set("crosshair", crosshairpicker_cellToCrosshair(me, me.focusedCell)); + SUPER(XonoticCrosshairPicker).cellSelect(me, me.focusedCell); +} + +bool XonoticCrosshairPicker_cellIsValid(entity me, vector cell) +{ + if(crosshairpicker_cellToCrosshair(me, cell) == "") + return false; + return true; +} + +void XonoticCrosshairPicker_cellDraw(entity me, vector cell, vector cellPos) +{ + vector sz; + string cross = strcat("/gfx/crosshair", crosshairpicker_cellToCrosshair(me, cell)); + sz = draw_PictureSize(cross); + sz = globalToBoxSize(sz, me.size); + + float ar = sz.x / sz.y; + sz.x = me.realCellSize.x; + sz.y = sz.x / ar; + sz = sz * 0.95; + + vector crosshairPos = cellPos + 0.5 * me.realCellSize; + draw_Picture(crosshairPos - 0.5 * sz, cross, sz, SKINCOLOR_CROSSHAIRPICKER_CROSSHAIR, SKINALPHA_CROSSHAIRPICKER_CROSSHAIR); + + if(cvar("crosshair_dot")) + draw_Picture(crosshairPos - 0.5 * sz * cvar("crosshair_dot_size"), "/gfx/crosshairdot", sz * cvar("crosshair_dot_size"), SKINCOLOR_CROSSHAIRPICKER_CROSSHAIR, SKINALPHA_CROSSHAIRPICKER_CROSSHAIR); +} +#endif diff --git a/qcsrc/menu/xonotic/crosshairpreview.qc b/qcsrc/menu/xonotic/crosshairpreview.qc new file mode 100644 index 0000000000..f8de857982 --- /dev/null +++ b/qcsrc/menu/xonotic/crosshairpreview.qc @@ -0,0 +1,62 @@ +#ifndef CROSSHAIRPREVIEW_H +#define CROSSHAIRPREVIEW_H +#include "../item.qc" +CLASS(XonoticCrosshairPreview, Item) + METHOD(XonoticCrosshairPreview, configureXonoticCrosshairPreview, void(entity)) + METHOD(XonoticCrosshairPreview, draw, void(entity)) + ATTRIB(XonoticCrosshairPreview, src, string, string_null) + ATTRIB(XonoticCrosshairPreview, src2, string, string_null) + ATTRIB(XonoticCrosshairPreview, disabled, float, 0) + ATTRIB(XonoticCrosshairPreview, disabledAlpha, float, SKINALPHA_DISABLED) +ENDCLASS(XonoticCrosshairPreview) +entity makeXonoticCrosshairPreview(); +#endif + +#ifdef IMPLEMENTATION +entity makeXonoticCrosshairPreview() +{ + entity me; + me = NEW(XonoticCrosshairPreview); + me.configureXonoticCrosshairPreview(me); + return me; +} + +void XonoticCrosshairPreview_configureXonoticCrosshairPreview(entity me) +{ + me.src = strzone(strcat("/gfx/crosshair", cvar_string("crosshair"))); + me.src2 = "/gfx/crosshairdot"; +} + +void XonoticCrosshairPreview_draw(entity me) +{ + float save; + save = draw_alpha; + if(me.disabled) + draw_alpha *= me.disabledAlpha; + + vector sz, rgb; + float a; + rgb = stov(cvar_string("crosshair_color")); + a = cvar("crosshair_alpha"); + if(me.src) + strunzone(me.src); + me.src = strzone(strcat("/gfx/crosshair", cvar_string("crosshair"))); + + sz = draw_PictureSize(me.src); + sz = globalToBoxSize(sz, me.size); + sz = sz * cvar("crosshair_size"); + + draw_Picture('0.5 0.5 0' - 0.5 * sz, me.src, sz, rgb, a); + if(cvar("crosshair_dot")) + { + if(cvar("crosshair_dot_color_custom") && (cvar_string("crosshair_dot_color") != "0")) + rgb = stov(cvar_string("crosshair_dot_color")); + + draw_Picture('0.5 0.5 0' - 0.5 * sz * cvar("crosshair_dot_size"), me.src2, sz * cvar("crosshair_dot_size"), rgb, a * cvar("crosshair_dot_alpha")); + } + + draw_alpha = save; + + SUPER(XonoticCrosshairPreview).draw(me); +} +#endif diff --git a/qcsrc/menu/xonotic/cvarlist.qc b/qcsrc/menu/xonotic/cvarlist.qc index 44520c1f22..9a95ed1639 100644 --- a/qcsrc/menu/xonotic/cvarlist.qc +++ b/qcsrc/menu/xonotic/cvarlist.qc @@ -4,7 +4,7 @@ CLASS(XonoticCvarList, XonoticListBox) METHOD(XonoticCvarList, configureXonoticCvarList, void(entity)) ATTRIB(XonoticCvarList, rowsPerItem, float, 1) - METHOD(XonoticCvarList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticCvarList, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticCvarList, resizeNotify, void(entity, vector, vector, vector, vector)) METHOD(XonoticCvarList, keyDown, float(entity, float, float, float)) @@ -154,7 +154,7 @@ void XonoticCvarList_resizeNotify(entity me, vector relOrigin, vector relSize, v me.setSelected(me, me.selectedItem); } -void XonoticCvarList_drawListBoxItem(entity me, float i, vector absSize, float isSelected) +void XonoticCvarList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { string k, v, d; float t; @@ -166,6 +166,11 @@ void XonoticCvarList_drawListBoxItem(entity me, float i, vector absSize, float i if(isSelected) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); + else if(isFocused) + { + me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); + } k = bufstr_get(me.handle, i); diff --git a/qcsrc/menu/xonotic/demolist.qc b/qcsrc/menu/xonotic/demolist.qc index 4f759f68ad..f46ee407b6 100644 --- a/qcsrc/menu/xonotic/demolist.qc +++ b/qcsrc/menu/xonotic/demolist.qc @@ -5,7 +5,7 @@ CLASS(XonoticDemoList, XonoticListBox) METHOD(XonoticDemoList, configureXonoticDemoList, void(entity)) ATTRIB(XonoticDemoList, rowsPerItem, float, 1) METHOD(XonoticDemoList, resizeNotify, void(entity, vector, vector, vector, vector)) - METHOD(XonoticDemoList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticDemoList, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticDemoList, getDemos, void(entity)) METHOD(XonoticDemoList, startDemo, void(entity)) METHOD(XonoticDemoList, timeDemo, void(entity)) @@ -135,11 +135,16 @@ void XonoticDemoList_resizeNotify(entity me, vector relOrigin, vector relSize, v me.columnNameSize = 1 - 2 * me.realFontSize.x; } -void XonoticDemoList_drawListBoxItem(entity me, float i, vector absSize, float isSelected) +void XonoticDemoList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { string s; if(isSelected) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); + else if(isFocused) + { + me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); + } s = me.demoName(me,i); s = draw_TextShortenToWidth(s, me.columnNameSize, 0, me.realFontSize); diff --git a/qcsrc/menu/xonotic/dialog_multiplayer.qc b/qcsrc/menu/xonotic/dialog_multiplayer.qc index 6aedde7fd0..64cfbd91dd 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer.qc +++ b/qcsrc/menu/xonotic/dialog_multiplayer.qc @@ -19,9 +19,6 @@ void XonoticMultiplayerDialog_fill(entity me) me.TR(me); me.TD(me, 1, 1, e = mc.makeTabButton(mc, _("Servers"), makeXonoticServerListTab())); me.TD(me, 1, 1, e = mc.makeTabButton(mc, _("Create"), makeXonoticServerCreateTab())); - //me.TD(me, 1, 1, e = mc.makeTabButton(mc, _("Demos"), makeXonoticDemoBrowserTab())); - //me.TD(me, 1, 1, e = mc.makeTabButton(mc, _("Screenshots"), makeXonoticScreenshotBrowserTab())); - //me.TD(me, 1, 1, e = mc.makeTabButton(mc, _("Players"), makeXonoticDemoBrowserTab())); me.TD(me, 1, 1, e = mc.makeTabButton(mc, _("Media"), makeXonoticMediaTab())); me.TD(me, 1, 1, e = mc.makeTabButton(mc, _("Profile"), makeXonoticProfileTab())); diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_create.qc b/qcsrc/menu/xonotic/dialog_multiplayer_create.qc index 13a8e3184b..e56f2eef3d 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_create.qc +++ b/qcsrc/menu/xonotic/dialog_multiplayer_create.qc @@ -5,7 +5,6 @@ CLASS(XonoticServerCreateTab, XonoticTab) METHOD(XonoticServerCreateTab, fill, void(entity)) METHOD(XonoticServerCreateTab, gameTypeChangeNotify, void(entity)) METHOD(XonoticServerCreateTab, gameTypeSelectNotify, void(entity)) - ATTRIB(XonoticServerCreateTab, title, string, _("Create")) ATTRIB(XonoticServerCreateTab, intendedWidth, float, 0.9) ATTRIB(XonoticServerCreateTab, rows, float, 23) ATTRIB(XonoticServerCreateTab, columns, float, 6.2) // added extra .2 for center space diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc b/qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc index 4494452256..8ab5296383 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc +++ b/qcsrc/menu/xonotic/dialog_multiplayer_create_mutators.qc @@ -1,4 +1,4 @@ -#include "../../common/weapons/weapons.qh" +#include "../../common/weapons/all.qh" #ifndef DIALOG_MULTIPLAYER_CREATE_MUTATORS_H #define DIALOG_MULTIPLAYER_CREATE_MUTATORS_H diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_join.qc b/qcsrc/menu/xonotic/dialog_multiplayer_join.qc index 2b2354c533..a4e480e18a 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_join.qc +++ b/qcsrc/menu/xonotic/dialog_multiplayer_join.qc @@ -3,7 +3,6 @@ #include "tab.qc" CLASS(XonoticServerListTab, XonoticTab) METHOD(XonoticServerListTab, fill, void(entity)) - ATTRIB(XonoticServerListTab, title, string, _("Join")) ATTRIB(XonoticServerListTab, intendedWidth, float, 0.9) ATTRIB(XonoticServerListTab, rows, float, 23) ATTRIB(XonoticServerListTab, columns, float, 6.5) diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_media.qc b/qcsrc/menu/xonotic/dialog_multiplayer_media.qc index f6b5e02ad8..03ffd0f36d 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_media.qc +++ b/qcsrc/menu/xonotic/dialog_multiplayer_media.qc @@ -3,7 +3,6 @@ #include "tab.qc" CLASS(XonoticMediaTab, XonoticTab) METHOD(XonoticMediaTab, fill, void(entity)) - ATTRIB(XonoticMediaTab, title, string, _("Media")) ATTRIB(XonoticMediaTab, intendedWidth, float, 0.9) ATTRIB(XonoticMediaTab, rows, float, 23) ATTRIB(XonoticMediaTab, columns, float, 3) diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc b/qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc index 8ae5ae0c3a..788aa5381b 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc +++ b/qcsrc/menu/xonotic/dialog_multiplayer_media_demo.qc @@ -3,7 +3,6 @@ #include "tab.qc" CLASS(XonoticDemoBrowserTab, XonoticTab) METHOD(XonoticDemoBrowserTab, fill, void(entity)) - ATTRIB(XonoticDemoBrowserTab, title, string, _("Demo")) ATTRIB(XonoticDemoBrowserTab, intendedWidth, float, 0.9) ATTRIB(XonoticDemoBrowserTab, rows, float, 21) ATTRIB(XonoticDemoBrowserTab, columns, float, 6.5) diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc b/qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc index 8fc33c1b86..6c0791ff7c 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc +++ b/qcsrc/menu/xonotic/dialog_multiplayer_media_musicplayer.qc @@ -3,7 +3,6 @@ #include "tab.qc" CLASS(XonoticMusicPlayerTab, XonoticTab) METHOD(XonoticMusicPlayerTab, fill, void(entity)) - ATTRIB(XonoticMusicPlayerTab, title, string, _("Music")) ATTRIB(XonoticMusicPlayerTab, intendedWidth, float, 0.9) ATTRIB(XonoticMusicPlayerTab, rows, float, 21) ATTRIB(XonoticMusicPlayerTab, columns, float, 6.5) diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc b/qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc index 36832a90cf..c6526f2ec8 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc +++ b/qcsrc/menu/xonotic/dialog_multiplayer_media_screenshot.qc @@ -3,7 +3,6 @@ #include "tab.qc" CLASS(XonoticScreenshotBrowserTab, XonoticTab) METHOD(XonoticScreenshotBrowserTab, fill, void(entity)) - ATTRIB(XonoticScreenshotBrowserTab, title, string, "Screenshot") ATTRIB(XonoticScreenshotBrowserTab, intendedWidth, float, 1) ATTRIB(XonoticScreenshotBrowserTab, rows, float, 21) ATTRIB(XonoticScreenshotBrowserTab, columns, float, 6.5) diff --git a/qcsrc/menu/xonotic/dialog_multiplayer_profile.qc b/qcsrc/menu/xonotic/dialog_multiplayer_profile.qc index f9615d21cc..9faf42888e 100644 --- a/qcsrc/menu/xonotic/dialog_multiplayer_profile.qc +++ b/qcsrc/menu/xonotic/dialog_multiplayer_profile.qc @@ -4,7 +4,6 @@ CLASS(XonoticProfileTab, XonoticTab) METHOD(XonoticProfileTab, fill, void(entity)) METHOD(XonoticProfileTab, draw, void(entity)) - ATTRIB(XonoticProfileTab, title, string, _("Profile")) ATTRIB(XonoticProfileTab, intendedWidth, float, 0.9) ATTRIB(XonoticProfileTab, rows, float, 23) ATTRIB(XonoticProfileTab, columns, float, 6.1) // added extra .2 for center space diff --git a/qcsrc/menu/xonotic/dialog_settings_audio.qc b/qcsrc/menu/xonotic/dialog_settings_audio.qc index 528d950389..af8faddace 100644 --- a/qcsrc/menu/xonotic/dialog_settings_audio.qc +++ b/qcsrc/menu/xonotic/dialog_settings_audio.qc @@ -3,7 +3,6 @@ #include "tab.qc" CLASS(XonoticAudioSettingsTab, XonoticTab) METHOD(XonoticAudioSettingsTab, fill, void(entity)) - ATTRIB(XonoticAudioSettingsTab, title, string, _("Audio")) ATTRIB(XonoticAudioSettingsTab, intendedWidth, float, 0.9) ATTRIB(XonoticAudioSettingsTab, rows, float, 15.5) ATTRIB(XonoticAudioSettingsTab, columns, float, 6.2) // added extra .2 for center space diff --git a/qcsrc/menu/xonotic/dialog_settings_effects.qc b/qcsrc/menu/xonotic/dialog_settings_effects.qc index a49e17647a..d06465082b 100644 --- a/qcsrc/menu/xonotic/dialog_settings_effects.qc +++ b/qcsrc/menu/xonotic/dialog_settings_effects.qc @@ -3,7 +3,6 @@ #include "tab.qc" CLASS(XonoticEffectsSettingsTab, XonoticTab) METHOD(XonoticEffectsSettingsTab, fill, void(entity)) - ATTRIB(XonoticEffectsSettingsTab, title, string, _("Effects")) ATTRIB(XonoticEffectsSettingsTab, intendedWidth, float, 0.9) ATTRIB(XonoticEffectsSettingsTab, rows, float, 15.5) ATTRIB(XonoticEffectsSettingsTab, columns, float, 6.2) // added extra .2 for center space diff --git a/qcsrc/menu/xonotic/dialog_settings_game.qc b/qcsrc/menu/xonotic/dialog_settings_game.qc index e8fd42d5d5..5b14b7bdb6 100644 --- a/qcsrc/menu/xonotic/dialog_settings_game.qc +++ b/qcsrc/menu/xonotic/dialog_settings_game.qc @@ -3,7 +3,6 @@ #include "tab.qc" CLASS(XonoticGameSettingsTab, XonoticTab) METHOD(XonoticGameSettingsTab, fill, void(entity)) - ATTRIB(XonoticGameSettingsTab, title, string, _("Game")) ATTRIB(XonoticGameSettingsTab, intendedWidth, float, 0.9) ATTRIB(XonoticGameSettingsTab, rows, float, 15.5) ATTRIB(XonoticGameSettingsTab, columns, float, 6.5) diff --git a/qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc b/qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc index bda4fadd7a..cee4bd5c72 100644 --- a/qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc +++ b/qcsrc/menu/xonotic/dialog_settings_game_crosshair.qc @@ -2,10 +2,8 @@ #define DIALOG_SETTINGS_GAME_CROSSHAIR_H #include "tab.qc" CLASS(XonoticGameCrosshairSettingsTab, XonoticTab) - //METHOD(XonoticGameCrosshairSettingsTab, toString, string(entity)) METHOD(XonoticGameCrosshairSettingsTab, fill, void(entity)) METHOD(XonoticGameCrosshairSettingsTab, showNotify, void(entity)) - ATTRIB(XonoticGameCrosshairSettingsTab, title, string, _("Crosshair")) ATTRIB(XonoticGameCrosshairSettingsTab, intendedWidth, float, 0.9) ATTRIB(XonoticGameCrosshairSettingsTab, rows, float, 13) ATTRIB(XonoticGameCrosshairSettingsTab, columns, float, 6.2) @@ -29,7 +27,6 @@ entity makeXonoticGameCrosshairSettingsTab() void XonoticGameCrosshairSettingsTab_fill(entity me) { entity e; - float i; // crosshair_enabled: 0 = no crosshair options, 1 = no crosshair selection, but everything else enabled, 2 = all crosshair options enabled // FIXME: In the future, perhaps make one global crosshair_type cvar which has 0 for disabled, 1 for custom, 2 for per weapon, etc? @@ -42,26 +39,12 @@ void XonoticGameCrosshairSettingsTab_fill(entity me) me.TD(me, 1, 1, e = makeXonoticRadioButton(3, "crosshair_enabled", "2", _("Custom"))); me.TR(me); me.TDempty(me, 0.1); - for(i = 31; i <= 42; ++i) { - me.TDNoMargin(me, 1, 2 / 12, e = makeXonoticCrosshairButton(4, i), '1 1 0'); - setDependentAND(e, "crosshair_per_weapon", 0, 0, "crosshair_enabled", 1, 2); - } - // show a larger preview of the selected crosshair - me.TDempty(me, 0.1); - me.TDNoMargin(me, 3, 0.8, e = makeXonoticCrosshairButton(7, -1), '1 1 0'); // crosshair -1 makes this a preview + me.TD(me, 3, 2, e = makeXonoticCrosshairPicker()); + setDependentAND(e, "crosshair_per_weapon", 0, 0, "crosshair_enabled", 1, 2); + me.TD(me, 3, 0.9, e = makeXonoticCrosshairPreview()); setDependentAND(e, "crosshair_per_weapon", 0, 0, "crosshair_enabled", 1, 2); me.TR(me); - me.TDempty(me, 0.1); - for(i = 43; i <= 54; ++i) { - me.TDNoMargin(me, 1, 2 / 12, e = makeXonoticCrosshairButton(4, i), '1 1 0'); - setDependentAND(e, "crosshair_per_weapon", 0, 0, "crosshair_enabled", 1, 2); - } me.TR(me); - me.TDempty(me, 0.1); - for(i = 55; i <= 66; ++i) { - me.TDNoMargin(me, 1, 2 / 12, e = makeXonoticCrosshairButton(4, i), '1 1 0'); - setDependentAND(e, "crosshair_per_weapon", 0, 0, "crosshair_enabled", 1, 2); - } me.TR(me); me.TDempty(me, 0.1); me.TD(me, 1, 1, e = makeXonoticTextLabel(0, _("Crosshair size:"))); diff --git a/qcsrc/menu/xonotic/dialog_settings_game_hud.qc b/qcsrc/menu/xonotic/dialog_settings_game_hud.qc index 751eaa6a6f..941daa7922 100644 --- a/qcsrc/menu/xonotic/dialog_settings_game_hud.qc +++ b/qcsrc/menu/xonotic/dialog_settings_game_hud.qc @@ -2,10 +2,8 @@ #define DIALOG_SETTINGS_GAME_HUD_H #include "tab.qc" CLASS(XonoticGameHUDSettingsTab, XonoticTab) - //METHOD(XonoticGameHUDSettingsTab, toString, string(entity)) METHOD(XonoticGameHUDSettingsTab, fill, void(entity)) METHOD(XonoticGameHUDSettingsTab, showNotify, void(entity)) - ATTRIB(XonoticGameHUDSettingsTab, title, string, _("HUD")) ATTRIB(XonoticGameHUDSettingsTab, intendedWidth, float, 0.9) ATTRIB(XonoticGameHUDSettingsTab, rows, float, 13) ATTRIB(XonoticGameHUDSettingsTab, columns, float, 6.2) diff --git a/qcsrc/menu/xonotic/dialog_settings_game_messages.qc b/qcsrc/menu/xonotic/dialog_settings_game_messages.qc index eccd938f4f..d52a102d42 100644 --- a/qcsrc/menu/xonotic/dialog_settings_game_messages.qc +++ b/qcsrc/menu/xonotic/dialog_settings_game_messages.qc @@ -2,10 +2,8 @@ #define DIALOG_SETTINGS_GAME_MESSAGES_H #include "tab.qc" CLASS(XonoticGameMessageSettingsTab, XonoticTab) - //METHOD(XonoticGameWeaponsSettingsTab, toString, string(entity)) METHOD(XonoticGameMessageSettingsTab, fill, void(entity)) METHOD(XonoticGameMessageSettingsTab, showNotify, void(entity)) - ATTRIB(XonoticGameMessageSettingsTab, title, string, _("Messages")) ATTRIB(XonoticGameMessageSettingsTab, intendedWidth, float, 0.9) ATTRIB(XonoticGameMessageSettingsTab, rows, float, 13) ATTRIB(XonoticGameMessageSettingsTab, columns, float, 6) diff --git a/qcsrc/menu/xonotic/dialog_settings_game_model.qc b/qcsrc/menu/xonotic/dialog_settings_game_model.qc index 32955ba8f1..db3e4082c9 100644 --- a/qcsrc/menu/xonotic/dialog_settings_game_model.qc +++ b/qcsrc/menu/xonotic/dialog_settings_game_model.qc @@ -2,10 +2,8 @@ #define DIALOG_SETTINGS_GAME_MODEL_H #include "tab.qc" CLASS(XonoticGameModelSettingsTab, XonoticTab) - //METHOD(XonoticGameModelSettingsTab, toString, string(entity)) METHOD(XonoticGameModelSettingsTab, fill, void(entity)) METHOD(XonoticGameModelSettingsTab, showNotify, void(entity)) - ATTRIB(XonoticGameModelSettingsTab, title, string, _("Model")) ATTRIB(XonoticGameModelSettingsTab, intendedWidth, float, 0.9) ATTRIB(XonoticGameModelSettingsTab, rows, float, 13) ATTRIB(XonoticGameModelSettingsTab, columns, float, 5) diff --git a/qcsrc/menu/xonotic/dialog_settings_game_view.qc b/qcsrc/menu/xonotic/dialog_settings_game_view.qc index 4daef475a7..40a526d56a 100644 --- a/qcsrc/menu/xonotic/dialog_settings_game_view.qc +++ b/qcsrc/menu/xonotic/dialog_settings_game_view.qc @@ -2,10 +2,8 @@ #define DIALOG_SETTINGS_GAME_VIEW_H #include "tab.qc" CLASS(XonoticGameViewSettingsTab, XonoticTab) - //METHOD(XonoticGameCrosshairSettingsTab, toString, string(entity)) METHOD(XonoticGameViewSettingsTab, fill, void(entity)) METHOD(XonoticGameViewSettingsTab, showNotify, void(entity)) - ATTRIB(XonoticGameViewSettingsTab, title, string, _("View")) ATTRIB(XonoticGameViewSettingsTab, intendedWidth, float, 0.9) ATTRIB(XonoticGameViewSettingsTab, rows, float, 13) ATTRIB(XonoticGameViewSettingsTab, columns, float, 6.2) diff --git a/qcsrc/menu/xonotic/dialog_settings_game_weapons.qc b/qcsrc/menu/xonotic/dialog_settings_game_weapons.qc index 573f139a9a..c59a9620d4 100644 --- a/qcsrc/menu/xonotic/dialog_settings_game_weapons.qc +++ b/qcsrc/menu/xonotic/dialog_settings_game_weapons.qc @@ -2,10 +2,8 @@ #define DIALOG_SETTINGS_GAME_WEAPONS_H #include "tab.qc" CLASS(XonoticGameWeaponsSettingsTab, XonoticTab) - //METHOD(XonoticGameWeaponsSettingsTab, toString, string(entity)) METHOD(XonoticGameWeaponsSettingsTab, fill, void(entity)) METHOD(XonoticGameWeaponsSettingsTab, showNotify, void(entity)) - ATTRIB(XonoticGameWeaponsSettingsTab, title, string, _("Weapons")) ATTRIB(XonoticGameWeaponsSettingsTab, intendedWidth, float, 0.9) ATTRIB(XonoticGameWeaponsSettingsTab, rows, float, 13) ATTRIB(XonoticGameWeaponsSettingsTab, columns, float, 6) diff --git a/qcsrc/menu/xonotic/dialog_settings_input.qc b/qcsrc/menu/xonotic/dialog_settings_input.qc index 752aade975..f8e53c03a9 100644 --- a/qcsrc/menu/xonotic/dialog_settings_input.qc +++ b/qcsrc/menu/xonotic/dialog_settings_input.qc @@ -3,7 +3,6 @@ #include "tab.qc" CLASS(XonoticInputSettingsTab, XonoticTab) METHOD(XonoticInputSettingsTab, fill, void(entity)) - ATTRIB(XonoticInputSettingsTab, title, string, _("Input")) ATTRIB(XonoticInputSettingsTab, intendedWidth, float, 0.9) ATTRIB(XonoticInputSettingsTab, rows, float, 15.5) ATTRIB(XonoticInputSettingsTab, columns, float, 6.2) // added extra .2 for center space diff --git a/qcsrc/menu/xonotic/dialog_settings_misc.qc b/qcsrc/menu/xonotic/dialog_settings_misc.qc index 95f218b0e9..79e1961706 100644 --- a/qcsrc/menu/xonotic/dialog_settings_misc.qc +++ b/qcsrc/menu/xonotic/dialog_settings_misc.qc @@ -3,7 +3,6 @@ #include "tab.qc" CLASS(XonoticMiscSettingsTab, XonoticTab) METHOD(XonoticMiscSettingsTab, fill, void(entity)) - ATTRIB(XonoticMiscSettingsTab, title, string, _("Misc")) ATTRIB(XonoticMiscSettingsTab, intendedWidth, float, 0.9) ATTRIB(XonoticMiscSettingsTab, rows, float, 15.5) ATTRIB(XonoticMiscSettingsTab, columns, float, 6.2) diff --git a/qcsrc/menu/xonotic/dialog_settings_user.qc b/qcsrc/menu/xonotic/dialog_settings_user.qc index e9ad109c41..35246ae170 100644 --- a/qcsrc/menu/xonotic/dialog_settings_user.qc +++ b/qcsrc/menu/xonotic/dialog_settings_user.qc @@ -3,7 +3,6 @@ #include "tab.qc" CLASS(XonoticUserSettingsTab, XonoticTab) METHOD(XonoticUserSettingsTab, fill, void(entity)) - ATTRIB(XonoticUserSettingsTab, title, string, _("User")) ATTRIB(XonoticUserSettingsTab, intendedWidth, float, 0.9) ATTRIB(XonoticUserSettingsTab, rows, float, 15.5) ATTRIB(XonoticUserSettingsTab, columns, float, 6) diff --git a/qcsrc/menu/xonotic/dialog_settings_video.qc b/qcsrc/menu/xonotic/dialog_settings_video.qc index 9b77e40a64..61a93f62e2 100644 --- a/qcsrc/menu/xonotic/dialog_settings_video.qc +++ b/qcsrc/menu/xonotic/dialog_settings_video.qc @@ -3,7 +3,6 @@ #include "tab.qc" CLASS(XonoticVideoSettingsTab, XonoticTab) METHOD(XonoticVideoSettingsTab, fill, void(entity)) - ATTRIB(XonoticVideoSettingsTab, title, string, _("Video")) ATTRIB(XonoticVideoSettingsTab, intendedWidth, float, 0.9) ATTRIB(XonoticVideoSettingsTab, rows, float, 15.5) ATTRIB(XonoticVideoSettingsTab, columns, float, 6.2) // added extra .2 for center space diff --git a/qcsrc/menu/xonotic/gametypelist.qc b/qcsrc/menu/xonotic/gametypelist.qc index d8dbc8838e..26845f0946 100644 --- a/qcsrc/menu/xonotic/gametypelist.qc +++ b/qcsrc/menu/xonotic/gametypelist.qc @@ -4,7 +4,7 @@ CLASS(XonoticGametypeList, XonoticListBox) METHOD(XonoticGametypeList, configureXonoticGametypeList, void(entity)) ATTRIB(XonoticGametypeList, rowsPerItem, float, 2) - METHOD(XonoticGametypeList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticGametypeList, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticGametypeList, resizeNotify, void(entity, vector, vector, vector, vector)) METHOD(XonoticGametypeList, setSelected, void(entity, float)) METHOD(XonoticGametypeList, loadCvars, void(entity)) @@ -78,12 +78,17 @@ void XonoticGametypeList_saveCvars(entity me) owner.gameTypeChangeNotify(owner); } } -void XonoticGametypeList_drawListBoxItem(entity me, float i, vector absSize, float isSelected) +void XonoticGametypeList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { string s1, s2; if(isSelected) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); + else if(isFocused) + { + me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); + } draw_Picture(me.columnIconOrigin * eX, GameType_GetIcon(i), me.columnIconSize * eX + eY, '1 1 1', SKINALPHA_LISTBOX_SELECTED); s1 = GameType_GetName(i); diff --git a/qcsrc/menu/xonotic/keybinder.qc b/qcsrc/menu/xonotic/keybinder.qc index 82d3db4e5d..8953b1db9b 100644 --- a/qcsrc/menu/xonotic/keybinder.qc +++ b/qcsrc/menu/xonotic/keybinder.qc @@ -4,7 +4,7 @@ CLASS(XonoticKeyBinder, XonoticListBox) METHOD(XonoticKeyBinder, configureXonoticKeyBinder, void(entity)) ATTRIB(XonoticKeyBinder, rowsPerItem, int, 1) - METHOD(XonoticKeyBinder, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticKeyBinder, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticKeyBinder, doubleClickListBoxItem, void(entity, float, vector)) METHOD(XonoticKeyBinder, resizeNotify, void(entity, vector, vector, vector, vector)) METHOD(XonoticKeyBinder, setSelected, void(entity, float)) @@ -302,7 +302,7 @@ float XonoticKeyBinder_keyDown(entity me, int key, bool ascii, float shift) } return r; } -void XonoticKeyBinder_drawListBoxItem(entity me, int i, vector absSize, bool isSelected) +void XonoticKeyBinder_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { string s; int j, n; @@ -331,6 +331,12 @@ void XonoticKeyBinder_drawListBoxItem(entity me, int i, vector absSize, bool isS else draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); } + else if(isFocused) + { + me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); + } + theAlpha = SKINALPHA_KEYGRABBER_KEYS; theColor = SKINCOLOR_KEYGRABBER_KEYS; extraMargin = me.realFontSize.x * 0.5; diff --git a/qcsrc/menu/xonotic/languagelist.qc b/qcsrc/menu/xonotic/languagelist.qc index 367da94dfb..af9d75211b 100644 --- a/qcsrc/menu/xonotic/languagelist.qc +++ b/qcsrc/menu/xonotic/languagelist.qc @@ -4,7 +4,7 @@ CLASS(XonoticLanguageList, XonoticListBox) METHOD(XonoticLanguageList, configureXonoticLanguageList, void(entity)) ATTRIB(XonoticLanguageList, rowsPerItem, float, 1) - METHOD(XonoticLanguageList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticLanguageList, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticLanguageList, resizeNotify, void(entity, vector, vector, vector, vector)) METHOD(XonoticLanguageList, setSelected, void(entity, float)) METHOD(XonoticLanguageList, loadCvars, void(entity)) @@ -57,11 +57,16 @@ void XonoticLanguageList_configureXonoticLanguageList(entity me) me.loadCvars(me); } -void XonoticLanguageList_drawListBoxItem(entity me, float i, vector absSize, float isSelected) +void XonoticLanguageList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { string s, p; if(isSelected) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); + else if(isFocused) + { + me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); + } s = me.languageParameter(me, i, LANGPARM_NAME_LOCALIZED); diff --git a/qcsrc/menu/xonotic/mainwindow.qc b/qcsrc/menu/xonotic/mainwindow.qc index 76e71381d3..7af6e9363d 100644 --- a/qcsrc/menu/xonotic/mainwindow.qc +++ b/qcsrc/menu/xonotic/mainwindow.qc @@ -62,79 +62,75 @@ void MainWindow_configureMainWindow(entity me) i = NEW(XonoticHUDNotificationDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDAmmoDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDHealthArmorDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDChatDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDModIconsDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDPowerupsDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDPressedKeysDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDRaceTimerDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDRadarDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDScoreDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDTimerDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDVoteDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDWeaponsDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDEngineInfoDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDInfoMessagesDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDPhysicsDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); - - me.screenshotViewerDialog = i = NEW(XonoticScreenshotViewerDialog); - i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDCenterprintDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); i = NEW(XonoticHUDBuffsDialog); i.configureDialog(i); - me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + me.addItemRightCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); // dialogs used by settings @@ -188,6 +184,13 @@ void MainWindow_configureMainWindow(entity me) i.configureDialog(i); me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + + // dialogs used by multiplayer/media + me.screenshotViewerDialog = i = NEW(XonoticScreenshotViewerDialog); + i.configureDialog(i); + me.addItemCentered(me, i, i.intendedWidth * eX + i.intendedHeight * eY, SKINALPHAS_MAINMENU_z); + + // mutator dialogs i = NEW(XonoticSandboxToolsDialog); i.configureDialog(i); diff --git a/qcsrc/menu/xonotic/maplist.qc b/qcsrc/menu/xonotic/maplist.qc index ec9aa1f4c7..f2749abb5c 100644 --- a/qcsrc/menu/xonotic/maplist.qc +++ b/qcsrc/menu/xonotic/maplist.qc @@ -5,7 +5,7 @@ CLASS(XonoticMapList, XonoticListBox) METHOD(XonoticMapList, configureXonoticMapList, void(entity)) ATTRIB(XonoticMapList, rowsPerItem, float, 4) METHOD(XonoticMapList, draw, void(entity)) - METHOD(XonoticMapList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticMapList, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticMapList, clickListBoxItem, void(entity, float, vector)) METHOD(XonoticMapList, doubleClickListBoxItem, void(entity, float, vector)) METHOD(XonoticMapList, resizeNotify, void(entity, vector, vector, vector, vector)) @@ -161,7 +161,7 @@ void XonoticMapList_doubleClickListBoxItem(entity me, float i, vector where) } } -void XonoticMapList_drawListBoxItem(entity me, float i, vector absSize, float isSelected) +void XonoticMapList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { // layout: Ping, Map name, Map name, NP, TP, MP string s; @@ -179,8 +179,16 @@ void XonoticMapList_drawListBoxItem(entity me, float i, vector absSize, float is if(isSelected) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); - else if(included) - draw_Fill('0 0 0', '1 1 0', SKINCOLOR_MAPLIST_INCLUDEDBG, SKINALPHA_MAPLIST_INCLUDEDBG); + else + { + if(included) + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_MAPLIST_INCLUDEDBG, SKINALPHA_MAPLIST_INCLUDEDBG); + if(isFocused) + { + me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); + } + } if(draw_PictureSize(strcat("/maps/", MapInfo_Map_bspname)) == '0 0 0') draw_Picture(me.columnPreviewOrigin * eX, "nopreview_map", me.columnPreviewSize * eX + eY, '1 1 1', theAlpha); diff --git a/qcsrc/menu/xonotic/picker.qc b/qcsrc/menu/xonotic/picker.qc new file mode 100644 index 0000000000..dd574676e0 --- /dev/null +++ b/qcsrc/menu/xonotic/picker.qc @@ -0,0 +1,207 @@ +#ifndef PICKER_H +#define PICKER_H +#include "../item.qc" +CLASS(XonoticPicker, Item) + METHOD(XonoticPicker, configureXonoticPicker, void(entity)) + METHOD(XonoticPicker, mousePress, float(entity, vector)) + METHOD(XonoticPicker, mouseRelease, float(entity, vector)) + METHOD(XonoticPicker, mouseMove, float(entity, vector)) + METHOD(XonoticPicker, mouseDrag, float(entity, vector)) + METHOD(XonoticPicker, keyDown, float(entity, float, float, float)) + METHOD(XonoticPicker, draw, void(entity)) + ATTRIB(XonoticPicker, focusable, float, 1) + ATTRIB(XonoticPicker, disabled, float, 0) + ATTRIB(XonoticPicker, alpha, float, 1) + ATTRIB(XonoticPicker, disabledAlpha, float, SKINALPHA_DISABLED) + + ATTRIB(XonoticPicker, rows, float, 3) + ATTRIB(XonoticPicker, columns, float, 2) + + METHOD(XonoticPicker, moveFocus, void(entity, vector, vector)) + METHOD(XonoticPicker, cellSelect, void(entity, vector)) + METHOD(XonoticPicker, cellDraw, void(entity, vector, vector)) + METHOD(XonoticPicker, cellIsValid, bool(entity, vector)) + ATTRIB(XonoticPicker, realCellSize, vector, '0 0 0') + ATTRIB(XonoticPicker, selectedCell, vector, '-1 -1 0') + ATTRIB(XonoticPicker, focusedCell, vector, '-1 -1 0') + ATTRIB(XonoticPicker, focusedCellAlpha, float, 0) + ATTRIB(XonoticPicker, focusedCellTime, float, 0) + ATTRIB(XonoticPicker, pressedCell, vector, '-1 -1 0') +ENDCLASS(XonoticPicker) +entity makeXonoticPicker(); +#endif + +#ifdef IMPLEMENTATION + +entity makeXonoticPicker() +{ + entity me; + me = NEW(XonoticPicker); + me.configureXonoticPicker(me); + return me; +} + +void XonoticPicker_configureXonoticPicker(entity me) +{ + me.realCellSize = eX / me.columns + eY / me.rows; +} + +float XonoticPicker_mouseMove(entity me, vector coords) +{ + vector prevFocusedCell = me.focusedCell; + me.focusedCell_x = floor(coords.x * me.columns); + me.focusedCell_y = floor(coords.y * me.rows); + + if(me.focusedCell.x < 0 || me.focusedCell.y < 0 || + me.focusedCell.x >= me.columns || me.focusedCell.y >= me.rows) + { + me.focusedCell = '-1 -1 0'; + return 0; + } + + if(me.focusedCell != prevFocusedCell) + me.focusedCellAlpha = SKINALPHA_LISTBOX_FOCUSED; + + return 1; +} + +float XonoticPicker_mouseDrag(entity me, vector coords) +{ + return me.mouseMove(me, coords); +} + +float XonoticPicker_mousePress(entity me, vector coords) +{ + me.mouseMove(me, coords); + + if(me.focusedCell.x >= 0) + { + me.pressed = 1; + me.pressedCell = me.focusedCell; + } + + return 1; +} + +float XonoticPicker_mouseRelease(entity me, vector coords) +{ + if(!me.pressed) + return 0; + + me.mouseMove(me, coords); + + if(me.focusedCell == me.pressedCell) + me.cellSelect(me, me.focusedCell); + + me.pressed = 0; + return 1; +} + +float XonoticPicker_keyDown(entity me, float key, float ascii, float shift) +{ + switch(key) + { + case K_END: + case K_KP_END: + // lower left cell then left arrow to select the last valid cell + me.focusedCell = eY * (me.rows - 1); + case K_LEFTARROW: + case K_KP_LEFTARROW: + me.moveFocus(me, me.focusedCell, '-1 0 0'); + return 1; + case K_HOME: + case K_KP_HOME: + // upper right cell then right arrow to select the first valid cell + me.focusedCell = eX * (me.columns - 1); + case K_RIGHTARROW: + case K_KP_RIGHTARROW: + me.moveFocus(me, me.focusedCell, '1 0 0'); + return 1; + case K_UPARROW: + case K_KP_UPARROW: + me.moveFocus(me, me.focusedCell, '0 -1 0'); + return 1; + case K_DOWNARROW: + case K_KP_DOWNARROW: + me.moveFocus(me, me.focusedCell, '0 1 0'); + return 1; + case K_ENTER: + case K_KP_ENTER: + case K_INS: + case K_KP_INS: + me.cellSelect(me, me.focusedCell); + return 1; + } + return 0; +} + +void XonoticPicker_moveFocus(entity me, vector initialCell, vector step) +{ + me.focusedCell_x = mod(me.focusedCell.x + step.x + me.columns, me.columns); + me.focusedCell_y = mod(me.focusedCell.y + step.y + me.rows, me.rows); + + if(me.focusedCell != initialCell) // Recursion break + if(!me.cellIsValid(me, me.focusedCell)) + me.moveFocus(me, initialCell, step); + + me.focusedCellAlpha = SKINALPHA_LISTBOX_FOCUSED; +} + +void XonoticPicker_cellSelect(entity me, vector cell) +{ + me.selectedCell = cell; +} + +bool XonoticPicker_cellIsValid(entity me, vector cell) +{ + return true; +} + +void XonoticPicker_cellDraw(entity me, vector cell, vector cellPos) +{ +} + +void XonoticPicker_draw(entity me) +{ + float save; + + me.focusable = !me.disabled; + + save = draw_alpha; + if(me.disabled) + draw_alpha *= me.disabledAlpha; + + vector cell, cellPos; + cell = '0 0 0'; + cellPos = '0 0 0'; + + for(cell_y = 0; cell.y < me.rows; ++cell.y) + { + cellPos_y = mod(cell.y, me.rows) / me.rows; + for(cell_x = 0; cell.x < me.columns; ++cell.x) + { + if(!me.cellIsValid(me, cell)) + continue; + + cellPos_x = mod(cell.x, me.columns) / me.columns; + + if(cell == me.selectedCell) + draw_Fill(cellPos, me.realCellSize, SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); + else if(cell == me.focusedCell && me.focused) + { + if(!me.pressed || me.focusedCell == me.pressedCell) + { + me.focusedCellAlpha = getFadedAlpha(me.focusedCellAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill(cellPos, me.realCellSize, SKINCOLOR_LISTBOX_FOCUSED, me.focusedCellAlpha); + } + } + + me.cellDraw(me, cell, cellPos); + } + } + + draw_alpha = save; + + SUPER(XonoticPicker).draw(me); +} +#endif diff --git a/qcsrc/menu/xonotic/playerlist.qc b/qcsrc/menu/xonotic/playerlist.qc index 437206b881..db3ac8a207 100644 --- a/qcsrc/menu/xonotic/playerlist.qc +++ b/qcsrc/menu/xonotic/playerlist.qc @@ -4,7 +4,7 @@ CLASS(XonoticPlayerList, XonoticListBox) ATTRIB(XonoticPlayerList, rowsPerItem, float, 1) METHOD(XonoticPlayerList, resizeNotify, void(entity, vector, vector, vector, vector)) - METHOD(XonoticPlayerList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticPlayerList, drawListBoxItem, void(entity, int, vector, bool, bool)) ATTRIB(XonoticPlayerList, allowFocusSound, float, 0) ATTRIB(XonoticPlayerList, realFontSize, vector, '0 0 0') ATTRIB(XonoticPlayerList, columnNameOrigin, float, 0) @@ -94,7 +94,7 @@ void XonoticPlayerList_resizeNotify(entity me, vector relOrigin, vector relSize, me.columnScoreOrigin = me.columnNameOrigin + me.columnNameSize + me.realFontSize.x; } -void XonoticPlayerList_drawListBoxItem(entity me, float i, vector absSize, float isSelected) +void XonoticPlayerList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { string s; string score; diff --git a/qcsrc/menu/xonotic/playlist.qc b/qcsrc/menu/xonotic/playlist.qc index e912f8f081..5dd7b6b926 100644 --- a/qcsrc/menu/xonotic/playlist.qc +++ b/qcsrc/menu/xonotic/playlist.qc @@ -6,7 +6,7 @@ CLASS(XonoticPlayList, XonoticListBox) ATTRIB(XonoticPlayList, rowsPerItem, float, 1) METHOD(XonoticPlayList, resizeNotify, void(entity, vector, vector, vector, vector)) METHOD(XonoticPlayList, draw, void(entity)) - METHOD(XonoticPlayList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticPlayList, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticPlayList, stopSound, void(entity)) METHOD(XonoticPlayList, startSound, void(entity, float)) METHOD(XonoticPlayList, resumeSound, void(entity)) @@ -172,11 +172,16 @@ void XonoticPlayList_draw(entity me) SUPER(XonoticPlayList).draw(me); } -void XonoticPlayList_drawListBoxItem(entity me, float i, vector absSize, float isSelected) +void XonoticPlayList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { string s; if(isSelected) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); + else if(isFocused) + { + me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); + } if(i == me.playingTrack) { diff --git a/qcsrc/menu/xonotic/screenshotlist.qc b/qcsrc/menu/xonotic/screenshotlist.qc index 650b3381fd..d6fcaf86e3 100644 --- a/qcsrc/menu/xonotic/screenshotlist.qc +++ b/qcsrc/menu/xonotic/screenshotlist.qc @@ -7,7 +7,7 @@ CLASS(XonoticScreenshotList, XonoticListBox) METHOD(XonoticScreenshotList, resizeNotify, void(entity, vector, vector, vector, vector)) METHOD(XonoticScreenshotList, setSelected, void(entity, float)) METHOD(XonoticScreenshotList, draw, void(entity)) - METHOD(XonoticScreenshotList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticScreenshotList, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticScreenshotList, getScreenshots, void(entity)) METHOD(XonoticScreenshotList, previewScreenshot, void(entity)) METHOD(XonoticScreenshotList, startScreenshot, void(entity)) @@ -167,11 +167,16 @@ void XonoticScreenshotList_setSelected(entity me, float i) } } -void XonoticScreenshotList_drawListBoxItem(entity me, float i, vector absSize, float isSelected) +void XonoticScreenshotList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { string s; if(isSelected) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); + else if(isFocused) + { + me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); + } s = me.screenshotName(me,i); s = draw_TextShortenToWidth(s, me.columnNameSize, 0, me.realFontSize); diff --git a/qcsrc/menu/xonotic/serverlist.qc b/qcsrc/menu/xonotic/serverlist.qc index 3f9648be66..8bf70cc333 100644 --- a/qcsrc/menu/xonotic/serverlist.qc +++ b/qcsrc/menu/xonotic/serverlist.qc @@ -5,7 +5,7 @@ CLASS(XonoticServerList, XonoticListBox) METHOD(XonoticServerList, configureXonoticServerList, void(entity)) ATTRIB(XonoticServerList, rowsPerItem, float, 1) METHOD(XonoticServerList, draw, void(entity)) - METHOD(XonoticServerList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticServerList, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticServerList, doubleClickListBoxItem, void(entity, float, vector)) METHOD(XonoticServerList, resizeNotify, void(entity, vector, vector, vector, vector)) METHOD(XonoticServerList, keyDown, float(entity, float, float, float)) @@ -963,7 +963,7 @@ void XonoticServerList_doubleClickListBoxItem(entity me, int i, vector where) { ServerList_Connect_Click(NULL, me); } -void XonoticServerList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected) +void XonoticServerList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { // layout: Ping, Server name, Map name, NP, TP, MP float p; @@ -1019,6 +1019,11 @@ void XonoticServerList_drawListBoxItem(entity me, int i, vector absSize, bool is if(isSelected) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); + else if(isFocused) + { + me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); + } s = gethostcachestring(SLIST_FIELD_QCSTATUS, i); m = tokenizebyseparator(s, ":"); diff --git a/qcsrc/menu/xonotic/skinlist.qc b/qcsrc/menu/xonotic/skinlist.qc index 936ca7baf1..46babc3f95 100644 --- a/qcsrc/menu/xonotic/skinlist.qc +++ b/qcsrc/menu/xonotic/skinlist.qc @@ -5,7 +5,7 @@ CLASS(XonoticSkinList, XonoticListBox) METHOD(XonoticSkinList, configureXonoticSkinList, void(entity)) ATTRIB(XonoticSkinList, rowsPerItem, float, 4) METHOD(XonoticSkinList, resizeNotify, void(entity, vector, vector, vector, vector)) - METHOD(XonoticSkinList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticSkinList, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticSkinList, getSkins, void(entity)) METHOD(XonoticSkinList, setSkin, void(entity)) METHOD(XonoticSkinList, loadCvars, void(entity)) @@ -151,12 +151,17 @@ void XonoticSkinList_resizeNotify(entity me, vector relOrigin, vector relSize, v me.columnNameSize = 1 - me.columnPreviewSize - 2 * me.realFontSize.x; } -void XonoticSkinList_drawListBoxItem(entity me, float i, vector absSize, float isSelected) +void XonoticSkinList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { string s; if(isSelected) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); + else if(isFocused) + { + me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); + } s = me.skinParameter(me, i, SKINPARM_PREVIEW); draw_Picture(me.columnPreviewOrigin * eX, s, me.columnPreviewSize * eX + eY, '1 1 1', 1); diff --git a/qcsrc/menu/xonotic/soundlist.qc b/qcsrc/menu/xonotic/soundlist.qc index bba66d19d1..2b98c5fe52 100644 --- a/qcsrc/menu/xonotic/soundlist.qc +++ b/qcsrc/menu/xonotic/soundlist.qc @@ -5,7 +5,7 @@ CLASS(XonoticSoundList, XonoticListBox) METHOD(XonoticSoundList, configureXonoticSoundList, void(entity)) ATTRIB(XonoticSoundList, rowsPerItem, float, 1) METHOD(XonoticSoundList, resizeNotify, void(entity, vector, vector, vector, vector)) - METHOD(XonoticSoundList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticSoundList, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticSoundList, getSounds, void(entity)) METHOD(XonoticSoundList, soundName, string(entity, float)) METHOD(XonoticSoundList, doubleClickListBoxItem, void(entity, float, vector)) @@ -103,11 +103,16 @@ void XonoticSoundList_resizeNotify(entity me, vector relOrigin, vector relSize, me.columnNameSize = 1 - me.columnNameOrigin - me.realFontSize.x; } -void XonoticSoundList_drawListBoxItem(entity me, float i, vector absSize, float isSelected) +void XonoticSoundList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { string s; if(isSelected) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); + else if(isFocused) + { + me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); + } s = me.soundName(me,i); if(s == cvar_string("menu_cdtrack")) // current menu track diff --git a/qcsrc/menu/xonotic/statslist.qc b/qcsrc/menu/xonotic/statslist.qc index 1cf4a688e0..d9a22ec6e7 100644 --- a/qcsrc/menu/xonotic/statslist.qc +++ b/qcsrc/menu/xonotic/statslist.qc @@ -8,7 +8,7 @@ CLASS(XonoticStatsList, XonoticListBox) METHOD(XonoticStatsList, configureXonoticStatsList, void(entity)) ATTRIB(XonoticStatsList, rowsPerItem, float, 1.4) METHOD(XonoticStatsList, resizeNotify, void(entity, vector, vector, vector, vector)) - METHOD(XonoticStatsList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticStatsList, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticStatsList, getStats, void(entity)) METHOD(XonoticStatsList, doubleClickListBoxItem, void(entity, float, vector)) METHOD(XonoticStatsList, keyDown, float(entity, float, float, float)) @@ -315,10 +315,15 @@ void XonoticStatsList_resizeNotify(entity me, vector relOrigin, vector relSize, #endif } -void XonoticStatsList_drawListBoxItem(entity me, float i, vector absSize, float isSelected) +void XonoticStatsList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { if(isSelected) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); + else if(isFocused) + { + me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); + } string data = bufstr_get(me.listStats, i); string s = car(data); diff --git a/qcsrc/menu/xonotic/tab.qc b/qcsrc/menu/xonotic/tab.qc index a90e276529..0383c7aae6 100644 --- a/qcsrc/menu/xonotic/tab.qc +++ b/qcsrc/menu/xonotic/tab.qc @@ -17,7 +17,6 @@ CLASS(XonoticTab, Tab) ATTRIB(XonoticTab, columnSpacing, float, SKINMARGIN_COLUMNS) // pixels ATTRIB(XonoticTab, rowSpacing, float, SKINMARGIN_ROWS) // pixels ATTRIB(XonoticTab, rowHeight, float, SKINFONTSIZE_NORMAL * SKINHEIGHT_NORMAL) // pixels - ATTRIB(XonoticTab, titleHeight, float, SKINFONTSIZE_TITLE * SKINHEIGHT_TITLE) // pixels ATTRIB(XonoticTab, backgroundImage, string, string_null) ENDCLASS(XonoticTab) diff --git a/qcsrc/menu/xonotic/util.qc b/qcsrc/menu/xonotic/util.qc index 444292712d..216b57585e 100644 --- a/qcsrc/menu/xonotic/util.qc +++ b/qcsrc/menu/xonotic/util.qc @@ -797,6 +797,15 @@ void dialog_hudpanel_common_notoggle(entity me, string panelname) e.configureXonoticTextSliderValues(e); } +float getFadedAlpha(float currentAlpha, float startAlpha, float targetAlpha) +{ + if(startAlpha < targetAlpha) + currentAlpha = min(currentAlpha + frametime * 0.5, targetAlpha); + else + currentAlpha = max(currentAlpha - frametime * 0.5, targetAlpha); + return currentAlpha; +} + void CheckSendCvars(entity me, string cvarnamestring) { if(me.sendCvars) diff --git a/qcsrc/menu/xonotic/util.qh b/qcsrc/menu/xonotic/util.qh index 80803f8544..2564a86ed4 100644 --- a/qcsrc/menu/xonotic/util.qh +++ b/qcsrc/menu/xonotic/util.qh @@ -48,6 +48,8 @@ void dialog_hudpanel_common_notoggle(entity me, string panelname); me.TD(me, 1, 4, e = makeXonoticCheckBox(0, strzone(strcat("hud_panel_", panelname)), _("Enable panel"))); \ DIALOG_HUDPANEL_COMMON_NOTOGGLE() +float getFadedAlpha(float currentAlpha, float startAlpha, float targetAlpha); + string _Nex_ExtResponseSystem_BannedServers; float _Nex_ExtResponseSystem_BannedServersNeedsRefresh; string _Nex_ExtResponseSystem_PromotedServers; diff --git a/qcsrc/menu/xonotic/weaponslist.qc b/qcsrc/menu/xonotic/weaponslist.qc index 622505af83..adc7fc2115 100644 --- a/qcsrc/menu/xonotic/weaponslist.qc +++ b/qcsrc/menu/xonotic/weaponslist.qc @@ -6,7 +6,7 @@ CLASS(XonoticWeaponsList, XonoticListBox) METHOD(XonoticWeaponsList, toString, string(entity)) ATTRIB(XonoticWeaponsList, rowsPerItem, float, 1) METHOD(XonoticWeaponsList, draw, void(entity)) - METHOD(XonoticWeaponsList, drawListBoxItem, void(entity, float, vector, float)) + METHOD(XonoticWeaponsList, drawListBoxItem, void(entity, int, vector, bool, bool)) METHOD(XonoticWeaponsList, resizeNotify, void(entity, vector, vector, vector, vector)) METHOD(XonoticWeaponsList, keyDown, float(entity, float, float, float)) ATTRIB(XonoticWeaponsList, realFontSize, vector, '0 0 0') @@ -92,11 +92,16 @@ string XonoticWeaponsList_toString(entity me) } return substring(s, 0, strlen(s) - 2); } -void XonoticWeaponsList_drawListBoxItem(entity me, float i, vector absSize, float isSelected) +void XonoticWeaponsList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused) { entity e; if(isSelected) draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED); + else if(isFocused) + { + me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED); + draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha); + } e = get_weaponinfo(stof(argv(i))); string msg = e.message; if(e.spawnflags & WEP_FLAG_MUTATORBLOCKED) diff --git a/qcsrc/server/_all.qh b/qcsrc/server/_all.qh index 6438a1094a..a331362151 100644 --- a/qcsrc/server/_all.qh +++ b/qcsrc/server/_all.qh @@ -1,5 +1,5 @@ -#ifndef SERVER___H -#define SERVER___H +#ifndef SERVER_ALL_H +#define SERVER_ALL_H #include "autocvars.qh" #include "constants.qh" diff --git a/qcsrc/server/bot/bot.qc b/qcsrc/server/bot/bot.qc index 1879b18604..e42a50f6d4 100644 --- a/qcsrc/server/bot/bot.qc +++ b/qcsrc/server/bot/bot.qc @@ -27,7 +27,7 @@ #include "../../common/teams.qh" #include "../../common/util.qh" -#include "../../common/weapons/weapons.qh" +#include "../../common/weapons/all.qh" #include "../../csqcmodellib/sv_model.qh" diff --git a/qcsrc/server/cheats.qc b/qcsrc/server/cheats.qc index 75a93d267d..d9eb759150 100644 --- a/qcsrc/server/cheats.qc +++ b/qcsrc/server/cheats.qc @@ -13,9 +13,9 @@ #include "../common/deathtypes.qh" #include "../common/util.qh" -#include "../common/monsters/monsters.qh" +#include "../common/monsters/all.qh" -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" #include "../csqcmodellib/sv_model.qh" diff --git a/qcsrc/server/cl_client.qc b/qcsrc/server/cl_client.qc index 259b7e260c..b73eebbf4a 100644 --- a/qcsrc/server/cl_client.qc +++ b/qcsrc/server/cl_client.qc @@ -35,6 +35,8 @@ #include "../common/net_notice.qh" +#include "../common/items/inventory.qh" + #include "../common/monsters/sv_monsters.qh" #include "../warpzonelib/server.qh" @@ -1096,6 +1098,7 @@ void ClientConnect (void) PlayerScore_Attach(self); ClientData_Attach(); accuracy_init(self); + Inventory_new(self); bot_clientconnect(); @@ -1338,6 +1341,7 @@ void ClientDisconnect (void) bot_relinkplayerlist(); accuracy_free(self); + Inventory_delete(self); ClientData_Detach(); PlayerScore_Detach(self); diff --git a/qcsrc/server/cl_impulse.qc b/qcsrc/server/cl_impulse.qc index a02cf40aca..bb4c171c87 100644 --- a/qcsrc/server/cl_impulse.qc +++ b/qcsrc/server/cl_impulse.qc @@ -13,7 +13,7 @@ #include "vehicles/vehicle.qh" #include "waypointsprites.qh" -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" /* * Impulse map: diff --git a/qcsrc/server/cl_physics.qc b/qcsrc/server/cl_physics.qc index bbb730d310..67c57ae16d 100644 --- a/qcsrc/server/cl_physics.qc +++ b/qcsrc/server/cl_physics.qc @@ -13,7 +13,7 @@ #include "../common/util.qh" #include "../common/animdecide.qh" #include "../common/monsters/sv_monsters.qh" - #include "../common/weapons/weapons.qh" + #include "../common/weapons/all.qh" #include "t_items.qh" #include "autocvars.qh" #include "defs.qh" diff --git a/qcsrc/server/command/all.qc b/qcsrc/server/command/all.qc new file mode 100644 index 0000000000..ac37b6b2ce --- /dev/null +++ b/qcsrc/server/command/all.qc @@ -0,0 +1,10 @@ +#include "../../common/command/all.qc" + +#include "sv_cmd.qc" + +#include "banning.qc" +#include "cmd.qc" +#include "common.qc" +#include "getreplies.qc" +#include "radarmap.qc" +#include "vote.qc" diff --git a/qcsrc/server/command/all.qh b/qcsrc/server/command/all.qh new file mode 100644 index 0000000000..af87c24b1a --- /dev/null +++ b/qcsrc/server/command/all.qh @@ -0,0 +1,15 @@ +#ifndef SERVER_COMMANDS_ALL_H +#define SERVER_COMMANDS_ALL_H + +#include "../../common/command/commands.qh" + +#include "sv_cmd.qh" + +#include "banning.qh" +#include "cmd.qh" +#include "common.qh" +#include "getreplies.qh" +#include "radarmap.qh" +#include "vote.qh" + +#endif diff --git a/qcsrc/server/command/cmd.qc b/qcsrc/server/command/cmd.qc index d9eeea19eb..4548bbf9bb 100644 --- a/qcsrc/server/command/cmd.qc +++ b/qcsrc/server/command/cmd.qc @@ -27,7 +27,7 @@ #include "../../common/teams.qh" #include "../../common/util.qh" -#include "../../common/monsters/monsters.qh" +#include "../../common/monsters/all.qh" #include "../../common/monsters/spawn.qh" #include "../../common/monsters/sv_monsters.qh" diff --git a/qcsrc/server/command/commands.qc b/qcsrc/server/command/commands.qc deleted file mode 100644 index 1db4db181b..0000000000 --- a/qcsrc/server/command/commands.qc +++ /dev/null @@ -1,10 +0,0 @@ -#include "../../common/command/commands.qc" - -#include "sv_cmd.qc" - -#include "banning.qc" -#include "cmd.qc" -#include "common.qc" -#include "getreplies.qc" -#include "radarmap.qc" -#include "vote.qc" diff --git a/qcsrc/server/command/commands.qh b/qcsrc/server/command/commands.qh deleted file mode 100644 index d26468da2e..0000000000 --- a/qcsrc/server/command/commands.qh +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef SERVER_COMMANDS_H -#define SERVER_COMMANDS_H - -#include "../../common/command/commands.qh" - -#include "sv_cmd.qh" - -#include "banning.qh" -#include "cmd.qh" -#include "common.qh" -#include "getreplies.qh" -#include "radarmap.qh" -#include "vote.qh" - -#endif diff --git a/qcsrc/server/command/getreplies.qc b/qcsrc/server/command/getreplies.qc index 12a31ca653..543f1db152 100644 --- a/qcsrc/server/command/getreplies.qc +++ b/qcsrc/server/command/getreplies.qc @@ -9,7 +9,7 @@ #include "../../common/mapinfo.qh" #include "../../common/util.qh" -#include "../../common/monsters/monsters.qh" +#include "../../common/monsters/all.qh" // ========================================================= // Reply messages for common commands, re-worked by Samual diff --git a/qcsrc/server/command/vote.qc b/qcsrc/server/command/vote.qc index 72263dc1e3..4be48e124e 100644 --- a/qcsrc/server/command/vote.qc +++ b/qcsrc/server/command/vote.qc @@ -115,6 +115,13 @@ void Nagger_ReadyCounted() nagger.SendFlags |= 1; } +// If the vote_caller is still here, return their name, otherwise vote_caller_name +string OriginalCallerName() +{ + if (IS_REAL_CLIENT(vote_caller)) + return vote_caller.netname; + return vote_caller_name; +} // ======================= // Game logic for voting @@ -130,10 +137,12 @@ void VoteReset() { strunzone(vote_called_command); strunzone(vote_called_display); + strunzone(vote_caller_name); } vote_called = VOTE_NULL; vote_caller = world; + vote_caller_name = string_null; vote_endtime = 0; vote_called_command = string_null; @@ -147,7 +156,7 @@ void VoteReset() void VoteStop(entity stopper) { - bprint("\{1}^2* ^3", GetCallerName(stopper), "^2 stopped ^3", GetCallerName(vote_caller), "^2's vote\n"); + bprint("\{1}^2* ^3", GetCallerName(stopper), "^2 stopped ^3", OriginalCallerName(), "^2's vote\n"); if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vstop:", ftos(stopper.playerid))); } // Don't force them to wait for next vote, this way they can e.g. correct their vote. @@ -158,7 +167,7 @@ void VoteStop(entity stopper) void VoteAccept() { - bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2's vote for ^1", vote_called_display, "^2 was accepted\n"); + bprint("\{1}^2* ^3", OriginalCallerName(), "^2's vote for ^1", vote_called_display, "^2 was accepted\n"); if((vote_called == VOTE_MASTER) && vote_caller) vote_caller.vote_master = 1; @@ -173,14 +182,14 @@ void VoteAccept() void VoteReject() { - bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2's vote for ", vote_called_display, "^2 was rejected\n"); + bprint("\{1}^2* ^3", OriginalCallerName(), "^2's vote for ", vote_called_display, "^2 was rejected\n"); VoteReset(); Send_Notification(NOTIF_ALL, world, MSG_ANNCE, ANNCE_VOTE_FAIL); } void VoteTimeout() { - bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2's vote for ", vote_called_display, "^2 timed out\n"); + bprint("\{1}^2* ^3", OriginalCallerName(), "^2's vote for ", vote_called_display, "^2 timed out\n"); VoteReset(); Send_Notification(NOTIF_ALL, world, MSG_ANNCE, ANNCE_VOTE_FAIL); } @@ -821,6 +830,7 @@ void VoteCommand_call(float request, entity caller, float argc, string vote_comm else // everything went okay, continue with calling the vote { vote_caller = caller; // remember who called the vote + vote_caller_name = strzone(GetCallerName(vote_caller)); vote_called = VOTE_NORMAL; vote_called_command = strzone(vote_parsed_command); vote_called_display = strzone(vote_parsed_display); @@ -836,7 +846,7 @@ void VoteCommand_call(float request, entity caller, float argc, string vote_comm FOR_EACH_REALCLIENT(tmp_player) { ++tmp_playercount; } if(tmp_playercount > 1) { Send_Notification(NOTIF_ALL, world, MSG_ANNCE, ANNCE_VOTE_CALL); } // don't announce a "vote now" sound if player is alone - bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2 calls a vote for ", vote_called_display, "\n"); + bprint("\{1}^2* ^3", OriginalCallerName(), "^2 calls a vote for ", vote_called_display, "\n"); if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vcall:", ftos(vote_caller.playerid), ":", vote_called_display)); } Nagger_VoteChanged(); VoteCount(true); // needed if you are the only one @@ -917,6 +927,7 @@ void VoteCommand_master(float request, entity caller, float argc, string vote_co else // everything went okay, continue with creating vote { vote_caller = caller; + vote_caller_name = strzone(GetCallerName(vote_caller)); vote_called = VOTE_MASTER; vote_called_command = strzone("XXX"); vote_called_display = strzone("^3master"); @@ -925,7 +936,7 @@ void VoteCommand_master(float request, entity caller, float argc, string vote_co caller.vote_selection = VOTE_SELECT_ACCEPT; caller.vote_waittime = time + autocvar_sv_vote_wait; - bprint("\{1}^2* ^3", GetCallerName(vote_caller), "^2 calls a vote to become ^3master^2.\n"); + bprint("\{1}^2* ^3", OriginalCallerName(), "^2 calls a vote to become ^3master^2.\n"); if(autocvar_sv_eventlog) { GameLogEcho(strcat(":vote:vcall:", ftos(vote_caller.playerid), ":", vote_called_display)); } Nagger_VoteChanged(); VoteCount(true); // needed if you are the only one @@ -989,7 +1000,7 @@ void VoteCommand_status(float request, entity caller) // BOTH case CMD_REQUEST_COMMAND: { if(vote_called) - print_to(caller, strcat("^7Vote for ", vote_called_display, "^7 called by ^7", GetCallerName(vote_caller), "^7.")); + print_to(caller, strcat("^7Vote for ", vote_called_display, "^7 called by ^7", OriginalCallerName(), "^7.")); else print_to(caller, "^1No vote called."); diff --git a/qcsrc/server/command/vote.qh b/qcsrc/server/command/vote.qh index 3c2845451d..f80785e2a1 100644 --- a/qcsrc/server/command/vote.qh +++ b/qcsrc/server/command/vote.qh @@ -24,6 +24,7 @@ const float VOTE_MASTER = 2; // global vote information declarations entity vote_caller; // original caller of the current vote +string vote_caller_name; // name of the vote caller float vote_called; // stores status of current vote (See VOTE_*) float vote_endtime; // time when the vote is finished float vote_accept_count; // total amount of players who accept the vote (counted by VoteCount() function) diff --git a/qcsrc/server/defs.qh b/qcsrc/server/defs.qh index 49e340c497..2ac72548ee 100644 --- a/qcsrc/server/defs.qh +++ b/qcsrc/server/defs.qh @@ -1,7 +1,7 @@ #ifndef SERVER_DEFS_H #define SERVER_DEFS_H -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" #define INDEPENDENT_ATTACK_FINISHED diff --git a/qcsrc/server/g_damage.qc b/qcsrc/server/g_damage.qc index 1e7e72a125..24bce642d8 100644 --- a/qcsrc/server/g_damage.qc +++ b/qcsrc/server/g_damage.qc @@ -18,7 +18,7 @@ #include "../common/playerstats.qh" #include "../common/teams.qh" #include "../common/util.qh" -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" #include "../csqcmodellib/sv_model.qh" #include "../warpzonelib/common.qh" diff --git a/qcsrc/server/g_damage.qh b/qcsrc/server/g_damage.qh index 49f495bc4a..9dce060cc4 100644 --- a/qcsrc/server/g_damage.qh +++ b/qcsrc/server/g_damage.qh @@ -10,7 +10,7 @@ #include "../common/constants.qh" #include "../common/teams.qh" #include "../common/util.qh" - #include "../common/weapons/weapons.qh" + #include "../common/weapons/all.qh" #include "weapons/accuracy.qh" #include "weapons/csqcprojectile.qh" #include "weapons/selection.qh" diff --git a/qcsrc/server/g_hook.qc b/qcsrc/server/g_hook.qc index c101236f89..4a3f3101ac 100644 --- a/qcsrc/server/g_hook.qc +++ b/qcsrc/server/g_hook.qc @@ -12,7 +12,7 @@ #include "vehicles/vehicle.qh" #include "../common/constants.qh" #include "../common/util.qh" -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" #include "../warpzonelib/common.qh" #include "../warpzonelib/server.qh" diff --git a/qcsrc/server/g_world.qc b/qcsrc/server/g_world.qc index d32b8c9ab4..2c4c863ed3 100644 --- a/qcsrc/server/g_world.qc +++ b/qcsrc/server/g_world.qc @@ -25,14 +25,15 @@ #include "../common/constants.qh" #include "../common/deathtypes.qh" #include "../common/mapinfo.qh" -#include "../common/monsters/monsters.qh" +#include "../common/monsters/all.qh" #include "../common/monsters/sv_monsters.qh" #include "../common/notifications.qh" #include "../common/playerstats.qh" #include "../common/stats.qh" #include "../common/teams.qh" #include "../common/util.qh" -#include "../common/weapons/weapons.qh" +#include "../common/items/all.qh" +#include "../common/weapons/all.qh" const float LATENCY_THINKRATE = 10; .float latency_sum; @@ -188,6 +189,8 @@ void cvar_changes_init() BADCVAR("g_configversion"); BADCVAR("g_maplist_index"); BADCVAR("halflifebsp"); + BADCVAR("sv_mapformat_is_quake2"); + BADCVAR("sv_mapformat_is_quake3"); BADPREFIX("sv_world"); // client @@ -558,6 +561,7 @@ void spawnfunc___init_dedicated_server(void) // needs to be done so early because of the constants they create CALL_ACCUMULATED_FUNCTION(RegisterWeapons); CALL_ACCUMULATED_FUNCTION(RegisterMonsters); + CALL_ACCUMULATED_FUNCTION(RegisterItems); CALL_ACCUMULATED_FUNCTION(RegisterGametypes); CALL_ACCUMULATED_FUNCTION(RegisterNotifications); CALL_ACCUMULATED_FUNCTION(RegisterDeathtypes); @@ -606,6 +610,7 @@ void spawnfunc_worldspawn (void) // needs to be done so early because of the constants they create CALL_ACCUMULATED_FUNCTION(RegisterWeapons); CALL_ACCUMULATED_FUNCTION(RegisterMonsters); + CALL_ACCUMULATED_FUNCTION(RegisterItems); CALL_ACCUMULATED_FUNCTION(RegisterGametypes); CALL_ACCUMULATED_FUNCTION(RegisterNotifications); CALL_ACCUMULATED_FUNCTION(RegisterDeathtypes); diff --git a/qcsrc/server/item_key.qc b/qcsrc/server/item_key.qc index e0f79f1144..1aa054d07e 100644 --- a/qcsrc/server/item_key.qc +++ b/qcsrc/server/item_key.qc @@ -1,7 +1,7 @@ #include "item_key.qh" #include "_all.qh" -#include "../common/monsters/monsters.qh" +#include "../common/monsters/all.qh" #include "../common/notifications.qh" #include "../common/util.qh" #include "../warpzonelib/util_server.qh" diff --git a/qcsrc/server/miscfunctions.qc b/qcsrc/server/miscfunctions.qc index 41f388ed53..e8a1529e4e 100644 --- a/qcsrc/server/miscfunctions.qc +++ b/qcsrc/server/miscfunctions.qc @@ -21,7 +21,7 @@ #include "../common/teams.qh" #include "../common/urllib.qh" #include "../common/util.qh" -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" #include "../csqcmodellib/sv_model.qh" #include "../warpzonelib/anglestransform.qh" #include "../warpzonelib/server.qh" @@ -1270,7 +1270,7 @@ void SetCustomizer(entity e, float(void) customizer, void(void) uncustomizer) } -void Net_LinkEntity(entity e, float docull, float dt, bool(entity, int) sendfunc) +void Net_LinkEntity(entity e, bool docull, float dt, bool(entity, int) sendfunc) { vector mi, ma; diff --git a/qcsrc/server/miscfunctions.qh b/qcsrc/server/miscfunctions.qh index a8a9117d59..3acc883608 100644 --- a/qcsrc/server/miscfunctions.qh +++ b/qcsrc/server/miscfunctions.qh @@ -468,6 +468,6 @@ entity initialize_entity_first; float sound_allowed(float dest, entity e); void InitializeEntity(entity e, void(void) func, float order); void SetCustomizer(entity e, float(void) customizer, void(void) uncustomizer); -void Net_LinkEntity(entity e, float docull, float dt, float(entity, float) sendfunc); +void Net_LinkEntity(entity e, bool docull, float dt, bool(entity, int) sendfunc); #endif diff --git a/qcsrc/server/mutators/gamemode.qh b/qcsrc/server/mutators/gamemode.qh index 38e9ad8a3b..101bdece81 100644 --- a/qcsrc/server/mutators/gamemode.qh +++ b/qcsrc/server/mutators/gamemode.qh @@ -25,7 +25,7 @@ #include "../command/vote.qh" -#include "../../common/monsters/monsters.qh" +#include "../../common/monsters/all.qh" #include "../command/common.qh" diff --git a/qcsrc/server/mutators/mutator.qh b/qcsrc/server/mutators/mutator.qh index 6cded53660..d7474fab45 100644 --- a/qcsrc/server/mutators/mutator.qh +++ b/qcsrc/server/mutators/mutator.qh @@ -37,7 +37,7 @@ #include "../../common/stats.qh" #include "../../common/teams.qh" -#include "../../common/monsters/monsters.qh" +#include "../../common/monsters/all.qh" #include "../../warpzonelib/anglestransform.qh" #include "../../warpzonelib/mathlib.qh" diff --git a/qcsrc/server/mutators/mutator_instagib.qc b/qcsrc/server/mutators/mutator_instagib.qc index 2e6b195809..161dba90de 100644 --- a/qcsrc/server/mutators/mutator_instagib.qc +++ b/qcsrc/server/mutators/mutator_instagib.qc @@ -5,23 +5,61 @@ #include "../cl_client.qh" #include "../../common/buffs.qh" +#include "../../common/items/item.qh" + +#define WITH(it) this.m_##it; +#define CONFIGURE(...) MAP(WITH, __VA_ARGS__) + +float instagib_respawntime_ammo = 45; +float instagib_respawntimejitter_ammo = 0; +GETTER(float, instagib_respawntime_ammo) +GETTER(float, instagib_respawntimejitter_ammo) + +REGISTER_ITEM(VaporizerCells, Pickup, APPLY(UNWORDS + ,APPLY(CONFIGURE + , model = "models/items/a_cells.md3" + , sound = "misc/itempickup.wav" + , name = "Vaporizer Ammo" + ) + ,IF(SV, CONFIGURE + , botvalue = 100 + , itemid = IT_CELLS + , respawntime = GET(instagib_respawntime_ammo) + , respawntimejitter = GET(instagib_respawntimejitter_ammo) + ) +)) + +REGISTER_ITEM(ExtraLife, Pickup, APPLY(UNWORDS + ,APPLY(CONFIGURE + , model = "models/items/g_h100.md3" + , sound = "misc/megahealth.wav" + , name = "Extralife" + ) + ,IF(SV, CONFIGURE + , botvalue = BOT_PICKUP_RATING_HIGH + , itemflags = FL_POWERUP + , itemid = IT_NAILS + , respawntime = GET(g_pickup_respawntime_powerup) + , respawntimejitter = GET(g_pickup_respawntimejitter_powerup) + ) +)) + +#undef WITH +#undef CONFIGURE + void spawnfunc_item_minst_cells (void) { if (!g_instagib) { remove(self); return; } if (!self.ammo_cells) self.ammo_cells = autocvar_g_instagib_ammo_drop; - StartItem ("models/items/a_cells.md3", - "misc/itempickup.wav", 45, 0, - "Vaporizer Ammo", IT_CELLS, 0, 0, generic_pickupevalfunc, 100); + StartItemA (ITEM_VaporizerCells); } void instagib_health_mega() { self.max_health = 1; - StartItem ("models/items/g_h100.md3", - "misc/megahealth.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, - "Extralife", IT_NAILS, 0, FL_POWERUP, generic_pickupevalfunc, BOT_PICKUP_RATING_HIGH); + StartItemA (ITEM_ExtraLife); } .float instagib_nextthink; diff --git a/qcsrc/server/mutators/mutators_include.qc b/qcsrc/server/mutators/mutators_include.qc index 4c591446b7..4debaa5a88 100644 --- a/qcsrc/server/mutators/mutators_include.qc +++ b/qcsrc/server/mutators/mutators_include.qc @@ -23,11 +23,11 @@ #include "../../common/command/command.qh" #include "../../common/net_notice.qh" #include "../../common/animdecide.qh" - #include "../../common/monsters/monsters.qh" + #include "../../common/monsters/all.qh" #include "../../common/monsters/sv_monsters.qh" #include "../../common/monsters/spawn.qh" #include "../../common/weapons/config.qh" - #include "../../common/weapons/weapons.qh" + #include "../../common/weapons/all.qh" #include "../weapons/accuracy.qh" #include "../weapons/common.qh" #include "../weapons/csqcprojectile.qh" diff --git a/qcsrc/server/portals.qc b/qcsrc/server/portals.qc index b9d32e106d..cb671ddc70 100644 --- a/qcsrc/server/portals.qc +++ b/qcsrc/server/portals.qc @@ -9,7 +9,7 @@ #include "../common/deathtypes.qh" #include "../common/notifications.qh" #include "../common/util.qh" -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" #include "../csqcmodellib/sv_model.qh" #include "../warpzonelib/anglestransform.qh" #include "../warpzonelib/util_server.qh" diff --git a/qcsrc/server/progs.src b/qcsrc/server/progs.src index 20b28a410d..75301d5929 100644 --- a/qcsrc/server/progs.src +++ b/qcsrc/server/progs.src @@ -67,7 +67,7 @@ bot/havocbot/role_keyhunt.qc bot/havocbot/role_onslaught.qc bot/havocbot/roles.qc -command/commands.qc +command/all.qc mutators/mutators_include.qc mutators/mutators.qc @@ -97,7 +97,7 @@ weapons/weaponsystem.qc ../common/campaign_file.qc ../common/campaign_setup.qc ../common/mapinfo.qc -../common/monsters/monsters.qc +../common/monsters/all.qc ../common/monsters/spawn.qc ../common/monsters/sv_monsters.qc ../common/nades.qc @@ -107,8 +107,11 @@ weapons/weaponsystem.qc ../common/test.qc ../common/urllib.qc ../common/util.qc + +../common/items/all.qc + ../common/weapons/config.qc -../common/weapons/weapons.qc // TODO +../common/weapons/all.qc // TODO ../csqcmodellib/sv_model.qc diff --git a/qcsrc/server/sv_main.qc b/qcsrc/server/sv_main.qc index 5982d20284..0f7d1763b0 100644 --- a/qcsrc/server/sv_main.qc +++ b/qcsrc/server/sv_main.qc @@ -18,7 +18,7 @@ #include "../common/mapinfo.qh" #include "../common/util.qh" -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" #include "../csqcmodellib/sv_model.qh" diff --git a/qcsrc/server/t_items.qc b/qcsrc/server/t_items.qc index 6839091f4a..f817957c82 100644 --- a/qcsrc/server/t_items.qc +++ b/qcsrc/server/t_items.qc @@ -1,5 +1,7 @@ #include "t_items.qh" +#include "../common/items/all.qc" + #if defined(SVQC) #include "_all.qh" @@ -20,9 +22,9 @@ #include "../common/notifications.qh" #include "../common/util.qh" - #include "../common/monsters/monsters.qh" + #include "../common/monsters/all.qh" - #include "../common/weapons/weapons.qh" + #include "../common/weapons/all.qh" #include "../warpzonelib/util_server.qh" #endif @@ -663,6 +665,8 @@ float Item_GiveTo(entity item, entity player) return 1; } +.entity itemdef; + void Item_Touch (void) { entity e, head; @@ -702,8 +706,9 @@ void Item_Touch (void) self.invincible_finished = max(0, self.invincible_finished - time); self.superweapons_finished = max(0, self.superweapons_finished - time); } - - if(!Item_GiveTo(self, other)) + entity it = self.itemdef; + bool gave = (it && it.instanceOfPickup) ? ITEM_HANDLE(Pickup, it, self, other) : Item_GiveTo(self, other); + if (!gave) { if (self.classname == "droppedweapon") { @@ -724,9 +729,7 @@ void Item_Touch (void) if (self.classname == "droppedweapon") remove (self); - else if (!self.spawnshieldtime) - return; - else + else if (self.spawnshieldtime) { if(self.team) { @@ -1151,12 +1154,19 @@ void StartItem (string itemmodel, string pickupsound, float defaultrespawntime, return; } } + +void StartItemA (entity a) +{ + self.itemdef = a; + StartItem(a.m_model, a.m_sound, a.m_respawntime(), a.m_respawntimejitter(), a.m_name, a.m_itemid, 0, a.m_itemflags, a.m_pickupevalfunc, a.m_botvalue); +} + void spawnfunc_item_rockets (void) { if(!self.ammo_rockets) self.ammo_rockets = g_pickup_rockets; if(!self.pickup_anyway) self.pickup_anyway = g_pickup_ammo_anyway; - StartItem ("models/items/a_rockets.md3", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "rockets", IT_ROCKETS, 0, 0, commodity_pickupevalfunc, 3000); + StartItemA (ITEM_Rockets); } void spawnfunc_item_bullets (void) { @@ -1174,7 +1184,7 @@ void spawnfunc_item_bullets (void) { self.ammo_nails = g_pickup_nails; if(!self.pickup_anyway) self.pickup_anyway = g_pickup_ammo_anyway; - StartItem ("models/items/a_bullets.mdl", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "bullets", IT_NAILS, 0, 0, commodity_pickupevalfunc, 2000); + StartItemA (ITEM_Bullets); } void spawnfunc_item_cells (void) { @@ -1182,7 +1192,7 @@ void spawnfunc_item_cells (void) { self.ammo_cells = g_pickup_cells; if(!self.pickup_anyway) self.pickup_anyway = g_pickup_ammo_anyway; - StartItem ("models/items/a_cells.md3", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "cells", IT_CELLS, 0, 0, commodity_pickupevalfunc, 2000); + StartItemA (ITEM_Cells); } void spawnfunc_item_plasma() @@ -1191,7 +1201,7 @@ void spawnfunc_item_plasma() self.ammo_plasma = g_pickup_plasma; if(!self.pickup_anyway) self.pickup_anyway = g_pickup_ammo_anyway; - StartItem ("models/items/a_cells.md3", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "plasma", IT_PLASMA, 0, 0, commodity_pickupevalfunc, 2000); + StartItemA (ITEM_Plasma); } void spawnfunc_item_shells (void) { @@ -1209,7 +1219,7 @@ void spawnfunc_item_shells (void) { self.ammo_shells = g_pickup_shells; if(!self.pickup_anyway) self.pickup_anyway = g_pickup_ammo_anyway; - StartItem ("models/items/a_shells.md3", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "shells", IT_SHELLS, 0, 0, commodity_pickupevalfunc, 500); + StartItemA (ITEM_Shells); } void spawnfunc_item_armor_small (void) { @@ -1219,7 +1229,7 @@ void spawnfunc_item_armor_small (void) { self.max_armorvalue = g_pickup_armorsmall_max; if(!self.pickup_anyway) self.pickup_anyway = g_pickup_armorsmall_anyway; - StartItem ("models/items/item_armor_small.md3", "misc/armor1.wav", g_pickup_respawntime_short, g_pickup_respawntimejitter_short, "5 Armor", IT_ARMOR_SHARD, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_LOW); + StartItemA (ITEM_ArmorSmall); } void spawnfunc_item_armor_medium (void) { @@ -1229,7 +1239,7 @@ void spawnfunc_item_armor_medium (void) { self.max_armorvalue = g_pickup_armormedium_max; if(!self.pickup_anyway) self.pickup_anyway = g_pickup_armormedium_anyway; - StartItem ("models/items/item_armor_medium.md3", "misc/armor10.wav", g_pickup_respawntime_medium, g_pickup_respawntimejitter_medium, "25 Armor", IT_ARMOR, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_MID); + StartItemA (ITEM_ArmorMedium); } void spawnfunc_item_armor_big (void) { @@ -1239,7 +1249,7 @@ void spawnfunc_item_armor_big (void) { self.max_armorvalue = g_pickup_armorbig_max; if(!self.pickup_anyway) self.pickup_anyway = g_pickup_armorbig_anyway; - StartItem ("models/items/item_armor_big.md3", "misc/armor17_5.wav", g_pickup_respawntime_long, g_pickup_respawntimejitter_long, "50 Armor", IT_ARMOR, 0, 0, commodity_pickupevalfunc, 20000); + StartItemA (ITEM_ArmorBig); } void spawnfunc_item_armor_large (void) { @@ -1249,7 +1259,7 @@ void spawnfunc_item_armor_large (void) { self.max_armorvalue = g_pickup_armorlarge_max; if(!self.pickup_anyway) self.pickup_anyway = g_pickup_armorlarge_anyway; - StartItem ("models/items/item_armor_large.md3", "misc/armor25.wav", g_pickup_respawntime_long, g_pickup_respawntimejitter_long, "100 Armor", IT_ARMOR, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_HIGH); + StartItemA (ITEM_ArmorLarge); } void spawnfunc_item_health_small (void) { @@ -1259,7 +1269,7 @@ void spawnfunc_item_health_small (void) { self.health = g_pickup_healthsmall; if(!self.pickup_anyway) self.pickup_anyway = g_pickup_healthsmall_anyway; - StartItem ("models/items/g_h1.md3", "misc/minihealth.wav", g_pickup_respawntime_short, g_pickup_respawntimejitter_short, "5 Health", IT_5HP, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_LOW); + StartItemA (ITEM_HealthSmall); } void spawnfunc_item_health_medium (void) { @@ -1269,7 +1279,7 @@ void spawnfunc_item_health_medium (void) { self.health = g_pickup_healthmedium; if(!self.pickup_anyway) self.pickup_anyway = g_pickup_healthmedium_anyway; - StartItem ("models/items/g_h25.md3", "misc/mediumhealth.wav", g_pickup_respawntime_short, g_pickup_respawntimejitter_short, "25 Health", IT_25HP, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_MID); + StartItemA (ITEM_HealthMedium); } void spawnfunc_item_health_large (void) { @@ -1279,17 +1289,17 @@ void spawnfunc_item_health_large (void) { self.health = g_pickup_healthlarge; if(!self.pickup_anyway) self.pickup_anyway = g_pickup_healthlarge_anyway; - StartItem ("models/items/g_h50.md3", "misc/mediumhealth.wav", g_pickup_respawntime_medium, g_pickup_respawntimejitter_medium, "50 Health", IT_25HP, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_MID); + StartItemA (ITEM_HealthLarge); } void spawnfunc_item_health_mega (void) { - if(!self.max_health) - self.max_health = g_pickup_healthmega_max; - if(!self.health) - self.health = g_pickup_healthmega; - if(!self.pickup_anyway) - self.pickup_anyway = g_pickup_healthmega_anyway; - StartItem ("models/items/g_h100.md3", "misc/megahealth.wav", g_pickup_respawntime_long, g_pickup_respawntimejitter_long, "100 Health", IT_HEALTH, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_HIGH); + if(!self.max_health) + self.max_health = g_pickup_healthmega_max; + if(!self.health) + self.health = g_pickup_healthmega; + if(!self.pickup_anyway) + self.pickup_anyway = g_pickup_healthmega_anyway; + StartItemA (ITEM_HealthMega); } // support old misnamed entities @@ -1303,13 +1313,13 @@ void spawnfunc_item_strength (void) { precache_sound("weapons/strength_fire.wav"); if(!self.strength_finished) self.strength_finished = autocvar_g_balance_powerup_strength_time; - StartItem ("models/items/g_strength.md3", "misc/powerup.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, "Strength Powerup", IT_STRENGTH, 0, FL_POWERUP, generic_pickupevalfunc, 100000); + StartItemA (ITEM_Strength); } void spawnfunc_item_invincible (void) { if(!self.invincible_finished) self.invincible_finished = autocvar_g_balance_powerup_invincible_time; - StartItem ("models/items/g_invincible.md3", "misc/powerup_shield.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, "Shield", IT_INVINCIBLE, 0, FL_POWERUP, generic_pickupevalfunc, 100000); + StartItemA (ITEM_Shield); } // compatibility: @@ -1470,7 +1480,7 @@ void spawnfunc_item_fuel(void) self.ammo_fuel = g_pickup_fuel; if(!self.pickup_anyway) self.pickup_anyway = g_pickup_ammo_anyway; - StartItem ("models/items/g_fuel.md3", "misc/itempickup.wav", g_pickup_respawntime_ammo, g_pickup_respawntimejitter_ammo, "Fuel", IT_FUEL, 0, 0, commodity_pickupevalfunc, BOT_PICKUP_RATING_LOW); + StartItemA (ITEM_JetpackFuel); } void spawnfunc_item_fuel_regen(void) @@ -1480,7 +1490,7 @@ void spawnfunc_item_fuel_regen(void) spawnfunc_item_fuel(); return; } - StartItem ("models/items/g_fuelregen.md3", "misc/itempickup.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, "Fuel regenerator", IT_FUEL_REGEN, 0, FL_POWERUP, commodity_pickupevalfunc, BOT_PICKUP_RATING_LOW); + StartItemA (ITEM_JetpackRegen); } void spawnfunc_item_jetpack(void) @@ -1492,7 +1502,7 @@ void spawnfunc_item_jetpack(void) spawnfunc_item_fuel(); return; } - StartItem ("models/items/g_jetpack.md3", "misc/itempickup.wav", g_pickup_respawntime_powerup, g_pickup_respawntimejitter_powerup, "Jet pack", IT_JETPACK, 0, FL_POWERUP, commodity_pickupevalfunc, BOT_PICKUP_RATING_LOW); + StartItemA (ITEM_Jetpack); } float GiveWeapon(entity e, float wpn, float op, float val) diff --git a/qcsrc/server/t_items.qh b/qcsrc/server/t_items.qh index 7470d2f05b..a33e45a82c 100644 --- a/qcsrc/server/t_items.qh +++ b/qcsrc/server/t_items.qh @@ -11,13 +11,13 @@ const int IT_FUEL_REGEN = 32; // fuel regeneration trigger // where is 64... ? const int IT_FUEL = 128; // -Wdouble-declaration -// const int IT_SHELLS = 256; +#define IT_SHELLS 256 // -Wdouble-declaration -// const int IT_NAILS = 512; +#define IT_NAILS 512 // -Wdouble-declaration -// const int IT_ROCKETS = 1024; +#define IT_ROCKETS 1024 // -Wdouble-declaration -// const int IT_CELLS = 2048; +#define IT_CELLS 2048 const int IT_SUPERWEAPON = 4096; const int IT_STRENGTH = 8192; const int IT_INVINCIBLE = 16384; diff --git a/qcsrc/server/t_plats.qc b/qcsrc/server/t_plats.qc index cec1a7f6bc..40d6a4d436 100644 --- a/qcsrc/server/t_plats.qc +++ b/qcsrc/server/t_plats.qc @@ -13,7 +13,7 @@ #include "../common/notifications.qh" #include "../common/util.qh" -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" #include "../csqcmodellib/sv_model.qh" diff --git a/qcsrc/server/t_quake.qc b/qcsrc/server/t_quake.qc index 9e68ac8124..517b880822 100644 --- a/qcsrc/server/t_quake.qc +++ b/qcsrc/server/t_quake.qc @@ -1,6 +1,6 @@ #include "_all.qh" -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" void spawnfunc_weapon_electro(); void spawnfunc_weapon_hagar(); diff --git a/qcsrc/server/t_quake3.qc b/qcsrc/server/t_quake3.qc index 2c5bd894ea..6908b6dbf1 100644 --- a/qcsrc/server/t_quake3.qc +++ b/qcsrc/server/t_quake3.qc @@ -1,6 +1,6 @@ #include "_all.qh" -#include "../common/weapons/weapons.qh" +#include "../common/weapons/all.qh" #include "../common/buffs.qh" void spawnfunc_weapon_crylink(); diff --git a/qcsrc/server/t_swamp.qc b/qcsrc/server/t_swamp.qc index 1c80c3ac04..20b49ec6ae 100644 --- a/qcsrc/server/t_swamp.qc +++ b/qcsrc/server/t_swamp.qc @@ -4,7 +4,7 @@ #include "_all.qh" #include "../warpzonelib/util_server.qh" - #include "../common/weapons/weapons.qh" + #include "../common/weapons/all.qh" #include "../common/deathtypes.qh" #endif diff --git a/qcsrc/server/vehicles/all.qh b/qcsrc/server/vehicles/all.qh index c675c9cbfd..5203062234 100644 --- a/qcsrc/server/vehicles/all.qh +++ b/qcsrc/server/vehicles/all.qh @@ -1,5 +1,5 @@ -#ifndef VEHICLES_H -#define VEHICLES_H +#ifndef VEHICLES_ALL_H +#define VEHICLES_ALL_H #if VEHICLES_ENABLED # include "racer.qh" diff --git a/qcsrc/server/weapons/accuracy.qc b/qcsrc/server/weapons/accuracy.qc index bfa18464f0..1ef81a409e 100644 --- a/qcsrc/server/weapons/accuracy.qc +++ b/qcsrc/server/weapons/accuracy.qc @@ -5,7 +5,7 @@ #include "../../common/constants.qh" #include "../../common/teams.qh" #include "../../common/util.qh" -#include "../../common/weapons/weapons.qh" +#include "../../common/weapons/all.qh" float accuracy_byte(float n, float d) { diff --git a/qcsrc/server/weapons/common.qc b/qcsrc/server/weapons/common.qc index a837b2e47f..cf49b54f8b 100644 --- a/qcsrc/server/weapons/common.qc +++ b/qcsrc/server/weapons/common.qc @@ -6,7 +6,7 @@ #include "../../common/deathtypes.qh" #include "../../common/notifications.qh" #include "../../common/util.qh" -#include "../../common/weapons/weapons.qh" +#include "../../common/weapons/all.qh" void W_GiveWeapon (entity e, float wep) { diff --git a/qcsrc/server/weapons/csqcprojectile.qc b/qcsrc/server/weapons/csqcprojectile.qc index fef16a833b..507fc4a413 100644 --- a/qcsrc/server/weapons/csqcprojectile.qc +++ b/qcsrc/server/weapons/csqcprojectile.qc @@ -6,7 +6,7 @@ #include "../command/common.qh" #include "../../common/constants.qh" -#include "../../common/weapons/weapons.qh" +#include "../../common/weapons/all.qh" .float csqcprojectile_type; diff --git a/qcsrc/server/weapons/hitplot.qc b/qcsrc/server/weapons/hitplot.qc index c93b319530..76e159738f 100644 --- a/qcsrc/server/weapons/hitplot.qc +++ b/qcsrc/server/weapons/hitplot.qc @@ -3,7 +3,7 @@ #include "../antilag.qh" #include "../g_subs.qh" -#include "../../common/weapons/weapons.qh" +#include "../../common/weapons/all.qh" vector W_HitPlotUnnormalizedUntransform(vector screenforward, vector screenright, vector screenup, vector v) { diff --git a/qcsrc/server/weapons/selection.qc b/qcsrc/server/weapons/selection.qc index da9b00a184..89c4253a13 100644 --- a/qcsrc/server/weapons/selection.qc +++ b/qcsrc/server/weapons/selection.qc @@ -6,7 +6,7 @@ #include "../waypointsprites.qh" #include "../../common/constants.qh" #include "../../common/util.qh" -#include "../../common/weapons/weapons.qh" +#include "../../common/weapons/all.qh" // switch between weapons void Send_WeaponComplain(entity e, float wpn, float type) diff --git a/qcsrc/server/weapons/spawning.qc b/qcsrc/server/weapons/spawning.qc index 9d46475af5..9096b2f9c7 100644 --- a/qcsrc/server/weapons/spawning.qc +++ b/qcsrc/server/weapons/spawning.qc @@ -4,7 +4,7 @@ #include "weaponsystem.qh" #include "../mutators/mutators_include.qh" #include "../t_items.qh" -#include "../../common/weapons/weapons.qh" +#include "../../common/weapons/all.qh" string W_Apply_Weaponreplace(string in) { diff --git a/qcsrc/server/weapons/throwing.qc b/qcsrc/server/weapons/throwing.qc index 6b549993ab..1fea5fb393 100644 --- a/qcsrc/server/weapons/throwing.qc +++ b/qcsrc/server/weapons/throwing.qc @@ -9,7 +9,7 @@ #include "../../common/mapinfo.qh" #include "../../common/notifications.qh" #include "../../common/util.qh" -#include "../../common/weapons/weapons.qh" +#include "../../common/weapons/all.qh" void thrown_wep_think() { diff --git a/qcsrc/server/weapons/tracing.qc b/qcsrc/server/weapons/tracing.qc index 2a3181d1b2..0bdecfd0df 100644 --- a/qcsrc/server/weapons/tracing.qc +++ b/qcsrc/server/weapons/tracing.qc @@ -12,7 +12,7 @@ #include "../../common/constants.qh" #include "../../common/util.qh" -#include "../../common/weapons/weapons.qh" +#include "../../common/weapons/all.qh" #include "../../warpzonelib/common.qh" diff --git a/qcsrc/server/weapons/weaponstats.qc b/qcsrc/server/weapons/weaponstats.qc index fb668ae7c5..a84969904a 100644 --- a/qcsrc/server/weapons/weaponstats.qc +++ b/qcsrc/server/weapons/weaponstats.qc @@ -4,7 +4,7 @@ #include "../g_world.qh" #include "../../common/urllib.qh" -#include "../../common/weapons/weapons.qh" +#include "../../common/weapons/all.qh" void WeaponStats_Init() { diff --git a/qcsrc/server/weapons/weaponsystem.qc b/qcsrc/server/weapons/weaponsystem.qc index accf5b2f0f..588c68acff 100644 --- a/qcsrc/server/weapons/weaponsystem.qc +++ b/qcsrc/server/weapons/weaponsystem.qc @@ -9,10 +9,10 @@ #include "../t_items.qh" #include "../../common/animdecide.qh" #include "../../common/constants.qh" -#include "../../common/monsters/monsters.qh" +#include "../../common/monsters/all.qh" #include "../../common/notifications.qh" #include "../../common/util.qh" -#include "../../common/weapons/weapons.qh" +#include "../../common/weapons/all.qh" #include "../../csqcmodellib/sv_model.qh" /* diff --git a/qcsrc/warpzonelib/common.qc b/qcsrc/warpzonelib/common.qc index 0734811c18..028724afba 100644 --- a/qcsrc/warpzonelib/common.qc +++ b/qcsrc/warpzonelib/common.qc @@ -5,7 +5,7 @@ #include "../server/t_items.qh" #elif defined(MENUQC) #elif defined(SVQC) - #include "../common/weapons/weapons.qh" + #include "../common/weapons/all.qh" #include "../dpdefs/dpextensions.qh" #include "../dpdefs/progsdefs.qh" #endif