Changes included in this Season of Clans:

- Make the Clans Helmet Packet system more modifiable and versatile (rather than just working on banners)
- Modify the Builder's Box to convert everything in the user's inventory to solve the dupe glitch
- Make the Builder's Box require accepting a Confirmation dialogue to use
- Remove unused Clans command aliases
- Remove /c t command
- Implement logging of administrative commands performed by the Clans Management team
- Patch an exploit where Farming rewards would drop even if the breaking of the block was canceled
- Re-implement Clans Maps
- Patch a flaw in the Clans promotion system where members could promote recruits (it is now locked to admin+)
- Patch a bug in the Clans promotion system where checks for self-promotion would always fail incorrectly
- Improve the loot dropped by the Capture Point event to make it more rewarding
- Improve the particle effects of the Knight's Steed Clans Mount Skin
- Implement the Power Melon and Cake Clans Mount Skins
- Patch flaws in the PvP Timer system (instant pickup of mined blocks, block entry to enemy land, block entry to raids and world bosses, allow taking damage from non-player entities)
- Patch an issue with Outposts where Runed Pickaxes could instantly mine through them
- Change the material of Gold Tokens to RABBIT_FOOT in order to free up the music disc
- Implement the new Knight's Greatlance legendary item
- Implement secondary ranged attacks to the Scythe of the Fallen Lord
- Update all legendary descriptions to be more informative about their usages and to better reflect Clans lore
- Patch an exploit with the item cache allowing for legendaries to be used even when they are not actually held
- Patch a bug causing CustomItems to be registered as listeners multiple times
- Patch a bug where legendaries would not properly track blocking over an extended duration
- Patch a bug where several legendaries could impact the entities comprising cannons, causing them to become glitched
- Prevent placing several illicit block types (barriers, bedrock, hoppers)
- Patch an exploit where logs could be used to spawn infinite trees in order to grief
- Allow opening of dispensers, furnaces and droppers during sieges
- Prevent placement of dispensers, furnaces and droppers below the minimum chest level
This commit is contained in:
AlexTheCoder 2018-01-26 13:16:13 -05:00 committed by Alexander Meech
parent 742d849b44
commit 9f37e937fa
74 changed files with 1545 additions and 770 deletions

View File

@ -44,19 +44,18 @@ import net.minecraft.server.v1_8_R3.WorldServer;
public class UtilSchematic
{
public static Schematic loadSchematic(File file) throws IOException
{
FileInputStream fis = new FileInputStream(file);
return loadSchematic(fis);
}
public static Schematic loadSchematic(byte[] bytes) throws IOException
{
ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
return loadSchematic(bis);
}
public static Schematic loadSchematic(InputStream input) throws IOException
{
NBTInputStream nbtStream = new NBTInputStream(new GZIPInputStream(input));
@ -73,15 +72,15 @@ public class UtilSchematic
short width = getChildTag(schematic, "Width", ShortTag.class).getValue();
short height = getChildTag(schematic, "Height", ShortTag.class).getValue();
short length = getChildTag(schematic, "Length", ShortTag.class).getValue();
byte[] blockId = getChildTag(schematic, "Blocks", ByteArrayTag.class).getValue();
byte[] addId = new byte[0];
short[] blocks = new short[blockId.length]; // Have to later combine IDs
byte[] blockData = getChildTag(schematic, "Data", ByteArrayTag.class).getValue();
Vector weOffset = null;
if(schematic.containsKey("WEOffsetX") && schematic.containsKey("WEOffsetY") && schematic.containsKey("WEOffsetZ"))
if (schematic.containsKey("WEOffsetX") && schematic.containsKey("WEOffsetY") && schematic.containsKey("WEOffsetZ"))
{
int x = getChildTag(schematic, "WEOffsetX", IntTag.class).getValue();
int y = getChildTag(schematic, "WEOffsetY", IntTag.class).getValue();
@ -90,7 +89,7 @@ public class UtilSchematic
}
// We support 4096 block IDs using the same method as vanilla Minecraft, where
// the highest 4 bits are stored in a separate byte array.
// the highest 4 bits are stored in a separate byte array.
if (schematic.containsKey("AddBlocks"))
{
addId = getChildTag(schematic, "AddBlocks", ByteArrayTag.class).getValue();
@ -100,62 +99,70 @@ public class UtilSchematic
for (int index = 0; index < blockId.length; index++)
{
if ((index >> 1) >= addId.length)
{
blocks[index] = (short) (blockId[index] & 0xFF);
}
else
{
if ((index & 1) == 0)
{
blocks[index] = (short) (((addId[index >> 1] & 0x0F) << 8) + (blockId[index] & 0xFF));
}
else
{
blocks[index] = (short) (((addId[index >> 1] & 0xF0) << 4) + (blockId[index] & 0xFF));
}
}
}
// Need to pull out tile entities
List<Tag> tileEntities = getChildTag(schematic, "TileEntities", ListTag.class).getValue();
Map<BlockVector, Map<String, Tag>> tileEntitiesMap = new HashMap<>();
List<Tag> tileEntities = getChildTag(schematic, "TileEntities", ListTag.class).getValue();
Map<BlockVector, Map<String, Tag>> tileEntitiesMap = new HashMap<>();
for (Tag tag : tileEntities)
{
if (!(tag instanceof CompoundTag)) {
continue;
}
CompoundTag t = (CompoundTag) tag;
for (Tag tag : tileEntities)
{
if (!(tag instanceof CompoundTag))
{
continue;
}
CompoundTag t = (CompoundTag) tag;
int x = 0;
int y = 0;
int z = 0;
int x = 0;
int y = 0;
int z = 0;
Map<String, Tag> values = new HashMap<>();
Map<String, Tag> values = new HashMap<>();
for (Map.Entry<String, Tag> entry : t.getValue().entrySet())
{
if (entry.getValue() instanceof IntTag)
{
if (entry.getKey().equals("x"))
{
x = ((IntTag) entry.getValue()).getValue();
} else if (entry.getKey().equals("y"))
{
y = ((IntTag) entry.getValue()).getValue();
} else if (entry.getKey().equals("z"))
{
z = ((IntTag) entry.getValue()).getValue();
}
}
for (Map.Entry<String, Tag> entry : t.getValue().entrySet())
{
if (entry.getValue() instanceof IntTag)
{
if (entry.getKey().equals("x"))
{
x = ((IntTag) entry.getValue()).getValue();
}
else if (entry.getKey().equals("y"))
{
y = ((IntTag) entry.getValue()).getValue();
}
else if (entry.getKey().equals("z"))
{
z = ((IntTag) entry.getValue()).getValue();
}
}
values.put(entry.getKey(), entry.getValue());
}
values.put(entry.getKey(), entry.getValue());
}
BlockVector vec = new BlockVector(x, y, z);
tileEntitiesMap.put(vec, values);
}
List<Tag> entityTags = getChildTag(schematic, "Entities", ListTag.class).getValue();
BlockVector vec = new BlockVector(x, y, z);
tileEntitiesMap.put(vec, values);
}
List<Tag> entityTags = getChildTag(schematic, "Entities", ListTag.class).getValue();
return new Schematic(width, height, length, blocks, blockData, weOffset, tileEntitiesMap, entityTags);
}
/**
* @param schematic The schematic you want to turn into bytes
* @return Returns a byte array of the schematic which may be used for saving the schematic to DB or file
@ -166,7 +173,7 @@ public class UtilSchematic
writeBytes(schematic, output);
return output.toByteArray();
}
/**
* @param schematic The scheamtic you want save somewhere
* @return Writes out this schematic on byte form
@ -174,127 +181,127 @@ public class UtilSchematic
public static void writeBytes(Schematic schematic, OutputStream output)
{
Map<String, Tag> map = new HashMap<>();
short width = schematic.getWidth();
short height = schematic.getHeight();
short length = schematic.getLength();
map.put("Width", new ShortTag(width));
map.put("Height", new ShortTag(height));
map.put("Length", new ShortTag(length));
if(schematic.hasWorldEditOffset())
if (schematic.hasWorldEditOffset())
{
Vector weOffset = schematic.getWorldEditOffset();
map.put("WEOffsetX", new IntTag(weOffset.getBlockX()));
map.put("WEOffsetY", new IntTag(weOffset.getBlockX()));
map.put("WEOffsetZ", new IntTag(weOffset.getBlockX()));
}
map.put("Materials", new StringTag("Alpha"));
short[] sBlocks = schematic.getBlocks();
Map<BlockVector, Map<String, Tag>> sTileEntities = schematic.getTileEntities();
byte[] blocks = new byte[sBlocks.length];
byte[] addBlocks = null;
byte[] blockData = schematic.getBlockData();
List<Tag> tileEntities = new ArrayList<Tag>();
for(int x = 0; x < width; x++)
{
for(int y = 0; y < height; y++)
{
for(int z = 0; z < length; z++)
{
int index = y * width * length + z * width + x;
BlockVector bv = new BlockVector(x, y, z);
//Save 4096 IDs in an AddBlocks section
if(sBlocks[index] > 255)
{
if (addBlocks == null) { // Lazily create section
addBlocks = new byte[(blocks.length >> 1) + 1];
}
addBlocks[index >> 1] = (byte) (((index & 1) == 0) ?
addBlocks[index >> 1] & 0xF0 | (sBlocks[index] >> 8) & 0xF
: addBlocks[index >> 1] & 0xF | ((sBlocks[index] >> 8) & 0xF) << 4);
}
blocks[index] = (byte) sBlocks[index];
byte[] addBlocks = null;
byte[] blockData = schematic.getBlockData();
List<Tag> tileEntities = new ArrayList<>();
if(sTileEntities.get(bv) != null)
{
Map<String, Tag> values = new HashMap<>(sTileEntities.get(bv));
values.put("x", new IntTag(x));
values.put("y", new IntTag(y));
values.put("z", new IntTag(z));
CompoundTag tileEntityTag = new CompoundTag(values);
tileEntities.add(tileEntityTag);
}
}
}
}
map.put("Blocks", new ByteArrayTag(blocks));
map.put("Data", new ByteArrayTag(blockData));
map.put("TileEntities", new ListTag(CompoundTag.class, tileEntities));
if (addBlocks != null) {
map.put("AddBlocks", new ByteArrayTag(addBlocks));
}
// ====================================================================
// Entities
// ====================================================================
List<Tag> entities = schematic.getEntities();
map.put("Entities", new ListTag(CompoundTag.class, entities));
// ====================================================================
// Output
// ====================================================================
CompoundTag schematicTag = new CompoundTag(map);
try (NBTOutputStream outputStream = new NBTOutputStream(new GZIPOutputStream(output)))
for (int x = 0; x < width; x++)
{
outputStream.writeNamedTag("Schematic", schematicTag);
for (int y = 0; y < height; y++)
{
for (int z = 0; z < length; z++)
{
int index = y * width * length + z * width + x;
BlockVector bv = new BlockVector(x, y, z);
//Save 4096 IDs in an AddBlocks section
if (sBlocks[index] > 255)
{
if (addBlocks == null) // Lazily create section
{
addBlocks = new byte[(blocks.length >> 1) + 1];
}
addBlocks[index >> 1] = (byte) (((index & 1) == 0) ?
addBlocks[index >> 1] & 0xF0 | (sBlocks[index] >> 8) & 0xF
: addBlocks[index >> 1] & 0xF | ((sBlocks[index] >> 8) & 0xF) << 4);
}
blocks[index] = (byte) sBlocks[index];
if (sTileEntities.get(bv) != null)
{
Map<String, Tag> values = new HashMap<>(sTileEntities.get(bv));
values.put("x", new IntTag(x));
values.put("y", new IntTag(y));
values.put("z", new IntTag(z));
CompoundTag tileEntityTag = new CompoundTag(values);
tileEntities.add(tileEntityTag);
}
}
}
}
map.put("Blocks", new ByteArrayTag(blocks));
map.put("Data", new ByteArrayTag(blockData));
map.put("TileEntities", new ListTag(CompoundTag.class, tileEntities));
if (addBlocks != null)
{
map.put("AddBlocks", new ByteArrayTag(addBlocks));
}
// ====================================================================
// Entities
// ====================================================================
List<Tag> entities = schematic.getEntities();
map.put("Entities", new ListTag(CompoundTag.class, entities));
// ====================================================================
// Output
// ====================================================================
CompoundTag schematicTag = new CompoundTag(map);
try (NBTOutputStream outputStream = new NBTOutputStream(new GZIPOutputStream(output)))
{
outputStream.writeNamedTag("Schematic", schematicTag);
}
catch (IOException e)
{
e.printStackTrace();
}
}
public static Schematic createSchematic(Location locA, Location locB)
{
return createSchematic(locA, locB, null);
}
public static Schematic createSchematic(Location locA, Location locB, Vector worldEditOffset)
{
World world = locA.getWorld();
Vector min = Vector.getMinimum(locA.toVector(), locB.toVector());
Vector max = Vector.getMaximum(locB.toVector(), locA.toVector());
short width = (short) (max.getBlockX()-min.getBlockX());
short height = (short) (max.getBlockY()-min.getBlockY());
short length = (short) (max.getBlockZ()-min.getBlockZ());
short[] blocks = new short[width*height*length];
byte[] blocksData = new byte[blocks.length];
WorldServer nmsWorld = ((CraftWorld)world).getHandle();
Map<BlockVector, Map<String, Tag>> tileEntities = new HashMap<>();
for(int x = min.getBlockX(); x < max.getBlockX(); x++)
{
for(int y = min.getBlockY(); y < max.getBlockY(); y++)
@ -304,68 +311,67 @@ public class UtilSchematic
int localX = x-min.getBlockX();
int localY = y-min.getBlockY();
int localZ = z-min.getBlockZ();
Block b = world.getBlockAt(x, y, z);
int index = localY * width * length + localZ * width + localX;
blocks[index] = (short) b.getTypeId();
blocksData[index] = b.getData();
BlockPosition bp = new BlockPosition(x, y, z);
TileEntity tileEntity = nmsWorld.getTileEntity(bp);
if(tileEntity == null) continue;
NBTTagCompound nmsTag = new NBTTagCompound();
tileEntity.b(nmsTag);
nmsTag.set("x", new NBTTagInt(localX));
nmsTag.set("y", new NBTTagInt(localY));
nmsTag.set("z", new NBTTagInt(localZ));
CompoundTag tag = NBTUtils.fromNative(nmsTag);
tileEntities.put(new BlockVector(localX, localY, localZ), tag.getValue());
}
}
}
List<Tag> entities = new ArrayList<>();
for(Entity e : world.getEntities())
for (Entity e : world.getEntities())
{
if(e instanceof Player) continue;
if(e.getLocation().toVector().isInAABB(min, max))
if (e instanceof Player) continue;
if (e.getLocation().toVector().isInAABB(min, max))
{
net.minecraft.server.v1_8_R3.Entity nmsEntity = ((CraftEntity)e).getHandle();
NBTTagCompound nmsTag = new NBTTagCompound();
nmsEntity.c(nmsTag);
Vector diff = e.getLocation().subtract(min).toVector();
setPosition(nmsTag, diff);
nmsTag.remove("UUID");
nmsTag.remove("UUIDMost");
nmsTag.remove("UUIDLeast");
CompoundTag tag = NBTUtils.fromNative(nmsTag);
entities.add(tag);
}
}
return new Schematic(width, height, length, blocks, blocksData, worldEditOffset, tileEntities, entities);
}
private static <T extends Tag> T getChildTag(Map<String, Tag> items, String key, Class<T> expected)
{
Tag tag = items.get(key);
return expected.cast(tag);
}
public static void setPosition(NBTTagCompound nbtTag, Vector pos)
{
nbtTag.set("Pos", NBTUtils.doubleArrayToList(pos.getX(), pos.getY(), pos.getZ()));
@ -378,4 +384,4 @@ public class UtilSchematic
Schematic m = UtilSchematic.loadSchematic(file);
System.out.println(m);
}
}
}

View File

@ -95,6 +95,10 @@ public class UtilEnt
public static boolean hasFlag(Entity entity, String flag)
{
if (entity == null)
{
return false;
}
return entity.hasMetadata("flag:" + flag);
}
@ -1058,5 +1062,4 @@ public class UtilEnt
{
return ((CraftEntity) entity).getHandle().inWater;
}
}
}

View File

@ -156,7 +156,8 @@ public abstract class PunishPage extends ShopPageBase<Punish, PunishShop>
if ((punishment.GetHours() < 0 || punishment.GetRemaining() > 0) && !punishment.GetRemoved() && punishment.GetActive())
{
addButton(slot, itemStack, (p, c) -> {
addButton(slot, itemStack, (p, c) ->
{
if (getPlugin().GetClients().Get(getPlayer()).hasPermission(Punish.Perm.BYPASS_REMOVE_CONFIRMATION))
{
removePunishment(punishment);

View File

@ -12,7 +12,7 @@ public class ClansBanCommand extends CommandBase<ClansBanManager>
{
public ClansBanCommand(ClansBanManager plugin)
{
super(plugin, ClansBanManager.Perm.PUNISHMENT_COMMAND, "cbans", "cb", "cban", "cp", "cpunish", "clanspunish", "clanpunish");
super(plugin, ClansBanManager.Perm.PUNISHMENT_COMMAND, "cb");
}
@Override

View File

@ -15,6 +15,9 @@ import mineplex.core.punish.clans.ClansBan;
import mineplex.core.punish.clans.ClansBanClient;
import mineplex.core.punish.clans.ClansBanManager;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.core.slack.SlackAPI;
import mineplex.core.slack.SlackMessage;
import mineplex.core.slack.SlackTeam;
public class ClansBanPage extends ShopPageBase<ClansBanManager, ClansBanShop>
{
@ -129,8 +132,11 @@ public class ClansBanPage extends ShopPageBase<ClansBanManager, ClansBanShop>
{
getPlugin().unban(_victimClient, ban, getPlayer().getName(), _reason, () ->
{
refresh();
playAcceptSound(player);
SlackAPI.getInstance().sendMessage(SlackTeam.DEVELOPER, "#clans-commandspy",
new SlackMessage("Clans Command Logger", "crossed_swords", getPlayer().getName() + " has removed a blacklist from " + _victimName + " for " + _reason + "."),
true);
refresh();
});
}
});
@ -149,6 +155,9 @@ public class ClansBanPage extends ShopPageBase<ClansBanManager, ClansBanShop>
if (ban.isPresent())
{
playAcceptSound(getPlayer());
SlackAPI.getInstance().sendMessage(SlackTeam.DEVELOPER, "#clans-commandspy",
new SlackMessage("Clans Command Logger", "crossed_swords", getPlayer().getName() + " has blacklisted " + _victimName + " for " + _reason + ". Duration: " + UtilTime.MakeStr(_time)),
true);
refresh();
}
else

View File

@ -78,7 +78,9 @@ public class ConfirmationPage<PluginType extends MiniPlugin, ShopType extends Sh
getPlugin().getScheduler().cancelTask(_taskId);
if (_returnPage != null)
{
getShop().openPageForPlayer(player, _returnPage);
}
else
{
player.closeInventory();
@ -150,7 +152,9 @@ public class ConfirmationPage<PluginType extends MiniPlugin, ShopType extends Sh
Bukkit.getScheduler().cancelTask(_taskId);
if (_returnPage != null && getShop() != null)
{
getShop().setCurrentPageForPlayer(getPlayer(), _returnPage);
}
}
@Override
@ -224,4 +228,4 @@ public class ConfirmationPage<PluginType extends MiniPlugin, ShopType extends Sh
buildErrorPage(message);
_progressCount = 0;
}
}
}

View File

@ -6,7 +6,6 @@ import mineplex.game.clans.core.ClaimLocation;
public class ClanTerritory
{
public ClanTerritory(ClaimLocation loc, String owner, boolean safe)
{
ClaimLocation = loc;
@ -27,4 +26,4 @@ public class ClanTerritory
return Safe;
}
}
}

View File

@ -77,7 +77,7 @@ import net.minecraft.server.v1_8_R3.MinecraftServer;
public class Clans extends JavaPlugin
{
public static final String MAP = "Season 4";
public static final String MAP = "Season 5";
public static boolean HARDCORE = false;

View File

@ -3,6 +3,7 @@ package mineplex.game.clans;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.plugin.java.JavaPlugin;
@ -17,7 +18,7 @@ public class Farming extends MiniPlugin
super("Farming", plugin);
}
@EventHandler (ignoreCancelled = true)
@EventHandler (priority = EventPriority.MONITOR, ignoreCancelled = true)
public void BlockBreak(BlockBreakEvent event)
{
if (event.getBlock().getType() != Material.LEAVES)

View File

@ -16,6 +16,9 @@ import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilPlayerBase;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilWorld;
import mineplex.core.slack.SlackAPI;
import mineplex.core.slack.SlackMessage;
import mineplex.core.slack.SlackTeam;
import mineplex.game.clans.core.ClaimLocation;
import mineplex.game.clans.core.repository.ClanTerritory;
import mineplex.game.clans.core.repository.tokens.ClanToken;
@ -50,6 +53,22 @@ public class ClansAdmin
UtilPlayerBase.message(caller, C.mHead + "Permissions> " + C.mBody + "You do not have permission to do that.");
return;
}
StringBuilder cmd = new StringBuilder("/c");
for (String a : args)
{
cmd.append(" ").append(a);
}
for (int i = 0; i < cmd.length(); i++)
{
if (cmd.charAt(i) == '`')
{
cmd.setCharAt(i, '\'');
}
}
SlackAPI.getInstance().sendMessage(SlackTeam.DEVELOPER, "#clans-commandspy",
new SlackMessage("Clans Command Logger", "crossed_swords", caller.getName() + " has issued command `" + cmd.toString() + "` on " + UtilServer.getServerName() + "."),
true);
if (args.length == 1)
help(caller);

View File

@ -361,7 +361,7 @@ public class ClansGame extends MiniPlugin
{
if (_clans.getWarManager().isBeingBesiegedBy(_clans.getClanUtility().getOwner(event.getBlock().getLocation()), _clans.getClan(event.getPlayer())))
{
if (event.getBlock().getType() == Material.CHEST)
if (event.getBlock().getType() == Material.CHEST || event.getBlock().getType() == Material.DISPENSER || event.getBlock().getType() == Material.DROPPER || event.getBlock().getType() == Material.FURNACE || event.getBlock().getType() == Material.BURNING_FURNACE)
{
return;
}
@ -404,7 +404,7 @@ public class ClansGame extends MiniPlugin
@EventHandler
public void respawn(PlayerRespawnEvent event)
{
//_clans.getItemMapManager().setMap(event.getPlayer());
_clans.getItemMapManager().setMap(event.getPlayer());
}
@EventHandler(priority = EventPriority.LOW)
@ -449,7 +449,7 @@ public class ClansGame extends MiniPlugin
{
if (_clans.getWarManager().isBeingBesiegedBy(_clans.getClanUtility().getOwner(loc), _clans.getClan(player)))
{
if (loc.getBlock().getType() == Material.CHEST)
if (loc.getBlock().getType() == Material.CHEST || loc.getBlock().getType() == Material.DISPENSER || loc.getBlock().getType() == Material.DROPPER || loc.getBlock().getType() == Material.FURNACE || loc.getBlock().getType() == Material.BURNING_FURNACE)
{
return;
}

View File

@ -103,6 +103,7 @@ import mineplex.game.clans.clans.commands.ClansAllyChatCommand;
import mineplex.game.clans.clans.commands.ClansChatCommand;
import mineplex.game.clans.clans.commands.ClansCommand;
import mineplex.game.clans.clans.commands.KillCommand;
import mineplex.game.clans.clans.commands.MapCommand;
import mineplex.game.clans.clans.commands.RegionsCommand;
import mineplex.game.clans.clans.commands.SpeedCommand;
import mineplex.game.clans.clans.data.PlayerClan;
@ -110,6 +111,7 @@ import mineplex.game.clans.clans.event.ClansPlayerDeathEvent;
import mineplex.game.clans.clans.gui.ClanShop;
import mineplex.game.clans.clans.invsee.InvseeManager;
import mineplex.game.clans.clans.loot.LootManager;
import mineplex.game.clans.clans.map.ItemMapManager;
import mineplex.game.clans.clans.moderation.antialt.AltManager;
import mineplex.game.clans.clans.mounts.MountManager;
import mineplex.game.clans.clans.nameblacklist.ClansBlacklist;
@ -242,7 +244,7 @@ public class ClansManager extends MiniClientPlugin<ClientClan> implements IRelat
private ProjectileManager _projectileManager;
private WorldEventManager _worldEvent;
private Chat _chat;
// private ItemMapManager _itemMapManager;
private ItemMapManager _itemMapManager;
private DisguiseManager _disguiseManager;
private NpcManager _npcManager;
private Explosion _explosion;
@ -328,7 +330,7 @@ public class ClansManager extends MiniClientPlugin<ClientClan> implements IRelat
_clanGame = new ClansGame(plugin, this);
_clanUtility = new ClansUtility(this);
_tutorial = new TutorialManager(plugin, clientManager, donationManager, chat, hologramManager, this, _npcManager, _taskManager);
// _itemMapManager = new ItemMapManager(this, _tutorial, _worldEvent);
_itemMapManager = new ItemMapManager(this, _tutorial, _worldEvent);
new TntGeneratorManager(plugin, this);
new SupplyDropManager(plugin);
@ -442,6 +444,7 @@ public class ClansManager extends MiniClientPlugin<ClientClan> implements IRelat
_scoreboard = new ClansScoreboardManager(plugin, this, _warManager, _worldEvent, _tutorial, clientManager, donationManager);
_clanDataAccess = new ClansDataAccessLayer(this, _scoreboard);
new HelmetPacketManager();
_bannerManager = new BannerManager(plugin);
_goldManager = new GoldManager(this, _clientManager, donationManager, _clanDataAccess);
@ -566,7 +569,7 @@ public class ClansManager extends MiniClientPlugin<ClientClan> implements IRelat
addCommand(new RegionsCommand(this));
addCommand(new ClansChatCommand(this));
addCommand(new ClansAllyChatCommand(this));
// addCommand(new MapCommand(this));
addCommand(new MapCommand(this));
addCommand(new SpeedCommand(this));
addCommand(new KillCommand(this));
}
@ -635,10 +638,10 @@ public class ClansManager extends MiniClientPlugin<ClientClan> implements IRelat
return _inventoryManager;
}
// public ItemMapManager getItemMapManager()
// {
// return _itemMapManager;
// }
public ItemMapManager getItemMapManager()
{
return _itemMapManager;
}
public Explosion getExplosion()
{

View File

@ -977,11 +977,18 @@ public class ClansUtility
}
ClansPlayer self = clan.getMembers().get(caller.getUniqueId());
if (self.getRole().ordinal() < ClanRole.ADMIN.ordinal())
{
UtilPlayer.message(caller, F.main("Clans", "Only Clan Admins and Leaders can promote others."));
return;
}
ClansPlayer target = clan.getClansPlayerFromName(other);
if (target == null) return;
if (target.equals(caller.getName()))
if (target.getPlayerName().equals(caller.getName()))
{
UtilPlayer.message(caller, F.main("Clans", "You cannot promote yourself."));
return;
@ -1029,11 +1036,18 @@ public class ClansUtility
}
ClansPlayer self = clan.getMembers().get(caller.getUniqueId());
if (self.getRole().ordinal() < ClanRole.ADMIN.ordinal())
{
UtilPlayer.message(caller, F.main("Clans", "Only Clan Admins and Leaders can demote others."));
return;
}
ClansPlayer target = clan.getClansPlayerFromName(other);
if (target == null) return;
if (target.equals(caller.getName()))
if (target.getPlayerName().equals(caller.getName()))
{
UtilPlayer.message(caller, F.main("Clans", "You cannot demote yourself."));
return;

View File

@ -0,0 +1,124 @@
package mineplex.game.clans.clans;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.packethandler.IPacketHandler;
import net.minecraft.server.v1_8_R3.PacketPlayOutEntityEquipment;
import net.minecraft.server.v1_8_R3.PacketPlayOutSetSlot;
/**
* Handler for custom helmet display packets
*/
public class HelmetPacketManager implements Listener
{
private static final net.minecraft.server.v1_8_R3.ItemStack MELON = CraftItemStack.asNMSCopy(new ItemStack(Material.MELON_BLOCK));
private Field _itemField;
private static HelmetPacketManager Instance;
private final Map<Player, IPacketHandler> _handlers = new HashMap<>();
public HelmetPacketManager()
{
try
{
_itemField = PacketPlayOutSetSlot.class.getDeclaredField("c");
_itemField.setAccessible(true);
Bukkit.getPluginManager().registerEvents(this, ClansManager.getInstance().getPlugin());
}
catch (Exception e)
{
e.printStackTrace();
}
Instance = this;
}
/**
* Fetches the registered loaded instance of this class
* @return The loaded instance of this class
*/
public static HelmetPacketManager getInstance()
{
return Instance;
}
/**
* Sends a player helmet update to all other players
* @param player The player to update for
* @param banner The helmet to display, or null to show the player's actual helmet
*/
public void refreshToAll(Player player, ItemStack item)
{
ItemStack show = item;
if (show == null)
{
show = new ItemStack(Material.AIR);
if (player.getInventory().getHelmet() != null)
{
show = player.getInventory().getHelmet();
}
}
for (Player refresh : Bukkit.getOnlinePlayers())
{
UtilPlayer.sendPacket(refresh, new PacketPlayOutEntityEquipment(player.getEntityId(), 4, CraftItemStack.asNMSCopy(item)));
}
}
@EventHandler
public void onJoin(PlayerJoinEvent event)
{
Player player = event.getPlayer();
IPacketHandler helmetHandler = (packetInfo) ->
{
if (packetInfo.getPacket() instanceof PacketPlayOutEntityEquipment)
{
PacketPlayOutEntityEquipment equip = (PacketPlayOutEntityEquipment) packetInfo.getPacket();
if (equip.a == player.getEntityId() && equip.b == 4)
{
ItemStack banner = UtilEnt.GetMetadata(player, "HelmetPacket.Banner");
boolean melon = UtilEnt.hasFlag(player.getVehicle(), "HelmetPacket.RiderMelon");
if (banner != null)
{
equip.c = CraftItemStack.asNMSCopy(banner);
return;
}
if (melon)
{
equip.c = MELON;
return;
}
}
}
};
_handlers.put(event.getPlayer(), helmetHandler);
ClansManager.getInstance().getPacketHandler().addPacketHandler(helmetHandler, PacketPlayOutEntityEquipment.class);
}
@EventHandler
public void onQuit(PlayerQuitEvent event)
{
if (_handlers.containsKey(event.getPlayer()))
{
ClansManager.getInstance().getPacketHandler().removePacketHandler(_handlers.remove(event.getPlayer()));
}
}
}

View File

@ -3,8 +3,6 @@ package mineplex.game.clans.clans.banners;
import java.util.HashMap;
import java.util.Map;
import net.minecraft.server.v1_8_R3.MinecraftServer;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Banner;
@ -36,6 +34,7 @@ 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 net.minecraft.server.v1_8_R3.MinecraftServer;
/**
* Manager class for cosmetic clans banners
@ -57,7 +56,6 @@ public class BannerManager extends MiniPlugin
super("Clan Banners", plugin);
_repo = new BannerRepository(plugin, this);
new BannerPacketManager();
addCommand(new BannerCommand(this));
generatePermissions();

View File

@ -1,113 +0,0 @@
package mineplex.game.clans.clans.banners;
import java.lang.reflect.Field;
import java.util.HashMap;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.packethandler.IPacketHandler;
import mineplex.core.packethandler.PacketInfo;
import mineplex.game.clans.clans.ClansManager;
import net.minecraft.server.v1_8_R3.PacketPlayOutEntityEquipment;
import net.minecraft.server.v1_8_R3.PacketPlayOutSetSlot;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.inventory.ItemStack;
/**
* Handler for banner wearing packets
*/
public class BannerPacketManager implements Listener
{
private Field _itemField;
private static BannerPacketManager Instance;
private final HashMap<Player, IPacketHandler> _wearing = new HashMap<>();
public BannerPacketManager()
{
try
{
_itemField = PacketPlayOutSetSlot.class.getDeclaredField("c");
_itemField.setAccessible(true);
Bukkit.getPluginManager().registerEvents(this, ClansManager.getInstance().getPlugin());
}
catch (Exception e)
{
e.printStackTrace();
}
Instance = this;
}
/**
* Fetches the registered loaded instance of this class
* @return The loaded instance of this class
*/
public static BannerPacketManager getInstance()
{
return Instance;
}
/**
* Toggles a player wearing their clan's banner
* @param player The player to toggle for
* @param banner The banner to toggle
*/
public void toggleBanner(Player player, ItemStack banner)
{
if (_wearing.containsKey(player))
{
IPacketHandler bannerHandler = _wearing.remove(player);
ClansManager.getInstance().getPacketHandler().removePacketHandler(bannerHandler);
for (Player refresh : Bukkit.getOnlinePlayers())
{
ItemStack helmet = new ItemStack(Material.AIR);
if (player.getInventory().getHelmet() != null)
{
helmet = player.getInventory().getHelmet();
}
UtilPlayer.sendPacket(refresh, new PacketPlayOutEntityEquipment(player.getEntityId(), 4, CraftItemStack.asNMSCopy(helmet)));
}
}
else
{
IPacketHandler bannerHandler = new IPacketHandler()
{
@Override
public void handle(PacketInfo packetInfo)
{
if (packetInfo.getPacket() instanceof PacketPlayOutEntityEquipment)
{
PacketPlayOutEntityEquipment equip = (PacketPlayOutEntityEquipment) packetInfo.getPacket();
if (equip.a == player.getEntityId() && equip.b == 4)
{
equip.c = CraftItemStack.asNMSCopy(banner);
}
}
}
};
_wearing.put(player, bannerHandler);
ClansManager.getInstance().getPacketHandler().addPacketHandler(bannerHandler, PacketPlayOutEntityEquipment.class);
for (Player refresh : Bukkit.getOnlinePlayers())
{
UtilPlayer.sendPacket(refresh, new PacketPlayOutEntityEquipment(player.getEntityId(), 4, CraftItemStack.asNMSCopy(banner)));
}
}
}
@EventHandler
public void onQuit(PlayerQuitEvent event)
{
if (_wearing.containsKey(event.getPlayer()))
{
ClansManager.getInstance().getPacketHandler().removePacketHandler(_wearing.remove(event.getPlayer()));
}
}
}

View File

@ -4,11 +4,12 @@ import java.util.Arrays;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.itemstack.ItemBuilder;
import mineplex.game.clans.clans.ClanRole;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.banners.BannerPacketManager;
import mineplex.game.clans.clans.HelmetPacketManager;
import mineplex.game.clans.clans.banners.ClanBanner;
import mineplex.game.clans.clans.banners.gui.BannerGUI;
import mineplex.game.clans.clans.banners.gui.overview.OverviewGUI;
@ -59,8 +60,19 @@ public class NonEditOverviewGUI extends BannerGUI
{
if (type == ClickType.LEFT)
{
BannerPacketManager.getInstance().toggleBanner(getViewer(), _banner.getBanner());
UtilPlayer.message(getViewer(), F.main("Clan Banners", "You have toggled your banner!"));
if (UtilEnt.GetMetadata(getViewer(), "HelmetPacket.Banner") != null)
{
UtilEnt.removeMetadata(getViewer(), "HelmetPacket.Banner");
HelmetPacketManager.getInstance().refreshToAll(getViewer(), null);
UtilPlayer.message(getViewer(), F.main("Clan Banners", "You have removed your banner!"));
}
else
{
ItemStack banner = _banner.getBanner();
UtilEnt.SetMetadata(getViewer(), "HelmetPacket.Banner", banner);
HelmetPacketManager.getInstance().refreshToAll(getViewer(), banner);
UtilPlayer.message(getViewer(), F.main("Clan Banners", "You have donned your banner!"));
}
}
else if (type == ClickType.RIGHT)
{

View File

@ -19,11 +19,10 @@ import mineplex.core.Managers;
import mineplex.core.MiniPlugin;
import mineplex.core.common.util.C;
import mineplex.core.itemstack.ItemBuilder;
import mineplex.game.clans.clans.boxes.extra.BuilderBoxInventory;
import mineplex.game.clans.clans.boxes.extra.BuilderBox;
public class BoxManager extends MiniPlugin
{
private final BuilderBoxInventory _builderBox;
private final BoxShop _shop;
public BoxManager(JavaPlugin plugin)
@ -31,8 +30,6 @@ public class BoxManager extends MiniPlugin
super("Box Manager", plugin);
_shop = new BoxShop(this);
_builderBox = new BuilderBoxInventory();
}
public void openDyePage(Player player)
@ -163,7 +160,7 @@ public class BoxManager extends MiniPlugin
public static enum BoxType
{
BUILDER_BOX("Clans Builder Box", C.cGold + "Builder's Box", Material.GLOWSTONE, Managers.get(BoxManager.class)._builderBox::open),
BUILDER_BOX("Clans Builder Box", C.cGold + "Builder's Box", Material.GLOWSTONE, BuilderBox::open),
@SuppressWarnings("deprecation")
DYE_BOX(null, C.cGreen + "Dye Box", Material.INK_SACK, DyeColor.RED.getDyeData(), Managers.get(BoxManager.class)::openDyePage),
;

View File

@ -0,0 +1,106 @@
package mineplex.game.clans.clans.boxes.extra;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import mineplex.core.common.Pair;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.itemstack.ItemBuilder;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.boxes.BoxManager.BoxType;
public class BuilderBox
{
private static final Map<Pair<Material, Byte>, ItemStack> REPLACEMENT_ITEMS;
static
{
Map<Pair<Material, Byte>, ItemStack> replacements = new HashMap<>();
replacements.put(Pair.create(Material.STONE, (byte)0), new ItemStack(Material.STAINED_CLAY));
replacements.put(Pair.create(Material.GLASS, (byte)0), new ItemStack(Material.STAINED_GLASS));
replacements.put(Pair.create(Material.THIN_GLASS, (byte)0), new ItemStack(Material.STAINED_GLASS_PANE));
replacements.put(Pair.create(Material.WOOL, (byte)0), new ItemStack(Material.WOOL));
replacements.put(Pair.create(Material.CARPET, (byte)0), new ItemStack(Material.CARPET));
replacements.put(Pair.create(Material.RED_ROSE, (byte)0), new ItemStack(Material.RED_ROSE));
replacements.put(Pair.create(Material.RED_ROSE, (byte)1), new ItemStack(Material.RED_ROSE));
replacements.put(Pair.create(Material.RED_ROSE, (byte)2), new ItemStack(Material.RED_ROSE));
replacements.put(Pair.create(Material.RED_ROSE, (byte)3), new ItemStack(Material.RED_ROSE));
replacements.put(Pair.create(Material.RED_ROSE, (byte)4), new ItemStack(Material.RED_ROSE));
replacements.put(Pair.create(Material.RED_ROSE, (byte)5), new ItemStack(Material.RED_ROSE));
replacements.put(Pair.create(Material.RED_ROSE, (byte)6), new ItemStack(Material.RED_ROSE));
replacements.put(Pair.create(Material.RED_ROSE, (byte)7), new ItemStack(Material.RED_ROSE));
replacements.put(Pair.create(Material.RED_ROSE, (byte)8), new ItemStack(Material.RED_ROSE));
replacements.put(Pair.create(Material.COBBLE_WALL, (byte)0), new ItemStack(Material.COBBLE_WALL));
replacements.put(Pair.create(Material.JACK_O_LANTERN, (byte)0), new ItemStack(Material.GLOWSTONE));
replacements.put(Pair.create(Material.SMOOTH_BRICK, (byte)0), new ItemStack(Material.SMOOTH_BRICK));
REPLACEMENT_ITEMS = Collections.unmodifiableMap(replacements);
}
@SuppressWarnings("deprecation")
private static ItemStack convert(ItemStack old)
{
if (old == null)
{
return null;
}
Pair<Material, Byte> pair = Pair.create(old.getType(), old.getData().getData());
if (!REPLACEMENT_ITEMS.containsKey(pair))
{
return null;
}
ItemBuilder after = new ItemBuilder(REPLACEMENT_ITEMS.get(pair));
if (after.getType() == Material.RED_ROSE)
{
after.setData((short)UtilMath.r(9));
}
else if (after.getType() == Material.COBBLE_WALL)
{
after.setData((short)1);
}
else if (after.getType() == Material.GLOWSTONE)
{
after.setData((short)0);
}
else if (after.getType() == Material.SMOOTH_BRICK)
{
after.setData(UtilMath.randomElement(new Short[] {1, 3}));
}
else
{
after.setData(UtilMath.randomElement(DyeColor.values()).getWoolData());
}
after.setAmount(old.getAmount());
return after.build();
}
public static void open(Player player)
{
boolean used = false;
for (int i = 0; i < player.getInventory().getSize(); i++)
{
ItemStack converted = convert(player.getInventory().getItem(i));
if (converted == null)
{
continue;
}
used = true;
player.getInventory().setItem(i, converted);
}
if (used)
{
ClansManager.getInstance().getInventoryManager().addItemToInventory(player, BoxType.BUILDER_BOX.getItemName(), -1);
UtilPlayer.message(player, F.main("Builder's Box", "You have redeemed your box contents!"));
}
}
}

View File

@ -1,171 +0,0 @@
package mineplex.game.clans.clans.boxes.extra;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import org.bukkit.Bukkit;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryView;
import org.bukkit.inventory.ItemStack;
import mineplex.core.common.Pair;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.itemstack.ItemBuilder;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.boxes.BoxManager.BoxType;
public class BuilderBoxInventory implements Listener
{
private Map<Pair<Material, Byte>, ItemStack> _replace = new HashMap<>();
public BuilderBoxInventory()
{
_replace.put(Pair.create(Material.STONE, (byte)0), new ItemStack(Material.STAINED_CLAY));
_replace.put(Pair.create(Material.GLASS, (byte)0), new ItemStack(Material.STAINED_GLASS));
_replace.put(Pair.create(Material.THIN_GLASS, (byte)0), new ItemStack(Material.STAINED_GLASS_PANE));
_replace.put(Pair.create(Material.WOOL, (byte)0), new ItemStack(Material.WOOL));
_replace.put(Pair.create(Material.CARPET, (byte)0), new ItemStack(Material.CARPET));
_replace.put(Pair.create(Material.RED_ROSE, (byte)0), new ItemStack(Material.RED_ROSE));
_replace.put(Pair.create(Material.RED_ROSE, (byte)1), new ItemStack(Material.RED_ROSE));
_replace.put(Pair.create(Material.RED_ROSE, (byte)2), new ItemStack(Material.RED_ROSE));
_replace.put(Pair.create(Material.RED_ROSE, (byte)3), new ItemStack(Material.RED_ROSE));
_replace.put(Pair.create(Material.RED_ROSE, (byte)4), new ItemStack(Material.RED_ROSE));
_replace.put(Pair.create(Material.RED_ROSE, (byte)5), new ItemStack(Material.RED_ROSE));
_replace.put(Pair.create(Material.RED_ROSE, (byte)6), new ItemStack(Material.RED_ROSE));
_replace.put(Pair.create(Material.RED_ROSE, (byte)7), new ItemStack(Material.RED_ROSE));
_replace.put(Pair.create(Material.RED_ROSE, (byte)8), new ItemStack(Material.RED_ROSE));
_replace.put(Pair.create(Material.COBBLE_WALL, (byte)0), new ItemStack(Material.COBBLE_WALL));
_replace.put(Pair.create(Material.JACK_O_LANTERN, (byte)0), new ItemStack(Material.GLOWSTONE));
_replace.put(Pair.create(Material.SMOOTH_BRICK, (byte)0), new ItemStack(Material.SMOOTH_BRICK));
UtilServer.RegisterEvents(this);
}
@SuppressWarnings("deprecation")
private Pair<ItemStack, Boolean> convert(ItemStack old)
{
if (old == null)
{
return Pair.create(old, false);
}
Pair<Material, Byte> pair = Pair.create(old.getType(), old.getData().getData());
if (!_replace.containsKey(pair))
{
return Pair.create(old, false);
}
ItemBuilder after = new ItemBuilder(_replace.get(pair));
if (after.getType() == Material.RED_ROSE)
{
after.setData((short)UtilMath.r(9));
}
else if (after.getType() == Material.COBBLE_WALL)
{
after.setData((short)1);
}
else if (after.getType() == Material.GLOWSTONE)
{
after.setData((short)0);
}
else if (after.getType() == Material.SMOOTH_BRICK)
{
after.setData(UtilMath.randomElement(new Short[] {1, 3}).shortValue());
}
else
{
after.setData(UtilMath.randomElement(DyeColor.values()).getWoolData());
}
after.setAmount(old.getAmount());
return Pair.create(after.build(), true);
}
@SuppressWarnings("deprecation")
public void open(Player player)
{
Inventory newInv = Bukkit.createInventory(player, 27, "Builder's Box");
ItemStack border = new ItemBuilder(Material.STAINED_GLASS_PANE).setData((short)DyeColor.GRAY.getWoolData()).setTitle(C.cRed + " ").build();
ItemStack button = new ItemBuilder(Material.STAINED_GLASS_PANE).setData((short)DyeColor.LIME.getWoolData()).setTitle(C.cGreenB + "Convert").build();
for (int i = 0; i < 27; i++)
{
if (i == 22)
{
newInv.setItem(i, button);
continue;
}
if (i < 9 || i > 17)
{
newInv.setItem(i, border);
}
}
player.openInventory(newInv);
}
@EventHandler
public void onClose(InventoryCloseEvent event)
{
InventoryView view = event.getView();
if (view.getTopInventory() != null)
{
Inventory top = view.getTopInventory();
if (top.getTitle().equals("Builder's Box"))
{
List<ItemStack> items = new ArrayList<>();
for (int i = 9; i < 18; i++)
{
items.add(top.getItem(i));
}
if (items != null && !items.isEmpty());
{
int totalChanged = 0;
for (Pair<ItemStack, Boolean> pair : items.stream().map(this::convert).collect(Collectors.toList()))
{
if (pair.getLeft() == null)
{
continue;
}
if (pair.getRight())
{
totalChanged++;
}
event.getPlayer().getInventory().addItem(pair.getLeft());
}
if (totalChanged > 0)
{
ClansManager.getInstance().getInventoryManager().addItemToInventory((Player)event.getPlayer(), BoxType.BUILDER_BOX.getItemName(), -1);
UtilPlayer.message(event.getPlayer(), F.main("Builder's Box", "You have redeemed your box contents!"));
}
}
}
}
}
@EventHandler
public void onClick(InventoryClickEvent event)
{
if (event.getClickedInventory() != null && event.getClickedInventory().getTitle().equals("Builder's Box"))
{
if (event.getSlot() < 9 || event.getSlot() > 17)
{
event.setCancelled(true);
}
if (event.getSlot() == 22)
{
event.getWhoClicked().closeInventory();
}
}
}
}

View File

@ -1,18 +1,25 @@
package mineplex.game.clans.clans.cash;
import java.lang.reflect.Field;
import java.util.Arrays;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.inventory.Inventory;
import mineplex.core.Managers;
import mineplex.core.common.skin.SkinData;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.LineFormat;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilText;
import mineplex.core.inventory.ClientInventory;
import mineplex.core.itemstack.ItemBuilder;
import mineplex.core.shop.confirmation.ConfirmationCallback;
import mineplex.core.shop.confirmation.ConfirmationPage;
import mineplex.core.shop.confirmation.ConfirmationProcessor;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.amplifiers.AmplifierGUI;
@ -83,8 +90,35 @@ public class CashOverviewPage extends ShopPageBase<CashShopManager, CashShop>
{
return;
}
player.closeInventory();
BoxType.BUILDER_BOX.onUse(player);
getShop().openPageForPlayer(player, new ConfirmationPage<>(player, this, new ConfirmationProcessor()
{
@Override
public void init(Inventory inventory)
{
try
{
Field returnPage = ConfirmationPage.class.getDeclaredField("_returnPage");
returnPage.setAccessible(true);
returnPage.set(inventory, null);
returnPage.setAccessible(false);
}
catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e)
{
e.printStackTrace();
}
}
@Override
public void process(ConfirmationCallback callback)
{
BoxType.BUILDER_BOX.onUse(player);
callback.resolve("Opening Builder's Box...");
}
}, SkinData.CLANS_BUILDERS_BOX.getSkull(C.cRed + "Open Builder's Box", UtilText.splitLines(new String[]
{
C.cRed,
C.cRedB + "WARNING: " + C.cWhite + "This will convert all applicable items in your inventory!"
}, LineFormat.LORE)), "Confirm Opening Box"));
});
addButton(SUPPLY_BUTTON_SLOT, SkinData.CLANS_GILDED_SUPPLY_DROP.getSkull(C.cRed + "Supply Drop", Arrays.asList(
C.cYellow + "Call down Supply Drops to obtain",

View File

@ -123,9 +123,6 @@ public class ClansCommand extends CommandBase<ClansManager>
* else if (args[0].equalsIgnoreCase("enemy") || args[0].equals("e"))
* enemy(caller, args);
*/
else if (args[0].equalsIgnoreCase("territory") || args[0].equalsIgnoreCase("t"))
infoTerritory(caller, args);
else if (args[0].equalsIgnoreCase("who") || args[0].equalsIgnoreCase("w"))
{
@ -1195,33 +1192,4 @@ public class ClansCommand extends CommandBase<ClansManager>
_clansManager.getClanShop().openClanWho(caller, clan);
}
public void infoTerritory(Player caller, String[] args)
{
ClanInfo clan;
if (args.length < 2)
{
clan = Plugin.getClanUtility().getClanByPlayer(caller);
if (clan == null)
{
UtilPlayer.message(caller, F.main("Clans", "You are not in a Clan."));
return;
}
}
else
clan = Plugin.getClanUtility().searchClan(caller, args[1], true);
if (clan == null) return;
if (_clansManager.getNetherManager().isInNether(caller))
{
_clansManager.message(caller, "You are currently in " + F.clansNether("The Nether") + ".");
return;
}
UtilPlayer.message(caller, clan.mTerritory());
}
}

View File

@ -15,6 +15,6 @@ public class MapCommand extends CommandBase<ClansManager>
@Override
public void Execute(Player caller, String[] args)
{
//Plugin.getItemMapManager().setMap(caller);
Plugin.getItemMapManager().setMap(caller);
}
}

View File

@ -77,7 +77,6 @@ public class ClansFreezeManager extends MiniPlugin
private void generatePermissions()
{
PermissionGroup.CMOD.setPermission(Perm.FREEZE_COMMAND, false, true);
PermissionGroup.CMA.setPermission(Perm.FREEZE_COMMAND, false, true);
PermissionGroup.ADMIN.setPermission(Perm.FREEZE_COMMAND, true, true);

View File

@ -16,6 +16,10 @@ import com.mojang.authlib.GameProfile;
import mineplex.core.command.CommandBase;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.slack.SlackAPI;
import mineplex.core.slack.SlackMessage;
import mineplex.core.slack.SlackTeam;
import mineplex.game.clans.clans.invsee.InvseeManager;
public class InvseeCommand extends CommandBase<InvseeManager>
@ -89,7 +93,10 @@ public class InvseeCommand extends CommandBase<InvseeManager>
UtilPlayer.message(caller, F.main("Invsee", "You cannot use invsee right now. That person is currently using invsee!"));
return;
}
SlackAPI.getInstance().sendMessage(SlackTeam.DEVELOPER, "#clans-commandspy",
new SlackMessage("Clans Command Logger", "crossed_swords", caller.getName() + " has started to invsee " + exactPlayer.getName() + " on " + UtilServer.getServerName() + "."),
true);
Plugin.doInvsee(exactPlayer, caller);
}
}

View File

@ -175,53 +175,53 @@ public class LootManager
private void populateCapturePoint()
{
// Food
_capturePointSet.add(5, new ItemLoot(Material.CARROT, 1, 5));
_capturePointSet.add(5, new ItemLoot(Material.APPLE, 1, 3));
_capturePointSet.add(5, new ItemLoot(Material.COOKED_BEEF, 1, 3));
_capturePointSet.add(5, new ItemLoot(Material.RAW_BEEF, 1, 4));
_capturePointSet.add(5, new ItemLoot(Material.POTATO_ITEM, 1, 5));
_capturePointSet.add(5, new ItemLoot(Material.CARROT, 32, 32));
_capturePointSet.add(5, new ItemLoot(Material.APPLE, 32, 32));
_capturePointSet.add(5, new ItemLoot(Material.COOKED_BEEF, 32, 32));
_capturePointSet.add(5, new ItemLoot(Material.RAW_BEEF, 32, 32));
_capturePointSet.add(5, new ItemLoot(Material.POTATO_ITEM, 32, 32));
// Armor
_capturePointSet.add(3, new ItemLoot(Material.IRON_HELMET, 1, 1));
_capturePointSet.add(3, new ItemLoot(Material.IRON_CHESTPLATE, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.IRON_LEGGINGS, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.IRON_BOOTS, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.GOLD_HELMET, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.GOLD_CHESTPLATE, 1, 1));
_capturePointSet.add(3, new ItemLoot(Material.GOLD_HELMET, 1, 1));
_capturePointSet.add(3, new ItemLoot(Material.GOLD_CHESTPLATE, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.GOLD_LEGGINGS, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.GOLD_BOOTS, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.LEATHER_HELMET, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.LEATHER_CHESTPLATE, 1, 1));
_capturePointSet.add(3, new ItemLoot(Material.LEATHER_HELMET, 1, 1));
_capturePointSet.add(3, new ItemLoot(Material.LEATHER_CHESTPLATE, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.LEATHER_LEGGINGS, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.LEATHER_BOOTS, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.DIAMOND_HELMET, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.DIAMOND_CHESTPLATE, 1, 1));
_capturePointSet.add(3, new ItemLoot(Material.DIAMOND_HELMET, 1, 1));
_capturePointSet.add(3, new ItemLoot(Material.DIAMOND_CHESTPLATE, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.DIAMOND_LEGGINGS, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.DIAMOND_BOOTS, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.CHAINMAIL_HELMET, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.CHAINMAIL_CHESTPLATE, 1, 1));
_capturePointSet.add(3, new ItemLoot(Material.CHAINMAIL_HELMET, 1, 1));
_capturePointSet.add(3, new ItemLoot(Material.CHAINMAIL_CHESTPLATE, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.CHAINMAIL_LEGGINGS, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.CHAINMAIL_BOOTS, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.IRON_AXE, 1, 1));
_capturePointSet.add(4, new ItemLoot(Material.IRON_SWORD, 1, 1));
_capturePointSet.add(3, new ItemLoot(Material.EMERALD, 10, 15));
_capturePointSet.add(2, new CustomItemLoot(Material.GOLD_SWORD, 1, 1, "Booster Sword"));
_capturePointSet.add(2, new CustomItemLoot(Material.GOLD_AXE, 1, 1, "Booster Axe"));
_capturePointSet.add(2, new CustomItemLoot(Material.DIAMOND_SWORD, 1, 1, "Power Sword"));
_capturePointSet.add(2, new CustomItemLoot(Material.DIAMOND_AXE, 1, 1, "Power Axe"));
_capturePointSet.add(4, new ItemLoot(Material.EMERALD, 10, 15));
_capturePointSet.add(3, new CustomItemLoot(Material.GOLD_SWORD, 1, 1, "Booster Sword"));
_capturePointSet.add(3, new CustomItemLoot(Material.GOLD_AXE, 1, 1, "Booster Axe"));
_capturePointSet.add(3, new CustomItemLoot(Material.DIAMOND_SWORD, 1, 1, "Power Sword"));
_capturePointSet.add(3, new CustomItemLoot(Material.DIAMOND_AXE, 1, 1, "Power Axe"));
// Gold
_capturePointSet.add(1, new GoldTokenLoot(50000, 50000));
_capturePointSet.add(1, new GoldTokenLoot(10000, 50000));
// Rune
_capturePointSet.add(1, new RuneLoot());
_capturePointSet.add(2, new RuneLoot());
}
public void dropCommon(Location location)

View File

@ -5,6 +5,7 @@ import java.util.function.Consumer;
import org.bukkit.ChatColor;
import org.bukkit.DyeColor;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftHorse;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.entity.EntityType;
@ -26,6 +27,7 @@ import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.particles.ColoredParticle;
import mineplex.core.common.util.particles.DustSpellColor;
import mineplex.core.disguise.disguises.DisguiseBase;
import mineplex.core.disguise.disguises.DisguiseBlock;
import mineplex.core.disguise.disguises.DisguiseCow;
import mineplex.core.disguise.disguises.DisguiseSheep;
import mineplex.core.itemstack.ItemBuilder;
@ -217,8 +219,9 @@ public class Mount
horse.getInventory().setArmor(new ItemBuilder(Material.IRON_BARDING).setTitle(C.cGoldB + "Knightly Armor").build());
}, horse ->
{
UtilParticle.PlayParticleToAll(ParticleType.ICON_CRACK.getParticle(Material.APPLE, 0), horse.getLocation().add(0, 1, 0),
0.25f, 0.25f, 0.25f, 0, 3, ViewDist.NORMAL);
ColoredParticle red = new ColoredParticle(UtilParticle.ParticleType.RED_DUST,
new DustSpellColor(java.awt.Color.RED), horse.getLocation().add(0, 1, 0));
red.display(3);
}, MountType.HORSE),
COW(8, "Clans Cow Mount Skin", C.cWhite + "Cow", Material.MILK_BUCKET, Color.WHITE, Variant.HORSE, Style.NONE, true, horse ->
{
@ -232,7 +235,36 @@ public class Mount
disguise.setName(horse.getCustomName());
ClansManager.getInstance().getDisguiseManager().disguise(disguise);
}, horse -> {}, MountType.HORSE),
TRUSTY_MULE(10, "Clans Trusty Mule Mount Skin", C.cBlue + "Trusty Mule", Material.APPLE, Color.BROWN, Variant.MULE, Style.NONE, false, horse -> {}, horse -> {}, MountType.DONKEY)
TRUSTY_MULE(10, "Clans Trusty Mule Mount Skin", C.cBlue + "Trusty Mule", Material.APPLE, Color.BROWN, Variant.MULE, Style.NONE, false, horse -> {}, horse -> {}, MountType.DONKEY),
CAKE(11, "Clans Cake Mount Skin", C.cPurple + "Cake", Material.CAKE, Color.WHITE, Variant.HORSE, Style.NONE, true, horse ->
{
DisguiseBlock disguise = new DisguiseBlock(horse, Material.CAKE_BLOCK, 0);
ClansManager.getInstance().getDisguiseManager().disguise(disguise);
}, horse ->
{
ColoredParticle red = new ColoredParticle(UtilParticle.ParticleType.RED_DUST,
new DustSpellColor(java.awt.Color.RED), horse.getLocation().add(0, 1, 0));
red.display(2);
ColoredParticle white = new ColoredParticle(UtilParticle.ParticleType.RED_DUST,
new DustSpellColor(java.awt.Color.WHITE), horse.getLocation().add(0, 1, 0));
white.display(3);
horse.getWorld().playSound(horse.getLocation(), Sound.EAT, 1, 1);
}, MountType.HORSE),
MELON(12, "Clans Power Melon Mount Skin", C.cGreen + "Power Melon", Material.MELON, Color.WHITE, Variant.HORSE, Style.NONE, true, horse ->
{
DisguiseBlock disguise = new DisguiseBlock(horse, Material.MELON_BLOCK, 0);
ClansManager.getInstance().getDisguiseManager().disguise(disguise);
UtilEnt.addFlag(horse, "HelmetPacket.RiderMelon");
}, horse ->
{
ColoredParticle red = new ColoredParticle(UtilParticle.ParticleType.RED_DUST,
new DustSpellColor(java.awt.Color.RED), horse.getLocation().add(0, 1, 0));
red.display(2);
ColoredParticle green = new ColoredParticle(UtilParticle.ParticleType.RED_DUST,
new DustSpellColor(java.awt.Color.GREEN), horse.getLocation().add(0, 1, 0));
green.display(3);
}, MountType.HORSE),
;
private final int _id;

View File

@ -11,6 +11,7 @@ import java.util.UUID;
import java.util.WeakHashMap;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftHorse;
import org.bukkit.entity.Entity;
@ -27,6 +28,7 @@ import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.world.ChunkUnloadEvent;
import org.bukkit.inventory.HorseInventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import org.spigotmc.event.entity.EntityDismountEvent;
@ -49,6 +51,7 @@ 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.HelmetPacketManager;
import mineplex.game.clans.clans.mounts.Mount.MountType;
import mineplex.game.clans.clans.mounts.Mount.SkinType;
import mineplex.game.clans.clans.mounts.gui.MountShop;
@ -185,7 +188,6 @@ public class MountManager extends MiniDbClientPlugin<MountOwnerData>
private void generatePermissions()
{
PermissionGroup.PLAYER.setPermission(Perm.MOUNT_COMMAND, true, true);
PermissionGroup.ADMIN.setPermission(Perm.GIVE_MOUNT_COMMAND, true, true);
PermissionGroup.ADMIN.setPermission(Perm.MOUNT_SKIN_UNLOCK, true, true);
@ -540,6 +542,10 @@ public class MountManager extends MiniDbClientPlugin<MountOwnerData>
}
if (mount.getOwner().getEntityId() == event.getPlayer().getEntityId())
{
if (UtilEnt.hasFlag(event.getRightClicked(), "HelmetPacket.RiderMelon"))
{
HelmetPacketManager.getInstance().refreshToAll(event.getPlayer(), new ItemStack(Material.MELON_BLOCK));
}
return;
}
@ -562,11 +568,16 @@ public class MountManager extends MiniDbClientPlugin<MountOwnerData>
@EventHandler
public void onDismount(EntityDismountEvent event)
{
if (_spawnedMounts.containsKey(event.getDismounted()) && event.getEntity() instanceof Player)
if (_spawnedMounts.containsKey(event.getEntity()) && event.getDismounted() instanceof Player)
{
Player player = (Player) event.getDismounted();
runSyncLater(() ->
{
event.getEntity().teleport(event.getDismounted());
player.teleport(event.getEntity());
if (UtilEnt.hasFlag(event.getEntity(), "HelmetPacket.RiderMelon"))
{
HelmetPacketManager.getInstance().refreshToAll(player, null);
}
}, 1L);
}
}

View File

@ -61,7 +61,7 @@ public class MountSkinPage extends ShopPageBase<MountManager, MountShop>
private ItemStack buildResetItem()
{
ItemBuilder builder = new ItemBuilder(Material.WATER_BUCKET);
ItemBuilder builder = new ItemBuilder(Material.PAPER);
builder.setTitle(C.cYellow + "Default Skin");
if (_token.Skin == null)

View File

@ -6,6 +6,9 @@ import mineplex.core.command.CommandBase;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.slack.SlackAPI;
import mineplex.core.slack.SlackMessage;
import mineplex.core.slack.SlackTeam;
import mineplex.game.clans.clans.nameblacklist.ClansBlacklist;
public class AddBlacklistCommand extends CommandBase<ClansBlacklist>
@ -30,6 +33,9 @@ public class AddBlacklistCommand extends CommandBase<ClansBlacklist>
{
Plugin.getRepository().add(blacklist, caller.getName());
UtilPlayer.message(caller, F.main("Clans", "Successfully added " + F.elem(blacklist) + " to the clan name blacklist."));
SlackAPI.getInstance().sendMessage(SlackTeam.DEVELOPER, "#clans-commandspy",
new SlackMessage("Clans Command Logger", "crossed_swords", caller.getName() + " has blacklisted the clan name " + blacklist + "."),
true);
});
}
else

View File

@ -41,6 +41,7 @@ import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTextMiddle;
import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilTime.TimeUnit;
@ -494,13 +495,10 @@ public class NetherManager extends MiniPlugin
}
}
// UtilServer.getPlayersCollection()
// .stream()
// .filter(player -> isInNether(player))
// .forEach(player ->
// {
// ClansManager.getInstance().getItemMapManager().removeMap(player);
// });
UtilServer.getPlayersCollection()
.stream()
.filter(player -> isInNether(player))
.forEach(player -> ClansManager.getInstance().getItemMapManager().removeMap(player));
}
}

View File

@ -64,6 +64,7 @@ public class ObserverManager extends MiniPlugin
UtilPlayer.clearInventory(player);
UtilPlayer.clearPotionEffects(player);
player.setGameMode(GameMode.CREATIVE);
ClansManager.getInstance().getGearManager().getPlayerGear(player).updateCache(true);
_observerMap.put(player, data);
}
@ -200,4 +201,4 @@ public class ObserverManager extends MiniPlugin
{
addCommand(new ObserverCommand(this));
}
}
}

View File

@ -3,17 +3,29 @@ package mineplex.game.clans.clans.pvptimer;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Collection;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.WeakHashMap;
import java.util.function.BiConsumer;
import java.util.function.Function;
import org.apache.commons.io.FileUtils;
import org.bukkit.Bukkit;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.entity.EntityShootBowEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.inventory.ItemStack;
import mineplex.core.MiniPlugin;
import mineplex.core.ReflectivelyCreateMiniPlugin;
@ -21,10 +33,20 @@ import mineplex.core.account.permissions.Permission;
import mineplex.core.account.permissions.PermissionGroup;
import mineplex.core.command.CommandBase;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilWorld;
import mineplex.core.recharge.Recharge;
import mineplex.core.slack.SlackAPI;
import mineplex.core.slack.SlackMessage;
import mineplex.core.slack.SlackTeam;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.core.repository.ClanTerritory;
import mineplex.minecraft.game.classcombat.Skill.event.SkillTriggerEvent;
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
@ -88,6 +110,9 @@ public class PvPTimerManager extends MiniPlugin
{
disableTimer(target, true, true);
UtilPlayer.message(caller, F.main(getName(), F.elem(target.getName()) + " no longer has a PvP Timer!"));
SlackAPI.getInstance().sendMessage(SlackTeam.DEVELOPER, "#clans-commandspy",
new SlackMessage("Clans Command Logger", "crossed_swords", caller.getName() + " has removed " + target.getName() + "'s PvP Timer on " + UtilServer.getServerName() + "."),
true);
}
else
{
@ -184,6 +209,35 @@ public class PvPTimerManager extends MiniPlugin
return false;
}
@SuppressWarnings("deprecation")
public boolean handleMining(Player player, Block block, boolean playSound)
{
if (!hasTimer(player))
{
return false;
}
block.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getTypeId());
Function<Collection<ItemStack>, ItemStack[]> converter = (collection) ->
{
ItemStack[] array = new ItemStack[collection.size()];
int i = 0;
for (ItemStack item : collection)
{
array[i++] = item;
}
return array;
};
BiConsumer<Integer, ItemStack> dropper = (integer, item) ->
{
block.getWorld().dropItemNaturally(block.getLocation().add(0.5, 0.3, 0.5), item);
};
Collection<ItemStack> drops = block.getDrops(player.getItemInHand());
player.getInventory().addItem(converter.apply(drops)).forEach(dropper);
block.setType(Material.AIR);
return true;
}
@EventHandler
public void onJoin(PlayerJoinEvent event)
{
@ -244,7 +298,7 @@ public class PvPTimerManager extends MiniPlugin
{
if (event.GetDamageePlayer() != null)
{
if (hasTimer(event.GetDamageePlayer()))
if (hasTimer(event.GetDamageePlayer()) && event.GetDamagerPlayer(true) != null)
{
UtilPlayer.message(event.GetDamagerPlayer(true), F.main(getName(), "You cannot harm " + F.elem(event.GetDamageePlayer().getName()) + "!"));
event.SetCancelled("PvP Timer");
@ -259,4 +313,66 @@ public class PvPTimerManager extends MiniPlugin
}
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onPickup(PlayerPickupItemEvent event)
{
if (hasTimer(event.getPlayer()))
{
event.setCancelled(true);
if (Recharge.Instance.use(event.getPlayer(), "PvP Timer Inform NoPickup", 5000, false, false))
{
UtilPlayer.message(event.getPlayer(), F.main(getName(), "You cannot pick up items whilst protected from PvP. Run " + F.elem("/pvp") + " to enable PvP!"));
}
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onBlockBreak(BlockBreakEvent event)
{
if (handleMining(event.getPlayer(), event.getBlock(), true))
{
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onEnter(PlayerMoveEvent event)
{
if (!hasTimer(event.getPlayer()) || UtilWorld.areChunksEqual(event.getFrom(), event.getTo()) || ClansManager.getInstance().getClanUtility().isAdmin(event.getTo()))
{
return;
}
ClanTerritory claimTo = ClansManager.getInstance().getClanUtility().getClaim(event.getTo());
ClanTerritory claimFrom = ClansManager.getInstance().getClanUtility().getClaim(event.getFrom());
if (claimTo != null)
{
if (claimFrom == null || !claimFrom.Owner.equals(claimTo.Owner))
{
UtilPlayer.message(event.getPlayer(), F.main(getName(), "You cannot enter claimed land whilst protected from PvP. Run " + F.elem("/pvp") + " to enable PvP!"));
UtilAction.velocity(event.getPlayer(), UtilAlg.getTrajectory(event.getTo(), event.getFrom()).multiply(4), 1.5, true, 0.8, 0, 1.0, true);
}
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onTeleportInto(PlayerTeleportEvent event)
{
if (!hasTimer(event.getPlayer()) || UtilWorld.areChunksEqual(event.getFrom(), event.getTo()) || ClansManager.getInstance().getClanUtility().isAdmin(event.getTo()))
{
return;
}
ClanTerritory claimTo = ClansManager.getInstance().getClanUtility().getClaim(event.getTo());
ClanTerritory claimFrom = ClansManager.getInstance().getClanUtility().getClaim(event.getFrom());
if (claimTo != null)
{
if (claimFrom == null || !claimFrom.Owner.equals(claimTo.Owner))
{
UtilPlayer.message(event.getPlayer(), F.main(getName(), "You cannot enter claimed land whilst protected from PvP. Run " + F.elem("/pvp") + " to enable PvP!"));
event.setCancelled(true);
}
}
}
}

View File

@ -73,7 +73,8 @@ public class SiegeManager extends MiniPlugin
getRepository().getWeaponsByServer(getClansManager().getServerId(), tokens ->
tokens.forEach(token ->
runSync(() -> {
runSync(() ->
{
final SiegeWeapon weapon;
token.Location.getChunk().load();
@ -102,7 +103,6 @@ public class SiegeManager extends MiniPlugin
private void generatePermissions()
{
PermissionGroup.ADMIN.setPermission(Perm.GIVE_CANNON_COMMAND, true, true);
}

View File

@ -24,6 +24,7 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.util.Vector;
import mineplex.core.common.Pair;
import mineplex.core.common.util.C;
import mineplex.core.common.util.ColorFader;
import mineplex.core.common.util.EnclosedObject;
@ -272,9 +273,13 @@ public class Outpost implements Listener
UtilTextMiddle.display("Siege", "Your Outpost has been destroyed", 20, 100, 20, _ownerClan.getOnlinePlayersArray());
if (getState() == OutpostState.AWAITING)
{
cleanup();
}
else
{
kill();
}
return;
}
@ -396,9 +401,13 @@ public class Outpost implements Listener
UtilTextMiddle.display("Siege", "Your Outpost has been destroyed", 20, 100, 20, _ownerClan.getOnlinePlayersArray());
if (getState() == OutpostState.AWAITING)
{
cleanup();
}
else
{
kill();
}
return;
}
@ -443,9 +452,13 @@ public class Outpost implements Listener
UtilTextMiddle.display("Siege", "Your Outpost has been destroyed", 20, 100, 20, _ownerClan.getOnlinePlayersArray());
if (getState() == OutpostState.AWAITING)
{
cleanup();
}
else
{
kill();
}
return;
}
@ -730,6 +743,11 @@ public class Outpost implements Listener
{
return UtilAlg.toBoundingBox(_startCorner, _endCorner);
}
public Pair<Location, Location> getBoundsBlockBreak()
{
return Pair.create(_startCorner.clone().subtract(0.5, 0, 0.5), _endCorner.clone());
}
public Location getExactMiddle()
{

View File

@ -210,7 +210,9 @@ public class OutpostManager extends MiniPlugin
public void onBlockFall(EntityChangeBlockEvent event)
{
if (event.getEntity().hasMetadata("ClansOutpost"))
{
event.setCancelled(true);
}
}
@EventHandler
@ -281,7 +283,8 @@ public class OutpostManager extends MiniPlugin
System.out.println("[OUTPOSTS] LOADING OUTPOSTS FROM DATABASE");
_repository.getOutpostsByServer(_clansManager.getServerId(), tokens ->
tokens.forEach(token -> {
tokens.forEach(token ->
{
Outpost outpost = new Outpost(this, token);
if ((System.currentTimeMillis() - token.TimeSpawned) > Outpost.MAX_LIFETIME)

View File

@ -359,7 +359,8 @@ public class Cannon extends SiegeWeapon
public void FindEntities()
{
Lists.newArrayList(_location.getWorld().getEntities())
.forEach(entity -> {
.forEach(entity ->
{
if (Integer.toString(_uniqueId).equals(entity.getCustomName()))
{
entity.remove();

View File

@ -38,6 +38,7 @@ import mineplex.core.common.util.NautArrayList;
import mineplex.core.common.util.NautHashMap;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilCollections;
import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilItem;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilPlayer;
@ -66,6 +67,7 @@ import mineplex.game.clans.items.legendaries.AlligatorsTooth;
import mineplex.game.clans.items.legendaries.DemonicScythe;
import mineplex.game.clans.items.legendaries.GiantsBroadsword;
import mineplex.game.clans.items.legendaries.HyperAxe;
import mineplex.game.clans.items.legendaries.KnightLance;
import mineplex.game.clans.items.legendaries.LegendaryItem;
import mineplex.game.clans.items.legendaries.MagneticMaul;
import mineplex.game.clans.items.legendaries.WindBlade;
@ -165,7 +167,8 @@ public abstract class SiegeWeapon implements Listener
_infoHologram = new Hologram(ClansManager.getInstance().getHologramManager(), _location.clone().add(.5, 3, .5), _name + " Health", getDisplayHealth());
_infoHologram.start();
_infoHologram.setInteraction((player, type) -> {
_infoHologram.setInteraction((player, type) ->
{
if (type.equals(ClickType.LEFT))
{
handleLeftClick(player);
@ -226,18 +229,22 @@ public abstract class SiegeWeapon implements Listener
return 1;
if (gear.getWeapon() != null && gear.getWeapon() instanceof LegendaryItem)
{
if (gear.getWeapon() instanceof AlligatorsTooth)
return 8;
else if (gear.getWeapon() instanceof GiantsBroadsword)
return 10;
else if (gear.getWeapon() instanceof HyperAxe)
return 3;
return 6;
else if (gear.getWeapon() instanceof MagneticMaul)
return 8;
else if (gear.getWeapon() instanceof WindBlade)
return 7;
else if (gear.getWeapon() instanceof DemonicScythe)
return 8;
else if (gear.getWeapon() instanceof KnightLance)
return 8;
}
return (int) UtilItem.getAttackDamage(stack.getType());
}
@ -407,7 +414,8 @@ public abstract class SiegeWeapon implements Listener
{
System.out.println("Killing: " + this.getClass().getSimpleName() + " [" + _uniqueId + "]");
_siegeManager.runSync(() -> {
_siegeManager.runSync(() ->
{
CustomCleanup();
_comprisedOf.forEach(Entity::remove);
@ -572,6 +580,7 @@ public abstract class SiegeWeapon implements Listener
entity.setCustomName(Integer.toString(_uniqueId));
entity.setCustomNameVisible(false);
entity.setMetadata("Creature.DoNotDrop", new FixedMetadataValue(_clans.getPlugin(), true));
UtilEnt.addFlag(entity, "LegendaryAbility.IgnoreMe");
_comprisedOf.add(entity);
@ -583,6 +592,7 @@ public abstract class SiegeWeapon implements Listener
Entity entity = _entityMapping.get(uniqueName);
entity.removeMetadata("Creature.DoNotDrop", _clans.getPlugin());
UtilEnt.removeFlag(entity, "LegendaryAbility.IgnoreMe");
_entityMapping.remove(uniqueName);
_comprisedOf.remove(entity);

View File

@ -274,7 +274,7 @@ public class SupplyDropManager extends MiniPlugin
{
ItemStack item = set.generateRandom().get();
items.add(set.generateRandom().get());
if (item.getType() == Material.RECORD_12)
if (item.getType() == Material.RABBIT_FOOT)
{
set.remove(gold);
}
@ -351,7 +351,7 @@ public class SupplyDropManager extends MiniPlugin
{
ItemStack item = set.generateRandom().get();
items.add(set.generateRandom().get());
if (item.getType() == Material.RECORD_12)
if (item.getType() == Material.RABBIT_FOOT)
{
if (++golds > 1)
{

View File

@ -12,12 +12,14 @@ import org.bukkit.util.Vector;
import mineplex.core.blockrestore.BlockRestore;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.disguise.DisguiseManager;
import mineplex.core.itemstack.ItemBuilder;
import mineplex.core.projectile.ProjectileManager;
import mineplex.core.recharge.Recharge;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.clans.ClansManager;
@ -79,6 +81,14 @@ public abstract class BossWorldEvent<T extends EventCreature<?>> extends WorldEv
{
for (Player player : UtilPlayer.getInRadius(from, TELEPORT_PAD_RANGE).keySet())
{
if (ClansManager.getInstance().hasTimer(player))
{
if (Recharge.Instance.use(player, "PvP Timer Inform NoBoss", 5000, false, false))
{
UtilPlayer.message(player, F.main(getName(), "You cannot enter a World Boss whilst protected from PvP. Run " + F.elem("/pvp") + " to enable PvP!"));
}
continue;
}
player.teleport(UtilMath.randomElement(_teleportTo));
for (ISkill skill : ClansManager.getInstance().getClassManager().Get(player).GetSkills())
{

View File

@ -28,6 +28,7 @@ import mineplex.core.common.util.UtilServer;
import mineplex.core.disguise.DisguiseManager;
import mineplex.core.itemstack.ItemBuilder;
import mineplex.core.projectile.ProjectileManager;
import mineplex.core.recharge.Recharge;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.core.utils.UtilScheduler;
@ -67,7 +68,6 @@ public class RaidManager extends MiniPlugin
private void generatePermissions()
{
PermissionGroup.ADMIN.setPermission(Perm.START_RAID_COMMAND, true, true);
}
@ -78,6 +78,20 @@ public class RaidManager extends MiniPlugin
_raids.clear();
}
private boolean isEligible(Player player)
{
if (ClansManager.getInstance().hasTimer(player))
{
if (Recharge.Instance.use(player, "PvP Timer Inform NoRaid", 5000, false, false))
{
UtilPlayer.message(player, F.main(getName(), "You cannot enter a Raid whilst protected from PvP. Run " + F.elem("/pvp") + " to enable PvP!"));
}
return false;
}
return true;
}
public DisguiseManager getDisguiseManager()
{
return ClansManager.getInstance().getDisguiseManager();
@ -129,6 +143,7 @@ public class RaidManager extends MiniPlugin
return false;
}
Set<Player> inside = UtilPlayer.getInRadius(player.getLocation(), 4).keySet();
inside.removeIf(this::isEligible);
if (inside.size() > MAX_PARTICIPANTS)
{
UtilPlayer.message(player, F.main(type.getRaidName() + " Raid", "You cannot start a raid with more than " + MAX_PARTICIPANTS + " participants!"));
@ -172,17 +187,14 @@ public class RaidManager extends MiniPlugin
@EventHandler
public void update(UpdateEvent event)
{
// if (event.getType() == UpdateType.TICK)
// {
// UtilServer.getPlayersCollection()
// .stream()
// .filter(player -> isInRaid(player.getLocation()))
// .forEach(player ->
// {
// ClansManager.getInstance().getItemMapManager().removeMap(player);
// });
// return;
// }
if (event.getType() == UpdateType.TICK)
{
UtilServer.getPlayersCollection()
.stream()
.filter(player -> isInRaid(player.getLocation()))
.forEach(player -> ClansManager.getInstance().getItemMapManager().removeMap(player));
return;
}
if (event.getType() != UpdateType.SEC)
{
return;

View File

@ -7,4 +7,4 @@ import org.bukkit.Material;
public class ClansCurrency
{
public static final Currency GOLD = new Currency("Gold", "Gold", C.cGold, Material.GOLD_NUGGET);
}
}

View File

@ -46,4 +46,4 @@ public class GemTransfer implements Data
return null;
}
}
}

View File

@ -158,7 +158,9 @@ public class GoldManager extends MiniDbClientPlugin<GoldData>
int pickupMapGold = goldAmount;
if (_playerPickupMap.containsKey(event.getPlayer()))
{
pickupMapGold += _playerPickupMap.get(event.getPlayer());
}
_playerPickupMap.put(event.getPlayer(), pickupMapGold);
}
@ -305,7 +307,7 @@ public class GoldManager extends MiniDbClientPlugin<GoldData>
final GoldToken token = new GoldToken(tokenValue);
deductGold(success ->
{
if (success.booleanValue())
if (success)
{
player.getInventory().addItem(token.toItemStack());
GoldManager.notify(player, String.format("You have purchased a gold token worth %dg!", tokenValue));

View File

@ -40,4 +40,4 @@ public class Field extends MiniPlugin
{
return _mob;
}
}
}

View File

@ -327,4 +327,4 @@ public class FieldBlock extends MiniPlugin
{
return _conditionFactory;
}
}
}

View File

@ -196,4 +196,4 @@ public class FieldMonster extends MiniPlugin
{
return _creature;
}
}
}

View File

@ -226,7 +226,7 @@ public class FieldOre extends MiniPlugin
event.setCancelled(true);
ore.OreMined(event.getPlayer().getEyeLocation());
ore.OreMined(event.getPlayer(), event.getPlayer().getEyeLocation());
}
@EventHandler

View File

@ -7,12 +7,15 @@ import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Item;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.util.Vector;
import mineplex.core.Managers;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilMath;
import mineplex.core.itemstack.ItemStackFactory;
import mineplex.game.clans.clans.pvptimer.PvPTimerManager;
public class FieldOreData
{
@ -78,10 +81,10 @@ public class FieldOreData
return _active;
}
public void OreMined(Location source)
public void OreMined(Player player, Location source)
{
//Persist
OreLoot(source);
OreLoot(player, source);
if (Math.random() > 0.9)
return;
@ -94,7 +97,8 @@ public class FieldOreData
_active = false;
}
public void OreLoot(Location source)
@SuppressWarnings("deprecation")
public void OreLoot(Player player, Location source)
{
ItemStack stack = null;
@ -110,12 +114,17 @@ public class FieldOreData
else if (block.getType() == Material.REDSTONE_ORE) stack = ItemStackFactory.Instance.CreateStack(Material.REDSTONE, 3);
if (stack == null)
{
return;
}
Vector vec = UtilAlg.getTrajectory(_loc.getBlock().getLocation().add(0.5, 0.5, 0.5), source).normalize();
Item item = _loc.getWorld().dropItem(_loc.getBlock().getLocation().add(0.5, 0.5, 0.5).add(vec), stack);
item.setPickupDelay(40);
if (!Managers.get(PvPTimerManager.class).handleMining(player, block, false))
{
Vector vec = UtilAlg.getTrajectory(_loc.getBlock().getLocation().add(0.5, 0.5, 0.5), source).normalize();
Item item = _loc.getWorld().dropItem(_loc.getBlock().getLocation().add(0.5, 0.5, 0.5).add(vec), stack);
item.setPickupDelay(40);
}
}
public void StartVein(int veinSize)

View File

@ -2,6 +2,7 @@ package mineplex.game.clans.gameplay;
import java.util.Arrays;
import org.apache.commons.lang.ArrayUtils;
import org.bukkit.Bukkit;
import org.bukkit.DyeColor;
import org.bukkit.Effect;
@ -12,6 +13,7 @@ import org.bukkit.Sound;
import org.bukkit.block.Biome;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.craftbukkit.v1_8_R3.CraftChunk;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.ItemFrame;
import org.bukkit.entity.Player;
@ -43,7 +45,6 @@ import org.bukkit.plugin.java.JavaPlugin;
import mineplex.core.MiniPlugin;
import mineplex.core.blockrestore.BlockRestore;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilEvent;
import mineplex.core.common.util.UtilEvent.ActionType;
import mineplex.core.common.util.UtilInv;
@ -71,6 +72,7 @@ public class Gameplay extends MiniPlugin
private static final int MAX_BUILD_HEIGHT = 120;
private static final int MIN_CHEST_HEIGHT = 30;
private static final Material[] REDSTONE_TYPES = new Material[] {Material.ACTIVATOR_RAIL, Material.REDSTONE, Material.REDSTONE_BLOCK, Material.REDSTONE_COMPARATOR, Material.REDSTONE_WIRE, Material.REDSTONE_COMPARATOR_OFF, Material.REDSTONE_COMPARATOR_ON, Material.REDSTONE_LAMP_OFF, Material.REDSTONE_LAMP_ON, Material.REDSTONE_TORCH_OFF, Material.REDSTONE_TORCH_ON, Material.DIODE, Material.DIODE_BLOCK_OFF, Material.DIODE_BLOCK_ON, Material.DETECTOR_RAIL};
private static final byte[] PLACED_LOG_DATA_VALUES = {12,13,14,15};
private ClansManager _clansManager;
private BlockRestore _blockRestore;
private DamageManager _damageManager;
@ -192,7 +194,7 @@ public class Gameplay extends MiniPlugin
@EventHandler(priority = EventPriority.LOWEST)
public void ObsidianCancel(BlockPlaceEvent event)
{
if (event.getBlock().getType() == Material.OBSIDIAN)
if (event.getBlock().getType() == Material.OBSIDIAN && event.getPlayer().getGameMode() != GameMode.CREATIVE)
{
UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.item("Obsidian") + "."));
event.setCancelled(true);
@ -209,9 +211,33 @@ public class Gameplay extends MiniPlugin
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void BarrierCancel(BlockPlaceEvent event)
{
if (event.getBlock().getType() == Material.BARRIER && event.getPlayer().getGameMode() != GameMode.CREATIVE)
{
UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.item("Barrier Blocks") + "."));
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void HopperCancel(BlockPlaceEvent event)
{
if (event.getBlock().getType() == Material.HOPPER && event.getPlayer().getGameMode() != GameMode.CREATIVE)
{
UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.item("Hoppers") + "."));
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void CommandPlace(BlockPlaceEvent event)
{
if (event.getPlayer().getGameMode() == GameMode.CREATIVE)
{
return;
}
if (event.getBlock().getType() == Material.COMMAND || event.getBlock().getType() == Material.NOTE_BLOCK || event.getBlock().getType() == Material.REDSTONE_LAMP_ON)
{
UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place " + F.item("Proximity Devices") + "."));
@ -222,7 +248,7 @@ public class Gameplay extends MiniPlugin
@EventHandler(priority = EventPriority.LOWEST)
public void RedstoneCancel(BlockPlaceEvent event)
{
if (Arrays.asList(REDSTONE_TYPES).contains(event.getBlock().getType()))
if (Arrays.asList(REDSTONE_TYPES).contains(event.getBlock().getType()) && event.getPlayer().getGameMode() != GameMode.CREATIVE)
{
UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place redstone based items."));
event.setCancelled(true);
@ -232,6 +258,10 @@ public class Gameplay extends MiniPlugin
@EventHandler(priority = EventPriority.LOWEST)
public void MaxHeight(BlockPlaceEvent event)
{
if (event.getPlayer().getGameMode() == GameMode.CREATIVE)
{
return;
}
if (event.getBlock().getLocation().getBlockY() > MAX_BUILD_HEIGHT)
{
UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot place blocks this high."));
@ -243,7 +273,7 @@ public class Gameplay extends MiniPlugin
event.setCancelled(true);
}
if (event.getBlock().getLocation().getBlockY() < MIN_CHEST_HEIGHT && (event.getBlock().getType() == Material.CHEST || event.getBlock().getType() == Material.TRAPPED_CHEST))
if (event.getBlock().getLocation().getBlockY() < MIN_CHEST_HEIGHT && (event.getBlock().getType() == Material.CHEST || event.getBlock().getType() == Material.TRAPPED_CHEST || event.getBlock().getType() == Material.DISPENSER || event.getBlock().getType() == Material.DROPPER || event.getBlock().getType() == Material.FURNACE || event.getBlock().getType() == Material.BURNING_FURNACE))
{
event.setCancelled(true);
}
@ -594,6 +624,43 @@ public class Gameplay extends MiniPlugin
}
}
@SuppressWarnings("deprecation")
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
public void onLogPlace(BlockPlaceEvent event)
{
if (UtilItem.isLog(event.getBlock().getType()))
{
byte data = event.getBlock().getData();
final byte newData;
if (data % 4 == 0)
{
newData = 12;
}
else if ((data - 1) % 4 == 0)
{
newData = 13;
}
else if ((data - 2) % 4 == 0)
{
newData = 14;
}
else if ((data - 3) % 4 == 0)
{
newData = 15;
}
else
{
newData = data;
}
UtilServer.runSyncLater(() ->
{
event.getBlock().setData(newData);
}, 1);
}
}
@SuppressWarnings("deprecation")
@EventHandler(priority = EventPriority.LOWEST)
public void replantTree(BlockBreakEvent event)
{
@ -625,9 +692,18 @@ public class Gameplay extends MiniPlugin
}
final byte data = block.getData();
UtilServer.getServer().getScheduler().scheduleSyncDelayedTask(getPlugin(), () ->
if (ArrayUtils.contains(PLACED_LOG_DATA_VALUES, data))
{
return;
}
UtilServer.runSyncLater(() ->
{
if (block.getType() != Material.AIR)
{
return;
}
Material mat = block.getRelative(BlockFace.DOWN).getType();
if (mat == Material.DIRT || mat == Material.GRASS)
{

View File

@ -8,13 +8,11 @@ import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.craftbukkit.v1_8_R3.inventory.CraftItemStack;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import mineplex.core.common.util.UtilInv;
import mineplex.core.common.util.UtilServer;
import mineplex.game.clans.items.attributes.AttributeContainer;
import mineplex.game.clans.items.attributes.ItemAttribute;
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
@ -23,7 +21,7 @@ import mineplex.minecraft.game.core.damage.CustomDamageEvent;
* Represents a customizable wrapper for an {@link ItemStack}, enabling the
* possession of special abilities, attributes, and triggers on item.
*/
public class CustomItem implements Listener
public class CustomItem
{
// Chat color used for item display name
private static final ChatColor TITLE_COLOR = ChatColor.GOLD;
@ -56,7 +54,6 @@ public class CustomItem implements Listener
_material = material;
_attributes = new AttributeContainer();
_uuid = UUID.randomUUID().toString();
UtilServer.RegisterEvents(this);
}
public CustomItem(Material material)

View File

@ -69,6 +69,7 @@ import mineplex.game.clans.items.legendaries.AlligatorsTooth;
import mineplex.game.clans.items.legendaries.DemonicScythe;
import mineplex.game.clans.items.legendaries.GiantsBroadsword;
import mineplex.game.clans.items.legendaries.HyperAxe;
import mineplex.game.clans.items.legendaries.KnightLance;
import mineplex.game.clans.items.legendaries.LegendaryItem;
import mineplex.game.clans.items.legendaries.MagneticMaul;
import mineplex.game.clans.items.legendaries.MeridianScepter;
@ -122,7 +123,8 @@ public class GearManager extends MiniPlugin implements IPacketHandler, Runnable
WindBlade.class,
GiantsBroadsword.class,
HyperAxe.class,
MagneticMaul.class
MagneticMaul.class,
KnightLance.class
);
private static final WeightSet<Class<? extends RareItem>> RARE_WEIGHTS = new WeightSet<>(
@ -193,7 +195,8 @@ public class GearManager extends MiniPlugin implements IPacketHandler, Runnable
Material.RECORD_9,
Material.RECORD_10,
Material.RECORD_11,
Material.RECORD_12
Material.RECORD_12,
Material.RABBIT_FOOT
);
static
@ -425,7 +428,7 @@ public class GearManager extends MiniPlugin implements IPacketHandler, Runnable
public void spawnItem(Location location)
{
CustomItem item = generateItem();
if (item.getMaterial() == Material.RECORD_4 || item.getMaterial() == Material.GOLD_RECORD || item.getMaterial() == Material.RECORD_3 || item.getMaterial() == Material.RECORD_5 || item.getMaterial() == Material.RECORD_6 || item.getMaterial() == Material.GREEN_RECORD)
if (item.getMaterial() == Material.RECORD_4 || item.getMaterial() == Material.GOLD_RECORD || item.getMaterial() == Material.RECORD_3 || item.getMaterial() == Material.RECORD_5 || item.getMaterial() == Material.RECORD_6 || item.getMaterial() == Material.GREEN_RECORD || item.getMaterial() == Material.RECORD_12)
{
UtilFirework.playFirework(location, Type.BALL, Color.RED, true, false);
}
@ -754,7 +757,6 @@ public class GearManager extends MiniPlugin implements IPacketHandler, Runnable
CustomItem item = it.next();
if (item._lastUser == null || !item._lastUser.isOnline())
{
UtilServer.Unregister(item);
it.remove();
}
}

View File

@ -1,6 +1,7 @@
package mineplex.game.clans.items;
import org.bukkit.entity.Entity;
import org.bukkit.entity.ItemFrame;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
@ -10,6 +11,7 @@ import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.EntityShootBowEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerItemHeldEvent;
import org.bukkit.event.player.PlayerJoinEvent;
@ -236,6 +238,22 @@ public class ItemListener implements Listener, Runnable
}
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
public void onUseItemFrame(PlayerInteractEntityEvent event)
{
if (event.getRightClicked() instanceof ItemFrame)
{
boolean frameHas = ((ItemFrame)event.getRightClicked()).getItem() != null;
boolean playerHas = event.getPlayer().getItemInHand() != null;
if (frameHas || playerHas)
{
GearManager.getInstance().runSyncLater(() -> getGear(event.getPlayer()).updateCache(true), 1);
return;
}
}
}
/**
* @param player - the player whose gear is to be fetched

View File

@ -21,10 +21,12 @@ public class PlayerGear
private CustomItem _weapon, _helmet, _chestplate, _leggings, _boots;
private Map<Integer, CustomItem> _inventory = new HashMap<>();
private int _lastHeldSlot = 0;
public PlayerGear(Player owner)
{
_owner = owner;
_lastHeldSlot = owner.getInventory().getHeldItemSlot();
}
/**
@ -65,7 +67,12 @@ public class PlayerGear
_inventory.put(i, GearManager.parseItem(getPlayer().getInventory().getItem(i)));
}
}
_weapon = _inventory.get(getPlayer().getInventory().getHeldItemSlot());
if (_weapon != null && _weapon instanceof LegendaryItem && _lastHeldSlot != getPlayer().getInventory().getHeldItemSlot())
{
((LegendaryItem)_weapon).onUnequip(getPlayer());
}
_lastHeldSlot = getPlayer().getInventory().getHeldItemSlot();
_weapon = _inventory.get(_lastHeldSlot);
_helmet = GearManager.parseItem(getPlayer().getInventory().getHelmet());
_chestplate = GearManager.parseItem(getPlayer().getInventory().getChestplate());
_leggings = GearManager.parseItem(getPlayer().getInventory().getLeggings());

View File

@ -1,15 +1,15 @@
package mineplex.game.clans.items.attributes;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.ClansUtility;
import mineplex.game.clans.items.generation.ValueDistribution;
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.ClansUtility;
import mineplex.game.clans.items.CustomItem;
import mineplex.game.clans.items.generation.ValueDistribution;
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
/**
* Represents an attribute that can be attached to {@link CustomItem} to augment their abilities
* and special effects on trigger.
@ -148,4 +148,4 @@ public abstract class ItemAttribute
}
return false;
}
}
}

View File

@ -15,7 +15,7 @@ public class GoldToken extends CustomItem
public GoldToken(int goldValue)
{
super("Gold Token", null, Material.RECORD_12);
super("Gold Token", null, Material.RABBIT_FOOT);
_goldValue = goldValue;
}
@ -28,8 +28,9 @@ public class GoldToken extends CustomItem
@Override
public String[] getDescription()
{
return new String[] {
String.format("A gold token worth %s gold coins.", _goldValue),
return new String[]
{
String.format("A gold token worth %s gold coins.", _goldValue),
};
}
}
}

View File

@ -1,6 +1,5 @@
package mineplex.game.clans.items.legendaries;
import mineplex.core.common.util.UtilAction;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.Sound;
@ -14,23 +13,26 @@ import mineplex.minecraft.game.core.damage.CustomDamageEvent;
public class AlligatorsTooth extends LegendaryItem
{
private static ValueDistribution BOOST_GEN = generateDistribution(0.8d, 1.4d);
private static double LAND_DAMAGE_BONUS = 7;
private static double WATER_DAMAGE_BONUS = 11;
private static final ValueDistribution BOOST_GEN = generateDistribution(0.8d, 1.4d);
private static final double LAND_DAMAGE_BONUS = 7;
private static final double WATER_DAMAGE_BONUS = 11;
private double _swimSpeed;
private int _soundUpdateCounter;
public AlligatorsTooth()
{
super("Alligators Tooth", new String[] {
super("Alligators Tooth", new String[]
{
C.cWhite + "This deadly tooth was stolen from",
C.cWhite + "a nest of reptillian beasts long",
C.cWhite + "a nest of reptilian beasts long",
C.cWhite + "ago. Legends say that the holder",
C.cWhite + "is granted the underwater agility",
C.cWhite + "of an Alligator",
C.cWhite + "of an Alligator.",
" ",
C.cYellow + "Right-Click" + C.cWhite + " to use" + C.cGreen + " Swim",
C.cWhite + "Deals " + C.cYellow + "8 Damage" + C.cWhite + " with attack on land",
C.cWhite + "Deals " + C.cYellow + "12 Damage" + C.cWhite + " with attack in water",
C.cYellow + "Right-Click" + C.cWhite + " to use " + C.cGreen + "Gator Stroke",
}, Material.RECORD_4);
_swimSpeed = BOOST_GEN.generateValue();
@ -83,4 +85,4 @@ public class AlligatorsTooth extends LegendaryItem
Material type = player.getLocation().getBlock().getType();
return type == Material.WATER || type == Material.STATIONARY_WATER;
}
}
}

View File

@ -1,12 +1,28 @@
package mineplex.game.clans.items.legendaries;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Horse;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.WitherSkull;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.util.Vector;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.recharge.Recharge;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.ClansUtility;
@ -14,17 +30,127 @@ import mineplex.minecraft.game.core.damage.CustomDamageEvent;
public class DemonicScythe extends LegendaryItem
{
private long _interactWait;
static
{
UtilServer.RegisterEvents(new Listener()
{
@EventHandler(priority = EventPriority.LOWEST)
public void onDamagedByFireball(CustomDamageEvent event)
{
Projectile proj = event.GetProjectile();
if (proj != null && UtilEnt.hasFlag(proj, "DemonicScythe.Projectile"))
{
event.SetCancelled("Unnecessary Scythe Damage");
return;
}
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onHit(ProjectileHitEvent event)
{
if (event.getEntity() instanceof WitherSkull)
{
WitherSkull skull = (WitherSkull) event.getEntity();
if (!UtilEnt.hasFlag(skull, "DemonicScythe.Projectile"))
{
return;
}
Location hit = skull.getLocation();
boolean inverted = skull.isCharged();
skull.remove();
if (skull.getShooter() == null)
{
return;
}
Player shooter = (Player) skull.getShooter();
for (Entity e : skull.getNearbyEntities(3, 3, 3))
{
if (e instanceof LivingEntity)
{
LivingEntity entity = (LivingEntity) e;
if (UtilEnt.hasFlag(entity, "LegendaryAbility.IgnoreMe"))
{
continue;
}
if (ClansManager.getInstance().getClanUtility().isSafe(entity.getLocation()))
{
continue;
}
if (e instanceof Player)
{
Player target = (Player) e;
if (ClansManager.getInstance().hasTimer(target))
{
continue;
}
if (ClansManager.getInstance().isInClan(shooter) && ClansManager.getInstance().getClan(shooter).isMember(target))
{
continue;
}
if (target.getGameMode() == GameMode.CREATIVE || target.getGameMode() == GameMode.SPECTATOR)
{
continue;
}
if (ClansManager.getInstance().getIncognitoManager().Get(target).Hidden)
{
continue;
}
if (ClansManager.getInstance().isInClan(shooter) && ClansManager.getInstance().getClan(shooter).isAlly(ClansManager.getInstance().getClan(target)))
{
continue;
}
if (target.getEntityId() == shooter.getEntityId())
{
continue;
}
}
//Damage Event
ClansManager.getInstance().getDamageManager().NewDamageEvent(entity, shooter, null,
DamageCause.CUSTOM, 8, false, true, false,
shooter.getName(), "Wither Skull");
//Velocity
Vector trajectory;
if (inverted)
{
trajectory = UtilAlg.getTrajectory2d(entity.getLocation().toVector(), hit.toVector());
}
else
{
trajectory = UtilAlg.getTrajectory2d(hit.toVector(), entity.getLocation().toVector());
}
UtilAction.velocity(entity,
trajectory,
2.6, true, 0, 0.2, 1.4, true);
//Condition
ClansManager.getInstance().getCondition().Factory().Falling("Wither Skull", entity, shooter, 10, false, true);
}
}
}
}
});
}
public DemonicScythe()
{
super("Scythe of the Fallen Lord", new String[]
{
C.cWhite + "An old blade fashioned of nothing more",
C.cWhite + "than bones and cloth which served no",
C.cWhite + "purpose. Brave adventurers however have",
C.cWhite + "imbued it with the remnant powers of a",
C.cWhite + "dark and powerful foe.",
" ",
C.cYellow + "Attack" + C.cWhite + " to use" + C.cGreen + " Leach Health",
C.cWhite + "An old blade fashioned of nothing more",
C.cWhite + "than bones and cloth which served no",
C.cWhite + "purpose. Brave adventurers however have",
C.cWhite + "imbued it with the remnant powers of a",
C.cWhite + "dark and powerful foe.",
" ",
C.cWhite + "Deals " + C.cYellow + "8 Damage" + C.cWhite + " with attack",
C.cYellow + "Attack" + C.cWhite + " to use " + C.cGreen + "Leach Health",
C.cYellow + "Right Click" + C.cWhite + " to use " + C.cGreen + "Skull Launcher",
C.cYellow + "Shift-Right Click" + C.cWhite + " to use " + C.cGreen + "Gravity Skull Launcher",
}, Material.RECORD_8);
}
@ -44,6 +170,39 @@ public class DemonicScythe extends LegendaryItem
}
return false;
}
@Override
public void update(Player wielder)
{
if (timeSinceLastBlock() >= 98 || (System.currentTimeMillis() - _interactWait) < 98)
{
return;
}
if (ClansManager.getInstance().hasTimer(wielder))
{
UtilPlayer.message(wielder, F.main("Clans", "You are not allowed to fire skulls whilst protected from PvP. Run " + F.elem("/pvp") + " to enable PvP!"));
return;
}
if (ClansManager.getInstance().getClanUtility().getClaim(wielder.getLocation()) != null && ClansManager.getInstance().getClanUtility().getClaim(wielder.getLocation()).isSafe(wielder.getLocation()))
{
UtilPlayer.message(wielder, F.main("Clans", "You are not allowed to fire skulls whilst in a safe zone."));
return;
}
if (!Recharge.Instance.use(wielder, "Scythe Skull Launcher", 9000, true, false))
{
return;
}
WitherSkull skull = wielder.launchProjectile(WitherSkull.class);
UtilEnt.addFlag(skull, "DemonicScythe.Projectile");
if (wielder.isSneaking())
{
skull.setCharged(true);
}
skull.setBounce(false);
skull.setIsIncendiary(false);
skull.setYield(0);
_interactWait = System.currentTimeMillis();
}
@Override
public void onAttack(CustomDamageEvent event, Player wielder)
@ -75,7 +234,7 @@ public class DemonicScythe extends LegendaryItem
event.AddMod("Scythe of the Fallen Lord", 7);
if (!(event.GetDamageeEntity() instanceof Horse) && Recharge.Instance.use(wielder, "Demonic Scythe Heal", 500, false, false))
{
wielder.setHealth(Math.min(wielder.getMaxHealth(), wielder.getHealth() + 2));
wielder.setHealth(Math.min(wielder.getMaxHealth(), wielder.getHealth() + 3));
}
}
}

View File

@ -50,9 +50,10 @@ public class EnergyCrossbow extends LegendaryItem
public EnergyCrossbow()
{
super("Energy Crossbow", UtilText.splitLinesToArray(new String[] {
C.cWhite + "Legend says "
+ " ",
super("Energy Crossbow", UtilText.splitLinesToArray(new String[]
{
C.cWhite + "Legend says ",
" ",
"#" + C.cYellow + "Right-Click" + C.cWhite + " to fire Crossbow."
}, LineFormat.LORE), Material.RECORD_6);
}
@ -73,7 +74,8 @@ public class EnergyCrossbow extends LegendaryItem
private void fire(final Player player)
{
UtilServer.RegisterEvents(new Listener() {
UtilServer.RegisterEvents(new Listener()
{
private Location _lastLoc;
private Arrow _arrow;
@ -181,7 +183,6 @@ public class EnergyCrossbow extends LegendaryItem
hit();
}
});
}
}
}

View File

@ -19,14 +19,15 @@ public class GiantsBroadsword extends LegendaryItem
public GiantsBroadsword()
{
super("Giants Broadsword", new String[]{
C.cWhite + "Forged in the godly mines of Plagieus",
C.cWhite + "this sword has endured thousands of",
C.cWhite + "wars. It is sure to grant certain",
C.cWhite + "victory in battle.",
C.cWhite + " ",
C.cWhite + "Deals " + C.cYellow + "10 Damage" + C.cWhite + " with attack",
C.cYellow + "Right-Click" + C.cWhite + " to use " + C.cGreen + "Shield",
super("Giants Broadsword", new String[]
{
C.cWhite + "Forged in the godly mines of Plagieus,",
C.cWhite + "this sword has endured thousands of",
C.cWhite + "wars. It is sure to grant glorious",
C.cWhite + "victory in battle.",
C.cWhite + " ",
C.cWhite + "Deals " + C.cYellow + "10 Damage" + C.cWhite + " with attack",
C.cYellow + "Right-Click" + C.cWhite + " to use " + C.cGreen + "Shield",
}, Material.GOLD_RECORD);
}
@ -62,6 +63,8 @@ public class GiantsBroadsword extends LegendaryItem
{
grantPotionEffect(player, PotionEffectType.SLOW, 40, SLOW_AMPLIFIER);
if (Recharge.Instance.use(player, "Giants Broadsword Regen", 250L, false, false, false))
{
grantPotionEffect(player, PotionEffectType.REGENERATION, 5, REGEN_AMPLIFIER); //Regen
}
}
}
}

View File

@ -13,26 +13,27 @@ import mineplex.minecraft.game.core.damage.CustomDamageEvent;
public class HyperAxe extends LegendaryItem
{
private static final long ATTACK_RATE_DURATION = 1000 / 10;
private static ValueDistribution AMOUNT_GEN = generateDistribution(0, 3); // [1, 4] speed amount
private static ValueDistribution DURATION_GEN = generateDistribution(80, 320); // [4, 16] seconds speed duration
private static final ValueDistribution AMOUNT_GEN = generateDistribution(0, 3); // [1, 4] speed amount
private static final ValueDistribution DURATION_GEN = generateDistribution(80, 320); // [4, 16] seconds speed duration
private int _speedAmount;
private int _speedDuration;
private final int _speedAmount;
private final int _speedDuration;
private long _lastAttack;
public HyperAxe()
{
super("Hyper Axe", new String[] {
C.cWhite + "Of all the weapons known to man,",
C.cWhite + "none is more prevalent than the",
C.cWhite + "Hyper Axe. Infused with rabbit's",
C.cWhite + "speed and pigman's ferocity, this",
C.cWhite + "blade can rip through any opponent.",
C.cWhite + " ",
C.cWhite + "Hit delay is reduced by " + C.cYellow + "50%",
C.cWhite + "Deals " + C.cYellow + "3 Damage" + C.cWhite + " with attack",
C.cYellow + "Right-Click" + C.cWhite + " to use " + C.cGreen + "Dash",
super("Hyper Axe", new String[]
{
C.cWhite + "Of all the weapons known to man,",
C.cWhite + "none matches the savagery of the",
C.cWhite + "Hyper Axe. Infused with a rabbit's",
C.cWhite + "speed and a pigman's ferocity, this",
C.cWhite + "blade can rip through any opponent.",
C.cWhite + " ",
C.cWhite + "Hit delay is reduced by " + C.cYellow + "50%",
C.cWhite + "Deals " + C.cYellow + "6 Damage" + C.cWhite + " with attack",
C.cYellow + "Right-Click" + C.cWhite + " to use " + C.cGreen + "Dash",
}, Material.RECORD_3);
_speedAmount = AMOUNT_GEN.generateIntValue();
_speedDuration = DURATION_GEN.generateIntValue();
@ -78,4 +79,4 @@ public class HyperAxe extends LegendaryItem
wielder.addPotionEffect(new PotionEffect(PotionEffectType.SPEED, _speedDuration, _speedAmount));
}
}
}
}

View File

@ -0,0 +1,234 @@
package mineplex.game.clans.items.legendaries;
import java.util.HashSet;
import java.util.Set;
import org.bukkit.GameMode;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Horse;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.util.Vector;
import mineplex.core.common.util.C;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilParticle;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTextBottom;
import mineplex.core.common.util.UtilParticle.ParticleType;
import mineplex.core.common.util.UtilParticle.ViewDist;
import mineplex.core.recharge.Recharge;
import mineplex.game.clans.clans.ClansManager;
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
public class KnightLance extends LegendaryItem
{
private static final double CHARGE_VELOCITY = 1.5d;
private static final double MAX_BUILDUP_TICKS = 20 * 3;
private boolean _charging;
private double _buildup;
private transient final Set<LivingEntity> _hit = new HashSet<>(); //Avoid creating a new list every tick
public KnightLance()
{
super("Knight's Greatlance", new String[]
{
C.cWhite + "Relic of a bygone age.",
C.cWhite + "Emblazoned with cryptic runes, this",
C.cWhite + "Lance bears the marks of its ancient master.",
C.cWhite + "You feel him with you always:",
C.cWhite + "Heed his warnings and stave off the darkness.",
" ",
C.cWhite + "Deals " + C.cYellow + "8 Damage" + C.cWhite + " with attack",
C.cYellow + "Right-Click" + C.cWhite + " to use " + C.cGreen + "Charge",
}, Material.RECORD_12);
}
@Override
public void update(Player wielder)
{
boolean holding = isHoldingRightClick();
if (holding && !_charging)
{
if (canPropel(wielder))
{
_buildup = 0;
_charging = true;
}
}
else if (!holding && _charging)
{
_charging = false;
_buildup = 0;
}
else if (_charging && !canPropel(wielder))
{
_charging = false;
_buildup = 0;
}
if (_charging)
{
for (Entity near : wielder.getNearbyEntities(0.6, 1, 0.6))
{
if (near instanceof LivingEntity)
{
LivingEntity entity = (LivingEntity) near;
if (!canHit(wielder, entity))
{
continue;
}
if (entity instanceof Horse)
{
_hit.add((LivingEntity)((Horse)entity).getPassenger());
((Horse)entity).eject();
}
else
{
_hit.add(entity);
}
}
}
if (!_hit.isEmpty())
{
_charging = false;
double damagePercentage = getBuildup() / MAX_BUILDUP_TICKS;
_buildup = 0;
wielder.getWorld().playSound(wielder.getLocation(), Sound.ZOMBIE_METAL, 1.5f, 0.5f);
for (LivingEntity hit : _hit)
{
//Damage Event
ClansManager.getInstance().getDamageManager().NewDamageEvent(hit, wielder, null,
DamageCause.CUSTOM, 2 + (10 * damagePercentage), false, true, false,
wielder.getName(), "Knight's Greatlance Charge");
//Velocity
UtilAction.velocity(hit,
UtilAlg.getTrajectory2d(wielder.getLocation().toVector(), hit.getLocation().toVector()),
2.6, true, 0, 0.2, 1.4, true);
//Condition
ClansManager.getInstance().getCondition().Factory().Falling("Knight's Greatlance Charge", hit, wielder, 10, false, true);
}
_hit.clear();
Recharge.Instance.useForce(wielder, "Knight Lance Charge Attack", 5000);
Recharge.Instance.recharge(wielder, "Knight Lance Charge CD Inform");
return;
}
propelPlayer(wielder);
UtilTextBottom.displayProgress(getBuildup() / MAX_BUILDUP_TICKS, wielder);
_buildup++;
}
}
@Override
public void onUnequip(Player wielder)
{
_charging = false;
_buildup = 0;
}
@Override
public void onAttack(CustomDamageEvent event, Player wielder)
{
event.AddMod("Knight's Greatlance", 7);
}
private void propelPlayer(Player player)
{
Vector direction = player.getLocation().getDirection().normalize();
direction.setY(0);
direction.multiply(CHARGE_VELOCITY);
player.setVelocity(direction);
UtilParticle.PlayParticle(ParticleType.CRIT, player.getLocation(),
(float)(Math.random() - 0.5), 0.2f + (float)(Math.random() * 1), (float)(Math.random() - 0.5), 0, 3,
ViewDist.LONG, UtilServer.getPlayers());
}
private boolean canPropel(Player player)
{
return UtilEnt.isGrounded(player) &&
!UtilEnt.isInWater(player) &&
player.getVehicle() == null &&
!ClansManager.getInstance().getClanUtility().isSafe(player) &&
Recharge.Instance.usable(player, "Knight Lance Charge Attack", Recharge.Instance.use(player, "Knight Lance Charge CD Inform", 1500, false, false));
}
private boolean canHit(Player player, LivingEntity entity)
{
if (UtilEnt.hasFlag(entity, "LegendaryAbility.IgnoreMe"))
{
return false;
}
if (ClansManager.getInstance().getClanUtility().isSafe(entity.getLocation()))
{
return false;
}
if (entity instanceof Horse)
{
Entity passenger = ((Horse)entity).getPassenger();
if (passenger == null)
{
return false;
}
else
{
if (passenger instanceof LivingEntity)
{
if (!canHit(player, (LivingEntity)passenger))
{
return false;
}
}
else
{
return false;
}
}
}
if (entity instanceof Player)
{
Player target = (Player) entity;
if (ClansManager.getInstance().hasTimer(target))
{
return false;
}
if (ClansManager.getInstance().isInClan(player) && ClansManager.getInstance().getClan(player).isMember(target))
{
return false;
}
if (target.getGameMode() == GameMode.CREATIVE || target.getGameMode() == GameMode.SPECTATOR)
{
return false;
}
if (ClansManager.getInstance().getIncognitoManager().Get(target).Hidden)
{
return false;
}
if (ClansManager.getInstance().isInClan(player) && ClansManager.getInstance().getClan(player).isAlly(ClansManager.getInstance().getClan(target)))
{
return false;
}
}
return true;
}
private double getBuildup()
{
return UtilMath.clamp(_buildup, 0d, MAX_BUILDUP_TICKS);
}
}

View File

@ -13,7 +13,7 @@ import mineplex.minecraft.game.core.damage.CustomDamageEvent;
public class LegendaryItem extends CustomItem
{
private static final long BLOCK_COOLDOWN = 200L; // Right clicking activates right click for 200ms
private static final long BLOCK_COOLDOWN = 260L; // Right clicking activates right click for 260ms
protected long _lastBlock; // Timestamp of last block from wielder
@ -24,19 +24,25 @@ public class LegendaryItem extends CustomItem
_lastBlock = 0L;
}
public void update(Player wielder)
{
// Leave implementation to potential subtypes
}
/*
* Leave implementation to potential subtypes
*/
public void update(Player wielder) {}
public void preUpdate(Player wielder)
{
}
/*
* Leave implementation to potential subtypes
*/
public void preUpdate(Player wielder) {}
public void onAttack(CustomDamageEvent event, Player wielder)
{
// Leave implementation to potential subtypes
}
/*
* Leave implementation to potential subtypes
*/
public void onUnequip(Player wielder) {}
/*
* Leave implementation to potential subtypes
*/
public void onAttack(CustomDamageEvent event, Player wielder) {}
@Override
public void onAttack(CustomDamageEvent event)
@ -98,4 +104,4 @@ public class LegendaryItem extends CustomItem
{
player.addPotionEffect(new PotionEffect(type, amplifier, tickDuration), true);
}
}
}

View File

@ -7,11 +7,14 @@ import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.LineFormat;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilParticle;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilParticle.ParticleType;
import mineplex.core.common.util.UtilParticle.ViewDist;
import mineplex.core.common.util.UtilServer;
@ -31,11 +34,13 @@ public class MagneticMaul extends LegendaryItem
public MagneticMaul()
{
super("Magnetic Maul", UtilText.splitLinesToArray(new String[] {
C.cWhite + "This brutal weapon allows you to pull your enemies towards you with magnetic force!",
" ",
C.cYellow + "Right-Click" + C.cWhite + " to use Maul."
}, LineFormat.LORE), Material.RECORD_5);
super("Magnetic Maul", UtilText.splitLinesToArray(new String[]
{
C.cWhite + "For centuries, warlords used this hammer to control their subjects. This brutal weapon allows you to pull your enemies towards you with magnetic force!",
" ",
"#" + C.cWhite + "Deals " + C.cYellow + "8 Damage" + C.cWhite + " with attack",
"#" + C.cYellow + "Right-Click" + C.cWhite + " to use " + C.cGreen + "Magnetism"
}, LineFormat.LORE), Material.RECORD_5);
}
@Override
@ -47,6 +52,11 @@ public class MagneticMaul extends LegendaryItem
{
return;
}
if (ClansManager.getInstance().hasTimer(wielder))
{
UtilPlayer.message(wielder, F.main("Clans", "You are not allowed to use the Magnetic Maul whilst protected from PvP. Run " + F.elem("/pvp") + " to enable PvP!"));
return;
}
if (isHoldingRightClick())
{
@ -94,6 +104,10 @@ public class MagneticMaul extends LegendaryItem
{
continue;
}
if (UtilEnt.hasFlag(entity, "LegendaryAbility.IgnoreMe"))
{
continue;
}
double otherDistance = player.getLocation().distance(entity.getLocation());
double otherTargetDistance = target.distance(entity.getLocation());

View File

@ -22,6 +22,7 @@ import mineplex.core.common.util.RGBData;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilCollections;
import mineplex.core.common.util.UtilColor;
import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilParticle;
import mineplex.core.common.util.UtilParticle.ParticleType;
import mineplex.core.common.util.UtilParticle.ViewDist;
@ -43,11 +44,12 @@ public class MeridianScepter extends LegendaryItem
public MeridianScepter()
{
super("Meridian Scepter", UtilText.splitLinesToArray(new String[] {
C.cWhite + "Legend says that this scepter was found, and retrieved from the deepest trench in all of Minecraftia. It is said that he who wields this scepter holds the power of Poseidon himself."
+ " ",
"#" + C.cYellow + "Right-Click" + C.cWhite + " to use Scepter."
}, LineFormat.LORE), Material.RECORD_6);
super("Meridian Scepter", UtilText.splitLinesToArray(new String[]
{
C.cWhite + "Legend says that this scepter was retrieved from the deepest trench in all of Minecraftia. It is said that he who wields this scepter holds the power of Poseidon himself.",
" ",
"#" + C.cYellow + "Right-Click" + C.cWhite + " to use " + C.cGreen + "Meridian Beam"
}, LineFormat.LORE), Material.RECORD_6);
}
@Override
@ -93,7 +95,7 @@ public class MeridianScepter extends LegendaryItem
{
for (Entity cur : projectile.getWorld().getEntities())
{
if (cur == shooter || !(cur instanceof LivingEntity) || (cur instanceof Player && UtilPlayer.isSpectator(cur)))
if (cur == shooter || !(cur instanceof LivingEntity) || (cur instanceof Player && UtilPlayer.isSpectator(cur)) || UtilEnt.hasFlag(cur, "LegendaryAbility.IgnoreMe"))
continue;
LivingEntity ent = (LivingEntity) cur;
@ -102,7 +104,8 @@ public class MeridianScepter extends LegendaryItem
if (ent.getEyeLocation().subtract(0, .3, 0).distance(projectile) <= 2)
{
AttackAnimation aa = new AttackAnimation(ent, shooter);
int i = UtilServer.getServer().getScheduler().scheduleSyncRepeatingTask(UtilServer.getPlugin(), () -> {
int i = UtilServer.getServer().getScheduler().scheduleSyncRepeatingTask(UtilServer.getPlugin(), () ->
{
aa.update();
}, 0, 1);
_animations.put(aa, i);
@ -207,7 +210,8 @@ public class MeridianScepter extends LegendaryItem
for (Entity cur : projectile.getWorld().getEntities())
{
if (cur == shooter || !(cur instanceof LivingEntity)
|| (cur instanceof Player && UtilPlayer.isSpectator(cur)))
|| (cur instanceof Player && UtilPlayer.isSpectator(cur))
|| UtilEnt.hasFlag(cur, "LegendaryAbility.IgnoreMe"))
continue;
LivingEntity ent = (LivingEntity) cur;
@ -316,4 +320,4 @@ public class MeridianScepter extends LegendaryItem
}
}
}
}
}

View File

@ -11,8 +11,9 @@ public class MeteorBow extends LegendaryItem
public MeteorBow()
{
super("Meteor Bow", new String[]{
"Shoot explosive arrows!"
super("Meteor Bow", new String[]
{
"Shoot explosive arrows!"
}, Material.BOW);
_flightTime = 0;
}
@ -36,4 +37,4 @@ public class MeteorBow extends LegendaryItem
{
return _flightTime <= MAX_FLIGHT_TIME;
}
}
}

View File

@ -1,13 +1,13 @@
package mineplex.game.clans.items.legendaries;
import mineplex.game.clans.items.GearManager;
import mineplex.game.clans.items.PlayerGear;
import net.minecraft.server.v1_8_R3.PlayerConnection;
import java.lang.reflect.Field;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.util.Vector;
@ -20,12 +20,14 @@ 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.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.core.common.util.UtilTextBottom;
import mineplex.core.common.util.UtilTime;
import mineplex.core.recharge.Recharge;
import mineplex.game.clans.items.GearManager;
import mineplex.game.clans.items.PlayerGear;
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
import java.lang.reflect.Field;
import net.minecraft.server.v1_8_R3.PlayerConnection;
public class WindBlade extends LegendaryItem
{
@ -42,6 +44,22 @@ public class WindBlade extends LegendaryItem
{
throw new RuntimeException("Could not reflectively access field", exception);
}
UtilServer.RegisterEvents(new Listener()
{
@EventHandler
public void onFall(CustomDamageEvent event)
{
if (event.GetDamageePlayer() != null && event.GetCause() == EntityDamageEvent.DamageCause.FALL)
{
PlayerGear playerGear = GearManager.getInstance().getPlayerGear(event.GetDamageePlayer());
if (playerGear.getWeapon() instanceof WindBlade)
{
event.SetCancelled("Wind Blade No Fall Damage");
}
}
}
});
}
private static final double FLIGHT_VELOCITY = 0.75d;
@ -53,14 +71,16 @@ public class WindBlade extends LegendaryItem
public WindBlade()
{
super("Wind Blade", new String[]{
C.cWhite + "Long ago, a race of cloud dwellers",
C.cWhite + "terrorized the skies. A remnant of",
C.cWhite + "their tyranny, this airy blade is",
C.cWhite + "the last surviving memorium from",
C.cWhite + "their final battle against the Titans.",
" ",
C.cYellow + "Right-Click" + C.cWhite + " to use" + C.cGreen + " Fly",
super("Wind Blade", new String[]
{
C.cWhite + "Long ago, a race of cloud dwellers",
C.cWhite + "terrorized the skies. A remnant of",
C.cWhite + "their tyranny, this airy blade is",
C.cWhite + "the last surviving memorium from",
C.cWhite + "their final battle against the Titans.",
" ",
C.cWhite + "Deals " + C.cYellow + "7 Damage" + C.cWhite + " with attack",
C.cYellow + "Right-Click" + C.cWhite + " to use " + C.cGreen + "Flight",
}, Material.GREEN_RECORD);
}
@ -150,19 +170,6 @@ public class WindBlade extends LegendaryItem
event.AddMod("Wind Blade", 6);
}
@EventHandler
public void onFall(CustomDamageEvent event)
{
if (event.GetDamageePlayer() != null && event.GetCause() == EntityDamageEvent.DamageCause.FALL)
{
PlayerGear playerGear = GearManager.getInstance().getPlayerGear(event.GetDamageePlayer());
if (playerGear.getWeapon() instanceof WindBlade)
{
event.SetCancelled("Wind Blade No Fall Damage");
}
}
}
private void propelPlayer(Player player)
{
Vector direction = player.getLocation().getDirection().normalize();

View File

@ -17,6 +17,7 @@ import org.bukkit.potion.PotionEffectType;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.LineFormat;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilEvent;
import mineplex.core.common.util.UtilEvent.ActionType;
import mineplex.core.common.util.UtilServer;
@ -122,6 +123,12 @@ public class RunedPickaxe extends RareItem
if (ClansManager.getInstance().getBlockRestore().contains(event.getBlock()))
return;
if (ClansManager.getInstance().getSiegeManager().getOutpostManager().getOutposts().stream().filter(outpost ->
{
return UtilAlg.inBoundingBox(event.getBlock().getLocation(), outpost.getBoundsBlockBreak().getLeft(), outpost.getBoundsBlockBreak().getRight());
}).findAny().isPresent())
return;
if (!UtilTime.elapsed(pick._instamineEnabled, 12000))
{
event.getBlock().breakNaturally();

View File

@ -353,7 +353,7 @@ public class RuneManager implements Listener
{
return true;
}
if (type == Material.RECORD_4 || type == Material.GOLD_RECORD || type == Material.RECORD_3 || type == Material.RECORD_5 || type == Material.GREEN_RECORD)
if (type == Material.RECORD_4 || type == Material.GOLD_RECORD || type == Material.RECORD_3 || type == Material.RECORD_5 || type == Material.GREEN_RECORD || type == Material.RECORD_12)
{
return true;
}

View File

@ -44,14 +44,13 @@ import mineplex.game.clans.items.attributes.weapon.JaggedAttribute;
import mineplex.game.clans.items.attributes.weapon.SharpAttribute;
import mineplex.game.clans.items.legendaries.AlligatorsTooth;
import mineplex.game.clans.items.legendaries.DemonicScythe;
import mineplex.game.clans.items.legendaries.EnergyCrossbow;
import mineplex.game.clans.items.legendaries.GiantsBroadsword;
import mineplex.game.clans.items.legendaries.HyperAxe;
import mineplex.game.clans.items.legendaries.KnightLance;
import mineplex.game.clans.items.legendaries.LegendaryItem;
import mineplex.game.clans.items.legendaries.MagneticMaul;
import mineplex.game.clans.items.legendaries.MeridianScepter;
import mineplex.game.clans.items.legendaries.WindBlade;
import mineplex.game.clans.items.rares.Crossbow;
import mineplex.game.clans.items.rares.RareItem;
import mineplex.game.clans.items.rares.RunedPickaxe;
@ -106,7 +105,7 @@ public class GearPage extends ShopPageBase<GearManager, GearShop>
}
};
_legendaryItems = Arrays.<Class<? extends LegendaryItem>> asList(MeridianScepter.class, AlligatorsTooth.class, WindBlade.class, GiantsBroadsword.class, HyperAxe.class, MagneticMaul.class, DemonicScythe.class);
_legendaryItems = Arrays.<Class<? extends LegendaryItem>> asList(MeridianScepter.class, AlligatorsTooth.class, WindBlade.class, GiantsBroadsword.class, HyperAxe.class, MagneticMaul.class, DemonicScythe.class, KnightLance.class);
_rareItems = Arrays.<Class<? extends RareItem>> asList(RunedPickaxe.class);
@ -176,7 +175,6 @@ public class GearPage extends ShopPageBase<GearManager, GearShop>
{
stageMaterial = stage3.getRight();
}
}
else if (_stage == 3)
{
@ -209,12 +207,7 @@ public class GearPage extends ShopPageBase<GearManager, GearShop>
e.printStackTrace();
}
addButton(4, stageMaterial, 0, stageTitle, new IButton()
{
public void onClick(Player player, ClickType clickType)
{
}
}, false);
addButton(4, stageMaterial, 0, stageTitle, (player, clickType) -> {}, false);
addButton(45, Material.REDSTONE_BLOCK, 0, C.cRed + "Previous page", _backButton, false);
addButton(53, Material.EMERALD_BLOCK, 0, C.cGreen + "Next page", _nextButton, false);
@ -417,7 +410,7 @@ public class GearPage extends ShopPageBase<GearManager, GearShop>
* The only time this code block should be reached is when
* _itemType is BOW, or if there are ever new item types
* added which don't have a case, since LEGENDARY is checked
* seperately, and ARMOR, and WEAPON have their own cases.
* separately, and ARMOR, and WEAPON have their own cases.
*/
_factory.setType(Material.BOW);
@ -782,7 +775,7 @@ public class GearPage extends ShopPageBase<GearManager, GearShop>
public void onClick(Player player, ClickType clickType)
{
player.getInventory().addItem(item);
getPlugin().getPlayerGear(player).updateCache(true);
}
}, new String[] { C.cWhite + "Click to get item" });
}
@ -795,5 +788,4 @@ public class GearPage extends ShopPageBase<GearManager, GearShop>
}
buildPage();
}
}
}

View File

@ -100,7 +100,7 @@ public class BankPage extends ShopPageBase<ClansManager, BankShop>
String playerGoldString = ChatColor.RESET + F.value("Your Gold", playerGold + "g");
String purchaseString = ChatColor.RESET + F.value("Token Value", TOKEN_VALUE + "g");
String goldString = ChatColor.RESET + C.cWhite + "Store your bank gold in the form of a gold token!";
ShopItem shopItem = new ShopItem(Material.RECORD_12, title, new String[] {" ", playerGoldString, purchaseString, goldString}, 0, true, true);
ShopItem shopItem = new ShopItem(Material.RABBIT_FOOT, title, new String[] {" ", playerGoldString, purchaseString, goldString}, 0, true, true);
addButton(3, shopItem, button);
}
@ -114,7 +114,7 @@ public class BankPage extends ShopPageBase<ClansManager, BankShop>
String playerGoldString = ChatColor.RESET + F.value("Your Gold", playerGold + "g");
String purchaseString = ChatColor.RESET + C.cWhite + "You don't have enough gold";
String goldString = ChatColor.RESET + C.cWhite + "You need " + C.cYellow + goldCost + C.cWhite + " gold to purchase a token.";
ShopItem shopItem = new ShopItem(Material.RECORD_12, title, new String[] {" ", playerGoldString, purchaseString, goldString}, 0, true, true);
ShopItem shopItem = new ShopItem(Material.RABBIT_FOOT, title, new String[] {" ", playerGoldString, purchaseString, goldString}, 0, true, true);
addButton(3, shopItem, button);
}

View File

@ -1,16 +1,11 @@
package mineplex.game.clans.shop.bank;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import org.bukkit.inventory.ItemStack;
import mineplex.core.common.util.Callback;
import mineplex.core.donation.DonationManager;
import mineplex.core.recharge.Recharge;
import mineplex.core.shop.item.IButton;
import mineplex.game.clans.clans.ClanInfo;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.economy.GoldManager;
import mineplex.game.clans.items.CustomItem;
import mineplex.game.clans.items.GearManager;
@ -47,5 +42,4 @@ public class CashInButton implements IButton
_page.refresh();
}
}
}
}

View File

@ -1,6 +1,5 @@
package mineplex.game.clans.shop.bank;
import org.bukkit.Sound;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
@ -34,5 +33,4 @@ public class StoreGoldButton implements IButton
_page.refresh();
}
}
}

View File

@ -4,8 +4,31 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.DyeColor;
import org.bukkit.Effect;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import com.google.common.collect.Lists;
//import mineplex.game.clans.tutorial.tutorials.clans.repository.TutorialRepository;
import mineplex.core.common.util.C;
import mineplex.core.common.util.Callback;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilFirework;
@ -42,30 +65,6 @@ import mineplex.game.clans.tutorial.tutorials.clans.objective.FinalObjective;
import mineplex.game.clans.tutorial.tutorials.clans.objective.PurchaseItemsObjective;
import mineplex.game.clans.tutorial.tutorials.clans.objective.ShopsObjective;
import org.bukkit.Bukkit;
import org.bukkit.DyeColor;
import org.bukkit.Effect;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.java.JavaPlugin;
import com.google.common.collect.Lists;
//import mineplex.game.clans.tutorial.tutorials.clans.repository.TutorialRepository;
public class ClansMainTutorial extends Tutorial
{
// The distance from which the gate opens when a player approaches.
@ -89,7 +88,7 @@ public class ClansMainTutorial extends Tutorial
{
super(plugin, message, hologram, "Clans Tutorial", "main", Material.DIAMOND_SWORD, (byte) 0);
_fireworks = new ArrayList<Player>();
_fireworks = new ArrayList<>();
try
{
@ -121,14 +120,15 @@ public class ClansMainTutorial extends Tutorial
_fireworks.add(player);
UtilTextMiddle.display(C.cYellow + "Congratulations", "You have completed the Tutorial!", 10, 60, 10, player);
Bukkit.getScheduler().runTaskLater(getPlugin(), () -> {
Bukkit.getScheduler().runTaskLater(getPlugin(), () ->
{
_fireworks.remove(player);
getMessage().removePlayer(player);
player.teleport(Spawn.getNorthSpawn());
UtilInv.Clear(player);
// ClansManager.getInstance().getItemMapManager().setMap(player);
ClansManager.getInstance().getItemMapManager().setMap(player);
}, 20 * 10L);
player.setWalkSpeed(0.2F);
@ -145,14 +145,16 @@ public class ClansMainTutorial extends Tutorial
}
/*
ClansManager.getInstance().runAsync(() -> {
ClansManager.getInstance().runAsync(() ->
{
_repository.SetTimesPlayed(player.getUniqueId(), _repository.GetTimesPlayed(player.getUniqueId()) + 1);
final int times = _repository.GetTimesPlayed(player.getUniqueId());
if (_repository.GetTimesPlayed(player.getUniqueId()) == 1)
{
ClansManager.getInstance().runSync(() -> {
ClansManager.getInstance().runSync(() ->
{
if (times == 1)
{
GoldManager.getInstance().addGold(player, 32000);
@ -620,4 +622,4 @@ public class ClansMainTutorial extends Tutorial
TutorialRegion region = getRegion(player);
return isIn(block.getLocation(), region, ClansMainTutorial.Bounds.LAND_CLAIM);
}
}
}