本篇教程由作者设定未经允许禁止转载。

声明:本文基于1.12.2,仅为作者本人分析所得,不保证100%准确,欢迎指出错误或提供建议。


名词链接:

    tick(mcmod)(mcwiki):默认20tick每秒,具体以游戏内tps(tick per second)为准。


混沌守卫弹射物:(Java类类名:EntityGuardianProjectile.class)


属性:

int type = 0;(弹射物类型值,取下方类型列表中的一个值)
EntityLivingBase target;(该弹射物的目标实体,通常为玩家)
Entity shooter;(发射人,指发出弹射物的混沌守卫)
float power;(威力数值)
boolean isChaser;(是否为追踪弹,为只有是非两种状态的布尔值)
float heath = 5F;(弹射物的生命值,也就是说弹射物可以被杀死)(原文就是heath,我猜是拼错了)


类型列表:

带有轨迹的大火球,拥有大范围燃烧伤害

FIREBOMB = 1; 粒子颜色:0xFF,0x66,0x00。
击中玩家后将玩家传送走的传送球
TELEPORT = 2; 粒子颜色:0,0,0。
遇到方块爆炸(不能穿墙)的橙色火焰追踪弹
FIRE_CHASER = 3; 粒子颜色:0xFF, 0x66, 0。
能穿墙的橙色能量追踪弹
ENERGY_CHASER = 4; 粒子颜色:0,0xFF,0xFF。
红色混沌追踪弹,击中目标或被杀死后分裂成迷你追踪弹,这些迷你能量弹同样会追踪玩家
CHAOS_CHASER = 5; 粒子颜色:0x44,0,0。

迷你追踪弹
MINI_CHAOS_CHASER = 6; 粒子颜色:0x44,0,0。

复活水晶的绿色充能球
IGNITION_CHARGE = 7; 粒子颜色:0xFF,0xFF,0xFF。


三种伤害源类型(DamageSources):

        守卫者火球,魔法伤害,爆炸伤害

 damageFireball=DamageSource("de.GuardianFireball").setMagicDamage().setExplosion();

 守卫者能量球,无视护甲属性
 damageEnergy=DamageSource("de.GuardianEnergyBall").setDamageBypassesArmor();

 守卫者混沌球,无视护甲属性,为绝对伤害(绝对伤害意为:作为药水时造成全部伤害(原版))
 damageChaos=DamageSource("de.GuardianChaosBall").setDamageBypassesArmor().setDamageIsAbsolute();

 

 注:在配置文件开启guardianCanKillCreative(意为混沌守卫可以击杀创造)后皆可对创造玩家造成伤害(默认开启),这个配置项开启时根据能量护盾的机制可以加倍消耗能量护盾。

 

初始化:

    如果弹射物类型为其中之一,则对方块来说没有碰撞箱(noClip),也即可以穿墙:

ENERGY_CHASER

CHAOS_CHASER

MINI_CHAOS_CHASER

IGNITION_CHARGE

 

弹射物 heath 降低逻辑:

    存在时间大于5tick时,heath 减去玩家和箭造成的伤害(也就是说可以被攻击)。

    如果造成伤害的是箭,则让箭消失。

    生命值小于等于0时产生半径为2的爆炸。

 

首个tick:

    向客户端同步type(弹射物类型值)。

 

每个弹射物在每tick执行的逻辑:

    如果发出时没有目标则在以弹射物自身为中心,60格范围内寻找最近玩家为目标(包含创造玩家),如果未找到则弹射物消失。

    如果是追踪弹,则修改motion,具体逻辑:

        double x = (target.posX - posX) / tDist;

        double y = (target.posY - posY - -1) / tDist;

        double z = (target.posZ - posZ) / tDist;

        // 三元运算符

        double speed = type == CHAOS_CHASER ? 0.15D : 0.1D;

        motionX /= 1.1;

        motionY /= 1.1;

        motionZ /= 1.1;

        motionX += x * speed;

        motionY += y * speed;

       motionZ += z * speed;

       motion是个很复杂的东西,具体原理在此处不多赘述,有兴趣的可以自行寻找用法。

       总的来说,这段代码实现了让弹射物向玩家的方向运动。

    执行移动。

    目标检查:

        genericHit = 检查是否碰到实体 或 与 target 的距离小于1,满足这两个条件中任意一个时该值为true。

        伤害逻辑:

           FIREBOMB

              genericHit为true、碰到方块、存在时间大于600tick或 heath 小于等于0时:

                  造成半径为两格的爆炸。

                  对 power 半径内的生物造成等于 power * 2damageFireball类型的伤害。

           TELEPORT:

              genericHit 为 true 时:

                  以 shooter 为中心对触碰到的目标随机传送,若 shooter 不存在则以弹射物自身为中心,

                      随机半径:

                        x:cos( 随机整数 ) * 600。

                        y:小于 255 的随机整数。

                        z:sin( 随机整数 ) * 600。

                  对目标实体造成10点摔落伤害。

              genericHit 为 false 并且满足碰到方块、存在时间大于 400tick(20s)、heath 小于等于 0 ,三个条件之一时:

                  消失。

           FIRE_CHASER:

              如果存在时间小于 60tick(3s),则设置为无法碰撞。

              genericHit 为 true、碰到方块、存在时间大于 400tick 或 heath 小于等于 0 时:

                  造成半径为两格的爆炸。

                  对 power 半径内的生物造成 power * 2damageFireball 类型的伤害。

           ENERGY_CHASER:

              genericHit 为 true、存在时间大于 800tick(40s)或 heath 小于等于 0 时:

                  对半径 power 的范围内造成 power * 3damageEnergy 类型的伤害。

           CHAOS_CHASER:

              genericHit 为 true、存在时间大于 800tick(40s)或 heath 小于等于 0 时:

                  对半径 power 的范围内造成 power * 3 damageChaos 类型的伤害。

           生成3~6个 power / 2 的 MINI_CHAOS_CHASER。

           MINI_CHAOS_CHASER:

                genericHit 为 true、存在时间大于 800tick 或 heath 小于等于 0 时:

                    对半径 power 的范围内造成 power * 3 damageChaos 类型的伤害。

 

鸣谢:

       Azazel(订正了一点内容,补充了一点描述,润色)。