顯示具有 PK 標籤的文章。 顯示所有文章
顯示具有 PK 標籤的文章。 顯示所有文章

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());

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

2013年6月1日 星期六

【Java教學】玩家PK殺人公告

非原創只是將新的方法分享給找不到方法的新手GM!!!
根據本站另一帖教學中新增失敗的玩家可以看看~~

=========================

教學開始

=========================

server/server/model/L1Attack.java

搜尋public int PcPcDamageCalc()

往下拉直到尋找下方這段語法↓

       
   if (dmg <= 0) {
           _isHit = false;
           _drainHp = 0; // ダメージ無しの場合は吸収による回復はしない
       }

       return (int) dmg;
   }





在return (int) dmg; 上方加入語法



//PK公告
                if (dmg <= 0) {
                    _isHit = false;
                    }
                    if(dmg >= _targetPc.getCurrentHp() //攻擊傷害大於目標目前血量
                    && _pc.getLevel() - _targetPc.getLevel() <= 10 //雙方等級差距不超過10
                    && _targetPc.getZoneType() != -1){ //被攻擊者不是在戰鬥區域
                    
                    
               BroadCastToAll((new StringBuilder()).append("【").append(_targetPc.getName()).append("】被【").append(_pc.getName()).append("】殺了!").toString()); //公頻顯示的內容
                    }
                    //PK公告 END

======================================

最後在return (int) dmg;
  }  ←的下方加入:↓廣播的方法(如果你已經有了這段就不用新增了)


   private void BroadCastToAll( String string ) {
        Collection <L1PcInstance> allpc = L1World.getInstance().getAllPlayers();
        for ( L1PcInstance pc : allpc )
          pc.sendPackets( new S_SystemMessage( string ) );
       } 

=======================================