极限节省物件id之R版暴击特效(附加媒介召唤方法)
本帖最後由 Lin-JN 於 2024-4-19 15:49 編輯/**
* R版暴击特效处理<br>
* 极限继承物件id by 圣子默默<br>
* 全网搜索 圣子默默 观看更多视频及天堂一教程<br>
* 放 L1PcInstance 或 L1Character 任意位置<br>
* 建议后者 可通用 给NPC(虚拟人物)使用
*
* @param target 受攻击对象
* @param gfx_id 特效动画
*/
public void sendFollowEffect(L1Character target, int gfx_id) {
L1NpcInstance followEffect;
if (this.getFollowEffect() != null) { // 特效物件已经存在
followEffect = this.getFollowEffect();
followEffect.setLocation(target.getLocation());
followEffect.setHeading(this.getHeading());
} else { // 召唤一次特效物件媒介 然后锁定在主人身上
followEffect = L1SpawnUtil.spawnS(target.getLocation(),
this.get_showId(), 0, this.getHeading());
this.setFollowEffect(followEffect);
}
// 这段用于测试打印物件id 实装时请删除
Optional.ofNullable(followEffect).ifPresent(u ->
_log.info("followEffect: " + followEffect.getId()));
// 送出物件封包 通知所有对象位置、面向的变化
Optional.ofNullable(followEffect).ifPresent(u -> followEffect
.broadcastPacketAll(new S_NPCPack(followEffect)));
// 送出特效动画
Optional.ofNullable(followEffect).ifPresent(u -> followEffect
.broadcastPacketAll(new S_SkillSound(followEffect.getId(), gfx_id)));
}
// 双手剑R版暴击特效举例 L1Attack (L1AttackPc / L1AttackNpc)
_pc.sendFollowEffect(_target, 13410);
/**
* 召唤的特效物件媒介
*/
private L1NpcInstance _followEffect;
private void setFollowEffect(L1NpcInstance followEffect) {
_followEffect = followEffect;
}
public L1NpcInstance getFollowEffect() {
return _followEffect;
}
// 玩家离线或NPC死亡删除时执行
if (getFollowEffect() != null) {
getFollowEffect().deleteMe();
}
/**
* 依LOC位置召唤指定NPC (R版变身攻击特效媒介)
*
* @param loc LOC
* @param showId副本编号
* @param time 存在时间(秒) 小于等于0不限制
* @param heading 面向
*/
public static L1NpcInstance spawnS(final L1Location loc, final int showId, final int time,
final int heading, final int objId) {
try {
final L1NpcInstance npc = NpcTable.get().newNpcInstance(56168);
if (npc == null) {
return null;
}
npc.setId(objId);
npc.setMap(loc.getMap());
npc.getLocation().set(loc);
npc.setHomeX(npc.getX());
npc.setHomeY(npc.getY());
npc.setHeading(heading);
npc.set_showId(showId);
World.get().storeObject(npc); // 不需要 addVisibleObject
if (0 < time) {
npc.set_spawnTime(time);
}
return npc;
} catch (final Exception e) {
_log.error("依LOC位置召唤指定NPC(传回NPC讯息)发生异常: 56168", e);
}
return null;
}
和正常的R版暴击特效写法相比,试想一个角色在24小时内(我的服好几天才会重启一次……)要挥刀多少次?会触发多少次特效?原版的写法里,每一次触发都需要消耗掉一个物件id,如此修改,在物件主人消失(离线)之前,不论何时攻击触发,都只会用到一个物件id。
代码不作隐藏,欢迎取用。
謝謝大大分享
新手學習
目前功力還不到那邊
看看學習 疑 爆擊特效 為什麼不用 S_SkillSound 還是R版沒這個封包 Java大神 發表於 2024-3-30 15:29
疑 爆擊特效 為什麼不用 S_SkillSound 還是R版沒這個封包
天堂1的特效动画各不一样,一般分为四种。
1:无向特效,比如极道落雷、流星雨、究极光裂之类,这种特效不区分方向,不管哪个位置都是同样方向的动画。
2:有向特效,比如黑妖双刀双击、钢爪重击,特征为触发在当前的物件身上,显示的方向和当前物件一致。
3:R版暴击特效,特征为触发在被攻击者身上,但显示位置会在被攻击者前一格的位置,而显示的方向和攻击发起者一致,所以是不可以使用S_SkillSound封包的,那样看起来会很诡异。
4:飞行特效,弓箭,飞刀,沙哈魔法箭矢类
这里指的就是第3种。
第1种,建议使用S_EffectLocation封包。
第2种,建议使用S_SKillSound封包。
第3种,建议用我上面写的。
第4种,只有一种封包,封包名字各人写法不同,我用的是S_UseArrowFlySkill
以上四种,就是天堂1常用的特效显示方式。
至于一些S_Attack之类的type 0x01 0x02 0x04 0x08之类的封包特效就不叙述了,那玩意有些主程式(客户端)下使用可能会有问题,而且局限性大,仅适用于双击、重击等几个有限的场合,极度不推荐。
感謝分享 謝謝大大分享
新手學習 讓我們繼續看下去~ Lin-JN 發表於 2024-3-30 17:47
天堂1的特效动画各不一样,一般分为四种。
1:无向特效,比如极道落雷、流星雨、究极光裂之类,这种特效 ...
了解 謝謝解釋
請問你的 spawnS 是自訂方法嗎? 因為原始的 spawnS 是5個數值, 你提供的代碼中缺少了 npcid, 是否刻意移除? 搖搖搖~~~~~~
感謝分享-學習學習 Lin-JN 發表於 2024-3-30 17:47
天堂1的特效动画各不一样,一般分为四种。
1:无向特效,比如极道落雷、流星雨、究极光裂之类,这种特效 ...
这段科普太有用了,非常感谢!收藏保存!
感謝有您的無私分享 diorlive 發表於 2024-4-11 22:09
請問你的 spawnS 是自訂方法嗎? 因為原始的 spawnS 是5個數值, 你提供的代碼中缺少了 npcid, 是否刻意移除 ...
自己修改,没有必要太多参数的,就自然不需要了。
我写的任何所谓“教学”,都是仅供参考的,一般直接搬运肯定是不行的,每个人版本不一样,参数也不同,主要是了解大致上的方法流程以及思路。
本帖最後由 diorlive 於 2024-4-18 06:34 編輯
Lin-JN 發表於 2024-4-18 00:41
自己修改,没有必要太多参数的,就自然不需要了。
瞭解 謝謝
請問如果碰到這樣召喚出來的特效不會消失的問題, 您的時間控制是怎麼做的呢..
謝謝大大分享
新手學習
目前功力還不到那邊
看看學習
diorlive 發表於 2024-4-18 21:34
請問如果碰到這樣召喚出來的特效不會消失的問題, 您的時間控制是怎麼做的呢.. ...
不需要时间控制的,玩家下线或者怪物死亡那里进行删除就可以了。
感恩大大無私分享 Lin-JN 發表於 2024-4-19 15:38
不需要时间控制的,玩家下线或者怪物死亡那里进行删除就可以了。
我碰到的問題是因為這個暴擊特效是機率產生的 他是隨著觸發暴擊而調用
但是暴擊時調用了特效 他播放一次後就呈現停止畫面留在畫面上了
換下一隻怪上一隻怪停在畫面上的特效才會消失 但是下一隻怪身上有觸發又會停一個.. 他不像單純用 skillsound 發送一樣播放完一次消失..
頁:
[1]
2