From c298607b5692c8023e0d681144f91429b13bed7c Mon Sep 17 00:00:00 2001 From: Garbage Mule Date: Sat, 20 Aug 2011 16:01:10 +0200 Subject: [PATCH] Players no longer lose stored items and/or earned rewards upon disconnecting from the arena. --- MobArena.jar | Bin 221205 -> 237228 bytes resources/plugin.yml | 98 ++++++- src/com/garbagemule/ArenaPlugin/Arena.java | 116 -------- .../garbagemule/ArenaPlugin/ArenaPlugin.java | 6 - src/com/garbagemule/ArenaPlugin/Master.java | 16 -- .../garbagemule/MobArena/AbstractArena.java | 116 -------- src/com/garbagemule/MobArena/Arena.java | 34 ++- .../garbagemule/MobArena/ArenaInterface.java | 116 -------- src/com/garbagemule/MobArena/ArenaMaster.java | 5 + src/com/garbagemule/MobArena/Arenaz.java | 107 -------- src/com/garbagemule/MobArena/Lobby.java | 25 -- src/com/garbagemule/MobArena/MAArena.java | 6 - src/com/garbagemule/MobArena/MAUtils.java | 182 ++++++++++--- src/com/garbagemule/MobArena/MobArena.java | 2 +- .../MobArena/util/InventoryItem.java | 10 + .../MobArena/util/MAInventoryItem.java | 22 -- .../garbagemule/MobArena/util/WaveUtils.java | 14 +- .../MobArena/util/jnbt/ByteArrayTag.java | 81 ++++++ .../MobArena/util/jnbt/ByteTag.java | 73 +++++ .../MobArena/util/jnbt/CompoundTag.java | 82 ++++++ .../MobArena/util/jnbt/DoubleTag.java | 73 +++++ .../MobArena/util/jnbt/EndTag.java | 60 ++++ .../MobArena/util/jnbt/FloatTag.java | 73 +++++ .../MobArena/util/jnbt/IntTag.java | 73 +++++ .../MobArena/util/jnbt/ListTag.java | 97 +++++++ .../MobArena/util/jnbt/LongTag.java | 73 +++++ .../MobArena/util/jnbt/NBTConstants.java | 72 +++++ .../MobArena/util/jnbt/NBTInputStream.java | 179 ++++++++++++ .../MobArena/util/jnbt/NBTOutputStream.java | 257 ++++++++++++++++++ .../MobArena/util/jnbt/NBTUtils.java | 152 +++++++++++ .../MobArena/util/jnbt/ShortTag.java | 73 +++++ .../MobArena/util/jnbt/StringTag.java | 73 +++++ .../garbagemule/MobArena/util/jnbt/Tag.java | 70 +++++ 33 files changed, 1862 insertions(+), 574 deletions(-) delete mode 100644 src/com/garbagemule/ArenaPlugin/Arena.java delete mode 100644 src/com/garbagemule/ArenaPlugin/ArenaPlugin.java delete mode 100644 src/com/garbagemule/ArenaPlugin/Master.java delete mode 100644 src/com/garbagemule/MobArena/AbstractArena.java delete mode 100644 src/com/garbagemule/MobArena/ArenaInterface.java delete mode 100644 src/com/garbagemule/MobArena/Arenaz.java delete mode 100644 src/com/garbagemule/MobArena/Lobby.java delete mode 100644 src/com/garbagemule/MobArena/MAArena.java delete mode 100644 src/com/garbagemule/MobArena/util/MAInventoryItem.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/ByteArrayTag.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/ByteTag.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/CompoundTag.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/DoubleTag.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/EndTag.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/FloatTag.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/IntTag.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/ListTag.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/LongTag.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/NBTConstants.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/NBTInputStream.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/NBTOutputStream.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/NBTUtils.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/ShortTag.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/StringTag.java create mode 100644 src/com/garbagemule/MobArena/util/jnbt/Tag.java diff --git a/MobArena.jar b/MobArena.jar index 532713b39f2d2f53bb33546bc08549b7e2fc2151..b9a363f5a496202f683c2449d1cc1d23232f0eb1 100644 GIT binary patch delta 86558 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 getArenas(); - - //public List getEnabledArenas(); - - //public List getPermittedArenas(Player p); - - -} diff --git a/src/com/garbagemule/MobArena/AbstractArena.java b/src/com/garbagemule/MobArena/AbstractArena.java deleted file mode 100644 index f9d7670..0000000 --- a/src/com/garbagemule/MobArena/AbstractArena.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.garbagemule.MobArena; - -import java.util.Map; -import java.util.Set; - -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.entity.Player; - -import com.garbagemule.ArenaPlugin.ArenaPlugin; - -public abstract class AbstractArena implements ArenaInterface -{ - private String name; - private World world; - private ArenaPlugin plugin; - - private boolean enabled, setup, running; - private Set arenaPlayers, lobbyPlayers, readyPlayers, specPlayers; - private Map playerClassMap; - private Map locations; - private Map healths; - - public AbstractArena(String name, World world, ArenaPlugin plugin) - { - if (world == null) - throw new NullPointerException("[" + plugin.getClass().getSimpleName() + "] ERROR! World for arena '" + name + "' does not exist!"); - - this.name = name; - this.world = world; - this.plugin = plugin; - } - - public abstract void startArena(); - - public abstract void endArena(); - - public abstract boolean forceStart(); - - public abstract boolean forceEnd(); -/* - public void playerJoin(Player p) - { - storePlayerData(p, p.getLocation()); - MAUtils.sitPets(p); - p.setHealth(20); - movePlayerToLobby(p); - } -*/ - /* - public void playerLeave(Player p) - { - if (arenaPlayers.contains(p) || lobbyPlayers.contains(p)) - finishArenaPlayer(p); - - movePlayerToEntry(p); - discardPlayer(p); - - // End arena if possible. - endArena(); - }*/ - - - public abstract void playerSpec(Player p); - - public abstract void playerDeath(Player p); - - public abstract void playerReady(Player p); - - public abstract boolean canJoin(Player p); - - public abstract boolean canLeave(Player p); - - public abstract boolean canSpec(Player p); - - public boolean isEnabled() - { - return enabled; - } - - public boolean isSetup() - { - return setup; - } - - public boolean isRunning() - { - return running; - } - - public void storePlayerData(Player p, Location loc) - { - // TODO: Get this sorted out - //plugin.getAM().arenaMap.put(p, this); - - if (!locations.containsKey(p)) - locations.put(p, loc); - - if (!healths.containsKey(p)) - healths.put(p, p.getHealth()); - } - - public abstract void movePlayerToLobby(Player p); - - public abstract void movePlayerToSpec(Player p); - - public void movePlayerToEntry(Player p) - { - Location entry = locations.get(p); - if (entry == null) return; - - p.teleport(entry); - } - - public abstract void restoreInvAndGiveRewards(final Player p); -} diff --git a/src/com/garbagemule/MobArena/Arena.java b/src/com/garbagemule/MobArena/Arena.java index ad168c9..cd4d630 100644 --- a/src/com/garbagemule/MobArena/Arena.java +++ b/src/com/garbagemule/MobArena/Arena.java @@ -6,7 +6,6 @@ import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -478,7 +477,7 @@ public class Arena } public void restoreInvAndGiveRewards(final Player p) - { + { final List rewards = log != null && log.players.get(p) != null ? log.players.get(p).rewards : new LinkedList(); final boolean hadRewards = rewardedPlayers.contains(p); @@ -486,10 +485,7 @@ public class Arena new Runnable() { public void run() - { - if (!p.isOnline()) - return; - + { if (!emptyInvJoin) MAUtils.restoreInventory(p); @@ -503,6 +499,21 @@ public class Arena }); } + public void restoreInvAndGiveRewardz(final Player p, List rewards, boolean hadRewards) + { + if (!p.isOnline()) + return; + + if (!emptyInvJoin) + MAUtils.restoreInventory(p); + + if (hadRewards) + return; + + MAUtils.giveRewards(p, rewards, plugin); + if (running) + rewardedPlayers.add(p);} + public void storePlayerData(Player p, Location loc) { plugin.getAM().arenaMap.put(p, this); @@ -1035,10 +1046,8 @@ public class Arena List result = new ArrayList(spawnpoints.size()); for (Map.Entry entry : spawnpoints.entrySet()) - { - if (entry.getKey().matches("^*boss*$")) continue; - result.add(entry.getValue()); - } + if (!entry.getKey().matches("^*boss*$")) + result.add(entry.getValue()); return !result.isEmpty() ? result : new ArrayList(spawnpoints.values()); } @@ -1107,6 +1116,11 @@ public class Arena return tmp; } + public Set getPets() + { + return pets; + } + public void resetIdleTimer() { if (maxIdleTime <= 0 || !running) diff --git a/src/com/garbagemule/MobArena/ArenaInterface.java b/src/com/garbagemule/MobArena/ArenaInterface.java deleted file mode 100644 index d10255b..0000000 --- a/src/com/garbagemule/MobArena/ArenaInterface.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.garbagemule.MobArena; - -import org.bukkit.entity.Player; - -public interface ArenaInterface -{ - /** - * Start the arena session. - * This method should warp all players to their respective warp points, start all - * needed timers, clear/populate all sets and lists, and flag all booleans. - */ - public void startArena(); - - /** - * Stop the arena session. - * Distribute rewards, clean up arena floor and reset everything to how it was before - * the arena session was started. - */ - public void endArena(); - - /** - * Force the arena to start. - * If some players are ready, this method will force all non-ready players to leave, - * and the arena will start with only the currently ready players. - * @return true, if the arena was successfully started, false otherwise - */ - public boolean forceStart(); - - /** - * Force the arena to end. - * Returns all players to their entry locations, distributes rewards, cleans the arena - * floor, as well as all lists, sets and maps. Calling this method will return the - * arena to the state it would be in right after MobArena has loaded. - * @return true, if the session was successfully ended. - */ - public boolean forceEnd(); - - /** - * Player joins the arena/lobby. - * The player should either enter with an empty inventory, or have their inventory - * stored upon entering, such that the classes in the lobby/arena will be the only - * means of equipment. The player's previous location and health is also stored. - * @param p A player - * @precondition Calling canJoin(p) for the given player must return true. - */ - public void playerJoin(Player p); - - /** - * Player leaves the arena or lobby. - * Upon leaving, the player will have their inventory restored (if it was stored - * on join), as well as their health. They will be completely discarded/cleared from - * the arena, such that they no longer reside in any collections. - * @param p A player - * @precondition Calling canLeave(p) for the given player must return true. - */ - public void playerLeave(Player p); - - /** - * Player joins the spectator area. - * The player takes a spectator role, meaning they cannot participate in the arena - * in any way. The player's location and health is stored upon spectating, and of - * course restored upon leaving. - * @param p A player - * @precondition Calling canSpec(p) for the given player must return true. - */ - public void playerSpec(Player p); - - /** - * Player dies in the arena. - */ - public void playerDeath(Player p); - - /** - * Player signals that they are ready. - */ - public void playerReady(Player p); - - /** - * Check if a player can join the arena. - * @param p A player - * @return true, if the player is eligible to join the arena. - */ - public boolean canJoin(Player p); - - /** - * Check if a player can leave the arena. - * @param p A player - * @return true, if the player is eligible to leave the arena. - */ - public boolean canLeave(Player p); - - /** - * Check if a player can spectate the arena. - * @param p A player - * @return true, if the player is eligible for spectating. - */ - public boolean canSpec(Player p); - - /** - * Check if the arena is enabled. - * @return true, if the arena is enabled. - */ - public boolean isEnabled(); - - /** - * Check if the arena is set up and ready for use. - * @return true, if the arena is ready for use. - */ - public boolean isSetup(); - - /** - * Check if the arena is running. - * @return true, if the arena is running. - */ - public boolean isRunning(); -} diff --git a/src/com/garbagemule/MobArena/ArenaMaster.java b/src/com/garbagemule/MobArena/ArenaMaster.java index fd16e62..6050c98 100644 --- a/src/com/garbagemule/MobArena/ArenaMaster.java +++ b/src/com/garbagemule/MobArena/ArenaMaster.java @@ -392,4 +392,9 @@ public class ArenaMaster implements Master public void updateClasses() { update(false, true, false); } public void updateArenas() { update(false, false, true); } public void updateAll() { update(true, true, true); } + + public Map getArenaMap() + { + return null;//arenaMap; + } } diff --git a/src/com/garbagemule/MobArena/Arenaz.java b/src/com/garbagemule/MobArena/Arenaz.java deleted file mode 100644 index ac63e9f..0000000 --- a/src/com/garbagemule/MobArena/Arenaz.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.garbagemule.MobArena; - -import org.bukkit.entity.Player; - -public interface Arenaz -{ - /** - * Start the arena session. - * This method should warp all players to their respective warp points, start all - * needed timers, clear/populate all sets and lists, and flag all booleans. - */ - public void startArena(); - - /** - * Stop the arena session. - * Distribute rewards, clean up arena floor and reset everything to how it was before - * the arena session was started, false otherwise - */ - public void endArena(); - - /** - * Force the arena to start. - * If some players are ready, this method will force all non-ready players to leave, - * and the arena will start with only the currently ready players. - * @return true, if the arena was successfully started, false otherwise - */ - public boolean forceStart(); - - /** - * Force the arena to end. - * Returns all players to their entry locations, distributes rewards, cleans the arena - * floor, as well as all lists, sets and maps. Calling this method will return the - * arena to the state it would be in right after MobArena has loaded. - * @return true, if the session was successfully ended. - */ - public boolean forceEnd(); - - /** - * Player joins the arena/lobby. - * @param p A player - * @precondition Calling canJoin(p) for the given player must return true. - */ - public void playerJoin(Player p); - - /** - * Player leaves the arena or lobby. - * @param p A player - * @precondition Calling canLeave(p) for the given player must return true. - */ - public void playerLeave(Player p); - - /** - * Player joins the spectator area. - * @param p A player - * @precondition Calling canSpec(p) for the given player must return true. - */ - public void playerSpec(Player p); - - /** - * Player dies in the arena. - */ - public void playerDeath(Player p); - - /** - * Player signals that they are ready. - */ - public void playerReady(Player p); - - /** - * Check if a player can join the arena. - * @param p A player - * @return true, if the player is eligible to join the arena. - */ - public boolean canJoin(Player p); - - /** - * Check if a player can leave the arena. - * @param p A player - * @return true, if the player is eligible to leave the arena. - */ - public boolean canLeave(Player p); - - /** - * Check if a player can spectate the arena. - * @param p A player - * @return true, if the player is eligible for spectating. - */ - public boolean canSpec(Player p); - - /** - * Check if the arena is enabled. - * @return true, if the arena is enabled. - */ - public boolean isEnabled(); - - /** - * Check if the arena is set up and ready for use. - * @return true, if the arena is ready for use. - */ - public boolean isSetup(); - - /** - * Check if the arena is running. - * @return true, if the arena is running. - */ - public boolean isRunning(); -} diff --git a/src/com/garbagemule/MobArena/Lobby.java b/src/com/garbagemule/MobArena/Lobby.java deleted file mode 100644 index 8ff1601..0000000 --- a/src/com/garbagemule/MobArena/Lobby.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.garbagemule.MobArena; - -import org.bukkit.Location; -import org.bukkit.entity.Player; - -public class Lobby -{ - protected Arena arena; - protected ArenaMaster am; - protected Location warp, l1, l2; - - public Lobby(Arena arena) - { - this.arena = arena; - } - public Lobby() - { - this(null); - } - - public void playerJoin(Player p) - { - p.teleport(warp); - } -} diff --git a/src/com/garbagemule/MobArena/MAArena.java b/src/com/garbagemule/MobArena/MAArena.java deleted file mode 100644 index a61b028..0000000 --- a/src/com/garbagemule/MobArena/MAArena.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.garbagemule.MobArena; - -public class MAArena -{ - -} diff --git a/src/com/garbagemule/MobArena/MAUtils.java b/src/com/garbagemule/MobArena/MAUtils.java index 13ddc69..b3d9f25 100644 --- a/src/com/garbagemule/MobArena/MAUtils.java +++ b/src/com/garbagemule/MobArena/MAUtils.java @@ -7,6 +7,7 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.util.ArrayList; import java.util.HashSet; import java.util.Iterator; import java.util.List; @@ -39,6 +40,13 @@ import org.bukkit.util.config.Configuration; import com.garbagemule.MobArena.MAMessages.Msg; import com.garbagemule.MobArena.util.EntityPosition; import com.garbagemule.MobArena.util.InventoryItem; +import com.garbagemule.MobArena.util.jnbt.ByteTag; +import com.garbagemule.MobArena.util.jnbt.CompoundTag; +import com.garbagemule.MobArena.util.jnbt.ListTag; +import com.garbagemule.MobArena.util.jnbt.NBTInputStream; +import com.garbagemule.MobArena.util.jnbt.NBTOutputStream; +import com.garbagemule.MobArena.util.jnbt.ShortTag; +import com.garbagemule.MobArena.util.jnbt.Tag; public class MAUtils { @@ -337,8 +345,7 @@ public class MAUtils INVENTORY AND REWARD METHODS // ///////////////////////////////////////////////////////////////////// */ - - /* Clears the players inventory and armor slots. */ + public static PlayerInventory clearInventory(Player p) { PlayerInventory inv = p.getInventory(); @@ -362,18 +369,18 @@ public class MAUtils return false; // Grab the inventory contents. - ItemStack[] armor = p.getInventory().getArmorContents(); ItemStack[] items = p.getInventory().getContents(); + ItemStack[] armor = p.getInventory().getArmorContents(); try { backupFile.createNewFile(); - InventoryItem[] inv = new InventoryItem[armor.length + items.length]; - for (int i = 0; i < armor.length; i++) - inv[i] = InventoryItem.parseItemStack(armor[i]); + InventoryItem[] inv = new InventoryItem[items.length + armor.length]; for (int i = 0; i < items.length; i++) - inv[armor.length + i] = InventoryItem.parseItemStack(items[i]); + inv[i] = InventoryItem.parseItemStack(items[i]); + for (int i = 0; i < armor.length; i++) + inv[i + items.length] = InventoryItem.parseItemStack(armor[i]); FileOutputStream fos = new FileOutputStream(backupFile); ObjectOutputStream oos = new ObjectOutputStream(fos); @@ -392,6 +399,33 @@ public class MAUtils } public static boolean restoreInventory(Player p) + { + // Grab the items from the MobArena .inv file + ItemStack[] stacks = getInventoryFile(p); + + // If the player isn't online, hack the playerName.dat file + if (!p.isOnline()) + return writeInventoryData(p, stacks); + + // Otherwise, restore the inventory directly + ItemStack[] items = new ItemStack[stacks.length-4]; + ItemStack[] armor = new ItemStack[4]; + + for (int i = 0; i < stacks.length - 4; i++) + items[i] = stacks[i]; + for (int i = 0; i < 4; i++) + armor[i] = stacks[stacks.length - 4 + i]; + + // Restore the inventory. + PlayerInventory inv = p.getInventory(); + inv.setArmorContents(armor); + for (int i = 0; i < items.length; i++) + inv.setItem(i, items[i]); + + return true; + } + + public static ItemStack[] getInventoryFile(Player p) { String invPath = "plugins" + sep + "MobArena" + sep + "inventories"; File backupFile = new File(invPath + sep + p.getName() + ".inv"); @@ -400,35 +434,104 @@ public class MAUtils { // If the backup-file couldn't be found, return. if (!backupFile.exists()) - return false; + return null; // Grab the MAInventoryItem array from the backup-file. FileInputStream fis = new FileInputStream(backupFile); ObjectInputStream ois = new ObjectInputStream(fis); InventoryItem[] fromFile = (InventoryItem[]) ois.readObject(); ois.close(); - - // Split that shit. - ItemStack[] armor = new ItemStack[4]; - ItemStack[] items = new ItemStack[fromFile.length-4]; - - for (int i = 0; i < 4; i++) - armor[i] = InventoryItem.toItemStack(fromFile[i]); - for (int i = 4; i < fromFile.length; i++) - items[i - 4] = InventoryItem.toItemStack(fromFile[i]); - - // Restore the inventory. - PlayerInventory inv = p.getInventory(); - inv.setArmorContents(armor); - for (int i = 0; i < items.length; i++) - inv.setItem(i, items[i]); - /* - for (ItemStack stack : items) - if (stack != null) - inv.addItem(stack); - */ - // Remove the backup-file. + + // Delete the file backupFile.delete(); + + return InventoryItem.toItemStacks(fromFile); + } + catch (Exception e) + { + e.printStackTrace(); + MobArena.warning("Could not restore inventory for " + p.getName()); + return null; + } + } + + public static ItemStack[] readInventoryData(Player p) + { + // Grab the data dir /players/ + File playerDir = new File(Bukkit.getServer().getWorlds().get(0).getName(), "players"); + + try + { + NBTInputStream in = new NBTInputStream(new FileInputStream(new File(playerDir, p.getName() + ".dat"))); + CompoundTag tag = (CompoundTag) in.readTag(); + in.close(); + + ListTag inventory = (ListTag) tag.getValue().get("Inventory"); + + ItemStack[] stacks = new ItemStack[40]; + for (int i = 0; i < inventory.getValue().size(); i++) + { + CompoundTag item = (CompoundTag) inventory.getValue().get(i); + byte count = ((ByteTag) item.getValue().get("Count")).getValue(); + byte slot = ((ByteTag) item.getValue().get("Slot")).getValue(); + short damage = ((ShortTag) item.getValue().get("Damage")).getValue(); + short id = ((ShortTag) item.getValue().get("id")).getValue(); + stacks[slot < 36 ? slot : 36 + 103-slot] = new ItemStack(id, count, damage); + } + return stacks; + } + catch (Exception e) + { + e.printStackTrace(); + MobArena.warning("Could not restore inventory for " + p.getName()); + return null; + } + } + + public static boolean writeInventoryData(Player p, ItemStack[] stacks) + { + // Abort if stacks is null + if (stacks == null) return false; + + // Grab the data dir /players/ + File playerDir = new File(Bukkit.getServer().getWorlds().get(0).getName(), "players"); + + try + { + NBTInputStream in = new NBTInputStream(new FileInputStream(new File(playerDir, p.getName() + ".dat"))); + CompoundTag tag = (CompoundTag) in.readTag(); + in.close(); + + ArrayList tagList = new ArrayList(); + + for (int i = 0; i < stacks.length; i++) + { + if (stacks[i] == null) continue; + + ByteTag count = new ByteTag("Count", (byte) stacks[i].getAmount()); + ByteTag slot = new ByteTag("Slot", (byte) (i < 36 ? i : 104-(stacks.length-i))); + ShortTag damage = new ShortTag("Damage", stacks[i].getDurability()); + ShortTag id = new ShortTag("id", (short) stacks[i].getTypeId()); + + HashMap tagMap = new HashMap(); + tagMap.put("Count", count); + tagMap.put("Slot", slot); + tagMap.put("Damage", damage); + tagMap.put("id", id); + + tagList.add(new CompoundTag("", tagMap)); + } + + ListTag inventory = new ListTag("Inventory", CompoundTag.class, tagList); + + HashMap tagCompound = new HashMap(tag.getValue()); + tagCompound.put("Inventory", inventory); + tag = new CompoundTag("Player", tagCompound); + + NBTOutputStream out = new NBTOutputStream(new FileOutputStream(new File(playerDir, p.getName() + ".dat"))); + out.writeTag(tag); + out.close(); + return true; } catch (Exception e) { @@ -436,8 +539,6 @@ public class MAUtils MobArena.warning("Could not restore inventory for " + p.getName()); return false; } - - return true; } /* Checks if all inventory and armor slots are empty. */ @@ -465,6 +566,25 @@ public class MAUtils if (stacks == null) return; + if (!p.isOnline()) + { + ItemStack[] items = readInventoryData(p); + int currentSlot = 0; + for (ItemStack stack : stacks) + { + while (currentSlot < items.length && items[currentSlot] != null) + currentSlot++; + + if (currentSlot >= items.length) + break; + + items[currentSlot] = stack; + } + + writeInventoryData(p, items); + return; + } + PlayerInventory inv = p.getInventory(); for (ItemStack stack : stacks) { diff --git a/src/com/garbagemule/MobArena/MobArena.java b/src/com/garbagemule/MobArena/MobArena.java index 62a239b..5b12dea 100644 --- a/src/com/garbagemule/MobArena/MobArena.java +++ b/src/com/garbagemule/MobArena/MobArena.java @@ -49,7 +49,7 @@ public class MobArena extends JavaPlugin implements ArenaPlugin public static Random random = new Random(); public void onEnable() - { + { // Description file and data folders desc = getDescription(); dir = getDataFolder(); diff --git a/src/com/garbagemule/MobArena/util/InventoryItem.java b/src/com/garbagemule/MobArena/util/InventoryItem.java index 160bf84..38f2757 100644 --- a/src/com/garbagemule/MobArena/util/InventoryItem.java +++ b/src/com/garbagemule/MobArena/util/InventoryItem.java @@ -64,6 +64,16 @@ public class InventoryItem implements Serializable return item.toItemStack(); } + public static ItemStack[] toItemStacks(InventoryItem[] items) + { + ItemStack[] result = new ItemStack[items.length]; + + for (int i = 0; i < items.length; i++) + result[i] = items[i].toItemStack(); + + return result; + } + /** * Static method for converting an ItemStack to an InventoryItems. * @param stack The ItemStack to convert diff --git a/src/com/garbagemule/MobArena/util/MAInventoryItem.java b/src/com/garbagemule/MobArena/util/MAInventoryItem.java deleted file mode 100644 index db100ea..0000000 --- a/src/com/garbagemule/MobArena/util/MAInventoryItem.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.garbagemule.MobArena.util; - -import java.io.Serializable; - -public class MAInventoryItem implements Serializable -{ - private static final long serialVersionUID = 739709220350581510L; - private int typeId; - private int amount; - private short durability; - - public MAInventoryItem(int typeId, int amount, short durability) - { - this.typeId = typeId; - this.amount = amount; - this.durability = durability; - } - - public int getTypeId() { return typeId; } - public int getAmount() { return amount; } - public short getDurability() { return durability; } -} diff --git a/src/com/garbagemule/MobArena/util/WaveUtils.java b/src/com/garbagemule/MobArena/util/WaveUtils.java index f9c53a3..9a79049 100644 --- a/src/com/garbagemule/MobArena/util/WaveUtils.java +++ b/src/com/garbagemule/MobArena/util/WaveUtils.java @@ -24,7 +24,7 @@ public class WaveUtils */ public static List getValidSpawnpoints(Arena arena, Collection players) { - long start = System.nanoTime(); + //long start = System.nanoTime(); List result = new ArrayList(); double x1 = Double.NaN, y1 = Double.NaN, z1 = Double.NaN, // Bottom @@ -232,6 +232,13 @@ public class WaveUtils MobArena.warning("Missing 'frequency'-node in " + path); wellDefined = false; } + // OPTIONAL: Wave + int wave = config.getInt(path + "wave", 0); + if (wave < 0) + { + MobArena.warning("'wave' must be greater than 0 in " + path); + wellDefined = false; + } } else if (branch == WaveBranch.SINGLE) { @@ -242,6 +249,11 @@ public class WaveUtils MobArena.warning("Missing 'wave'-node in " + path); wellDefined = false; } + else if (wave < 0) + { + MobArena.warning("'wave' must be greater than 0 in " + path); + wellDefined = false; + } } else wellDefined = false; diff --git a/src/com/garbagemule/MobArena/util/jnbt/ByteArrayTag.java b/src/com/garbagemule/MobArena/util/jnbt/ByteArrayTag.java new file mode 100644 index 0000000..219d1a4 --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/ByteArrayTag.java @@ -0,0 +1,81 @@ +package com.garbagemule.MobArena.util.jnbt; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * The TAG_Byte_Array tag. + * @author Graham Edgecombe + * + */ +public final class ByteArrayTag extends Tag { + + /** + * The value. + */ + private final byte[] value; + + /** + * Creates the tag. + * @param name The name. + * @param value The value. + */ + public ByteArrayTag(String name, byte[] value) { + super(name); + this.value = value; + } + + @Override + public byte[] getValue() { + return value; + } + + @Override + public String toString() { + StringBuilder hex = new StringBuilder(); + for(byte b : value) { + String hexDigits = Integer.toHexString(b).toUpperCase(); + if(hexDigits.length() == 1) { + hex.append("0"); + } + hex.append(hexDigits).append(" "); + } + String name = getName(); + String append = ""; + if(name != null && !name.equals("")) { + append = "(\"" + this.getName() + "\")"; + } + return "TAG_Byte_Array" + append + ": " + hex.toString(); + } + +} diff --git a/src/com/garbagemule/MobArena/util/jnbt/ByteTag.java b/src/com/garbagemule/MobArena/util/jnbt/ByteTag.java new file mode 100644 index 0000000..b03463d --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/ByteTag.java @@ -0,0 +1,73 @@ +package com.garbagemule.MobArena.util.jnbt; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * The TAG_Byte tag. + * @author Graham Edgecombe + * + */ +public final class ByteTag extends Tag { + + /** + * The value. + */ + private final byte value; + + /** + * Creates the tag. + * @param name The name. + * @param value The value. + */ + public ByteTag(String name, byte value) { + super(name); + this.value = value; + } + + @Override + public Byte getValue() { + return value; + } + + @Override + public String toString() { + String name = getName(); + String append = ""; + if(name != null && !name.equals("")) { + append = "(\"" + this.getName() + "\")"; + } + return "TAG_Byte" + append + ": " + value; + } + +} diff --git a/src/com/garbagemule/MobArena/util/jnbt/CompoundTag.java b/src/com/garbagemule/MobArena/util/jnbt/CompoundTag.java new file mode 100644 index 0000000..3b59a9c --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/CompoundTag.java @@ -0,0 +1,82 @@ +package com.garbagemule.MobArena.util.jnbt; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +import java.util.Collections; +import java.util.Map; + +/** + * The TAG_Compound tag. + * @author Graham Edgecombe + * + */ +public final class CompoundTag extends Tag { + + /** + * The value. + */ + private final Map value; + + /** + * Creates the tag. + * @param name The name. + * @param value The value. + */ + public CompoundTag(String name, Map value) { + super(name); + this.value = Collections.unmodifiableMap(value); + } + + @Override + public Map getValue() { + return value; + } + + @Override + public String toString() { + String name = getName(); + String append = ""; + if(name != null && !name.equals("")) { + append = "(\"" + this.getName() + "\")"; + } + StringBuilder bldr = new StringBuilder(); + bldr.append("TAG_Compound" + append + ": " + value.size() + " entries\r\n{\r\n"); + for(Map.Entry entry : value.entrySet()) { + bldr.append(" " + entry.getValue().toString().replaceAll("\r\n", "\r\n ") + "\r\n"); + } + bldr.append("}"); + return bldr.toString(); + } + +} diff --git a/src/com/garbagemule/MobArena/util/jnbt/DoubleTag.java b/src/com/garbagemule/MobArena/util/jnbt/DoubleTag.java new file mode 100644 index 0000000..f46dfc3 --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/DoubleTag.java @@ -0,0 +1,73 @@ +package com.garbagemule.MobArena.util.jnbt; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * The TAG_Double tag. + * @author Graham Edgecombe + * + */ +public final class DoubleTag extends Tag { + + /** + * The value. + */ + private final double value; + + /** + * Creates the tag. + * @param name The name. + * @param value The value. + */ + public DoubleTag(String name, double value) { + super(name); + this.value = value; + } + + @Override + public Double getValue() { + return value; + } + + @Override + public String toString() { + String name = getName(); + String append = ""; + if(name != null && !name.equals("")) { + append = "(\"" + this.getName() + "\")"; + } + return "TAG_Double" + append + ": " + value; + } + +} diff --git a/src/com/garbagemule/MobArena/util/jnbt/EndTag.java b/src/com/garbagemule/MobArena/util/jnbt/EndTag.java new file mode 100644 index 0000000..e9ff5fe --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/EndTag.java @@ -0,0 +1,60 @@ +package com.garbagemule.MobArena.util.jnbt; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * The TAG_End tag. + * @author Graham Edgecombe + * + */ +public final class EndTag extends Tag { + + /** + * Creates the tag. + */ + public EndTag() { + super(""); + } + + @Override + public Object getValue() { + return null; + } + + @Override + public String toString() { + return "TAG_End"; + } + +} diff --git a/src/com/garbagemule/MobArena/util/jnbt/FloatTag.java b/src/com/garbagemule/MobArena/util/jnbt/FloatTag.java new file mode 100644 index 0000000..7ff0ad5 --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/FloatTag.java @@ -0,0 +1,73 @@ +package com.garbagemule.MobArena.util.jnbt; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * The TAG_Float tag. + * @author Graham Edgecombe + * + */ +public final class FloatTag extends Tag { + + /** + * The value. + */ + private final float value; + + /** + * Creates the tag. + * @param name The name. + * @param value The value. + */ + public FloatTag(String name, float value) { + super(name); + this.value = value; + } + + @Override + public Float getValue() { + return value; + } + + @Override + public String toString() { + String name = getName(); + String append = ""; + if(name != null && !name.equals("")) { + append = "(\"" + this.getName() + "\")"; + } + return "TAG_Float" + append + ": " + value; + } + +} diff --git a/src/com/garbagemule/MobArena/util/jnbt/IntTag.java b/src/com/garbagemule/MobArena/util/jnbt/IntTag.java new file mode 100644 index 0000000..f728a43 --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/IntTag.java @@ -0,0 +1,73 @@ +package com.garbagemule.MobArena.util.jnbt; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * The TAG_Int tag. + * @author Graham Edgecombe + * + */ +public final class IntTag extends Tag { + + /** + * The value. + */ + private final int value; + + /** + * Creates the tag. + * @param name The name. + * @param value The value. + */ + public IntTag(String name, int value) { + super(name); + this.value = value; + } + + @Override + public Integer getValue() { + return value; + } + + @Override + public String toString() { + String name = getName(); + String append = ""; + if(name != null && !name.equals("")) { + append = "(\"" + this.getName() + "\")"; + } + return "TAG_Int" + append + ": " + value; + } + +} diff --git a/src/com/garbagemule/MobArena/util/jnbt/ListTag.java b/src/com/garbagemule/MobArena/util/jnbt/ListTag.java new file mode 100644 index 0000000..e5b6a18 --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/ListTag.java @@ -0,0 +1,97 @@ +package com.garbagemule.MobArena.util.jnbt; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +import java.util.Collections; +import java.util.List; + +/** + * The TAG_List tag. + * @author Graham Edgecombe + * + */ +public final class ListTag extends Tag { + + /** + * The type. + */ + private final Class type; + + /** + * The value. + */ + private final List value; + + /** + * Creates the tag. + * @param name The name. + * @param type The type of item in the list. + * @param value The value. + */ + public ListTag(String name, Class type, List value) { + super(name); + this.type = type; + this.value = Collections.unmodifiableList(value); + } + + /** + * Gets the type of item in this list. + * @return The type of item in this list. + */ + public Class getType() { + return type; + } + + @Override + public List getValue() { + return value; + } + + @Override + public String toString() { + String name = getName(); + String append = ""; + if(name != null && !name.equals("")) { + append = "(\"" + this.getName() + "\")"; + } + StringBuilder bldr = new StringBuilder(); + bldr.append("TAG_List" + append + ": " + value.size() + " entries of type " + NBTUtils.getTypeName(type) + "\r\n{\r\n"); + for(Tag t : value) { + bldr.append(" " + t.toString().replaceAll("\r\n", "\r\n ") + "\r\n"); + } + bldr.append("}"); + return bldr.toString(); + } + +} diff --git a/src/com/garbagemule/MobArena/util/jnbt/LongTag.java b/src/com/garbagemule/MobArena/util/jnbt/LongTag.java new file mode 100644 index 0000000..14aa856 --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/LongTag.java @@ -0,0 +1,73 @@ +package com.garbagemule.MobArena.util.jnbt; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * The TAG_Long tag. + * @author Graham Edgecombe + * + */ +public final class LongTag extends Tag { + + /** + * The value. + */ + private final long value; + + /** + * Creates the tag. + * @param name The name. + * @param value The value. + */ + public LongTag(String name, long value) { + super(name); + this.value = value; + } + + @Override + public Long getValue() { + return value; + } + + @Override + public String toString() { + String name = getName(); + String append = ""; + if(name != null && !name.equals("")) { + append = "(\"" + this.getName() + "\")"; + } + return "TAG_Long" + append + ": " + value; + } + +} diff --git a/src/com/garbagemule/MobArena/util/jnbt/NBTConstants.java b/src/com/garbagemule/MobArena/util/jnbt/NBTConstants.java new file mode 100644 index 0000000..b03c11c --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/NBTConstants.java @@ -0,0 +1,72 @@ +package com.garbagemule.MobArena.util.jnbt; + +import java.nio.charset.Charset; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * A class which holds constant values. + * @author Graham Edgecombe + * + */ +public final class NBTConstants { + + /** + * The character set used by NBT (UTF-8). + */ + public static final Charset CHARSET = Charset.forName("UTF-8"); + + /** + * Tag type constants. + */ + public static final int TYPE_END = 0, + TYPE_BYTE = 1, + TYPE_SHORT = 2, + TYPE_INT = 3, + TYPE_LONG = 4, + TYPE_FLOAT = 5, + TYPE_DOUBLE = 6, + TYPE_BYTE_ARRAY = 7, + TYPE_STRING = 8, + TYPE_LIST = 9, + TYPE_COMPOUND = 10; + + /** + * Default private constructor. + */ + private NBTConstants() { + + } + +} diff --git a/src/com/garbagemule/MobArena/util/jnbt/NBTInputStream.java b/src/com/garbagemule/MobArena/util/jnbt/NBTInputStream.java new file mode 100644 index 0000000..6446dde --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/NBTInputStream.java @@ -0,0 +1,179 @@ +package com.garbagemule.MobArena.util.jnbt; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +import java.io.Closeable; +import java.io.DataInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.zip.GZIPInputStream; + +/** + *

This class reads NBT, or + * Named Binary Tag streams, and produces an object graph of + * subclasses of the Tag object.

+ * + *

The NBT format was created by Markus Persson, and the specification may + * be found at + * http://www.minecraft.net/docs/NBT.txt.

+ * @author Graham Edgecombe + * + */ +public final class NBTInputStream implements Closeable { + + /** + * The data input stream. + */ + private final DataInputStream is; + + /** + * Creates a new NBTInputStream, which will source its data + * from the specified input stream. + * @param is The input stream. + * @throws IOException if an I/O error occurs. + */ + public NBTInputStream(InputStream is) throws IOException { + this.is = new DataInputStream(new GZIPInputStream(is)); + } + + /** + * Reads an NBT tag from the stream. + * @return The tag that was read. + * @throws IOException if an I/O error occurs. + */ + public Tag readTag() throws IOException { + return readTag(0); + } + + /** + * Reads an NBT from the stream. + * @param depth The depth of this tag. + * @return The tag that was read. + * @throws IOException if an I/O error occurs. + */ + private Tag readTag(int depth) throws IOException { + int type = is.readByte() & 0xFF; + + String name; + if(type != NBTConstants.TYPE_END) { + int nameLength = is.readShort() & 0xFFFF; + byte[] nameBytes = new byte[nameLength]; + is.readFully(nameBytes); + name = new String(nameBytes, NBTConstants.CHARSET); + } else { + name = ""; + } + + return readTagPayload(type, name, depth); + } + + /** + * Reads the payload of a tag, given the name and type. + * @param type The type. + * @param name The name. + * @param depth The depth. + * @return The tag. + * @throws IOException if an I/O error occurs. + */ + private Tag readTagPayload(int type, String name, int depth) throws IOException { + switch(type) { + case NBTConstants.TYPE_END: + if(depth == 0) { + throw new IOException("TAG_End found without a TAG_Compound/TAG_List tag preceding it."); + } else { + return new EndTag(); + } + case NBTConstants.TYPE_BYTE: + return new ByteTag(name, is.readByte()); + case NBTConstants.TYPE_SHORT: + return new ShortTag(name, is.readShort()); + case NBTConstants.TYPE_INT: + return new IntTag(name, is.readInt()); + case NBTConstants.TYPE_LONG: + return new LongTag(name, is.readLong()); + case NBTConstants.TYPE_FLOAT: + return new FloatTag(name, is.readFloat()); + case NBTConstants.TYPE_DOUBLE: + return new DoubleTag(name, is.readDouble()); + case NBTConstants.TYPE_BYTE_ARRAY: + int length = is.readInt(); + byte[] bytes = new byte[length]; + is.readFully(bytes); + return new ByteArrayTag(name, bytes); + case NBTConstants.TYPE_STRING: + length = is.readShort(); + bytes = new byte[length]; + is.readFully(bytes); + return new StringTag(name, new String(bytes, NBTConstants.CHARSET)); + case NBTConstants.TYPE_LIST: + int childType = is.readByte(); + length = is.readInt(); + + List tagList = new ArrayList(); + for(int i = 0; i < length; i++) { + Tag tag = readTagPayload(childType, "", depth + 1); + if(tag instanceof EndTag) { + throw new IOException("TAG_End not permitted in a list."); + } + tagList.add(tag); + } + + return new ListTag(name, NBTUtils.getTypeClass(childType), tagList); + case NBTConstants.TYPE_COMPOUND: + Map tagMap = new HashMap(); + while(true) { + Tag tag = readTag(depth + 1); + if(tag instanceof EndTag) { + break; + } else { + tagMap.put(tag.getName(), tag); + } + } + + return new CompoundTag(name, tagMap); + default: + throw new IOException("Invalid tag type: " + type + "."); + } + } + + @Override + public void close() throws IOException { + is.close(); + } + +} diff --git a/src/com/garbagemule/MobArena/util/jnbt/NBTOutputStream.java b/src/com/garbagemule/MobArena/util/jnbt/NBTOutputStream.java new file mode 100644 index 0000000..7ddbf27 --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/NBTOutputStream.java @@ -0,0 +1,257 @@ +package com.garbagemule.MobArena.util.jnbt; + +import java.io.Closeable; +import java.io.DataOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.List; +import java.util.zip.GZIPOutputStream; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + *

This class writes NBT, or + * Named Binary Tag Tag objects to an underlying + * OutputStream.

+ * + *

The NBT format was created by Markus Persson, and the specification may + * be found at + * http://www.minecraft.net/docs/NBT.txt.

+ * @author Graham Edgecombe + * + */ +public final class NBTOutputStream implements Closeable { + + /** + * The output stream. + */ + private final DataOutputStream os; + + /** + * Creates a new NBTOutputStream, which will write data to the + * specified underlying output stream. + * @param os The output stream. + * @throws IOException if an I/O error occurs. + */ + public NBTOutputStream(OutputStream os) throws IOException { + this.os = new DataOutputStream(new GZIPOutputStream(os)); + } + + /** + * Writes a tag. + * @param tag The tag to write. + * @throws IOException if an I/O error occurs. + */ + public void writeTag(Tag tag) throws IOException { + int type = NBTUtils.getTypeCode(tag.getClass()); + String name = tag.getName(); + byte[] nameBytes = name.getBytes(NBTConstants.CHARSET); + + os.writeByte(type); + os.writeShort(nameBytes.length); + os.write(nameBytes); + + if(type == NBTConstants.TYPE_END) { + throw new IOException("Named TAG_End not permitted."); + } + + writeTagPayload(tag); + } + + /** + * Writes tag payload. + * @param tag The tag. + * @throws IOException if an I/O error occurs. + */ + private void writeTagPayload(Tag tag) throws IOException { + int type = NBTUtils.getTypeCode(tag.getClass()); + switch(type) { + case NBTConstants.TYPE_END: + writeEndTagPayload((EndTag) tag); + break; + case NBTConstants.TYPE_BYTE: + writeByteTagPayload((ByteTag) tag); + break; + case NBTConstants.TYPE_SHORT: + writeShortTagPayload((ShortTag) tag); + break; + case NBTConstants.TYPE_INT: + writeIntTagPayload((IntTag) tag); + break; + case NBTConstants.TYPE_LONG: + writeLongTagPayload((LongTag) tag); + break; + case NBTConstants.TYPE_FLOAT: + writeFloatTagPayload((FloatTag) tag); + break; + case NBTConstants.TYPE_DOUBLE: + writeDoubleTagPayload((DoubleTag) tag); + break; + case NBTConstants.TYPE_BYTE_ARRAY: + writeByteArrayTagPayload((ByteArrayTag) tag); + break; + case NBTConstants.TYPE_STRING: + writeStringTagPayload((StringTag) tag); + break; + case NBTConstants.TYPE_LIST: + writeListTagPayload((ListTag) tag); + break; + case NBTConstants.TYPE_COMPOUND: + writeCompoundTagPayload((CompoundTag) tag); + break; + default: + throw new IOException("Invalid tag type: " + type + "."); + } + } + + /** + * Writes a TAG_Byte tag. + * @param tag The tag. + * @throws IOException if an I/O error occurs. + */ + private void writeByteTagPayload(ByteTag tag) throws IOException { + os.writeByte(tag.getValue()); + } + + /** + * Writes a TAG_Byte_Array tag. + * @param tag The tag. + * @throws IOException if an I/O error occurs. + */ + private void writeByteArrayTagPayload(ByteArrayTag tag) throws IOException { + byte[] bytes = tag.getValue(); + os.writeInt(bytes.length); + os.write(bytes); + } + + /** + * Writes a TAG_Compound tag. + * @param tag The tag. + * @throws IOException if an I/O error occurs. + */ + private void writeCompoundTagPayload(CompoundTag tag) throws IOException { + for(Tag childTag : tag.getValue().values()) { + writeTag(childTag); + } + os.writeByte((byte) 0); // end tag - better way? + } + + /** + * Writes a TAG_List tag. + * @param tag The tag. + * @throws IOException if an I/O error occurs. + */ + private void writeListTagPayload(ListTag tag) throws IOException { + Class clazz = tag.getType(); + List tags = tag.getValue(); + int size = tags.size(); + + os.writeByte(NBTUtils.getTypeCode(clazz)); + os.writeInt(size); + for(int i = 0; i < size; i++) { + writeTagPayload(tags.get(i)); + } + } + + /** + * Writes a TAG_String tag. + * @param tag The tag. + * @throws IOException if an I/O error occurs. + */ + private void writeStringTagPayload(StringTag tag) throws IOException { + byte[] bytes = tag.getValue().getBytes(NBTConstants.CHARSET); + os.writeShort(bytes.length); + os.write(bytes); + } + + /** + * Writes a TAG_Double tag. + * @param tag The tag. + * @throws IOException if an I/O error occurs. + */ + private void writeDoubleTagPayload(DoubleTag tag) throws IOException { + os.writeDouble(tag.getValue()); + } + + /** + * Writes a TAG_Float tag. + * @param tag The tag. + * @throws IOException if an I/O error occurs. + */ + private void writeFloatTagPayload(FloatTag tag) throws IOException { + os.writeFloat(tag.getValue()); + } + + /** + * Writes a TAG_Long tag. + * @param tag The tag. + * @throws IOException if an I/O error occurs. + */ + private void writeLongTagPayload(LongTag tag) throws IOException { + os.writeLong(tag.getValue()); + } + + /** + * Writes a TAG_Int tag. + * @param tag The tag. + * @throws IOException if an I/O error occurs. + */ + private void writeIntTagPayload(IntTag tag) throws IOException { + os.writeInt(tag.getValue()); + } + + /** + * Writes a TAG_Short tag. + * @param tag The tag. + * @throws IOException if an I/O error occurs. + */ + private void writeShortTagPayload(ShortTag tag) throws IOException { + os.writeShort(tag.getValue()); + } + + /** + * Writes a TAG_Empty tag. + * @param tag The tag. + * @throws IOException if an I/O error occurs. + */ + private void writeEndTagPayload(EndTag tag) { + /* empty */ + } + + @Override + public void close() throws IOException { + os.close(); + } + +} diff --git a/src/com/garbagemule/MobArena/util/jnbt/NBTUtils.java b/src/com/garbagemule/MobArena/util/jnbt/NBTUtils.java new file mode 100644 index 0000000..ce97632 --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/NBTUtils.java @@ -0,0 +1,152 @@ +package com.garbagemule.MobArena.util.jnbt; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * A class which contains NBT-related utility methods. + * @author Graham Edgecombe + * + */ +public final class NBTUtils { + + /** + * Gets the type name of a tag. + * @param clazz The tag class. + * @return The type name. + */ + public static String getTypeName(Class clazz) { + if(clazz.equals(ByteArrayTag.class)) { + return "TAG_Byte_Array"; + } else if(clazz.equals(ByteTag.class)) { + return "TAG_Byte"; + } else if(clazz.equals(CompoundTag.class)) { + return "TAG_Compound"; + } else if(clazz.equals(DoubleTag.class)) { + return "TAG_Double"; + } else if(clazz.equals(EndTag.class)) { + return "TAG_End"; + } else if(clazz.equals(FloatTag.class)) { + return "TAG_Float"; + } else if(clazz.equals(IntTag.class)) { + return "TAG_Int"; + } else if(clazz.equals(ListTag.class)) { + return "TAG_List"; + } else if(clazz.equals(LongTag.class)) { + return "TAG_Long"; + } else if(clazz.equals(ShortTag.class)) { + return "TAG_Short"; + } else if(clazz.equals(StringTag.class)) { + return "TAG_String"; + } else { + throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ")."); + } + } + + /** + * Gets the type code of a tag class. + * @param clazz The tag class. + * @return The type code. + * @throws IllegalArgumentException if the tag class is invalid. + */ + public static int getTypeCode(Class clazz) { + if(clazz.equals(ByteArrayTag.class)) { + return NBTConstants.TYPE_BYTE_ARRAY; + } else if(clazz.equals(ByteTag.class)) { + return NBTConstants.TYPE_BYTE; + } else if(clazz.equals(CompoundTag.class)) { + return NBTConstants.TYPE_COMPOUND; + } else if(clazz.equals(DoubleTag.class)) { + return NBTConstants.TYPE_DOUBLE; + } else if(clazz.equals(EndTag.class)) { + return NBTConstants.TYPE_END; + } else if(clazz.equals(FloatTag.class)) { + return NBTConstants.TYPE_FLOAT; + } else if(clazz.equals(IntTag.class)) { + return NBTConstants.TYPE_INT; + } else if(clazz.equals(ListTag.class)) { + return NBTConstants.TYPE_LIST; + } else if(clazz.equals(LongTag.class)) { + return NBTConstants.TYPE_LONG; + } else if(clazz.equals(ShortTag.class)) { + return NBTConstants.TYPE_SHORT; + } else if(clazz.equals(StringTag.class)) { + return NBTConstants.TYPE_STRING; + } else { + throw new IllegalArgumentException("Invalid tag classs (" + clazz.getName() + ")."); + } + } + + /** + * Gets the class of a type of tag. + * @param type The type. + * @return The class. + * @throws IllegalArgumentException if the tag type is invalid. + */ + public static Class getTypeClass(int type) { + switch(type) { + case NBTConstants.TYPE_END: + return EndTag.class; + case NBTConstants.TYPE_BYTE: + return ByteTag.class; + case NBTConstants.TYPE_SHORT: + return ShortTag.class; + case NBTConstants.TYPE_INT: + return IntTag.class; + case NBTConstants.TYPE_LONG: + return LongTag.class; + case NBTConstants.TYPE_FLOAT: + return FloatTag.class; + case NBTConstants.TYPE_DOUBLE: + return DoubleTag.class; + case NBTConstants.TYPE_BYTE_ARRAY: + return ByteArrayTag.class; + case NBTConstants.TYPE_STRING: + return StringTag.class; + case NBTConstants.TYPE_LIST: + return ListTag.class; + case NBTConstants.TYPE_COMPOUND: + return CompoundTag.class; + default: + throw new IllegalArgumentException("Invalid tag type : " + type + "."); + } + } + + /** + * Default private constructor. + */ + private NBTUtils() { + + } + +} diff --git a/src/com/garbagemule/MobArena/util/jnbt/ShortTag.java b/src/com/garbagemule/MobArena/util/jnbt/ShortTag.java new file mode 100644 index 0000000..d94386b --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/ShortTag.java @@ -0,0 +1,73 @@ +package com.garbagemule.MobArena.util.jnbt; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * The TAG_Short tag. + * @author Graham Edgecombe + * + */ +public final class ShortTag extends Tag { + + /** + * The value. + */ + private final short value; + + /** + * Creates the tag. + * @param name The name. + * @param value The value. + */ + public ShortTag(String name, short value) { + super(name); + this.value = value; + } + + @Override + public Short getValue() { + return value; + } + + @Override + public String toString() { + String name = getName(); + String append = ""; + if(name != null && !name.equals("")) { + append = "(\"" + this.getName() + "\")"; + } + return "TAG_Short" + append + ": " + value; + } + +} diff --git a/src/com/garbagemule/MobArena/util/jnbt/StringTag.java b/src/com/garbagemule/MobArena/util/jnbt/StringTag.java new file mode 100644 index 0000000..a894c8b --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/StringTag.java @@ -0,0 +1,73 @@ +package com.garbagemule.MobArena.util.jnbt; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * The TAG_String tag. + * @author Graham Edgecombe + * + */ +public final class StringTag extends Tag { + + /** + * The value. + */ + private final String value; + + /** + * Creates the tag. + * @param name The name. + * @param value The value. + */ + public StringTag(String name, String value) { + super(name); + this.value = value; + } + + @Override + public String getValue() { + return value; + } + + @Override + public String toString() { + String name = getName(); + String append = ""; + if(name != null && !name.equals("")) { + append = "(\"" + this.getName() + "\")"; + } + return "TAG_String" + append + ": " + value; + } + +} diff --git a/src/com/garbagemule/MobArena/util/jnbt/Tag.java b/src/com/garbagemule/MobArena/util/jnbt/Tag.java new file mode 100644 index 0000000..19a5daf --- /dev/null +++ b/src/com/garbagemule/MobArena/util/jnbt/Tag.java @@ -0,0 +1,70 @@ +package com.garbagemule.MobArena.util.jnbt; + +/* + * JNBT License + * + * Copyright (c) 2010 Graham Edgecombe + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * * Neither the name of the JNBT team nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * Represents a single NBT tag. + * @author Graham Edgecombe + * + */ +public abstract class Tag { + + /** + * The name of this tag. + */ + private final String name; + + /** + * Creates the tag with the specified name. + * @param name The name. + */ + public Tag(String name) { + this.name = name; + } + + /** + * Gets the name of this tag. + * @return The name of this tag. + */ + public final String getName() { + return name; + } + + /** + * Gets the value of this tag. + * @return The value of this tag. + */ + public abstract Object getValue(); + +}