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