Compare commits

...

114 Commits

Author SHA1 Message Date
Alibek Omarov
56ba2325c1 engine: client: skip drawing 2D during changelevel before the client was active
* Prevents screen garbage on GPUs with tile-based renderers like Adreno and ImgTec
2024-07-11 09:01:19 +03:00
Alibek Omarov
b77a4ed3a1 engine: client: ignore changelevel for old protocol
* Prevents engine from drawing too early during reconnect to a
  legacy coop server
2024-07-11 08:59:42 +03:00
Alibek Omarov
9b86c3127a engine: properly disconnect from online game when loading local game (save, newgame or a level) 2024-07-10 12:32:33 +03:00
Alibek Omarov
0da7ffe45f engine: client: reset video after last screen update in begin loading plaque. Because update screen supposedly should draw the whole screen now, gl_clear hack shouldn't be required anymore 2024-07-10 11:59:54 +03:00
Alibek Omarov
30b78d9559 mainui: update 2024-07-10 11:32:30 +03:00
Alibek Omarov
c16abc0b85 engine: server: first check for dedicated server in SV_IsSimulating, as CL_Active()/CL_IsInConsole() don't make sense if we're running dedicated server already 2024-07-10 10:35:47 +03:00
Alibek Omarov
708c691cdb engine: fix XASH_DEDICATED check 2024-07-10 10:34:57 +03:00
Alibek Omarov
31c20ac4d8 engine: client: don't call Host_IsDedicated when getting split size for client 2024-07-10 10:34:30 +03:00
Alibek Omarov
1458014a29 engine: remove unused CL_IsInMenu, don't check for Host_IsDedicated in SCR_BeginLoadingPlaque, it's useless 2024-07-10 10:24:22 +03:00
Alibek Omarov
1c84a5c8ad engine: platform: sdl: disable restoring desktop resolution for mobile platforms, as it leads to unwanted window minimize (which correctly implemented by SDL by the way) 2024-07-09 19:52:11 +03:00
Alibek Omarov
6728b843f7 engine: platform: android: use RTLD_NOW in dlopen()
We basically use RTLD_NOW everywhere in the engine these days,
only platform code is behind that
2024-07-09 16:50:37 +03:00
Alibek Omarov
1b55104d51 editorconfig: add IDEA exported config 2024-07-09 16:46:51 +03:00
Alibek Omarov
76978bfd47 scripts: gha: change Android project URL, update Android CLI tools and NDK 2024-07-09 08:56:14 +03:00
Alibek Omarov
6ff3231dab engine: change current working directory before initializing filesystem_stdio 2024-07-09 08:45:27 +03:00
Alibek Omarov
64716e6b42 filesystem: request win32 error string in wide chars and then transform it to UTF-8 using our utflib 2024-07-09 08:25:15 +03:00
Alibek Omarov
a1191eb4ab engine: platform: win32: request error string in wide chars and then transform it to UTF-8 using our utflib 2024-07-09 08:24:58 +03:00
Alibek Omarov
166bed732e engine: crashhandler: few improvements for win32 crashhandler
* Larger message buffer
* Print version at first line
* Tell SDL2 to ungrab mouse
2024-07-08 05:56:20 +03:00
Alibek Omarov
02cb12e4b4 mainui: update 2024-07-08 05:49:24 +03:00
Alibek Omarov
159467ad44 engine: add IPv6 master server 2024-07-07 21:18:02 +03:00
Alibek Omarov
2a006086c5 mainui: update 2024-07-07 06:51:47 +03:00
Alibek Omarov
e0dc1eec93 engine: client: more reliable way to find the payload the netinfo response 2024-07-07 06:49:54 +03:00
Alibek Omarov
ab130ee92c engine: client: fix infostring truncation in NetAPI requests 2024-07-07 06:17:38 +03:00
Alibek Omarov
dabbe09918 engine: add NetAPI flag to send NetAPI requests to old protocol servers 2024-07-07 06:17:15 +03:00
Alibek Omarov
296a7ac11d engine: client: fix NetAPI request sending 2024-07-07 06:16:46 +03:00
Alibek Omarov
6bbf08893e engine: add NetAPI to extended menu API 2024-07-07 03:39:09 +03:00
Alibek Omarov
f8b958738a engine: client: rework NetAPI response parsing 2024-07-07 03:30:34 +03:00
Alibek Omarov
1b4427f13f engine: server: rework NetAPI responses
players list and rules are now actually useful
2024-07-07 03:29:27 +03:00
Alibek Omarov
e55577fd26 engine: get rid of some size constants passed to Info_SetValueForKey, use sizeof instead 2024-07-07 03:02:02 +03:00
Alibek Omarov
c42960ec2a engine: server: mark some cvars and movevars as server cvars, so they get reported in rules query
Bring back sv_contact cvar, as it makes sense to get this from rules query
2024-07-07 03:01:59 +03:00
Alibek Omarov
c033d4b65c engine: server: optimize source query 2024-07-07 02:34:43 +03:00
Alibek Omarov
dc6f03b4e4 engine: server: add function SV_HavePassword that correctly checks whether this server have set up password 2024-07-07 02:10:48 +03:00
Alibek Omarov
b6967a432a engine: add NetAPI flag NET_ERROR_FORBIDDEN 2024-07-07 02:05:25 +03:00
Alibek Omarov
7d0467863c engine: server: add cvar to not expose current player list, or if server has a password 2024-07-07 01:59:56 +03:00
Alibek Omarov
a0b72d3995 engine: server: light sv_query.c refactoring, use Netchan_OutOfBand instead of manually creating out of band packet 2024-07-07 01:55:03 +03:00
Alibek Omarov
5fe4b867f3 engine: server: do not expose some cvars in rules, some of them just don't make sense 2024-07-07 01:51:50 +03:00
Alibek Omarov
40af058406 engine: client: console: add conback.dds by request, don't fail on texture that cannot be loaded 2024-07-06 22:30:05 +03:00
Alibek Omarov
b4376a6a8c engine: client: make a common function for sending out userinfo changes 2024-07-06 06:09:19 +03:00
Alibek Omarov
457422c679 engine: server: fix possible byte overflow when sending sound with attenuation == 4.0f 2024-07-06 05:50:53 +03:00
Alibek Omarov
080eba948f engine: server: fix sound not being overriden when an entity sound came from has an aiment set
This check was added 10+ years ago in 8f6f3fc (viewable in Xash3DArchive) and
probably doesn't make any sense anymore.
2024-07-06 05:32:20 +03:00
Alibek Omarov
eff86defd9 public: fix Q_equal for case when applying epsilon doesn't change the value 2024-07-04 07:55:32 +03:00
Alibek Omarov
fcb463d400 engine: client: flush demoheader before copying it 2024-07-04 07:23:48 +03:00
Alibek Omarov
efee8149e2 filesystem: remove unneeded cast to fs_offset_t in write() call 2024-07-04 07:23:13 +03:00
Alibek Omarov
bc32f37fce public: use Q_strchr in COM_FixSlashes 2024-07-04 06:42:49 +03:00
Alibek Omarov
58bfa247a4 public: add test case for COM_FixSlashes 2024-07-04 06:42:35 +03:00
Alibek Omarov
59b9b31604 public: avoid useless copies in Q_pretifymem 2024-07-04 06:39:18 +03:00
Alibek Omarov
844af709c0 public: simplify Q_colorstr and Q_strnlwr 2024-07-04 06:38:50 +03:00
Alibek Omarov
bb6e2d6885 public: add Q_colorstr and Q_strnlwr tests 2024-07-04 06:38:09 +03:00
Alibek Omarov
6243dc7913 public: simplify Q_ato{i,f} implementation 2024-07-04 06:30:59 +03:00
Alibek Omarov
45c4362ae6 public: add Q_ato{i,f,v} test 2024-07-04 06:29:46 +03:00
Alibek Omarov
a0230b7e00 engine: client: console: minor refactoring, move common NXPrintf code to Con_NXPrintfv 2024-07-04 05:49:33 +03:00
Alibek Omarov
768755c31a engine: client: use Con_Printf instead of Con_Print (which is just printing to console, not the logging) 2024-07-03 04:22:28 +03:00
Alibek Omarov
3088c7f198 scripts: gha: set proper PKG_CONFIG_PATH when building 32-bit SDL 2024-07-02 19:26:39 +03:00
Alibek Omarov
c8469071bf scripts: gha: add remaining wayland dependencies 2024-07-02 19:15:02 +03:00
Alibek Omarov
115fc301b5 scripts: gha: fix installing pulseaudio dependency for 32-bit build 2024-07-02 19:02:54 +03:00
Alibek Omarov
bc449b8e95 scripts: gha: enable JACK in automatic builds 2024-07-02 18:59:13 +03:00
Alibek Omarov
74bbc0fe7e scripts: gha: install pulse, jack and wayland development files for SDL to detect them 2024-07-02 18:58:53 +03:00
Alibek Omarov
c73fa3d7a6 filesystem: fix mounting wads again
Because of the mounting order, VFS fails to automatically find unpacked WADs
2024-06-28 18:00:40 +03:00
Alibek Omarov
5694610478 filesystem: fix writedir being prepended to rodir path when searching for library
* Refactor generating shortName
* Refactor library origin checks
2024-06-27 08:16:56 +03:00
Alibek Omarov
ec107dfba5 filesystem: load on-disk archives like PAK and PK3 through VFS (disk-only for now)
* Track from which archive the file has been opened and provide needed functions for it
2024-06-27 07:31:11 +03:00
Alibek Omarov
64aa476330 editorconfig: add Visual Studio options (generated) 2024-06-27 07:18:10 +03:00
Alibek Omarov
42f6719e8d filesystem: drop direct path hacks for WAD files, let VFS decide how to open WAD archives 2024-06-27 05:55:06 +03:00
Alibek Omarov
244b9dc02b wscript: disable -Wformat=2 back (it wasn't supposed to be pushed anyway) 2024-06-24 20:01:29 +03:00
Alibek Omarov
fe3644a417 engine: client: add simple debugging tool that shows entities number, model and movetype (to be extended) 2024-06-22 08:19:19 +03:00
Alibek Omarov
e18b61e041 Fixes for -Wformat=2 on 64-bit targets 2024-06-22 07:31:37 +03:00
Alibek Omarov
d054782693 engine: client: fix broken legacy demos playing
Fixes: ff4221fbe7 ("engine: client: write correct cls.legacymode/net_protocol value for demos")
2024-06-22 07:30:47 +03:00
Alibek Omarov
d56e53a347 Replace hardcoded functions names by __func__ macro
* while we're here, fix some possible bugs
* and fix -Wformat=2

s/__FUNCTION__/__func__/g

awawawa
2024-06-19 06:53:42 +03:00
Alibek Omarov
3503c721ac engine: client: console: simplify loading console background image 2024-06-19 03:35:28 +03:00
Alibek Omarov
0fab5f07d0 Revert "engine: common: mod_studio: reject models with split textures files that cannot be loaded"
This reverts commit 3256236ba2.
2024-06-18 22:50:06 +03:00
Alibek Omarov
b0d12f8bf9 engine: client: fix build
Forgot to stage these changes two commits ago =/
2024-06-18 00:01:54 +03:00
Alibek Omarov
9fe58aaabc engine: client: send expected cvar not found string for old protocol cvar query 2024-06-17 23:44:05 +03:00
Alibek Omarov
03c8ea14cc engine: client: mute music if not in focus 2024-06-17 20:32:04 +03:00
Alibek Omarov
260edc2a08 ref: gl: try to match texture slot and texture object handle because of buggy games 2024-06-15 19:21:26 +03:00
Alibek Omarov
b41591a527 ref: gl: decreate alphatest value for lightmapped sprites to make them easier to see
With 0.5 they're too tiny
2024-06-15 19:07:17 +03:00
Alibek Omarov
4e9481451b mainui: update 2024-06-15 17:22:52 +03:00
Alibek Omarov
95b48da37d engine: allow to change hardcoded path to custom.hpk 2024-06-15 17:22:26 +03:00
Alibek Omarov
1b36785177 engine: common: hpak: rename hpk_maxsize to hpak_max_size to avoid Valve's defaults
While we're here:
* Increase it to 64 MiB.
* Make it privileged.
* Add hpk_maxsize stub command as a deprecation notice.
2024-06-15 16:55:25 +03:00
Alibek Omarov
8bc76e3d58 engine: host: do not specifically check timedemo or vsync in Host_CalcSleep, because it's already has been checked in Host_CalcFPS 2024-06-15 13:57:12 +03:00
Alibek Omarov
1a5e2b907d engine: client: minor refactoring for cls.demoplayback check 2024-06-15 13:56:25 +03:00
Alibek Omarov
3717e5c2e0 engine: client: simplify server message parsing by moving common code out of protocol-specific parsing funcs 2024-06-15 13:51:02 +03:00
Alibek Omarov
33a1416199 engine: common: net_chan: remove unneeded check for demo and remote address in netchan, as it's handled in client and server already 2024-06-15 13:44:26 +03:00
Alibek Omarov
ff4221fbe7 engine: client: write correct cls.legacymode/net_protocol value for demos 2024-06-15 13:43:18 +03:00
Alibek Omarov
486bca82e8 engine: add quake svc messages names 2024-06-15 11:04:30 +03:00
Alibek Omarov
611d07fc16 engine: client: redefine legacymode from qboolean to an enum with selected protocol. Remove protocol auto-guess hack, it's useless since connect accept accepts protocol string 2024-06-15 10:52:26 +03:00
Alibek Omarov
f7e12586cf engine: platform: sdl: we must notify the engine about the unpressed button when text input was activated 2024-06-15 08:44:19 +03:00
Alibek Omarov
f62aa051c8 engine: common: make netchan cvars static 2024-06-15 08:44:19 +03:00
Alibek Omarov
2b6b898102 engine: client: make some cvars static 2024-06-15 08:44:19 +03:00
Alibek Omarov
1dd0444531 engine: server: comment out unused cvars, make some static 2024-06-15 08:44:19 +03:00
Alibek Omarov
ba9eb01c1f engine: server: replace timeout cvar by sv_timeout cvar for consistency with GoldSrc 2024-06-15 08:44:19 +03:00
Alibek Omarov
73a8144e75 engine: client: reduce console spam about not precached model to dev level 1 2024-06-15 08:44:18 +03:00
Alibek Omarov
6aef422de6 ref: remove unneeded dlight pointer increment 2024-06-15 08:44:18 +03:00
Alibek Omarov
5f4b8b60cb engine: client: make remote print messages more obvious 2024-06-15 08:44:18 +03:00
Alibek Omarov
3256236ba2 engine: common: mod_studio: reject models with split textures files that cannot be loaded 2024-06-14 11:34:42 +03:00
Alibek Omarov
b102727320 engine: client: try to not save passwords to console history 2024-06-14 11:34:37 +03:00
Alibek Omarov
3434005e66 engine: common: make Host_IsLocalGame and Host_IsLocalClient inlined 2024-06-13 01:20:14 +03:00
Alibek Omarov
b3026a7991 engine: client: don't use CL_Active/CL_GetMaxClients wrappers as they are only intended to be either passed to DLL or used in common/server code 2024-06-13 01:19:38 +03:00
Alibek Omarov
0a051832a8 engine: client: do not mute sounds in menu with multiplayer, the bug already been solved different way 2024-06-13 01:07:49 +03:00
Alibek Omarov
2dbafbda02 engine: common: mod_studio: fix NULL mod->cache.data if model has split texture file but none was loaded 2024-06-12 23:37:30 +03:00
Alibek Omarov
240b6fb6f2 engine: fix possible unprivileged config execute with fake extension 2024-06-12 11:16:31 +03:00
Alibek Omarov
4163d3655a engine: reformat and reorder host_parm_s struct, remove now unused host.daemonize and host.enabledll 2024-06-12 11:16:26 +03:00
Alibek Omarov
2c7bf49fc9 engine: host: avoid some of unnecessary double-to-float conversions 2024-06-12 10:20:09 +03:00
Alibek Omarov
739592e50d engine: host: refactoring, reduce usage of global variables a bit 2024-06-12 10:20:09 +03:00
Alibek Omarov
393e31e509 engine: move finding root/readonly directory to FS initialization, remove unused host.rodir, host.rootidr 2024-06-12 10:20:09 +03:00
Alibek Omarov
a1dceacc8f engine: remove unused host.hMutex and host.hInst 2024-06-12 10:20:09 +03:00
Alibek Omarov
cf26c87872 engine: remove unused host.decalList and host.numdecals 2024-06-12 10:20:09 +03:00
Alibek Omarov
21195b3491 engine: increase logo and hpak limits, add cl_logomaxdim cvar to limit decal size (set to 96, default HL logo size is 64) 2024-06-11 07:47:01 +03:00
Alibek Omarov
3f66f6a6a5 ref: null: update to RefAPI 8 2024-06-11 06:30:17 +03:00
Alibek Omarov
daae4f2f80 engine: ref_api: bump RefAPI to version 8 2024-06-11 06:18:09 +03:00
Alibek Omarov
4e2708c1ac engine: bring back texture replacement 2024-06-11 06:16:26 +03:00
Alibek Omarov
d57d8e0d5d ref: soft: fix R_DrawStretchPic and Draw_Fill with OpenMP enabled 2024-06-11 02:07:49 +03:00
Alibek Omarov
9577a6af21 ref: moved VGUI support API implementation to the engine 2024-06-11 02:07:49 +03:00
Alibek Omarov
107a6aed01 ref: move PARM_SURF_SAMPLESIZE handling to the engine 2024-06-11 02:07:49 +03:00
Alibek Omarov
2c2045d413 ref: move PARM_SKY_SPHERE handling to the engine 2024-06-11 02:07:49 +03:00
Alibek Omarov
30fe471d2b ref: move loading skybox into the engine 2024-06-11 02:07:44 +03:00
Alibek Omarov
5ab6979633 ref: move common quake sky cloud loading to the engine 2024-06-10 22:47:39 +03:00
160 changed files with 3534 additions and 3018 deletions

View File

@@ -1,9 +1,365 @@
# EditorConfig is awesome: https://EditorConfig.org
# this file is just a suggestion, you might follow it, you might not
root = true
[*]
charset = latin1
charset = utf-8
end_of_line = lf
indent_style = tab
insert_final_newline = true
trim_trailing_whitespace = true
ij_formatter_off_tag = @formatter:off
ij_formatter_on_tag = @formatter:on
[*.{c++,cc,cpp,cppm,cxx,h,h++,hh,hpp,hxx,inl,ipp,ixx,tlh,tli}]
# Visual C++ Formatting settings
cpp_indent_braces = false
cpp_indent_multi_line_relative_to = innermost_parenthesis
cpp_indent_within_parentheses = indent
cpp_indent_preserve_within_parentheses = true
cpp_indent_case_contents = true
cpp_indent_case_labels = false
cpp_indent_case_contents_when_block = false
cpp_indent_lambda_braces_when_parameter = true
cpp_indent_goto_labels = one_left
cpp_indent_preprocessor = leftmost_column
cpp_indent_access_specifiers = false
cpp_indent_namespace_contents = true
cpp_indent_preserve_comments = false
cpp_new_line_before_open_brace_namespace = new_line
cpp_new_line_before_open_brace_type = new_line
cpp_new_line_before_open_brace_function = new_line
cpp_new_line_before_open_brace_block = new_line
cpp_new_line_before_open_brace_lambda = new_line
cpp_new_line_scope_braces_on_separate_lines = true
cpp_new_line_close_brace_same_line_empty_type = false
cpp_new_line_close_brace_same_line_empty_function = false
cpp_new_line_before_catch = true
cpp_new_line_before_else = true
cpp_new_line_before_while_in_do_while = false
cpp_space_before_function_open_parenthesis = remove
cpp_space_within_parameter_list_parentheses = true
cpp_space_between_empty_parameter_list_parentheses = true
cpp_space_after_keywords_in_control_flow_statements = false
cpp_space_within_control_flow_statement_parentheses = true
cpp_space_before_lambda_open_parenthesis = false
cpp_space_within_cast_parentheses = false
cpp_space_after_cast_close_parenthesis = false
cpp_space_within_expression_parentheses = true
cpp_space_before_block_open_brace = true
cpp_space_between_empty_braces = true
cpp_space_before_initializer_list_open_brace = false
cpp_space_within_initializer_list_braces = true
cpp_space_preserve_in_initializer_list = true
cpp_space_before_open_square_bracket = false
cpp_space_within_square_brackets = false
cpp_space_before_empty_square_brackets = false
cpp_space_between_empty_square_brackets = false
cpp_space_group_square_brackets = true
cpp_space_within_lambda_brackets = false
cpp_space_between_empty_lambda_brackets = false
cpp_space_before_comma = false
cpp_space_after_comma = true
cpp_space_remove_around_member_operators = true
cpp_space_before_inheritance_colon = true
cpp_space_before_constructor_colon = true
cpp_space_remove_before_semicolon = true
cpp_space_after_semicolon = true
cpp_space_remove_around_unary_operator = true
cpp_space_around_binary_operator = insert
cpp_space_around_assignment_operator = insert
cpp_space_pointer_reference_alignment = right
cpp_space_around_ternary_operator = insert
cpp_use_unreal_engine_macro_formatting = true
cpp_wrap_preserve_blocks = one_liners
# IDEA settings
ij_c_add_brief_tag = false
ij_c_add_getter_prefix = true
ij_c_add_setter_prefix = true
ij_c_align_dictionary_pair_values = false
ij_c_align_group_field_declarations = false
ij_c_align_init_list_in_columns = true
ij_c_align_multiline_array_initializer_expression = false
ij_c_align_multiline_assignment = false
ij_c_align_multiline_binary_operation = false
ij_c_align_multiline_chained_methods = false
ij_c_align_multiline_for = true
ij_c_align_multiline_ternary_operation = false
ij_c_array_initializer_comma_on_next_line = false
ij_c_array_initializer_new_line_after_left_brace = false
ij_c_array_initializer_right_brace_on_new_line = false
ij_c_array_initializer_wrap = off
ij_c_assignment_wrap = off
ij_c_binary_operation_sign_on_next_line = false
ij_c_binary_operation_wrap = off
ij_c_blank_lines_after_class_header = 0
ij_c_blank_lines_after_imports = 1
ij_c_blank_lines_around_class = 1
ij_c_blank_lines_around_field = 0
ij_c_blank_lines_around_field_in_interface = 0
ij_c_blank_lines_around_method = 1
ij_c_blank_lines_around_method_in_interface = 1
ij_c_blank_lines_around_namespace = 0
ij_c_blank_lines_around_properties_in_declaration = 0
ij_c_blank_lines_around_properties_in_interface = 0
ij_c_blank_lines_before_imports = 1
ij_c_blank_lines_before_method_body = 0
ij_c_block_brace_placement = next_line
ij_c_block_brace_style = next_line
ij_c_block_comment_at_first_column = true
ij_c_catch_on_new_line = false
ij_c_class_brace_style = next_line
ij_c_class_constructor_init_list_align_multiline = true
ij_c_class_constructor_init_list_comma_on_next_line = false
ij_c_class_constructor_init_list_new_line_after_colon = never
ij_c_class_constructor_init_list_new_line_before_colon = if_long
ij_c_class_constructor_init_list_wrap = normal
ij_c_copy_is_deep = false
ij_c_create_interface_for_categories = true
ij_c_declare_generated_methods = true
ij_c_description_include_member_names = true
ij_c_discharged_short_ternary_operator = false
ij_c_do_not_add_breaks = false
ij_c_do_while_brace_force = never
ij_c_else_on_new_line = false
ij_c_enum_constants_comma_on_next_line = false
ij_c_enum_constants_wrap = off
ij_c_for_brace_force = never
ij_c_for_statement_new_line_after_left_paren = false
ij_c_for_statement_right_paren_on_new_line = false
ij_c_for_statement_wrap = off
ij_c_function_brace_placement = next_line
ij_c_function_call_arguments_align_multiline = true
ij_c_function_call_arguments_align_multiline_pars = false
ij_c_function_call_arguments_comma_on_next_line = false
ij_c_function_call_arguments_new_line_after_lpar = false
ij_c_function_call_arguments_new_line_before_rpar = false
ij_c_function_call_arguments_wrap = normal
ij_c_function_non_top_after_return_type_wrap = normal
ij_c_function_parameters_align_multiline = true
ij_c_function_parameters_align_multiline_pars = false
ij_c_function_parameters_comma_on_next_line = false
ij_c_function_parameters_new_line_after_lpar = false
ij_c_function_parameters_new_line_before_rpar = false
ij_c_function_parameters_wrap = normal
ij_c_function_top_after_return_type_wrap = normal
ij_c_generate_additional_eq_operators = true
ij_c_generate_additional_rel_operators = true
ij_c_generate_class_constructor = true
ij_c_generate_comparison_operators_use_std_tie = false
ij_c_generate_instance_variables_for_properties = ask
ij_c_generate_operators_as_members = true
ij_c_header_guard_style_pattern = ${PROJECT_NAME}_${FILE_NAME}_${EXT}
ij_c_if_brace_force = never
ij_c_in_line_short_ternary_operator = true
ij_c_indent_block_comment = true
ij_c_indent_c_struct_members = 4
ij_c_indent_case_from_switch = true
ij_c_indent_class_members = 4
ij_c_indent_directive_as_code = false
ij_c_indent_implementation_members = 0
ij_c_indent_inside_code_block = 4
ij_c_indent_interface_members = 0
ij_c_indent_interface_members_except_ivars_block = false
ij_c_indent_namespace_members = 4
ij_c_indent_preprocessor_directive = 0
ij_c_indent_visibility_keywords = 0
ij_c_insert_override = true
ij_c_insert_virtual_with_override = false
ij_c_introduce_auto_consts = false
ij_c_introduce_auto_vars = false
ij_c_introduce_const_params = false
ij_c_introduce_const_vars = false
ij_c_introduce_constexpr_consts = false
ij_c_introduce_generate_property = false
ij_c_introduce_generate_synthesize = true
ij_c_introduce_globals_to_header = true
ij_c_introduce_prop_to_private_category = false
ij_c_introduce_static_consts = true
ij_c_introduce_use_ns_types = false
ij_c_ivars_prefix = _
ij_c_ivars_suffix =
ij_c_keep_blank_lines_before_end = 2
ij_c_keep_blank_lines_before_right_brace = 2
ij_c_keep_blank_lines_in_code = 2
ij_c_keep_blank_lines_in_declarations = 2
ij_c_keep_case_expressions_in_one_line = false
ij_c_keep_control_statement_in_one_line = false
ij_c_keep_directive_at_first_column = true
ij_c_keep_first_column_comment = false
ij_c_keep_line_breaks = true
ij_c_keep_nested_namespaces_in_one_line = false
ij_c_keep_simple_blocks_in_one_line = false
ij_c_keep_simple_methods_in_one_line = false
ij_c_keep_structures_in_one_line = false
ij_c_lambda_capture_list_align_multiline = false
ij_c_lambda_capture_list_align_multiline_bracket = false
ij_c_lambda_capture_list_comma_on_next_line = false
ij_c_lambda_capture_list_new_line_after_lbracket = false
ij_c_lambda_capture_list_new_line_before_rbracket = false
ij_c_lambda_capture_list_wrap = off
ij_c_line_comment_add_space = false
ij_c_line_comment_at_first_column = true
ij_c_method_brace_placement = end_of_line
ij_c_method_call_arguments_align_by_colons = true
ij_c_method_call_arguments_align_multiline = false
ij_c_method_call_arguments_special_dictionary_pairs_treatment = true
ij_c_method_call_arguments_wrap = off
ij_c_method_call_chain_wrap = off
ij_c_method_parameters_align_by_colons = true
ij_c_method_parameters_align_multiline = false
ij_c_method_parameters_wrap = off
ij_c_namespace_brace_placement = next_line
ij_c_parentheses_expression_new_line_after_left_paren = false
ij_c_parentheses_expression_right_paren_on_new_line = false
ij_c_place_assignment_sign_on_next_line = false
ij_c_property_nonatomic = true
ij_c_put_ivars_to_implementation = true
ij_c_refactor_compatibility_aliases_and_classes = true
ij_c_refactor_properties_and_ivars = true
ij_c_release_style = ivar
ij_c_retain_object_parameters_in_constructor = true
ij_c_semicolon_after_method_signature = false
ij_c_shift_operation_align_multiline = true
ij_c_shift_operation_wrap = normal
ij_c_show_non_virtual_functions = false
ij_c_space_after_colon = true
ij_c_space_after_colon_in_foreach = true
ij_c_space_after_colon_in_selector = false
ij_c_space_after_comma = true
ij_c_space_after_cup_in_blocks = false
ij_c_space_after_dictionary_literal_colon = true
ij_c_space_after_for_semicolon = true
ij_c_space_after_init_list_colon = true
ij_c_space_after_method_parameter_type_parentheses = false
ij_c_space_after_method_return_type_parentheses = false
ij_c_space_after_pointer_in_declaration = false
ij_c_space_after_quest = true
ij_c_space_after_reference_in_declaration = false
ij_c_space_after_reference_in_rvalue = false
ij_c_space_after_structures_rbrace = true
ij_c_space_after_superclass_colon = true
ij_c_space_after_type_cast = false
ij_c_space_after_visibility_sign_in_method_declaration = true
ij_c_space_before_autorelease_pool_lbrace = true
ij_c_space_before_catch_keyword = true
ij_c_space_before_catch_left_brace = true
ij_c_space_before_catch_parentheses = false
ij_c_space_before_category_parentheses = true
ij_c_space_before_chained_send_message = true
ij_c_space_before_class_left_brace = true
ij_c_space_before_colon = true
ij_c_space_before_colon_in_foreach = true
ij_c_space_before_comma = false
ij_c_space_before_dictionary_literal_colon = true
ij_c_space_before_do_left_brace = true
ij_c_space_before_else_keyword = true
ij_c_space_before_else_left_brace = true
ij_c_space_before_export_lbrace = true
ij_c_space_before_for_left_brace = true
ij_c_space_before_for_parentheses = false
ij_c_space_before_for_semicolon = false
ij_c_space_before_if_left_brace = true
ij_c_space_before_if_parentheses = false
ij_c_space_before_init_list = false
ij_c_space_before_init_list_colon = true
ij_c_space_before_method_call_parentheses = false
ij_c_space_before_method_left_brace = true
ij_c_space_before_method_parentheses = false
ij_c_space_before_namespace_lbrace = true
ij_c_space_before_pointer_in_declaration = true
ij_c_space_before_property_attributes_parentheses = false
ij_c_space_before_protocols_brackets = true
ij_c_space_before_quest = true
ij_c_space_before_reference_in_declaration = true
ij_c_space_before_superclass_colon = true
ij_c_space_before_switch_left_brace = true
ij_c_space_before_switch_parentheses = false
ij_c_space_before_template_call_lt = false
ij_c_space_before_template_declaration_lt = true
ij_c_space_before_try_left_brace = true
ij_c_space_before_while_keyword = true
ij_c_space_before_while_left_brace = true
ij_c_space_before_while_parentheses = false
ij_c_space_between_adjacent_brackets = false
ij_c_space_between_operator_and_punctuator = false
ij_c_space_within_empty_array_initializer_braces = true
ij_c_spaces_around_additive_operators = true
ij_c_spaces_around_assignment_operators = true
ij_c_spaces_around_bitwise_operators = true
ij_c_spaces_around_equality_operators = true
ij_c_spaces_around_lambda_arrow = true
ij_c_spaces_around_logical_operators = true
ij_c_spaces_around_multiplicative_operators = true
ij_c_spaces_around_pm_operators = false
ij_c_spaces_around_relational_operators = true
ij_c_spaces_around_shift_operators = true
ij_c_spaces_around_unary_operator = false
ij_c_spaces_within_array_initializer_braces = true
ij_c_spaces_within_braces = false
ij_c_spaces_within_brackets = false
ij_c_spaces_within_cast_parentheses = false
ij_c_spaces_within_catch_parentheses = true
ij_c_spaces_within_category_parentheses = false
ij_c_spaces_within_empty_braces = false
ij_c_spaces_within_empty_function_call_parentheses = true
ij_c_spaces_within_empty_function_declaration_parentheses = true
ij_c_spaces_within_empty_lambda_capture_list_bracket = false
ij_c_spaces_within_empty_template_call_ltgt = false
ij_c_spaces_within_empty_template_declaration_ltgt = false
ij_c_spaces_within_for_parentheses = true
ij_c_spaces_within_function_call_parentheses = true
ij_c_spaces_within_function_declaration_parentheses = true
ij_c_spaces_within_if_parentheses = true
ij_c_spaces_within_lambda_capture_list_bracket = false
ij_c_spaces_within_method_parameter_type_parentheses = false
ij_c_spaces_within_method_return_type_parentheses = false
ij_c_spaces_within_parentheses = true
ij_c_spaces_within_property_attributes_parentheses = false
ij_c_spaces_within_protocols_brackets = false
ij_c_spaces_within_send_message_brackets = false
ij_c_spaces_within_structured_binding_list_bracket = false
ij_c_spaces_within_switch_parentheses = true
ij_c_spaces_within_template_call_ltgt = false
ij_c_spaces_within_template_declaration_ltgt = false
ij_c_spaces_within_template_double_gt = false
ij_c_spaces_within_while_parentheses = true
ij_c_special_else_if_treatment = true
ij_c_structured_binding_list_align_multiline = false
ij_c_structured_binding_list_align_multiline_bracket = false
ij_c_structured_binding_list_comma_on_next_line = false
ij_c_structured_binding_list_new_line_after_lbracket = false
ij_c_structured_binding_list_new_line_before_rbracket = false
ij_c_structured_binding_list_wrap = off
ij_c_superclass_list_after_colon = never
ij_c_superclass_list_align_multiline = true
ij_c_superclass_list_before_colon = if_long
ij_c_superclass_list_comma_on_next_line = false
ij_c_superclass_list_wrap = on_every_item
ij_c_tag_prefix_of_block_comment = at
ij_c_tag_prefix_of_line_comment = back_slash
ij_c_template_call_arguments_align_multiline = false
ij_c_template_call_arguments_align_multiline_pars = false
ij_c_template_call_arguments_comma_on_next_line = false
ij_c_template_call_arguments_new_line_after_lt = false
ij_c_template_call_arguments_new_line_before_gt = false
ij_c_template_call_arguments_wrap = off
ij_c_template_declaration_function_body_indent = false
ij_c_template_declaration_function_wrap = split_into_lines
ij_c_template_declaration_struct_body_indent = false
ij_c_template_declaration_struct_wrap = split_into_lines
ij_c_template_parameters_align_multiline = false
ij_c_template_parameters_align_multiline_pars = false
ij_c_template_parameters_comma_on_next_line = false
ij_c_template_parameters_new_line_after_lt = false
ij_c_template_parameters_new_line_before_gt = false
ij_c_template_parameters_wrap = off
ij_c_ternary_operation_signs_on_next_line = false
ij_c_ternary_operation_wrap = off
ij_c_type_qualifiers_placement = before
ij_c_use_modern_casts = true
ij_c_use_setters_in_constructor = true
ij_c_while_brace_force = never
ij_c_while_on_new_line = false
ij_c_wrap_property_declaration = off

View File

@@ -0,0 +1,40 @@
### HD (external) textures support
Xash3D supports loading texture replacements in TGA format for almost all types of models in the game, except alias models at this time.
Textures are expected to be located at:
* `modfolder/materials/<mapname>` - for a specific map
* `modfolder/materials/common` - common for all maps
* `modfolder/materials/decals` - for decals
* `modfolder/materials/models/<model>` - for models (texture name must match the internal texture name in the model)
Support for high-resolution textures is enabled setting `host_allow_materials` cvar to `1` or in the menu, in "Video options" section.
#### Xash3D FWGS additions
In addition to paths above, Xash3D FWGS checks following paths:
* `modfolder/materials/sprites/<sprite>` - for sprites, except HUD sprites
Also, to check which texture replacements are loaded successfully, failed or weren't found, a mod developer can set `host_allow_materials` cvar value to `2`. The engine will spew log at any developer level in the following format:
```
Looking for <replacement> replacement... <status code> (<path relative to mod directory>)
```
Status codes:
* `OK` - texture replacement file was found and loaded into GPU memory successfully
* `FAIL` - texture file was found but hasn't been parsed or loaded successfully. Refer to engine log for more details.
* `MISS` - texture file wasn't found
Example:
```
Looking for maps/bounce.bsp:!waterblue tex replacement...OK (materials/common/!waterblue.tga)
Looking for maps/bounce.bsp:!waterblue_luma tex replacement...MISS (not found)
Looking for {shot2 decal replacement...MISS (materials/decals/{shot2.tga)
Looking for {shot4 decal replacement...MISS (materials/decals/{shot4.tga)
Looking for {shot3 decal replacement...MISS (materials/decals/{shot3.tga)
Looking for models/gman tex replacement...FAIL (materials/models/gman/GMan_Case1.tga)
Looking for models/gman tex replacement...FAIL (materials/models/gman/inside_1.tga)
```

View File

@@ -1,5 +1,5 @@
/*
features.h - engine features that can be enabled by mod-maker request
enginefeatures.h - engine features that can be enabled by mod-maker request
Copyright (C) 2012 Uncle Mike
This program is free software: you can redistribute it and/or modify
@@ -27,6 +27,7 @@ GNU General Public License for more details.
#define ENGINE_COMPUTE_STUDIO_LERP (1<<7) // enable MOVETYPE_STEP lerping back in engine
#define ENGINE_LINEAR_GAMMA_SPACE (1<<8) // disable influence of gamma/brightness cvars to textures/lightmaps, for mods with custom renderer
#define ENGINE_DISABLE_HDTEXTURES (1U<<30) // disable support of HD-textures in case custom renderer have separate way to load them
#define ENGINE_STEP_POSHISTORY_LERP (1U<<31) // enable MOVETYPE_STEP interpolation based on position history. Incompatible with ENGINE_COMPUTE_STUDIO_LERP!
// adjust the mask when features will be added or removed

View File

@@ -27,6 +27,7 @@
// Set this flag for things like broadcast requests, etc. where the engine should not
// kill the request hook after receiving the first response
#define FNETAPI_MULTIPLE_RESPONSE ( 1<<0 )
#define FNETAPI_LEGACY_PROTOCOL ( 1<<1 ) // xash3d-fwgs extension
struct net_response_s;
typedef void (*net_api_response_func_t) ( struct net_response_s *response );
@@ -35,6 +36,7 @@ typedef void (*net_api_response_func_t) ( struct net_response_s *response );
#define NET_ERROR_TIMEOUT ( 1<<0 )
#define NET_ERROR_PROTO_UNSUPPORTED ( 1<<1 )
#define NET_ERROR_UNDEFINED ( 1<<2 )
#define NET_ERROR_FORBIDDEN ( 1<<3 ) // xash3d-fwgs extension
typedef struct net_adrlist_s
{

View File

@@ -168,8 +168,9 @@ _inline float LittleFloat( float f )
#endif
typedef unsigned int dword;
typedef unsigned int uint;
typedef unsigned int dword;
typedef unsigned int uint;
typedef unsigned long ulong;
typedef char string[MAX_STRING];
typedef struct file_s file_t; // normal file
typedef struct stream_s stream_t; // sound stream for background music playing

View File

@@ -349,7 +349,7 @@ void CL_SetSky_f( void )
return;
}
ref.dllFuncs.R_SetupSky( Cmd_Argv( 1 ));
R_SetupSky( Cmd_Argv( 1 ));
}
/*

View File

@@ -105,7 +105,7 @@ void CL_AddToResourceList( resource_t *pResource, resource_t *pList )
void CL_RemoveFromResourceList( resource_t *pResource )
{
if( pResource->pPrev == NULL || pResource->pNext == NULL )
Host_Error( "mislinked resource in CL_RemoveFromResourceList\n" );
Host_Error( "mislinked resource in %s\n", __func__ );
if( pResource->pNext == pResource || pResource->pPrev == pResource )
Host_Error( "attempt to free last entry in list.\n" );
@@ -120,7 +120,7 @@ void CL_MoveToOnHandList( resource_t *pResource )
{
if( !pResource )
{
Con_Reportf( "Null resource passed to CL_MoveToOnHandList\n" );
Con_Reportf( "Null resource passed to %s\n", __func__ );
return;
}

View File

@@ -52,9 +52,23 @@ const char *CL_MsgInfo( int cmd )
// get engine message name
const char *svc_string = NULL;
if( cls.legacymode )
switch( cls.legacymode )
{
case PROTO_CURRENT:
svc_string = svc_strings[cmd];
break;
case PROTO_LEGACY:
svc_string = svc_legacy_strings[cmd];
break;
case PROTO_QUAKE:
svc_string = svc_quake_strings[cmd];
break;
case PROTO_GOLDSRC:
svc_string = svc_goldsrc_strings[cmd];
break;
}
// fall back to current protocol strings
if( !svc_string )
svc_string = svc_strings[cmd];

View File

@@ -109,6 +109,40 @@ struct
static qboolean CL_NextDemo( void );
static int CL_GetDemoNetProtocol( connprotocol_t proto )
{
switch( proto )
{
case PROTO_CURRENT:
return PROTOCOL_VERSION;
case PROTO_LEGACY:
return PROTOCOL_LEGACY_VERSION;
case PROTO_QUAKE:
return PROTOCOL_VERSION_QUAKE;
case PROTO_GOLDSRC:
return PROTOCOL_GOLDSRC_VERSION;
}
return PROTOCOL_VERSION;
}
static connprotocol_t CL_GetProtocolFromDemo( int net_protocol )
{
switch( net_protocol )
{
case PROTOCOL_VERSION:
return PROTO_CURRENT;
case PROTOCOL_LEGACY_VERSION:
return PROTO_LEGACY;
case PROTOCOL_VERSION_QUAKE:
return PROTO_QUAKE;
case PROTOCOL_GOLDSRC_VERSION:
return PROTO_GOLDSRC;
}
return PROTO_CURRENT;
}
/*
====================
CL_StartupDemoHeader
@@ -119,12 +153,8 @@ we record a demo on this level
*/
void CL_StartupDemoHeader( void )
{
if( cls.demoheader )
{
FS_Close( cls.demoheader );
}
CL_CloseDemoHeader();
// Note: this is replacing tmpfile()
cls.demoheader = FS_Open( "demoheader.tmp", "w+b", true );
if( !cls.demoheader )
@@ -373,7 +403,7 @@ static void CL_WriteDemoHeader( const char *name )
demo.header.id = IDEMOHEADER;
demo.header.dem_protocol = DEMO_PROTOCOL;
demo.header.net_protocol = cls.legacymode ? PROTOCOL_LEGACY_VERSION : PROTOCOL_VERSION;
demo.header.net_protocol = CL_GetDemoNetProtocol( cls.legacymode );
demo.header.host_fps = host_maxfps.value ? bound( MIN_FPS, host_maxfps.value, MAX_FPS ) : MAX_FPS;
Q_strncpy( demo.header.mapname, clgame.mapname, sizeof( demo.header.mapname ));
Q_strncpy( demo.header.comment, clgame.maptitle, sizeof( demo.header.comment ));
@@ -393,6 +423,7 @@ static void CL_WriteDemoHeader( const char *name )
// finish off the startup info.
CL_WriteDemoCmdHeader( dem_stop, cls.demoheader );
FS_Flush( cls.demoheader );
// now copy the stuff we cached from the server.
copysize = savepos = FS_Tell( cls.demoheader );
@@ -1489,6 +1520,7 @@ void CL_PlayDemo_f( void )
}
if( neg ) cls.forcetrack = -cls.forcetrack;
cls.legacymode = PROTO_QUAKE;
CL_DemoStartPlayback( DEMO_QUAKE1 );
return; // quake demo is started
}
@@ -1544,9 +1576,11 @@ void CL_PlayDemo_f( void )
CL_DemoStartPlayback( DEMO_XASH3D );
// must be after DemoStartPlayback, as CL_Disconnect_f resets the protocol
cls.legacymode = CL_GetProtocolFromDemo( demo.header.net_protocol );
// g-cont. is this need?
Q_strncpy( cls.servername, demoname, sizeof( cls.servername ));
cls.legacymode = demo.header.net_protocol == PROTOCOL_LEGACY_VERSION;
// begin a playback demo
}
@@ -1588,7 +1622,7 @@ void CL_StartDemos_f( void )
c = Cmd_Argc() - 1;
if( c > MAX_DEMOS )
{
Con_DPrintf( S_WARN "Host_StartDemos: max %i demos in demoloop\n", MAX_DEMOS );
Con_DPrintf( S_WARN "%s: max %i demos in demoloop\n", __func__, MAX_DEMOS );
c = MAX_DEMOS;
}

View File

@@ -219,7 +219,7 @@ static qboolean CL_FireEvent( event_info_t *ei, int slot )
if( !ev )
{
idx = bound( 1, ei->index, ( MAX_EVENTS - 1 ));
Con_Reportf( S_ERROR "CL_FireEvent: %s not precached\n", cl.event_precache[idx] );
Con_Reportf( S_ERROR "%s: %s not precached\n", __func__, cl.event_precache[idx] );
break;
}
@@ -244,7 +244,7 @@ static qboolean CL_FireEvent( event_info_t *ei, int slot )
return true;
}
Con_Reportf( S_ERROR "CL_FireEvent: %s not hooked\n", name );
Con_Reportf( S_ERROR "%s: %s not hooked\n", __func__, name );
break;
}
}
@@ -497,14 +497,14 @@ void GAME_EXPORT CL_PlaybackEvent( int flags, const edict_t *pInvoker, word even
// first check event for out of bounds
if( eventindex < 1 || eventindex >= MAX_EVENTS )
{
Con_DPrintf( S_ERROR "CL_PlaybackEvent: invalid eventindex %i\n", eventindex );
Con_DPrintf( S_ERROR "%s: invalid eventindex %i\n", __func__, eventindex );
return;
}
// check event for precached
if( !CL_EventIndex( cl.event_precache[eventindex] ))
{
Con_DPrintf( S_ERROR "CL_PlaybackEvent: event %i was not precached\n", eventindex );
Con_DPrintf( S_ERROR "%s: event %i was not precached\n", __func__, eventindex );
return;
}

View File

@@ -712,7 +712,7 @@ static void CL_FlushEntityPacket( sizebuf_t *msg )
break; // done
if( MSG_CheckOverflow( msg ))
Host_Error( "CL_FlushEntityPacket: overflow\n" );
Host_Error( "%s: overflow\n", __func__ );
MSG_ReadDeltaEntity( msg, &from, &to, newnum, CL_IsPlayerIndex( newnum ) ? DELTA_PLAYER : DELTA_ENTITY, cl.mtime[0] );
}
@@ -740,7 +740,7 @@ static void CL_DeltaEntity( sizebuf_t *msg, frame_t *frame, int newnum, entity_s
if(( newnum < 0 ) || ( newnum >= clgame.maxEntities ))
{
Con_DPrintf( S_ERROR "CL_DeltaEntity: invalid newnum: %d\n", newnum );
Con_DPrintf( S_ERROR "%s: invalid newnum: %d\n", __func__, newnum );
if( has_update )
MSG_ReadDeltaEntity( msg, old, state, newnum, delta_type, cl.mtime[0] );
return;
@@ -885,7 +885,7 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
break; // done
if( MSG_CheckOverflow( msg ))
Host_Error( "CL_ParsePacketEntities: overflow\n" );
Host_Error( "%s: overflow\n", __func__ );
player = CL_IsPlayerIndex( newnum );
@@ -955,7 +955,7 @@ int CL_ParsePacketEntities( sizebuf_t *msg, qboolean delta )
}
if( newframe->num_entities != count && newframe->num_entities != 0 )
Con_Reportf( S_WARN "CL_Parse%sPacketEntities: (%i should be %i)\n", delta ? "Delta" : "", newframe->num_entities, count );
Con_Reportf( S_WARN "%s%s: (%i should be %i)\n", __func__, delta ? "Delta" : "", newframe->num_entities, count );
if( !newframe->valid )
return playerbytes; // frame is not valid but message was parsed
@@ -1187,7 +1187,7 @@ static void CL_LinkPacketEntities( frame_t *frame )
if( !ent )
{
Con_Reportf( S_ERROR "CL_LinkPacketEntity: bad entity %i\n", state->number );
Con_Reportf( S_ERROR "%s: bad entity %i\n", __func__, state->number );
continue;
}

View File

@@ -231,7 +231,7 @@ static void CL_InitCDAudio( const char *filename )
if( ++c > MAX_CDTRACKS - 1 )
{
Con_Reportf( S_WARN "CD_Init: too many tracks %i in %s\n", MAX_CDTRACKS, filename );
Con_Reportf( S_WARN "%s: too many tracks %i in %s\n", __func__, MAX_CDTRACKS, filename );
break;
}
}
@@ -777,14 +777,14 @@ static const char *CL_SoundFromIndex( int index )
if( !hSound )
{
Con_DPrintf( S_ERROR "CL_SoundFromIndex: invalid sound index %i\n", index );
Con_DPrintf( S_ERROR "%s: invalid sound index %i\n", __func__, index );
return NULL;
}
sfx = S_GetSfxByHandle( hSound );
if( !sfx )
{
Con_DPrintf( S_ERROR "CL_SoundFromIndex: bad sfx for index %i\n", index );
Con_DPrintf( S_ERROR "%s: bad sfx for index %i\n", __func__, index );
return NULL;
}
@@ -1041,10 +1041,10 @@ void CL_LinkUserMessage( char *pszName, const int svc_num, int iSize )
int i;
if( !pszName || !*pszName )
Host_Error( "CL_LinkUserMessage: bad message name\n" );
Host_Error( "%s: bad message name\n", __func__ );
if( svc_num <= svc_lastmsg )
Host_Error( "CL_LinkUserMessage: tried to hook a system message \"%s\"\n", svc_strings[svc_num] );
Host_Error( "%s: tried to hook a system message \"%s\"\n", __func__, svc_strings[svc_num] );
// see if already hooked
for( i = 0; i < MAX_USER_MESSAGES && clgame.msg[i].name[0]; i++ )
@@ -1061,7 +1061,7 @@ void CL_LinkUserMessage( char *pszName, const int svc_num, int iSize )
if( i == MAX_USER_MESSAGES )
{
Host_Error( "CL_LinkUserMessage: MAX_USER_MESSAGES hit!\n" );
Host_Error( "%s: MAX_USER_MESSAGES hit!\n", __func__ );
return;
}
@@ -1242,7 +1242,7 @@ static model_t *CL_LoadSpriteModel( const char *filename, uint type, uint texFla
if( !COM_CheckString( filename ))
{
Con_Reportf( S_ERROR "CL_LoadSpriteModel: bad name!\n" );
Con_Reportf( S_ERROR "%s: bad name!\n", __func__ );
return NULL;
}
@@ -1503,12 +1503,12 @@ static void GAME_EXPORT pfnSPR_DrawAdditive( int frame, int x, int y, const wrec
/*
=========
pfnSPR_GetList
SPR_GetList
for parsing half-life scripts - hud.txt etc
=========
*/
static client_sprite_t *pfnSPR_GetList( char *psz, int *piCount )
static client_sprite_t *SPR_GetList( char *psz, int *piCount )
{
cached_spritelist_t *pEntry = &clgame.sprlist[0];
int slot, index, numSprites = 0;
@@ -1534,7 +1534,7 @@ static client_sprite_t *pfnSPR_GetList( char *psz, int *piCount )
if( slot == MAX_CLIENT_SPRITES )
{
Con_Printf( S_ERROR "SPR_GetList: overflow cache!\n" );
Con_Printf( S_ERROR "%s: overflow cache!\n", __func__ );
return NULL;
}
@@ -1743,7 +1743,7 @@ static int GAME_EXPORT pfnHookUserMsg( const char *pszName, pfnUserMsgHook pfn )
if( i == MAX_USER_MESSAGES )
{
Host_Error( "HookUserMsg: MAX_USER_MESSAGES hit!\n" );
Host_Error( "%s: MAX_USER_MESSAGES hit!\n", __func__ );
return 0;
}
@@ -2293,7 +2293,7 @@ static void GAME_EXPORT pfnHookEvent( const char *filename, pfnEventHook pfn )
if( !Q_stricmp( name, ev->name ) && ev->func != NULL )
{
Con_Reportf( S_WARN "CL_HookEvent: %s already hooked!\n", name );
Con_Reportf( S_WARN "%s: %s already hooked!\n", __func__, name );
return;
}
}
@@ -2376,7 +2376,7 @@ static int GAME_EXPORT CL_FindModelIndex( const char *m )
if( lasttimewarn < host.realtime )
{
// tell user about problem (but don't spam console)
Con_Printf( S_ERROR "Could not find index for model %s: not precached\n", filepath );
Con_DPrintf( S_ERROR "Could not find index for model %s: not precached\n", filepath );
lasttimewarn = host.realtime + 1.0f;
}
@@ -2788,10 +2788,10 @@ static void GAME_EXPORT PlayerInfo_SetValueForKey( const char *key, const char *
{
Cvar_DirectSet( var, value );
}
else if( Info_SetValueForStarKey( cls.userinfo, key, value, MAX_INFO_STRING ))
else if( Info_SetValueForStarKey( cls.userinfo, key, value, sizeof( cls.userinfo )))
{
// time to update server copy of userinfo
CL_ServerCommand( true, "setinfo \"%s\" \"%s\"\n", key, value );
CL_UpdateInfo( key, value );
}
}
@@ -3420,11 +3420,11 @@ static void GAME_EXPORT NetAPI_SendRequest( int context, int request, int flags,
if( !response )
{
Con_DPrintf( S_ERROR "Net_SendRequest: no callbcak specified for request with context %i!\n", context );
Con_DPrintf( S_ERROR "%s: no callbcak specified for request with context %i!\n", __func__, context );
return;
}
if( remote_address->type != NA_IPX && remote_address->type != NA_BROADCAST_IPX )
if( remote_address->type == NA_IPX || remote_address->type == NA_BROADCAST_IPX )
return; // IPX no longer support
if( request == NETAPI_REQUEST_SERVERLIST )
@@ -3467,7 +3467,7 @@ static void GAME_EXPORT NetAPI_SendRequest( int context, int request, int flags,
nr->flags = flags;
// local servers request
Q_snprintf( req, sizeof( req ), "netinfo %i %i %i", PROTOCOL_VERSION, context, request );
Q_snprintf( req, sizeof( req ), "netinfo %i %i %i", FBitSet( flags, FNETAPI_LEGACY_PROTOCOL ) ? PROTOCOL_LEGACY_VERSION : PROTOCOL_VERSION, context, request );
Netchan_OutOfBandPrint( NS_CLIENT, nr->resp.remote_address, "%s", req );
}
@@ -3772,7 +3772,7 @@ static demo_api_t gDemoApi =
Demo_WriteBuffer,
};
static net_api_t gNetApi =
net_api_t gNetApi =
{
NetAPI_InitNetworking,
NetAPI_Status,
@@ -3808,7 +3808,7 @@ static cl_enginefunc_t gEngfuncs =
pfnSPR_DrawAdditive,
SPR_EnableScissor,
SPR_DisableScissor,
pfnSPR_GetList,
SPR_GetList,
CL_FillRGBA,
CL_GetScreenInfo,
pfnSetCrosshair,
@@ -4030,14 +4030,14 @@ qboolean CL_LoadProgs( const char *name )
// trying to get single export
if(( GetClientAPI = (void *)COM_GetProcAddress( clgame.hInstance, "GetClientAPI" )) != NULL )
{
Con_Reportf( "CL_LoadProgs: found single callback export\n" );
Con_Reportf( "%s: found single callback export\n", __func__ );
// trying to fill interface now
GetClientAPI( &clgame.dllFuncs );
}
else if(( GetClientAPI = (void *)COM_GetProcAddress( clgame.hInstance, "F" )) != NULL )
{
Con_Reportf( "CL_LoadProgs: found single callback export (secured client dlls)\n" );
Con_Reportf( "%s: found single callback export (secured client dlls)\n", __func__ );
// trying to fill interface now
CL_GetSecuredClientAPI( GetClientAPI );
@@ -4065,7 +4065,7 @@ qboolean CL_LoadProgs( const char *name )
// functions are cleared before all the extensions are evaluated
if(( *func->func = (void *)COM_GetProcAddress( clgame.hInstance, func->name )) == NULL )
{
Con_Reportf( "CL_LoadProgs: failed to get address of %s proc\n", func->name );
Con_Reportf( "%s: failed to get address of %s proc\n", __func__, func->name );
if( critical_exports )
{
@@ -4092,13 +4092,13 @@ qboolean CL_LoadProgs( const char *name )
// functions are cleared before all the extensions are evaluated
// NOTE: new exports can be missed without stop the engine
if(( *func->func = (void *)COM_GetProcAddress( clgame.hInstance, func->name )) == NULL )
Con_Reportf( "CL_LoadProgs: failed to get address of %s proc\n", func->name );
Con_Reportf( "%s: failed to get address of %s proc\n", __func__, func->name );
}
if( !clgame.dllFuncs.pfnInitialize( &gEngfuncs, CLDLL_INTERFACE_VERSION ))
{
COM_FreeLibrary( clgame.hInstance );
Con_Reportf( "CL_LoadProgs: can't init client API\n" );
Con_Reportf( "%s: can't init client API\n", __func__ );
clgame.hInstance = NULL;
return false;
}
@@ -4115,10 +4115,10 @@ qboolean CL_LoadProgs( const char *name )
CL_InitTempEnts ();
if( !R_InitRenderAPI()) // Xash3D extension
Con_Reportf( S_WARN "CL_LoadProgs: couldn't get render API\n" );
Con_Reportf( S_WARN "%s: couldn't get render API\n", __func__ );
if( !Mobile_Init() ) // Xash3D FWGS extension: mobile interface
Con_Reportf( S_WARN "CL_LoadProgs: couldn't get mobility API\n" );
Con_Reportf( S_WARN "%s: couldn't get mobility API\n", __func__ );
CL_InitEdicts( cl.maxclients ); // initailize local player and world
CL_InitClientMove(); // initialize pm_shared

View File

@@ -216,12 +216,14 @@ UI_ShowConnectionWarning
show message box
=================
*/
void UI_ShowMessageBox( const char *text )
qboolean UI_ShowMessageBox( const char *text )
{
if( gameui.dllFuncs2.pfnShowMessageBox )
{
gameui.dllFuncs2.pfnShowMessageBox( text );
return true;
}
return false;
}
void UI_ConnectionProgress_Disconnect( void )
@@ -492,7 +494,7 @@ static HIMAGE GAME_EXPORT pfnPIC_Load( const char *szPicName, const byte *image_
if( !COM_CheckString( szPicName ))
{
Con_Reportf( S_ERROR "CL_LoadImage: refusing to load image with empty name\n" );
Con_Reportf( S_ERROR "%s: refusing to load image with empty name\n", __func__ );
return 0;
}
@@ -1011,7 +1013,7 @@ pfnChangeInstance
*/
static void GAME_EXPORT pfnChangeInstance( const char *newInstance, const char *szFinalMessage )
{
Con_Reportf( S_ERROR "ChangeInstance menu call is deprecated!\n" );
Con_Reportf( S_ERROR "%s menu call is deprecated!\n", __func__ );
}
/*
@@ -1235,6 +1237,7 @@ static ui_extendedfuncs_t gExtendedfuncs =
NET_AdrToString,
NET_CompareAdrSort,
Sys_GetNativeObject,
&gNetApi,
};
void UI_UnloadProgs( void )
@@ -1294,7 +1297,7 @@ qboolean UI_LoadProgs( void )
if(( GetMenuAPI = (MENUAPI)COM_GetProcAddress( gameui.hInstance, "GetMenuAPI" )) == NULL )
{
COM_FreeLibrary( gameui.hInstance );
Con_Reportf( "UI_LoadProgs: can't init menu API\n" );
Con_Reportf( "%s: can't init menu API\n", __func__ );
gameui.hInstance = NULL;
return false;
}
@@ -1310,7 +1313,7 @@ qboolean UI_LoadProgs( void )
if( !GetMenuAPI( &gameui.dllFuncs, &gpEngfuncs, gameui.globals ))
{
COM_FreeLibrary( gameui.hInstance );
Con_Reportf( "UI_LoadProgs: can't init menu API\n" );
Con_Reportf( "%s: can't init menu API\n", __func__ );
Mem_FreePool( &gameui.mempool );
gameui.hInstance = NULL;
return false;
@@ -1323,10 +1326,10 @@ qboolean UI_LoadProgs( void )
// try to initialize new extended API
if( ( GetExtAPI = (UIEXTENEDEDAPI)COM_GetProcAddress( gameui.hInstance, "GetExtAPI" ) ) )
{
Con_Reportf( "UI_LoadProgs: extended Menu API found\n" );
Con_Reportf( "%s: extended Menu API found\n", __func__ );
if( GetExtAPI( MENU_EXTENDED_API_VERSION, &gameui.dllFuncs2, &gpExtendedfuncs ) )
{
Con_Reportf( "UI_LoadProgs: extended Menu API initialized\n" );
Con_Reportf( "%s: extended Menu API initialized\n", __func__ );
gameui.use_extended_api = true;
}
}
@@ -1334,11 +1337,11 @@ qboolean UI_LoadProgs( void )
{
if( ( GiveTextApi = (UITEXTAPI)COM_GetProcAddress( gameui.hInstance, "GiveTextAPI" ) ) )
{
Con_Reportf( "UI_LoadProgs: extended text API found\n" );
Con_Reportf( "%s: extended text API found\n", __func__ );
Con_Reportf( S_WARN "Text API is deprecated! If you are mod developer, consider moving to Extended Menu API!\n" );
if( GiveTextApi( &gpExtendedfuncs ) ) // they are binary compatible, so we can just pass extended funcs API to menu
{
Con_Reportf( "UI_LoadProgs: extended text API initialized\n" );
Con_Reportf( "%s: extended text API initialized\n", __func__ );
gameui.use_extended_api = true;
}
}
@@ -1346,7 +1349,7 @@ qboolean UI_LoadProgs( void )
gameui.dllFuncs2.pfnAddTouchButtonToList = (ADDTOUCHBUTTONTOLIST)COM_GetProcAddress( gameui.hInstance, "AddTouchButtonToList" );
if( gameui.dllFuncs2.pfnAddTouchButtonToList )
{
Con_Reportf( "UI_LoadProgs: AddTouchButtonToList call found\n" );
Con_Reportf( "%s: AddTouchButtonToList call found\n", __func__ );
Con_Reportf( S_WARN "AddTouchButtonToList is deprecated! If you are mod developer, consider moving to Extended Menu API!\n" );
}
}

View File

@@ -31,15 +31,16 @@ GNU General Public License for more details.
#define CL_TEST_RETRIES 5
CVAR_DEFINE_AUTO( mp_decals, "300", FCVAR_ARCHIVE, "decals limit in multiplayer" );
CVAR_DEFINE_AUTO( dev_overview, "0", 0, "draw level in overview-mode" );
CVAR_DEFINE_AUTO( cl_resend, "6.0", 0, "time to resend connect" );
static CVAR_DEFINE_AUTO( dev_overview, "0", 0, "draw level in overview-mode" );
static CVAR_DEFINE_AUTO( cl_resend, "6.0", 0, "time to resend connect" );
CVAR_DEFINE( cl_allow_download, "cl_allowdownload", "1", FCVAR_ARCHIVE, "allow to downloading resources from the server" );
CVAR_DEFINE_AUTO( cl_allow_upload, "1", FCVAR_ARCHIVE, "allow to uploading resources to the server" );
static CVAR_DEFINE( cl_allow_upload, "cl_allowupload", "1", FCVAR_ARCHIVE, "allow to uploading resources to the server" );
CVAR_DEFINE_AUTO( cl_download_ingame, "1", FCVAR_ARCHIVE, "allow to downloading resources while client is active" );
CVAR_DEFINE_AUTO( cl_logofile, "lambda", FCVAR_ARCHIVE, "player logo name" );
CVAR_DEFINE_AUTO( cl_logocolor, "orange", FCVAR_ARCHIVE, "player logo color" );
CVAR_DEFINE_AUTO( cl_logoext, "bmp", FCVAR_ARCHIVE, "temporary cvar to tell engine which logo must be packed" );
CVAR_DEFINE_AUTO( cl_test_bandwidth, "1", FCVAR_ARCHIVE, "test network bandwith before connection" );
static CVAR_DEFINE_AUTO( cl_logofile, "lambda", FCVAR_ARCHIVE, "player logo name" );
static CVAR_DEFINE_AUTO( cl_logocolor, "orange", FCVAR_ARCHIVE, "player logo color" );
static CVAR_DEFINE_AUTO( cl_logoext, "bmp", FCVAR_ARCHIVE, "temporary cvar to tell engine which logo must be packed" );
CVAR_DEFINE_AUTO( cl_logomaxdim, "96", FCVAR_ARCHIVE, "maximum decal dimension" );
static CVAR_DEFINE_AUTO( cl_test_bandwidth, "1", FCVAR_ARCHIVE, "test network bandwith before connection" );
CVAR_DEFINE( cl_draw_particles, "r_drawparticles", "1", FCVAR_CHEAT, "render particles" );
CVAR_DEFINE( cl_draw_tracers, "r_drawtracers", "1", FCVAR_CHEAT, "render tracers" );
@@ -48,17 +49,17 @@ CVAR_DEFINE( cl_draw_beams, "r_drawbeams", "1", FCVAR_CHEAT, "render beams" );
static CVAR_DEFINE_AUTO( rcon_address, "", FCVAR_PRIVILEGED, "remote control address" );
CVAR_DEFINE_AUTO( cl_timeout, "60", 0, "connect timeout (in-seconds)" );
CVAR_DEFINE_AUTO( cl_nopred, "0", FCVAR_ARCHIVE|FCVAR_USERINFO, "disable client movement prediction" );
CVAR_DEFINE_AUTO( cl_nodelta, "0", 0, "disable delta-compression for server messages" );
static CVAR_DEFINE_AUTO( cl_nodelta, "0", 0, "disable delta-compression for server messages" );
CVAR_DEFINE( cl_crosshair, "crosshair", "1", FCVAR_ARCHIVE, "show weapon chrosshair" );
static CVAR_DEFINE_AUTO( cl_cmdbackup, "10", FCVAR_ARCHIVE, "how many additional history commands are sent" );
CVAR_DEFINE_AUTO( cl_showerror, "0", FCVAR_ARCHIVE, "show prediction error" );
CVAR_DEFINE_AUTO( cl_bmodelinterp, "1", FCVAR_ARCHIVE, "enable bmodel interpolation" );
CVAR_DEFINE_AUTO( cl_lightstyle_lerping, "0", FCVAR_ARCHIVE, "enables animated light lerping (perfomance option)" );
static CVAR_DEFINE_AUTO( cl_lightstyle_lerping, "0", FCVAR_ARCHIVE, "enables animated light lerping (perfomance option)" );
CVAR_DEFINE_AUTO( cl_idealpitchscale, "0.8", 0, "how much to look up/down slopes and stairs when not using freelook" );
CVAR_DEFINE_AUTO( cl_nosmooth, "0", FCVAR_ARCHIVE, "disable smooth up stair climbing" );
CVAR_DEFINE_AUTO( cl_smoothtime, "0.1", FCVAR_ARCHIVE, "time to smooth up" );
CVAR_DEFINE_AUTO( cl_clockreset, "0.1", FCVAR_ARCHIVE, "frametime delta maximum value before reset" );
CVAR_DEFINE_AUTO( cl_fixtimerate, "7.5", FCVAR_ARCHIVE, "time in msec to client clock adjusting" );
static CVAR_DEFINE_AUTO( cl_fixtimerate, "7.5", FCVAR_ARCHIVE, "time in msec to client clock adjusting" );
CVAR_DEFINE_AUTO( hud_fontscale, "1.0", FCVAR_ARCHIVE|FCVAR_LATCH, "scale hud font texture" );
CVAR_DEFINE_AUTO( hud_fontrender, "0", FCVAR_ARCHIVE, "hud font render mode (0: additive, 1: holes, 2: trans)" );
CVAR_DEFINE_AUTO( hud_scale, "0", FCVAR_ARCHIVE|FCVAR_LATCH, "scale hud at current resolution" );
@@ -68,7 +69,7 @@ CVAR_DEFINE_AUTO( cl_updaterate, "20", FCVAR_USERINFO|FCVAR_ARCHIVE, "refresh ra
CVAR_DEFINE_AUTO( cl_showevents, "0", FCVAR_ARCHIVE, "show events playback" );
CVAR_DEFINE_AUTO( cl_cmdrate, "60", FCVAR_ARCHIVE, "Max number of command packets sent to server per second" );
CVAR_DEFINE( cl_interp, "ex_interp", "0.1", FCVAR_ARCHIVE | FCVAR_FILTERABLE, "Interpolate object positions starting this many seconds in past" );
CVAR_DEFINE_AUTO( cl_nointerp, "0", FCVAR_CLIENTDLL, "disable interpolation of entities and players" );
CVAR_DEFINE_AUTO( cl_nointerp, "0", 0, "disable interpolation of entities and players" );
static CVAR_DEFINE_AUTO( cl_dlmax, "0", FCVAR_USERINFO|FCVAR_ARCHIVE, "max allowed outcoming fragment size" );
static CVAR_DEFINE_AUTO( cl_upmax, "1200", FCVAR_ARCHIVE, "max allowed incoming fragment size" );
@@ -115,17 +116,12 @@ qboolean CL_IsInGame( void )
if( host.type == HOST_DEDICATED )
return true; // always active for dedicated servers
if( cl.background || CL_GetMaxClients() > 1 )
if( cl.background || cl.maxclients > 1 )
return true; // always active for multiplayer or background map
return ( cls.key_dest == key_game ); // active if not menu or console
}
qboolean CL_IsInMenu( void )
{
return ( cls.key_dest == key_menu );
}
qboolean CL_IsInConsole( void )
{
return ( cls.key_dest == key_console );
@@ -222,7 +218,7 @@ An svc_signonnum has been received, perform a client side setup
void CL_SignonReply( void )
{
// g-cont. my favorite message :-)
Con_Reportf( "CL_SignonReply: %i\n", cls.signon );
Con_Reportf( "%s: %i\n", __func__, cls.signon );
switch( cls.signon )
{
@@ -826,7 +822,7 @@ static void CL_WritePacket( void )
from = to;
if( MSG_CheckOverflow( &buf ))
Host_Error( "CL_WritePacket: overflowed command buffer (%i bytes)\n", MAX_CMD_BUFFER );
Host_Error( "%s: overflowed command buffer (%i bytes)\n", __func__, MAX_CMD_BUFFER );
}
// calculate a checksum over the move commands
@@ -851,7 +847,7 @@ static void CL_WritePacket( void )
}
if( MSG_CheckOverflow( &buf ))
Host_Error( "CL_WritePacket: overflowed command buffer (%i bytes)\n", MAX_CMD_BUFFER );
Host_Error( "%s: overflowed command buffer (%i bytes)\n", __func__, MAX_CMD_BUFFER );
// remember outgoing command that we are sending
cls.lastoutgoingcommand = cls.netchan.outgoing_sequence;
@@ -937,16 +933,16 @@ static void CL_BeginUpload_f( void )
memset( &custResource, 0, sizeof( custResource ));
COM_HexConvert( name + 4, 32, md5 );
if( HPAK_ResourceForHash( CUSTOM_RES_PATH, md5, &custResource ))
if( HPAK_ResourceForHash( hpk_custom_file.string, md5, &custResource ))
{
if( memcmp( md5, custResource.rgucMD5_hash, 16 ))
{
Con_Reportf( "Bogus data retrieved from %s, attempting to delete entry\n", CUSTOM_RES_PATH );
HPAK_RemoveLump( CUSTOM_RES_PATH, &custResource );
Con_Reportf( "Bogus data retrieved from %s, attempting to delete entry\n", hpk_custom_file.string );
HPAK_RemoveLump( hpk_custom_file.string, &custResource );
return;
}
if( HPAK_GetDataPointer( CUSTOM_RES_PATH, &custResource, &buf, &size ))
if( HPAK_GetDataPointer( hpk_custom_file.string, &custResource, &buf, &size ))
{
byte md5[16];
MD5Context_t ctx;
@@ -962,7 +958,7 @@ static void CL_BeginUpload_f( void )
Con_Reportf( "Purported: %s\n", MD5_Print( custResource.rgucMD5_hash ) );
Con_Reportf( "Actual : %s\n", MD5_Print( md5 ) );
Con_Reportf( "Removing conflicting lump\n" );
HPAK_RemoveLump( CUSTOM_RES_PATH, &custResource );
HPAK_RemoveLump( hpk_custom_file.string, &custResource );
return;
}
}
@@ -1018,7 +1014,7 @@ static void CL_SendConnectPacket( void )
if( !NET_StringToAdr( cls.servername, &adr ))
{
Con_Printf( "CL_SendConnectPacket: bad server address\n");
Con_Printf( "%s: bad server address\n", __func__ );
cls.connect_time = 0;
return;
}
@@ -1166,7 +1162,7 @@ static void CL_CheckForResend( void )
// only retry so many times before failure.
if( cls.connect_retry >= CL_CONNECTION_RETRIES )
{
Con_DPrintf( S_ERROR "CL_CheckForResend: couldn't connected\n" );
Con_DPrintf( S_ERROR "%s: couldn't connect\n", __func__ );
CL_Disconnect();
return;
}
@@ -1253,7 +1249,7 @@ static void CL_CreateResourceList( void )
{
SetBits( pNewResource->ucFlags, RES_CUSTOM );
memcpy( pNewResource->rgucMD5_hash, rgucMD5_hash, 16 );
HPAK_AddLump( false, CUSTOM_RES_PATH, pNewResource, NULL, fp );
HPAK_AddLump( false, hpk_custom_file.string, pNewResource, NULL, fp );
}
}
@@ -1269,16 +1265,28 @@ CL_Connect_f
static void CL_Connect_f( void )
{
string server;
qboolean legacyconnect = false;
connprotocol_t proto = PROTO_CURRENT;
// hidden hint to connect by using legacy protocol
// hint to connect by using legacy protocol
if( Cmd_Argc() == 3 )
{
legacyconnect = !Q_strcmp( Cmd_Argv( 2 ), "legacy" );
const char *s = Cmd_Argv( 2 );
if( !Q_strcmp( s, "current" ) || !Q_strcmp( s, "49" ))
proto = PROTO_CURRENT;
else if( !Q_strcmp( s, "legacy" ) || !Q_strcmp( s, "48" ))
proto = PROTO_LEGACY;
else
{
// quake protocol only used for demos
// goldsrc protocol is not supported yet
Con_Printf( "Unknown protocol. Supported are: current, legacy\n" );
return;
}
}
else if( Cmd_Argc() != 2 )
{
Con_Printf( S_USAGE "connect <server>\n" );
Con_Printf( S_USAGE "connect <server> [protocol]\n" );
return;
}
@@ -1296,7 +1304,7 @@ static void CL_Connect_f( void )
Key_SetKeyDest( key_console );
cls.state = ca_connecting;
cls.legacymode = legacyconnect;
cls.legacymode = proto;
Q_strncpy( cls.servername, server, sizeof( cls.servername ));
cls.connect_time = MAX_HEARTBEAT; // CL_CheckForResend() will fire immediately
cls.max_fragment_size = FRAGMENT_MAX_SIZE; // guess a we can establish connection with maximum fragment size
@@ -1442,20 +1450,18 @@ static void CL_SendDisconnectMessage( void )
int CL_GetSplitSize( void )
{
int splitsize;
int splitsize = (int)cl_dlmax.value;
if( Host_IsDedicated() )
return 0;
if( !(cls.extensions & NET_EXT_SPLITSIZE) )
if( !FBitSet( cls.extensions, NET_EXT_SPLITSIZE ))
return 1400;
splitsize = cl_dlmax.value;
if( splitsize < FRAGMENT_MIN_SIZE || splitsize > FRAGMENT_MAX_SIZE )
if(( splitsize < FRAGMENT_MIN_SIZE ) || ( splitsize > FRAGMENT_MAX_SIZE ))
{
Cvar_SetValue( "cl_dlmax", FRAGMENT_DEFAULT_SIZE );
return FRAGMENT_DEFAULT_SIZE;
}
return cl_dlmax.value;
return (int)cl_dlmax.value;
}
/*
@@ -1526,7 +1532,7 @@ This is also called on Host_Error, so it shouldn't cause any errors
*/
void CL_Disconnect( void )
{
cls.legacymode = false;
cls.legacymode = PROTO_CURRENT;
if( cls.state == ca_disconnected )
return;
@@ -1556,7 +1562,7 @@ void CL_Disconnect( void )
cls.signon = 0;
// back to menu in non-developer mode
if( host_developer.value || CL_IsInMenu( ))
if( host_developer.value || cls.key_dest == key_menu )
return;
UI_SetActiveMenu( true );
@@ -1713,7 +1719,7 @@ static void CL_Reconnect_f( void )
if( COM_CheckString( cls.servername ))
{
qboolean legacy = cls.legacymode;
connprotocol_t proto = cls.legacymode;
if( cls.state >= ca_connected )
CL_Disconnect();
@@ -1722,7 +1728,7 @@ static void CL_Reconnect_f( void )
cls.demonum = cls.movienum = -1; // not in the demo loop now
cls.state = ca_connecting;
cls.signon = 0;
cls.legacymode = legacy; // don't change protocol
cls.legacymode = proto; // don't change protocol
Con_Printf( "reconnecting...\n" );
}
@@ -1735,7 +1741,7 @@ CL_FixupColorStringsForInfoString
all the keys and values must be ends with ^7
=================
*/
static void CL_FixupColorStringsForInfoString( const char *in, char *out )
static void CL_FixupColorStringsForInfoString( const char *in, char *out, size_t len )
{
qboolean hasPrefix = false;
qboolean endOfKeyVal = false;
@@ -1748,7 +1754,7 @@ static void CL_FixupColorStringsForInfoString( const char *in, char *out )
count++;
}
while( *in && count < MAX_INFO_STRING )
while( *in && count < len )
{
if( IsColorString( in ))
color = ColorIndex( *(in+1));
@@ -1819,7 +1825,7 @@ static void CL_ParseStatusMessage( netadr_t from, sizebuf_t *msg )
return;
}
CL_FixupColorStringsForInfoString( s, infostring );
CL_FixupColorStringsForInfoString( s, infostring, sizeof( infostring ));
if( !COM_CheckString( Info_ValueForKey( infostring, "gamedir" )))
{
@@ -1848,52 +1854,87 @@ CL_ParseNETInfoMessage
Handle a reply from a netinfo
=================
*/
static void CL_ParseNETInfoMessage( netadr_t from, sizebuf_t *msg, const char *s )
static void CL_ParseNETInfoMessage( netadr_t from, const char *s )
{
net_request_t *nr;
static char infostring[MAX_INFO_STRING+8];
net_request_t *nr = NULL;
static char infostring[MAX_PRINT_MSG];
int i, context, type;
int errorBits = 0;
const char *val;
size_t slen;
context = Q_atoi( Cmd_Argv( 1 ));
type = Q_atoi( Cmd_Argv( 2 ));
while( *s != '\\' ) s++; // fetching infostring
// check for errors
val = Info_ValueForKey( s, "neterror" );
if( !Q_stricmp( val, "protocol" ))
SetBits( errorBits, NET_ERROR_PROTO_UNSUPPORTED );
else if( !Q_stricmp( val, "undefined" ))
SetBits( errorBits, NET_ERROR_UNDEFINED );
CL_FixupColorStringsForInfoString( s, infostring );
// find a request with specified context
// find request with specified context and type
for( i = 0; i < MAX_REQUESTS; i++ )
{
nr = &clgame.net_requests[i];
if( nr->resp.context == context && nr->resp.type == type )
if( clgame.net_requests[i].resp.context == context && clgame.net_requests[i].resp.type == type )
{
// setup the answer
nr->resp.response = infostring;
nr->resp.remote_address = from;
nr->resp.error = NET_SUCCESS;
nr->resp.ping = host.realtime - nr->timesend;
if( nr->timeout <= host.realtime )
SetBits( nr->resp.error, NET_ERROR_TIMEOUT );
SetBits( nr->resp.error, errorBits ); // misc error bits
nr->pfnFunc( &nr->resp );
if( !FBitSet( nr->flags, FNETAPI_MULTIPLE_RESPONSE ))
memset( nr, 0, sizeof( *nr )); // done
return;
nr = &clgame.net_requests[i];
break;
}
}
// not found, ignore
if( nr == NULL )
return;
// find the payload
s = Q_strchr( s, ' ' ); // skip netinfo
if( !s )
return;
s = Q_strchr( s + 1, ' ' ); // skip challenge
if( !s )
return;
s = Q_strchr( s + 1, ' ' ); // skip type
if( s )
s++; // skip final whitespace
else if( type != NETAPI_REQUEST_PING ) // ping have no payload, and that's ok
return;
if( s )
{
if( s[0] == '\\' )
{
// check for errors
val = Info_ValueForKey( s, "neterror" );
if( !Q_stricmp( val, "protocol" ))
SetBits( errorBits, NET_ERROR_PROTO_UNSUPPORTED );
else if( !Q_stricmp( val, "undefined" ))
SetBits( errorBits, NET_ERROR_UNDEFINED );
else if( !Q_stricmp( val, "forbidden" ))
SetBits( errorBits, NET_ERROR_FORBIDDEN );
CL_FixupColorStringsForInfoString( s, infostring, sizeof( infostring ));
}
else
{
Q_strncpy( infostring, s, sizeof( infostring ));
}
}
else
{
infostring[0] = 0;
}
// setup the answer
nr->resp.response = infostring;
nr->resp.remote_address = from;
nr->resp.error = NET_SUCCESS;
nr->resp.ping = host.realtime - nr->timesend;
if( nr->timeout <= host.realtime )
SetBits( nr->resp.error, NET_ERROR_TIMEOUT );
SetBits( nr->resp.error, errorBits ); // misc error bits
nr->pfnFunc( &nr->resp );
if( !FBitSet( nr->flags, FNETAPI_MULTIPLE_RESPONSE ))
memset( nr, 0, sizeof( *nr )); // done
}
/*
@@ -1991,7 +2032,6 @@ static void CL_ConnectionlessPacket( netadr_t from, sizebuf_t *msg )
const char *c;
char buf[MAX_SYSPATH];
int len = sizeof( buf );
int dataoffset = 0;
netadr_t servadr;
MSG_Clear( msg );
@@ -2002,7 +2042,7 @@ static void CL_ConnectionlessPacket( netadr_t from, sizebuf_t *msg )
Cmd_TokenizeString( args );
c = Cmd_Argv( 0 );
Con_Reportf( "CL_ConnectionlessPacket: %s : %s\n", NET_AdrToString( from ), c );
Con_Reportf( "%s: %s : %s\n", __func__, NET_AdrToString( from ), c );
// server connection
if( !Q_strcmp( c, "client_connect" ))
@@ -2027,7 +2067,7 @@ static void CL_ConnectionlessPacket( netadr_t from, sizebuf_t *msg )
else if( !Q_strcmp( c, "netinfo" ))
{
// server responding to a status broadcast
CL_ParseNETInfoMessage( from, msg, args );
CL_ParseNETInfoMessage( from, args );
}
else if( !Q_strcmp( c, "cmd" ))
{
@@ -2048,7 +2088,11 @@ static void CL_ConnectionlessPacket( netadr_t from, sizebuf_t *msg )
else if( !Q_strcmp( c, "print" ))
{
// print command from somewhere
Con_Printf( "%s", MSG_ReadString( msg ));
char *s = MSG_ReadString( msg );
Con_Printf( S_CYAN "r:" S_DEFAULT " %s", s );
if( !COM_CheckStringEmpty( s ) || s[Q_strlen( s ) - 1] != '\n' )
Con_Printf( "\n" );
}
else if( !Q_strcmp( c, "testpacket" ))
{
@@ -2159,30 +2203,21 @@ static void CL_ConnectionlessPacket( netadr_t from, sizebuf_t *msg )
// a disconnect message from the server, which will happen if the server
// dropped the connection but it is still getting packets from us
CL_Disconnect_f();
if( NET_CompareAdr( from, cls.legacyserver ))
{
Cbuf_AddTextf( "connect %s legacy\n", NET_AdrToString( from ));
memset( &cls.legacyserver, 0, sizeof( cls.legacyserver ));
}
}
else if( !Q_strcmp( c, "errormsg" ))
{
char formatted_msg[MAX_VA_STRING];
if( !CL_IsFromConnectingServer( from ))
return;
args = MSG_ReadString( msg );
if( !Q_strcmp( args, "Server uses protocol version 48.\n" ))
{
cls.legacyserver = from;
}
else
{
if( UI_IsVisible() )
UI_ShowMessageBox( va("^3Server message^7\n%s", args ) );
Msg( "%s", args );
}
Q_snprintf( formatted_msg, sizeof( formatted_msg ), "^3Server message^7\n%s", args );
// in case we're in console or it's classic mainui which doesn't support messageboxes
if( !UI_IsVisible() || !UI_ShowMessageBox( formatted_msg ))
Msg( "%s\n", formatted_msg );
}
else if( !Q_strcmp( c, "updatemsg" ))
{
@@ -2296,6 +2331,32 @@ static int CL_GetMessage( byte *data, size_t *length )
return false;
}
static void CL_ParseNetMessage( sizebuf_t *msg, void (*parsefn)( sizebuf_t * ))
{
cls.starting_count = MSG_GetNumBytesRead( msg ); // updates each frame
CL_Parse_Debug( true ); // begin parsing
parsefn( msg );
cl.frames[cl.parsecountmod].graphdata.msgbytes += MSG_GetNumBytesRead( msg ) - cls.starting_count;
CL_Parse_Debug( false ); // done
// we don't know if it is ok to save a demo message until
// after we have parsed the frame
if( !cls.demoplayback )
{
if( cls.demorecording && !cls.demowaiting )
{
CL_WriteDemoMessage( false, cls.starting_count, msg );
}
else if( cls.state != ca_active )
{
CL_WriteDemoMessage( true, cls.starting_count, msg );
}
}
}
/*
=================
CL_ReadNetMessage
@@ -2304,11 +2365,29 @@ CL_ReadNetMessage
static void CL_ReadNetMessage( void )
{
size_t curSize;
void (*parsefn)( sizebuf_t *msg );
switch( cls.legacymode )
{
case PROTO_CURRENT:
parsefn = CL_ParseServerMessage;
break;
case PROTO_LEGACY:
parsefn = CL_ParseLegacyServerMessage;
break;
case PROTO_QUAKE:
parsefn = CL_ParseQuakeMessage;
break;
case PROTO_GOLDSRC:
default:
ASSERT( 0 );
return;
}
while( CL_GetMessage( net_message_buffer, &curSize ))
{
const int split_header = LittleLong( 0xFFFFFFFE );
if( cls.legacymode && !memcmp( &split_header, net_message_buffer, sizeof( split_header )))
if( cls.legacymode == PROTO_LEGACY && !memcmp( &split_header, net_message_buffer, sizeof( split_header )))
{
// Will rewrite existing packet by merged
if( !NetSplit_GetLong( &cls.netchan.netsplit, &net_from, net_message_buffer, &curSize ) )
@@ -2327,27 +2406,36 @@ static void CL_ReadNetMessage( void )
// can't be a valid sequenced packet
if( cls.state < ca_connected ) continue;
if( !cls.demoplayback && MSG_GetMaxBytes( &net_message ) < 8 )
if( !cls.demoplayback )
{
Con_Printf( S_WARN "CL_ReadPackets: %s:runt packet\n", NET_AdrToString( net_from ));
continue;
if( MSG_GetMaxBytes( &net_message ) < 8 )
{
Con_Printf( S_WARN "%s: %s:runt packet\n", __func__, NET_AdrToString( net_from ));
continue;
}
// packet from server
if( !NET_CompareAdr( net_from, cls.netchan.remote_address ))
{
Con_DPrintf( S_ERROR "%s: %s:sequenced packet without connection\n", __func__, NET_AdrToString( net_from ));
continue;
}
if( !Netchan_Process( &cls.netchan, &net_message ))
continue; // wasn't accepted for some reason
}
// packet from server
if( !cls.demoplayback && !NET_CompareAdr( net_from, cls.netchan.remote_address ))
if( cls.state == ca_active )
{
Con_DPrintf( S_ERROR "CL_ReadPackets: %s:sequenced packet without connection\n", NET_AdrToString( net_from ));
continue;
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].valid = false;
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].choked = false;
}
else
{
CL_ResetFrame( &cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK] );
}
if( !cls.demoplayback && !Netchan_Process( &cls.netchan, &net_message ))
continue; // wasn't accepted for some reason
// run special handler for quake demos
if( cls.demoplayback == DEMO_QUAKE1 )
CL_ParseQuakeMessage( &net_message, true );
else if( cls.legacymode ) CL_ParseLegacyServerMessage( &net_message, true );
else CL_ParseServerMessage( &net_message, true );
CL_ParseNetMessage( &net_message, parsefn );
cl.send_reply = true;
}
@@ -2361,7 +2449,7 @@ static void CL_ReadNetMessage( void )
if( Netchan_CopyNormalFragments( &cls.netchan, &net_message, &curSize ))
{
MSG_Init( &net_message, "ServerData", net_message_buffer, curSize );
CL_ParseServerMessage( &net_message, false );
CL_ParseNetMessage( &net_message, parsefn );
}
if( Netchan_CopyFileFragments( &cls.netchan, &net_message ))
@@ -2574,7 +2662,7 @@ void CL_ProcessFile( qboolean successfully_received, const char *filename )
{
if( p->ucFlags & RES_CUSTOM )
{
HPAK_AddLump( true, CUSTOM_RES_PATH, p, cls.netchan.tempbuffer, NULL );
HPAK_AddLump( true, hpk_custom_file.string, p, cls.netchan.tempbuffer, NULL );
CL_RegisterCustomization( p );
}
}
@@ -2662,6 +2750,29 @@ void CL_ServerCommand( qboolean reliable, const char *fmt, ... )
}
}
/*
===============
CL_UpdateInfo
tell server about changed userinfo
===============
*/
void CL_UpdateInfo( const char *key, const char *value )
{
if( !cls.legacymode )
{
CL_ServerCommand( true, "setinfo \"%s\" \"%s\"\n", key, value );
}
else
{
if( cls.state != ca_active )
return;
MSG_BeginClientCmd( &cls.netchan.message, clc_legacy_userinfo );
MSG_WriteString( &cls.netchan.message, cls.userinfo );
}
}
//=============================================================================
/*
==============
@@ -2676,7 +2787,7 @@ static void CL_SetInfo_f( void )
{
Con_Printf( "User info settings:\n" );
Info_Print( cls.userinfo );
Con_Printf( "Total %i symbols\n", Q_strlen( cls.userinfo ));
Con_Printf( "Total %zu symbols\n", Q_strlen( cls.userinfo ));
return;
}
@@ -2696,7 +2807,7 @@ static void CL_SetInfo_f( void )
{
Cvar_DirectSet( var, Cmd_Argv( 2 ));
}
else if( Info_SetValueForKey( cls.userinfo, Cmd_Argv( 1 ), Cmd_Argv( 2 ), MAX_INFO_STRING ))
else if( Info_SetValueForKey( cls.userinfo, Cmd_Argv( 1 ), Cmd_Argv( 2 ), sizeof( cls.userinfo )))
{
// send update only on successfully changed userinfo
Cmd_ForwardToServer ();
@@ -2712,7 +2823,7 @@ static void CL_Physinfo_f( void )
{
Con_Printf( "Phys info settings:\n" );
Info_Print( cls.physinfo );
Con_Printf( "Total %i symbols\n", Q_strlen( cls.physinfo ));
Con_Printf( "Total %zu symbols\n", Q_strlen( cls.physinfo ));
}
static qboolean CL_ShouldRescanFilesystem( void )
@@ -2939,6 +3050,7 @@ static void CL_InitLocal( void )
Cvar_RegisterVariable( &cl_logofile );
Cvar_RegisterVariable( &cl_logocolor );
Cvar_RegisterVariable( &cl_logoext );
Cvar_RegisterVariable( &cl_logomaxdim );
Cvar_RegisterVariable( &cl_test_bandwidth );
Voice_RegisterCvars();
@@ -3234,7 +3346,7 @@ CL_Shutdown
*/
void CL_Shutdown( void )
{
Con_Printf( "CL_Shutdown()\n" );
Con_Printf( "%s()\n", __func__ );
if( !host.crashed && cls.initialized )
{

View File

@@ -188,7 +188,7 @@ void CL_ParseServerTime( sizebuf_t *msg )
cl.mtime[1] = cl.mtime[0];
cl.mtime[0] = MSG_ReadFloat( msg );
if( cls.demoplayback == DEMO_QUAKE1 )
if( cls.legacymode == PROTO_QUAKE )
return; // don't mess the time
if( cl.maxclients == 1 )
@@ -249,7 +249,7 @@ void CL_ParseMovevars( sizebuf_t *msg )
// update sky if changed
if( Q_strcmp( clgame.oldmovevars.skyName, clgame.movevars.skyName ) && cl.video_prepped )
ref.dllFuncs.R_SetupSky( clgame.movevars.skyName );
R_SetupSky( clgame.movevars.skyName );
memcpy( &clgame.oldmovevars, &clgame.movevars, sizeof( movevars_t ));
clgame.entities->curstate.scale = clgame.movevars.waveHeight;
@@ -498,7 +498,7 @@ void CL_BatchResourceRequest( qboolean initialize )
CL_MoveToOnHandList( p );
break;
case t_decal:
if( !HPAK_GetDataPointer( CUSTOM_RES_PATH, p, NULL, NULL ))
if( !HPAK_GetDataPointer( hpk_custom_file.string, p, NULL, NULL ))
{
if( !FBitSet( p->ucFlags, RES_REQUESTED ))
{
@@ -722,7 +722,7 @@ void CL_ParseCustomization( sizebuf_t *msg )
}
}
if( HPAK_GetDataPointer( CUSTOM_RES_PATH, pRes, NULL, NULL ))
if( HPAK_GetDataPointer( hpk_custom_file.string, pRes, NULL, NULL ))
{
qboolean bError = false;
@@ -854,7 +854,7 @@ void CL_ParseServerData( sizebuf_t *msg, qboolean legacy )
int i;
uint32_t mapCRC;
HPAK_CheckSize( CUSTOM_RES_PATH );
HPAK_CheckSize( hpk_custom_file.string );
Con_Reportf( "%s packet received.\n", legacy ? "Legacy serverdata" : "Serverdata" );
@@ -1204,7 +1204,7 @@ void CL_ParseBaseline( sizebuf_t *msg, qboolean legacy )
player = CL_IsPlayerIndex( newnum );
if( newnum >= clgame.maxEntities )
Host_Error( "CL_AllocEdict: no free edicts\n" );
Host_Error( "%s: no free edicts\n", __func__ );
ent = CL_EDICT_NUM( newnum );
memset( &ent->prevstate, 0, sizeof( ent->prevstate ));
@@ -1381,7 +1381,7 @@ void CL_UpdateUserinfo( sizebuf_t *msg, qboolean legacy )
slot = MSG_ReadUBitLong( msg, MAX_CLIENT_BITS );
if( slot >= MAX_CLIENTS )
Host_Error( "CL_ParseServerMessage: svc_updateuserinfo >= MAX_CLIENTS\n" );
Host_Error( "%s: svc_updateuserinfo >= MAX_CLIENTS\n", __func__ );
player = &cl.players[slot];
@@ -1494,7 +1494,7 @@ void CL_UpdateUserPings( sizebuf_t *msg )
slot = MSG_ReadUBitLong( msg, MAX_CLIENT_BITS );
if( slot >= MAX_CLIENTS )
Host_Error( "CL_ParseServerMessage: svc_pings > MAX_CLIENTS\n" );
Host_Error( "%s: svc_pings > MAX_CLIENTS\n", __func__ );
player = &cl.players[slot];
player->ping = MSG_ReadUBitLong( msg, 12 );
@@ -1646,6 +1646,9 @@ void CL_RegisterResources( sizebuf_t *msg )
CL_ClearWorld ();
// load skybox
R_SetupSky( clgame.movevars.skyName );
// tell rendering system we have a new set of models.
ref.dllFuncs.R_NewMap ();
@@ -1719,7 +1722,7 @@ static void CL_ParseConsistencyInfo( sizebuf_t *msg )
}
if( cl.num_consistency >= MAX_MODELS )
Host_Error( "CL_CheckConsistency: MAX_MODELS limit exceeded (%d)\n", MAX_MODELS );
Host_Error( "%s: MAX_MODELS limit exceeded (%d)\n", __func__, MAX_MODELS );
pc = &cl.consistency_list[cl.num_consistency];
cl.num_consistency++;
@@ -1990,7 +1993,7 @@ Find the client cvar value
and sent it back to the server
==============
*/
void CL_ParseCvarValue( sizebuf_t *msg, const qboolean ext )
void CL_ParseCvarValue( sizebuf_t *msg, const qboolean ext, const connprotocol_t proto )
{
const char *cvarName, *response;
convar_t *cvar;
@@ -2013,7 +2016,14 @@ void CL_ParseCvarValue( sizebuf_t *msg, const qboolean ext )
else
response = cvar->string;
}
else response = "Bad CVAR request";
else if( proto == PROTO_LEGACY )
{
response = "Not Found";
}
else
{
response = "Bad CVAR request";
}
if( ext )
{
@@ -2130,7 +2140,7 @@ void CL_ParseUserMessage( sizebuf_t *msg, int svc_num )
if( svc_num <= svc_lastmsg || svc_num > ( MAX_USER_MESSAGES + svc_lastmsg ))
{
// out or range
Host_Error( "CL_ParseUserMessage: illegible server message %d\n", svc_num );
Host_Error( "%s: illegible server message %d\n", __func__, svc_num );
return;
}
@@ -2142,7 +2152,7 @@ void CL_ParseUserMessage( sizebuf_t *msg, int svc_num )
}
if( i == MAX_USER_MESSAGES ) // probably unregistered
Host_Error( "CL_ParseUserMessage: illegible server message %d\n", svc_num );
Host_Error( "%s: illegible server message %d\n", __func__, svc_num );
// NOTE: some user messages handled into engine
if( !Q_strcmp( clgame.msg[i].name, "ScreenShake" ))
@@ -2168,7 +2178,7 @@ void CL_ParseUserMessage( sizebuf_t *msg, int svc_num )
if( iSize >= MAX_USERMSG_LENGTH )
{
Msg("WTF??? %d %d\n", i, svc_num );
Con_Reportf( "%s: user message %s size limit hit (%d > %d)!\n", __func__, clgame.msg[i].name, iSize, MAX_USERMSG_LENGTH );
return;
}
@@ -2197,7 +2207,7 @@ void CL_ParseUserMessage( sizebuf_t *msg, int svc_num )
}
else
{
Con_DPrintf( S_ERROR "UserMsg: No pfn %s %d\n", clgame.msg[i].name, clgame.msg[i].number );
Con_DPrintf( S_ERROR "%s: No pfn %s %d\n", __func__, clgame.msg[i].name, clgame.msg[i].number );
clgame.msg[i].func = CL_UserMsgStub; // throw warning only once
}
}
@@ -2216,36 +2226,19 @@ CL_ParseServerMessage
dispatch messages
=====================
*/
void CL_ParseServerMessage( sizebuf_t *msg, qboolean normal_message )
void CL_ParseServerMessage( sizebuf_t *msg )
{
size_t bufStart, playerbytes;
int cmd, param1, param2;
int old_background;
const char *s;
cls.starting_count = MSG_GetNumBytesRead( msg ); // updates each frame
CL_Parse_Debug( true ); // begin parsing
if( normal_message )
{
// assume no entity/player update this packet
if( cls.state == ca_active )
{
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].valid = false;
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].choked = false;
}
else
{
CL_ResetFrame( &cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK] );
}
}
// parse the message
while( 1 )
{
if( MSG_CheckOverflow( msg ))
{
Host_Error( "CL_ParseServerMessage: overflow!\n" );
Host_Error( "%s: overflow!\n", __func__ );
return;
}
@@ -2490,10 +2483,10 @@ void CL_ParseServerMessage( sizebuf_t *msg, qboolean normal_message )
CL_ParseResLocation( msg );
break;
case svc_querycvarvalue:
CL_ParseCvarValue( msg, false );
CL_ParseCvarValue( msg, false, PROTO_CURRENT );
break;
case svc_querycvarvalue2:
CL_ParseCvarValue( msg, true );
CL_ParseCvarValue( msg, true, PROTO_CURRENT );
break;
case svc_exec:
CL_ParseExec( msg );
@@ -2504,21 +2497,4 @@ void CL_ParseServerMessage( sizebuf_t *msg, qboolean normal_message )
break;
}
}
cl.frames[cl.parsecountmod].graphdata.msgbytes += MSG_GetNumBytesRead( msg ) - cls.starting_count;
CL_Parse_Debug( false ); // done
// we don't know if it is ok to save a demo message until
// after we have parsed the frame
if( !cls.demoplayback )
{
if( cls.demorecording && !cls.demowaiting )
{
CL_WriteDemoMessage( false, cls.starting_count, msg );
}
else if( cls.state != ca_active )
{
CL_WriteDemoMessage( true, cls.starting_count, msg );
}
}
}

View File

@@ -174,7 +174,7 @@ static void CL_LegacyPrecacheSound( sizebuf_t *msg )
soundIndex = MSG_ReadUBitLong( msg, MAX_SOUND_BITS );
if( soundIndex < 0 || soundIndex >= MAX_SOUNDS )
Host_Error( "CL_PrecacheSound: bad soundindex %i\n", soundIndex );
Host_Error( "%s: bad soundindex %i\n", __func__, soundIndex );
Q_strncpy( cl.sound_precache[soundIndex], MSG_ReadString( msg ), sizeof( cl.sound_precache[0] ));
@@ -192,7 +192,7 @@ static void CL_LegacyPrecacheModel( sizebuf_t *msg )
modelIndex = MSG_ReadUBitLong( msg, MAX_LEGACY_MODEL_BITS );
if( modelIndex < 0 || modelIndex >= MAX_MODELS )
Host_Error( "CL_PrecacheModel: bad modelindex %i\n", modelIndex );
Host_Error( "%s: bad modelindex %i\n", __func__, modelIndex );
Q_strncpy( model, MSG_ReadString( msg ), sizeof( model ));
//Q_strncpy( cl.model_precache[modelIndex], BF_ReadString( msg ), sizeof( cl.model_precache[0] ));
@@ -221,7 +221,7 @@ static void CL_LegacyPrecacheEvent( sizebuf_t *msg )
eventIndex = MSG_ReadUBitLong( msg, MAX_EVENT_BITS );
if( eventIndex < 0 || eventIndex >= MAX_EVENTS )
Host_Error( "CL_PrecacheEvent: bad eventindex %i\n", eventIndex );
Host_Error( "%s: bad eventindex %i\n", __func__, eventIndex );
Q_strncpy( cl.event_precache[eventIndex], MSG_ReadString( msg ), sizeof( cl.event_precache[0] ));
@@ -256,7 +256,7 @@ static void CL_LegacyParseResourceList( sizebuf_t *msg )
reslist.rescount = MSG_ReadWord( msg ) - 1;
if( reslist.rescount > MAX_LEGACY_RESOURCES )
Host_Error("MAX_RESOURCES reached\n");
Host_Error( "MAX_RESOURCES reached\n" );
for( i = 0; i < reslist.rescount; i++ )
{
@@ -264,7 +264,7 @@ static void CL_LegacyParseResourceList( sizebuf_t *msg )
Q_strncpy( reslist.resnames[i], MSG_ReadString( msg ), sizeof( reslist.resnames[i] ));
}
if( CL_IsPlaybackDemo() )
if( cls.demoplayback )
return;
if( !cl_allow_download.value )
@@ -317,36 +317,19 @@ CL_ParseLegacyServerMessage
dispatch messages
=====================
*/
void CL_ParseLegacyServerMessage( sizebuf_t *msg, qboolean normal_message )
void CL_ParseLegacyServerMessage( sizebuf_t *msg )
{
size_t bufStart, playerbytes;
int cmd, param1, param2;
int old_background;
const char *s;
cls.starting_count = MSG_GetNumBytesRead( msg ); // updates each frame
CL_Parse_Debug( true ); // begin parsing
if( normal_message )
{
// assume no entity/player update this packet
if( cls.state == ca_active )
{
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].valid = false;
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].choked = false;
}
else
{
CL_ResetFrame( &cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK] );
}
}
// parse the message
while( 1 )
{
if( MSG_CheckOverflow( msg ))
{
Host_Error( "CL_ParseServerMessage: overflow!\n" );
Host_Error( "%s: overflow!\n", __func__ );
return;
}
@@ -385,7 +368,9 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg, qboolean normal_message )
{
int maxclients = cl.maxclients;
cls.changelevel = true;
// we can only changelevel in singleplayer
// and singleplayer always runs in current protocol
// cls.changelevel = true;
S_StopAllSounds( true );
Con_Printf( "Server changing, reconnecting\n" );
@@ -612,10 +597,10 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg, qboolean normal_message )
CL_ParseResLocation( msg );
break;
case svc_querycvarvalue:
CL_ParseCvarValue( msg, false );
CL_ParseCvarValue( msg, false, PROTO_LEGACY );
break;
case svc_querycvarvalue2:
CL_ParseCvarValue( msg, true );
CL_ParseCvarValue( msg, true, PROTO_LEGACY );
break;
default:
CL_ParseUserMessage( msg, cmd );
@@ -623,23 +608,6 @@ void CL_ParseLegacyServerMessage( sizebuf_t *msg, qboolean normal_message )
break;
}
}
cl.frames[cl.parsecountmod].graphdata.msgbytes += MSG_GetNumBytesRead( msg ) - cls.starting_count;
CL_Parse_Debug( false ); // done
// we don't know if it is ok to save a demo message until
// after we have parsed the frame
if( !cls.demoplayback )
{
if( cls.demorecording && !cls.demowaiting )
{
CL_WriteDemoMessage( false, cls.starting_count, msg );
}
else if( cls.state != ca_active )
{
CL_WriteDemoMessage( true, cls.starting_count, msg );
}
}
}
void CL_LegacyPrecache_f( void )
@@ -664,6 +632,9 @@ void CL_LegacyPrecache_f( void )
if( clgame.entities )
clgame.entities->model = cl.worldmodel;
// load skybox
R_SetupSky( clgame.movevars.skyName );
// tell rendering system we have a new set of models.
ref.dllFuncs.R_NewMap ();
@@ -688,19 +659,7 @@ void CL_LegacyPrecache_f( void )
cls.signon = SIGNONS;
}
void CL_LegacyUpdateInfo( void )
{
if( !cls.legacymode )
return;
if( cls.state != ca_active )
return;
MSG_BeginClientCmd( &cls.netchan.message, clc_legacy_userinfo );
MSG_WriteString( &cls.netchan.message, cls.userinfo );
}
qboolean CL_LegacyMode( void )
{
return cls.legacymode;
return cls.legacymode == PROTO_LEGACY;
}

View File

@@ -620,11 +620,11 @@ static void CL_ParseQuakeDamage( sizebuf_t *msg )
/*
===================
CL_ParseQuakeStaticEntity
CL_ParseStaticEntity
===================
*/
static void CL_ParseQuakeStaticEntity( sizebuf_t *msg )
static void CL_ParseStaticEntity( sizebuf_t *msg )
{
entity_state_t state;
cl_entity_t *ent;
@@ -646,7 +646,7 @@ static void CL_ParseQuakeStaticEntity( sizebuf_t *msg )
i = clgame.numStatics;
if( i >= MAX_STATIC_ENTITIES )
{
Con_Printf( S_ERROR "CL_ParseStaticEntity: static entities limit exceeded!\n" );
Con_Printf( S_ERROR "%s: static entities limit exceeded!\n", __func__ );
return;
}
@@ -697,7 +697,7 @@ static void CL_ParseQuakeBaseline( sizebuf_t *msg )
newnum = MSG_ReadWord( msg ); // entnum
if( newnum >= clgame.maxEntities )
Host_Error( "CL_AllocEdict: no free edicts\n" );
Host_Error( "%s: no free edicts\n", __func__ );
// parse baseline
memset( &state, 0, sizeof( state ));
@@ -778,7 +778,7 @@ static void CL_ParseQuakeSignon( sizebuf_t *msg )
int i = MSG_ReadByte( msg );
if( i == 3 ) cls.signon = SIGNONS - 1;
Con_Reportf( "CL_Signon: %d\n", i );
Con_Reportf( "%s: %d\n", __func__, i );
}
/*
@@ -886,38 +886,21 @@ CL_ParseQuakeMessage
==================
*/
void CL_ParseQuakeMessage( sizebuf_t *msg, qboolean normal_message )
void CL_ParseQuakeMessage( sizebuf_t *msg )
{
int cmd, param1, param2;
size_t bufStart;
const char *str;
cls.starting_count = MSG_GetNumBytesRead( msg ); // updates each frame
CL_Parse_Debug( true ); // begin parsing
// init excise buffer
MSG_Init( &msg_demo, "UserMsg", msg_buf, sizeof( msg_buf ));
if( normal_message )
{
// assume no entity/player update this packet
if( cls.state == ca_active )
{
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].valid = false;
cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK].choked = false;
}
else
{
CL_ResetFrame( &cl.frames[cls.netchan.incoming_sequence & CL_UPDATE_MASK] );
}
}
// parse the message
while( 1 )
{
if( MSG_CheckOverflow( msg ))
{
Host_Error( "CL_ParseServerMessage: overflow!\n" );
Host_Error( "%s: overflow!\n", __func__ );
return;
}
@@ -1022,7 +1005,7 @@ void CL_ParseQuakeMessage( sizebuf_t *msg, qboolean normal_message )
CL_ParseQuakeDamage( msg );
break;
case svc_spawnstatic:
CL_ParseQuakeStaticEntity( msg );
CL_ParseStaticEntity( msg );
break;
case svc_spawnbinary:
// never used in Quake
@@ -1108,14 +1091,11 @@ void CL_ParseQuakeMessage( sizebuf_t *msg, qboolean normal_message )
}
break;
default:
Host_Error( "CL_ParseServerMessage: Illegible server message\n" );
Host_Error( "%s: Illegible server message\n", __func__ );
break;
}
}
cl.frames[cl.parsecountmod].graphdata.msgbytes += MSG_GetNumBytesRead( msg ) - cls.starting_count;
CL_Parse_Debug( false ); // done
// now process packet.
CL_ProcessPacket( &cl.frames[cl.parsecountmod] );

View File

@@ -170,6 +170,12 @@ intptr_t CL_RenderGetParm( const int parm, const int arg, const qboolean checkRe
return refState.width;
case PARM_SCREEN_HEIGHT:
return refState.height;
case PARM_SKY_SPHERE:
return FBitSet( world.flags, FWORLD_SKYSPHERE ) && !FBitSet( world.flags, FWORLD_CUSTOM_SKYBOX );
case PARM_SURF_SAMPLESIZE:
if( arg >= 0 && arg < cl.worldmodel->numsurfaces )
return Mod_SampleSizeForFace( &cl.worldmodel->surfaces[arg] );
return LM_SAMPLE_SIZE;
default:
// indicates call from client.dll
if( checkRef )
@@ -341,7 +347,7 @@ qboolean R_InitRenderAPI( void )
{
if( clgame.dllFuncs.pfnGetRenderInterface( CL_RENDER_INTERFACE_VERSION, &gRenderAPI, &clgame.drawFuncs ))
{
Con_Reportf( "CL_LoadProgs: ^2initailized extended RenderAPI ^7ver. %i\n", CL_RENDER_INTERFACE_VERSION );
Con_Reportf( "%s: ^2initailized extended RenderAPI ^7ver. %i\n", __func__, CL_RENDER_INTERFACE_VERSION );
return true;
}

View File

@@ -24,7 +24,7 @@ CVAR_DEFINE_AUTO( scr_centertime, "2.5", 0, "centerprint hold time" );
CVAR_DEFINE_AUTO( scr_loading, "0", 0, "loading bar progress" );
CVAR_DEFINE_AUTO( scr_download, "-1", 0, "downloading bar progress" );
CVAR_DEFINE( scr_viewsize, "viewsize", "120", FCVAR_ARCHIVE, "screen size (quake only)" );
CVAR_DEFINE_AUTO( cl_testlights, "0", 0, "test dynamic lights" );
CVAR_DEFINE_AUTO( cl_testlights, "0", FCVAR_CHEAT, "test dynamic lights" );
CVAR_DEFINE( cl_allow_levelshots, "allow_levelshots", "0", FCVAR_ARCHIVE, "allow engine to use indivdual levelshots instead of 'loading' image" );
CVAR_DEFINE_AUTO( cl_levelshot_name, "*black", 0, "contains path to current levelshot" );
static CVAR_DEFINE_AUTO( cl_envshot_size, "256", FCVAR_ARCHIVE, "envshot size of cube side" );
@@ -32,6 +32,7 @@ CVAR_DEFINE_AUTO( v_dark, "0", 0, "starts level from dark screen" );
static CVAR_DEFINE_AUTO( net_speeds, "0", FCVAR_ARCHIVE, "show network packets" );
static CVAR_DEFINE_AUTO( cl_showfps, "0", FCVAR_ARCHIVE, "show client fps" );
static CVAR_DEFINE_AUTO( cl_showpos, "0", FCVAR_ARCHIVE, "show local player position and velocity" );
static CVAR_DEFINE_AUTO( cl_showents, "0", FCVAR_ARCHIVE | FCVAR_CHEAT, "show entities information (largely undone)" );
typedef struct
{
@@ -122,7 +123,7 @@ void SCR_DrawPos( void )
if( cls.state != ca_active || !cl_showpos.value || cl.background )
return;
ent = CL_GetLocalPlayer();
ent = CL_EDICT_NUM( cl.playernum + 1 );
speed = VectorLength( cl.simvel );
Q_snprintf( msg, MAX_SYSPATH,
@@ -140,6 +141,68 @@ void SCR_DrawPos( void )
Con_DrawString( refState.width / 2, 4, msg, color );
}
/*
==============
SCR_DrawEnts
==============
*/
void SCR_DrawEnts( void )
{
rgba_t color = { 255, 255, 255, 255 };
int i;
if( cls.state != ca_active || !cl_showents.value || ( cl.maxclients > 1 && !cls.demoplayback ))
return;
// this probably better hook CL_AddVisibleEntities
// as entities might get added by client.dll
for( i = 0; i < clgame.maxEntities; i++ )
{
const cl_entity_t *ent = &clgame.entities[i];
string msg;
vec3_t screen, pos;
if( ent->curstate.messagenum != cl.parsecount )
continue;
VectorCopy( ent->origin, pos );
if( ent->model != NULL )
{
vec3_t v;
// simple model type filter
if( cl_showents.value > 1 )
{
if( ent->model->type != (modtype_t)( cl_showents.value - 2 ))
continue;
}
VectorAverage( ent->model->mins, ent->model->maxs, v );
VectorAdd( pos, v, pos );
}
if( !ref.dllFuncs.WorldToScreen( pos, screen ))
{
Q_snprintf( msg, sizeof( msg ),
"entity %d\n"
"model %s\n"
"movetype %d\n",
ent->index,
ent->model ? ent->model->name : "(null)",
ent->curstate.movetype );
screen[0] = 0.5f * screen[0] * refState.width;
screen[1] = -0.5f * screen[1] * refState.height;
screen[0] += 0.5f * refState.width;
screen[1] += 0.5f * refState.height;
Con_DrawString( screen[0], screen[1], msg, color );
}
}
}
/*
==============
SCR_NetSpeeds
@@ -345,7 +408,7 @@ void SCR_MakeScreenShot( void )
SCR_DrawPlaque
================
*/
static void SCR_DrawPlaque( void )
static qboolean SCR_DrawPlaque( void )
{
if(( cl_allow_levelshots.value && !cls.changelevel ) || cl.background )
{
@@ -353,7 +416,11 @@ static void SCR_DrawPlaque( void )
ref.dllFuncs.GL_SetRenderMode( kRenderNormal );
ref.dllFuncs.R_DrawStretchPic( 0, 0, refState.width, refState.height, 0, 0, 1, 1, levelshot );
if( !cl.background ) CL_DrawHUD( CL_LOADING );
return true;
}
return false;
}
/*
@@ -363,15 +430,10 @@ SCR_BeginLoadingPlaque
*/
void SCR_BeginLoadingPlaque( qboolean is_background )
{
float oldclear = 0;;
S_StopAllSounds( true );
cl.audio_prepped = false; // don't play ambients
cl.video_prepped = false;
if( !Host_IsDedicated() )
oldclear = gl_clear.value;
if( CL_IsInMenu( ) && !cls.changedemo && !is_background )
if( cls.key_dest == key_menu && !cls.changedemo && !is_background )
{
UI_SetActiveMenu( false );
if( cls.state == ca_disconnected && !(GameState->curstate == STATE_RUNFRAME && GameState->nextstate != STATE_RUNFRAME) )
@@ -384,18 +446,15 @@ void SCR_BeginLoadingPlaque( qboolean is_background )
if( cls.key_dest == key_console )
return;
if( !Host_IsDedicated() )
gl_clear.value = 0.0f;
if( is_background ) IN_MouseSavePos( );
cls.draw_changelevel = !is_background;
SCR_UpdateScreen();
// set video_prepped after update screen, so engine can draw last remaining frame
cl.video_prepped = false;
cls.disable_screen = host.realtime;
cl.background = is_background; // set right state before svc_serverdata is came
if( !Host_IsDedicated() )
gl_clear.value = oldclear;
// SNDDMA_LockSound();
}
@@ -445,7 +504,7 @@ void SCR_TileClear( void )
int i, top, bottom, left, right;
dirty_t clear;
if( scr_viewsize.value >= 120 )
if( likely( scr_viewsize.value >= 120 ))
return; // full screen rendering
// erase rect will be the union of the past three frames
@@ -523,6 +582,8 @@ text to the screen.
*/
void SCR_UpdateScreen( void )
{
qboolean screen_redraw = true; // assume screen has been redrawn
if( !V_PreRender( )) return;
switch( cls.state )
@@ -533,7 +594,7 @@ void SCR_UpdateScreen( void )
case ca_connecting:
case ca_connected:
case ca_validate:
SCR_DrawPlaque();
screen_redraw = SCR_DrawPlaque();
break;
case ca_active:
Con_RunConsole ();
@@ -543,11 +604,15 @@ void SCR_UpdateScreen( void )
SCR_DrawCinematic();
break;
default:
Host_Error( "SCR_UpdateScreen: bad cls.state\n" );
Host_Error( "%s: bad cls.state\n", __func__ );
break;
}
V_PostRender();
// during changelevel we might have a few frames when we have nothing to draw
// (assuming levelshots are off) and drawing 2d on top of nothing or cleared screen
// is ugly, specifically with Adreno and ImgTec GPUs
if( screen_redraw || !cls.changelevel || !cls.changedemo )
V_PostRender();
}
/*
@@ -753,6 +818,9 @@ void SCR_Init( void )
Cvar_RegisterVariable( &net_speeds );
Cvar_RegisterVariable( &cl_showfps );
Cvar_RegisterVariable( &cl_showpos );
#ifdef _DEBUG
Cvar_RegisterVariable( &cl_showents );
#endif // NDEBUG
// register our commands
Cmd_AddCommand( "skyname", CL_SetSky_f, "set new skybox by basename" );

View File

@@ -1904,7 +1904,7 @@ void CL_ParseTempEntity( sizebuf_t *msg )
// this will probably be fatal anyway
if( iSize > sizeof( pbuf ))
Con_Printf( S_ERROR "%s: Temp buffer overflow!\n", __FUNCTION__ );
Con_Printf( S_ERROR "%s: Temp buffer overflow!\n", __func__ );
// parse user message into buffer
MSG_ReadBytes( msg, pbuf, iSize );
@@ -2384,13 +2384,13 @@ void CL_ParseTempEntity( sizebuf_t *msg )
R_UserTracerParticle( pos, pos2, life, color, scale, 0, NULL );
break;
default:
Con_DPrintf( S_ERROR "ParseTempEntity: illegible TE message %i\n", type );
Con_DPrintf( S_ERROR "%s: illegible TE message %i\n", __func__, type );
break;
}
// throw warning
if( MSG_CheckOverflow( &buf ))
Con_DPrintf( S_WARN "ParseTempEntity: overflow TE message %i\n", type );
Con_DPrintf( S_WARN "%s: overflow TE message %i\n", __func__, type );
}
@@ -2927,16 +2927,26 @@ static void CL_PlayerDecal( int playernum, int customIndex, int entityIndex, flo
{
if( !pCust->nUserData1 )
{
int sprayTextureIndex;
char decalname[MAX_VA_STRING];
int width, height;
Q_snprintf( decalname, sizeof( decalname ), "player%dlogo%d", playernum, customIndex );
sprayTextureIndex = ref.dllFuncs.GL_FindTexture( decalname );
if( sprayTextureIndex != 0 )
{
ref.dllFuncs.GL_FreeTexture( sprayTextureIndex );
}
textureIndex = ref.dllFuncs.GL_FindTexture( decalname );
if( textureIndex != 0 )
ref.dllFuncs.GL_FreeTexture( textureIndex );
pCust->nUserData1 = GL_LoadTextureInternal( decalname, pCust->pInfo, TF_DECAL );
width = REF_GET_PARM( PARM_TEX_WIDTH, pCust->nUserData1 );
height = REF_GET_PARM( PARM_TEX_HEIGHT, pCust->nUserData1 );
if( width > cl_logomaxdim.value || height > cl_logomaxdim.value )
{
double scale = cl_logomaxdim.value / Q_max( width, height );
width = round( width * scale );
height = round( height * scale );
ref.dllFuncs.R_OverrideTextureSourceSize( pCust->nUserData1, width, height ); // default custom decal from HL1
}
}
textureIndex = pCust->nUserData1;
}
@@ -2981,8 +2991,47 @@ int GAME_EXPORT CL_DecalIndex( int id )
if( cl.decal_index[id] == 0 )
{
int gl_texturenum = 0;
Image_SetForceFlags( IL_LOAD_DECAL );
cl.decal_index[id] = ref.dllFuncs.GL_LoadTexture( host.draw_decals[id], NULL, 0, TF_DECAL );
if( Mod_AllowMaterials( ))
{
string decalname;
if( Q_snprintf( decalname, sizeof( decalname ), "materials/decals/%s.tga", host.draw_decals[id] ) > 0 )
{
if( g_fsapi.FileExists( decalname, false ))
{
gl_texturenum = ref.dllFuncs.GL_LoadTexture( decalname, NULL, 0, TF_DECAL );
if( host_allow_materials.value == 2.0f )
Con_Printf( "Looking for %s decal replacement...%s (%s)\n", host.draw_decals[id], gl_texturenum != 0 ? S_GREEN "OK" : S_RED "FAIL", decalname );
}
else if( host_allow_materials.value == 2.0f )
Con_Printf( "Looking for %s decal replacement..." S_YELLOW "MISS (%s)\n", host.draw_decals[id], decalname );
}
else if( host_allow_materials.value == 2.0f )
Con_Printf( "Looking for %s decal replacement..." S_YELLOW "MISS (overflow)\n", host.draw_decals[id] );
if( gl_texturenum )
{
byte *fin;
Q_snprintf( decalname, sizeof( decalname ), "decals.wad/%s", host.draw_decals[id] );
if(( fin = g_fsapi.LoadFile( decalname, NULL, false )) != NULL )
{
mip_t *mip = (mip_t *)fin;
ref.dllFuncs.R_OverrideTextureSourceSize( gl_texturenum, mip->width, mip->height );
Mem_Free( fin );
}
}
}
if( !gl_texturenum )
gl_texturenum = ref.dllFuncs.GL_LoadTexture( host.draw_decals[id], NULL, 0, TF_DECAL );
cl.decal_index[id] = gl_texturenum;
Image_ClearForceFlags();
}

View File

@@ -341,7 +341,7 @@ qboolean V_PreRender( void )
{
if(( host.realtime - cls.disable_screen ) > cl_timeout.value )
{
Con_Reportf( "V_PreRender: loading plaque timed out\n" );
Con_Reportf( "%s: loading plaque timed out\n", __func__ );
cls.disable_screen = 0.0f;
}
return false;
@@ -506,7 +506,6 @@ V_PostRender
*/
void V_PostRender( void )
{
static double oldtime;
qboolean draw_2d = false;
ref.dllFuncs.R_AllowFog( false );
@@ -533,6 +532,7 @@ void V_PostRender( void )
SCR_RSpeeds();
SCR_NetSpeeds();
SCR_DrawPos();
SCR_DrawEnts();
SCR_DrawNetGraph();
SV_DrawOrthoTriangles();
CL_DrawDemoRecording();

View File

@@ -309,6 +309,14 @@ typedef enum
CL_CHANGELEVEL, // draw 'loading' during changelevel
} scrstate_t;
typedef enum
{
PROTO_CURRENT = 0, // Xash3D 49
PROTO_LEGACY = 1, // Xash3D 48
PROTO_QUAKE = 2, // Quake 15
PROTO_GOLDSRC = 3, // GoldSrc 48
} connprotocol_t;
typedef struct
{
char name[32];
@@ -626,9 +634,8 @@ typedef struct
char internetservers_query[512]; // cached query
uint32_t internetservers_query_len;
// legacy mode support
qboolean legacymode; // one-way 48 protocol compatibility
netadr_t legacyserver;
// multiprotocol support
connprotocol_t legacymode;
int extensions;
netadr_t serveradr;
@@ -654,14 +661,11 @@ extern gameui_static_t gameui;
// cvars
//
extern convar_t mp_decals;
extern convar_t cl_logofile;
extern convar_t cl_logocolor;
extern convar_t cl_logomaxdim;
extern convar_t cl_allow_download;
extern convar_t cl_allow_upload;
extern convar_t cl_download_ingame;
extern convar_t cl_nopred;
extern convar_t cl_timeout;
extern convar_t cl_nodelta;
extern convar_t cl_interp;
extern convar_t cl_nointerp;
extern convar_t cl_showerror;
@@ -674,13 +678,11 @@ extern convar_t cl_updaterate;
extern convar_t cl_solid_players;
extern convar_t cl_idealpitchscale;
extern convar_t cl_allow_levelshots;
extern convar_t cl_lightstyle_lerping;
extern convar_t cl_draw_particles;
extern convar_t cl_draw_tracers;
extern convar_t cl_levelshot_name;
extern convar_t cl_draw_beams;
extern convar_t cl_clockreset;
extern convar_t cl_fixtimerate;
extern convar_t hud_fontscale;
extern convar_t hud_fontrender;
extern convar_t hud_scale;
@@ -850,14 +852,14 @@ _inline cl_entity_t *CL_EDICT_NUM( int n )
{
if( !clgame.entities )
{
Host_Error( "CL_EDICT_NUM: clgame.entities is NULL\n");
Host_Error( "%s: clgame.entities is NULL\n", __func__ );
return NULL;
}
if(( n >= 0 ) && ( n < clgame.maxEntities ))
return clgame.entities + n;
Host_Error( "CL_EDICT_NUM: bad number %i\n", n );
Host_Error( "%s: bad number %i\n", __func__, n );
return NULL;
}
@@ -888,8 +890,8 @@ void CL_ParseFileTransferFailed( sizebuf_t *msg );
void CL_ParseHLTV( sizebuf_t *msg );
void CL_ParseDirector( sizebuf_t *msg );
void CL_ParseResLocation( sizebuf_t *msg );
void CL_ParseCvarValue( sizebuf_t *msg, const qboolean ext );
void CL_ParseServerMessage( sizebuf_t *msg, qboolean normal_message );
void CL_ParseCvarValue( sizebuf_t *msg, const qboolean ext, const connprotocol_t proto );
void CL_ParseServerMessage( sizebuf_t *msg );
void CL_ParseTempEntity( sizebuf_t *msg );
qboolean CL_DispatchUserMessage( const char *pszName, int iSize, void *pbuf );
qboolean CL_RequestMissingResources( void );
@@ -905,7 +907,7 @@ int CL_EstimateNeededResources( void );
//
// cl_parse_48.c
//
void CL_ParseLegacyServerMessage( sizebuf_t *msg, qboolean normal_message );
void CL_ParseLegacyServerMessage( sizebuf_t *msg );
void CL_LegacyPrecache_f( void );
//
@@ -923,6 +925,7 @@ void SCR_NetSpeeds( void );
void SCR_RSpeeds( void );
void SCR_DrawFPS( int height );
void SCR_DrawPos( void );
void SCR_DrawEnts( void );
//
// cl_netgraph.c
@@ -964,7 +967,7 @@ void CL_SetIdealPitch( void );
//
// cl_qparse.c
//
void CL_ParseQuakeMessage( sizebuf_t *msg, qboolean normal_message );
void CL_ParseQuakeMessage( sizebuf_t *msg );
//
// cl_frame.c
@@ -1057,7 +1060,6 @@ int Con_UtfMoveRight( char *str, int pos, int length );
void Con_DefaultColor( int r, int g, int b, qboolean gameui );
cl_font_t *Con_GetCurFont( void );
cl_font_t *Con_GetFont( int num );
void Con_DrawCharacterLen( int number, int *width, int *height );
int Con_DrawString( int x, int y, const char *string, rgba_t setColor ); // legacy, use cl_font.c
void GAME_EXPORT Con_DrawStringLen( const char *pText, int *length, int *height ); // legacy, use cl_font.c
void Con_CharEvent( int key );
@@ -1108,7 +1110,7 @@ qboolean UI_MouseInRect( void );
qboolean UI_IsVisible( void );
void UI_ResetPing( void );
void UI_ShowUpdateDialog( qboolean preferStore );
void UI_ShowMessageBox( const char *text );
qboolean UI_ShowMessageBox( const char *text );
void UI_AddTouchButtonToList( const char *name, const char *texture, const char *command, unsigned char *color, int flags );
void UI_ConnectionProgress_Disconnect( void );
void UI_ConnectionProgress_Download( const char *pszFileName, const char *pszServerName, const char *pszServerPath, int iCurrent, int iTotal, const char *comment );
@@ -1162,5 +1164,7 @@ int Key_ToUpper( int key );
void OSK_Draw( void );
extern rgba_t g_color_table[8];
extern triangleapi_t gTriApi;
extern net_api_t gNetApi;
#endif//CLIENT_H

View File

@@ -847,7 +847,6 @@ void Con_Print( const char *txt )
static char buf[MAX_PRINT_MSG];
qboolean norefresh = false;
static int lastlength = 0;
static qboolean inupdate;
static int bufpos = 0;
int c, mask = 0;
@@ -938,6 +937,27 @@ void Con_Print( const char *txt )
}
}
/*
================
Con_NXPrintfv
Draw a single debug line with specified height, color and time to live
================
*/
static void Con_NXPrintfv( keydest_t key_dest, const con_nprint_t *info, const char *fmt, va_list va )
{
if( info->index < 0 || info->index >= ARRAYSIZE( con.notify ))
return;
Q_vsnprintf( con.notify[info->index].szNotify, sizeof( con.notify[info->index].szNotify ), fmt, va );
// setup values
con.notify[info->index].key_dest = key_dest;
con.notify[info->index].expire = host.realtime + info->time_to_live;
MakeRGBA( con.notify[info->index].color, (byte)(info->color[0] * 255), (byte)(info->color[1] * 255), (byte)(info->color[2] * 255), 255 );
con.draw_notify = true;
}
/*
================
Con_NPrint
@@ -948,21 +968,16 @@ Draw a single debug line with specified height
void GAME_EXPORT Con_NPrintf( int idx, const char *fmt, ... )
{
va_list args;
if( idx < 0 || idx >= MAX_DBG_NOTIFY )
return;
memset( con.notify[idx].szNotify, 0, MAX_STRING );
con_nprint_t info =
{
.index = idx,
.time_to_live = 4.0f,
.color = { 1.0f, 1.0f, 1.0f },
};
va_start( args, fmt );
Q_vsnprintf( con.notify[idx].szNotify, MAX_STRING, fmt, args );
Con_NXPrintfv( key_game, &info, fmt, args );
va_end( args );
// reset values
con.notify[idx].key_dest = key_game;
con.notify[idx].expire = host.realtime + 4.0f;
MakeRGBA( con.notify[idx].color, 255, 255, 255, 255 );
con.draw_notify = true;
}
/*
@@ -978,20 +993,9 @@ void GAME_EXPORT Con_NXPrintf( con_nprint_t *info, const char *fmt, ... )
if( !info ) return;
if( info->index < 0 || info->index >= MAX_DBG_NOTIFY )
return;
memset( con.notify[info->index].szNotify, 0, MAX_STRING );
va_start( args, fmt );
Q_vsnprintf( con.notify[info->index].szNotify, MAX_STRING, fmt, args );
Con_NXPrintfv( key_game, info, fmt, args );
va_end( args );
// setup values
con.notify[info->index].key_dest = key_game;
con.notify[info->index].expire = host.realtime + info->time_to_live;
MakeRGBA( con.notify[info->index].color, (byte)(info->color[0] * 255), (byte)(info->color[1] * 255), (byte)(info->color[2] * 255), 255 );
con.draw_notify = true;
}
/*
@@ -1004,21 +1008,16 @@ Draw a single debug line with specified height (menu version)
void GAME_EXPORT UI_NPrintf( int idx, const char *fmt, ... )
{
va_list args;
if( idx < 0 || idx >= MAX_DBG_NOTIFY )
return;
memset( con.notify[idx].szNotify, 0, MAX_STRING );
con_nprint_t info =
{
.index = idx,
.time_to_live = 4.0f,
.color = { 1.0f, 1.0f, 1.0f },
};
va_start( args, fmt );
Q_vsnprintf( con.notify[idx].szNotify, MAX_STRING, fmt, args );
Con_NXPrintfv( key_menu, &info, fmt, args );
va_end( args );
// reset values
con.notify[idx].key_dest = key_menu;
con.notify[idx].expire = host.realtime + 4.0f;
MakeRGBA( con.notify[idx].color, 255, 255, 255, 255 );
con.draw_notify = true;
}
/*
@@ -1034,20 +1033,9 @@ void GAME_EXPORT UI_NXPrintf( con_nprint_t *info, const char *fmt, ... )
if( !info ) return;
if( info->index < 0 || info->index >= MAX_DBG_NOTIFY )
return;
memset( con.notify[info->index].szNotify, 0, MAX_STRING );
va_start( args, fmt );
Q_vsnprintf( con.notify[info->index].szNotify, MAX_STRING, fmt, args );
Con_NXPrintfv( key_menu, info, fmt, args );
va_end( args );
// setup values
con.notify[info->index].key_dest = key_menu;
con.notify[info->index].expire = host.realtime + info->time_to_live;
MakeRGBA( con.notify[info->index].color, (byte)(info->color[0] * 255), (byte)(info->color[1] * 255), (byte)(info->color[2] * 255), 255 );
con.draw_notify = true;
}
/*
@@ -1446,7 +1434,15 @@ static void Con_SaveHistory( con_history_t *self )
f = FS_Open( "console_history.txt", "wb", true );
for( i = historyStart; i < self->next; i++ )
FS_Printf( f, "%s\n", self->lines[i % CON_HISTORY].buffer );
{
const char *s = self->lines[i % CON_HISTORY].buffer;
// HACKHACK: don't save lines that have something that looks like a password
if( Q_stristr( s, "password" ) || Q_stristr( s, "_pw" ))
continue;
FS_Printf( f, "%s\n", s );
}
FS_Close( f );
}
@@ -2137,6 +2133,34 @@ void Con_CharEvent( int key )
}
}
static int Con_LoadSimpleConback( const char *name, int flags )
{
const char *paths[] = {
"gfx/shell/%s.dds",
"gfx/shell/%s.bmp",
"gfx/shell/%s.tga",
"cached/%s640",
"cached/%s",
};
size_t i;
for( i = 0; i < ARRAYSIZE( paths ); i++ )
{
string path;
Q_snprintf( path, sizeof( path ), paths[i], name );
if( g_fsapi.FileExists( path, false ))
{
int gl_texturenum = ref.dllFuncs.GL_LoadTexture( path, NULL, 0, flags );
if( gl_texturenum )
return gl_texturenum;
}
}
return 0;
}
/*
=========
Con_VidInit
@@ -2159,38 +2183,12 @@ void Con_VidInit( void )
Con_LoadConchars();
Con_CheckResize();
#if XASH_LOW_MEMORY
con.background = R_GetBuiltinTexture( REF_BLACK_TEXTURE );
con.background = R_GetBuiltinTexture( REF_GRAY_TEXTURE );
#else
// loading console image
if( host.allow_console )
{
// trying to load truecolor image first
if( FS_FileExists( "gfx/shell/conback.bmp", false ) || FS_FileExists( "gfx/shell/conback.tga", false ))
con.background = ref.dllFuncs.GL_LoadTexture( "gfx/shell/conback", NULL, 0, flags );
if( !con.background )
{
if( FS_FileExists( "cached/conback640", false ))
con.background = ref.dllFuncs.GL_LoadTexture( "cached/conback640", NULL, 0, flags );
else if( FS_FileExists( "cached/conback", false ))
con.background = ref.dllFuncs.GL_LoadTexture( "cached/conback", NULL, 0, flags );
}
}
else
{
// trying to load truecolor image first
if( FS_FileExists( "gfx/shell/loading.bmp", false ) || FS_FileExists( "gfx/shell/loading.tga", false ))
con.background = ref.dllFuncs.GL_LoadTexture( "gfx/shell/loading", NULL, 0, flags );
if( !con.background )
{
if( FS_FileExists( "cached/loading640", false ))
con.background = ref.dllFuncs.GL_LoadTexture( "cached/loading640", NULL, 0, flags );
else if( FS_FileExists( "cached/loading", false ))
con.background = ref.dllFuncs.GL_LoadTexture( "cached/loading", NULL, 0, flags );
}
}
con.background = Con_LoadSimpleConback( host.allow_console ? "conback" : "loading", flags );
if( !con.background ) // last chance - quake conback image
{

View File

@@ -134,7 +134,7 @@ static void Joy_ProcessTrigger( const engineAxis_t engineAxis, short value )
trigThreshold = joy_lt_threshold.value;
break;
default:
Con_Reportf( S_ERROR "Joy_ProcessTrigger: invalid axis = %i", engineAxis );
Con_Reportf( S_ERROR "%s: invalid axis = %i\n", __func__, engineAxis );
break;
}
@@ -205,7 +205,7 @@ static void Joy_ProcessStick( const engineAxis_t engineAxis, short value )
case JOY_AXIS_PITCH: deadzone = joy_pitch_deadzone.value; break;
case JOY_AXIS_YAW: deadzone = joy_yaw_deadzone.value; break;
default:
Con_Reportf( S_ERROR "Joy_ProcessStick: invalid axis = %i", engineAxis );
Con_Reportf( S_ERROR "%s: invalid axis = %i\n", __func__, engineAxis );
break;
}
@@ -218,7 +218,7 @@ static void Joy_ProcessStick( const engineAxis_t engineAxis, short value )
// fwd/side axis simulate hat movement
if( ( engineAxis == JOY_AXIS_SIDE || engineAxis == JOY_AXIS_FWD ) &&
( CL_IsInMenu() || CL_IsInConsole() ) )
( cls.key_dest == key_menu || cls.key_dest == key_console ))
{
int val = 0;

View File

@@ -333,7 +333,7 @@ void Touch_WriteConfig( void )
if( Sys_CheckParm( "-nowriteconfig" ) || !touch.configchanged || !touch.config_loaded )
return;
Con_DPrintf( "Touch_WriteConfig(): %s\n", touch_config_file.string );
Con_DPrintf( "%s: %s\n", __func__, touch_config_file.string );
Q_snprintf( newconfigfile, sizeof( newconfigfile ), "%s.new", touch_config_file.string );
Q_snprintf( oldconfigfile, sizeof( oldconfigfile ), "%s.bak", touch_config_file.string );
@@ -1064,7 +1064,7 @@ void Touch_Init( void )
return;
touch.mempool = Mem_AllocPool( "Touch" );
//touch.first = touch.last = NULL;
Con_Printf( "IN_TouchInit()\n");
Con_Printf( "%s()\n", __func__ );
touch.move_finger = touch.resize_finger = touch.look_finger = touch.wheel_finger = -1;
touch.state = state_none;
touch.showeditbuttons = true;
@@ -1217,10 +1217,10 @@ static qboolean Touch_IsVisible( touch_button_t *button )
if( FBitSet( button->flags, TOUCH_FL_HIDE ))
return false; // skip hidden
if( FBitSet( button->flags, TOUCH_FL_SP ) && CL_GetMaxClients() != 1 )
if( FBitSet( button->flags, TOUCH_FL_SP ) && cl.maxclients != 1 )
return false; // skip singleplayer(load, save) buttons in multiplayer
if( FBitSet( button->flags, TOUCH_FL_MP ) && CL_GetMaxClients() == 1 )
if( FBitSet( button->flags, TOUCH_FL_MP ) && cl.maxclients == 1 )
return false; // skip multiplayer buttons in singleplayer
return true;
@@ -2163,8 +2163,7 @@ void Touch_KeyEvent( int key, int down )
x = xi / SCR_W;
y = yi / SCR_H;
Con_DPrintf( "event %d %.2f %.2f %.2f %.2f\n",
event, x, y, x - lx, y - ly );
// Con_DPrintf( "event %d %.2f %.2f %.2f %.2f\n", event, x, y, x - lx, y - ly );
IN_TouchEvent( event, finger, x, y, x - lx, y - ly );

View File

@@ -840,7 +840,7 @@ void GAME_EXPORT Key_SetKeyDest( int key_dest )
cls.key_dest = key_message;
break;
default:
Host_Error( "Key_SetKeyDest: wrong destination (%i)\n", key_dest );
Host_Error( "%s: wrong destination (%i)\n", __func__, key_dest );
break;
}
}

View File

@@ -74,7 +74,7 @@ static void free_winding( winding_t *w )
{
// simple sentinel by Carmack
if( *(unsigned *)w == 0xDEADC0DE )
Host_Error( "free_winding: freed a freed winding\n" );
Host_Error( "%s: freed a freed winding\n", __func__ );
*(unsigned *)w = 0xDEADC0DE;
free( w );
}
@@ -154,7 +154,7 @@ static winding_t *winding_for_plane( const mplane_t *p )
vup[0] = 1;
break;
default:
Host_Error( "BaseWindingForPlane: no axis found\n" );
Host_Error( "%s: no axis found\n", __func__ );
return NULL;
}

View File

@@ -8,6 +8,8 @@
struct ref_state_s ref;
ref_globals_t refState;
static const char* r_skyBoxSuffix[SKYBOX_MAX_SIDES] = { "rt", "bk", "lf", "ft", "up", "dn" };
CVAR_DEFINE_AUTO( gl_vsync, "0", FCVAR_ARCHIVE, "enable vertical syncronization" );
CVAR_DEFINE_AUTO( r_showtextures, "0", FCVAR_CHEAT, "show all uploaded textures" );
CVAR_DEFINE_AUTO( r_adjust_fov, "1", FCVAR_ARCHIVE, "making FOV adjustment for wide-screens" );
@@ -49,13 +51,102 @@ void R_GetTextureParms( int *w, int *h, int texnum )
if( h ) *h = REF_GET_PARM( PARM_TEX_HEIGHT, texnum );
}
/*
================
GL_FreeImage
static qboolean CheckSkybox( const char *name, char out[SKYBOX_MAX_SIDES][MAX_STRING] )
{
static const char *skybox_ext[3] = { "dds", "tga", "bmp" };
static const char *skybox_delim[2] = { "", "_" }; // no space for HL style, underscore for Q1 style
int i;
// search for skybox images
for( i = 0; i < ARRAYSIZE( skybox_ext ); i++ )
{
int j;
for( j = 0; j < ARRAYSIZE( skybox_delim ); j++ )
{
int k, num_checked_sides = 0;
for( k = 0; k < SKYBOX_MAX_SIDES; k++ )
{
char sidename[MAX_VA_STRING];
Q_snprintf( sidename, sizeof( sidename ), "%s%s%s.%s", name, skybox_delim[j], r_skyBoxSuffix[k], skybox_ext[i] );
if( g_fsapi.FileExists( sidename, false ))
{
Q_strncpy( out[k], sidename, sizeof( out[k] ));
num_checked_sides++;
}
}
if( num_checked_sides == SKYBOX_MAX_SIDES )
return true; // image exists
}
}
return false;
}
void R_SetupSky( const char *name )
{
string loadname;
char sidenames[SKYBOX_MAX_SIDES][MAX_STRING];
int skyboxTextures[SKYBOX_MAX_SIDES] = { 0 };
int i, len;
qboolean result;
if( !COM_CheckString( name ))
{
ref.dllFuncs.R_SetupSky( NULL ); // unload skybox
return;
}
Q_snprintf( loadname, sizeof( loadname ), "gfx/env/%s", name );
COM_StripExtension( loadname );
// kill the underline suffix to find them manually later
len = Q_strlen( loadname );
if( loadname[len - 1] == '_' )
loadname[len - 1] = '\0';
result = CheckSkybox( loadname, sidenames );
// to prevent infinite recursion if default skybox was missed
if( !result && Q_stricmp( name, DEFAULT_SKYBOX_NAME ))
{
Con_Reportf( S_WARN "missed or incomplete skybox '%s'\n", name );
R_SetupSky( DEFAULT_SKYBOX_NAME ); // force to default
return;
}
ref.dllFuncs.R_SetupSky( NULL ); // unload skybox
Con_DPrintf( "SKY: " );
for( i = 0; i < SKYBOX_MAX_SIDES; i++ )
{
skyboxTextures[i] = ref.dllFuncs.GL_LoadTexture( sidenames[i], NULL, 0, TF_CLAMP|TF_SKY );
if( !skyboxTextures[i] )
break;
Con_DPrintf( "%s%s%s", name, r_skyBoxSuffix[i], i != 5 ? ", " : ". " );
}
if( i == SKYBOX_MAX_SIDES )
{
SetBits( world.flags, FWORLD_CUSTOM_SKYBOX );
Con_DPrintf( "done\n" );
ref.dllFuncs.R_SetupSky( skyboxTextures );
return; // loaded
}
Con_DPrintf( "^2failed\n" );
for( i = 0; i < SKYBOX_MAX_SIDES; i++ )
{
if( skyboxTextures[i] )
ref.dllFuncs.GL_FreeTexture( skyboxTextures[i] );
}
}
Frees image by name
================
*/
void GAME_EXPORT GL_FreeImage( const char *name )
{
int texnum;
@@ -91,7 +182,7 @@ static model_t *pfnGetDefaultSprite( enum ref_defaultsprite_e spr )
{
case REF_DOT_SPRITE: return cl_sprite_dot;
case REF_CHROME_SPRITE: return cl_sprite_shell;
default: Host_Error( "GetDefaultSprite: unknown sprite %d\n", spr );
default: Host_Error( "%s: unknown sprite %d\n", __func__, spr );
}
return NULL;
}
@@ -104,7 +195,7 @@ static void *pfnMod_Extradata( int type, model_t *m )
case mod_studio: return Mod_StudioExtradata( m );
case mod_sprite: // fallthrough
case mod_brush: return NULL;
default: Host_Error( "Mod_Extradata: unknown type %d\n", type );
default: Host_Error( "%s: unknown type %d\n", __func__, type );
}
return NULL;
}
@@ -376,7 +467,6 @@ static void CL_FillTriAPIFromRef( triangleapi_t *dst, const ref_interface_t *src
static qboolean R_LoadProgs( const char *name )
{
extern triangleapi_t gTriApi;
static ref_api_t gpEngfuncs;
REFAPI GetRefAPI; // single export
@@ -386,7 +476,7 @@ static qboolean R_LoadProgs( const char *name )
if( !(ref.hInstance = COM_LoadLibrary( name, false, true ) ))
{
FS_AllowDirectPaths( false );
Con_Reportf( "R_LoadProgs: can't load renderer library %s: %s\n", name, COM_GetLibraryError() );
Con_Reportf( "%s: can't load renderer library %s: %s\n", __func__, name, COM_GetLibraryError() );
return false;
}
@@ -395,7 +485,7 @@ static qboolean R_LoadProgs( const char *name )
if( !( GetRefAPI = (REFAPI)COM_GetProcAddress( ref.hInstance, GET_REF_API )) )
{
COM_FreeLibrary( ref.hInstance );
Con_Reportf( "R_LoadProgs: can't find GetRefAPI entry point in %s\n", name );
Con_Reportf( "%s: can't find GetRefAPI entry point in %s\n", __func__, name );
ref.hInstance = NULL;
return false;
}
@@ -406,7 +496,7 @@ static qboolean R_LoadProgs( const char *name )
if( GetRefAPI( REF_API_VERSION, &ref.dllFuncs, &gpEngfuncs, &refState ) != REF_API_VERSION )
{
COM_FreeLibrary( ref.hInstance );
Con_Reportf( "R_LoadProgs: can't init renderer API: wrong version\n" );
Con_Reportf( "%s: can't init renderer API: wrong version\n", __func__ );
ref.hInstance = NULL;
return false;
}
@@ -416,7 +506,7 @@ static qboolean R_LoadProgs( const char *name )
if( !ref.dllFuncs.R_Init( ) )
{
COM_FreeLibrary( ref.hInstance );
Con_Reportf( "R_LoadProgs: can't init renderer!\n" ); //, ref.dllFuncs.R_GetInitError() );
Con_Reportf( "%s: can't init renderer!\n", __func__ ); //, ref.dllFuncs.R_GetInitError() );
ref.hInstance = NULL;
return false;
}

View File

@@ -44,6 +44,8 @@ void R_GetTextureParms( int *w, int *h, int texnum );
void GL_RenderFrame( const struct ref_viewpass_s *rvp );
void R_SetupSky( const char *name );
// common engine and renderer cvars
extern convar_t r_decals;
extern convar_t r_adjust_fov;
@@ -52,6 +54,4 @@ extern convar_t gl_clear;
qboolean R_Init( void );
void R_Shutdown( void );
extern triangleapi_t gTriApi;
#endif // REF_COMMON_H

View File

@@ -144,8 +144,8 @@ wavdata_t *S_LoadSound( sfx_t *sfx )
if( Q_stricmp( sfx->name, "*default" ))
{
// load it from disk
if( s_warn_late_precache.value > 0 && CL_Active() )
Con_Printf( S_WARN "S_LoadSound: late precache of %s\n", sfx->name );
if( s_warn_late_precache.value > 0 && cls.state == ca_active )
Con_Printf( S_WARN "%s: late precache of %s\n", __func__, sfx->name );
if( sfx->name[0] == '*' )
sc = FS_LoadSound( sfx->name + 1, NULL, 0 );

View File

@@ -43,7 +43,7 @@ CVAR_DEFINE_AUTO( s_lerping, "0", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "apply interpo
static CVAR_DEFINE( s_ambient_level, "ambient_level", "0.3", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "volume of environment noises (water and wind)" );
static CVAR_DEFINE( s_ambient_fade, "ambient_fade", "1000", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "rate of volume fading when client is moving" );
static CVAR_DEFINE_AUTO( s_combine_sounds, "0", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "combine channels with same sounds" );
static CVAR_DEFINE_AUTO( snd_mute_losefocus, "1", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "silence the audio when game window loses focus" );
CVAR_DEFINE_AUTO( snd_mute_losefocus, "1", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "silence the audio when game window loses focus" );
CVAR_DEFINE_AUTO( s_test, "0", 0, "engine developer cvar for quick testing new features" );
CVAR_DEFINE_AUTO( s_samplecount, "0", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "sample count (0 for default value)" );
CVAR_DEFINE_AUTO( s_warn_late_precache, "0", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "warn about late precached sounds on client-side" );
@@ -70,12 +70,6 @@ float S_GetMasterVolume( void )
return 0.0f;
}
if( s_listener.inmenu && !ui_renderworld.value && !Host_IsLocalGame( ))
{
// mute sounds in menu when it's not transparent and we're in multiplayer
return 0.0f;
}
if( !s_listener.inmenu && soundfade.percent != 0 )
{
scale = bound( 0.0f, soundfade.percent / 100.0f, 1.0f );
@@ -388,7 +382,7 @@ channel_t *SND_PickStaticChannel( const vec3_t pos, sfx_t *sfx )
// no empty slots, alloc a new static sound channel
if( total_channels == MAX_CHANNELS )
{
Con_DPrintf( S_ERROR "S_PickStaticChannel: no free channels\n" );
Con_DPrintf( S_ERROR "%s: no free channels\n", __func__ );
return NULL;
}
@@ -1608,7 +1602,7 @@ void SND_UpdateSound( void )
s_listener.frametime = (cl.time - cl.oldtime);
s_listener.waterlevel = cl.local.waterlevel;
s_listener.active = CL_IsInGame();
s_listener.inmenu = CL_IsInMenu();
s_listener.inmenu = cls.key_dest == key_menu;
s_listener.paused = cl.paused;
// update general area ambient sound sources

View File

@@ -57,6 +57,12 @@ float S_GetMusicVolume( void )
{
float scale = 1.0f;
if( host.status == HOST_NOFOCUS && snd_mute_losefocus.value != 0.0f )
{
// we return zero volume to keep sounds running
return 0.0f;
}
if( !s_listener.inmenu && musicfade.percent != 0 )
{
scale = bound( 0.0f, musicfade.percent / 100.0f, 1.0f );

View File

@@ -261,7 +261,7 @@ static const char *VOX_GetDirectory( char *szpath, const char *psz, int nsize )
if( len > nsize )
{
Con_Printf( "VOX_GetDirectory: invalid directory in: %s\n", psz );
Con_Printf( "%s: invalid directory in: %s\n", __func__, psz );
return NULL;
}
@@ -467,7 +467,7 @@ void VOX_LoadSound( channel_t *ch, const char *pszin )
if( !psz )
{
Con_Printf( "VOX_LoadSound: no sentence named %s\n", pszin );
Con_Printf( "%s: no sentence named %s\n", __func__, pszin );
return;
}
@@ -475,13 +475,13 @@ void VOX_LoadSound( channel_t *ch, const char *pszin )
if( !psz )
{
Con_Printf( "VOX_LoadSound: failed getting directory for %s\n", pszin );
Con_Printf( "%s: failed getting directory for %s\n", __func__, pszin );
return;
}
if( Q_strlen( psz ) >= sizeof( buffer ) )
{
Con_Printf( "VOX_LoadSound: sentence is too long %s", psz );
Con_Printf( "%s: sentence is too long %s", __func__, psz );
return;
}

View File

@@ -194,6 +194,7 @@ extern convar_t s_lerping;
extern convar_t s_test; // cvar to test new effects
extern convar_t s_samplecount;
extern convar_t s_warn_late_precache;
extern convar_t snd_mute_losefocus;
void S_InitScaletable( void );
wavdata_t *S_LoadSound( sfx_t *sfx );

View File

@@ -250,7 +250,7 @@ void CL_TextMessageParse( byte *pMemFile, int fileSize )
if( IsEndOfText( trim ))
{
Con_Reportf( "TextMessage: unexpected '}' found, line %d\n", lineNumber );
Con_Reportf( "%s: unexpected '}' found, line %d\n", __func__, lineNumber );
return;
}
Q_strncpy( currentName, trim, sizeof( currentName ));
@@ -263,7 +263,7 @@ void CL_TextMessageParse( byte *pMemFile, int fileSize )
// save name on name heap
if( lastNamePos + length > 32768 )
{
Con_Reportf( "TextMessage: error while parsing!\n" );
Con_Reportf( "%s: error while parsing!\n", __func__ );
return;
}
@@ -286,7 +286,7 @@ void CL_TextMessageParse( byte *pMemFile, int fileSize )
}
if( IsStartOfText( trim ))
{
Con_Reportf( "TextMessage: unexpected '{' found, line %d\n", lineNumber );
Con_Reportf( "%s: unexpected '{' found, line %d\n", __func__, lineNumber );
return;
}
break;
@@ -302,7 +302,7 @@ void CL_TextMessageParse( byte *pMemFile, int fileSize )
}
}
Con_Reportf( "TextMessage: parsed %d text messages\n", messageCount );
Con_Reportf( "%s: parsed %d text messages\n", __func__, messageCount );
nameHeapSize = lastNamePos;
textHeapSize = 0;
@@ -347,7 +347,7 @@ void CL_TextMessageParse( byte *pMemFile, int fileSize )
}
if(( pCurrentText - (char *)clgame.titles ) != ( textHeapSize + nameHeapSize + messageSize ))
Con_DPrintf( S_ERROR "TextMessage: overflow text message buffer!\n" );
Con_DPrintf( S_ERROR "%s: overflow text message buffer!\n", __func__ );
clgame.numTitles = messageCount;
}

View File

@@ -23,55 +23,180 @@ GNU General Public License for more details.
#include "input.h"
#include "platform/platform.h"
CVAR_DEFINE_AUTO( vgui_utf8, "0", FCVAR_ARCHIVE, "enable utf-8 support for vgui text" );
#define VGUI_MAX_TEXTURES 1024
static void GAME_EXPORT *VGUI_EngineMalloc( size_t size );
static void GAME_EXPORT VGUI_GetMousePos( int *, int * );
static void GAME_EXPORT VGUI_CursorSelect( VGUI_DefaultCursor );
static byte GAME_EXPORT VGUI_GetColor( int, int );
static int GAME_EXPORT VGUI_UtfProcessChar( int in );
static qboolean GAME_EXPORT VGUI_IsInGame( void );
static struct
typedef struct vgui_static_s
{
qboolean initialized;
vguiapi_t dllFuncs;
VGUI_DefaultCursor cursor;
vguiapi_t dllFuncs;
int textures[VGUI_MAX_TEXTURES];
int texture_id;
int bound_texture;
byte color[4];
qboolean enable_texture;
HINSTANCE hInstance;
enum VGUI_KeyCode virtualKeyTrans[256];
} vgui =
{
false,
{
false, // Not initialized yet
NULL, // VGUI_DrawInit,
NULL, // VGUI_DrawShutdown,
NULL, // VGUI_SetupDrawingText,
NULL, // VGUI_SetupDrawingRect,
NULL, // VGUI_SetupDrawingImage,
NULL, // VGUI_BindTexture,
NULL, // VGUI_EnableTexture,
NULL, // VGUI_CreateTexture,
NULL, // VGUI_UploadTexture,
NULL, // VGUI_UploadTextureBlock,
NULL, // VGUI_DrawQuad,
NULL, // VGUI_GetTextureSizes,
NULL, // VGUI_GenerateTexture,
VGUI_EngineMalloc,
VGUI_CursorSelect,
VGUI_GetColor,
VGUI_IsInGame,
Key_EnableTextInput,
VGUI_GetMousePos,
VGUI_UtfProcessChar,
Platform_GetClipboardText,
Platform_SetClipboardText,
Platform_GetKeyModifiers,
},
-1
} vgui_static_t;
static vgui_static_t vgui = {
false, -1
};
static CVAR_DEFINE_AUTO( vgui_utf8, "0", FCVAR_ARCHIVE, "enable utf-8 support for vgui text" );
static void GAME_EXPORT VGUI_DrawInit( void )
{
memset( vgui.textures, 0, sizeof( vgui.textures ));
vgui.texture_id = vgui.bound_texture = 0;
}
static void GAME_EXPORT VGUI_DrawShutdown( void )
{
int i;
for( i = 1; i < vgui.texture_id; i++ )
ref.dllFuncs.GL_FreeTexture( vgui.textures[i] );
}
static int GAME_EXPORT VGUI_GenerateTexture( void )
{
if( ++vgui.texture_id >= VGUI_MAX_TEXTURES )
Host_Error( "%s: VGUI_MAX_TEXTURES limit exceeded\n", __func__ );
return vgui.texture_id;
}
static void GAME_EXPORT VGUI_UploadTexture( int id, const char *buffer, int width, int height )
{
rgbdata_t r_image = { 0 };
char texName[32];
if( id <= 0 || id >= VGUI_MAX_TEXTURES )
{
Con_DPrintf( S_ERROR "%s: bad texture %i. Ignored\n", __func__, id );
return;
}
Q_snprintf( texName, sizeof( texName ), "*vgui%i", id );
r_image.width = width;
r_image.height = height;
r_image.type = PF_RGBA_32;
r_image.size = width * height * 4;
r_image.flags = IMAGE_HAS_COLOR|IMAGE_HAS_ALPHA;
r_image.buffer = (byte*)buffer;
vgui.textures[id] = GL_LoadTextureInternal( texName, &r_image, TF_IMAGE );
}
static void GAME_EXPORT VGUI_CreateTexture( int id, int width, int height )
{
rgbdata_t r_image = { 0 };
char texName[32];
if( id <= 0 || id >= VGUI_MAX_TEXTURES )
{
Con_DPrintf( S_ERROR "%s: bad texture %i. Ignored\n", __func__, id );
return;
}
Q_snprintf( texName, sizeof( texName ), "*vgui%i", id );
r_image.width = width;
r_image.height = height;
r_image.type = PF_RGBA_32;
r_image.size = width * height * 4;
r_image.flags = IMAGE_HAS_COLOR|IMAGE_HAS_ALPHA;
r_image.buffer = NULL;
vgui.textures[id] = GL_LoadTextureInternal( texName, &r_image, TF_IMAGE );
vgui.bound_texture = id;
}
static void GAME_EXPORT VGUI_UploadTextureBlock( int id, int drawX, int drawY, const byte *rgba, int blockWidth, int blockHeight )
{
if( id <= 0 || id >= VGUI_MAX_TEXTURES || vgui.textures[id] == 0 )
{
Con_DPrintf( S_ERROR "%s: bad texture %i. Ignored\n", __func__, id );
return;
}
ref.dllFuncs.VGUI_UploadTextureBlock( drawX, drawY, rgba, blockWidth, blockHeight );
vgui.bound_texture = id;
}
static void GAME_EXPORT VGUI_BindTexture( int id )
{
if( id <= 0 || id >= VGUI_MAX_TEXTURES || !vgui.textures[id] )
id = 1; // NOTE: same as bogus index 2700 in GoldSrc
ref.dllFuncs.GL_Bind( XASH_TEXTURE0, vgui.textures[id] );
vgui.bound_texture = id;
}
static void GAME_EXPORT VGUI_GetTextureSizes( int *w, int *h )
{
int texnum;
if( vgui.bound_texture )
texnum = vgui.textures[vgui.bound_texture];
else
texnum = R_GetBuiltinTexture( REF_DEFAULT_TEXTURE );
R_GetTextureParms( w, h, texnum );
}
static void GAME_EXPORT VGUI_SetupDrawingRect( int *pColor )
{
ref.dllFuncs.VGUI_SetupDrawing( true );
Vector4Set( vgui.color, pColor[0], pColor[1], pColor[2], 255 - pColor[3] );
}
static void GAME_EXPORT VGUI_SetupDrawingText( int *pColor )
{
ref.dllFuncs.VGUI_SetupDrawing( false );
Vector4Set( vgui.color, pColor[0], pColor[1], pColor[2], 255 - pColor[3] );
}
static void GAME_EXPORT VGUI_DrawQuad( const vpoint_t *ul, const vpoint_t *lr )
{
float x, y, w, h;
if( !ul || !lr )
return;
x = ul->point[0];
y = ul->point[1];
w = lr->point[0] - x;
h = lr->point[1] - y;
SPR_AdjustSize( &x, &y, &w, &h );
if( vgui.enable_texture )
{
float s1, s2, t1, t2;
s1 = ul->coord[0];
t1 = ul->coord[1];
s2 = lr->coord[0];
t2 = lr->coord[1];
ref.dllFuncs.Color4ub( vgui.color[0], vgui.color[1], vgui.color[2], vgui.color[3] );
ref.dllFuncs.R_DrawStretchPic( x, y, w, h, s1, t1, s2, t2, vgui.textures[vgui.bound_texture] );
}
else
{
ref.dllFuncs.FillRGBABlend( x, y, w, h, vgui.color[0], vgui.color[1], vgui.color[2], vgui.color[3] );
}
}
static void GAME_EXPORT VGUI_EnableTexture( qboolean enable )
{
vgui.enable_texture = enable;
}
static void GAME_EXPORT *VGUI_EngineMalloc( size_t size )
{
@@ -117,33 +242,46 @@ qboolean VGui_IsActive( void )
return vgui.initialized;
}
static void VGui_FillAPIFromRef( vguiapi_t *to, const ref_interface_t *from )
{
to->DrawInit = from->VGUI_DrawInit;
to->DrawShutdown = from->VGUI_DrawShutdown;
to->SetupDrawingText = from->VGUI_SetupDrawingText;
to->SetupDrawingRect = from->VGUI_SetupDrawingRect;
to->SetupDrawingImage = from->VGUI_SetupDrawingImage;
to->BindTexture = from->VGUI_BindTexture;
to->EnableTexture = from->VGUI_EnableTexture;
to->CreateTexture = from->VGUI_CreateTexture;
to->UploadTexture = from->VGUI_UploadTexture;
to->UploadTextureBlock = from->VGUI_UploadTextureBlock;
to->DrawQuad = from->VGUI_DrawQuad;
to->GetTextureSizes = from->VGUI_GetTextureSizes;
to->GenerateTexture = from->VGUI_GenerateTexture;
}
void VGui_RegisterCvars( void )
{
Cvar_RegisterVariable( &vgui_utf8 );
}
static const vguiapi_t gEngfuncs =
{
false, // Not initialized yet
VGUI_DrawInit, // VGUI_DrawInit,
VGUI_DrawShutdown, // VGUI_DrawShutdown,
VGUI_SetupDrawingText, // VGUI_SetupDrawingText,
VGUI_SetupDrawingRect, // VGUI_SetupDrawingRect,
VGUI_SetupDrawingText, // VGUI_SetupDrawingImage, (same as text)
VGUI_BindTexture, // VGUI_BindTexture,
VGUI_EnableTexture, // VGUI_EnableTexture,
VGUI_CreateTexture, // VGUI_CreateTexture,
VGUI_UploadTexture, // VGUI_UploadTexture,
VGUI_UploadTextureBlock, // VGUI_UploadTextureBlock,
VGUI_DrawQuad, // VGUI_DrawQuad,
VGUI_GetTextureSizes, // VGUI_GetTextureSizes,
VGUI_GenerateTexture, // VGUI_GenerateTexture,
VGUI_EngineMalloc,
VGUI_CursorSelect,
VGUI_GetColor,
VGUI_IsInGame,
Key_EnableTextInput,
VGUI_GetMousePos,
VGUI_UtfProcessChar,
Platform_GetClipboardText,
Platform_SetClipboardText,
Platform_GetKeyModifiers,
};
qboolean VGui_LoadProgs( HINSTANCE hInstance )
{
void (*F)( vguiapi_t* );
qboolean client = hInstance != NULL;
memcpy( &vgui.dllFuncs, &gEngfuncs, sizeof( vgui.dllFuncs ));
// not loading interface from client.dll, load vgui_support.dll instead
if( !client )
{
@@ -167,7 +305,7 @@ qboolean VGui_LoadProgs( HINSTANCE hInstance )
{
if( FS_FileExists( vguiloader, false ))
Con_Reportf( S_ERROR "Failed to load vgui_support library: %s\n", COM_GetLibraryError() );
else Con_Reportf( "vgui_support: not found\n" );
else Con_Reportf( "%s: not found\n", __func__ );
return false;
}
@@ -178,16 +316,15 @@ qboolean VGui_LoadProgs( HINSTANCE hInstance )
if( F )
{
VGui_FillAPIFromRef( &vgui.dllFuncs, &ref.dllFuncs );
F( &vgui.dllFuncs );
vgui.initialized = vgui.dllFuncs.initialized = true;
Con_Reportf( "vgui_support: initialized legacy API in %s module\n", client ? "client" : "support" );
Con_Reportf( "%s: initialized legacy API in %s module\n", __func__, client ? "client" : "support" );
return true;
}
Con_Reportf( S_ERROR "Failed to find VGUI support API entry point in %s module\n", client ? "client" : "support" );
Con_Reportf( S_ERROR "%s: Failed to find VGUI support API entry point in %s module\n", __func__, client ? "client" : "support" );
return false;
}
@@ -233,8 +370,9 @@ void VGui_Shutdown( void )
if( vgui.hInstance )
COM_FreeLibrary( vgui.hInstance );
// drop pointers to now unloaded vgui_support
memcpy( &vgui.dllFuncs, &gEngfuncs, sizeof( vgui.dllFuncs ));
vgui.hInstance = NULL;
vgui.initialized = false;
}

View File

@@ -175,7 +175,7 @@ static void VID_Mode_f( void )
vidmode = R_GetVideoMode( Q_atoi( Cmd_Argv( 1 )) );
if( !vidmode )
{
Con_Print( S_ERROR "unable to set mode, backend returned null" );
Con_Printf( S_ERROR "unable to set mode, backend returned null" );
return;
}

View File

@@ -162,7 +162,7 @@ void BaseCmd_Remove( base_command_type_e type, const char *name )
if( !i )
{
Con_Reportf( S_ERROR "Couldn't find %s in buckets\n", name );
Con_Reportf( S_ERROR "%s: Couldn't find %s in buckets\n", __func__, name );
return;
}

View File

@@ -86,7 +86,7 @@ static void *Cbuf_GetSpace( cmdbuf_t *buf, int length )
if(( buf->cursize + length ) > buf->maxsize )
{
buf->cursize = 0;
Host_Error( "Cbuf_GetSpace: overflow\n" );
Host_Error( "%s: overflow\n", __func__ );
}
data = buf->data + buf->cursize;
@@ -156,7 +156,7 @@ static void Cbuf_InsertTextToBuffer( cmdbuf_t *buf, const char *text )
if(( buf->cursize + l ) >= buf->maxsize )
{
Con_Reportf( S_WARN "Cbuf_InsertText: overflow\n" );
Con_Reportf( S_WARN "%s: overflow\n", __func__ );
}
else
{
@@ -224,7 +224,7 @@ static void Cbuf_ExecuteCommandsFromBuffer( cmdbuf_t *buf, qboolean isPrivileged
if( i >= ( MAX_CMD_LINE - 1 ))
{
Con_DPrintf( S_ERROR "Cbuf_Execute: command string owerflow\n" );
Con_DPrintf( S_ERROR "%s: command string owerflow\n", __func__ );
line[0] = 0;
}
else
@@ -682,7 +682,7 @@ static int Cmd_AddCommandEx( const char *funcname, const char *cmd_name, xcomman
if( !COM_CheckString( cmd_name ))
{
Con_Reportf( S_ERROR "%s: NULL name\n", funcname );
Con_Reportf( S_ERROR "%s: NULL name\n", funcname );
return 0;
}
@@ -728,7 +728,7 @@ Cmd_AddCommand
*/
void Cmd_AddCommand( const char *cmd_name, xcommand_t function, const char *cmd_desc )
{
Cmd_AddCommandEx( __FUNCTION__, cmd_name, function, cmd_desc, 0 );
Cmd_AddCommandEx( __func__, cmd_name, function, cmd_desc, 0 );
}
@@ -739,7 +739,7 @@ Cmd_AddRestrictedCommand
*/
void Cmd_AddRestrictedCommand( const char *cmd_name, xcommand_t function, const char *cmd_desc )
{
Cmd_AddCommandEx( __FUNCTION__, cmd_name, function, cmd_desc, CMD_PRIVILEGED );
Cmd_AddCommandEx( __func__, cmd_name, function, cmd_desc, CMD_PRIVILEGED );
}
/*
@@ -749,7 +749,7 @@ Cmd_AddServerCommand
*/
void GAME_EXPORT Cmd_AddServerCommand( const char *cmd_name, xcommand_t function )
{
Cmd_AddCommandEx( __FUNCTION__, cmd_name, function, "server command", CMD_SERVERDLL );
Cmd_AddCommandEx( __func__, cmd_name, function, "server command", CMD_SERVERDLL );
}
/*
@@ -767,7 +767,7 @@ int GAME_EXPORT Cmd_AddClientCommand( const char *cmd_name, xcommand_t function
flags |= CMD_PRIVILEGED;
}
return Cmd_AddCommandEx( __FUNCTION__, cmd_name, function, "client command", flags );
return Cmd_AddCommandEx( __func__, cmd_name, function, "client command", flags );
}
/*
@@ -777,7 +777,7 @@ Cmd_AddGameUICommand
*/
int GAME_EXPORT Cmd_AddGameUICommand( const char *cmd_name, xcommand_t function )
{
return Cmd_AddCommandEx( __FUNCTION__, cmd_name, function, "gameui command", CMD_GAMEUIDLL );
return Cmd_AddCommandEx( __func__, cmd_name, function, "gameui command", CMD_GAMEUIDLL );
}
/*
@@ -787,7 +787,7 @@ Cmd_AddRefCommand
*/
int Cmd_AddRefCommand( const char *cmd_name, xcommand_t function, const char *description )
{
return Cmd_AddCommandEx( __FUNCTION__, cmd_name, function, description, CMD_REFDLL );
return Cmd_AddCommandEx( __func__, cmd_name, function, description, CMD_REFDLL );
}
/*

View File

@@ -39,9 +39,6 @@ GNU General Public License for more details.
// end game final default message
#define DEFAULT_ENDGAME_MESSAGE "The End"
// path to the hash-pak that contain custom player decals
#define CUSTOM_RES_PATH "custom.hpk"
// path to default playermodel in GoldSrc
#define DEFAULT_PLAYER_PATH_HALFLIFE "models/player.mdl"
@@ -62,7 +59,7 @@ GNU General Public License for more details.
#define DEFAULT_SAVE_DIRECTORY "save/"
// fallback to this skybox
#define DEFAULT_SKYBOX_PATH "gfx/env/desert"
#define DEFAULT_SKYBOX_NAME "desert"
// playlist for startup videos
#define DEFAULT_VIDEOLIST_PATH "media/StartupVids.txt"

View File

@@ -971,7 +971,7 @@ used by CS:CZ
*/
void *GAME_EXPORT pfnSequenceGet( const char *fileName, const char *entryName )
{
Msg( "Sequence_Get: file %s, entry %s\n", fileName, entryName );
Msg( "%s: file %s, entry %s\n", __func__, fileName, entryName );
return NULL;
}
@@ -985,7 +985,7 @@ used by CS:CZ
*/
void *GAME_EXPORT pfnSequencePickSentence( const char *groupName, int pickMethod, int *picked )
{
Msg( "Sequence_PickSentence: group %s, pickMethod %i\n", groupName, pickMethod );
Msg( "%s: group %s, pickMethod %i\n", __func__, groupName, pickMethod );
return NULL;

View File

@@ -157,13 +157,16 @@ extern convar_t gl_vsync;
extern convar_t scr_loading;
extern convar_t scr_download;
extern convar_t cmd_scripting;
extern convar_t cl_allow_levelshots;
extern convar_t host_allow_materials;
extern convar_t host_developer;
extern convar_t host_limitlocal;
extern convar_t host_maxfps;
extern convar_t sys_timescale;
extern convar_t cl_filterstuffcmd;
extern convar_t rcon_password;
extern convar_t hpk_custom_file;
#define Mod_AllowMaterials() ( host_allow_materials.value != 0.0f && !FBitSet( host.features, ENGINE_DISABLE_HDTEXTURES ))
/*
==============================================================
@@ -180,15 +183,6 @@ GAMEINFO stuff
internal shared gameinfo structure (readonly for engine parts)
========================================================================
*/
typedef struct sysinfo_s
{
string exeName; // exe.filename
string rcName; // .rc script name
string basedirName; // name of base directory
string gamedll;
string clientlib;
} sysinfo_t;
typedef enum
{
HOST_INIT = 0, // initalize operations
@@ -283,90 +277,73 @@ typedef enum bugcomp_e
typedef struct host_parm_s
{
HINSTANCE hInst;
HANDLE hMutex;
// ==== shared through RefAPI's ref_host_t
double realtime; // host.curtime
double frametime; // time between engine frames
uint features; // custom features that enables by mod-maker request
// ==== shared through RefAPI's ref_host_t
host_status_t status; // global host state
game_status_t game; // game manager
uint type; // running at
jmp_buf abortframe; // abort current frame
dword errorframe; // to prevent multiple host error
poolhandle_t mempool; // static mempool for misc allocations
string finalmsg; // server shutdown final message
string downloadfile; // filename to be downloading
int downloadcount; // how many files remain to downloading
char deferred_cmd[128]; // deferred commands
host_redirect_t rd; // remote console
host_status_t status; // global host state
game_status_t game; // game manager
uint type; // running at
poolhandle_t mempool; // static mempool for misc allocations
poolhandle_t imagepool; // imagelib mempool
poolhandle_t soundpool; // soundlib mempool
string finalmsg; // server shutdown final message
string downloadfile; // filename to be downloading
int downloadcount; // how many files remain to downloading
char deferred_cmd[128];// deferred commands
host_redirect_t rd; // remote console
void *hWnd; // main window
// command line parms
int argc;
char **argv;
char **argv;
int argc;
// ==== shared through RefAPI's ref_host_t
double realtime; // host.curtime
double frametime; // time between engine frames
uint features; // custom features that enables by mod-maker request
// ==== shared through RefAPI's ref_host_t
uint framecount; // global framecount
uint errorframe; // to prevent multiple host error
uint32_t bugcomp; // bug compatibility level, for very "special" games
double realframetime; // for some system events, e.g. console animations
double starttime; // measure time to first frame
double pureframetime; // count of sleeps can be inserted between frames
double force_draw_version_time;
double realframetime; // for some system events, e.g. console animations
char draw_decals[MAX_DECALS][MAX_QPATH]; // list of unique decal indexes
vec3_t player_mins[MAX_MAP_HULLS]; // 4 hulls allowed
vec3_t player_maxs[MAX_MAP_HULLS]; // 4 hulls allowed
uint framecount; // global framecount
// list of unique decal indexes
char draw_decals[MAX_DECALS][MAX_QPATH];
vec3_t player_mins[MAX_MAP_HULLS]; // 4 hulls allowed
vec3_t player_maxs[MAX_MAP_HULLS]; // 4 hulls allowed
void* hWnd; // main window
qboolean allow_console; // allow console in dev-mode or multiplayer game
qboolean allow_console_init; // initial value to allow the console
qboolean key_overstrike; // key overstrike mode
qboolean stuffcmds_pending; // should execute stuff commands
qboolean allow_cheats; // this host will allow cheating
qboolean con_showalways; // show console always (developer and dedicated)
qboolean change_game; // initialize when game is changed
qboolean mouse_visible; // vgui override cursor control (never change outside Platform_SetCursorType!)
qboolean shutdown_issued; // engine is shutting down
double force_draw_version_time;
qboolean apply_game_config; // when true apply only to game cvars and ignore all other commands
qboolean apply_opengl_config;// when true apply only to opengl cvars and ignore all other commands
qboolean config_executed; // a bit who indicated was config.cfg already executed e.g. from valve.rc
qboolean crashed; // set to true if crashed
qboolean daemonized;
qboolean enabledll;
qboolean textmode;
qboolean allow_console; // allow console in dev-mode or multiplayer game
qboolean allow_console_init; // initial value to allow the console
qboolean key_overstrike; // key overstrike mode
qboolean stuffcmds_pending; // should execute stuff commands
qboolean allow_cheats; // this host will allow cheating
qboolean change_game; // initialize when game is changed
qboolean mouse_visible; // vgui override cursor control (never change outside Platform_SetCursorType!)
qboolean shutdown_issued; // engine is shutting down
qboolean apply_game_config; // when true apply only to game cvars and ignore all other commands
qboolean apply_opengl_config; // when true apply only to opengl cvars and ignore all other commands
qboolean config_executed; // a bit who indicated was config.cfg already executed e.g. from valve.rc
qboolean crashed; // set to true if crashed
#if XASH_DLL_LOADER
qboolean enabledll;
#endif
qboolean textmode;
// some settings were changed and needs to global update
qboolean userinfo_changed;
qboolean movevars_changed;
qboolean renderinfo_changed;
char rootdir[MAX_OSPATH]; // member root directory
char rodir[MAX_OSPATH]; // readonly root
char gamefolder[MAX_QPATH]; // it's a default gamefolder
poolhandle_t imagepool; // imagelib mempool
poolhandle_t soundpool; // soundlib mempool
qboolean userinfo_changed;
qboolean movevars_changed;
qboolean renderinfo_changed;
// for IN_MouseMove() easy access
int window_center_x;
int window_center_y;
struct decallist_s *decalList; // used for keep decals, when renderer is restarted or changed
int numdecals;
// bug compatibility level, for very "special" games
uint32_t bugcomp;
// measure time to first frame
double starttime;
// count of sleeps can be inserted between frames
double pureframetime;
int window_center_x;
int window_center_y;
string gamedll;
string clientlib;
} host_parm_t;
extern host_parm_t host;
extern sysinfo_t SI;
#define CMD_SERVERDLL BIT( 0 ) // added by server.dll
#define CMD_CLIENTDLL BIT( 1 ) // added by client.dll
@@ -380,8 +357,7 @@ typedef void (*xcommand_t)( void );
//
// filesystem_engine.c
//
qboolean FS_LoadProgs( void );
void FS_Init( void );
void FS_Init( const char *basedir );
void FS_Shutdown( void );
void *FS_GetNativeObject( const char *obj );
@@ -535,12 +511,10 @@ void Host_WriteServerConfig( const char *name );
void Host_WriteOpenGLConfig( void );
void Host_WriteVideoConfig( void );
void Host_WriteConfig( void );
qboolean Host_IsLocalGame( void );
qboolean Host_IsLocalClient( void );
void Host_ShutdownServer( void );
void Host_Error( const char *error, ... ) _format( 1 );
void Host_ValidateEngineFeatures( uint32_t features );
void Host_Frame( float time );
void Host_Frame( double time );
void Host_Credits( void );
//
@@ -551,7 +525,7 @@ void COM_NewGame( char const *pMapName );
void COM_LoadLevel( char const *pMapName, qboolean background );
void COM_LoadGame( char const *pSaveFileName );
void COM_ChangeLevel( char const *pNewLevel, char const *pLandmarkName, qboolean background );
void COM_Frame( float time );
void COM_Frame( double time );
/*
==============================================================
@@ -677,7 +651,6 @@ struct physent_s;
struct sv_client_s;
typedef struct sizebuf_s sizebuf_t;
qboolean CL_IsInGame( void );
qboolean CL_IsInMenu( void );
qboolean CL_IsInConsole( void );
qboolean CL_IsThirdPerson( void );
qboolean CL_IsIntermission( void );
@@ -697,6 +670,7 @@ void SV_BroadcastPrintf( struct sv_client_s *ignore, const char *fmt, ... ) _for
void CL_ClearStaticEntities( void );
qboolean S_StreamGetCurrentState( char *currentTrack, size_t currentTrackSize, char *loopTrack, size_t loopTrackSize, int *position );
void CL_ServerCommand( qboolean reliable, const char *fmt, ... ) _format( 2 );
void CL_UpdateInfo( const char *key, const char *value );
void CL_HudMessage( const char *pMessage );
const char *CL_MsgInfo( int cmd );
void SV_DrawDebugTriangles( void );
@@ -770,6 +744,18 @@ int COM_CompareFileTime( const char *filename1, const char *filename2, int *iCom
char *va( const char *format, ... ) _format( 1 );
qboolean CRC32_MapFile( dword *crcvalue, const char *filename, qboolean multiplayer );
static inline qboolean Host_IsLocalGame( void )
{
if( SV_Active( ))
return SV_GetMaxClients() == 1 ? true : false;
return CL_GetMaxClients() == 1 ? true : false;
}
static inline qboolean Host_IsLocalClient( void )
{
return CL_Initialized( ) && SV_Initialized( ) ? true : false;
}
// soundlib shared exports
qboolean S_Init( void );
void S_Shutdown( void );

View File

@@ -585,7 +585,7 @@ static qboolean Cmd_GetKeysList( const char *s, char *completedname, int length
Con_Printf( "%16s\n", matchbuf );
}
Con_Printf( "\n^3 %lu keys found.\n", numkeys );
Con_Printf( "\n^3 %zu keys found.\n", numkeys );
if( completedname && length )
{
@@ -1395,7 +1395,7 @@ void Host_WriteConfig( void )
f = FS_Open( "config.cfg.new", "w", false );
if( f )
{
Con_Reportf( "Host_WriteConfig()\n" );
Con_Reportf( "%s()\n", __func__ );
FS_Printf( f, "//=======================================================================\n");
FS_Printf( f, "//\t\t\tCopyright XashXT Group & Flying With Gauss %s (C)\n", Q_timestamp( TIME_YEAR_ONLY ));
FS_Printf( f, "//\t\t\tconfig.cfg - archive of cvars\n" );
@@ -1478,7 +1478,7 @@ void Host_WriteOpenGLConfig( void )
f = FS_Open( va( "%s.new", name ), "w", false );
if( f )
{
Con_Reportf( "Host_WriteGLConfig()\n" );
Con_Reportf( "%s()\n", __func__ );
FS_Printf( f, "//=======================================================================\n" );
FS_Printf( f, "//\t\t\tCopyright XashXT Group & Flying With Gauss %s (C)\n", Q_timestamp( TIME_YEAR_ONLY ));
FS_Printf( f, "//\t\t %s - archive of renderer implementation cvars\n", name );
@@ -1508,7 +1508,7 @@ void Host_WriteVideoConfig( void )
f = FS_Open( "video.cfg.new", "w", false );
if( f )
{
Con_Reportf( "Host_WriteVideoConfig()\n" );
Con_Reportf( "%s()\n", __func__ );
FS_Printf( f, "//=======================================================================\n" );
FS_Printf( f, "//\t\t\tCopyright XashXT Group & Flying With Gauss %s (C)\n", Q_timestamp( TIME_YEAR_ONLY ));
FS_Printf( f, "//\t\tvideo.cfg - archive of renderer variables\n");

View File

@@ -80,7 +80,7 @@ static int Sys_ModuleName( HANDLE process, char *name, void *address, int len )
static void Sys_StackTrace( PEXCEPTION_POINTERS pInfo )
{
char message[1024];
char message[8192]; // match *nix Sys_Crash
int len = 0;
size_t i;
HANDLE process = GetCurrentProcess();
@@ -148,6 +148,10 @@ static void Sys_StackTrace( PEXCEPTION_POINTERS pInfo )
#elif
#error
#endif
len = Q_snprintf( message, sizeof( message ), "Ver: " XASH_ENGINE_NAME " " XASH_VERSION " (build %i-%s, %s-%s)\n",
Q_buildnum(), Q_buildcommit(), Q_buildos(), Q_buildarch() );
len += Q_snprintf( message + len, 1024 - len, "Sys_Crash: address %p, code %p\n",
pInfo->ExceptionRecord->ExceptionAddress, (void*)pInfo->ExceptionRecord->ExceptionCode );
if( SymGetLineFromAddr64( process, (DWORD64)pInfo->ExceptionRecord->ExceptionAddress, &dline, &line ) )
@@ -275,6 +279,10 @@ static long _stdcall Sys_Crash( PEXCEPTION_POINTERS pInfo )
// check to avoid recursive call
host.crashed = true;
#ifdef XASH_SDL
SDL_SetWindowGrab( host.hWnd, SDL_FALSE );
#endif // XASH_SDL
#if DBGHELP
Sys_StackTrace( pInfo );
#else
@@ -325,7 +333,6 @@ void Sys_SetupCrashHandler( void )
{
SetErrorMode( SEM_FAILCRITICALERRORS ); // no abort/retry/fail errors
oldFilter = SetUnhandledExceptionFilter( Sys_Crash );
host.hInst = GetModuleHandle( NULL );
}
void Sys_RestoreCrashHandler( void )

View File

@@ -16,6 +16,7 @@ GNU General Public License for more details.
#include "common.h"
#include "custom.h"
#include "ref_common.h"
#include "hpak.h" // be aware of HPK limits
static rgbdata_t *CustomDecal_LoadImage( const char *path, void *raw, int size )
{
@@ -93,7 +94,7 @@ qboolean COM_CreateCustomization( customization_t *pListHead, resource_t *pResou
if( FBitSet( flags, FCUST_FROMHPAK ))
{
if( !HPAK_GetDataPointer( CUSTOM_RES_PATH, pResource, (byte **)&pCust->pBuffer, NULL ))
if( !HPAK_GetDataPointer( hpk_custom_file.string, pResource, (byte **)&pCust->pBuffer, NULL ))
bError = true;
}
else
@@ -115,11 +116,11 @@ qboolean COM_CreateCustomization( customization_t *pListHead, resource_t *pResou
{
if( !FBitSet( flags, FCUST_IGNOREINIT ))
{
if( pResource->nDownloadSize >= (1 * 1024) && pResource->nDownloadSize <= ( 128 * 1024 ))
if( pResource->nDownloadSize >= HPAK_ENTRY_MIN_SIZE && pResource->nDownloadSize <= HPAK_ENTRY_MAX_SIZE )
{
pCust->bTranslated = true;
pCust->nUserData1 = 0;
pCust->nUserData2 = 1;
pCust->nUserData2 = 7;
if( !FBitSet( flags, FCUST_WIPEDATA ))
pCust->pInfo = CustomDecal_LoadImage( pResource->szFileName, pCust->pBuffer, pCust->resource.nDownloadSize );

View File

@@ -164,8 +164,7 @@ static qboolean Cvar_UpdateInfo( convar_t *var, const char *value, qboolean noti
return false; // failed to change value
// time to update server copy of userinfo
CL_ServerCommand( true, "setinfo \"%s\" \"%s\"\n", var->name, value );
CL_LegacyUpdateInfo();
CL_UpdateInfo( var->name, value );
}
#endif
}
@@ -794,7 +793,7 @@ void GAME_EXPORT Cvar_Set( const char *var_name, const char *value )
if( !var_name )
{
// there is an error in C code if this happens
Con_Printf( "Cvar_Set: passed NULL variable name\n" );
Con_Printf( "%s: passed NULL variable name\n", __func__ );
return;
}
@@ -803,7 +802,7 @@ void GAME_EXPORT Cvar_Set( const char *var_name, const char *value )
if( !var )
{
// there is an error in C code if this happens
Con_Printf( "Cvar_Set: variable '%s' not found\n", var_name );
Con_Printf( "%s: variable '%s' not found\n", __func__, var_name );
return;
}
@@ -848,7 +847,7 @@ float GAME_EXPORT Cvar_VariableValue( const char *var_name )
if( !var_name )
{
// there is an error in C code if this happens
Con_Printf( "Cvar_VariableValue: passed NULL variable name\n" );
Con_Printf( "%s: passed NULL variable name\n", __func__ );
return 0.0f;
}
@@ -885,7 +884,7 @@ const char *Cvar_VariableString( const char *var_name )
if( !var_name )
{
// there is an error in C code if this happens
Con_Printf( "Cvar_VariableString: passed NULL variable name\n" );
Con_Printf( "%s: passed NULL variable name\n", __func__ );
return "";
}

View File

@@ -39,11 +39,6 @@ qboolean CL_IsInGame( void )
return true; // always active for dedicated servers
}
qboolean CL_IsInMenu( void )
{
return false;
}
qboolean CL_IsInConsole( void )
{
return false;

View File

@@ -16,6 +16,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
#include <errno.h>
#include "common.h"
#include "library.h"
#include "platform/platform.h"
@@ -26,6 +27,15 @@ fs_globals_t *FI;
static pfnCreateInterface_t fs_pfnCreateInterface;
static HINSTANCE fs_hInstance;
static void COM_StripDirectorySlash( char *pname )
{
size_t len;
len = Q_strlen( pname );
if( len > 0 && pname[len - 1] == '/' )
pname[len - 1] = 0;
}
void *FS_GetNativeObject( const char *obj )
{
if( fs_pfnCreateInterface )
@@ -80,7 +90,7 @@ static void FS_UnloadProgs( void )
#define FILESYSTEM_STDIO_DLL "filesystem_stdio." OS_LIB_EXT
#endif
qboolean FS_LoadProgs( void )
static qboolean FS_LoadProgs( void )
{
const char *name = FILESYSTEM_STDIO_DLL;
FSAPI GetFSAPI;
@@ -89,63 +99,154 @@ qboolean FS_LoadProgs( void )
if( !fs_hInstance )
{
Host_Error( "%s: can't load filesystem library %s: %s\n", __func__, name, COM_GetLibraryError() );
Sys_Error( "%s: can't load filesystem library %s: %s\n", __func__, name, COM_GetLibraryError() );
return false;
}
if( !( GetFSAPI = (FSAPI)COM_GetProcAddress( fs_hInstance, GET_FS_API )))
{
FS_UnloadProgs();
Host_Error( "%s: can't find GetFSAPI entry point in %s\n", __func__, name );
Sys_Error( "%s: can't find GetFSAPI entry point in %s\n", __func__, name );
return false;
}
if( GetFSAPI( FS_API_VERSION, &g_fsapi, &FI, &fs_memfuncs ) != FS_API_VERSION )
{
FS_UnloadProgs();
Host_Error( "%s: can't initialize filesystem API: wrong version\n", __func__ );
Sys_Error( "%s: can't initialize filesystem API: wrong version\n", __func__ );
return false;
}
if( !( fs_pfnCreateInterface = (pfnCreateInterface_t)COM_GetProcAddress( fs_hInstance, "CreateInterface" )))
{
FS_UnloadProgs();
Host_Error( "%s: can't find CreateInterface entry point in %s\n", __func__, name );
Sys_Error( "%s: can't find CreateInterface entry point in %s\n", __func__, name );
return false;
}
Con_DPrintf( "%s: filesystem_stdio successfully loaded\n", __func__ );
return true;
}
static qboolean FS_DetermineRootDirectory( char *out, size_t size )
{
const char *path = getenv( "XASH3D_BASEDIR" );
if( COM_CheckString( path ))
{
Q_strncpy( out, path, size );
return true;
}
#if TARGET_OS_IOS
Q_strncpy( out, IOS_GetDocsDir(), size );
return true;
#elif XASH_ANDROID && XASH_SDL
path = SDL_AndroidGetExternalStoragePath();
if( path != NULL )
{
Q_strncpy( out, path, size );
return true;
}
Sys_Error( "couldn't determine Android external storage path: %s", SDL_GetError( ));
return false;
#elif XASH_PSVITA
if( PSVita_GetBasePath( out, size ))
return true;
Sys_Error( "couldn't find Xash3D data directory" );
return false;
#elif ( XASH_SDL == 2 ) && !XASH_NSWITCH // GetBasePath not impl'd in switch-sdl2
path = SDL_GetBasePath();
if( path != NULL )
{
Q_strncpy( out, path, size );
SDL_free(( void *)path );
return true;
}
#if XASH_POSIX || XASH_WIN32
if( getcwd( out, size ))
return true;
Sys_Error( "couldn't determine current directory: %s, getcwd: %s", SDL_GetError(), strerror( errno ));
#else // !( XASH_POSIX || XASH_WIN32 )
Sys_Error( "couldn't determine current directory: %s", SDL_GetError( ));
#endif // !( XASH_POSIX || XASH_WIN32 )
return false;
#else // generic case
if( getcwd( out, size ))
return true;
Sys_Error( "couldn't determine current directory: %s", strerror( errno ));
return false;
#endif // generic case
}
static qboolean FS_DetermineReadOnlyRootDirectory( char *out, size_t size )
{
const char *env_rodir = getenv( "XASH3D_RODIR" );
if( _Sys_GetParmFromCmdLine( "-rodir", out, size ))
return true;
if( COM_CheckString( env_rodir ))
{
Q_strncpy( out, env_rodir, size );
return true;
}
return false;
}
/*
================
FS_Init
================
*/
void FS_Init( void )
void FS_Init( const char *basedir )
{
string gamedir;
char rodir[MAX_OSPATH], rootdir[MAX_OSPATH];
rodir[0] = rootdir[0] = 0;
if( !FS_DetermineRootDirectory( rootdir, sizeof( rootdir )) || !COM_CheckStringEmpty( rootdir ))
{
Sys_Error( "couldn't determine current directory (empty string)" );
return;
}
COM_FixSlashes( rootdir );
COM_StripDirectorySlash( rootdir );
FS_DetermineReadOnlyRootDirectory( rodir, sizeof( rodir ));
COM_FixSlashes( rodir );
COM_StripDirectorySlash( rodir );
if( !Sys_GetParmFromCmdLine( "-game", gamedir ))
Q_strncpy( gamedir, basedir, sizeof( gamedir )); // gamedir == basedir
FS_LoadProgs();
// TODO: this function will cause engine to stop in case of fail
// when it will have an option to return string error, restore Sys_Error
// FIXME: why do we call this function before InitStdio?
// because InitStdio immediately scans all available game directories
// and this better be reworked at some point
g_fsapi.SetCurrentDirectory( rootdir );
if( !g_fsapi.InitStdio( true, rootdir, basedir, gamedir, rodir ))
{
Sys_Error( "Can't init filesystem_stdio!\n" );
return;
}
Cmd_AddRestrictedCommand( "fs_rescan", FS_Rescan_f, "rescan filesystem search pathes" );
Cmd_AddRestrictedCommand( "fs_path", FS_Path_f_, "show filesystem search pathes" );
Cmd_AddRestrictedCommand( "fs_clearpaths", FS_ClearPaths_f, "clear filesystem search pathes" );
if( !Sys_GetParmFromCmdLine( "-game", gamedir ))
Q_strncpy( gamedir, SI.basedirName, sizeof( gamedir )); // gamedir == basedir
if( !Sys_GetParmFromCmdLine( "-dll", host.gamedll ))
host.gamedll[0] = 0;
if( !FS_InitStdio( true, host.rootdir, SI.basedirName, gamedir, host.rodir ))
{
Host_Error( "Can't init filesystem_stdio!\n" );
return;
}
if( !Sys_GetParmFromCmdLine( "-dll", SI.gamedll ))
SI.gamedll[0] = 0;
if( !Sys_GetParmFromCmdLine( "-clientlib", SI.clientlib ))
SI.clientlib[0] = 0;
if( !Sys_GetParmFromCmdLine( "-clientlib", host.clientlib ))
host.clientlib[0] = 0;
}
/*
@@ -158,11 +259,5 @@ void FS_Shutdown( void )
if( g_fsapi.ShutdownStdio )
g_fsapi.ShutdownStdio();
memset( &SI, 0, sizeof( sysinfo_t ));
FS_UnloadProgs();
}

View File

@@ -18,8 +18,6 @@ GNU General Public License for more details.
#include <SDL.h>
#endif // XASH_SDL
#include <stdarg.h> // va_args
#include <errno.h> // errno
#include <string.h> // strerror
#if !XASH_WIN32
#include <unistd.h> // fork
#include <sys/types.h>
@@ -29,7 +27,6 @@ GNU General Public License for more details.
#if XASH_EMSCRIPTEN
#include <emscripten/emscripten.h>
#endif
#include <errno.h>
#include "common.h"
#include "base_cmd.h"
#include "client.h"
@@ -45,7 +42,6 @@ GNU General Public License for more details.
pfnChangeGame pChangeGame = NULL;
host_parm_t host; // host parms
sysinfo_t SI;
#ifdef XASH_ENGINE_TESTS
struct tests_stats_s tests_stats;
@@ -53,7 +49,7 @@ struct tests_stats_s tests_stats;
CVAR_DEFINE( host_developer, "developer", "0", FCVAR_FILTERABLE, "engine is in development-mode" );
CVAR_DEFINE_AUTO( sys_timescale, "1.0", FCVAR_FILTERABLE, "scale frame time" );
CVAR_DEFINE_AUTO( sys_ticrate, "100", 0, "framerate in dedicated mode" );
CVAR_DEFINE_AUTO( sys_ticrate, "100", FCVAR_SERVER, "framerate in dedicated mode" );
static CVAR_DEFINE_AUTO( host_serverstate, "0", FCVAR_READ_ONLY, "displays current server state" );
static CVAR_DEFINE_AUTO( host_gameloaded, "0", FCVAR_READ_ONLY, "inidcates a loaded game.dll" );
@@ -63,6 +59,7 @@ CVAR_DEFINE( host_maxfps, "fps_max", "72", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "host
static CVAR_DEFINE_AUTO( host_framerate, "0", FCVAR_FILTERABLE, "locks frame timing to this value in seconds" );
static CVAR_DEFINE( host_sleeptime, "sleeptime", "1", FCVAR_ARCHIVE|FCVAR_FILTERABLE, "milliseconds to sleep for each frame. higher values reduce fps accuracy" );
static CVAR_DEFINE_AUTO( host_sleeptime_debug, "0", 0, "print sleeps between frames" );
CVAR_DEFINE_AUTO( host_allow_materials, "0", FCVAR_LATCH|FCVAR_ARCHIVE, "allow texture replacements from materials/ folder" );
CVAR_DEFINE( con_gamemaps, "con_mapfilter", "1", FCVAR_ARCHIVE, "when true show only maps in game folder" );
typedef struct feature_message_s
@@ -92,7 +89,7 @@ static feature_message_t engine_features[] =
{ ENGINE_STEP_POSHISTORY_LERP, "MOVETYPE_STEP Position History Based Lerping" },
};
static void Sys_PrintUsage( void )
static void Sys_PrintUsage( const char *exename )
{
string version_str;
const char *usage_str;
@@ -100,10 +97,14 @@ static void Sys_PrintUsage( void )
Q_snprintf( version_str, sizeof( version_str ),
XASH_ENGINE_NAME " %i/" XASH_VERSION " (%s-%s build %i)", PROTOCOL_VERSION, Q_buildos(), Q_buildarch(), Q_buildnum( ));
#if XASH_WIN32
#define XASH_EXE "(xash).exe"
#if XASH_MESSAGEBOX != MSGBOX_STDERR
#if XASH_WIN32
#define XASH_EXE "(xash).exe"
#else
#define XASH_EXE "(xash)"
#endif
#else
#define XASH_EXE "(xash)"
#define XASH_EXE "%s"
#endif
#define O( x, y ) " "x" "y"\n"
@@ -191,7 +192,8 @@ static void Sys_PrintUsage( void )
#if XASH_MESSAGEBOX != MSGBOX_STDERR
Platform_MessageBox( version_str, usage_str, false );
#else
fprintf( stderr, "%s\n%s", version_str, usage_str );
fprintf( stderr, "%s\n", version_str );
fprintf( stderr, usage_str, exename );
#endif
Sys_Quit();
@@ -242,7 +244,7 @@ void Host_ValidateEngineFeatures( uint32_t features )
{
uint32_t mask = ENGINE_FEATURES_MASK;
#if !HOST_DEDICATED
#if !XASH_DEDICATED
if( !Host_IsDedicated( ) && cls.legacymode )
mask = ENGINE_LEGACY_FEATURES_MASK;
#endif
@@ -316,18 +318,6 @@ void Host_EndGame( qboolean abort, const char *message, ... )
if( abort ) Host_AbortCurrentFrame ();
}
/*
================
Host_AbortCurrentFrame
aborts the current host frame and goes on with the next one
================
*/
void Host_AbortCurrentFrame( void )
{
longjmp( host.abortframe, 1 );
}
/*
==================
Host_CalcSleep
@@ -335,14 +325,7 @@ Host_CalcSleep
*/
static int Host_CalcSleep( void )
{
#ifndef XASH_DEDICATED
// never sleep in timedemo for benchmarking purposes
// also don't sleep with vsync for less lag
if( CL_IsTimeDemo( ) || gl_vsync.value )
return 0;
#endif
if( Host_IsDedicated() )
if( Host_IsDedicated( ))
{
// let the dedicated server some sleep
return host_sleeptime.value;
@@ -424,7 +407,6 @@ static void Host_Exec_f( void )
byte *f;
char *txt;
fs_offset_t len;
const char *arg;
if( Cmd_Argc() != 2 )
{
@@ -432,7 +414,8 @@ static void Host_Exec_f( void )
return;
}
arg = Cmd_Argv( 1 );
Q_strncpy( cfgpath, Cmd_Argv( 1 ), sizeof( cfgpath ));
COM_DefaultExtension( cfgpath, ".cfg", sizeof( cfgpath )); // append as default
#ifndef XASH_DEDICATED
if( !Cmd_CurrentCommandIsPrivileged() )
@@ -452,7 +435,7 @@ static void Host_Exec_f( void )
for( i = 0; i < ARRAYSIZE( unprivilegedWhitelist ); i++ )
{
if( !Q_strcmp( arg, unprivilegedWhitelist[i] ))
if( !Q_strcmp( cfgpath, unprivilegedWhitelist[i] ))
{
allow = true;
break;
@@ -461,21 +444,15 @@ static void Host_Exec_f( void )
if( !allow )
{
Con_Printf( "exec %s: not privileged or in whitelist\n", arg );
Con_Printf( "exec %s: not privileged or in whitelist\n", cfgpath );
return;
}
}
#endif // XASH_DEDICATED
if( !Q_stricmp( "game.cfg", arg ))
{
// don't execute game.cfg in singleplayer
if( SV_GetMaxClients() == 1 )
return;
}
Q_strncpy( cfgpath, arg, sizeof( cfgpath ));
COM_DefaultExtension( cfgpath, ".cfg", sizeof( cfgpath )); // append as default
// don't execute game.cfg in singleplayer
if( SV_GetMaxClients() == 1 && !Q_stricmp( "game.cfg", cfgpath ))
return;
f = FS_LoadFile( cfgpath, &len, false );
if( !f )
@@ -484,17 +461,18 @@ static void Host_Exec_f( void )
return;
}
if( !Q_stricmp( "config.cfg", arg ))
if( !Q_stricmp( "config.cfg", cfgpath ))
host.config_executed = true;
// adds \n\0 at end of the file
txt = Z_Calloc( len + 2 );
memcpy( txt, f, len );
Q_strncat( txt, "\n", len + 2 );
txt[len] = '\n';
txt[len + 1] = '\0';
Mem_Free( f );
if( !host.apply_game_config )
Con_Printf( "execing %s\n", arg );
Con_Printf( "execing %s\n", Cmd_Argv( 1 ));
Cbuf_InsertText( txt );
Mem_Free( txt );
}
@@ -529,33 +507,6 @@ static void Host_Minimize_f( void )
#endif
}
/*
=================
Host_IsLocalGame
singleplayer game detect
=================
*/
qboolean Host_IsLocalGame( void )
{
if( SV_Active( ))
{
return ( SV_GetMaxClients() == 1 ) ? true : false;
}
else
{
return ( CL_GetMaxClients() == 1 ) ? true : false;
}
}
qboolean Host_IsLocalClient( void )
{
// only the local client have the active server
if( CL_Initialized( ) && SV_Initialized( ))
return true;
return false;
}
/*
=================
Host_RegisterDecal
@@ -600,10 +551,6 @@ static void Host_InitDecals( void )
int i, num_decals = 0;
search_t *t;
// NOTE: only once resource without which engine can't continue work
if( !FS_FileExists( "gfx/conchars", false ))
Sys_Error( "W_LoadWadFile: couldn't load gfx.wad\n" );
memset( host.draw_decals, 0, sizeof( host.draw_decals ));
// lookup all the decals in decals.wad (basedir, gamedir, falldir)
@@ -616,7 +563,7 @@ static void Host_InitDecals( void )
}
if( t ) Mem_Free( t );
Con_Reportf( "InitDecals: %i decals\n", num_decals );
Con_Reportf( "%s: %i decals\n", __func__, num_decals );
}
/*
@@ -648,7 +595,7 @@ static double Host_CalcFPS( void )
{
double fps = 0.0;
if( Host_IsDedicated() )
if( Host_IsDedicated( ))
{
fps = sys_ticrate.value;
}
@@ -761,7 +708,7 @@ Host_FilterTime
Returns false if the time is too short to run a frame
===================
*/
static qboolean Host_FilterTime( float time )
static qboolean Host_FilterTime( double time )
{
static double oldtime;
double dt;
@@ -791,9 +738,9 @@ static qboolean Host_FilterTime( float time )
Host_Frame
=================
*/
void Host_Frame( float time )
void Host_Frame( double time )
{
double t1, t2;
double t1;
// decide the simulation time
if( !Host_FilterTime( time ))
@@ -811,11 +758,8 @@ void Host_Frame( float time )
Host_ClientFrame (); // client frame
HTTP_Run(); // both server and client
t2 = Sys_DoubleTime();
host.pureframetime = t2 - t1;
host.framecount++;
host.pureframetime = Sys_DoubleTime() - t1;
}
/*
@@ -838,11 +782,11 @@ void GAME_EXPORT Host_Error( const char *error, ... )
if( host.framecount < 3 )
{
Sys_Error( "Host_InitError: %s", hosterror1 );
Sys_Error( "%sInit: %s", __func__, hosterror1 );
}
else if( host.framecount == host.errorframe )
{
Sys_Error( "Host_MultiError: %s", hosterror2 );
Sys_Error( "%sMulti: %s", __func__, hosterror2 );
}
else
{
@@ -850,7 +794,7 @@ void GAME_EXPORT Host_Error( const char *error, ... )
{
UI_SetActiveMenu( false );
Key_SetKeyDest( key_console );
Con_Printf( "Host_Error: %s", hosterror1 );
Con_Printf( "%s: %s", __func__, hosterror1 );
}
else Platform_MessageBox( "Host Error", hosterror1, true );
}
@@ -860,7 +804,7 @@ void GAME_EXPORT Host_Error( const char *error, ... )
if( recursive )
{
Con_Printf( "Host_RecursiveError: %s", hosterror2 );
Con_Printf( "%sRecursive: %s", __func__, hosterror2 );
Sys_Error( "%s", hosterror1 );
}
@@ -1004,40 +948,59 @@ static uint32_t Host_CheckBugcomp( void )
return flags;
}
static void Host_DetermineExecutableName( char *out, size_t size )
{
#if XASH_WIN32
char temp[MAX_SYSPATH];
if( GetModuleFileName( NULL, temp, sizeof( temp )))
COM_FileBase( temp, out, size );
#else
if( host.argc > 0 )
COM_FileBase( host.argv[0], out, size );
else
Q_strncpy( out, "xash", size );
#endif
}
/*
=================
Host_InitCommon
=================
*/
static void Host_InitCommon( int argc, char **argv, const char *progname, qboolean bChangeGame )
static void Host_InitCommon( int argc, char **argv, const char *progname, qboolean bChangeGame, char *exename, size_t exename_size )
{
char dev_level[4];
int developer = DEFAULT_DEV;
const char *baseDir;
char ticrate[16];
int len, i;
const char *basedir = progname[0] == '#' ? progname + 1 : progname;
char dev_level[4], ticrate[16];
int developer = DEFAULT_DEV;
// some commands may turn engine into infinite loop,
// e.g. xash.exe +game xash -game xash
// so we clear all cmd_args, but leave dbg states as well
Sys_ParseCommandLine( argc, argv );
Host_DetermineExecutableName( exename, exename_size );
if( !Sys_CheckParm( "-disablehelp" ) )
if( !Sys_CheckParm( "-disablehelp" ))
{
if( Sys_CheckParm( "-help" ) || Sys_CheckParm( "-h" ) || Sys_CheckParm( "--help" ) )
{
Sys_PrintUsage();
}
if( Sys_CheckParm( "-help" ) || Sys_CheckParm( "-h" ) || Sys_CheckParm( "--help" ))
Sys_PrintUsage( exename );
}
if( !Sys_CheckParm( "-noch" ) )
if( !Sys_CheckParm( "-noch" ))
Sys_SetupCrashHandler();
#if XASH_DLL_LOADER
host.enabledll = !Sys_CheckParm( "-nodll" );
#endif
host.change_game = bChangeGame || Sys_CheckParm( "-changegame" );
host.config_executed = false;
host.status = HOST_INIT; // initialzation started
host.type = HOST_DEDICATED; // predict state
#ifndef XASH_DEDICATED
if( !Sys_CheckParm( "-dedicated" ))
host.type = HOST_NORMAL;
#endif
Memory_Init(); // init memory subsystem
@@ -1045,11 +1008,6 @@ static void Host_InitCommon( int argc, char **argv, const char *progname, qboole
host.allow_console = DEFAULT_ALLOWCONSOLE;
// HACKHACK: Quake console is always allowed
// TODO: determine if we are running QWrap more reliable
if( !host.allow_console && ( Sys_CheckParm( "-console" ) || !Q_stricmp( SI.exeName, "quake" )))
host.allow_console = true;
if( Sys_CheckParm( "-dev" ))
{
host.allow_console = true;
@@ -1070,40 +1028,9 @@ static void Host_InitCommon( int argc, char **argv, const char *progname, qboole
}
#endif
host.con_showalways = true;
#if XASH_DEDICATED
host.type = HOST_DEDICATED; // predict state
#else
if( Sys_CheckParm("-dedicated") || progname[0] == '#' )
{
host.type = HOST_DEDICATED;
}
else
{
host.type = HOST_NORMAL;
}
#endif
// set default gamedir
if( progname[0] == '#' )
progname++;
Q_strncpy( SI.exeName, progname, sizeof( SI.exeName ));
Q_strncpy( SI.basedirName, progname, sizeof( SI.basedirName ));
if( Host_IsDedicated() )
{
Sys_MergeCommandLine( );
// always enable console for Quake
if( !host.allow_console && ( Sys_CheckParm( "-console" ) || !Q_strnicmp( exename, "quake", 5 )))
host.allow_console = true;
}
else
{
// don't show console as default
if( developer <= DEV_NORMAL )
host.con_showalways = false;
}
// member console allowing
host.allow_console_init = host.allow_console;
@@ -1144,93 +1071,8 @@ static void Host_InitCommon( int argc, char **argv, const char *progname, qboole
Host_RunTests( 0 );
#endif
Platform_Init();
baseDir = getenv( "XASH3D_BASEDIR" );
if( COM_CheckString( baseDir ) )
{
Q_strncpy( host.rootdir, baseDir, sizeof( host.rootdir ));
}
else
{
#if TARGET_OS_IOS
Q_strncpy( host.rootdir, IOS_GetDocsDir(), sizeof( host.rootdir ));
#elif XASH_ANDROID && XASH_SDL
Q_strncpy( host.rootdir, SDL_AndroidGetExternalStoragePath(), sizeof( host.rootdir ));
#elif XASH_PSVITA
if ( !PSVita_GetBasePath( host.rootdir, sizeof( host.rootdir )))
{
Sys_Error( "couldn't find xash3d data directory" );
host.rootdir[0] = 0;
}
#elif (XASH_SDL == 2) && !XASH_NSWITCH // GetBasePath not impl'd in switch-sdl2
char *szBasePath = SDL_GetBasePath();
if( szBasePath )
{
Q_strncpy( host.rootdir, szBasePath, sizeof( host.rootdir ));
SDL_free( szBasePath );
}
else
{
#if XASH_POSIX || XASH_WIN32
if( !getcwd( host.rootdir, sizeof( host.rootdir )))
Sys_Error( "couldn't determine current directory: %s, getcwd: %s", SDL_GetError(), strerror( errno ));
#else
Sys_Error( "couldn't determine current directory: %s", SDL_GetError() );
#endif
}
#else
if( !getcwd( host.rootdir, sizeof( host.rootdir )))
{
Sys_Error( "couldn't determine current directory: %s", strerror( errno ) );
host.rootdir[0] = 0;
}
#endif
}
#if XASH_WIN32
COM_FixSlashes( host.rootdir );
#endif
len = Q_strlen( host.rootdir );
if( len && host.rootdir[len - 1] == '/' )
host.rootdir[len - 1] = 0;
// get readonly root. The order is: check for arg, then env.
// if still not got it, rodir is disabled.
host.rodir[0] = '\0';
if( !Sys_GetParmFromCmdLine( "-rodir", host.rodir ))
{
char *roDir = getenv( "XASH3D_RODIR" );
if( COM_CheckString( roDir ))
Q_strncpy( host.rodir, roDir, sizeof( host.rodir ));
}
#if XASH_WIN32
COM_FixSlashes( host.rootdir );
#endif
len = Q_strlen( host.rodir );
if( len && host.rodir[len - 1] == '/' )
host.rodir[len - 1] = 0;
if( !COM_CheckStringEmpty( host.rootdir ))
{
Sys_Error( "Changing working directory failed (empty working directory)\n" );
return;
}
FS_LoadProgs();
// TODO: this function will cause engine to stop in case of fail
// when it will have an option to return string error, restore Sys_Error
FS_SetCurrentDirectory( host.rootdir );
FS_Init();
Platform_Init( Host_IsDedicated( ) || developer >= DEV_EXTENDED );
FS_Init( basedir );
Sys_InitLog();
@@ -1255,39 +1097,14 @@ static void Host_InitCommon( int argc, char **argv, const char *progname, qboole
FS_LoadGameInfo( NULL );
Cvar_PostFSInit();
Q_strncpy( host.gamefolder, GI->gamefolder, sizeof( host.gamefolder ));
for( i = 0; i < 3; i++ )
{
const char *rcName;
switch( i )
{
case 0: rcName = SI.basedirName; break; // e.g. valve.rc
case 1: rcName = SI.exeName; break; // e.g. quake.rc
case 2: rcName = host.gamefolder; break; // e.g. game.rc (ran from default launcher)
}
if( FS_FileExists( va( "%s.rc", rcName ), false ))
{
Q_strncpy( SI.rcName, rcName, sizeof( SI.rcName ));
break;
}
}
Image_CheckPaletteQ1 ();
// NOTE: only once resource without which engine can't continue work
if( !FS_FileExists( "gfx/conchars", false ))
Sys_Error( "%s: couldn't load gfx.wad\n", __func__ );
Host_InitDecals (); // reload decals
// DEPRECATED: by FWGS fork
#if 0
if( GI->secure )
{
// clear all developer levels when game is protected
Cvar_DirectSet( &host_developer, "0" );
host.allow_console_init = false;
host.con_showalways = false;
host.allow_console = false;
}
#endif
HPAK_Init();
IN_Init();
@@ -1311,13 +1128,13 @@ Host_Main
int EXPORT Host_Main( int argc, char **argv, const char *progname, int bChangeGame, pfnChangeGame func )
{
static double oldtime, newtime;
string demoname;
string demoname, exename;
host.starttime = Sys_DoubleTime();
pChangeGame = func; // may be NULL
Host_InitCommon( argc, argv, progname, bChangeGame );
Host_InitCommon( argc, argv, progname, bChangeGame, exename, sizeof( exename ));
// init commands and vars
if( host_developer.value >= DEV_EXTENDED )
@@ -1327,6 +1144,7 @@ int EXPORT Host_Main( int argc, char **argv, const char *progname, int bChangeGa
Cmd_AddRestrictedCommand ( "crash", Host_Crash_f, "a way to force a bus error for development reasons");
}
Cvar_RegisterVariable( &host_allow_materials );
Cvar_RegisterVariable( &host_serverstate );
Cvar_RegisterVariable( &host_maxfps );
Cvar_RegisterVariable( &host_framerate );
@@ -1366,21 +1184,25 @@ int EXPORT Host_Main( int argc, char **argv, const char *progname, int bChangeGa
ID_Init();
SoundList_Init();
if( Host_IsDedicated() )
if( Host_IsDedicated( ))
{
#ifdef _WIN32
Wcon_InitConsoleCommands ();
#endif
// disable texture replacements for dedicated
Cvar_FullSet( "host_allow_materials", "0", FCVAR_READ_ONLY );
Cmd_AddRestrictedCommand( "quit", Sys_Quit, "quit the game" );
Cmd_AddRestrictedCommand( "exit", Sys_Quit, "quit the game" );
}
else Cmd_AddRestrictedCommand( "minimize", Host_Minimize_f, "minimize main window to tray" );
HPAK_CheckIntegrity( CUSTOM_RES_PATH );
host.errorframe = 0;
if( progname[0] == '#' )
progname++;
// post initializations
switch( host.type )
{
@@ -1389,8 +1211,14 @@ int EXPORT Host_Main( int argc, char **argv, const char *progname, int bChangeGa
Wcon_ShowConsole( false ); // hide console
#endif
// execute startup config and cmdline
Cbuf_AddTextf( "exec %s.rc\n", SI.rcName );
if( FS_FileExists( va( "%s.rc", progname ), false )) // e.g. valve.rc
Cbuf_AddTextf( "exec %s.rc", progname );
else if( FS_FileExists( va( "%s.rc", exename ), false )) // e.g. quake.rc
Cbuf_AddTextf( "exec %s.rc", exename );
else if( FS_FileExists( va( "%s.rc", GI->gamefolder ), false )) // e.g. game.rc (ran from default launcher)
Cbuf_AddTextf( "exec %s.rc", GI->gamefolder );
Cbuf_Execute();
if( !host.config_executed )
{
Cbuf_AddText( "exec config.cfg\n" );
@@ -1434,6 +1262,9 @@ int EXPORT Host_Main( int argc, char **argv, const char *progname, int bChangeGa
Cbuf_Execute();
}
// check after all configs were executed
HPAK_CheckIntegrity( hpk_custom_file.string );
// main window message loop
while( !host.crashed )
{

View File

@@ -16,6 +16,8 @@ GNU General Public License for more details.
#include "common.h"
#include "platform/platform.h"
static jmp_buf g_abortframe;
void COM_InitHostState( void )
{
memset( GameState, 0, sizeof( game_status_t ));
@@ -58,6 +60,9 @@ void COM_NewGame( char const *pMapName )
GameState->loadGame = false;
GameState->newGame = true;
if( !SV_Active( ))
CL_Disconnect( ); // disconnect from current online game
SV_ShutdownGame(); // exit from current game
}
@@ -77,6 +82,9 @@ void COM_LoadLevel( char const *pMapName, qboolean background )
GameState->loadGame = false;
GameState->newGame = false;
if( !SV_Active( ))
CL_Disconnect( ); // disconnect from current online game
SV_ShutdownGame(); // exit from current game
}
@@ -93,6 +101,9 @@ void COM_LoadGame( char const *pMapName )
GameState->backgroundMap = false;
GameState->newGame = false;
GameState->loadGame = true;
if( !SV_Active( ))
CL_Disconnect( ); // disconnect from current online game
}
void COM_ChangeLevel( char const *pNewLevel, char const *pLandmarkName, qboolean background )
@@ -137,7 +148,7 @@ static void Host_ShutdownGame( void )
}
}
static void Host_RunFrame( float time )
static void Host_RunFrame( double time )
{
// at this time, we don't need to get events from OS on dedicated
#if !XASH_DEDICATED
@@ -168,11 +179,23 @@ static void Host_RunFrame( float time )
}
}
void COM_Frame( float time )
/*
================
Host_AbortCurrentFrame
aborts the current host frame and goes on with the next one
================
*/
void Host_AbortCurrentFrame( void )
{
longjmp( g_abortframe, 1 );
}
void COM_Frame( double time )
{
int loopCount = 0;
if( setjmp( host.abortframe ))
if( setjmp( g_abortframe ))
return;
while( 1 )

View File

@@ -17,8 +17,6 @@ GNU General Public License for more details.
#include "hpak.h"
#define HPAK_MAX_ENTRIES 0x8000
#define HPAK_ENTRY_MIN_SIZE (512)
#define HPAK_ENTRY_MAX_SIZE (128 * 1024)
typedef struct hash_pack_queue_s
{
@@ -29,11 +27,17 @@ typedef struct hash_pack_queue_s
struct hash_pack_queue_s *next;
} hash_pack_queue_t;
static CVAR_DEFINE_AUTO( hpk_maxsize, "4", FCVAR_ARCHIVE, "set limit by size for all HPK-files ( 0 - unlimited )" );
static CVAR_DEFINE( hpk_maxsize, "hpk_max_size", "64", FCVAR_ARCHIVE|FCVAR_PRIVILEGED, "set limit by size for all HPK-files in megabytes ( 0 - unlimited )" );
CVAR_DEFINE_AUTO( hpk_custom_file, "custom.hpk", FCVAR_ARCHIVE|FCVAR_PRIVILEGED, "set custom path for players customizations cache file" );
static hash_pack_queue_t *gp_hpak_queue = NULL;
static hpak_header_t hash_pack_header;
static hpak_info_t hash_pack_info;
static void HPAK_MaxSize_f( void )
{
Con_Printf( S_ERROR "hpk_maxsize is deprecated, use hpk_max_size\n" );
}
static const char *HPAK_TypeFromIndex( int type )
{
switch( type )
@@ -73,7 +77,7 @@ static void HPAK_AddToQueue( const char *name, resource_t *pResource, void *data
if( data != NULL ) memcpy( p->data, data, p->size );
else if( f != NULL ) FS_Read( f, p->data, p->size );
else Host_Error( "HPAK_AddToQueue: data == NULL.\n" );
else Host_Error( "%s: data == NULL.\n", __func__ );
p->next = gp_hpak_queue;
gp_hpak_queue = p;
@@ -116,7 +120,7 @@ static void HPAK_CreatePak( const char *filename, resource_t *pResource, byte *p
fout = FS_Open( pakname, "wb", true );
if( !fout )
{
Con_DPrintf( S_ERROR "HPAK_CreatePak: can't write %s.\n", pakname );
Con_DPrintf( S_ERROR "%s: can't write %s.\n", __func__, pakname );
return;
}
@@ -145,7 +149,7 @@ static void HPAK_CreatePak( const char *filename, resource_t *pResource, byte *p
if( memcmp( md5, pResource->rgucMD5_hash, 16 ))
{
Con_DPrintf( S_ERROR "HPAK_CreatePak: bad checksum for %s. Ignored\n", pakname );
Con_DPrintf( S_ERROR "%s: bad checksum for %s. Ignored\n", __func__, pakname );
return;
}
@@ -246,7 +250,7 @@ void HPAK_AddLump( qboolean bUseQueue, const char *name, resource_t *pResource,
if( memcmp( md5, pResource->rgucMD5_hash, 16 ))
{
Con_DPrintf( S_ERROR "HPAK_AddLump: bad checksum for %s. Ignored\n", pResource->szFileName );
Con_DPrintf( S_ERROR "%s: bad checksum for %s. Ignored\n", __func__, pResource->szFileName );
return;
}
@@ -275,7 +279,7 @@ void HPAK_AddLump( qboolean bUseQueue, const char *name, resource_t *pResource,
if( !file_dst )
{
Con_DPrintf( S_ERROR "HPAK_AddLump: couldn't open %s.\n", srcname );
Con_DPrintf( S_ERROR "%s: couldn't open %s.\n", __func__, srcname );
FS_Close( file_src );
return;
}
@@ -286,7 +290,7 @@ void HPAK_AddLump( qboolean bUseQueue, const char *name, resource_t *pResource,
if( hash_pack_header.version != IDHPAK_VERSION )
{
// we don't check the HPAK bit for some reason.
Con_DPrintf( S_ERROR "HPAK_AddLump: %s does not have a valid header.\n", srcname );
Con_DPrintf( S_ERROR "%s: %s does not have a valid header.\n", __func__, srcname );
FS_Close( file_src );
FS_Close( file_dst );
return;
@@ -301,7 +305,7 @@ void HPAK_AddLump( qboolean bUseQueue, const char *name, resource_t *pResource,
if( srcpak.count < 1 || srcpak.count > HPAK_MAX_ENTRIES )
{
Con_DPrintf( S_ERROR "HPAK_AddLump: %s contain too many lumps.\n", srcname );
Con_DPrintf( S_ERROR "%s: %s contain too many lumps.\n", __func__, srcname );
FS_Close( file_src );
FS_Close( file_dst );
return;
@@ -410,7 +414,7 @@ static qboolean HPAK_Validate( const char *filename, qboolean quiet, qboolean de
FS_Read( f, &hdr, sizeof( hdr ));
if( hdr.ident != IDHPAKHEADER || hdr.version != IDHPAK_VERSION )
{
Con_DPrintf( S_ERROR "HPAK_ValidatePak: %s does not have a valid HPAK header.\n", pakname );
Con_DPrintf( S_ERROR "%s: %s does not have a valid HPAK header.\n", __func__, pakname );
FS_Close( f );
if( delete ) FS_Delete( pakname );
return false;
@@ -421,7 +425,7 @@ static qboolean HPAK_Validate( const char *filename, qboolean quiet, qboolean de
if( num_lumps < 1 || num_lumps > HPAK_MAX_ENTRIES )
{
Con_DPrintf( S_ERROR "HPAK_ValidatePak: %s has too many lumps %u.\n", pakname, num_lumps );
Con_DPrintf( S_ERROR "%s: %s has too many lumps %u.\n", __func__, pakname, num_lumps );
FS_Close( f );
if( delete ) FS_Delete( pakname );
return false;
@@ -439,7 +443,7 @@ static qboolean HPAK_Validate( const char *filename, qboolean quiet, qboolean de
if( dataDir[i].disksize < HPAK_ENTRY_MIN_SIZE || dataDir[i].disksize > HPAK_ENTRY_MAX_SIZE )
{
// odd max size
Con_DPrintf( S_ERROR "HPAK_ValidatePak: lump %i has invalid size %s\n", i, Q_pretifymem( dataDir[i].disksize, 2 ));
Con_DPrintf( S_ERROR "%s: lump %i has invalid size %s\n", __func__, i, Q_pretifymem( dataDir[i].disksize, 2 ));
Mem_Free( dataDir );
FS_Close( f );
if( delete ) FS_Delete( pakname );
@@ -467,7 +471,7 @@ static qboolean HPAK_Validate( const char *filename, qboolean quiet, qboolean de
{
if( quiet )
{
Con_DPrintf( S_ERROR "HPAK_ValidatePak: %s has invalid checksum.\n", pakname );
Con_DPrintf( S_ERROR "%s: %s has invalid checksum.\n", __func__, pakname );
Mem_Free( dataPak );
Mem_Free( dataDir );
FS_Close( f );
@@ -517,7 +521,7 @@ void HPAK_CheckSize( const char *filename )
Q_strncpy( pakname, filename, sizeof( pakname ));
COM_ReplaceExtension( pakname, ".hpk", sizeof( pakname ));
if( FS_FileSize( pakname, false ) > ( maxsize * 1048576 ))
if( FS_FileSize( pakname, false ) > ( maxsize * 1024 * 1024 ))
{
Con_Printf( "Server: Size of %s > %f MB, deleting.\n", filename, hpk_maxsize.value );
Log_Printf( "Server: Size of %s > %f MB, deleting.\n", filename, hpk_maxsize.value );
@@ -708,7 +712,7 @@ qboolean HPAK_GetDataPointer( const char *filename, resource_t *pResource, byte
if( directory.count < 1 || directory.count > HPAK_MAX_ENTRIES )
{
Con_DPrintf( S_ERROR "HPAK_GetDataPointer: %s has too many lumps %u.\n", filename, directory.count );
Con_DPrintf( S_ERROR "%s: %s has too many lumps %u.\n", __func__, filename, directory.count );
FS_Close( f );
return false;
}
@@ -1101,7 +1105,9 @@ void HPAK_Init( void )
Cmd_AddRestrictedCommand( "hpkremove", HPAK_Remove_f, "remove specified file from HPK-file" );
Cmd_AddRestrictedCommand( "hpkval", HPAK_Validate_f, "validate specified HPK-file" );
Cmd_AddRestrictedCommand( "hpkextract", HPAK_Extract_f, "extract all lumps from specified HPK-file" );
Cmd_AddRestrictedCommand( "hpk_maxsize", HPAK_MaxSize_f, "deprecation notice for hpk_maxsize" );
Cvar_RegisterVariable( &hpk_maxsize );
Cvar_RegisterVariable( &hpk_custom_file );
gp_hpak_queue = NULL;
}

View File

@@ -17,6 +17,9 @@ GNU General Public License for more details.
#include "custom.h"
#define HPAK_ENTRY_MIN_SIZE (512)
#define HPAK_ENTRY_MAX_SIZE (256 * 1024)
/*
========================================================================
.HPK archive format (Hash PAK - HPK)

View File

@@ -13,6 +13,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
*/
#include <inttypes.h>
#include "common.h"
#include <fcntl.h>
#if !XASH_WIN32
@@ -104,7 +105,7 @@ static void ID_BloomFilter_f( void )
for( i = 1; i < Cmd_Argc(); i++ )
value |= BloomFilter_ProcessStr( Cmd_Argv( i ) );
Msg( "%d %016llX\n", BloomFilter_Weight( value ), value );
Msg( "%d %016"PRIX64"\n", BloomFilter_Weight( value ), value );
// test
// for( i = 1; i < Cmd_Argc(); i++ )
@@ -283,7 +284,7 @@ static void ID_TestCPUInfo_f( void )
bloomfilter_t value = 0;
if( ID_ProcessCPUInfo( &value ) )
Msg( "Got %016llX\n", value );
Msg( "Got %016"PRIX64"\n", value );
else
Msg( "Could not get serial\n" );
}
@@ -555,7 +556,7 @@ static uint ID_CheckRawId( bloomfilter_t filter )
}
#endif
#if 0
Msg( "ID_CheckRawId: %d\n", count );
Msg( "%s: %d\n", __func__, count );
#endif
return count;
}
@@ -575,7 +576,7 @@ static void ID_Check( void )
{
id = 0;
#if 0
Msg( "ID_Check(): fail %d\n", weight );
Msg( "%s: fail %d\n", __func__, weight );
#endif
return;
}
@@ -583,7 +584,7 @@ static void ID_Check( void )
if( ID_CheckRawId( id ) < mincount )
id = 0;
#if 0
Msg( "ID_Check(): success %d\n", weight );
Msg( "%s: success %d\n", __func__, weight );
#endif
}
@@ -621,7 +622,7 @@ void ID_Init( void )
#endif
#if XASH_ANDROID && !XASH_DEDICATED
sscanf( Android_LoadID(), "%016llX", &id );
sscanf( Android_LoadID(), "%016"PRIX64, &id );
if( id )
{
id ^= SYSTEM_XOR_MASK;
@@ -633,7 +634,7 @@ void ID_Init( void )
CHAR szBuf[MAX_PATH];
ID_GetKeyData( HKEY_CURRENT_USER, "Software\\Xash3D\\", "xash_id", szBuf, MAX_PATH );
sscanf(szBuf, "%016llX", &id);
sscanf(szBuf, "%016"PRIX64, &id);
id ^= SYSTEM_XOR_MASK;
ID_Check();
}
@@ -649,7 +650,7 @@ void ID_Init( void )
cfg = fopen( va( "%s/.xash_id", home ), "r" );
if( cfg )
{
if( fscanf( cfg, "%016llX", &id ) > 0 )
if( fscanf( cfg, "%016"PRIX64, &id ) > 0 )
{
id ^= SYSTEM_XOR_MASK;
ID_Check();
@@ -664,7 +665,7 @@ void ID_Init( void )
const char *buf = (const char*) FS_LoadFile( ".xash_id", NULL, false );
if( buf )
{
sscanf( buf, "%016llX", &id );
sscanf( buf, "%016"PRIX64, &id );
id ^= GAME_XOR_MASK;
ID_Check();
}
@@ -680,11 +681,11 @@ void ID_Init( void )
Q_snprintf( &id_md5[i*2], sizeof( id_md5 ) - i * 2, "%02hhx", md5[i] );
#if XASH_ANDROID && !XASH_DEDICATED
Android_SaveID( va("%016llX", id^SYSTEM_XOR_MASK ) );
Android_SaveID( va("%016"PRIX64, id^SYSTEM_XOR_MASK ) );
#elif XASH_WIN32
{
CHAR Buf[MAX_PATH];
sprintf( Buf, "%016llX", id^SYSTEM_XOR_MASK );
sprintf( Buf, "%016"PRIX64, id^SYSTEM_XOR_MASK );
ID_SetKeyData( HKEY_CURRENT_USER, "Software\\Xash3D\\", REG_SZ, "xash_id", Buf, Q_strlen(Buf) );
}
#else
@@ -699,14 +700,14 @@ void ID_Init( void )
cfg = fopen( va( "%s/.xash_id", home ), "w" );
if( cfg )
{
fprintf( cfg, "%016llX", id^SYSTEM_XOR_MASK );
fprintf( cfg, "%016"PRIX64, id^SYSTEM_XOR_MASK );
fclose( cfg );
}
}
}
#endif
FS_WriteFile( ".xash_id", va("%016llX", id^GAME_XOR_MASK), 16 );
FS_WriteFile( ".xash_id", va("%016"PRIX64, id^GAME_XOR_MASK), 16 );
#if 0
Msg("MD5 id: %s\nRAW id:%016llX\n", id_md5, id );
Msg("MD5 id: %s\nRAW id:%016"PRIX64"\n", id_md5, id );
#endif
}

View File

@@ -103,8 +103,8 @@ typedef struct imglib_s
#define IMAGE_MAXHEIGHT 8192
#define LUMP_MAXWIDTH 1024 // WorldCraft limits
#define LUMP_MAXHEIGHT 1024
#define PLDECAL_MAXWIDTH 512
#define PLDECAL_MAXHEIGHT 512
#define PLDECAL_MAXWIDTH 768 // total of ~2mb uncompressed rgba data
#define PLDECAL_MAXHEIGHT 768
enum
{

View File

@@ -35,7 +35,7 @@ qboolean Image_LoadBMP( const char *name, const byte *buffer, fs_offset_t filesi
if( filesize < sizeof( bhdr ))
{
Con_Reportf( S_ERROR "Image_LoadBMP: %s have incorrect file size %li should be greater than %li (header)\n", name, filesize, sizeof( bhdr ) );
Con_Reportf( S_ERROR "%s: %s have incorrect file size %li should be greater than %zu (header)\n", __func__, name, (long)filesize, sizeof( bhdr ));
return false;
}
@@ -49,13 +49,13 @@ qboolean Image_LoadBMP( const char *name, const byte *buffer, fs_offset_t filesi
if( memcmp( bhdr.id, "BM", 2 ))
{
Con_DPrintf( S_ERROR "Image_LoadBMP: only Windows-style BMP files supported (%s)\n", name );
Con_DPrintf( S_ERROR "%s: only Windows-style BMP files supported (%s)\n", __func__, name );
return false;
}
if(!( bhdr.bitmapHeaderSize == 40 || bhdr.bitmapHeaderSize == 108 || bhdr.bitmapHeaderSize == 124 ))
{
Con_DPrintf( S_ERROR "Image_LoadBMP: %s have non-standard header size %i\n", name, bhdr.bitmapHeaderSize );
Con_DPrintf( S_ERROR "%s: %s have non-standard header size %i\n", __func__, name, bhdr.bitmapHeaderSize );
return false;
}
@@ -63,7 +63,7 @@ qboolean Image_LoadBMP( const char *name, const byte *buffer, fs_offset_t filesi
if( bhdr.fileSize != filesize )
{
// Sweet Half-Life issues. splash.bmp have bogus filesize
Con_Reportf( S_WARN "Image_LoadBMP: %s have incorrect file size %li should be %i\n", name, filesize, bhdr.fileSize );
Con_Reportf( S_WARN "%s: %s have incorrect file size %li should be %i\n", __func__, name, (long)filesize, bhdr.fileSize );
}
// bogus compression? Only non-compressed supported.
@@ -71,7 +71,7 @@ qboolean Image_LoadBMP( const char *name, const byte *buffer, fs_offset_t filesi
{
if( bhdr.bitsPerPixel != 32 || bhdr.compression != BI_BITFIELDS )
{
Con_DPrintf( S_ERROR "Image_LoadBMP: only uncompressed BMP files supported (%s)\n", name );
Con_DPrintf( S_ERROR "%s: only uncompressed BMP files supported (%s)\n", __func__, name );
return false;
}
}
@@ -108,7 +108,7 @@ qboolean Image_LoadBMP( const char *name, const byte *buffer, fs_offset_t filesi
estimatedSize = ( buf_p - buffer ) + cbPalBytes;
if( filesize < estimatedSize )
{
Con_Reportf( S_ERROR "Image_LoadBMP: %s have incorrect file size %li should be greater than %li (palette)\n", name, filesize, estimatedSize );
Con_Reportf( S_ERROR "%s: %s have incorrect file size %li should be greater than %li (palette)\n", __func__, name, (long)filesize, (long)estimatedSize );
return false;
}
@@ -186,7 +186,7 @@ qboolean Image_LoadBMP( const char *name, const byte *buffer, fs_offset_t filesi
image.palette = NULL;
}
Con_Reportf( S_ERROR "Image_LoadBMP: %s have incorrect file size %li should be greater than %li (pixels)\n", name, filesize, estimatedSize );
Con_Reportf( S_ERROR "%s: %s have incorrect file size %li should be greater than %li (pixels)\n", __func__, name, (long)filesize, (long)estimatedSize );
return false;
}

View File

@@ -261,7 +261,7 @@ static uint Image_DXTCalcSize( const char *name, dds_t *hdr, size_t filesize )
if( filesize != buffsize ) // main check
{
Con_DPrintf( S_WARN "Image_LoadDDS: (%s) probably corrupted (%zu should be %lu)\n", name, buffsize, filesize );
Con_DPrintf( S_WARN "%s: (%s) probably corrupted (%zu should be %zu)\n", __func__, name, buffsize, filesize );
if( buffsize > filesize )
return false;
}
@@ -300,13 +300,13 @@ qboolean Image_LoadDDS( const char *name, const byte *buffer, fs_offset_t filesi
if( header.dwSize != sizeof( header ) - sizeof( uint )) // size of the structure (minus MagicNum)
{
Con_DPrintf( S_ERROR "Image_LoadDDS: (%s) have corrupted header\n", name );
Con_DPrintf( S_ERROR "%s: (%s) have corrupted header\n", __func__, name );
return false;
}
if( header.dsPixelFormat.dwSize != sizeof( dds_pixf_t )) // size of the structure
{
Con_DPrintf( S_ERROR "Image_LoadDDS: (%s) have corrupt pixelformat header\n", name );
Con_DPrintf( S_ERROR "%s: (%s) have corrupt pixelformat header\n", __func__, name );
return false;
}
@@ -334,7 +334,7 @@ qboolean Image_LoadDDS( const char *name, const byte *buffer, fs_offset_t filesi
if( image.type == PF_UNKNOWN )
{
Con_DPrintf( S_ERROR "Image_LoadDDS: (%s) has unrecognized type\n", name );
Con_DPrintf( S_ERROR "%s: (%s) has unrecognized type\n", __func__, name );
return false;
}

View File

@@ -78,49 +78,49 @@ static qboolean Image_KTX2Parse( const ktx2_header_t *header, const byte *buffer
if( image.type == PF_UNKNOWN )
{
Con_DPrintf( S_ERROR "%s: unsupported KTX2 format %d\n", __FUNCTION__, header->vkFormat );
Con_DPrintf( S_ERROR "%s: unsupported KTX2 format %d\n", __func__, header->vkFormat );
return false;
}
if( !Image_CheckFlag( IL_DDS_HARDWARE ) && ImageCompressed( image.type ))
{
Con_DPrintf( S_WARN "%s: has compressed format, but support is not advertized\n", __FUNCTION__ );
Con_DPrintf( S_WARN "%s: has compressed format, but support is not advertized\n", __func__ );
return false;
}
if( header->levelCount == 0 )
{
Con_DPrintf( S_ERROR "%s: file has no mip levels\n", __FUNCTION__ );
Con_DPrintf( S_ERROR "%s: file has no mip levels\n", __func__ );
return false;
}
if( header->pixelDepth > 1 )
{
Con_DPrintf( S_ERROR "%s: unsupported KTX2 pixelDepth %d\n", __FUNCTION__, header->pixelDepth );
Con_DPrintf( S_ERROR "%s: unsupported KTX2 pixelDepth %d\n", __func__, header->pixelDepth );
return false;
}
if( header->faceCount > 1 )
{
Con_DPrintf( S_ERROR "%s: unsupported KTX2 faceCount %d\n", __FUNCTION__, header->faceCount );
Con_DPrintf( S_ERROR "%s: unsupported KTX2 faceCount %d\n", __func__, header->faceCount );
return false;
}
if( header->layerCount > 1 )
{
Con_DPrintf( S_ERROR "%s: unsupported KTX2 layerCount %d\n", __FUNCTION__, header->layerCount );
Con_DPrintf( S_ERROR "%s: unsupported KTX2 layerCount %d\n", __func__, header->layerCount );
return false;
}
if( header->supercompressionScheme != 0 )
{
Con_DPrintf( S_ERROR "%s: unsupported KTX2 supercompressionScheme %d\n", __FUNCTION__, header->supercompressionScheme );
Con_DPrintf( S_ERROR "%s: unsupported KTX2 supercompressionScheme %d\n", __func__, header->supercompressionScheme );
return false;
}
if( header->levelCount * sizeof( ktx2_level_t ) + KTX2_LEVELS_OFFSET > filesize )
{
Con_DPrintf( S_ERROR "%s: file abruptly ends\n", __FUNCTION__ );
Con_DPrintf( S_ERROR "%s: file abruptly ends\n", __func__ );
return false;
}
@@ -138,7 +138,7 @@ static qboolean Image_KTX2Parse( const ktx2_header_t *header, const byte *buffer
if( mip_size != level.byteLength )
{
Con_DPrintf( S_ERROR "%s: mip=%d size mismatch read=%d, but computed=%d\n",
__FUNCTION__, mip, (int)level.byteLength, mip_size );
__func__, mip, (int)level.byteLength, mip_size );
return false;
}
@@ -175,7 +175,7 @@ qboolean Image_LoadKTX2( const char *name, const byte *buffer, fs_offset_t files
if( memcmp( buffer, KTX2_IDENTIFIER, KTX2_IDENTIFIER_SIZE ) != 0 )
{
Con_DPrintf( S_ERROR "%s: (%s) has invalid identifier\n", __FUNCTION__, name );
Con_DPrintf( S_ERROR "%s: (%s) has invalid identifier\n", __func__, name );
return false;
}
@@ -196,7 +196,7 @@ qboolean Image_LoadKTX2( const char *name, const byte *buffer, fs_offset_t files
// If KTX2 to imagelib conversion failed, try passing the file as raw data.
// This is useful for ref_vk which can directly support hundreds of formats which we don't convert to pixformat_t here
Con_DPrintf( S_WARN "%s: (%s) could not be converted to supported imagelib format, passing as raw KTX2 data\n", __FUNCTION__, name );
Con_DPrintf( S_WARN "%s: (%s) could not be converted to supported imagelib format, passing as raw KTX2 data\n", __func__, name );
// This is a catch-all for ref_vk, which can do this format directly and natively
image.type = PF_KTX2_RAW;

View File

@@ -360,7 +360,7 @@ load_internal:
}
if( loadname[0] != '#' )
Con_Reportf( S_WARN "FS_LoadImage: couldn't load \"%s\"\n", loadname );
Con_Reportf( S_WARN "%s: couldn't load \"%s\"\n", __func__, loadname );
// clear any force flags
image.force_flags = 0;

View File

@@ -63,7 +63,7 @@ qboolean Image_LoadPNG( const char *name, const byte *buffer, fs_offset_t filesi
// check png signature
if( memcmp( png_hdr.sign, png_sign, sizeof( png_sign ) ) )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: Invalid PNG signature (%s)\n", name );
Con_DPrintf( S_ERROR "%s: Invalid PNG signature (%s)\n", __func__, name );
return false;
}
@@ -73,14 +73,14 @@ qboolean Image_LoadPNG( const char *name, const byte *buffer, fs_offset_t filesi
// check IHDR chunk length (valid value - 13)
if( png_hdr.ihdr_len != sizeof( png_ihdr_t ) )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: Invalid IHDR chunk size %u (%s)\n", png_hdr.ihdr_len, name );
Con_DPrintf( S_ERROR "%s: Invalid IHDR chunk size %u (%s)\n", __func__, png_hdr.ihdr_len, name );
return false;
}
// check IHDR chunk signature
if( memcmp( png_hdr.ihdr_sign, ihdr_sign, sizeof( ihdr_sign ) ) )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: IHDR chunk corrupted (%s)\n", name );
Con_DPrintf( S_ERROR "%s: IHDR chunk corrupted (%s)\n", __func__, name );
return false;
}
@@ -90,7 +90,7 @@ qboolean Image_LoadPNG( const char *name, const byte *buffer, fs_offset_t filesi
if( png_hdr.ihdr_chunk.height == 0 || png_hdr.ihdr_chunk.width == 0 )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: Invalid image size %ux%u (%s)\n", png_hdr.ihdr_chunk.width, png_hdr.ihdr_chunk.height, name );
Con_DPrintf( S_ERROR "%s: Invalid image size %ux%u (%s)\n", __func__, png_hdr.ihdr_chunk.width, png_hdr.ihdr_chunk.height, name );
return false;
}
@@ -99,7 +99,7 @@ qboolean Image_LoadPNG( const char *name, const byte *buffer, fs_offset_t filesi
if( png_hdr.ihdr_chunk.bitdepth != 8 )
{
Con_DPrintf( S_WARN "Image_LoadPNG: Only 8-bit images is supported (%s)\n", name );
Con_DPrintf( S_WARN "%s: Only 8-bit images is supported (%s)\n", __func__, name );
return false;
}
@@ -109,31 +109,31 @@ qboolean Image_LoadPNG( const char *name, const byte *buffer, fs_offset_t filesi
|| png_hdr.ihdr_chunk.colortype == PNG_CT_ALPHA
|| png_hdr.ihdr_chunk.colortype == PNG_CT_PALLETE ) )
{
Con_DPrintf( S_WARN "Image_LoadPNG: Unknown color type %u (%s)\n", png_hdr.ihdr_chunk.colortype, name );
Con_DPrintf( S_WARN "%s: Unknown color type %u (%s)\n", __func__, png_hdr.ihdr_chunk.colortype, name );
return false;
}
if( png_hdr.ihdr_chunk.compression > 0 )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: Unknown compression method %u (%s)\n", png_hdr.ihdr_chunk.compression, name );
Con_DPrintf( S_ERROR "%s: Unknown compression method %u (%s)\n", __func__, png_hdr.ihdr_chunk.compression, name );
return false;
}
if( png_hdr.ihdr_chunk.filter > 0 )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: Unknown filter type %u (%s)\n", png_hdr.ihdr_chunk.filter, name );
Con_DPrintf( S_ERROR "%s: Unknown filter type %u (%s)\n", __func__, png_hdr.ihdr_chunk.filter, name );
return false;
}
if( png_hdr.ihdr_chunk.interlace == 1 )
{
Con_DPrintf( S_WARN "Image_LoadPNG: Adam7 Interlacing not supported (%s)\n", name );
Con_DPrintf( S_WARN "%s: Adam7 Interlacing not supported (%s)\n", __func__, name );
return false;
}
if( png_hdr.ihdr_chunk.interlace > 0 )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: Unknown interlacing type %u (%s)\n", png_hdr.ihdr_chunk.interlace, name );
Con_DPrintf( S_ERROR "%s: Unknown interlacing type %u (%s)\n", __func__, png_hdr.ihdr_chunk.interlace, name );
return false;
}
@@ -145,7 +145,7 @@ qboolean Image_LoadPNG( const char *name, const byte *buffer, fs_offset_t filesi
// check IHDR chunk CRC
if( ntohl( png_hdr.ihdr_crc32 ) != crc32_check )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: IHDR chunk has wrong CRC32 sum (%s)\n", name );
Con_DPrintf( S_ERROR "%s: IHDR chunk has wrong CRC32 sum (%s)\n", __func__, name );
return false;
}
@@ -163,14 +163,14 @@ qboolean Image_LoadPNG( const char *name, const byte *buffer, fs_offset_t filesi
if( chunk_len > INT_MAX )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: Found chunk with wrong size (%s)\n", name );
Con_DPrintf( S_ERROR "%s: Found chunk with wrong size (%s)\n", __func__, name );
if( idat_buf ) Mem_Free( idat_buf );
return false;
}
if( chunk_len > filesize - ( buf_p - buffer ))
{
Con_DPrintf( S_ERROR "Image_LoadPNG: Found chunk with size past file size (%s)\n", name );
Con_DPrintf( S_ERROR "%s: Found chunk with size past file size (%s)\n", __func__, name );
if( idat_buf ) Mem_Free( idat_buf );
return false;
}
@@ -216,7 +216,7 @@ qboolean Image_LoadPNG( const char *name, const byte *buffer, fs_offset_t filesi
// check chunk CRC
if( ntohl( crc32 ) != crc32_check )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: Found chunk with wrong CRC32 sum (%s)\n", name );
Con_DPrintf( S_ERROR "%s: Found chunk with wrong CRC32 sum (%s)\n", __func__, name );
if( idat_buf ) Mem_Free( idat_buf );
return false;
}
@@ -227,27 +227,27 @@ qboolean Image_LoadPNG( const char *name, const byte *buffer, fs_offset_t filesi
if( oldsize == 0 )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: Couldn't find IDAT chunks (%s)\n", name );
Con_DPrintf( S_ERROR "%s: Couldn't find IDAT chunks (%s)\n", __func__, name );
return false;
}
if( png_hdr.ihdr_chunk.colortype == PNG_CT_PALLETE && !pallete )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: PLTE chunk not found (%s)\n", name );
Con_DPrintf( S_ERROR "%s: PLTE chunk not found (%s)\n", __func__, name );
Mem_Free( idat_buf );
return false;
}
if( !has_iend_chunk )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: IEND chunk not found (%s)\n", name );
Con_DPrintf( S_ERROR "%s: IEND chunk not found (%s)\n", __func__, name );
Mem_Free( idat_buf );
return false;
}
if( chunk_len != 0 )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: IEND chunk has wrong size %u (%s)\n", chunk_len, name );
Con_DPrintf( S_ERROR "%s: IEND chunk has wrong size %u (%s)\n", __func__, chunk_len, name );
Mem_Free( idat_buf );
return false;
}
@@ -298,7 +298,7 @@ qboolean Image_LoadPNG( const char *name, const byte *buffer, fs_offset_t filesi
// uncompress image
if( inflateInit2( &stream, MAX_WBITS ) != Z_OK )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: IDAT chunk decompression failed (%s)\n", name );
Con_DPrintf( S_ERROR "%s: IDAT chunk decompression failed (%s)\n", __func__, name );
Mem_Free( uncompressed_buffer );
Mem_Free( idat_buf );
return false;
@@ -311,7 +311,7 @@ qboolean Image_LoadPNG( const char *name, const byte *buffer, fs_offset_t filesi
if( ret != Z_OK && ret != Z_STREAM_END )
{
Con_DPrintf( S_ERROR "Image_LoadPNG: IDAT chunk decompression failed (%s)\n", name );
Con_DPrintf( S_ERROR "%s: IDAT chunk decompression failed (%s)\n", __func__, name );
Mem_Free( uncompressed_buffer );
return false;
}
@@ -351,7 +351,7 @@ qboolean Image_LoadPNG( const char *name, const byte *buffer, fs_offset_t filesi
pixbuf[i] = raw[i] + ( pixbuf[i - pixel_size] >> 1 );
break;
default:
Con_DPrintf( S_ERROR "Image_LoadPNG: Found unknown filter type (%s)\n", name );
Con_DPrintf( S_ERROR "%s: Found unknown filter type (%s)\n", __func__, name );
Mem_Free( uncompressed_buffer );
Mem_Free( image.rgba );
return false;
@@ -415,7 +415,7 @@ qboolean Image_LoadPNG( const char *name, const byte *buffer, fs_offset_t filesi
}
break;
default:
Con_DPrintf( S_ERROR "Image_LoadPNG: Found unknown filter type (%s)\n", name );
Con_DPrintf( S_ERROR "%s: Found unknown filter type (%s)\n", __func__, name );
Mem_Free( uncompressed_buffer );
Mem_Free( image.rgba );
return false;
@@ -650,7 +650,7 @@ qboolean Image_SavePNG( const char *name, rgbdata_t *pix )
// compress image
if( deflateInit( &stream, Z_BEST_COMPRESSION ) != Z_OK )
{
Con_DPrintf( S_ERROR "Image_SavePNG: deflateInit failed (%s)\n", name );
Con_DPrintf( S_ERROR "%s: deflateInit failed (%s)\n", __func__, name );
Mem_Free( filtered_buffer );
Mem_Free( buffer );
return false;
@@ -663,7 +663,7 @@ qboolean Image_SavePNG( const char *name, rgbdata_t *pix )
if( ret != Z_OK && ret != Z_STREAM_END )
{
Con_DPrintf( S_ERROR "Image_SavePNG: IDAT chunk compression failed (%s)\n", name );
Con_DPrintf( S_ERROR "%s: IDAT chunk compression failed (%s)\n", __func__, name );
Mem_Free( buffer );
return false;
}

View File

@@ -62,17 +62,17 @@ qboolean Image_LoadTGA( const char *name, const byte *buffer, fs_offset_t filesi
// uncompressed colormapped image
if( targa_header.pixel_size != 8 )
{
Con_DPrintf( S_ERROR "Image_LoadTGA: (%s) Only 8 bit images supported for type 1 and 9\n", name );
Con_DPrintf( S_ERROR "%s: (%s) Only 8 bit images supported for type 1 and 9\n", __func__, name );
return false;
}
if( targa_header.colormap_length != 256 )
{
Con_DPrintf( S_ERROR "Image_LoadTGA: (%s) Only 8 bit colormaps are supported for type 1 and 9\n", name );
Con_DPrintf( S_ERROR "%s: (%s) Only 8 bit colormaps are supported for type 1 and 9\n", __func__, name );
return false;
}
if( targa_header.colormap_index )
{
Con_DPrintf( S_ERROR "Image_LoadTGA: (%s) colormap_index is not supported for type 1 and 9\n", name );
Con_DPrintf( S_ERROR "%s: (%s) colormap_index is not supported for type 1 and 9\n", __func__, name );
return false;
}
if( targa_header.colormap_size == 24 )
@@ -97,7 +97,7 @@ qboolean Image_LoadTGA( const char *name, const byte *buffer, fs_offset_t filesi
}
else
{
Con_DPrintf( S_ERROR "Image_LoadTGA: (%s) only 24 and 32 bit colormaps are supported for type 1 and 9\n", name );
Con_DPrintf( S_ERROR "%s: (%s) only 24 and 32 bit colormaps are supported for type 1 and 9\n", __func__, name );
return false;
}
}
@@ -106,7 +106,7 @@ qboolean Image_LoadTGA( const char *name, const byte *buffer, fs_offset_t filesi
// uncompressed or RLE compressed RGB
if( targa_header.pixel_size != 32 && targa_header.pixel_size != 24 )
{
Con_DPrintf( S_ERROR "Image_LoadTGA: (%s) Only 32 or 24 bit images supported for type 2 and 10\n", name );
Con_DPrintf( S_ERROR "%s: (%s) Only 32 or 24 bit images supported for type 2 and 10\n", __func__, name );
return false;
}
}
@@ -115,7 +115,7 @@ qboolean Image_LoadTGA( const char *name, const byte *buffer, fs_offset_t filesi
// uncompressed greyscale
if( targa_header.pixel_size != 8 && targa_header.pixel_size != 16 )
{
Con_DPrintf( S_ERROR "Image_LoadTGA: (%s) Only 8 bit images supported for type 3 and 11\n", name );
Con_DPrintf( S_ERROR "%s: (%s) Only 8 bit images supported for type 3 and 11\n", __func__, name );
return false;
}
}

View File

@@ -1179,7 +1179,7 @@ byte *Image_FlipInternal( const byte *in, word *srcwidth, word *srcheight, int t
return image.tempbuffer;
}
static byte *Image_CreateLumaInternal( byte *fin, int width, int height, int type, int flags )
static byte *Image_MakeLuma( byte *fin, int width, int height, int type, int flags )
{
byte *out;
int i;
@@ -1197,7 +1197,7 @@ static byte *Image_CreateLumaInternal( byte *fin, int width, int height, int typ
break;
default:
// another formats does ugly result :(
Con_Printf( S_ERROR "Image_MakeLuma: unsupported format %s\n", PFDesc[type].name );
Con_Printf( S_ERROR "%s: unsupported format %s\n", __func__, PFDesc[type].name );
return (byte *)fin;
}
@@ -1396,7 +1396,7 @@ qboolean Image_Process(rgbdata_t **pix, int width, int height, uint flags, float
if( FBitSet( flags, IMAGE_MAKE_LUMA ))
{
out = Image_CreateLumaInternal( pic->buffer, pic->width, pic->height, pic->type, pic->flags );
out = Image_MakeLuma( pic->buffer, pic->width, pic->height, pic->type, pic->flags );
if( pic->buffer != out ) memcpy( pic->buffer, image.tempbuffer, pic->size );
ClearBits( pic->flags, IMAGE_HAS_LUMA );
}

View File

@@ -31,7 +31,7 @@ qboolean Image_LoadPAL( const char *name, const byte *buffer, fs_offset_t filesi
if( filesize != 768 )
{
Con_DPrintf( S_ERROR "Image_LoadPAL: (%s) have invalid size (%ld should be %d)\n", name, filesize, 768 );
Con_DPrintf( S_ERROR "%s: (%s) have invalid size (%li should be %d)\n", __func__, name, (long)filesize, 768 );
return false;
}

View File

@@ -81,8 +81,8 @@ void *COM_FunctionFromName_SR( void *hInstance, const char *pName )
const char *COM_OffsetNameForFunction( void *function )
{
static string sname;
Q_snprintf( sname, MAX_STRING, "ofs:%lu", (size_t)((byte*)function - (byte*)svgame.dllFuncs.pfnGameInit) );
Con_Reportf( "COM_OffsetNameForFunction %s\n", sname );
Q_snprintf( sname, MAX_STRING, "ofs:%zu", ((byte*)function - (byte*)svgame.dllFuncs.pfnGameInit) );
Con_Reportf( "%s: %s\n", __func__, sname );
return sname;
}
@@ -231,9 +231,9 @@ void COM_GetCommonLibraryPath( ECommonLibraryType eLibType, char *out, size_t si
COM_GenerateClientLibraryPath( "menu", out, size );
break;
case LIBRARY_CLIENT:
if( SI.clientlib[0] )
if( COM_CheckStringEmpty( host.clientlib ))
{
Q_strncpy( out, SI.clientlib, size );
Q_strncpy( out, host.clientlib, size );
}
else
{
@@ -241,9 +241,9 @@ void COM_GetCommonLibraryPath( ECommonLibraryType eLibType, char *out, size_t si
}
break;
case LIBRARY_SERVER:
if( SI.gamedll[0] )
if( COM_CheckStringEmpty( host.gamedll ))
{
Q_strncpy( out, SI.gamedll, size );
Q_strncpy( out, host.gamedll, size );
}
else
{
@@ -359,7 +359,7 @@ static char *COM_GetItaniumName( const char * const in_name )
if( i == MAX_NESTED_NAMESPACES )
{
Con_DPrintf( "%s: too much nested namespaces: %s\n", __FUNCTION__, in_name );
Con_DPrintf( "%s: too much nested namespaces: %s\n", __func__, in_name );
return NULL;
}
@@ -373,7 +373,7 @@ static char *COM_GetItaniumName( const char * const in_name )
return out_name;
invalid_format:
Con_DPrintf( "%s: invalid format: %s\n", __FUNCTION__, in_name );
Con_DPrintf( "%s: invalid format: %s\n", __func__, in_name );
return NULL;
}
@@ -421,7 +421,7 @@ char **COM_ConvertToLocalPlatform( EFunctionMangleType to, const char *from, siz
if( i == MAX_NESTED_NAMESPACES )
{
Con_DPrintf( "%s: too much nested namespaces: %s\n", __FUNCTION__, from );
Con_DPrintf( "%s: too much nested namespaces: %s\n", __func__, from );
return NULL;
}

View File

@@ -389,7 +389,7 @@ void NET_SaveMasters( void )
if( !f )
{
Con_Reportf( S_ERROR "Couldn't write xashcomm.lst\n" );
Con_Reportf( S_ERROR "Couldn't write xashcomm.lst\n" );
return;
}
@@ -419,6 +419,8 @@ void NET_InitMasters( void )
// keep main master always there
NET_AddMaster( MASTERSERVER_ADR, false );
NET_AddMaster( MASTERSERVER_ADR_TEST, false );
NET_AddMaster( "aaaa.mentality.rip:27010", false ); // IPv6-only
NET_AddMaster( "mentality.rip:27011", false );
NET_LoadMasters( );
}

View File

@@ -313,7 +313,7 @@ static qboolean Mod_NameImpliesTextureIsAnimated( texture_t *tex )
if( !( tex->name[1] >= '0' && tex->name[1] <= '9' ) &&
!( tex->name[1] >= 'a' && tex->name[1] <= 'j' ))
{
Con_Printf( S_ERROR "Mod_NameImpliesTextureIsAnimated: animating texture \"%s\" has invalid name\n", tex->name );
Con_Printf( S_ERROR "%s: animating texture \"%s\" has invalid name\n", __func__, tex->name );
return false;
}
@@ -942,7 +942,7 @@ static void Mod_FindModelOrigin( const char *entities, const char *modelname, ve
while(( pfile = COM_ParseFile( pfile, token, sizeof( token ))) != NULL )
{
if( token[0] != '{' )
Host_Error( "Mod_FindModelOrigin: found %s when expecting {\n", token );
Host_Error( "%s: found %s when expecting {\n", __func__, token );
model_found = origin_found = false;
VectorClear( origin );
@@ -951,17 +951,17 @@ static void Mod_FindModelOrigin( const char *entities, const char *modelname, ve
{
// parse key
if(( pfile = COM_ParseFile( pfile, token, sizeof( token ))) == NULL )
Host_Error( "Mod_FindModelOrigin: EOF without closing brace\n" );
Host_Error( "%s: EOF without closing brace\n", __func__ );
if( token[0] == '}' ) break; // end of desc
Q_strncpy( keyname, token, sizeof( keyname ));
// parse value
if(( pfile = COM_ParseFile( pfile, token, sizeof( token ))) == NULL )
Host_Error( "Mod_FindModelOrigin: EOF without closing brace\n" );
Host_Error( "%s: EOF without closing brace\n", __func__ );
if( token[0] == '}' )
Host_Error( "Mod_FindModelOrigin: closing brace without data\n" );
Host_Error( "%s: closing brace without data\n", __func__ );
if( !Q_stricmp( keyname, "model" ) && !Q_stricmp( modelname, token ))
model_found = true;
@@ -1198,7 +1198,7 @@ static void Mod_CalcSurfaceExtents( model_t *mod, msurface_t *surf )
e = mod->surfedges[surf->firstedge + i];
if( e >= mod->numedges || e <= -mod->numedges )
Host_Error( "Mod_CalcSurfaceExtents: bad edge\n" );
Host_Error( "%s: bad edge\n", __func__ );
if( e >= 0 ) v = &mod->vertexes[mod->edges[e].v[0]];
else v = &mod->vertexes[mod->edges[-e].v[1]];
@@ -1267,7 +1267,7 @@ static void Mod_CalcSurfaceBounds( model_t *mod, msurface_t *surf )
e = mod->surfedges[surf->firstedge + i];
if( e >= mod->numedges || e <= -mod->numedges )
Host_Error( "Mod_CalcSurfaceBounds: bad edge\n" );
Host_Error( "%s: bad edge\n", __func__ );
if( e >= 0 ) v = &mod->vertexes[mod->edges[e].v[0]];
else v = &mod->vertexes[mod->edges[-e].v[1]];
@@ -1491,7 +1491,7 @@ static void Mod_SetupHull( dbspmodel_t *bmod, model_t *mod, poolhandle_t mempool
VectorCopy( host.player_maxs[1], hull->clip_maxs );
break;
default:
Host_Error( "Mod_SetupHull: bad hull number %i\n", hullnum );
Host_Error( "%s: bad hull number %i\n", __func__, hullnum );
break;
}
@@ -1548,7 +1548,7 @@ static qboolean Mod_LoadColoredLighting( model_t *mod, dbspmodel_t *bmod )
if( litdatasize != ( bmod->lightdatasize * 3 ))
{
Con_Printf( S_ERROR "%s has mismatched size (%llu should be %zu)\n", path, litdatasize, bmod->lightdatasize * 3 );
Con_Printf( S_ERROR "%s has mismatched size (%li should be %zu)\n", path, (long)litdatasize, bmod->lightdatasize * 3 );
Mem_Free( in );
return false;
}
@@ -1603,7 +1603,7 @@ static void Mod_LoadDeluxemap( model_t *mod, dbspmodel_t *bmod )
if( deluxdatasize != bmod->lightdatasize )
{
Con_Reportf( S_ERROR "%s has mismatched size (%llu should be %zu)\n", path, deluxdatasize, bmod->lightdatasize );
Con_Reportf( S_ERROR "%s has mismatched size (%li should be %zu)\n", path, (long)deluxdatasize, bmod->lightdatasize );
Mem_Free( in );
return;
}
@@ -1841,23 +1841,23 @@ static void Mod_LoadEntities( model_t *mod, dbspmodel_t *bmod )
while(( pfile = COM_ParseFile( pfile, token, sizeof( token ))) != NULL )
{
if( token[0] != '{' )
Host_Error( "Mod_LoadEntities: found %s when expecting {\n", token );
Host_Error( "%s: found %s when expecting {\n", __func__, token );
while( 1 )
{
// parse key
if(( pfile = COM_ParseFile( pfile, token, sizeof( token ))) == NULL )
Host_Error( "Mod_LoadEntities: EOF without closing brace\n" );
Host_Error( "%s: EOF without closing brace\n", __func__ );
if( token[0] == '}' ) break; // end of desc
Q_strncpy( keyname, token, sizeof( keyname ));
// parse value
if(( pfile = COM_ParseFile( pfile, token, sizeof( token ))) == NULL )
Host_Error( "Mod_LoadEntities: EOF without closing brace\n" );
Host_Error( "%s: EOF without closing brace\n", __func__ );
if( token[0] == '}' )
Host_Error( "Mod_LoadEntities: closing brace without data\n" );
Host_Error( "%s: closing brace without data\n", __func__ );
if( !Q_stricmp( keyname, "wad" ))
{
@@ -2035,7 +2035,7 @@ static void Mod_LoadMarkSurfaces( model_t *mod, dbspmodel_t *bmod )
for( i = 0; i < bmod->nummarkfaces; i++, in++ )
{
if( *in < 0 || *in >= mod->numsurfaces )
Host_Error( "Mod_LoadMarkFaces: bad surface number in '%s'\n", mod->name );
Host_Error( "%s: bad surface number in '%s'\n", __func__, mod->name );
out[i] = mod->surfaces + *in;
}
}
@@ -2046,7 +2046,7 @@ static void Mod_LoadMarkSurfaces( model_t *mod, dbspmodel_t *bmod )
for( i = 0; i < bmod->nummarkfaces; i++, in++ )
{
if( *in < 0 || *in >= mod->numsurfaces )
Host_Error( "Mod_LoadMarkFaces: bad surface number in '%s'\n", mod->name );
Host_Error( "%s: bad surface number in '%s'\n", __func__, mod->name );
out[i] = mod->surfaces + *in;
}
}
@@ -2066,12 +2066,202 @@ static qboolean Mod_LooksLikeWaterTexture( const char *name )
return false;
}
static void Mod_TextureReplacementReport( const char *modelname, const char *texname, const char *type, int gl_texturenum, const char *foundpath )
{
if( host_allow_materials.value != 2.0f )
return;
if( gl_texturenum > 0 ) // found and loaded successfully
Con_Printf( "Looking for %s:%s%s tex replacement..." S_GREEN "OK (%s)\n", modelname, texname, type, foundpath );
else if( gl_texturenum < 0 ) // not found
Con_Printf( "Looking for %s:%s%s tex replacement..." S_YELLOW "MISS (%s)\n", modelname, texname, type, foundpath );
else // found but not loaded
Con_Printf( "Looking for %s:%s%s tex replacement..." S_RED "FAIL (%s)\n", modelname, texname, type, foundpath );
}
static qboolean Mod_SearchForTextureReplacement( char *out, size_t size, const char *modelname, const char *texname, const char *type )
{
const char *subdirs[] = { modelname, "common" };
int i;
for( i = 0; i < ARRAYSIZE( subdirs ); i++ )
{
if( Q_snprintf( out, size, "materials/%s/%s%s.tga", subdirs[i], texname, type ) < 0 )
continue; // truncated name
if( g_fsapi.FileExists( out, false ))
return true; // found, load it
}
Mod_TextureReplacementReport( modelname, texname, type, -1, "not found" );
return false;
}
static void Mod_InitSkyClouds( model_t *mod, mip_t *mt, texture_t *tx, qboolean custom_palette )
{
#if !XASH_DEDICATED
rgbdata_t r_temp, *r_sky;
uint *trans, *rgba;
uint transpix;
int r, g, b;
int i, j, p;
string texname;
int solidskyTexture = 0, alphaskyTexture = 0;
if( !ref.initialized )
return;
if( Mod_AllowMaterials( ))
{
rgbdata_t *pic;
if( Mod_SearchForTextureReplacement( texname, sizeof( texname ), mod->name, mt->name, "_solid" ))
{
pic = FS_LoadImage( texname, NULL, 0 );
if( pic )
{
// need to do rename texture to properly cleanup these textures on reload
solidskyTexture = GL_LoadTextureInternal( "solid_sky", pic, TF_NOMIPMAP );
Mod_TextureReplacementReport( mod->name, mt->name, "_solid", solidskyTexture, texname );
FS_FreeImage( pic );
}
}
if( Mod_SearchForTextureReplacement( texname, sizeof( texname ), mod->name, mt->name, "_alpha" ))
{
pic = FS_LoadImage( texname, NULL, 0 );
if( pic )
{
alphaskyTexture = GL_LoadTextureInternal( "alpha_sky", pic, TF_NOMIPMAP );
Mod_TextureReplacementReport( mod->name, mt->name, "_alpha", alphaskyTexture, texname );
FS_FreeImage( pic );
}
}
if( !solidskyTexture || !alphaskyTexture )
{
ref.dllFuncs.GL_FreeTexture( solidskyTexture );
ref.dllFuncs.GL_FreeTexture( alphaskyTexture );
}
else goto done; // replacements found, notify the renderer and exit
}
Q_snprintf( texname, sizeof( texname ), "%s%s.mip", ( mt->offsets[0] > 0 ) ? "#" : "", tx->name );
if( mt->offsets[0] > 0 )
{
size_t size = sizeof( mip_t ) + (( mt->width * mt->height * 85 ) >> 6 );
if( custom_palette )
size += sizeof( short ) + 768;
r_sky = FS_LoadImage( texname, (byte *)mt, size );
}
else
{
// okay loading it from wad
r_sky = FS_LoadImage( texname, NULL, 0 );
}
if( !r_sky || !r_sky->palette || r_sky->type != PF_INDEXED_32 || r_sky->height == 0 )
{
Con_Printf( S_ERROR "%s: unable to load sky texture %s\n", __func__, tx->name );
if( r_sky )
FS_FreeImage( r_sky );
return;
}
// make an average value for the back to avoid
// a fringe on the top level
trans = Mem_Malloc( host.mempool, r_sky->height * r_sky->height * sizeof( *trans ));
r = g = b = 0;
for( i = 0; i < r_sky->width >> 1; i++ )
{
for( j = 0; j < r_sky->height; j++ )
{
p = r_sky->buffer[i * r_sky->width + j + r_sky->height];
rgba = (uint *)r_sky->palette + p;
trans[(i * r_sky->height) + j] = *rgba;
r += ((byte *)rgba)[0];
g += ((byte *)rgba)[1];
b += ((byte *)rgba)[2];
}
}
((byte *)&transpix)[0] = r / ( r_sky->height * r_sky->height );
((byte *)&transpix)[1] = g / ( r_sky->height * r_sky->height );
((byte *)&transpix)[2] = b / ( r_sky->height * r_sky->height );
((byte *)&transpix)[3] = 0;
// build a temporary image
r_temp = *r_sky;
r_temp.width = r_sky->width >> 1;
r_temp.height = r_sky->height;
r_temp.type = PF_RGBA_32;
r_temp.flags = IMAGE_HAS_COLOR;
r_temp.size = r_temp.width * r_temp.height * 4;
r_temp.buffer = (byte *)trans;
r_temp.palette = NULL;
// load it in
solidskyTexture = GL_LoadTextureInternal( "solid_sky", &r_temp, TF_NOMIPMAP );
for( i = 0; i < r_sky->width >> 1; i++ )
{
for( j = 0; j < r_sky->height; j++ )
{
p = r_sky->buffer[i * r_sky->width + j];
if( p == 0 )
{
trans[(i * r_sky->height) + j] = transpix;
}
else
{
rgba = (uint *)r_sky->palette + p;
trans[(i * r_sky->height) + j] = *rgba;
}
}
}
r_temp.flags = IMAGE_HAS_COLOR|IMAGE_HAS_ALPHA;
// load it in
alphaskyTexture = GL_LoadTextureInternal( "alpha_sky", &r_temp, TF_NOMIPMAP );
// clean up
FS_FreeImage( r_sky );
Mem_Free( trans );
if( !solidskyTexture || !alphaskyTexture )
{
ref.dllFuncs.GL_FreeTexture( solidskyTexture );
ref.dllFuncs.GL_FreeTexture( alphaskyTexture );
return;
}
done:
// notify the renderer
ref.dllFuncs.R_SetSkyCloudsTextures( solidskyTexture, alphaskyTexture );
if( solidskyTexture && alphaskyTexture )
SetBits( world.flags, FWORLD_SKYSPHERE );
#endif // !XASH_DEDICATED
}
static void Mod_LoadTextureData( model_t *mod, dbspmodel_t *bmod, int textureIndex )
{
texture_t *texture = NULL;
mip_t *mipTex = NULL;
qboolean usesCustomPalette = false;
uint32_t txFlags = 0;
char texpath[MAX_VA_STRING];
char safemtname[16]; // only for external textures
qboolean load_external = false;
// don't load texture data on dedicated server, as there is no renderer.
// but count the wadusage for automatic precache
@@ -2080,6 +2270,14 @@ static void Mod_LoadTextureData( model_t *mod, dbspmodel_t *bmod, int textureInd
// but there is no facility for this yet
texture = mod->textures[textureIndex];
mipTex = Mod_GetMipTexForTexture( bmod, textureIndex );
usesCustomPalette = Mod_CalcMipTexUsesCustomPalette( mod, bmod, textureIndex );
// check for multi-layered sky texture (quake1 specific)
if( bmod->isworld && Q_strncmp( mipTex->name, "sky", 3 ) == 0 && ( mipTex->width / mipTex->height ) == 2 )
{
Mod_InitSkyClouds( mod, mipTex, texture, usesCustomPalette ); // load quake sky
return;
}
if( FBitSet( host.features, ENGINE_IMPROVED_LINETRACE ) && mipTex->name[0] == '{' )
SetBits( txFlags, TF_KEEP_SOURCE ); // Paranoia2 texture alpha-tracing
@@ -2088,33 +2286,31 @@ static void Mod_LoadTextureData( model_t *mod, dbspmodel_t *bmod, int textureInd
if( Mod_LooksLikeWaterTexture( mipTex->name ))
SetBits( txFlags, TF_KEEP_SOURCE | TF_EXPAND_SOURCE );
usesCustomPalette = Mod_CalcMipTexUsesCustomPalette( mod, bmod, textureIndex );
// Texture loading order:
// 1. HQ from disk
// 2. From WAD
// 3. Internal from map
// check for multi-layered sky texture (quake1 specific)
if( bmod->isworld && Q_strncmp( mipTex->name, "sky", 3 ) == 0 && ( mipTex->width / mipTex->height ) == 2 )
texture->gl_texturenum = 0;
Q_strncpy( safemtname, mipTex->name, sizeof( safemtname ));
if( safemtname[0] == '*' )
safemtname[0] = '!'; // replace unexpected symbol
if( Mod_AllowMaterials( ))
{
#if !XASH_DEDICATED
if( !Host_IsDedicated( ))
if( Mod_SearchForTextureReplacement( texpath, sizeof( texpath ), mod->name, safemtname, "" ))
{
ref.dllFuncs.R_InitSkyClouds( mipTex, texture, usesCustomPalette ); // load quake sky
if( R_GetBuiltinTexture( REF_SOLIDSKY_TEXTURE ) && R_GetBuiltinTexture( REF_ALPHASKY_TEXTURE ))
SetBits( world.flags, FWORLD_SKYSPHERE );
texture->gl_texturenum = ref.dllFuncs.GL_LoadTexture( texpath, NULL, 0, txFlags );
load_external = texture->gl_texturenum != 0;
Mod_TextureReplacementReport( mod->name, safemtname, "", texture->gl_texturenum, texpath );
}
#endif // !XASH_DEDICATED
// No texture to load in this case, so just exit.
return;
}
// Texture loading order:
// 1. From WAD
// 2. Internal from map
// Try WAD texture (force while r_wadtextures is 1)
if(( r_wadtextures.value && bmod->wadlist.count > 0 ) || mipTex->offsets[0] <= 0 )
if( !texture->gl_texturenum && (( r_wadtextures.value && bmod->wadlist.count > 0 ) || mipTex->offsets[0] <= 0 ))
{
char texpath[MAX_VA_STRING];
int wadIndex = Mod_FindTextureInWadList( &bmod->wadlist, mipTex->name, texpath, sizeof( texpath ));
if( wadIndex >= 0 )
@@ -2149,9 +2345,20 @@ static void Mod_LoadTextureData( model_t *mod, dbspmodel_t *bmod, int textureInd
}
// Check for luma texture
if( FBitSet( REF_GET_PARM( PARM_TEX_FLAGS, texture->gl_texturenum ), TF_HAS_LUMA ))
texture->fb_texturenum = 0;
if( load_external ) // external textures will not have TF_HAS_LUMA flag because it set only from WAD images loader
{
if( Mod_SearchForTextureReplacement( texpath, sizeof( texpath ), mod->name, safemtname, "_luma" ))
{
texture->fb_texturenum = ref.dllFuncs.GL_LoadTexture( texpath, NULL, 0, TF_MAKELUMA );
Mod_TextureReplacementReport( mod->name, safemtname, "_luma", texture->fb_texturenum, texpath );
}
}
if( FBitSet( REF_GET_PARM( PARM_TEX_FLAGS, texture->gl_texturenum ), TF_HAS_LUMA ) && !texture->fb_texturenum )
{
char texName[64];
Q_snprintf( texName, sizeof( texName ), "#%s:%s_luma.mip", loadstat.name, mipTex->name );
if( mipTex->offsets[0] > 0 )
@@ -2313,7 +2520,8 @@ static void Mod_SequenceAnimatedTexture( model_t *mod, int baseTextureIndex )
if( !tex )
{
Con_Printf( S_ERROR "Mod_SequenceAnimatedTexture: missing frame %i of animated texture \"%s\"\n",
Con_Printf( S_ERROR "%s: missing frame %i of animated texture \"%s\"\n",
__func__,
candidateIndex,
baseTexture->name );
@@ -2337,7 +2545,8 @@ static void Mod_SequenceAnimatedTexture( model_t *mod, int baseTextureIndex )
if( !tex )
{
Con_Printf( S_ERROR "Mod_SequenceAnimatedTexture: missing alternate frame %i of animated texture \"%s\"\n",
Con_Printf( S_ERROR "%s: missing alternate frame %i of animated texture \"%s\"\n",
__func__,
candidateIndex,
baseTexture->name );
@@ -2376,8 +2585,8 @@ static void Mod_LoadTextures( model_t *mod, dbspmodel_t *bmod )
// release old sky layers first
if( !Host_IsDedicated() && bmod->isworld )
{
ref.dllFuncs.GL_FreeTexture( R_GetBuiltinTexture( REF_ALPHASKY_TEXTURE ));
ref.dllFuncs.GL_FreeTexture( R_GetBuiltinTexture( REF_SOLIDSKY_TEXTURE ));
ref.dllFuncs.GL_FreeTexture( R_GetBuiltinTexture( "alpha_sky" ));
ref.dllFuncs.GL_FreeTexture( R_GetBuiltinTexture( "solid_sky" ));
}
#endif
@@ -2752,7 +2961,7 @@ static void Mod_LoadLeafs( model_t *mod, dbspmodel_t *bmod )
}
if( bmod->isworld && mod->leafs[0].contents != CONTENTS_SOLID )
Host_Error( "Mod_LoadLeafs: Map %s has leaf 0 is not CONTENTS_SOLID\n", mod->name );
Host_Error( "%s: Map %s has leaf 0 is not CONTENTS_SOLID\n", __func__, mod->name );
// do some final things for world
if( bmod->isworld && Mod_CheckWaterAlphaSupport( mod, bmod ))
@@ -2875,7 +3084,7 @@ static void Mod_CalcPHS( model_t *mod )
t2 = Platform_DoubleTime();
if( vis_stats )
Con_Reportf( "Average leaves visible / audible / total: %i / %i / %i\n", vcount / count, hcount / count, count );
Con_Reportf( "Average leaves visible / audible / total: %zu / %zu / %zu\n", vcount / count, hcount / count, count );
Con_Reportf( "Uncompressed PHS size: %s\n", Q_memprint( rowbytes * count ));
Con_Reportf( "Compressed PHS size: %s\n", Q_memprint( total_compressed_size + sizeof( *world.phsofs ) * count ));
Con_Reportf( "PHS building time: %.2f ms\n", ( t2 - t1 ) * 1000.0f );
@@ -2973,7 +3182,7 @@ static void Mod_LoadLightVecs( model_t *mod, dbspmodel_t *bmod )
if( bmod->deluxdatasize != bmod->lightdatasize )
{
if( bmod->deluxdatasize > 0 )
Con_Printf( S_ERROR "Mod_LoadLightVecs: has mismatched size (%zu should be %zu)\n", bmod->deluxdatasize, bmod->lightdatasize );
Con_Printf( S_ERROR "%s: has mismatched size (%zu should be %zu)\n", __func__, bmod->deluxdatasize, bmod->lightdatasize );
else Mod_LoadDeluxemap( mod, bmod ); // old method
return;
}
@@ -2992,7 +3201,7 @@ static void Mod_LoadShadowmap( model_t *mod, dbspmodel_t *bmod )
if( bmod->shadowdatasize != ( bmod->lightdatasize / 3 ))
{
if( bmod->shadowdatasize > 0 )
Con_Printf( S_ERROR "Mod_LoadShadowmap: has mismatched size (%zu should be %zu)\n", bmod->shadowdatasize, bmod->lightdatasize / 3 );
Con_Printf( S_ERROR "%s: has mismatched size (%zu should be %zu)\n", __func__, bmod->shadowdatasize, bmod->lightdatasize / 3 );
return;
}
@@ -3034,7 +3243,7 @@ static void Mod_LoadLighting( model_t *mod, dbspmodel_t *bmod )
SetBits( mod->flags, MODEL_COLORED_LIGHTING );
break;
default:
Host_Error( "Mod_LoadLighting: bad lightmap sample count %i\n", bmod->lightmap_samples );
Host_Error( "%s: bad lightmap sample count %i\n", __func__, bmod->lightmap_samples );
break;
}
@@ -3353,13 +3562,13 @@ qboolean Mod_TestBmodelLumps( file_t *f, const char *name, const byte *mod_base,
if( loadstat.numerrors )
{
if( !FBitSet( flags, LUMP_SILENT ))
Con_Printf( "Mod_LoadWorld: %i error(s), %i warning(s)\n", loadstat.numerrors, loadstat.numwarnings );
Con_Printf( "%s: %i error(s), %i warning(s)\n", __func__, loadstat.numerrors, loadstat.numwarnings );
return false; // there were errors, we can't load this map
}
else if( loadstat.numwarnings )
{
if( !FBitSet( flags, LUMP_SILENT ))
Con_Printf( "Mod_LoadWorld: %i warning(s)\n", loadstat.numwarnings );
Con_Printf( "%s: %i warning(s)\n", __func__, loadstat.numwarnings );
}
return true;

View File

@@ -436,8 +436,8 @@ void *R_StudioGetAnim( studiohdr_t *m_pStudioHeader, model_t *m_pSubModel, mstud
Q_snprintf( filepath, sizeof( filepath ), "%s/%s%i%i.mdl", modelpath, modelname, pseqdesc->seqgroup / 10, pseqdesc->seqgroup % 10 );
buf = FS_LoadFile( filepath, &filesize, false );
if( !buf || !filesize ) Host_Error( "StudioGetAnim: can't load %s\n", filepath );
if( IDSEQGRPHEADER != *(uint *)buf ) Host_Error( "StudioGetAnim: %s is corrupted\n", filepath );
if( !buf || !filesize ) Host_Error( "%s: can't load %s\n", __func__, filepath );
if( IDSEQGRPHEADER != *(uint *)buf ) Host_Error( "%s: %s is corrupted\n", __func__, filepath );
Con_Printf( "loading: %s\n", filepath );
@@ -482,7 +482,7 @@ static void SV_StudioSetupBones( model_t *pModel, float frame, int sequence, con
{
// only show warn if sequence that out of range was specified intentionally
if( sequence > mod_studiohdr->numseq )
Con_Reportf( S_WARN "SV_StudioSetupBones: sequence %i/%i out of range for model %s\n", sequence, mod_studiohdr->numseq, pModel->name );
Con_Reportf( S_WARN "%s: sequence %i/%i out of range for model %s\n", __func__, sequence, mod_studiohdr->numseq, pModel->name );
sequence = 0;
}
@@ -866,6 +866,7 @@ void Mod_LoadStudioModel( model_t *mod, const void *buffer, qboolean *loaded )
{
char poolname[MAX_VA_STRING];
studiohdr_t *phdr;
qboolean textures_loaded = false;
Q_snprintf( poolname, sizeof( poolname ), "^2%s^7", mod->name );
@@ -874,8 +875,10 @@ void Mod_LoadStudioModel( model_t *mod, const void *buffer, qboolean *loaded )
mod->type = mod_studio;
phdr = R_StudioLoadHeader( mod, buffer );
if( !phdr ) return; // bad model
if( !phdr )
return; // bad model
#if !XASH_DEDICATED
if( !Host_IsDedicated( ) && phdr->numtextures == 0 )
{
studiohdr_t *thdr;
@@ -889,10 +892,9 @@ void Mod_LoadStudioModel( model_t *mod, const void *buffer, qboolean *loaded )
byte *in, *out;
size_t size1, size2;
#if !XASH_DEDICATED
// TODO: Mod_StudioLoadTextures will crash if passed a merged studio model!
ref.dllFuncs.Mod_StudioLoadTextures( mod, thdr );
#endif
textures_loaded = true;
// give space for textures and skinrefs
size1 = thdr->numtextures * sizeof( mstudiotexture_t );
@@ -916,7 +918,9 @@ void Mod_LoadStudioModel( model_t *mod, const void *buffer, qboolean *loaded )
if( buffer2 )
Mem_Free( buffer2 ); // release T.mdl
}
else
#endif
if( !textures_loaded )
{
// NOTE: don't modify source buffer because it's used for CRC computing
mod->cache.data = Mem_Calloc( mod->mempool, phdr->length );
@@ -990,7 +994,7 @@ void Mod_InitStudioAPI( void )
pBlendIface = (STUDIOAPI)COM_GetProcAddress( svgame.hInstance, "Server_GetBlendingInterface" );
if( pBlendIface && pBlendIface( SV_BLENDING_INTERFACE_VERSION, &pBlendAPI, &gStudioAPI, &studio_transform, &studio_bones ))
{
Con_Reportf( "SV_LoadProgs: ^2initailized Server Blending interface ^7ver. %i\n", SV_BLENDING_INTERFACE_VERSION );
Con_Reportf( "%s: ^2initailized Server Blending interface ^7ver. %i\n", __func__, SV_BLENDING_INTERFACE_VERSION );
return;
}

View File

@@ -119,6 +119,27 @@ const char *svc_goldsrc_strings[svc_lastmsg+1] =
[svc_goldsrc_sendcvarvalue2] = "svc_goldsrc_sendcvarvalue2",
};
const char *svc_quake_strings[svc_lastmsg+1] =
{
[svc_updatestat] = "svc_quake_updatestat",
[svc_version] = "svc_quake_version",
[svc_updatename] = "svc_quake_updatename",
[svc_updatefrags] = "svc_quake_updatefrags",
[svc_stopsound] = "svc_quake_stopsound",
[svc_updatecolors] = "svc_quake_updatecolors",
[svc_damage] = "svc_quake_damage",
[svc_spawnbinary] = "svc_quake_spawnbinary",
[svc_killedmonster] = "svc_quake_killedmonster",
[svc_foundsecret] = "svc_quake_foundsecret",
[svc_spawnstaticsound] = "svc_quake_spawnstaticsound",
[svc_sellscreen] = "svc_quake_sellscreen",
[svc_showlmp] = "svc_quake_showlmp",
[svc_hidelmp] = "svc_quake_hidelmp",
[svc_skybox] = "svc_quake_skybox",
[svc_skyboxsize] = "svc_quake_skyboxsize",
[svc_fog] = "svc_quake_fog",
};
void MSG_InitMasks( void )
{
uint startbit, endbit;

View File

@@ -85,9 +85,9 @@ then a packet only needs to be delivered if there is something in the
unacknowledged reliable
*/
CVAR_DEFINE_AUTO( net_showpackets, "0", 0, "show network packets" );
CVAR_DEFINE_AUTO( net_chokeloop, "0", 0, "apply bandwidth choke to loopback packets" );
CVAR_DEFINE_AUTO( net_showdrop, "0", 0, "show packets that are dropped" );
CVAR_DEFINE_AUTO( net_qport, "0", FCVAR_READ_ONLY, "current quake netport" );
static CVAR_DEFINE_AUTO( net_chokeloop, "0", 0, "apply bandwidth choke to loopback packets" );
static CVAR_DEFINE_AUTO( net_showdrop, "0", 0, "show packets that are dropped" );
static CVAR_DEFINE_AUTO( net_qport, "0", FCVAR_READ_ONLY, "current quake netport" );
int net_drop;
netadr_t net_from;
@@ -131,7 +131,7 @@ qboolean NetSplit_GetLong( netsplit_t *ns, netadr_t *from, byte *data, size_t *l
LittleLongSW(packet->part);
p = &ns->packets[packet->id & NETSPLIT_BACKUP_MASK];
// Con_Reportf( S_NOTE "NetSplit_GetLong: packet from %s, id %d, index %d length %d\n", NET_AdrToString( *from ), (int)packet->id, (int)packet->index, (int)*length );
// Con_Reportf( S_NOTE "%s: packet from %s, id %d, index %d length %d\n", __func__, NET_AdrToString( *from ), (int)packet->id, (int)packet->index, (int)*length );
// no packets with this id received
if( packet->id != p->id )
@@ -140,7 +140,7 @@ qboolean NetSplit_GetLong( netsplit_t *ns, netadr_t *from, byte *data, size_t *l
if( p->received < p->count )
{
UI_ShowConnectionWarning();
Con_Reportf( S_WARN "NetSplit_GetLong: lost packet %d\n", p->id );
Con_Reportf( S_WARN "%s: lost packet %d\n", __func__, p->id );
}
p->id = packet->id;
@@ -152,7 +152,7 @@ qboolean NetSplit_GetLong( netsplit_t *ns, netadr_t *from, byte *data, size_t *l
// use bool vector to detect dup packets
if( p->recieved_v[packet->index >> 5 ] & ( 1 << ( packet->index & 31 ) ) )
{
Con_Reportf( S_WARN "NetSplit_GetLong: dup packet from %s\n", NET_AdrToString( *from ) );
Con_Reportf( S_WARN "%s: dup packet from %s\n", __func__, NET_AdrToString( *from ) );
return false;
}
@@ -164,13 +164,13 @@ qboolean NetSplit_GetLong( netsplit_t *ns, netadr_t *from, byte *data, size_t *l
// prevent overflow
if( packet->part * packet->index > NET_MAX_PAYLOAD )
{
Con_Reportf( S_WARN "NetSplit_GetLong: packet out fo bounds from %s (part %d index %d)\n", NET_AdrToString( *from ), packet->part, packet->index );
Con_Reportf( S_WARN "%s: packet out fo bounds from %s (part %d index %d)\n", __func__, NET_AdrToString( *from ), packet->part, packet->index );
return false;
}
if( packet->length > NET_MAX_PAYLOAD )
{
Con_Reportf( S_WARN "NetSplit_GetLong: packet out fo bounds from %s (length %d)\n", NET_AdrToString( *from ), packet->length );
Con_Reportf( S_WARN "%s: packet out fo bounds from %s (length %d)\n", __func__, NET_AdrToString( *from ), packet->length );
return false;
}
@@ -187,7 +187,7 @@ qboolean NetSplit_GetLong( netsplit_t *ns, netadr_t *from, byte *data, size_t *l
ns->total_received_uncompressed += len;
*length = len;
// Con_Reportf( S_NOTE "NetSplit_GetLong: packet from %s, id %d received %d length %d\n", NET_AdrToString( *from ), (int)packet->id, (int)p->received, (int)packet->length );
// Con_Reportf( S_NOTE "%s: packet from %s, id %d received %d length %d\n", __func__, NET_AdrToString( *from ), (int)packet->id, (int)p->received, (int)packet->length );
memcpy( data, p->data, len );
return true;
}
@@ -1588,7 +1588,7 @@ void Netchan_TransmitBits( netchan_t *chan, int length, byte *data )
// send the qport if we are a client
if( chan->sock == NS_CLIENT )
{
MSG_WriteWord( &send, Cvar_VariableInteger( "net_qport" ));
MSG_WriteWord( &send, (int)net_qport.value );
}
if( send_reliable && send_reliable_fragment )
@@ -1624,7 +1624,7 @@ void Netchan_TransmitBits( netchan_t *chan, int length, byte *data )
if( (( MSG_GetNumBytesWritten( &send ) + length ) >> 3) <= maxsize )
MSG_WriteBits( &send, data, length );
else Con_Printf( S_WARN "Netchan_Transmit: unreliable message overflow: %d\n", MSG_GetNumBytesWritten( &send ) );
else Con_Printf( S_WARN "%s: unreliable message overflow: %d\n", __func__, MSG_GetNumBytesWritten( &send ) );
}
// deal with packets that are too small for some networks
@@ -1700,9 +1700,6 @@ qboolean Netchan_Process( netchan_t *chan, sizebuf_t *msg )
qboolean message_contains_fragments;
int i, qport, statId;
if( !CL_IsPlaybackDemo() && !NET_CompareAdr( net_from, chan->remote_address ))
return false;
// get sequence numbers
MSG_Clear( msg );
sequence = MSG_ReadLong( msg );

View File

@@ -510,13 +510,13 @@ static qboolean Delta_AddField( delta_info_t *dt, const char *pName, int flags,
pFieldInfo = Delta_FindFieldInfo( dt->pInfo, pName );
if( !pFieldInfo )
{
Con_DPrintf( S_ERROR "Delta_Add: couldn't find description for %s->%s\n", dt->pName, pName );
Con_DPrintf( S_ERROR "%s: couldn't find description for %s->%s\n", __func__, dt->pName, pName );
return false;
}
if( dt->numFields + 1 > dt->maxFields )
{
Con_DPrintf( S_WARN "Delta_Add: can't add %s->%s encoder list is full\n", dt->pName, pName );
Con_DPrintf( S_WARN "%s: can't add %s->%s encoder list is full\n", __func__, dt->pName, pName );
return false; // too many fields specified (duplicated ?)
}
@@ -587,7 +587,7 @@ void Delta_ParseTableField( sizebuf_t *msg )
tableIndex = MSG_ReadUBitLong( msg, 4 );
dt = Delta_FindStructByIndex( tableIndex );
if( !dt )
Host_Error( "Delta_ParseTableField: not initialized" );
Host_Error( "%s: not initialized", __func__ );
nameIndex = MSG_ReadUBitLong( msg, 8 ); // read field name index
if( ( nameIndex >= 0 && nameIndex < dt->maxFields ) )
@@ -597,7 +597,7 @@ void Delta_ParseTableField( sizebuf_t *msg )
else
{
ignore = true;
Con_Reportf( "Delta_ParseTableField: wrong nameIndex %d for table %s, ignoring\n", nameIndex, dt->pName );
Con_Reportf( "%s: wrong nameIndex %d for table %s, ignoring\n", __func__, nameIndex, dt->pName );
}
flags = MSG_ReadUBitLong( msg, 10 );
@@ -630,28 +630,28 @@ static qboolean Delta_ParseField( char **delta_script, const delta_field_t *pInf
*delta_script = COM_ParseFile( *delta_script, token, sizeof( token ));
if( Q_strcmp( token, "(" ))
{
Con_DPrintf( S_ERROR "Delta_ParseField: expected '(', found '%s' instead\n", token );
Con_DPrintf( S_ERROR "%s: expected '(', found '%s' instead\n", __func__, token );
return false;
}
// read the variable name
if(( *delta_script = COM_ParseFile( *delta_script, token, sizeof( token ))) == NULL )
{
Con_DPrintf( S_ERROR "Delta_ParseField: missing field name\n" );
Con_DPrintf( S_ERROR "%s: missing field name\n", __func__ );
return false;
}
pFieldInfo = Delta_FindFieldInfo( pInfo, token );
if( !pFieldInfo )
{
Con_DPrintf( S_ERROR "Delta_ParseField: unable to find field %s\n", token );
Con_DPrintf( S_ERROR "%s: unable to find field %s\n", __func__, token );
return false;
}
*delta_script = COM_ParseFile( *delta_script, token, sizeof( token ));
if( Q_strcmp( token, "," ))
{
Con_DPrintf( S_ERROR "Delta_ParseField: expected ',', found '%s' instead\n", token );
Con_DPrintf( S_ERROR "%s: expected ',', found '%s' instead\n", __func__, token );
return false;
}
@@ -692,14 +692,14 @@ static qboolean Delta_ParseField( char **delta_script, const delta_field_t *pInf
if( Q_strcmp( token, "," ))
{
Con_DPrintf( S_ERROR "Delta_ParseField: expected ',', found '%s' instead\n", token );
Con_DPrintf( S_ERROR "%s: expected ',', found '%s' instead\n", __func__, token );
return false;
}
// read delta-bits
if(( *delta_script = COM_ParseFile( *delta_script, token, sizeof( token ))) == NULL )
{
Con_DPrintf( S_ERROR "Delta_ParseField: %s field bits argument is missing\n", pField->name );
Con_DPrintf( S_ERROR "%s: %s field bits argument is missing\n", __func__, pField->name );
return false;
}
@@ -708,14 +708,14 @@ static qboolean Delta_ParseField( char **delta_script, const delta_field_t *pInf
*delta_script = COM_ParseFile( *delta_script, token, sizeof( token ));
if( Q_strcmp( token, "," ))
{
Con_DPrintf( S_ERROR "Delta_ParseField: expected ',', found '%s' instead\n", token );
Con_DPrintf( S_ERROR "%s: expected ',', found '%s' instead\n", __func__, token );
return false;
}
// read delta-multiplier
if(( *delta_script = COM_ParseFile( *delta_script, token, sizeof( token ))) == NULL )
{
Con_DPrintf( S_ERROR "Delta_ParseField: %s missing 'multiplier' argument\n", pField->name );
Con_DPrintf( S_ERROR "%s: %s missing 'multiplier' argument\n", __func__, pField->name );
return false;
}
@@ -726,14 +726,14 @@ static qboolean Delta_ParseField( char **delta_script, const delta_field_t *pInf
*delta_script = COM_ParseFile( *delta_script, token, sizeof( token ));
if( Q_strcmp( token, "," ))
{
Con_DPrintf( S_ERROR "Delta_ParseField: expected ',', found '%s' instead\n", token );
Con_DPrintf( S_ERROR "%s: expected ',', found '%s' instead\n", __func__, token );
return false;
}
// read delta-postmultiplier
if(( *delta_script = COM_ParseFile( *delta_script, token, sizeof( token ))) == NULL )
{
Con_DPrintf( S_ERROR "Delta_ParseField: %s missing 'post_multiply' argument\n", pField->name );
Con_DPrintf( S_ERROR "%s: %s missing 'post_multiply' argument\n", __func__, pField->name );
return false;
}
@@ -749,7 +749,7 @@ static qboolean Delta_ParseField( char **delta_script, const delta_field_t *pInf
*delta_script = COM_ParseFile( *delta_script, token, sizeof( token ));
if( Q_strcmp( token, ")" ))
{
Con_DPrintf( S_ERROR "Delta_ParseField: expected ')', found '%s' instead\n", token );
Con_DPrintf( S_ERROR "%s: expected ')', found '%s' instead\n", __func__, token );
return false;
}
@@ -823,7 +823,7 @@ static void Delta_InitFields( void )
delta_info_t *dt;
afile = FS_LoadFile( DELTA_PATH, NULL, false );
if( !afile ) Sys_Error( "DELTA_Load: couldn't load file %s\n", DELTA_PATH );
if( !afile ) Sys_Error( "%s: couldn't load file %s\n", __func__, DELTA_PATH );
pfile = (char *)afile;
@@ -1801,7 +1801,7 @@ void MSG_WriteDeltaEntity( entity_state_t *from, entity_state_t *to, sizebuf_t *
startBit = msg->iCurBit;
if( to->number < 0 || to->number >= GI->max_edicts )
Host_Error( "MSG_WriteDeltaEntity: Bad entity number: %i\n", to->number );
Host_Error( "%s: Bad entity number: %i\n", __func__, to->number );
MSG_WriteUBitLong( msg, to->number, MAX_ENTITY_BITS );
MSG_WriteUBitLong( msg, 0, 2 ); // alive
@@ -1882,7 +1882,7 @@ qboolean MSG_ReadDeltaEntity( sizebuf_t *msg, entity_state_t *from, entity_state
int baseline_offset = 0;
if( number < 0 || number >= clgame.maxEntities )
Host_Error( "MSG_ReadDeltaEntity: bad delta entity number: %i\n", number );
Host_Error( "%s: bad delta entity number: %i\n", __func__, number );
fRemoveType = MSG_ReadUBitLong( msg, 2 );
@@ -1904,7 +1904,7 @@ qboolean MSG_ReadDeltaEntity( sizebuf_t *msg, entity_state_t *from, entity_state
return false;
}
Host_Error( "MSG_ReadDeltaEntity: unknown update type %i\n", fRemoveType );
Host_Error( "%s: unknown update type %i\n", __func__, fRemoveType );
}
if( !cls.legacymode )
@@ -2003,13 +2003,13 @@ void GAME_EXPORT Delta_AddEncoder( char *name, pfnDeltaEncode encodeFunc )
if( !dt || !dt->bInitialized )
{
Con_DPrintf( S_ERROR "Delta_AddEncoder: couldn't find delta with specified custom encode %s\n", name );
Con_DPrintf( S_ERROR "%s: couldn't find delta with specified custom encode %s\n", __func__, name );
return;
}
if( dt->customEncode == CUSTOM_NONE )
{
Con_DPrintf( S_ERROR "Delta_AddEncoder: %s not supposed for custom encoding\n", dt->pName );
Con_DPrintf( S_ERROR "%s: %s not supposed for custom encoding\n", __func__, dt->pName );
return;
}

View File

@@ -544,7 +544,7 @@ static net_gai_state_t NET_StringToSockaddr( const char *s, struct sockaddr_stor
}
else // failed to create thread
{
Con_Reportf( S_ERROR "NET_StringToSockaddr: failed to create thread!\n");
Con_Reportf( S_ERROR "%s: failed to create thread!\n", __func__ );
nsthread.busy = false;
}
}
@@ -937,7 +937,7 @@ qboolean NET_CompareAdr( const netadr_t a, const netadr_t b )
return true;
}
Con_DPrintf( S_ERROR "NET_CompareAdr: bad address type\n" );
Con_DPrintf( S_ERROR "%s: bad address type\n", __func__ );
return false;
}
@@ -1397,7 +1397,7 @@ static qboolean NET_GetLong( byte *pData, int size, size_t *outSize, int splitsi
}
else
{
Con_DPrintf( "NET_GetLong: Ignoring duplicated split packet %i of %i ( %i bytes )\n", packet_number + 1, packet_count, size );
Con_DPrintf( "%s: Ignoring duplicated split packet %i of %i ( %i bytes )\n", __func__, packet_number + 1, packet_count, size );
}
offset = (packet_number * body_size);
@@ -1478,7 +1478,7 @@ static qboolean NET_QueuePacket( netsrc_t sock, netadr_t *from, byte *data, size
}
else
{
Con_Reportf( "NET_QueuePacket: oversize packet from %s\n", NET_AdrToString( *from ));
Con_Reportf( "%s: oversize packet from %s\n", __func__, NET_AdrToString( *from ));
}
}
else
@@ -1494,7 +1494,7 @@ static qboolean NET_QueuePacket( netsrc_t sock, netadr_t *from, byte *data, size
case WSAETIMEDOUT:
break;
default: // let's continue even after errors
Con_DPrintf( S_ERROR "NET_QueuePacket: %s from %s\n", NET_ErrorString(), NET_AdrToString( *from ));
Con_DPrintf( S_ERROR "%s: %s from %s\n", __func__, NET_ErrorString(), NET_AdrToString( *from ));
break;
}
}
@@ -1624,7 +1624,7 @@ void NET_SendPacketEx( netsrc_t sock, size_t length, const void *data, netadr_t
}
else
{
Host_Error( "NET_SendPacket: bad address type %i (%i)\n", to.type, to.type6 );
Host_Error( "%s: bad address type %i (%i)\n", __func__, to.type, to.type6 );
}
NET_NetadrToSockadr( &to, &addr );
@@ -1645,15 +1645,15 @@ void NET_SendPacketEx( netsrc_t sock, size_t length, const void *data, netadr_t
if( Host_IsDedicated( ))
{
Con_DPrintf( S_ERROR "NET_SendPacket: %s to %s\n", NET_ErrorString(), NET_AdrToString( to ));
Con_DPrintf( S_ERROR "%s: %s to %s\n", __func__, NET_ErrorString(), NET_AdrToString( to ));
}
else if( err == WSAEADDRNOTAVAIL || err == WSAENOBUFS )
{
Con_DPrintf( S_ERROR "NET_SendPacket: %s to %s\n", NET_ErrorString(), NET_AdrToString( to ));
Con_DPrintf( S_ERROR "%s: %s to %s\n", __func__, NET_ErrorString(), NET_AdrToString( to ));
}
else
{
Con_Printf( S_ERROR "NET_SendPacket: %s to %s\n", NET_ErrorString(), NET_AdrToString( to ));
Con_Printf( S_ERROR "%s: %s to %s\n", __func__, NET_ErrorString(), NET_AdrToString( to ));
}
}
@@ -1689,7 +1689,7 @@ static int NET_IPSocket( const char *net_iface, int port, int family )
{
err = WSAGetLastError();
if( err != WSAEAFNOSUPPORT )
Con_DPrintf( S_WARN "NET_UDPSocket: port: %d socket: %s\n", port, NET_ErrorString( ));
Con_DPrintf( S_WARN "%s: port: %d socket: %s\n", __func__, port, NET_ErrorString( ));
return INVALID_SOCKET;
}
@@ -1697,7 +1697,7 @@ static int NET_IPSocket( const char *net_iface, int port, int family )
{
struct timeval timeout;
Con_DPrintf( S_WARN "NET_UDPSocket: port: %d ioctl FIONBIO: %s\n", port, NET_ErrorString( ));
Con_DPrintf( S_WARN "%s: port: %d ioctl FIONBIO: %s\n", __func__, port, NET_ErrorString( ));
// try timeout instead of NBIO
timeout.tv_sec = timeout.tv_usec = 0;
setsockopt( net_socket, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));
@@ -1706,12 +1706,12 @@ static int NET_IPSocket( const char *net_iface, int port, int family )
// make it broadcast capable
if( NET_IsSocketError( setsockopt( net_socket, SOL_SOCKET, SO_BROADCAST, (char *)&_true, sizeof( _true ))))
{
Con_DPrintf( S_WARN "NET_UDPSocket: port: %d setsockopt SO_BROADCAST: %s\n", port, NET_ErrorString( ));
Con_DPrintf( S_WARN "%s: port: %d setsockopt SO_BROADCAST: %s\n", __func__, port, NET_ErrorString( ));
}
if( NET_IsSocketError( setsockopt( net_socket, SOL_SOCKET, SO_REUSEADDR, (const char *)&optval, sizeof( optval ))))
{
Con_DPrintf( S_WARN "NET_UDPSocket: port: %d setsockopt SO_REUSEADDR: %s\n", port, NET_ErrorString( ));
Con_DPrintf( S_WARN "%s: port: %d setsockopt SO_REUSEADDR: %s\n", __func__, port, NET_ErrorString( ));
closesocket( net_socket );
return INVALID_SOCKET;
}
@@ -1722,7 +1722,7 @@ static int NET_IPSocket( const char *net_iface, int port, int family )
{
if( NET_IsSocketError( setsockopt( net_socket, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&_true, sizeof( _true ))))
{
Con_DPrintf( S_WARN "NET_UDPSocket: port: %d setsockopt IPV6_V6ONLY: %s\n", port, NET_ErrorString( ));
Con_DPrintf( S_WARN "%s: port: %d setsockopt IPV6_V6ONLY: %s\n", __func__, port, NET_ErrorString( ));
closesocket( net_socket );
return INVALID_SOCKET;
}
@@ -1730,7 +1730,7 @@ static int NET_IPSocket( const char *net_iface, int port, int family )
if( Sys_CheckParm( "-loopback" ))
{
if( NET_IsSocketError( setsockopt( net_socket, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (char *)&_true, sizeof( _true ))))
Con_DPrintf( S_WARN "NET_UDPSocket: port %d setsockopt IPV6_MULTICAST_LOOP: %s\n", port, NET_ErrorString( ));
Con_DPrintf( S_WARN "%s: port %d setsockopt IPV6_MULTICAST_LOOP: %s\n", __func__, port, NET_ErrorString( ));
}
if( COM_CheckStringEmpty( net_iface ) && Q_stricmp( net_iface, "localhost" ))
@@ -1742,7 +1742,7 @@ static int NET_IPSocket( const char *net_iface, int port, int family )
if( NET_IsSocketError( bind( net_socket, (struct sockaddr *)&addr, sizeof( struct sockaddr_in6 ))))
{
Con_DPrintf( S_WARN "NET_UDPSocket: port: %d bind6: %s\n", port, NET_ErrorString( ));
Con_DPrintf( S_WARN "%s: port: %d bind6: %s\n", __func__, port, NET_ErrorString( ));
closesocket( net_socket );
return INVALID_SOCKET;
}
@@ -1758,7 +1758,7 @@ static int NET_IPSocket( const char *net_iface, int port, int family )
{
err = WSAGetLastError();
if( err != WSAENOPROTOOPT )
Con_Printf( S_WARN "NET_UDPSocket: port: %d setsockopt IP_TOS: %s\n", port, NET_ErrorString( ));
Con_Printf( S_WARN "%s: port: %d setsockopt IP_TOS: %s\n", __func__, port, NET_ErrorString( ));
closesocket( net_socket );
return INVALID_SOCKET;
}
@@ -1767,7 +1767,7 @@ static int NET_IPSocket( const char *net_iface, int port, int family )
if( Sys_CheckParm( "-loopback" ))
{
if( NET_IsSocketError( setsockopt( net_socket, IPPROTO_IP, IP_MULTICAST_LOOP, (char *)&_true, sizeof( _true ))))
Con_DPrintf( S_WARN "NET_UDPSocket: port %d setsockopt IP_MULTICAST_LOOP: %s\n", port, NET_ErrorString( ));
Con_DPrintf( S_WARN "%s: port %d setsockopt IP_MULTICAST_LOOP: %s\n", __func__, port, NET_ErrorString( ));
}
if( COM_CheckStringEmpty( net_iface ) && Q_stricmp( net_iface, "localhost" ))
@@ -1779,7 +1779,7 @@ static int NET_IPSocket( const char *net_iface, int port, int family )
if( NET_IsSocketError( bind( net_socket, (struct sockaddr *)&addr, sizeof( struct sockaddr_in ))))
{
Con_DPrintf( S_WARN "NET_UDPSocket: port: %d bind: %s\n", port, NET_ErrorString( ));
Con_DPrintf( S_WARN "%s: port: %d bind: %s\n", __func__, port, NET_ErrorString( ));
closesocket( net_socket );
return INVALID_SOCKET;
}
@@ -1796,8 +1796,8 @@ NET_OpenIP
static void NET_OpenIP( qboolean change_port, int *sockets, const char *net_iface, int hostport, int clientport, int family )
{
int port;
qboolean sv_nat = Cvar_VariableInteger("sv_nat");
qboolean cl_nat = Cvar_VariableInteger("cl_nat");
qboolean sv_nat = Cvar_VariableInteger( "sv_nat" );
qboolean cl_nat = Cvar_VariableInteger( "cl_nat" );
if( change_port && ( FBitSet( net_hostport.flags, FCVAR_CHANGED ) || sv_nat ))
{

View File

@@ -70,7 +70,6 @@ GNU General Public License for more details.
#define NET_MAX_MESSAGE PAD_NUMBER(( NET_MAX_PAYLOAD + HEADER_BYTES ), 16 )
#define MASTERSERVER_ADR "mentality.rip:27010"
#define MASTERSERVER_ADR_TEST "mentality.rip:27011"
#define MS_SCAN_REQUEST "1\xFF" "0.0.0.0:0\0"
#define PORT_MASTER 27010

View File

@@ -246,7 +246,7 @@ loc0:
}
if( num < hull->firstclipnode || num > hull->lastclipnode )
Host_Error( "PM_RecursiveHullCheck: bad node number %i\n", num );
Host_Error( "%s: bad node number %i\n", __func__, num );
// find the point distances
node = hull->clipnodes + num;

View File

@@ -279,6 +279,7 @@ GNU General Public License for more details.
extern const char *svc_strings[svc_lastmsg+1];
extern const char *svc_legacy_strings[svc_lastmsg+1];
extern const char *svc_quake_strings[svc_lastmsg+1];
extern const char *svc_goldsrc_strings[svc_lastmsg+1];
extern const char *clc_strings[clc_lastmsg+1];

View File

@@ -120,7 +120,7 @@ load_internal:
}
if( filename[0] != '#' )
Con_DPrintf( S_WARN "FS_LoadSound: couldn't load \"%s\"\n", loadname );
Con_DPrintf( S_WARN "%s: couldn't load \"%s\"\n", __func__, loadname );
return NULL;
}

View File

@@ -94,7 +94,7 @@ static qboolean Sound_ParseID3Frame( const did3v2_frame_t *frame, const byte *bu
value_len = frame_length - (1 + key_len + 1);
if( value_len <= 0 || value_len >= sizeof( value ))
{
Con_Printf( S_ERROR "Sound_ParseID3Frame: invalid TXXX description, possibly broken file.\n" );
Con_Printf( S_ERROR "%s: invalid TXXX description, possibly broken file.\n", __func__ );
return false;
}
@@ -106,9 +106,9 @@ static qboolean Sound_ParseID3Frame( const did3v2_frame_t *frame, const byte *bu
else
{
if( buffer[0] == 0x01 || buffer[0] == 0x02 ) // UTF-16 with BOM
Con_Printf( S_ERROR "Sound_ParseID3Frame: UTF-16 encoding is unsupported. Use UTF-8 or ISO-8859!\n" );
Con_Printf( S_ERROR "%s: UTF-16 encoding is unsupported. Use UTF-8 or ISO-8859!\n", __func__ );
else
Con_Printf( S_ERROR "Sound_ParseID3Frame: unknown TXXX tag encoding %d, possibly broken file.\n", buffer[0] );
Con_Printf( S_ERROR "%s: unknown TXXX tag encoding %d, possibly broken file.\n", __func__, buffer[0] );
return false;
}
}
@@ -132,7 +132,7 @@ static qboolean Sound_ParseID3Tag( const byte *buffer, fs_offset_t filesize )
{
// old id3v1 header found
if( CHECK_IDENT( header->ident, 'T', 'A', 'G' ))
Con_Printf( S_ERROR "Sound_ParseID3Tag: ID3v1 is not supported! Convert to ID3v2.4!\n" );
Con_Printf( S_ERROR "%s: ID3v1 is not supported! Convert to ID3v2.4!\n", __func__ );
return true; // missing tag header is not an error
}
@@ -140,14 +140,14 @@ static qboolean Sound_ParseID3Tag( const byte *buffer, fs_offset_t filesize )
// support only latest id3 v2.4
if( header->major_ver != 4 || header->minor_ver == 0xff )
{
Con_Printf( S_ERROR "Sound_ParseID3Tag: invalid ID3v2 tag version 2.%d.%d. Convert to ID3v2.4!\n", header->major_ver, header->minor_ver );
Con_Printf( S_ERROR "%s: invalid ID3v2 tag version 2.%d.%d. Convert to ID3v2.4!\n", __func__, header->major_ver, header->minor_ver );
return false;
}
tag_length = Sound_ParseSynchInteger( header->length );
if( tag_length > filesize - sizeof( *header ))
{
Con_Printf( S_ERROR "Sound_ParseID3Tag: invalid tag length %u, possibly broken file.\n", tag_length );
Con_Printf( S_ERROR "%s: invalid tag length %u, possibly broken file.\n", __func__, tag_length );
return false;
}
@@ -159,7 +159,7 @@ static qboolean Sound_ParseID3Tag( const byte *buffer, fs_offset_t filesize )
if( ext_length > tag_length )
{
Con_Printf( S_ERROR "Sound_ParseID3Tag: invalid extended header length %u, possibly broken file.\n", ext_length );
Con_Printf( S_ERROR "%s: invalid extended header length %u, possibly broken file.\n", __func__, ext_length );
return false;
}
@@ -173,7 +173,7 @@ static qboolean Sound_ParseID3Tag( const byte *buffer, fs_offset_t filesize )
if( frame_length > tag_length )
{
Con_Printf( S_ERROR "Sound_ParseID3Tag: invalid frame length %u, possibly broken file.\n", frame_length );
Con_Printf( S_ERROR "%s: invalid frame length %u, possibly broken file.\n", __func__, frame_length );
return false;
}
@@ -228,7 +228,7 @@ qboolean Sound_LoadMPG( const char *name, const byte *buffer, fs_offset_t filesi
// trying to read header
if( !feed_mpeg_header( mpeg, buffer, FRAME_SIZE, filesize, &sc ))
{
Con_DPrintf( S_ERROR "Sound_LoadMPG: failed to load (%s): %s\n", name, get_error( mpeg ));
Con_DPrintf( S_ERROR "%s: failed to load (%s): %s\n", __func__, name, get_error( mpeg ));
close_decoder( mpeg );
return false;
}
@@ -242,13 +242,13 @@ qboolean Sound_LoadMPG( const char *name, const byte *buffer, fs_offset_t filesi
if( !Sound_ParseID3Tag( buffer, filesize ))
{
Con_DPrintf( S_WARN "Sound_LoadMPG: (%s) failed to extract LOOP_START tag\n", name );
Con_DPrintf( S_WARN "%s: (%s) failed to extract LOOP_START tag\n", __func__, name );
}
if( !sound.size )
{
// bad mpeg file ?
Con_DPrintf( S_ERROR "Sound_LoadMPG: (%s) is probably corrupted\n", name );
Con_DPrintf( S_ERROR "%s: (%s) is probably corrupted\n", __func__, name );
close_decoder( mpeg );
return false;
}
@@ -325,7 +325,7 @@ stream_t *Stream_OpenMPG( const char *filename )
// couldn't create decoder
if(( mpeg = create_decoder( &ret )) == NULL )
{
Con_DPrintf( S_ERROR "Stream_OpenMPG: couldn't create decoder: %s\n", get_error( mpeg ) );
Con_DPrintf( S_ERROR "%s: couldn't create decoder: %s\n", __func__, get_error( mpeg ) );
Mem_Free( stream );
FS_Close( file );
return NULL;
@@ -336,7 +336,7 @@ stream_t *Stream_OpenMPG( const char *filename )
// trying to open stream and read header
if( !open_mpeg_stream( mpeg, file, FS_ReadMpg, FS_SeekMpg, &sc ))
{
Con_DPrintf( S_ERROR "Stream_OpenMPG: failed to load (%s): %s\n", filename, get_error( mpeg ));
Con_DPrintf( S_ERROR "%s: failed to load (%s): %s\n", __func__, filename, get_error( mpeg ));
close_decoder( mpeg );
Mem_Free( stream );
FS_Close( file );

View File

@@ -504,12 +504,12 @@ static qboolean Sound_ResampleInternal( wavdata_t *sc, int inrate, int inwidth,
if( handled )
{
if( t2 - t1 > 0.01f ) // critical, report to mod developer
Con_Printf( S_WARN "Sound_Resample: from [%d bit %d Hz] to [%d bit %d Hz] (took %.3fs)\n", inwidth * 8, inrate, outwidth * 8, outrate, t2 - t1 );
Con_Printf( S_WARN "%s: from [%d bit %d Hz] to [%d bit %d Hz] (took %.3fs)\n", __func__, inwidth * 8, inrate, outwidth * 8, outrate, t2 - t1 );
else
Con_Reportf( "Sound_Resample: from [%d bit %d Hz] to [%d bit %d Hz] (took %.3fs)\n", inwidth * 8, inrate, outwidth * 8, outrate, t2 - t1 );
Con_Reportf( "%s: from [%d bit %d Hz] to [%d bit %d Hz] (took %.3fs)\n", __func__, inwidth * 8, inrate, outwidth * 8, outrate, t2 - t1 );
}
else
Con_Printf( S_ERROR "Sound_Resample: unsupported from [%d bit %d Hz] to [%d bit %d Hz]\n", inwidth * 8, inrate, outwidth * 8, outrate );
Con_Printf( S_ERROR "%s: unsupported from [%d bit %d Hz] to [%d bit %d Hz]\n", __func__, inwidth * 8, inrate, outwidth * 8, outrate );
sc->rate = outrate;
sc->width = outwidth;

View File

@@ -104,7 +104,7 @@ static void FindNextChunk( const char *filename, const char *name )
|| IsFourCC( iff_lastChunk, "LIST" )
|| IsFourCC( iff_lastChunk, "data" ))
{
Con_DPrintf( "%s: '%s' truncated by %i bytes\n", __func__, filename, iff_chunkLen - remaining );
Con_DPrintf( "%s: '%s' truncated by %zi bytes\n", __func__, filename, iff_chunkLen - remaining );
}
iff_chunkLen = remaining;
}
@@ -188,7 +188,7 @@ qboolean Sound_LoadWAV( const char *name, const byte *buffer, fs_offset_t filesi
if( !iff_dataPtr || !IsFourCC( iff_dataPtr + 8, "WAVE" ))
{
Con_DPrintf( S_ERROR "Sound_LoadWAV: %s missing 'RIFF/WAVE' chunks\n", name );
Con_DPrintf( S_ERROR "%s: %s missing 'RIFF/WAVE' chunks\n", __func__, name );
return false;
}
@@ -198,7 +198,7 @@ qboolean Sound_LoadWAV( const char *name, const byte *buffer, fs_offset_t filesi
if( !iff_dataPtr )
{
Con_DPrintf( S_ERROR "Sound_LoadWAV: %s missing 'fmt ' chunk\n", name );
Con_DPrintf( S_ERROR "%s: %s missing 'fmt ' chunk\n", __func__, name );
return false;
}
@@ -209,7 +209,7 @@ qboolean Sound_LoadWAV( const char *name, const byte *buffer, fs_offset_t filesi
{
if( fmt != 85 )
{
Con_DPrintf( S_ERROR "Sound_LoadWAV: %s not a microsoft PCM format\n", name );
Con_DPrintf( S_ERROR "%s: %s not a microsoft PCM format\n", __func__, name );
return false;
}
else
@@ -222,7 +222,7 @@ qboolean Sound_LoadWAV( const char *name, const byte *buffer, fs_offset_t filesi
sound.channels = GetLittleShort();
if( sound.channels != 1 && sound.channels != 2 )
{
Con_DPrintf( S_ERROR "Sound_LoadWAV: only mono and stereo WAV files supported (%s)\n", name );
Con_DPrintf( S_ERROR "%s: only mono and stereo WAV files supported (%s)\n", __func__, name );
return false;
}
@@ -234,7 +234,7 @@ qboolean Sound_LoadWAV( const char *name, const byte *buffer, fs_offset_t filesi
if( sound.width != 1 && sound.width != 2 )
{
Con_DPrintf( S_ERROR "Sound_LoadWAV: only 8 and 16 bit WAV files supported (%s)\n", name );
Con_DPrintf( S_ERROR "%s: only 8 and 16 bit WAV files supported (%s)\n", __func__, name );
return false;
}
@@ -269,7 +269,7 @@ qboolean Sound_LoadWAV( const char *name, const byte *buffer, fs_offset_t filesi
if( !iff_dataPtr )
{
Con_DPrintf( S_ERROR "Sound_LoadWAV: %s missing 'data' chunk\n", name );
Con_DPrintf( S_ERROR "%s: %s missing 'data' chunk\n", __func__, name );
return false;
}
@@ -280,7 +280,7 @@ qboolean Sound_LoadWAV( const char *name, const byte *buffer, fs_offset_t filesi
{
if( samples < sound.samples )
{
Con_DPrintf( S_ERROR "Sound_LoadWAV: %s has a bad loop length\n", name );
Con_DPrintf( S_ERROR "%s: %s has a bad loop length\n", __func__, name );
return false;
}
}
@@ -288,7 +288,7 @@ qboolean Sound_LoadWAV( const char *name, const byte *buffer, fs_offset_t filesi
if( sound.samples <= 0 )
{
Con_Reportf( S_ERROR "Sound_LoadWAV: file with %i samples (%s)\n", sound.samples, name );
Con_Reportf( S_ERROR "%s: file with %i samples (%s)\n", __func__, sound.samples, name );
return false;
}
@@ -360,7 +360,7 @@ stream_t *Stream_OpenWAV( const char *filename )
// find "RIFF" chunk
if( !StreamFindNextChunk( file, "RIFF", &last_chunk ))
{
Con_DPrintf( S_ERROR "Stream_OpenWAV: %s missing RIFF chunk\n", filename );
Con_DPrintf( S_ERROR "%s: %s missing RIFF chunk\n", __func__, filename );
FS_Close( file );
return NULL;
}
@@ -369,14 +369,14 @@ stream_t *Stream_OpenWAV( const char *filename )
if( FS_Read( file, chunkName, 4 ) != 4 )
{
Con_DPrintf( S_ERROR "%s: %s missing WAVE chunk, truncated\n", filename );
Con_DPrintf( S_ERROR "%s: %s missing WAVE chunk, truncated\n", __func__, filename );
FS_Close( file );
return false;
}
if( !IsFourCC( chunkName, "WAVE" ))
{
Con_DPrintf( S_ERROR "Stream_OpenWAV: %s missing WAVE chunk\n", filename );
Con_DPrintf( S_ERROR "%s: %s missing WAVE chunk\n", __func__, filename );
FS_Close( file );
return NULL;
}
@@ -386,7 +386,7 @@ stream_t *Stream_OpenWAV( const char *filename )
last_chunk = iff_data;
if( !StreamFindNextChunk( file, "fmt ", &last_chunk ))
{
Con_DPrintf( S_ERROR "Stream_OpenWAV: %s missing 'fmt ' chunk\n", filename );
Con_DPrintf( S_ERROR "%s: %s missing 'fmt ' chunk\n", __func__, filename );
FS_Close( file );
return NULL;
}
@@ -396,7 +396,7 @@ stream_t *Stream_OpenWAV( const char *filename )
FS_Read( file, &t, sizeof( t ));
if( t != 1 )
{
Con_DPrintf( S_ERROR "Stream_OpenWAV: %s not a microsoft PCM format\n", filename );
Con_DPrintf( S_ERROR "%s: %s not a microsoft PCM format\n", __func__, filename );
FS_Close( file );
return NULL;
}
@@ -417,7 +417,7 @@ stream_t *Stream_OpenWAV( const char *filename )
last_chunk = iff_data;
if( !StreamFindNextChunk( file, "data", &last_chunk ))
{
Con_DPrintf( S_ERROR "Stream_OpenWAV: %s missing 'data' chunk\n", filename );
Con_DPrintf( S_ERROR "%s: %s missing 'data' chunk\n", __func__, filename );
FS_Close( file );
return NULL;
}

View File

@@ -89,7 +89,7 @@ char *Sys_Input( void )
void Sys_DestroyConsole( void )
{
// last text message into console or log
Con_Reportf( "Sys_DestroyConsole: Exiting!\n" );
Con_Reportf( "%s: Exiting!\n", __func__ );
#if XASH_WIN32
Wcon_DestroyConsole();
#endif

View File

@@ -181,27 +181,6 @@ void Sys_ParseCommandLine( int argc, char** argv )
}
}
/*
==================
Sys_MergeCommandLine
==================
*/
void Sys_MergeCommandLine( void )
{
const char *blank = "censored";
int i;
if( !host.change_game ) return;
for( i = 0; i < host.argc; i++ )
{
// second call
if( Host_IsDedicated() && !Q_strnicmp( "+menu_", host.argv[i], 6 ))
host.argv[i] = (char *)blank;
}
}
/*
================
Sys_CheckParm
@@ -289,7 +268,7 @@ qboolean Sys_LoadLibrary( dll_info_t *dll )
if( !dll->name || !*dll->name )
return false; // nothing to load
Con_Reportf( "Sys_LoadLibrary: Loading %s", dll->name );
Con_Reportf( "%s: Loading %s", __func__, dll->name );
if( dll->fcts )
{
@@ -346,10 +325,10 @@ qboolean Sys_FreeLibrary( dll_info_t *dll )
if( host.status == HOST_CRASHED )
{
// we need to hold down all modules, while MSVC can find error
Con_Reportf( "Sys_FreeLibrary: hold %s for debugging\n", dll->name );
Con_Reportf( "%s: hold %s for debugging\n", __func__, dll->name );
return false;
}
else Con_Reportf( "Sys_FreeLibrary: Unloading %s\n", dll->name );
else Con_Reportf( "%s: Unloading %s\n", __func__, dll->name );
COM_FreeLibrary( dll->link );
dll->link = NULL;
@@ -401,7 +380,7 @@ void Sys_Warn( const char *format, ... )
Sys_DebugBreak();
Msg( "Sys_Warn: %s\n", text );
Msg( "%s: %s\n", __func__, text );
if( !Host_IsDedicated() ) // dedicated server should not hang on messagebox
Platform_MessageBox( "Xash Warning", text, true );

View File

@@ -53,7 +53,6 @@ qboolean Sys_LoadLibrary( dll_info_t *dll );
void* Sys_GetProcAddress( dll_info_t *dll, const char* name );
qboolean Sys_FreeLibrary( dll_info_t *dll );
void Sys_ParseCommandLine( int argc, char **argv );
void Sys_MergeCommandLine( void );
void Sys_SetupCrashHandler( void );
void Sys_RestoreCrashHandler( void );
void Sys_DebugBreak( void );

View File

@@ -89,7 +89,7 @@ static mempool_t *Mem_FindPool( poolhandle_t poolptr )
if( likely( poolptr > 0 && poolptr <= poolcount ))
return &poolchain[poolptr - 1];
Sys_Error( "%s: not allocated or double freed pool %d", __FUNCTION__, poolptr );
Sys_Error( "%s: not allocated or double freed pool %d", __func__, poolptr );
return NULL;
}
@@ -234,7 +234,7 @@ void _Mem_Free( void *data, const char *filename, int fileline )
{
if( data == NULL )
{
Sys_Error( "Mem_Free: data == NULL (called at %s:%i)\n", filename, fileline );
Sys_Error( "%s: data == NULL (called at %s:%i)\n", __func__, filename, fileline );
return;
}
@@ -253,7 +253,7 @@ void *_Mem_Realloc( poolhandle_t poolptr, void *data, size_t size, qboolean clea
if( unlikely( !poolptr ))
{
Sys_Error( "Mem_Realloc: pool == NULL (alloc at %s:%i)\n", filename, fileline );
Sys_Error( "%s: pool == NULL (alloc at %s:%i)\n", __func__, filename, fileline );
return NULL;
}
@@ -267,8 +267,8 @@ void *_Mem_Realloc( poolhandle_t poolptr, void *data, size_t size, qboolean clea
if( unlikely( mem->poolptr != poolptr ))
{
Sys_Error( "Mem_Realloc: pool migration is not allowed (alloc at %s:%i, realloc at %s:%i)\n",
Mem_CheckFilename( mem->filename ), mem->fileline, filename, fileline );
Sys_Error( "%s: pool migration is not allowed (alloc at %s:%i, realloc at %s:%i)\n",
__func__, Mem_CheckFilename( mem->filename ), mem->fileline, filename, fileline );
return NULL;
}
@@ -283,7 +283,7 @@ void *_Mem_Realloc( poolhandle_t poolptr, void *data, size_t size, qboolean clea
if( mem == NULL )
{
Sys_Error( "Mem_Realloc: out of memory (alloc size %s at %s:%i)\n", Q_memprint( size ), filename, fileline );
Sys_Error( "%s: out of memory (alloc size %s at %s:%i)\n", __func__, Q_memprint( size ), filename, fileline );
return NULL;
}
@@ -338,7 +338,7 @@ poolhandle_t _Mem_AllocPool( const char *name, const char *filename, int filelin
pool = (mempool_t *)Q_realloc( poolchain, sizeof( *poolchain ) * ( poolcount + 1 ));
if( pool == NULL )
{
Sys_Error( "Mem_AllocPool: out of memory (allocpool at %s:%i)\n", filename, fileline );
Sys_Error( "%s: out of memory (allocpool at %s:%i)\n", __func__, filename, fileline );
return 0;
}
@@ -355,7 +355,7 @@ void _Mem_FreePool( poolhandle_t *poolptr, const char *filename, int fileline )
{
if( !pool->filename )
{
Sys_Error( "Mem_FreePool: pool already free (freepool at %s:%i)\n", filename, fileline );
Sys_Error( "%s: pool already free (freepool at %s:%i)\n", __func__, filename, fileline );
*poolptr = 0;
return;
}
@@ -377,7 +377,7 @@ void _Mem_EmptyPool( poolhandle_t poolptr, const char *filename, int fileline )
mempool_t *pool;
if( unlikely( !poolptr ))
{
Sys_Error( "Mem_EmptyPool: pool == NULL (emptypool at %s:%i)\n", filename, fileline );
Sys_Error( "%s: pool == NULL (emptypool at %s:%i)\n", __func__, filename, fileline );
return;
}
@@ -458,7 +458,7 @@ void Mem_PrintStats( void )
realsize += pool->realsize;
}
Con_Printf( "^3%lu^7 memory pools, totalling: ^1%s\n", count, Q_memprint( size ));
Con_Printf( "^3%zu^7 memory pools, totalling: ^1%s\n", count, Q_memprint( size ));
Con_Printf( "total allocated size: ^1%s\n", Q_memprint( realsize ));
}

View File

@@ -19,6 +19,7 @@ GNU General Public License for more details.
#include "cvardef.h"
#include "gameinfo.h"
#include "wrect.h"
#include "net_api.h"
// a macro for mainui_cpp, indicating that mainui should be compiled for
// Xash3D 1.0 interface
@@ -216,6 +217,7 @@ typedef struct ui_extendedfuncs_s {
const char *(*pfnAdrToString)( const struct netadr_s a );
int (*pfnCompareAdr)( const void *a, const void *b ); // netadr_t
void *(*pfnGetNativeObject)( const char *name );
struct net_api_s *pNetAPI;
} ui_extendedfuncs_t;
// deprecated export from old engine

View File

@@ -35,24 +35,24 @@ void *ANDROID_LoadLibrary( const char *dllname )
continue;
Q_snprintf( path, MAX_SYSPATH, "%s/lib%s."OS_LIB_EXT, libdir[i], dllname );
pHandle = dlopen( path, RTLD_LAZY );
pHandle = dlopen( path, RTLD_NOW );
if( pHandle )
return pHandle;
COM_PushLibraryError( dlerror() );
}
// HACKHACK: keep old behaviour for compability
// HACKHACK: keep old behaviour for compatibility
if( Q_strstr( dllname, "." OS_LIB_EXT ) || Q_strstr( dllname, "/" ))
{
pHandle = dlopen( dllname, RTLD_LAZY );
pHandle = dlopen( dllname, RTLD_NOW );
if( pHandle )
return pHandle;
}
else
{
Q_snprintf( path, MAX_SYSPATH, "lib%s."OS_LIB_EXT, dllname );
pHandle = dlopen( path, RTLD_LAZY );
pHandle = dlopen( path, RTLD_NOW );
if( pHandle )
return pHandle;
}

View File

@@ -89,7 +89,7 @@ rserr_t R_ChangeDisplaySettings( int width, int height, window_mode_t window_m
render_w = width;
render_h = height;
Con_Reportf( "R_ChangeDisplaySettings: forced resolution to %dx%d)\n", width, height );
Con_Reportf( "%s: forced resolution to %dx%d)\n", __func__, width, height );
if( ref.dllFuncs.R_SetDisplayTransform( rotate, 0, 0, vid_scale->value, vid_scale->value ) )
{

View File

@@ -272,7 +272,7 @@ void Evdev_OpenDevice ( const char *path )
ret = open( path, O_RDONLY | O_NONBLOCK );
if( ret < 0 )
{
Con_Reportf( S_ERROR "Could not open input device %s: %s\n", path, strerror( errno ) );
Con_Reportf( S_ERROR "Could not open input device %s: %s\n", path, strerror( errno ) );
return;
}
Con_Printf( "Input device #%d: %s opened sucessfully\n", evdev.devices, path );

View File

@@ -117,7 +117,7 @@ qboolean VID_SetMode( void )
return true;
}
rserr_t R_ChangeDisplaySettings( int width, int height, window_mode_t window_mode )
rserr_t R_ChangeDisplaySettings( int width, int height, window_mode_t window_mode )
{
int render_w, render_h;
@@ -126,7 +126,7 @@ rserr_t R_ChangeDisplaySettings( int width, int height, window_mode_t window_m
render_w = width;
render_h = height;
Con_Reportf( "R_ChangeDisplaySettings: forced resolution to %dx%d)\n", width, height );
Con_Reportf( "%s: forced resolution to %dx%d)\n", __func__, width, height );
VID_SetDisplayTransform( &render_w, &render_h );
R_SaveVideoMode( width, height, render_w, render_h );

View File

@@ -20,19 +20,19 @@ GNU General Public License for more details.
void *dlsym(void *handle, const char *symbol )
{
Con_DPrintf( "dlsym( %p, \"%s\" ): stub\n", handle, symbol );
Con_DPrintf( "%s( %p, \"%s\" ): stub\n", __func__, handle, symbol );
return NULL;
}
void *dlopen(const char *name, int flag )
{
Con_DPrintf( "dlopen( \"%s\", %d ): stub\n", name, flag );
Con_DPrintf( "%s( \"%s\", %d ): stub\n", __func__, name, flag );
return NULL;
}
int dlclose(void *handle)
{
Con_DPrintf( "dlsym( %p ): stub\n", handle );
Con_DPrintf( "%s( %p ): stub\n", __func__, handle );
return 0;
}

View File

@@ -113,12 +113,12 @@ void userAppExit( void )
void NSwitch_Init( void )
{
printf( "NSwitch_Init\n" );
printf( "%s\n", __func__ );
}
void NSwitch_Shutdown( void )
{
printf( "NSwitch_Shutdown\n" );
printf( "%s\n", __func__ );
// force deinit everything SDL-related to avoid issues with changing games
if ( SDL_WasInit( 0 ) )
SDL_Quit( );

View File

@@ -69,7 +69,7 @@ void Android_Shutdown( void );
#endif
#if XASH_WIN32
void Wcon_CreateConsole( void );
void Wcon_CreateConsole( qboolean con_showalways );
void Wcon_DestroyConsole( void );
#endif
@@ -97,7 +97,7 @@ void Linux_Shutdown( void );
void Linux_SetTimer( float time );
#endif
static inline void Platform_Init( void )
static inline void Platform_Init( qboolean con_showalways )
{
#if XASH_POSIX
// daemonize as early as possible, because we need to close our file descriptors
@@ -117,7 +117,7 @@ static inline void Platform_Init( void )
#elif XASH_DOS
DOS_Init( );
#elif XASH_WIN32
Wcon_CreateConsole( );
Wcon_CreateConsole( con_showalways );
#elif XASH_LINUX
Linux_Init( );
#endif

View File

@@ -45,19 +45,19 @@ const char * Loader_GetFuncName_int( void *wm , void *func);
void *dlsym(void *handle, const char *symbol )
{
Con_DPrintf( "dlsym( %p, \"%s\" ): stub\n", handle, symbol );
Con_DPrintf( "%s( %p, \"%s\" ): stub\n", __func__, handle, symbol );
return NULL;
}
void *dlopen(const char *name, int flag )
{
Con_DPrintf( "dlopen( \"%s\", %d ): stub\n", name, flag );
Con_DPrintf( "%s( \"%s\", %d ): stub\n", __func__, name, flag );
return NULL;
}
int dlclose(void *handle)
{
Con_DPrintf( "dlsym( %p ): stub\n", handle );
Con_DPrintf( "%s( %p ): stub\n", __func__, handle );
return 0;
}

View File

@@ -96,8 +96,7 @@ void Platform_ShellExecute( const char *path, const char *parms )
void Posix_Daemonize( void )
{
// to be accessed later
if( ( host.daemonized = Sys_CheckParm( "-daemonize" ) ) )
if( Sys_CheckParm( "-daemonize" ))
{
#if XASH_POSIX && defined(_POSIX_VERSION) && !defined(XASH_MOBILE_PLATFORM)
pid_t daemon;

View File

@@ -156,21 +156,18 @@ static void SDLash_KeyEvent( SDL_KeyboardEvent key )
}
#endif
if( SDL_IsTextInputActive( ))
if( SDL_IsTextInputActive( ) && down )
{
// this is how engine understands ctrl+c, ctrl+v and other hotkeys
if( down && cls.key_dest != key_game )
if( cls.key_dest != key_game && FBitSet( SDL_GetModState(), KMOD_CTRL ))
{
if( FBitSet( SDL_GetModState(), KMOD_CTRL ))
if( keynum >= SDL_SCANCODE_A && keynum <= SDL_SCANCODE_Z )
{
if( keynum >= SDL_SCANCODE_A && keynum <= SDL_SCANCODE_Z )
{
keynum = keynum - SDL_SCANCODE_A + 1;
CL_CharEvent( keynum );
}
return;
keynum = keynum - SDL_SCANCODE_A + 1;
CL_CharEvent( keynum );
}
return;
}
#if SDL_VERSION_ATLEAST( 2, 0, 0 )
@@ -282,11 +279,11 @@ static void SDLash_KeyEvent( SDL_KeyboardEvent key )
#endif // SDL_VERSION_ATLEAST( 2, 0, 0 )
case SDL_SCANCODE_UNKNOWN:
{
if( down ) Con_Reportf( "SDLash_KeyEvent: Unknown scancode\n" );
if( down ) Con_Reportf( "%s: Unknown scancode\n", __func__ );
return;
}
default:
if( down ) Con_Reportf( "SDLash_KeyEvent: Unknown key: %s = %i\n", SDL_GetScancodeName( keynum ), keynum );
if( down ) Con_Reportf( "%s: Unknown key: %s = %i\n", __func__, SDL_GetScancodeName( keynum ), keynum );
return;
}
}

View File

@@ -281,11 +281,11 @@ qboolean VoiceCapture_Init( void )
if( SDLash_IsAudioError( in_dev ))
{
Con_Printf( "VoiceCapture_Init: error creating capture device (%s)\n", SDL_GetError() );
Con_Printf( "%s: error creating capture device (%s)\n", __func__, SDL_GetError() );
return false;
}
Con_Printf( S_NOTE "VoiceCapture_Init: capture device creation success (%i: %s)\n", in_dev, SDL_GetAudioDeviceName( in_dev, SDL_TRUE ) );
Con_Printf( S_NOTE "%s: capture device creation success (%i: %s)\n", __func__, in_dev, SDL_GetAudioDeviceName( in_dev, SDL_TRUE ) );
return true;
}

View File

@@ -377,21 +377,21 @@ static void WIN_SetDPIAwareness( void )
if( hResult == S_OK )
{
Con_Reportf( "SetDPIAwareness: Success\n" );
Con_Reportf( "%s: Success\n", __func__ );
bSuccess = TRUE;
}
else if( hResult == E_INVALIDARG ) Con_Reportf( "SetDPIAwareness: Invalid argument\n" );
else if( hResult == E_ACCESSDENIED ) Con_Reportf( "SetDPIAwareness: Access Denied\n" );
else if( hResult == E_INVALIDARG ) Con_Reportf( "%s: Invalid argument\n", __func__ );
else if( hResult == E_ACCESSDENIED ) Con_Reportf( "%s: Access Denied\n", __func__ );
}
else Con_Reportf( "SetDPIAwareness: Can't get SetProcessDpiAwareness\n" );
else Con_Reportf( "%s: Can't get SetProcessDpiAwareness\n", __func__ );
FreeLibrary( hModule );
}
else Con_Reportf( "SetDPIAwareness: Can't load shcore.dll\n" );
else Con_Reportf( "%s: Can't load shcore.dll\n", __func__ );
if( !bSuccess )
{
Con_Reportf( "SetDPIAwareness: Trying SetProcessDPIAware...\n" );
Con_Reportf( "%s: Trying SetProcessDPIAware...\n", __func__ );
if( ( hModule = LoadLibrary( "user32.dll" ) ) )
{
@@ -402,15 +402,15 @@ static void WIN_SetDPIAwareness( void )
if( hResult )
{
Con_Reportf( "SetDPIAwareness: Success\n" );
Con_Reportf( "%s: Success\n", __func__ );
bSuccess = TRUE;
}
else Con_Reportf( "SetDPIAwareness: fail\n" );
else Con_Reportf( "%s: fail\n", __func__ );
}
else Con_Reportf( "SetDPIAwareness: Can't get SetProcessDPIAware\n" );
else Con_Reportf( "%s: Can't get SetProcessDPIAware\n", __func__ );
FreeLibrary( hModule );
}
else Con_Reportf( "SetDPIAwareness: Can't load user32.dll\n" );
else Con_Reportf( "%s: Can't load user32.dll\n", __func__ );
}
}
@@ -472,7 +472,7 @@ void *GL_GetProcAddress( const char *name )
if( !func )
{
Con_Reportf( S_ERROR "GL_GetProcAddress failed for %s\n", name );
Con_Reportf( S_ERROR "%s failed for %s\n", __func__, name );
}
return func;
@@ -531,7 +531,7 @@ static qboolean GL_CreateContext( void )
#if SDL_VERSION_ATLEAST(2, 0, 0)
if( ( glw_state.context = SDL_GL_CreateContext( host.hWnd ) ) == NULL)
{
Con_Reportf( S_ERROR "GL_CreateContext: %s\n", SDL_GetError());
Con_Reportf( S_ERROR "%s: %s\n", __func__, SDL_GetError( ));
return GL_DeleteContext();
}
#endif // SDL_VERSION_ATLEAST( 2, 0, 0 )
@@ -548,7 +548,7 @@ static qboolean GL_UpdateContext( void )
#if SDL_VERSION_ATLEAST( 2, 0, 0 )
if( SDL_GL_MakeCurrent( host.hWnd, glw_state.context ) < 0 )
{
Con_Reportf( S_ERROR "GL_UpdateContext: %s\n", SDL_GetError());
Con_Reportf( S_ERROR "%s: %s\n", __func__, SDL_GetError( ));
return GL_DeleteContext();
}
#endif // SDL_VERSION_ATLEAST( 2, 0, 0 )
@@ -633,7 +633,10 @@ static qboolean VID_SetScreenResolution( int width, int height, window_mode_t wi
void VID_RestoreScreenResolution( void )
{
#if SDL_VERSION_ATLEAST( 2, 0, 0 )
// on mobile platform fullscreen is designed to be always on
// and code below minimizes our window if we're in full screen
// don't do that on mobile devices
#if SDL_VERSION_ATLEAST( 2, 0, 0 ) && !XASH_MOBILE_PLATFORM
switch((window_mode_t)vid_fullscreen.value )
{
case WINDOW_MODE_WINDOWED:
@@ -654,6 +657,7 @@ static void VID_SetWindowIcon( SDL_Window *hWnd )
char iconpath[MAX_STRING];
#if XASH_WIN32 // ICO support only for Win32
const char *localIcoPath;
HINSTANCE hInst = GetModuleHandle( NULL );
if(( localIcoPath = FS_GetDiskPath( GI->iconpath, true )))
{
@@ -685,7 +689,7 @@ static void VID_SetWindowIcon( SDL_Window *hWnd )
}
#if XASH_WIN32 // ICO support only for Win32
WIN_SetWindowIcon( LoadIcon( host.hInst, MAKEINTRESOURCE( 101 )));
WIN_SetWindowIcon( LoadIcon( hInst, MAKEINTRESOURCE( 101 )));
#endif
}
#endif // SDL_VERSION_ATLEAST( 2, 0, 0 )
@@ -703,7 +707,7 @@ static qboolean VID_CreateWindowWithSafeGL( const char *wndname, int xpos, int y
if( host.hWnd )
break;
Con_Reportf( S_ERROR "VID_CreateWindow: couldn't create '%s' with safegl level %d: %s\n", wndname, glw_state.safe, SDL_GetError());
Con_Reportf( S_ERROR "%s: couldn't create '%s' with safegl level %d: %s\n", __func__, wndname, glw_state.safe, SDL_GetError());
glw_state.safe++;
@@ -757,7 +761,7 @@ qboolean VID_CreateWindow( int width, int height, window_mode_t window_mode )
if( SDL_GetDisplayBounds( 0, &r ) < 0 )
#endif
{
Con_Reportf( S_ERROR "VID_CreateWindow: SDL_GetDisplayBounds failed: %s\n", SDL_GetError( ));
Con_Reportf( S_ERROR "%s: SDL_GetDisplayBounds failed: %s\n", __func__, SDL_GetError( ));
xpos = SDL_WINDOWPOS_CENTERED;
ypos = SDL_WINDOWPOS_CENTERED;
}
@@ -1096,7 +1100,7 @@ rserr_t R_ChangeDisplaySettings( int width, int height, window_mode_t window_mod
#endif
refState.fullScreen = window_mode != WINDOW_MODE_WINDOWED;
Con_Reportf( "R_ChangeDisplaySettings: Setting video mode to %dx%d %s\n", width, height, refState.fullScreen ? "fullscreen" : "windowed" );
Con_Reportf( "%s: Setting video mode to %dx%d %s\n", __func__, width, height, refState.fullScreen ? "fullscreen" : "windowed" );
if( !host.hWnd )
{
@@ -1172,7 +1176,7 @@ qboolean VID_SetMode( void )
if( Q_strcmp( vid_fullscreen.string, DEFAULT_FULLSCREEN ))
{
Cvar_DirectSet( &vid_fullscreen, DEFAULT_FULLSCREEN );
Con_Reportf( S_ERROR "VID_SetMode: windowed unavailable on this platform\n" );
Con_Reportf( S_ERROR "%s: windowed unavailable on this platform\n", __func__ );
}
#endif
@@ -1195,22 +1199,22 @@ qboolean VID_SetMode( void )
if( err == rserr_invalid_fullscreen )
{
Cvar_DirectSet( &vid_fullscreen, "0" );
Con_Reportf( S_ERROR "VID_SetMode: fullscreen unavailable in this mode\n" );
Sys_Warn("fullscreen unavailable in this mode!");
Con_Reportf( S_ERROR "%s: fullscreen unavailable in this mode\n", __func__ );
Sys_Warn( "fullscreen unavailable in this mode!" );
if(( err = R_ChangeDisplaySettings( iScreenWidth, iScreenHeight, WINDOW_MODE_WINDOWED )) == rserr_ok )
return true;
}
else if( err == rserr_invalid_mode )
{
Con_Reportf( S_ERROR "VID_SetMode: invalid mode\n" );
Con_Reportf( S_ERROR "%s: invalid mode\n", __func__ );
Sys_Warn( "invalid mode, engine will run in %dx%d", sdlState.prev_width, sdlState.prev_height );
}
// try setting it back to something safe
if(( err = R_ChangeDisplaySettings( sdlState.prev_width, sdlState.prev_height, WINDOW_MODE_WINDOWED )) != rserr_ok )
{
Con_Reportf( S_ERROR "VID_SetMode: could not revert to safe mode\n" );
Sys_Warn("could not revert to safe mode!");
Con_Reportf( S_ERROR "%s: could not revert to safe mode\n", __func__ );
Sys_Warn( "could not revert to safe mode!" );
return false;
}
}

View File

@@ -497,7 +497,7 @@ Con_CreateConsole
create win32 console
================
*/
void Wcon_CreateConsole( void )
void Wcon_CreateConsole( qboolean con_showalways )
{
if( Sys_CheckParm( "-log" ))
s_wcd.log_active = true;
@@ -544,7 +544,7 @@ void Wcon_CreateConsole( void )
SetWindowPos( s_wcd.hWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOREPOSITION | SWP_SHOWWINDOW );
// show console if needed
if( host.con_showalways )
if( con_showalways )
{
// make console visible
ShowWindow( s_wcd.hWnd, SW_SHOWDEFAULT );
@@ -586,7 +586,7 @@ destroy win32 console
void Wcon_DestroyConsole( void )
{
// last text message into console or log
Con_Reportf( "Sys_FreeLibrary: Unloading xash.dll\n" );
Con_Reportf( "%s: Unloading xash.dll\n", __func__ );
Sys_CloseLog();
@@ -608,10 +608,6 @@ void Wcon_DestroyConsole( void )
}
FreeConsole();
// place it here in case Sys_Crash working properly
if( host.hMutex )
CloseHandle( host.hMutex );
}
/*

View File

@@ -29,7 +29,7 @@ static DWORD GetOffsetByRVA( DWORD rva, PIMAGE_NT_HEADERS nt_header )
for( i = 0; i < nt_header->FileHeader.NumberOfSections; i++, sect_header++)
{
if( rva >= sect_header->VirtualAddress && rva < sect_header->VirtualAddress + sect_header->Misc.VirtualSize )
break;
break;
}
return (rva - sect_header->VirtualAddress + sect_header->PointerToRawData);
}
@@ -289,23 +289,25 @@ table_error:
if( f ) FS_Close( f );
if( p_Names ) Mem_Free( p_Names );
FreeNameFuncGlobals( hInst );
Con_Printf( S_ERROR "LoadLibrary: %s\n", errorstring );
Con_Printf( S_ERROR "%s: %s\n", __func__, errorstring );
return false;
}
static const char *GetLastErrorAsString( void )
{
const DWORD fm_flags = FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK;
DWORD errorcode;
wchar_t wide_errormessage[256];
static string errormessage;
errorcode = GetLastError();
if ( !errorcode ) return "";
FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_MAX_WIDTH_MASK,
NULL, errorcode, MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
(LPSTR)&errormessage, sizeof( errormessage ), NULL );
if ( !errorcode )
return "";
FormatMessageW( fm_flags, NULL, errorcode, 0, wide_errormessage, ARRAYSIZE( wide_errormessage ), NULL );
Q_UTF16ToUTF8( errormessage, sizeof( errormessage ), wide_errormessage, ARRAYSIZE( wide_errormessage ));
return errormessage;
}
@@ -318,35 +320,35 @@ static PIMAGE_IMPORT_DESCRIPTOR GetImportDescriptor( const char *name, byte *dat
if ( !data )
{
Con_Printf( S_ERROR "%s: couldn't load %s\n", __FUNCTION__, name );
Con_Printf( S_ERROR "%s: couldn't load %s\n", __func__, name );
return NULL;
}
dosHeader = (PIMAGE_DOS_HEADER)data;
if ( dosHeader->e_magic != IMAGE_DOS_SIGNATURE )
{
Con_Printf( S_ERROR "%s: %s is not a valid executable file\n", __FUNCTION__, name );
Con_Printf( S_ERROR "%s: %s is not a valid executable file\n", __func__, name );
return NULL;
}
peHeader = (PIMAGE_NT_HEADERS)( data + dosHeader->e_lfanew );
if ( peHeader->Signature != IMAGE_NT_SIGNATURE )
{
Con_Printf( S_ERROR "%s: %s is missing a PE header\n", __FUNCTION__, name );
Con_Printf( S_ERROR "%s: %s is missing a PE header\n", __func__, name );
return NULL;
}
importDir = &peHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
if( importDir->Size <= 0 )
{
Con_Printf( S_ERROR "%s: %s has no dependencies\n", __FUNCTION__, name );
Con_Printf( S_ERROR "%s: %s has no dependencies\n", __func__, name );
return NULL;
}
*peheader = peHeader;
importDesc = (PIMAGE_IMPORT_DESCRIPTOR)CALCULATE_ADDRESS( data, GetOffsetByRVA( importDir->VirtualAddress, peHeader ) );
return importDesc;
return importDesc;
}
static void ListMissingModules( dll_user_t *hInst )
@@ -410,9 +412,9 @@ qboolean COM_CheckLibraryDirectDependency( const char *name, const char *depname
{
COM_FreeLibrary( hInst );
Mem_Free( data );
return FALSE;
return FALSE;
}
for( ; !IsBadReadPtr( importDesc, sizeof( IMAGE_IMPORT_DESCRIPTOR ) ) && importDesc->Name; importDesc++ )
{
const char *importName = (const char *)CALCULATE_ADDRESS( data, GetOffsetByRVA( importDesc->Name, peHeader ) );
@@ -521,10 +523,10 @@ void COM_FreeLibrary( void *hInstance )
if( host.status == HOST_CRASHED )
{
// we need to hold down all modules, while MSVC can find error
Con_Reportf( "Sys_FreeLibrary: hold %s for debugging\n", hInst->dllName );
Con_Reportf( "%s: hold %s for debugging\n", __func__, hInst->dllName );
return;
}
else Con_Reportf( "Sys_FreeLibrary: Unloading %s\n", hInst->dllName );
else Con_Reportf( "%s: Unloading %s\n", __func__, hInst->dllName );
#if XASH_X86
if( hInst->custom_loader )

View File

@@ -43,8 +43,15 @@ GNU General Public License for more details.
// Renderers are supposed to migrate to ref_client_t/ref_host_t using PARM_GET_CLIENT_PTR and PARM_GET_HOST_PTR
// Removed functions to get internal engine structions. Use PARM_GET_*_PTR instead.
// 7. Gamma fixes.
#define REF_API_VERSION 7
// 8. Moved common code to engine.
// Removed REF_{SOLID,ALPHA}SKY_TEXTURE. Replaced R_InitSkyClouds by R_SetSkyCloudsTextures.
// Skybox loading is now done at engine side.
// R_SetupSky callback accepts a pointer to an array of 6 integers representing box side textures.
// Restored texture replacement from old Xash3D.
// PARM_SKY_SPHERE and PARM_SURF_SAMPLESIZE are now handled at engine side.
// VGUI rendering code is mostly moved back to engine.
// Implemented texture replacement.
#define REF_API_VERSION 8
#define TF_SKY (TF_SKYSIDE|TF_NOMIPMAP|TF_ALLOW_NEAREST)
#define TF_FONT (TF_NOMIPMAP|TF_CLAMP|TF_ALLOW_NEAREST)
@@ -82,6 +89,8 @@ GNU General Public License for more details.
// (probably will be expanded at some point)
#define kRenderScreenFadeModulate 0x1000
#define SKYBOX_MAX_SIDES 6 // a box can only have 6 sides
typedef enum
{
DEMO_INACTIVE = 0,
@@ -161,8 +170,6 @@ enum // r_speeds counters
#define REF_WHITE_TEXTURE "*white"
#define REF_BLACK_TEXTURE "*black"
#define REF_PARTICLE_TEXTURE "*particle"
#define REF_SOLIDSKY_TEXTURE "solid_sky"
#define REF_ALPHASKY_TEXTURE "alpha_sky"
typedef enum connstate_e
{
@@ -288,7 +295,7 @@ typedef enum
// returns non-null integer if filtering is enabled for texture
// pass -1 to query global filtering settings
PARM_TEX_FILTERING = -65536,
PARM_TEX_FILTERING = -0x10000,
} ref_parm_e;
typedef struct ref_api_s
@@ -497,7 +504,7 @@ typedef struct ref_interface_s
const byte *(*R_GetTextureOriginalBuffer)( unsigned int idx ); // not always available
int (*GL_LoadTextureFromBuffer)( const char *name, rgbdata_t *pic, texFlags_t flags, qboolean update );
void (*GL_ProcessTexture)( int texnum, float gamma, int topColor, int bottomColor );
void (*R_SetupSky)( const char *skyname );
void (*R_SetupSky)( int *skyboxTextures );
// 2D
void (*R_Set2DMode)( qboolean enable );
@@ -528,7 +535,7 @@ typedef struct ref_interface_s
void (*CL_InitStudioAPI)( void );
// bmodel
void (*R_InitSkyClouds)( struct mip_s *mt, struct texture_s *tx, qboolean custom_palette );
void (*R_SetSkyCloudsTextures)( int solidskyTexture, int alphaskyTexture );
void (*GL_SubdivideSurface)( model_t *mod, msurface_t *fa );
void (*CL_RunLightStyles)( void );
@@ -568,6 +575,7 @@ typedef struct ref_interface_s
int (*GL_LoadTextureArray)( const char **names, int flags );
int (*GL_CreateTextureArray)( const char *name, int width, int height, int depth, const void *buffer, texFlags_t flags );
void (*GL_FreeTexture)( unsigned int texnum );
void (*R_OverrideTextureSourceSize)( unsigned int texnum, unsigned int srcWidth, unsigned int srcHeight ); // used to override decal size for texture replacement
// Decals manipulating (draw & remove)
void (*DrawSingleDecal)( struct decal_s *pDecal, struct msurface_s *fa );
@@ -627,19 +635,8 @@ typedef struct ref_interface_s
void (*CullFace)( TRICULLSTYLE mode );
// vgui drawing implementation
void (*VGUI_DrawInit)( void );
void (*VGUI_DrawShutdown)( void );
void (*VGUI_SetupDrawingText)( int *pColor );
void (*VGUI_SetupDrawingRect)( int *pColor );
void (*VGUI_SetupDrawingImage)( int *pColor );
void (*VGUI_BindTexture)( int id );
void (*VGUI_EnableTexture)( qboolean enable );
void (*VGUI_CreateTexture)( int id, int width, int height );
void (*VGUI_UploadTexture)( int id, const char *buffer, int width, int height );
void (*VGUI_UploadTextureBlock)( int id, int drawX, int drawY, const byte *rgba, int blockWidth, int blockHeight );
void (*VGUI_DrawQuad)( const vpoint_t *ul, const vpoint_t *lr );
void (*VGUI_GetTextureSizes)( int *width, int *height );
int (*VGUI_GenerateTexture)( void );
void (*VGUI_SetupDrawing)( qboolean rect );
void (*VGUI_UploadTextureBlock)( int drawX, int drawY, const byte *rgba, int blockWidth, int blockHeight );
} ref_interface_t;
typedef int (*REFAPI)( int version, ref_interface_t *pFunctionTable, ref_api_t* engfuncs, ref_globals_t *pGlobals );
@@ -684,6 +681,7 @@ typedef int (*REFAPI)( int version, ref_interface_t *pFunctionTable, ref_api_t*
ENGINE_SHARED_CVAR( f, r_sprite_lighting ) \
ENGINE_SHARED_CVAR( f, r_drawviewmodel ) \
ENGINE_SHARED_CVAR( f, r_glowshellfreq ) \
ENGINE_SHARED_CVAR( f, host_allow_materials ) \
#define DECLARE_ENGINE_SHARED_CVAR_LIST() \
ENGINE_SHARED_CVAR_LIST( DECLARE_ENGINE_SHARED_CVAR )

View File

@@ -271,7 +271,7 @@ typedef struct sv_client_s
=============================================================================
a client can leave the server in one of four ways:
dropping properly by quiting or disconnecting
timing out if no valid messages are received for timeout.value seconds
timing out if no valid messages are received for sv_timeout.value seconds
getting kicked off by the server operator
a program error, like an overflowed reliable buffer
=============================================================================
@@ -422,21 +422,14 @@ extern convar_t sv_send_resources;
extern convar_t sv_send_logos;
extern convar_t sv_allow_upload;
extern convar_t sv_allow_download;
extern convar_t sv_airaccelerate;
extern convar_t sv_accelerate;
extern convar_t sv_friction;
extern convar_t sv_edgefriction;
extern convar_t sv_gravity;
extern convar_t sv_stopspeed;
extern convar_t sv_maxspeed;
extern convar_t sv_wateralpha;
extern convar_t sv_wateramp;
extern convar_t sv_voiceenable;
extern convar_t sv_voicequality;
extern convar_t sv_stepsize;
extern convar_t sv_maxvelocity;
extern convar_t sv_rollangle;
extern convar_t sv_rollspeed;
extern convar_t sv_skyname;
extern convar_t sv_skycolor_r;
extern convar_t sv_skycolor_g;
@@ -461,7 +454,6 @@ extern convar_t sv_nat;
extern convar_t sv_speedhack_kick;
extern convar_t sv_pausable; // allows pause in multiplayer
extern convar_t sv_check_errors;
extern convar_t sv_reconnect_limit;
extern convar_t sv_lighting_modulate;
extern convar_t sv_novis;
extern convar_t sv_hostmap;
@@ -476,6 +468,7 @@ extern convar_t sv_log_outofband;
extern convar_t sv_allow_autoaim;
extern convar_t sv_aim;
extern convar_t sv_allow_testpacket;
extern convar_t sv_expose_player_list;
//===========================================================
//
@@ -555,6 +548,7 @@ void SV_UpdateServerInfo( void );
void SV_EndRedirect( host_redirect_t *rd );
void SV_RejectConnection( netadr_t from, const char *fmt, ... ) _format( 2 );
void SV_GetPlayerCount( int *clients, int *bots );
qboolean SV_HavePassword( void );
//
// sv_cmds.c

View File

@@ -45,6 +45,20 @@ static int g_userid = 1;
static void SV_UserinfoChanged( sv_client_t *cl );
static void SV_ExecuteClientCommand( sv_client_t *cl, const char *s );
/*
=================
SV_HavePassword
=================
*/
qboolean SV_HavePassword( void )
{
if( COM_CheckStringEmpty( sv_password.string ) && Q_stricmp( sv_password.string, "none" ))
return true;
return false;
}
/*
=================
SV_GetPlayerCount
@@ -370,10 +384,13 @@ static void SV_ConnectClient( netadr_t from )
Q_strncpy( userinfo, s, sizeof( userinfo ));
// check connection password (don't verify local client)
if( !NET_IsLocalAddress( from ) && sv_password.string[0] && Q_stricmp( sv_password.string, Info_ValueForKey( userinfo, "password" )))
if( !NET_IsLocalAddress( from ) && SV_HavePassword( ))
{
SV_RejectConnection( from, "invalid password\n" );
return;
if( Q_stricmp( sv_password.string, Info_ValueForKey( userinfo, "password" )))
{
SV_RejectConnection( from, "invalid password\n" );
return;
}
}
// if there is already a slot for this ip, reuse it
@@ -515,10 +532,10 @@ edict_t *GAME_EXPORT SV_FakeConnect( const char *netname )
userinfo[0] = '\0';
// setup fake client params
Info_SetValueForKey( userinfo, "name", netname, MAX_INFO_STRING );
Info_SetValueForKey( userinfo, "model", "gordon", MAX_INFO_STRING );
Info_SetValueForKey( userinfo, "topcolor", "1", MAX_INFO_STRING );
Info_SetValueForKey( userinfo, "bottomcolor", "1", MAX_INFO_STRING );
Info_SetValueForKey( userinfo, "name", netname, sizeof( userinfo ));
Info_SetValueForKey( userinfo, "model", "gordon", sizeof( userinfo ));
Info_SetValueForKey( userinfo, "topcolor", "1", sizeof( userinfo ));
Info_SetValueForKey( userinfo, "bottomcolor", "1", sizeof( userinfo ));
// build a new connection
// accept the new client
@@ -710,7 +727,7 @@ static void SV_FlushRedirect( netadr_t adr, int dest, char *buf )
MSG_WriteString( &sv.current_client->netchan.message, buf );
break;
case RD_NONE:
Con_Printf( S_ERROR "SV_FlushRedirect: %s: invalid destination\n", NET_AdrToString( adr ));
Con_Printf( S_ERROR "%s: %s: invalid destination\n", __func__, NET_AdrToString( adr ));
break;
}
}
@@ -915,7 +932,6 @@ static void SV_Info( netadr_t from, int protocolVersion )
int bots;
int remaining;
char temp[sizeof( s )];
qboolean have_password = COM_CheckStringEmpty( sv_password.string );
SV_GetPlayerCount( &count, &bots );
@@ -928,7 +944,7 @@ static void SV_Info( netadr_t from, int protocolVersion )
Info_SetValueForKeyf( s, "numcl", sizeof( s ), "%i", count );
Info_SetValueForKeyf( s, "maxcl", sizeof( s ), "%i", svs.maxclients );
Info_SetValueForKey( s, "gamedir", GI->gamefolder, sizeof( s ));
Info_SetValueForKey( s, "password", have_password ? "1" : "0", sizeof( s ));
Info_SetValueForKey( s, "password", SV_HavePassword() ? "1" : "0", sizeof( s ));
// write host last so we can try to cut off too long hostnames
// TODO: value size limit for infostrings
@@ -955,9 +971,13 @@ Responds with long info for local and broadcast requests
*/
static void SV_BuildNetAnswer( netadr_t from )
{
char string[MAX_INFO_STRING];
int version, context, type;
int i, count = 0;
const cvar_t *cv;
char string[4096];
int version;
int context;
int type;
int count = 0;
int i;
// ignore in single player
if( svs.maxclients == 1 || !svs.initialized )
@@ -967,79 +987,84 @@ static void SV_BuildNetAnswer( netadr_t from )
context = Q_atoi( Cmd_Argv( 2 ));
type = Q_atoi( Cmd_Argv( 3 ));
string[0] = 0;
if( version != PROTOCOL_VERSION )
{
// handle the unsupported protocol
string[0] = '\0';
Info_SetValueForKey( string, "neterror", "protocol", MAX_INFO_STRING );
// send error unsupported protocol
Info_SetValueForKey( string, "neterror", "protocol", sizeof( string ));
Netchan_OutOfBandPrint( NS_SERVER, from, "netinfo %i %i %s\n", context, type, string );
return;
}
if( type == NETAPI_REQUEST_PING )
switch( type )
{
Netchan_OutOfBandPrint( NS_SERVER, from, "netinfo %i %i %s\n", context, type, "" );
}
else if( type == NETAPI_REQUEST_RULES )
{
// send serverinfo
Netchan_OutOfBandPrint( NS_SERVER, from, "netinfo %i %i %s\n", context, type, svs.serverinfo );
}
else if( type == NETAPI_REQUEST_PLAYERS )
{
size_t len = 0;
case NETAPI_REQUEST_PING:
break;
case NETAPI_REQUEST_RULES:
for( cv = Cvar_GetList( ); cv; cv = cv->next )
{
if( !FBitSet( cv->flags, FCVAR_SERVER ))
continue;
string[0] = '\0';
if( FBitSet( cv->flags, FCVAR_PROTECTED ))
{
if( COM_CheckStringEmpty( cv->string ) && Q_stricmp( cv->string, "none" ))
Info_SetValueForKey( string, cv->name, "1", sizeof( string ));
else Info_SetValueForKey( string, cv->name, "0", sizeof( string ));
}
else Info_SetValueForKey( string, cv->name, cv->string, sizeof( string ));
count++;
}
Info_SetValueForKeyf( string, "rules", sizeof( string ), "%i", count );
break;
case NETAPI_REQUEST_PLAYERS:
if( !sv_expose_player_list.value || SV_HavePassword( ))
{
Info_SetValueForKey( string, "neterror", "forbidden", sizeof( string ));
}
else
{
for( i = 0; i < svs.maxclients; i++ )
{
const sv_client_t *cl = &svs.clients[i];
if( cl->state < cs_connected )
continue;
Info_SetValueForKey( string, va( "p%iname", count ), cl->name, sizeof( string ));
Info_SetValueForKeyf( string, va( "p%ifrags", count ), sizeof( string ), "%i", (int)cl->edict->v.frags );
Info_SetValueForKeyf( string, va( "p%itime", count ), sizeof( string ), "%f", host.realtime - cl->connection_started );
count++;
}
Info_SetValueForKeyf( string, "players", sizeof( string ), "%i", count );
}
break;
case NETAPI_REQUEST_DETAILS:
for( i = 0; i < svs.maxclients; i++ )
{
if( svs.clients[i].state >= cs_connected )
{
int ret;
edict_t *ed = svs.clients[i].edict;
float time = host.realtime - svs.clients[i].connection_started;
ret = Q_snprintf( &string[len], sizeof( string ) - len, "%c\\%s\\%i\\%f\\", count, svs.clients[i].name, (int)ed->v.frags, time );
if( ret == -1 )
{
Con_DPrintf( S_WARN "SV_BuildNetAnswer: NETAPI_REQUEST_PLAYERS: buffer overflow!\n" );
break;
}
len += ret;
count++;
}
}
// send playernames
Netchan_OutOfBandPrint( NS_SERVER, from, "netinfo %i %i %s\n", context, type, string );
}
else if( type == NETAPI_REQUEST_DETAILS )
{
for( i = 0; i < svs.maxclients; i++ )
if( svs.clients[i].state >= cs_connected )
count++;
string[0] = '\0';
Info_SetValueForKey( string, "hostname", hostname.string, MAX_INFO_STRING );
Info_SetValueForKey( string, "gamedir", GI->gamefolder, MAX_INFO_STRING );
Info_SetValueForKeyf( string, "current", MAX_INFO_STRING, "%i", count );
Info_SetValueForKeyf( string, "max", MAX_INFO_STRING, "%i", svs.maxclients );
Info_SetValueForKey( string, "map", sv.name, MAX_INFO_STRING );
// send serverinfo
Netchan_OutOfBandPrint( NS_SERVER, from, "netinfo %i %i %s\n", context, type, string );
}
else
{
string[0] = '\0';
Info_SetValueForKey( string, "neterror", "undefined", MAX_INFO_STRING );
// should match SV_SourceQuery_Details
Info_SetValueForKey( string, "hostname", hostname.string, sizeof( string ));
Info_SetValueForKey( string, "gamedir", GI->gamefolder, sizeof( string ));
Info_SetValueForKeyf( string, "current", sizeof( string ), "%i", count );
Info_SetValueForKeyf( string, "max", sizeof( string ), "%i", svs.maxclients );
Info_SetValueForKey( string, "map", sv.name, sizeof( string ));
break;
default:
// send error undefined request type
Netchan_OutOfBandPrint( NS_SERVER, from, "netinfo %i %i %s\n", context, type, string );
Info_SetValueForKey( string, "neterror", "undefined", sizeof( string ));
break;
}
Netchan_OutOfBandPrint( NS_SERVER, from, "netinfo %i %i %s\n", context, type, string );
}
/*
@@ -1792,8 +1817,8 @@ static qboolean SV_ShouldUpdateUserinfo( sv_client_t *cl )
// player changes userinfo too quick! ignore!
if( host.realtime < cl->userinfo_next_changetime )
{
Con_Reportf( "SV_ShouldUpdateUserinfo: ignore userinfo update for %s: penalty %f, attempts %i\n",
cl->name, cl->userinfo_penalty, cl->userinfo_change_attempts );
Con_Reportf( "%s: ignore userinfo update for %s: penalty %f, attempts %i\n",
__func__, cl->name, cl->userinfo_penalty, cl->userinfo_change_attempts );
allow = false;
}
@@ -1803,7 +1828,7 @@ static qboolean SV_ShouldUpdateUserinfo( sv_client_t *cl )
// they spammed too fast, increase penalty
if( cl->userinfo_change_attempts > sv_userinfo_penalty_attempts.value )
{
Con_Reportf( "SV_ShouldUpdateUserinfo: penalty set %f for %s\n",
Con_Reportf( "%s: penalty set %f for %s\n", __func__,
cl->userinfo_penalty, cl->name );
cl->userinfo_penalty *= sv_userinfo_penalty_multiplier.value;
cl->userinfo_change_attempts = 0;
@@ -2157,9 +2182,9 @@ static qboolean SV_DownloadFile_f( sv_client_t *cl )
memset( &custResource, 0, sizeof( custResource ) );
COM_HexConvert( name + 4, 32, md5 );
if( HPAK_ResourceForHash( CUSTOM_RES_PATH, md5, &custResource ))
if( HPAK_ResourceForHash( hpk_custom_file.string, md5, &custResource ))
{
if( HPAK_GetDataPointer( CUSTOM_RES_PATH, &custResource, &pbuf, &size ))
if( HPAK_GetDataPointer( hpk_custom_file.string, &custResource, &pbuf, &size ))
{
if( size )
{
@@ -3141,7 +3166,7 @@ void SV_ConnectionlessPacket( netadr_t from, sizebuf_t *msg )
pcmd = Cmd_Argv( 0 );
if( sv_log_outofband.value )
Con_Reportf( "SV_ConnectionlessPacket: %s : %s\n", NET_AdrToString( from ), pcmd );
Con_Reportf( "%s: %s : %s\n", __func__, NET_AdrToString( from ), pcmd );
if( !Q_strcmp( pcmd, "ping" )) SV_Ping( from );
else if( !Q_strcmp( pcmd, "ack" )) SV_Ack( from );
@@ -3209,7 +3234,7 @@ static void SV_ParseClientMove( sv_client_t *cl, sizebuf_t *msg )
if( totalcmds < 0 || totalcmds >= CMD_MASK )
{
Con_Reportf( S_ERROR "SV_ParseClientMove: %s sending too many commands %i\n", cl->name, totalcmds );
Con_Reportf( S_ERROR "%s: %s sending too many commands %i\n", __func__, cl->name, totalcmds );
SV_DropClient( cl, false );
return;
}
@@ -3232,7 +3257,7 @@ static void SV_ParseClientMove( sv_client_t *cl, sizebuf_t *msg )
if( checksum2 != checksum1 )
{
Con_Reportf( S_ERROR "SV_UserMove: failed command checksum for %s (%d != %d)\n", cl->name, checksum2, checksum1 );
Con_Reportf( S_ERROR "%s: failed command checksum for %s (%d != %d)\n", __func__, cl->name, checksum2, checksum1 );
return;
}
@@ -3451,7 +3476,7 @@ static void SV_ParseVoiceData( sv_client_t *cl, sizebuf_t *msg )
if( size > sizeof( received ))
{
Con_DPrintf( "SV_ParseVoiceData: invalid incoming packet.\n" );
Con_DPrintf( "%s: invalid incoming packet.\n", __func__ );
SV_DropClient( cl, false );
return;
}

Some files were not shown because too many files have changed in this diff Show More