|
本帖最后由 希瓦 于 2018-6-20 11:59 编辑
系统原理
利用Preload系列函数在本地储存与读取数据
系统作用
在本地储存与读取数据,使地图可以接着上次玩
系统代码
[jass]
function SyncInteger takes gamecache gc, string missionKey, string key, integer value returns nothing
local integer oldValue = GetStoredInteger(gc, missionKey, key)
call StoreInteger(gc, missionKey, key, value)
call SyncStoredInteger(gc, missionKey, key)
call StoreInteger(gc, missionKey, key, oldValue)
endfunction
function LoadFile takes string file, gamecache gc returns nothing
local string userId = I2S(GetPlayerId(GetLocalPlayer()) + 1)
local integer count
local integer index
// Load data from file
call SetPlayerTechMaxAllowed(Player(12),0,2147483647)
call Preloader(file)
set count = GetPlayerTechMaxAllowed(Player(12),0)
if(count > 3000)then
set count = 0
endif
// Sync data in the cache
call SyncInteger(gc, userId, "0", -1)
set index = 1
loop
exitwhen (index > count)
if (GetPlayerTechMaxAllowed(Player(12), index) == 0) then
call SyncInteger(gc, userId, I2S(index), GetPlayerTechMaxAllowed(Player(13), index))
else
call SyncInteger(gc, userId, I2S(index), -GetPlayerTechMaxAllowed(Player(13), index) - 1)
endif
set index = index + 1
endloop
// Use 0 as count
call SyncInteger(gc, userId, "0", count)
endfunction
function SaveFile takes string file, gamecache gc returns nothing
local string userId = I2S(GetPlayerId(GetLocalPlayer()) + 1)
local integer count = GetStoredInteger(gc, userId, "0")
local integer index
local integer value
// Use preload bug to save data
call PreloadGenClear()
call PreloadGenStart()
call Preload("\")
call SetPlayerTechMaxAllowed(Player(12), 0, " + I2S(count) + ") //")
set index = 1
loop
exitwhen(index > count)
set value = GetStoredInteger(gc, userId, I2S(index))
if(value >= 0)then
call Preload("\")
call SetPlayerTechMaxAllowed(Player(12), " + I2S(index) + ", 0)
call SetPlayerTechMaxAllowed(Player(13), " + I2S(index) + ", " + I2S(value) + ") //")
else
call Preload("\")
call SetPlayerTechMaxAllowed(Player(12), " + I2S(index) + ", 1)
call SetPlayerTechMaxAllowed(Player(13), " + I2S(index) + ", " + I2S(-(value + 1)) + ") //")
endif
set index = index + 1
endloop
call Preload("\")
return //")
call PreloadGenEnd(file)
endfunction
//LoadFile函数用于读档,可以将文件file里面储存的数据读取到游戏缓存gc里面
//SaveFile函数用于存档,可以把游戏缓存gc里面储存的数据储存到文件file里面
//数据储存在缓存中,类别名即为玩家序号,使用名为数据序号,0号数据用来储存数据数量
[/jass]
使用环境
1)支持多玩家
2)支持魔兽所有版本
3)不需要使用ORPG登陆器
4)读档必须开启Allow Local Files注册表项
使用方法
1)使用前,先将代码拷贝到地图的自定义代码区
2)然后,将触发复制到地图中,并根据需求进行修改
3)演示地图在此下载
ORPG演示.w3x
(16.14 KB, 下载次数: 466)
需要红狼UI(或更新的UI)才能打开
Red_Wolf UI V1.2.2.rar
(262.77 KB, 下载次数: 234)
注意事项
1)作者注意事项
1)不能在“地图初始化”的时候读取存档
2)读档需要一段同步时间,所以推荐在“游戏开始0.00秒”时读档
3)如果想要每个英雄一个存档,也可以在选英雄的时候读档,并使用英雄名来做存档文件名
4)数据读取到缓存中时,类别名即为玩家序号,使用名为数据序号(0号数据用来储存数据数量)
5)读档时可以通过检查0号数据来判断读档是否成功,存档时必须将数据数量储存到第0号数据当中
6)每个存档最多储存3000个数据,如果想要储存更多的数据,可以把数据分成几个文件(注意修改缓存文件名)
7)如果存档数据超过2000,你需要把“储存数据到缓存”和“储存缓存到文件”分开,以避免超过循环次数上限
8)单玩家游戏读档时只需要0.1秒的同步时间;多玩家游戏时,同步时间会随数据量的增加而呈非线性增长
9)可以将读档和存档的触发写在“本地玩家”的条件判断中,以实现对指定玩家的读档和存档功能
10)请在地图完成后使用SLK优化器对地图进行优化,不然可能会导致地图在联机时可能掉线
2)玩家注意事项
1)想要正常读取存档,必须先开启魔兽读取本地文件的注册表项,下载在此
开关读档功能.rar
(440 Bytes, 下载次数: 198)
2)开启注册表项后如果联机掉线,说明魔兽目录中的本地文件覆盖了魔兽文件
可以关闭注册表项后联机(不能读档),或者使用下面的工具来清理一下魔兽目录
魔兽目录清理工具.rar
(754 Bytes, 下载次数: 134)
扩展功能
除了上面的函数之外
这里还有一些扩展函数可供使用
通过使用它们可以实现下面的效果
1)存档加密
2)为指定玩家读取或保存数据
3)读取数据并等待直到同步结束
4)字符串的储存和读取(支持中文)
5)以本地字符串的形式储存存档列表
详细使用方法请参考下面的演示地图
字符串存档系统演示.w3x
(15.86 KB, 下载次数: 433)
本文到了这里已经到了结尾,希望能对你有所帮助吧
如果你在使用本系统的过程中遇到了什么问题,或者有什么其他需求,可以发信息给我,我会尽量提供技术支持的:)
|
评分
-
查看全部评分
|