mirror of
https://github.com/DRE2N/DungeonsXL.git
synced 2024-11-28 13:36:33 +01:00
commit
3bf602e68d
13
pom.xml
13
pom.xml
@ -2,7 +2,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<groupId>io.github.dre2n</groupId>
|
||||
<artifactId>dungeonsxl</artifactId>
|
||||
<version>0.12.1-SNAPSHOT${buildNo}</version>
|
||||
<version>0.13${buildNo}</version>
|
||||
<packaging>jar</packaging>
|
||||
<name>DungeonsXL</name>
|
||||
<url>https://dre2n.github.io</url>
|
||||
@ -47,7 +47,7 @@
|
||||
<relocations>
|
||||
<relocation>
|
||||
<pattern>io.github.dre2n.commons</pattern>
|
||||
<shadedPattern>io.github.dre2n.util.commons</shadedPattern>
|
||||
<shadedPattern>io.github.dre2n.dungeonsxl.util.commons</shadedPattern>
|
||||
</relocation>
|
||||
<relocation>
|
||||
<pattern>io.github.dre2n.caliburn</pattern>
|
||||
@ -87,12 +87,12 @@
|
||||
<dependency>
|
||||
<groupId>io.github.dre2n</groupId>
|
||||
<artifactId>caliburn</artifactId>
|
||||
<version>0.1.5</version>
|
||||
<version>0.1.6</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.github.dre2n</groupId>
|
||||
<artifactId>itemsxl</artifactId>
|
||||
<version>0.1.5</version>
|
||||
<version>0.1.6</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>io.github.dre2n</groupId>
|
||||
@ -105,6 +105,11 @@
|
||||
<version>2.0.18-SNAPSHOT</version>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.gmail.filoghost</groupId>
|
||||
<artifactId>holographicdisplaysapi</artifactId>
|
||||
<version>2.1.7</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
<repositories>
|
||||
<repository>
|
||||
|
@ -17,10 +17,6 @@
|
||||
package io.github.dre2n.dungeonsxl;
|
||||
|
||||
import io.github.dre2n.caliburn.CaliburnAPI;
|
||||
import io.github.dre2n.caliburn.item.ItemCategories;
|
||||
import io.github.dre2n.caliburn.item.Items;
|
||||
import io.github.dre2n.caliburn.mob.MobCategories;
|
||||
import io.github.dre2n.caliburn.mob.Mobs;
|
||||
import io.github.dre2n.commons.command.BRCommands;
|
||||
import io.github.dre2n.commons.compatibility.Internals;
|
||||
import io.github.dre2n.commons.compatibility.Version;
|
||||
@ -63,8 +59,6 @@ import io.github.dre2n.itemsxl.ItemsXL;
|
||||
import java.io.File;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.scheduler.BukkitTask;
|
||||
|
||||
@ -334,8 +328,7 @@ public class DungeonsXL extends BRPlugin {
|
||||
caliburn = ItemsXL.getInstance().getAPI();
|
||||
} else {
|
||||
caliburn = new CaliburnAPI(this);
|
||||
ConfigurationSection placeholder = new YamlConfiguration();
|
||||
caliburn.setup(new Items(caliburn), new Mobs(caliburn), new ItemCategories(caliburn, placeholder), new MobCategories(caliburn, placeholder));
|
||||
caliburn.setupClean();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -94,7 +94,7 @@ public class Announcer {
|
||||
if (multiFloor) {
|
||||
dungeonName = identifier;
|
||||
|
||||
Dungeon dungeon = plugin.getDungeons().getDungeon(identifier);
|
||||
Dungeon dungeon = plugin.getDungeons().getByName(identifier);
|
||||
if (dungeon != null) {
|
||||
mapName = dungeon.getConfig().getStartFloor();
|
||||
}
|
||||
@ -135,7 +135,7 @@ public class Announcer {
|
||||
if (multiFloor) {
|
||||
dungeonName = identifier;
|
||||
|
||||
Dungeon dungeon = plugin.getDungeons().getDungeon(identifier);
|
||||
Dungeon dungeon = plugin.getDungeons().getByName(identifier);
|
||||
if (dungeon != null) {
|
||||
mapName = dungeon.getConfig().getStartFloor();
|
||||
}
|
||||
|
@ -75,7 +75,7 @@ public class ListCommand extends BRCommand {
|
||||
if (args.length >= 2) {
|
||||
if (args[1].equalsIgnoreCase("dungeons") || args[1].equalsIgnoreCase("d")) {
|
||||
if (args.length >= 3) {
|
||||
Dungeon dungeon = plugin.getDungeons().getDungeon(args[2]);
|
||||
Dungeon dungeon = plugin.getDungeons().getByName(args[2]);
|
||||
if (dungeon != null) {
|
||||
MessageUtil.sendPluginTag(sender, plugin);
|
||||
MessageUtil.sendCenteredMessage(sender, "&4&l[ &6" + dungeon.getName() + " &4&l]");
|
||||
|
@ -70,7 +70,7 @@ public class PlayCommand extends BRCommand {
|
||||
identifier = args[2];
|
||||
mapName = identifier;
|
||||
if (args[1].equalsIgnoreCase("dungeon") || args[1].equalsIgnoreCase("d")) {
|
||||
Dungeon dungeon = plugin.getDungeons().getDungeon(args[2]);
|
||||
Dungeon dungeon = plugin.getDungeons().getByName(args[2]);
|
||||
if (dungeon != null) {
|
||||
multiFloor = true;
|
||||
mapName = dungeon.getConfig().getStartFloor();
|
||||
@ -102,7 +102,7 @@ public class PlayCommand extends BRCommand {
|
||||
|
||||
} else {
|
||||
dGroup.setDungeonName(identifier);
|
||||
Dungeon dungeon = plugin.getDungeons().getDungeon(identifier);
|
||||
Dungeon dungeon = plugin.getDungeons().getByName(identifier);
|
||||
|
||||
if (dungeon != null) {
|
||||
DungeonConfig config = dungeon.getConfig();
|
||||
|
@ -56,14 +56,13 @@ public enum DMessages implements Messages {
|
||||
ERROR_COOLDOWN("Error_Cooldown", "&4You can only enter this dungeon every &6&v1&4 hours!"),
|
||||
ERROR_DISPENSER("Error_Dispenser", "&4You cannot access this dispenser!"),
|
||||
ERROR_DROP("Error_Drop", "&4You cannot drop safe items"),
|
||||
ERROR_DUNGEON_NOT_EXIST("Error_DungeonNotExist", "&4Dungeon &6&v1&4 does not exist!"),
|
||||
ERROR_DUNGEON_NOT_EXIST("Error_DungeonNotExist", "&4This dungeon does not exist."),
|
||||
ERROR_ENDERCHEST("Error_Enderchest", "&4You cannot use an enderchest while in a dungeon!"),
|
||||
ERROR_IN_GROUP("Error_InGroup", "&4The player &6&v1&4 is already member of a group."),
|
||||
ERROR_JOIN_GROUP("Error_JoinGroup", "&4You have to join a group first!"),
|
||||
ERROR_LEAVE_DUNGEON("Error_LeaveDungeon", "&4You have to leave your current dungeon first!"),
|
||||
ERROR_LEAVE_GAME("Error_LeaveGame", "&4You have to leave your current game first!"),
|
||||
ERROR_LEAVE_GROUP("Error_LeaveGroup", "&4You have to leave your group first!"),
|
||||
ERROR_LEFT_CLICK("Error_Leftklick", "&4You have to use Left-Click on this sign!"),
|
||||
ERROR_MSG_ID_NOT_EXIST("Error_MsgIdNotExist", "&4Messages with Id &6&v1&4 does not exist!"),
|
||||
ERROR_MSG_FORMAT("Error_MsgFormat", "&4The Messages has to be between \"!"),
|
||||
ERROR_MSG_NO_INT("Error_MsgNoInt", "&4The argument [id] has to include a number!"),
|
||||
@ -139,16 +138,18 @@ public enum DMessages implements Messages {
|
||||
PLAYER_CHECKPOINT_REACHED("Player_CheckpointReached", "&6Checkpoint reached!"),
|
||||
PLAYER_DEATH("Player_Death", "&6You died, lives left: &2&v1"),
|
||||
PLAYER_DEATH_KICK("Player_DeathKick", "&2&v1&6 died and lost his last life."),
|
||||
PLAYER_FINISHED_DUNGEON("Player_FinishedDungeon", "&6You successfully finished the Dungeon!"),
|
||||
PLAYER_FINISHED_DUNGEON("Player_FinishedDungeon", "&6You successfully finished the dungeon!"),
|
||||
PLAYER_INVITED("Player_Invited", "&4&v1&6 invited you to the group &4&v2&6."),
|
||||
PLAYER_UNINVITED("Player_Uninvited", "&4&v1&6 took back your invitation to the group &4&v2&6."),
|
||||
PLAYER_JOIN_GROUP("Player_JoinGroup", "&6You successfully joined the group!"),
|
||||
PLAYER_KICKED("Player_Kicked", "&4You have been kicked out of the group &6&v1&4."),
|
||||
PLAYER_LEAVE_GROUP("Player_LeaveGroup", "&6You have successfully left your group!"),
|
||||
PLAYER_LEFT_GROUP("Player_LeftGroup", "&6Player &4&v1&6 has left the Group!"),
|
||||
PLAYER_LIVES_ADDED("Player_LivesAdded", "&6Received a bonus of &4&v1&6 lives."),
|
||||
PLAYER_LIVES_REMOVED("Player_LivesRemoved", "&6You lost &4&v1&6 lives!"),
|
||||
PLAYER_LOOT_ADDED("Player_LootAdded", "&4&v1&6 have been added to your reward inventory!"),
|
||||
PLAYER_NEW_CAPTAIN("Player_NewCaptain", "&6You are now the new captain of your group."),
|
||||
PLAYER_OFFLINE("Player_Offline", "&Player &4&v1&6 went offline. In &4&v2&6 seconds he will autmatically be kicked from the Dungeon!"),
|
||||
PLAYER_OFFLINE("Player_Offline", "&Player &4&v1&6 went offline. In &4&v2&6 seconds he will autmatically be kicked from the dungeon!"),
|
||||
PLAYER_OFFLINE_NEVER("Player_OfflineNever", "&6The player &4&v1&6 went offline. He will &4not&6 be kicked from the dungeon automatically!"),
|
||||
PLAYER_PORTAL_ABORT("Player_PortalAbort", "&6Portal creation cancelled!"),
|
||||
PLAYER_PORTAL_INTRODUCTION("Player_PortalIntroduction", "&6Click the two edges of the portal with the wooden sword!"),
|
||||
|
@ -26,7 +26,9 @@ import io.github.dre2n.dungeonsxl.game.GameType;
|
||||
import io.github.dre2n.dungeonsxl.requirement.FeeLevelRequirement;
|
||||
import io.github.dre2n.dungeonsxl.requirement.FeeMoneyRequirement;
|
||||
import io.github.dre2n.dungeonsxl.requirement.GroupSizeRequirement;
|
||||
import io.github.dre2n.dungeonsxl.requirement.PermissionRequirement;
|
||||
import io.github.dre2n.dungeonsxl.requirement.Requirement;
|
||||
import io.github.dre2n.dungeonsxl.requirement.RequirementTypeDefault;
|
||||
import io.github.dre2n.dungeonsxl.util.DeserialisazionUtil;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
@ -190,15 +192,18 @@ public class WorldConfig extends GameRules {
|
||||
Requirement requirement = Requirement.create(plugin.getRequirementTypes().getByIdentifier(identifier));
|
||||
|
||||
// Check for built-in requirements
|
||||
if (requirement instanceof FeeMoneyRequirement) {
|
||||
if (requirement.getType() == RequirementTypeDefault.FEE_MONEY) {
|
||||
((FeeMoneyRequirement) requirement).setFee(configFile.getDouble("requirements.feeMoney"));
|
||||
|
||||
} else if (requirement instanceof FeeLevelRequirement) {
|
||||
} else if (requirement.getType() == RequirementTypeDefault.FEE_LEVEL) {
|
||||
((FeeLevelRequirement) requirement).setFee(configFile.getInt("requirements.feeLevel"));
|
||||
|
||||
} else if (requirement instanceof GroupSizeRequirement) {
|
||||
} else if (requirement.getType() == RequirementTypeDefault.GROUP_SIZE) {
|
||||
((GroupSizeRequirement) requirement).setMinimum(configFile.getInt("requirements.groupSize.minimum"));
|
||||
((GroupSizeRequirement) requirement).setMaximum(configFile.getInt("requirements.groupSize.maximum"));
|
||||
|
||||
} else if (requirement.getType() == RequirementTypeDefault.PERMISSION) {
|
||||
((PermissionRequirement) requirement).setPermissions(configFile.getStringList("requirements.permission"));
|
||||
}
|
||||
|
||||
requirements.add(requirement);
|
||||
|
@ -40,21 +40,14 @@ public class Dungeons {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the dungeons
|
||||
*/
|
||||
public List<Dungeon> getDungeons() {
|
||||
return dungeons;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name
|
||||
* the name of the Dungeon
|
||||
* @return the Dungeon that has the name
|
||||
*/
|
||||
public Dungeon getDungeon(String name) {
|
||||
public Dungeon getByName(String name) {
|
||||
for (Dungeon dungeon : dungeons) {
|
||||
if (dungeon.getName().equals(name)) {
|
||||
if (dungeon.getName().equalsIgnoreCase(name)) {
|
||||
return dungeon;
|
||||
}
|
||||
}
|
||||
@ -62,6 +55,13 @@ public class Dungeons {
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the dungeons
|
||||
*/
|
||||
public List<Dungeon> getDungeons() {
|
||||
return dungeons;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param name
|
||||
* the name of the Dungeon
|
||||
|
@ -48,7 +48,7 @@ public class Game {
|
||||
|
||||
private List<DGroup> dGroups = new ArrayList<>();
|
||||
private boolean started;
|
||||
private GameType type;
|
||||
private GameType type = GameTypeDefault.DEFAULT;
|
||||
private GameWorld world;
|
||||
private GameRules rules;
|
||||
private int waveCount;
|
||||
@ -381,7 +381,7 @@ public class Game {
|
||||
public void run() {
|
||||
if (teleport) {
|
||||
for (Player player : getPlayers()) {
|
||||
PlayerUtil.secureTeleport(player, world.getStartLocation());
|
||||
PlayerUtil.secureTeleport(player, world.getStartLocation(DGroup.getByPlayer(player)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -185,13 +185,13 @@ public class DPortal extends GlobalProtection {
|
||||
}
|
||||
}
|
||||
|
||||
if (target == null) {
|
||||
if (target == null && dGroup.getMapName() != null) {
|
||||
target = new GameWorld(dGroup.getMapName());
|
||||
dGroup.setGameWorld(target);
|
||||
}
|
||||
|
||||
if (target == null) {
|
||||
MessageUtil.sendMessage(player, DMessages.ERROR_DUNGEON_NOT_EXIST.getMessage(DGroup.getByPlayer(player).getMapName()));
|
||||
MessageUtil.sendMessage(player, DMessages.ERROR_DUNGEON_NOT_EXIST.getMessage());
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -63,7 +63,7 @@ public class GameSign extends GlobalProtection {
|
||||
this.setMultiFloor(multiFloor);
|
||||
if (multiFloor) {
|
||||
dungeonName = identifier;
|
||||
Dungeon dungeon = plugin.getDungeons().getDungeon(identifier);
|
||||
Dungeon dungeon = plugin.getDungeons().getByName(identifier);
|
||||
if (dungeon != null) {
|
||||
mapName = dungeon.getConfig().getStartFloor();
|
||||
} else {
|
||||
@ -511,6 +511,8 @@ public class GameSign extends GlobalProtection {
|
||||
|
||||
if (topSign.getLine(0).equals(NEW_GAME)) {
|
||||
Game game = new Game(dGroup);
|
||||
dGroup.setDungeonName(gameSign.dungeonName);
|
||||
dGroup.setMapName(gameSign.mapName);
|
||||
gameSign.games[column] = game;
|
||||
gameSign.update();
|
||||
|
||||
|
@ -62,7 +62,7 @@ public class GroupSign extends GlobalProtection {
|
||||
this.setMultiFloor(multiFloor);
|
||||
if (multiFloor) {
|
||||
dungeonName = identifier;
|
||||
Dungeon dungeon = plugin.getDungeons().getDungeon(identifier);
|
||||
Dungeon dungeon = plugin.getDungeons().getByName(identifier);
|
||||
if (dungeon != null) {
|
||||
mapName = dungeon.getConfig().getStartFloor();
|
||||
} else {
|
||||
|
@ -22,7 +22,6 @@ import io.github.dre2n.dungeonsxl.config.DMessages;
|
||||
import io.github.dre2n.dungeonsxl.config.MainConfig;
|
||||
import io.github.dre2n.dungeonsxl.event.dgroup.DGroupCreateEvent;
|
||||
import io.github.dre2n.dungeonsxl.event.dplayer.DPlayerDeathEvent;
|
||||
import io.github.dre2n.dungeonsxl.event.dplayer.DPlayerKickEvent;
|
||||
import io.github.dre2n.dungeonsxl.game.Game;
|
||||
import io.github.dre2n.dungeonsxl.global.DPortal;
|
||||
import io.github.dre2n.dungeonsxl.global.GameSign;
|
||||
@ -39,6 +38,7 @@ import io.github.dre2n.dungeonsxl.player.DPlayers;
|
||||
import io.github.dre2n.dungeonsxl.player.DSavePlayer;
|
||||
import io.github.dre2n.dungeonsxl.reward.DLootInventory;
|
||||
import io.github.dre2n.dungeonsxl.reward.RewardChest;
|
||||
import io.github.dre2n.dungeonsxl.sign.OpenDoorSign;
|
||||
import io.github.dre2n.dungeonsxl.task.RespawnTask;
|
||||
import io.github.dre2n.dungeonsxl.trigger.InteractTrigger;
|
||||
import io.github.dre2n.dungeonsxl.trigger.UseItemTrigger;
|
||||
@ -133,16 +133,7 @@ public class PlayerListener implements Listener {
|
||||
}
|
||||
|
||||
if (dPlayer.getLives() == 0 && dPlayer.isReady()) {
|
||||
DPlayerKickEvent dPlayerKickEvent = new DPlayerKickEvent(dPlayer, DPlayerKickEvent.Cause.DEATH);
|
||||
plugin.getServer().getPluginManager().callEvent(dPlayerKickEvent);
|
||||
|
||||
if (!dPlayerKickEvent.isCancelled()) {
|
||||
MessageUtil.broadcastMessage(DMessages.PLAYER_DEATH_KICK.getMessage(player.getName()));
|
||||
dPlayer.leave();
|
||||
if (game.getRules().getKeepInventoryOnEscape()) {
|
||||
dPlayer.applyRespawnInventory();
|
||||
}
|
||||
}
|
||||
dPlayer.kill();
|
||||
}
|
||||
}
|
||||
|
||||
@ -234,28 +225,26 @@ public class PlayerListener implements Listener {
|
||||
GameWorld gameWorld = GameWorld.getByWorld(player.getWorld());
|
||||
if (gameWorld != null) {
|
||||
if (event.getAction() == Action.RIGHT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_AIR) {
|
||||
if (UseItemTrigger.hasTriggers(gameWorld)) {
|
||||
String name = null;
|
||||
if (item.hasItemMeta()) {
|
||||
if (item.getItemMeta().hasDisplayName()) {
|
||||
name = item.getItemMeta().getDisplayName();
|
||||
String name = null;
|
||||
if (item.hasItemMeta()) {
|
||||
if (item.getItemMeta().hasDisplayName()) {
|
||||
name = item.getItemMeta().getDisplayName();
|
||||
|
||||
} else if (item.getType() == Material.WRITTEN_BOOK || item.getType() == Material.BOOK_AND_QUILL) {
|
||||
if (item.getItemMeta() instanceof BookMeta) {
|
||||
BookMeta meta = (BookMeta) item.getItemMeta();
|
||||
if (meta.hasTitle()) {
|
||||
name = meta.getTitle();
|
||||
}
|
||||
} else if (item.getType() == Material.WRITTEN_BOOK || item.getType() == Material.BOOK_AND_QUILL) {
|
||||
if (item.getItemMeta() instanceof BookMeta) {
|
||||
BookMeta meta = (BookMeta) item.getItemMeta();
|
||||
if (meta.hasTitle()) {
|
||||
name = meta.getTitle();
|
||||
}
|
||||
}
|
||||
}
|
||||
if (name == null) {
|
||||
name = item.getType().toString();
|
||||
}
|
||||
UseItemTrigger trigger = UseItemTrigger.get(name, gameWorld);
|
||||
if (trigger != null) {
|
||||
trigger.onTrigger(player);
|
||||
}
|
||||
}
|
||||
if (name == null) {
|
||||
name = item.getType().toString();
|
||||
}
|
||||
UseItemTrigger trigger = UseItemTrigger.getByName(name, gameWorld);
|
||||
if (trigger != null) {
|
||||
trigger.onTrigger(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -288,12 +277,10 @@ public class PlayerListener implements Listener {
|
||||
if (gameWorld != null) {
|
||||
|
||||
// Trigger InteractTrigger
|
||||
InteractTrigger trigger = InteractTrigger.get(clickedBlock, gameWorld);
|
||||
InteractTrigger trigger = InteractTrigger.getByBlock(clickedBlock, gameWorld);
|
||||
if (trigger != null) {
|
||||
if (event.getAction() == Action.LEFT_CLICK_BLOCK) {
|
||||
if (event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||
trigger.onTrigger(player);
|
||||
} else {
|
||||
MessageUtil.sendMessage(player, DMessages.ERROR_LEFT_CLICK.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@ -301,10 +288,8 @@ public class PlayerListener implements Listener {
|
||||
for (Sign classSign : gameWorld.getSignClass()) {
|
||||
if (classSign != null) {
|
||||
if (classSign.getLocation().distance(clickedBlock.getLocation()) < 1) {
|
||||
if (event.getAction() == Action.LEFT_CLICK_BLOCK) {
|
||||
if (event.getAction() == Action.LEFT_CLICK_BLOCK || event.getAction() == Action.RIGHT_CLICK_BLOCK) {
|
||||
dPlayer.setDClass(ChatColor.stripColor(classSign.getLine(1)));
|
||||
} else {
|
||||
MessageUtil.sendMessage(player, DMessages.ERROR_LEFT_CLICK.getMessage());
|
||||
}
|
||||
return;
|
||||
}
|
||||
@ -312,6 +297,9 @@ public class PlayerListener implements Listener {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} else if (OpenDoorSign.isProtected(clickedBlock)) {
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -398,15 +386,7 @@ public class PlayerListener implements Listener {
|
||||
Location respawn = gamePlayer.getCheckpoint();
|
||||
|
||||
if (respawn == null) {
|
||||
respawn = dGroup.getGameWorld().getStartLocation();
|
||||
}
|
||||
|
||||
if (respawn == null) {
|
||||
respawn = dGroup.getGameWorld().getLobbyLocation();
|
||||
}
|
||||
|
||||
if (respawn == null) {
|
||||
respawn = dGroup.getGameWorld().getWorld().getSpawnLocation();
|
||||
respawn = dGroup.getGameWorld().getStartLocation(dGroup);
|
||||
}
|
||||
|
||||
// Because some plugins set another respawn point, DXL teleports a few ticks later.
|
||||
|
@ -136,7 +136,7 @@ public class DMob {
|
||||
name = victim.getType().getName();
|
||||
}
|
||||
|
||||
MobTrigger mobTrigger = MobTrigger.get(name, gameWorld);
|
||||
MobTrigger mobTrigger = MobTrigger.getByName(name, gameWorld);
|
||||
if (mobTrigger != null) {
|
||||
mobTrigger.onTrigger();
|
||||
}
|
||||
|
@ -456,6 +456,20 @@ public class DGamePlayer extends DInstancePlayer {
|
||||
}
|
||||
}
|
||||
|
||||
public void kill() {
|
||||
DPlayerKickEvent dPlayerKickEvent = new DPlayerKickEvent(this, DPlayerKickEvent.Cause.DEATH);
|
||||
plugin.getServer().getPluginManager().callEvent(dPlayerKickEvent);
|
||||
|
||||
if (!dPlayerKickEvent.isCancelled()) {
|
||||
MessageUtil.broadcastMessage(DMessages.PLAYER_DEATH_KICK.getMessage(player.getName()));
|
||||
GameRules rules = Game.getByPlayer(player).getRules();
|
||||
leave();
|
||||
if (rules.getKeepInventoryOnEscape() && rules.getKeepInventoryOnDeath()) {
|
||||
applyRespawnInventory();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean checkRequirements(Game game) {
|
||||
if (DPermissions.hasPermission(player, DPermissions.IGNORE_REQUIREMENTS)) {
|
||||
return true;
|
||||
@ -596,11 +610,7 @@ public class DGamePlayer extends DInstancePlayer {
|
||||
Location respawn = checkpoint;
|
||||
|
||||
if (respawn == null) {
|
||||
respawn = dGroup.getGameWorld().getStartLocation();
|
||||
}
|
||||
|
||||
if (respawn == null) {
|
||||
respawn = dGroup.getGameWorld().getLobbyLocation();
|
||||
respawn = dGroup.getGameWorld().getStartLocation(dGroup);
|
||||
}
|
||||
|
||||
if (respawn == null) {
|
||||
@ -693,7 +703,7 @@ public class DGamePlayer extends DInstancePlayer {
|
||||
for (Player player : dGroup.getPlayers()) {
|
||||
DGamePlayer dPlayer = getByPlayer(player);
|
||||
dPlayer.setWorld(gameWorld.getWorld());
|
||||
dPlayer.setCheckpoint(dGroup.getGameWorld().getStartLocation());
|
||||
dPlayer.setCheckpoint(dGroup.getGameWorld().getStartLocation(dGroup));
|
||||
if (dPlayer.getWolf() != null) {
|
||||
dPlayer.getWolf().teleport(dPlayer.getCheckpoint());
|
||||
}
|
||||
@ -816,15 +826,7 @@ public class DGamePlayer extends DInstancePlayer {
|
||||
teleportLocation = getCheckpoint();
|
||||
|
||||
if (teleportLocation == null) {
|
||||
teleportLocation = dGroup.getGameWorld().getStartLocation();
|
||||
}
|
||||
|
||||
if (teleportLocation == null) {
|
||||
teleportLocation = dGroup.getGameWorld().getLobbyLocation();
|
||||
}
|
||||
|
||||
if (teleportLocation == null) {
|
||||
teleportLocation = getWorld().getSpawnLocation();
|
||||
teleportLocation = dGroup.getGameWorld().getStartLocation(dGroup);
|
||||
}
|
||||
|
||||
// Don't forget Doge!
|
||||
|
@ -34,6 +34,7 @@ import io.github.dre2n.dungeonsxl.requirement.Requirement;
|
||||
import io.github.dre2n.dungeonsxl.reward.Reward;
|
||||
import io.github.dre2n.dungeonsxl.task.TimeIsRunningTask;
|
||||
import io.github.dre2n.dungeonsxl.world.GameWorld;
|
||||
import io.github.dre2n.dungeonsxl.world.Worlds;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
@ -107,7 +108,7 @@ public class DGroup {
|
||||
}
|
||||
}
|
||||
|
||||
dungeon = plugin.getDungeons().getDungeon(identifier);
|
||||
dungeon = plugin.getDungeons().getByName(identifier);
|
||||
if (multiFloor && dungeon != null) {
|
||||
dungeonName = dungeon.getName();
|
||||
mapName = dungeon.getConfig().getStartFloor();
|
||||
@ -376,7 +377,7 @@ public class DGroup {
|
||||
* the name of the dungeon
|
||||
*/
|
||||
public void setDungeon(String name) {
|
||||
dungeon = plugin.getDungeons().getDungeon(name);
|
||||
dungeon = plugin.getDungeons().getByName(name);
|
||||
if (dungeon != null) {
|
||||
dungeonName = dungeon.getName();
|
||||
mapName = dungeon.getConfig().getStartFloor();
|
||||
@ -396,11 +397,15 @@ public class DGroup {
|
||||
}
|
||||
|
||||
/**
|
||||
* Will fail if there is no dungeon with this name.
|
||||
*
|
||||
* @param dungeonName
|
||||
* the dungeonName to set
|
||||
*/
|
||||
public void setDungeonName(String dungeonName) {
|
||||
this.dungeonName = dungeonName;
|
||||
if (plugin.getDungeons().getByName(name) != null) {
|
||||
this.dungeonName = dungeonName;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -411,11 +416,15 @@ public class DGroup {
|
||||
}
|
||||
|
||||
/**
|
||||
* Will fail if there is no resource world with this name.
|
||||
*
|
||||
* @param name
|
||||
* the name to set
|
||||
*/
|
||||
public void setMapName(String name) {
|
||||
mapName = name;
|
||||
if (Worlds.exists(name)) {
|
||||
mapName = name;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2016 Frank Baumann
|
||||
*
|
||||
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package io.github.dre2n.dungeonsxl.requirement;
|
||||
|
||||
import io.github.dre2n.dungeonsxl.player.DPermissions;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
/**
|
||||
* @author Daniel Saukel
|
||||
*/
|
||||
public class PermissionRequirement extends Requirement {
|
||||
|
||||
private RequirementType type = RequirementTypeDefault.PERMISSION;
|
||||
|
||||
private List<String> permissions = new ArrayList<>();
|
||||
|
||||
/* Getters and setters */
|
||||
/**
|
||||
* @return the permission the player must have to play the dungeon
|
||||
*/
|
||||
public List<String> getPermissions() {
|
||||
return permissions;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param permissions
|
||||
* the permissions to set
|
||||
*/
|
||||
public void setPermissions(List<String> permissions) {
|
||||
this.permissions = permissions;
|
||||
}
|
||||
|
||||
@Override
|
||||
public RequirementType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/* Actions */
|
||||
@Override
|
||||
public boolean check(Player player) {
|
||||
for (String permission : permissions) {
|
||||
if (!DPermissions.hasPermission(player, permission)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void demand(Player player) {
|
||||
}
|
||||
|
||||
}
|
@ -23,7 +23,8 @@ public enum RequirementTypeDefault implements RequirementType {
|
||||
|
||||
FEE_LEVEL("feeLevel", FeeLevelRequirement.class),
|
||||
FEE_MONEY("feeMoney", FeeMoneyRequirement.class),
|
||||
GROUP_SIZE("groupSize", GroupSizeRequirement.class);
|
||||
GROUP_SIZE("groupSize", GroupSizeRequirement.class),
|
||||
PERMISSION("permission", PermissionRequirement.class);
|
||||
|
||||
private String identifier;
|
||||
private Class<? extends Requirement> handler;
|
||||
|
@ -29,16 +29,20 @@ public enum DSignTypeDefault implements DSignType {
|
||||
CHUNK_UPDATER("ChunkUpdater", "chunkupdater", true, ChunkUpdaterSign.class),
|
||||
CLASSES("Classes", "classes", true, ClassesSign.class),
|
||||
COMMAND("CMD", "cmd", false, CommandSign.class),
|
||||
DROP("Drop", "drop", false, DropSign.class),
|
||||
END("End", "end", false, EndSign.class),
|
||||
EXTERNAL_MOB("ExternalMob", "mob", false, ExternalMobSign.class),
|
||||
FLOOR("Floor", "floor", false, FloorSign.class),
|
||||
HOLOGRAM("Hologram", "hologram", true, HologramSign.class),
|
||||
INTERACT("Interact", "interact", true, InteractSign.class),
|
||||
LEAVE("Leave", "leave", true, LeaveSign.class),
|
||||
LIVES_MODIFIER("Lives", "lives", false, LivesModifierSign.class),
|
||||
LOBBY("Lobby", "lobby", true, LobbySign.class),
|
||||
MOB("Mob", "mob", false, DMobSign.class),
|
||||
MESSAGE("MSG", "msg", false, MessageSign.class),
|
||||
@Deprecated
|
||||
MYTHIC_MOBS("MythicMobs", "mob", false, ExternalMobSign.class),
|
||||
OPEN_DOOR("Door", "door", false, OpenDoorSign.class),
|
||||
PLACE("Place", "place", false, PlaceSign.class),
|
||||
READY("Ready", "ready", true, ReadySign.class),
|
||||
REDSTONE("Redstone", "redstone", false, RedstoneSign.class),
|
||||
|
95
src/main/java/io/github/dre2n/dungeonsxl/sign/DropSign.java
Normal file
95
src/main/java/io/github/dre2n/dungeonsxl/sign/DropSign.java
Normal file
@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2016 Frank Baumann
|
||||
*
|
||||
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package io.github.dre2n.dungeonsxl.sign;
|
||||
|
||||
import io.github.dre2n.caliburn.item.UniversalItem;
|
||||
import io.github.dre2n.commons.util.NumberUtil;
|
||||
import io.github.dre2n.dungeonsxl.task.DropItemTask;
|
||||
import io.github.dre2n.dungeonsxl.world.GameWorld;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
/**
|
||||
* @author Frank Baumann, Milan Albrecht, Daniel Saukel
|
||||
*/
|
||||
public class DropSign extends DSign {
|
||||
|
||||
private DSignType type = DSignTypeDefault.DROP;
|
||||
|
||||
private ItemStack item;
|
||||
private double interval = -1;
|
||||
|
||||
public DropSign(Sign sign, String[] lines, GameWorld gameWorld) {
|
||||
super(sign, lines, gameWorld);
|
||||
}
|
||||
|
||||
/* Getters and setters */
|
||||
/**
|
||||
* @return the item
|
||||
*/
|
||||
public ItemStack getItem() {
|
||||
return item;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param item
|
||||
* the item to set
|
||||
*/
|
||||
public void setItem(ItemStack item) {
|
||||
this.item = item;
|
||||
}
|
||||
|
||||
/* Actions */
|
||||
@Override
|
||||
public boolean check() {
|
||||
return plugin.getCaliburnAPI().getItems().getById(lines[1]) != null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInit() {
|
||||
UniversalItem item = plugin.getCaliburnAPI().getItems().getById(lines[1]);
|
||||
|
||||
String[] attributes = lines[2].split(",");
|
||||
if (attributes.length >= 1) {
|
||||
this.item = item.toItemStack(NumberUtil.parseInt(attributes[0], 1));
|
||||
}
|
||||
if (attributes.length == 2) {
|
||||
interval = NumberUtil.parseDouble(attributes[1]);
|
||||
}
|
||||
|
||||
getSign().getBlock().setType(Material.AIR);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTrigger() {
|
||||
Location spawnLocation = getSign().getLocation().add(0.5, 0, 0.5);
|
||||
if (interval < 0) {
|
||||
getSign().getWorld().dropItem(spawnLocation, item);
|
||||
|
||||
} else {
|
||||
new DropItemTask(item, spawnLocation).runTaskTimer(plugin, 0, (long) interval * 20);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public DSignType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2016 Frank Baumann
|
||||
*
|
||||
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package io.github.dre2n.dungeonsxl.sign;
|
||||
|
||||
import com.gmail.filoghost.holographicdisplays.api.Hologram;
|
||||
import com.gmail.filoghost.holographicdisplays.api.HologramsAPI;
|
||||
import io.github.dre2n.caliburn.item.UniversalItem;
|
||||
import io.github.dre2n.commons.compatibility.CompatibilityHandler;
|
||||
import io.github.dre2n.commons.compatibility.Version;
|
||||
import io.github.dre2n.commons.util.EnumUtil;
|
||||
import io.github.dre2n.commons.util.NumberUtil;
|
||||
import io.github.dre2n.dungeonsxl.world.GameWorld;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
/**
|
||||
* @author Daniel Saukel
|
||||
*/
|
||||
public class HologramSign extends DSign {
|
||||
|
||||
private DSignType type = DSignTypeDefault.HOLOGRAM;
|
||||
|
||||
private Hologram hologram;
|
||||
|
||||
public HologramSign(Sign sign, String[] lines, GameWorld gameWorld) {
|
||||
super(sign, lines, gameWorld);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean check() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("deprecation")
|
||||
public void onInit() {
|
||||
getSign().getBlock().setType(Material.AIR);
|
||||
|
||||
String[] holoLines = lines[1].split("/");
|
||||
Location location = getSign().getLocation();
|
||||
location = location.add(0.5, NumberUtil.parseDouble(lines[2]), 0.5);
|
||||
|
||||
hologram = HologramsAPI.createHologram(plugin, location);
|
||||
for (String line : holoLines) {
|
||||
if (line.startsWith("Item:")) {
|
||||
String id = line.replace("Item:", "");
|
||||
ItemStack item = null;
|
||||
|
||||
if (Version.andHigher(Version.MC1_9).contains(CompatibilityHandler.getInstance().getVersion())) {
|
||||
UniversalItem universalItem = plugin.getCaliburnAPI().getItems().getById(id);
|
||||
if (universalItem != null) {
|
||||
item = universalItem.toItemStack(1);
|
||||
}
|
||||
}
|
||||
|
||||
if (item == null) {
|
||||
if (EnumUtil.isValidEnum(Material.class, id)) {
|
||||
item = new ItemStack(Material.valueOf(id));
|
||||
|
||||
} else {
|
||||
item = new ItemStack(NumberUtil.parseInt(id, 1));
|
||||
}
|
||||
}
|
||||
|
||||
hologram.appendItemLine(item);
|
||||
|
||||
} else {
|
||||
hologram.appendTextLine(ChatColor.translateAlternateColorCodes('&', line));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public DSignType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,127 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2016 Frank Baumann
|
||||
*
|
||||
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package io.github.dre2n.dungeonsxl.sign;
|
||||
|
||||
import io.github.dre2n.commons.util.EnumUtil;
|
||||
import io.github.dre2n.commons.util.NumberUtil;
|
||||
import io.github.dre2n.commons.util.messageutil.MessageUtil;
|
||||
import io.github.dre2n.dungeonsxl.config.DMessages;
|
||||
import io.github.dre2n.dungeonsxl.game.Game;
|
||||
import io.github.dre2n.dungeonsxl.player.DGamePlayer;
|
||||
import io.github.dre2n.dungeonsxl.player.DGroup;
|
||||
import io.github.dre2n.dungeonsxl.world.GameWorld;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
/**
|
||||
* @author Frank Baumann, Milan Albrecht, Daniel Saukel
|
||||
*/
|
||||
public class LivesModifierSign extends DSign {
|
||||
|
||||
public enum Target {
|
||||
GAME,
|
||||
GROUP,
|
||||
PLAYER,
|
||||
}
|
||||
|
||||
private DSignType type = DSignTypeDefault.LIVES_MODIFIER;
|
||||
|
||||
private int lives;
|
||||
private Target target;
|
||||
|
||||
public LivesModifierSign(Sign sign, String[] lines, GameWorld gameWorld) {
|
||||
super(sign, lines, gameWorld);
|
||||
}
|
||||
|
||||
/* Getters and setters */
|
||||
/**
|
||||
* @return the lives to add / remove
|
||||
*/
|
||||
public int getLives() {
|
||||
return lives;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param lives
|
||||
* the lives to add / remove
|
||||
*/
|
||||
public void setLives(int lives) {
|
||||
this.lives = lives;
|
||||
}
|
||||
|
||||
/* Actions */
|
||||
@Override
|
||||
public boolean check() {
|
||||
return NumberUtil.parseInt(lines[1]) != 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInit() {
|
||||
lives = NumberUtil.parseInt(lines[1]);
|
||||
if (EnumUtil.isValidEnum(Target.class, lines[2].toUpperCase())) {
|
||||
target = Target.valueOf(lines[2].toUpperCase());
|
||||
}
|
||||
|
||||
getSign().getBlock().setType(Material.AIR);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onPlayerTrigger(Player player) {
|
||||
switch (target) {
|
||||
case GAME:
|
||||
for (Player gamePlayer : Game.getByPlayer(player).getPlayers()) {
|
||||
DGamePlayer dPlayer = DGamePlayer.getByPlayer(player);
|
||||
if (gamePlayer != null) {
|
||||
modifyLives(dPlayer);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case GROUP:
|
||||
for (DGamePlayer dPlayer : DGroup.getByPlayer(player).getDGamePlayers()) {
|
||||
modifyLives(dPlayer);
|
||||
}
|
||||
break;
|
||||
|
||||
case PLAYER:
|
||||
modifyLives(DGamePlayer.getByPlayer(player));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void modifyLives(DGamePlayer dPlayer) {
|
||||
dPlayer.setLives(dPlayer.getLives() + lives);
|
||||
if (lives > 0) {
|
||||
MessageUtil.sendMessage(dPlayer.getPlayer(), DMessages.PLAYER_LIVES_ADDED.getMessage(String.valueOf(lives)));
|
||||
|
||||
} else {
|
||||
MessageUtil.sendMessage(dPlayer.getPlayer(), DMessages.PLAYER_LIVES_REMOVED.getMessage(String.valueOf(-1 * lives)));
|
||||
}
|
||||
|
||||
if (dPlayer.getLives() <= 0) {
|
||||
dPlayer.kill();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public DSignType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
}
|
112
src/main/java/io/github/dre2n/dungeonsxl/sign/OpenDoorSign.java
Normal file
112
src/main/java/io/github/dre2n/dungeonsxl/sign/OpenDoorSign.java
Normal file
@ -0,0 +1,112 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2016 Frank Baumann
|
||||
*
|
||||
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package io.github.dre2n.dungeonsxl.sign;
|
||||
|
||||
import io.github.dre2n.commons.util.BlockUtil;
|
||||
import io.github.dre2n.dungeonsxl.world.GameWorld;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.material.Door;
|
||||
|
||||
/**
|
||||
* @author Daniel Saukel
|
||||
*/
|
||||
public class OpenDoorSign extends DSign {
|
||||
|
||||
private DSignType type = DSignTypeDefault.OPEN_DOOR;
|
||||
|
||||
private Block block;
|
||||
|
||||
public OpenDoorSign(Sign sign, String[] lines, GameWorld gameWorld) {
|
||||
super(sign, lines, gameWorld);
|
||||
}
|
||||
|
||||
/* Getters and setters */
|
||||
/**
|
||||
* @return the door to open;
|
||||
*/
|
||||
public Block getBlock() {
|
||||
return block;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param block
|
||||
* the door to open
|
||||
*/
|
||||
public void setBlock(Block block) {
|
||||
this.block = block;
|
||||
}
|
||||
|
||||
@Override
|
||||
public DSignType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/* Actions */
|
||||
@Override
|
||||
public boolean check() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onInit() {
|
||||
Block block = BlockUtil.getAttachedBlock(getSign().getBlock());
|
||||
if (block.getState().getData() instanceof Door) {
|
||||
if (block.getRelative(BlockFace.DOWN).getType() == block.getType()) {
|
||||
this.block = block.getRelative(BlockFace.DOWN);
|
||||
} else {
|
||||
this.block = block;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
getSign().getBlock().setType(Material.AIR);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTrigger() {
|
||||
if (block != null) {
|
||||
((Door) block.getState().getData()).setOpen(true);
|
||||
block.getState().update(true);
|
||||
}
|
||||
}
|
||||
|
||||
/* Statics */
|
||||
/**
|
||||
* @param block
|
||||
* the block to check
|
||||
* @return
|
||||
* true if the block is openable only with a sign
|
||||
*/
|
||||
public static boolean isProtected(Block block) {
|
||||
GameWorld gameWorld = GameWorld.getByWorld(block.getWorld());
|
||||
if (gameWorld != null) {
|
||||
for (DSign dSign : gameWorld.getDSigns(DSignTypeDefault.OPEN_DOOR)) {
|
||||
Block signBlock1 = ((OpenDoorSign) dSign).getBlock();
|
||||
Block signBlock2 = signBlock1.getRelative(BlockFace.UP);
|
||||
if (block.equals(signBlock1) || block.equals(signBlock2)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
@ -16,19 +16,21 @@
|
||||
*/
|
||||
package io.github.dre2n.dungeonsxl.sign;
|
||||
|
||||
import io.github.dre2n.commons.util.NumberUtil;
|
||||
import io.github.dre2n.commons.util.messageutil.MessageUtil;
|
||||
import io.github.dre2n.dungeonsxl.config.DMessages;
|
||||
import io.github.dre2n.dungeonsxl.game.Game;
|
||||
import io.github.dre2n.dungeonsxl.game.GameType;
|
||||
import io.github.dre2n.dungeonsxl.game.GameTypeDefault;
|
||||
import io.github.dre2n.dungeonsxl.player.DGamePlayer;
|
||||
import io.github.dre2n.dungeonsxl.player.DGroup;
|
||||
import io.github.dre2n.dungeonsxl.trigger.InteractTrigger;
|
||||
import io.github.dre2n.dungeonsxl.util.ProgressBar;
|
||||
import io.github.dre2n.dungeonsxl.world.GameWorld;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Sign;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
/**
|
||||
* @author Frank Baumann, Milan Albrecht, Daniel Saukel
|
||||
@ -38,6 +40,8 @@ public class ReadySign extends DSign {
|
||||
private DSignType type = DSignTypeDefault.READY;
|
||||
|
||||
private GameType gameType;
|
||||
private double autoStart = -1;
|
||||
private boolean triggered = false;
|
||||
|
||||
public ReadySign(Sign sign, String[] lines, GameWorld gameWorld) {
|
||||
super(sign, lines, gameWorld);
|
||||
@ -58,6 +62,21 @@ public class ReadySign extends DSign {
|
||||
this.gameType = gameType;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the time until the game starts automatically; -1 for no auto start
|
||||
*/
|
||||
public double getTimeToAutoStart() {
|
||||
return autoStart;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param time
|
||||
* the time in seconds until the game starts automatically; -1 for no auto start
|
||||
*/
|
||||
public void setTimeToAutoStart(double time) {
|
||||
autoStart = time;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean check() {
|
||||
return true;
|
||||
@ -72,6 +91,10 @@ public class ReadySign extends DSign {
|
||||
gameType = GameTypeDefault.DEFAULT;
|
||||
}
|
||||
|
||||
if (!lines[2].isEmpty()) {
|
||||
autoStart = NumberUtil.parseDouble(lines[2], -1);
|
||||
}
|
||||
|
||||
if (!getTriggers().isEmpty()) {
|
||||
getSign().getBlock().setType(Material.AIR);
|
||||
return;
|
||||
@ -93,15 +116,33 @@ public class ReadySign extends DSign {
|
||||
@Override
|
||||
public boolean onPlayerTrigger(Player player) {
|
||||
ready(DGamePlayer.getByPlayer(player));
|
||||
|
||||
if (!triggered && autoStart >= 0) {
|
||||
triggered = true;
|
||||
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
onTrigger();
|
||||
}
|
||||
}.runTaskLater(plugin, (long) (autoStart * 20));
|
||||
|
||||
if (!DGroup.getByPlayer(player).isPlaying()) {
|
||||
ProgressBar.sendProgressBar(getGame().getPlayers(), (int) Math.ceil(autoStart));
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onTrigger() {
|
||||
for (DGroup dGroup : Game.getByGameWorld(getGameWorld()).getDGroups()) {
|
||||
for (Player player : dGroup.getPlayers()) {
|
||||
ready(DGamePlayer.getByPlayer(player));
|
||||
}
|
||||
if (getGame() == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (Player player : getGame().getPlayers()) {
|
||||
ready(DGamePlayer.getByPlayer(player));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -16,6 +16,7 @@
|
||||
*/
|
||||
package io.github.dre2n.dungeonsxl.sign;
|
||||
|
||||
import io.github.dre2n.commons.util.NumberUtil;
|
||||
import io.github.dre2n.dungeonsxl.world.GameWorld;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Sign;
|
||||
@ -27,10 +28,29 @@ public class StartSign extends DSign {
|
||||
|
||||
private DSignType type = DSignTypeDefault.START;
|
||||
|
||||
private int id;
|
||||
|
||||
public StartSign(Sign sign, String[] lines, GameWorld gameWorld) {
|
||||
super(sign, lines, gameWorld);
|
||||
}
|
||||
|
||||
/* Getters and setters */
|
||||
/**
|
||||
* @return the ID
|
||||
*/
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param id
|
||||
* the ID to set
|
||||
*/
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
/* Actions */
|
||||
@Override
|
||||
public boolean check() {
|
||||
return true;
|
||||
@ -38,7 +58,7 @@ public class StartSign extends DSign {
|
||||
|
||||
@Override
|
||||
public void onInit() {
|
||||
getGameWorld().setStartLocation(getSign().getLocation());
|
||||
id = NumberUtil.parseInt(lines[1]);
|
||||
getSign().getBlock().setType(Material.AIR);
|
||||
}
|
||||
|
||||
|
@ -100,7 +100,7 @@ public class TriggerSign extends DSign {
|
||||
return;
|
||||
}
|
||||
|
||||
SignTrigger trigger = SignTrigger.get(triggerId, getGameWorld());
|
||||
SignTrigger trigger = SignTrigger.getById(triggerId, getGameWorld());
|
||||
if (trigger != null) {
|
||||
trigger.onTrigger(true);
|
||||
}
|
||||
@ -112,7 +112,7 @@ public class TriggerSign extends DSign {
|
||||
return;
|
||||
}
|
||||
|
||||
SignTrigger trigger = SignTrigger.get(triggerId, getGameWorld());
|
||||
SignTrigger trigger = SignTrigger.getById(triggerId, getGameWorld());
|
||||
if (trigger != null) {
|
||||
trigger.onTrigger(false);
|
||||
}
|
||||
|
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2016 Frank Baumann
|
||||
*
|
||||
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package io.github.dre2n.dungeonsxl.task;
|
||||
|
||||
import io.github.dre2n.dungeonsxl.DungeonsXL;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
/**
|
||||
* @author Frank Baumann, Daniel Saukel
|
||||
*/
|
||||
public class DropItemTask extends BukkitRunnable {
|
||||
|
||||
DungeonsXL plugin = DungeonsXL.getInstance();
|
||||
|
||||
private ItemStack item;
|
||||
private Location location;
|
||||
|
||||
public DropItemTask(ItemStack item, Location location) {
|
||||
this.item = item;
|
||||
this.location = location;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
location.getWorld().dropItem(location, item);
|
||||
} catch (NullPointerException exception) {
|
||||
cancel();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -18,9 +18,6 @@ package io.github.dre2n.dungeonsxl.trigger;
|
||||
|
||||
import io.github.dre2n.dungeonsxl.event.trigger.TriggerActionEvent;
|
||||
import io.github.dre2n.dungeonsxl.world.GameWorld;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@ -29,8 +26,6 @@ import org.bukkit.entity.Player;
|
||||
*/
|
||||
public class DistanceTrigger extends Trigger {
|
||||
|
||||
private static Map<GameWorld, ArrayList<DistanceTrigger>> triggers = new HashMap<>();
|
||||
|
||||
private TriggerType type = TriggerTypeDefault.DISTANCE;
|
||||
|
||||
private int distance = 5;
|
||||
@ -60,56 +55,23 @@ public class DistanceTrigger extends Trigger {
|
||||
updateDSigns();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(GameWorld gameWorld) {
|
||||
if (!hasTriggers(gameWorld)) {
|
||||
ArrayList<DistanceTrigger> list = new ArrayList<>();
|
||||
list.add(this);
|
||||
triggers.put(gameWorld, list);
|
||||
|
||||
} else {
|
||||
triggers.get(gameWorld).add(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregister(GameWorld gameWorld) {
|
||||
if (hasTriggers(gameWorld)) {
|
||||
triggers.get(gameWorld).remove(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TriggerType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/* Statics */
|
||||
public static void triggerAllInDistance(Player player, GameWorld gameWorld) {
|
||||
if (!hasTriggers(gameWorld)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!player.getLocation().getWorld().equals(gameWorld.getWorld())) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (DistanceTrigger trigger : getTriggersArray(gameWorld)) {
|
||||
for (Trigger uncasted : gameWorld.getTriggers(TriggerTypeDefault.DISTANCE)) {
|
||||
DistanceTrigger trigger = (DistanceTrigger) uncasted;
|
||||
if (player.getLocation().distance(trigger.loc) < trigger.distance) {
|
||||
trigger.onTrigger(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean hasTriggers(GameWorld gameWorld) {
|
||||
return !triggers.isEmpty() && triggers.containsKey(gameWorld);
|
||||
}
|
||||
|
||||
public static ArrayList<DistanceTrigger> getTriggers(GameWorld gameWorld) {
|
||||
return triggers.get(gameWorld);
|
||||
}
|
||||
|
||||
public static DistanceTrigger[] getTriggersArray(GameWorld gameWorld) {
|
||||
return getTriggers(gameWorld).toArray(new DistanceTrigger[getTriggers(gameWorld).size()]);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -18,9 +18,6 @@ package io.github.dre2n.dungeonsxl.trigger;
|
||||
|
||||
import io.github.dre2n.dungeonsxl.event.trigger.TriggerActionEvent;
|
||||
import io.github.dre2n.dungeonsxl.world.GameWorld;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@ -29,8 +26,6 @@ import org.bukkit.entity.Player;
|
||||
*/
|
||||
public class InteractTrigger extends Trigger {
|
||||
|
||||
private static Map<GameWorld, ArrayList<InteractTrigger>> triggers = new HashMap<>();
|
||||
|
||||
private TriggerType type = TriggerTypeDefault.INTERACT;
|
||||
|
||||
private int interactId;
|
||||
@ -54,35 +49,17 @@ public class InteractTrigger extends Trigger {
|
||||
updateDSigns();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(GameWorld gameWorld) {
|
||||
if (!hasTriggers(gameWorld)) {
|
||||
ArrayList<InteractTrigger> list = new ArrayList<>();
|
||||
list.add(this);
|
||||
triggers.put(gameWorld, list);
|
||||
|
||||
} else {
|
||||
triggers.get(gameWorld).add(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregister(GameWorld gameWorld) {
|
||||
if (hasTriggers(gameWorld)) {
|
||||
triggers.get(gameWorld).remove(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TriggerType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/* Statics */
|
||||
public static InteractTrigger getOrCreate(int id, GameWorld gameWorld) {
|
||||
if (id == 0) {
|
||||
return null;
|
||||
}
|
||||
InteractTrigger trigger = get(id, gameWorld);
|
||||
InteractTrigger trigger = getById(id, gameWorld);
|
||||
if (trigger != null) {
|
||||
return trigger;
|
||||
}
|
||||
@ -90,7 +67,7 @@ public class InteractTrigger extends Trigger {
|
||||
}
|
||||
|
||||
public static InteractTrigger getOrCreate(int id, Block block, GameWorld gameWorld) {
|
||||
InteractTrigger trigger = get(id, gameWorld);
|
||||
InteractTrigger trigger = getById(id, gameWorld);
|
||||
if (trigger != null) {
|
||||
trigger.interactBlock = block;
|
||||
return trigger;
|
||||
@ -98,34 +75,28 @@ public class InteractTrigger extends Trigger {
|
||||
return new InteractTrigger(id, block);
|
||||
}
|
||||
|
||||
public static InteractTrigger get(Block block, GameWorld gameWorld) {
|
||||
if (hasTriggers(gameWorld)) {
|
||||
for (InteractTrigger trigger : triggers.get(gameWorld)) {
|
||||
if (trigger.interactBlock != null) {
|
||||
if (trigger.interactBlock.equals(block)) {
|
||||
return trigger;
|
||||
}
|
||||
public static InteractTrigger getByBlock(Block block, GameWorld gameWorld) {
|
||||
for (Trigger uncasted : gameWorld.getTriggers(TriggerTypeDefault.INTERACT)) {
|
||||
InteractTrigger trigger = (InteractTrigger) uncasted;
|
||||
if (trigger.interactBlock != null) {
|
||||
if (trigger.interactBlock.equals(block)) {
|
||||
return trigger;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static InteractTrigger get(int id, GameWorld gameWorld) {
|
||||
public static InteractTrigger getById(int id, GameWorld gameWorld) {
|
||||
if (id != 0) {
|
||||
if (hasTriggers(gameWorld)) {
|
||||
for (InteractTrigger trigger : triggers.get(gameWorld)) {
|
||||
if (trigger.interactId == id) {
|
||||
return trigger;
|
||||
}
|
||||
for (Trigger uncasted : gameWorld.getTriggers(TriggerTypeDefault.INTERACT)) {
|
||||
InteractTrigger trigger = (InteractTrigger) uncasted;
|
||||
if (trigger.interactId == id) {
|
||||
return trigger;
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean hasTriggers(GameWorld gameWorld) {
|
||||
return !triggers.isEmpty() && triggers.containsKey(gameWorld);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -18,17 +18,12 @@ package io.github.dre2n.dungeonsxl.trigger;
|
||||
|
||||
import io.github.dre2n.dungeonsxl.event.trigger.TriggerActionEvent;
|
||||
import io.github.dre2n.dungeonsxl.world.GameWorld;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author Frank Baumann, Daniel Saukel
|
||||
*/
|
||||
public class MobTrigger extends Trigger {
|
||||
|
||||
private static Map<GameWorld, ArrayList<MobTrigger>> triggers = new HashMap<>();
|
||||
|
||||
private TriggerType type = TriggerTypeDefault.MOB;
|
||||
|
||||
private String name;
|
||||
@ -49,51 +44,28 @@ public class MobTrigger extends Trigger {
|
||||
updateDSigns();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(GameWorld gameWorld) {
|
||||
if (!hasTriggers(gameWorld)) {
|
||||
ArrayList<MobTrigger> list = new ArrayList<>();
|
||||
list.add(this);
|
||||
triggers.put(gameWorld, list);
|
||||
|
||||
} else {
|
||||
triggers.get(gameWorld).add(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregister(GameWorld gameWorld) {
|
||||
if (hasTriggers(gameWorld)) {
|
||||
triggers.get(gameWorld).remove(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TriggerType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/* Statics */
|
||||
public static MobTrigger getOrCreate(String name, GameWorld gameWorld) {
|
||||
MobTrigger trigger = get(name, gameWorld);
|
||||
MobTrigger trigger = getByName(name, gameWorld);
|
||||
if (trigger != null) {
|
||||
return trigger;
|
||||
}
|
||||
return new MobTrigger(name);
|
||||
}
|
||||
|
||||
public static MobTrigger get(String name, GameWorld gameWorld) {
|
||||
if (hasTriggers(gameWorld)) {
|
||||
for (MobTrigger trigger : triggers.get(gameWorld)) {
|
||||
if (trigger.name.equalsIgnoreCase(name)) {
|
||||
return trigger;
|
||||
}
|
||||
public static MobTrigger getByName(String name, GameWorld gameWorld) {
|
||||
for (Trigger uncasted : gameWorld.getTriggers(TriggerTypeDefault.MOB)) {
|
||||
MobTrigger trigger = (MobTrigger) uncasted;
|
||||
if (trigger.name.equalsIgnoreCase(name)) {
|
||||
return trigger;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean hasTriggers(GameWorld gameWorld) {
|
||||
return !triggers.isEmpty() && triggers.containsKey(gameWorld);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -18,10 +18,7 @@ package io.github.dre2n.dungeonsxl.trigger;
|
||||
|
||||
import io.github.dre2n.dungeonsxl.event.trigger.TriggerActionEvent;
|
||||
import io.github.dre2n.dungeonsxl.world.GameWorld;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
@ -29,8 +26,6 @@ import java.util.Set;
|
||||
*/
|
||||
public class ProgressTrigger extends Trigger {
|
||||
|
||||
private static Map<GameWorld, ArrayList<ProgressTrigger>> triggers = new HashMap<>();
|
||||
|
||||
private TriggerType type = TriggerTypeDefault.PROGRESS;
|
||||
|
||||
private String floor;
|
||||
@ -105,30 +100,12 @@ public class ProgressTrigger extends Trigger {
|
||||
updateDSigns();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(GameWorld gameWorld) {
|
||||
if (!hasTriggers(gameWorld)) {
|
||||
ArrayList<ProgressTrigger> list = new ArrayList<>();
|
||||
list.add(this);
|
||||
triggers.put(gameWorld, list);
|
||||
|
||||
} else {
|
||||
triggers.get(gameWorld).add(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregister(GameWorld gameWorld) {
|
||||
if (hasTriggers(gameWorld)) {
|
||||
triggers.get(gameWorld).remove(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TriggerType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/* Statics */
|
||||
public static ProgressTrigger getOrCreate(int floorCount, int waveCount, GameWorld gameWorld) {
|
||||
if (floorCount == 0 & waveCount == 0 || floorCount < 0 || waveCount < 0) {
|
||||
return null;
|
||||
@ -142,14 +119,10 @@ public class ProgressTrigger extends Trigger {
|
||||
|
||||
public static Set<ProgressTrigger> getByGameWorld(GameWorld gameWorld) {
|
||||
Set<ProgressTrigger> toReturn = new HashSet<>();
|
||||
for (ProgressTrigger trigger : triggers.get(gameWorld)) {
|
||||
toReturn.add(trigger);
|
||||
for (Trigger trigger : gameWorld.getTriggers(TriggerTypeDefault.PROGRESS)) {
|
||||
toReturn.add((ProgressTrigger) trigger);
|
||||
}
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
public static boolean hasTriggers(GameWorld gameWorld) {
|
||||
return !triggers.isEmpty() && triggers.containsKey(gameWorld);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -18,9 +18,6 @@ package io.github.dre2n.dungeonsxl.trigger;
|
||||
|
||||
import io.github.dre2n.dungeonsxl.event.trigger.TriggerActionEvent;
|
||||
import io.github.dre2n.dungeonsxl.world.GameWorld;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
@ -31,8 +28,6 @@ import org.bukkit.block.Sign;
|
||||
*/
|
||||
public class RedstoneTrigger extends Trigger {
|
||||
|
||||
private static Map<GameWorld, ArrayList<RedstoneTrigger>> triggers = new HashMap<>();
|
||||
|
||||
private TriggerType type = TriggerTypeDefault.REDSTONE;
|
||||
|
||||
private Block rtBlock;
|
||||
@ -61,30 +56,12 @@ public class RedstoneTrigger extends Trigger {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(GameWorld gameWorld) {
|
||||
if (!hasTriggers(gameWorld)) {
|
||||
ArrayList<RedstoneTrigger> list = new ArrayList<>();
|
||||
list.add(this);
|
||||
triggers.put(gameWorld, list);
|
||||
|
||||
} else {
|
||||
triggers.get(gameWorld).add(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregister(GameWorld gameWorld) {
|
||||
if (hasTriggers(gameWorld)) {
|
||||
triggers.get(gameWorld).remove(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TriggerType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/* Statics */
|
||||
public static RedstoneTrigger getOrCreate(Sign sign, GameWorld gameWorld) {
|
||||
Block rtBlock = null;
|
||||
if (sign.getBlock().getType() == Material.WALL_SIGN) {
|
||||
@ -108,11 +85,10 @@ public class RedstoneTrigger extends Trigger {
|
||||
}
|
||||
|
||||
if (rtBlock != null) {
|
||||
if (hasTriggers(gameWorld)) {
|
||||
for (RedstoneTrigger trigger : getTriggers(gameWorld)) {
|
||||
if (trigger.rtBlock.equals(rtBlock)) {
|
||||
return trigger;
|
||||
}
|
||||
for (Trigger uncasted : gameWorld.getTriggers(TriggerTypeDefault.REDSTONE)) {
|
||||
RedstoneTrigger trigger = (RedstoneTrigger) uncasted;
|
||||
if (trigger.rtBlock.equals(rtBlock)) {
|
||||
return trigger;
|
||||
}
|
||||
}
|
||||
return new RedstoneTrigger(rtBlock);
|
||||
@ -121,23 +97,9 @@ public class RedstoneTrigger extends Trigger {
|
||||
}
|
||||
|
||||
public static void updateAll(GameWorld gameWorld) {
|
||||
if (hasTriggers(gameWorld)) {
|
||||
for (RedstoneTrigger trigger : getTriggersArray(gameWorld)) {
|
||||
trigger.onTrigger();
|
||||
}
|
||||
for (Trigger trigger : gameWorld.getTriggers(TriggerTypeDefault.REDSTONE)) {
|
||||
((RedstoneTrigger) trigger).onTrigger();
|
||||
}
|
||||
}
|
||||
|
||||
public static boolean hasTriggers(GameWorld gameWorld) {
|
||||
return !triggers.isEmpty() && triggers.containsKey(gameWorld);
|
||||
}
|
||||
|
||||
public static ArrayList<RedstoneTrigger> getTriggers(GameWorld gameWorld) {
|
||||
return triggers.get(gameWorld);
|
||||
}
|
||||
|
||||
public static RedstoneTrigger[] getTriggersArray(GameWorld gameWorld) {
|
||||
return getTriggers(gameWorld).toArray(new RedstoneTrigger[getTriggers(gameWorld).size()]);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -18,17 +18,12 @@ package io.github.dre2n.dungeonsxl.trigger;
|
||||
|
||||
import io.github.dre2n.dungeonsxl.event.trigger.TriggerActionEvent;
|
||||
import io.github.dre2n.dungeonsxl.world.GameWorld;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* @author Frank Baumann, Daniel Saukel
|
||||
*/
|
||||
public class SignTrigger extends Trigger {
|
||||
|
||||
private static Map<GameWorld, ArrayList<SignTrigger>> triggers = new HashMap<>();
|
||||
|
||||
private TriggerType type = TriggerTypeDefault.SIGN;
|
||||
|
||||
private int stId;
|
||||
@ -51,51 +46,28 @@ public class SignTrigger extends Trigger {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(GameWorld gameWorld) {
|
||||
if (!hasTriggers(gameWorld)) {
|
||||
ArrayList<SignTrigger> list = new ArrayList<>();
|
||||
list.add(this);
|
||||
triggers.put(gameWorld, list);
|
||||
|
||||
} else {
|
||||
triggers.get(gameWorld).add(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregister(GameWorld gameWorld) {
|
||||
if (hasTriggers(gameWorld)) {
|
||||
triggers.get(gameWorld).remove(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TriggerType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/* Statics */
|
||||
public static SignTrigger getOrCreate(int id, GameWorld gameWorld) {
|
||||
SignTrigger trigger = get(id, gameWorld);
|
||||
SignTrigger trigger = getById(id, gameWorld);
|
||||
if (trigger != null) {
|
||||
return trigger;
|
||||
}
|
||||
return new SignTrigger(id);
|
||||
}
|
||||
|
||||
public static SignTrigger get(int id, GameWorld gameWorld) {
|
||||
if (hasTriggers(gameWorld)) {
|
||||
for (SignTrigger trigger : triggers.get(gameWorld)) {
|
||||
if (trigger.stId == id) {
|
||||
return trigger;
|
||||
}
|
||||
public static SignTrigger getById(int id, GameWorld gameWorld) {
|
||||
for (Trigger uncasted : gameWorld.getTriggers(TriggerTypeDefault.SIGN)) {
|
||||
SignTrigger trigger = (SignTrigger) uncasted;
|
||||
if (trigger.stId == id) {
|
||||
return trigger;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean hasTriggers(GameWorld gameWorld) {
|
||||
return !triggers.isEmpty() && triggers.containsKey(gameWorld);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -113,6 +113,14 @@ public abstract class Trigger {
|
||||
}
|
||||
}
|
||||
|
||||
public void register(GameWorld gameWorld) {
|
||||
gameWorld.addTrigger(this);
|
||||
}
|
||||
|
||||
public void unregister(GameWorld gameWorld) {
|
||||
gameWorld.removeTrigger(this);
|
||||
}
|
||||
|
||||
public static Trigger getOrCreate(String identifier, String value, DSign dSign) {
|
||||
TriggerType type = plugin.getTriggers().getByIdentifier(identifier);
|
||||
Trigger trigger = null;
|
||||
@ -199,10 +207,6 @@ public abstract class Trigger {
|
||||
}
|
||||
|
||||
/* Abstracts */
|
||||
public abstract void register(GameWorld gameWorld);
|
||||
|
||||
public abstract void unregister(GameWorld gameWorld);
|
||||
|
||||
public abstract TriggerType getType();
|
||||
|
||||
}
|
||||
|
@ -18,9 +18,6 @@ package io.github.dre2n.dungeonsxl.trigger;
|
||||
|
||||
import io.github.dre2n.dungeonsxl.event.trigger.TriggerActionEvent;
|
||||
import io.github.dre2n.dungeonsxl.world.GameWorld;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@ -29,8 +26,6 @@ import org.bukkit.entity.Player;
|
||||
*/
|
||||
public class UseItemTrigger extends Trigger {
|
||||
|
||||
private static Map<GameWorld, ArrayList<UseItemTrigger>> triggers = new HashMap<>();
|
||||
|
||||
private TriggerType type = TriggerTypeDefault.USE_ITEM;
|
||||
|
||||
private String name;
|
||||
@ -57,54 +52,32 @@ public class UseItemTrigger extends Trigger {
|
||||
updateDSigns();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(GameWorld gameWorld) {
|
||||
if (!hasTriggers(gameWorld)) {
|
||||
ArrayList<UseItemTrigger> list = new ArrayList<>();
|
||||
list.add(this);
|
||||
triggers.put(gameWorld, list);
|
||||
} else {
|
||||
triggers.get(gameWorld).add(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregister(GameWorld gameWorld) {
|
||||
if (hasTriggers(gameWorld)) {
|
||||
triggers.get(gameWorld).remove(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TriggerType getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
/* Statics */
|
||||
public static UseItemTrigger getOrCreate(String name, GameWorld gameWorld) {
|
||||
UseItemTrigger trigger = get(name, gameWorld);
|
||||
UseItemTrigger trigger = getByName(name, gameWorld);
|
||||
if (trigger != null) {
|
||||
return trigger;
|
||||
}
|
||||
return new UseItemTrigger(name);
|
||||
}
|
||||
|
||||
public static UseItemTrigger get(String name, GameWorld gameWorld) {
|
||||
if (hasTriggers(gameWorld)) {
|
||||
for (UseItemTrigger trigger : triggers.get(gameWorld)) {
|
||||
if (trigger.name.equalsIgnoreCase(name)) {
|
||||
public static UseItemTrigger getByName(String name, GameWorld gameWorld) {
|
||||
for (Trigger uncasted : gameWorld.getTriggers(TriggerTypeDefault.USE_ITEM)) {
|
||||
UseItemTrigger trigger = (UseItemTrigger) uncasted;
|
||||
if (trigger.name.equalsIgnoreCase(name)) {
|
||||
return trigger;
|
||||
} else if (trigger.matchedName != null) {
|
||||
if (trigger.matchedName.equalsIgnoreCase(name)) {
|
||||
return trigger;
|
||||
} else if (trigger.matchedName != null) {
|
||||
if (trigger.matchedName.equalsIgnoreCase(name)) {
|
||||
return trigger;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static boolean hasTriggers(GameWorld gameWorld) {
|
||||
return !triggers.isEmpty() && triggers.containsKey(gameWorld);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -18,10 +18,7 @@ package io.github.dre2n.dungeonsxl.trigger;
|
||||
|
||||
import io.github.dre2n.dungeonsxl.event.trigger.TriggerActionEvent;
|
||||
import io.github.dre2n.dungeonsxl.world.GameWorld;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
@ -29,8 +26,6 @@ import java.util.Set;
|
||||
*/
|
||||
public class WaveTrigger extends Trigger {
|
||||
|
||||
private static Map<GameWorld, ArrayList<WaveTrigger>> triggers = new HashMap<>();
|
||||
|
||||
private TriggerType type = TriggerTypeDefault.WAVE;
|
||||
|
||||
private double mustKillRate = 1;
|
||||
@ -67,25 +62,6 @@ public class WaveTrigger extends Trigger {
|
||||
setTriggered(false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void register(GameWorld gameWorld) {
|
||||
if (!hasTriggers(gameWorld)) {
|
||||
ArrayList<WaveTrigger> list = new ArrayList<>();
|
||||
list.add(this);
|
||||
triggers.put(gameWorld, list);
|
||||
|
||||
} else {
|
||||
triggers.get(gameWorld).add(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void unregister(GameWorld gameWorld) {
|
||||
if (hasTriggers(gameWorld)) {
|
||||
triggers.get(gameWorld).remove(this);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public TriggerType getType() {
|
||||
return type;
|
||||
@ -101,17 +77,11 @@ public class WaveTrigger extends Trigger {
|
||||
*/
|
||||
public static Set<WaveTrigger> getByGameWorld(GameWorld gameWorld) {
|
||||
Set<WaveTrigger> toReturn = new HashSet<>();
|
||||
if (triggers.get(gameWorld) != null) {
|
||||
for (WaveTrigger trigger : triggers.get(gameWorld)) {
|
||||
toReturn.add(trigger);
|
||||
}
|
||||
for (Trigger trigger : gameWorld.getTriggers()) {
|
||||
toReturn.add((WaveTrigger) trigger);
|
||||
}
|
||||
|
||||
return toReturn;
|
||||
}
|
||||
|
||||
public static boolean hasTriggers(GameWorld gameWorld) {
|
||||
return !triggers.isEmpty() && triggers.containsKey(gameWorld);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -29,13 +29,17 @@ import io.github.dre2n.dungeonsxl.game.Game;
|
||||
import io.github.dre2n.dungeonsxl.game.GamePlaceableBlock;
|
||||
import io.github.dre2n.dungeonsxl.mob.DMob;
|
||||
import io.github.dre2n.dungeonsxl.player.DGamePlayer;
|
||||
import io.github.dre2n.dungeonsxl.player.DGroup;
|
||||
import io.github.dre2n.dungeonsxl.reward.RewardChest;
|
||||
import io.github.dre2n.dungeonsxl.sign.DSign;
|
||||
import io.github.dre2n.dungeonsxl.sign.DSignType;
|
||||
import io.github.dre2n.dungeonsxl.sign.DSignTypeDefault;
|
||||
import io.github.dre2n.dungeonsxl.sign.MobSign;
|
||||
import io.github.dre2n.dungeonsxl.trigger.MobTrigger;
|
||||
import io.github.dre2n.dungeonsxl.sign.StartSign;
|
||||
import io.github.dre2n.dungeonsxl.trigger.ProgressTrigger;
|
||||
import io.github.dre2n.dungeonsxl.trigger.RedstoneTrigger;
|
||||
import io.github.dre2n.dungeonsxl.trigger.Trigger;
|
||||
import io.github.dre2n.dungeonsxl.trigger.TriggerType;
|
||||
import io.github.dre2n.dungeonsxl.trigger.TriggerTypeDefault;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
@ -72,7 +76,6 @@ public class GameWorld {
|
||||
private World world;
|
||||
private String mapName;
|
||||
private Location locLobby;
|
||||
private Location locStart;
|
||||
private boolean isPlaying = false;
|
||||
private int id;
|
||||
private List<ItemStack> secureObjects = new ArrayList<>();
|
||||
@ -83,6 +86,7 @@ public class GameWorld {
|
||||
// TODO: Killed mobs
|
||||
private CopyOnWriteArrayList<RewardChest> rewardChests = new CopyOnWriteArrayList<>();
|
||||
private CopyOnWriteArrayList<DSign> dSigns = new CopyOnWriteArrayList<>();
|
||||
private CopyOnWriteArrayList<Trigger> triggers = new CopyOnWriteArrayList<>();
|
||||
private WorldConfig worldConfig;
|
||||
|
||||
public GameWorld() {
|
||||
@ -203,16 +207,31 @@ public class GameWorld {
|
||||
/**
|
||||
* @return the start location
|
||||
*/
|
||||
public Location getStartLocation() {
|
||||
return locStart;
|
||||
}
|
||||
public Location getStartLocation(DGroup dGroup) {
|
||||
int index = getGame().getDGroups().indexOf(dGroup);
|
||||
|
||||
/**
|
||||
* @param location
|
||||
* the location to start to set
|
||||
*/
|
||||
public void setStartLocation(Location location) {
|
||||
this.locStart = location;
|
||||
// Try the matching location
|
||||
for (DSign dSign : dSigns) {
|
||||
if (dSign.getType() == DSignTypeDefault.START) {
|
||||
if (((StartSign) dSign).getId() == index) {
|
||||
return dSign.getSign().getLocation();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Try any location
|
||||
for (DSign dSign : dSigns) {
|
||||
if (dSign.getType() == DSignTypeDefault.START) {
|
||||
return dSign.getSign().getLocation();
|
||||
}
|
||||
}
|
||||
|
||||
// Lobby location as fallback
|
||||
if (locLobby != null) {
|
||||
return locLobby;
|
||||
}
|
||||
|
||||
return world.getSpawnLocation();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -335,6 +354,19 @@ public class GameWorld {
|
||||
return dSigns;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the triggers with the type
|
||||
*/
|
||||
public List<DSign> getDSigns(DSignType type) {
|
||||
List<DSign> dSignsOfType = new ArrayList<>();
|
||||
for (DSign dSign : dSigns) {
|
||||
if (dSign.getType() == type) {
|
||||
dSignsOfType.add(dSign);
|
||||
}
|
||||
}
|
||||
return dSignsOfType;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param dSigns
|
||||
* the dSigns to set
|
||||
@ -343,6 +375,42 @@ public class GameWorld {
|
||||
this.dSigns = dSigns;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the triggers
|
||||
*/
|
||||
public CopyOnWriteArrayList<Trigger> getTriggers() {
|
||||
return triggers;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the triggers with the type
|
||||
*/
|
||||
public List<Trigger> getTriggers(TriggerType type) {
|
||||
List<Trigger> triggersOfType = new ArrayList<>();
|
||||
for (Trigger trigger : triggers) {
|
||||
if (trigger.getType() == type) {
|
||||
triggersOfType.add(trigger);
|
||||
}
|
||||
}
|
||||
return triggersOfType;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param trigger
|
||||
* the trigger to add
|
||||
*/
|
||||
public void addTrigger(Trigger trigger) {
|
||||
triggers.add(trigger);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param trigger
|
||||
* the trigger to remove
|
||||
*/
|
||||
public void removeTrigger(Trigger trigger) {
|
||||
triggers.remove(trigger);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the potential amount of mobs in the world
|
||||
*/
|
||||
@ -426,11 +494,11 @@ public class GameWorld {
|
||||
}
|
||||
}
|
||||
}
|
||||
if (RedstoneTrigger.hasTriggers(this)) {
|
||||
for (RedstoneTrigger trigger : RedstoneTrigger.getTriggersArray(this)) {
|
||||
trigger.onTrigger();
|
||||
}
|
||||
|
||||
for (Trigger trigger : getTriggers(TriggerTypeDefault.REDSTONE)) {
|
||||
((RedstoneTrigger) trigger).onTrigger();
|
||||
}
|
||||
|
||||
for (DSign dSign : dSigns) {
|
||||
if (dSign != null) {
|
||||
if (!dSign.hasTriggers()) {
|
||||
|
46
src/main/java/io/github/dre2n/dungeonsxl/world/Worlds.java
Normal file
46
src/main/java/io/github/dre2n/dungeonsxl/world/Worlds.java
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2016 Frank Baumann
|
||||
*
|
||||
* 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 3 of the License, 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, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package io.github.dre2n.dungeonsxl.world;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* @author Daniel Saukel
|
||||
*/
|
||||
public class Worlds {
|
||||
|
||||
/*private Set<ResourceWorld> resourceWorlds;
|
||||
|
||||
public Worlds(File folder) {
|
||||
for (File file : folder.listFiles()) {
|
||||
resourceWorlds.add(new ResourceWorld());
|
||||
}
|
||||
}*/
|
||||
|
||||
@Deprecated
|
||||
public static boolean exists(String name) {
|
||||
for (File world : io.github.dre2n.dungeonsxl.DungeonsXL.MAPS.listFiles()) {
|
||||
if (world.isDirectory() && world.getName().equalsIgnoreCase(name)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
@ -4,7 +4,7 @@ version: ${project.version}
|
||||
authors: [Frank Baumann, Milan Albrecht, Tobias Schmitz, Daniel Saukel]
|
||||
description: ${project.description}
|
||||
website: ${project.url}
|
||||
softdepend: [BlueRoseCommons, CommandsXL, ItemsXL, Vault, CustomMobs, InsaneMobs, MythicMobs]
|
||||
softdepend: [BlueRoseCommons, CommandsXL, ItemsXL, Vault, CustomMobs, InsaneMobs, MythicMobs, HolographicDisplays]
|
||||
commands:
|
||||
dungeonsxl:
|
||||
description: Reference command for DungeonsXL.
|
||||
|
Loading…
Reference in New Issue
Block a user