📄 l1ultimatebattle.java
字号:
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*
* http://www.gnu.org/copyleft/gpl.html
*/
package l1j.server.server.model;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
import java.util.SortedSet;
import java.util.TimeZone;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import l1j.server.Config;
import l1j.server.server.ActionCodes;
import l1j.server.server.GeneralThreadPool;
import l1j.server.server.datatables.ItemTable;
import l1j.server.server.datatables.UBSpawnTable;
import l1j.server.server.model.Instance.L1ItemInstance;
import l1j.server.server.model.Instance.L1MonsterInstance;
import l1j.server.server.model.Instance.L1PcInstance;
import l1j.server.server.model.item.L1ItemId;
import l1j.server.server.serverpackets.S_ServerMessage;
import l1j.server.server.templates.L1Item;
import l1j.server.server.utils.IntRange;
// Referenced classes of package l1j.server.server.model:
// L1UltimateBattle
public class L1UltimateBattle {
private int _locX;
private int _locY;
private L1Location _location; // 中心点
private short _mapId;
private String _ubName;
private int _locX1;
private int _locY1;
private int _locX2;
private int _locY2;
private int _ubId;
private int _pattern;
private boolean _isNowUb;
private boolean _active; // UB入場可能~競技終了までtrue
private int _minLevel;
private int _maxLevel;
private int _maxPlayer;
private boolean _enterRoyal;
private boolean _enterKnight;
private boolean _enterMage;
private boolean _enterElf;
private boolean _enterDarkelf;
private boolean _enterDragonKnight;
private boolean _enterIllusionist;
private boolean _enterMale;
private boolean _enterFemale;
private boolean _usePot;
private int _hpr;
private int _mpr;
private static int BEFORE_MINUTE = 5; // 5分前から入場開始
private Set<Integer> _managers = new HashSet<Integer>();
private SortedSet<Integer> _ubTimes = new TreeSet<Integer>();
private static final Logger _log = Logger.getLogger(L1UltimateBattle.class
.getName());
private final ArrayList<L1PcInstance> _members = new ArrayList<L1PcInstance>();
/**
* ラウンド開始時のメッセージを送信する。
*
* @param curRound
* 開始するラウンド
*/
private void sendRoundMessage(int curRound) {
// XXX - このIDは間違っている
final int MSGID_ROUND_TABLE[] = { 893, 894, 895, 896 };
sendMessage(MSGID_ROUND_TABLE[curRound - 1], "");
}
/**
* ポーション等の補給アイテムを出現させる。
*
* @param curRound
* 現在のラウンド
*/
private void spawnSupplies(int curRound) {
if (curRound == 1) {
spawnGroundItem(L1ItemId.ADENA, 1000, 60);
spawnGroundItem(L1ItemId.POTION_OF_CURE_POISON, 3, 20);
spawnGroundItem(L1ItemId.POTION_OF_EXTRA_HEALING, 5, 20);
spawnGroundItem(L1ItemId.POTION_OF_GREATER_HEALING, 3, 20);
spawnGroundItem(40317, 1, 5); // 砥石
spawnGroundItem(42079, 1, 20); // 帰還スク
} else if (curRound == 2) {
spawnGroundItem(L1ItemId.ADENA, 5000, 50);
spawnGroundItem(L1ItemId.POTION_OF_CURE_POISON, 5, 20);
spawnGroundItem(L1ItemId.POTION_OF_EXTRA_HEALING, 10, 20);
spawnGroundItem(L1ItemId.POTION_OF_GREATER_HEALING, 5, 20);
spawnGroundItem(40317, 1, 7); // 砥石
spawnGroundItem(40093, 1, 10); // ブランクスク(Lv4)
spawnGroundItem(42079, 1, 5); // 帰還スク
} else if (curRound == 3) {
spawnGroundItem(L1ItemId.ADENA, 10000, 30);
spawnGroundItem(L1ItemId.POTION_OF_CURE_POISON, 7, 20);
spawnGroundItem(L1ItemId.POTION_OF_EXTRA_HEALING, 20, 20);
spawnGroundItem(L1ItemId.POTION_OF_GREATER_HEALING, 10, 20);
spawnGroundItem(40317, 1, 10); // 砥石
spawnGroundItem(40094, 1, 10); // ブランクスク(Lv5)
}
}
/**
* コロシアムから出たメンバーをメンバーリストから削除する。
*/
private void removeRetiredMembers() {
L1PcInstance[] temp = getMembersArray();
for (int i = 0; i < temp.length; i++) {
if (temp[i].getMapId() != _mapId) {
removeMember(temp[i]);
}
}
}
/**
* UBに参加しているプレイヤーへメッセージ(S_ServerMessage)を送信する。
*
* @param type
* メッセージタイプ
* @param msg
* 送信するメッセージ
*/
private void sendMessage(int type, String msg) {
for (L1PcInstance pc : getMembersArray()) {
pc.sendPackets(new S_ServerMessage(type, msg));
}
}
/**
* コロシアム上へアイテムを出現させる。
*
* @param itemId
* 出現させるアイテムのアイテムID
* @param stackCount
* アイテムのスタック数
* @param count
* 出現させる数
*/
private void spawnGroundItem(int itemId, int stackCount, int count) {
L1Item temp = ItemTable.getInstance().getTemplate(itemId);
if (temp == null) {
return;
}
for (int i = 0; i < count; i++) {
L1Location loc = _location.randomLocation(
(getLocX2() - getLocX1()) / 2, false);
if (temp.isStackable()) {
L1ItemInstance item = ItemTable.getInstance()
.createItem(itemId);
item.setEnchantLevel(0);
item.setCount(stackCount);
L1GroundInventory ground = L1World.getInstance().getInventory(
loc.getX(), loc.getY(), _mapId);
if (ground.checkAddItem(item, stackCount) == L1Inventory.OK) {
ground.storeItem(item);
}
} else {
L1ItemInstance item = null;
for (int createCount = 0; createCount < stackCount; createCount++) {
item = ItemTable.getInstance().createItem(itemId);
item.setEnchantLevel(0);
L1GroundInventory ground = L1World.getInstance()
.getInventory(loc.getX(), loc.getY(), _mapId);
if (ground.checkAddItem(item, stackCount) == L1Inventory.OK) {
ground.storeItem(item);
}
}
}
}
}
/**
* コロシアム上のアイテムとモンスターを全て削除する。
*/
private void clearColosseum() {
for (Object obj : L1World.getInstance().getVisibleObjects(_mapId)
.values()) {
if (obj instanceof L1MonsterInstance) // モンスター削除
{
L1MonsterInstance mob = (L1MonsterInstance) obj;
if (!mob.isDead()) {
mob.setDead(true);
mob.setStatus(ActionCodes.ACTION_Die);
mob.setCurrentHpDirect(0);
mob.deleteMe();
}
} else if (obj instanceof L1Inventory) // アイテム削除
{
L1Inventory inventory = (L1Inventory) obj;
inventory.clearItems();
}
}
}
/**
* コンストラクタ。
*/
public L1UltimateBattle() {
}
class UbThread implements Runnable {
/**
* 競技開始までをカウントダウンする。
*
* @throws InterruptedException
*/
private void countDown() throws InterruptedException {
// XXX - このIDは間違っている
final int MSGID_COUNT = 637;
final int MSGID_START = 632;
for (int loop = 0; loop < BEFORE_MINUTE * 60 - 10; loop++) { // 開始10秒前まで待つ
Thread.sleep(1000);
// removeRetiredMembers();
}
removeRetiredMembers();
sendMessage(MSGID_COUNT, "10"); // 10秒前
Thread.sleep(5000);
sendMessage(MSGID_COUNT, "5"); // 5秒前
Thread.sleep(1000);
sendMessage(MSGID_COUNT, "4"); // 4秒前
Thread.sleep(1000);
sendMessage(MSGID_COUNT, "3"); // 3秒前
Thread.sleep(1000);
sendMessage(MSGID_COUNT, "2"); // 2秒前
Thread.sleep(1000);
sendMessage(MSGID_COUNT, "1"); // 1秒前
Thread.sleep(1000);
sendMessage(MSGID_START, "無限大賽開始"); // スタート
removeRetiredMembers();
}
/**
* 全てのモンスターが出現した後、次のラウンドが始まるまでの時間を待機する。
*
* @param curRound
* 現在のラウンド
* @throws InterruptedException
*/
private void waitForNextRound(int curRound) throws InterruptedException {
final int WAIT_TIME_TABLE[] = { 6, 6, 2, 18 };
int wait = WAIT_TIME_TABLE[curRound - 1];
for (int i = 0; i < wait; i++) {
Thread.sleep(10000);
// removeRetiredMembers();
}
removeRetiredMembers();
}
/**
* スレッドプロシージャ。
*/
@Override
public void run() {
try {
setActive(true);
countDown();
setNowUb(true);
for (int round = 1; round <= 4; round++) {
sendRoundMessage(round);
L1UbPattern pattern = UBSpawnTable.getInstance()
.getPattern(_ubId, _pattern);
ArrayList<L1UbSpawn> spawnList = pattern
.getSpawnList(round);
for (L1UbSpawn spawn : spawnList) {
if (getMembersCount() > 0) {
spawn.spawnAll();
}
Thread.sleep(spawn.getSpawnDelay() * 1000);
// removeRetiredMembers();
}
if (getMembersCount() > 0) {
spawnSupplies(round);
}
waitForNextRound(round);
}
for (L1PcInstance pc : getMembersArray()) // コロシアム内に居るPCを外へ出す
{
Random random = new Random();
int rndx = random.nextInt(4);
int rndy = random.nextInt(4);
int locx = 33503 + rndx;
int locy = 32764 + rndy;
short mapid = 4;
L1Teleport.teleport(pc, locx, locy, mapid, 5, true);
removeMember(pc);
}
clearColosseum();
setActive(false);
setNowUb(false);
} catch (Exception e) {
_log.log(Level.SEVERE, e.getLocalizedMessage(), e);
}
}
}
/**
* アルティメットバトルを開始する。
*
* @param ubId
* 開始するアルティメットバトルのID
*/
public void start() {
int patternsMax = UBSpawnTable.getInstance().getMaxPattern(_ubId);
Random random = new Random();
_pattern = random.nextInt(patternsMax) + 1; // 出現パターンを決める
UbThread ub = new UbThread();
GeneralThreadPool.getInstance().execute(ub);
}
/**
* プレイヤーを参加メンバーリストへ追加する。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -