Lin-JN 发表于 2023-4-19 04:52:57

今天闲的,再来点干货,懂的自取

关于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 欢迎大家留言提供想法,我负责实现。

dk52 发表于 2023-4-29 13:03:56

6666666666666666

shaomin365 发表于 2023-5-17 13:19:27

感谢感谢 已投币关注

allensteven 发表于 2023-6-8 16:46:56

感謝分享!

rumengtingxue 发表于 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 欢迎大家留言提供想法,我负责实现。

OSAKAGTO 发表于 2024-1-26 14:02:16

感謝大哥 666666666666
页: [1]
查看完整版本: 今天闲的,再来点干货,懂的自取