找回密码
 点一下
查看: 15860|回复: 49

用Preload做S/L系统

[复制链接]
发表于 2010-12-29 17:59:15 | 显示全部楼层 |阅读模式
其实是看了老外的做法的
http://www.mapgnome.org/map-archive/470378/scripts/war3map.j

写很简单,关键是读。
[jass]
    call Preload("\" )
    call SetPlayerTechMaxAllowed(Player(0),"+I2S(key)+","+I2S(value)+")
    //")
[/jass]
这句很神奇,这样可以把任意jass语句写进Preload生成的文件去

加载PreloadGenEnd生成的文件后,用GetPlayerTechMaxAllowed就可以再次读出key和value了
save.w3x (17 KB, 下载次数: 165)
[jass]
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
[/jass]

======================
更新一个比较完整的例子
SaveEx.w3x (18 KB, 下载次数: 353)

发现一个bug,像call Preloader("save\\test.txt")这样的写法需要注册表开启本地文件读取才能生效

评分

参与人数 1威望 +10 收起 理由
Renee + 10 不应该太小气,想了想。

查看全部评分

发表于 2010-12-29 18:22:01 | 显示全部楼层
很早以前就发现preload文件可以在地图运行时动态加载,而且你还能在地图运行时修改文件。只是以前还没有办法做到用地图写,只能读而已。所以只能用来动态测试脚本。



现在总算可以写了。其实我是觉得这个漏洞挺不错的。
回复

使用道具 举报

发表于 2010-12-29 18:26:43 | 显示全部楼层
给力阿!
回复

使用道具 举报

发表于 2010-12-29 18:30:51 | 显示全部楼层
preload的语法检测还特弱。这也是这个空子能钻成的原因之一。

毕竟从设计上讲,不能让你preload失败就没法继续游戏了。

不过也正因为如此,不同步导致掉线的可能性也会高一些,不过这点风险和收益相比就可以忽略了。
回复

使用道具 举报

发表于 2010-12-29 19:15:50 | 显示全部楼层
楼主很给力。
Mark个标志,以后拿来用。
回复

使用道具 举报

发表于 2010-12-29 20:42:15 | 显示全部楼层
啊啊啊,刚看完头目的帖子,也在琢磨SL... 这边就实现了...
MB啊MB~
回复

使用道具 举报

发表于 2010-12-30 02:58:49 | 显示全部楼层
这里顺便说下,大家可能会奇怪为何楼主不直接由pld设置一个变量然后由游戏主脚本读取,而是要通过设置最大允许科技这样麻烦的方式。

那是因为pld和主脚本的环境是分离的,所以无法互相通过变量来沟通,就像AI脚本和地图主脚本环境是分离的一样。

所以我们需要从一边脚本进行一些会实际改变游戏的操作,然后由另一边脚本来判断这些变化。

所以其实也不是只能限于最大科技这东西,只是这个东西是比较方便的整数型数据而已。比如你甚至可以用pld来创建特殊单位,由主脚本来数。当然实际上这样做就太傻了。

反正只要是更改游戏的操作,并能由另一边侦测到,那就对了。

实际应用中,同步问题也是需要认真考虑的。
回复

使用道具 举报

发表于 2010-12-30 06:40:27 | 显示全部楼层
单机无敌。
回复

使用道具 举报

发表于 2010-12-30 07:24:44 | 显示全部楼层
单机你完全可以用GameCache啊。
回复

使用道具 举报

发表于 2011-1-17 14:21:16 | 显示全部楼层
Mark,虽然我只会无脑复制

File not found,汇报完毕
回复

使用道具 举报

发表于 2011-1-17 15:06:11 | 显示全部楼层
注册表未开启本地文件读取!就显示这个东西。。。

另外。。发现这个东西。。。也是 本地生成文件  但是能save  load 怎么没反应,哪位大牛看看??

从这弄得http://www.thehelper.net/forums/ ... c-local-data-system

data manager v1.6.w3x

22 KB, 下载次数: 55

回复

使用道具 举报

 楼主| 发表于 2011-1-20 01:27:03 | 显示全部楼层
恩.....原因就如同显示的一样
回复

使用道具 举报

发表于 2011-1-20 01:35:27 | 显示全部楼层
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\\Software\\Blizzard Entertainment\\Warcraft III]
"Allow Local Files"=dword:00000001


写这么个注册表文件然后执行一下就可以了。
回复

使用道具 举报

发表于 2011-1-22 07:21:10 | 显示全部楼层
咕~~(╯﹏╰)b,已经解决了,方法同LS
回复

使用道具 举报

发表于 2011-3-14 12:47:25 | 显示全部楼层
= =
回复

使用道具 举报

发表于 2011-3-14 12:49:45 | 显示全部楼层
怎么弄那个注册表阿
回复

使用道具 举报

发表于 2011-3-14 16:18:03 | 显示全部楼层
引用第15楼暗影零号于2011-03-14 12:49发表的 :
怎么弄那个注册表阿

頭目所說的應該是這樣
註冊.rar (1 KB, 下载次数: 49)
回复

使用道具 举报

发表于 2011-3-15 18:58:19 | 显示全部楼层
学习了,我想问一下为什么我在使用本图进行联机测试的时候,会导致队友掉线?其他的朋友遇到过这种情况吗?感觉到很是差异,只是对自身显示字符串而已,怎么看也不会不同步吧,莫非是我理解有误,必须要同步读取本地文件才可以吗?请高人指点迷津啊
回复

使用道具 举报

 楼主| 发表于 2011-3-16 00:05:14 | 显示全部楼层
用GetLocalPlayer包住读取pld文件的代码,然后用sync函数传给所有人。

演示里只有第一步,要做成多人SL还需要第二步,第二步有很多成熟的代码,我就不献丑了。
回复

使用道具 举报

发表于 2011-3-16 08:06:20 | 显示全部楼层
感谢楼主回答,看来我理解上有些误区。该好好的去研究一下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-12-22 09:33 , Processed in 0.244320 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表