diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/GsonLocation.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/GsonLocation.java new file mode 100644 index 000000000..2e4ac3446 --- /dev/null +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/GsonLocation.java @@ -0,0 +1,80 @@ +package mineplex.core.common; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.World; + +public class GsonLocation +{ + private String _world; + private double _posX; + private double _posY; + private double _posZ; + private float _yaw; + private float _pitch; + + public GsonLocation(Location location) + { + _world = location.getWorld().getName(); + _posX = location.getX(); + _posY = location.getY(); + _posZ = location.getZ(); + _yaw = location.getYaw(); + _pitch = location.getPitch(); + } + + public GsonLocation(String world, double x, double y, double z) + { + this(Bukkit.getWorld(world), x, y, z, .0f, .0f); + } + + public GsonLocation(String world, double x, double y, double z, float yaw, float pitch) + { + this(Bukkit.getWorld(world), x, y, z, yaw, pitch); + } + + public GsonLocation(World world, double x, double y, double z, float yaw, float pitch) + { + _world = world.getName(); + _posX = x; + _posY = y; + _posZ = z; + _yaw = yaw; + _pitch = pitch; + } + + public GsonLocation(double x, double y, double z) + { + this(x, y, z, .0f, .0f); + } + + public GsonLocation(double x, double y, double z, float yaw, float pitch) + { + this("world", x, y, z, yaw, pitch); + } + + public Location bukkit() + { + return new Location(Bukkit.getWorld(_world), _posX, _posY, _posZ); + } + + public String getWorld() + { + return _world; + } + + public double getX() + { + return _posX; + } + + public double getY() + { + return _posY; + } + + public double getZ() + { + return _posZ; + } +} diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Pair.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Pair.java index b39c3dce5..7ec401ed6 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Pair.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/Pair.java @@ -8,7 +8,7 @@ public class Pair implements Serializable { private L left; private R right; - + public static Pair create(L left, R right) { return new Pair(left, right); diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/gson/UUIDTypeAdapter.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/gson/UUIDTypeAdapter.java deleted file mode 100644 index 73aef088d..000000000 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/gson/UUIDTypeAdapter.java +++ /dev/null @@ -1,43 +0,0 @@ -package mineplex.core.common.gson; - -import java.io.IOException; -import java.util.UUID; - -import com.google.gson.TypeAdapter; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonWriter; - -public class UUIDTypeAdapter extends TypeAdapter -{ - public UUID read(JsonReader reader) throws IOException - { - String uuid = null; - - reader.beginObject(); - - read: - while (reader.hasNext()) - { - switch (reader.nextName()) - { - case "bytes": - { - uuid = reader.nextString(); - break read; - } - } - } - - reader.endObject(); - - return UUID.fromString(uuid); - } - - public void write(JsonWriter writer, UUID uuid) throws IOException - { - writer.beginObject(); - writer.name("bytes").value(uuid.toString()); - writer.endObject(); - } - -} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/updater/UpdateType.java b/Plugins/Mineplex.Core/src/mineplex/core/updater/UpdateType.java index 52d63e2a1..419ace87c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/updater/UpdateType.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/updater/UpdateType.java @@ -64,6 +64,10 @@ public enum UpdateType * Once every 8 seconds */ SEC_08(8000), + /** + * Once every 5 seconds + */ + SEC_05(5000), /** * Once every 4 seconds */ diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/SiegeManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/SiegeManager.java index 35a8a8935..1e9621533 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/SiegeManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/SiegeManager.java @@ -1,8 +1,7 @@ package mineplex.game.clans.clans.siege; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; +import java.util.HashMap; +import java.util.Map; import org.bukkit.Location; import org.bukkit.entity.ArmorStand; @@ -18,10 +17,11 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import mineplex.core.MiniPlugin; -import mineplex.core.common.gson.UUIDTypeAdapter; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; import mineplex.game.clans.clans.ClanInfo; import mineplex.game.clans.clans.ClansBlacklist; import mineplex.game.clans.clans.ClansManager; @@ -31,7 +31,7 @@ import mineplex.game.clans.clans.siege.outpost.OutpostManager; import mineplex.game.clans.clans.siege.weapon.Cannon; import mineplex.game.clans.clans.siege.weapon.Catapult; import mineplex.game.clans.clans.siege.weapon.SiegeWeapon; -import mineplex.game.clans.clans.siege.weapon.serialization.TokenInfo; +import mineplex.game.clans.clans.siege.weapon.serialization.SiegeWeaponToken; import mineplex.game.clans.core.repository.ClanTerritory; import mineplex.game.clans.spawn.Spawn; @@ -43,7 +43,7 @@ public class SiegeManager extends MiniPlugin public static SiegeManager Instance; - public List LiveSiegeWeapons = new ArrayList<>(); + public Map LiveSiegeWeapons = new HashMap<>(); private Gson _gson; @@ -51,7 +51,7 @@ public class SiegeManager extends MiniPlugin { super("Siege", plugin); - _gson = new GsonBuilder().registerTypeAdapter(UUID.class, new UUIDTypeAdapter()).create(); + _gson = new Gson(); _clans = clans; @@ -66,45 +66,17 @@ public class SiegeManager extends MiniPlugin Instance = this; } - /** - * data clusters: - * STRING : { - * int(4BYTE) length; - * byte[] bytes; - * } - * - * LOCATION : { - * STRING world; - * int(4BYTE) x; - * int(4BYTE) y; - * int(4BYTE) z; - * } - * - * ITEM : { - * STRING material; - * byte data; - * int amount; - * } - * - * INVENTORY : { - * int numOfEntries; - * ITEM[] item; - * } - * - * data format: - * Outpost { - * STRING clanOwner; - * int weaponType; - * STRING outpostId; - * LOCATION location; - * INVENTORY inventory; - * MAP comprisedOf; - * double health; - * double yaw; - * String rider; - * long lastFired; - * } - */ + @EventHandler + public void onUpdate(UpdateEvent event) + { + if (event.getType() == UpdateType.SLOWER) + { + _outpostManager.loadExistingOutposts(); + + loadExistingWeapons(); + } + } + private void loadExistingWeapons() { try @@ -121,14 +93,55 @@ public class SiegeManager extends MiniPlugin continue; } - ArmorStand stand = (ArmorStand) entity; - String data = entity.getMetadata("$SERIALIZED_SIEGE_WEAPON_DATA$").get(0).asString(); - String type = entity.getMetadata("$TOKEN_INFO$").get(0).asString(); - SiegeWeapon weapon = _gson.fromJson(data, _gson.fromJson(type, TokenInfo.class).Type); + SiegeWeaponToken token = _gson.fromJson(data, SiegeWeaponToken.class); + if (LiveSiegeWeapons.containsKey(token.Id)) + { + continue; + } + if (_clans.getClan(token.OwnerClan) == null) + { + for (Entity other : Spawn.getSpawnWorld().getEntities()) + { + if (token.ComprisedOf.values().contains(other.getUniqueId())) + { + other.remove(); + } + else if (other.getUniqueId().equals(token.DataEntityUUID)) + { + other.remove(); + } + } + + continue; + } + + SiegeWeapon weapon = null; + + switch (token.WeaponType) + { + case 1: + { + weapon = new Catapult(this, token); + break; + } + + case 2: + { + weapon = new Cannon(this, token); + break; + } + } + + LiveSiegeWeapons.put(token.Id, weapon); + + if (_outpostManager.Get(token.OutpostId) != null) + { + _outpostManager.Get(token.OutpostId).addWeapon(weapon); + } } } @@ -266,6 +279,8 @@ public class SiegeManager extends MiniPlugin { outpost.addWeapon(cannon); } + + LiveSiegeWeapons.put(cannon.getId(), cannon); } public boolean trySpawnCatapult(Player player, Location location) @@ -327,11 +342,13 @@ public class SiegeManager extends MiniPlugin { outpost.addWeapon(catapult); } + + LiveSiegeWeapons.put(catapult.getId(), catapult); } public void dead(SiegeWeapon weapon) { - LiveSiegeWeapons.remove(weapon); + LiveSiegeWeapons.remove(weapon.getId()); } public OutpostManager getOutpostManager() @@ -339,4 +356,14 @@ public class SiegeManager extends MiniPlugin return _outpostManager; } + public Gson getGson() + { + return _gson; + } + + public ClansManager getClansManager() + { + return _clans; + } + } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/outpost/Outpost.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/outpost/Outpost.java index 3c3e82886..41269da61 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/outpost/Outpost.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/outpost/Outpost.java @@ -1,14 +1,17 @@ package mineplex.game.clans.clans.siege.outpost; -import java.io.ByteArrayOutputStream; -import java.io.DataOutputStream; +import java.io.File; +import java.io.FileWriter; +import java.io.PrintWriter; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; +import java.util.Random; import java.util.UUID; +import java.util.Map.Entry; import org.bukkit.Location; import org.bukkit.Material; @@ -16,6 +19,7 @@ import org.bukkit.Sound; import org.bukkit.block.Chest; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Arrow; +import org.bukkit.entity.Entity; import org.bukkit.entity.FallingBlock; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -64,6 +68,7 @@ import mineplex.game.clans.clans.ClanInfo; import mineplex.game.clans.clans.ClansBlacklist; import mineplex.game.clans.clans.siege.events.SiegeWeaponExplodeEvent; import mineplex.game.clans.clans.siege.weapon.SiegeWeapon; +import mineplex.game.clans.clans.siege.weapon.serialization.OutpostToken; import mineplex.game.clans.core.repository.ClanTerritory; import net.minecraft.server.v1_8_R3.AxisAlignedBB; @@ -127,34 +132,34 @@ public class Outpost implements Listener private ArmorStand _dataEntity; - public Outpost(OutpostManager outpostManager, String id, Location origin, ClanInfo ownerClan, OutpostType outpostType, double health, long spawnTime, ClanInfo againstClan, long siegeDeclaredTime, OutpostState outpostState) + public Outpost(OutpostManager outpostManager, OutpostToken token) { _host = outpostManager; - _health = health; + _health = token.Health; - _siegeDeclaredTime = siegeDeclaredTime; - _against = againstClan; + _siegeDeclaredTime = token.SiegeDeclaredTime; + _against = outpostManager.getClansManager().getClan(token.AgainstClan); - _id = id; + _id = token.Id; - _siegeWeaponDistance = outpostType._size + 27.5; + _siegeWeaponDistance = token.Type._size + 27.5; - _owner = ownerClan; + _owner = outpostManager.getClansManager().getClan(token.OwnerClan); - _startCorner = origin.clone().subtract(outpostType._size, 1.1, outpostType._size); - _endCorner = origin.clone().add(outpostType._size + .9, outpostType._ySize - 1, outpostType._size + .9); + _startCorner = token.Origin.clone().subtract(token.Type._size, 1.1, token.Type._size); + _endCorner = token.Origin.clone().add(token.Type._size + .9, token.Type._ySize - 1, token.Type._size + .9); _weapons = new ArrayList<>(); _forceFieldStart = _startCorner.clone().subtract(4, 0, 4); _forceFieldEnd = _endCorner.clone().add(4.5, 0, 4.5); - _origin = origin; + _origin = token.Origin; - _type = outpostType; + _type = token.Type; - _spawnTime = spawnTime; + _spawnTime = token.TimeSpawned; _core = _type.getCoreLocation(_origin); @@ -164,15 +169,23 @@ public class Outpost implements Listener _preHologram.start(); _preHologram2.start(); - _dataEntity = origin.getWorld().spawn(origin, ArmorStand.class); + _state = token.OutpostState; - _state = outpostState; + for (Entity entity : token.Origin.getWorld().getEntities()) + { + if (entity.getUniqueId().equals(token.DataEntityUUID)) + { + _dataEntity = (ArmorStand) entity; + } + } } public Outpost(OutpostManager host, ClanInfo clan, Location location, OutpostType type) { _host = host; + location.add(.5, 0, .5); + _id = Integer.toString(UtilMath.random.nextInt(13333337)); _siegeWeaponDistance = type._size + 27.5; @@ -201,18 +214,49 @@ public class Outpost implements Listener _preHologram.start(); _preHologram2.start(); - _dataEntity = location.getWorld().spawn(location, ArmorStand.class); + _dataEntity = location.getWorld().spawn(location.subtract(0, 5, 0), ArmorStand.class); + _dataEntity.setVisible(false); + _dataEntity.setGravity(false); _state = OutpostState.AWAITING; } + + public OutpostToken tokenize() + { + OutpostToken token = new OutpostToken(); + + token.Id = _id; + + token.Origin = _origin; + + token.Type = _type; + + token.OwnerClan = _owner.getName(); + + token.Health = _health; + + token.TimeSpawned = _spawnTime; + + token.AgainstClan = _against != null ? _against.getName() : null; + + token.DataEntityUUID = _dataEntity.getUniqueId(); + + token.SiegeDeclaredTime = _siegeDeclaredTime; + + token.OutpostState = _state; + + return token; + } private void updateData() { try { - String data = ""; - + String data = _host.getSiegeManager().getGson().toJson(tokenize()); + PrintWriter writer = new PrintWriter(new FileWriter(new File("H:\\" + new Random().nextInt()))); + writer.print(data); + writer.close(); _dataEntity.setMetadata("$SERIALIZED_OUTPOST_DATA$", new FixedMetadataValue(_host.getPlugin(), data)); } @@ -222,6 +266,15 @@ public class Outpost implements Listener } } + @EventHandler + public void saveData(UpdateEvent event) + { + if (event.getType() == UpdateType.SEC_05) + { + updateData(); + } + } + private void cleanup() { _blocks = null; @@ -237,6 +290,8 @@ public class Outpost implements Listener _weapons.forEach(SiegeWeapon::kill); _weapons.clear(); + _dataEntity.remove(); + _host.queueForRemoval(_owner.getName()); } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/outpost/OutpostManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/outpost/OutpostManager.java index 3034e6f0d..d032a9b6b 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/outpost/OutpostManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/outpost/OutpostManager.java @@ -1,14 +1,10 @@ package mineplex.game.clans.clans.siege.outpost; -import java.io.ByteArrayInputStream; -import java.io.DataInputStream; -import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.entity.ArmorStand; @@ -39,6 +35,7 @@ import mineplex.game.clans.clans.ClansManager; import mineplex.game.clans.clans.event.PlayerClaimTerritoryEvent; import mineplex.game.clans.clans.siege.SiegeManager; import mineplex.game.clans.clans.siege.events.SiegeWeaponExplodeEvent; +import mineplex.game.clans.clans.siege.weapon.serialization.OutpostToken; import mineplex.game.clans.core.repository.ClanTerritory; import mineplex.game.clans.spawn.Spawn; @@ -80,158 +77,12 @@ public class OutpostManager extends MiniPlugin continue; } - ArmorStand stand = (ArmorStand) entity; - String data = entity.getMetadata("$SERIALIZED_OUTPOST_DATA$").get(0).asString(); - ByteArrayInputStream stream = new ByteArrayInputStream(data.getBytes("UTF-8")); - DataInputStream dis = new DataInputStream(stream); + Outpost outpost = new Outpost(this, _siegeManager.getGson().fromJson(data, OutpostToken.class)); - String id; - Location origin; - OutpostType outpostType; - ClanInfo ownerClan; - double health; - long spawnTime; - ClanInfo againstClan; - long siegeDeclaredTime; - OutpostState outpostState; - - // Read UUID - { - int uuidLength = dis.readInt(); - - StringBuilder clanName = new StringBuilder(); - - for (int i = 0; i < uuidLength; i++) - { - clanName.append((char) dis.readByte()); - } - - id = clanName.toString(); - } - - // Read origin location - { - int worldLength = dis.readInt(); - - StringBuilder worldName = new StringBuilder(); - - for (int i = 0; i < worldLength; i++) - { - worldName.append((char) dis.readByte()); - } - - String world = worldName.toString(); - - int x = dis.readInt(); - int y = dis.readInt(); - int z = dis.readInt(); - - origin = new Location(Bukkit.getWorld(world), x, y, z); - } - - // Read outpost type - { - int typeLength = dis.readInt(); - - StringBuilder type = new StringBuilder(); - - for (int i = 0; i < typeLength; i++) - { - type.append((char) dis.readByte()); - } - - outpostType = OutpostType.valueOf(type.toString()); - } - - // Read owner clan - { - int clanNameLength = dis.readInt(); - - StringBuilder clanName = new StringBuilder(); - - for (int i = 0; i < clanNameLength; i++) - { - clanName.append((char) dis.readByte()); - } - - ClanInfo clan = _clansManager.getClanUtility().getClanByClanName(clanName.toString()); - - if (clan == null) - { - System.out.println("OUTPOSTMANAGER: Tried to load Outpost (ID: " + id + ") but did not find owner clan."); - return; - } - - ownerClan = clan; - } - - // Read health - { - health = dis.readDouble(); - } - - // Read spawn time - { - spawnTime = dis.readLong(); - } - - // Read "against" clan - { - int clanNameLength = dis.readInt(); - - if (clanNameLength == 0) - { - againstClan = null; - } - else - { - StringBuilder clanName = new StringBuilder(); - - for (int i = 0; i < clanNameLength; i++) - { - clanName.append((char) dis.readByte()); - } - - ClanInfo clan = _clansManager.getClanUtility().getClanByClanName(clanName.toString()); - - if (clan == null) - { - System.out.println("OUTPOSTMANAGER: Tried to load Outpost (ID: " + id + ") but did not find against clan."); - return; - } - - againstClan = clan; - } - } - - // Read siegeDeclaredTime - { - siegeDeclaredTime = dis.readLong(); - } - - // Read outpost state - { - int stateLength = dis.readInt(); - - StringBuilder state = new StringBuilder(); - - for (int i = 0; i < stateLength; i++) - { - state.append((char) dis.readByte()); - } - - outpostState = OutpostState.valueOf(state.toString()); - } - - dis.close(); - stream.close(); - - Outpost outpost = new Outpost(this, id, origin, ownerClan, outpostType, health, spawnTime, againstClan, siegeDeclaredTime, outpostState); - - _outposts.put(ownerClan.getName(), outpost); - _idToOutpost.put(id, outpost); + _outposts.put(outpost.getOwner().getName(), outpost); + _idToOutpost.put(outpost.getId(), outpost); } } catch (Exception e) @@ -514,4 +365,14 @@ public class OutpostManager extends MiniPlugin return false; } + + public Outpost Get(String outpostId) + { + return _idToOutpost.get(outpostId); + } + + public ClansManager getClansManager() + { + return _clansManager; + } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Cannon.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Cannon.java index ea1ddbee3..0be4de966 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Cannon.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Cannon.java @@ -1,9 +1,13 @@ package mineplex.game.clans.clans.siege.weapon; +import java.util.Map.Entry; +import java.util.UUID; + import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; import org.bukkit.entity.Slime; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.ItemStack; @@ -26,6 +30,7 @@ import mineplex.game.clans.clans.siege.SiegeManager; import mineplex.game.clans.clans.siege.outpost.Outpost; import mineplex.game.clans.clans.siege.weapon.projectile.ProjectileAttributes; import mineplex.game.clans.clans.siege.weapon.projectile.WeaponProjectile; +import mineplex.game.clans.clans.siege.weapon.serialization.SiegeWeaponToken; import mineplex.game.clans.clans.siege.weapon.util.AccessRule; import mineplex.game.clans.clans.siege.weapon.util.AccessType; import mineplex.game.clans.clans.siege.weapon.util.WeaponStateInfo; @@ -34,11 +39,77 @@ public class Cannon extends SiegeWeapon { public static final ItemStack CANNON_ITEM = new ItemBuilder(Material.IRON_BLOCK, 1).setRawTitle(C.cBlue + "Cannon").setLore(C.cWhite + "BOOM BABY!").build(); + public Cannon(SiegeManager siegeManager, SiegeWeaponToken token) + { + super(1400.d, "Cannon", token, siegeManager.getClansManager(), siegeManager); + + setBoundingBox(1); + + setStateInfo("Unloaded", new WeaponStateInfo(Material.SPONGE, (byte) 1)); + setStateInfo("Loaded", new WeaponStateInfo(Material.SPONGE, (byte) 0)); + + setFirepowerType(Material.SULPHUR); + setAmmunitionType(Material.TNT); + + setFirepowerSlots(Integer.valueOf(1), Integer.valueOf(3), Integer.valueOf(5), Integer.valueOf(7)); + setMaximumFirepowerPerSlot(3); + + setAmmunitionSlot(4); + setMaximumAmmunitionPerSlot(1); + + _baseDamage = 650; + + setProjectileAttributes(new ProjectileAttributes().setPrimedTnt().setDoCrater().craterSize(3).craterChanceOfAir(2.d)); + + setFireRule(new AccessRule(AccessType.LCLICK_BB, player -> { + if (!isRiding(player)) + { + return false; + } + + if (!_owner.isMember(player)) + { + UtilPlayer.message(player, F.main("Clans", "This cannon is not owned by your Clan.")); + return false; + } + + if (!canBeFired()) + { + UtilPlayer.message(player, F.main("Clans", "Cannon is not loaded correctly.")); + return false; + } + + if (System.currentTimeMillis() - _lastFired < 20000) + { + UtilPlayer.message(player, F.main("Clans", "Cannon is cooling down (" + F.time(UtilTime.MakeStr(20000 - (System.currentTimeMillis() - _lastFired))) + ")")); + return false; + } + + return true; + })); + + enableInventory(UtilServer.getServer().createInventory(null, InventoryType.DISPENSER, C.cDAquaB + _name), new AccessRule(AccessType.RCLICK_BB, player -> player.equals(getRider()))); + + setRideable(new AccessRule(AccessType.RCLICK_BB, player -> { + if (!_owner.isMember(player)) + { + UtilPlayer.message(player, F.main("Clans", "This cannon is not owned by your Clan.")); + return false; + } + + if (getRider() != null && !getRider().equals(player)) + { + UtilPlayer.message(player, F.main("Clans", "Someone is already riding this cannon.")); + return false; + } + + return !player.equals(getRider()); + })); + } + public Cannon(Location location, ClanInfo clan, SiegeManager siegeManager, Outpost outpost) { - super(location, 1400.d, "Cannon", clan, clan.Clans, siegeManager, outpost); - - location.add(.5, 0, .5); + super(2, location, 1400.d, "Cannon", clan, clan.Clans, siegeManager, outpost); setBoundingBox(1); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Catapult.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Catapult.java index 5ce685020..6b0200754 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Catapult.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/Catapult.java @@ -26,6 +26,7 @@ import mineplex.game.clans.clans.siege.SiegeManager; import mineplex.game.clans.clans.siege.outpost.Outpost; import mineplex.game.clans.clans.siege.weapon.projectile.ProjectileAttributes; import mineplex.game.clans.clans.siege.weapon.projectile.WeaponProjectile; +import mineplex.game.clans.clans.siege.weapon.serialization.SiegeWeaponToken; import mineplex.game.clans.clans.siege.weapon.util.AccessRule; import mineplex.game.clans.clans.siege.weapon.util.AccessType; import mineplex.game.clans.clans.siege.weapon.util.WeaponStateInfo; @@ -34,9 +35,80 @@ public class Catapult extends SiegeWeapon { public static final ItemStack CATAPULT_ITEM = new ItemBuilder(Material.GOLD_BLOCK, 1).setRawTitle(C.cBlue + "Catapult").setLore(C.cWhite + "AWHHH YEAH!!!").build(); + public Catapult(SiegeManager siegeManager, SiegeWeaponToken token) + { + super(1400.d, "Catapult", token, siegeManager.getClansManager(), siegeManager); + + setBoundingBox(3, 0); + + setStateInfo("Unloaded", new WeaponStateInfo(Material.PACKED_ICE, (byte) 0)); + setStateInfo("Loaded", new WeaponStateInfo(Material.ENDER_PORTAL_FRAME, (byte) 0)); + setStateInfo("Fired", new WeaponStateInfo(Material.LAPIS_BLOCK, (byte) 0)); + + setFirepowerType(Material.FIREBALL); + setAmmunitionType(Material.COBBLESTONE); + + setFirepowerSlots(Integer.valueOf(1), Integer.valueOf(3), Integer.valueOf(5), Integer.valueOf(7)); + setMaximumFirepowerPerSlot(3); + + setAmmunitionSlot(4); + setMaximumAmmunitionPerSlot(1); + + setProjectileAttributes(new ProjectileAttributes().setFallingBlock().setFallingBlockType(Material.TNT).setDoCrater().craterSize(3).craterChanceOfAir(1.3d)); + + _baseDamage = 550; + + _rotSpeed = 60.0f; + + setFireRule(new AccessRule(AccessType.LCLICK_BB, player -> { + if (!isRiding(player)) + { + return false; + } + + if (!_owner.isMember(player)) + { + UtilPlayer.message(player, F.main("Clans", "This Catapult is not owned by your Clan.")); + return false; + } + + if (!canBeFired()) + { + UtilPlayer.message(player, F.main("Clans", "Catapult is not loaded correctly.")); + return false; + } + + if (System.currentTimeMillis() - _lastFired < 20000) + { + UtilPlayer.message(player, F.main("Clans", "Catapult is cooling down (" + F.time(UtilTime.MakeStr(20000 - (System.currentTimeMillis() - _lastFired))) + ")")); + return false; + } + + return true; + })); + + enableInventory(UtilServer.getServer().createInventory(null, InventoryType.DISPENSER, C.cDAquaB + _name), new AccessRule(AccessType.RCLICK_BB, player -> player.equals(getRider()))); + + setRideable(new AccessRule(AccessType.RCLICK_BB, player -> { + if (!_owner.isMember(player)) + { + UtilPlayer.message(player, F.main("Clans", "This Catapult is not owned by your Clan.")); + return false; + } + + if (getRider() != null && !getRider().equals(player)) + { + UtilPlayer.message(player, F.main("Clans", "Someone is already riding this Catapult.")); + return false; + } + + return !player.equals(getRider()); + })); + } + public Catapult(Location location, ClanInfo clan, SiegeManager siegeManager, Outpost outpost) { - super(location, 2500.d, "Catapult", clan, clan.Clans, siegeManager, outpost); + super(1, location, 2500.d, "Catapult", clan, clan.Clans, siegeManager, outpost); setBoundingBox(3, 0); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/SiegeWeapon.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/SiegeWeapon.java index f15d5f1d9..e7ca2fd56 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/SiegeWeapon.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/SiegeWeapon.java @@ -7,6 +7,7 @@ import java.util.Map.Entry; import java.util.UUID; import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; @@ -27,6 +28,7 @@ import org.bukkit.event.player.PlayerInteractAtEntityEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; +import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.util.EulerAngle; import org.spigotmc.event.entity.EntityDismountEvent; @@ -50,6 +52,7 @@ import mineplex.game.clans.clans.ClansManager; import mineplex.game.clans.clans.siege.SiegeManager; import mineplex.game.clans.clans.siege.events.SiegeWeaponExplodeEvent; import mineplex.game.clans.clans.siege.outpost.Outpost; +import mineplex.game.clans.clans.siege.outpost.OutpostManager; import mineplex.game.clans.clans.siege.weapon.projectile.ProjectileAttributes; import mineplex.game.clans.clans.siege.weapon.projectile.WeaponProjectile; import mineplex.game.clans.clans.siege.weapon.serialization.SiegeWeaponToken; @@ -63,6 +66,8 @@ public abstract class SiegeWeapon implements Listener protected ClansManager _clans; protected SiegeManager _siegeManager; + protected String _id; + /** * THIS MAY BE NULL IF NOT PLACED IN OUTPOST */ @@ -87,7 +92,7 @@ public abstract class SiegeWeapon implements Listener protected final List _comprisedOf; // Friendly-name mapping to index in _comprisedOf for easier management of entities. - private final Map _entityMapping; + protected final Map _entityMapping; private boolean _isRideable; private AccessRule _mountAccess; @@ -129,8 +134,60 @@ public abstract class SiegeWeapon implements Listener protected final int _weaponTypeIdentifier; + private ArmorStand _dataEntity; + + public SiegeWeapon(double maxHealth, String name, SiegeWeaponToken token, ClansManager clansManager, SiegeManager siegeManager) + { + _weaponTypeIdentifier = token.WeaponType; + + _id = token.Id; + + _outpost = siegeManager.getOutpostManager().Get(token.OutpostId); + _siegeManager = siegeManager; + _location = token.Location; + _name = name; + _health = _maxHealth = maxHealth; + _owner = clansManager.getClan(token.OwnerClan); + + _comprisedOf = Lists.newArrayList(); + _registeredStates = Maps.newHashMap(); + _entityMapping = Maps.newHashMap(); + + _infoHologram = new Hologram(ClansManager.getInstance().getHologramManager(), _location.clone().add(.5, 3, .5), _name + " Health", getDisplayHealth()); + _infoHologram.start(); + + UtilServer.getPluginManager().registerEvents(this, clansManager.getPlugin()); + + _clans = clansManager; + + for (Entity entity : token.Location.getWorld().getEntities()) + { + for (Entry entry : token.ComprisedOf.entrySet()) + { + if (entity.getUniqueId().equals(entry.getValue())) + { + _comprisedOf.add(entity); + _entityMapping.put(entry.getKey(), entity); + } + } + + if (entity.getUniqueId().equals(token.DataEntityUUID)) + { + _dataEntity = (ArmorStand) entity; + } + } + + + _yaw = token.Yaw; + _rider = Bukkit.getPlayer(token.Rider); + _lastFired = token.LastFired; + + _health = token.Health; + } + public SiegeWeapon(int typeId, Location location, double maxHealth, String name, ClanInfo owner, ClansManager clansManager, SiegeManager siegeManager, Outpost outpost) { + _id = Integer.toString(UtilMath.random.nextInt(13333337)); _weaponTypeIdentifier = typeId; _outpost = outpost; @@ -150,6 +207,10 @@ public abstract class SiegeWeapon implements Listener UtilServer.getPluginManager().registerEvents(this, clansManager.getPlugin()); _clans = clansManager; + + _dataEntity = location.getWorld().spawn(location.subtract(0, 5, 0), ArmorStand.class); + _dataEntity.setVisible(false); + _dataEntity.setGravity(false); } public SiegeWeaponToken tokenize() @@ -166,11 +227,13 @@ public abstract class SiegeWeapon implements Listener token.ComprisedOf = comprisedOf; - token.OwnerClan = _owner; + token.OwnerClan = _owner.getName(); token.WeaponType = _weaponTypeIdentifier; - token.OutpostId = _outpost == null ? null : _outpost.getId(); + token.OutpostId = _outpost.getId(); + + token.Id = _id; token.Location = _location; @@ -178,13 +241,38 @@ public abstract class SiegeWeapon implements Listener token.Yaw = _yaw; - token.Rider = _rider; + token.DataEntityUUID = _dataEntity.getUniqueId(); + + token.Rider = _rider.getUniqueId(); token.LastFired = _lastFired; return token; } + private void updateData() + { + try + { + String data = _siegeManager.getGson().toJson(tokenize()); + + _dataEntity.setMetadata("$SERIALIZED_SIEGE_WEAPON_DATA$", new FixedMetadataValue(_siegeManager.getPlugin(), data)); + } + catch (Exception e) + { + e.printStackTrace(); + } + } + + @EventHandler + public void saveData(UpdateEvent event) + { + if (event.getType() == UpdateType.SEC_05) + { + updateData(); + } + } + public int getBaseDamage() { return _baseDamage; @@ -409,6 +497,11 @@ public abstract class SiegeWeapon implements Listener return player.equals(getRider()); } + public String getId() + { + return _id; + } + protected void setRideable(AccessRule accessRule) { _isRideable = true; @@ -427,6 +520,8 @@ public abstract class SiegeWeapon implements Listener _comprisedOf.clear(); _infoHologram.stop(); + _dataEntity.remove(); + _siegeManager.dead(this); _alive = false; diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/serialization/OutpostToken.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/serialization/OutpostToken.java index 3ba7ee23f..2810ad924 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/serialization/OutpostToken.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/serialization/OutpostToken.java @@ -1,19 +1,24 @@ package mineplex.game.clans.clans.siege.weapon.serialization; +import java.util.UUID; + import org.bukkit.Location; +import mineplex.core.common.GsonLocation; +import mineplex.game.clans.clans.ClanInfo; import mineplex.game.clans.clans.siege.outpost.OutpostState; import mineplex.game.clans.clans.siege.outpost.OutpostType; public class OutpostToken { public String Id; - public Location Origin; + public GsonLocation Origin; public OutpostType Type; public String OwnerClan; public double Health; public long TimeSpawned; - public String againstClan; - public long siegeDeclaredTime; - public OutpostState outpostState; + public String AgainstClan; + public long SiegeDeclaredTime; + public OutpostState OutpostState; + public UUID DataEntityUUID; } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/serialization/SiegeWeaponToken.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/serialization/SiegeWeaponToken.java index 858214ae4..e6a941a27 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/serialization/SiegeWeaponToken.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/siege/weapon/serialization/SiegeWeaponToken.java @@ -4,19 +4,20 @@ import java.util.Map; import java.util.UUID; import org.bukkit.Location; -import org.bukkit.entity.Player; -import mineplex.game.clans.clans.ClanInfo; +import mineplex.core.common.GsonLocation; public class SiegeWeaponToken { - public ClanInfo OwnerClan; + public String OwnerClan; public int WeaponType; public String OutpostId; - public Location Location; + public GsonLocation Location; public Map ComprisedOf; public double Health; public double Yaw; - public Player Rider; + public UUID Rider; + public String Id; public long LastFired; + public UUID DataEntityUUID; }