rimworld吧 关注:220,807贴子:3,738,272

代码讲解(大雾),自己写的mod中的一个boss:蠕动的梦魇

只看楼主收藏回复


不要在意贴图哦?


1楼2021-10-03 14:44回复
    首先是xml方面的代码,这里没什么好讲的,主要是DLL层面的代码


    2楼2021-10-03 14:46
    回复
      这是这个生物的ThingClass,大部分内容都在这里面


      3楼2021-10-03 14:48
      回复
        首先,我们第一个要写的功能是这个,让这个Pawn有一个特殊的属性


        4楼2021-10-03 14:50
        回复
          那么,我们应该怎么做?

          首先在这个生物的ThingClass里定义一个新的属性"mass",初始值为1000

          然后就是我们要重写父类Pawn里的ExposeData的方法,这个方法的用处是在读档存档时序列化和反序列化,就是保存你的这个数值,不然一读档就会重新被赋予默认值,然后保存就是太难自带的一个方法Scribe


          5楼2021-10-03 14:56
          回复
            然后这个功能就基本实现了,但这个属性目前还只是一个空壳,让我们继续实现下一个功能

            受到攻击时会减少质量值而不是受到伤害,其实这个说法有点问题,实际作用是受到伤害不会有伤口而是减少质量值,那怎么实现呢?

            在Pawn这个类里有个函数是Pawn受到伤害前运行的,然后这个函数out了一个bool"absorbed,当这个bool为true时,这个伤害不会留下伤口

            我们就直接在函数开头就把这个赋值为true就能实现一半的功能了


            6楼2021-10-03 15:04
            收起回复
              然后就是减少质量值

              参数dinfo里包含受到伤害的各种属性
              里面有个属性就是这个伤害的def,然后太难在原版里内置一个DamageDefOf里面有原版大多数的伤害的def
              我们写if检测伤害是不是EMP或眩晕和烟,毕竟因为这几个东西就损失质量值有点过于奇怪了,不是吗?


              7楼2021-10-03 15:08
              回复
                太深奥了


                IP属地:广东来自Android客户端8楼2021-10-03 15:11
                回复
                  看不懂,但很厉害


                  IP属地:安徽来自iPhone客户端9楼2021-10-03 15:15
                  回复

                    然后这里对应的这个特性
                    其中概率是用的太难的一个方法来获取的,不建议用system的那个,会和联机mod不兼容
                    当这个条件成立时,直接终止这个函数的运行


                    10楼2021-10-03 15:21
                    回复


                      然后就是以上流程通过后就是让质量减去这个伤害的伤害量(Amount的十分之一),可能有点太离谱了x,之后应该会调整一下,之后再加一个判定如果mass小于等于0直接执行另一个方法,这个方法是要我们自己写的


                      11楼2021-10-03 15:26
                      回复

                        就是这个方法,前面是另一特性需要的
                        我们要在意的后两行,分别是,第一行杀死这个Pawn,下一行就是把这个Pawn的尸体给Destroy,就是直接删除掉,使其消失


                        12楼2021-10-03 15:31
                        收起回复

                          然后就是减少一定的质量值直接生成一个无定形血肉,这个无定形血肉是我mod中的一个生物
                          我们在xml写了Def怎么让DLL里获取?
                          有两种方法
                          第一种适合只在一些地方需要的def,不会经常需要

                          大部分def类型都有这个方法可以直接用def的名字来获取def
                          (如果没有的就照抄这个方法的内容就行)
                          第二种

                          原版中就是诸如ThingDefOf,PawnKindDefOf等包含很多Def的类
                          我们直接照抄就行

                          好孩子不要和我学这样写(),建议一个DefOf只存一个类型的Def,然后类名就和原版那种一样


                          14楼2021-10-03 15:47
                          回复
                            大佬能教教dll文件怎么写么


                            IP属地:广西来自Android客户端15楼2021-10-03 15:47
                            收起回复