查看: 599|回復: 0

[分享] L1PcInstance來寫玩家pk公告 新手教學

[複製鏈接]

9

主題

10

帖子

300

金錢

哥布林

Rank: 3Rank: 3

威望
0
精華
0
貢獻
0
鑽石
0
閱讀權限
30
積分
310
在線時間
5 小時
相冊
0
日誌
0
好友
0
發表於 2025-11-18 19:19 | 顯示全部樓層 |閱讀模式
用L1PcInstance來寫玩家pk公告
因為用L1Attack或者L1Magic來寫的話有一個缺點,

那就是誤判。

明明還沒死卻上了公告,結果變成殺死一個玩家要公告不少次~

此外,使用反擊屏障或致命身軀之類,受傷才會反擊的魔法將對手擊敗時也不會公告。

所以乾脆改寫到L1PcInstance去~

改寫到L1PcInstance有一個優點,
在反擊屏障或致命身軀把對手擊敗時也會公告出來。

以下是不getWeapon或者getSkillId的寫法

搜尋

[Copy to clipboard] CODE:

public void receiveDamage(L1Character attacker, double damage, boolean isMagicDamage) {

再往下搜尋

[Copy to clipboard] CODE:

if (damage > 0) {
    delInvis();
    if (attacker instanceof L1PcInstance) {
     L1PinkName.onAction(this, attacker);
    }

然後在下面插入這一段

[Copy to clipboard] CODE:

    // 玩家PK公告
    if (attacker != null && damage >= getCurrentHp()) {
     String msg = "";
     if (attacker instanceof L1PcInstance) {
      msg =  "玩家【" + attacker.getName() + "】幹掉了玩家【" + getName() + "】";
     } else if (attacker instanceof L1SummonInstance || attacker instanceof L1PetInstance) {
      L1PcInstance master = null; //以下是參考丫傑大的怪死公告判斷之召喚獸和寵物的寫法,特此感謝
      if (attacker instanceof L1SummonInstance) { //召喚
       master = (L1PcInstance) ((L1SummonInstance)attacker).getMaster();
      } else if (attacker instanceof L1PetInstance) { //寵物
       master = (L1PcInstance) ((L1PetInstance) attacker).getMaster();
      }
      msg = "玩家【" + master.getName() + "】的【" + attacker.getName() + "】幹掉了玩家【" + getName() + "】";
     }
     L1World.getInstance().broadcastPacketToAll(new S_SystemMessage(msg));
    }
    // 玩家PK公告 END

以上是不getWeapon的寫法,簡單完成~



如果想要公佈武器名稱的話~~~~就改成插入以下~~



這是getWeapon的寫法

[Copy to clipboard] CODE:

    // 玩家PK公告
    if (attacker != null && attacker.getId() != getId() && damage >= getCurrentHp()) {
     String msg = "";
     if (attacker instanceof L1PcInstance) {
      if (isMagicDamage) {   
       msg = "玩家【" + attacker.getName() + "】使用魔法攻擊幹掉了玩家【" + getName() + "】";
      } else {
       L1PcInstance pc = (L1PcInstance) attacker;
       if (pc.getWeapon() != null) {
        msg = "玩家【" + attacker.getName() + "】使用【" + pc.getWeapon().getName()
                          + "】幹掉了玩家【" + getName() + "】";
       } else {
        msg = "玩家【" + attacker.getName() +"】以最高境界【赤手空拳】幹掉了玩家【" + getName() + "】";
       }
      }
     } else if (attacker instanceof L1SummonInstance || attacker instanceof L1PetInstance) {
      L1PcInstance master = null;
      if (attacker instanceof L1SummonInstance) { //召喚
       master = (L1PcInstance) ((L1SummonInstance)attacker).getMaster();
      } else if (attacker instanceof L1PetInstance) { //寵物
       master = (L1PcInstance) ((L1PetInstance) attacker).getMaster();
      }
      msg = "玩家【" + master.getName() + "】的【" + attacker.getName() + "】幹掉了玩家【" + getName() + "】";
     }
     L1World.getInstance().broadcastPacketToAll(new S_SystemMessage(msg));
    }
    // 玩家PK公告 END


若是要顯示魔法名稱

L1PcInstance

新增

[Copy to clipboard] CODE:
        //顯示魔法名稱
        private String _skillName;

        public String getSkillName() {
                return _skillName;
        }

        public void setSkillName(String s) {
                _skillName = s;
        }

        //顯示魔法名稱

修改



[Copy to clipboard] CODE:
msg = "玩家【" + attacker.getName() + "】使用魔法幹掉了玩家【" + getName() + "】";

修改為

[Copy to clipboard] CODE:
msg = "玩家【" + attacker.getName() + "】使用魔法"+((L1PcInstance)attacker).getSkillName()+"幹掉了玩家【" + getName() + "】";

L1SkillUse
搜尋

[Copy to clipboard] CODE:
if ((dmg > 0) || (drainMana != 0)) {

在下面新增

[Copy to clipboard] CODE:
_player.setSkillName(_skill.getName());

這樣就可以殺死玩家顯示魔法名稱了
以上已測試

技術回饋
免費幫您修復BUG LineID:socket618
每天分享 3個技術文章





上一篇︰【Java教學】clientpackets 說明
下一篇︰境界380 時間軸 賺點小金幣
[發帖際遇]: socket@618 被錢袋砸中進醫院,看病花了 4 金錢. 幸運榜 / 衰神榜
您需要登錄後才可以回帖 登錄 | 註冊會員

本版積分規則

天堂私服列表

45客服

Archiver| 45天堂私服論壇   分享到微博! 分享到臉書! 分享到噗浪! 分享到維特! 分享到Google+! 分享到LINE!

45天堂私服發佈站 ©    天堂私服架設教學  提供最新天堂私服最新資訊

流量最高、品質最好、服務最優、玩家首選、最新天堂私服資訊,都在45天堂私服發佈站.    免責聲明

Sitetag
line客服聯繫
掃一掃二碼
Line客服聯繫
24H專人回覆
返回頂部 返回列表