仙五前修改吧 关注:168贴子:15,454
  • 10回复贴,共1

五前修改入门教程

取消只看楼主收藏回复

先睡一觉再更


1楼2014-11-07 13:42回复
    准备工具
    http://tieba.baidu.com/p/3395867455


    本楼含有高级字体3楼2014-12-10 22:52
    回复
      使用方法
      壹:PKG_Extractor_V2.5
      这个是用来解包pkg文件的,可以看到游戏目录下有不少的pkg文件,比如script.pkg,
      config\data.pkg。
      这里顺便解释下解包和封包好了,(按我的理解)封包就是把一些类型或者用途相同的文件封装在一起,例如文件夹或者rar压缩文件都可以算是一种封包,需要相应的程序才能把里面的文件再提取出来,就是解包。解包一般比封包容易(虽然我不会)。
      游戏程序自然是可以识别封包后的文件的,我们在解包出来进行修改之后,一般要重新封包后才能被游戏识别。但是仙五前有一个非常好的优势,就是游戏可以识别、并且会优先读取同文件夹下解包的文件。
      这么说可能有些迷糊,举个栗子就好了:
      用上面的PKG解包软件,可以看到data.pkg里面大都是一些xml格式的文件。

      根据data.pkg的位置,我们在游戏目录\config文件夹下,建立data文件夹。
      然后把data.pkg里面的一个名字为item.xml的文件提取到这个文件夹下

      (因为有图片就分几楼发好了,以免被吞)


      本楼含有高级字体4楼2014-12-10 22:57
      收起回复
        打开提取后的文件我们看到了什么?

        明文啊同学们还是中文的啊一目了然啊
        好吧淡定……
        真是太好懂了,我们把第二行的“止血草”三个字改了,比如改成"创可贴“,然后保存。
        打开游戏(注意,如果游戏已经打开,必须重启才有效果)
        读个有止血草的档,原来的止血草名称是不是就改成了”创可贴“了?
        据说原理是这样的!主程序会到config目录下找data文件夹,里面有item.xml,就读进程序来。然后发现其他的文件都没有,就到config目录下找data.pkg,把里面其他的文件读入游戏。
        怎么样,要改是不是炒鸡轻松啊~~~
        data里面的文件都比较重要,可以考虑把data.pkg整个的提取到data文件夹下,反正也就十几M。
        那么这么多文件的意思是什么?怎么用?请看这里~
        http://tieba.baidu.com/p/3390991372


        本楼含有高级字体5楼2014-12-10 23:09
        收起回复
          接下来就要说到脚本了。script.pkg,这个只有12M的文件,在我看来是整个游戏的灵魂(其余data、音乐贴图什么的都是骨架)。这个文件控制着整个游戏的开始、运行和结束。
          你如果直接用上面的解包程序,解包script.pkg后会得到一些lua格式的文件,如果用记事本查看,会看到乱码。其实这是加了密的脚本,已经有前辈为我们解密了,就是准备工具里面的
          贰:script.zip
          你要做的,就是下载……
          把下载解压后的文件都放到游戏目录\script文件夹下,再改动就可以直接产生效果。不过建议备份,即先解压到一个专门的文件夹存放,因为这个是不能用pkg直接解压的,要是哪个地方改错了就得重新下载了。
          script文件夹下文件超级多,打开大部分都是些英文,看不懂,眼花缭乱怎么办?
          先别急。我们先找到原来的data文件夹下的item.xml,打开,找到止血草的脚本id

          是101对吧!然后我们找到data 文件夹下的scriptlist.ini(我管他叫做脚本索引),用我大记事本的搜索功能,搜索关键字"101=",立马就找到一个地方

          没错这就是我们要的东西。对应关系是止血草→101→item\item001。也就是说item101记录着止血草的脚本。
          这时候找到script\item文件夹下的item001,打开
          我们看到了


          本楼含有高级字体7楼2014-12-12 20:02
          收起回复
            1.挂载脚本
            迄今为止,我们调用脚本都是来自script目录下的lua,它们来自于各种各样的功能,比如skill文件夹内的lua要通过使用相应的仙术来调用, monsterai内的lua要在相应的NPC行动时才会调用。
            现在利用控制台,我们可以随时随地调用我们需要的函数。

            如上图,我们利用"rrun"函数。
            这个函数的使用方法是:"rrun 文件夹 文件名"
            这个文件夹指的是script文件夹作为主目录,例如要调用止血草的脚本,就应该输入
            "rrun item item001"
            这个时候,程序会在script\item目录下寻找item001.lua,立即执行。
            不过这时候系统一定会出错,在我这里反映的情况是直接报错退出。
            为什么呢,因为item001,lua的第一句话就是
            id = player.GetTargetPlayer() --取使用物品的目标ID
            我们这里直接挂载的脚本,根本没有目标可言,而止血草是对目标回复精,于是就会出错啦。
            因此为了避免麻烦,改物品仙术等等调用的脚本还是不要直接挂载使用了。
            现在我们随便进入一场战斗,然后在script目录下新建一个文件a.lua,在其中输入以下文字:
            function a()
            npc.ChangeHP(1,1,0,-50) --敌方全体失去精50%
            end
            然后保存。
            接着进入游戏,确认下敌人都是满血。

            切换到控制台,输入"rrun . a"
            其中那个"."(点)的意思是就在script目录下
            回车,再回去看看敌人的血量

            已经成功实现了效果。
            控制台载入脚本的好处在于,不必一遍遍读档来测试自己的脚本哪里错了,另外还能中途插入一些想干的事情,比如打到一半想直接胜利了就输入battle.End(),想让自己直接挂掉就输入battle.Loose(),很方便。
            注意有的函数可能会报错,玩的时候不要玩脱了,要是报错了就只能重启游戏吧。


            本楼含有高级字体12楼2015-01-02 10:25
            收起回复
              2.输出变量的值
              这个对应脚本中一个函数:global.Print(a).
              举例:敌方血量只有一个血条,我想要知道具体数值怎么办?

              把刚才的a.lua的内容改成以下文字:
              function a()
              a=npc.GetHP(90000,0) --图中草妖的ID为90000,获得其血量精确数值,并赋值给a
              global.Print(a) --在控制台输出a的值
              end
              然后在控制台输入"rrun . a",就会得到以下结果

              那么170就是那个草妖的精确血量值了。
              print的用处很多,例如取随机数的时候我想知道系统取了多少,就可以输出;我一段脚本运行没问题但就是得不到想要的结果,就可以逐个print变量看看到底哪一步出了问题。
              下面举个例子,刚好前几天写的
              function a()
              h=10
              for j=0,9,1 do
              global.Print(h+j)
              player.AddStat(0,1,200,j,1)
              for i=0,9,1 do
              if i~=j then
              player.AddStat(0,1,200,i,1)
              if battle.CheckPlayerStat(1,j)==0 then
              global.Print(i)
              end
              player.RemoveStat(0,1,i
              player.AddStat(0,1,200,j,1)
              end
              end
              player.RemoveStat(0,1,j)
              end
              end
              这个脚本对0~9号的状态进行测试(夏侯得在队),可以得到:
              某编号的状态被加上去之后,哪些0~9状态编号会加不上去。
              当然这个某,是依次取值与0~9的。
              不写注释,如果读者有兴趣的话可以研究研究。


              本楼含有高级字体13楼2015-01-02 10:45
              收起回复
                3.测试脚本的编译错误
                这个其实没必要单独拿出来写,如果多试试就会发现。例如,在脚本a中输入:
                function a()
                a=battle.GetRndNumber(1,100) --a取1~100的随机数
                if a>33 then --如果a>33
                battle.End() --战斗立即结束
                end
                然后进入战斗并且执行脚本,会得到如下结果

                意思是少了个end。当然人家是机器,它说你少了end不代表就真是少了end,但至少证明脚本的结构是存在问题的,这样也可以迅速排查问题,不至于重复试验发现自己栽在了最基本的地方。
                另外,如果你脚本中用了程序没有的函数,或者函数用错了,控制台都会给出提示的。


                本楼含有高级字体14楼2015-01-02 10:53
                收起回复
                  总而言之,进入游戏一般都要通过Pal5Q_ScriptHelper来运行,除非你确认自己用不到。因为有了这个,实在是方便的很呐


                  15楼2015-01-02 10:55
                  回复
                    伍、UI.pkg
                    http://tieba.baidu.com/p/3780775275
                    UI记录了游戏界面的一些东西,也是xml格式的,与data不同,属性大多是英文的,不容易理解。
                    上面的链接对UI的文件进行了一些简要的介绍。


                    本楼含有高级字体17楼2015-05-23 22:58
                    回复
                      柒、global.sav
                      这个文件也是以二进制流存储,存在Save目录下,平时可变,内容极少,重要作用是可以修改已经获得的称号。
                      文件结构研究报告:http://tieba.baidu.com/p/3598677000
                      global.sav修改器:http://tieba.baidu.com/p/3719674900


                      本楼含有高级字体19楼2015-05-23 23:17
                      回复