本篇教程由作者设定未经允许禁止转载。
声明:本文基于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 * 2 的 damageFireball类型的伤害。
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 * 2 的 damageFireball 类型的伤害。
ENERGY_CHASER:
genericHit 为 true、存在时间大于 800tick(40s)或 heath 小于等于 0 时:
对半径 power 的范围内造成 power * 3 的 damageEnergy 类型的伤害。
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(订正了一点内容,补充了一点描述,润色)。