Serious tweaks to gameplay and begin documentation

This commit is contained in:
AlexTheCoder 2016-07-25 10:59:03 -04:00
parent 0ecdce4edc
commit 6f0d21120e
33 changed files with 636 additions and 555 deletions

View File

@ -1,3 +1,3 @@
name: Clans
main: mineplex.game.clans.Clans
version: 0.1
version: 1.0

View File

@ -63,7 +63,7 @@ import net.minecraft.server.v1_8_R3.MinecraftServer;
public class Clans extends JavaPlugin
{
public static final String VERSION = "Beta 1.0";
public static final String MAP = "Map 1";
private String WEB_CONFIG = "webServer";
// Modules
@ -201,8 +201,8 @@ public class Clans extends JavaPlugin
getServer().getPluginManager().callEvent(new ServerShutdownEvent(this));
}
public static String version()
public static String getMap()
{
return VERSION;
return MAP;
}
}

View File

@ -1,27 +0,0 @@
package mineplex.game.clans.clans;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerJoinEvent;
import mineplex.core.MiniPlugin;
import mineplex.core.common.util.C;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.task.TaskManager;
import mineplex.game.clans.Clans;
public class ClansBetaManager extends MiniPlugin
{
public ClansBetaManager(ClansManager manager, TaskManager taskManager)
{
super("Clans Beta", manager.getPlugin());
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerJoin(final PlayerJoinEvent event)
{
UtilPlayer.message(event.getPlayer(), C.cDAquaB + "Welcome to Mineplex Clans " + Clans.VERSION);
}
}

View File

@ -230,12 +230,6 @@ public class ClansGame extends MiniPlugin
return;
}
if (_clans.getWarManager().allowFromInvade(event.getBlock().getLocation(), event.getPlayer()))
{
// Allow because of invasion
return;
}
// Disallow
event.setCancelled(true);
@ -287,12 +281,6 @@ public class ClansGame extends MiniPlugin
Location loc = event.getClickedBlock().getRelative(event.getBlockFace()).getLocation();
if (UtilBlock.usable(event.getClickedBlock())) loc = event.getClickedBlock().getLocation();
if (_clans.getWarManager().allowFromInvade(loc, event.getPlayer()))
{
// Allow because of invasion
return;
}
// Borderlands
if (player.getGameMode() != GameMode.CREATIVE && player.getItemInHand() != null && _clans.getClanBlocks().denyUsePlace(player.getItemInHand().getTypeId()) && _clans.getClanUtility().isBorderlands(event.getClickedBlock().getLocation()))
{
@ -565,12 +553,6 @@ public class ClansGame extends MiniPlugin
ClanInfo clan = _clans.getClanUtility().getOwner(event.getEntity().getLocation());
if (clan == null) return;
if (_clans.getWarManager().isBeingInvaded(clan))
{
// Allow because of invasion
return;
}
if (!clan.isProtected())
event.setCancelled(true);
else

View File

@ -325,8 +325,6 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
new ClanEnergyTracker(plugin, this);
// new StuckManager(this);
new ClansBetaManager(this, _taskManager);
new PotatoManager(plugin, this);
new Weapon(plugin, energy);
@ -451,8 +449,7 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
for (Location location : welcomeHolograms)
{
Hologram hologram = new Hologram(hologramManager, location,
C.cGreenB + "Welcome to Clans Beta",
C.cWhite + "Please be aware there may be bugs",
C.cGreenB + "Welcome to Clans!",
C.cWhite + "Type " + C.cYellow + "/clan" + C.cWhite + " to get started!"
);
hologram.start();
@ -663,6 +660,7 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
public void Join(PlayerJoinEvent event)
{
event.setJoinMessage(null);
UtilPlayer.message(event.getPlayer(), C.cDAquaB + "Welcome to Mineplex Clans!");
if (_incognitoManager.Get(event.getPlayer()).Status)
{
@ -801,7 +799,7 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
continue;
}
UtilPlayer.message(event.getPlayer(), F.main("Clans", "Server is on version: " + F.elem(Clans.version())));
UtilPlayer.message(event.getPlayer(), F.main("Clans", "Server is running Mineplex Clans version " + _plugin.getDescription().getVersion() + "!"));
event.setCancelled(true);
}
}
@ -1221,8 +1219,8 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
if (online >= UtilServer.getServer().getMaxPlayers() && !rank.has(Rank.ADMIN) && !event.getPlayer().isWhitelisted() && !event.getPlayer().isOp())
{
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Clans Beta is full! Try again soon");
event.setKickMessage("Clans Beta is full! Try again soon");
event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "This Clans server is full! Try again soon");
event.setKickMessage("This Clans server is full! Try again soon");
}
else
{
@ -1245,7 +1243,7 @@ public class ClansManager extends MiniClientPlugin<ClientClan>implements IRelati
{
if (event.getMessage().toLowerCase().equals("/lobby") || event.getMessage().toLowerCase().equals("/hub") || event.getMessage().toLowerCase().equals("/leave"))
{
Portal.getInstance().sendPlayerToServer(event.getPlayer(), "Lobby");
Portal.getInstance().sendPlayerToServer(event.getPlayer(), "ClansHub");
event.setCancelled(true);
}
}

View File

@ -4,14 +4,18 @@ import java.util.HashMap;
import mineplex.core.MiniPlugin;
import mineplex.core.common.Rank;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilTime.TimeUnit;
import mineplex.core.recharge.Recharge;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.clans.ClanInfo;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.banners.command.BannerCommand;
import mineplex.game.clans.core.repository.ClanTerritory;
import org.bukkit.Bukkit;
import org.bukkit.Material;
@ -91,11 +95,21 @@ public class BannerManager extends MiniPlugin
public void placeBanner(Player placing, ClanBanner banner)
{
if (!Recharge.Instance.use(placing, "Place Banner", 30000, true, false))
{
return;
}
Block block = placing.getLocation().getBlock();
BlockPlaceEvent event = new BlockPlaceEvent(block, block.getState(), block, placing.getItemInHand(), placing, false);
BlockPlaceEvent event = new BlockPlaceEvent(block, block.getState(), block, placing.getItemInHand(), placing, true);
Bukkit.getPluginManager().callEvent(event);
if (!event.isCancelled())
{
ClanTerritory claim = ClansManager.getInstance().getClanUtility().getClaim(block.getLocation());
if (claim != null && !claim.Owner.equals(banner.getClan().getName()))
{
UtilPlayer.message(placing, F.main("Clans", "You cannot place your Clan Banner there."));
return;
}
ClansManager.getInstance().getBlockRestore().restore(block);
if (block.getType() == Material.AIR && UtilBlock.fullSolid(block.getRelative(BlockFace.DOWN)))
{
@ -106,6 +120,11 @@ public class BannerManager extends MiniPlugin
state.update();
_placedBanners.put(block, System.currentTimeMillis());
}
else
{
UtilPlayer.message(placing, F.main("Clans", "You cannot place your Clan Banner there."));
return;
}
}
}

View File

@ -349,6 +349,12 @@ public class ClansCommand extends CommandBase<ClansManager>
return;
}
if (Plugin.getTutorial().inTutorial(caller))
{
UtilPlayer.message(caller, F.main("Clans", "You cannot invite others while in a tutorial."));
return;
}
if (args.length < 2)
{
UtilPlayer.message(caller, F.main("Clans", "You did not input an invitee."));

View File

@ -1,7 +1,6 @@
package mineplex.game.clans.clans.nether;
import java.io.File;
import java.io.IOException;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
@ -40,8 +39,6 @@ import org.bukkit.World;
import org.bukkit.WorldBorder;
import org.bukkit.WorldCreator;
import org.bukkit.block.Block;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -55,6 +52,8 @@ import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerPortalEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import com.google.common.collect.Lists;
@ -64,12 +63,11 @@ public class NetherManager extends MiniPlugin
private static final String CLAIM_WAND_NAME = C.cRedB + "Portal Claim Wand";
private static final String[] CLAIM_WAND_LORE = new String[] {C.cYellow + "Left Click to select the Portal's first corner", C.cYellow + "Right Click to select the Portal's second corner"};
private static final ItemStack CLAIM_WAND = new ItemBuilder(Material.WOOD_AXE).setTitle(CLAIM_WAND_NAME).setLore(CLAIM_WAND_LORE).build();
private PortalRepository _repo;
private NetherMinibossManager _miniboss;
private World _netherWorld;
public List<NetherPortal> Portals = Lists.newArrayList();
private List<NetherPortal> _portals = Lists.newArrayList();
private List<NetherPortal> _returnPortals = Lists.newArrayList();
private File _portalCfg;
private YamlConfiguration _portalConfig;
public HashMap<Player, Long> InNether = new HashMap<>();
public HashMap<Player, Location> OverworldOrigins = new HashMap<>();
public HashMap<Player, ClaimData> Claiming = new HashMap<>();
@ -78,21 +76,6 @@ public class NetherManager extends MiniPlugin
{
super("Nether", manager.getPlugin());
_portalCfg = new File(UtilServer.getServer().getWorlds().get(0).getWorldFolder().getPath() + File.separator + ".." + File.separator + "portals.yml");
try
{
if (!_portalCfg.exists())
{
_portalCfg.createNewFile();
}
_portalConfig = YamlConfiguration.loadConfiguration(_portalCfg);
}
catch (Exception e)
{
e.printStackTrace();
}
begin();
_miniboss = new NetherMinibossManager(this);
addCommand(new PortalCommand(this));
@ -108,59 +91,24 @@ public class NetherManager extends MiniPlugin
Bukkit.createWorld(creator);
}
_netherWorld = Bukkit.getWorld("nether");
_netherWorld.setSpawnLocation(43, 135, 113);
WorldBorder worldBorder = _netherWorld.getWorldBorder();
worldBorder.setCenter(0, 0);
worldBorder.setSize(200 * 2);
worldBorder.setSize(800 * 2);
_repo = new PortalRepository(getPlugin(), this);
loadPortals();
}
private void loadPortals()
{
try
{
if (!_portalConfig.isInt("PortalCount"))
{
_portalConfig.set("PortalCount", 0);
_portalConfig.save(_portalCfg);
}
log("Loading " + _portalConfig.getInt("PortalCount") + " Nether Portals!");
ConfigurationSection portalSection = _portalConfig.getConfigurationSection("Portals");
for (String portalSectionPath : portalSection.getKeys(false))
{
ConfigurationSection portal = portalSection.getConfigurationSection(portalSectionPath);
Location firstCorner = UtilWorld.strToLoc(portal.getString("CornerOne"));
Location secondCorner = UtilWorld.strToLoc(portal.getString("CornerTwo"));
boolean returnPortal = portal.getBoolean("ReturnPortal");
NetherPortal netherPortal = new NetherPortal(firstCorner, secondCorner, returnPortal);
Portals.add(netherPortal);
if (returnPortal)
{
_returnPortals.add(netherPortal);
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
_repo.loadPortals();
}
@Override
public void disable()
{
closePortals();
try
{
savePortals();
}
catch (IOException e)
{
e.printStackTrace();
}
for (Player player : InNether.keySet())
{
player.teleport(Spawn.getNorthSpawn());
@ -188,14 +136,55 @@ public class NetherManager extends MiniPlugin
return OverworldOrigins.getOrDefault(player, Spawn.getNorthSpawn());
}
public NetherPortal getPortal(int id)
{
for (NetherPortal portal : _portals)
{
if (portal.getId() == id)
{
return portal;
}
}
return null;
}
public void addPortal(NetherPortal portal)
{
_portals.add(portal);
if (portal.isReturnPortal())
{
_returnPortals.add(portal);
}
_portals.sort(new Comparator<NetherPortal>()
{
public int compare(NetherPortal o1, NetherPortal o2)
{
if (o1.getId() > o2.getId())
{
return 1;
}
return -1;
}
});
}
public void deletePortal(NetherPortal portal)
{
portal.close();
_portals.remove(portal);
_returnPortals.remove(portal);
_repo.deletePortal(portal.getId());
}
public void spawnPortal(long duration)
{
if (Portals.isEmpty() || _returnPortals.isEmpty())
if (_portals.isEmpty() || _returnPortals.isEmpty())
{
return;
}
List<NetherPortal> available = Lists.newArrayList();
available.addAll(Portals);
available.addAll(_portals);
for (NetherPortal remove : _returnPortals)
{
available.remove(remove);
@ -228,28 +217,13 @@ public class NetherManager extends MiniPlugin
}
ClaimData data = Claiming.remove(creator);
NetherPortal portal = new NetherPortal(data.getFirstCorner().getLocation(), data.getSecondCorner().getLocation(), returnPortal);
Portals.add(portal);
if (returnPortal)
{
_returnPortals.add(portal);
}
try
{
savePortals();
_repo.addPortal(UtilWorld.locToStr(data.getFirstCorner().getLocation()), UtilWorld.locToStr(data.getSecondCorner().getLocation()), returnPortal);
UtilPlayer.message(creator, F.main(getName(), "Portal successfully created!"));
}
catch (Exception e)
{
UtilPlayer.message(creator, F.main(getName(), "An error occurred while creating that portal! Please report this immediately!"));
return;
}
}
public void closePortals()
{
for (NetherPortal portal : Portals)
for (NetherPortal portal : _portals)
{
portal.close();
}
@ -258,12 +232,9 @@ public class NetherManager extends MiniPlugin
public void showPortalList(Player player)
{
UtilPlayer.message(player, F.main(getName(), "Portal List:"));
for (int i = 0; i < Portals.size(); i++)
for (NetherPortal portal : _portals)
{
int id = i + 1;
NetherPortal portal = Portals.get(i);
UtilPlayer.message(player, C.cBlue + "- " + F.elem("Portal " + id + ": " + C.cGray + UtilWorld.locToStrClean(portal.getLocation()).replace("(", "").replace(")", "")));
UtilPlayer.message(player, C.cBlue + "- " + F.elem("Portal " + portal.getId() + ": " + C.cGray + UtilWorld.locToStrClean(portal.getLocation()).replace("(", "").replace(")", "")));
}
}
@ -273,22 +244,6 @@ public class NetherManager extends MiniPlugin
UtilPlayer.message(player, F.main(getName(), "You have been given a Portal Claim Wand!"));
}
public void savePortals() throws IOException
{
_portalConfig.set("PortalCount", Portals.size());
_portalConfig.set("Portals", null);
_portalConfig.createSection("Portals");
for (int i = 0; i < Portals.size(); i++)
{
Integer id = i + 1;
_portalConfig.set("Portals." + id.toString() + ".CornerOne", UtilWorld.locToStr(Portals.get(i).getCorners()[0]));
_portalConfig.set("Portals." + id.toString() + ".CornerTwo", UtilWorld.locToStr(Portals.get(i).getCorners()[1]));
_portalConfig.set("Portals." + id.toString() + ".ReturnPortal", Portals.get(i).isReturnPortal());
}
_portalConfig.save(_portalCfg);
}
@EventHandler
public void breakBlock(BlockBreakEvent event)
{
@ -342,6 +297,7 @@ public class NetherManager extends MiniPlugin
InNether.remove(event.getPlayer());
event.getPlayer().teleport(getReturnLocation(event.getPlayer()));
OverworldOrigins.remove(event.getPlayer());
event.getPlayer().removePotionEffect(PotionEffectType.NIGHT_VISION);
UtilPlayer.message(event.getPlayer(), F.main(getName(), "You have escaped " + F.clansNether("The Nether") + "!"));
}, 1);
}
@ -368,9 +324,18 @@ public class NetherManager extends MiniPlugin
{
player.teleport(getReturnLocation(player));
OverworldOrigins.remove(player);
player.removePotionEffect(PotionEffectType.NIGHT_VISION);
UtilPlayer.message(player, F.main(getName(), "You have been forced to escape " + F.clansNether("The Nether") + " to survive its demonic poisons!"));
}
}
else
{
if (!player.hasPotionEffect(PotionEffectType.NIGHT_VISION))
{
int ticks = (int)((InNether.get(player) - System.currentTimeMillis()) / 1000) * 20;
player.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION, ticks, 0));
}
}
}
UtilServer.getPlayersCollection()
@ -391,12 +356,13 @@ public class NetherManager extends MiniPlugin
InNether.remove(event.getPlayer());
event.getPlayer().teleport(getReturnLocation(event.getPlayer()));
OverworldOrigins.remove(event.getPlayer());
event.getPlayer().removePotionEffect(PotionEffectType.NIGHT_VISION);
}
Claiming.remove(event.getPlayer());
}
@EventHandler(priority = EventPriority.LOWEST)
public void onQuit(PlayerDeathEvent event)
public void onDie(PlayerDeathEvent event)
{
InNether.remove(event.getEntity());
OverworldOrigins.remove(event.getEntity());

View File

@ -23,12 +23,15 @@ import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.entity.EntityPortalEnterEvent;
import org.bukkit.event.entity.EntityPortalEvent;
import org.bukkit.event.player.PlayerPortalEvent;
import org.bukkit.event.world.ChunkUnloadEvent;
import org.bukkit.potion.PotionEffectType;
import com.google.common.collect.Lists;
public class NetherPortal implements Listener
{
private static final int SECONDS_UNTIL_PORTAL = 5;
private int _id;
private List<Block> _frame = Lists.newArrayList();
private List<Block> _portal = Lists.newArrayList();
private Location _loc;
@ -39,8 +42,9 @@ public class NetherPortal implements Listener
public boolean Open = false;
public long Expire = -1;
public NetherPortal(Location firstCorner, Location secondCorner, boolean returnPortal)
public NetherPortal(int id, Location firstCorner, Location secondCorner, boolean returnPortal)
{
_id = id;
int maxX = Math.max(firstCorner.getBlockX(), secondCorner.getBlockX());
int minX = Math.min(firstCorner.getBlockX(), secondCorner.getBlockX());
int maxY = Math.max(firstCorner.getBlockY(), secondCorner.getBlockY());
@ -99,6 +103,11 @@ public class NetherPortal implements Listener
return _frame.contains(block) || _portal.contains(block);
}
public int getId()
{
return _id;
}
public Location getLocation()
{
return _loc;
@ -148,7 +157,6 @@ public class NetherPortal implements Listener
{
Open = false;
Expire = -1;
HandlerList.unregisterAll(this);
for (Block block : _portal)
{
block.setType(Material.AIR);
@ -157,6 +165,7 @@ public class NetherPortal implements Listener
{
block.setType(Material.AIR);
}
HandlerList.unregisterAll(this);
}
@EventHandler(priority = EventPriority.HIGHEST)
@ -204,6 +213,7 @@ public class NetherPortal implements Listener
ClansManager.getInstance().getNetherManager().InNether.remove((Player)event.getEntity());
event.getEntity().teleport(ClansManager.getInstance().getNetherManager().getReturnLocation((Player)event.getEntity()));
ClansManager.getInstance().getNetherManager().OverworldOrigins.remove((Player)event.getEntity());
((Player)event.getEntity()).removePotionEffect(PotionEffectType.NIGHT_VISION);
UtilPlayer.message(event.getEntity(), F.main(ClansManager.getInstance().getNetherManager().getName(), "You have escaped " + F.clansNether("The Nether") + "!"));
}
else
@ -241,4 +251,13 @@ public class NetherPortal implements Listener
close();
}
}
@EventHandler
public void onUnload(ChunkUnloadEvent event)
{
if (event.getChunk().getX() == _loc.getChunk().getX() && event.getChunk().getZ() == _loc.getChunk().getZ())
{
event.setCancelled(true);
}
}
}

View File

@ -0,0 +1,93 @@
package mineplex.game.clans.clans.nether;
import mineplex.core.common.util.UtilWorld;
import mineplex.core.database.MinecraftRepository;
import mineplex.serverdata.database.DBPool;
import mineplex.serverdata.database.column.ColumnBoolean;
import mineplex.serverdata.database.column.ColumnInt;
import mineplex.serverdata.database.column.ColumnVarChar;
import org.bukkit.plugin.java.JavaPlugin;
public class PortalRepository extends MinecraftRepository
{
private static final String CREATE = "CREATE TABLE IF NOT EXISTS clansNetherPortals (id INT NOT NULL AUTO_INCREMENT,"
+ "cornerOne VARCHAR(30),"
+ "cornerTwo VARCHAR(30),"
+ "returnPortal BOOL,"
+ "PRIMARY KEY (id));";
private static final String GET_PORTALS = "SELECT * FROM clansNetherPortals;";
private static final String INSERT_PORTAL = "INSERT INTO clansNetherPortals (cornerOne, cornerTwo, returnPortal) VALUES (?, ?, ?);";
private static final String DELETE_PORTAL = "DELETE FROM clansNetherPortals WHERE id=?;";
private NetherManager _nether;
public PortalRepository(JavaPlugin plugin, NetherManager portalManager)
{
super(plugin, DBPool.getAccount());
_nether = portalManager;
}
public void loadPortals()
{
_nether.runAsync(() ->
{
executeQuery(GET_PORTALS, resultSet ->
{
while (resultSet.next())
{
final int id = resultSet.getInt("id");
final String cornerOne = resultSet.getString("cornerOne");
final String cornerTwo = resultSet.getString("cornerTwo");
final boolean returnPortal = resultSet.getBoolean("returnPortal");
_nether.runSync(() ->
{
NetherPortal portal = new NetherPortal(id, UtilWorld.strToLoc(cornerOne), UtilWorld.strToLoc(cornerTwo), returnPortal);
_nether.addPortal(portal);
});
}
});
});
}
public void addPortal(final String cornerOne, final String cornerTwo, final boolean returnPortal)
{
_nether.runAsync(() ->
{
executeInsert(INSERT_PORTAL, resultSet ->
{
while (resultSet.next())
{
final int id = resultSet.getInt(1);
_nether.runSync(() ->
{
NetherPortal portal = new NetherPortal(id, UtilWorld.strToLoc(cornerOne), UtilWorld.strToLoc(cornerTwo), returnPortal);
_nether.addPortal(portal);
});
}
}, new ColumnVarChar("cornerOne", 30, cornerOne), new ColumnVarChar("cornerTwo", 30, cornerTwo), new ColumnBoolean("returnPortal", returnPortal));
});
}
public void deletePortal(final int id)
{
_nether.runAsync(() ->
{
executeUpdate(DELETE_PORTAL, new ColumnInt("id", id));
});
}
@Override
protected void initialize()
{
executeUpdate(CREATE);
}
@Override
protected void update()
{
}
}

View File

@ -5,6 +5,7 @@ import mineplex.core.common.Rank;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
import mineplex.game.clans.clans.nether.NetherManager;
import mineplex.game.clans.clans.nether.NetherPortal;
import org.bukkit.entity.Player;
@ -27,21 +28,13 @@ public class DeleteCommand extends CommandBase<NetherManager>
id = Integer.parseInt(args[0]);
}
catch (Exception e) {}
if (id == null || id > Plugin.Portals.size() || id < 1)
if (id == null || Plugin.getPortal(id) == null)
{
UtilPlayer.message(caller, F.main(Plugin.getName(), "Usage: " + F.elem("/portal " + _aliasUsed + " <ID>")));
return;
}
NetherPortal portal = Plugin.getPortal(id);
UtilPlayer.message(caller, F.main(Plugin.getName(), "Deleting the " + F.clansNether("Nether Portal") + " with ID " + id + "!"));
Plugin.Portals.remove(id - 1);
try
{
Plugin.savePortals();
}
catch (Exception e)
{
UtilPlayer.message(caller, F.main(Plugin.getName(), "An error occurred while deleting that portal! Please report this immediately!"));
return;
}
Plugin.deletePortal(portal);
}
}

View File

@ -4,12 +4,15 @@ import mineplex.core.command.CommandBase;
import mineplex.core.common.Rank;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilTime.TimeUnit;
import mineplex.game.clans.clans.ClanTips.TipType;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.nether.NetherManager;
import mineplex.game.clans.spawn.Spawn;
import org.bukkit.entity.Player;
import org.bukkit.potion.PotionEffectType;
/**
* Command to artificially portal
@ -38,6 +41,7 @@ public class ForceTeleportCommand extends CommandBase<NetherManager>
Plugin.InNether.remove(caller);
caller.teleport(Plugin.getReturnLocation(caller));
Plugin.OverworldOrigins.remove(caller);
caller.removePotionEffect(PotionEffectType.NIGHT_VISION);
UtilPlayer.message(caller, F.main(ClansManager.getInstance().getNetherManager().getName(), "You have escaped " + F.clansNether("The Nether") + "!"));
}
else
@ -49,7 +53,7 @@ public class ForceTeleportCommand extends CommandBase<NetherManager>
{
if (natural)
{
Plugin.InNether.put(caller, System.currentTimeMillis());
Plugin.InNether.put(caller, System.currentTimeMillis() + UtilTime.convert(10, TimeUnit.MINUTES, TimeUnit.MILLISECONDS));
Plugin.OverworldOrigins.put(caller, caller.getLocation());
caller.teleport(Plugin.getNetherWorld().getSpawnLocation());
ClansManager.getInstance().ClanTips.displayTip(TipType.ENTER_NETHER, caller);

View File

@ -44,8 +44,8 @@ public class MinibossFireball implements Listener
{
double range = hitMap.get(cur);
ClansManager.getInstance().getCondition().Factory().Ignite("Fireball", cur, ((LivingEntity)proj.getMetadata("MINIBOSS_FIREBALL").get(0)), 7 * range, false, false);
ClansManager.getInstance().getCondition().Factory().Falling("Fireball", cur, ((LivingEntity)proj.getMetadata("MINIBOSS_FIREBALL").get(0)), 10, false, true);
ClansManager.getInstance().getCondition().Factory().Ignite("Fireball", cur, ((LivingEntity)proj.getMetadata("MINIBOSS_FIREBALL").get(0).value()), 7 * range, false, false);
ClansManager.getInstance().getCondition().Factory().Falling("Fireball", cur, ((LivingEntity)proj.getMetadata("MINIBOSS_FIREBALL").get(0).value()), 10, false, true);
UtilAction.velocity(cur, UtilAlg.getTrajectory(proj.getLocation().add(0, -0.5, 0), cur.getEyeLocation()),
1.6 * range, false, 0, 0.8 * range, 1.2, true);
}

View File

@ -1,16 +1,18 @@
package mineplex.game.clans.clans.nether.miniboss;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import mineplex.core.common.util.UtilMath;
import mineplex.core.recharge.Recharge;
import mineplex.core.common.util.UtilTime;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.clans.nether.NetherManager;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntitySpawnEvent;
@ -19,23 +21,60 @@ import com.google.common.collect.Lists;
public class NetherMinibossManager implements Listener
{
private static final long TIME_BETWEEN_MINIBOSS_TARGET_PLAYER = 10000;
private static final long MINIBOSS_SPAWN_RATE = 10000;
private NetherManager _manager;
private HashMap<Location, NetherMinibossType> _spawns = new HashMap<>();
private long _lastSpawned;
private boolean _allowSpawn = false;
public NetherMinibossManager(NetherManager manager)
{
_manager = manager;
new MinibossFireball();
manager.runSyncLater(() ->
{
List<Location> sort = Lists.newArrayList();
sort.add(new Location(manager.getNetherWorld(), -18, 142, 61));
sort.add(new Location(manager.getNetherWorld(), -39, 133, -25));
sort.add(new Location(manager.getNetherWorld(), -102, 133, -99));
sort.add(new Location(manager.getNetherWorld(), -27, 141, -140));
sort.add(new Location(manager.getNetherWorld(), 32, 143, -95));
sort.add(new Location(manager.getNetherWorld(), 43, 134, 22));
sort.add(new Location(manager.getNetherWorld(), 102, 141, -31));
sort.add(new Location(manager.getNetherWorld(), 151, 136, 34));
sort.sort(new Comparator<Location>()
{
public int compare(Location o1, Location o2)
{
if (UtilMath.offset2d(o1, manager.getNetherWorld().getSpawnLocation()) < UtilMath.offset(o2, manager.getNetherWorld().getSpawnLocation()))
{
return -1;
}
return 1;
}
});
for (int i = 0; i < 3; i++)
{
_spawns.put(sort.get(i).add(0.5, 1.5, 0.5), NetherMinibossType.ARCHER);
}
for (int i = 3; i < 6; i++)
{
_spawns.put(sort.get(i).add(0.5, 1.5, 0.5), NetherMinibossType.WARRIOR);
}
for (int i = 6; i < 8; i++)
{
_spawns.put(sort.get(i).add(0.5, 1.5, 0.5), NetherMinibossType.GHAST);
}
Bukkit.getPluginManager().registerEvents(this, manager.getPlugin());
}, 20L);
}
private void spawnAttacker(Player player)
private void spawnAttacker(Location loc)
{
NetherMinibossType bossType = NetherMinibossType.values()[UtilMath.r(NetherMinibossType.values().length)];
NetherMinibossType bossType = _spawns.get(loc);
_allowSpawn = true;
bossType.getNewInstance(player.getLocation());
bossType.getNewInstance(loc);
_allowSpawn = false;
}
@ -59,18 +98,12 @@ public class NetherMinibossManager implements Listener
return;
}
List<Player> targets = Lists.newArrayList();
targets.addAll(_manager.InNether.keySet());
for (Player player : targets)
if (!_manager.InNether.isEmpty() && UtilTime.elapsed(_lastSpawned, MINIBOSS_SPAWN_RATE))
{
if (player.isDead() || !player.isValid())
_lastSpawned = System.currentTimeMillis();
for (Location spawn : _spawns.keySet())
{
continue;
}
if (_manager.isInNether(player) && Recharge.Instance.use(player, "Nether Miniboss Spawn", TIME_BETWEEN_MINIBOSS_TARGET_PLAYER, false, false))
{
spawnAttacker(player);
spawnAttacker(spawn);
}
}
}

View File

@ -2,17 +2,21 @@ package mineplex.game.clans.clans.nether.miniboss.bosses;
import java.util.Random;
import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilTime;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.nether.miniboss.MinibossFireball;
import mineplex.game.clans.clans.nether.miniboss.NetherMiniBoss;
import mineplex.game.clans.items.runes.RuneManager.RuneAttribute;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Ghast;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.inventory.ItemStack;
@ -80,18 +84,27 @@ public class GhastMiniboss extends NetherMiniBoss<Ghast>
@Override
public void update()
{
Player target = null;
for (Player test : UtilPlayer.getInRadius(getEntity().getLocation(), 25).keySet())
{
if (test.getGameMode() == GameMode.SURVIVAL && !ClansManager.getInstance().getIncognitoManager().Get(test).Hidden)
{
target = test;
break;
}
}
if (target != null)
{
UtilEnt.LookAt(getEntity(), target.getLocation());
tryFireballVolley();
}
}
@EventHandler
public void onShoot(ProjectileLaunchEvent event)
{
if (event.getEntity().getShooter() != null && event.getEntity().getShooter().equals(getEntity()))
{
if (!MinibossFireball.isFireball(event.getEntity()))
{
event.setCancelled(true);
}
ClansManager.getInstance().runSyncLater(() ->
{
if (event.getEntity() == null || event.getEntity().isDead() || !event.getEntity().isValid())

View File

@ -44,7 +44,7 @@ public class ClansScoreboardManager extends ScoreboardManager
private void init()
{
setTitle("Clans " + Clans.VERSION);
setTitle("Clans " + Clans.getMap());
ScoreboardData data = getData("default", true);

View File

@ -1,10 +1,7 @@
package mineplex.game.clans.clans.scoreboard.elements;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.entity.Player;
import mineplex.core.common.util.C;
import mineplex.core.common.util.UtilTime;
import mineplex.core.scoreboard.ScoreboardManager;
@ -12,6 +9,10 @@ import mineplex.core.scoreboard.elements.ScoreboardElement;
import mineplex.game.clans.clans.ClanInfo;
import mineplex.game.clans.clans.ClansManager;
import org.bukkit.entity.Player;
import com.google.common.collect.Lists;
public class ScoreboardElementClan implements ScoreboardElement
{
private ClansManager _clansManager;
@ -24,22 +25,28 @@ public class ScoreboardElementClan implements ScoreboardElement
@Override
public List<String> getLines(ScoreboardManager manager, Player player, List<String> out)
{
List<String> output = new ArrayList<String>();
List<String> output = Lists.newArrayList();
ClanInfo clanInfo = _clansManager.getClan(player);
if (clanInfo != null)
{
output.add(C.cYellow + "Clan " + C.cWhite + clanInfo.getName());
output.add(C.cYellow + "Online " + C.cWhite + clanInfo.getOnlinePlayers().size() + "/" + clanInfo.getMembers().size());
output.add(C.cYellowB + "Clan");
output.add(_clansManager.getClanUtility().mRel(_clansManager.getRelation(player, player), clanInfo.getName(), false));
output.add(" ");
// Energy
if (clanInfo.getEnergyCostPerMinute() > 0)
output.add(C.cYellow + "Energy " + C.cWhite + UtilTime.convertString((clanInfo.getEnergy() / clanInfo.getEnergyCostPerMinute()) * 60000L, 1, UtilTime.TimeUnit.FIT));
{
output.add(C.cYellowB + "Clan Energy");
output.add(C.cGreen + UtilTime.convertString((clanInfo.getEnergy() / clanInfo.getEnergyCostPerMinute()) * 60000L, 1, UtilTime.TimeUnit.FIT));
output.add(" ");
}
}
else
{
output.add(C.cYellow + "You are not in a Clan");
output.add(C.cYellowB + "Clan");
output.add("No Clan");
output.add(" ");
}
return output;

View File

@ -5,6 +5,8 @@ import java.util.List;
import org.bukkit.entity.Player;
import com.google.common.collect.Lists;
import mineplex.core.common.CurrencyType;
import mineplex.core.common.util.C;
import mineplex.core.scoreboard.ScoreboardManager;
@ -25,11 +27,14 @@ public class ScoreboardElementPlayer implements ScoreboardElement
@Override
public List<String> getLines(ScoreboardManager manager, Player player, List<String> out)
{
List<String> output = new ArrayList<String>();
output.add(C.cYellow + "Gold " + C.cWhite + manager.getDonation().Get(player).GetBalance(CurrencyType.GOLD) + "");
String regionString = C.xWilderness + "Wilderness";
List<String> output = Lists.newArrayList();
output.add(C.cYellowB + "Gold");
output.add(C.cGold + manager.getDonation().Get(player).GetBalance(CurrencyType.GOLD));
output.add(" ");
output.add(C.cYellowB + "Territory");
String regionString = C.xWilderness + "Wilderness";
ClanTerritory claim = _clansManager.getClanUtility().getClaim(player.getLocation());
if (claim != null)
{
@ -41,14 +46,15 @@ public class ScoreboardElementPlayer implements ScoreboardElement
//Trust
if (relation == ClansUtility.ClanRelation.ALLY_TRUST)
{
regionString += C.mBody + "(" + C.mElem + "Trusted" + C.mBody + ")";
}
}
// if (_clansManager.getNetherManager().isInNether(player))
// {
// regionString = C.cRed + "The Nether";
// }
if (_clansManager.getNetherManager().isInNether(player))
{
regionString = C.cClansNether + "The Nether";
}
output.add(regionString);

View File

@ -1,15 +1,5 @@
package mineplex.game.clans.clans.siege;
import org.bukkit.Location;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Slime;
import org.bukkit.event.EventHandler;
import org.bukkit.event.block.BlockPlaceEvent;
import com.google.gson.Gson;
import mineplex.core.MiniPlugin;
import mineplex.core.common.util.F;
import mineplex.core.common.util.NautHashMap;
@ -21,6 +11,7 @@ import mineplex.core.common.util.UtilTime;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.siege.command.GiveWeaponCommand;
import mineplex.game.clans.clans.siege.outpost.OutpostManager;
import mineplex.game.clans.clans.siege.repository.SiegeWeaponRepository;
import mineplex.game.clans.clans.siege.repository.tokens.SiegeWeaponToken;
@ -30,6 +21,16 @@ import mineplex.game.clans.core.repository.ClanTerritory;
import mineplex.game.clans.spawn.Spawn;
import net.minecraft.server.v1_8_R3.Material;
import org.bukkit.Location;
import org.bukkit.entity.ArmorStand;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Slime;
import org.bukkit.event.EventHandler;
import org.bukkit.event.block.BlockPlaceEvent;
import com.google.gson.Gson;
public class SiegeManager extends MiniPlugin
{
private ClansManager _clansManager;
@ -79,6 +80,8 @@ public class SiegeManager extends MiniPlugin
})
)
);
addCommand(new GiveWeaponCommand(this));
}
@EventHandler
@ -222,12 +225,12 @@ public class SiegeManager extends MiniPlugin
public boolean trySpawnCannon(Player player, Location location)
{
// if (_clansManager.getNetherManager().isInNether(player))
// {
// _clansManager.message(player, "You are not allowed to place this in " + F.clansNether("The Nether") + ".");
//
// return false;
// }
if (_clansManager.getNetherManager().isInNether(player))
{
_clansManager.message(player, "You are not allowed to place this in " + F.clansNether("The Nether") + ".");
return false;
}
if (!_clansManager.isInClan(player))
{

View File

@ -0,0 +1,26 @@
package mineplex.game.clans.clans.siege.command;
import org.bukkit.entity.Player;
import mineplex.core.command.CommandBase;
import mineplex.core.common.Rank;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilInv;
import mineplex.core.common.util.UtilPlayer;
import mineplex.game.clans.clans.siege.SiegeManager;
import mineplex.game.clans.clans.siege.weapon.Cannon;
public class GiveWeaponCommand extends CommandBase<SiegeManager>
{
public GiveWeaponCommand(SiegeManager plugin)
{
super(plugin, Rank.ADMIN, "giveweapon", "siegeweapon", "givecannon");
}
@Override
public void Execute(Player caller, String[] args)
{
UtilInv.insert(caller, Cannon.CANNON_ITEM.clone());
UtilPlayer.message(caller, F.main(Plugin.getName(), "You have been given a cannon!"));
}
}

View File

@ -1,95 +1,24 @@
package mineplex.game.clans.clans.siege.weapon.projectile;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map.Entry;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.Chest;
import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilItem;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilParticle;
import mineplex.core.common.util.UtilParticle.ParticleType;
import mineplex.core.common.util.UtilParticle.ViewDist;
import mineplex.core.common.util.UtilServer;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.clans.ClanInfo;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.siege.weapon.SiegeWeapon;
import mineplex.game.clans.core.repository.ClanTerritory;
import net.minecraft.server.v1_8_R3.Explosion;
public class Crater implements Listener
import org.bukkit.Location;
public class Crater
{
public static final Material CHARRED_TYPE = Material.OBSIDIAN;
private final SiegeWeapon _weapon;
private final Location _origin;
private final long _birthTime;
private final List<CraterBlock> _blocks;
public Crater(SiegeWeapon weapon, WeaponProjectile projectile, Location origin)
{
_weapon = weapon;
_origin = origin;
_birthTime = System.currentTimeMillis();
_blocks = new ArrayList<>();
UtilServer.getPluginManager().registerEvents(this, _weapon.getClans().getPlugin());
createExplosion();
}
@EventHandler
public void updateEffects(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK)
{
return;
}
_blocks.stream().filter(block -> block.Type == CHARRED_TYPE).forEach(block -> {
long lifetime = System.currentTimeMillis() - _birthTime;
long max = 80000;
if (block.Location.getBlock().getType() != CHARRED_TYPE)
{
return;
}
// Water touching the charred blocks
if (UtilBlock.getInRadius(block.Location, 1.6).keySet().stream().filter(water -> water.getType() == Material.WATER).iterator().hasNext())
{
return;
}
if (lifetime < max)
{
UtilParticle.PlayParticleToAll(ParticleType.FLAME, block.Location.clone().add(.5, 1, .5), new Vector(0, 0, 0), .0f, 3, ViewDist.MAX);
UtilParticle.PlayParticleToAll(lifetime >= max / 1.4 ? ParticleType.SMOKE : ParticleType.LARGE_SMOKE, block.Location.clone().add(.5, .8, .5), new Vector(0, 0, 0), .0f, 1, ViewDist.MAX);
}
else
{
HandlerList.unregisterAll(this);
}
});
}
private void createExplosion()
{
ClanTerritory terr = _weapon.getClans().getClanUtility().getClaim(_origin);
@ -98,58 +27,12 @@ public class Crater implements Listener
{
return;
}
boolean explosion = _origin.getWorld().createExplosion(_origin, 2.6f);
boolean floating = _origin.distance(UtilBlock.nearestFloor(_origin)) > 0.6;
if (explosion)
ClanInfo clan = ClansManager.getInstance().getClanUtility().getOwner(terr);
if (clan != null && !ClansManager.getInstance().getWarManager().isBeingBesiegedBy(clan, _weapon.getOwner()))
{
for (Block block : UtilBlock.getInRadius(_origin.getBlock(), 2.6f).keySet())
{
boolean charred = false;
double dist = block.getLocation().distance(_origin);
if (floating)
{
if (!block.getRelative(BlockFace.DOWN).getType().equals(CHARRED_TYPE)
&& !block.getRelative(BlockFace.DOWN).getType().equals(Material.AIR)
&& Math.random() > 0.79)
{
charred = true;
}
}
else
{
if (block.getRelative(BlockFace.UP).getType().equals(Material.AIR)
&& !block.getRelative(BlockFace.DOWN).getType().equals(CHARRED_TYPE)
&& !block.getRelative(BlockFace.DOWN).getType().equals(Material.AIR)
&& Math.random() > 0.79)
{
charred = true;
}
return;
}
if (block.getType().equals(Material.SMOOTH_BRICK))
{
charred = false;
}
if (block.getType().equals(Material.BEDROCK))
{
charred = false;
}
if (charred)
{
CraterBlock charredBlock = new CraterBlock(block.getLocation(), dist, CHARRED_TYPE, (byte) 0);
charredBlock.set();
_blocks.add(charredBlock);
_origin.getWorld().createExplosion(_origin, 2.6f);
}
}
}
}
}

View File

@ -7,12 +7,6 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.plugin.java.JavaPlugin;
import mineplex.core.MiniPlugin;
import mineplex.core.common.util.C;
import mineplex.core.common.util.Callback;
@ -31,10 +25,18 @@ import mineplex.game.clans.clans.ClansUtility;
import mineplex.game.clans.clans.event.ClanDisbandedEvent;
import mineplex.game.clans.clans.event.ClansPlayerDeathEvent;
import mineplex.game.clans.clans.war.command.WarPointsCommand;
import mineplex.game.clans.clans.war.event.WarInvasionEndEvent;
import mineplex.game.clans.clans.war.event.WarInvasionStartEvent;
import mineplex.game.clans.clans.war.event.WarSiegeEndEvent;
import mineplex.game.clans.clans.war.event.WarSiegeStartEvent;
import mineplex.game.clans.core.war.ClanWarData;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.block.BlockDispenseEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.plugin.java.JavaPlugin;
public class WarManager extends MiniPlugin implements ScoreboardElement
{
public static final int WAR_START_POINTS = 0;
@ -45,18 +47,17 @@ public class WarManager extends MiniPlugin implements ScoreboardElement
private final ClansManager _clansManager;
/**
* Map of the active war invasions. This is indexed by the clan that is being invaded on
* We will need to access this when blocks are broken in the invaded on clan's land!
* Map of the active war sieges. This is indexed by the clan that is being besieged
*/
private Map<String, List<WarInvasion>> _invadedMap;
private Map<String, List<WarInvasion>> _invaderMap;
private Map<String, List<WarSiege>> _besiegedMap;
private Map<String, List<WarSiege>> _besiegerMap;
public WarManager(JavaPlugin plugin, ClansManager clansManager)
{
super("ClanWar Manager", plugin);
_clansManager = clansManager;
_invadedMap = new HashMap<String, List<WarInvasion>>();
_invaderMap = new HashMap<String, List<WarInvasion>>();
_besiegedMap = new HashMap<>();
_besiegerMap = new HashMap<>();
}
public ClansManager getClansManager()
@ -64,40 +65,37 @@ public class WarManager extends MiniPlugin implements ScoreboardElement
return _clansManager;
}
public List<WarInvasion> getInvasionsOn(ClanInfo invaded)
public List<WarSiege> getSiegesOn(ClanInfo besieged)
{
return _invadedMap.get(invaded.getName());
return _besiegedMap.get(besieged.getName());
}
public List<WarInvasion> getInvasionsFor(ClanInfo invader)
public List<WarSiege> getSiegesFor(ClanInfo besieger)
{
return _invaderMap.get(invader.getName());
return _besiegerMap.get(besieger.getName());
}
public boolean isBeingInvaded(ClanInfo clanInfo)
public boolean isBeingBesieged(ClanInfo clanInfo)
{
List<WarInvasion> invasions = _invadedMap.get(clanInfo.getName());
return invasions != null && !invasions.isEmpty();
List<WarSiege> sieges = _besiegedMap.get(clanInfo.getName());
return sieges != null && !sieges.isEmpty();
}
public boolean isInvading(ClanInfo clanInfo)
public boolean isBesieging(ClanInfo clanInfo)
{
List<WarInvasion> invasions = _invaderMap.get(clanInfo.getName());
return invasions != null && !invasions.isEmpty();
List<WarSiege> sieges = _besiegerMap.get(clanInfo.getName());
return sieges != null && !sieges.isEmpty();
}
public boolean allowFromInvade(Location location, Player player)
public boolean isBeingBesiegedBy(ClanInfo besieged, ClanInfo besieger)
{
ClanInfo clanInfo = _clansManager.getClanUtility().getOwner(location);
ClanInfo playerClan = _clansManager.getClan(player);
if (clanInfo != null)
List<WarSiege> sieges = _besiegedMap.get(besieged.getName());
if (sieges != null && !sieges.isEmpty())
{
List<WarInvasion> invasions = _invadedMap.get(clanInfo.getName());
if (invasions != null)
for (WarSiege siege : sieges)
{
for (WarInvasion invasion : invasions)
if (siege.getBesiegingClan().equals(besieger.getName()))
{
if (invasion.getInvaderClan().equals(playerClan.getName()))
return true;
}
}
@ -106,14 +104,6 @@ public class WarManager extends MiniPlugin implements ScoreboardElement
return false;
}
/**
* Clear all invasions against clan. This is typically used for when a clan is deleted
*/
// public void clearInvasions(String clan)
// {
// List<WarInvasion> invasions =
// }
@EventHandler
public void handleDeath(final ClansPlayerDeathEvent event)
{
@ -184,106 +174,107 @@ public class WarManager extends MiniPlugin implements ScoreboardElement
private void checkWarComplete(ClanWarData war)
{
String invaderClan = null;
String invadedClan = null;
String besiegerClan = null;
String besiegedClan = null;
if (war.getClanAPoints() >= WAR_FINISH_POINTS)
{
// Clan A invades Clan B
invaderClan = war.getClanA();
invadedClan = war.getClanB();
besiegerClan = war.getClanA();
besiegedClan = war.getClanB();
}
else if (war.getClanBPoints() >= WAR_FINISH_POINTS)
{
// Clan B invades Clan A
invaderClan = war.getClanB();
invadedClan = war.getClanA();
besiegerClan = war.getClanB();
besiegedClan = war.getClanA();
}
if (invadedClan != null && invaderClan != null)
if (besiegedClan != null && besiegerClan != null)
{
// Reset War to 0:0
war.resetPoints();
war.setCooldown(WAR_COOLDOWN);
WarInvasion invasion = new WarInvasion(invadedClan, invaderClan);
startInvasion(invasion);
WarSiege siege = new WarSiege(besiegedClan, besiegerClan);
startSiege(siege);
}
}
private void startInvasion(WarInvasion invasion)
private void startSiege(WarSiege siege)
{
String invaded = invasion.getInvadedClan();
String invader = invasion.getInvaderClan();
String besieged = siege.getBesiegedClan();
String besieger = siege.getBesiegingClan();
addInvasion(invaded, invasion, _invadedMap);
addInvasion(invader, invasion, _invaderMap);
addSiege(besieged, siege, _besiegedMap);
addSiege(besieger, siege, _besiegerMap);
WarInvasionStartEvent event = new WarInvasionStartEvent(invasion);
WarSiegeStartEvent event = new WarSiegeStartEvent(siege);
UtilServer.getServer().getPluginManager().callEvent(event);
}
private void addInvasion(String name, WarInvasion invasion, Map<String, List<WarInvasion>> invasionMap)
private void addSiege(String name, WarSiege siege, Map<String, List<WarSiege>> siegeMap)
{
if (invasionMap.containsKey(name))
if (siegeMap.containsKey(name))
{
invasionMap.get(name).add(invasion);
siegeMap.get(name).add(siege);
}
else
{
LinkedList<WarInvasion> invasions = new LinkedList<WarInvasion>();
invasions.add(invasion);
invasionMap.put(name, invasions);
LinkedList<WarSiege> sieges = new LinkedList<>();
sieges.add(siege);
siegeMap.put(name, sieges);
}
}
@EventHandler
public void clearInvasions(UpdateEvent event)
public void clearSieges(UpdateEvent event)
{
if (event.getType() != UpdateType.SEC)
return;
long currentTime = System.currentTimeMillis();
Iterator<Map.Entry<String, List<WarInvasion>>> iterator = _invadedMap.entrySet().iterator();
Iterator<Map.Entry<String, List<WarSiege>>> iterator = _besiegedMap.entrySet().iterator();
while (iterator.hasNext())
{
List<WarInvasion> invasions = iterator.next().getValue();
Iterator<WarInvasion> invasionIterator = invasions.iterator();
while (invasionIterator.hasNext())
List<WarSiege> sieges = iterator.next().getValue();
Iterator<WarSiege> siegeIterator = sieges.iterator();
while (siegeIterator.hasNext())
{
WarInvasion invasion = invasionIterator.next();
if (currentTime >= invasion.getEndTime())
WarSiege siege = siegeIterator.next();
if (currentTime >= siege.getEndTime())
{
WarInvasionEndEvent endEvent = new WarInvasionEndEvent(invasion);
WarSiegeEndEvent endEvent = new WarSiegeEndEvent(siege);
Bukkit.getServer().getPluginManager().callEvent(endEvent);
List<WarInvasion> invaderList = _invaderMap.get(invasion.getInvaderClan());
if (invaderList != null)
List<WarSiege> besiegerList = _besiegerMap.get(siege.getBesiegingClan());
if (besiegerList != null)
{
invaderList.remove(invasion);
if (invaderList.isEmpty()) _invaderMap.remove(invasion.getInvaderClan());
}
invasionIterator.remove();
besiegerList.remove(siege);
if (besiegerList.isEmpty())
{
_besiegerMap.remove(siege.getBesiegingClan());
}
}
if (invasions.isEmpty())
siegeIterator.remove();
}
}
if (sieges.isEmpty())
iterator.remove();
}
}
@EventHandler
public void onInvasionStart(WarInvasionStartEvent event)
public void onSiegeStart(WarSiegeStartEvent event)
{
Bukkit.broadcastMessage(F.main("War", F.elem(event.getWarInvasion().getInvaderClan()) + " can now invade " + F.elem(event.getWarInvasion().getInvadedClan())));
Bukkit.broadcastMessage(F.main("War", F.elem(event.getWarSiege().getBesiegingClan()) + " can now besiege " + F.elem(event.getWarSiege().getBesiegedClan())));
}
@EventHandler
public void onInvasionEnd(WarInvasionEndEvent event)
public void onSiegeEnd(WarSiegeEndEvent event)
{
Bukkit.broadcastMessage(F.main("War", F.elem(event.getWarInvasion().getInvaderClan()) + "'s invasion against " + F.elem(event.getWarInvasion().getInvadedClan()) + " has ended."));
Bukkit.broadcastMessage(F.main("War", F.elem(event.getWarSiege().getBesiegingClan()) + "'s siege against " + F.elem(event.getWarSiege().getBesiegedClan()) + " has ended."));
}
@ -297,9 +288,29 @@ public class WarManager extends MiniPlugin implements ScoreboardElement
public void cancelDisband(ClanDisbandedEvent event)
{
ClanInfo clan = event.getClan();
if (isBeingInvaded(clan) || isInvading(clan))
if (isBeingBesieged(clan) || isBesieging(clan))
{
UtilPlayer.message(event.getDisbander(), F.main("Clans", "Clans cannot be disbanded in the middle of a siege"));
event.setCancelled(true);
}
}
@EventHandler
public void onPlaceTNT(BlockPlaceEvent event)
{
if (event.getBlockPlaced().getType() == Material.TNT)
{
event.setCancelled(true);
event.setBuild(false);
UtilPlayer.message(event.getPlayer(), F.main("Clans", "TNT cannot be used outside of a siege cannon!"));
}
}
@EventHandler
public void onTNTDispense(BlockDispenseEvent event)
{
if (event.getItem().getType() == Material.TNT)
{
UtilPlayer.message(event.getDisbander(), F.main("Clans", "Clans cannot be disbanded in the middle of an invasion"));
event.setCancelled(true);
}
}
@ -313,28 +324,28 @@ public class WarManager extends MiniPlugin implements ScoreboardElement
if (clan != null)
{
List<WarInvasion> invadedList = _invadedMap.get(clan.getName());
List<WarInvasion> invaderList = _invaderMap.get(clan.getName());
List<WarSiege> besiegedList = _besiegedMap.get(clan.getName());
List<WarSiege> besiegerList = _besiegerMap.get(clan.getName());
if (invaderList != null && !invaderList.isEmpty())
if (besiegerList != null && !besiegerList.isEmpty())
{
for (WarInvasion invasion : invaderList)
for (WarSiege siege : besiegerList)
{
element.add(" ");
element.add(C.cPurpleB + "Invading");
element.add(" " + invasion.getInvadedClan());
element.add(" " + UtilTime.convertString(invasion.getTimeLeft(), 1, UtilTime.TimeUnit.FIT));
element.add(C.cPurpleB + "Besieging");
element.add(" " + siege.getBesiegedClan());
element.add(" " + UtilTime.convertString(siege.getTimeLeft(), 1, UtilTime.TimeUnit.FIT));
}
}
if (invadedList != null && !invadedList.isEmpty())
if (besiegedList != null && !besiegedList.isEmpty())
{
for (WarInvasion invasion : invadedList)
for (WarSiege siege : besiegedList)
{
element.add(" ");
element.add(C.cRedB + "Invaded");
element.add(" " + invasion.getInvaderClan());
element.add(" " + UtilTime.convertString(invasion.getTimeLeft(), 1, UtilTime.TimeUnit.FIT));
element.add(C.cRedB + "Besieged");
element.add(" " + siege.getBesiegingClan());
element.add(" " + UtilTime.convertString(siege.getTimeLeft(), 1, UtilTime.TimeUnit.FIT));
}
}
}

View File

@ -1,16 +1,16 @@
package mineplex.game.clans.clans.war;
public class WarInvasion
public class WarSiege
{
private String _invadedClan;
private String _invaderClan;
private String _besiegedClan;
private String _besiegingClan;
private long _startTime;
private long _endTime;
public WarInvasion(String invadedClan, String invaderClan)
public WarSiege(String besiegedClan, String besiegingClan)
{
_invadedClan = invadedClan;
_invaderClan = invaderClan;
_besiegedClan = besiegedClan;
_besiegingClan = besiegingClan;
_startTime = System.currentTimeMillis();
_endTime = _startTime + WarManager.INVADE_LENGTH;
}
@ -20,14 +20,14 @@ public class WarInvasion
return _endTime - System.currentTimeMillis();
}
public String getInvadedClan()
public String getBesiegedClan()
{
return _invadedClan;
return _besiegedClan;
}
public String getInvaderClan()
public String getBesiegingClan()
{
return _invaderClan;
return _besiegingClan;
}
public long getStartTime()

View File

@ -1,25 +1,25 @@
package mineplex.game.clans.clans.war.event;
import mineplex.game.clans.clans.war.WarSiege;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import mineplex.game.clans.clans.war.WarInvasion;
/**
* Called when a war invasion is ended
* Called when a war siege is ended
*/
public class WarInvasionEndEvent extends Event
public class WarSiegeEndEvent extends Event
{
private WarInvasion _warInvasion;
private WarSiege _warSiege;
public WarInvasionEndEvent(WarInvasion warInvasion)
public WarSiegeEndEvent(WarSiege warSiege)
{
_warInvasion = warInvasion;
_warSiege = warSiege;
}
public WarInvasion getWarInvasion()
public WarSiege getWarSiege()
{
return _warInvasion;
return _warSiege;
}
// Bukkit event stuff

View File

@ -1,25 +1,25 @@
package mineplex.game.clans.clans.war.event;
import mineplex.game.clans.clans.war.WarSiege;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import mineplex.game.clans.clans.war.WarInvasion;
/**
* Called when a war invasion is started
* Called when a war siege is started
*/
public class WarInvasionStartEvent extends Event
public class WarSiegeStartEvent extends Event
{
private WarInvasion _warInvasion;
private WarSiege _warSiege;
public WarInvasionStartEvent(WarInvasion warInvasion)
public WarSiegeStartEvent(WarSiege warSiege)
{
_warInvasion = warInvasion;
_warSiege = warSiege;
}
public WarInvasion getWarInvasion()
public WarSiege getWarSiege()
{
return _warInvasion;
return _warSiege;
}
// Bukkit event stuff

View File

@ -1,75 +1,75 @@
package mineplex.game.clans.clans.worldevent;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
import java.util.Set;
import org.bukkit.Chunk;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilTime.TimeUnit;
import mineplex.core.common.util.UtilWorld;
import mineplex.game.clans.clans.ClansManager;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import mineplex.core.common.util.EnclosedObject;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilWorld;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.regions.ClansRegions;
import com.google.common.collect.Lists;
public class EventTerrainFinder
{
private WorldEventManager _eventManager;
private static final long EVENT_AREA_COOLDOWN = UtilTime.convert(3, TimeUnit.HOURS, TimeUnit.MILLISECONDS);
private ClansManager _clansManager;
private ClansRegions _clansRegions;
public EventTerrainFinder(WorldEventManager eventManager, ClansManager clansManager, ClansRegions clansRegions)
public EventTerrainFinder(ClansManager clansManager)
{
_eventManager = eventManager;
_clansManager = clansManager;
_clansRegions = clansRegions;
}
public double posNeg()
public Location findAreaInBorderlands(boolean force)
{
List<EventLocation> locs = Lists.newArrayList();
locs.addAll(Arrays.asList(EventLocation.values()));
locs.sort(new Comparator<EventLocation>()
{
public int compare(EventLocation loc1, EventLocation loc2)
{
if (!UtilTime.elapsed(loc1.getLastUsed(), EVENT_AREA_COOLDOWN))
{
if (Math.random() > 0.5) return -1;
return 1;
}
public Location findAreaInBorderlands(World world, int size, int vert)
if (!UtilTime.elapsed(loc2.getLastUsed(), EVENT_AREA_COOLDOWN))
{
for (int i = 0; i < 150; i++)
{
EnclosedObject<Location> loc = new EnclosedObject<>();
if (_clansManager.getClanUtility().getClanByClanName("Borderlands") == null)
{
System.out.println("[WORLD EVENT] FATAL ERROR: CLAN BORDERLANDS NOT FOUND.");
break;
return -1;
}
int[] rand = new int[] {1, -1};
return rand[new Random().nextInt(rand.length)];
}
_clansManager.getClanUtility().getClanByClanName("Borderlands").getClaimSet().stream().filter(claim -> Math.random() > .5).filter(claim -> Math.random() > .5).filter(claim -> Math.random() > .3).filter(claim -> Math.random() > .7).limit(1).forEach(claim -> {
Chunk chunk = UtilWorld.strToChunk(claim);
loc.Set(UtilBlock.getHighest(chunk.getWorld(), chunk.getBlock(0, 0, 0)).getLocation());
});
if (!UtilWorld.isBoxInWorldBorder(world, loc.Get().clone().subtract(size * 2, vert, size * 2), loc.Get().clone().add(size * 2, vert, size * 2)))
for (EventLocation loc : locs)
{
if (!UtilTime.elapsed(loc.getLastUsed(), EVENT_AREA_COOLDOWN))
{
continue;
}
if (loc.Get() == null)
if (_clansManager.getClanUtility().getClaim(loc.getLocation()) == null || _clansManager.getClanUtility().getClaim(loc.getLocation()).Owner.contains("Borderlands"))
{
continue;
loc.use();
return loc.getLocation();
}
}
System.out.println("Done finding area... [success]");
// Success
return loc.Get();
if (force && !locs.isEmpty())
{
EventLocation loc = locs.get(UtilMath.r(locs.size()));
loc.use();
return loc.getLocation();
}
System.out.println("Failed to find area...");
return null;
}
@ -129,4 +129,47 @@ public class EventTerrainFinder
return null;
}
private static enum EventLocation
{
NORTH_1("world", -495, 73, -1028),
NORTH_2("world", 197, 66, -1018),
NORTH_3("world", 948, 71, -959),
EAST_1("world", 1109, 66, -753),
EAST_2("world", 1141, 68, 31),
EAST_3("world", 1044, 71, 603),
SOUTH_1("world", 690, 71, 895),
SOUTH_2("world", 144, 66, 1012),
SOUTH_3("world", -1093, 71, 895),
WEST_1("world", -937, 71, 559),
WEST_2("world", -1092, 67, -9),
WEST_3("world", -969, 71, -441);
private String _world;
private double _x, _y, _z;
private long _last = 0;
private EventLocation(String worldName, double x, double y, double z)
{
_world = worldName;
_x = x;
_y = y;
_z = z;
}
public Location getLocation()
{
return new Location(UtilWorld.getWorld(_world), _x, _y, _z);
}
public Long getLastUsed()
{
return _last;
}
public void use()
{
_last = System.currentTimeMillis();
}
}
}

View File

@ -1,6 +1,5 @@
package mineplex.game.clans.clans.worldevent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@ -9,6 +8,7 @@ import java.util.Random;
import mineplex.core.MiniPlugin;
import mineplex.core.blockrestore.BlockRestore;
import mineplex.core.common.util.C;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilServer;
import mineplex.core.scoreboard.ScoreboardManager;
import mineplex.core.scoreboard.elements.ScoreboardElement;
@ -35,8 +35,11 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.HandlerList;
import org.bukkit.plugin.java.JavaPlugin;
import com.google.common.collect.Lists;
public class WorldEventManager extends MiniPlugin implements ScoreboardElement
{
private static final double ARENA_RADIUS = 40;
private final List<WorldEvent> _runningEvents;
private Random _random;
@ -55,7 +58,7 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement
super("World Event", plugin);
_random = new Random();
_terrainFinder = new EventTerrainFinder(this, clansManager, clansRegions);
_terrainFinder = new EventTerrainFinder(clansManager);
_clansManager = clansManager;
_damageManager = damageManager;
_lootManager = lootManager;
@ -86,7 +89,7 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement
{
for (WorldEvent event : _runningEvents)
{
if (event.isInBounds(location))
if (UtilMath.offset2d(location, event.getCenterLocation()) <= ARENA_RADIUS)
{
return true;
}
@ -102,7 +105,7 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement
{
for (WorldEvent e : _runningEvents)
{
if (e.isInBounds(event.GetPlayer().getLocation()))
if (isInEvent(event.GetPlayer().getLocation()))
{
event.SetCancelled(true);
}
@ -189,7 +192,7 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement
{
WorldEventType[] types = WorldEventType.values();
WorldEventType type = types[_random.nextInt(types.length)];
Location location = _terrainFinder.findAreaInBorderlands(Bukkit.getWorlds().get(0), type.getAreaNeeded(), type.getAreaNeeded());
Location location = _terrainFinder.findAreaInBorderlands(false);
if (location != null)
{
initializeEvent(type.createInstance(this, location, _skillFactory));
@ -228,10 +231,11 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement
return null;
}
public WorldEvent startEventFromType(Location location, WorldEventType eventType)
public WorldEvent startEventFromType(WorldEventType eventType)
{
if (eventType != null)
{
Location location = _terrainFinder.findAreaInBorderlands(true);
WorldEvent event = eventType.createInstance(this, location, _skillFactory);
if (event != null)
{
@ -287,7 +291,7 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement
@Override
public List<String> getLines(ScoreboardManager manager, Player player, List<String> out)
{
List<String> output = new ArrayList<String>();
List<String> output = Lists.newArrayList();
Iterator<WorldEvent> iterator = _runningEvents.iterator();
while (iterator.hasNext())

View File

@ -27,7 +27,7 @@ public class StartCommand extends CommandBase<WorldEventManager>
try
{
WorldEventType eventType = WorldEventType.valueOf(args[0]);
WorldEvent event = Plugin.startEventFromType(caller.getLocation(), eventType);
WorldEvent event = Plugin.startEventFromType(eventType);
if (event == null)
{
@ -35,7 +35,7 @@ public class StartCommand extends CommandBase<WorldEventManager>
}
else
{
UtilPlayer.message(caller, F.main(Plugin.getName(), "Started WorldEvent " + F.elem(args[0]) + " at your current location"));
UtilPlayer.message(caller, F.main(Plugin.getName(), "Started WorldEvent " + F.elem(args[0]) + "!"));
}
}
catch (IllegalArgumentException e)

View File

@ -6,7 +6,8 @@ import mineplex.core.common.util.UtilEvent;
import mineplex.core.common.util.UtilEvent.ActionType;
import mineplex.core.common.util.UtilGear;
import mineplex.core.common.util.UtilInv;
import mineplex.core.itemstack.ItemStackFactory;
import mineplex.core.common.util.UtilMath;
import mineplex.core.itemstack.ItemBuilder;
import mineplex.core.projectile.IThrown;
import mineplex.core.projectile.ProjectileUser;
import mineplex.core.recharge.Recharge;
@ -155,7 +156,7 @@ public abstract class ItemUsable extends Item implements IThrown
if (_throwExpire >= 0)
expire = _throwExpire;
org.bukkit.entity.Item ent = player.getWorld().dropItem(player.getEyeLocation(), ItemStackFactory.Instance.CreateStack(GetType()));
org.bukkit.entity.Item ent = player.getWorld().dropItem(player.getEyeLocation(), new ItemBuilder(GetType()).setTitle(UtilMath.random.nextDouble() + "").build());
UtilAction.velocity(ent, player.getLocation().getDirection(), _throwPower, false, 0, 0.2, 10, false);
Factory.Throw().AddThrow(ent, player, this, expire, _throwPlayer, _throwPlayer, _throwBlock, _throwIdle, _throwPickup, 0.5f);

View File

@ -17,7 +17,7 @@ public class GolemBoss extends WorldEvent
{
public GolemBoss(DamageManager damageManager, BlockRestore blockRestore, ConditionManager conditionManager, ProjectileManager projectileManager, Location cornerLocation)
{
super(DisguiseManager.INSTANCE, projectileManager, damageManager, blockRestore, conditionManager, "Iron Wizard", cornerLocation, "schematic/Golem.schematic");
super(DisguiseManager.INSTANCE, projectileManager, damageManager, blockRestore, conditionManager, "Iron Wizard", cornerLocation);
}
@Override

View File

@ -56,7 +56,7 @@ public class GolemDeadlyTremor extends BossAbility<GolemCreature, IronGolem>
@Override
public void tick()
{
for (Player player : UtilPlayer.getInRadius(getLocation(), 40).keySet())
for (Player player : UtilPlayer.getInRadius(getLocation(), 30).keySet())
{
player.playSound(player.getLocation(), Sound.MINECART_BASE, 0.2f, 0.2f);

View File

@ -20,8 +20,7 @@ public class SkeletonBoss extends WorldEvent
public SkeletonBoss(DamageManager damageManager, BlockRestore blockRestore, ConditionManager conditionManager, ProjectileManager projectileManager, Location cornerLocation)
{
super(DisguiseManager.INSTANCE, projectileManager, damageManager, blockRestore, conditionManager, "Skeleton King", cornerLocation,
"schematic/Golem.schematic");
super(DisguiseManager.INSTANCE, projectileManager, damageManager, blockRestore, conditionManager, "Skeleton King", cornerLocation);
}
@Override

View File

@ -210,7 +210,6 @@ public class SkeletonCreature extends EventCreature<Skeleton>
{
if (getHealth() <= test)
{
Bukkit.broadcastMessage(test + "Verified");
wraithUse = test;
break;
}