希瓦 发表于 2011-6-9 22:47:08

一个简单强大的ORPGSL系统

本帖最后由 希瓦 于 2018-6-20 11:59 编辑

系统原理

利用Preload系列函数在本地储存与读取数据

系统作用

在本地储存与读取数据,使地图可以接着上次玩

系统代码


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号数据用来储存数据数量


使用环境

1)支持多玩家
2)支持魔兽所有版本
3)不需要使用ORPG登陆器
4)读档必须开启Allow Local Files注册表项

使用方法

1)使用前,先将代码拷贝到地图的自定义代码区


2)然后,将触发复制到地图中,并根据需求进行修改




3)演示地图在此下载

需要红狼UI(或更新的UI)才能打开


注意事项

1)作者注意事项
    1)不能在“地图初始化”的时候读取存档
    2)读档需要一段同步时间,所以推荐在“游戏开始0.00秒”时读档
    3)如果想要每个英雄一个存档,也可以在选英雄的时候读档,并使用英雄名来做存档文件名
    4)数据读取到缓存中时,类别名即为玩家序号,使用名为数据序号(0号数据用来储存数据数量)
    5)读档时可以通过检查0号数据来判断读档是否成功,存档时必须将数据数量储存到第0号数据当中
    6)每个存档最多储存3000个数据,如果想要储存更多的数据,可以把数据分成几个文件(注意修改缓存文件名)
    7)如果存档数据超过2000,你需要把“储存数据到缓存”和“储存缓存到文件”分开,以避免超过循环次数上限
    8)单玩家游戏读档时只需要0.1秒的同步时间;多玩家游戏时,同步时间会随数据量的增加而呈非线性增长
    9)可以将读档和存档的触发写在“本地玩家”的条件判断中,以实现对指定玩家的读档和存档功能
    10)请在地图完成后使用SLK优化器对地图进行优化,不然可能会导致地图在联机时可能掉线

2)玩家注意事项
    1)想要正常读取存档,必须先开启魔兽读取本地文件的注册表项,下载在此
         
    2)开启注册表项后如果联机掉线,说明魔兽目录中的本地文件覆盖了魔兽文件
         可以关闭注册表项后联机(不能读档),或者使用下面的工具来清理一下魔兽目录
         

扩展功能

除了上面的函数之外
这里还有一些扩展函数可供使用

通过使用它们可以实现下面的效果
    1)存档加密
    2)为指定玩家读取或保存数据
    3)读取数据并等待直到同步结束
    4)字符串的储存和读取(支持中文)
    5)以本地字符串的形式储存存档列表
详细使用方法请参考下面的演示地图


本文到了这里已经到了结尾,希望能对你有所帮助吧
如果你在使用本系统的过程中遇到了什么问题,或者有什么其他需求,可以发信息给我,我会尽量提供技术支持的:)

幻之皮卡丘 发表于 2011-6-9 23:51:13

希瓦好敬业啊,来顶下

铁梅 发表于 2011-6-11 00:24:57

貌似有个战役叫做什么“精灵游侠”什么的,
打过一遍之后,即使删除了通关记录文件W3j什么的,
再重新开始也仍然是十级,
也还保存了物品属性什么的,
不知道这什么的跟那什么的有没有啥关系?

疯人¢衰人 发表于 2011-6-11 10:39:57

可惜无法本地加密……

希瓦 发表于 2011-6-11 11:01:51

正在改进优化,我准备把它做成UI~~
加密倒不是难事,只是加密算法是个问题~

疯人¢衰人 发表于 2011-6-11 11:44:45

问题在于你的加密脚本本身就在j中,拆开就全部知道了……

希瓦 发表于 2011-6-11 12:29:22

所以只需要用简单的字符替换来加密就可以了吧……
毕竟再好的加密也挡不住会JASS的人……

疯人¢衰人 发表于 2011-6-11 14:26:42

不过需要一个效验算法,省的瞎填都会有效

xiaojiao 发表于 2011-6-12 00:38:24

哈哈哈....

4133789 发表于 2011-6-12 08:55:09

强大.支持希瓦.

cynsw 发表于 2011-6-12 17:10:57

ORPGSL系统.w3x (15 K) 下载次数:0

AllowLocalFiles.rar (1 K) 下载次数:0

一幅ORPG地图.w3x (19 K) 下载次数:4

。。看来大家比较关心那张地图~~

麦德三世 发表于 2011-6-13 19:14:55

非常之好~~希瓦加油啊~~

希瓦 发表于 2011-6-13 19:36:06

嗯嗯~真开心~
谢谢头目大人~~
我会继续努力完善它的~~

lo 发表于 2011-6-14 15:45:54

希瓦缺德啊……居然用那样的方法骗我下载……不过倒也不能全怪希瓦,都是绝影提出来的……

麦德三世 发表于 2011-6-14 16:26:27

什么方法骗你下载?

希瓦 发表于 2011-6-14 16:36:12

有人说想玩我做的地图~
我就在群里面放出过下载的链接~
结果就是这样了~~

leisel 发表于 2011-6-15 16:26:41

这个贴是为我准备的么?小弟的暗黑图IMPK风云再起正想往这个方向优化S/L系统
真是踏破草鞋无处寻得来全不费工夫- -!!



问一下老大,此系统能否实现完美支持1.24?可支持多人游戏?
相当的期待

actboy168 发表于 2011-6-15 17:20:24

这个...离用于实际地图中还有蛮远的差距吧,楼上可能要失望了

希瓦 发表于 2011-6-15 18:14:41

这个系统虽然很简单,但是其实她已经能够独当一面了呢;
她支持魔兽的所有版本的,支持多玩家;
并且经过多次测试,并没有出现掉线问题。

只是需要注意几点:
1)如果数据太多了的话,最好分成几个文件来储存
2)要使用这个系统,必须开启Allow Local Files的注册表项

如果你想先试试其它的SL系统的话
可以试试U9枫霜前辈制作的ORPG系统
也可以试试楼上的actboy168前辈制作的YDWE的SL系统。

而如果你决定了使用这个SL系统
那么我可是一个认真负责的技术顾问哦~~欢迎随时反馈各种意见以及建议~~

希瓦 发表于 2011-6-15 18:51:14

引用第17楼leisel于2011-06-15 16:26发表的:
这个贴是为我准备的么?小弟的暗黑图IMPK风云再起正想往这个方向优化S/L系统
真是踏破草鞋无处寻得来全不费工夫  - -!!



....... images/back.gif

你的地图使用的是记录码储存系统吧?
如果你感兴趣的话,等我上晚自习回来后,写一个可以直接储存/读取记录码的演示出来~
你可以移植试试~
页: [1] 2 3 4 5
查看完整版本: 一个简单强大的ORPGSL系统