PUSHING CODE BECAUSE MY HDD MIGHT BE BREAKING DOWN. THIS CODE IS UNTESTED PROBABLY DOESN'T WORK
This commit is contained in:
parent
90570c1185
commit
e6eb43ada8
@ -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;
|
||||
}
|
||||
}
|
@ -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<UUID>
|
||||
{
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
@ -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
|
||||
*/
|
||||
|
@ -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<SiegeWeapon> LiveSiegeWeapons = new ArrayList<>();
|
||||
public Map<String, SiegeWeapon> 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<String, UUID> 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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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<Entity> _comprisedOf;
|
||||
|
||||
// Friendly-name mapping to index in _comprisedOf for easier management of entities.
|
||||
private final Map<String, Entity> _entityMapping;
|
||||
protected final Map<String, Entity> _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<String, UUID> 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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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<String, UUID> ComprisedOf;
|
||||
public double Health;
|
||||
public double Yaw;
|
||||
public Player Rider;
|
||||
public UUID Rider;
|
||||
public String Id;
|
||||
public long LastFired;
|
||||
public UUID DataEntityUUID;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user