物集大话系列通用的热更工具
本帖最后由 long760418 于 2025-4-4 13:36 编辑最近一直在研究物集大话系的热更问题,论坛里有一个帖子,但是测试后效果不好。
原贴地址:https://www.iopq.net/forum.php?mod=viewthread&tid=17133875
原理如下:服务端和客户端都有update文件夹。
服务端update文件夹存放一个版本txt文件,内容有版本号。另外存放一个zip的更新文件。
客户端update文件夹存放一个版本txt文件,内容有版本号。另外有一个热更配置文件。
客户端有一个exe的启动热更程序文件,每次启动后检查客户端txt文件版本号是否和服务端版本号一致,如果小于服务端版本号,则需要热更新
客户端根据配置文件,从服务端指定位置下载热更文件,格式zip。然后自动解压到客户端游戏根目录下替换原有文件,最后运行指定大话客户端程序。
static/image/hrline/1.gif
我的测试环境为虚拟机桥接模式,服务端在虚拟机内,本机运行客户端。
出现的问题:前面步骤都正常,最后自动解压不成功。根据楼主所示用好压和其他压缩软件均不能解决问题。
我的解决方案:针对问题,既然不能自动解压,那就我来让它自动解压。配置文件里最后运行的指定大话客户端程序替换为我的自解压程序exp.exe
我编译的exp.exe文件里主要功能是调用7z的命令解压方式自动解压热更包,然后再调用热更后的大话客户端程序。经测成功。
但是我这种方式虽然解决了自动解压的问题,缺陷是每次启动都要下载覆盖解压客户端程序,对电脑硬盘有伤害。
此贴关闭,本人已经成功解决,更新于2025-4-4
本帖最后由 i85201314 于 2025-3-30 18:45 编辑
看能不能用bat批处理来解决,写判断,这样就可以避免每次更新,具体使用deepseek,应为我对批处理一点也不熟。
deepseek写的
提示词:
写一个批处理脚本,比对远程文件的版本号和本地的版本号,这个版本号是保存在一个txt文本里,若如本地版本号小于远程版本号的文件就开启更新程序gengxing.exe更新完以后结束gengxing.exe启动客户端程序KEHUDUAN.exe
<span class="token" style="color: rgb(64, 120, 242);">@</span><span class="token command" style="color: rgb(166, 38, 164);">echo</span><span class="token command"> off</span>
setlocal enabledelayedexpansion
:: 配置文件路径
set "remote_file=\\192.168.1.100\version.txt":: 远程版本文件地址(@ref)
set "local_file=C:\App\version.txt" :: 本地版本文件路径
set "update_exe=C:\App\gengxing.exe" :: 更新程序路径
set "client_exe=C:\App\KEHUDUAN.exe" :: 客户端程序路径
:: 提取版本号函数
:GetVersion
set "version="
for /f "usebackq tokens=*" %%i in ("%1") do (
set "line=%%i"
:: 匹配类似"ver. 1.2.3"的版本格式(@ref)
for /f "tokens=3 delims=. " %%v in ("!line!") do set "version=%%v"
)
exit /b
:: 主逻辑
call :GetVersion "%remote_file%" && set "remote_ver=!version!"
call :GetVersion "%local_file%"&& set "local_ver=!version!"
if "%remote_ver%"=="" (
echo 远程版本号获取失败
pause
exit /b
)
if "%local_ver%"=="" (
echo 本地版本号获取失败
pause
exit /b
)
:: 分割版本号为数字段(@ref)
for /f "tokens=1-3 delims=." %%a in ("%remote_ver%") do (
set "r_major=%%a" & set "r_minor=%%b" & set "r_patch=%%c"
)
for /f "tokens=1-3 delims=." %%a in ("%local_ver%") do (
set "l_major=%%a" & set "l_minor=%%b" & set "l_patch=%%c"
)
:: 版本比较逻辑(@ref)
set "need_update=0"
if !r_major! gtr !l_major! (set need_update=1)
if !r_major! equ !l_major! (
if !r_minor! gtr !l_minor! (set need_update=1)
if !r_minor! equ !l_minor! (
if !r_patch! gtr !l_patch! (set need_update=1)
)
)
if %need_update% equ 1 (
echo 发现新版本 !remote_ver!,开始更新...
start "" "%update_exe%":: 启动更新程序(@ref)
:: 等待更新完成
:wait_update
tasklist | find /i "gengxing.exe" >nul
if !errorlevel! equ 0 (
timeout /t 5 >nul
goto wait_update
)
echo 更新完成,启动客户端...
start "" "%client_exe%":: 启动客户端(@ref)
) else (
echo 当前已是最新版本 !local_ver!
)
endlocal
i85201314 发表于 2025-3-30 18:30
看能不能用bat批处理来解决,写判断,这样就可以避免每次更新,具体使用deepseek,应为我对批处理一点也不 ...
感谢回答,但是你上面这个批处理里哪里有关于解压的部分,我没有看出来。重点就是有更新后的解压!原更新主程序也是解压有问题,判断和运行客户端部分都正常。 long760418 发表于 2025-3-30 19:08
感谢回答,但是你上面这个批处理里哪里有关于解压的部分,我没有看出来。重点就是有更新后的解压!原更新 ...
@echo off
setlocal enabledelayedexpansion
:: 配置参数
set "remote_url=http://your-server.com/version.txt" (@ref)
set "local_version=C:\path\to\local\version.txt" (@ref)
set "7z_path=C:\Program Files\7-Zip\7z.exe" (@ref)
set "update_pkg=gengxiangbao.zip"
set "target_dir=C:\Program Files\YourApp"
set "update_flag=0"
:: 下载远程版本文件
powershell -Command "(New-Object Net.WebClient).DownloadFile('%remote_url%', 'remote.tmp')" || (
echo 远程版本文件下载失败
exit /b 1
) (@ref)
:: 提取版本号(假设版本格式为 ver. X.X.X)
for /f "tokens=3" %%i in ('findstr /i "ver." remote.tmp') do set "remote_ver=%%i"
for /f "tokens=3" %%i in ('findstr /i "ver." "%local_version%"') do set "local_ver=%%i"(@ref)
:: 版本号比较逻辑
call :CompareVersions "%remote_ver%" "%local_ver%"
if %update_flag% equ 1 (
echo 发现新版本 %remote_ver%,开始更新流程...
:: 执行更新程序
start /wait "" "gengxing.exe" (@ref)
taskkill /f /im "gengxing.exe" >nul 2>&1
:: 解压更新包
"%7z_path%" x "%update_pkg%" -o"%target_dir%" -y(@ref)
:: 启动客户端
start "" "%target_dir%\KEHUDUAN.exe" (@ref)
) else (
echo 当前版本 %local_ver% 已是最新
)
del remote.tmp
exit /b
:CompareVersions
set "v1=%~1"
set "v2=%~2"
:: 使用sort进行版本比较(需GNU工具支持)
echo %v1% > v.tmp
echo %v2% >> v.tmp
sort /R v.tmp /O sorted.tmp >nul
set /p newer=<sorted.tmp
if "%v1%" neq "%newer%" (
set update_flag=0
) else (
if "%v1%" neq "%v2%" set update_flag=1
)
del v.tmp sorted.tmp
goto :eof
你也可以自己使用deepseek,提需求的方式来问 deepseek不是万能的,还是感谢。 支持一下,希望看到更多内容! 正需要这个,谢谢分享! 内容充实,感谢楼主! 高水平的帖子,支持一下: 水平太高了!测试成功! 很实用的帖子,已学习
页:
[1]