diff --git a/Art/MS SMoke.psd b/Art/MS SMoke.psd new file mode 100644 index 000000000..cfddd9d8c Binary files /dev/null and b/Art/MS SMoke.psd differ diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilAlg.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilAlg.java index 753562fb2..604f55a69 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilAlg.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilAlg.java @@ -12,6 +12,7 @@ import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.util.EulerAngle; import org.bukkit.util.Vector; import net.minecraft.server.v1_8_R3.EnumDirection; @@ -499,4 +500,9 @@ public class UtilAlg return value; } + + public static EulerAngle vectorToEuler(Vector vector) + { + return new EulerAngle(Math.toRadians(GetPitch(vector)), Math.toRadians(GetYaw(vector)), 0); + } } diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java index 9933cde6a..9f406c662 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilBlock.java @@ -817,4 +817,30 @@ public class UtilBlock return getBedHead(bed.getBlock()) != null && getBedFoot(bed.getBlock()) != null; } + + public static HashSet findConnectedBlocks(Block block, HashSet blocks, int limit) + { + if (blocks == null) + blocks = new HashSet(); + + //This is incase you recursively check an entire MC world + if (blocks.size() >= limit) + return blocks; + + //Mark current node as searched + blocks.add(block); + + //Search the node + for (Block neighbour : UtilBlock.getSurrounding(block, false)) + { + if (neighbour.getType() == Material.AIR) + continue; + + //If neighbour hasn't been searched, recursively search it! + if (!blocks.contains(neighbour)) + findConnectedBlocks(neighbour, blocks, limit); + } + + return blocks; + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java index a95e46cf2..3c01d37a3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/account/CoreClientManager.java @@ -373,13 +373,12 @@ public class CoreClientManager extends MiniPlugin // Reserved Slot Check if (Bukkit.getOnlinePlayers().size() >= Bukkit.getServer().getMaxPlayers()) { - // TODO: REMOVE THIS RESTRICTION FROM CLANS-BRANCH, USED TO PREVENT ULTRA FROM JOINING CLANS -// if (client.GetRank().Has(event.getPlayer(), Rank.ULTRA, false)) -// { -// event.allow(); -// event.setResult(PlayerLoginEvent.Result.ALLOWED); -// return; -// } + if (client.GetRank().has(event.getPlayer(), Rank.ULTRA, false)) + { + event.allow(); + event.setResult(PlayerLoginEvent.Result.ALLOWED); + return; + } event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "This server is full and no longer accepts players."); } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java index 329f3bd35..6f36f0dd3 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/Achievement.java @@ -277,7 +277,7 @@ public enum Achievement //Champions CHAMPIONS_WINS("Champion", 600, - new String[]{"Champions Domination.Wins", "Champions TDM.Wins", "Champions Capture the Flag.Wins"}, + new String[]{"Champions Domination.Wins", "Champions TDM.Wins", "Champions CTF.Wins"}, new String[]{"Win 80 games of Dominate, TDM, or CTF"}, new int[]{80}, AchievementCategory.CHAMPIONS), @@ -295,43 +295,43 @@ public enum Achievement AchievementCategory.CHAMPIONS), CHAMPIONS_ASSASSINATION("Assassination", 1000, - new String[]{"Champions Domination.Assassination", "Champions TDM.Assassination", "Champions Capture the Flag.Assassination"}, + new String[]{"Champions Domination.Assassination", "Champions TDM.Assassination", "Champions CTF.Assassination"}, new String[]{"Kill 40 players with Backstab without", "taking any damage from them"}, new int[]{40}, AchievementCategory.CHAMPIONS), CHAMPIONS_MASS_ELECTROCUTION("Mass Electrocution", 1200, - new String[]{"Champions Domination.MassElectrocution", "Champions TDM.MassElectrocution", "Champions Capture the Flag.MassElectrocution"}, + new String[]{"Champions Domination.MassElectrocution", "Champions TDM.MassElectrocution", "Champions CTF.MassElectrocution"}, new String[]{"Hit 4 enemies with a Lightning Orb"}, new int[]{1}, AchievementCategory.CHAMPIONS), CHAMPIONS_THE_LONGEST_SHOT("The Longest Shot", 1200, - new String[]{"Champions Domination.TheLongestShot", "Champions TDM.TheLongestShot", "Champions Capture the Flag.TheLongestShot"}, + new String[]{"Champions Domination.TheLongestShot", "Champions TDM.TheLongestShot", "Champions CTF.TheLongestShot"}, new String[]{"Kill someone using Longshot who", "is over 64 Blocks away from you"}, new int[]{1}, AchievementCategory.CHAMPIONS), CHAMPIONS_EARTHQUAKE("Earthquake", 1200, - new String[]{"Champions Domination.Earthquake", "Champions TDM.Earthquake", "Champions Capture the Flag.Earthquake"}, + new String[]{"Champions Domination.Earthquake", "Champions TDM.Earthquake", "Champions CTF.Earthquake"}, new String[]{"Launch 5 enemies using Seismic Slam"}, new int[]{1}, AchievementCategory.CHAMPIONS), CHAMPIONS_CAPTURES("Sticky Fingers", 2500, - new String[]{"Champions Capture the Flag.Captures"}, + new String[]{"Champions CTF.Captures"}, new String[]{"Capture the Enemy Flag 20 times"}, new int[]{20}, AchievementCategory.CHAMPIONS), CHAMPIONS_CLUTCH("Clutch", 600, - new String[]{"Champions Capture the Flag.Clutch"}, + new String[]{"Champions CTF.Clutch"}, new String[]{"Kill the Enemy Flag Carrier in Sudden Death"}, new int[]{1}, AchievementCategory.CHAMPIONS), CHAMPIONS_SPECIAL_WIN("Champion of Champions", 3000, - new String[]{"Champions Capture the Flag.SpecialWin"}, + new String[]{"Champions CTF.SpecialWin"}, new String[]{"Win the game with 5 more captures than the other team"}, new int[]{1}, AchievementCategory.CHAMPIONS), diff --git a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java index 8eb4305a2..2bf9be288 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/achievement/AchievementCategory.java @@ -78,7 +78,7 @@ public enum AchievementCategory new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.GEMS_EARNED }, Material.BOOK_AND_QUILL, 0, GameCategory.CLASSICS, "Extra Tools Kit"), - CHAMPIONS("Champions", new String[] {"Champions Domination", "Champions TDM", "Champions Capture the Flag"}, + CHAMPIONS("Champions", new String[] {"Champions Domination", "Champions TDM", "Champions CTF"}, new StatDisplay[] { StatDisplay.WINS, StatDisplay.GAMES_PLAYED, StatDisplay.KILLS, StatDisplay.DEATHS, StatDisplay.GEMS_EARNED, new StatDisplay("Flags Captured", "Captures") }, Material.BEACON, 0, GameCategory.CHAMPIONS, "Extra Class Skills"), diff --git a/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java new file mode 100644 index 000000000..bd2ced0fd --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/disguise/disguises/DisguiseGuardian.java @@ -0,0 +1,38 @@ +package mineplex.core.disguise.disguises; + +import org.bukkit.entity.*; + +public class DisguiseGuardian extends DisguiseCreature +{ + public DisguiseGuardian(org.bukkit.entity.Entity entity) + { + super(EntityType.GUARDIAN, entity); + DataWatcher.a(16, 0); + DataWatcher.a(17, 0); + } + + public void setTarget(int target) + { + DataWatcher.watch(17, target); + } + + public void setElder(boolean elder) + { + DataWatcher.watch(16, Integer.valueOf(DataWatcher.getInt(16) | 4)); + } + + public boolean isElder() + { + return (this.DataWatcher.getInt(16) & 4) != 0; + } + + protected String getHurtSound() + { + if (isElder()) + { + return "mob.guardian.elder.hit"; + } + + return "mob.guardian.hit"; + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemTNT.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemTNT.java index 91ac32a93..863e9d79b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemTNT.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/ItemTNT.java @@ -61,7 +61,7 @@ public class ItemTNT extends ItemGadget if (!_tnt.remove(event.getEntity())) return; - HashMap players = UtilPlayer.getInRadius(event.getLocation(), 10); + HashMap players = UtilPlayer.getInRadius(event.getLocation(), 8); for (Player player : players.keySet()) { if (Manager.collideEvent(this, player)) diff --git a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java index 26d1bd925..eb50cc32e 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/gadget/gadgets/MorphTitan.java @@ -1,35 +1,216 @@ package mineplex.core.gadget.gadgets; -import org.bukkit.Material; -import org.bukkit.entity.Player; +import java.util.HashMap; +import java.util.HashSet; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.LivingEntity; +import org.bukkit.entity.Player; +import org.bukkit.entity.Zombie; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.util.Vector; + +import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.MapUtil; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilEnt; +import mineplex.core.common.util.UtilEvent; +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.UtilEvent.ActionType; +import mineplex.core.disguise.disguises.DisguiseBase; +import mineplex.core.disguise.disguises.DisguiseGuardian; import mineplex.core.gadget.GadgetManager; import mineplex.core.gadget.types.MorphGadget; +import mineplex.core.recharge.Recharge; +import mineplex.core.recharge.RechargedEvent; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; public class MorphTitan extends MorphGadget { + private HashMap _targets = new HashMap(); + public MorphTitan(GadgetManager manager) { - super(manager, "Titanic Morph", new String[] + super(manager, "Elder Guardian Morph", new String[] { - C.cWhite + "Coming Soon...", + C.cWhite + "From deep withinsdngsg", " ", C.cRed + "Unlocked with Titan Rank", }, -1, - Material.INK_SACK, (byte)8); + Material.PRISMARINE_SHARD, (byte)0); } @Override public void EnableCustom(Player player) { - + this.ApplyArmor(player); + + DisguiseGuardian disguise = new DisguiseGuardian(player); + disguise.setName(player.getName(), Manager.getClientManager().Get(player).GetRank()); + disguise.setCustomNameVisible(true); + disguise.setElder(true); + Manager.getDisguiseManager().disguise(disguise); } @Override public void DisableCustom(Player player) { + this.RemoveArmor(player); + Manager.getDisguiseManager().undisguise(player); + player.setAllowFlight(false); + player.setFlying(false); + + Entity ent = _targets.remove(player); + if (ent != null) + ent.remove(); + } + + @EventHandler + public void lazer(PlayerInteractEvent event) + { + Player player = event.getPlayer(); + + if (!IsActive(player)) + return; + + if (!UtilEvent.isAction(event, ActionType.L)) + return; + + if (!Recharge.Instance.use(player, "Guardians Laser", 4000, true, false)) + return; + + DisguiseBase base = Manager.getDisguiseManager().getDisguise(player); + if (base == null || !(base instanceof DisguiseGuardian)) + return; + + DisguiseGuardian disguise = (DisguiseGuardian)base; + + HashSet ignore = new HashSet(); + ignore.add(Material.AIR); + + Location loc = player.getTargetBlock(ignore, 64).getLocation().add(0.5, 0.5, 0.5); + + ArmorStand stand = loc.getWorld().spawn(loc, ArmorStand.class); + + stand.setVisible(false); + stand.setGhost(true); + stand.setGravity(false); + + _targets.put(player, stand); + + disguise.setTarget(stand.getEntityId()); + + Manager.getDisguiseManager().updateDisguise(disguise); + + //Fake Head + UtilEnt.setFakeHead(player, true); + Recharge.Instance.useForce(player, GetName() + " FakeHead", 2000); + } + + @EventHandler + public void lazerEnd(RechargedEvent event) + { + if (event.GetAbility().equals(GetName() + " FakeHead")) + { + UtilEnt.setFakeHead(event.GetPlayer(), false); + + //Explode + ArmorStand stand = _targets.remove(event.GetPlayer()); + if (stand != null) + { + UtilParticle.PlayParticle(ParticleType.HUGE_EXPLOSION, stand.getLocation(), 3f, 3f, 3f, 0, 32, ViewDist.MAX, UtilServer.getPlayers()); + + HashMap players = UtilEnt.getInRadius(stand.getLocation(), 12); + for (Entity ent : players.keySet()) + { + if (ent instanceof Player) + if (Manager.collideEvent(this, (Player)ent)) + continue; + + double mult = players.get(ent); + + //Knockback + UtilAction.velocity(ent, UtilAlg.getTrajectory(stand.getLocation(), ent.getLocation()), 4 * mult, false, 0, 1 + 3 * mult, 10, true); + } + + //Sound + stand.getWorld().playSound(stand.getLocation(), Sound.ZOMBIE_REMEDY, 6f, 0.75f); + } + + //Disguise + DisguiseBase base = Manager.getDisguiseManager().getDisguise(event.GetPlayer()); + if (base == null || !(base instanceof DisguiseGuardian)) + return; + + DisguiseGuardian disguise = (DisguiseGuardian)base; + disguise.setTarget(0); + + Manager.getDisguiseManager().updateDisguise(disguise); + } + } + + @EventHandler + public void selfParticles(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + for (Player player : _targets.keySet()) + { + Vector dir = UtilAlg.getTrajectory( player.getLocation().add(0, 1.5, 0), _targets.get(player).getLocation()); + dir.multiply(8); + + UtilParticle.PlayParticle(ParticleType.MAGIC_CRIT, + player.getLocation().add(0, 1.5, 0), + (float)dir.getX(), + (float)dir.getY(), + (float)dir.getZ(), + 1, 0, ViewDist.LONG, UtilServer.getPlayers()); + + player.playSound(player.getLocation(), Sound.FIREWORK_TWINKLE2, 2f, 2f); + } + } + + @EventHandler + public void flight(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + for (Player player : GetActive()) + { + if (UtilPlayer.isSpectator(player)) + continue; + + player.setAllowFlight(true); + player.setFlying(true); + + if (UtilEnt.isGrounded(player)) + UtilAction.velocity(player, new Vector(0,1,0)); + } + } + + @EventHandler + public void titanOwner(PlayerJoinEvent event) + { +// if (Manager.getClientManager().Get(event.getPlayer()).GetRank().has(Rank.TITAN)) +// { +// Manager.getDonationManager().Get(event.getPlayer().getName()).AddUnknownSalesPackagesOwned(GetName()); +// } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java b/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java index 6be18e222..e772427cc 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/hologram/Hologram.java @@ -2,11 +2,8 @@ package mineplex.core.hologram; import java.util.ArrayList; import java.util.Arrays; -import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; -import java.util.Map.Entry; - import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; @@ -34,7 +31,7 @@ public class Hologram /** * 1.7 packets uses both EntityIDs while 1.8 uses only the first. */ - private ArrayList> _entityIds = new ArrayList>(); + private ArrayList _entityIds = new ArrayList(); private Entity _followEntity; private HologramManager _hologramManager; private String[] _hologramText = new String[0]; @@ -53,6 +50,7 @@ public class Hologram private int _viewDistance = 70; protected Vector relativeToEntity; private boolean _hideBoundingBox; + private HologramInteraction _interaction; public Hologram(HologramManager hologramManager, Location location, String... text) { @@ -61,6 +59,18 @@ public class Hologram setText(text); } + public Hologram setInteraction(HologramInteraction interact) + { + _interaction = interact; + + return this; + } + + public HologramInteraction getInteraction() + { + return _interaction; + } + /** * Adds the player to the Hologram to be effected by Whitelist or Blacklist */ @@ -151,6 +161,7 @@ public class Hologram nearbyPlayers.add(player); } } + return nearbyPlayers; } @@ -229,9 +240,7 @@ public class Hologram for (int i = 0; i < _entityIds.size(); i++) { - Entry entry = _entityIds.get(i); - - entityIds1_8[i] = entry.getKey(); + entityIds1_8[i] = _entityIds.get(i); } _destroy1_8 = new PacketPlayOutEntityDestroy(entityIds1_8); @@ -247,7 +256,7 @@ public class Hologram for (int i = _entityIds.size(); i < _hologramText.length; i++) { - _entityIds.add(new HashMap.SimpleEntry(UtilEnt.getNewEntityId(), UtilEnt.getNewEntityId())); + _entityIds.add(UtilEnt.getNewEntityId()); } } else @@ -261,9 +270,7 @@ public class Hologram } for (int textRow = 0; textRow < _hologramText.length; textRow++) { - Entry entityIds = this._entityIds.get(textRow); - - Packet[] packets1_8 = makeSpawnPackets1_8(textRow, entityIds.getKey(), _hologramText[textRow]); + Packet[] packets1_8 = makeSpawnPackets1_8(textRow, _entityIds.get(textRow), _hologramText[textRow]); for (int i = 0; i < packets1_8.length; i++) { @@ -326,8 +333,7 @@ public class Hologram public Hologram setFollowEntity(Entity entityToFollow) { _followEntity = entityToFollow; - relativeToEntity = entityToFollow == null ? null : this._location.clone().subtract(entityToFollow.getLocation()) - .toVector(); + relativeToEntity = entityToFollow == null ? null : _location.clone().subtract(entityToFollow.getLocation()).toVector(); return this; } @@ -340,7 +346,7 @@ public class Hologram */ public Hologram setHologramTarget(HologramTarget newTarget) { - this._target = newTarget; + _target = newTarget; return this; } @@ -405,11 +411,11 @@ public class Hologram if (x >= -128 && x <= 127 && y >= -128 && y <= 127 && z >= -128 && z <= 127) { _lastMovement.subtract(new Vector(x / 32D, y / 32D, z / 32D)); - for (Entry entityId : this._entityIds) + for (Integer entityId : _entityIds) { PacketPlayOutEntity.PacketPlayOutRelEntityMove relMove = new PacketPlayOutEntity.PacketPlayOutRelEntityMove(); - relMove.a = entityId.getKey(); + relMove.a = entityId; relMove.b = (byte) x; relMove.c = (byte) y; relMove.d = (byte) z; @@ -425,13 +431,12 @@ public class Hologram _lastMovement = new Vector(newLocation.getX() - (x / 32D), 0, newLocation.getZ() - (z / 32D)); - for (Entry entityId : this._entityIds) + for (Integer entityId : _entityIds) { PacketPlayOutEntityTeleport teleportPacket = new PacketPlayOutEntityTeleport(); - teleportPacket.a = entityId.getKey(); + teleportPacket.a = entityId; teleportPacket.b = x; - teleportPacket.c = (int) Math - .floor((oldLocation.getY() + (-2.1) + ((double) i * 0.285)) * 32); + teleportPacket.c = (int) Math.floor((oldLocation.getY() + (-2.1) + ((double) i * 0.285)) * 32); teleportPacket.d = z; packets1_8[i] = teleportPacket; @@ -458,6 +463,11 @@ public class Hologram return this; } + public boolean isEntityId(int entityId) + { + return _entityIds.contains(entityId); + } + /** * Set the hologram text */ @@ -491,28 +501,28 @@ public class Hologram { // Add entity id and send spawn packets // You add a entity id because the new hologram needs - Entry entry = new HashMap.SimpleEntry(UtilEnt.getNewEntityId(), UtilEnt.getNewEntityId()); - _entityIds.add(entry); + int entityId = UtilEnt.getNewEntityId(); + _entityIds.add(entityId); - packets1_8.addAll(Arrays.asList(makeSpawnPackets1_8(i, entry.getKey(), newText[i]))); + packets1_8.addAll(Arrays.asList(makeSpawnPackets1_8(i, entityId, newText[i]))); } // If less lines than previously else if (i >= newText.length) { // Remove entity id and send destroy packets - Entry entry = _entityIds.remove(newText.length); + Integer entityId = _entityIds.remove(newText.length); destroy1_8 = Arrays.copyOf(destroy1_8, destroy1_8.length + 1); - destroy1_8[destroy1_8.length - 1] = entry.getKey(); + destroy1_8[destroy1_8.length - 1] = entityId; } else if (!newText[i].equals(_hologramText[i])) { // Send update metadata packets - Entry entry = _entityIds.get(i); + Integer entityId = _entityIds.get(i); PacketPlayOutEntityMetadata metadata1_8 = new PacketPlayOutEntityMetadata(); - metadata1_8.a = entry.getKey(); + metadata1_8.a = entityId; DataWatcher watcher1_8 = new DataWatcher(null); @@ -552,7 +562,7 @@ public class Hologram */ public Hologram setViewDistance(int newDistance) { - this._viewDistance = newDistance; + _viewDistance = newDistance; return setLocation(getLocation()); } @@ -593,6 +603,7 @@ public class Hologram _playersTracking.clear(); _lastMovement = null; } + return this; } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramInteraction.java b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramInteraction.java new file mode 100644 index 000000000..b6bc659e3 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramInteraction.java @@ -0,0 +1,9 @@ +package mineplex.core.hologram; + +import org.bukkit.entity.Player; +import org.bukkit.event.inventory.ClickType; + +public interface HologramInteraction +{ + public void onClick(Player player, ClickType clickType); +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java index 8be93fc9a..df8a9352b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/hologram/HologramManager.java @@ -5,90 +5,106 @@ import java.util.Iterator; import java.util.List; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.packethandler.IPacketHandler; +import mineplex.core.packethandler.PacketHandler; +import mineplex.core.packethandler.PacketInfo; import mineplex.core.updater.UpdateType; import mineplex.core.updater.event.UpdateEvent; -import net.minecraft.server.v1_8_R3.Packet; +import net.minecraft.server.v1_8_R3.PacketPlayInUseEntity; +import net.minecraft.server.v1_8_R3.PacketPlayInUseEntity.EnumEntityUseAction; import org.bukkit.Bukkit; import org.bukkit.World; -import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer; 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.inventory.ClickType; import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.util.Vector; -public class HologramManager implements Listener +public class HologramManager implements Listener, IPacketHandler { - private ArrayList _activeHolograms = new ArrayList(); + private ArrayList _activeHolograms = new ArrayList(); - public HologramManager(JavaPlugin arcadeManager) - { - Bukkit.getPluginManager().registerEvents(this, arcadeManager); - } + public HologramManager(JavaPlugin arcadeManager, PacketHandler packetHandler) + { + Bukkit.getPluginManager().registerEvents(this, arcadeManager); + packetHandler.addPacketHandler(this, true, PacketPlayInUseEntity.class); + } - void addHologram(Hologram hologram) - { - _activeHolograms.add(hologram); - } + void addHologram(Hologram hologram) + { + _activeHolograms.add(hologram); + } - void removeHologram(Hologram hologram) - { - _activeHolograms.remove(hologram); - } + void removeHologram(Hologram hologram) + { + _activeHolograms.remove(hologram); + } - @EventHandler(priority = EventPriority.LOWEST) - public void onTick(UpdateEvent event) - { - if (event.getType() != UpdateType.TICK || _activeHolograms.isEmpty()) - return; - List worlds = Bukkit.getWorlds(); - Iterator itel = _activeHolograms.iterator(); - while (itel.hasNext()) - { - Hologram hologram = itel.next(); - if (!worlds.contains(hologram.getLocation().getWorld())) - { - itel.remove(); - hologram.stop(); - } - else - { - if (hologram.getEntityFollowing() != null) - { - Entity following = hologram.getEntityFollowing(); - if (hologram.isRemoveOnEntityDeath() && !following.isValid()) - { - itel.remove(); - hologram.stop(); - continue; - } - if (!hologram.relativeToEntity.equals(following.getLocation().subtract(hologram.getLocation()).toVector())) - { - // And we do this so in the rare offchance it changes by a decimal. It doesn't start turning wonky. - Vector vec = hologram.relativeToEntity.clone(); - hologram.setLocation(following.getLocation().add(hologram.relativeToEntity)); - hologram.relativeToEntity = vec; - continue; // No need to do the rest of the code as setLocation does it. - } - } - ArrayList canSee = hologram.getNearbyPlayers(); - Iterator itel2 = hologram.getPlayersTracking().iterator(); - while (itel2.hasNext()) - { - Player player = itel2.next(); - if (!canSee.contains(player)) - { - itel2.remove(); - if (player.getWorld() == hologram.getLocation().getWorld()) - { - UtilPlayer.sendPacket(player, hologram.getDestroyPacket()); - } - } - } - for (Player player : canSee) + @EventHandler(priority = EventPriority.LOWEST) + public void onTick(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK || _activeHolograms.isEmpty()) + return; + + List worlds = Bukkit.getWorlds(); + + Iterator itel = _activeHolograms.iterator(); + + while (itel.hasNext()) + { + Hologram hologram = itel.next(); + + if (!worlds.contains(hologram.getLocation().getWorld())) + { + itel.remove(); + hologram.stop(); + } + else + { + if (hologram.getEntityFollowing() != null) + { + Entity following = hologram.getEntityFollowing(); + + if (hologram.isRemoveOnEntityDeath() && !following.isValid()) + { + itel.remove(); + hologram.stop(); + continue; + } + if (!hologram.relativeToEntity.equals(following.getLocation().subtract(hologram.getLocation()).toVector())) + { + // And we do this so in the rare offchance it changes by a decimal. It doesn't start turning wonky. + Vector vec = hologram.relativeToEntity.clone(); + hologram.setLocation(following.getLocation().add(hologram.relativeToEntity)); + hologram.relativeToEntity = vec; + + continue; // No need to do the rest of the code as setLocation does it. + } + } + + ArrayList canSee = hologram.getNearbyPlayers(); + + Iterator itel2 = hologram.getPlayersTracking().iterator(); + + while (itel2.hasNext()) + { + Player player = itel2.next(); + + if (!canSee.contains(player)) + { + itel2.remove(); + if (player.getWorld() == hologram.getLocation().getWorld()) + { + UtilPlayer.sendPacket(player, hologram.getDestroyPacket()); + } + } + } + + for (Player player : canSee) { if (!hologram.getPlayersTracking().contains(player)) { @@ -96,8 +112,28 @@ public class HologramManager implements Listener UtilPlayer.sendPacket(player, hologram.getSpawnPackets()); } - } - } - } - } + } + } + } + } + + @Override + public void handle(PacketInfo packetInfo) + { + PacketPlayInUseEntity packetPlayIn = (PacketPlayInUseEntity) packetInfo.getPacket(); + + for (Hologram hologram : _activeHolograms) + { + if (!hologram.isEntityId(packetPlayIn.a)) + continue; + + if (hologram.getInteraction() != null) + { + hologram.getInteraction().onClick(packetInfo.getPlayer(), + packetPlayIn.action == EnumEntityUseAction.ATTACK ? ClickType.LEFT : ClickType.RIGHT); + } + + break; + } + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/Mount.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/Mount.java index 3e346cc57..f9731fe6c 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/Mount.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/Mount.java @@ -54,6 +54,7 @@ public abstract class Mount extends SalesPackageBase implements Listener Manager.setActive(player, this); EnableCustom(player); } + public abstract void EnableCustom(Player player); public abstract void Disable(Player player); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java index e4ea28811..4c95237c6 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java @@ -1,27 +1,126 @@ package mineplex.core.mount.types; +import java.util.HashMap; + import org.bukkit.Material; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Slime; import org.bukkit.entity.Horse.Color; import org.bukkit.entity.Horse.Style; import org.bukkit.entity.Horse.Variant; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.entity.EntityTargetEvent; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.player.PlayerJoinEvent; +import mineplex.core.common.Rank; import mineplex.core.common.util.C; +import mineplex.core.common.util.F; +import mineplex.core.common.util.UtilPlayer; import mineplex.core.mount.HorseMount; +import mineplex.core.mount.Mount; import mineplex.core.mount.MountManager; +import mineplex.core.updater.UpdateType; +import mineplex.core.updater.event.UpdateEvent; -public class MountTitan extends HorseMount +public class MountTitan extends Mount { - public MountTitan(MountManager manager) + public MountTitan(MountManager manager) { - super(manager, "Titanic Mount", new String[] + super(manager, "Molten Snake", Material.REDSTONE_BLOCK, (byte)0, new String[] { - C.cWhite + "Coming Soon...", + C.cWhite + "From the distant ether realm,", + C.cWhite + "this prized dragon is said to", + C.cWhite + "obey only true Heroes!", " ", C.cRed + "Unlocked with Titan Rank", - }, - Material.INK_SACK, - (byte)8, - -1, - Color.BLACK, Style.BLACK_DOTS, Variant.UNDEAD_HORSE, 0.8, null); + }, -1); + } + + @Override + public void EnableCustom(Player player) + { + player.leaveVehicle(); + player.eject(); + + //Remove other mounts + Manager.DeregisterAll(player); + + //Inform + UtilPlayer.message(player, F.main("Mount", "You spawned " + F.elem(GetName()) + ".")); + + //Store + _active.put(player, new MountTitanData(player, GetName())); + } + + @Override + public void Disable(Player player) + { + MountTitanData data = _active.remove(player); + if (data != null) + { + data.clean(); + + //Inform + UtilPlayer.message(player, F.main("Mount", "You despawned " + F.elem(GetName()) + ".")); + + Manager.removeActive(player); + } + } + + @EventHandler + public void update(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + for (MountTitanData data : _active.values()) + { + data.update(); + } + } + + @EventHandler + public void interactMount(PlayerInteractEntityEvent event) + { + if (event.getRightClicked() == null) + return; + + if (!GetActive().containsKey(event.getPlayer())) + return; + + if (!GetActive().get(event.getPlayer()).ownsMount(event.getPlayer())) + { + UtilPlayer.message(event.getPlayer(), F.main("Mount", "This is not your Mount!")); + return; + } + + event.getPlayer().leaveVehicle(); + event.getPlayer().eject(); + + GetActive().get(event.getPlayer()).mount(event.getPlayer(), event.getRightClicked()); + } + + @EventHandler + public void target(EntityTargetEvent event) + { + if (!(event.getEntity() instanceof Player)) + return; + + if (!GetActive().containsKey(event.getTarget())) + return; + + if (!GetActive().get(event.getTarget()).ownsMount((Player)event.getEntity())) + event.setCancelled(true); + } + + @EventHandler + public void titanOwner(PlayerJoinEvent event) + { +// if (Manager.getClientManager().Get(event.getPlayer()).GetRank().has(Rank.TITAN)) +// { +// Manager.getDonationManager().Get(event.getPlayer().getName()).AddUnknownSalesPackagesOwned(GetName()); +// } } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitanData.java b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitanData.java new file mode 100644 index 000000000..7f73ac764 --- /dev/null +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitanData.java @@ -0,0 +1,117 @@ + + +package mineplex.core.mount.types; + +import java.util.ArrayList; + +import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilMath; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.ArmorStand; +import org.bukkit.entity.Entity; +import org.bukkit.entity.MagmaCube; +import org.bukkit.entity.Player; +import org.bukkit.entity.Slime; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.Vector; + +public class MountTitanData +{ + private String _owner; + + private Slime _head; + + private ArrayList _nodes; + + public MountTitanData(Player player, String name) + { + _owner = player.getName(); + + //Nodes + _nodes = new ArrayList(); + + for (int i=0 ; i<30 ; i++) + { + ArmorStand node = player.getWorld().spawn(player.getLocation(), ArmorStand.class); + + node.setVisible(false); + node.setGravity(false); + + node.setHelmet(new ItemStack(Material.REDSTONE_BLOCK)); + + _nodes.add(node); + } + + //Head + _head = player.getWorld().spawn(player.getLocation(), MagmaCube.class); + _head.setSize(2); + + _head.setCustomName(player.getName() + "'s " + name); + } + + public void mount(Player player, Entity entity) + { + if (_head.equals(entity) || _nodes.contains(entity)) + _head.setPassenger(player); + } + + public void update() + { + //Head + if (_head.getPassenger() != null) + _head.setVelocity(_head.getPassenger().getLocation().getDirection().add(new Vector(0,0.2,0))); + + Location infront = _head.getLocation().add(0, -1.5, 0); + + //Move + for (int i=0 ; i<30 ; i++) + { + ArmorStand node = _nodes.get(i); + + //Move + if (i == 0) + node.teleport(infront); + else if (UtilMath.offset(node.getLocation(), infront) > 0.5) + node.teleport(infront.add(UtilAlg.getTrajectory(infront, node.getLocation()).multiply(0.5))); + + infront = node.getLocation(); + + //Rotation + node.setHeadPose(UtilAlg.vectorToEuler(UtilAlg.getTrajectory(infront, node.getLocation()))); + } + + + //Shuffle In + if (_head.getPassenger() == null) + { + for (int i=_nodes.size()-1 ; i>=0 ; i--) + { + ArmorStand node = _nodes.get(i); + + if (i>0) + infront = _nodes.get(i-1).getLocation(); + else + infront = _head.getLocation().add(0, -1.5, 0); + + node.teleport(infront); + } + } + } + + + + public void clean() + { + _head.remove(); + + for (ArmorStand stand : _nodes) + stand.remove(); + } + + public boolean ownsMount(Player player) + { + return _owner.equals(player.getName()); + } +} diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java index 84a1a2664..56cab2079 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetFactory.java @@ -42,6 +42,7 @@ public class PetFactory _pets.put(EntityType.OCELOT, new Pet("Cat", EntityType.OCELOT, 6000)); _pets.put(EntityType.MUSHROOM_COW, new Pet("Mooshroom", EntityType.MUSHROOM_COW, 5000)); _pets.put(EntityType.WITHER, new Pet("Widder", EntityType.WITHER, -1)); + _pets.put(EntityType.SKELETON, new Pet("Guardian", EntityType.SKELETON, -1)); } private void CreatePetExtras() diff --git a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java index 9d631ff8d..572919566 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/pet/PetManager.java @@ -14,9 +14,12 @@ import mineplex.core.account.event.ClientWebResponseEvent; import mineplex.core.blockrestore.BlockRestore; import mineplex.core.common.Rank; import mineplex.core.common.util.NautHashMap; +import mineplex.core.common.util.UtilAction; +import mineplex.core.common.util.UtilAlg; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilServer; import mineplex.core.disguise.DisguiseManager; +import mineplex.core.disguise.disguises.DisguiseGuardian; import mineplex.core.disguise.disguises.DisguiseWither; import mineplex.core.donation.DonationManager; import mineplex.core.inventory.InventoryManager; @@ -38,8 +41,10 @@ import org.bukkit.entity.Ageable; import org.bukkit.entity.Creature; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; +import org.bukkit.entity.Guardian; import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; +import org.bukkit.entity.Skeleton; import org.bukkit.entity.Villager; import org.bukkit.entity.Zombie; import org.bukkit.event.EventHandler; @@ -159,6 +164,12 @@ public class PetManager extends MiniClientPlugin if (!Get(p).GetPets().containsKey(EntityType.WITHER)) Get(p).GetPets().put(EntityType.WITHER, "Widder"); } + + if (rank.has(Rank.TITAN)) + { +// if (!Get(p).GetPets().containsKey(EntityType.SKELETON)) +// Get(p).GetPets().put(EntityType.SKELETON, "Guardian"); + } } public void AddPetOwner(Player player, EntityType entityType, Location location) @@ -175,6 +186,7 @@ public class PetManager extends MiniClientPlugin Creature pet; + //Wither Spawn if (entityType == EntityType.WITHER) { _creatureModule.SetForce(true); @@ -196,6 +208,7 @@ public class PetManager extends MiniClientPlugin _creatureModule.SetForce(false); } + //Default Spawn else { pet = (Creature)_creatureModule.SpawnEntity(location, entityType); @@ -220,6 +233,20 @@ public class PetManager extends MiniClientPlugin ((Villager) pet).setBaby(); ((Villager) pet).setAgeLock(true); } + else if (pet instanceof Skeleton) + { + pet.getEquipment().setHelmet(new ItemStack(Material.PUMPKIN)); //stop burning + UtilEnt.silence(pet, true); + + DisguiseGuardian disguise = new DisguiseGuardian(pet); + + if (Get(player).GetPets().get(entityType) != null && Get(player).GetPets().get(entityType).length() > 0) + { + disguise.setName(Get(player).GetPets().get(entityType)); + } + + _disguiseManager.disguise(disguise); + } _activePetOwners.put(player.getName(), pet); _failedAttempts.put(player.getName(), 0); @@ -335,6 +362,12 @@ public class PetManager extends MiniClientPlugin xDiff = Math.abs(petSpot.getBlockX() - ownerSpot.getBlockX()); yDiff = Math.abs(petSpot.getBlockY() - ownerSpot.getBlockY()); zDiff = Math.abs(petSpot.getBlockZ() - ownerSpot.getBlockZ()); + + //Guardian + if (pet instanceof Skeleton && Math.random() > 0.66 && UtilEnt.isGrounded(pet)) + { + UtilAction.velocity(pet, UtilAlg.getTrajectory(pet, owner), Math.random() * 0.3 + 0.3, false, 0, 0.3, 1, true); + } if ((xDiff + yDiff + zDiff) > 4) { diff --git a/Plugins/Mineplex.Core/src/mineplex/core/serverConfig/ServerConfiguration.java b/Plugins/Mineplex.Core/src/mineplex/core/serverConfig/ServerConfiguration.java index d5bd71dec..f57097c2d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/serverConfig/ServerConfiguration.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/serverConfig/ServerConfiguration.java @@ -37,7 +37,6 @@ public class ServerConfiguration extends MiniPlugin if (_serverGroup == null) return; - /* try { _playerListMaxPlayers = PlayerList.class.getDeclaredField("maxPlayers"); @@ -50,9 +49,8 @@ public class ServerConfiguration extends MiniPlugin } _plugin.getServer().setWhitelist(_serverGroup.getWhitelist()); - */ ((CraftServer)_plugin.getServer()).getServer().setPVP(_serverGroup.getPvp()); - //((CraftServer)_plugin.getServer()).getServer().setTexturePack(_serverGroup.getResourcePack()); +// ((CraftServer)_plugin.getServer()).getServer().setResourcePack(_serverGroup.getResourcePack()); } @EventHandler diff --git a/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java b/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java index 09aabb2ac..db766014d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/teleport/Teleport.java @@ -4,6 +4,7 @@ import java.util.LinkedList; import java.util.UUID; import mineplex.core.MiniPlugin; +import mineplex.core.account.CoreClientManager; import mineplex.core.teleport.command.LocateCommand; import mineplex.core.teleport.command.TeleportCommand; import mineplex.core.teleport.event.MineplexTeleportEvent; @@ -40,12 +41,14 @@ public class Teleport extends MiniPlugin private NautHashMap> _tpHistory = new NautHashMap>(); private NautHashMap _failedRedisLocates = new NautHashMap(); private String _serverName; + private CoreClientManager _clientManager; - public Teleport(JavaPlugin plugin) + public Teleport(JavaPlugin plugin, CoreClientManager clientManager) { super("Teleport", plugin); _serverName = getPlugin().getConfig().getString("serverstatus.name"); + _clientManager = clientManager; RedisLocateHandler locateHandler = new RedisLocateHandler(this); @@ -295,4 +298,14 @@ public class Teleport extends MiniPlugin { return _tpHistory.get(player.getName()); } + + public String getServerName() + { + return _serverName; + } + + public CoreClientManager getClientManager() + { + return _clientManager; + } } diff --git a/Plugins/Mineplex.Core/src/mineplex/core/teleport/command/TeleportCommand.java b/Plugins/Mineplex.Core/src/mineplex/core/teleport/command/TeleportCommand.java index f9a1ac6e2..600f3fe6b 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/teleport/command/TeleportCommand.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/teleport/command/TeleportCommand.java @@ -6,13 +6,14 @@ import mineplex.core.command.MultiCommandBase; import mineplex.core.common.Rank; import mineplex.core.common.util.F; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.status.ServerStatusManager; import mineplex.core.teleport.Teleport; public class TeleportCommand extends MultiCommandBase { public TeleportCommand(Teleport plugin) { - super(plugin, Rank.ADMIN, "tp", "teleport"); + super(plugin, Rank.MODERATOR, "tp", "teleport"); AddCommand(new AllCommand(plugin)); AddCommand(new BackCommand(plugin)); @@ -22,6 +23,12 @@ public class TeleportCommand extends MultiCommandBase @Override protected void Help(Player caller, String[] args) { + if (Plugin.getServerName().contains("Clans") && !Plugin.getClientManager().hasRank(caller, Rank.ADMIN) && !caller.isOp()) + { + caller.sendMessage(F.main("Clans", "You cannot use /tp in clans!")); + return; + } + //Caller to Player if (args.length == 1 && CommandCenter.GetClientManager().Get(caller).GetRank().has(caller, Rank.MODERATOR, true)) Plugin.playerToPlayer(caller, caller.getName(), args[0]); diff --git a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureLocation.java b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureLocation.java index c5f591843..43447a030 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureLocation.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/treasure/TreasureLocation.java @@ -12,6 +12,7 @@ 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.HologramInteraction; import mineplex.core.hologram.HologramManager; import mineplex.core.inventory.InventoryManager; import mineplex.core.reward.Reward; @@ -32,6 +33,7 @@ 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.ClickType; import org.bukkit.event.inventory.InventoryOpenEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerMoveEvent; @@ -63,7 +65,20 @@ public class TreasureLocation implements Listener _hologramManager = hologramManager; _statusManager = statusManager; _currentTreasure = null; - _hologram = new Hologram(_hologramManager, chestBlock.getLocation().add(0.5, 2.5, 0.5), C.cGreen + C.Bold + "Open Treasure"); + _hologram = new Hologram(_hologramManager, chestBlock.getLocation().add(0.5, 2.5, 0.5), C.cGreen + C.Bold + + "Open Treasure"); + _hologram.setInteraction(new HologramInteraction() + { + + @Override + public void onClick(Player player, ClickType clickType) + { + if (clickType == ClickType.LEFT) + return; + + openShop(player); + } + }); setHoloChestVisible(true); _shop = new TreasureShop(treasureManager, _inventoryManager, clientManager, donationManager, this); } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java index 072549742..2ade3e90f 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/Clans.java @@ -48,7 +48,7 @@ import net.minecraft.server.v1_8_R3.MinecraftServer; public class Clans extends JavaPlugin { - public static final String VERSION = "0.13"; + public static final String VERSION = "0.14"; private String WEB_CONFIG = "webServer"; // Modules @@ -91,7 +91,7 @@ public class Clans extends JavaPlugin new Spawn(this, serverStatusManager.getCurrentServerName()); Give.Initialize(this); - Teleport teleport = new Teleport(this); + Teleport teleport = new Teleport(this, _clientManager); Portal portal = new Portal(this, _clientManager, serverStatusManager.getCurrentServerName()); new FileUpdater(this, portal, serverStatusManager.getCurrentServerName(), serverStatusManager.getRegion()); @@ -119,7 +119,7 @@ public class Clans extends JavaPlugin new CustomTagFix(this, packetHandler); GearManager customGear = new GearManager(this, packetHandler, _clientManager, _donationManager); - HologramManager hologram = new HologramManager(this); + HologramManager hologram = new HologramManager(this, packetHandler); _clansManager = new ClansManager(this, serverStatusManager.getCurrentServerName(), packetHandler, _clientManager, _donationManager, preferenceManager, blockRestore, teleport, chat, customGear, hologram, webServerAddress); new Recipes(this); new Farming(this); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java index f30d1dd02..6557a4c28 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/ClansManager.java @@ -65,6 +65,7 @@ import mineplex.game.clans.clans.commands.ClanManagementCommand; 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.ClansLoginManager; import mineplex.game.clans.clans.commands.KillCommand; import mineplex.game.clans.clans.commands.MapCommand; import mineplex.game.clans.clans.commands.RegionsCommand; @@ -244,7 +245,7 @@ public class ClansManager extends MiniClientPluginimplements IRelati _explosion = new Explosion(plugin, blockRestore); - // new ClansLoginManager(getPlugin(), clientManager, _serverName); + new ClansLoginManager(getPlugin(), clientManager, _serverName); _clanShop = new ClanShop(this, clientManager, donationManager); @@ -950,16 +951,16 @@ public class ClansManager extends MiniClientPluginimplements IRelati public void onJoin(PlayerLoginEvent event) { Rank rank = _clientManager.Get(event.getPlayer()).GetRank(); - if (!event.getPlayer().isWhitelisted() || !rank.has(Rank.EVENT)) + if (!event.getPlayer().isWhitelisted() && !rank.has(Rank.LEGEND)) { - event.setResult(PlayerLoginEvent.Result.KICK_OTHER); + event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Clans is currently in Legend+ only Alpha!"); // event.setKickMessage("This server is whitelisted!"); - event.setKickMessage("Clans is currently in staff only Pre-Alpha!"); + event.setKickMessage("Clans is currently in Legend+ only Alpha!"); } - else if (UtilServer.getPlayers().length >= UtilServer.getServer().getMaxPlayers() && !rank.has(Rank.ADMIN) && !event.getPlayer().isWhitelisted()) + else if (UtilServer.getPlayers().length >= UtilServer.getServer().getMaxPlayers() && !rank.has(Rank.ADMIN) && !event.getPlayer().isWhitelisted() && !event.getPlayer().isOp()) { - event.setResult(PlayerLoginEvent.Result.KICK_OTHER); - event.setKickMessage("Clans Pre-Alpha is full! Try again soon"); + event.disallow(PlayerLoginEvent.Result.KICK_OTHER, "Clans Alpha is full! Try again soon"); + event.setKickMessage("Clans Alpha is full! Try again soon"); } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansCommand.java index 05347d3f1..d77d750ab 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansCommand.java @@ -763,7 +763,7 @@ public class ClansCommand extends CommandBase // Teleport", 300000, true, false, false, false)) return; // Do - Plugin.getTeleport().TP(caller, clan.getHome().add(0, 0.6, 0)); + Plugin.getTeleport().TP(caller, clan.getHome().add(0, 1, 0)); // Inform UtilPlayer.message(caller, F.main("Clans", "You teleported to your Clan Home " + UtilWorld.locToStrClean(caller.getLocation()) + ".")); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansLoginManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansLoginManager.java index 3b90d62d4..1267209fb 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansLoginManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/commands/ClansLoginManager.java @@ -39,12 +39,13 @@ public class ClansLoginManager extends MiniPlugin implements ILoginProcessor @EventHandler public void onPlayerJoin(PlayerLoginEvent event) { - if (_queue.contains(event.getPlayer().getName())) + if (_queue.contains(event.getPlayer().getName()) && !event.getPlayer().isOp()) { -// event.setKickMessage("This is not your Clans home server"); -// event.setResult(PlayerLoginEvent.Result.KICK_OTHER); - _queue.remove(event.getPlayer().getName()); + event.setKickMessage("This is not your Clans home server"); + event.setResult(PlayerLoginEvent.Result.KICK_OTHER); } + + _queue.remove(event.getPlayer().getName()); } private void kickPlayer(final String playerName, final String homeServer) @@ -54,11 +55,11 @@ public class ClansLoginManager extends MiniPlugin implements ILoginProcessor @Override public void run() { -// Player player = UtilPlayer.searchExact(playerName); -// if (player != null && player.isOnline()) -// { -// player.kickPlayer("This is not your home server. To play clans, connect to " + homeServer); -// } + Player player = UtilPlayer.searchExact(playerName); + if (player != null && player.isOnline() && !player.isOp()) + { + player.kickPlayer("This is not your home server. To play clans, connect to " + homeServer); + } } }, 20); } @@ -74,7 +75,6 @@ public class ClansLoginManager extends MiniPlugin implements ILoginProcessor if (serverName != null) { - System.out.println("Player " + playerName + " is from server: " + serverName); if (!serverName.equals(_serverName)) { _queue.add(playerName); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/gui/page/ClanMainPage.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/gui/page/ClanMainPage.java index a0de02304..e9738de3f 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/gui/page/ClanMainPage.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/gui/page/ClanMainPage.java @@ -176,10 +176,13 @@ public class ClanMainPage extends ClanPageBase byte commandsData = USE_RESOURCE_ICONS ? ClanIcon.COMMANDS.getData() : 0; ArrayList commandsLore = new ArrayList(); commandsLore.add(" "); + commandsLore.add(ChatColor.RESET + C.cYellow + "/c help " + C.cWhite + "Lists Clans Commands"); commandsLore.add(ChatColor.RESET + C.cYellow + "/c ally " + C.cWhite + "Request Ally"); commandsLore.add(ChatColor.RESET + C.cYellow + "/c neutral " + C.cWhite + "Revoke Ally"); - commandsLore.add(ChatColor.RESET + C.cYellow + "/c sethome " + C.cWhite + "Set Home"); - + commandsLore.add(ChatColor.RESET + C.cYellow + "/c sethome " + C.cWhite + "Set Home Bed"); + commandsLore.add(ChatColor.RESET + C.cYellow + "/c home " + C.cWhite + "Teleport to Home Bed"); + commandsLore.add(ChatColor.RESET + C.cYellow + "/map " + C.cWhite + "Give yourself a World Map"); + ShopItem commandsItem = new ShopItem(commandsMaterial, commandsData, commandsName, commandsLore.toArray(new String[0]), 1, false, false); setItem(8, commandsItem); } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/regions/ClansRegions.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/regions/ClansRegions.java index 2ea500277..537f21e7c 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/regions/ClansRegions.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/regions/ClansRegions.java @@ -40,7 +40,7 @@ public class ClansRegions extends MiniPlugin { public final static String DEFAULT_WORLD_NAME = "world"; public final static int SPAWN_RADIUS = 3; // Radius of spawn claim area (measured in chunks) - public final static int SHOP_RADIUS = 4; // Radius of shop claim area (measured in chunks) + public final static int SHOP_RADIUS = 7; // Radius of shop claim area (measured in chunks) public final static int FIELDS_RADIUS = 7; // Radius of fields claim area (measured in chunks) public final static int BORDERLANDS_RADIUS = 50; // Radius of borderlands claim area (measured in chunks) public static final int BORDER_RADIUS = 768; diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/ClansScoreboardManager.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/ClansScoreboardManager.java index 4737f9abf..42f3c6d6c 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/ClansScoreboardManager.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/scoreboard/ClansScoreboardManager.java @@ -45,7 +45,7 @@ public class ClansScoreboardManager extends ScoreboardManager ScoreboardData data = getData("default", true); - data.write(C.cGreen + "Clans Pre-Alpha " + Clans.VERSION); + data.write(C.cGreen + "Clans Alpha " + Clans.VERSION); data.writeEmpty(); data.writeElement(new ScoreboardElementClan(_clansManager)); data.writeElement(new ScoreboardElementPlayer(_clansManager)); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/stuck/commands/StuckCommand.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/stuck/commands/StuckCommand.java index 22ad80ada..f43064682 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/stuck/commands/StuckCommand.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/clans/stuck/commands/StuckCommand.java @@ -33,9 +33,10 @@ public class StuckCommand extends CommandBase return; } - if(ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()) != null && !ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()).Owner.equals("Borderlands")) + if(ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()) != null && !ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()).Owner.equals("Borderlands") && + !ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()).Owner.equals("Shops") && !ClansManager.getInstance().getClanUtility().getClaim(caller.getLocation()).Owner.equals("Spawn")) { - UtilPlayer.message(caller, F.main("Clans", "You must be in the Wilderness/Borderlands to use this command.")); + UtilPlayer.message(caller, F.main("Clans", "You must be in the Wilderness/Borderlands/Shops/Spawn to use this command.")); return; } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/ClansShopItem.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/ClansShopItem.java index d3be0444e..a51346651 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/ClansShopItem.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/shop/ClansShopItem.java @@ -75,7 +75,7 @@ public enum ClansShopItem NETHER_BRICK(50, 10, Material.NETHER_BRICK, 1), QUARTZ_BLOCK(75, 15, Material.QUARTZ_BLOCK, 1), CLAY(30, 6, Material.CLAY, 1), - GOLD_TOKEN(5000, 5000, Material.GOLD_RECORD, 1, (byte) 0, "Gold Token"); + GOLD_TOKEN(50000, 50000, Material.GOLD_RECORD, 1, (byte) 0, "Gold Token"); private int _buyPrice; private int _sellPrice; diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/Spawn.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/Spawn.java index 7e05a5fe9..dfca12bb5 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/Spawn.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/Spawn.java @@ -4,6 +4,7 @@ import java.util.Set; import org.bukkit.Bukkit; import org.bukkit.ChatColor; +import org.bukkit.Effect; import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.Material; @@ -22,6 +23,7 @@ import org.bukkit.event.block.BlockIgniteEvent; import org.bukkit.event.block.BlockIgniteEvent.IgniteCause; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; +import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityDeathEvent; import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.entity.EntityTargetEvent; @@ -61,6 +63,12 @@ public class Spawn extends MiniPlugin private WeightSet _spawns; private WeightSet _shops; private ClansManager _clansManager; + + private long _songEastLast = 0; + private long _songWestLast = 0; + + private long _songEastLength = 345000; //Blocks + private long _songWestLength = 185000; //Chirp public Spawn(JavaPlugin plugin, ClansManager clansManager) { @@ -152,6 +160,30 @@ public class Spawn extends MiniPlugin } } + @EventHandler + public void onItemFrameDamage(CustomDamageEvent event) + { + if (event.GetDamageeEntity() instanceof ItemFrame) + { + if (isInSpawn(event.GetDamageeEntity().getLocation())) + { + event.SetCancelled("Item Frame Cancel"); + } + } + } + + @EventHandler + public void onItemFrameDamage(EntityDamageEvent event) + { + if (event.getEntity() instanceof ItemFrame) + { + if (isInSpawn(event.getEntity().getLocation())) + { + event.setCancelled(true); + } + } + } + @EventHandler public void Update(UpdateEvent event) { @@ -450,4 +482,25 @@ public class Spawn extends MiniPlugin UtilPlayer.message(player, F.main("Clans", message)); } } + + @EventHandler + public void playDatMusicALLDAYLONG(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + if (UtilTime.elapsed(_songEastLast, _songEastLength)) + { + getEastSpawn().getWorld().playEffect(getEastSpawn(), Effect.RECORD_PLAY, 2258); //Blocks + + _songEastLast = System.currentTimeMillis(); + } + + if (UtilTime.elapsed(_songWestLast, _songWestLength)) + { + getWestSpawn().getWorld().playEffect(getWestSpawn(), Effect.RECORD_PLAY, 2259); //Chirp + + _songWestLast = System.currentTimeMillis(); + } + } } diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/travel/TravelPage.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/travel/TravelPage.java index dc2c3e24a..d6babf2a1 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/travel/TravelPage.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/spawn/travel/TravelPage.java @@ -97,7 +97,7 @@ public class TravelPage extends ShopPageBase } else { - if (UtilBlock.isValidBed(clan.getHome()) && clan.getHome().clone().add(0, 0.6, 0).getBlock().getType().equals(Material.AIR) && clan.getHome().clone().add(0, 2, 0).getBlock().getType().equals(Material.AIR)) + if (UtilBlock.isValidBed(clan.getHome()) && clan.getHome().clone().add(0, 1, 0).getBlock().getType().equals(Material.AIR) && clan.getHome().clone().add(0, 2, 0).getBlock().getType().equals(Material.AIR)) { meta.setDisplayName(C.cGreenB + "Clan Home"); meta.setLore(Arrays.asList(" ", C.cWhite + "Teleport to your Clan Home.")); @@ -119,7 +119,7 @@ public class TravelPage extends ShopPageBase if (item.getItemMeta().getDisplayName().startsWith(C.cGreen)) { player.closeInventory(); - player.teleport(clan.getHome().clone().add(0, 0.6, 0)); + player.teleport(clan.getHome().clone().add(0, 1, 0)); } } }); diff --git a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/types/TutorialGettingStarted.java b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/types/TutorialGettingStarted.java index 427a6f635..fb17f9fe5 100644 --- a/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/types/TutorialGettingStarted.java +++ b/Plugins/Mineplex.Game.Clans/src/mineplex/game/clans/tutorials/types/TutorialGettingStarted.java @@ -42,13 +42,13 @@ public class TutorialGettingStarted extends Tutorial _doScoreboard = true; _ghostMode = true; - _startOnJoin = false; + _startOnJoin = true; _goldReward = 5000; _uniqueId = "GettingStartedTutorial"; _friendlyName = "Getting Started"; } - + @Override public void onFinished(final Player player) { diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java index 51bcd5946..f52155acb 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/Hub.java @@ -134,7 +134,7 @@ public class Hub extends JavaPlugin implements IRelation SkillConditionManager conditionManager = new SkillConditionManager(this); PersonalServerManager personalServerManager = new PersonalServerManager(this, clientManager); - HubManager hubManager = new HubManager(this, blockRestore, clientManager, donationManager, inventoryManager, conditionManager, disguiseManager, new TaskManager(this, clientManager, webServerAddress), portal, partyManager, preferenceManager, petManager, pollManager, statsManager, achievementManager, new HologramManager(this), npcManager, personalServerManager, packetHandler, punish, serverStatusManager, giveawayManager); + HubManager hubManager = new HubManager(this, blockRestore, clientManager, donationManager, inventoryManager, conditionManager, disguiseManager, new TaskManager(this, clientManager, webServerAddress), portal, partyManager, preferenceManager, petManager, pollManager, statsManager, achievementManager, new HologramManager(this, packetHandler), npcManager, personalServerManager, packetHandler, punish, serverStatusManager, giveawayManager); QueueManager queueManager = new QueueManager(this, clientManager, donationManager, new EloManager(this, clientManager), partyManager); @@ -166,7 +166,7 @@ public class Hub extends JavaPlugin implements IRelation conditionManager.setDamageManager(damage); Fire fire = new Fire(this, conditionManager, damage); - Teleport teleport = new Teleport(this); + Teleport teleport = new Teleport(this, clientManager); Energy energy = new Energy(this); energy.setEnabled(false); diff --git a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java index fee39d92e..137fa6322 100644 --- a/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java +++ b/Plugins/Mineplex.Hub/src/mineplex/hub/server/ui/clans/ClansServerPage.java @@ -32,7 +32,7 @@ public class ClansServerPage extends ShopPageBase public ClansServerShop(ServerManager plugin, CoreClientManager clientManager, DonationManager donationManager) { - super(plugin, clientManager, donationManager, "Clans"); + super(plugin, clientManager, donationManager, "Clans Alpha"); _repository = new ClanRepository(plugin.getPlugin(), plugin.getStatusManager().getCurrentServerName()); } diff --git a/Plugins/Mineplex.MapParser/src/mineplex/mapparser/MapParser.java b/Plugins/Mineplex.MapParser/src/mineplex/mapparser/MapParser.java index a33e9f6d7..88522f513 100644 --- a/Plugins/Mineplex.MapParser/src/mineplex/mapparser/MapParser.java +++ b/Plugins/Mineplex.MapParser/src/mineplex/mapparser/MapParser.java @@ -160,6 +160,7 @@ public class MapParser extends JavaPlugin implements Listener player.addAttachment(plugin, "worldedit.*", hasPermission); player.addAttachment(plugin, "voxelsniper.sniper", hasPermission); player.addAttachment(plugin, "voxelsniper.brush.*", hasPermission); + player.addAttachment(plugin, "coloredsigns.format", hasPermission); } _permissionMap.put(player, hasPermission); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java index 28aa540dc..7a710683b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/Arcade.java @@ -112,7 +112,7 @@ public class Arcade extends JavaPlugin Creature creature = new Creature(this); ServerStatusManager serverStatusManager = new ServerStatusManager(this, _clientManager, new LagMeter(this, _clientManager)); LeaderboardManager leaderboardManager = new LeaderboardManager(this, _clientManager); - Teleport teleport = new Teleport(this); + Teleport teleport = new Teleport(this, _clientManager); Portal portal = new Portal(this, _clientManager, serverStatusManager.getCurrentServerName()); new FileUpdater(this, portal, serverStatusManager.getCurrentServerName(), serverStatusManager.getRegion()); PacketHandler packetHandler = new PacketHandler(this); @@ -136,7 +136,7 @@ public class Arcade extends JavaPlugin BlockRestore blockRestore = new BlockRestore(this); ProjectileManager projectileManager = new ProjectileManager(this); - HologramManager hologramManager = new HologramManager(this); + HologramManager hologramManager = new HologramManager(this, packetHandler); //Inventory InventoryManager inventoryManager = new InventoryManager(this, _clientManager); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java index e2d533c47..1024a5338 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/MineStrike.java @@ -211,6 +211,7 @@ public class MineStrike extends TeamGame private HashSet _defusalDropped = new HashSet(); private HashMap _incendiary = new HashMap(); + private HashMap _smokeBlocks = new HashMap(); private Bomb _bomb = null; private Item _bombItem = null; @@ -612,6 +613,17 @@ public class MineStrike extends TeamGame { _incendiary.put(loc, endTime); } + + @SuppressWarnings("deprecation") + public void registerSmokeBlock(Block block, long endTime) + { + if (block.getType() == Material.AIR || block.getType() == Material.PORTAL || block.getType() == Material.FIRE) + { + block.setTypeIdAndData(90, (byte)UtilMath.r(2), false); + + _smokeBlocks.put(block, endTime); + } + } public Gun getGunInHand(Player player, ItemStack overrideStack) { @@ -728,7 +740,7 @@ public class MineStrike extends TeamGame if (grenade == null) return; - if (!UtilTime.elapsed(GetStateTime(), 15000)) + if (!UtilTime.elapsed(GetStateTime(), 10000)) { UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot throw Grenades yet.")); return; @@ -1417,6 +1429,9 @@ public class MineStrike extends TeamGame if (event.GetLog().GetLastDamager().GetReason().contains("AWP")) amount = 100; + else if (event.GetLog().GetLastDamager().GetReason().contains("PP-Bizon")) + amount = 600; + else if (event.GetLog().GetLastDamager().GetReason().contains("Nova")) amount = 900; @@ -1489,14 +1504,6 @@ public class MineStrike extends TeamGame UtilParticle.PlayParticle(ParticleType.CRIT, grenadeItem.getLocation(), 0, 0, 0, 0, 1, ViewDist.NORMAL, UtilServer.getPlayers()); - //Expired - if (!grenadeItem.isValid() || grenadeItem.getTicksLived() > 400) - { - grenadeItem.remove(); - grenadeIterator.remove(); - continue; - } - //Completed Grenade grenade = _grenadesThrown.get(grenadeItem); if (grenade.update(this, grenadeItem)) @@ -1668,11 +1675,15 @@ public class MineStrike extends TeamGame { for (Player player : GetTeam(ChatColor.AQUA).GetPlayers(true)) { - Block block = player.getTargetBlock((HashSet) null, 5); + HashSet ignoreBlocks = new HashSet(); + ignoreBlocks.add(Material.AIR); + ignoreBlocks.add(Material.PORTAL); + + Block block = player.getTargetBlock(ignoreBlocks, 5); if (block == null || !_bomb.isBlock(block)) continue; - + if (UtilMath.offset(player.getLocation(), block.getLocation().add(0.5, 0, 0.5)) > 3) continue; @@ -1713,15 +1724,19 @@ public class MineStrike extends TeamGame if (_bombDefuser == null) return; - Block block = _bombDefuser.getTargetBlock((HashSet) null, 5); - + HashSet ignoreBlocks = new HashSet(); + ignoreBlocks.add(Material.AIR); + ignoreBlocks.add(Material.PORTAL); + + Block block = _bombDefuser.getTargetBlock(ignoreBlocks, 5); + if (!IsAlive(_bombDefuser) || block == null || !_bomb.isBlock(block) || !_bombDefuser.isOnline() || UtilMath.offset(_bombDefuser.getLocation(), block.getLocation().add(0.5, 0, 0.5)) > 3) { _bombDefuser.setExp(0f); - _bombDefuser = null; + _bombDefuser = null; return; } - + //Kit or Not? float defuseRate = 0.005f; if (UtilGear.isMat(_bombDefuser.getInventory().getItem(8), Material.SHEARS)) @@ -2161,6 +2176,11 @@ public class MineStrike extends TeamGame _incendiary.clear(); Manager.GetBlockRestore().restoreAll(); + //Smoke + for (Block block : _smokeBlocks.keySet()) + block.setType(Material.AIR); + _smokeBlocks.clear(); + //Restock Ammo for (Gun gun : _gunsEquipped.keySet()) gun.restockAmmo(_gunsEquipped.get(gun)); @@ -2411,6 +2431,47 @@ public class MineStrike extends TeamGame loc.getWorld().playSound(loc, Sound.PIG_DEATH, 1f, 1f); } } + + @EventHandler + public void gunUpdate(UpdateEvent event) + { + if (!IsLive()) + return; + + if (event.getType() != UpdateType.TICK) + return; + + for (Gun gun : _gunsEquipped.keySet()) + { + gun.displayAmmo(_gunsEquipped.get(gun)); + } + } + + @EventHandler + public void smokeUpdate(UpdateEvent event) + { + if (event.getType() != UpdateType.TICK) + return; + + Iterator smokeIterator = _smokeBlocks.keySet().iterator(); + + while (smokeIterator.hasNext()) + { + Block block = smokeIterator.next(); + + if (System.currentTimeMillis() > _smokeBlocks.get(block)) + { + if (block.getType() == Material.PORTAL) + block.setTypeIdAndData(0, (byte)0, false); + + smokeIterator.remove(); + } + else if (block.getType() == Material.AIR) + { + block.setTypeIdAndData(90, (byte)UtilMath.r(2), false); + } + } + } @EventHandler public void bombBurnUpdate(UpdateEvent event) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java index d276c503a..a7aab38ff 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/ShopManager.java @@ -236,14 +236,15 @@ public class ShopManager Host.registerGrenade(grenade, player); } + //Use 250 instead of 255, to show that its kevlar/helmet else if (item instanceof Helmet) { - ((Helmet)item).giveToPlayer(player, (team.GetColor() == ChatColor.RED) ? Color.fromRGB(255, 75, 75) : Color.fromRGB(125, 200, 255)); + ((Helmet)item).giveToPlayer(player, (team.GetColor() == ChatColor.RED) ? Color.fromRGB(250, 75, 75) : Color.fromRGB(125, 200, 250)); } else if (item instanceof Kevlar) { - ((Kevlar)item).giveToPlayer(player, (team.GetColor() == ChatColor.RED) ? Color.fromRGB(255, 75, 75) : Color.fromRGB(125, 200, 255)); + ((Kevlar)item).giveToPlayer(player, (team.GetColor() == ChatColor.RED) ? Color.fromRGB(250, 75, 75) : Color.fromRGB(125, 200, 250)); } else if (item instanceof DefusalKit) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/data/Bomb.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/data/Bomb.java index 65dee38f0..a22be532f 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/data/Bomb.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/data/Bomb.java @@ -34,10 +34,18 @@ public class Bomb Block = planter.getLocation().getBlock(); - Type = Block.getType(); - Data = Block.getData(); + if (Block.getType() != Material.PORTAL) + { + Type = Block.getType(); + Data = Block.getData(); + } + else + { + Type = Material.AIR; + Data = 0; + } - Block.setType(Material.DAYLIGHT_DETECTOR); + Block.setTypeIdAndData(Material.DAYLIGHT_DETECTOR.getId(), (byte)0, false); StartTime = System.currentTimeMillis(); } @@ -45,7 +53,7 @@ public class Bomb public boolean update() { if (Block.getType() != Material.DAYLIGHT_DETECTOR) - Block.setType(Material.DAYLIGHT_DETECTOR); + Block.setTypeIdAndData(Material.DAYLIGHT_DETECTOR.getId(), (byte)0, false); double scale = (double)(System.currentTimeMillis() - StartTime)/(double)BombTime; diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/equipment/armor/Armor.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/equipment/armor/Armor.java index 275062ce9..02a40771a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/equipment/armor/Armor.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/equipment/armor/Armor.java @@ -54,7 +54,7 @@ public class Armor extends StrikeItem try { LeatherArmorMeta meta = (LeatherArmorMeta)stack.getItemMeta(); - return (meta.getColor().getBlue() == 100 || meta.getColor().getRed() == 100); + return (meta.getColor().getBlue() == 250 || meta.getColor().getRed() == 250); } catch (Exception e) { diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FireGrenadeBase.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FireGrenadeBase.java index a6a659a62..493d836ba 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FireGrenadeBase.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FireGrenadeBase.java @@ -74,6 +74,19 @@ public abstract class FireGrenadeBase extends Grenade if (!UtilBlock.solid(block.getRelative(BlockFace.DOWN))) continue; + //Smoke + boolean nearSmoke = false; + for (Block other : UtilBlock.getSurrounding(block, false)) + { + if (other.getType() == Material.PORTAL) + { + nearSmoke = true; + break; + } + } + if (nearSmoke) + continue; + UtilServer.getServer().getScheduler().scheduleSyncDelayedTask(game.Manager.getPlugin(), new Runnable() { public void run() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FlashBang.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FlashBang.java index 638edf7f6..21c4d3dab 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FlashBang.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/FlashBang.java @@ -7,6 +7,7 @@ import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilFirework; import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; import nautilus.game.arcade.game.GameTeam; import nautilus.game.arcade.game.games.minestrike.MineStrike; import nautilus.game.arcade.game.games.minestrike.Radio; @@ -34,7 +35,7 @@ public class FlashBang extends Grenade @Override public boolean updateCustom(MineStrike game, Entity ent) { - if (ent.getTicksLived() > 40) + if (UtilTime.elapsed(_throwTime, 2000)) { FireworkEffect effect = FireworkEffect.builder().flicker(true).withColor(Color.WHITE).with(Type.BALL_LARGE).trail(false).build(); UtilFirework.playFirework(ent.getLocation().add(0, 0.5, 0), effect); @@ -46,7 +47,7 @@ public class FlashBang extends Grenade continue; //Line of Sight - Location loc = player.getEyeLocation(); + Location loc = player.getEyeLocation(); boolean sight = true; while (UtilMath.offset(loc, ent.getLocation()) > 0.5) diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Grenade.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Grenade.java index b33d48b03..f8110807b 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Grenade.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Grenade.java @@ -19,6 +19,7 @@ import mineplex.core.common.util.UtilAction; import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilPlayer; +import mineplex.core.common.util.UtilTime; import nautilus.game.arcade.game.games.minestrike.MineStrike; import nautilus.game.arcade.game.games.minestrike.items.StrikeItem; import nautilus.game.arcade.game.games.minestrike.items.StrikeItemType; @@ -75,6 +76,8 @@ public abstract class Grenade extends StrikeItem protected int _limit; + protected long _throwTime = 0; + public Grenade(String name, String[] desc, int cost, int gemCost, Material skin, int limit) { super(StrikeItemType.GRENADE, name, desc, cost, gemCost, skin); @@ -154,14 +157,19 @@ public abstract class Grenade extends StrikeItem //Sound playSound(game, player); + + _throwTime = System.currentTimeMillis(); } public boolean update(MineStrike game, Entity ent) { - //Invalid - if (!ent.isValid()) + if (UtilTime.elapsed(_throwTime, 20000)) return true; + //Invalid (Burned) + if (!ent.isValid()) + return updateCustom(game, ent); + //Rebound Off Blocks rebound(ent); @@ -174,9 +182,14 @@ public abstract class Grenade extends StrikeItem public void rebound(Entity ent) { - if (UtilEnt.isGrounded(ent) || ent.getVelocity().length() < 0.1 || ent.getTicksLived() < 4) + if (UtilEnt.isGrounded(ent) || ent.getVelocity().length() < 0.1 || !UtilTime.elapsed(_throwTime, 200)) return; + if (Math.abs(_vel.getX()) < 0.1 && Math.abs(_vel.getX()) < 0.1) + { + return; + } + /* * What we must do here, is record the velocity every tick. * Then when it collides, we get the velocity from a few ticks before and apply it, reversing the direction of collision. @@ -184,8 +197,8 @@ public abstract class Grenade extends StrikeItem */ //X Rebound - if ((_vel.getX() > 0.05 && ent.getLocation().getX() - _lastLoc.getX() <= 0) || - (_vel.getX() < 0.05 && ent.getLocation().getX() - _lastLoc.getX() >= 0)) + if ((_vel.getX() > 0.1 && ent.getLocation().getX() - _lastLoc.getX() <= 0) || + (_vel.getX() < 0.1 && ent.getLocation().getX() - _lastLoc.getX() >= 0)) { _vel = _velHistory.get(0); _vel.setX(-_vel.getX()); @@ -197,8 +210,8 @@ public abstract class Grenade extends StrikeItem } //Z Rebound - else if ((_vel.getZ() > 0.05 && ent.getLocation().getZ() - _lastLoc.getZ() <= 0) || - (_vel.getZ() < 0.05 && ent.getLocation().getZ() - _lastLoc.getZ() >= 0)) + else if ((_vel.getZ() > 0.1 && ent.getLocation().getZ() - _lastLoc.getZ() <= 0) || + (_vel.getZ() < 0.1 && ent.getLocation().getZ() - _lastLoc.getZ() >= 0)) { _vel = _velHistory.get(0); _vel.setZ(-_vel.getZ()); diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/HighExplosive.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/HighExplosive.java index bff72ca57..02c7b7300 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/HighExplosive.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/HighExplosive.java @@ -6,6 +6,7 @@ import java.util.List; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import mineplex.core.common.util.UtilPlayer; @@ -35,7 +36,7 @@ public class HighExplosive extends Grenade @Override public boolean updateCustom(MineStrike game, Entity ent) { - if (ent.getTicksLived() > 40) + if (UtilTime.elapsed(_throwTime, 2000)) { UtilParticle.PlayParticle(ParticleType.HUGE_EXPLOSION, ent.getLocation(), 0, 0, 0, 0, 1, diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java index b48ab89e2..dbbd4dddb 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/grenades/Smoke.java @@ -1,7 +1,12 @@ package nautilus.game.arcade.game.games.minestrike.items.grenades; +import java.util.HashMap; + +import mineplex.core.common.util.UtilBlock; +import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilParticle; import mineplex.core.common.util.UtilServer; +import mineplex.core.common.util.UtilTime; import mineplex.core.common.util.UtilParticle.ParticleType; import mineplex.core.common.util.UtilParticle.ViewDist; import nautilus.game.arcade.game.GameTeam; @@ -12,11 +17,15 @@ import org.bukkit.ChatColor; 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.Entity; import org.bukkit.entity.Player; public class Smoke extends Grenade { + private boolean _createdBlocks = false; + public Smoke() { super("Smoke", new String[] @@ -27,28 +36,62 @@ public class Smoke extends Grenade } @Override - public boolean updateCustom(MineStrike game, Entity ent) + public boolean updateCustom(final MineStrike game, Entity ent) { - if (ent.getTicksLived() > 60) + if (UtilTime.elapsed(_throwTime, 2000) && (UtilEnt.isGrounded(ent) || !ent.isValid())) { // UtilParticle.PlayParticle(ParticleType.HUGE_EXPLOSION, ent.getLocation(), 0.3f, 0.3f, 0.3f, 0, 1, // ViewDist.MAX, UtilServer.getPlayers()); - + UtilParticle.PlayParticle(ParticleType.CLOUD, ent.getLocation(), 1.5f, 1.5f, 1.5f, 0, 100, ViewDist.MAX, UtilServer.getPlayers()); - + ent.getWorld().playSound(ent.getLocation(), Sound.FIZZ, 0.1f, 0.1f); - + + //Remove Fire for (Location loc : game.Manager.GetBlockRestore().restoreBlockAround(Material.FIRE, ent.getLocation(), 5)) { loc.getWorld().playSound(loc, Sound.FIZZ, 1f, 1f); } + //Smoke Blocks + if (!_createdBlocks) + { + final HashMap blocks = UtilBlock.getInRadius(ent.getLocation().add(0, 1, 0), 4d); + final int round = game.getRound(); + for (final Block block : blocks.keySet()) + { + if (block.getType() != Material.AIR && block.getType() != Material.PORTAL && block.getType() != Material.FIRE) + continue; + + UtilServer.getServer().getScheduler().scheduleSyncDelayedTask(game.Manager.getPlugin(), new Runnable() + { + public void run() + { + if (round == game.getRound() && !game.isFreezeTime()) + { + //18 seconds + long duration = (long) (15000 + blocks.get(block) * 3000); + + game.registerSmokeBlock(block, System.currentTimeMillis() + duration); + } + } + }, 10 - (int)(10d * blocks.get(block))); + } + + _createdBlocks = true; + } + + ent.getWorld().playSound(ent.getLocation(), Sound.FIZZ, 0.1f, 0.1f); + + + return false; } - return ent.getTicksLived() > 360; + //18 seconds + return UtilTime.elapsed(_throwTime, 18000); } @Override diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Gun.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Gun.java index 408033016..04016f60a 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Gun.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Gun.java @@ -47,6 +47,8 @@ public class Gun extends StrikeItem protected long _lastMoveTime; protected boolean _reloading = false; + + protected boolean _reloadTick = false; public Gun(GunStats gunStats) { @@ -124,17 +126,25 @@ public class Gun extends StrikeItem //Use Ammo _loadedAmmo--; - updateWeaponName(player); + //updateWeaponName(player); //Effect soundFire(player.getLocation()); - //Visual + //Smoke Location loc = player.getEyeLocation().add(player.getLocation().getDirection().multiply(1.2)); loc.add(UtilAlg.getRight(player.getLocation().getDirection()).multiply(0.5)); - loc.add(UtilAlg.getDown(player.getLocation().getDirection()).multiply(0.3)); - UtilParticle.PlayParticle(ParticleType.EXPLODE, loc, 0, 0, 0, 0, 1, + loc.add(UtilAlg.getDown(player.getLocation().getDirection()).multiply(0.4)); + UtilParticle.PlayParticle(Math.random() > 0.5 ? ParticleType.ANGRY_VILLAGER : ParticleType.HEART, loc, 0, 0, 0, 0, 1, ViewDist.LONG, UtilServer.getPlayers()); + + //Shell + loc = player.getEyeLocation().add(player.getLocation().getDirection().multiply(0.6)); + loc.add(UtilAlg.getRight(player.getLocation().getDirection()).multiply(0.7)); + loc.add(UtilAlg.getDown(player.getLocation().getDirection()).multiply(0.5)); + UtilParticle.PlayParticle(ParticleType.SPLASH, loc, 0, 0, 0, 0, 1, + ViewDist.LONG, UtilServer.getPlayers()); + game.registerBullet(fireBullet(player, game)); @@ -265,7 +275,7 @@ public class Gun extends StrikeItem } //Recharge - Recharge.Instance.use(player, getName() + " Reload", getReloadTime(), false, true, true); + Recharge.Instance.use(player, getName() + " Reload", getReloadTime(), false, true); //Sound soundReload(player.getLocation()); @@ -284,17 +294,36 @@ public class Gun extends StrikeItem { updateWeaponName(null); } + + public void displayAmmo(Player player) + { + if (!UtilGear.isMat(player.getItemInHand(), getStack().getType())) + return; + + //Weapon Bob during reload + if (_reloading) + updateWeaponName(player); + + if (!Recharge.Instance.usable(player, getName() + " Reload")) + return; + + if (_loadedAmmo > 0 || _reserveAmmo > 0) + UtilTextBottom.display(C.cGreen + _loadedAmmo + ChatColor.RESET + " / " + C.cYellow + _reserveAmmo, player); + else + UtilTextBottom.display(C.cRed + "No Ammo", player); + } public void updateWeaponName(Player player) { ItemMeta meta = getStack().getItemMeta(); - meta.setDisplayName(ChatColor.RESET + (getOwnerName() == null ? "" : getOwnerName() + "'s ") + C.Bold + getName() + ChatColor.RESET + " " + C.cGreen + _loadedAmmo + ChatColor.RESET + " / " + C.cYellow + _reserveAmmo); + meta.setDisplayName(ChatColor.RESET + (getOwnerName() == null ? "" : getOwnerName() + "'s ") + C.Bold + getName() + (_reloadTick ? ChatColor.RED : ChatColor.WHITE)); getStack().setItemMeta(meta); - getStack().setAmount(Math.max(1, _loadedAmmo)); - if (player != null) + { player.getInventory().setItem(_slot, getStack()); + _reloadTick = !_reloadTick; + } } public double getDropOff() @@ -349,7 +378,7 @@ public class Gun extends StrikeItem _reserveAmmo = Math.max(0, ammo - _gunStats.getClipSize()); //Update - updateWeaponName(player); + //updateWeaponName(player); //Sound player.getWorld().playSound(player.getEyeLocation(), Sound.PISTON_EXTEND, 1f, 1.6f); @@ -417,7 +446,7 @@ public class Gun extends StrikeItem _loadedAmmo = _gunStats.getClipSize(); _reserveAmmo = _gunStats.getClipReserve() * _gunStats.getClipSize(); - updateWeaponName(player); + //updateWeaponName(player); } public double getDamage() diff --git a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Shotgun.java b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Shotgun.java index 579843cc3..78f565db2 100644 --- a/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Shotgun.java +++ b/Plugins/Nautilus.Game.Arcade/src/nautilus/game/arcade/game/games/minestrike/items/guns/Shotgun.java @@ -43,7 +43,7 @@ public class Shotgun extends Gun //Use Ammo _loadedAmmo--; - updateWeaponName(player); + //updateWeaponName(false); //Effect soundFire(player.getLocation());