|
发表于 2024-1-23 17:27:44
|
显示全部楼层
谢谢大鹅分享, mark一下
关于top职业变身的攻击特殊动画特效
为了让代码更漂亮一点,看起来更整洁,调用JAVA8的API(低版本JAVA可能是无法使用的)
if (IntRange.includes(_pc.getTempCharGfx(), 13715, 13745)) { // 这又是自己写的一个参数,避免频繁写出 if (a >= x && a <=y)之类的东西
if (attackgfx > 0 && attackgfx != 13396) { // 空手以及奇古兽以外的攻击特效
if (_pc.getTempCharGfx() != 13731 && _pc.getTempCharGfx() != 13733) { // 不是真黑妖外型
if (_random.nextInt(100) < 20) { // 20%机率出现特效
L1NpcInstance dummy = L1SpawnUtil.spawnS(_target.getLocation(), 86132,
_pc.get_showId(), 1, _pc.getHeading());
// 一般情况下这里需要 if (dummy != null) 或者 assert dummy != null;
// 但是为了让代码更漂亮一点 我们调用JAVA8的API
Optional.ofNullable(dummy)
.ifPresent(u -> dummy.broadcastPacketAll(new S_NPCPack(dummy)));
Optional.ofNullable(dummy)
.ifPresent(u -> dummy.broadcastPacketAll(new S_SkillSound(dummy.getId(), attackgfx)));
}
} else if (_dark) { // 真黑妖重击或双击必出特效
L1NpcInstance dummy = L1SpawnUtil.spawnS(_target.getLocation(), 86132,
_pc.get_showId(), 1, _pc.getHeading());
Optional.ofNullable(dummy)
.ifPresent(u -> dummy.broadcastPacketAll(new S_NPCPack(dummy)));
Optional.ofNullable(dummy)
.ifPresent(u -> dummy.broadcastPacketAll(new S_SkillSound(dummy.getId(), attackgfx)));
}
}
_pc.sendPacketsAll(new S_AttackPacketPc(_pc, _target, 0, _damage));
}
复制代码
当然,为了代码更漂亮,我们还可以把这一段的同类参数提取出来,然后其他地方用的时候就只需要写短短一行就ok了。
/**
* 另类的特效处理
* @param pc 触发对象
* @param cha 受攻击对象
* @param gfx_id 特效图档
*/
private static void sendSkillGfx(L1PcInstance pc, L1Character cha, int gfx_id) {
L1NpcInstance dummy = L1SpawnUtil.spawnS(cha.getLocation(), 86132,
pc.get_showId(), 1, pc.getHeading());
Optional.ofNullable(dummy)
.ifPresent(u -> dummy.broadcastPacketAll(new S_NPCPack(dummy)));
Optional.ofNullable(dummy)
.ifPresent(u -> dummy.broadcastPacketAll(new S_SkillSound(dummy.getId(), gfx_id)));
}
复制代码
于是上面那段就可以改成
if (IntRange.includes(_pc.getTempCharGfx(), 13715, 13745)) {
if (attackgfx > 0 && attackgfx != 13396) { // 空手以及奇古兽以外的攻击特效
if (_pc.getTempCharGfx() != 13731 && _pc.getTempCharGfx() != 13733) { // 不是真黑妖外型
if (_random.nextInt(100) < 20) { // 20%机率出现特效
sendSkillGfx(_pc, _target, attackgfx);
}
} else if (_dark) { // 真黑妖重击或双击必出特效
sendSkillGfx(_pc, _target, attackgfx);
}
}
_pc.sendPacketsAll(new S_AttackPacketPc(_pc, _target, 0, _damage));
}
复制代码
当然,top职业变身的这些特效,还可以有其他的写法,毕竟每次 spawnS 都会占用一个objid,所以我们需要取得当前角色的面向,再由被攻击对象来发送封包就行了,只是这么写逻辑会更复杂一些,需要变动的东西会更多一些,不建议新手使用。
emmm 接着发个广告 圣子默默的个人空间_哔哩哔哩_bilibili 欢迎大家留言提供想法,我负责实现。 |
|