I'm releasing this because it's at a very bare point right now. This does work flawlessly, however there isn't much to it other than killing dragons, receiving keys, and obtaining rewards. I'm going to expand on this dramatically so I thought it might be nice to release a bare skeleton to the server and see what people may do with it.
DragonDen
Code:
package com.exile.game.players.content.minigames.impl.dragonden;
/**
*
* @author Jason http://www.rune-server.org/members/jason
* @date Jan 24, 2014
*/
public class DragonDen {
public static DragonDen instance = new DragonDen();
private DragonDenGame game = new DragonDenGame();
private DragonDenLobby lobby = new DragonDenLobby();
private DragonDenWave wave = new DragonDenWave();
private DragonDenChest chest = new DragonDenChest();
public static DragonDen getInstance() {
return instance;
}
public DragonDen() {
}
public DragonDenWave getWave() {
return wave;
}
public DragonDenGame getGame() {
return game;
}
public DragonDenLobby getLobby() {
return lobby;
}
public DragonDenChest getChest() {
return chest;
}
}
DragonDenGame
Code:
package com.exile.game.players.content.minigames.impl.dragonden;
import java.util.ArrayList;
import java.util.Iterator;
import com.exile.Constants;
import com.exile.GameEngine;
import com.exile.event.CycleEvent;
import com.exile.event.CycleEventContainer;
import com.exile.event.CycleEventHandler;
import com.exile.game.npcs.NPC;
import com.exile.game.npcs.NPCHandler;
import com.exile.game.players.Boundaries;
import com.exile.game.players.Player;
import com.exile.game.players.content.TeleportHandler;
import com.exile.handlers.ItemHandler;
import com.exile.util.Misc;
/**
*
* @author Jason http://www.rune-server.org/members/jason
* @date Jan 23, 2014
*/
public class DragonDenGame {
public static final int MAXIMUM_TIME = 1000;
ArrayList<String> members = new ArrayList<String>();
private boolean active;
private int timeLeft;
public boolean add(Player player) {
if(!TeleportHandler.ableToTeleport(player))
return false;
player.getPA().movePlayer(3291, 4939, 0);
player.sendMessage("You are now in the dragon den game, a game is currently active.");
appendShield(player);
if(!members.contains(player.playerName))
members.add(player.playerName);
return true;
}
public boolean remove(Player player) {
if(!members.contains(player.playerName))
return false;
if(!Boundaries.isInArea(player, Boundaries.DRAGON_DEN_GAME))
return false;
player.sendMessage("You have left the dragon den game.");
player.getPA().movePlayer(3678, 2955, 0);
return true;
}
public boolean contains(String name) {
Iterator<String> iterator = members.iterator();
while(iterator.hasNext()) {
if(iterator.next().equalsIgnoreCase(name))
return true;
}
return false;
}
public int size() {
int amount = 0;
Iterator<String> iterator = members.iterator();
String name;
while(iterator.hasNext()) {
name = iterator.next();
Player player = Player.getPlayer(name);
if(player != null && Boundaries.isInArea(player, Boundaries.DRAGON_DEN_GAME))
amount++;
}
return amount;
}
public void drawInterface(Player player) {
player.getPA().sendString("", 21120);
player.getPA().sendString("@or2@Wave: "+DragonDen.getInstance().getWave().getWaveId() + "/4", 21121);
player.getPA().sendString("@or2@Time left: "+player.getPA().getTimeRemaining(getTimeLeft()), 21122);
player.getPA().sendString("@or2@Players: "+size(), 21123);
player.getPA().walkableInterface(21119);
}
public void end(boolean win) {
Iterator<String> iterator = members.iterator();
String name;
while(iterator.hasNext()) {
name = iterator.next();
Player player = Player.getPlayer(name);
if(player == null)
continue;
if(!Boundaries.isInArea(player, Boundaries.DRAGON_DEN_GAME))
continue;
if(win) {
player.getPA().movePlayer(Constants.MOS_LE_HARMLESS_X, Constants.MOS_LE_HARMLESS_Y, 0);
player.dragonDenInfo[0] += 100;
player.dragonDenInfo[1]++;
player.getItems().addItemToBank(14471, 3);
player.sendMessage("You gain 100 dragon den points. 3x dragon kin keys are added to your bank.");
//iterator.remove();
} else {
player.getPA().movePlayer(Constants.MOS_LE_HARMLESS_X, Constants.MOS_LE_HARMLESS_Y, 0);
int pts = 10 * (1 + DragonDen.getInstance().getWave().getWaveId());
player.dragonDenInfo[0] += pts;
player.sendMessage("You didn't beat the dragon den minigame, you only gain "+pts+" dragon den points.");
//iterator.remove();
}
}
stop();
}
public void stop() {
members.clear();
members.trimToSize();
setActive(false);
setTimeLeft(-1);
CycleEventHandler.getSingleton().stopEvents(CycleEventHandler.DRAGON_DEN_GAME_ID);
}
public void start(ArrayList<String> members) {
this.members = members;
for(String name : members) {
Player player = Player.getPlayer(name);
if(player != null && Boundaries.isInArea(player, Boundaries.DRAGON_DEN_LOBBY)) {
player.getPA().movePlayer(3291, 4939, 0);
player.sendMessage("You are now in the dragon den game, the game will start in 30 seconds.");
player.sendMessage("The initial wave of dragons will spawn north, be ready.");
appendShield(player);
}
}
//GameEngine.npcHandler.spawnNpc(8852, 3292, 4941, 0, 1, 1000, 20, 50, 50);
DragonDen.getInstance().getWave().setWaveId(0);
DragonDen.getInstance().getWave().setSpawning(false);
createCycle();
DragonDen.getInstance().getWave().create();
}
public void createCycle() {
CycleEventHandler.getSingleton().stopEvents(CycleEventHandler.DRAGON_DEN_GAME_ID);
setTimeLeft(MAXIMUM_TIME);
setActive(true);
CycleEventHandler.getSingleton().addEvent(CycleEventHandler.DRAGON_DEN_GAME_ID, this, new CycleEvent() {
@Override
public void execute(CycleEventContainer container) {
if(getTimeLeft() < MAXIMUM_TIME / 2) {
if(!isActive() || size() == 0) {
DragonDen.getInstance().getGame().stop();
container.stop();
return;
}
}
setTimeLeft(getTimeLeft() - 1);
if(getTimeLeft() <= 0) {
end(false);
container.stop();
return;
}
int size = GameEngine.npcHandler.totalNpcsInArea(3301, 4970, 25);
if(!DragonDen.getInstance().getWave().isSpawning()) {
if(DragonDen.getInstance().getWave().getWaveId() == 4 && size == 0) {
end(true);
container.stop();
return;
}
if(size <= 0) {
DragonDen.getInstance().getWave().setWaveId(DragonDen.getInstance().getWave().getWaveId() + 1);
DragonDen.getInstance().getWave().create();
}
}
}
@Override
public void stop() {
}
}, 2);
}
public void dropBones(Player player, NPC npc) {
if(npc != null && player != null) {
if(Boundaries.isInArea(npc, Boundaries.DRAGON_DEN_GAME)) {
if(Misc.random(100) == 0 && npc.npcType != 50) {
ItemHandler.createGroundItem(player, 14471, npc.absX, npc.absY, 0, 1, player.playerId);
}
int boneId = 0;
String name = NPCHandler.getNpcListName(npc.npcType).toLowerCase();
if(name.contains("dragon")) {
if(name.contains("baby"))
boneId = 535;
else if(name.contains("frost"))
boneId = 18831;
else
boneId = 537;
ItemHandler.createGroundItem(player, boneId, npc.absX, npc.absY, 0, 1 + Misc.random(1),
player.playerId);
}
}
}
}
private void appendShield(Player player) {
boolean requires = false;
if(!player.getItems().playerHasItem(1540) && !player.getItems().playerHasItem(11283, 1)
&& player.playerEquipment[Player.playerShield] != 1540 && player.playerEquipment[Player.playerShield] != 11283)
requires = true;
if(requires) {
if(player.playerEquipment[Player.playerShield] == -1) {
player.getItems().wearItem(1540, 1, Player.playerShield);
} else if(player.getItems().freeSlots() == 0) {
ItemHandler.createGroundItem(player, 1540, player.absX, player.absY, 0,
1, player.playerId);
} else {
player.getItems().addItem(1540, 1);
}
player.sendMessage("You have been given an Anti-dragonfire shield because it's dangerous.");
}
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
public int getTimeLeft() {
return timeLeft;
}
public void setTimeLeft(int timeLeft) {
this.timeLeft = timeLeft;
}
}
DragonDenLobby
Code:
package com.exile.game.players.content.minigames.impl.dragonden;
import java.util.ArrayList;
import java.util.Iterator;
import com.exile.event.CycleEvent;
import com.exile.event.CycleEventContainer;
import com.exile.event.CycleEventHandler;
import com.exile.game.players.Boundaries;
import com.exile.game.players.Player;
import com.exile.game.players.content.TeleportHandler;
import com.exile.util.Misc;
/**
*
* @author Jason http://www.rune-server.org/members/jason
* @date Jan 23, 2014
*/
public class DragonDenLobby {
public static final int MAXIMUM_TIME = 100;
public static final int MAXIMUM_SIZE = 20;
ArrayList<String> members = new ArrayList<String>();
private boolean active;
private int timeLeft;
public boolean add(Player player) {
if(Boundaries.isInArea(player, Boundaries.DRAGON_DEN_LOBBY) && members.contains(player.playerName)) {
player.sendMessage("You are already in the dragon den lobby area.");
return false;
}
if(!TeleportHandler.ableToTeleport(player))
return false;
if(size() >= MAXIMUM_SIZE) {
player.sendMessage("There are already "+MAXIMUM_SIZE+" players in the dragon den lobby.");
return false;
}
if(DragonDen.getInstance().getGame().isActive()
&& DragonDen.getInstance().getGame().getTimeLeft() > (DragonDenGame.MAXIMUM_TIME / 2)) {
DragonDen.getInstance().getGame().add(player);
return true;
}
TeleportHandler.teleport(player, 2840 + Misc.random(1), 4317 + Misc.random(1), 0, "auto");
if(!members.contains(player.playerName))
members.add(player.playerName);
if(!isActive())
createCycle();
return true;
}
public boolean remove(Player player) {
if(!members.contains(player.playerName))
return false;
if(!Boundaries.isInArea(player, Boundaries.DRAGON_DEN_LOBBY))
return false;
player.sendMessage("You have left the dragon den waiting lobby.");
player.getPA().movePlayer(3678, 2955, 0);
return true;
}
public boolean contains(String name) {
Iterator<String> iterator = members.iterator();
while(iterator.hasNext()) {
if(iterator.next().equalsIgnoreCase(name))
return true;
}
return false;
}
public int size() {
int amount = 0;
Iterator<String> iterator = members.iterator();
String name;
while(iterator.hasNext()) {
name = iterator.next();
Player player = Player.getPlayer(name);
if(player != null && Boundaries.isInArea(player, Boundaries.DRAGON_DEN_LOBBY))
amount++;
}
return amount;
}
public void drawInterface(Player player) {
player.getPA().sendString("", 21120);
player.getPA().sendString("@or2@Players: "+size()+" / "+MAXIMUM_SIZE, 21121);
player.getPA().sendString("@or2@Time left: "+player.getPA().getTimeRemaining(getTimeLeft()), 21122);
player.getPA().sendString("", 21123);
player.getPA().walkableInterface(21119);
}
public void stop() {
members = new ArrayList<String>();
setActive(false);
setTimeLeft(-1);
CycleEventHandler.getSingleton().stopEvents(CycleEventHandler.DRAGON_DEN_LOBBY_ID);
}
public void createCycle() {
CycleEventHandler.getSingleton().stopEvents(CycleEventHandler.DRAGON_DEN_LOBBY_ID);
setTimeLeft(DragonDen.getInstance().getGame().isActive() ? DragonDen.getInstance().getGame().getTimeLeft() + 10 : MAXIMUM_TIME);
setActive(true);
CycleEventHandler.getSingleton().addEvent(CycleEventHandler.DRAGON_DEN_LOBBY_ID, this, new CycleEvent() {
@Override
public void execute(CycleEventContainer container) {
if(getTimeLeft() < (MAXIMUM_TIME / 2)) {
if(!isActive() || size() == 0) {
DragonDen.getInstance().getLobby().stop();
container.stop();
return;
}
}
setTimeLeft(getTimeLeft() - 1);
if(getTimeLeft() > 10)
setTimeLeft(5);
if(getTimeLeft() <= 0) {
if(DragonDen.getInstance().getGame().isActive()) {
container.stop();
createCycle();
return;
}
DragonDen.getInstance().getGame().start(members);
DragonDen.getInstance().getLobby().stop();
container.stop();
return;
}
}
@Override
public void stop() {
}
}, 2);
}
public boolean isActive() {
return active;
}
public void setActive(boolean active) {
this.active = active;
}
public int getTimeLeft() {
return timeLeft;
}
public void setTimeLeft(int timeLeft) {
this.timeLeft = timeLeft;
}
}
DragonDenWave
Code:
package com.exile.game.players.content.minigames.impl.dragonden;
import com.exile.GameEngine;
import com.exile.event.CycleEvent;
import com.exile.event.CycleEventContainer;
import com.exile.event.CycleEventHandler;
import com.exile.game.npcs.NPCHandler;
public class DragonDenWave {
static final int GREEN_DRAGON = 941;
static final int BLACK_DRAGON = 54;
static final int RED_DRAGON = 53;
static final int BABY_BLUE_DRAGON = 52;
static final int FROST_DRAGON = 51;
static final int MITHRIL_DRAGON = 5363;
static final int KING_BLACK_DRAGON = 50;
static final int BABY_RED_DRAGON = 1589;
static final int BRONZE_DRAGON = 1590;
static final int IRON_DRAGON = 1591;
static final int STEEL_DRAGON = 1592;
public static final int[][] DRAGON = {
{BABY_BLUE_DRAGON, BABY_BLUE_DRAGON, BABY_RED_DRAGON, GREEN_DRAGON, RED_DRAGON},
{GREEN_DRAGON, GREEN_DRAGON, RED_DRAGON, BRONZE_DRAGON, BLACK_DRAGON},
{BRONZE_DRAGON, IRON_DRAGON, STEEL_DRAGON, MITHRIL_DRAGON, FROST_DRAGON},
{STEEL_DRAGON, FROST_DRAGON, MITHRIL_DRAGON, FROST_DRAGON, MITHRIL_DRAGON},
{FROST_DRAGON, MITHRIL_DRAGON, MITHRIL_DRAGON, MITHRIL_DRAGON, KING_BLACK_DRAGON}
};
public static final int[][] LOCATION = {
{3289, 4967},
{3298, 4965},
{3305, 4971},
{3299, 4976},
{3306, 4980}
};
private int waveId;
private boolean isSpawning;
public DragonDenWave() {
}
public void create() {
if(isSpawning())
return;
setSpawning(true);
CycleEventHandler.getSingleton().addEvent(this, new CycleEvent() {
@Override
public void execute(CycleEventContainer container) {
if(DragonDen.getInstance().getWave() == null) {
container.stop();
return;
}
if(waveId > 4) {
DragonDen.getInstance().getGame().end(true);
setWaveId(0);
container.stop();
return;
}
if(!DragonDen.getInstance().getGame().isActive()) {
DragonDen.getInstance().getGame().stop();
container.stop();
}
for(int i = 0; i < LOCATION.length; i++) {
int x = LOCATION[i][0];
int y = LOCATION[i][1];
int npcId = DRAGON[waveId][i];
int health = NPCHandler.getNpcListHP(npcId);
int combat = NPCHandler.getNpcListCombat(npcId);
int maxHit = combat < 50 ? 10 : combat > 50 && combat < 200 ? 20 : combat > 200 ? 30 : 10;
int stats = health / 10;
GameEngine.npcHandler.spawnNpc(npcId, x, y, 0, 1, health, maxHit, stats, stats);
}
container.stop();
}
@Override
public void stop() {
setSpawning(false);
}
}, 15);
}
public int getWaveId() {
return waveId;
}
public void setWaveId(int waveId) {
this.waveId = waveId;
}
public boolean isSpawning() {
return isSpawning;
}
public void setSpawning(boolean isSpawning) {
this.isSpawning = isSpawning;
}
}
DragonDenChest
Code:
package com.exile.game.players.content.minigames.impl.dragonden;
import com.exile.event.CycleEvent;
import com.exile.event.CycleEventContainer;
import com.exile.event.CycleEventHandler;
import com.exile.game.items.ItemAssistant;
import com.exile.game.players.Player;
import com.exile.game.players.PlayerAssistant;
import com.exile.util.Misc;
/**
*
* @author Jason http://www.rune-server.org/members/jason
* @date Jan 29, 2014
*/
public class DragonDenChest {
public static final int KEY_ID = 14471;
public static final int SMALL = 0, MEDIUM = 1, BIG = 2, LARGE = 3;
public static final int REWARDS[][][] = {
{
{535, 10}, {537, 5}, {537, 8}, {9244, 5},
},
{
{535, 15}, {537, 10}, {537, 15},
},
{
{18831, 10}, {1149, 1}, {1337, 1}, {3204, 1}, {2366, 1}, {2368, 1}, {11732, 1}, {11212, 15},
{1434, 1}, {1305, 1}, {1249, 1}, {5698, 1}, {4587, 1}, {11212, 10}, {9244, 15}, {1540, 1},
},
{
{18831, 50}, {11286, 1}, {1187, 1}, {19305, 1}, {19302, 1}, {19299, 1}, {19296, 1}, {19293, 1},
{19290, 1}, {19287, 1}, {19284, 1}, {19281, 1}, {15259, 1}, {14484, 1}, {14472, 1}, {14474, 1},
{14476, 1}, {4087, 1}, {4585, 1}, {3140, 1},
}
};
public DragonDenChest() {
}
public void open(final Player player) {
if(!player.getItems().playerHasItem(KEY_ID)) {
player.getDH().sendStatement("You need a Dragon Kin Key to open this chest.");
player.nextChat = -1;
return;
}
player.startAnimation(881);
CycleEventHandler.getSingleton().stopEvents(player, CycleEventHandler.DRAGON_DEN_CHEST_ID);
CycleEventHandler.getSingleton().addEvent(CycleEventHandler.DRAGON_DEN_CHEST_ID, player, new CycleEvent() {
@SuppressWarnings("unused")
@Override
public void execute(CycleEventContainer container) {
if(player == null) {
container.stop();
return;
}
if(!player.getItems().playerHasItem(KEY_ID)) {
player.getDH().sendStatement("You need a Dragon Kin Key to open this chest.");
player.nextChat = -1;
container.stop();
return;
}
player.getItems().deleteItem2(KEY_ID, 1);
int random = Misc.random(100);
int index = 0;
if(random < 40)
index = 0;
else if(random >= 40 && random < 90)
index = 1;
else if(random >= 90 && random <= 98)
index = 2;
else
index = 3;
int randomIndex = Misc.random(REWARDS[index].length - 1);
player.getItems().addItem(REWARDS[index][randomIndex][0], REWARDS[index][randomIndex][1]);
if(index == 3)
PlayerAssistant.globalMessage(255, player.playerName+" has received "+REWARDS[index][randomIndex][1]+"x "+ItemAssistant.getName(REWARDS[index][randomIndex][0])+" from the burnt chest.");
container.stop();
}
@Override
public void stop() {
// TODO Auto-generated method stub
}
}, 3);
}
}