查看: 1012|回复: 5

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

[复制链接]

22

主题

124

帖子

524

积分

高级会员

Rank: 4

积分
524
发表于 2023-4-19 04:52:57 | 显示全部楼层 |阅读模式
关于top职业变身的攻击特殊动画特效

为了让代码更漂亮一点,看起来更整洁,调用JAVA8的API(低版本JAVA可能是无法使用的)

  1.                 if (IntRange.includes(_pc.getTempCharGfx(), 13715, 13745)) { // 这又是自己写的一个参数,避免频繁写出 if (a >= x && a <=y)之类的东西
  2.                     if (attackgfx > 0 && attackgfx != 13396) { // 空手以及奇古兽以外的攻击特效
  3.                         if (_pc.getTempCharGfx() != 13731 && _pc.getTempCharGfx() != 13733) { // 不是真黑妖外型
  4.                             if (_random.nextInt(100) < 20) { // 20%机率出现特效
  5.                                 L1NpcInstance dummy = L1SpawnUtil.spawnS(_target.getLocation(), 86132,
  6.                                         _pc.get_showId(), 1, _pc.getHeading());
  7.                                 
  8.                                 // 一般情况下这里需要 if (dummy != null) 或者 assert dummy != null;
  9.                                 // 但是为了让代码更漂亮一点 我们调用JAVA8的API
  10.                                 Optional.ofNullable(dummy)
  11.                                         .ifPresent(u -> dummy.broadcastPacketAll(new S_NPCPack(dummy)));
  12.                                 Optional.ofNullable(dummy)
  13.                                         .ifPresent(u -> dummy.broadcastPacketAll(new S_SkillSound(dummy.getId(), attackgfx)));
  14.                             }
  15.                         } else if (_dark) { // 真黑妖重击或双击必出特效
  16.                             L1NpcInstance dummy = L1SpawnUtil.spawnS(_target.getLocation(), 86132,
  17.                                     _pc.get_showId(), 1, _pc.getHeading());
  18.                             Optional.ofNullable(dummy)
  19.                                     .ifPresent(u -> dummy.broadcastPacketAll(new S_NPCPack(dummy)));
  20.                             Optional.ofNullable(dummy)
  21.                                     .ifPresent(u -> dummy.broadcastPacketAll(new S_SkillSound(dummy.getId(), attackgfx)));
  22.                         }
  23.                     }
  24.                     _pc.sendPacketsAll(new S_AttackPacketPc(_pc, _target, 0, _damage));

  25.                 }
复制代码


当然,为了代码更漂亮,我们还可以把这一段的同类参数提取出来,然后其他地方用的时候就只需要写短短一行就ok了。



  1.     /**
  2.      * 另类的特效处理
  3.      * @param pc 触发对象
  4.      * @param cha 受攻击对象
  5.      * @param gfx_id 特效图档
  6.      */
  7.     private static void sendSkillGfx(L1PcInstance pc, L1Character cha, int gfx_id) {

  8.         L1NpcInstance dummy = L1SpawnUtil.spawnS(cha.getLocation(), 86132,
  9.                 pc.get_showId(), 1, pc.getHeading());
  10.         Optional.ofNullable(dummy)
  11.                 .ifPresent(u -> dummy.broadcastPacketAll(new S_NPCPack(dummy)));
  12.         Optional.ofNullable(dummy)
  13.                 .ifPresent(u -> dummy.broadcastPacketAll(new S_SkillSound(dummy.getId(), gfx_id)));
  14.     }
复制代码


于是上面那段就可以改成



  1.                 if (IntRange.includes(_pc.getTempCharGfx(), 13715, 13745)) {
  2.                     if (attackgfx > 0 && attackgfx != 13396) { // 空手以及奇古兽以外的攻击特效
  3.                         if (_pc.getTempCharGfx() != 13731 && _pc.getTempCharGfx() != 13733) { // 不是真黑妖外型
  4.                             if (_random.nextInt(100) < 20) { // 20%机率出现特效
  5.                                 sendSkillGfx(_pc, _target, attackgfx);
  6.                             }
  7.                         } else if (_dark) { // 真黑妖重击或双击必出特效
  8.                             sendSkillGfx(_pc, _target, attackgfx);
  9.                         }
  10.                     }
  11.                     _pc.sendPacketsAll(new S_AttackPacketPc(_pc, _target, 0, _damage));

  12.                 }
复制代码


当然,top职业变身的这些特效,还可以有其他的写法,毕竟每次 spawnS 都会占用一个objid,所以我们需要取得当前角色的面向,再由被攻击对象来发送封包就行了,只是这么写逻辑会更复杂一些,需要变动的东西会更多一些,不建议新手使用。

emmm  接着发个广告 圣子默默的个人空间_哔哩哔哩_bilibili 欢迎大家留言提供想法,我负责实现。
回复

使用道具 举报

0

主题

228

帖子

1384

积分

金牌会员

Rank: 6Rank: 6

积分
1384
发表于 2023-4-29 13:03:56 | 显示全部楼层
6666666666666666
回复 支持 反对

使用道具 举报

0

主题

13

帖子

13

积分

注册会员

Rank: 2

积分
13
发表于 2023-5-17 13:19:27 | 显示全部楼层
感谢感谢 已投币关注
回复 支持 反对

使用道具 举报

2

主题

56

帖子

89

积分

注册会员

Rank: 2

积分
89
发表于 2023-6-8 16:46:56 | 显示全部楼层
感謝分享!
回复

使用道具 举报

0

主题

108

帖子

112

积分

中级会员

Rank: 3Rank: 3

积分
112
发表于 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 欢迎大家留言提供想法,我负责实现。
回复 支持 反对

使用道具 举报

0

主题

161

帖子

167

积分

中级会员

Rank: 3Rank: 3

积分
167
发表于 2024-1-26 14:02:16 | 显示全部楼层
感謝大哥 666666666666
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表