2014年10月12日 星期日

boss道館

C_NPCAction
底下找到  else if (((L1NpcInstance) obj).getNpcTemplate().get_npcId() == 80074) 

底下新增

else if(((L1NpcInstance)obj).getNpcTemplate().get_npcId() == 1111)

{

            if(s.equalsIgnoreCase("BOSSPK"))

                htmlid = BossRoom.getInstance().enterBossRoom(pc);

        }


這是對話檔

<html> 
<body> 
<font fg=ffffff><p align=left> <name>:</p></font> 
<a action="enterboos">我想挑戰BOSS</a><br> 

;/body& gt; 
</html>




我們在新增一個src底下新增一個william的資料夾 新增一個
BossRoom.java
在這JAVA檔底下新增以下文字

package l1j.william; 

import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.ArrayList; 

import l1j.server.L1DatabaseFactory; 
import l1j.server.server.ActionCodes; 
import l1j.server.server.GeneralThreadPool; 
import l1j.server.server.IdFactory; 
import l1j.server.server.datatables.NpcTable; 
import l1j.server.server.model.L1Inventory; 
import l1j.server.server.model.L1Teleport; 
import l1j.server.server.model.L1World; 
import l1j.server.server.model.Instance.L1MonsterInstance; 
import l1j.server.server.model.Instance.L1NpcInstance; 
import l1j.server.server.model.Instance.L1PcInstance; 
import l1j.server.server.serverpackets.S_BlueMessage; 
import l1j.server.server.serverpackets.S_ServerMessage; 
import l1j.server.server.serverpackets.S_SystemMessage; 
import l1j.server.server.utils.SQLUtil; 

public class BossRoom { 

/* 
* boss館 by 431200 

* 遊戲開始後 中途死亡離開boss館 
* 還可以再找NPC進入 

* 遊戲開始後 還沒參加過的玩家不可進入 
*/ 

private final ArrayList<L1PcInstance> _members = new ArrayList<L1PcInstance>(); 

private static BossRoom _instance; 

public static BossRoom getInstance() { 
if (_instance == null) { 
_instance = new BossRoom(); 

return _instance; 


public static final int STATUS_NONE = 0; //閒置 
public static final int STATUS_READY = 1; //等待中 
public static final int STATUS_PLAYING = 2; //遊戲開始 
public static final int STATUS_CLEANING = 4; //清潔中 

private static final int _minPlayer = 5; //最少玩家數 
private static final int _maxPlayer = 20; //最多玩家數 

private static final int _readytime = 80 * 1000; //等待時間 80秒 + 倒數 = 總共90秒 
private static final int _cleartime = 5 * 60000; //清潔時間 五分鐘 

private static final int _bossId1 = 1;//NPC編號
private static final int _bossId2 = 2;
//NPC編號 
private static final int _bossId3 = 3;
//NPC編號 
private static final int _bossId4 = 4;
//NPC編號 
private static final int _bossId5 = 5;
//NPC編號 
private static final int _bossId6 = 6;
//NPC編號 
private static final int _bossId7 = 7;
//NPC編號 
private static final int _bossId8 = 8;
//NPC編號 
private static final int _bossId9 = 9; 
//NPC編號 
private static final int _bossId10 = 10; 
//NPC編號 

private static final int _adena = 1000000; //扣除金幣數量 

public String enterBossRoom(L1PcInstance pc) { 

if (BossRoom.getInstance().getBossRoomStatus() == BossRoom.STATUS_CLEANING) { 
pc.sendPackets(new S_SystemMessage("目前BOSS館正在清潔中。")); 
return ""; 


if (BossRoom.getInstance().getBossRoomStatus() == BossRoom.STATUS_PLAYING 
&& !isMember(pc)) { 
pc.sendPackets(new S_ServerMessage(1182)); //遊戲已經開始了。 
return ""; 


if (getMembersCount() >= _maxPlayer && !isMember(pc)) { 
pc.sendPackets(new S_SystemMessage("BOSS館已經到達飽和的狀態了。")); 
return ""; 


if (!pc.getInventory().checkItem(40308,_adena) && !isMember(pc)){ 
pc.sendPackets(new S_ServerMessage(189)); //金幣不足 
return ""; 


L1Teleport.teleport(pc, 32842, 32761, (short) 4941, pc.getHeading(), true); 
addMember(pc); 
return ""; 


private void addMember(L1PcInstance pc) { 
if (!_members.contains(pc)) { 
_members.add(pc); 
pc.getInventory().consumeItem(40308,_adena); 

if (getMembersCount() == 1 && getBossRoomStatus() == STATUS_NONE) { 
GeneralThreadPool.getInstance().execute(new runBossRoom()); 



private class runBossRoom implements Runnable { 

public void run() { 

try { 

setBossRoomStatus(STATUS_READY); 
sendMessage("90秒後開始遊戲"); 
Thread.sleep(_readytime); 

sendMessage("倒數10秒"); 
Thread.sleep(5 * 1000); 

sendMessage("倒數5秒"); 
Thread.sleep(1000); 

sendMessage("4秒"); 
Thread.sleep(1000); 

sendMessage("3秒"); 
Thread.sleep(1000); 

sendMessage("2秒"); 
Thread.sleep(1000); 

sendMessage("1秒"); 
Thread.sleep(1000); 

if (checkPlayerCount()) { 

setBossRoomStatus(STATUS_PLAYING); 
spawnBoss(_bossId1,"1","2"); 
Thread.sleep(2 * 60000);

spawnBoss(_bossId2,"2","3"); 
Thread.sleep(2 * 60000);

spawnBoss(_bossId3,"3","4"); 
Thread.sleep(2 * 60000);

spawnBoss(_bossId4,"4","5"); 
Thread.sleep(2 * 60000);

spawnBoss(_bossId5,"5","6"); 
Thread.sleep(2 * 60000);

spawnBoss(_bossId6,"6","7"); 
Thread.sleep(2 * 60000);

spawnBoss(_bossId7,"7","8"); 
Thread.sleep(2 * 60000);

spawnBoss(_bossId8,"8","9"); 
Thread.sleep(2 * 60000);

spawnBoss(_bossId9,"9","10"); 
Thread.sleep(5 * 60000); 

spawnBoss(_bossId10,"10",null); 
Thread.sleep(5 * 60000); 

endBossRoom(); 


Thread.sleep(_cleartime); 

setBossRoomStatus(STATUS_NONE); 

} catch (InterruptedException e) { 
e.printStackTrace(); 





private boolean checkPlayerCount() { 
if (getMembersCount() < _minPlayer){ 
setBossRoomStatus(STATUS_CLEANING); 
sendMessage("人數不足 "+_minPlayer+" 人,所以強制關閉遊戲"); 
for (L1PcInstance pc : getMembersArray()) { 
pc.getInventory().storeItem(40308,_adena); 
pc.sendPackets(new S_SystemMessage("BOSS館退還金幣("+_adena+")。")); 
L1Teleport.teleport(pc, 33442, 32797, (short) 4, pc.getHeading(), true); 

clearMembers(); 
return false; 

return true; 


private void endBossRoom() { 
setBossRoomStatus(STATUS_CLEANING); 
sendMessage("BOSS館遊戲結束,請下次再來"); 
for (L1PcInstance pc : getMembersArray()) { 
L1Teleport.teleport(pc, 33442, 32797, (short) 4, pc.getHeading(), true); //結束傳送的地方

clearMembers(); 
clearColosseum(); 


private void clearColosseum() { 
for (Object obj : L1World.getInstance().getVisibleObjects(4941).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(); 




private void spawnBoss(int npcid, String msg1, String msg2) { 
if (msg1.equalsIgnoreCase("9")){ 
sendMessage("第 "+msg1+" 關 ["+ getBossName(npcid) +"] 5分後開始第 "+msg2+" 關"); 
} else if (msg1.equalsIgnoreCase("10")){ 
sendMessage("最後一關 ["+ getBossName(npcid) +"] 請努力撐下去,5分鐘後結束BOSS館"); 
} else { 
sendMessage("第 "+msg1+" 關 ["+ getBossName(npcid) +"] 2分後開始第 "+msg2+" 關"); 

spawn(npcid); 


private void spawn(int npcid) { 
try { 
L1NpcInstance npc = NpcTable.getInstance().newNpcInstance(npcid); 
npc.setId(IdFactory.getInstance().nextId()); 
npc.setMap((short)4941); 
npc.setX(32842); 
npc.setY(32761); 
Thread.sleep(1); 
npc.setHomeX(npc.getX()); 
npc.setHomeY(npc.getY()); 
npc.setHeading(4); 

L1World.getInstance().storeObject(npc); 
L1World.getInstance().addVisibleObject(npc); 
npc.turnOnOffLight(); 
npc.startChat(L1NpcInstance.CHAT_TIMING_APPEARANCE); 

} catch (Exception e) { 



private String getBossName(int npcId) { 
String BossName = null; 
Connection con = null; 
PreparedStatement pstm = null; 
ResultSet rs = null; 
try { 
con = L1DatabaseFactory.getInstance().getConnection(); 
pstm = con.prepareStatement("select name from npc where npcid = ?"); 
pstm.setInt(1, npcId); 
rs = pstm.executeQuery(); 
if (rs.next()) { 
BossName = rs.getString("name"); 

} catch (SQLException e) { 
} finally { 
SQLUtil.close(rs); 
SQLUtil.close(pstm); 
SQLUtil.close(con); 

return BossName; 


private void sendMessage(String msg) { 
for (L1PcInstance pc : getMembersArray()) { 
if (pc.getMapId() == 4941){ 
pc.sendPackets(new S_BlueMessage(166,"\\f3" + msg)); //夜小空 創意廣播 




private int _BossRoomStatus = STATUS_NONE; 

private void setBossRoomStatus(int i) { 
_BossRoomStatus = i; 


private int getBossRoomStatus() { 
return _BossRoomStatus; 


private void clearMembers() { 
_members.clear(); 


private boolean isMember(L1PcInstance pc) { 
return _members.contains(pc); 


private L1PcInstance[] getMembersArray() { 
return _members.toArray(new L1PcInstance[_members.size()]); 


private int getMembersCount() { 
return _members.size(); 


}

沒有留言:

張貼留言