用Preload做S/L系统
其实是看了老外的做法的http://www.mapgnome.org/map-archive/470378/scripts/war3map.j
写很简单,关键是读。
call Preload("\" )
call SetPlayerTechMaxAllowed(Player(0),"+I2S(key)+","+I2S(value)+")
//")
这句很神奇,这样可以把任意jass语句写进Preload生成的文件去
加载PreloadGenEnd生成的文件后,用GetPlayerTechMaxAllowed就可以再次读出key和value了
function Save takes integer key, integer value returns nothing
call PreloadGenClear()
call PreloadGenStart()
call Preload("\" )
call SetPlayerTechMaxAllowed(Player(0),"+I2S(key)+","+I2S(value)+")
//")
call PreloadGenEnd("save\\test.txt")
endfunction
function Load takes integer key returns integer
call Preloader("save\\test.txt")
return GetPlayerTechMaxAllowed(Player(0),key)
endfunction
======================
更新一个比较完整的例子
发现一个bug,像call Preloader("save\\test.txt")这样的写法需要注册表开启本地文件读取才能生效 很早以前就发现preload文件可以在地图运行时动态加载,而且你还能在地图运行时修改文件。只是以前还没有办法做到用地图写,只能读而已。所以只能用来动态测试脚本。
现在总算可以写了。其实我是觉得这个漏洞挺不错的。 给力阿! preload的语法检测还特弱。这也是这个空子能钻成的原因之一。
毕竟从设计上讲,不能让你preload失败就没法继续游戏了。
不过也正因为如此,不同步导致掉线的可能性也会高一些,不过这点风险和收益相比就可以忽略了。 楼主很给力。
Mark个标志,以后拿来用。 啊啊啊,刚看完头目的帖子,也在琢磨SL... 这边就实现了...
MB啊MB~ 这里顺便说下,大家可能会奇怪为何楼主不直接由pld设置一个变量然后由游戏主脚本读取,而是要通过设置最大允许科技这样麻烦的方式。
那是因为pld和主脚本的环境是分离的,所以无法互相通过变量来沟通,就像AI脚本和地图主脚本环境是分离的一样。
所以我们需要从一边脚本进行一些会实际改变游戏的操作,然后由另一边脚本来判断这些变化。
所以其实也不是只能限于最大科技这东西,只是这个东西是比较方便的整数型数据而已。比如你甚至可以用pld来创建特殊单位,由主脚本来数。当然实际上这样做就太傻了。
反正只要是更改游戏的操作,并能由另一边侦测到,那就对了。
实际应用中,同步问题也是需要认真考虑的。 单机无敌。 单机你完全可以用GameCache啊。 Mark,虽然我只会无脑复制
File not found,汇报完毕 注册表未开启本地文件读取!就显示这个东西。。。
另外。。发现这个东西。。。也是 本地生成文件但是能saveload 怎么没反应,哪位大牛看看??
从这弄得http://www.thehelper.net/forums/showthread.php/158225-Preloader-based-save-load-system-sync-local-data-system 恩.....原因就如同显示的一样 Windows Registry Editor Version 5.00
"Allow Local Files"=dword:00000001
写这么个注册表文件然后执行一下就可以了。 咕~~(╯﹏╰)b,已经解决了,方法同LS = = 怎么弄那个注册表阿 引用第15楼暗影零号于2011-03-14 12:49发表的 :
怎么弄那个注册表阿 http://bbs.islga.org/images/back.gif
頭目所說的應該是這樣
学习了,我想问一下为什么我在使用本图进行联机测试的时候,会导致队友掉线?其他的朋友遇到过这种情况吗?感觉到很是差异,只是对自身显示字符串而已,怎么看也不会不同步吧,莫非是我理解有误,必须要同步读取本地文件才可以吗?请高人指点迷津啊 用GetLocalPlayer包住读取pld文件的代码,然后用sync函数传给所有人。
演示里只有第一步,要做成多人SL还需要第二步,第二步有很多成熟的代码,我就不献丑了。 感谢楼主回答,看来我理解上有些误区。该好好的去研究一下。