2014年2月10日 星期一

用L1PcInstance來寫玩家pk公告

因為用L1Attack或者L1Magic來寫的話有一個缺點,

那就是誤判。

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

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

所以乾脆改寫到L1PcInstance去~

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

以下是不getWeapon或者getSkillId的寫法

搜尋


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

再往下搜尋


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

然後在下面插入這一段


    // 玩家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的寫法


    // 玩家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

新增

        //顯示魔法名稱
        private String _skillName;
       
        public String getSkillName() {
                return _skillName;
        }
       
        public void setSkillName(String s) {
                _skillName = s;
        }
       
        //顯示魔法名稱

修改



msg = "玩家【" + attacker.getName() + "】使用魔法幹掉了玩家【" + getName() + "】";

修改為

msg = "玩家【" + attacker.getName() + "】使用魔法"+((L1PcInstance)attacker).getSkillName()+"幹掉了玩家【" + getName() + "】";

L1SkillUse
搜尋

if ((dmg > 0) || (drainMana != 0)) {

在下面新增

_player.setSkillName(_skill.getName());

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

沒有留言:

張貼留言