Merge remote-tracking branch 'origin/master'

This commit is contained in:
Shaun Bennett 2015-02-05 21:36:19 -05:00
commit f8885e4c5c
21 changed files with 806 additions and 819 deletions

View File

@ -3,7 +3,7 @@ package mineplex.bungee.playerTracker;
import java.io.File;
import net.md_5.bungee.api.event.PlayerDisconnectEvent;
import net.md_5.bungee.api.event.ServerSwitchEvent;
import net.md_5.bungee.api.event.ServerConnectedEvent;
import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.api.plugin.Plugin;
import net.md_5.bungee.event.EventHandler;
@ -26,7 +26,7 @@ public class PlayerTracker implements Listener
}
@EventHandler
public void playerConnect(final ServerSwitchEvent event)
public void playerConnect(final ServerConnectedEvent event)
{
_plugin.getProxy().getScheduler().runAsync(_plugin, new Runnable()
{

View File

@ -46,7 +46,7 @@ public class UtilTextBottom
amount = 1 - amount;
//Generate Bar
int bars = 24;
int bars = 52;
String progressBar = C.cGreen + "";
boolean colorChange = false;
for (int i=0 ; i<bars ; i++)
@ -57,7 +57,7 @@ public class UtilTextBottom
colorChange = true;
}
progressBar += "";
progressBar += "|";
}
//Send to Player

View File

@ -1,44 +0,0 @@
package mineplex.core.cosmetic.ui.button;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import mineplex.core.cosmetic.ui.page.Menu;
import mineplex.core.shop.item.IButton;
public class TreasureButton implements IButton
{
private Menu _menu;
private boolean _hasEnoughChests;
private boolean _hasEnoughKeys;
private boolean _canPurchaseKey;
public TreasureButton(Menu menu, boolean hasEnoughChests, boolean hasEnoughKeys, boolean canPurchaseKey)
{
_menu = menu;
_hasEnoughChests = hasEnoughChests;
_hasEnoughKeys = hasEnoughKeys;
_canPurchaseKey = canPurchaseKey;
}
public void onClick(Player player, ClickType clickType)
{
if (clickType.isLeftClick())
{
if (_hasEnoughChests && _hasEnoughKeys)
{
_menu.openTreasure(player);
player.closeInventory();
}
else if (_hasEnoughChests && _canPurchaseKey)
{
_menu.attemptPurchaseKey(player);
}
}
else if (clickType.isRightClick())
{
if (_canPurchaseKey)
_menu.attemptPurchaseKey(player);
}
}
}

View File

@ -1,7 +1,5 @@
package mineplex.core.cosmetic.ui.page;
import java.util.ArrayList;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Creature;
@ -12,8 +10,6 @@ import org.bukkit.event.inventory.ClickType;
import mineplex.core.account.CoreClientManager;
import mineplex.core.common.CurrencyType;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.cosmetic.CosmeticManager;
import mineplex.core.cosmetic.ui.CosmeticShop;
import mineplex.core.cosmetic.ui.button.OpenCostumes;
@ -23,7 +19,6 @@ import mineplex.core.cosmetic.ui.button.OpenMounts;
import mineplex.core.cosmetic.ui.button.OpenMusic;
import mineplex.core.cosmetic.ui.button.OpenParticles;
import mineplex.core.cosmetic.ui.button.OpenPets;
import mineplex.core.cosmetic.ui.button.TreasureButton;
import mineplex.core.donation.DonationManager;
import mineplex.core.gadget.types.Gadget;
import mineplex.core.gadget.types.GadgetType;
@ -33,7 +28,6 @@ import mineplex.core.shop.item.ShopItem;
import mineplex.core.shop.page.ConfirmationPage;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.core.treasure.TreasureKey;
import mineplex.core.treasure.TreasureManager;
public class Menu extends ShopPageBase<CosmeticManager, CosmeticShop>
{
@ -47,7 +41,7 @@ public class Menu extends ShopPageBase<CosmeticManager, CosmeticShop>
@Override
protected void BuildPage()
{
AddItem(2, new ShopItem(175, DonationManager.Get(Player.getName()).getCoins() + " Coins", new String[]
AddItem(4, new ShopItem(175, DonationManager.Get(Player.getName()).getCoins() + " Coins", new String[]
{
" ",
ChatColor.RESET + C.cYellow + "Purchase Coins",
@ -60,54 +54,6 @@ public class Menu extends ShopPageBase<CosmeticManager, CosmeticShop>
ChatColor.RESET + "Receives 15000 Coins per Month",
}, 1, false));
int treasureChestCount = Plugin.getInventoryManager().Get(Player).getItemCount("Treasure Chest");
int treasureKeyCount = Plugin.getInventoryManager().Get(Player).getItemCount("Treasure Key");
boolean canPurchaseKey = DonationManager.Get(Player.getName()).GetBalance(CurrencyType.Coins) >= 1000;
ArrayList<String> lore = new ArrayList<String>();
lore.add(ChatColor.RESET + "You can find all kinds of rare");
lore.add(ChatColor.RESET + "and exciting loot inside!");
lore.add(" ");
lore.add(ChatColor.RESET + C.cYellow + "Treasure Chests: " + ChatColor.RESET + treasureChestCount);
lore.add(ChatColor.RESET + C.cYellow + "Treasure Keys: " + ChatColor.RESET + treasureKeyCount);
lore.add(" ");
if (treasureChestCount > 0 && treasureKeyCount > 0)
{
lore.add(ChatColor.RESET + C.cGreen + "Left-Click to open Treasure Chest");
lore.add(ChatColor.RESET + " Uses 1 Treasure Chest");
lore.add(ChatColor.RESET + " Uses 1 Treasure Key");
}
else if (treasureChestCount > 0)
{
lore.add(ChatColor.RESET + C.cRed + "Left-Click to open Treasure Chest");
lore.add(ChatColor.RESET + " This requires 1 Treasure Key");
lore.add(ChatColor.RESET + " You do not have any Treasure Keys");
}
else
{
lore.add(ChatColor.RESET + C.cRed + "Left-Click to open Treasure Chest");
lore.add(ChatColor.RESET + " This requires 1 Treasure Chest");
lore.add(ChatColor.RESET + " Find Treasure Chests by playing games");
}
lore.add(" ");
if (canPurchaseKey)
{
lore.add(ChatColor.RESET + C.cGreen + "Right-Click to purchase Treasure Key");
lore.add(ChatColor.RESET + " Costs 1000 Coins");
}
else
{
lore.add(ChatColor.RESET + C.cRed + "Right-Click to purchase Treasure Key");
lore.add(ChatColor.RESET + " Costs 1000 Coins");
lore.add(ChatColor.RESET + " You cannot afford a Treasure Key");
}
AddButton(4, new ShopItem(Material.CHEST, ChatColor.RESET + C.cGreen + C.Bold + "Treasure Chest", lore.toArray(new String[0]), 1, false), new TreasureButton(this, treasureChestCount > 0, treasureKeyCount > 0, canPurchaseKey));
AddButton(18, new ShopItem(Material.NETHER_STAR, "Particle Effects", 1, false), new OpenParticles(this));
AddButton(20, new ShopItem(Material.BOW, "Gadgets", 1, false), new OpenGadgets(this));
AddButton(22, new ShopItem(Material.LEATHER, "Morphs", 1, false), new OpenMorphs(this));
@ -212,19 +158,6 @@ public class Menu extends ShopPageBase<CosmeticManager, CosmeticShop>
Shop.OpenPageForPlayer(player, new MusicPage(Plugin, Shop, ClientManager, DonationManager, "Music", player));
}
public void openTreasure(Player player)
{
TreasureManager treasureManager = Plugin.getTreasureManager();
if (treasureManager == null)
{
UtilPlayer.message(player, F.main("Treasure", "You cannot open Treasure Chests on this server"));
}
else
{
treasureManager.attemptOpenTreasure(player);
}
}
public void attemptPurchaseKey(Player player)
{
Shop.OpenPageForPlayer(player, new ConfirmationPage<CosmeticManager, CosmeticShop>(Plugin, Shop, ClientManager, DonationManager, new Runnable()

View File

@ -33,16 +33,4 @@ public class BlockInfo
{
return _data;
}
@Override
public int hashCode()
{
return _block.hashCode();
}
@Override
public boolean equals(Object obj)
{
return _block.equals(obj);
}
}

View File

@ -2,22 +2,15 @@ package mineplex.core.treasure;
import org.bukkit.block.Block;
import mineplex.core.reward.Reward;
/**
* Created by Shaun on 8/29/2014.
*/
public class ChestData
{
private Block _block;
private Reward _reward;
private boolean _opened;
public ChestData(Block block, Reward reward)
public ChestData(Block block)
{
_block = block;
_opened = false;
_reward = reward;
}
public boolean isOpened()
@ -35,9 +28,4 @@ public class ChestData
return _block;
}
public Reward getReward()
{
return _reward;
}
}

View File

@ -1,21 +1,20 @@
package mineplex.core.treasure;
import java.util.HashSet;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.Set;
import org.bukkit.Bukkit;
import org.bukkit.Effect;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.craftbukkit.v1_7_R4.entity.CraftPlayer;
import org.bukkit.craftbukkit.v1_7_R4.util.CraftMagicNumbers;
import org.bukkit.entity.Player;
import net.minecraft.server.v1_7_R4.PacketPlayOutBlockAction;
import mineplex.core.blockrestore.BlockRestore;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
@ -25,6 +24,7 @@ import mineplex.core.reward.Reward;
import mineplex.core.reward.RewardData;
import mineplex.core.reward.RewardRarity;
import mineplex.core.treasure.animation.Animation;
import mineplex.core.treasure.animation.BlockChangeAnimation;
import mineplex.core.treasure.animation.ChestOpenAnimation;
import mineplex.core.treasure.animation.ChestSpawnAnimation;
import mineplex.core.treasure.animation.LegendaryAnimation;
@ -39,135 +39,59 @@ public class Treasure
{
private BlockRestore _blockRestore;
// Decay Sets
private HashSet<BlockInfo> _wallsBlockInfo = new HashSet<>();
private HashSet<BlockInfo> _outerRingBlockInfo = new HashSet<>();
private HashSet<BlockInfo> _centerBlockInfo = new HashSet<>();
private HashSet<BlockInfo> _chestBlockInfo = new HashSet<>();
private List<BlockInfo> _chestBlockInfo = new ArrayList<BlockInfo>();
private List<BlockInfo> _openedChestBlockInfo = new ArrayList<BlockInfo>();
private List<BlockInfo> _otherBlockInfo = new ArrayList<BlockInfo>();
private Player _player;
private Random _random;
private Block _centerBlock;
private int _tickCount;
private TreasureType _treasureType;
private ChestData[] _chestData;
private int _currentChest;
private Reward[] _rewards;
private int _currentReward;
private boolean _finished;
private int _finishedTickCount;
private LinkedList<Animation> _animations;
private TreasureStyle _style;
private HologramManager _hologramManager;
public Treasure(Player player, Reward[] rewards, BlockRestore blockRestore, HologramManager hologramManager)
public Treasure(Player player, Reward[] rewards, Block centerBlock, Block[] chestBlocks, TreasureType treasureType, BlockRestore blockRestore, HologramManager hologramManager)
{
this(player, new Random(), rewards, hologramManager);
this(player, new Random(), rewards, centerBlock, chestBlocks, treasureType, hologramManager);
_blockRestore = blockRestore;
}
public Treasure(Player player, Random seed, Reward[] rewards, HologramManager hologramManager)
public Treasure(Player player, Random seed, Reward[] rewards, Block centerBlock, Block[] chestBlocks, TreasureType treasureType, HologramManager hologramManager)
{
_player = player;
_random = seed;
_style = TreasureStyle.values()[_random.nextInt(TreasureStyle.values().length)];
_treasureType = treasureType;
_centerBlock = player.getLocation().getBlock().getRelative(BlockFace.DOWN);
_centerBlock = centerBlock;
_animations = new LinkedList<Animation>();
_hologramManager = hologramManager;
// _animations.add(new ParticleAnimation(this));
_currentChest = 0;
_currentReward = 0;
_rewards = rewards;
_chestData = new ChestData[4];
_chestData[0] = new ChestData(_centerBlock.getRelative(2, 1, 0), rewards[0]);
_chestData[1] = new ChestData(_centerBlock.getRelative(-2, 1, 0), rewards[1]);
_chestData[2] = new ChestData(_centerBlock.getRelative(0, 1, 2), rewards[2]);
_chestData[3] = new ChestData(_centerBlock.getRelative(0, 1, -2), rewards[3]);
}
private void createCenterClay()
{
for (int x = -1; x <= 1; x++)
_chestData = new ChestData[chestBlocks.length];
for (int i = 0; i < _chestData.length; i++)
{
for (int z = -1; z <= 1; z++)
{
if (Math.abs(x) == 1 || Math.abs(z) == 1)
{
Block block = _centerBlock.getRelative(x, 0, z);
_blockRestore.Restore(block);
_centerBlockInfo.add(new BlockInfo(block));
setBlock(block, _style.getPrimaryMaterial(), _style.getPrimaryData());
}
}
}
}
private void createOuterClay()
{
for (int x = -2; x <= 2; x++)
{
{
Block block = _centerBlock.getRelative(x, 0, -2);
_blockRestore.Restore(block);
_outerRingBlockInfo.add(new BlockInfo(block));
setBlock(block, _style.getSecondaryMaterial(), _style.getSecondaryData());
}
{
Block block = _centerBlock.getRelative(x, 0, 2);
_blockRestore.Restore(block);
_outerRingBlockInfo.add(new BlockInfo(block));
setBlock(block, _style.getSecondaryMaterial(), _style.getSecondaryData());
}
_chestData[i] = new ChestData(chestBlocks[i]);
}
for (int z = -1; z <= 1; z++)
{
{
Block block = _centerBlock.getRelative(-2, 0, z);
_blockRestore.Restore(block);
_outerRingBlockInfo.add(new BlockInfo(block));
setBlock(block, _style.getSecondaryMaterial(), _style.getSecondaryData());
}
{
Block block = _centerBlock.getRelative(2, 0, z);
_blockRestore.Restore(block);
_outerRingBlockInfo.add(new BlockInfo(block));
setBlock(block, _style.getSecondaryMaterial(), _style.getSecondaryData());
}
}
}
private void createWalls()
{
for (int z = -2; z <= 2; z++)
{
for (int x = -2; x <= 2; x++)
{
if ((Math.abs(x) == 2 || Math.abs(z) == 2) && (x != 0 && z != 0))
{
Block playerBlock = getPlayerBlock();
Block block = playerBlock.getRelative(x, 0, z);
_blockRestore.Restore(block);
_wallsBlockInfo.add(new BlockInfo(block));
setBlock(block, _style.getWallMaterial(), _style.getWallData());
}
}
}
if (_treasureType == TreasureType.HEROIC || _treasureType == TreasureType.LEGENDARY)
_animations.add(new BlockChangeAnimation(this, _otherBlockInfo));
}
public int getFinishedTickCount()
@ -182,59 +106,21 @@ public class Treasure
_finishedTickCount++;
}
if (_tickCount == 5)
if (_tickCount % 10 == 0 && _currentChest < _chestData.length)
{
Block block = _centerBlock;
_blockRestore.Restore(block);
_centerBlockInfo.add(new BlockInfo(block));
_centerBlockInfo.add(new BlockInfo(block.getRelative(BlockFace.DOWN)));
setBlock(block, Material.REDSTONE_LAMP_ON, (byte) 0);
setBlock(block.getRelative(BlockFace.DOWN), Material.REDSTONE_TORCH_ON, (byte) 0);
Block block = _chestData[_currentChest].getBlock();
ChestSpawnAnimation chestSpawn = new ChestSpawnAnimation(this, block, _chestBlockInfo);
_animations.add(chestSpawn);
_currentChest++;
}
else if (_tickCount == 10)
{
createCenterClay();
}
else if (_tickCount == 20)
{
createOuterClay();
}
else if (_tickCount == 30)
{
createWalls();
}
else if (_tickCount == 50)
{
Block block = getPlayerBlock().getRelative(2, 0, 0);
ChestSpawnAnimation task = new ChestSpawnAnimation(this, block, (byte)4, _chestBlockInfo);
_animations.add(task);
}
else if (_tickCount == 80)
{
Block block = getPlayerBlock().getRelative(-2, 0, 0);
ChestSpawnAnimation task = new ChestSpawnAnimation(this, block, (byte)5, _chestBlockInfo);
_animations.add(task);
}
else if (_tickCount == 110)
{
Block block = getPlayerBlock().getRelative(0, 0, 2);
ChestSpawnAnimation task = new ChestSpawnAnimation(this, block, (byte)2, _chestBlockInfo);
_animations.add(task);
}
else if (_tickCount == 140)
{
Block block = getPlayerBlock().getRelative(0, 0, -2);
ChestSpawnAnimation task = new ChestSpawnAnimation(this, block, (byte)3, _chestBlockInfo);
_animations.add(task);
}
else if (_tickCount == 60 * 20)
if (_tickCount == 60 * 20)
{
for (BlockInfo blockInfo : _chestBlockInfo)
{
Block block = blockInfo.getBlock();
openChest(block);
openChest(block, false);
}
}
@ -271,11 +157,6 @@ public class Treasure
return _centerBlock;
}
public Block getPlayerBlock()
{
return _centerBlock.getRelative(BlockFace.UP);
}
public void setBlock(Block block, Material material, byte data)
{
block.setType(material);
@ -284,27 +165,41 @@ public class Treasure
}
public void openChest(Block block)
{
openChest(block, true);
}
public void openChest(Block block, boolean swapList)
{
ChestData data = getChestData(block);
if (data != null && !data.isOpened())
if (data != null && !data.isOpened() && _currentReward < _rewards.length)
{
RewardData rewardData = data.getReward().giveReward("Treasure", _player);
Reward reward = _rewards[_currentReward];
RewardData rewardData = reward.giveReward("Treasure", _player);
_currentReward++;
if (swapList)
{
BlockInfo info = getBlockInfo(block);
_chestBlockInfo.remove(info);
_openedChestBlockInfo.add(info);
}
data.setOpened(true);
ChestOpenAnimation chestOpenTask = new ChestOpenAnimation(this, data, rewardData, _hologramManager);
_animations.add(chestOpenTask);
// Extra effects based off the rarity of the treasure
if (data.getReward().getRarity() == RewardRarity.UNCOMMON)
if (reward.getRarity() == RewardRarity.UNCOMMON)
{
_animations.add(new UncommonAnimation(this, data.getBlock()));
}
else if (data.getReward().getRarity() == RewardRarity.RARE)
else if (reward.getRarity() == RewardRarity.RARE)
{
_animations.add(new RareAnimation(this, data.getBlock().getLocation().add(0.5, 1.5, 0.5)));
Bukkit.broadcastMessage(F.main("Treasure", F.name(_player.getName()) + " found " + C.cGold + "Rare " + rewardData.getFriendlyName()));
}
else if (data.getReward().getRarity() == RewardRarity.LEGENDARY)
else if (reward.getRarity() == RewardRarity.LEGENDARY)
{
_animations.add(new LegendaryAnimation(this, data.getBlock()));
Bukkit.broadcastMessage(F.main("Treasure", F.name(_player.getName()) + " found " + C.cRed + "Legendary " + rewardData.getFriendlyName()));
@ -312,13 +207,23 @@ public class Treasure
if (isFinished())
{
TreasureRemoveAnimation animation = new TreasureRemoveAnimation(this, _centerBlockInfo, _outerRingBlockInfo, _wallsBlockInfo);
TreasureRemoveAnimation animation = new TreasureRemoveAnimation(this, _openedChestBlockInfo, _chestBlockInfo);
_animations.add(animation);
_finished = true;
}
}
}
public BlockInfo getBlockInfo(Block block)
{
for (BlockInfo blockInfo : _chestBlockInfo)
{
if (blockInfo.getBlock().equals(block))
return blockInfo;
}
return null;
}
public void sendChestOpenPackets(Player... players)
{
for (ChestData data : _chestData)
@ -357,35 +262,21 @@ public class Treasure
public boolean isFinished()
{
boolean allOpened = true;
for (int i = 0; i < _chestData.length; i++)
{
if (!_chestData[i].isOpened())
allOpened = false;
}
return allOpened;
return _currentReward == _rewards.length;
}
public void cleanup()
{
for (ChestData chestData : _chestData)
for (int i = _currentReward; i < _rewards.length; i++)
{
// Give any unopened rewards to the player
// This only applies if they leave the server
// while opening a treasure
if (!chestData.isOpened())
{
chestData.setOpened(true);
chestData.getReward().giveReward("Treasure", _player);
}
_rewards[_currentReward].giveReward("Treasure", _player);
}
// Remove any extra blocks
resetBlockInfo(_wallsBlockInfo);
resetBlockInfo(_centerBlockInfo);
resetBlockInfo(_outerRingBlockInfo);
resetBlockInfo(_chestBlockInfo);
resetBlockInfo(_openedChestBlockInfo);
resetBlockInfo(_otherBlockInfo);
for (Animation animation : _animations)
{
@ -394,40 +285,33 @@ public class Treasure
_animations.clear();
}
public void resetBlockInfo(Set<BlockInfo> blockInfoSet)
public void resetBlockInfo(List<BlockInfo> blockInfoSet)
{
for (BlockInfo blockInfo : blockInfoSet)
{
Block block = blockInfo.getBlock();
if (block.getType().equals(Material.CHEST))
{
UtilParticle.PlayParticle(UtilParticle.ParticleType.LARGE_SMOKE, block.getLocation().add(0.5, 0.5, 0.5), 0.5F, 0.5F, 0.5F, 0.1F, 10);
// block.getLocation().getWorld().createExplosion(block.getLocation().add(0.5, 0.5, 0.5), 0F);
}
block.getLocation().getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getTypeId());
block.setTypeId(blockInfo.getId());
block.setData(blockInfo.getData());
resetBlockInfo(blockInfo);
}
blockInfoSet.clear();
}
public void resetBlockInfo(BlockInfo blockInfo)
{
Block block = blockInfo.getBlock();
if (block.getType().equals(Material.CHEST))
{
UtilParticle.PlayParticle(UtilParticle.ParticleType.LARGE_SMOKE, block.getLocation().add(0.5, 0.5, 0.5), 0.5F, 0.5F, 0.5F, 0.1F, 10);
// block.getLocation().getWorld().createExplosion(block.getLocation().add(0.5, 0.5, 0.5), 0F);
}
block.getLocation().getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, block.getTypeId());
block.setTypeId(blockInfo.getId());
block.setData(blockInfo.getData());
}
public boolean containsBlock(Block block)
{
for (BlockInfo info : _wallsBlockInfo)
if (info.getBlock().equals(block))
return true;
for (BlockInfo info : _outerRingBlockInfo)
if (info.getBlock().equals(block))
return true;
for (BlockInfo info : _centerBlockInfo)
if (info.getBlock().equals(block))
return true;
for (BlockInfo info : _chestBlockInfo)
if (info.getBlock().equals(block))
return true;
@ -435,9 +319,8 @@ public class Treasure
return false;
}
public TreasureStyle getStyle()
public TreasureType getTreasureType()
{
return _style;
return _treasureType;
}
}

View File

@ -0,0 +1,322 @@
package mineplex.core.treasure;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerVelocityEvent;
import mineplex.core.account.CoreClientManager;
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.UtilPlayer;
import mineplex.core.common.util.UtilTextMiddle;
import mineplex.core.donation.DonationManager;
import mineplex.core.gadget.event.GadgetBlockEvent;
import mineplex.core.hologram.Hologram;
import mineplex.core.hologram.HologramManager;
import mineplex.core.inventory.InventoryManager;
import mineplex.core.reward.Reward;
import mineplex.core.treasure.event.TreasureFinishEvent;
import mineplex.core.treasure.event.TreasureStartEvent;
import mineplex.core.treasure.gui.TreasureShop;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
public class TreasureLocation implements Listener
{
private TreasureManager _treasureManager;
private InventoryManager _inventoryManager;
private Hologram _hologram;
private HologramManager _hologramManager;
private Treasure _currentTreasure;
private Block _chestBlock;
private byte _chestBlockData;
private Block[] _chestSpawns;
private TreasureShop _shop;
private Location _resetLocation;
public TreasureLocation(TreasureManager treasureManager, InventoryManager inventoryManager, CoreClientManager clientManager, DonationManager donationManager, Block chestBlock, Block[] chestSpawns, Location resetLocation, HologramManager hologramManager)
{
_treasureManager = treasureManager;
_resetLocation = resetLocation;
_inventoryManager = inventoryManager;
_chestBlock = chestBlock;
_chestBlockData = _chestBlock.getData();
_chestSpawns = chestSpawns;
_hologramManager = hologramManager;
_currentTreasure = null;
_hologram = new Hologram(_hologramManager, chestBlock.getLocation().add(0.5, 2.5, 0.5), C.cGreen + C.Bold + "Open Treasure");
setHoloChestVisible(true);
_shop = new TreasureShop(treasureManager, _inventoryManager, clientManager, donationManager, this);
}
@EventHandler
public void onInteract(PlayerInteractEvent event)
{
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().equals(_chestBlock))
{
openShop(event.getPlayer());
event.setCancelled(true);
}
}
public void attemptOpenTreasure(Player player, TreasureType treasureType)
{
if (isTreasureInProgress())
{
player.sendMessage(F.main("Treasure", "Please wait for the current chest to be opened"));
return;
}
if (!chargeAccount(player, treasureType))
{
player.sendMessage(F.main("Treasure", "You dont have any chests to open!"));
return;
}
TreasureStartEvent event = new TreasureStartEvent(player);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled())
{
return;
}
setHoloChestVisible(false);
if (treasureType == TreasureType.HEROIC || treasureType == TreasureType.LEGENDARY)
Bukkit.broadcastMessage(F.main("Treasure", F.name(player.getName()) + " is opening a " + treasureType.getName()));
Reward[] rewards = _treasureManager.getRewards(player, treasureType.getRewardType());
Treasure treasure = new Treasure(player, rewards, _chestBlock, _chestSpawns, treasureType, _treasureManager.getBlockRestore(), _hologramManager);
_currentTreasure = treasure;
UtilTextMiddle.display(treasureType.getName(), "Choose 4 Chests To Open", 20, 180, 20, player);
UtilPlayer.message(player, F.main("Treasure", "Choose 4 Chests To Open"));
Location teleportLocation = treasure.getCenterBlock().getLocation().add(0.5, 0, 0.5);
teleportLocation.setPitch(player.getLocation().getPitch());
teleportLocation.setYaw(player.getLocation().getYaw());
for (Entity entity : player.getNearbyEntities(3, 3, 3))
{
UtilAction.velocity(entity, UtilAlg.getTrajectory(entity.getLocation(), treasure.getCenterBlock().getLocation()).multiply(-1), 1.5, true, 0.8, 0, 1.0, true);
}
player.teleport(teleportLocation);
}
private boolean chargeAccount(Player player, TreasureType treasureType)
{
int itemCount = _inventoryManager.Get(player).getItemCount(treasureType.getItemName());
if (itemCount > 0)
{
_inventoryManager.addItemToInventory(player, "Item", treasureType.getItemName(), -1);
return true;
}
return false;
}
private void setHoloChestVisible(boolean visible)
{
if (visible)
{
_hologram.start();
_chestBlock.setType(Material.CHEST);
_chestBlock.setData(_chestBlockData);
}
else
{
_hologram.stop();
_chestBlock.setType(Material.AIR);
}
}
public void cleanup()
{
if (_currentTreasure != null)
{
_currentTreasure.cleanup();
_currentTreasure = null;
}
}
@EventHandler
public void update(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK)
return;
if (isTreasureInProgress())
{
Treasure treasure = _currentTreasure;
treasure.update();
if (treasure.isFinished() && treasure.getFinishedTickCount() >= 80)
{
treasure.cleanup();
TreasureFinishEvent finishEvent = new TreasureFinishEvent(treasure.getPlayer(), treasure);
Bukkit.getPluginManager().callEvent(finishEvent);
}
}
}
@EventHandler
public void onTreasureFinish(TreasureFinishEvent event)
{
if (event.getTreasure().equals(_currentTreasure))
{
Player player = _currentTreasure.getPlayer();
player.teleport(_resetLocation);
_currentTreasure = null;
setHoloChestVisible(true);
}
}
@EventHandler
public void preventGadgetBlockEvent(GadgetBlockEvent event)
{
if (isTreasureInProgress())
{
List<Block> blocks = event.getBlocks();
for (Block block : blocks)
{
if (_currentTreasure.containsBlock(block))
{
event.setCancelled(true);
return;
}
}
}
}
@EventHandler(priority = EventPriority.HIGH)
public void interact(PlayerInteractEvent event)
{
Player player = event.getPlayer();
if (isTreasureInProgress())
{
if (_currentTreasure.getPlayer().equals(player))
{
if (event.getAction() == Action.RIGHT_CLICK_BLOCK)
{
_currentTreasure.openChest(event.getClickedBlock());
}
event.setCancelled(true);
}
else if (event.getAction() == Action.RIGHT_CLICK_BLOCK)
{
ChestData chestData = _currentTreasure.getChestData(event.getClickedBlock());
if (chestData != null)
{
event.setCancelled(true);
}
}
}
}
@EventHandler
public void inventoryOpen(InventoryOpenEvent event)
{
if (isTreasureInProgress() && event.getPlayer().equals(_currentTreasure.getPlayer()))
{
event.setCancelled(true);
}
}
@EventHandler
public void cancelMove(PlayerMoveEvent event)
{
Player player = event.getPlayer();
if (isTreasureInProgress())
{
if (_currentTreasure.getPlayer().equals(player))
{
Treasure treasure = _currentTreasure;
Location centerLocation = treasure.getCenterBlock().getLocation().add(0.5, 0.5, 0.5);
if (event.getTo().distanceSquared(centerLocation) > 9)
{
Location newTo = event.getFrom();
newTo.setPitch(event.getTo().getPitch());
newTo.setYaw(event.getTo().getYaw());
event.setTo(newTo);
}
}
else
{
Location fromLocation = event.getFrom();
Location toLocation = event.getTo();
Location centerLocation = _currentTreasure.getCenterBlock().getLocation().add(0.5, 1.5, 0.5);
double toDistanceFromCenter = centerLocation.distanceSquared(toLocation);
if (toDistanceFromCenter <= 16 && player.getVelocity().lengthSquared() < 10)
{
// Only cancel movement if they are moving towards the center
double fromDistanceFromCenter = centerLocation.distanceSquared(fromLocation);
if (toDistanceFromCenter < fromDistanceFromCenter)
{
Location spawnLocation = new Location(player.getWorld(), 0, 64, 0);
UtilAction.velocity(player, UtilAlg.getTrajectory(player.getLocation(), spawnLocation).multiply(-1), 1.5, true, 0.8, 0, 1.0, true);
event.setTo(event.getFrom());
}
}
}
}
}
@EventHandler
public void cancelVelocity(PlayerVelocityEvent event)
{
Player player = event.getPlayer();
if (isTreasureInProgress() && _currentTreasure.getPlayer().equals(player))
{
event.setCancelled(true);
}
}
@EventHandler
public void quit(PlayerQuitEvent event)
{
if (isTreasureInProgress() && _currentTreasure.getPlayer().equals(event.getPlayer()))
{
reset();
}
}
public boolean isTreasureInProgress()
{
return _currentTreasure != null;
}
public void reset()
{
cleanup();
_chestBlock.setType(Material.CHEST);
_chestBlock.setData(_chestBlockData);
_hologram.start();
}
public void openShop(Player player)
{
_shop.attemptShopOpen(player);
}
}

View File

@ -1,462 +1,132 @@
package mineplex.core.treasure;
import java.util.Iterator;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.Action;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerVelocityEvent;
import org.bukkit.plugin.java.JavaPlugin;
import mineplex.core.MiniPlugin;
import mineplex.core.account.CoreClientManager;
import mineplex.core.blockrestore.BlockRestore;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.NautHashMap;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.donation.DonationManager;
import mineplex.core.event.StackerEvent;
import mineplex.core.gadget.event.GadgetBlockEvent;
import mineplex.core.hologram.HologramManager;
import mineplex.core.inventory.InventoryManager;
import mineplex.core.pet.PetManager;
import mineplex.core.reward.Reward;
import mineplex.core.reward.RewardManager;
import mineplex.core.reward.RewardRarity;
import mineplex.core.reward.RewardType;
import mineplex.core.treasure.event.TreasureFinishEvent;
import mineplex.core.treasure.event.TreasureStartEvent;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
/**
* Created by Shaun on 8/27/2014.
*/
public class TreasureManager extends MiniPlugin
{
private NautHashMap<Player, Treasure> _playerTreasureMap;
private RewardManager _rewardManager;
private InventoryManager _inventoryManager;
private BlockRestore _blockRestore;
private HologramManager _hologramManager;
private List<TreasureLocation> _treasureLocations;
public TreasureManager(JavaPlugin plugin, DonationManager donationManager, InventoryManager inventoryManager, PetManager petManager, BlockRestore blockRestore, HologramManager hologramManager)
public TreasureManager(JavaPlugin plugin, CoreClientManager clientManager, DonationManager donationManager, InventoryManager inventoryManager, PetManager petManager, BlockRestore blockRestore, HologramManager hologramManager)
{
super("Treasure", plugin);
_playerTreasureMap = new NautHashMap<Player, Treasure>();
_inventoryManager = inventoryManager;
_blockRestore = blockRestore;
_hologramManager = hologramManager;
_rewardManager = new RewardManager(donationManager, inventoryManager, petManager,
_rewardManager = new RewardManager(donationManager, inventoryManager, petManager,
100, 250,
500, 1000,
1500, 2500,
6000, 12000,
true);
World world = Bukkit.getWorlds().get(0);
_treasureLocations = new ArrayList<TreasureLocation>();
{
Block chestBlock = world.getBlockAt(-19, 72, -19);
Block chestLoc1 = world.getBlockAt(-16, 72, -20);
Block chestLoc2 = world.getBlockAt(-18, 72, -22);
Block chestLoc3 = world.getBlockAt(-20, 72, -22);
Block chestLoc4 = world.getBlockAt(-22, 72, -20);
Block chestLoc5 = world.getBlockAt(-22, 72, -18);
Block chestLoc6 = world.getBlockAt(-20, 72, -16);
Block chestLoc7 = world.getBlockAt(-18, 72, -16);
Block chestLoc8 = world.getBlockAt(-16, 72, -18);
Location resetLocation = new Location(world, -23.5, 72, -23.5);
_treasureLocations.add(new TreasureLocation(this, _inventoryManager, clientManager, donationManager, chestBlock, new Block[]{chestLoc1, chestLoc2, chestLoc3, chestLoc4, chestLoc5, chestLoc6, chestLoc7, chestLoc8}, resetLocation, _hologramManager));
}
{
Block chestBlock = world.getBlockAt(19, 72, 19);
Block chestLoc1 = world.getBlockAt(16, 72, 20);
Block chestLoc2 = world.getBlockAt(18, 72, 22);
Block chestLoc3 = world.getBlockAt(20, 72, 22);
Block chestLoc4 = world.getBlockAt(22, 72, 20);
Block chestLoc5 = world.getBlockAt(22, 72, 18);
Block chestLoc6 = world.getBlockAt(20, 72, 16);
Block chestLoc7 = world.getBlockAt(18, 72, 16);
Block chestLoc8 = world.getBlockAt(16, 72, 18);
Location resetLocation = new Location(world, 23.5, 72, 23.5);
_treasureLocations.add(new TreasureLocation(this, _inventoryManager, clientManager, donationManager, chestBlock, new Block[]{chestLoc1, chestLoc2, chestLoc3, chestLoc4, chestLoc5, chestLoc6, chestLoc7, chestLoc8}, resetLocation, _hologramManager));
}
{
Block chestBlock = world.getBlockAt(19, 72, -19);
Block chestLoc1 = world.getBlockAt(16, 72, -20);
Block chestLoc2 = world.getBlockAt(18, 72, -22);
Block chestLoc3 = world.getBlockAt(20, 72, -22);
Block chestLoc4 = world.getBlockAt(22, 72, -20);
Block chestLoc5 = world.getBlockAt(22, 72, -18);
Block chestLoc6 = world.getBlockAt(20, 72, -16);
Block chestLoc7 = world.getBlockAt(18, 72, -16);
Block chestLoc8 = world.getBlockAt(16, 72, -18);
Location resetLocation = new Location(world, 23.5, 72, -23.5);
_treasureLocations.add(new TreasureLocation(this, _inventoryManager, clientManager, donationManager, chestBlock, new Block[]{chestLoc1, chestLoc2, chestLoc3, chestLoc4, chestLoc5, chestLoc6, chestLoc7, chestLoc8}, resetLocation, _hologramManager));
}
{
Block chestBlock = world.getBlockAt(-19, 72, 19);
Block chestLoc1 = world.getBlockAt(-16, 72, 20);
Block chestLoc2 = world.getBlockAt(-18, 72, 22);
Block chestLoc3 = world.getBlockAt(-20, 72, 22);
Block chestLoc4 = world.getBlockAt(-22, 72, 20);
Block chestLoc5 = world.getBlockAt(-22, 72, 18);
Block chestLoc6 = world.getBlockAt(-20, 72, 16);
Block chestLoc7 = world.getBlockAt(-18, 72, 16);
Block chestLoc8 = world.getBlockAt(-16, 72, 18);
Location resetLocation = new Location(world, -23.5, 72, 23.5);
_treasureLocations.add(new TreasureLocation(this, _inventoryManager, clientManager, donationManager, chestBlock, new Block[]{chestLoc1, chestLoc2, chestLoc3, chestLoc4, chestLoc5, chestLoc6, chestLoc7, chestLoc8}, resetLocation, _hologramManager));
}
for (TreasureLocation treasureLocation : _treasureLocations)
{
_plugin.getServer().getPluginManager().registerEvents(treasureLocation, _plugin);
}
}
@Override
public void Disable()
{
for (Treasure treasure : _playerTreasureMap.values())
for (TreasureLocation treasureLocation : _treasureLocations)
{
treasure.cleanup();
treasureLocation.cleanup();
}
}
public void attemptOpenTreasure(Player player)
public Reward[] getRewards(Player player, RewardType rewardType)
{
attemptOpenTreasure(player, false);
return _rewardManager.getRewards(player, rewardType);
}
private void attemptOpenTreasure(Player player, boolean ignoreKey)
public BlockRestore getBlockRestore()
{
if (checkNearbyBlocks(player) || checkNearSpawn(player) || checkInAir(player) || checkNearbyTreasure(player) || (!ignoreKey && checkNoTreasureAndKey(player)))
return;
TreasureStartEvent event = new TreasureStartEvent(player);
Bukkit.getPluginManager().callEvent(event);
if (event.isCancelled())
{
return;
}
if (!ignoreKey)
{
// Remove a treasure and a key
_inventoryManager.addItemToInventory(player, "Treasure", "Treasure Key", -1);
_inventoryManager.addItemToInventory(player, "Utility", "Treasure Chest", -1);
}
Bukkit.broadcastMessage(F.main("Treasure", F.name(player.getName()) + " is opening a " + C.cGreen + "Treasure Chest"));
Reward[] rewards = _rewardManager.getRewards(player, RewardType.HeroicChest);
Treasure treasure = new Treasure(player, rewards, _blockRestore, _hologramManager);
_playerTreasureMap.put(player, treasure);
Location teleportLocation = treasure.getPlayerBlock().getLocation().add(0.5, 0, 0.5);
teleportLocation.setPitch(player.getLocation().getPitch());
teleportLocation.setYaw(player.getLocation().getYaw());
for (Entity entity : player.getNearbyEntities(3, 3, 3))
{
UtilAction.velocity(entity, UtilAlg.getTrajectory(entity.getLocation(), treasure.getCenterBlock().getLocation()).multiply(-1), 1.5, true, 0.8, 0, 1.0, true);
}
player.teleport(teleportLocation);
return _blockRestore;
}
private boolean checkNoTreasureAndKey(Player player)
{
int treasureCount = _inventoryManager.Get(player).getItemCount("Treasure Chest");
int treasureKeyCount = _inventoryManager.Get(player).getItemCount("Treasure Key");
if (treasureCount < 1)
{
UtilPlayer.message(player, F.main("Treasure", "You don't have any treasure chests."));
}
else if (treasureKeyCount < 1)
{
UtilPlayer.message(player, F.main("Treasure", "You don't have any treasure keys."));
}
return (treasureCount < 1 || treasureKeyCount < 1);
}
private boolean checkNearbyTreasure(Player player)
{
boolean nearTreasure = false;
for (Treasure treasure : _playerTreasureMap.values())
{
if (UtilMath.offset2d(treasure.getCenterBlock().getLocation(), player.getLocation()) <= 10)
nearTreasure = true;
}
if (nearTreasure)
UtilPlayer.message(player, F.main("Treasure", "You are too close to another players treasure."));
return nearTreasure;
}
private boolean checkNearbyBlocks(Player player)
{
//todo improve this
Block centerBlock = player.getLocation().getBlock();
for (int y = 0; y <= 3; y++)
{
for (int x = -3; x <= 3; x++)
{
for (int z = -3; z <= 3; z++)
{
Block block = centerBlock.getRelative(x, y, z);
if (UtilBlock.solid(block))
{
UtilPlayer.message(player, F.main("Treasure", "You need a clear area to open Treasure Chests."));
return true;
}
}
}
}
// Check for blocks that may disappear if modifying them
for (int y = -3; y <= 0; y++)
{
for (int x = -2; x <= 2; x++)
{
for (int z = -2; z <= 2; z++)
{
Material mat = centerBlock.getRelative(x, y, z).getType();
if (mat == Material.LADDER || mat == Material.TRAP_DOOR || mat == Material.TRIPWIRE_HOOK || mat == Material.PORTAL || mat == Material.ENDER_PORTAL)
{
UtilPlayer.message(player, F.main("Treasure", "You need a clear area to open Treasure Chests."));
return true;
}
}
}
}
// Could now check if the redstone torch can be placed on something, but its not a large deal.
return false;
}
private boolean checkInAir(Player player)
{
boolean grounded = UtilEnt.isGrounded(player);
if (!grounded)
UtilPlayer.message(player, F.main("Treasure", "You can't open chests while in the air."));
return !grounded;
}
private boolean checkNearSpawn(Player player)
{
boolean nearSpawn = UtilMath.offset2d(new Location(player.getWorld(), 0, 0, 0), player.getLocation()) < 10;
if (nearSpawn)
UtilPlayer.message(player, F.main("Treasure", "You can't open chests near spawn."));
return nearSpawn;
}
@EventHandler
public void update(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK)
return;
Iterator<Treasure> iterator = _playerTreasureMap.values().iterator();
while(iterator.hasNext())
{
Treasure treasure = iterator.next();
treasure.update();
if (treasure.isFinished() && treasure.getFinishedTickCount() >= 80)
{
treasure.cleanup();
iterator.remove();
TreasureFinishEvent finishEvent = new TreasureFinishEvent(treasure.getPlayer(), treasure);
Bukkit.getPluginManager().callEvent(finishEvent);
}
}
}
@EventHandler
public void join(PlayerJoinEvent event)
{
final Player player = event.getPlayer();
_plugin.getServer().getScheduler().runTaskLater(_plugin, new Runnable()
{
@Override
public void run()
{
if (!player.isOnline())
return;
for (Treasure treasure : _playerTreasureMap.values())
{
treasure.sendChestOpenPackets(player);
}
}
}, 10L);
}
@EventHandler
public void quit(PlayerQuitEvent event)
{
if (_playerTreasureMap.containsKey(event.getPlayer()))
{
Treasure treasure = _playerTreasureMap.remove(event.getPlayer());
treasure.cleanup();
}
}
@EventHandler
public void cancelMove(PlayerMoveEvent event)
{
Player player = event.getPlayer();
if (_playerTreasureMap.containsKey(player))
{
Treasure treasure = _playerTreasureMap.get(player);
if (!event.getTo().getBlock().getRelative(BlockFace.DOWN).equals(treasure.getCenterBlock()))
{
Location newTo = treasure.getCenterBlock().getLocation().add(0.5, 1.1, 0.5);
newTo.setPitch(event.getTo().getPitch());
newTo.setYaw(event.getTo().getYaw());
event.setTo(newTo);
}
}
else
{
for (Treasure treasure : _playerTreasureMap.values())
{
Location fromLocation = event.getFrom();
Location toLocation = event.getTo();
Location centerLocation = treasure.getCenterBlock().getLocation().add(0.5, 1.5, 0.5);
double toDistanceFromCenter = centerLocation.distanceSquared(toLocation);
if (toDistanceFromCenter <= 9)
{
// Only cancel movement if they are moving towards the center
double fromDistanceFromCenter = centerLocation.distanceSquared(fromLocation);
if (toDistanceFromCenter < fromDistanceFromCenter)
{
UtilAction.velocity(player, UtilAlg.getTrajectory(player.getLocation(), centerLocation).multiply(-1), 1.5, true, 0.8, 0, 1.0, true);
event.setTo(event.getFrom());
}
}
}
}
}
@EventHandler
public void cancelVelocity(PlayerVelocityEvent event)
{
// Need to prevent players
Player player = event.getPlayer();
if (_playerTreasureMap.containsKey(player))
{
event.setCancelled(true);
}
}
@EventHandler
public void cancelStacker(StackerEvent event)
{
if (event.getEntity() instanceof Player)
{
Player player = ((Player) event.getEntity());
if (_playerTreasureMap.containsKey(player))
{
event.setCancelled(true);
}
}
}
@EventHandler
public void inventoryOpen(InventoryOpenEvent event)
{
// Prevent players in treasures from opening inventories
if (event.getPlayer() instanceof Player)
{
if (_playerTreasureMap.containsKey(((Player) event.getPlayer())))
{
event.setCancelled(true);
}
}
}
@EventHandler(priority = EventPriority.HIGH)
public void interact(PlayerInteractEvent event)
{
Player player = event.getPlayer();
if (_playerTreasureMap.containsKey(player))
{
if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getType() == Material.CHEST)
{
Treasure treasure = _playerTreasureMap.get(player);
treasure.openChest(event.getClickedBlock());
}
// Always cancel interact for treasure players, prevents players from being able to open up cosmetic menu and other menus
event.setCancelled(true);
}
else if (event.getAction() == Action.RIGHT_CLICK_BLOCK && event.getClickedBlock().getType() == Material.CHEST)
{
for (Treasure treasure : _playerTreasureMap.values())
{
ChestData data = treasure.getChestData(event.getClickedBlock());
if (data != null)
{
event.setCancelled(true);
}
}
}
}
@EventHandler
public void preventGadgetBlockEvent(GadgetBlockEvent event)
{
List<Block> blocks = event.getBlocks();
for (Block block : blocks)
{
for (Treasure treasure : _playerTreasureMap.values())
{
if (treasure.containsBlock(block))
{
event.setCancelled(true);
return;
}
}
}
}
@EventHandler
public void treasureFinish(TreasureFinishEvent event)
{
_playerTreasureMap.remove(event.getPlayer());
}
@EventHandler
public void command(PlayerCommandPreprocessEvent event)
{
if (!event.getPlayer().isOp())
return;
if (event.getMessage().startsWith("/treasurechest"))
{
event.getPlayer().sendMessage(C.cGreen + C.Bold + "Received 10 Treasure Chest...");
_inventoryManager.addItemToInventory(event.getPlayer(), "Utility", "Treasure Chest", 10);
event.setCancelled(true);
}
if (event.getMessage().startsWith("/treasuredebug"))
{
event.getPlayer().sendMessage(C.cGreen + C.Bold + "Treasure Debug...");
attemptOpenTreasure(event.getPlayer(), true);
event.setCancelled(true);
}
if (event.getMessage().startsWith("/rewardchest") || event.getMessage().startsWith("/rewardgame"))
{
int common = 0;
int uncommon = 0;
int rare = 0;
int legend = 0;
int toTest = 10000000;
for (int i=0 ; i<toTest ; i++)
{
Reward reward = _rewardManager.nextReward(null, null, false, event.getMessage().startsWith("/rewardchest") ? RewardType.HeroicChest : RewardType.GameLoot);
if (reward.getRarity() == RewardRarity.COMMON) common++;
if (reward.getRarity() == RewardRarity.UNCOMMON) uncommon++;
if (reward.getRarity() == RewardRarity.RARE) rare++;
if (reward.getRarity() == RewardRarity.LEGENDARY) legend++;
}
event.getPlayer().sendMessage(C.cGreen + C.Bold + (event.getMessage().startsWith("/rewardchest") ? "Chest Rewards" : "Post-Game Rewards"));
event.getPlayer().sendMessage("Common: " + common + " " + UtilMath.trim(3, (double)common/(double)toTest*100d) + "%");
event.getPlayer().sendMessage("Uncommon: " + uncommon + " " + UtilMath.trim(3, (double)uncommon/(double)toTest*100d) + "%");
event.getPlayer().sendMessage("Rare: " + rare + " " + UtilMath.trim(3, (double)rare/(double)toTest*100d) + "%");
event.getPlayer().sendMessage("Legendary: " + legend + " " + UtilMath.trim(3, (double)legend/(double)toTest*100d) + "%");
event.setCancelled(true);
}
}
}

View File

@ -0,0 +1,53 @@
package mineplex.core.treasure;
import org.bukkit.Material;
import mineplex.core.common.util.C;
import mineplex.core.reward.RewardType;
public enum TreasureType
{
BASIC(C.cYellow + "Basic Chest", "Basic Chest", RewardType.BasicChest, Material.CHEST, TreasureStyle.NATURE),
HEROIC(C.cGold + "Heroic Chest", "Heroic Chest", RewardType.HeroicChest, Material.TRAPPED_CHEST, TreasureStyle.WATER),
LEGENDARY(C.cRed + "Legendary Chest", "Legendary Chest", RewardType.LegendaryChest, Material.ENDER_CHEST, TreasureStyle.NETHER);
private final String _name;
private final RewardType _rewardType;
private final Material _material;
private final TreasureStyle _treasureStyle;
private final String _itemName;
TreasureType(String name, String itemName, RewardType rewardType, Material material, TreasureStyle treasureStyle)
{
_name = name;
_itemName = itemName;
_rewardType = rewardType;
_material = material;
_treasureStyle = treasureStyle;
}
public RewardType getRewardType()
{
return _rewardType;
}
public String getName()
{
return _name;
}
public Material getMaterial()
{
return _material;
}
public TreasureStyle getStyle()
{
return _treasureStyle;
}
public String getItemName()
{
return _itemName;
}
}

View File

@ -0,0 +1,76 @@
package mineplex.core.treasure.animation;
import java.util.List;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import mineplex.core.treasure.BlockInfo;
import mineplex.core.treasure.Treasure;
import mineplex.core.treasure.TreasureType;
public class BlockChangeAnimation extends Animation
{
private static final int MAX_RADIUS = 4;
private int _currentRadius;
private List<BlockInfo> _blockInfoList;
public BlockChangeAnimation(Treasure treasure, List<BlockInfo> blockInfoList)
{
super(treasure);
_currentRadius = 0;
_blockInfoList = blockInfoList;
}
@Override
protected void tick()
{
if (_currentRadius == MAX_RADIUS)
{
finish();
return;
}
else if (getTicks() % 10 == 0)
{
Block centerBlock = getTreasure().getCenterBlock().getRelative(BlockFace.DOWN);
for (int x = -_currentRadius; x <= _currentRadius; x++)
{
for (int y = 0; y <= _currentRadius; y++)
{
for (int z = -_currentRadius; z <= _currentRadius; z++)
{
Block b = centerBlock.getRelative(x, y, z);
if (y > 0 && b.getType() == Material.SMOOTH_BRICK || b.getType() == Material.STEP || b.getType() == Material.SMOOTH_STAIRS)
{
_blockInfoList.add(new BlockInfo(b));
b.setType(Material.AIR);
}
else if (b.getType() == Material.SMOOTH_BRICK)
{
Material newMaterial = getTreasure().getTreasureType() == TreasureType.HEROIC ? Material.NETHER_BRICK : Material.QUARTZ_BLOCK;
_blockInfoList.add(new BlockInfo(b));
b.setType(newMaterial);
}
else if (b.getType() == Material.SMOOTH_STAIRS || b.getType() == Material.COBBLESTONE_STAIRS)
{
Material newMaterial = getTreasure().getTreasureType() == TreasureType.HEROIC ? Material.NETHER_BRICK_STAIRS : Material.QUARTZ_STAIRS;
_blockInfoList.add(new BlockInfo(b));
b.setType(newMaterial);
}
}
}
}
_currentRadius++;
}
}
@Override
protected void onFinish()
{
}
}

View File

@ -1,9 +1,8 @@
package mineplex.core.treasure.animation;
import java.util.HashSet;
import java.util.List;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.Sound;
import org.bukkit.block.Block;
import org.bukkit.craftbukkit.v1_7_R4.CraftWorld;
@ -18,22 +17,39 @@ import mineplex.core.treasure.Treasure;
*/
public class ChestSpawnAnimation extends Animation
{
private static final int ANIMATION_DURATION = 30;
private static final int ANIMATION_DURATION = 10;
private Block _block;
private byte _direction;
private Location _centerLocation;
private HashSet<BlockInfo> _chestBlockInfo;
private List<BlockInfo> _chestBlockInfo;
public ChestSpawnAnimation(Treasure tresure, Block block, byte direction, HashSet<BlockInfo> chestBlockInfo)
public ChestSpawnAnimation(Treasure tresure, Block block, List<BlockInfo> chestBlockInfo)
{
super(tresure);
_block = block;
_direction = direction;
int relX = getTreasure().getCenterBlock().getX() - block.getX();
int relZ = getTreasure().getCenterBlock().getZ() - block.getZ();
if (Math.abs(relX) > Math.abs(relZ))
{
if (relX > 0)
_direction = (byte) 5;
else
_direction = (byte) 4;
}
else
{
if (relZ > 0)
_direction = (byte) 3;
else
_direction = (byte) 2;
}
_centerLocation = block.getLocation().clone().add(0.5, 0.5, 0.5);
_centerLocation.getWorld().playSound(_centerLocation, Sound.LAVA, 1, 1);
_chestBlockInfo = chestBlockInfo;
}
@Override
@ -49,16 +65,16 @@ public class ChestSpawnAnimation extends Animation
double lead = i * ((2d * Math.PI)/2);
float x = (float) (Math.sin(getTicks()/4D + lead));
float z = (float) (Math.cos(getTicks()/4D + lead));
UtilParticle.PlayParticle(getTreasure().getStyle().getSecondaryParticle(), _centerLocation.clone().add(x * width, y, z * width), 0f, 0f, 0f, 0, 1);
UtilParticle.PlayParticle(getTreasure().getTreasureType().getStyle().getSecondaryParticle(), _centerLocation.clone().add(x * width, y, z * width), 0f, 0f, 0f, 0, 1);
}
if (getTicks() >= ANIMATION_DURATION)
{
_chestBlockInfo.add(new BlockInfo(_block));
getTreasure().setBlock(_block, Material.CHEST, _direction);
getTreasure().setBlock(_block, getTreasure().getTreasureType().getMaterial(), _direction);
_block.getLocation().getWorld().playSound(_centerLocation, Sound.ANVIL_LAND, 0.5f, 1f);
UtilParticle.ParticleType particleType = getTreasure().getStyle().getChestSpawnParticle();
UtilParticle.ParticleType particleType = getTreasure().getTreasureType().getStyle().getChestSpawnParticle();
if (particleType != null)
{

View File

@ -54,7 +54,7 @@ public class ParticleAnimation extends Animation
{
Vector position = PATH.get(pathPosition);
UtilParticle.PlayParticle(getTreasure().getStyle().getPrimaryParticle(), getTreasure().getCenterBlock().getLocation().add(0.5, 0, 0.5).add(position), 0, 0, 0, 0, 1);
UtilParticle.PlayParticle(getTreasure().getTreasureType().getStyle().getPrimaryParticle(), getTreasure().getCenterBlock().getLocation().add(0.5, 0, 0.5).add(position), 0, 0, 0, 0, 1);
pathPosition = (pathPosition + 1) % PATH.size();
}

View File

@ -1,6 +1,6 @@
package mineplex.core.treasure.animation;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import mineplex.core.treasure.BlockInfo;
@ -12,66 +12,38 @@ import mineplex.core.treasure.Treasure;
public class TreasureRemoveAnimation extends Animation
{
private Random _random = new Random();
private List<BlockInfo> _openedChests;
private List<BlockInfo> _otherChests;
private HashSet<BlockInfo> _wallsBlockInfo;
private HashSet<BlockInfo> _outerRingBlockInfo;
private HashSet<BlockInfo> _centerBlockInfo;
public TreasureRemoveAnimation(Treasure treasure, HashSet<BlockInfo> centerBlockInfo, HashSet<BlockInfo> outerRingBlockInfo, HashSet<BlockInfo> wallsBlockInfo)
public TreasureRemoveAnimation(Treasure treasure, List<BlockInfo> openedChests, List<BlockInfo> otherChests)
{
super(treasure);
_wallsBlockInfo = wallsBlockInfo;
_centerBlockInfo = centerBlockInfo;
_outerRingBlockInfo = outerRingBlockInfo;
_openedChests = openedChests;
_otherChests = otherChests;
}
@Override
protected void tick()
{
// Chests go away at 100 ticks
HashSet<BlockInfo> blockInfoSet = null;
if (getTicks() == 40)
if (getTicks() >= 20 && getTicks() % 10 == 0)
{
blockInfoSet = _wallsBlockInfo;
}
else if (getTicks() == 50)
{
blockInfoSet = _outerRingBlockInfo;
}
else if (getTicks() == 60)
{
blockInfoSet = _centerBlockInfo;
}
if (blockInfoSet != null)
{
getTreasure().resetBlockInfo(blockInfoSet);
}
/*
if (getTicks() % 2 == 0)
{
if (_blockRestoreMap.size() > 4)
if (!_otherChests.isEmpty())
{
Block block;
do
{
Block[] keyArray = _blockRestoreMap.keySet().toArray(new Block[0]);
block = keyArray[_random.nextInt(keyArray.length)];
}
while (block.getType() == Material.CHEST);
BlockInfo blockInfo = _blockRestoreMap.remove(block);
getTreasure().setBlock(block, Material.getMaterial(blockInfo.getId()), blockInfo.getData(), false);
BlockInfo info = _otherChests.remove(_random.nextInt(_otherChests.size()));
getTreasure().resetBlockInfo(info);
// System.out.println("otherchests");
}
// else if (!_openedChests.isEmpty())
// {
// System.out.println("openchests");
// BlockInfo info = _openedChests.remove(_random.nextInt(_openedChests.size()));
// getTreasure().resetBlockInfo(info);
// }
else
{
finish();
}
}
*/
}
@Override

View File

@ -0,0 +1,30 @@
package mineplex.core.treasure.gui;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.ClickType;
import mineplex.core.shop.item.IButton;
import mineplex.core.treasure.TreasureLocation;
import mineplex.core.treasure.TreasureType;
public class OpenTreasureButton implements IButton
{
private Player _player;
private TreasureLocation _treasureLocation;
private TreasureType _treasureType;
public OpenTreasureButton(Player player, TreasureLocation treasureLocation, TreasureType treasureType)
{
_player = player;
_treasureLocation = treasureLocation;
_treasureType = treasureType;
}
@Override
public void onClick(Player player, ClickType clickType)
{
_treasureLocation.attemptOpenTreasure(player, _treasureType);
player.closeInventory();
}
}

View File

@ -0,0 +1,73 @@
package mineplex.core.treasure.gui;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import mineplex.core.account.CoreClientManager;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.donation.DonationManager;
import mineplex.core.inventory.InventoryManager;
import mineplex.core.shop.item.ShopItem;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.core.treasure.TreasureLocation;
import mineplex.core.treasure.TreasureManager;
import mineplex.core.treasure.TreasureType;
public class TreasurePage extends ShopPageBase<TreasureManager, TreasureShop>
{
private TreasureLocation _treasureLocation;
private InventoryManager _inventoryManager;
public TreasurePage(TreasureManager plugin, TreasureShop shop, TreasureLocation treasureLocation, CoreClientManager clientManager, DonationManager donationManager, InventoryManager inventoryManager, Player player)
{
super(plugin, shop, clientManager, donationManager, "Open Treasure", player, 9);
_treasureLocation = treasureLocation;
_inventoryManager = inventoryManager;
BuildPage();
}
@Override
protected void BuildPage()
{
int basicCount = _inventoryManager.Get(Player).getItemCount(TreasureType.BASIC.getItemName());
int heroicCount = _inventoryManager.Get(Player).getItemCount(TreasureType.HEROIC.getItemName());
int legendaryCount = _inventoryManager.Get(Player).getItemCount(TreasureType.LEGENDARY.getItemName());
List<String> basicLore = new ArrayList<String>();
basicLore.add(" ");
basicLore.add(F.value("Basic Chests Owned", "" + basicCount));
basicLore.add(" ");
if (basicCount > 0)
basicLore.add(ChatColor.RESET + "Click to open!");
List<String> heroicLore = new ArrayList<String>();
heroicLore.add(" ");
heroicLore.add(F.value("Heroic Chests Owned", "" + heroicCount));
heroicLore.add(" ");
if (heroicCount > 0)
heroicLore.add(ChatColor.RESET + "Click to open!");
List<String> legendaryLore = new ArrayList<String>();
legendaryLore.add(" ");
legendaryLore.add(F.value("Legendary Chests Owned", "" + legendaryCount));
legendaryLore.add(" ");
if (legendaryCount > 0)
legendaryLore.add(ChatColor.RESET + "Click to open!");
ShopItem basic = new ShopItem(Material.CHEST, C.cGreen + C.Bold + "Basic Chest", basicLore.toArray(new String[0]), 0, false, false);
ShopItem heroic = new ShopItem(Material.TRAPPED_CHEST, C.cGold + C.Bold + "Heroic Chest", heroicLore.toArray(new String[0]), 0, false, false);
ShopItem legendary = new ShopItem(Material.ENDER_CHEST, C.cRed + C.Bold + "Legendary Chest", legendaryLore.toArray(new String[0]), 0, false, false);
AddButton(2, basic, new OpenTreasureButton(Player, _treasureLocation, TreasureType.BASIC));
AddButton(4, heroic, new OpenTreasureButton(Player, _treasureLocation, TreasureType.HEROIC));
AddButton(6, legendary, new OpenTreasureButton(Player, _treasureLocation, TreasureType.LEGENDARY));
}
}

View File

@ -0,0 +1,30 @@
package mineplex.core.treasure.gui;
import org.bukkit.entity.Player;
import mineplex.core.account.CoreClientManager;
import mineplex.core.donation.DonationManager;
import mineplex.core.inventory.InventoryManager;
import mineplex.core.shop.ShopBase;
import mineplex.core.shop.page.ShopPageBase;
import mineplex.core.treasure.TreasureLocation;
import mineplex.core.treasure.TreasureManager;
public class TreasureShop extends ShopBase<TreasureManager>
{
private TreasureLocation _treasureLocation;
private InventoryManager _inventoryManager;
public TreasureShop(TreasureManager plugin, InventoryManager inventoryManager, CoreClientManager clientManager, DonationManager donationManager, TreasureLocation treasureLocation)
{
super(plugin, clientManager, donationManager, "Treasure Shop");
_treasureLocation = treasureLocation;
_inventoryManager = inventoryManager;
}
@Override
protected ShopPageBase<TreasureManager, ? extends ShopBase<TreasureManager>> BuildPagesFor(Player player)
{
return new TreasurePage(Plugin, this, _treasureLocation, ClientManager, DonationManager, _inventoryManager, player);
}
}

View File

@ -1,5 +1,8 @@
package mineplex.game.clans;
import org.bukkit.plugin.java.JavaPlugin;
import net.minecraft.server.v1_7_R4.MinecraftServer;
import mineplex.core.account.CoreClientManager;
import mineplex.core.antihack.AntiHack;
import mineplex.core.blockrestore.BlockRestore;
@ -25,9 +28,6 @@ import mineplex.core.updater.Updater;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.shop.building.BuildingShop;
import mineplex.game.clans.shop.pvp.PvpShop;
import net.minecraft.server.v1_7_R4.MinecraftServer;
import org.bukkit.plugin.java.JavaPlugin;
public class Clans extends JavaPlugin
{

View File

@ -45,7 +45,6 @@ import mineplex.core.MiniClientPlugin;
import mineplex.core.account.CoreClient;
import mineplex.core.account.CoreClientManager;
import mineplex.core.achievement.AchievementManager;
import mineplex.core.benefit.BenefitManager;
import mineplex.core.blockrestore.BlockRestore;
import mineplex.core.common.Rank;
import mineplex.core.common.util.C;
@ -85,7 +84,6 @@ import mineplex.hub.commands.ForcefieldRadius;
import mineplex.hub.commands.GadgetToggle;
import mineplex.hub.commands.GameModeCommand;
import mineplex.hub.commands.NewsCommand;
import mineplex.hub.mail.MailManager;
import mineplex.hub.modules.ForcefieldManager;
import mineplex.hub.modules.JumpManager;
import mineplex.hub.modules.MapManager;
@ -95,7 +93,6 @@ import mineplex.hub.modules.TextManager;
import mineplex.hub.modules.UHCManager;
import mineplex.hub.modules.VisibilityManager;
import mineplex.hub.modules.WorldManager;
import mineplex.hub.notification.NotificationManager;
import mineplex.hub.party.Party;
import mineplex.hub.party.PartyManager;
import mineplex.hub.poll.PollManager;
@ -182,7 +179,7 @@ public class HubManager extends MiniClientPlugin<HubClient>
_inventoryManager = new InventoryManager(plugin, clientManager);
//new BenefitManager(plugin, clientManager, _inventoryManager);
_gadgetManager = new GadgetManager(_plugin, clientManager, donationManager, _inventoryManager, _mountManager, petManager, preferences, disguiseManager, blockRestore, new ProjectileManager(plugin));
_treasureManager = new TreasureManager(_plugin, donationManager, _inventoryManager, petManager, _blockRestore, hologramManager);
_treasureManager = new TreasureManager(_plugin, clientManager, donationManager, _inventoryManager, petManager, _blockRestore, hologramManager);
new CosmeticManager(_plugin, clientManager, donationManager, _inventoryManager, _gadgetManager, _mountManager, petManager, _treasureManager);
_petManager = petManager;

View File

@ -461,7 +461,7 @@ public class Wizards extends SoloGame
private void displayProgress(String progressColor, String prefix, double amount, String suffix, Player... players)
{
// Generate Bar
int bars = 12;
int bars = 52;
String progressBar = C.cGreen + "";
boolean colorChange = false;
for (int i = 0; i < bars; i++)
@ -472,7 +472,7 @@ public class Wizards extends SoloGame
colorChange = true;
}
progressBar += "";
progressBar += "|";
}
// Send to Player

View File

@ -71,7 +71,7 @@ public class PerkSpiderLeap extends Perk
for (Block block : UtilBlock.getSurrounding(player.getLocation().getBlock(), true))
{
if (!UtilBlock.airFoliage(block))
if (!UtilBlock.airFoliage(block) && !block.isLiquid())
{
player.setVelocity(new Vector(0,0.2,0));