⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pkpair.java

📁 一套MMORPG手机网络游戏的服务端
💻 JAVA
字号:
package com.swing.game.crystal.utils;

import java.util.*;

import com.swing.game.crystal.CrystalController;
import com.swing.game.crystal.CrystalPlayer;

public class PKPair {



  public int status; // demonstrate the progress of the pk action

  public CrystalPlayer sponser;
  public CrystalPlayer embracer;

  public long sponserTimer;
  public long embracerTimer;

  public static final StringBuffer sponserComm = new StringBuffer();
  public static final StringBuffer embracerComm = new StringBuffer();

  public PKPair(CrystalPlayer sponser, CrystalPlayer embracer) {
    this.sponser = sponser;
    this.embracer = embracer;
    this.status = PKStatus.INITIAL;
    this.sponserTimer = System.currentTimeMillis();
  }

  public void process(String userID, String[] command) {
    switch (command[0].charAt(0)) {
      case '4':

        // first time the two user exchange their personnal data
        // send response back to the sponser
        sponser.setStatus(UserStatus.USER_PKING);
        sponser.pkData.append("K ");
        sponser.pkData.append(embracer.level);
        sponser.pkData.append(" ");
        sponser.pkData.append(embracer.hp);
        sponser.pkData.append(" ");
        Object[] keys = embracer.getEquips().toArray();
        Arrays.sort(keys, new StringComparator());
        boolean first = true;
        int start = -1;
        for (int i = 0; i < keys.length; i++) {
          /* weapons of User now just contains the id of the weapon and the number of the weapon but not the
           * reference of the weapon, so you have to get the reference by using the WeaponMapping.
           */
          Equip w = (Equip) CrystalController.WeaponMapping.get(keys[i]);
          if (w.id.length() == 1)
            sponser.pkData.append(w.id);
          else {
            if (first) {
              start = i;
              first = false;
              sponser.pkData.append(" ");
            }
            sponser.pkData.append(w.id);
            sponser.pkData.append(" ");
            sponser.pkData.append(w.name);
            sponser.pkData.append(" ");
          }
        }
        if (start != -1) {
          for (int i = start; i < keys.length; i++) {
            Equip w = (Equip) CrystalController.WeaponMapping.get(keys[i]);
            sponser.pkData.append(w.image);
            sponser.pkData.append(" ");
          }
        }

        // notify the embracer
        embracer.setStatus(UserStatus.USER_PKING);
        embracer.pkData.append("k ");
        embracer.pkData.append(sponser.id);
        embracer.pkData.append(" ");
        embracer.pkData.append(sponser.level);
        embracer.pkData.append(" ");
        embracer.pkData.append(sponser.hp);
        embracer.pkData.append(" ");
        keys = sponser.getEquips().toArray();
        Arrays.sort(keys, new StringComparator());
        first = true;
        start = -1;
        for (int i = 0; i < keys.length; i++) {
          Equip w = (Equip) CrystalController.WeaponMapping.get(keys[i]);
          if (w.id.length() == 1)
            embracer.pkData.append(w.id);
          else {
            if (first) {
              start = i;
              first = false;
              embracer.pkData.append(" ");
            }
            embracer.pkData.append(w.id);
            embracer.pkData.append(" ");
            embracer.pkData.append(w.name);
            embracer.pkData.append(" ");
          }
        }
        if (start != -1) {
          for (int i = start; i < keys.length; i++) {
            Equip w = (Equip) CrystalController.WeaponMapping.get(keys[i]);
            embracer.pkData.append(w.image);
            embracer.pkData.append(" ");
          }
        }
        break;
      case '8': // concrete pk info
        if (this.status == PKStatus.INITIAL) {
          // you should make sure that all the two users have take their data away and then start another battle
          if ( (sponser.pkData.length() == 0 || embracer.pkData.length() == 0) &&
              command.length == 4) {
            this.status = PKStatus.WAITING;
            if (command[2].equals(sponser.id)) {
              sponserComm.append(command[3]);
              sponserTimer = System.currentTimeMillis();
            }
            else {
              embracerComm.append(command[3]);
              embracerTimer = System.currentTimeMillis();
            }
          }
        }
        else if (this.status == PKStatus.WAITING) {
          if (command.length == 4) {
            if ( (sponserComm.length() == 0 || embracerComm.length() == 0)) {
              if (command[2].equals(sponser.id)) {
                sponserComm.append(command[3]);
                sponserTimer = System.currentTimeMillis();
              }
              else {
                embracerComm.append(command[3]);
                embracerTimer = System.currentTimeMillis();
              }
            }
            if (sponserComm.length() != 0 && embracerComm.length() != 0) {
              // calculate the data of the two user
              pk(command[1]);
            }
          }
          break;
        }
    }
  }


  private int[] attack() {
   // re[2] demonstrate that if the run away behavior is successful
   int[] re = new int[5];
   re[0] = 0; // 发起者被打掉的血
   re[1] = 0; // 被打者被打掉的血
   re[2] = 0; // 显示本次攻击的状态 0 : 正常PK  1 : 发起者逃跑 2 : 被打者逃跑
   re[3] = 0; // 发起者得到的经验值
   re[4] = 0; // 被打者得到的经验值


   // 被打者要逃跑
   if (embracerComm.toString().equals("r")) {
     // 被打者随意逃跑
     boolean ifRun = true;

     // 被打者逃跑成功
     if (ifRun) {
       re[2] += 2;
     }
     // 被打者逃跑失败
     else {
       re[2] = 0;
     }
   }
   else {
     // 计算被打者给对方造成的伤害
     String number = embracerComm.toString().substring(1,
         embracerComm.toString().length());
     int attack = ( (Equip) CrystalController.WeaponMapping.get(number)).attack;

     // 攻击性武器是给对方用的,是正数,因为对方要减
     if (embracerComm.toString().substring(0, 1).equals("a")) {
       re[0] += attack;
       sponser.hp -= attack;
     }
     // 物品是给自己用的,是负数,减完就加上了
     else {
       re[0] -= attack;
       embracer.hp += attack;
       embracer.hp = embracer.hp > embracer.hpLimit ? embracer.hpLimit : embracer.hp;
     }
   }
   if (sponser.hp > 0) {
     // 发起者要逃跑
     if (sponserComm.toString().equals("r")) {
       // 发起者不允许逃跑
       boolean ifRun = false;

       // 发起者逃跑成功
       if (ifRun) {
         re[2] += 1;
       }
       // 发起者逃跑失败
       else {
         re[1] = 0;
       }
     }
     else {
       // 计算发起者给对方造成的伤害
       String number = sponserComm.toString().substring(1,
           sponserComm.toString().length());
       int attack = ( (Equip) CrystalController.WeaponMapping.get(number)).attack;

       // 攻击性武器是给对方用的,是正数,因为对方要减
       if (sponserComm.toString().substring(0, 1).equals("a")) {
         re[1] += attack;
         embracer.hp -= attack;
       }
       // 物品是给自己用的,是负数,减完就加上了
       else {
         re[1] -= attack;
         sponser.hp += attack;
         sponser.hp = sponser.hp > sponser.hpLimit ? sponser.hpLimit : sponser.hp;
       }
     }
   }
   System.out.println( sponser.id + " : " + sponser.hp);
   System.out.println( embracer.id + " : " + embracer.hp);
   return re;
 }


  public void pk(String userID) {
    int[] re = attack();
    int[] exp = null;

    // 战斗中有人逃跑
    if (re[2] != 0) {
      // 计算经验
      // exp[0] 是给sponser的
      // exp[1] 是给embracer的
      exp = calculateExp(re[2]);

      sponser.pkData.append("r");
      sponser.pkData.append(exp[0]);

      embracer.pkData.append("r");
      embracer.pkData.append(exp[1]);

      // change the dead one's blood to 10
      sponser.hp = sponser.hpLimit;
      // add experince to the winner

      // change the winner's blood to the up limit
      embracer.hp = embracer.hpLimit;

      sponser.isPkOver = true;
      embracer.isPkOver = true;

      this.status = PKStatus.OVER;
    }
    // 正常战斗过程
    else {
      String sponserStr = sponserComm.toString();
      String embracerStr = embracerComm.toString();
      if (sponser.hp > 0) {
        sponser.pkData.append("k ");
        sponser.pkData.append(re[0]);
        sponser.pkData.append(" ");
        sponser.pkData.append(re[1]);
        sponser.pkData.append(" ");
        sponser.pkData.append(embracerStr);
      }
      else {

        sponser.isPkOver = true;
        embracer.isPkOver = true;

        sponser.pkData.append("k ");
        sponser.pkData.append(re[0]);
        sponser.pkData.append(" ");
        sponser.pkData.append(re[1]);
        sponser.pkData.append(" ");
        sponser.pkData.append(embracerStr);
        sponser.pkData.append(" 0");

        // the second person must set this pk's status to be over
        this.status = PKStatus.OVER;
      }
      if (embracer.hp > 0  /*|| sponser.hp <= 0 */) {
        embracer.pkData.append("k ");
        embracer.pkData.append(re[1]);
        embracer.pkData.append(" ");
        embracer.pkData.append(re[0]);
        embracer.pkData.append(" ");
        embracer.pkData.append(sponserStr);
      }
      else {

        sponser.isPkOver = true;
        embracer.isPkOver = true;

        embracer.pkData.append("k ");
        embracer.pkData.append(re[1]);
        embracer.pkData.append(" ");
        embracer.pkData.append(re[0]);
        embracer.pkData.append(" ");
        embracer.pkData.append(sponserStr);
        embracer.pkData.append(" 0");

        // the second person must set this pk's status to be over
        this.status = PKStatus.OVER;
      }
      if (sponser.hp <= 0) {
        exp = calculateExp(1);
        embracer.hp = embracer.hpLimit;
        // add experince to the winner

        // change the winner's blood to the up limit
        sponser.hp = sponser.hpLimit;
        embracer.pkData.append(" ");
        embracer.pkData.append(exp[1]);
      }
      else if (embracer.hp <= 0) {
        exp = calculateExp(2);
        embracer.hp = embracer.hpLimit;
        // add experince to the winner

        // change the winner's blood to the up limit
        sponser.hp = sponser.hpLimit;
        sponser.pkData.append(" ");
        sponser.pkData.append(exp[0]);
      }
    }
    sponserComm.delete(0, sponserComm.length());
    embracerComm.delete(0, embracerComm.length());
    if (this.status != PKStatus.OVER)
      this.status = PKStatus.INITIAL;
  }





  /**
   *
   * @param who int 用来表示PK中是谁失败(逃跑算失败)
   *                1 : 发起者失败
   *                2 : 被打者失败
   *                3 : 两者同时逃跑
   * @return int[]
   */
  private int[] calculateExp(int who) {
    int[] re = new int[2];
    if (who == 1) {
      re[0] = 0;
      re[1] = 1000;
    }
    else if (who == 2) {
      re[0] = 1000;
      re[1] = 0;
    }
    else {
      re[0] = 0;
      re[1] = 0;
    }
    return re;
  }

  public boolean isJoined(String id) {
    if (this.sponser.id.equals(id) || this.embracer.id.equals(id))
      return true;
    return false;
  }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -