Big net::msg conversion

This commit is contained in:
iikorni
2026-08-30 12:38:12 -05:00
parent 216dd1aecd
commit df2b863d72
36 changed files with 2860 additions and 2764 deletions
+40 -77
View File
@@ -28,77 +28,43 @@
</configurations> </configurations>
</component> </component>
<component name="ChangeListManager"> <component name="ChangeListManager">
<list default="true" id="f5455ea3-1ba8-4b1e-84ce-0eab50a09cdc" name="Changes" comment="Even more conversion, lots of superfluous macro removal"> <list default="true" id="f5455ea3-1ba8-4b1e-84ce-0eab50a09cdc" name="Changes" comment="Overhaul to console structure, a bit">
<change afterPath="$PROJECT_DIR$/Quake/net_msg.cpp" afterDir="false" />
<change afterPath="$PROJECT_DIR$/Quake/net_msg.hpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" /> <change beforePath="$PROJECT_DIR$/.idea/workspace.xml" beforeDir="false" afterPath="$PROJECT_DIR$/.idea/workspace.xml" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Misc/fix_externaltex.patch" beforeDir="false" afterPath="$PROJECT_DIR$/Misc/fix_externaltex.patch" afterDir="false" /> <change beforePath="$PROJECT_DIR$/CMakeLists.txt" beforeDir="false" afterPath="$PROJECT_DIR$/CMakeLists.txt" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/bgmusic.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/bgmusic.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/bgmusic.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/bgmusic.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/cd_null.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/cd_null.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/bgmusic.hpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/bgmusic.hpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/cd_sdl.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/cd_sdl.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/cl_demo.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/cl_demo.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/cl_demo.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/cl_demo.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/cl_input.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/cl_input.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/cl_input.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/cl_input.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/cl_main.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/cl_main.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/cl_main.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/cl_main.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/cl_parse.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/cl_parse.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/cl_parse.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/cl_parse.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/cl_tent.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/cl_tent.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/cl_tent.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/cl_tent.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/client.hpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/client.hpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/cmd.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/cmd.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/cmd.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/cmd.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/common.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/common.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/common.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/common.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/common.hpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/common.hpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/console.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/console.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/console.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/console.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/console.hpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/console.hpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/console.hpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/console.hpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/convar.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/convar.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/gl_draw.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/gl_draw.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/gl_fog.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/gl_fog.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/gl_fog.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/gl_fog.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/gl_mesh.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/gl_mesh.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/gl_model.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/gl_model.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/gl_refrag.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/gl_refrag.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/gl_rmain.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/gl_rmain.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/gl_rmisc.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/gl_rmisc.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/gl_screen.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/gl_screen.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/gl_screen.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/gl_screen.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/gl_sky.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/gl_sky.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/gl_texmgr.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/gl_texmgr.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/gl_vidsdl.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/gl_vidsdl.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/host.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/host.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/host.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/host.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/host_cmd.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/host_cmd.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/host_cmd.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/host_cmd.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/image.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/image.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/in_sdl.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/in_sdl.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/keys.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/keys.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/menu.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/menu.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/menu.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/menu.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/net.hpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/net.hpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/net_defs.hpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/net_defs.hpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/net_dgrm.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/net_dgrm.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/net_dgrm.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/net_dgrm.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/net_dgrm.hpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/net_dgrm.hpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/net_loop.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/net_loop.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/net_loop.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/net_loop.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/net_loop.hpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/net_loop.hpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/net_main.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/net_main.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/net_main.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/net_main.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/net_udp.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/net_udp.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/net_wins.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/net_wins.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/net_wipx.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/net_wipx.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/pr_cmds.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/pr_cmds.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/pr_cmds.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/pr_cmds.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/pr_edict.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/pr_edict.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/pr_edict.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/pr_edict.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/pr_exec.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/pr_exec.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/r_alias.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/r_alias.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/r_brush.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/r_brush.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/r_part.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/r_part.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/r_part.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/r_part.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/r_sprite.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/r_sprite.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/server.hpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/server.hpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/r_world.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/r_world.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_codec.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_codec.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_dma.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_dma.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_flac.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_flac.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_mem.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_mem.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_mikmod.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_mikmod.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_mix.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_mix.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_modplug.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_modplug.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_mp3.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_mp3.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_mp3tag.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_mp3tag.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_mpg123.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_mpg123.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_opus.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_opus.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_sdl.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_sdl.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_umx.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_umx.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_vorbis.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_vorbis.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_wave.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_wave.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/snd_xmp.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/snd_xmp.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/sv_main.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/sv_main.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/sv_main.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/sv_main.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/sv_move.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/sv_move.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/sv_phys.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/sv_phys.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/sv_user.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/sv_user.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/sv_user.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/sv_user.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/view.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/view.cpp" afterDir="false" /> <change beforePath="$PROJECT_DIR$/Quake/view.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/view.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/wad.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/wad.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/world.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/world.cpp" afterDir="false" />
<change beforePath="$PROJECT_DIR$/Quake/zone.cpp" beforeDir="false" afterPath="$PROJECT_DIR$/Quake/zone.cpp" afterDir="false" />
</list> </list>
<option name="SHOW_DIALOG" value="false" /> <option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" /> <option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -115,10 +81,6 @@
</component> </component>
<component name="HighlightingSettingsPerFile"> <component name="HighlightingSettingsPerFile">
<setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" /> <setting file="mock:///dummy.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///home/iikorni/Downloads/quakespasm-0.96.3/Quake/console.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///home/iikorni/Downloads/quakespasm-0.96.3/Quake/host.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///home/iikorni/Downloads/quakespasm-0.96.3/Quake/keys.cpp" root0="SKIP_HIGHLIGHTING" />
<setting file="mock:///home/iikorni/Downloads/quakespasm-0.96.3/Quake/menu.cpp" root0="SKIP_HIGHLIGHTING" />
</component> </component>
<component name="MacroExpansionManager"> <component name="MacroExpansionManager">
<option name="directoryName" value="5yRIaLtN" /> <option name="directoryName" value="5yRIaLtN" />
@@ -138,33 +100,33 @@
<option name="hideEmptyMiddlePackages" value="true" /> <option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" /> <option name="showLibraryContents" value="true" />
</component> </component>
<component name="PropertiesComponent">{ <component name="PropertiesComponent"><![CDATA[{
&quot;keyToString&quot;: { "keyToString": {
&quot;CMake Application.quakespasm.executor&quot;: &quot;Run&quot;, "CMake Application.quakespasm.executor": "Debug",
&quot;CidrDebugProfileConversion&quot;: &quot;true&quot;, "CidrDebugProfileConversion": "true",
&quot;ModuleVcsDetector.initialDetectionPerformed&quot;: &quot;true&quot;, "ModuleVcsDetector.initialDetectionPerformed": "true",
&quot;RunOnceActivity.RadMigrateCodeStyle&quot;: &quot;true&quot;, "RunOnceActivity.RadMigrateCodeStyle": "true",
&quot;RunOnceActivity.ShowReadmeOnStart&quot;: &quot;true&quot;, "RunOnceActivity.ShowReadmeOnStart": "true",
&quot;RunOnceActivity.cidr.known.project.marker&quot;: &quot;true&quot;, "RunOnceActivity.cidr.known.project.marker": "true",
&quot;RunOnceActivity.git.unshallow&quot;: &quot;true&quot;, "RunOnceActivity.git.unshallow": "true",
&quot;RunOnceActivity.readMode.enableVisualFormatting&quot;: &quot;true&quot;, "RunOnceActivity.readMode.enableVisualFormatting": "true",
&quot;RunOnceActivity.typescript.service.memoryLimit.init&quot;: &quot;true&quot;, "RunOnceActivity.typescript.service.memoryLimit.init": "true",
&quot;SHARE_PROJECT_CONFIGURATION_FILES&quot;: &quot;true&quot;, "SHARE_PROJECT_CONFIGURATION_FILES": "true",
&quot;cf.first.check.clang-format&quot;: &quot;false&quot;, "cf.first.check.clang-format": "false",
&quot;cidr.known.project.marker&quot;: &quot;true&quot;, "cidr.known.project.marker": "true",
&quot;codeWithMe.voiceChat.enabledByDefault&quot;: &quot;false&quot;, "codeWithMe.voiceChat.enabledByDefault": "false",
&quot;git-widget-placeholder&quot;: &quot;master&quot;, "git-widget-placeholder": "master",
&quot;last_opened_file_path&quot;: &quot;/home/iikorni/Downloads/quakespasm-0.96.3/cmake-build-debug/id1&quot;, "last_opened_file_path": "/home/iikorni/Downloads/quakespasm-0.96.3/cmake-build-debug/id1",
&quot;node.js.detected.package.eslint&quot;: &quot;true&quot;, "node.js.detected.package.eslint": "true",
&quot;node.js.detected.package.jshint&quot;: &quot;true&quot;, "node.js.detected.package.jshint": "true",
&quot;node.js.detected.package.tslint&quot;: &quot;true&quot;, "node.js.detected.package.tslint": "true",
&quot;node.js.selected.package.eslint&quot;: &quot;(autodetect)&quot;, "node.js.selected.package.eslint": "(autodetect)",
&quot;node.js.selected.package.jshint&quot;: &quot;&quot;, "node.js.selected.package.jshint": "",
&quot;node.js.selected.package.tslint&quot;: &quot;(autodetect)&quot;, "node.js.selected.package.tslint": "(autodetect)",
&quot;nodejs_package_manager_path&quot;: &quot;npm&quot;, "nodejs_package_manager_path": "npm",
&quot;settings.editor.selected.configurable&quot;: &quot;language.cpp.clang-tidy&quot; "settings.editor.selected.configurable": "language.cpp.clang-tidy"
} }
}</component> }]]></component>
<component name="RecentsManager"> <component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS"> <key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/cmake-build-debug/id1" /> <recent name="$PROJECT_DIR$/cmake-build-debug/id1" />
@@ -226,7 +188,8 @@
<MESSAGE value="Begin converting QS engine to CPP" /> <MESSAGE value="Begin converting QS engine to CPP" />
<MESSAGE value="More conversion" /> <MESSAGE value="More conversion" />
<MESSAGE value="Even more conversion, lots of superfluous macro removal" /> <MESSAGE value="Even more conversion, lots of superfluous macro removal" />
<option name="LAST_COMMIT_MESSAGE" value="Even more conversion, lots of superfluous macro removal" /> <MESSAGE value="Overhaul to console structure, a bit" />
<option name="LAST_COMMIT_MESSAGE" value="Overhaul to console structure, a bit" />
</component> </component>
<component name="XSLT-Support.FileAssociations.UIState"> <component name="XSLT-Support.FileAssociations.UIState">
<expand /> <expand />
+2 -1
View File
@@ -7,7 +7,8 @@ find_package(SDL)
find_package(SDL_net) find_package(SDL_net)
find_package(OpenGL) find_package(OpenGL)
add_executable(quakespasm Quake/bgmusic.cpp Quake/cd_sdl.cpp Quake/cfgfile.cpp Quake/chase.cpp Quake/cl_demo.cpp Quake/cl_input.cpp Quake/cl_main.cpp Quake/cl_parse.cpp Quake/cl_tent.cpp Quake/cmd.cpp Quake/common.cpp Quake/console.cpp Quake/crc.cpp Quake/convar.cpp Quake/gl_draw.cpp Quake/gl_fog.cpp Quake/gl_mesh.cpp Quake/gl_model.cpp Quake/gl_refrag.cpp Quake/gl_rlight.cpp Quake/gl_rmain.cpp Quake/gl_rmisc.cpp Quake/gl_screen.cpp Quake/gl_sky.cpp Quake/gl_texmgr.cpp Quake/gl_vidsdl.cpp Quake/gl_warp.cpp Quake/host.cpp Quake/host_cmd.cpp Quake/image.cpp Quake/in_sdl.cpp Quake/keys.cpp Quake/main_sdl.cpp Quake/mathlib.cpp Quake/menu.cpp Quake/miniz.cpp Quake/net_bsd.cpp Quake/net_dgrm.cpp Quake/net_loop.cpp Quake/net_main.cpp Quake/net_udp.cpp Quake/pl_linux.cpp Quake/pr_cmds.cpp Quake/pr_edict.cpp Quake/pr_exec.cpp Quake/r_alias.cpp Quake/r_brush.cpp Quake/r_part.cpp Quake/r_sprite.cpp Quake/r_world.cpp Quake/sbar.cpp Quake/snd_codec.cpp Quake/snd_dma.cpp Quake/snd_flac.cpp Quake/snd_mem.cpp Quake/snd_mikmod.cpp Quake/snd_mix.cpp Quake/snd_modplug.cpp Quake/snd_mp3.cpp Quake/snd_mp3tag.cpp Quake/snd_mpg123.cpp Quake/snd_opus.cpp Quake/snd_sdl.cpp Quake/snd_umx.cpp Quake/snd_vorbis.cpp Quake/snd_wave.cpp Quake/snd_xmp.cpp Quake/strlcat.cpp Quake/strlcpy.cpp Quake/sv_main.cpp Quake/sv_move.cpp Quake/sv_phys.cpp Quake/sv_user.cpp Quake/sys_sdl_unix.cpp Quake/view.cpp Quake/wad.cpp Quake/world.cpp Quake/zone.cpp ) add_executable(quakespasm Quake/bgmusic.cpp Quake/cd_sdl.cpp Quake/cfgfile.cpp Quake/chase.cpp Quake/cl_demo.cpp Quake/cl_input.cpp Quake/cl_main.cpp Quake/cl_parse.cpp Quake/cl_tent.cpp Quake/cmd.cpp Quake/common.cpp Quake/console.cpp Quake/crc.cpp Quake/convar.cpp Quake/gl_draw.cpp Quake/gl_fog.cpp Quake/gl_mesh.cpp Quake/gl_model.cpp Quake/gl_refrag.cpp Quake/gl_rlight.cpp Quake/gl_rmain.cpp Quake/gl_rmisc.cpp Quake/gl_screen.cpp Quake/gl_sky.cpp Quake/gl_texmgr.cpp Quake/gl_vidsdl.cpp Quake/gl_warp.cpp Quake/host.cpp Quake/host_cmd.cpp Quake/image.cpp Quake/in_sdl.cpp Quake/keys.cpp Quake/main_sdl.cpp Quake/mathlib.cpp Quake/menu.cpp Quake/miniz.cpp Quake/net_bsd.cpp Quake/net_dgrm.cpp Quake/net_loop.cpp Quake/net_main.cpp Quake/net_udp.cpp Quake/pl_linux.cpp Quake/pr_cmds.cpp Quake/pr_edict.cpp Quake/pr_exec.cpp Quake/r_alias.cpp Quake/r_brush.cpp Quake/r_part.cpp Quake/r_sprite.cpp Quake/r_world.cpp Quake/sbar.cpp Quake/snd_codec.cpp Quake/snd_dma.cpp Quake/snd_flac.cpp Quake/snd_mem.cpp Quake/snd_mikmod.cpp Quake/snd_mix.cpp Quake/snd_modplug.cpp Quake/snd_mp3.cpp Quake/snd_mp3tag.cpp Quake/snd_mpg123.cpp Quake/snd_opus.cpp Quake/snd_sdl.cpp Quake/snd_umx.cpp Quake/snd_vorbis.cpp Quake/snd_wave.cpp Quake/snd_xmp.cpp Quake/strlcat.cpp Quake/strlcpy.cpp Quake/sv_main.cpp Quake/sv_move.cpp Quake/sv_phys.cpp Quake/sv_user.cpp Quake/sys_sdl_unix.cpp Quake/view.cpp Quake/wad.cpp Quake/world.cpp Quake/zone.cpp
Quake/net_msg.cpp)
target_link_libraries(quakespasm OpenGL::GL) target_link_libraries(quakespasm OpenGL::GL)
target_link_libraries(quakespasm SDL::SDL) target_link_libraries(quakespasm SDL::SDL)
+43 -43
View File
@@ -35,11 +35,11 @@
#define CDRIPTYPE(x) (((x) & CDRIP_TYPES) != 0) #define CDRIPTYPE(x) (((x) & CDRIP_TYPES) != 0)
namespace music { namespace music {
bool bgmloop; bool looping;
convar bgm_extmusic{"bgm_extmusic", "1", {.archive = true}}; convar extmusic{"bgm_extmusic", "1", {.archive = true}};
namespace { namespace {
snd_stream_t *bgmstream = nullptr; snd_stream_t *stream = nullptr;
bool no_extmusic = false; bool no_extmusic = false;
float old_volume = -1.0f; float old_volume = -1.0f;
@@ -125,17 +125,17 @@ namespace music {
if (command::argc() == 2) { if (command::argc() == 2) {
if (q_strcasecmp(command::argv(1)->c_str(), "0") == 0 || if (q_strcasecmp(command::argv(1)->c_str(), "0") == 0 ||
q_strcasecmp(command::argv(1)->c_str(), "off") == 0) q_strcasecmp(command::argv(1)->c_str(), "off") == 0)
bgmloop = false; looping = false;
else if (q_strcasecmp(command::argv(1)->c_str(), "1") == 0 || else if (q_strcasecmp(command::argv(1)->c_str(), "1") == 0 ||
q_strcasecmp(command::argv(1)->c_str(), "on") == 0) q_strcasecmp(command::argv(1)->c_str(), "on") == 0)
bgmloop = true; looping = true;
else if (q_strcasecmp(command::argv(1)->c_str(), "toggle") == 0) else if (q_strcasecmp(command::argv(1)->c_str(), "toggle") == 0)
bgmloop = !bgmloop; looping = !looping;
if (bgmstream) bgmstream->loop = bgmloop; if (stream) stream->loop = looping;
} }
if (bgmloop) if (looping)
console::info("Music will be looped\n"); console::info("Music will be looped\n");
else else
console::info("Music will not be looped\n"); console::info("Music will not be looped\n");
@@ -148,8 +148,8 @@ namespace music {
void _jump() { void _jump() {
if (command::argc() != 2) { if (command::argc() != 2) {
console::info("music_jump <ordernum>\n"); console::info("music_jump <ordernum>\n");
} else if (bgmstream) { } else if (stream) {
S_CodecJumpToOrder(bgmstream, static_cast<int>(std::strtol(command::argv(1)->c_str(), nullptr, 10))); S_CodecJumpToOrder(stream, static_cast<int>(std::strtol(command::argv(1)->c_str(), nullptr, 10)));
} }
} }
@@ -170,8 +170,8 @@ namespace music {
/* not supported in quake */ /* not supported in quake */
break; break;
case player_kind::streamer: case player_kind::streamer:
bgmstream = S_CodecOpenStreamType(tmp, handler.type, bgmloop); stream = S_CodecOpenStreamType(tmp, handler.type, looping);
if (bgmstream) if (stream)
return; /* success */ return; /* success */
break; break;
case player_kind::none: case player_kind::none:
@@ -191,7 +191,7 @@ namespace music {
int fileBytes; int fileBytes;
byte raw[16384]; byte raw[16384];
if (bgmstream->status != STREAM_PLAY) { if (stream->status != STREAM_PLAY) {
return; return;
} }
@@ -209,42 +209,42 @@ namespace music {
bufferSamples = MAX_RAW_SAMPLES - (s_rawend - paintedtime); bufferSamples = MAX_RAW_SAMPLES - (s_rawend - paintedtime);
/* decide how much data needs to be read from the file */ /* decide how much data needs to be read from the file */
fileSamples = bufferSamples * bgmstream->info.rate / shm->speed; fileSamples = bufferSamples * stream->info.rate / shm->speed;
if (!fileSamples) if (!fileSamples)
return; return;
/* our max buffer size */ /* our max buffer size */
fileBytes = fileSamples * (bgmstream->info.width * bgmstream->info.channels); fileBytes = fileSamples * (stream->info.width * stream->info.channels);
if (fileBytes > (int) sizeof(raw)) { if (fileBytes > (int) sizeof(raw)) {
fileBytes = (int) sizeof(raw); fileBytes = (int) sizeof(raw);
fileSamples = fileBytes / fileSamples = fileBytes /
(bgmstream->info.width * bgmstream->info.channels); (stream->info.width * stream->info.channels);
} }
/* Read */ /* Read */
res = S_CodecReadStream(bgmstream, fileBytes, raw); res = S_CodecReadStream(stream, fileBytes, raw);
if (res < fileBytes) { if (res < fileBytes) {
fileBytes = res; fileBytes = res;
fileSamples = res / (bgmstream->info.width * bgmstream->info.channels); fileSamples = res / (stream->info.width * stream->info.channels);
} }
if (res > 0) /* data: add to raw buffer */ if (res > 0) /* data: add to raw buffer */
{ {
S_RawSamples(fileSamples, bgmstream->info.rate, S_RawSamples(fileSamples, stream->info.rate,
bgmstream->info.width, stream->info.width,
bgmstream->info.channels, stream->info.channels,
raw, bgmvolume.value); raw, bgmvolume.value);
did_rewind = false; did_rewind = false;
} else if (res == 0) /* EOF */ } else if (res == 0) /* EOF */
{ {
if (bgmloop) { if (looping) {
if (did_rewind) { if (did_rewind) {
console::info("Stream keeps returning EOF.\n"); console::info("Stream keeps returning EOF.\n");
stop(); stop();
return; return;
} }
res = S_CodecRewindStream(bgmstream); res = S_CodecRewindStream(stream);
if (res != 0) { if (res != 0) {
console::info("Stream seek error (%i), stopping.\n", res); console::info("Stream seek error (%i), stopping.\n", res);
stop(); stop();
@@ -266,7 +266,7 @@ namespace music {
} }
void init() { void init() {
bgm_extmusic.inscribe(); extmusic.inscribe();
command::add("music", _play); command::add("music", _play);
command::add("music_pause", _pause); command::add("music_pause", _pause);
command::add("music_resume", _resume); command::add("music_resume", _resume);
@@ -277,7 +277,7 @@ namespace music {
if (common::check_param("-noextmusic").has_value()) if (common::check_param("-noextmusic").has_value())
no_extmusic = true; no_extmusic = true;
bgmloop = true; looping = true;
for (auto i = 0; wanted_handlers[i].type != CODECTYPE_NONE; i++) { for (auto i = 0; wanted_handlers[i].type != CODECTYPE_NONE; i++) {
switch (wanted_handlers[i].player) { switch (wanted_handlers[i].player) {
@@ -341,8 +341,8 @@ namespace music {
/* not supported in quake */ /* not supported in quake */
break; break;
case player_kind::streamer: case player_kind::streamer:
bgmstream = S_CodecOpenStreamType(tmp, chosen->type, bgmloop); stream = S_CodecOpenStreamType(tmp, chosen->type, looping);
if (bgmstream) if (stream)
return; /* success */ return; /* success */
break; break;
case player_kind::none: case player_kind::none:
@@ -354,10 +354,10 @@ namespace music {
} }
void stop() { void stop() {
if (bgmstream) { if (stream) {
bgmstream->status = STREAM_NONE; stream->status = STREAM_NONE;
S_CodecCloseStream(bgmstream); S_CodecCloseStream(stream);
bgmstream = nullptr; stream = nullptr;
s_rawend = 0; s_rawend = 0;
} }
} }
@@ -370,25 +370,25 @@ namespace music {
bgmvolume.set("1"); bgmvolume.set("1");
old_volume = bgmvolume.value; old_volume = bgmvolume.value;
} }
if (bgmstream) if (stream)
update_stream(); update_stream();
} }
void pause() { void pause() {
if (bgmstream) { if (stream) {
if (bgmstream->status == STREAM_PLAY) if (stream->status == STREAM_PLAY)
bgmstream->status = STREAM_PAUSE; stream->status = STREAM_PAUSE;
} }
} }
void resume() { void resume() {
if (bgmstream) { if (stream) {
if (bgmstream->status == STREAM_PAUSE) if (stream->status == STREAM_PAUSE)
bgmstream->status = STREAM_PLAY; stream->status = STREAM_PLAY;
} }
} }
void play_cd_track(const byte track, const bool looping) { void play_cd_track(const byte track, const bool should_loop) {
/* instead of searching by the order of music_handlers, do so by /* instead of searching by the order of music_handlers, do so by
* the order of searchpath priority: the file from the searchpath * the order of searchpath priority: the file from the searchpath
* with the highest path_id is most likely from our own gamedir * with the highest path_id is most likely from our own gamedir
@@ -400,14 +400,14 @@ namespace music {
unsigned int path_id; unsigned int path_id;
stop(); stop();
if (CDAudio_Play(track, looping) == 0) { if (CDAudio_Play(track, should_loop) == 0) {
return; /* success */ return; /* success */
} }
if (active_handlers.empty()) if (active_handlers.empty())
return; // We obviously can't play anything without handlers. return; // We obviously can't play anything without handlers.
if (no_extmusic || bgm_extmusic.value == 0.0) if (no_extmusic || extmusic.value == 0.0)
return; return;
unsigned int prev_id = 0; unsigned int prev_id = 0;
@@ -437,8 +437,8 @@ namespace music {
else { else {
q_snprintf(tmp, sizeof(tmp), "%s/track%02d.%s", q_snprintf(tmp, sizeof(tmp), "%s/track%02d.%s",
MUSIC_DIRNAME, static_cast<int>(track), ext); MUSIC_DIRNAME, static_cast<int>(track), ext);
bgmstream = S_CodecOpenStreamType(tmp, type, bgmloop); stream = S_CodecOpenStreamType(tmp, type, should_loop);
if (!bgmstream) if (!stream)
console::info("Couldn't handle music file %s\n", tmp); console::info("Couldn't handle music file %s\n", tmp);
} }
} }
+3 -3
View File
@@ -26,8 +26,8 @@
#pragma once #pragma once
namespace music { namespace music {
extern bool bgmloop; extern bool looping;
extern convar bgm_extmusic; extern convar extmusic;
void init(); void init();
@@ -43,5 +43,5 @@ namespace music {
void resume(); void resume();
void play_cd_track(byte track, bool looping); void play_cd_track(byte track, bool should_loop);
} }
+150 -190
View File
@@ -24,7 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "quakedef.hpp" #include "quakedef.hpp"
static void CL_FinishTimeDemo (void); static void CL_FinishTimeDemo(void);
/* /*
============================================================================== ==============================================================================
@@ -48,10 +48,9 @@ static int *demo_head_sizes;
CL_ClearSignons CL_ClearSignons
============== ==============
*/ */
void CL_ClearSignons (void) void CL_ClearSignons(void) {
{ VEC_CLEAR(demo_head);
VEC_CLEAR (demo_head); VEC_CLEAR(demo_head_sizes);
VEC_CLEAR (demo_head_sizes);
cls.signon = 0; cls.signon = 0;
} }
@@ -62,19 +61,18 @@ CL_StopPlayback
Called when a demo file runs out, or the user starts a game Called when a demo file runs out, or the user starts a game
============== ==============
*/ */
void CL_StopPlayback (void) void CL_StopPlayback(void) {
{
if (!cls.demoplayback) if (!cls.demoplayback)
return; return;
fclose (cls.demofile); fclose(cls.demofile);
cls.demoplayback = false; cls.demoplayback = false;
cls.demopaused = false; cls.demopaused = false;
cls.demofile = NULL; cls.demofile = NULL;
cls.state = ca_disconnected; cls.state = ca_disconnected;
if (cls.timedemo) if (cls.timedemo)
CL_FinishTimeDemo (); CL_FinishTimeDemo();
} }
/* /*
@@ -84,25 +82,22 @@ CL_WriteDemoMessage
Dumps the current net message, prefixed by the length and view angles Dumps the current net message, prefixed by the length and view angles
==================== ====================
*/ */
static void CL_WriteDemoMessage (void) static void CL_WriteDemoMessage(void) {
{
int len; int len;
int i; int i;
float f; float f;
len = LittleLong (net_message.cursize); len = LittleLong(net_message.size());
fwrite (&len, 4, 1, cls.demofile); fwrite(&len, 4, 1, cls.demofile);
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++) {
{ f = LittleFloat(cl.viewangles[i]);
f = LittleFloat (cl.viewangles[i]); fwrite(&f, 4, 1, cls.demofile);
fwrite (&f, 4, 1, cls.demofile);
} }
fwrite (net_message.data, net_message.cursize, 1, cls.demofile); fwrite(net_message.data(), net_message.size(), 1, cls.demofile);
fflush (cls.demofile); fflush(cls.demofile);
} }
static int CL_GetDemoMessage (void) static int CL_GetDemoMessage(void) {
{
int r, i; int r, i;
float f; float f;
@@ -112,8 +107,7 @@ static int CL_GetDemoMessage (void)
// decide if it is time to grab the next message // decide if it is time to grab the next message
if (cls.signon == SIGNONS) // always grab until fully connected if (cls.signon == SIGNONS) // always grab until fully connected
{ {
if (cls.timedemo) if (cls.timedemo) {
{
if (host_framecount == cls.td_lastframe) if (host_framecount == cls.td_lastframe)
return 0; // already read this frame's message return 0; // already read this frame's message
cls.td_lastframe = host_framecount; cls.td_lastframe = host_framecount;
@@ -121,30 +115,28 @@ static int CL_GetDemoMessage (void)
// so the bogus time on the first frame doesn't count // so the bogus time on the first frame doesn't count
if (host_framecount == cls.td_startframe + 1) if (host_framecount == cls.td_startframe + 1)
cls.td_starttime = realtime; cls.td_starttime = realtime;
} } else if (/* cl.time > 0 && */ cl.time <= cl.mtime[0]) {
else if (/* cl.time > 0 && */ cl.time <= cl.mtime[0])
{
return 0; // don't need another message yet return 0; // don't need another message yet
} }
} }
// get the next message // get the next message
if (! fread(&net_message.cursize, 4, 1, cls.demofile)) int msgsize;
Sys_Error ("Demo read error"); if (!fread(&msgsize, 4, 1, cls.demofile))
VectorCopy (cl.mviewangles[0], cl.mviewangles[1]); Sys_Error("Demo read error");
for (i = 0 ; i < 3 ; i++) VectorCopy(cl.mviewangles[0], cl.mviewangles[1]);
{ for (i = 0; i < 3; i++) {
r = fread (&f, 4, 1, cls.demofile); r = fread(&f, 4, 1, cls.demofile);
cl.mviewangles[0][i] = LittleFloat (f); cl.mviewangles[0][i] = LittleFloat(f);
} }
net_message.cursize = LittleLong (net_message.cursize); if (msgsize > MAX_MSGLEN)
if (net_message.cursize > MAX_MSGLEN) Sys_Error("Demo message > MAX_MSGLEN");
Sys_Error ("Demo message > MAX_MSGLEN"); std::uint8_t buf[msgsize];
r = fread (net_message.data, net_message.cursize, 1, cls.demofile); r = fread(&buf, msgsize, 1, cls.demofile);
if (r != 1) net_message.write(buf, msgsize);
{ if (r != 1) {
CL_StopPlayback (); CL_StopPlayback();
return 0; return 0;
} }
@@ -158,36 +150,33 @@ CL_GetMessage
Handles recording and playback of demos, on top of NET_ code Handles recording and playback of demos, on top of NET_ code
==================== ====================
*/ */
int CL_GetMessage (void) int CL_GetMessage(void) {
{
int r; int r;
if (cls.demoplayback) if (cls.demoplayback)
return CL_GetDemoMessage (); return CL_GetDemoMessage();
while (1) while (1) {
{ r = NET_GetMessage(cls.netcon);
r = NET_GetMessage (cls.netcon);
if (r != 1 && r != 2) if (r != 1 && r != 2)
return r; return r;
// discard nop keepalive message // discard nop keepalive message
if (net_message.cursize == 1 && net_message.data[0] == svc_nop) if (net_message.size() == 1 && net_message.data()[0] == svc_nop)
console::info ("<-- server to client keepalive\n"); console::info("<-- server to client keepalive\n");
else else
break; break;
} }
if (cls.demorecording) if (cls.demorecording)
CL_WriteDemoMessage (); CL_WriteDemoMessage();
if (cls.signon < 2) if (cls.signon < 2) {
{
// record messages before full connection, so that a // record messages before full connection, so that a
// demo record can happen after connection is done // demo record can happen after connection is done
Vec_Append ((void**)&demo_head, 1, net_message.data, net_message.cursize); Vec_Append((void **) &demo_head, 1, net_message.data(), net_message.size());
VEC_PUSH (demo_head_sizes, net_message.cursize); VEC_PUSH(demo_head_sizes, net_message.size());
} }
return r; return r;
@@ -201,30 +190,28 @@ CL_Stop_f
stop recording a demo stop recording a demo
==================== ====================
*/ */
void CL_Stop_f (void) void CL_Stop_f(void) {
{
if (command::last_source != command::source::command) if (command::last_source != command::source::command)
return; return;
if (!cls.demorecording) if (!cls.demorecording) {
{ console::info("Not recording a demo.\n");
console::info ("Not recording a demo.\n");
return; return;
} }
// write a disconnect message to the demo file // write a disconnect message to the demo file
SZ_Clear (&net_message); net_message.clear();
MSG_WriteByte (&net_message, svc_disconnect); net_message.write_byte(svc_disconnect);
CL_WriteDemoMessage (); CL_WriteDemoMessage();
// finish up // finish up
fclose (cls.demofile); fclose(cls.demofile);
cls.demofile = NULL; cls.demofile = NULL;
cls.demorecording = false; cls.demorecording = false;
console::info ("Completed demo\n"); console::info("Completed demo\n");
// ericw -- update demo tab-completion list // ericw -- update demo tab-completion list
DemoList_Rebuild (); DemoList_Rebuild();
} }
/* /*
@@ -234,8 +221,7 @@ CL_Record_f
record <demoname> <map> [cd track] record <demoname> <map> [cd track]
==================== ====================
*/ */
void CL_Record_f (void) void CL_Record_f(void) {
{
int c; int c;
char name[MAX_OSPATH]; char name[MAX_OSPATH];
int track; int track;
@@ -243,9 +229,8 @@ void CL_Record_f (void)
if (command::last_source != command::source::command) if (command::last_source != command::source::command)
return; return;
if (cls.demoplayback) if (cls.demoplayback) {
{ console::info("Can't record during demo playback\n");
console::info ("Can't record during demo playback\n");
return; return;
} }
@@ -253,142 +238,125 @@ void CL_Record_f (void)
CL_Stop_f(); CL_Stop_f();
c = command::argc(); c = command::argc();
if (c != 2 && c != 3 && c != 4) if (c != 2 && c != 3 && c != 4) {
{ console::info("record <demoname> [<map> [cd track]]\n");
console::info ("record <demoname> [<map> [cd track]]\n");
return; return;
} }
if (strstr(command::argv(1).value_or("").c_str(), "..")) if (strstr(command::argv(1).value_or("").c_str(), "..")) {
{ console::info("Relative pathnames are not allowed.\n");
console::info ("Relative pathnames are not allowed.\n");
return; return;
} }
if (c == 2 && cls.state == ca_connected) if (c == 2 && cls.state == ca_connected) {
{
#if 0 #if 0
console::info("Can not record - already connected to server\nClient demo recording must be started before connecting\n"); console::info(
"Can not record - already connected to server\nClient demo recording must be started before connecting\n");
return; return;
#endif #endif
if (cls.signon < 2) if (cls.signon < 2) {
{
console::info("Can't record - try again when connected\n"); console::info("Can't record - try again when connected\n");
return; return;
} }
} }
// write the forced cd track number, or -1 // write the forced cd track number, or -1
if (c == 4) if (c == 4) {
{
track = atoi(command::argv(3)->c_str()); track = atoi(command::argv(3)->c_str());
console::info ("Forcing CD track to %i\n", cls.forcetrack); console::info("Forcing CD track to %i\n", cls.forcetrack);
} } else {
else
{
track = -1; track = -1;
} }
q_snprintf (name, sizeof(name), "%s/%s", com_gamedir, command::argv(1).value_or("").c_str()); q_snprintf(name, sizeof(name), "%s/%s", com_gamedir, command::argv(1).value_or("").c_str());
// start the map up // start the map up
if (c > 2) if (c > 2) {
{ command::execute_string(std::format("map {:s}", *command::argv(2)), command::source::command);
command::execute_string ( std::format("map {:s}", *command::argv(2)), command::source::command);
if (cls.state != ca_connected) if (cls.state != ca_connected)
return; return;
} }
// open the demo file // open the demo file
COM_AddExtension (name, ".dem", sizeof(name)); COM_AddExtension(name, ".dem", sizeof(name));
console::info ("recording to %s.\n", name); console::info("recording to %s.\n", name);
cls.demofile = fopen (name, "wb"); cls.demofile = fopen(name, "wb");
if (!cls.demofile) if (!cls.demofile) {
{ console::info("ERROR: couldn't create %s\n", name);
console::info ("ERROR: couldn't create %s\n", name);
return; return;
} }
cls.forcetrack = track; cls.forcetrack = track;
fprintf (cls.demofile, "%i\n", cls.forcetrack); fprintf(cls.demofile, "%i\n", cls.forcetrack);
cls.demorecording = true; cls.demorecording = true;
// from ProQuake: initialize the demo file if we're already connected // from ProQuake: initialize the demo file if we're already connected
if (c == 2 && cls.state == ca_connected) if (c == 2 && cls.state == ca_connected) {
{
static byte tmpbuf[NET_MAXMESSAGE]; static byte tmpbuf[NET_MAXMESSAGE];
byte *data = net_message.data; net::msg old = net_message;
int cursize = net_message.cursize;
int maxsize = net_message.maxsize;
int i, count;
net_message.data = demo_head; const auto count = VEC_SIZE(demo_head_sizes);
for (i = 0, count = VEC_SIZE (demo_head_sizes); i < count; i++) auto offset = 0;
{ for (auto i = 0; i < count; i++) {
net_message.cursize = demo_head_sizes[i]; net_message = net::msg{};
CL_WriteDemoMessage (); net_message.write(&demo_head[offset], demo_head_sizes[i]);
net_message.data += net_message.cursize; offset += demo_head_sizes[i];
CL_WriteDemoMessage();
} }
net_message.data = tmpbuf; net_message.clear();
net_message.maxsize = sizeof (tmpbuf);
SZ_Clear (&net_message);
// current names, colors, and frag counts // current names, colors, and frag counts
for (i = 0; i < cl.maxclients; i++) for (auto i = 0; i < cl.maxclients; i++) {
{ net_message.write_byte(svc_updatename);
MSG_WriteByte (&net_message, svc_updatename); net_message.write_byte(i);
MSG_WriteByte (&net_message, i); net_message.write_string(cl.scores[i].name);
MSG_WriteString (&net_message, cl.scores[i].name); net_message.write_byte(svc_updatefrags);
MSG_WriteByte (&net_message, svc_updatefrags); net_message.write_byte(i);
MSG_WriteByte (&net_message, i); net_message.write_short(cl.scores[i].frags);
MSG_WriteShort (&net_message, cl.scores[i].frags); net_message.write_byte(svc_updatecolors);
MSG_WriteByte (&net_message, svc_updatecolors); net_message.write_byte(i);
MSG_WriteByte (&net_message, i); net_message.write_byte(cl.scores[i].colors);
MSG_WriteByte (&net_message, cl.scores[i].colors);
} }
// send all current light styles // send all current light styles
for (i = 0; i < MAX_LIGHTSTYLES; i++) for (auto i = 0; i < MAX_LIGHTSTYLES; i++) {
{ net_message.write_byte(svc_lightstyle);
MSG_WriteByte (&net_message, svc_lightstyle); net_message.write_byte(i);
MSG_WriteByte (&net_message, i); net_message.write_string(cl_lightstyle[i].map);
MSG_WriteString (&net_message, cl_lightstyle[i].map);
} }
// what about the CD track or SVC fog... future consideration. // what about the CD track or SVC fog... future consideration.
MSG_WriteByte (&net_message, svc_updatestat); net_message.write_byte(svc_updatestat);
MSG_WriteByte (&net_message, STAT_TOTALSECRETS); net_message.write_byte(STAT_TOTALSECRETS);
MSG_WriteLong (&net_message, cl.stats[STAT_TOTALSECRETS]); net_message.write_long(cl.stats[STAT_TOTALSECRETS]);
MSG_WriteByte (&net_message, svc_updatestat); net_message.write_byte(svc_updatestat);
MSG_WriteByte (&net_message, STAT_TOTALMONSTERS); net_message.write_byte(STAT_TOTALMONSTERS);
MSG_WriteLong (&net_message, cl.stats[STAT_TOTALMONSTERS]); net_message.write_long(cl.stats[STAT_TOTALMONSTERS]);
MSG_WriteByte (&net_message, svc_updatestat); net_message.write_byte(svc_updatestat);
MSG_WriteByte (&net_message, STAT_SECRETS); net_message.write_byte(STAT_SECRETS);
MSG_WriteLong (&net_message, cl.stats[STAT_SECRETS]); net_message.write_long(cl.stats[STAT_SECRETS]);
MSG_WriteByte (&net_message, svc_updatestat); net_message.write_byte(svc_updatestat);
MSG_WriteByte (&net_message, STAT_MONSTERS); net_message.write_byte(STAT_MONSTERS);
MSG_WriteLong (&net_message, cl.stats[STAT_MONSTERS]); net_message.write_long(cl.stats[STAT_MONSTERS]);
// view entity // view entity
MSG_WriteByte (&net_message, svc_setview); net_message.write_byte(svc_setview);
MSG_WriteShort (&net_message, cl.viewentity); net_message.write_short(cl.viewentity);
// signon // signon
MSG_WriteByte (&net_message, svc_signonnum); net_message.write_byte(svc_signonnum);
MSG_WriteByte (&net_message, 3); net_message.write_byte(3);
CL_WriteDemoMessage(); CL_WriteDemoMessage();
// restore net_message // restore net_message
net_message.data = data; net_message = old;
net_message.cursize = cursize;
net_message.maxsize = maxsize;
} }
} }
@@ -400,46 +368,42 @@ CL_PlayDemo_f
play [demoname] play [demoname]
==================== ====================
*/ */
void CL_PlayDemo_f (void) void CL_PlayDemo_f(void) {
{
char name[MAX_OSPATH]; char name[MAX_OSPATH];
if (command::last_source != command::source::command) if (command::last_source != command::source::command)
return; return;
if (command::argc() != 2) if (command::argc() != 2) {
{ console::info("playdemo <demoname> : plays a demo\n");
console::info ("playdemo <demoname> : plays a demo\n");
return; return;
} }
// disconnect from server // disconnect from server
CL_Disconnect (); CL_Disconnect();
// open the demo file // open the demo file
std::strncpy(name, command::argv(1).value_or("").c_str(), sizeof(name)); std::strncpy(name, command::argv(1).value_or("").c_str(), sizeof(name));
COM_AddExtension (name, ".dem", sizeof(name)); COM_AddExtension(name, ".dem", sizeof(name));
console::info ("Playing demo from %s.\n", name); console::info("Playing demo from %s.\n", name);
COM_FOpenFile (name, &cls.demofile, NULL); COM_FOpenFile(name, &cls.demofile, NULL);
if (!cls.demofile) if (!cls.demofile) {
{ console::info("ERROR: couldn't open %s\n", name);
console::info ("ERROR: couldn't open %s\n", name);
cls.demonum = -1; // stop demo loop cls.demonum = -1; // stop demo loop
return; return;
} }
// ZOID, fscanf is evil // ZOID, fscanf is evil
// O.S.: if a space character e.g. 0x20 (' ') follows '\n', // O.S.: if a space character e.g. 0x20 (' ') follows '\n',
// fscanf skips that byte too and screws up further reads. // fscanf skips that byte too and screws up further reads.
// fscanf (cls.demofile, "%i\n", &cls.forcetrack); // fscanf (cls.demofile, "%i\n", &cls.forcetrack);
if (fscanf (cls.demofile, "%i", &cls.forcetrack) != 1 || fgetc (cls.demofile) != '\n') if (fscanf(cls.demofile, "%i", &cls.forcetrack) != 1 || fgetc(cls.demofile) != '\n') {
{ fclose(cls.demofile);
fclose (cls.demofile);
cls.demofile = NULL; cls.demofile = NULL;
cls.demonum = -1; // stop demo loop cls.demonum = -1; // stop demo loop
console::info ("ERROR: demo \"%s\" is invalid\n", name); console::info("ERROR: demo \"%s\" is invalid\n", name);
return; return;
} }
@@ -447,7 +411,7 @@ void CL_PlayDemo_f (void)
cls.demopaused = false; cls.demopaused = false;
cls.state = ca_connected; cls.state = ca_connected;
// get rid of the menu and/or console // get rid of the menu and/or console
key_dest = key_game; key_dest = key_game;
} }
@@ -457,19 +421,18 @@ CL_FinishTimeDemo
==================== ====================
*/ */
static void CL_FinishTimeDemo (void) static void CL_FinishTimeDemo(void) {
{
int frames; int frames;
float time; float time;
cls.timedemo = false; cls.timedemo = false;
// the first frame didn't count // the first frame didn't count
frames = (host_framecount - cls.td_startframe) - 1; frames = (host_framecount - cls.td_startframe) - 1;
time = realtime - cls.td_starttime; time = realtime - cls.td_starttime;
if (!time) if (!time)
time = 1; time = 1;
console::info ("%i frames %5.1f seconds %5.1f fps\n", frames, time, frames/time); console::info("%i frames %5.1f seconds %5.1f fps\n", frames, time, frames / time);
} }
/* /*
@@ -479,26 +442,23 @@ CL_TimeDemo_f
timedemo [demoname] timedemo [demoname]
==================== ====================
*/ */
void CL_TimeDemo_f (void) void CL_TimeDemo_f(void) {
{
if (command::last_source != command::source::command) if (command::last_source != command::source::command)
return; return;
if (command::argc() != 2) if (command::argc() != 2) {
{ console::info("timedemo <demoname> : gets demo speeds\n");
console::info ("timedemo <demoname> : gets demo speeds\n");
return; return;
} }
CL_PlayDemo_f (); CL_PlayDemo_f();
if (!cls.demofile) if (!cls.demofile)
return; return;
// cls.td_starttime will be grabbed at the second frame of the demo, so // cls.td_starttime will be grabbed at the second frame of the demo, so
// all the loading time doesn't get counted // all the loading time doesn't get counted
cls.timedemo = true; cls.timedemo = true;
cls.td_startframe = host_framecount; cls.td_startframe = host_framecount;
cls.td_lastframe = -1; // get a new message this frame cls.td_lastframe = -1; // get a new message this frame
} }
+11 -17
View File
@@ -328,33 +328,27 @@ CL_SendMove
void CL_SendMove(const usercmd_t *cmd) { void CL_SendMove(const usercmd_t *cmd) {
int i; int i;
int bits; int bits;
sizebuf_t buf; net::msg msg{};
byte data[128];
buf.maxsize = 128;
buf.cursize = 0;
buf.data = data;
cl.cmd = *cmd; cl.cmd = *cmd;
// //
// send the movement message // send the movement message
// //
MSG_WriteByte(&buf, clc_move); msg.write_byte(clc_move);
msg.write_float(cl.mtime[0]);
MSG_WriteFloat(&buf, cl.mtime[0]); // so server can get ping times
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
//johnfitz -- 16-bit angles for PROTOCOL_FITZQUAKE //johnfitz -- 16-bit angles for PROTOCOL_FITZQUAKE
if (cl.protocol == PROTOCOL_NETQUAKE) if (cl.protocol == PROTOCOL_NETQUAKE)
MSG_WriteAngle(&buf, cl.viewangles[i], cl.protocolflags); msg.write_angle(cl.viewangles[i], static_cast<net::rmq_flags>(cl.protocolflags));
else else
MSG_WriteAngle16(&buf, cl.viewangles[i], cl.protocolflags); msg.write_angle_16(cl.viewangles[i], static_cast<net::rmq_flags>(cl.protocolflags));
//johnfitz //johnfitz
MSG_WriteShort(&buf, cmd->forwardmove); msg.write_short(cmd->forwardmove);
MSG_WriteShort(&buf, cmd->sidemove); msg.write_short(cmd->sidemove);
MSG_WriteShort(&buf, cmd->upmove); msg.write_short(cmd->upmove);
// //
// send button bits // send button bits
@@ -369,9 +363,9 @@ void CL_SendMove(const usercmd_t *cmd) {
bits |= 2; bits |= 2;
in_jump.state &= ~2; in_jump.state &= ~2;
MSG_WriteByte(&buf, bits); msg.write_byte(bits);
MSG_WriteByte(&buf, in_impulse); msg.write_byte(in_impulse);
in_impulse = 0; in_impulse = 0;
// //
@@ -387,7 +381,7 @@ void CL_SendMove(const usercmd_t *cmd) {
if (++cl.movemessages <= 2) if (++cl.movemessages <= 2)
return; return;
if (NET_SendUnreliableMessage(cls.netcon, &buf) == -1) { if (NET_SendUnreliableMessage(cls.netcon, msg) == -1) {
console::info("CL_SendMove: lost server connection\n"); console::info("CL_SendMove: lost server connection\n");
CL_Disconnect(); CL_Disconnect();
} }
+21 -21
View File
@@ -78,7 +78,7 @@ void CL_ClearState(void) {
// wipe the entire cl structure // wipe the entire cl structure
memset(&cl, 0, sizeof(cl)); memset(&cl, 0, sizeof(cl));
SZ_Clear(&cls.message); cls.message = net::msg{};
// clear other arrays // clear other arrays
memset(cl_dlights, 0, sizeof(cl_dlights)); memset(cl_dlights, 0, sizeof(cl_dlights));
@@ -117,10 +117,10 @@ void CL_Disconnect(void) {
CL_Stop_f(); CL_Stop_f();
console::debug("Sending clc_disconnect\n"); console::debug("Sending clc_disconnect\n");
SZ_Clear(&cls.message); cls.message.clear();
MSG_WriteByte(&cls.message, clc_disconnect); cls.message.write_byte(clc_disconnect);
NET_SendUnreliableMessage(cls.netcon, &cls.message); NET_SendUnreliableMessage(cls.netcon, cls.message);
SZ_Clear(&cls.message); cls.message.clear();
NET_Close(cls.netcon); NET_Close(cls.netcon);
cls.state = ca_disconnected; cls.state = ca_disconnected;
@@ -165,7 +165,7 @@ void CL_EstablishConnection(const char *host) {
cls.demonum = -1; // not in the demo loop now cls.demonum = -1; // not in the demo loop now
cls.state = ca_connected; cls.state = ca_connected;
CL_ClearSignons(); // need all the signon messages before playing CL_ClearSignons(); // need all the signon messages before playing
MSG_WriteByte(&cls.message, clc_nop); // NAT Fix from ProQuake cls.message.write_byte(clc_nop); // NAT Fix from ProQuake
} }
/* /*
@@ -182,26 +182,26 @@ void CL_SignonReply(void) {
switch (cls.signon) { switch (cls.signon) {
case 1: case 1:
MSG_WriteByte(&cls.message, clc_stringcmd); cls.message.write_byte(clc_stringcmd);
MSG_WriteString(&cls.message, "prespawn"); cls.message.write_string("prespawn");
break; break;
case 2: case 2:
MSG_WriteByte(&cls.message, clc_stringcmd); cls.message.write_byte(clc_stringcmd);
MSG_WriteString(&cls.message, va("name \"%s\"\n", cl_name.string)); cls.message.write_string(va("name \"%s\"\n", cl_name.string));
MSG_WriteByte(&cls.message, clc_stringcmd); cls.message.write_byte(clc_stringcmd);
MSG_WriteString(&cls.message, cls.message.write_string(
va("color %i %i\n", ((int) cl_color.value) >> 4, ((int) cl_color.value) & 15)); va("color %i %i\n", ((int) cl_color.value) >> 4, ((int) cl_color.value) & 15));
MSG_WriteByte(&cls.message, clc_stringcmd); cls.message.write_byte(clc_stringcmd);
sprintf(str, "spawn %s", cls.spawnparms); sprintf(str, "spawn %s", cls.spawnparms);
MSG_WriteString(&cls.message, str); cls.message.write_string(str);
break; break;
case 3: case 3:
MSG_WriteByte(&cls.message, clc_stringcmd); cls.message.write_byte(clc_stringcmd);
MSG_WriteString(&cls.message, "begin"); cls.message.write_string("begin");
Cache_Report(); // print remaining memory Cache_Report(); // print remaining memory
break; break;
@@ -666,12 +666,12 @@ void CL_SendCmd(void) {
} }
if (cls.demoplayback) { if (cls.demoplayback) {
SZ_Clear(&cls.message); cls.message.clear();
return; return;
} }
// send the reliable message // send the reliable message
if (!cls.message.cursize) if (cls.message.empty())
return; // no message at all return; // no message at all
if (!NET_CanSendMessage(cls.netcon)) { if (!NET_CanSendMessage(cls.netcon)) {
@@ -679,10 +679,10 @@ void CL_SendCmd(void) {
return; return;
} }
if (NET_SendMessage(cls.netcon, &cls.message) == -1) if (NET_SendMessage(cls.netcon, cls.message) == -1)
Host_Error("CL_SendCmd: lost server connection"); Host_Error("CL_SendCmd: lost server connection");
SZ_Clear(&cls.message); cls.message.clear();
} }
/* /*
@@ -744,7 +744,7 @@ CL_Init
================= =================
*/ */
void CL_Init(void) { void CL_Init(void) {
SZ_Alloc(&cls.message, 1024); cls.message = net::msg{};
CL_InitInput(); CL_InitInput();
CL_InitTEnts(); CL_InitTEnts();
+137 -141
View File
@@ -148,32 +148,32 @@ void CL_ParseStartSoundPacket(void) {
float attenuation; float attenuation;
int i; int i;
field_mask = MSG_ReadByte(); field_mask = net_message.read_byte().value();
if (field_mask & SND_VOLUME) if (field_mask & SND_VOLUME)
volume = MSG_ReadByte(); volume = net_message.read_byte().value();
else else
volume = DEFAULT_SOUND_PACKET_VOLUME; volume = DEFAULT_SOUND_PACKET_VOLUME;
if (field_mask & SND_ATTENUATION) if (field_mask & SND_ATTENUATION)
attenuation = MSG_ReadByte() / 64.0; attenuation = net_message.read_byte().value() / 64.0;
else else
attenuation = DEFAULT_SOUND_PACKET_ATTENUATION; attenuation = DEFAULT_SOUND_PACKET_ATTENUATION;
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (field_mask & SND_LARGEENTITY) { if (field_mask & SND_LARGEENTITY) {
ent = (unsigned short) MSG_ReadShort(); ent = (unsigned short) net_message.read_short().value();
channel = MSG_ReadByte(); channel = net_message.read_byte().value();
} else { } else {
channel = (unsigned short) MSG_ReadShort(); channel = (unsigned short) net_message.read_short().value();
ent = channel >> 3; ent = channel >> 3;
channel &= 7; channel &= 7;
} }
if (field_mask & SND_LARGESOUND) if (field_mask & SND_LARGESOUND)
sound_num = (unsigned short) MSG_ReadShort(); sound_num = (unsigned short) net_message.read_short().value();
else else
sound_num = MSG_ReadByte(); sound_num = net_message.read_byte().value();
//johnfitz //johnfitz
//johnfitz -- check soundnum //johnfitz -- check soundnum
@@ -185,7 +185,7 @@ void CL_ParseStartSoundPacket(void) {
Host_Error("CL_ParseStartSoundPacket: ent = %i", ent); Host_Error("CL_ParseStartSoundPacket: ent = %i", ent);
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
pos[i] = MSG_ReadCoord(cl.protocolflags); pos[i] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
S_StartSound(ent, channel, cl.sound_precache[sound_num], pos, volume / 255.0, attenuation); S_StartSound(ent, channel, cl.sound_precache[sound_num], pos, volume / 255.0, attenuation);
} }
@@ -198,8 +198,8 @@ CL_ParseLocalSound - for 2021 rerelease
void CL_ParseLocalSound(void) { void CL_ParseLocalSound(void) {
int field_mask, sound_num; int field_mask, sound_num;
field_mask = MSG_ReadByte(); field_mask = net_message.read_byte().value();
sound_num = (field_mask & SND_LARGESOUND) ? MSG_ReadShort() : MSG_ReadByte(); sound_num = (field_mask & SND_LARGESOUND) ? net_message.read_short().value() : net_message.read_byte().value();
if (sound_num >= MAX_SOUNDS) if (sound_num >= MAX_SOUNDS)
Host_Error("CL_ParseLocalSound: %i > MAX_SOUNDS", sound_num); Host_Error("CL_ParseLocalSound: %i > MAX_SOUNDS", sound_num);
@@ -220,8 +220,6 @@ void CL_KeepaliveMessage(void) {
float time; float time;
static float lastmsg; static float lastmsg;
int ret; int ret;
sizebuf_t old;
byte *olddata;
if (sv.active) if (sv.active)
return; // no need if server is local return; // no need if server is local
@@ -229,9 +227,7 @@ void CL_KeepaliveMessage(void) {
return; return;
// read messages from server, should just be nops // read messages from server, should just be nops
olddata = net_olddata; auto old = net_message;
old = net_message;
memcpy(olddata, net_message.data, net_message.cursize);
do { do {
ret = CL_GetMessage(); ret = CL_GetMessage();
@@ -244,14 +240,13 @@ void CL_KeepaliveMessage(void) {
Host_Error("CL_KeepaliveMessage: received a message"); Host_Error("CL_KeepaliveMessage: received a message");
break; break;
case 2: case 2:
if (MSG_ReadByte() != svc_nop) if (net_message.read_byte().value() != svc_nop)
Host_Error("CL_KeepaliveMessage: datagram wasn't a nop"); Host_Error("CL_KeepaliveMessage: datagram wasn't a nop");
break; break;
} }
} while (ret); } while (ret);
net_message = old; net_message = old;
memcpy(net_message.data, olddata, net_message.cursize);
// check time // check time
time = Sys_DoubleTime(); time = Sys_DoubleTime();
@@ -262,9 +257,9 @@ void CL_KeepaliveMessage(void) {
// write out a nop // write out a nop
console::info("--> client to server keepalive\n"); console::info("--> client to server keepalive\n");
MSG_WriteByte(&cls.message, clc_nop); cls.message.write_byte(clc_nop);
NET_SendMessage(cls.netcon, &cls.message); NET_SendMessage(cls.netcon, cls.message);
SZ_Clear(&cls.message); cls.message.clear();
} }
/* /*
@@ -273,7 +268,6 @@ CL_ParseServerInfo
================== ==================
*/ */
void CL_ParseServerInfo(void) { void CL_ParseServerInfo(void) {
const char *str;
int i; int i;
int nummodels, numsounds; int nummodels, numsounds;
char model_precache[MAX_MODELS][MAX_QPATH]; char model_precache[MAX_MODELS][MAX_QPATH];
@@ -292,7 +286,7 @@ void CL_ParseServerInfo(void) {
CL_ClearState(); CL_ClearState();
// parse protocol version number // parse protocol version number
i = MSG_ReadLong(); i = net_message.read_long().value();
//johnfitz -- support multiple protocols //johnfitz -- support multiple protocols
if (i != PROTOCOL_NETQUAKE && i != PROTOCOL_FITZQUAKE && i != PROTOCOL_RMQ) { if (i != PROTOCOL_NETQUAKE && i != PROTOCOL_FITZQUAKE && i != PROTOCOL_RMQ) {
console::info("\n"); //because there's no newline after serverinfo print console::info("\n"); //because there's no newline after serverinfo print
@@ -307,7 +301,7 @@ void CL_ParseServerInfo(void) {
PRFL_SHORTANGLE | PRFL_FLOATANGLE | PRFL_24BITCOORD | PRFL_FLOATCOORD | PRFL_EDICTSCALE | PRFL_INT32COORD); PRFL_SHORTANGLE | PRFL_FLOATANGLE | PRFL_24BITCOORD | PRFL_FLOATCOORD | PRFL_EDICTSCALE | PRFL_INT32COORD);
// mh - read protocol flags from server so that we know what protocol features to expect // mh - read protocol flags from server so that we know what protocol features to expect
cl.protocolflags = (unsigned int) MSG_ReadLong(); cl.protocolflags = (unsigned int) net_message.read_long().value();
if (0 != (cl.protocolflags & (~supportedflags))) { if (0 != (cl.protocolflags & (~supportedflags))) {
console::warn("PROTOCOL_RMQ protocolflags %i contains unsupported flags\n", cl.protocolflags); console::warn("PROTOCOL_RMQ protocolflags %i contains unsupported flags\n", cl.protocolflags);
@@ -315,22 +309,22 @@ void CL_ParseServerInfo(void) {
} else cl.protocolflags = 0; } else cl.protocolflags = 0;
// parse maxclients // parse maxclients
cl.maxclients = MSG_ReadByte(); cl.maxclients = net_message.read_byte().value();
if (cl.maxclients < 1 || cl.maxclients > MAX_SCOREBOARD) { if (cl.maxclients < 1 || cl.maxclients > MAX_SCOREBOARD) {
Host_Error("Bad maxclients (%u) from server", cl.maxclients); Host_Error("Bad maxclients (%u) from server", cl.maxclients);
} }
cl.scores = (scoreboard_t *) Hunk_AllocName(cl.maxclients * sizeof(*cl.scores), "scores"); cl.scores = (scoreboard_t *) Hunk_AllocName(cl.maxclients * sizeof(*cl.scores), "scores");
// parse gametype // parse gametype
cl.gametype = MSG_ReadByte(); cl.gametype = net_message.read_byte().value();
// parse signon message // parse signon message
str = MSG_ReadString(); auto str = net_message.read_string().value();
std::strncpy(cl.levelname, str, sizeof(cl.levelname)); std::strncpy(cl.levelname, str.c_str(), sizeof(cl.levelname));
// seperate the printfs so the server message can have a color // seperate the printfs so the server message can have a color
console::info("\n%s\n", Con_Quakebar(40)); //johnfitz console::info("\n%s\n", Con_Quakebar(40)); //johnfitz
console::info("%c%s\n", 2, str); console::info("%c%s\n", 2, str.c_str());
//johnfitz -- tell user which protocol this is //johnfitz -- tell user which protocol this is
console::info("Using protocol %i\n", i); console::info("Using protocol %i\n", i);
@@ -342,14 +336,14 @@ void CL_ParseServerInfo(void) {
// precache models // precache models
memset(cl.model_precache, 0, sizeof(cl.model_precache)); memset(cl.model_precache, 0, sizeof(cl.model_precache));
for (nummodels = 1; ; nummodels++) { for (nummodels = 1; ; nummodels++) {
str = MSG_ReadString(); str = net_message.read_string().value();
if (!str[0]) if (!str[0])
break; break;
if (nummodels == MAX_MODELS) { if (nummodels == MAX_MODELS) {
Host_Error("Server sent too many model precaches"); Host_Error("Server sent too many model precaches");
} }
std::strncpy(model_precache[nummodels], str, MAX_QPATH); std::strncpy(model_precache[nummodels], str.c_str(), MAX_QPATH);
Mod_TouchModel(str); Mod_TouchModel(str.c_str());
} }
//johnfitz -- check for excessive models //johnfitz -- check for excessive models
@@ -360,14 +354,14 @@ void CL_ParseServerInfo(void) {
// precache sounds // precache sounds
memset(cl.sound_precache, 0, sizeof(cl.sound_precache)); memset(cl.sound_precache, 0, sizeof(cl.sound_precache));
for (numsounds = 1; ; numsounds++) { for (numsounds = 1; ; numsounds++) {
str = MSG_ReadString(); str = net_message.read_string().value();
if (!str[0]) if (!str[0])
break; break;
if (numsounds == MAX_SOUNDS) { if (numsounds == MAX_SOUNDS) {
Host_Error("Server sent too many sound precaches"); Host_Error("Server sent too many sound precaches");
} }
std::strncpy(sound_precache[numsounds], str, MAX_QPATH); std::strncpy(sound_precache[numsounds], str.c_str(), MAX_QPATH);
S_TouchSound(str); S_TouchSound(str.c_str());
} }
//johnfitz -- check for excessive sounds //johnfitz -- check for excessive sounds
@@ -404,7 +398,7 @@ void CL_ParseServerInfo(void) {
//johnfitz -- clear out string; we don't consider identical //johnfitz -- clear out string; we don't consider identical
//messages to be duplicates if the map has changed in between //messages to be duplicates if the map has changed in between
con_lastcenterstring[0] = 0; console::last_center_string.clear();
//johnfitz //johnfitz
Hunk_Check(); // make sure nothing is hurt Hunk_Check(); // make sure nothing is hurt
@@ -444,23 +438,23 @@ void CL_ParseUpdate(int bits) {
} }
if (bits & U_MOREBITS) { if (bits & U_MOREBITS) {
i = MSG_ReadByte(); i = net_message.read_byte().value();
bits |= (i << 8); bits |= (i << 8);
} }
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (cl.protocol == PROTOCOL_FITZQUAKE || cl.protocol == PROTOCOL_RMQ) { if (cl.protocol == PROTOCOL_FITZQUAKE || cl.protocol == PROTOCOL_RMQ) {
if (bits & U_EXTEND1) if (bits & U_EXTEND1)
bits |= MSG_ReadByte() << 16; bits |= net_message.read_byte().value() << 16;
if (bits & U_EXTEND2) if (bits & U_EXTEND2)
bits |= MSG_ReadByte() << 24; bits |= net_message.read_byte().value() << 24;
} }
//johnfitz //johnfitz
if (bits & U_LONGENTITY) if (bits & U_LONGENTITY)
num = MSG_ReadShort(); num = net_message.read_short().value();
else else
num = MSG_ReadByte(); num = net_message.read_byte().value();
ent = CL_EntityNum(num); ent = CL_EntityNum(num);
@@ -478,19 +472,19 @@ void CL_ParseUpdate(int bits) {
ent->msgtime = cl.mtime[0]; ent->msgtime = cl.mtime[0];
if (bits & U_MODEL) { if (bits & U_MODEL) {
modnum = MSG_ReadByte(); modnum = net_message.read_byte().value();
if (modnum >= MAX_MODELS) if (modnum >= MAX_MODELS)
Host_Error("CL_ParseModel: bad modnum"); Host_Error("CL_ParseModel: bad modnum");
} else } else
modnum = ent->baseline.modelindex; modnum = ent->baseline.modelindex;
if (bits & U_FRAME) if (bits & U_FRAME)
ent->frame = MSG_ReadByte(); ent->frame = net_message.read_byte().value();
else else
ent->frame = ent->baseline.frame; ent->frame = ent->baseline.frame;
if (bits & U_COLORMAP) if (bits & U_COLORMAP)
i = MSG_ReadByte(); i = net_message.read_byte().value();
else else
i = ent->baseline.colormap; i = ent->baseline.colormap;
if (!i) if (!i)
@@ -501,7 +495,7 @@ void CL_ParseUpdate(int bits) {
ent->colormap = cl.scores[i - 1].translations; ent->colormap = cl.scores[i - 1].translations;
} }
if (bits & U_SKIN) if (bits & U_SKIN)
skin = MSG_ReadByte(); skin = net_message.read_byte().value();
else else
skin = ent->baseline.skin; skin = ent->baseline.skin;
if (skin != ent->skinnum) { if (skin != ent->skinnum) {
@@ -510,7 +504,7 @@ void CL_ParseUpdate(int bits) {
R_TranslateNewPlayerSkin(num - 1); //johnfitz -- was R_TranslatePlayerSkin R_TranslateNewPlayerSkin(num - 1); //johnfitz -- was R_TranslatePlayerSkin
} }
if (bits & U_EFFECTS) if (bits & U_EFFECTS)
ent->effects = MSG_ReadByte(); ent->effects = net_message.read_byte().value();
else else
ent->effects = ent->baseline.effects; ent->effects = ent->baseline.effects;
@@ -519,29 +513,29 @@ void CL_ParseUpdate(int bits) {
VectorCopy(ent->msg_angles[0], ent->msg_angles[1]); VectorCopy(ent->msg_angles[0], ent->msg_angles[1]);
if (bits & U_ORIGIN1) if (bits & U_ORIGIN1)
ent->msg_origins[0][0] = MSG_ReadCoord(cl.protocolflags); ent->msg_origins[0][0] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
else else
ent->msg_origins[0][0] = ent->baseline.origin[0]; ent->msg_origins[0][0] = ent->baseline.origin[0];
if (bits & U_ANGLE1) if (bits & U_ANGLE1)
ent->msg_angles[0][0] = MSG_ReadAngle(cl.protocolflags); ent->msg_angles[0][0] = net_message.read_angle(static_cast<net::rmq_flags>(cl.protocolflags)).value();
else else
ent->msg_angles[0][0] = ent->baseline.angles[0]; ent->msg_angles[0][0] = ent->baseline.angles[0];
if (bits & U_ORIGIN2) if (bits & U_ORIGIN2)
ent->msg_origins[0][1] = MSG_ReadCoord(cl.protocolflags); ent->msg_origins[0][1] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
else else
ent->msg_origins[0][1] = ent->baseline.origin[1]; ent->msg_origins[0][1] = ent->baseline.origin[1];
if (bits & U_ANGLE2) if (bits & U_ANGLE2)
ent->msg_angles[0][1] = MSG_ReadAngle(cl.protocolflags); ent->msg_angles[0][1] = net_message.read_angle(static_cast<net::rmq_flags>(cl.protocolflags)).value();
else else
ent->msg_angles[0][1] = ent->baseline.angles[1]; ent->msg_angles[0][1] = ent->baseline.angles[1];
if (bits & U_ORIGIN3) if (bits & U_ORIGIN3)
ent->msg_origins[0][2] = MSG_ReadCoord(cl.protocolflags); ent->msg_origins[0][2] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
else else
ent->msg_origins[0][2] = ent->baseline.origin[2]; ent->msg_origins[0][2] = ent->baseline.origin[2];
if (bits & U_ANGLE3) if (bits & U_ANGLE3)
ent->msg_angles[0][2] = MSG_ReadAngle(cl.protocolflags); ent->msg_angles[0][2] = net_message.read_angle(static_cast<net::rmq_flags>(cl.protocolflags)).value();
else else
ent->msg_angles[0][2] = ent->baseline.angles[2]; ent->msg_angles[0][2] = ent->baseline.angles[2];
@@ -556,19 +550,19 @@ void CL_ParseUpdate(int bits) {
//johnfitz -- PROTOCOL_FITZQUAKE and PROTOCOL_NEHAHRA //johnfitz -- PROTOCOL_FITZQUAKE and PROTOCOL_NEHAHRA
if (cl.protocol == PROTOCOL_FITZQUAKE || cl.protocol == PROTOCOL_RMQ) { if (cl.protocol == PROTOCOL_FITZQUAKE || cl.protocol == PROTOCOL_RMQ) {
if (bits & U_ALPHA) if (bits & U_ALPHA)
ent->alpha = MSG_ReadByte(); ent->alpha = net_message.read_byte().value();
else else
ent->alpha = ent->baseline.alpha; ent->alpha = ent->baseline.alpha;
if (bits & U_SCALE) if (bits & U_SCALE)
ent->scale = MSG_ReadByte(); ent->scale = net_message.read_byte().value();
else else
ent->scale = ent->baseline.scale; ent->scale = ent->baseline.scale;
if (bits & U_FRAME2) if (bits & U_FRAME2)
ent->frame = (ent->frame & 0x00FF) | (MSG_ReadByte() << 8); ent->frame = (ent->frame & 0x00FF) | (net_message.read_byte().value() << 8);
if (bits & U_MODEL2) if (bits & U_MODEL2)
modnum = (modnum & 0x00FF) | (MSG_ReadByte() << 8); modnum = (modnum & 0x00FF) | (net_message.read_byte().value() << 8);
if (bits & U_LERPFINISH) { if (bits & U_LERPFINISH) {
ent->lerpfinish = ent->msgtime + ((float) (MSG_ReadByte()) / 255); ent->lerpfinish = ent->msgtime + ((float) (net_message.read_byte().value()) / 255);
ent->lerpflags |= LERP_FINISH; ent->lerpflags |= LERP_FINISH;
} else } else
ent->lerpflags &= ~LERP_FINISH; ent->lerpflags &= ~LERP_FINISH;
@@ -582,10 +576,10 @@ void CL_ParseUpdate(int bits) {
warn_about_nehahra_protocol = false; warn_about_nehahra_protocol = false;
} }
a = MSG_ReadFloat(); a = net_message.read_float().value();
b = MSG_ReadFloat(); //alpha b = net_message.read_float().value(); //alpha
if (a == 2) if (a == 2)
MSG_ReadFloat(); //fullbright (not using this yet) net_message.read_float().value(); //fullbright (not using this yet)
ent->alpha = ENTALPHA_ENCODE(b); ent->alpha = ENTALPHA_ENCODE(b);
} else } else
ent->alpha = ent->baseline.alpha; ent->alpha = ent->baseline.alpha;
@@ -634,20 +628,20 @@ void CL_ParseBaseline(entity_t *ent, int version) //johnfitz -- added argument
int bits; //johnfitz int bits; //johnfitz
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
bits = (version == 2) ? MSG_ReadByte() : 0; bits = (version == 2) ? net_message.read_byte().value() : 0;
ent->baseline.modelindex = (bits & B_LARGEMODEL) ? MSG_ReadShort() : MSG_ReadByte(); ent->baseline.modelindex = (bits & B_LARGEMODEL) ? net_message.read_short().value() : net_message.read_byte().value();
ent->baseline.frame = (bits & B_LARGEFRAME) ? MSG_ReadShort() : MSG_ReadByte(); ent->baseline.frame = (bits & B_LARGEFRAME) ? net_message.read_short().value() : net_message.read_byte().value();
//johnfitz //johnfitz
ent->baseline.colormap = MSG_ReadByte(); ent->baseline.colormap = net_message.read_byte().value();
ent->baseline.skin = MSG_ReadByte(); ent->baseline.skin = net_message.read_byte().value();
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
ent->baseline.origin[i] = MSG_ReadCoord(cl.protocolflags); ent->baseline.origin[i] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
ent->baseline.angles[i] = MSG_ReadAngle(cl.protocolflags); ent->baseline.angles[i] = net_message.read_angle(static_cast<net::rmq_flags>(cl.protocolflags)).value();
} }
ent->baseline.alpha = (bits & B_ALPHA) ? MSG_ReadByte() : ENTALPHA_DEFAULT; //johnfitz -- PROTOCOL_FITZQUAKE ent->baseline.alpha = (bits & B_ALPHA) ? net_message.read_byte().value() : ENTALPHA_DEFAULT; //johnfitz -- PROTOCOL_FITZQUAKE
ent->baseline.scale = (bits & B_SCALE) ? MSG_ReadByte() : ENTSCALE_DEFAULT; ent->baseline.scale = (bits & B_SCALE) ? net_message.read_byte().value() : ENTSCALE_DEFAULT;
} }
@@ -662,34 +656,34 @@ void CL_ParseClientdata(void) {
int i, j; int i, j;
int bits; //johnfitz int bits; //johnfitz
bits = (unsigned short) MSG_ReadShort(); //johnfitz -- read bits here isntead of in CL_ParseServerMessage() bits = (unsigned short) net_message.read_short().value(); //johnfitz -- read bits here isntead of in CL_ParseServerMessage()
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (bits & SU_EXTEND1) if (bits & SU_EXTEND1)
bits |= (MSG_ReadByte() << 16); bits |= (net_message.read_byte().value() << 16);
if (bits & SU_EXTEND2) if (bits & SU_EXTEND2)
bits |= (MSG_ReadByte() << 24); bits |= (net_message.read_byte().value() << 24);
//johnfitz //johnfitz
if (bits & SU_VIEWHEIGHT) if (bits & SU_VIEWHEIGHT)
cl.viewheight = MSG_ReadChar(); cl.viewheight = net_message.read_char().value();
else else
cl.viewheight = DEFAULT_VIEWHEIGHT; cl.viewheight = DEFAULT_VIEWHEIGHT;
if (bits & SU_IDEALPITCH) if (bits & SU_IDEALPITCH)
cl.idealpitch = MSG_ReadChar(); cl.idealpitch = net_message.read_char().value();
else else
cl.idealpitch = 0; cl.idealpitch = 0;
VectorCopy(cl.mvelocity[0], cl.mvelocity[1]); VectorCopy(cl.mvelocity[0], cl.mvelocity[1]);
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
if (bits & (SU_PUNCH1 << i)) if (bits & (SU_PUNCH1 << i))
cl.punchangle[i] = MSG_ReadChar(); cl.punchangle[i] = net_message.read_char().value();
else else
cl.punchangle[i] = 0; cl.punchangle[i] = 0;
if (bits & (SU_VELOCITY1 << i)) if (bits & (SU_VELOCITY1 << i))
cl.mvelocity[0][i] = MSG_ReadChar() * 16; cl.mvelocity[0][i] = net_message.read_char().value() * 16;
else else
cl.mvelocity[0][i] = 0; cl.mvelocity[0][i] = 0;
} }
@@ -703,7 +697,7 @@ void CL_ParseClientdata(void) {
//johnfitz //johnfitz
// [always sent] if (bits & SU_ITEMS) // [always sent] if (bits & SU_ITEMS)
i = MSG_ReadLong(); i = net_message.read_long().value();
if (cl.items != i) { if (cl.items != i) {
// set flash times // set flash times
@@ -718,12 +712,12 @@ void CL_ParseClientdata(void) {
cl.inwater = (bits & SU_INWATER) != 0; cl.inwater = (bits & SU_INWATER) != 0;
if (bits & SU_WEAPONFRAME) if (bits & SU_WEAPONFRAME)
cl.stats[STAT_WEAPONFRAME] = MSG_ReadByte(); cl.stats[STAT_WEAPONFRAME] = net_message.read_byte().value();
else else
cl.stats[STAT_WEAPONFRAME] = 0; cl.stats[STAT_WEAPONFRAME] = 0;
if (bits & SU_ARMOR) if (bits & SU_ARMOR)
i = MSG_ReadByte(); i = net_message.read_byte().value();
else else
i = 0; i = 0;
if (cl.stats[STAT_ARMOR] != i) { if (cl.stats[STAT_ARMOR] != i) {
@@ -732,7 +726,7 @@ void CL_ParseClientdata(void) {
} }
if (bits & SU_WEAPON) if (bits & SU_WEAPON)
i = MSG_ReadByte(); i = net_message.read_byte().value();
else else
i = 0; i = 0;
if (cl.stats[STAT_WEAPON] != i) { if (cl.stats[STAT_WEAPON] != i) {
@@ -740,27 +734,27 @@ void CL_ParseClientdata(void) {
Sbar_Changed(); Sbar_Changed();
} }
i = MSG_ReadShort(); i = net_message.read_short().value();
if (cl.stats[STAT_HEALTH] != i) { if (cl.stats[STAT_HEALTH] != i) {
cl.stats[STAT_HEALTH] = i; cl.stats[STAT_HEALTH] = i;
Sbar_Changed(); Sbar_Changed();
} }
i = MSG_ReadByte(); i = net_message.read_byte().value();
if (cl.stats[STAT_AMMO] != i) { if (cl.stats[STAT_AMMO] != i) {
cl.stats[STAT_AMMO] = i; cl.stats[STAT_AMMO] = i;
Sbar_Changed(); Sbar_Changed();
} }
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
j = MSG_ReadByte(); j = net_message.read_byte().value();
if (cl.stats[STAT_SHELLS + i] != j) { if (cl.stats[STAT_SHELLS + i] != j) {
cl.stats[STAT_SHELLS + i] = j; cl.stats[STAT_SHELLS + i] = j;
Sbar_Changed(); Sbar_Changed();
} }
} }
i = MSG_ReadByte(); i = net_message.read_byte().value();
if (standard_quake) { if (standard_quake) {
if (cl.stats[STAT_ACTIVEWEAPON] != i) { if (cl.stats[STAT_ACTIVEWEAPON] != i) {
@@ -776,23 +770,23 @@ void CL_ParseClientdata(void) {
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (bits & SU_WEAPON2) if (bits & SU_WEAPON2)
cl.stats[STAT_WEAPON] |= (MSG_ReadByte() << 8); cl.stats[STAT_WEAPON] |= (net_message.read_byte().value() << 8);
if (bits & SU_ARMOR2) if (bits & SU_ARMOR2)
cl.stats[STAT_ARMOR] |= (MSG_ReadByte() << 8); cl.stats[STAT_ARMOR] |= (net_message.read_byte().value() << 8);
if (bits & SU_AMMO2) if (bits & SU_AMMO2)
cl.stats[STAT_AMMO] |= (MSG_ReadByte() << 8); cl.stats[STAT_AMMO] |= (net_message.read_byte().value() << 8);
if (bits & SU_SHELLS2) if (bits & SU_SHELLS2)
cl.stats[STAT_SHELLS] |= (MSG_ReadByte() << 8); cl.stats[STAT_SHELLS] |= (net_message.read_byte().value() << 8);
if (bits & SU_NAILS2) if (bits & SU_NAILS2)
cl.stats[STAT_NAILS] |= (MSG_ReadByte() << 8); cl.stats[STAT_NAILS] |= (net_message.read_byte().value() << 8);
if (bits & SU_ROCKETS2) if (bits & SU_ROCKETS2)
cl.stats[STAT_ROCKETS] |= (MSG_ReadByte() << 8); cl.stats[STAT_ROCKETS] |= (net_message.read_byte().value() << 8);
if (bits & SU_CELLS2) if (bits & SU_CELLS2)
cl.stats[STAT_CELLS] |= (MSG_ReadByte() << 8); cl.stats[STAT_CELLS] |= (net_message.read_byte().value() << 8);
if (bits & SU_WEAPONFRAME2) if (bits & SU_WEAPONFRAME2)
cl.stats[STAT_WEAPONFRAME] |= (MSG_ReadByte() << 8); cl.stats[STAT_WEAPONFRAME] |= (net_message.read_byte().value() << 8);
if (bits & SU_WEAPONALPHA) if (bits & SU_WEAPONALPHA)
cl.viewent.alpha = MSG_ReadByte(); cl.viewent.alpha = net_message.read_byte().value();
else else
cl.viewent.alpha = ENTALPHA_DEFAULT; cl.viewent.alpha = ENTALPHA_DEFAULT;
//johnfitz //johnfitz
@@ -887,17 +881,17 @@ void CL_ParseStaticSound(int version) //johnfitz -- added argument
int i; int i;
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
org[i] = MSG_ReadCoord(cl.protocolflags); org[i] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (version == 2) if (version == 2)
sound_num = MSG_ReadShort(); sound_num = net_message.read_short().value();
else else
sound_num = MSG_ReadByte(); sound_num = net_message.read_byte().value();
//johnfitz //johnfitz
vol = MSG_ReadByte(); vol = net_message.read_byte().value();
atten = MSG_ReadByte(); atten = net_message.read_byte().value();
S_StaticSound(cl.sound_precache[sound_num], org, vol, atten); S_StaticSound(cl.sound_precache[sound_num], org, vol, atten);
} }
@@ -934,7 +928,7 @@ static void CL_DumpPacket(void) {
} }
#endif /* CL_DumpPacket */ #endif /* CL_DumpPacket */
#define SHOWNET(x) if(cl_shownet.value==2)console::info ("%3i:%s\n", msg_readcount-1, x); #define SHOWNET(x) if(cl_shownet.value==2)console::info ("%3i:%s\n", net_message.offset()-1, x);
/* /*
===================== =====================
@@ -944,14 +938,14 @@ CL_ParseServerMessage
void CL_ParseServerMessage(void) { void CL_ParseServerMessage(void) {
int cmd; int cmd;
int i; int i;
const char *str; //johnfitz std::string str{}; //johnfitz
int total, j, lastcmd; //johnfitz int total, j, lastcmd; //johnfitz
// //
// if recording demos, copy the message out // if recording demos, copy the message out
// //
if (cl_shownet.value == 1) if (cl_shownet.value == 1)
console::info("%i ", net_message.cursize); console::info("%i ", net_message.size());
else if (cl_shownet.value == 2) else if (cl_shownet.value == 2)
console::info("------------------\n"); console::info("------------------\n");
@@ -960,20 +954,22 @@ void CL_ParseServerMessage(void) {
// //
// parse the message // parse the message
// //
MSG_BeginReading(); net_message.begin_reading();
lastcmd = 0; lastcmd = 0;
while (1) { while (true) {
if (msg_badread) if (net_message.eos())
Host_Error("CL_ParseServerMessage: Bad server message"); Host_Error("CL_ParseServerMessage: Bad server message");
cmd = MSG_ReadByte(); auto cmdv = net_message.read_byte();
if (cmd == -1) { if (!cmdv.has_value()) {
SHOWNET("END OF MESSAGE"); SHOWNET("END OF MESSAGE");
return; // end of message return; // end of message
} }
cmd = cmdv.value();
// if the high bit of the command byte is set, it is a fast update // if the high bit of the command byte is set, it is a fast update
if (cmd & U_SIGNAL) //johnfitz -- was 128, changed for clarity if (cmd & U_SIGNAL) //johnfitz -- was 128, changed for clarity
{ {
@@ -1000,7 +996,7 @@ void CL_ParseServerMessage(void) {
case svc_time: case svc_time:
cl.mtime[1] = cl.mtime[0]; cl.mtime[1] = cl.mtime[0];
cl.mtime[0] = MSG_ReadFloat(); cl.mtime[0] = net_message.read_float().value();
break; break;
case svc_clientdata: case svc_clientdata:
@@ -1009,7 +1005,7 @@ void CL_ParseServerMessage(void) {
break; break;
case svc_version: case svc_version:
i = MSG_ReadLong(); i = net_message.read_long().value();
//johnfitz -- support multiple protocols //johnfitz -- support multiple protocols
if (i != PROTOCOL_NETQUAKE && i != PROTOCOL_FITZQUAKE && i != PROTOCOL_RMQ) if (i != PROTOCOL_NETQUAKE && i != PROTOCOL_FITZQUAKE && i != PROTOCOL_RMQ)
Host_Error("Server returned version %i, not %i or %i or %i", i, PROTOCOL_NETQUAKE, Host_Error("Server returned version %i, not %i or %i or %i", i, PROTOCOL_NETQUAKE,
@@ -1022,19 +1018,19 @@ void CL_ParseServerMessage(void) {
Host_EndGame("Server disconnected\n"); Host_EndGame("Server disconnected\n");
case svc_print: case svc_print:
console::info("%s", MSG_ReadString()); console::info("%s", net_message.read_string().value().c_str());
break; break;
case svc_centerprint: case svc_centerprint:
//johnfitz -- log centerprints to console //johnfitz -- log centerprints to console
str = MSG_ReadString(); str = net_message.read_string().value();
SCR_CenterPrint(str); SCR_CenterPrint(str.c_str());
Con_LogCenterPrint(str); Con_LogCenterPrint(str.c_str());
//johnfitz //johnfitz
break; break;
case svc_stufftext: case svc_stufftext:
command::buffer::add_text(MSG_ReadString()); command::buffer::add_text(net_message.read_string().value());
break; break;
case svc_damage: case svc_damage:
@@ -1048,18 +1044,18 @@ void CL_ParseServerMessage(void) {
case svc_setangle: case svc_setangle:
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
cl.viewangles[i] = MSG_ReadAngle(cl.protocolflags); cl.viewangles[i] = net_message.read_angle(static_cast<net::rmq_flags>(cl.protocolflags)).value();
break; break;
case svc_setview: case svc_setview:
cl.viewentity = MSG_ReadShort(); cl.viewentity = net_message.read_short().value();
break; break;
case svc_lightstyle: case svc_lightstyle:
i = MSG_ReadByte(); i = net_message.read_byte().value();
if (i >= MAX_LIGHTSTYLES) if (i >= MAX_LIGHTSTYLES)
Sys_Error("svc_lightstyle > MAX_LIGHTSTYLES"); Sys_Error("svc_lightstyle > MAX_LIGHTSTYLES");
q_strlcpy(cl_lightstyle[i].map, MSG_ReadString(), MAX_STYLESTRING); q_strlcpy(cl_lightstyle[i].map, net_message.read_string().value().c_str(), MAX_STYLESTRING);
cl_lightstyle[i].length = std::strlen(cl_lightstyle[i].map); cl_lightstyle[i].length = std::strlen(cl_lightstyle[i].map);
//johnfitz -- save extra info //johnfitz -- save extra info
if (cl_lightstyle[i].length) { if (cl_lightstyle[i].length) {
@@ -1080,32 +1076,32 @@ void CL_ParseServerMessage(void) {
break; break;
case svc_stopsound: case svc_stopsound:
i = MSG_ReadShort(); i = net_message.read_short().value();
S_StopSound(i >> 3, i & 7); S_StopSound(i >> 3, i & 7);
break; break;
case svc_updatename: case svc_updatename:
Sbar_Changed(); Sbar_Changed();
i = MSG_ReadByte(); i = net_message.read_byte().value();
if (i >= cl.maxclients) if (i >= cl.maxclients)
Host_Error("CL_ParseServerMessage: svc_updatename > MAX_SCOREBOARD"); Host_Error("CL_ParseServerMessage: svc_updatename > MAX_SCOREBOARD");
q_strlcpy(cl.scores[i].name, MSG_ReadString(), MAX_SCOREBOARDNAME); q_strlcpy(cl.scores[i].name, net_message.read_string().value().c_str(), MAX_SCOREBOARDNAME);
break; break;
case svc_updatefrags: case svc_updatefrags:
Sbar_Changed(); Sbar_Changed();
i = MSG_ReadByte(); i = net_message.read_byte().value();
if (i >= cl.maxclients) if (i >= cl.maxclients)
Host_Error("CL_ParseServerMessage: svc_updatefrags > MAX_SCOREBOARD"); Host_Error("CL_ParseServerMessage: svc_updatefrags > MAX_SCOREBOARD");
cl.scores[i].frags = MSG_ReadShort(); cl.scores[i].frags = net_message.read_short().value();
break; break;
case svc_updatecolors: case svc_updatecolors:
Sbar_Changed(); Sbar_Changed();
i = MSG_ReadByte(); i = net_message.read_byte().value();
if (i >= cl.maxclients) if (i >= cl.maxclients)
Host_Error("CL_ParseServerMessage: svc_updatecolors > MAX_SCOREBOARD"); Host_Error("CL_ParseServerMessage: svc_updatecolors > MAX_SCOREBOARD");
cl.scores[i].colors = MSG_ReadByte(); cl.scores[i].colors = net_message.read_byte().value();
CL_NewTranslation(i); CL_NewTranslation(i);
break; break;
@@ -1114,7 +1110,7 @@ void CL_ParseServerMessage(void) {
break; break;
case svc_spawnbaseline: case svc_spawnbaseline:
i = MSG_ReadShort(); i = net_message.read_short().value();
// must use CL_EntityNum() to force cl.num_entities up // must use CL_EntityNum() to force cl.num_entities up
CL_ParseBaseline(CL_EntityNum(i), 1); // johnfitz -- added second parameter CL_ParseBaseline(CL_EntityNum(i), 1); // johnfitz -- added second parameter
break; break;
@@ -1128,7 +1124,7 @@ void CL_ParseServerMessage(void) {
break; break;
case svc_setpause: case svc_setpause:
cl.paused = MSG_ReadByte(); cl.paused = net_message.read_byte().value();
if (cl.paused) { if (cl.paused) {
CDAudio_Pause(); CDAudio_Pause();
music::pause(); music::pause();
@@ -1139,7 +1135,7 @@ void CL_ParseServerMessage(void) {
break; break;
case svc_signonnum: case svc_signonnum:
i = MSG_ReadByte(); i = net_message.read_byte().value();
if (i <= cls.signon) if (i <= cls.signon)
Host_Error("Received signon %i when at %i", i, cls.signon); Host_Error("Received signon %i when at %i", i, cls.signon);
cls.signon = i; cls.signon = i;
@@ -1163,10 +1159,10 @@ void CL_ParseServerMessage(void) {
break; break;
case svc_updatestat: case svc_updatestat:
i = MSG_ReadByte(); i = net_message.read_byte().value();
if (i < 0 || i >= MAX_CL_STATS) if (i < 0 || i >= MAX_CL_STATS)
Sys_Error("svc_updatestat: %i is invalid", i); Sys_Error("svc_updatestat: %i is invalid", i);
cl.stats[i] = MSG_ReadLong();; cl.stats[i] = net_message.read_long().value();;
break; break;
case svc_spawnstaticsound: case svc_spawnstaticsound:
@@ -1174,8 +1170,8 @@ void CL_ParseServerMessage(void) {
break; break;
case svc_cdtrack: case svc_cdtrack:
cl.cdtrack = MSG_ReadByte(); cl.cdtrack = net_message.read_byte().value();
cl.looptrack = MSG_ReadByte(); cl.looptrack = net_message.read_byte().value();
if ((cls.demoplayback || cls.demorecording) && (cls.forcetrack != -1)) if ((cls.demoplayback || cls.demorecording) && (cls.forcetrack != -1))
music::play_cd_track((byte) cls.forcetrack, true); music::play_cd_track((byte) cls.forcetrack, true);
else else
@@ -1194,9 +1190,9 @@ void CL_ParseServerMessage(void) {
cl.completed_time = cl.time; cl.completed_time = cl.time;
vid.recalc_refdef = true; // go to full screen vid.recalc_refdef = true; // go to full screen
//johnfitz -- log centerprints to console //johnfitz -- log centerprints to console
str = MSG_ReadString(); str = net_message.read_string().value();
SCR_CenterPrint(str); SCR_CenterPrint(str.c_str());
Con_LogCenterPrint(str); Con_LogCenterPrint(str.c_str());
//johnfitz //johnfitz
V_RestoreAngles(); V_RestoreAngles();
break; break;
@@ -1206,9 +1202,9 @@ void CL_ParseServerMessage(void) {
cl.completed_time = cl.time; cl.completed_time = cl.time;
vid.recalc_refdef = true; // go to full screen vid.recalc_refdef = true; // go to full screen
//johnfitz -- log centerprints to console //johnfitz -- log centerprints to console
str = MSG_ReadString(); str = net_message.read_string().value();
SCR_CenterPrint(str); SCR_CenterPrint(str.c_str());
Con_LogCenterPrint(str); Con_LogCenterPrint(str.c_str());
//johnfitz //johnfitz
V_RestoreAngles(); V_RestoreAngles();
break; break;
@@ -1219,7 +1215,7 @@ void CL_ParseServerMessage(void) {
//johnfitz -- new svc types //johnfitz -- new svc types
case svc_skybox: case svc_skybox:
Sky_LoadSkyBox(MSG_ReadString()); Sky_LoadSkyBox(net_message.read_string().value().c_str());
break; break;
case svc_bf: case svc_bf:
@@ -1231,7 +1227,7 @@ void CL_ParseServerMessage(void) {
break; break;
case svc_spawnbaseline2: //PROTOCOL_FITZQUAKE case svc_spawnbaseline2: //PROTOCOL_FITZQUAKE
i = MSG_ReadShort(); i = net_message.read_short().value();
// must use CL_EntityNum() to force cl.num_entities up // must use CL_EntityNum() to force cl.num_entities up
CL_ParseBaseline(CL_EntityNum(i), 2); CL_ParseBaseline(CL_EntityNum(i), 2);
break; break;
@@ -1247,8 +1243,8 @@ void CL_ParseServerMessage(void) {
//used by the 2021 rerelease //used by the 2021 rerelease
case svc_achievement: case svc_achievement:
str = MSG_ReadString(); str = net_message.read_string().value();
console::debug("Ignoring svc_achievement (%s)\n", str); console::debug("Ignoring svc_achievement (%s)\n", str.c_str());
break; break;
case svc_localsound: case svc_localsound:
CL_ParseLocalSound(); CL_ParseLocalSound();
+40 -40
View File
@@ -63,15 +63,15 @@ void CL_ParseBeam (qmodel_t *m)
beam_t *b; beam_t *b;
int i; int i;
ent = MSG_ReadShort (); ent = net_message.read_short().value();
start[0] = MSG_ReadCoord (cl.protocolflags); start[0] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
start[1] = MSG_ReadCoord (cl.protocolflags); start[1] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
start[2] = MSG_ReadCoord (cl.protocolflags); start[2] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
end[0] = MSG_ReadCoord (cl.protocolflags); end[0] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
end[1] = MSG_ReadCoord (cl.protocolflags); end[1] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
end[2] = MSG_ReadCoord (cl.protocolflags); end[2] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
// override any beam with the same entity // override any beam with the same entity
for (i=0, b=cl_beams ; i< MAX_BEAMS ; i++, b++) for (i=0, b=cl_beams ; i< MAX_BEAMS ; i++, b++)
@@ -121,29 +121,29 @@ void CL_ParseTEnt (void)
int rnd; int rnd;
int colorStart, colorLength; int colorStart, colorLength;
type = MSG_ReadByte (); type = net_message.read_byte().value();
switch (type) switch (type)
{ {
case TE_WIZSPIKE: // spike hitting wall case TE_WIZSPIKE: // spike hitting wall
pos[0] = MSG_ReadCoord (cl.protocolflags); pos[0] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[1] = MSG_ReadCoord (cl.protocolflags); pos[1] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[2] = MSG_ReadCoord (cl.protocolflags); pos[2] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
R_RunParticleEffect (pos, vec3_origin, 20, 30); R_RunParticleEffect (pos, vec3_origin, 20, 30);
S_StartSound (-1, 0, cl_sfx_wizhit, pos, 1, 1); S_StartSound (-1, 0, cl_sfx_wizhit, pos, 1, 1);
break; break;
case TE_KNIGHTSPIKE: // spike hitting wall case TE_KNIGHTSPIKE: // spike hitting wall
pos[0] = MSG_ReadCoord (cl.protocolflags); pos[0] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[1] = MSG_ReadCoord (cl.protocolflags); pos[1] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[2] = MSG_ReadCoord (cl.protocolflags); pos[2] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
R_RunParticleEffect (pos, vec3_origin, 226, 20); R_RunParticleEffect (pos, vec3_origin, 226, 20);
S_StartSound (-1, 0, cl_sfx_knighthit, pos, 1, 1); S_StartSound (-1, 0, cl_sfx_knighthit, pos, 1, 1);
break; break;
case TE_SPIKE: // spike hitting wall case TE_SPIKE: // spike hitting wall
pos[0] = MSG_ReadCoord (cl.protocolflags); pos[0] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[1] = MSG_ReadCoord (cl.protocolflags); pos[1] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[2] = MSG_ReadCoord (cl.protocolflags); pos[2] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
R_RunParticleEffect (pos, vec3_origin, 0, 10); R_RunParticleEffect (pos, vec3_origin, 0, 10);
if ( rand() % 5 ) if ( rand() % 5 )
S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1); S_StartSound (-1, 0, cl_sfx_tink1, pos, 1, 1);
@@ -159,9 +159,9 @@ void CL_ParseTEnt (void)
} }
break; break;
case TE_SUPERSPIKE: // super spike hitting wall case TE_SUPERSPIKE: // super spike hitting wall
pos[0] = MSG_ReadCoord (cl.protocolflags); pos[0] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[1] = MSG_ReadCoord (cl.protocolflags); pos[1] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[2] = MSG_ReadCoord (cl.protocolflags); pos[2] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
R_RunParticleEffect (pos, vec3_origin, 0, 20); R_RunParticleEffect (pos, vec3_origin, 0, 20);
if ( rand() % 5 ) if ( rand() % 5 )
@@ -179,16 +179,16 @@ void CL_ParseTEnt (void)
break; break;
case TE_GUNSHOT: // bullet hitting wall case TE_GUNSHOT: // bullet hitting wall
pos[0] = MSG_ReadCoord (cl.protocolflags); pos[0] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[1] = MSG_ReadCoord (cl.protocolflags); pos[1] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[2] = MSG_ReadCoord (cl.protocolflags); pos[2] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
R_RunParticleEffect (pos, vec3_origin, 0, 20); R_RunParticleEffect (pos, vec3_origin, 0, 20);
break; break;
case TE_EXPLOSION: // rocket explosion case TE_EXPLOSION: // rocket explosion
pos[0] = MSG_ReadCoord (cl.protocolflags); pos[0] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[1] = MSG_ReadCoord (cl.protocolflags); pos[1] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[2] = MSG_ReadCoord (cl.protocolflags); pos[2] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
R_ParticleExplosion (pos); R_ParticleExplosion (pos);
dl = CL_AllocDlight (0); dl = CL_AllocDlight (0);
VectorCopy (pos, dl->origin); VectorCopy (pos, dl->origin);
@@ -199,9 +199,9 @@ void CL_ParseTEnt (void)
break; break;
case TE_TAREXPLOSION: // tarbaby explosion case TE_TAREXPLOSION: // tarbaby explosion
pos[0] = MSG_ReadCoord (cl.protocolflags); pos[0] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[1] = MSG_ReadCoord (cl.protocolflags); pos[1] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[2] = MSG_ReadCoord (cl.protocolflags); pos[2] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
R_BlobExplosion (pos); R_BlobExplosion (pos);
S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1); S_StartSound (-1, 0, cl_sfx_r_exp3, pos, 1, 1);
@@ -226,25 +226,25 @@ void CL_ParseTEnt (void)
// PGM 01/21/97 // PGM 01/21/97
case TE_LAVASPLASH: case TE_LAVASPLASH:
pos[0] = MSG_ReadCoord (cl.protocolflags); pos[0] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[1] = MSG_ReadCoord (cl.protocolflags); pos[1] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[2] = MSG_ReadCoord (cl.protocolflags); pos[2] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
R_LavaSplash (pos); R_LavaSplash (pos);
break; break;
case TE_TELEPORT: case TE_TELEPORT:
pos[0] = MSG_ReadCoord (cl.protocolflags); pos[0] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[1] = MSG_ReadCoord (cl.protocolflags); pos[1] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[2] = MSG_ReadCoord (cl.protocolflags); pos[2] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
R_TeleportSplash (pos); R_TeleportSplash (pos);
break; break;
case TE_EXPLOSION2: // color mapped explosion case TE_EXPLOSION2: // color mapped explosion
pos[0] = MSG_ReadCoord (cl.protocolflags); pos[0] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[1] = MSG_ReadCoord (cl.protocolflags); pos[1] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
pos[2] = MSG_ReadCoord (cl.protocolflags); pos[2] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
colorStart = MSG_ReadByte (); colorStart = net_message.read_byte().value();
colorLength = MSG_ReadByte (); colorLength = net_message.read_byte().value();
R_ParticleExplosion2 (pos, colorStart, colorLength); R_ParticleExplosion2 (pos, colorStart, colorLength);
dl = CL_AllocDlight (0); dl = CL_AllocDlight (0);
VectorCopy (pos, dl->origin); VectorCopy (pos, dl->origin);
+3 -1
View File
@@ -23,6 +23,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef _CLIENT_H_ #ifndef _CLIENT_H_
#define _CLIENT_H_ #define _CLIENT_H_
#include "net_msg.hpp"
// client.h // client.h
typedef struct typedef struct
@@ -129,7 +131,7 @@ typedef struct
// connection information // connection information
int signon; // 0 to SIGNONS int signon; // 0 to SIGNONS
struct qsocket_s *netcon; struct qsocket_s *netcon;
sizebuf_t message; // writing buffer to send to server net::msg message; // writing buffer to send to server
} client_static_t; } client_static_t;
+8 -7
View File
@@ -445,15 +445,16 @@ namespace command {
if (cls.demoplayback) if (cls.demoplayback)
return; // not really connected return; // not really connected
MSG_WriteByte(&cls.message, clc_stringcmd); cls.message.write_byte(clc_stringcmd);
if (q_strcasecmp(argv(0).value_or("").c_str(), "cmd") != 0) { if (q_strcasecmp(argv(0).value_or("").c_str(), "cmd") != 0) {
SZ_Print(&cls.message, argv(0).value_or("").c_str()); if (argc() > 1) {
SZ_Print(&cls.message, " "); cls.message.write_string(std::format("{} {}", argv(0).value(), args()));
} else {
cls.message.write_string(std::format("{} \n", argv(0).value()));
}
} else {
cls.message.write_string("\n");
} }
if (argc() > 1)
SZ_Print(&cls.message, args().c_str());
else
SZ_Print(&cls.message, "\n");
} }
definition_view get_commands() { definition_view get_commands() {
+259 -259
View File
@@ -393,267 +393,267 @@ Handles byte ordering and avoids alignment errors
// writing functions // writing functions
// //
void MSG_WriteChar(sizebuf_t *sb, int c) { // void MSG_WriteChar(sizebuf_t *sb, int c) {
byte *buf; // byte *buf;
#ifdef PARANOID
if (c < -128 || c > 127)
Sys_Error("MSG_WriteChar: range error");
#endif
buf = (byte *) SZ_GetSpace(sb, 1);
buf[0] = c;
}
void MSG_WriteByte(sizebuf_t *sb, int c) {
byte *buf;
#ifdef PARANOID
if (c < 0 || c > 255)
Sys_Error("MSG_WriteByte: range error");
#endif
buf = (byte *) SZ_GetSpace(sb, 1);
buf[0] = c;
}
void MSG_WriteShort(sizebuf_t *sb, int c) {
byte *buf;
#ifdef PARANOID
if (c < ((short) 0x8000) || c > (short) 0x7fff)
Sys_Error("MSG_WriteShort: range error");
#endif
buf = (byte *) SZ_GetSpace(sb, 2);
buf[0] = c & 0xff;
buf[1] = c >> 8;
}
void MSG_WriteLong(sizebuf_t *sb, int c) {
byte *buf;
buf = (byte *) SZ_GetSpace(sb, 4);
buf[0] = c & 0xff;
buf[1] = (c >> 8) & 0xff;
buf[2] = (c >> 16) & 0xff;
buf[3] = c >> 24;
}
void MSG_WriteFloat(sizebuf_t *sb, float f) {
union {
float f;
int l;
} dat;
dat.f = f;
dat.l = LittleLong(dat.l);
SZ_Write(sb, &dat.l, 4);
}
void MSG_WriteString(sizebuf_t *sb, const char *s) {
if (!s)
SZ_Write(sb, "", 1);
else
SZ_Write(sb, s, std::strlen(s) + 1);
}
//johnfitz -- original behavior, 13.3 fixed point coords, max range +-4096
void MSG_WriteCoord16(sizebuf_t *sb, float f) {
MSG_WriteShort(sb, Q_rint(f*8));
}
//johnfitz -- 16.8 fixed point coords, max range +-32768
void MSG_WriteCoord24(sizebuf_t *sb, float f) {
MSG_WriteShort(sb, f);
MSG_WriteByte(sb, (int) (f * 255) % 255);
}
//johnfitz -- 32-bit float coords
void MSG_WriteCoord32f(sizebuf_t *sb, float f) {
MSG_WriteFloat(sb, f);
}
void MSG_WriteCoord(sizebuf_t *sb, float f, unsigned int flags) {
if (flags & PRFL_FLOATCOORD)
MSG_WriteFloat(sb, f);
else if (flags & PRFL_INT32COORD)
MSG_WriteLong(sb, Q_rint(f * 16));
else if (flags & PRFL_24BITCOORD)
MSG_WriteCoord24(sb, f);
else MSG_WriteCoord16(sb, f);
}
void MSG_WriteAngle(sizebuf_t *sb, float f, unsigned int flags) {
if (flags & PRFL_FLOATANGLE)
MSG_WriteFloat(sb, f);
else if (flags & PRFL_SHORTANGLE)
MSG_WriteShort(sb, Q_rint(f * 65536.0 / 360.0) & 65535);
else MSG_WriteByte(sb, Q_rint(f * 256.0 / 360.0) & 255); //johnfitz -- use Q_rint instead of (int) }
}
//johnfitz -- for PROTOCOL_FITZQUAKE
void MSG_WriteAngle16(sizebuf_t *sb, float f, unsigned int flags) {
if (flags & PRFL_FLOATANGLE)
MSG_WriteFloat(sb, f);
else MSG_WriteShort(sb, Q_rint(f * 65536.0 / 360.0) & 65535);
}
//johnfitz
// //
// reading functions // #ifdef PARANOID
// if (c < -128 || c > 127)
// Sys_Error("MSG_WriteChar: range error");
// #endif
// //
int msg_readcount; // buf = (byte *) SZ_GetSpace(sb, 1);
bool msg_badread; // buf[0] = c;
// }
void MSG_BeginReading(void) { //
msg_readcount = 0; // void MSG_WriteByte(sizebuf_t *sb, int c) {
msg_badread = false; // byte *buf;
} //
// #ifdef PARANOID
// returns -1 and sets msg_badread if no more characters are available // if (c < 0 || c > 255)
int MSG_ReadChar(void) { // Sys_Error("MSG_WriteByte: range error");
int c; // #endif
//
if (msg_readcount + 1 > net_message.cursize) { // buf = (byte *) SZ_GetSpace(sb, 1);
msg_badread = true; // buf[0] = c;
return -1; // }
} //
// void MSG_WriteShort(sizebuf_t *sb, int c) {
c = (signed char) net_message.data[msg_readcount]; // byte *buf;
msg_readcount++; //
// #ifdef PARANOID
return c; // if (c < ((short) 0x8000) || c > (short) 0x7fff)
} // Sys_Error("MSG_WriteShort: range error");
// #endif
int MSG_ReadByte(void) { //
int c; // buf = (byte *) SZ_GetSpace(sb, 2);
// buf[0] = c & 0xff;
if (msg_readcount + 1 > net_message.cursize) { // buf[1] = c >> 8;
msg_badread = true; // }
return -1; //
} // void MSG_WriteLong(sizebuf_t *sb, int c) {
// byte *buf;
c = (unsigned char) net_message.data[msg_readcount]; //
msg_readcount++; // buf = (byte *) SZ_GetSpace(sb, 4);
// buf[0] = c & 0xff;
return c; // buf[1] = (c >> 8) & 0xff;
} // buf[2] = (c >> 16) & 0xff;
// buf[3] = c >> 24;
int MSG_ReadShort(void) { // }
int c; //
// void MSG_WriteFloat(sizebuf_t *sb, float f) {
if (msg_readcount + 2 > net_message.cursize) { // union {
msg_badread = true; // float f;
return -1; // int l;
} // } dat;
//
c = (short) (net_message.data[msg_readcount] // dat.f = f;
+ (net_message.data[msg_readcount + 1] << 8)); // dat.l = LittleLong(dat.l);
//
msg_readcount += 2; // SZ_Write(sb, &dat.l, 4);
// }
return c; //
} // void MSG_WriteString(sizebuf_t *sb, const char *s) {
// if (!s)
int MSG_ReadLong(void) { // SZ_Write(sb, "", 1);
int c; // else
// SZ_Write(sb, s, std::strlen(s) + 1);
if (msg_readcount + 4 > net_message.cursize) { // }
msg_badread = true; //
return -1; // //johnfitz -- original behavior, 13.3 fixed point coords, max range +-4096
} // void MSG_WriteCoord16(sizebuf_t *sb, float f) {
// MSG_WriteShort(sb, Q_rint(f*8));
c = net_message.data[msg_readcount] // }
+ (net_message.data[msg_readcount + 1] << 8) //
+ (net_message.data[msg_readcount + 2] << 16) // //johnfitz -- 16.8 fixed point coords, max range +-32768
+ (net_message.data[msg_readcount + 3] << 24); // void MSG_WriteCoord24(sizebuf_t *sb, float f) {
// MSG_WriteShort(sb, f);
msg_readcount += 4; // MSG_WriteByte(sb, (int) (f * 255) % 255);
// }
return c; //
} // //johnfitz -- 32-bit float coords
// void MSG_WriteCoord32f(sizebuf_t *sb, float f) {
float MSG_ReadFloat(void) { // MSG_WriteFloat(sb, f);
union { // }
byte b[4]; //
float f; // void MSG_WriteCoord(sizebuf_t *sb, float f, unsigned int flags) {
int l; // if (flags & PRFL_FLOATCOORD)
} dat; // MSG_WriteFloat(sb, f);
// else if (flags & PRFL_INT32COORD)
dat.b[0] = net_message.data[msg_readcount]; // MSG_WriteLong(sb, Q_rint(f * 16));
dat.b[1] = net_message.data[msg_readcount + 1]; // else if (flags & PRFL_24BITCOORD)
dat.b[2] = net_message.data[msg_readcount + 2]; // MSG_WriteCoord24(sb, f);
dat.b[3] = net_message.data[msg_readcount + 3]; // else MSG_WriteCoord16(sb, f);
msg_readcount += 4; // }
//
dat.l = LittleLong(dat.l); // void MSG_WriteAngle(sizebuf_t *sb, float f, unsigned int flags) {
// if (flags & PRFL_FLOATANGLE)
return dat.f; // MSG_WriteFloat(sb, f);
} // else if (flags & PRFL_SHORTANGLE)
// MSG_WriteShort(sb, Q_rint(f * 65536.0 / 360.0) & 65535);
const char *MSG_ReadString(void) { // else MSG_WriteByte(sb, Q_rint(f * 256.0 / 360.0) & 255); //johnfitz -- use Q_rint instead of (int) }
static char string[2048]; // }
int c; //
size_t l; // //johnfitz -- for PROTOCOL_FITZQUAKE
// void MSG_WriteAngle16(sizebuf_t *sb, float f, unsigned int flags) {
l = 0; // if (flags & PRFL_FLOATANGLE)
do { // MSG_WriteFloat(sb, f);
c = MSG_ReadByte(); // else MSG_WriteShort(sb, Q_rint(f * 65536.0 / 360.0) & 65535);
if (c == -1 || c == 0) // }
break; //
string[l] = c; // //johnfitz
l++; //
} while (l < sizeof(string) - 1); // //
// // reading functions
string[l] = 0; // //
// int msg_readcount;
return string; // bool msg_badread;
} //
// void MSG_BeginReading(void) {
//johnfitz -- original behavior, 13.3 fixed point coords, max range +-4096 // msg_readcount = 0;
float MSG_ReadCoord16(void) { // msg_badread = false;
return MSG_ReadShort() * (1.0 / 8); // }
} //
// // returns -1 and sets msg_badread if no more characters are available
//johnfitz -- 16.8 fixed point coords, max range +-32768 // int MSG_ReadChar(void) {
float MSG_ReadCoord24(void) { // int c;
return MSG_ReadShort() + MSG_ReadByte() * (1.0 / 255); //
} // if (msg_readcount + 1 > net_message.cursize) {
// msg_badread = true;
//johnfitz -- 32-bit float coords // return -1;
float MSG_ReadCoord32f(void) { // }
return MSG_ReadFloat(); //
} // c = (signed char) net_message.data[msg_readcount];
// msg_readcount++;
float MSG_ReadCoord(unsigned int flags) { //
if (flags & PRFL_FLOATCOORD) // return c;
return MSG_ReadFloat(); // }
else if (flags & PRFL_INT32COORD) //
return MSG_ReadLong() * (1.0 / 16.0); // int MSG_ReadByte(void) {
else if (flags & PRFL_24BITCOORD) // int c;
return MSG_ReadCoord24(); //
else return MSG_ReadCoord16(); // if (msg_readcount + 1 > net_message.cursize) {
} // msg_badread = true;
// return -1;
float MSG_ReadAngle(unsigned int flags) { // }
if (flags & PRFL_FLOATANGLE) //
return MSG_ReadFloat(); // c = (unsigned char) net_message.data[msg_readcount];
else if (flags & PRFL_SHORTANGLE) // msg_readcount++;
return MSG_ReadShort() * (360.0 / 65536); //
else return MSG_ReadChar() * (360.0 / 256); // return c;
} // }
//
//johnfitz -- for PROTOCOL_FITZQUAKE // int MSG_ReadShort(void) {
float MSG_ReadAngle16(unsigned int flags) { // int c;
if (flags & PRFL_FLOATANGLE) //
return MSG_ReadFloat(); // make sure // if (msg_readcount + 2 > net_message.cursize) {
else return MSG_ReadShort() * (360.0 / 65536); // msg_badread = true;
} // return -1;
// }
//johnfitz //
// c = (short) (net_message.data[msg_readcount]
// + (net_message.data[msg_readcount + 1] << 8));
//
// msg_readcount += 2;
//
// return c;
// }
//
// int MSG_ReadLong(void) {
// int c;
//
// if (msg_readcount + 4 > net_message.cursize) {
// msg_badread = true;
// return -1;
// }
//
// c = net_message.data[msg_readcount]
// + (net_message.data[msg_readcount + 1] << 8)
// + (net_message.data[msg_readcount + 2] << 16)
// + (net_message.data[msg_readcount + 3] << 24);
//
// msg_readcount += 4;
//
// return c;
// }
//
// float MSG_ReadFloat(void) {
// union {
// byte b[4];
// float f;
// int l;
// } dat;
//
// dat.b[0] = net_message.data[msg_readcount];
// dat.b[1] = net_message.data[msg_readcount + 1];
// dat.b[2] = net_message.data[msg_readcount + 2];
// dat.b[3] = net_message.data[msg_readcount + 3];
// msg_readcount += 4;
//
// dat.l = LittleLong(dat.l);
//
// return dat.f;
// }
//
// const char *MSG_ReadString(void) {
// static char string[2048];
// int c;
// size_t l;
//
// l = 0;
// do {
// c = net_message.read_byte().value();
// if (c == -1 || c == 0)
// break;
// string[l] = c;
// l++;
// } while (l < sizeof(string) - 1);
//
// string[l] = 0;
//
// return string;
// }
//
// //johnfitz -- original behavior, 13.3 fixed point coords, max range +-4096
// float MSG_ReadCoord16(void) {
// return MSG_ReadShort() * (1.0 / 8);
// }
//
// //johnfitz -- 16.8 fixed point coords, max range +-32768
// float MSG_ReadCoord24(void) {
// return MSG_ReadShort() + net_message.read_byte().value() * (1.0 / 255);
// }
//
// //johnfitz -- 32-bit float coords
// float MSG_ReadCoord32f(void) {
// return MSG_ReadFloat();
// }
//
// float MSG_ReadCoord(unsigned int flags) {
// if (flags & PRFL_FLOATCOORD)
// return MSG_ReadFloat();
// else if (flags & PRFL_INT32COORD)
// return MSG_ReadLong() * (1.0 / 16.0);
// else if (flags & PRFL_24BITCOORD)
// return MSG_ReadCoord24();
// else return MSG_ReadCoord16();
// }
//
// float MSG_ReadAngle(unsigned int flags) {
// if (flags & PRFL_FLOATANGLE)
// return MSG_ReadFloat();
// else if (flags & PRFL_SHORTANGLE)
// return MSG_ReadShort() * (360.0 / 65536);
// else return MSG_ReadChar() * (360.0 / 256);
// }
//
// //johnfitz -- for PROTOCOL_FITZQUAKE
// float MSG_ReadAngle16(unsigned int flags) {
// if (flags & PRFL_FLOATANGLE)
// return MSG_ReadFloat(); // make sure
// else return MSG_ReadShort() * (360.0 / 65536);
// }
//
// //johnfitz
//=========================================================================== //===========================================================================
-25
View File
@@ -148,31 +148,6 @@ extern float (*LittleFloat) (float l);
//============================================================================ //============================================================================
void MSG_WriteChar (sizebuf_t *sb, int c);
void MSG_WriteByte (sizebuf_t *sb, int c);
void MSG_WriteShort (sizebuf_t *sb, int c);
void MSG_WriteLong (sizebuf_t *sb, int c);
void MSG_WriteFloat (sizebuf_t *sb, float f);
void MSG_WriteString (sizebuf_t *sb, const char *s);
void MSG_WriteCoord (sizebuf_t *sb, float f, unsigned int flags);
void MSG_WriteAngle (sizebuf_t *sb, float f, unsigned int flags);
void MSG_WriteAngle16 (sizebuf_t *sb, float f, unsigned int flags); //johnfitz
extern int msg_readcount;
extern bool msg_badread; // set if a read goes beyond end of message
void MSG_BeginReading (void);
int MSG_ReadChar (void);
int MSG_ReadByte (void);
int MSG_ReadShort (void);
int MSG_ReadLong (void);
float MSG_ReadFloat (void);
const char *MSG_ReadString (void);
float MSG_ReadCoord (unsigned int flags);
float MSG_ReadAngle (unsigned int flags);
float MSG_ReadAngle16 (unsigned int flags); //johnfitz
//============================================================================ //============================================================================
+56 -66
View File
@@ -49,10 +49,7 @@ int con_current; // where next message will be printed
int con_x; // offset in current line for next print int con_x; // offset in current line for next print
char *con_text = NULL; char *con_text = NULL;
convar con_notifytime{"con_notifytime", "3"}; //seconds
convar con_logcenterprint{"con_logcenterprint", "1"}; //johnfitz
char con_lastcenterstring[1024]; //johnfitz
#define NUM_CON_TIMES 4 #define NUM_CON_TIMES 4
float con_times[NUM_CON_TIMES]; // realtime time the line was generated float con_times[NUM_CON_TIMES]; // realtime time the line was generated
@@ -74,7 +71,12 @@ namespace console {
int total_lines{0}; // total lines in console scrollback int total_lines{0}; // total lines in console scrollback
int back_scroll{0}; // lines up from bottom to display int back_scroll{0}; // lines up from bottom to display
std::string last_center_string{};
namespace { namespace {
convar notify_time{"con_notifytime", "3"}; //seconds
convar log_center_print{"con_logcenterprint", "1"}; //johnfitz
void _toggle_console() { void _toggle_console() {
toggle_console(); toggle_console();
} }
@@ -150,9 +152,6 @@ namespace console {
int l; int l;
static int cr; static int cr;
int mask; int mask;
bool boundary;
//console::back_scroll = 0; //johnfitz -- better console scrolling
std::istringstream ss{text}; std::istringstream ss{text};
@@ -171,7 +170,7 @@ namespace console {
break; break;
} }
boundary = true; bool boundary = true;
while (!ss.eof()) { while (!ss.eof()) {
const int c = ss.peek(); const int c = ss.peek();
@@ -292,8 +291,8 @@ namespace console {
info("Console initialized.\n"); info("Console initialized.\n");
con_notifytime.inscribe(); notify_time.inscribe();
con_logcenterprint.inscribe(); //johnfitz log_center_print.inscribe(); //johnfitz
command::add("toggleconsole", _toggle_console); command::add("toggleconsole", _toggle_console);
command::add("messagemode", _message_mode); command::add("messagemode", _message_mode);
@@ -444,6 +443,49 @@ namespace console {
SCR_EndLoadingPlaque(); SCR_EndLoadingPlaque();
memset(con_times, 0, sizeof(con_times)); memset(con_times, 0, sizeof(con_times));
} }
void check_resize() {
int i, j;
const int width = (vid.conwidth >> 3) - 2; //johnfitz -- use vid.conwidth instead of vid.width
if (width == con_linewidth)
return;
const int oldwidth = con_linewidth;
con_linewidth = width;
const int oldtotallines = total_lines;
total_lines = con_buffersize / con_linewidth; //johnfitz -- con_buffersize replaces CON_TEXTSIZE
int numlines = oldtotallines;
if (total_lines < numlines)
numlines = total_lines;
int numchars = oldwidth;
if (con_linewidth < numchars)
numchars = con_linewidth;
const int mark = Hunk_LowMark(); //johnfitz
char *tbuf = (char *) Hunk_Alloc(con_buffersize); //johnfitz
std::memcpy(tbuf, con_text, con_buffersize); //johnfitz -- con_buffersize replaces CON_TEXTSIZE
std::memset(con_text, ' ', con_buffersize); //johnfitz -- con_buffersize replaces CON_TEXTSIZE
for (i = 0; i < numlines; i++) {
for (j = 0; j < numchars; j++) {
con_text[(total_lines - 1 - i) * con_linewidth + j] =
tbuf[((con_current - i + oldtotallines) % oldtotallines) * oldwidth + j];
}
}
Hunk_FreeToLowMark(mark); //johnfitz
Con_ClearNotify();
back_scroll = 0;
con_current = total_lines - 1;
}
} }
@@ -488,58 +530,6 @@ void Con_ClearNotify(void) {
} }
/*
================
Con_CheckResize
If the line width has changed, reformat the buffer.
================
*/
void Con_CheckResize(void) {
int i, j, width, oldwidth, oldtotallines, numlines, numchars;
char *tbuf; //johnfitz -- tbuf no longer a static array
int mark; //johnfitz
width = (vid.conwidth >> 3) - 2; //johnfitz -- use vid.conwidth instead of vid.width
if (width == con_linewidth)
return;
oldwidth = con_linewidth;
con_linewidth = width;
oldtotallines = console::total_lines;
console::total_lines = con_buffersize / con_linewidth; //johnfitz -- con_buffersize replaces CON_TEXTSIZE
numlines = oldtotallines;
if (console::total_lines < numlines)
numlines = console::total_lines;
numchars = oldwidth;
if (con_linewidth < numchars)
numchars = con_linewidth;
mark = Hunk_LowMark(); //johnfitz
tbuf = (char *) Hunk_Alloc(con_buffersize); //johnfitz
std::memcpy(tbuf, con_text, con_buffersize); //johnfitz -- con_buffersize replaces CON_TEXTSIZE
std::memset(con_text, ' ', con_buffersize); //johnfitz -- con_buffersize replaces CON_TEXTSIZE
for (i = 0; i < numlines; i++) {
for (j = 0; j < numchars; j++) {
con_text[(console::total_lines - 1 - i) * con_linewidth + j] =
tbuf[((con_current - i + oldtotallines) % oldtotallines) * oldwidth + j];
}
}
Hunk_FreeToLowMark(mark); //johnfitz
Con_ClearNotify();
console::back_scroll = 0;
con_current = console::total_lines - 1;
}
// borrowed from uhexen2 by S.A. for new procs, LOG_Init, LOG_Close // borrowed from uhexen2 by S.A. for new procs, LOG_Init, LOG_Close
@@ -569,15 +559,15 @@ Con_LogCenterPrint -- johnfitz -- echo centerprint message to the console
================== ==================
*/ */
void Con_LogCenterPrint(const char *str) { void Con_LogCenterPrint(const char *str) {
if (!strcmp(str, con_lastcenterstring)) if (str == console::last_center_string)
return; //ignore duplicates return; //ignore duplicates
if (cl.gametype == GAME_DEATHMATCH && con_logcenterprint.value != 2) if (cl.gametype == GAME_DEATHMATCH && console::log_center_print.value != 2)
return; //don't log in deathmatch return; //don't log in deathmatch
strcpy(con_lastcenterstring, str); console::last_center_string = str;
if (con_logcenterprint.value) { if (console::log_center_print.value != 0) {
console::info("%s", Con_Quakebar(40)); console::info("%s", Con_Quakebar(40));
console::center_print(40, "%s\n", str); console::center_print(40, "%s\n", str);
console::info("%s", Con_Quakebar(40)); console::info("%s", Con_Quakebar(40));
@@ -931,7 +921,7 @@ void Con_DrawNotify(void) {
if (time == 0) if (time == 0)
continue; continue;
time = realtime - time; time = realtime - time;
if (time > con_notifytime.value) if (time > console::notify_time.value)
continue; continue;
text = con_text + (i % console::total_lines) * con_linewidth; text = con_text + (i % console::total_lines) * con_linewidth;
+4 -8
View File
@@ -23,8 +23,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef __CONSOLE_H #ifndef __CONSOLE_H
#define __CONSOLE_H #define __CONSOLE_H
extern char con_lastcenterstring[]; //johnfitz
void Con_DrawCharacter(int cx, int line, int num); void Con_DrawCharacter(int cx, int line, int num);
namespace console { namespace console {
@@ -32,6 +30,7 @@ namespace console {
extern int back_scroll; extern int back_scroll;
extern bool forced_up; extern bool forced_up;
extern bool initialized; extern bool initialized;
extern std::string last_center_string;
void init(); void init();
@@ -50,9 +49,10 @@ namespace console {
void safe_print(const char *fmt, ...); void safe_print(const char *fmt, ...);
void toggle_console(); void toggle_console();
}
void Con_CheckResize(void); void check_resize();
}
void Con_DrawConsole(int lines, bool drawinput); void Con_DrawConsole(int lines, bool drawinput);
@@ -62,10 +62,6 @@ void Con_ClearNotify(void);
void Con_NotifyBox(const char *text); // during startup for sound / cd warnings void Con_NotifyBox(const char *text); // during startup for sound / cd warnings
void Con_Show(void);
void Con_Hide(void);
const char *Con_Quakebar(int len); const char *Con_Quakebar(int len);
void Con_TabComplete(void); void Con_TabComplete(void);
+5 -5
View File
@@ -92,11 +92,11 @@ handle an SVC_FOG message from server
void Fog_ParseServerMessage(void) { void Fog_ParseServerMessage(void) {
float density, red, green, blue, time; float density, red, green, blue, time;
density = MSG_ReadByte() / 255.0; density = net_message.read_byte().value() / 255.0;
red = MSG_ReadByte() / 255.0; red = net_message.read_byte().value() / 255.0;
green = MSG_ReadByte() / 255.0; green = net_message.read_byte().value() / 255.0;
blue = MSG_ReadByte() / 255.0; blue = net_message.read_byte().value() / 255.0;
time = MSG_ReadShort() / 100.0; time = net_message.read_short().value() / 100.0;
if (time < 0.0f) time = 0.0f; if (time < 0.0f) time = 0.0f;
Fog_Update(density, red, green, blue, time); Fog_Update(density, red, green, blue, time);
+1 -1
View File
@@ -647,7 +647,7 @@ void SCR_SetUpToDrawConsole(void) {
float timescale, conspeed; float timescale, conspeed;
//johnfitz //johnfitz
Con_CheckResize(); console::check_resize();
if (scr_drawloading) if (scr_drawloading)
return; // never a console with loading plaque return; // never a console with loading plaque
+24 -27
View File
@@ -333,8 +333,8 @@ void SV_ClientPrintf(const char *fmt, ...) {
q_vsnprintf(string, sizeof(string), fmt, argptr); q_vsnprintf(string, sizeof(string), fmt, argptr);
va_end(argptr); va_end(argptr);
MSG_WriteByte(&host_client->message, svc_print); host_client->message.write_byte(svc_print);
MSG_WriteString(&host_client->message, string); host_client->message.write_string(string);
} }
/* /*
@@ -355,8 +355,8 @@ void SV_BroadcastPrintf(const char *fmt, ...) {
for (i = 0; i < svs.maxclients; i++) { for (i = 0; i < svs.maxclients; i++) {
if (svs.clients[i].active && svs.clients[i].spawned) { if (svs.clients[i].active && svs.clients[i].spawned) {
MSG_WriteByte(&svs.clients[i].message, svc_print); svs.clients[i].message.write_byte(svc_print);
MSG_WriteString(&svs.clients[i].message, string); svs.clients[i].message.write_string(string);
} }
} }
} }
@@ -376,8 +376,8 @@ void Host_ClientCommands(const char *fmt, ...) {
q_vsnprintf(string, sizeof(string), fmt, argptr); q_vsnprintf(string, sizeof(string), fmt, argptr);
va_end(argptr); va_end(argptr);
MSG_WriteByte(&host_client->message, svc_stufftext); host_client->message.write_byte(svc_stufftext);
MSG_WriteString(&host_client->message, string); host_client->message.write_string(string);
} }
/* /*
@@ -396,8 +396,8 @@ void SV_DropClient(bool crash) {
if (!crash) { if (!crash) {
// send any final messages (don't check for errors) // send any final messages (don't check for errors)
if (NET_CanSendMessage(host_client->netconnection)) { if (NET_CanSendMessage(host_client->netconnection)) {
MSG_WriteByte(&host_client->message, svc_disconnect); host_client->message.write_byte(svc_disconnect);
NET_SendMessage(host_client->netconnection, &host_client->message); NET_SendMessage(host_client->netconnection, host_client->message);
} }
if (host_client->edict && host_client->spawned) { if (host_client->edict && host_client->spawned) {
@@ -426,15 +426,15 @@ void SV_DropClient(bool crash) {
for (i = 0, client = svs.clients; i < svs.maxclients; i++, client++) { for (i = 0, client = svs.clients; i < svs.maxclients; i++, client++) {
if (!client->active) if (!client->active)
continue; continue;
MSG_WriteByte(&client->message, svc_updatename); client->message.write_byte(svc_updatename);
MSG_WriteByte(&client->message, host_client - svs.clients); client->message.write_byte(host_client - svs.clients);
MSG_WriteString(&client->message, ""); client->message.write_string("");
MSG_WriteByte(&client->message, svc_updatefrags); client->message.write_byte(svc_updatefrags);
MSG_WriteByte(&client->message, host_client - svs.clients); client->message.write_byte(host_client - svs.clients);
MSG_WriteShort(&client->message, 0); client->message.write_short(0);
MSG_WriteByte(&client->message, svc_updatecolors); client->message.write_byte(svc_updatecolors);
MSG_WriteByte(&client->message, host_client - svs.clients); client->message.write_byte(host_client - svs.clients);
MSG_WriteByte(&client->message, 0); client->message.write_byte(0);
} }
} }
@@ -448,8 +448,7 @@ This only happens at the end of a game, not between levels
void Host_ShutdownServer(bool crash) { void Host_ShutdownServer(bool crash) {
int i; int i;
int count; int count;
sizebuf_t buf; net::msg msg{};
byte message[4];
double start; double start;
if (!sv.active) if (!sv.active)
@@ -466,10 +465,10 @@ void Host_ShutdownServer(bool crash) {
do { do {
count = 0; count = 0;
for (i = 0, host_client = svs.clients; i < svs.maxclients; i++, host_client++) { for (i = 0, host_client = svs.clients; i < svs.maxclients; i++, host_client++) {
if (host_client->active && host_client->message.cursize) { if (host_client->active && !host_client->message.empty()) {
if (NET_CanSendMessage(host_client->netconnection)) { if (NET_CanSendMessage(host_client->netconnection)) {
NET_SendMessage(host_client->netconnection, &host_client->message); NET_SendMessage(host_client->netconnection, host_client->message);
SZ_Clear(&host_client->message); host_client->message.clear();
} else { } else {
NET_GetMessage(host_client->netconnection); NET_GetMessage(host_client->netconnection);
count++; count++;
@@ -481,11 +480,9 @@ void Host_ShutdownServer(bool crash) {
} while (count); } while (count);
// make sure all the clients know we're disconnecting // make sure all the clients know we're disconnecting
buf.data = message;
buf.maxsize = 4; msg.write_byte(svc_disconnect);
buf.cursize = 0; count = NET_SendToAll(msg, 5.0);
MSG_WriteByte(&buf, svc_disconnect);
count = NET_SendToAll(&buf, 5.0);
if (count) if (count)
console::info("Host_ShutdownServer: NET_SendToAll failed for %u clients\n", count); console::info("Host_ShutdownServer: NET_SendToAll failed for %u clients\n", count);
+45 -41
View File
@@ -1203,9 +1203,9 @@ static void Host_Name_f(void) {
host_client->edict->v.netname = PR_SetEngineString(host_client->name); host_client->edict->v.netname = PR_SetEngineString(host_client->name);
// send notification to all clients // send notification to all clients
MSG_WriteByte(&sv.reliable_datagram, svc_updatename); sv.reliable_datagram.write_byte(svc_updatename);
MSG_WriteByte(&sv.reliable_datagram, host_client - svs.clients); sv.reliable_datagram.write_byte(host_client - svs.clients);
MSG_WriteString(&sv.reliable_datagram, host_client->name); sv.reliable_datagram.write_string(host_client->name);
} }
static void Host_Say(bool teamonly) { static void Host_Say(bool teamonly) {
@@ -1383,9 +1383,9 @@ static void Host_Color_f(void) {
host_client->edict->v.team = bottom + 1; host_client->edict->v.team = bottom + 1;
// send notification to all clients // send notification to all clients
MSG_WriteByte(&sv.reliable_datagram, svc_updatecolors); sv.reliable_datagram.write_byte(svc_updatecolors);
MSG_WriteByte(&sv.reliable_datagram, host_client - svs.clients); sv.reliable_datagram.write_byte(host_client - svs.clients);
MSG_WriteByte(&sv.reliable_datagram, host_client->colors); sv.reliable_datagram.write_byte(host_client->colors);
} }
/* /*
@@ -1438,8 +1438,8 @@ static void Host_Pause_f(void) {
} }
// send notification to all clients // send notification to all clients
MSG_WriteByte(&sv.reliable_datagram, svc_setpause); sv.reliable_datagram.write_byte(svc_setpause);
MSG_WriteByte(&sv.reliable_datagram, sv.paused); sv.reliable_datagram.write_byte(sv.paused);
} }
} }
@@ -1514,49 +1514,53 @@ static void Host_Spawn_f(void) {
} }
// send all current names, colors, and frag counts // send all current names, colors, and frag counts
SZ_Clear(&host_client->message); host_client->message.clear();
// send time of update // send time of update
MSG_WriteByte(&host_client->message, svc_time); host_client->message.write_byte(svc_time);
MSG_WriteFloat(&host_client->message, sv.time); host_client->message.write_float(sv.time);
for (i = 0, client = svs.clients; i < svs.maxclients; i++, client++) { for (i = 0, client = svs.clients; i < svs.maxclients; i++, client++) {
MSG_WriteByte(&host_client->message, svc_updatename); host_client->message.write_byte(svc_updatename);
MSG_WriteByte(&host_client->message, i); host_client->message.write_byte(i);
MSG_WriteString(&host_client->message, client->name); host_client->message.write_string(client->name);
MSG_WriteByte(&host_client->message, svc_updatefrags); host_client->message.write_byte(svc_updatefrags);
MSG_WriteByte(&host_client->message, i); host_client->message.write_byte(i);
MSG_WriteShort(&host_client->message, client->old_frags); host_client->message.write_short(client->old_frags);
MSG_WriteByte(&host_client->message, svc_updatecolors); host_client->message.write_byte(svc_updatecolors);
MSG_WriteByte(&host_client->message, i); host_client->message.write_byte(i);
MSG_WriteByte(&host_client->message, client->colors); host_client->message.write_byte(client->colors);
} }
// send all current light styles // send all current light styles
for (i = 0; i < MAX_LIGHTSTYLES; i++) { for (i = 0; i < MAX_LIGHTSTYLES; i++) {
MSG_WriteByte(&host_client->message, svc_lightstyle); host_client->message.write_byte(svc_lightstyle);
MSG_WriteByte(&host_client->message, (char) i); host_client->message.write_byte((char) i);
MSG_WriteString(&host_client->message, sv.lightstyles[i]); if (sv.lightstyles[i]) {
host_client->message.write_string(sv.lightstyles[i]);
} else {
host_client->message.write_string("m"); // TODO: HACK
}
} }
// //
// send some stats // send some stats
// //
MSG_WriteByte(&host_client->message, svc_updatestat); host_client->message.write_byte(svc_updatestat);
MSG_WriteByte(&host_client->message, STAT_TOTALSECRETS); host_client->message.write_byte(STAT_TOTALSECRETS);
MSG_WriteLong(&host_client->message, pr_global_struct->total_secrets); host_client->message.write_long(pr_global_struct->total_secrets);
MSG_WriteByte(&host_client->message, svc_updatestat); host_client->message.write_byte(svc_updatestat);
MSG_WriteByte(&host_client->message, STAT_TOTALMONSTERS); host_client->message.write_byte(STAT_TOTALMONSTERS);
MSG_WriteLong(&host_client->message, pr_global_struct->total_monsters); host_client->message.write_long(pr_global_struct->total_monsters);
MSG_WriteByte(&host_client->message, svc_updatestat); host_client->message.write_byte(svc_updatestat);
MSG_WriteByte(&host_client->message, STAT_SECRETS); host_client->message.write_byte(STAT_SECRETS);
MSG_WriteLong(&host_client->message, pr_global_struct->found_secrets); host_client->message.write_long(pr_global_struct->found_secrets);
MSG_WriteByte(&host_client->message, svc_updatestat); host_client->message.write_byte(svc_updatestat);
MSG_WriteByte(&host_client->message, STAT_MONSTERS); host_client->message.write_byte(STAT_MONSTERS);
MSG_WriteLong(&host_client->message, pr_global_struct->killed_monsters); host_client->message.write_long(pr_global_struct->killed_monsters);
// //
// send a fixangle // send a fixangle
@@ -1565,15 +1569,15 @@ static void Host_Spawn_f(void) {
// and it won't happen if the game was just loaded, so you wind up // and it won't happen if the game was just loaded, so you wind up
// with a permanent head tilt // with a permanent head tilt
ent = EDICT_NUM(1 + (host_client - svs.clients)); ent = EDICT_NUM(1 + (host_client - svs.clients));
MSG_WriteByte(&host_client->message, svc_setangle); host_client->message.write_byte(svc_setangle);
for (i = 0; i < 2; i++) for (i = 0; i < 2; i++)
MSG_WriteAngle(&host_client->message, ent->v.angles[i], sv.protocolflags); host_client->message.write_angle(ent->v.angles[i], static_cast<net::rmq_flags>(sv.protocolflags));
MSG_WriteAngle(&host_client->message, 0, sv.protocolflags); host_client->message.write_angle(0, static_cast<net::rmq_flags>(sv.protocolflags));
SV_WriteClientdataToMessage(sv_player, &host_client->message); SV_WriteClientdataToMessage(sv_player, host_client->message);
MSG_WriteByte(&host_client->message, svc_signonnum); host_client->message.write_byte(svc_signonnum);
MSG_WriteByte(&host_client->message, 3); host_client->message.write_byte(3);
host_client->sendsignon = PRESPAWN_FLUSH; host_client->sendsignon = PRESPAWN_FLUSH;
} }
+2 -2
View File
@@ -1061,7 +1061,7 @@ void M_AdjustSliders(int dir) {
convar::set_value("bgmvolume", f); convar::set_value("bgmvolume", f);
break; break;
case OPT_MUSICEXT: // enable external music vs cdaudio case OPT_MUSICEXT: // enable external music vs cdaudio
convar::set("bgm_extmusic", music::bgm_extmusic.value ? "0" : "1"); convar::set("bgm_extmusic", music::extmusic.value ? "0" : "1");
break; break;
case OPT_SNDVOL: // sfx volume case OPT_SNDVOL: // sfx volume
f = sfxvolume.value + dir * 0.1; f = sfxvolume.value + dir * 0.1;
@@ -1207,7 +1207,7 @@ void M_Options_Draw(void) {
// OPT_MUSICEXT: // OPT_MUSICEXT:
M_Print(16, 32 + 8 * OPT_MUSICEXT, " External Music"); M_Print(16, 32 + 8 * OPT_MUSICEXT, " External Music");
M_DrawCheckbox(220, 32 + 8 * OPT_MUSICEXT, music::bgm_extmusic.value); M_DrawCheckbox(220, 32 + 8 * OPT_MUSICEXT, music::extmusic.value);
// OPT_ALWAYRUN: // OPT_ALWAYRUN:
M_Print(16, 32 + 8 * OPT_ALWAYRUN, " Always Run"); M_Print(16, 32 + 8 * OPT_ALWAYRUN, " Always Run");
+5 -4
View File
@@ -35,6 +35,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#define NET_NAMELEN 64 #define NET_NAMELEN 64
#define NET_MAXMESSAGE 64000 /* ericw -- was 32000 */ #define NET_MAXMESSAGE 64000 /* ericw -- was 32000 */
#include "net_msg.hpp"
extern int DEFAULTnet_hostport; extern int DEFAULTnet_hostport;
extern int net_hostport; extern int net_hostport;
@@ -42,7 +43,7 @@ extern int net_hostport;
extern convar hostname; extern convar hostname;
extern double net_time; extern double net_time;
extern sizebuf_t net_message; extern net::msg net_message;
extern int net_activeconnections; extern int net_activeconnections;
@@ -69,14 +70,14 @@ int NET_GetMessage (struct qsocket_s *sock);
// returns 2 if an unreliable message was received // returns 2 if an unreliable message was received
// returns -1 if the connection died // returns -1 if the connection died
int NET_SendMessage (struct qsocket_s *sock, sizebuf_t *data); int NET_SendMessage (struct qsocket_s *sock, net::msg &msg);
int NET_SendUnreliableMessage (struct qsocket_s *sock, sizebuf_t *data); int NET_SendUnreliableMessage (struct qsocket_s *sock, net::msg &msg);
// returns 0 if the message connot be delivered reliably, but the connection // returns 0 if the message connot be delivered reliably, but the connection
// is still considered valid // is still considered valid
// returns 1 if the message was sent properly // returns 1 if the message was sent properly
// returns -1 if the connection died // returns -1 if the connection died
int NET_SendToAll(sizebuf_t *data, double blocktime); int NET_SendToAll(net::msg &msg, double blocktime);
// This is a reliable *blocking* send to all attached clients. // This is a reliable *blocking* send to all attached clients.
void NET_Close (struct qsocket_s *sock); void NET_Close (struct qsocket_s *sock);
+2 -2
View File
@@ -202,8 +202,8 @@ typedef struct
qsocket_t *(*Connect) (const char *host); qsocket_t *(*Connect) (const char *host);
qsocket_t *(*CheckNewConnections) (void); qsocket_t *(*CheckNewConnections) (void);
int (*QGetMessage) (qsocket_t *sock); int (*QGetMessage) (qsocket_t *sock);
int (*QSendMessage) (qsocket_t *sock, sizebuf_t *data); int (*QSendMessage) (qsocket_t *sock, net::msg &msg);
int (*SendUnreliableMessage) (qsocket_t *sock, sizebuf_t *data); int (*SendUnreliableMessage) (qsocket_t *sock, net::msg &msg);
bool (*CanSendMessage) (qsocket_t *sock); bool (*CanSendMessage) (qsocket_t *sock);
bool (*CanSendUnreliableMessage) (qsocket_t *sock); bool (*CanSendUnreliableMessage) (qsocket_t *sock);
void (*Close) (qsocket_t *sock); void (*Close) (qsocket_t *sock);
+200 -186
View File
@@ -121,7 +121,7 @@ static void NET_Ban_f(void) {
#endif // BAN_TEST #endif // BAN_TEST
int Datagram_SendMessage(qsocket_t *sock, sizebuf_t *data) { int Datagram_SendMessage(qsocket_t *sock, net::msg &msg) {
unsigned int packetLen; unsigned int packetLen;
unsigned int dataLen; unsigned int dataLen;
unsigned int eom; unsigned int eom;
@@ -137,11 +137,11 @@ int Datagram_SendMessage(qsocket_t *sock, sizebuf_t *data) {
Sys_Error("SendMessage: called with canSend == false"); Sys_Error("SendMessage: called with canSend == false");
#endif #endif
std::memcpy(sock->sendMessage, data->data, data->cursize); std::memcpy(sock->sendMessage, msg.data(), msg.size());
sock->sendMessageLength = data->cursize; sock->sendMessageLength = msg.size();
if (data->cursize <= MAX_DATAGRAM) { if (msg.size() <= MAX_DATAGRAM) {
dataLen = data->cursize; dataLen = msg.size();
eom = NETFLAG_EOM; eom = NETFLAG_EOM;
} else { } else {
dataLen = MAX_DATAGRAM; dataLen = MAX_DATAGRAM;
@@ -235,7 +235,7 @@ bool Datagram_CanSendUnreliableMessage(qsocket_t *sock) {
} }
int Datagram_SendUnreliableMessage(qsocket_t *sock, sizebuf_t *data) { int Datagram_SendUnreliableMessage(qsocket_t *sock, net::msg &msg) {
int packetLen; int packetLen;
#ifdef DEBUG #ifdef DEBUG
@@ -246,11 +246,11 @@ int Datagram_SendUnreliableMessage(qsocket_t *sock, sizebuf_t *data) {
Sys_Error("Datagram_SendUnreliableMessage: message too big: %u", data->cursize); Sys_Error("Datagram_SendUnreliableMessage: message too big: %u", data->cursize);
#endif #endif
packetLen = NET_HEADERSIZE + data->cursize; packetLen = NET_HEADERSIZE + msg.size();
packetBuffer.length = BigLong(packetLen | NETFLAG_UNRELIABLE); packetBuffer.length = BigLong(packetLen | NETFLAG_UNRELIABLE);
packetBuffer.sequence = BigLong(sock->unreliableSendSequence++); packetBuffer.sequence = BigLong(sock->unreliableSendSequence++);
std::memcpy(packetBuffer.data, data->data, data->cursize); std::memcpy(packetBuffer.data, msg.data(), msg.size());
if (sfunc.Write(sock->socket, (byte *) &packetBuffer, packetLen, &sock->addr) == -1) if (sfunc.Write(sock->socket, (byte *) &packetBuffer, packetLen, &sock->addr) == -1)
return -1; return -1;
@@ -324,8 +324,8 @@ int Datagram_GetMessage(qsocket_t *sock) {
length -= NET_HEADERSIZE; length -= NET_HEADERSIZE;
SZ_Clear(&net_message); net_message.clear();
SZ_Write(&net_message, packetBuffer.data, length); net_message.write(packetBuffer.data, length);
ret = 2; ret = 2;
break; break;
@@ -369,9 +369,9 @@ int Datagram_GetMessage(qsocket_t *sock) {
length -= NET_HEADERSIZE; length -= NET_HEADERSIZE;
if (flags & NETFLAG_EOM) { if (flags & NETFLAG_EOM) {
SZ_Clear(&net_message); net_message.clear();
SZ_Write(&net_message, sock->receiveMessage, sock->receiveMessageLength); net_message.write(sock->receiveMessage, sock->receiveMessageLength);
SZ_Write(&net_message, packetBuffer.data, length); net_message.write(packetBuffer.data, length);
sock->receiveMessageLength = 0; sock->receiveMessageLength = 0;
ret = 1; ret = 1;
@@ -482,15 +482,19 @@ static void Test_Poll(void *unused) {
net_landriverlevel = testDriver; net_landriverlevel = testDriver;
while (1) { while (1) {
len = dfunc.Read(testSocket, net_message.data, net_message.maxsize, &clientaddr); const auto buf = new std::uint8_t[MAX_DATAGRAM];
if (len < (int) sizeof(int)) len = dfunc.Read(testSocket, &buf[0], MAX_DATAGRAM, &clientaddr);
if (len < (int) sizeof(int)) {
delete []buf;
break; break;
}
net_message.write(buf, len);
delete []buf;
net_message.cursize = len;
MSG_BeginReading(); net_message.begin_reading();
control = BigLong(*((int *) net_message.data)); control = BigLong(*((int *) net_message.data()));
MSG_ReadLong(); net_message.read_long();
if (control == -1) if (control == -1)
break; break;
if ((control & (~NETFLAG_LENGTH_MASK)) != (int) NETFLAG_CTL) if ((control & (~NETFLAG_LENGTH_MASK)) != (int) NETFLAG_CTL)
@@ -498,15 +502,15 @@ static void Test_Poll(void *unused) {
if ((control & NETFLAG_LENGTH_MASK) != len) if ((control & NETFLAG_LENGTH_MASK) != len)
break; break;
if (MSG_ReadByte() != CCREP_PLAYER_INFO) if (net_message.read_byte().value() != CCREP_PLAYER_INFO)
Sys_Error("Unexpected response to Player Info request\n"); Sys_Error("Unexpected response to Player Info request\n");
MSG_ReadByte(); /* playerNumber */ net_message.read_byte().value(); /* playerNumber */
std::strcpy(name, MSG_ReadString()); std::strcpy(name, net_message.read_string().value().c_str());
colors = MSG_ReadLong(); colors = net_message.read_long().value();
frags = MSG_ReadLong(); frags = net_message.read_long().value();
connectTime = MSG_ReadLong(); connectTime = net_message.read_long().value();
std::strcpy(address, MSG_ReadString()); std::strcpy(address, net_message.read_string().value().c_str());
console::info("%s\n frags:%3i colors:%d %d time:%d\n %s\n", name, frags, colors >> 4, colors & 0x0f, console::info("%s\n frags:%3i colors:%d %d time:%d\n %s\n", name, frags, colors >> 4, colors & 0x0f,
connectTime / 60, address); connectTime / 60, address);
@@ -572,15 +576,15 @@ JustDoIt:
testDriver = net_landriverlevel; testDriver = net_landriverlevel;
for (n = 0; n < maxusers; n++) { for (n = 0; n < maxusers; n++) {
SZ_Clear(&net_message); net_message.clear();
// save space for the header, filled in later // save space for the header, filled in later
MSG_WriteLong(&net_message, 0); net_message.write_long(0);
MSG_WriteByte(&net_message, CCREQ_PLAYER_INFO); net_message.write_byte(CCREQ_PLAYER_INFO);
MSG_WriteByte(&net_message, n); net_message.write_byte(n);
*((int *) net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); *((int *) net_message.data()) = BigLong(NETFLAG_CTL | (net_message.size() & NETFLAG_LENGTH_MASK));
dfunc.Write(testSocket, net_message.data, net_message.cursize, &sendaddr); dfunc.Write(testSocket, net_message.data(), net_message.size(), &sendaddr);
} }
SZ_Clear(&net_message); net_message.clear();
SchedulePollProcedure(&testPollProcedure, 0.1); SchedulePollProcedure(&testPollProcedure, 0.1);
} }
@@ -603,15 +607,19 @@ static void Test2_Poll(void *unused) {
net_landriverlevel = test2Driver; net_landriverlevel = test2Driver;
name[0] = 0; name[0] = 0;
len = dfunc.Read(test2Socket, net_message.data, net_message.maxsize, &clientaddr); auto buf = new std::uint8_t[MAX_DATAGRAM];
if (len < (int) sizeof(int)) len = dfunc.Read(test2Socket, &buf[0], MAX_DATAGRAM, &clientaddr);
if (len < (int) sizeof(int)) {
delete []buf;
goto Reschedule; goto Reschedule;
}
net_message.write(buf, len);
delete []buf;
net_message.cursize = len;
MSG_BeginReading(); net_message.begin_reading();
control = BigLong(*((int *) net_message.data)); control = BigLong(*((int *) net_message.data()));
MSG_ReadLong(); net_message.read_long();
if (control == -1) if (control == -1)
goto Error; goto Error;
if ((control & (~NETFLAG_LENGTH_MASK)) != (int) NETFLAG_CTL) if ((control & (~NETFLAG_LENGTH_MASK)) != (int) NETFLAG_CTL)
@@ -619,24 +627,24 @@ static void Test2_Poll(void *unused) {
if ((control & NETFLAG_LENGTH_MASK) != len) if ((control & NETFLAG_LENGTH_MASK) != len)
goto Error; goto Error;
if (MSG_ReadByte() != CCREP_RULE_INFO) if (net_message.read_byte().value() != CCREP_RULE_INFO)
goto Error; goto Error;
std::strcpy(name, MSG_ReadString()); std::strcpy(name, net_message.read_string().value().c_str());
if (name[0] == 0) if (name[0] == 0)
goto Done; goto Done;
std::strcpy(value, MSG_ReadString()); std::strcpy(value, net_message.read_string().value().c_str());
console::info("%-16.16s %-16.16s\n", name, value); console::info("%-16.16s %-16.16s\n", name, value);
SZ_Clear(&net_message); net_message.clear();
// save space for the header, filled in later // save space for the header, filled in later
MSG_WriteLong(&net_message, 0); net_message.write_long(0);
MSG_WriteByte(&net_message, CCREQ_RULE_INFO); net_message.write_byte(CCREQ_RULE_INFO);
MSG_WriteString(&net_message, name); net_message.write_string(name);
*((int *) net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); *((int *) net_message.data()) = BigLong(NETFLAG_CTL | (net_message.size() & NETFLAG_LENGTH_MASK));
dfunc.Write(test2Socket, net_message.data, net_message.cursize, &clientaddr); dfunc.Write(test2Socket, net_message.data(), net_message.size(), &clientaddr);
SZ_Clear(&net_message); net_message.clear();
Reschedule: Reschedule:
SchedulePollProcedure(&test2PollProcedure, 0.05); SchedulePollProcedure(&test2PollProcedure, 0.05);
@@ -697,14 +705,14 @@ JustDoIt:
test2InProgress = true; test2InProgress = true;
test2Driver = net_landriverlevel; test2Driver = net_landriverlevel;
SZ_Clear(&net_message); net_message.clear();
// save space for the header, filled in later // save space for the header, filled in later
MSG_WriteLong(&net_message, 0); net_message.write_long(0);
MSG_WriteByte(&net_message, CCREQ_RULE_INFO); net_message.write_byte(CCREQ_RULE_INFO);
MSG_WriteString(&net_message, ""); net_message.write_string("");
*((int *) net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); *((int *) net_message.data()) = BigLong(NETFLAG_CTL | (net_message.size() & NETFLAG_LENGTH_MASK));
dfunc.Write(test2Socket, net_message.data, net_message.cursize, &sendaddr); dfunc.Write(test2Socket, net_message.data(), net_message.size(), &sendaddr);
SZ_Clear(&net_message); net_message.clear();
SchedulePollProcedure(&test2PollProcedure, 0.05); SchedulePollProcedure(&test2PollProcedure, 0.05);
} }
@@ -793,16 +801,20 @@ static qsocket_t *_Datagram_CheckNewConnections(void) {
if (acceptsock == INVALID_SOCKET) if (acceptsock == INVALID_SOCKET)
return NULL; return NULL;
SZ_Clear(&net_message); net_message.clear();
len = dfunc.Read(acceptsock, net_message.data, net_message.maxsize, &clientaddr); auto buf = new byte[MAX_DATAGRAM];
if (len < (int) sizeof(int)) len = dfunc.Read(acceptsock, &buf[0], MAX_DATAGRAM, &clientaddr);
return NULL; if (len < (int) sizeof(int)) {
net_message.cursize = len; delete []buf;
return nullptr;
}
net_message.write(buf, len);
delete []buf;
MSG_BeginReading(); net_message.begin_reading();
control = BigLong(*((int *) net_message.data)); control = BigLong(*((int *) net_message.data()));
MSG_ReadLong(); net_message.read_long();
if (control == -1) if (control == -1)
return NULL; return NULL;
if ((control & (~NETFLAG_LENGTH_MASK)) != (int) NETFLAG_CTL) if ((control & (~NETFLAG_LENGTH_MASK)) != (int) NETFLAG_CTL)
@@ -810,25 +822,25 @@ static qsocket_t *_Datagram_CheckNewConnections(void) {
if ((control & NETFLAG_LENGTH_MASK) != len) if ((control & NETFLAG_LENGTH_MASK) != len)
return NULL; return NULL;
command = MSG_ReadByte(); command = net_message.read_byte().value();
if (command == CCREQ_SERVER_INFO) { if (command == CCREQ_SERVER_INFO) {
if (std::strcmp(MSG_ReadString(), "QUAKE") != 0) if (std::strcmp(net_message.read_string().value().c_str(), "QUAKE") != 0)
return NULL; return NULL;
SZ_Clear(&net_message); net_message.clear();
// save space for the header, filled in later // save space for the header, filled in later
MSG_WriteLong(&net_message, 0); net_message.write_long(0);
MSG_WriteByte(&net_message, CCREP_SERVER_INFO); net_message.write_byte(CCREP_SERVER_INFO);
dfunc.GetSocketAddr(acceptsock, &newaddr); dfunc.GetSocketAddr(acceptsock, &newaddr);
MSG_WriteString(&net_message, dfunc.AddrToString(&newaddr)); net_message.write_string(dfunc.AddrToString(&newaddr));
MSG_WriteString(&net_message, hostname.string); net_message.write_string(hostname.string);
MSG_WriteString(&net_message, sv.name); net_message.write_string(sv.name);
MSG_WriteByte(&net_message, net_activeconnections); net_message.write_byte(net_activeconnections);
MSG_WriteByte(&net_message, svs.maxclients); net_message.write_byte(svs.maxclients);
MSG_WriteByte(&net_message, NET_PROTOCOL_VERSION); net_message.write_byte(NET_PROTOCOL_VERSION);
*((int *) net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); *((int *) net_message.data()) = BigLong(NETFLAG_CTL | (net_message.size() & NETFLAG_LENGTH_MASK));
dfunc.Write(acceptsock, net_message.data, net_message.cursize, &clientaddr); dfunc.Write(acceptsock, net_message.data(), net_message.size(), &clientaddr);
SZ_Clear(&net_message); net_message.clear();
return NULL; return NULL;
} }
@@ -838,7 +850,7 @@ static qsocket_t *_Datagram_CheckNewConnections(void) {
int clientNumber; int clientNumber;
client_t *client; client_t *client;
playerNumber = MSG_ReadByte(); playerNumber = net_message.read_byte().value();
activeNumber = -1; activeNumber = -1;
for (clientNumber = 0, client = svs.clients; clientNumber < svs.maxclients; clientNumber++, client++) { for (clientNumber = 0, client = svs.clients; clientNumber < svs.maxclients; clientNumber++, client++) {
@@ -852,42 +864,40 @@ static qsocket_t *_Datagram_CheckNewConnections(void) {
if (clientNumber == svs.maxclients) if (clientNumber == svs.maxclients)
return NULL; return NULL;
SZ_Clear(&net_message); net_message.clear();
// save space for the header, filled in later // save space for the header, filled in later
MSG_WriteLong(&net_message, 0); net_message.write_long(0);
MSG_WriteByte(&net_message, CCREP_PLAYER_INFO); net_message.write_byte(CCREP_PLAYER_INFO);
MSG_WriteByte(&net_message, playerNumber); net_message.write_byte(playerNumber);
MSG_WriteString(&net_message, client->name); net_message.write_string(client->name);
MSG_WriteLong(&net_message, client->colors); net_message.write_long(client->colors);
MSG_WriteLong(&net_message, (int) client->edict->v.frags); net_message.write_long((int) client->edict->v.frags);
MSG_WriteLong(&net_message, (int) (net_time - client->netconnection->connecttime)); net_message.write_long((int) (net_time - client->netconnection->connecttime));
MSG_WriteString(&net_message, client->netconnection->address); net_message.write_string(client->netconnection->address);
*((int *) net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); *((int *) net_message.data()) = BigLong(NETFLAG_CTL | (net_message.size() & NETFLAG_LENGTH_MASK));
dfunc.Write(acceptsock, net_message.data, net_message.cursize, &clientaddr); dfunc.Write(acceptsock, net_message.data(), net_message.size(), &clientaddr);
SZ_Clear(&net_message); net_message.clear();
return NULL; return NULL;
} }
if (command == CCREQ_RULE_INFO) { if (command == CCREQ_RULE_INFO) {
const char *prevCvarName;
// find the search start location // find the search start location
prevCvarName = MSG_ReadString(); auto prevCvarName = net_message.read_string().value();
auto var = convar::find_var_after(prevCvarName, std::nullopt); auto var = convar::find_var_after(prevCvarName, std::nullopt);
// send the response // send the response
SZ_Clear(&net_message); net_message.clear();
// save space for the header, filled in later // save space for the header, filled in later
MSG_WriteLong(&net_message, 0); net_message.write_long(0);
MSG_WriteByte(&net_message, CCREP_RULE_INFO); net_message.write_byte(CCREP_RULE_INFO);
if (var) { if (var) {
MSG_WriteString(&net_message, var.value()->name.c_str()); net_message.write_string(var.value()->name.c_str());
MSG_WriteString(&net_message, var.value()->string); net_message.write_string(var.value()->string);
} }
*((int *) net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); *((int *) net_message.data()) = BigLong(NETFLAG_CTL | (net_message.size() & NETFLAG_LENGTH_MASK));
dfunc.Write(acceptsock, net_message.data, net_message.cursize, &clientaddr); dfunc.Write(acceptsock, net_message.data(), net_message.size(), &clientaddr);
SZ_Clear(&net_message); net_message.clear();
return NULL; return NULL;
} }
@@ -895,18 +905,18 @@ static qsocket_t *_Datagram_CheckNewConnections(void) {
if (command != CCREQ_CONNECT) if (command != CCREQ_CONNECT)
return NULL; return NULL;
if (std::strcmp(MSG_ReadString(), "QUAKE") != 0) if (std::strcmp(net_message.read_string().value().c_str(), "QUAKE") != 0)
return NULL; return NULL;
if (MSG_ReadByte() != NET_PROTOCOL_VERSION) { if (net_message.read_byte().value() != NET_PROTOCOL_VERSION) {
SZ_Clear(&net_message); net_message.clear();
// save space for the header, filled in later // save space for the header, filled in later
MSG_WriteLong(&net_message, 0); net_message.write_long(0);
MSG_WriteByte(&net_message, CCREP_REJECT); net_message.write_byte(CCREP_REJECT);
MSG_WriteString(&net_message, "Incompatible version.\n"); net_message.write_string("Incompatible version.\n");
*((int *) net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); *((int *) net_message.data()) = BigLong(NETFLAG_CTL | (net_message.size() & NETFLAG_LENGTH_MASK));
dfunc.Write(acceptsock, net_message.data, net_message.cursize, &clientaddr); dfunc.Write(acceptsock, net_message.data(), net_message.size(), &clientaddr);
SZ_Clear(&net_message); net_message.clear();
return NULL; return NULL;
} }
@@ -916,14 +926,14 @@ static qsocket_t *_Datagram_CheckNewConnections(void) {
in_addr_t testAddr; in_addr_t testAddr;
testAddr = ((struct sockaddr_in *) &clientaddr)->sin_addr.s_addr; testAddr = ((struct sockaddr_in *) &clientaddr)->sin_addr.s_addr;
if ((testAddr & banMask.s_addr) == banAddr.s_addr) { if ((testAddr & banMask.s_addr) == banAddr.s_addr) {
SZ_Clear(&net_message); net_message.clear();
// save space for the header, filled in later // save space for the header, filled in later
MSG_WriteLong(&net_message, 0); net_message.write_long(0);
MSG_WriteByte(&net_message, CCREP_REJECT); net_message.write_byte(CCREP_REJECT);
MSG_WriteString(&net_message, "You have been banned.\n"); net_message.write_string("You have been banned.\n");
*((int *) net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); *((int *) net_message.data()) = BigLong(NETFLAG_CTL | (net_message.size() & NETFLAG_LENGTH_MASK));
dfunc.Write(acceptsock, net_message.data, net_message.cursize, &clientaddr); dfunc.Write(acceptsock, net_message.data(), net_message.size(), &clientaddr);
SZ_Clear(&net_message); net_message.clear();
return NULL; return NULL;
} }
} }
@@ -938,15 +948,15 @@ static qsocket_t *_Datagram_CheckNewConnections(void) {
// is this a duplicate connection reqeust? // is this a duplicate connection reqeust?
if (ret == 0 && net_time - s->connecttime < 2.0) { if (ret == 0 && net_time - s->connecttime < 2.0) {
// yes, so send a duplicate reply // yes, so send a duplicate reply
SZ_Clear(&net_message); net_message.clear();
// save space for the header, filled in later // save space for the header, filled in later
MSG_WriteLong(&net_message, 0); net_message.write_long(0);
MSG_WriteByte(&net_message, CCREP_ACCEPT); net_message.write_byte(CCREP_ACCEPT);
dfunc.GetSocketAddr(s->socket, &newaddr); dfunc.GetSocketAddr(s->socket, &newaddr);
MSG_WriteLong(&net_message, dfunc.GetSocketPort(&newaddr)); net_message.write_long(dfunc.GetSocketPort(&newaddr));
*((int *) net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); *((int *) net_message.data()) = BigLong(NETFLAG_CTL | (net_message.size() & NETFLAG_LENGTH_MASK));
dfunc.Write(acceptsock, net_message.data, net_message.cursize, &clientaddr); dfunc.Write(acceptsock, net_message.data(), net_message.size(), &clientaddr);
SZ_Clear(&net_message); net_message.clear();
return NULL; return NULL;
} }
// it's somebody coming back in from a crash/disconnect // it's somebody coming back in from a crash/disconnect
@@ -960,14 +970,14 @@ static qsocket_t *_Datagram_CheckNewConnections(void) {
sock = NET_NewQSocket(); sock = NET_NewQSocket();
if (sock == NULL) // no room; try to let him know if (sock == NULL) // no room; try to let him know
{ {
SZ_Clear(&net_message); net_message.clear();
// save space for the header, filled in later // save space for the header, filled in later
MSG_WriteLong(&net_message, 0); net_message.write_long(0);
MSG_WriteByte(&net_message, CCREP_REJECT); net_message.write_byte(CCREP_REJECT);
MSG_WriteString(&net_message, "Server is full.\n"); net_message.write_string("Server is full.\n");
*((int *) net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); *((int *) net_message.data()) = BigLong(NETFLAG_CTL | (net_message.size() & NETFLAG_LENGTH_MASK));
dfunc.Write(acceptsock, net_message.data, net_message.cursize, &clientaddr); dfunc.Write(acceptsock, net_message.data(), net_message.size(), &clientaddr);
SZ_Clear(&net_message); net_message.clear();
return NULL; return NULL;
} }
@@ -992,16 +1002,16 @@ static qsocket_t *_Datagram_CheckNewConnections(void) {
std::strcpy(sock->address, dfunc.AddrToString(&clientaddr)); std::strcpy(sock->address, dfunc.AddrToString(&clientaddr));
// send him back the info about the server connection he has been allocated // send him back the info about the server connection he has been allocated
SZ_Clear(&net_message); net_message.clear();
// save space for the header, filled in later // save space for the header, filled in later
MSG_WriteLong(&net_message, 0); net_message.write_long(0);
MSG_WriteByte(&net_message, CCREP_ACCEPT); net_message.write_byte(CCREP_ACCEPT);
dfunc.GetSocketAddr(newsock, &newaddr); dfunc.GetSocketAddr(newsock, &newaddr);
MSG_WriteLong(&net_message, dfunc.GetSocketPort(&newaddr)); net_message.write_long(dfunc.GetSocketPort(&newaddr));
// MSG_WriteString(&net_message, dfunc.AddrToString(&newaddr)); // MSG_WriteString(&net_message, dfunc.AddrToString(&newaddr));
*((int *) net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); *((int *) net_message.data()) = BigLong(NETFLAG_CTL | (net_message.size() & NETFLAG_LENGTH_MASK));
dfunc.Write(acceptsock, net_message.data, net_message.cursize, &clientaddr); dfunc.Write(acceptsock, net_message.data(), net_message.size(), &clientaddr);
SZ_Clear(&net_message); net_message.clear();
return sock; return sock;
} }
@@ -1029,21 +1039,22 @@ static void _Datagram_SearchForHosts(bool xmit) {
dfunc.GetSocketAddr(dfunc.controlSock, &myaddr); dfunc.GetSocketAddr(dfunc.controlSock, &myaddr);
if (xmit) { if (xmit) {
SZ_Clear(&net_message); net_message.clear();
// save space for the header, filled in later // save space for the header, filled in later
MSG_WriteLong(&net_message, 0); net_message.write_long(0);
MSG_WriteByte(&net_message, CCREQ_SERVER_INFO); net_message.write_byte(CCREQ_SERVER_INFO);
MSG_WriteString(&net_message, "QUAKE"); net_message.write_string("QUAKE");
MSG_WriteByte(&net_message, NET_PROTOCOL_VERSION); net_message.write_byte(NET_PROTOCOL_VERSION);
*((int *) net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); *((int *) net_message.data()) = BigLong(NETFLAG_CTL | (net_message.size() & NETFLAG_LENGTH_MASK));
dfunc.Broadcast(dfunc.controlSock, net_message.data, net_message.cursize); dfunc.Broadcast(dfunc.controlSock, net_message.data(), net_message.size());
SZ_Clear(&net_message); net_message.clear();
} }
while ((ret = dfunc.Read(dfunc.controlSock, net_message.data, net_message.maxsize, &readaddr)) > 0) { auto buf = new std::uint8_t[MAX_DATAGRAM];
while ((ret = dfunc.Read(dfunc.controlSock, &buf[0], MAX_DATAGRAM, &readaddr)) > 0) {
if (ret < (int) sizeof(int)) if (ret < (int) sizeof(int))
continue; continue;
net_message.cursize = ret; net_message.write(buf, ret);
// don't answer our own query // don't answer our own query
if (dfunc.AddrCompare(&readaddr, &myaddr) >= 0) if (dfunc.AddrCompare(&readaddr, &myaddr) >= 0)
@@ -1053,9 +1064,9 @@ static void _Datagram_SearchForHosts(bool xmit) {
if (hostCacheCount == HOSTCACHESIZE) if (hostCacheCount == HOSTCACHESIZE)
continue; continue;
MSG_BeginReading(); net_message.begin_reading();
control = BigLong(*((int *) net_message.data)); control = BigLong(*((int *) net_message.data()));
MSG_ReadLong(); net_message.read_long();
if (control == -1) if (control == -1)
continue; continue;
if ((control & (~NETFLAG_LENGTH_MASK)) != (int) NETFLAG_CTL) if ((control & (~NETFLAG_LENGTH_MASK)) != (int) NETFLAG_CTL)
@@ -1063,10 +1074,10 @@ static void _Datagram_SearchForHosts(bool xmit) {
if ((control & NETFLAG_LENGTH_MASK) != ret) if ((control & NETFLAG_LENGTH_MASK) != ret)
continue; continue;
if (MSG_ReadByte() != CCREP_SERVER_INFO) if (net_message.read_byte().value() != CCREP_SERVER_INFO)
continue; continue;
dfunc.GetAddrFromName(MSG_ReadString(), &readaddr); dfunc.GetAddrFromName(net_message.read_string().value().c_str(), &readaddr);
// search the cache for this server // search the cache for this server
for (n = 0; n < hostCacheCount; n++) { for (n = 0; n < hostCacheCount; n++) {
if (dfunc.AddrCompare(&readaddr, &hostcache[n].addr) == 0) if (dfunc.AddrCompare(&readaddr, &hostcache[n].addr) == 0)
@@ -1079,11 +1090,11 @@ static void _Datagram_SearchForHosts(bool xmit) {
// add it // add it
hostCacheCount++; hostCacheCount++;
std::strcpy(hostcache[n].name, MSG_ReadString()); std::strcpy(hostcache[n].name, net_message.read_string().value().c_str());
std::strcpy(hostcache[n].map, MSG_ReadString()); std::strcpy(hostcache[n].map, net_message.read_string().value().c_str());
hostcache[n].users = MSG_ReadByte(); hostcache[n].users = net_message.read_byte().value();
hostcache[n].maxusers = MSG_ReadByte(); hostcache[n].maxusers = net_message.read_byte().value();
if (MSG_ReadByte() != NET_PROTOCOL_VERSION) { if (net_message.read_byte().value() != NET_PROTOCOL_VERSION) {
std::strcpy(hostcache[n].cname, hostcache[n].name); std::strcpy(hostcache[n].cname, hostcache[n].name);
hostcache[n].cname[14] = 0; hostcache[n].cname[14] = 0;
std::strcpy(hostcache[n].name, "*"); std::strcpy(hostcache[n].name, "*");
@@ -1110,6 +1121,7 @@ static void _Datagram_SearchForHosts(bool xmit) {
} }
} }
} }
delete []buf;
} }
void Datagram_SearchForHosts(bool xmit) { void Datagram_SearchForHosts(bool xmit) {
@@ -1131,7 +1143,7 @@ static qsocket_t *_Datagram_Connect(const char *host) {
int reps; int reps;
double start_time; double start_time;
int control; int control;
const char *reason; std::string reason;
// see if we can resolve the host name // see if we can resolve the host name
if (dfunc.GetAddrFromName(host, &sendaddr) == -1) { if (dfunc.GetAddrFromName(host, &sendaddr) == -1) {
@@ -1159,17 +1171,18 @@ static qsocket_t *_Datagram_Connect(const char *host) {
start_time = net_time; start_time = net_time;
for (reps = 0; reps < 3; reps++) { for (reps = 0; reps < 3; reps++) {
SZ_Clear(&net_message); net_message.clear();
// save space for the header, filled in later // save space for the header, filled in later
MSG_WriteLong(&net_message, 0); net_message.write_long(0);
MSG_WriteByte(&net_message, CCREQ_CONNECT); net_message.write_byte(CCREQ_CONNECT);
MSG_WriteString(&net_message, "QUAKE"); net_message.write_string("QUAKE");
MSG_WriteByte(&net_message, NET_PROTOCOL_VERSION); net_message.write_byte(NET_PROTOCOL_VERSION);
*((int *) net_message.data) = BigLong(NETFLAG_CTL | (net_message.cursize & NETFLAG_LENGTH_MASK)); *((int *) net_message.data()) = BigLong(NETFLAG_CTL | (net_message.size() & NETFLAG_LENGTH_MASK));
dfunc.Write(newsock, net_message.data, net_message.cursize, &sendaddr); dfunc.Write(newsock, net_message.data(), net_message.size(), &sendaddr);
SZ_Clear(&net_message); net_message.clear();
auto buf = new std::uint8_t[MAX_DATAGRAM];
do { do {
ret = dfunc.Read(newsock, net_message.data, net_message.maxsize, &readaddr); ret = dfunc.Read(newsock, &buf[0], MAX_DATAGRAM, &readaddr);
// if we got something, validate it // if we got something, validate it
if (ret > 0) { if (ret > 0) {
// is it from the right place? // is it from the right place?
@@ -1187,11 +1200,11 @@ static qsocket_t *_Datagram_Connect(const char *host) {
continue; continue;
} }
net_message.cursize = ret; net_message.write(buf, ret);
MSG_BeginReading(); net_message.begin_reading();
control = BigLong(*((int *) net_message.data)); control = BigLong(*((int *) net_message.data()));
MSG_ReadLong(); net_message.read_long();
if (control == -1) { if (control == -1) {
ret = 0; ret = 0;
continue; continue;
@@ -1206,6 +1219,7 @@ static qsocket_t *_Datagram_Connect(const char *host) {
} }
} }
} while (ret == 0 && (SetNetTime() - start_time) < 2.5); } while (ret == 0 && (SetNetTime() - start_time) < 2.5);
delete []buf;
if (ret) if (ret)
break; break;
@@ -1217,33 +1231,33 @@ static qsocket_t *_Datagram_Connect(const char *host) {
if (ret == 0) { if (ret == 0) {
reason = "No Response"; reason = "No Response";
console::info("%s\n", reason); console::info("%s\n", reason.c_str());
std::strcpy(m_return_reason, reason); std::strcpy(m_return_reason, reason.c_str());
goto ErrorReturn; goto ErrorReturn;
} }
if (ret == -1) { if (ret == -1) {
reason = "Network Error"; reason = "Network Error";
console::info("%s\n", reason); console::info("%s\n", reason.c_str());
std::strcpy(m_return_reason, reason); std::strcpy(m_return_reason, reason.c_str());
goto ErrorReturn; goto ErrorReturn;
} }
ret = MSG_ReadByte(); ret = net_message.read_byte().value();
if (ret == CCREP_REJECT) { if (ret == CCREP_REJECT) {
reason = MSG_ReadString(); reason = net_message.read_string().value();
console::info("%s\n", reason); console::info("%s\n", reason.c_str());
q_strlcpy(m_return_reason, reason, sizeof(m_return_reason)); q_strlcpy(m_return_reason, reason.c_str(), sizeof(m_return_reason));
goto ErrorReturn; goto ErrorReturn;
} }
if (ret == CCREP_ACCEPT) { if (ret == CCREP_ACCEPT) {
std::memcpy(&sock->addr, &sendaddr, sizeof(struct qsockaddr)); std::memcpy(&sock->addr, &sendaddr, sizeof(struct qsockaddr));
dfunc.SetSocketPort(&sock->addr, MSG_ReadLong()); dfunc.SetSocketPort(&sock->addr, net_message.read_long().value());
} else { } else {
reason = "Bad Response"; reason = "Bad Response";
console::info("%s\n", reason); console::info("%s\n", reason.c_str());
std::strcpy(m_return_reason, reason); std::strcpy(m_return_reason, reason.c_str());
goto ErrorReturn; goto ErrorReturn;
} }
@@ -1255,8 +1269,8 @@ static qsocket_t *_Datagram_Connect(const char *host) {
// switch the connection to the specified address // switch the connection to the specified address
if (dfunc.Connect(newsock, &sock->addr) == -1) { if (dfunc.Connect(newsock, &sock->addr) == -1) {
reason = "Connect to Game failed"; reason = "Connect to Game failed";
console::info("%s\n", reason); console::info("%s\n", reason.c_str());
std::strcpy(m_return_reason, reason); std::strcpy(m_return_reason, reason.c_str());
goto ErrorReturn; goto ErrorReturn;
} }
+2 -2
View File
@@ -28,8 +28,8 @@ void Datagram_SearchForHosts (bool xmit);
qsocket_t *Datagram_Connect (const char *host); qsocket_t *Datagram_Connect (const char *host);
qsocket_t *Datagram_CheckNewConnections (void); qsocket_t *Datagram_CheckNewConnections (void);
int Datagram_GetMessage (qsocket_t *sock); int Datagram_GetMessage (qsocket_t *sock);
int Datagram_SendMessage (qsocket_t *sock, sizebuf_t *data); int Datagram_SendMessage (qsocket_t *sock, net::msg &msg);
int Datagram_SendUnreliableMessage (qsocket_t *sock, sizebuf_t *data); int Datagram_SendUnreliableMessage (qsocket_t *sock, net::msg &msg);
bool Datagram_CanSendMessage (qsocket_t *sock); bool Datagram_CanSendMessage (qsocket_t *sock);
bool Datagram_CanSendUnreliableMessage (qsocket_t *sock); bool Datagram_CanSendUnreliableMessage (qsocket_t *sock);
void Datagram_Close (qsocket_t *sock); void Datagram_Close (qsocket_t *sock);
+14 -14
View File
@@ -141,8 +141,8 @@ int Loop_GetMessage (qsocket_t *sock)
ret = sock->receiveMessage[0]; ret = sock->receiveMessage[0];
length = sock->receiveMessage[1] + (sock->receiveMessage[2] << 8); length = sock->receiveMessage[1] + (sock->receiveMessage[2] << 8);
// alignment byte skipped here // alignment byte skipped here
SZ_Clear (&net_message); net_message.clear();
SZ_Write (&net_message, &sock->receiveMessage[4], length); net_message.write(&sock->receiveMessage[4], length);
length = IntAlign(length + 4); length = IntAlign(length + 4);
sock->receiveMessageLength -= length; sock->receiveMessageLength -= length;
@@ -157,7 +157,7 @@ int Loop_GetMessage (qsocket_t *sock)
} }
int Loop_SendMessage (qsocket_t *sock, sizebuf_t *data) int Loop_SendMessage (qsocket_t *sock, net::msg &msg)
{ {
byte *buffer; byte *buffer;
int *bufferLength; int *bufferLength;
@@ -167,7 +167,7 @@ int Loop_SendMessage (qsocket_t *sock, sizebuf_t *data)
bufferLength = &((qsocket_t *)sock->driverdata)->receiveMessageLength; bufferLength = &((qsocket_t *)sock->driverdata)->receiveMessageLength;
if ((*bufferLength + data->cursize + 4) > NET_MAXMESSAGE) if ((*bufferLength + msg.size() + 4) > NET_MAXMESSAGE)
Sys_Error("Loop_SendMessage: overflow"); Sys_Error("Loop_SendMessage: overflow");
buffer = ((qsocket_t *)sock->driverdata)->receiveMessage + *bufferLength; buffer = ((qsocket_t *)sock->driverdata)->receiveMessage + *bufferLength;
@@ -176,22 +176,22 @@ int Loop_SendMessage (qsocket_t *sock, sizebuf_t *data)
*buffer++ = 1; *buffer++ = 1;
// length // length
*buffer++ = data->cursize & 0xff; *buffer++ = msg.size() & 0xff;
*buffer++ = data->cursize >> 8; *buffer++ = msg.size() >> 8;
// align // align
buffer++; buffer++;
// message // message
std::memcpy(buffer, data->data, data->cursize); std::memcpy(buffer, msg.data(), msg.size());
*bufferLength = IntAlign(*bufferLength + data->cursize + 4); *bufferLength = IntAlign(*bufferLength + msg.size() + 4);
sock->canSend = false; sock->canSend = false;
return 1; return 1;
} }
int Loop_SendUnreliableMessage (qsocket_t *sock, sizebuf_t *data) int Loop_SendUnreliableMessage (qsocket_t *sock, net::msg &msg)
{ {
byte *buffer; byte *buffer;
int *bufferLength; int *bufferLength;
@@ -201,7 +201,7 @@ int Loop_SendUnreliableMessage (qsocket_t *sock, sizebuf_t *data)
bufferLength = &((qsocket_t *)sock->driverdata)->receiveMessageLength; bufferLength = &((qsocket_t *)sock->driverdata)->receiveMessageLength;
if ((*bufferLength + data->cursize + sizeof(byte) + sizeof(short)) > NET_MAXMESSAGE) if ((*bufferLength + msg.size() + sizeof(byte) + sizeof(short)) > NET_MAXMESSAGE)
return 0; return 0;
buffer = ((qsocket_t *)sock->driverdata)->receiveMessage + *bufferLength; buffer = ((qsocket_t *)sock->driverdata)->receiveMessage + *bufferLength;
@@ -210,15 +210,15 @@ int Loop_SendUnreliableMessage (qsocket_t *sock, sizebuf_t *data)
*buffer++ = 2; *buffer++ = 2;
// length // length
*buffer++ = data->cursize & 0xff; *buffer++ = msg.size() & 0xff;
*buffer++ = data->cursize >> 8; *buffer++ = msg.size() >> 8;
// align // align
buffer++; buffer++;
// message // message
std::memcpy(buffer, data->data, data->cursize); std::memcpy(buffer, msg.data(), msg.size());
*bufferLength = IntAlign(*bufferLength + data->cursize + 4); *bufferLength = IntAlign(*bufferLength + msg.size() + 4);
return 1; return 1;
} }
+2 -2
View File
@@ -29,8 +29,8 @@ void Loop_SearchForHosts (bool xmit);
qsocket_t *Loop_Connect (const char *host); qsocket_t *Loop_Connect (const char *host);
qsocket_t *Loop_CheckNewConnections (void); qsocket_t *Loop_CheckNewConnections (void);
int Loop_GetMessage (qsocket_t *sock); int Loop_GetMessage (qsocket_t *sock);
int Loop_SendMessage (qsocket_t *sock, sizebuf_t *data); int Loop_SendMessage (qsocket_t *sock, net::msg &msg);
int Loop_SendUnreliableMessage (qsocket_t *sock, sizebuf_t *data); int Loop_SendUnreliableMessage (qsocket_t *sock, net::msg &msg);
bool Loop_CanSendMessage (qsocket_t *sock); bool Loop_CanSendMessage (qsocket_t *sock);
bool Loop_CanSendUnreliableMessage (qsocket_t *sock); bool Loop_CanSendUnreliableMessage (qsocket_t *sock);
void Loop_Close (qsocket_t *sock); void Loop_Close (qsocket_t *sock);
+9 -10
View File
@@ -55,7 +55,7 @@ static void Slist_Poll(void *);
static PollProcedure slistSendProcedure = {NULL, 0.0, Slist_Send}; static PollProcedure slistSendProcedure = {NULL, 0.0, Slist_Send};
static PollProcedure slistPollProcedure = {NULL, 0.0, Slist_Poll}; static PollProcedure slistPollProcedure = {NULL, 0.0, Slist_Poll};
sizebuf_t net_message; net::msg net_message{};
int net_activeconnections = 0; int net_activeconnections = 0;
int messagesSent = 0; int messagesSent = 0;
@@ -550,7 +550,7 @@ returns 1 if the message was sent properly
returns -1 if the connection died returns -1 if the connection died
================== ==================
*/ */
int NET_SendMessage(qsocket_t *sock, sizebuf_t *data) { int NET_SendMessage(qsocket_t *sock, net::msg &msg) {
int r; int r;
if (!sock) if (!sock)
@@ -562,7 +562,7 @@ int NET_SendMessage(qsocket_t *sock, sizebuf_t *data) {
} }
SetNetTime(); SetNetTime();
r = sfunc.QSendMessage(sock, data); r = sfunc.QSendMessage(sock, msg);
if (r == 1 && !IS_LOOP_DRIVER(sock->driver)) if (r == 1 && !IS_LOOP_DRIVER(sock->driver))
messagesSent++; messagesSent++;
@@ -570,7 +570,7 @@ int NET_SendMessage(qsocket_t *sock, sizebuf_t *data) {
} }
int NET_SendUnreliableMessage(qsocket_t *sock, sizebuf_t *data) { int NET_SendUnreliableMessage(qsocket_t *sock, net::msg &msg) {
int r; int r;
if (!sock) if (!sock)
@@ -582,7 +582,7 @@ int NET_SendUnreliableMessage(qsocket_t *sock, sizebuf_t *data) {
} }
SetNetTime(); SetNetTime();
r = sfunc.SendUnreliableMessage(sock, data); r = sfunc.SendUnreliableMessage(sock, msg);
if (r == 1 && !IS_LOOP_DRIVER(sock->driver)) if (r == 1 && !IS_LOOP_DRIVER(sock->driver))
unreliableMessagesSent++; unreliableMessagesSent++;
@@ -611,7 +611,7 @@ bool NET_CanSendMessage(qsocket_t *sock) {
} }
int NET_SendToAll(sizebuf_t *data, double blocktime) { int NET_SendToAll(net::msg &msg, double blocktime) {
double start; double start;
int i; int i;
int count = 0; int count = 0;
@@ -626,7 +626,7 @@ int NET_SendToAll(sizebuf_t *data, double blocktime) {
*/ */
if (host_client->netconnection && host_client->active) { if (host_client->netconnection && host_client->active) {
if (IS_LOOP_DRIVER(host_client->netconnection->driver)) { if (IS_LOOP_DRIVER(host_client->netconnection->driver)) {
NET_SendMessage(host_client->netconnection, data); NET_SendMessage(host_client->netconnection, msg);
msg_init[i] = true; msg_init[i] = true;
msg_sent[i] = true; msg_sent[i] = true;
continue; continue;
@@ -647,7 +647,7 @@ int NET_SendToAll(sizebuf_t *data, double blocktime) {
if (!msg_init[i]) { if (!msg_init[i]) {
if (NET_CanSendMessage(host_client->netconnection)) { if (NET_CanSendMessage(host_client->netconnection)) {
msg_init[i] = true; msg_init[i] = true;
NET_SendMessage(host_client->netconnection, data); NET_SendMessage(host_client->netconnection, msg);
} else { } else {
NET_GetMessage(host_client->netconnection); NET_GetMessage(host_client->netconnection);
} }
@@ -713,8 +713,7 @@ void NET_Init(void) {
} }
// allocate space for network message buffer // allocate space for network message buffer
SZ_Alloc(&net_message, NET_MAXMESSAGE); net_message = net::msg{};
net_messagetimeout.inscribe(); net_messagetimeout.inscribe();
hostname.inscribe(); hostname.inscribe();
+248
View File
@@ -0,0 +1,248 @@
#include "net_msg.hpp"
#include <array>
#include "q_stdinc.hpp"
#include "quakedef.hpp"
#include "common.hpp"
#include "mathlib.hpp"
namespace net {
void msg::write_lores_coord(const float f) {
write_short(static_cast<short>(std::round(f * 8)));
}
void msg::write_hires_coord(const float f) {
write_short(static_cast<short>(f));
write_byte(static_cast<int>(f * 255) % 255);
}
std::optional<float> msg::read_lores_coord() {
const auto c = read_short();
if (!c.has_value()) {
return std::nullopt;
}
return c.value() * (1.0 / 8);
}
std::optional<float> msg::read_hires_coord() {
const auto c = read_short();
const auto d = read_byte();
if (!c.has_value()) {
return std::nullopt;
}
return c.value() + (d.value() * (1.0 / 255));
}
void msg::clear() {
_data.clear();
_eos = false;
_offset = 0;
}
void msg::write_char(const char c) {
_data.push_back(c);
}
void msg::write_byte(const std::uint8_t b) {
_data.push_back(b);
}
void msg::write_short(const short s) {
_data.push_back(s & 0xFF);
_data.push_back((s >> 8) & 0xFF);
}
void msg::write_long(const int l) {
_data.push_back(l & 0xFF);
_data.push_back((l >> 8) & 0xFF);
_data.push_back((l >> 16) & 0xFF);
_data.push_back((l >> 24) & 0xFF);
}
void msg::write_float(const float f) {
write_long(std::bit_cast<std::int32_t>(f));
}
void msg::write_string(const std::string_view s) {
if (!s.empty()) {
for (const auto &c: s) {
_data.push_back(c);
}
}
_data.push_back('\0');
}
static rmq_flags operator&(rmq_flags lhs, rmq_flags rhs) {
return static_cast<rmq_flags>(static_cast<int>(lhs) & static_cast<int>(rhs));
}
void msg::write_coord(const float f, const rmq_flags flags) {
if ((flags & rmq_flags::float_coord) != rmq_flags::none) {
write_float(f);
} else if ((flags & rmq_flags::int_coord) != rmq_flags::none) {
write_long(static_cast<int>(std::round(f * 16)));
} else if ((flags & rmq_flags::hires_coord) != rmq_flags::none) {
write_hires_coord(f);
} else {
write_lores_coord(f);
}
}
void msg::write_angle(const float f, const rmq_flags flags) {
if ((flags & rmq_flags::float_angle) != rmq_flags::none) {
write_float(f);
} else if ((flags & rmq_flags::short_angle) != rmq_flags::none) {
const auto rounded = static_cast<int>(std::round(f * 65536.0 / 360.0));
write_short(static_cast<short>(rounded & 65535));
} else {
const auto rounded = static_cast<int>(std::round(f * 256.0 / 360.0));
write_byte(static_cast<std::uint8_t>(rounded & 255));
}
}
void msg::write_angle_16(const float f, const rmq_flags flags) {
if ((flags & rmq_flags::float_angle) != rmq_flags::none) {
write_float(f);
} else {
const auto rounded = static_cast<int>(std::round(f * 65536.0 / 360.0));
write_short(static_cast<short>(rounded & 65535));
}
}
void msg::begin_reading() {
_offset = 0;
_eos = false;
}
std::optional<char> msg::read_char() {
if (_eos || _offset + 1 > _data.size()) {
_eos = true;
return std::nullopt;
}
return _data[_offset++];
}
std::optional<std::uint8_t> msg::read_byte() {
if (_eos || _offset + 1 > _data.size()) {
_eos = true;
return std::nullopt;
}
return _data[_offset++];
}
std::optional<short> msg::read_short() {
if (_eos || _offset + 2 > _data.size()) {
_eos = true;
return std::nullopt;
}
auto res = static_cast<short>(_data[_offset] + (_data[_offset + 1] << 8));
_offset += 2;
return res;
}
std::optional<int> msg::read_long() {
if (_eos || _offset + 4 > _data.size()) {
_eos = true;
return std::nullopt;
}
auto res = _data[_offset] + (_data[_offset + 1] << 8) + (_data[_offset + 2] << 16) + (
_data[_offset + 3] << 24);
_offset += 4;
return res;
}
std::optional<float> msg::read_float() {
if (_eos || _offset + 4 > _data.size()) {
_eos = true;
return std::nullopt;
}
auto res = std::bit_cast<float>(read_long().value());
return res;
}
std::optional<std::string> msg::read_string() {
std::string res{};
if (_eos) {
return std::nullopt;
}
do {
auto c = read_char();
if (!c.has_value() || c.value() == 0) {
break;
}
res += c.value();
} while (!_eos);
return res;
}
std::optional<float> msg::read_coord(const rmq_flags flags) {
if ((flags & rmq_flags::float_coord) != rmq_flags::none) {
return read_float();
}
if ((flags & rmq_flags::int_coord) != rmq_flags::none) {
const auto i = read_long();
if (!i.has_value()) {
return std::nullopt;
}
return i.value() * (1.0 / 16.0);
}
if ((flags & rmq_flags::hires_coord) != rmq_flags::none) {
return read_hires_coord();
}
return read_lores_coord();
}
std::optional<float> msg::read_angle(const rmq_flags flags) {
if ((flags & rmq_flags::float_angle) != rmq_flags::none) {
return read_float();
}
if ((flags & rmq_flags::short_angle) != rmq_flags::none) {
auto a = read_short();
if (!a.has_value()) {
return std::nullopt;
}
return a.value() * (360.0 / 65536);
}
const auto c = read_char();
if (!c.has_value()) {
return std::nullopt;
}
return c.value() * (360.0 / 256);
}
std::optional<float> msg::read_angle_16(rmq_flags flags) {
if ((flags & rmq_flags::float_angle) != rmq_flags::none) {
return read_float();
}
const auto s = read_short();
if (!s.has_value()) {
return std::nullopt;
}
return s.value() * (360.0 / 65536);
}
void msg::write(const std::uint8_t *data, std::size_t size) {
for (auto i = 0; i < size; i++) {
_data.push_back(data[i]);
}
}
}
+84
View File
@@ -0,0 +1,84 @@
#pragma once
#include <cstdint>
#include <optional>
#include <vector>
namespace net {
enum class rmq_flags {
none = 0,
short_angle = (1 << 1),
float_angle = (1 << 2),
hires_coord = (1 << 3),
float_coord = (1 << 4),
edict_scale = (1 << 5),
alpha_sanity = (1 << 6),
int_coord = (1 << 7),
};
class msg {
std::vector<std::uint8_t> _data{};
bool _eos{false};
std::size_t _offset{0};
void write_lores_coord(float f);
void write_hires_coord(float f);
std::optional<float> read_lores_coord();
std::optional<float> read_hires_coord();
public:
void clear();
void write_char(char c);
void write_byte(std::uint8_t b);
void write_short(short s);
void write_long(int l);
void write_float(float f);
void write_string(std::string_view s);
void write_coord(float f, rmq_flags flags);
void write_angle(float f, rmq_flags flags);
void write_angle_16(float f, rmq_flags flags);
[[nodiscard]] bool eos() const { return _eos; }
void begin_reading();
std::optional<char> read_char();
std::optional<std::uint8_t> read_byte();
std::optional<short> read_short();
std::optional<int> read_long();
std::optional<float> read_float();
std::optional<std::string> read_string();
std::optional<float> read_coord(rmq_flags flags);
std::optional<float> read_angle(rmq_flags flags);
std::optional<float> read_angle_16(rmq_flags flags);
[[nodiscard]] bool empty() const { return _data.empty(); }
[[nodiscard]] std::size_t size() const { return _data.size(); }
auto data() { return _data.data(); }
void write(const std::uint8_t* data, std::size_t size);
auto offset() const { return _offset; }
};
}
+41 -41
View File
@@ -374,8 +374,8 @@ static void PF_sprint (void)
client = &svs.clients[entnum-1]; client = &svs.clients[entnum-1];
MSG_WriteChar (&client->message,svc_print); client->message.write_char(svc_print);
MSG_WriteString (&client->message, s ); client->message.write_string(s);
} }
@@ -405,8 +405,8 @@ static void PF_centerprint (void)
client = &svs.clients[entnum-1]; client = &svs.clients[entnum-1];
MSG_WriteChar (&client->message,svc_centerprint); client->message.write_char(svc_centerprint);
MSG_WriteString (&client->message, s); client->message.write_string(s);
} }
@@ -615,23 +615,23 @@ static void PF_ambientsound (void)
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (large) if (large)
MSG_WriteByte (sv.signon,svc_spawnstaticsound2); sv.signons[sv.current_signon].write_byte(svc_spawnstaticsound2);
else else
MSG_WriteByte (sv.signon,svc_spawnstaticsound); sv.signons[sv.current_signon].write_byte(svc_spawnstaticsound);
//johnfitz //johnfitz
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
MSG_WriteCoord(sv.signon, pos[i], sv.protocolflags); sv.signons[sv.current_signon].write_coord(pos[i], static_cast<net::rmq_flags>(sv.protocolflags));
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (large) if (large)
MSG_WriteShort(sv.signon, soundnum); sv.signons[sv.current_signon].write_short(soundnum);
else else
MSG_WriteByte (sv.signon, soundnum); sv.signons[sv.current_signon].write_byte(soundnum);
//johnfitz //johnfitz
MSG_WriteByte (sv.signon, vol*255); sv.signons[sv.current_signon].write_byte(vol*255);
MSG_WriteByte (sv.signon, attenuation*64); sv.signons[sv.current_signon].write_byte(attenuation*64);
} }
@@ -1284,9 +1284,9 @@ static void PF_lightstyle (void)
{ {
if (client->active || client->spawned) if (client->active || client->spawned)
{ {
MSG_WriteChar (&client->message, svc_lightstyle); client->message.write_char(svc_lightstyle);
MSG_WriteChar (&client->message, style); client->message.write_char(style);
MSG_WriteString (&client->message, val); client->message.write_string(val);
} }
} }
} }
@@ -1502,7 +1502,7 @@ MESSAGE WRITING
=============================================================================== ===============================================================================
*/ */
static sizebuf_t *WriteDest (void) static net::msg &WriteDest (void)
{ {
int entnum; int entnum;
int dest; int dest;
@@ -1512,67 +1512,67 @@ static sizebuf_t *WriteDest (void)
switch (dest) switch (dest)
{ {
case MSG_BROADCAST: case MSG_BROADCAST:
return &sv.datagram; return sv.datagram;
case MSG_ONE: case MSG_ONE:
ent = PROG_TO_EDICT(pr_global_struct->msg_entity); ent = PROG_TO_EDICT(pr_global_struct->msg_entity);
entnum = NUM_FOR_EDICT(ent); entnum = NUM_FOR_EDICT(ent);
if (entnum < 1 || entnum > svs.maxclients) if (entnum < 1 || entnum > svs.maxclients)
PR_RunError ("WriteDest: not a client"); PR_RunError ("WriteDest: not a client");
return &svs.clients[entnum-1].message; return svs.clients[entnum-1].message;
case MSG_ALL: case MSG_ALL:
return &sv.reliable_datagram; return sv.reliable_datagram;
case MSG_INIT: case MSG_INIT:
return sv.signon; return sv.signons[sv.current_signon];
default: default:
PR_RunError ("WriteDest: bad destination"); PR_RunError ("WriteDest: bad destination");
break; break;
} }
return NULL; throw std::runtime_error{"WHOOPS"};
} }
static void PF_WriteByte (void) static void PF_WriteByte (void)
{ {
MSG_WriteByte (WriteDest(), G_FLOAT(OFS_PARM1)); WriteDest().write_byte(G_FLOAT(OFS_PARM1));
} }
static void PF_WriteChar (void) static void PF_WriteChar (void)
{ {
MSG_WriteChar (WriteDest(), G_FLOAT(OFS_PARM1)); WriteDest().write_char(G_FLOAT(OFS_PARM1));
} }
static void PF_WriteShort (void) static void PF_WriteShort (void)
{ {
MSG_WriteShort (WriteDest(), G_FLOAT(OFS_PARM1)); WriteDest().write_short(G_FLOAT(OFS_PARM1));
} }
static void PF_WriteLong (void) static void PF_WriteLong (void)
{ {
MSG_WriteLong (WriteDest(), G_FLOAT(OFS_PARM1)); WriteDest().write_long(G_FLOAT(OFS_PARM1));
} }
static void PF_WriteAngle (void) static void PF_WriteAngle (void)
{ {
MSG_WriteAngle (WriteDest(), G_FLOAT(OFS_PARM1), sv.protocolflags); WriteDest().write_angle(G_FLOAT(OFS_PARM1), static_cast<net::rmq_flags>(sv.protocolflags));
} }
static void PF_WriteCoord (void) static void PF_WriteCoord (void)
{ {
MSG_WriteCoord (WriteDest(), G_FLOAT(OFS_PARM1), sv.protocolflags); WriteDest().write_coord(G_FLOAT(OFS_PARM1), static_cast<net::rmq_flags>(sv.protocolflags));
} }
static void PF_WriteString (void) static void PF_WriteString (void)
{ {
MSG_WriteString (WriteDest(), LOC_GetString(G_STRING(OFS_PARM1))); WriteDest().write_string(LOC_GetString(G_STRING(OFS_PARM1)));
} }
static void PF_WriteEntity (void) static void PF_WriteEntity (void)
{ {
MSG_WriteShort (WriteDest(), G_EDICTNUM(OFS_PARM1)); WriteDest().write_short(G_EDICTNUM(OFS_PARM1));
} }
//============================================================================= //=============================================================================
@@ -1628,38 +1628,38 @@ static void PF_makestatic (void)
if (bits) if (bits)
{ {
MSG_WriteByte (sv.signon, svc_spawnstatic2); sv.signons[sv.current_signon].write_byte(svc_spawnstatic2);
MSG_WriteByte (sv.signon, bits); sv.signons[sv.current_signon].write_byte(bits);
} }
else else
MSG_WriteByte (sv.signon, svc_spawnstatic); sv.signons[sv.current_signon].write_byte(svc_spawnstatic);
if (bits & B_LARGEMODEL) if (bits & B_LARGEMODEL)
MSG_WriteShort (sv.signon, SV_ModelIndex(PR_GetString(ent->v.model))); sv.signons[sv.current_signon].write_short(SV_ModelIndex(PR_GetString(ent->v.model)));
else else
MSG_WriteByte (sv.signon, SV_ModelIndex(PR_GetString(ent->v.model))); sv.signons[sv.current_signon].write_byte(SV_ModelIndex(PR_GetString(ent->v.model)));
if (bits & B_LARGEFRAME) if (bits & B_LARGEFRAME)
MSG_WriteShort (sv.signon, ent->v.frame); sv.signons[sv.current_signon].write_short(ent->v.frame);
else else
MSG_WriteByte (sv.signon, ent->v.frame); sv.signons[sv.current_signon].write_byte(ent->v.frame);
//johnfitz //johnfitz
MSG_WriteByte (sv.signon, ent->v.colormap); sv.signons[sv.current_signon].write_byte(ent->v.colormap);
MSG_WriteByte (sv.signon, ent->v.skin); sv.signons[sv.current_signon].write_byte(ent->v.skin);
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
{ {
MSG_WriteCoord(sv.signon, ent->v.origin[i], sv.protocolflags); sv.signons[sv.current_signon].write_coord(ent->v.origin[i], static_cast<net::rmq_flags>(sv.protocolflags));
MSG_WriteAngle(sv.signon, ent->v.angles[i], sv.protocolflags); sv.signons[sv.current_signon].write_angle(ent->v.angles[i], static_cast<net::rmq_flags>(sv.protocolflags));
} }
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (bits & B_ALPHA) if (bits & B_ALPHA)
MSG_WriteByte (sv.signon, ent->alpha); sv.signons[sv.current_signon].write_byte(ent->alpha);
//johnfitz //johnfitz
if (bits & B_SCALE) if (bits & B_SCALE)
MSG_WriteByte (sv.signon, ent->scale); sv.signons[sv.current_signon].write_byte(ent->scale);
// throw the entity away now // throw the entity away now
ED_Free (ent); ED_Free (ent);
+4 -2
View File
@@ -737,7 +737,7 @@ void ED_ParseGlobals (std::istringstream &ss)
if (ss.eof()) if (ss.eof())
Host_Error ("ED_ParseEntity: EOF without closing brace"); Host_Error ("ED_ParseEntity: EOF without closing brace");
if (token->front() == '}') if (!token->empty() && token->front() == '}')
Host_Error ("ED_ParseEntity: closing brace without data"); Host_Error ("ED_ParseEntity: closing brace without data");
key = ED_FindGlobal (keyname.c_str()); key = ED_FindGlobal (keyname.c_str());
@@ -940,7 +940,9 @@ void ED_ParseEdict(std::istringstream &ss, edict_t *ent)
Host_Error ("ED_ParseEntity: EOF without closing brace"); Host_Error ("ED_ParseEntity: EOF without closing brace");
} }
if (token->front() == '}') { if (!token->empty() &&
token->front() == '}') {
Host_Error ("ED_ParseEntity: closing brace without data"); Host_Error ("ED_ParseEntity: closing brace without data");
} }
+268 -341
View File
File diff suppressed because it is too large Load Diff
+6 -9
View File
@@ -66,15 +66,12 @@ typedef struct
// be used to reference the world ent // be used to reference the world ent
server_state_t state; // some actions are only valid during load server_state_t state; // some actions are only valid during load
sizebuf_t datagram; net::msg datagram;
byte datagram_buf[MAX_DATAGRAM];
sizebuf_t reliable_datagram; // copied to all clients at end of frame net::msg reliable_datagram; // copied to all clients at end of frame
byte reliable_datagram_buf[MAX_DATAGRAM];
sizebuf_t *signon; std::vector<net::msg> signons;
int num_signon_buffers; size_t current_signon;
sizebuf_t *signon_buffers[MAX_SIGNON_BUFFERS];
unsigned protocol; //johnfitz unsigned protocol; //johnfitz
unsigned protocolflags; unsigned protocolflags;
@@ -108,7 +105,7 @@ typedef struct client_s
usercmd_t cmd; // movement usercmd_t cmd; // movement
vec3_t wishdir; // intended motion calced from cmd vec3_t wishdir; // intended motion calced from cmd
sizebuf_t message; // can be added to at any time, net::msg message; // can be added to at any time,
// copied and clear once per frame // copied and clear once per frame
byte msgbuf[MAX_MSGLEN]; byte msgbuf[MAX_MSGLEN];
edict_t *edict; // EDICT_NUM(clientnum+1) edict_t *edict; // EDICT_NUM(clientnum+1)
@@ -235,7 +232,7 @@ void SV_Physics (void);
bool SV_CheckBottom (edict_t *ent); bool SV_CheckBottom (edict_t *ent);
bool SV_movestep (edict_t *ent, vec3_t move, bool relink); bool SV_movestep (edict_t *ent, vec3_t move, bool relink);
void SV_WriteClientdataToMessage (edict_t *ent, sizebuf_t *msg); void SV_WriteClientdataToMessage (edict_t *ent, net::msg &msg);
void SV_MoveToGoal (void); void SV_MoveToGoal (void);
+185 -207
View File
@@ -146,22 +146,22 @@ Make sure the event gets sent to all clients
void SV_StartParticle(vec3_t org, vec3_t dir, int color, int count) { void SV_StartParticle(vec3_t org, vec3_t dir, int color, int count) {
int i, v; int i, v;
if (sv.datagram.cursize > MAX_DATAGRAM - 18) if (sv.datagram.size() > MAX_DATAGRAM - 18)
return; return;
MSG_WriteByte(&sv.datagram, svc_particle); sv.datagram.write_byte(svc_particle);
MSG_WriteCoord(&sv.datagram, org[0], sv.protocolflags); sv.datagram.write_coord(org[0], static_cast<net::rmq_flags>(sv.protocolflags));
MSG_WriteCoord(&sv.datagram, org[1], sv.protocolflags); sv.datagram.write_coord(org[1], static_cast<net::rmq_flags>(sv.protocolflags));
MSG_WriteCoord(&sv.datagram, org[2], sv.protocolflags); sv.datagram.write_coord(org[2], static_cast<net::rmq_flags>(sv.protocolflags));
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
v = dir[i] * 16; v = dir[i] * 16;
if (v > 127) if (v > 127)
v = 127; v = 127;
else if (v < -128) else if (v < -128)
v = -128; v = -128;
MSG_WriteChar(&sv.datagram, v); sv.datagram.write_char(v);
} }
MSG_WriteByte(&sv.datagram, count); sv.datagram.write_byte(count);
MSG_WriteByte(&sv.datagram, color); sv.datagram.write_byte(color);
} }
/* /*
@@ -192,7 +192,7 @@ void SV_StartSound(edict_t *entity, int channel, const char *sample, int volume,
if (channel < 0 || channel > 7) if (channel < 0 || channel > 7)
Host_Error("SV_StartSound: channel = %i", channel); Host_Error("SV_StartSound: channel = %i", channel);
if (sv.datagram.cursize > MAX_DATAGRAM - 21) if (sv.datagram.size() > MAX_DATAGRAM - 21)
return; return;
// find precache number for sound // find precache number for sound
@@ -227,32 +227,32 @@ void SV_StartSound(edict_t *entity, int channel, const char *sample, int volume,
} }
//johnfitz //johnfitz
if (sv.datagram.cursize > MAX_DATAGRAM - 21) if (sv.datagram.size() > MAX_DATAGRAM - 21)
return; return;
// directed messages go only to the entity the are targeted on // directed messages go only to the entity the are targeted on
MSG_WriteByte(&sv.datagram, svc_sound); sv.datagram.write_byte(svc_sound);
MSG_WriteByte(&sv.datagram, field_mask); sv.datagram.write_byte(field_mask);
if (field_mask & SND_VOLUME) if (field_mask & SND_VOLUME)
MSG_WriteByte(&sv.datagram, volume); sv.datagram.write_byte(volume);
if (field_mask & SND_ATTENUATION) if (field_mask & SND_ATTENUATION)
MSG_WriteByte(&sv.datagram, attenuation * 64); sv.datagram.write_byte(attenuation * 64);
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (field_mask & SND_LARGEENTITY) { if (field_mask & SND_LARGEENTITY) {
MSG_WriteShort(&sv.datagram, ent); sv.datagram.write_short(ent);
MSG_WriteByte(&sv.datagram, channel); sv.datagram.write_byte(channel);
} else } else
MSG_WriteShort(&sv.datagram, (ent << 3) | channel); sv.datagram.write_short((ent << 3) | channel);
if (field_mask & SND_LARGESOUND) if (field_mask & SND_LARGESOUND)
MSG_WriteShort(&sv.datagram, sound_num); sv.datagram.write_short(sound_num);
else else
MSG_WriteByte(&sv.datagram, sound_num); sv.datagram.write_byte(sound_num);
//johnfitz //johnfitz
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
MSG_WriteCoord(&sv.datagram, entity->v.origin[i] + 0.5 * (entity->v.mins[i] + entity->v.maxs[i]), sv.datagram.write_coord(entity->v.origin[i] + 0.5 * (entity->v.mins[i] + entity->v.maxs[i]),
sv.protocolflags); static_cast<net::rmq_flags>(sv.protocolflags));
} }
/* /*
@@ -279,15 +279,16 @@ void SV_LocalSound(client_t *client, const char *sample) {
field_mask = SND_LARGESOUND; field_mask = SND_LARGESOUND;
} }
if (client->message.cursize > client->message.maxsize - 4) // TODO: replace maxsize call?
return; // if (client->message.size() > client->message.maxsize - 4)
// return;
MSG_WriteByte(&client->message, svc_localsound); client->message.write_byte(svc_localsound);
MSG_WriteByte(&client->message, field_mask); client->message.write_byte(field_mask);
if (field_mask & SND_LARGESOUND) if (field_mask & SND_LARGESOUND)
MSG_WriteShort(&client->message, sound_num); client->message.write_short(sound_num);
else else
MSG_WriteByte(&client->message, sound_num); client->message.write_byte(sound_num);
} }
/* /*
@@ -315,51 +316,51 @@ void SV_SendServerinfo(client_t *client) {
char message[2048]; char message[2048];
int i; //johnfitz int i; //johnfitz
MSG_WriteByte(&client->message, svc_print); client->message.write_byte(svc_print);
sprintf(message, "%c\nFITZQUAKE %1.2f SERVER (%i CRC)\n", 2, FITZQUAKE_VERSION, pr_crc); sprintf(message, "%c\nFITZQUAKE %1.2f SERVER (%i CRC)\n", 2, FITZQUAKE_VERSION, pr_crc);
//johnfitz -- include fitzquake version //johnfitz -- include fitzquake version
MSG_WriteString(&client->message, message); client->message.write_string(message);
MSG_WriteByte(&client->message, svc_serverinfo); client->message.write_byte(svc_serverinfo);
MSG_WriteLong(&client->message, sv.protocol); //johnfitz -- sv.protocol instead of PROTOCOL_VERSION client->message.write_long(sv.protocol); //johnfitz -- sv.protocol instead of PROTOCOL_VERSION
if (sv.protocol == PROTOCOL_RMQ) { if (sv.protocol == PROTOCOL_RMQ) {
// mh - now send protocol flags so that the client knows the protocol features to expect // mh - now send protocol flags so that the client knows the protocol features to expect
MSG_WriteLong(&client->message, sv.protocolflags); client->message.write_long(sv.protocolflags);
} }
MSG_WriteByte(&client->message, svs.maxclients); client->message.write_byte(svs.maxclients);
if (!coop.value && deathmatch.value) if (!coop.value && deathmatch.value)
MSG_WriteByte(&client->message, GAME_DEATHMATCH); client->message.write_byte(GAME_DEATHMATCH);
else else
MSG_WriteByte(&client->message, GAME_COOP); client->message.write_byte(GAME_COOP);
MSG_WriteString(&client->message, PR_GetString(sv.edicts->v.message)); client->message.write_string(PR_GetString(sv.edicts->v.message));
//johnfitz -- only send the first 256 model and sound precaches if protocol is 15 //johnfitz -- only send the first 256 model and sound precaches if protocol is 15
for (i = 1, s = sv.model_precache + 1; *s; s++, i++) for (i = 1, s = sv.model_precache + 1; *s; s++, i++)
if (sv.protocol != PROTOCOL_NETQUAKE || i < 256) if (sv.protocol != PROTOCOL_NETQUAKE || i < 256)
MSG_WriteString(&client->message, *s); client->message.write_string(*s);
MSG_WriteByte(&client->message, 0); client->message.write_byte(0);
for (i = 1, s = sv.sound_precache + 1; *s; s++, i++) for (i = 1, s = sv.sound_precache + 1; *s; s++, i++)
if (sv.protocol != PROTOCOL_NETQUAKE || i < 256) if (sv.protocol != PROTOCOL_NETQUAKE || i < 256)
MSG_WriteString(&client->message, *s); client->message.write_string(*s);
MSG_WriteByte(&client->message, 0); client->message.write_byte(0);
//johnfitz //johnfitz
// send music // send music
MSG_WriteByte(&client->message, svc_cdtrack); client->message.write_byte(svc_cdtrack);
MSG_WriteByte(&client->message, sv.edicts->v.sounds); client->message.write_byte(sv.edicts->v.sounds);
MSG_WriteByte(&client->message, sv.edicts->v.sounds); client->message.write_byte(sv.edicts->v.sounds);
// set view // set view
MSG_WriteByte(&client->message, svc_setview); client->message.write_byte(svc_setview);
MSG_WriteShort(&client->message, NUM_FOR_EDICT(client->edict)); client->message.write_short(NUM_FOR_EDICT(client->edict));
MSG_WriteByte(&client->message, svc_signonnum); client->message.write_byte(svc_signonnum);
MSG_WriteByte(&client->message, 1); client->message.write_byte(1);
client->sendsignon = PRESPAWN_FLUSH; client->sendsignon = PRESPAWN_FLUSH;
client->spawned = false; // need prespawn, spawn, etc client->spawned = false; // need prespawn, spawn, etc
@@ -401,9 +402,7 @@ void SV_ConnectClient(int clientnum) {
client->active = true; client->active = true;
client->spawned = false; client->spawned = false;
client->edict = ent; client->edict = ent;
client->message.data = client->msgbuf; client->message = net::msg{};
client->message.maxsize = sizeof(client->msgbuf);
client->message.allowoverflow = true; // we can catch it
if (sv.loadgame) if (sv.loadgame)
memcpy(client->spawn_parms, spawn_parms, sizeof(spawn_parms)); memcpy(client->spawn_parms, spawn_parms, sizeof(spawn_parms));
@@ -468,7 +467,7 @@ SV_ClearDatagram
================== ==================
*/ */
void SV_ClearDatagram(void) { void SV_ClearDatagram(void) {
SZ_Clear(&sv.datagram); sv.datagram.clear();
} }
/* /*
@@ -571,7 +570,7 @@ SV_WriteEntitiesToClient
============= =============
*/ */
void SV_WriteEntitiesToClient(edict_t *clent, sizebuf_t *msg) { void SV_WriteEntitiesToClient(edict_t *clent, net::msg &msg) {
int e, i; int e, i;
int bits; int bits;
byte *pvs; byte *pvs;
@@ -616,15 +615,15 @@ void SV_WriteEntitiesToClient(edict_t *clent, sizebuf_t *msg) {
// assumed here. And, for protocol 85 the max size is actually 24 bytes. // assumed here. And, for protocol 85 the max size is actually 24 bytes.
// For float coords and angles the limit is 40. // For float coords and angles the limit is 40.
// FIXME: Use tighter limit according to protocol flags and send bits. // FIXME: Use tighter limit according to protocol flags and send bits.
if (msg->cursize + 40 > msg->maxsize) { // if (msg->cursize + 40 > msg->maxsize) {
//johnfitz -- less spammy overflow message // //johnfitz -- less spammy overflow message
if (!dev_overflows.packetsize || dev_overflows.packetsize + CONSOLE_RESPAM_TIME < realtime) { // if (!dev_overflows.packetsize || dev_overflows.packetsize + CONSOLE_RESPAM_TIME < realtime) {
console::info("Packet overflow!\n"); // console::info("Packet overflow!\n");
dev_overflows.packetsize = realtime; // dev_overflows.packetsize = realtime;
} // }
goto stats; // goto stats;
//johnfitz // //johnfitz
} // }
// send an update // send an update
bits = 0; bits = 0;
@@ -702,66 +701,66 @@ void SV_WriteEntitiesToClient(edict_t *clent, sizebuf_t *msg) {
// //
// write the message // write the message
// //
MSG_WriteByte(msg, bits | U_SIGNAL); msg.write_byte(bits | U_SIGNAL);
if (bits & U_MOREBITS) if (bits & U_MOREBITS)
MSG_WriteByte(msg, bits >> 8); msg.write_byte(bits >> 8);
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (bits & U_EXTEND1) if (bits & U_EXTEND1)
MSG_WriteByte(msg, bits >> 16); msg.write_byte(bits >> 16);
if (bits & U_EXTEND2) if (bits & U_EXTEND2)
MSG_WriteByte(msg, bits >> 24); msg.write_byte(bits >> 24);
//johnfitz //johnfitz
if (bits & U_LONGENTITY) if (bits & U_LONGENTITY)
MSG_WriteShort(msg, e); msg.write_short(e);
else else
MSG_WriteByte(msg, e); msg.write_byte(e);
if (bits & U_MODEL) if (bits & U_MODEL)
MSG_WriteByte(msg, ent->v.modelindex); msg.write_byte(ent->v.modelindex);
if (bits & U_FRAME) if (bits & U_FRAME)
MSG_WriteByte(msg, ent->v.frame); msg.write_byte(ent->v.frame);
if (bits & U_COLORMAP) if (bits & U_COLORMAP)
MSG_WriteByte(msg, ent->v.colormap); msg.write_byte(ent->v.colormap);
if (bits & U_SKIN) if (bits & U_SKIN)
MSG_WriteByte(msg, ent->v.skin); msg.write_byte(ent->v.skin);
if (bits & U_EFFECTS) if (bits & U_EFFECTS)
MSG_WriteByte(msg, (int) ent->v.effects & pr_effects_mask); msg.write_byte((int) ent->v.effects & pr_effects_mask);
if (bits & U_ORIGIN1) if (bits & U_ORIGIN1)
MSG_WriteCoord(msg, ent->v.origin[0], sv.protocolflags); msg.write_coord(ent->v.origin[0], static_cast<net::rmq_flags>(sv.protocolflags));
if (bits & U_ANGLE1) if (bits & U_ANGLE1)
MSG_WriteAngle(msg, ent->v.angles[0], sv.protocolflags); msg.write_angle(ent->v.angles[0], static_cast<net::rmq_flags>(sv.protocolflags));
if (bits & U_ORIGIN2) if (bits & U_ORIGIN2)
MSG_WriteCoord(msg, ent->v.origin[1], sv.protocolflags); msg.write_coord(ent->v.origin[1], static_cast<net::rmq_flags>(sv.protocolflags));
if (bits & U_ANGLE2) if (bits & U_ANGLE2)
MSG_WriteAngle(msg, ent->v.angles[1], sv.protocolflags); msg.write_angle(ent->v.angles[1], static_cast<net::rmq_flags>(sv.protocolflags));
if (bits & U_ORIGIN3) if (bits & U_ORIGIN3)
MSG_WriteCoord(msg, ent->v.origin[2], sv.protocolflags); msg.write_coord(ent->v.origin[2], static_cast<net::rmq_flags>(sv.protocolflags));
if (bits & U_ANGLE3) if (bits & U_ANGLE3)
MSG_WriteAngle(msg, ent->v.angles[2], sv.protocolflags); msg.write_angle(ent->v.angles[2], static_cast<net::rmq_flags>(sv.protocolflags));
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (bits & U_ALPHA) if (bits & U_ALPHA)
MSG_WriteByte(msg, ent->alpha); msg.write_byte(ent->alpha);
if (bits & U_SCALE) if (bits & U_SCALE)
MSG_WriteByte(msg, ent->scale); msg.write_byte(ent->scale);
if (bits & U_FRAME2) if (bits & U_FRAME2)
MSG_WriteByte(msg, (int) ent->v.frame >> 8); msg.write_byte((int) ent->v.frame >> 8);
if (bits & U_MODEL2) if (bits & U_MODEL2)
MSG_WriteByte(msg, (int) ent->v.modelindex >> 8); msg.write_byte((int) ent->v.modelindex >> 8);
if (bits & U_LERPFINISH) if (bits & U_LERPFINISH)
MSG_WriteByte(msg, (byte) (Q_rint((ent->v.nextthink-sv.time)*255))); msg.write_byte((byte) (Q_rint((ent->v.nextthink-sv.time)*255)));
//johnfitz //johnfitz
} }
//johnfitz -- devstats //johnfitz -- devstats
stats: stats:
if (msg->cursize > 1024 && dev_peakstats.packetsize <= 1024) if (msg.size() > 1024 && dev_peakstats.packetsize <= 1024)
console::dev_warn("%i byte packet exceeds standard limit of 1024 (max = %d).\n", msg->cursize, msg->maxsize); console::dev_warn("%i byte packet exceeds standard limit of 1024 (max = %d).\n", msg.size(), 1024); // TODO
dev_stats.packetsize = msg->cursize; dev_stats.packetsize = msg.size();
dev_peakstats.packetsize = std::max(msg->cursize, dev_peakstats.packetsize); dev_peakstats.packetsize = std::max(static_cast<int>(msg.size()), dev_peakstats.packetsize);
//johnfitz //johnfitz
} }
@@ -787,7 +786,7 @@ SV_WriteClientdataToMessage
================== ==================
*/ */
void SV_WriteClientdataToMessage(edict_t *ent, sizebuf_t *msg) { void SV_WriteClientdataToMessage(edict_t *ent, net::msg &msg) {
int bits; int bits;
int i; int i;
edict_t *other; edict_t *other;
@@ -799,11 +798,11 @@ void SV_WriteClientdataToMessage(edict_t *ent, sizebuf_t *msg) {
// //
if (ent->v.dmg_take || ent->v.dmg_save) { if (ent->v.dmg_take || ent->v.dmg_save) {
other = PROG_TO_EDICT(ent->v.dmg_inflictor); other = PROG_TO_EDICT(ent->v.dmg_inflictor);
MSG_WriteByte(msg, svc_damage); msg.write_byte(svc_damage);
MSG_WriteByte(msg, ent->v.dmg_save); msg.write_byte(ent->v.dmg_save);
MSG_WriteByte(msg, ent->v.dmg_take); msg.write_byte(ent->v.dmg_take);
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
MSG_WriteCoord(msg, other->v.origin[i] + 0.5 * (other->v.mins[i] + other->v.maxs[i]), sv.protocolflags); msg.write_coord(other->v.origin[i] + 0.5 * (other->v.mins[i] + other->v.maxs[i]), static_cast<net::rmq_flags>(sv.protocolflags));
ent->v.dmg_take = 0; ent->v.dmg_take = 0;
ent->v.dmg_save = 0; ent->v.dmg_save = 0;
@@ -816,9 +815,9 @@ void SV_WriteClientdataToMessage(edict_t *ent, sizebuf_t *msg) {
// a fixangle might get lost in a dropped packet. Oh well. // a fixangle might get lost in a dropped packet. Oh well.
if (ent->v.fixangle) { if (ent->v.fixangle) {
MSG_WriteByte(msg, svc_setangle); msg.write_byte(svc_setangle);
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
MSG_WriteAngle(msg, ent->v.angles[i], sv.protocolflags); msg.write_angle(ent->v.angles[i], static_cast<net::rmq_flags>(sv.protocolflags));
ent->v.fixangle = 0; ent->v.fixangle = 0;
} }
@@ -882,50 +881,50 @@ void SV_WriteClientdataToMessage(edict_t *ent, sizebuf_t *msg) {
// send the data // send the data
MSG_WriteByte(msg, svc_clientdata); msg.write_byte(svc_clientdata);
MSG_WriteShort(msg, bits); msg.write_short(bits);
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (bits & SU_EXTEND1) MSG_WriteByte(msg, bits >> 16); if (bits & SU_EXTEND1) msg.write_byte(bits >> 16);
if (bits & SU_EXTEND2) MSG_WriteByte(msg, bits >> 24); if (bits & SU_EXTEND2) msg.write_byte(bits >> 24);
//johnfitz //johnfitz
if (bits & SU_VIEWHEIGHT) if (bits & SU_VIEWHEIGHT)
MSG_WriteChar(msg, ent->v.view_ofs[2]); msg.write_char(ent->v.view_ofs[2]);
if (bits & SU_IDEALPITCH) if (bits & SU_IDEALPITCH)
MSG_WriteChar(msg, ent->v.idealpitch); msg.write_char(ent->v.idealpitch);
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
if (bits & (SU_PUNCH1 << i)) if (bits & (SU_PUNCH1 << i))
MSG_WriteChar(msg, ent->v.punchangle[i]); msg.write_char(ent->v.punchangle[i]);
if (bits & (SU_VELOCITY1 << i)) if (bits & (SU_VELOCITY1 << i))
MSG_WriteChar(msg, ent->v.velocity[i] / 16); msg.write_char(ent->v.velocity[i] / 16);
} }
// [always sent] if (bits & SU_ITEMS) // [always sent] if (bits & SU_ITEMS)
MSG_WriteLong(msg, items); msg.write_long(items);
if (bits & SU_WEAPONFRAME) if (bits & SU_WEAPONFRAME)
MSG_WriteByte(msg, ent->v.weaponframe); msg.write_byte(ent->v.weaponframe);
if (bits & SU_ARMOR) if (bits & SU_ARMOR)
MSG_WriteByte(msg, ent->v.armorvalue); msg.write_byte(ent->v.armorvalue);
if (bits & SU_WEAPON) if (bits & SU_WEAPON)
MSG_WriteByte(msg, SV_ModelIndex(PR_GetString(ent->v.weaponmodel))); msg.write_byte(SV_ModelIndex(PR_GetString(ent->v.weaponmodel)));
MSG_WriteShort(msg, ent->v.health); msg.write_short(ent->v.health);
MSG_WriteByte(msg, ent->v.currentammo); msg.write_byte(ent->v.currentammo);
MSG_WriteByte(msg, ent->v.ammo_shells); msg.write_byte(ent->v.ammo_shells);
MSG_WriteByte(msg, ent->v.ammo_nails); msg.write_byte(ent->v.ammo_nails);
MSG_WriteByte(msg, ent->v.ammo_rockets); msg.write_byte(ent->v.ammo_rockets);
MSG_WriteByte(msg, ent->v.ammo_cells); msg.write_byte(ent->v.ammo_cells);
if (standard_quake) { if (standard_quake) {
MSG_WriteByte(msg, ent->v.weapon); msg.write_byte(ent->v.weapon);
} else { } else {
for (i = 0; i < 32; i++) { for (i = 0; i < 32; i++) {
if (((int) ent->v.weapon) & (1 << i)) { if (((int) ent->v.weapon) & (1 << i)) {
MSG_WriteByte(msg, i); msg.write_byte(i);
break; break;
} }
} }
@@ -933,23 +932,23 @@ void SV_WriteClientdataToMessage(edict_t *ent, sizebuf_t *msg) {
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (bits & SU_WEAPON2) if (bits & SU_WEAPON2)
MSG_WriteByte(msg, SV_ModelIndex(PR_GetString(ent->v.weaponmodel)) >> 8); msg.write_byte(SV_ModelIndex(PR_GetString(ent->v.weaponmodel)) >> 8);
if (bits & SU_ARMOR2) if (bits & SU_ARMOR2)
MSG_WriteByte(msg, (int) ent->v.armorvalue >> 8); msg.write_byte((int) ent->v.armorvalue >> 8);
if (bits & SU_AMMO2) if (bits & SU_AMMO2)
MSG_WriteByte(msg, (int) ent->v.currentammo >> 8); msg.write_byte((int) ent->v.currentammo >> 8);
if (bits & SU_SHELLS2) if (bits & SU_SHELLS2)
MSG_WriteByte(msg, (int) ent->v.ammo_shells >> 8); msg.write_byte((int) ent->v.ammo_shells >> 8);
if (bits & SU_NAILS2) if (bits & SU_NAILS2)
MSG_WriteByte(msg, (int) ent->v.ammo_nails >> 8); msg.write_byte((int) ent->v.ammo_nails >> 8);
if (bits & SU_ROCKETS2) if (bits & SU_ROCKETS2)
MSG_WriteByte(msg, (int) ent->v.ammo_rockets >> 8); msg.write_byte((int) ent->v.ammo_rockets >> 8);
if (bits & SU_CELLS2) if (bits & SU_CELLS2)
MSG_WriteByte(msg, (int) ent->v.ammo_cells >> 8); msg.write_byte((int) ent->v.ammo_cells >> 8);
if (bits & SU_WEAPONFRAME2) if (bits & SU_WEAPONFRAME2)
MSG_WriteByte(msg, (int) ent->v.weaponframe >> 8); msg.write_byte((int) ent->v.weaponframe >> 8);
if (bits & SU_WEAPONALPHA) if (bits & SU_WEAPONALPHA)
MSG_WriteByte(msg, ent->alpha); //for now, weaponalpha = client entity alpha msg.write_byte(ent->alpha); //for now, weaponalpha = client entity alpha
//johnfitz //johnfitz
} }
@@ -960,31 +959,27 @@ SV_SendClientDatagram
*/ */
bool SV_SendClientDatagram(client_t *client) { bool SV_SendClientDatagram(client_t *client) {
byte buf[MAX_DATAGRAM]; byte buf[MAX_DATAGRAM];
sizebuf_t msg; net::msg msg{};
msg.data = buf;
msg.maxsize = sizeof(buf);
msg.cursize = 0;
//johnfitz -- if client is nonlocal, use smaller max size so packets aren't fragmented //johnfitz -- if client is nonlocal, use smaller max size so packets aren't fragmented
if (std::strcmp(NET_QSocketGetAddressString(client->netconnection), "LOCAL") != 0) // if (std::strcmp(NET_QSocketGetAddressString(client->netconnection), "LOCAL") != 0)
msg.maxsize = DATAGRAM_MTU; // msg.maxsize = DATAGRAM_MTU;
//johnfitz //johnfitz
MSG_WriteByte(&msg, svc_time); msg.write_byte(svc_time);
MSG_WriteFloat(&msg, sv.time); msg.write_float(sv.time);
// add the client specific data to the datagram // add the client specific data to the datagram
SV_WriteClientdataToMessage(client->edict, &msg); SV_WriteClientdataToMessage(client->edict, msg);
SV_WriteEntitiesToClient(client->edict, &msg); SV_WriteEntitiesToClient(client->edict, msg);
// copy the server datagram if there is space // copy the server datagram if there is space
if (msg.cursize + sv.datagram.cursize < msg.maxsize) // if (msg.cursize + sv.datagram.cursize < msg.maxsize)
SZ_Write(&msg, sv.datagram.data, sv.datagram.cursize); msg.write(sv.datagram.data(), sv.datagram.size());
// send the datagram // send the datagram
if (NET_SendUnreliableMessage(client->netconnection, &msg) == -1) { if (NET_SendUnreliableMessage(client->netconnection, msg) == -1) {
SV_DropClient(true); // if the message couldn't send, kick off SV_DropClient(true); // if the message couldn't send, kick off
return false; return false;
} }
@@ -1007,9 +1002,9 @@ void SV_UpdateToReliableMessages(void) {
for (j = 0, client = svs.clients; j < svs.maxclients; j++, client++) { for (j = 0, client = svs.clients; j < svs.maxclients; j++, client++) {
if (!client->active) if (!client->active)
continue; continue;
MSG_WriteByte(&client->message, svc_updatefrags); client->message.write_byte(svc_updatefrags);
MSG_WriteByte(&client->message, i); client->message.write_byte(i);
MSG_WriteShort(&client->message, host_client->edict->v.frags); client->message.write_short(host_client->edict->v.frags);
} }
host_client->old_frags = host_client->edict->v.frags; host_client->old_frags = host_client->edict->v.frags;
@@ -1019,10 +1014,10 @@ void SV_UpdateToReliableMessages(void) {
for (j = 0, client = svs.clients; j < svs.maxclients; j++, client++) { for (j = 0, client = svs.clients; j < svs.maxclients; j++, client++) {
if (!client->active) if (!client->active)
continue; continue;
SZ_Write(&client->message, sv.reliable_datagram.data, sv.reliable_datagram.cursize); client->message.write(sv.reliable_datagram.data(), sv.reliable_datagram.size());
} }
SZ_Clear(&sv.reliable_datagram); sv.reliable_datagram.clear();
} }
@@ -1035,16 +1030,11 @@ message buffer
======================= =======================
*/ */
void SV_SendNop(client_t *client) { void SV_SendNop(client_t *client) {
sizebuf_t msg; net::msg msg{};
byte buf[4];
msg.data = buf; msg.write_char(svc_nop);
msg.maxsize = sizeof(buf);
msg.cursize = 0;
MSG_WriteChar(&msg, svc_nop); if (NET_SendUnreliableMessage(client->netconnection, msg) == -1)
if (NET_SendUnreliableMessage(client->netconnection, &msg) == -1)
SV_DropClient(true); // if the message couldn't send, kick off SV_DropClient(true); // if the message couldn't send, kick off
client->last_message = realtime; client->last_message = realtime;
} }
@@ -1081,11 +1071,12 @@ void SV_SendClientMessages(void) {
} }
if (host_client->sendsignon == PRESPAWN_SIGNONBUFS) { if (host_client->sendsignon == PRESPAWN_SIGNONBUFS) {
bool local = SV_IsLocalClient(host_client); bool local = SV_IsLocalClient(host_client);
while (host_client->signonidx < sv.num_signon_buffers) { while (host_client->signonidx < sv.signons.size()) {
sizebuf_t *signon = sv.signon_buffers[host_client->signonidx]; auto signon = sv.signons[host_client->signonidx];
if (host_client->message.cursize + signon->cursize > host_client->message.maxsize) // if (host_client->message.cursize + signon->cursize > host_client->message.maxsize)
break; // break;
SZ_Write(&host_client->message, signon->data, signon->cursize);
host_client->message.write(signon.data(), signon.size());
host_client->signonidx++; host_client->signonidx++;
// only send multiple buffers at once when playing locally, // only send multiple buffers at once when playing locally,
// otherwise we send one signon at a time to avoid overflowing // otherwise we send one signon at a time to avoid overflowing
@@ -1093,28 +1084,28 @@ void SV_SendClientMessages(void) {
if (!local) if (!local)
break; break;
} }
if (host_client->signonidx == sv.num_signon_buffers) if (host_client->signonidx == sv.signons.size())
host_client->sendsignon = PRESPAWN_SIGNONMSG; host_client->sendsignon = PRESPAWN_SIGNONMSG;
} }
if (host_client->sendsignon == PRESPAWN_SIGNONMSG) { if (host_client->sendsignon == PRESPAWN_SIGNONMSG) {
if (host_client->message.cursize + 2 < host_client->message.maxsize) { //if (host_client->message.siz + 2 < host_client->message.maxsize) {
MSG_WriteByte(&host_client->message, svc_signonnum); host_client->message.write_byte(svc_signonnum);
MSG_WriteByte(&host_client->message, 2); host_client->message.write_byte(2);
host_client->sendsignon = PRESPAWN_FLUSH; host_client->sendsignon = PRESPAWN_FLUSH;
} //}
} }
} }
// check for an overflowed message. Should only happen // check for an overflowed message. Should only happen
// on a very fucked up connection that backs up a lot, then // on a very fucked up connection that backs up a lot, then
// changes level // changes level
if (host_client->message.overflowed) { // if (host_client->message.overflowed) {
SV_DropClient(true); // SV_DropClient(true);
host_client->message.overflowed = false; // host_client->message.overflowed = false;
continue; // continue;
} // }
if (host_client->message.cursize || host_client->dropasap) { if (!host_client->message.empty() || host_client->dropasap) {
if (!NET_CanSendMessage(host_client->netconnection)) { if (!NET_CanSendMessage(host_client->netconnection)) {
// I_Printf ("can't write\n"); // I_Printf ("can't write\n");
continue; continue;
@@ -1124,9 +1115,9 @@ void SV_SendClientMessages(void) {
SV_DropClient(false); // went to another level SV_DropClient(false); // went to another level
else { else {
if (NET_SendMessage(host_client->netconnection if (NET_SendMessage(host_client->netconnection
, &host_client->message) == -1) , host_client->message) == -1)
SV_DropClient(true); // if the message couldn't send, kick off SV_DropClient(true); // if the message couldn't send, kick off
SZ_Clear(&host_client->message); host_client->message.clear();
host_client->last_message = realtime; host_client->last_message = realtime;
if (host_client->sendsignon == PRESPAWN_FLUSH) if (host_client->sendsignon == PRESPAWN_FLUSH)
host_client->sendsignon = PRESPAWN_DONE; host_client->sendsignon = PRESPAWN_DONE;
@@ -1156,15 +1147,11 @@ SV_AddSignonBuffer
================ ================
*/ */
static void SV_AddSignonBuffer(void) { static void SV_AddSignonBuffer(void) {
sizebuf_t *sb; if (sv.signons.size() >= MAX_SIGNON_BUFFERS)
if (sv.num_signon_buffers >= MAX_SIGNON_BUFFERS)
Host_Error("SV_AddSignonBuffer overflow\n"); Host_Error("SV_AddSignonBuffer overflow\n");
sb = (sizebuf_t *) Hunk_AllocName(sizeof(sizebuf_t) + SIGNON_SIZE, "signon"); sv.signons.emplace_back();
sb->data = (byte *) (sb + 1); sv.current_signon = sv.signons.size() - 1;
sb->maxsize = SIGNON_SIZE;
sv.signon_buffers[sv.num_signon_buffers++] = sb;
sv.signon = sb;
} }
/* /*
@@ -1173,7 +1160,7 @@ SV_ReserveSignonSpace
================ ================
*/ */
void SV_ReserveSignonSpace(int numbytes) { void SV_ReserveSignonSpace(int numbytes) {
if (sv.signon->cursize + numbytes > sv.signon->maxsize) if (sv.signons[sv.current_signon].size() + numbytes > SIGNON_SIZE)
SV_AddSignonBuffer(); SV_AddSignonBuffer();
} }
@@ -1271,42 +1258,42 @@ void SV_CreateBaseline(void) {
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (bits) if (bits)
MSG_WriteByte(sv.signon, svc_spawnbaseline2); sv.signons[sv.current_signon].write_byte(svc_spawnbaseline2);
else else
MSG_WriteByte(sv.signon, svc_spawnbaseline); sv.signons[sv.current_signon].write_byte(svc_spawnbaseline);
//johnfitz //johnfitz
MSG_WriteShort(sv.signon, entnum); sv.signons[sv.current_signon].write_short(entnum);
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (bits) if (bits)
MSG_WriteByte(sv.signon, bits); sv.signons[sv.current_signon].write_byte(bits);
if (bits & B_LARGEMODEL) if (bits & B_LARGEMODEL)
MSG_WriteShort(sv.signon, svent->baseline.modelindex); sv.signons[sv.current_signon].write_short(svent->baseline.modelindex);
else else
MSG_WriteByte(sv.signon, svent->baseline.modelindex); sv.signons[sv.current_signon].write_byte(svent->baseline.modelindex);
if (bits & B_LARGEFRAME) if (bits & B_LARGEFRAME)
MSG_WriteShort(sv.signon, svent->baseline.frame); sv.signons[sv.current_signon].write_short(svent->baseline.frame);
else else
MSG_WriteByte(sv.signon, svent->baseline.frame); sv.signons[sv.current_signon].write_byte(svent->baseline.frame);
//johnfitz //johnfitz
MSG_WriteByte(sv.signon, svent->baseline.colormap); sv.signons[sv.current_signon].write_byte(svent->baseline.colormap);
MSG_WriteByte(sv.signon, svent->baseline.skin); sv.signons[sv.current_signon].write_byte(svent->baseline.skin);
for (i = 0; i < 3; i++) { for (i = 0; i < 3; i++) {
MSG_WriteCoord(sv.signon, svent->baseline.origin[i], sv.protocolflags); sv.signons[sv.current_signon].write_coord(svent->baseline.origin[i], static_cast<net::rmq_flags>(sv.protocolflags));
MSG_WriteAngle(sv.signon, svent->baseline.angles[i], sv.protocolflags); sv.signons[sv.current_signon].write_angle(svent->baseline.angles[i], static_cast<net::rmq_flags>(sv.protocolflags));
} }
//johnfitz -- PROTOCOL_FITZQUAKE //johnfitz -- PROTOCOL_FITZQUAKE
if (bits & B_ALPHA) if (bits & B_ALPHA)
MSG_WriteByte(sv.signon, svent->baseline.alpha); sv.signons[sv.current_signon].write_byte(svent->baseline.alpha);
//johnfitz //johnfitz
if (bits & B_SCALE) if (bits & B_SCALE)
MSG_WriteByte(sv.signon, svent->baseline.scale); sv.signons[sv.current_signon].write_byte(svent->baseline.scale);
} }
} }
@@ -1320,15 +1307,11 @@ Tell all the clients that the server is changing levels
*/ */
void SV_SendReconnect(void) { void SV_SendReconnect(void) {
byte data[128]; byte data[128];
sizebuf_t msg; net::msg msg{};
msg.data = data; msg.write_char( svc_stufftext);
msg.cursize = 0; msg.write_string("reconnect\n");
msg.maxsize = sizeof(data); NET_SendToAll(msg, 5.0);
MSG_WriteChar(&msg, svc_stufftext);
MSG_WriteString(&msg, "reconnect\n");
NET_SendToAll(&msg, 5.0);
if (!isDedicated) if (!isDedicated)
command::execute_string("reconnect\n", command::source::command); command::execute_string("reconnect\n", command::source::command);
@@ -1427,13 +1410,8 @@ void SV_SpawnServer(const char *server) {
sv.max_edicts = std::clamp((int) max_edicts.value,MIN_EDICTS, MAX_EDICTS); //johnfitz -- max_edicts cvar sv.max_edicts = std::clamp((int) max_edicts.value,MIN_EDICTS, MAX_EDICTS); //johnfitz -- max_edicts cvar
sv.edicts = (edict_t *) malloc(sv.max_edicts * pr_edict_size); // ericw -- sv.edicts switched to use malloc() sv.edicts = (edict_t *) malloc(sv.max_edicts * pr_edict_size); // ericw -- sv.edicts switched to use malloc()
sv.datagram.maxsize = sizeof(sv.datagram_buf); sv.datagram = net::msg{};
sv.datagram.cursize = 0; sv.reliable_datagram = net::msg{};
sv.datagram.data = sv.datagram_buf;
sv.reliable_datagram.maxsize = sizeof(sv.reliable_datagram_buf);
sv.reliable_datagram.cursize = 0;
sv.reliable_datagram.data = sv.reliable_datagram_buf;
SV_AddSignonBuffer(); SV_AddSignonBuffer();
@@ -1510,8 +1488,8 @@ void SV_SpawnServer(const char *server) {
SV_CreateBaseline(); SV_CreateBaseline();
//johnfitz -- warn if signon buffer larger than standard server can handle //johnfitz -- warn if signon buffer larger than standard server can handle
for (i = 0, signonsize = 0; i < sv.num_signon_buffers; i++) for (i = 0, signonsize = 0; i < sv.signons.size(); i++)
signonsize += sv.signon_buffers[i]->cursize; signonsize += sv.signons[i].size();
if (signonsize > 64000 - 2) if (signonsize > 64000 - 2)
console::dev_warn("%i byte signon buffer exceeds QS limit of 63998.\n", signonsize); console::dev_warn("%i byte signon buffer exceeds QS limit of 63998.\n", signonsize);
else if (signonsize > 8000 - 2) else if (signonsize > 8000 - 2)
+186 -219
View File
@@ -40,8 +40,8 @@ bool onground;
usercmd_t cmd; usercmd_t cmd;
convar sv_idealpitchscale{"sv_idealpitchscale","0.8"}; convar sv_idealpitchscale{"sv_idealpitchscale", "0.8"};
convar sv_altnoclip{"sv_altnoclip","1",{.archive = true}}; //johnfitz convar sv_altnoclip{"sv_altnoclip", "1", {.archive = true}}; //johnfitz
/* /*
=============== ===============
@@ -49,8 +49,8 @@ SV_SetIdealPitch
=============== ===============
*/ */
#define MAX_FORWARD 6 #define MAX_FORWARD 6
void SV_SetIdealPitch (void)
{ void SV_SetIdealPitch(void) {
float angleval, sinval, cosval; float angleval, sinval, cosval;
trace_t tr; trace_t tr;
vec3_t top, bottom; vec3_t top, bottom;
@@ -58,50 +58,47 @@ void SV_SetIdealPitch (void)
int i, j; int i, j;
int step, dir, steps; int step, dir, steps;
if (!((int)sv_player->v.flags & FL_ONGROUND)) if (!((int) sv_player->v.flags & FL_ONGROUND))
return; return;
angleval = sv_player->v.angles[YAW] * M_PI*2 / 360; angleval = sv_player->v.angles[YAW] * M_PI * 2 / 360;
sinval = sin(angleval); sinval = sin(angleval);
cosval = cos(angleval); cosval = cos(angleval);
for (i=0 ; i<MAX_FORWARD ; i++) for (i = 0; i < MAX_FORWARD; i++) {
{ top[0] = sv_player->v.origin[0] + cosval * (i + 3) * 12;
top[0] = sv_player->v.origin[0] + cosval*(i+3)*12; top[1] = sv_player->v.origin[1] + sinval * (i + 3) * 12;
top[1] = sv_player->v.origin[1] + sinval*(i+3)*12;
top[2] = sv_player->v.origin[2] + sv_player->v.view_ofs[2]; top[2] = sv_player->v.origin[2] + sv_player->v.view_ofs[2];
bottom[0] = top[0]; bottom[0] = top[0];
bottom[1] = top[1]; bottom[1] = top[1];
bottom[2] = top[2] - 160; bottom[2] = top[2] - 160;
tr = SV_Move (top, vec3_origin, vec3_origin, bottom, 1, sv_player); tr = SV_Move(top, vec3_origin, vec3_origin, bottom, 1, sv_player);
if (tr.allsolid) if (tr.allsolid)
return; // looking at a wall, leave ideal the way is was return; // looking at a wall, leave ideal the way is was
if (tr.fraction == 1) if (tr.fraction == 1)
return; // near a dropoff return; // near a dropoff
z[i] = top[2] + tr.fraction*(bottom[2]-top[2]); z[i] = top[2] + tr.fraction * (bottom[2] - top[2]);
} }
dir = 0; dir = 0;
steps = 0; steps = 0;
for (j=1 ; j<i ; j++) for (j = 1; j < i; j++) {
{ step = z[j] - z[j - 1];
step = z[j] - z[j-1];
if (step > -ON_EPSILON && step < ON_EPSILON) if (step > -ON_EPSILON && step < ON_EPSILON)
continue; continue;
if (dir && ( step-dir > ON_EPSILON || step-dir < -ON_EPSILON ) ) if (dir && (step - dir > ON_EPSILON || step - dir < -ON_EPSILON))
return; // mixed changes return; // mixed changes
steps++; steps++;
dir = step; dir = step;
} }
if (!dir) if (!dir) {
{
sv_player->v.idealpitch = 0; sv_player->v.idealpitch = 0;
return; return;
} }
@@ -118,8 +115,7 @@ SV_UserFriction
================== ==================
*/ */
void SV_UserFriction (void) void SV_UserFriction(void) {
{
float *vel; float *vel;
float speed, newspeed, control; float speed, newspeed, control;
vec3_t start, stop; vec3_t start, stop;
@@ -128,26 +124,26 @@ void SV_UserFriction (void)
vel = velocity; vel = velocity;
speed = sqrt(vel[0]*vel[0] +vel[1]*vel[1]); speed = sqrt(vel[0] * vel[0] + vel[1] * vel[1]);
if (!speed) if (!speed)
return; return;
// if the leading edge is over a dropoff, increase friction // if the leading edge is over a dropoff, increase friction
start[0] = stop[0] = origin[0] + vel[0]/speed*16; start[0] = stop[0] = origin[0] + vel[0] / speed * 16;
start[1] = stop[1] = origin[1] + vel[1]/speed*16; start[1] = stop[1] = origin[1] + vel[1] / speed * 16;
start[2] = origin[2] + sv_player->v.mins[2]; start[2] = origin[2] + sv_player->v.mins[2];
stop[2] = start[2] - 34; stop[2] = start[2] - 34;
trace = SV_Move (start, vec3_origin, vec3_origin, stop, true, sv_player); trace = SV_Move(start, vec3_origin, vec3_origin, stop, true, sv_player);
if (trace.fraction == 1.0) if (trace.fraction == 1.0)
friction = sv_friction.value*sv_edgefriction.value; friction = sv_friction.value * sv_edgefriction.value;
else else
friction = sv_friction.value; friction = sv_friction.value;
// apply friction // apply friction
control = speed < sv_stopspeed.value ? sv_stopspeed.value : speed; control = speed < sv_stopspeed.value ? sv_stopspeed.value : speed;
newspeed = speed - host_frametime*control*friction; newspeed = speed - host_frametime * control * friction;
if (newspeed < 0) if (newspeed < 0)
newspeed = 0; newspeed = 0;
@@ -163,57 +159,55 @@ void SV_UserFriction (void)
SV_Accelerate SV_Accelerate
============== ==============
*/ */
convar sv_maxspeed{"sv_maxspeed", "320", {.notify = true,. server_info = true}}; convar sv_maxspeed{"sv_maxspeed", "320", {.notify = true, . server_info = true}};
convar sv_accelerate{"sv_accelerate", "10"}; convar sv_accelerate{"sv_accelerate", "10"};
void SV_Accelerate (float wishspeed, const vec3_t wishdir)
{ void SV_Accelerate(float wishspeed, const vec3_t wishdir) {
int i; int i;
float addspeed, accelspeed, currentspeed; float addspeed, accelspeed, currentspeed;
currentspeed = DotProduct (velocity, wishdir); currentspeed = DotProduct(velocity, wishdir);
addspeed = wishspeed - currentspeed; addspeed = wishspeed - currentspeed;
if (addspeed <= 0) if (addspeed <= 0)
return; return;
accelspeed = sv_accelerate.value*host_frametime*wishspeed; accelspeed = sv_accelerate.value * host_frametime * wishspeed;
if (accelspeed > addspeed) if (accelspeed > addspeed)
accelspeed = addspeed; accelspeed = addspeed;
for (i=0 ; i<3 ; i++) for (i = 0; i < 3; i++)
velocity[i] += accelspeed*wishdir[i]; velocity[i] += accelspeed * wishdir[i];
} }
void SV_AirAccelerate (float wishspeed, vec3_t wishveloc) void SV_AirAccelerate(float wishspeed, vec3_t wishveloc) {
{
int i; int i;
float addspeed, wishspd, accelspeed, currentspeed; float addspeed, wishspd, accelspeed, currentspeed;
wishspd = VectorNormalize (wishveloc); wishspd = VectorNormalize(wishveloc);
if (wishspd > 30) if (wishspd > 30)
wishspd = 30; wishspd = 30;
currentspeed = DotProduct (velocity, wishveloc); currentspeed = DotProduct(velocity, wishveloc);
addspeed = wishspd - currentspeed; addspeed = wishspd - currentspeed;
if (addspeed <= 0) if (addspeed <= 0)
return; return;
// accelspeed = sv_accelerate.value * host_frametime; // accelspeed = sv_accelerate.value * host_frametime;
accelspeed = sv_accelerate.value*wishspeed * host_frametime; accelspeed = sv_accelerate.value * wishspeed * host_frametime;
if (accelspeed > addspeed) if (accelspeed > addspeed)
accelspeed = addspeed; accelspeed = addspeed;
for (i=0 ; i<3 ; i++) for (i = 0; i < 3; i++)
velocity[i] += accelspeed*wishveloc[i]; velocity[i] += accelspeed * wishveloc[i];
} }
void DropPunchAngle (void) void DropPunchAngle(void) {
{
float len; float len;
len = VectorNormalize (sv_player->v.punchangle); len = VectorNormalize(sv_player->v.punchangle);
len -= 10*host_frametime; len -= 10 * host_frametime;
if (len < 0) if (len < 0)
len = 0; len = 0;
VectorScale (sv_player->v.punchangle, len, sv_player->v.punchangle); VectorScale(sv_player->v.punchangle, len, sv_player->v.punchangle);
} }
/* /*
@@ -222,19 +216,18 @@ SV_WaterMove
=================== ===================
*/ */
void SV_WaterMove (void) void SV_WaterMove(void) {
{
int i; int i;
vec3_t wishvel; vec3_t wishvel;
float speed, newspeed, wishspeed, addspeed, accelspeed; float speed, newspeed, wishspeed, addspeed, accelspeed;
// //
// user intentions // user intentions
// //
AngleVectors (sv_player->v.v_angle, forward, right, up); AngleVectors(sv_player->v.v_angle, forward, right, up);
for (i=0 ; i<3 ; i++) for (i = 0; i < 3; i++)
wishvel[i] = forward[i]*cmd.forwardmove + right[i]*cmd.sidemove; wishvel[i] = forward[i] * cmd.forwardmove + right[i] * cmd.sidemove;
if (!cmd.forwardmove && !cmd.sidemove && !cmd.upmove) if (!cmd.forwardmove && !cmd.sidemove && !cmd.upmove)
wishvel[2] -= 60; // drift towards bottom wishvel[2] -= 60; // drift towards bottom
@@ -242,30 +235,27 @@ void SV_WaterMove (void)
wishvel[2] += cmd.upmove; wishvel[2] += cmd.upmove;
wishspeed = VectorLength(wishvel); wishspeed = VectorLength(wishvel);
if (wishspeed > sv_maxspeed.value) if (wishspeed > sv_maxspeed.value) {
{ VectorScale(wishvel, sv_maxspeed.value / wishspeed, wishvel);
VectorScale (wishvel, sv_maxspeed.value/wishspeed, wishvel);
wishspeed = sv_maxspeed.value; wishspeed = sv_maxspeed.value;
} }
wishspeed *= 0.7; wishspeed *= 0.7;
// //
// water friction // water friction
// //
speed = VectorLength (velocity); speed = VectorLength(velocity);
if (speed) if (speed) {
{
newspeed = speed - host_frametime * speed * sv_friction.value; newspeed = speed - host_frametime * speed * sv_friction.value;
if (newspeed < 0) if (newspeed < 0)
newspeed = 0; newspeed = 0;
VectorScale (velocity, newspeed/speed, velocity); VectorScale(velocity, newspeed / speed, velocity);
} } else
else
newspeed = 0; newspeed = 0;
// //
// water acceleration // water acceleration
// //
if (!wishspeed) if (!wishspeed)
return; return;
@@ -273,21 +263,19 @@ void SV_WaterMove (void)
if (addspeed <= 0) if (addspeed <= 0)
return; return;
VectorNormalize (wishvel); VectorNormalize(wishvel);
accelspeed = sv_accelerate.value * wishspeed * host_frametime; accelspeed = sv_accelerate.value * wishspeed * host_frametime;
if (accelspeed > addspeed) if (accelspeed > addspeed)
accelspeed = addspeed; accelspeed = addspeed;
for (i=0 ; i<3 ; i++) for (i = 0; i < 3; i++)
velocity[i] += accelspeed * wishvel[i]; velocity[i] += accelspeed * wishvel[i];
} }
void SV_WaterJump (void) void SV_WaterJump(void) {
{
if (sv.time > sv_player->v.teleport_time if (sv.time > sv_player->v.teleport_time
|| !sv_player->v.waterlevel) || !sv_player->v.waterlevel) {
{ sv_player->v.flags = (int) sv_player->v.flags & ~FL_WATERJUMP;
sv_player->v.flags = (int)sv_player->v.flags & ~FL_WATERJUMP;
sv_player->v.teleport_time = 0; sv_player->v.teleport_time = 0;
} }
sv_player->v.velocity[0] = sv_player->v.movedir[0]; sv_player->v.velocity[0] = sv_player->v.movedir[0];
@@ -301,19 +289,17 @@ SV_NoclipMove -- johnfitz
new, alternate noclip. old noclip is still handled in SV_AirMove new, alternate noclip. old noclip is still handled in SV_AirMove
=================== ===================
*/ */
void SV_NoclipMove (void) void SV_NoclipMove(void) {
{ AngleVectors(sv_player->v.v_angle, forward, right, up);
AngleVectors (sv_player->v.v_angle, forward, right, up);
velocity[0] = forward[0]*cmd.forwardmove + right[0]*cmd.sidemove; velocity[0] = forward[0] * cmd.forwardmove + right[0] * cmd.sidemove;
velocity[1] = forward[1]*cmd.forwardmove + right[1]*cmd.sidemove; velocity[1] = forward[1] * cmd.forwardmove + right[1] * cmd.sidemove;
velocity[2] = forward[2]*cmd.forwardmove + right[2]*cmd.sidemove; velocity[2] = forward[2] * cmd.forwardmove + right[2] * cmd.sidemove;
velocity[2] += cmd.upmove*2; //doubled to match running speed velocity[2] += cmd.upmove * 2; //doubled to match running speed
if (VectorLength (velocity) > sv_maxspeed.value) if (VectorLength(velocity) > sv_maxspeed.value) {
{ VectorNormalize(velocity);
VectorNormalize (velocity); VectorScale(velocity, sv_maxspeed.value, velocity);
VectorScale (velocity, sv_maxspeed.value, velocity);
} }
} }
@@ -322,50 +308,45 @@ void SV_NoclipMove (void)
SV_AirMove SV_AirMove
=================== ===================
*/ */
void SV_AirMove (void) void SV_AirMove(void) {
{
int i; int i;
vec3_t wishvel, wishdir; vec3_t wishvel, wishdir;
float wishspeed; float wishspeed;
float fmove, smove; float fmove, smove;
AngleVectors (sv_player->v.angles, forward, right, up); AngleVectors(sv_player->v.angles, forward, right, up);
fmove = cmd.forwardmove; fmove = cmd.forwardmove;
smove = cmd.sidemove; smove = cmd.sidemove;
// hack to not let you back into teleporter // hack to not let you back into teleporter
if (sv.time < sv_player->v.teleport_time && fmove < 0) if (sv.time < sv_player->v.teleport_time && fmove < 0)
fmove = 0; fmove = 0;
for (i=0 ; i<3 ; i++) for (i = 0; i < 3; i++)
wishvel[i] = forward[i]*fmove + right[i]*smove; wishvel[i] = forward[i] * fmove + right[i] * smove;
if ( (int)sv_player->v.movetype != MOVETYPE_WALK) if ((int) sv_player->v.movetype != MOVETYPE_WALK)
wishvel[2] = cmd.upmove; wishvel[2] = cmd.upmove;
else else
wishvel[2] = 0; wishvel[2] = 0;
VectorCopy (wishvel, wishdir); VectorCopy(wishvel, wishdir);
wishspeed = VectorNormalize(wishdir); wishspeed = VectorNormalize(wishdir);
if (wishspeed > sv_maxspeed.value) if (wishspeed > sv_maxspeed.value) {
{ VectorScale(wishvel, sv_maxspeed.value / wishspeed, wishvel);
VectorScale (wishvel, sv_maxspeed.value/wishspeed, wishvel);
wishspeed = sv_maxspeed.value; wishspeed = sv_maxspeed.value;
} }
if ( sv_player->v.movetype == MOVETYPE_NOCLIP) if (sv_player->v.movetype == MOVETYPE_NOCLIP) {
{ // noclip // noclip
VectorCopy (wishvel, velocity); VectorCopy(wishvel, velocity);
} } else if (onground) {
else if ( onground ) SV_UserFriction();
{ SV_Accelerate(wishspeed, wishdir);
SV_UserFriction (); } else {
SV_Accelerate (wishspeed, wishdir); // not on ground, so little effect on velocity
} SV_AirAccelerate(wishspeed, wishvel);
else
{ // not on ground, so little effect on velocity
SV_AirAccelerate (wishspeed, wishvel);
} }
} }
@@ -377,55 +358,52 @@ the move fields specify an intended velocity in pix/sec
the angle fields specify an exact angular motion in degrees the angle fields specify an exact angular motion in degrees
=================== ===================
*/ */
void SV_ClientThink (void) void SV_ClientThink(void) {
{
vec3_t v_angle; vec3_t v_angle;
if (sv_player->v.movetype == MOVETYPE_NONE) if (sv_player->v.movetype == MOVETYPE_NONE)
return; return;
onground = (int)sv_player->v.flags & FL_ONGROUND; onground = (int) sv_player->v.flags & FL_ONGROUND;
origin = sv_player->v.origin; origin = sv_player->v.origin;
velocity = sv_player->v.velocity; velocity = sv_player->v.velocity;
DropPunchAngle (); DropPunchAngle();
// //
// if dead, behave differently // if dead, behave differently
// //
if (sv_player->v.health <= 0) if (sv_player->v.health <= 0)
return; return;
// //
// angles // angles
// show 1/3 the pitch angle and all the roll angle // show 1/3 the pitch angle and all the roll angle
cmd = host_client->cmd; cmd = host_client->cmd;
angles = sv_player->v.angles; angles = sv_player->v.angles;
VectorAdd (sv_player->v.v_angle, sv_player->v.punchangle, v_angle); VectorAdd(sv_player->v.v_angle, sv_player->v.punchangle, v_angle);
angles[ROLL] = V_CalcRoll (sv_player->v.angles, sv_player->v.velocity)*4; angles[ROLL] = V_CalcRoll(sv_player->v.angles, sv_player->v.velocity) * 4;
if (!sv_player->v.fixangle) if (!sv_player->v.fixangle) {
{ angles[PITCH] = -v_angle[PITCH] / 3;
angles[PITCH] = -v_angle[PITCH]/3;
angles[YAW] = v_angle[YAW]; angles[YAW] = v_angle[YAW];
} }
if ( (int)sv_player->v.flags & FL_WATERJUMP ) if ((int) sv_player->v.flags & FL_WATERJUMP) {
{ SV_WaterJump();
SV_WaterJump ();
return; return;
} }
// //
// walk // walk
// //
//johnfitz -- alternate noclip //johnfitz -- alternate noclip
if (sv_player->v.movetype == MOVETYPE_NOCLIP && sv_altnoclip.value) if (sv_player->v.movetype == MOVETYPE_NOCLIP && sv_altnoclip.value)
SV_NoclipMove (); SV_NoclipMove();
else if (sv_player->v.waterlevel >= 2 && sv_player->v.movetype != MOVETYPE_NOCLIP) else if (sv_player->v.waterlevel >= 2 && sv_player->v.movetype != MOVETYPE_NOCLIP)
SV_WaterMove (); SV_WaterMove();
else else
SV_AirMove (); SV_AirMove();
//johnfitz //johnfitz
} }
@@ -435,41 +413,39 @@ void SV_ClientThink (void)
SV_ReadClientMove SV_ReadClientMove
=================== ===================
*/ */
void SV_ReadClientMove (usercmd_t *move) void SV_ReadClientMove(usercmd_t *move) {
{
int i; int i;
vec3_t angle; vec3_t angle;
int bits; int bits;
// read ping time // read ping time
host_client->ping_times[host_client->num_pings%NUM_PING_TIMES] host_client->ping_times[host_client->num_pings % NUM_PING_TIMES]
= sv.time - MSG_ReadFloat (); = sv.time - net_message.read_float().value();
host_client->num_pings++; host_client->num_pings++;
// read current angles // read current angles
for (i=0 ; i<3 ; i++) for (i = 0; i < 3; i++)
//johnfitz -- 16-bit angles for PROTOCOL_FITZQUAKE //johnfitz -- 16-bit angles for PROTOCOL_FITZQUAKE
if (sv.protocol == PROTOCOL_NETQUAKE) if (sv.protocol == PROTOCOL_NETQUAKE)
angle[i] = MSG_ReadAngle (sv.protocolflags); angle[i] = net_message.read_angle(static_cast<net::rmq_flags>(cl.protocolflags)).value();
else else
angle[i] = MSG_ReadAngle16 (sv.protocolflags); angle[i] = net_message.read_angle_16(static_cast<net::rmq_flags>(cl.protocolflags)).value();
//johnfitz //johnfitz
VectorCopy (angle, host_client->edict->v.v_angle); VectorCopy(angle, host_client->edict->v.v_angle);
// read movement // read movement
move->forwardmove = MSG_ReadShort (); move->forwardmove = net_message.read_short().value();
move->sidemove = MSG_ReadShort (); move->sidemove = net_message.read_short().value();
move->upmove = MSG_ReadShort (); move->upmove = net_message.read_short().value();
// read buttons // read buttons
bits = MSG_ReadByte (); bits = net_message.read_byte().value();
host_client->edict->v.button0 = bits & 1; host_client->edict->v.button0 = bits & 1;
host_client->edict->v.button2 = (bits & 2)>>1; host_client->edict->v.button2 = (bits & 2) >> 1;
i = MSG_ReadByte (); if (const auto imp = net_message.read_byte(); imp.has_value())
if (i) host_client->edict->v.impulse = imp.value();
host_client->edict->v.impulse = i;
} }
/* /*
@@ -479,108 +455,104 @@ SV_ReadClientMessage
Returns false if the client should be killed Returns false if the client should be killed
=================== ===================
*/ */
bool SV_ReadClientMessage (void) bool SV_ReadClientMessage(void) {
{
int ret; int ret;
int ccmd; int ccmd;
const char *s;
do do {
{ nextmsg:
nextmsg: ret = NET_GetMessage(host_client->netconnection);
ret = NET_GetMessage (host_client->netconnection); if (ret == -1) {
if (ret == -1) Sys_Printf("SV_ReadClientMessage: NET_GetMessage failed\n");
{
Sys_Printf ("SV_ReadClientMessage: NET_GetMessage failed\n");
return false; return false;
} }
if (!ret) if (!ret)
return true; return true;
MSG_BeginReading (); net_message.begin_reading();
while (1) while (true) {
{
if (!host_client->active) if (!host_client->active)
return false; // a command caused an error return false; // a command caused an error
if (msg_badread) if (net_message.eos()) {
{ Sys_Printf("SV_ReadClientMessage: badread\n");
Sys_Printf ("SV_ReadClientMessage: badread\n");
return false; return false;
} }
ccmd = MSG_ReadChar (); auto ccmdv = net_message.read_char();
switch (ccmd) if (!ccmdv.has_value()) {
{ goto nextmsg;
case -1: }
goto nextmsg; // end of message
ccmd = ccmdv.value();
switch (ccmd) {
default: default:
Sys_Printf ("SV_ReadClientMessage: unknown command char\n"); Sys_Printf("SV_ReadClientMessage: unknown command char\n");
return false; return false;
case clc_nop: case clc_nop:
// Sys_Printf ("clc_nop\n"); // Sys_Printf ("clc_nop\n");
break; break;
case clc_stringcmd: case clc_stringcmd: {
s = MSG_ReadString (); auto s = net_message.read_string().value();
ret = 0; ret = 0;
if (q_strncasecmp(s, "status", 6) == 0) if (q_strncasecmp(s.c_str(), "status", 6) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "god", 3) == 0) else if (q_strncasecmp(s.c_str(), "god", 3) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "notarget", 8) == 0) else if (q_strncasecmp(s.c_str(), "notarget", 8) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "fly", 3) == 0) else if (q_strncasecmp(s.c_str(), "fly", 3) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "name", 4) == 0) else if (q_strncasecmp(s.c_str(), "name", 4) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "noclip", 6) == 0) else if (q_strncasecmp(s.c_str(), "noclip", 6) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "setpos", 6) == 0) else if (q_strncasecmp(s.c_str(), "setpos", 6) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "say", 3) == 0) else if (q_strncasecmp(s.c_str(), "say", 3) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "say_team", 8) == 0) else if (q_strncasecmp(s.c_str(), "say_team", 8) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "tell", 4) == 0) else if (q_strncasecmp(s.c_str(), "tell", 4) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "color", 5) == 0) else if (q_strncasecmp(s.c_str(), "color", 5) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "kill", 4) == 0) else if (q_strncasecmp(s.c_str(), "kill", 4) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "pause", 5) == 0) else if (q_strncasecmp(s.c_str(), "pause", 5) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "spawn", 5) == 0) else if (q_strncasecmp(s.c_str(), "spawn", 5) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "begin", 5) == 0) else if (q_strncasecmp(s.c_str(), "begin", 5) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "prespawn", 8) == 0) else if (q_strncasecmp(s.c_str(), "prespawn", 8) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "kick", 4) == 0) else if (q_strncasecmp(s.c_str(), "kick", 4) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "ping", 4) == 0) else if (q_strncasecmp(s.c_str(), "ping", 4) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "give", 4) == 0) else if (q_strncasecmp(s.c_str(), "give", 4) == 0)
ret = 1; ret = 1;
else if (q_strncasecmp(s, "ban", 3) == 0) else if (q_strncasecmp(s.c_str(), "ban", 3) == 0)
ret = 1; ret = 1;
if (ret == 1) if (ret == 1)
command::execute_string (s, command::source::client); command::execute_string(s.c_str(), command::source::client);
else else
console::debug("%s tried to %s\n", host_client->name, s); console::debug("%s tried to %s\n", host_client->name, s.c_str());
break; break;
}
case clc_disconnect: case clc_disconnect:
// Sys_Printf ("SV_ReadClientMessage: client disconnected\n"); // Sys_Printf ("SV_ReadClientMessage: client disconnected\n");
return false; return false;
case clc_move: case clc_move:
SV_ReadClientMove (&host_client->cmd); SV_ReadClientMove(&host_client->cmd);
break; break;
} }
} }
@@ -595,33 +567,28 @@ nextmsg:
SV_RunClients SV_RunClients
================== ==================
*/ */
void SV_RunClients (void) void SV_RunClients(void) {
{
int i; int i;
for (i=0, host_client = svs.clients ; i<svs.maxclients ; i++, host_client++) for (i = 0, host_client = svs.clients; i < svs.maxclients; i++, host_client++) {
{
if (!host_client->active) if (!host_client->active)
continue; continue;
sv_player = host_client->edict; sv_player = host_client->edict;
if (!SV_ReadClientMessage ()) if (!SV_ReadClientMessage()) {
{ SV_DropClient(false); // client misbehaved...
SV_DropClient (false); // client misbehaved...
continue; continue;
} }
if (!host_client->spawned) if (!host_client->spawned) {
{
// clear client movement until a new packet is received // clear client movement until a new packet is received
memset (&host_client->cmd, 0, sizeof(host_client->cmd)); memset(&host_client->cmd, 0, sizeof(host_client->cmd));
continue; continue;
} }
// always pause in single player if in console or menus // always pause in single player if in console or menus
if (!sv.paused && (svs.maxclients > 1 || key_dest == key_game) ) if (!sv.paused && (svs.maxclients > 1 || key_dest == key_game))
SV_ClientThink (); SV_ClientThink();
} }
} }
+3 -3
View File
@@ -259,10 +259,10 @@ void V_ParseDamage(void) {
float side; float side;
float count; float count;
armor = MSG_ReadByte(); armor = net_message.read_byte().value();
blood = MSG_ReadByte(); blood = net_message.read_byte().value();
for (i = 0; i < 3; i++) for (i = 0; i < 3; i++)
from[i] = MSG_ReadCoord(cl.protocolflags); from[i] = net_message.read_coord(static_cast<net::rmq_flags>(cl.protocolflags)).value();
count = blood * 0.5 + armor * 0.5; count = blood * 0.5 + armor * 0.5;
if (count < 10) if (count < 10)