diff --git a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java index 6d5867e27..8fe95f040 100644 --- a/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java +++ b/Plugins/Mineplex.Core.Common/src/mineplex/core/common/util/UtilEnt.java @@ -639,6 +639,11 @@ public class UtilEnt return CreatureLook(ent, UtilAlg.GetPitch(vec), UtilAlg.GetYaw(vec)); } + public static boolean CreatureLook(Entity ent, Vector target) + { + return CreatureLook(ent, UtilAlg.GetPitch(target), UtilAlg.GetYaw(target)); + } + public static void setFakeHead(Entity ent, boolean fakeHead) { net.minecraft.server.v1_8_R3.Entity ec = ((CraftEntity) ent).getHandle(); 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 186a5a3b4..feb6b5a10 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitan.java @@ -28,59 +28,59 @@ public class MountTitan extends Mount { public MountTitan(MountManager manager) { - super(manager, "Molten Snake", Material.REDSTONE_BLOCK, (byte)0, new String[] - { - 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", - }, -1); + super(manager, "Molten Snake", Material.REDSTONE_BLOCK, (byte) 0, new String[] + { + 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", + }, -1); } @Override - public void EnableCustom(Player player) + public void EnableCustom(Player player) { player.leaveVehicle(); player.eject(); - - //Remove other mounts + + // Remove other mounts Manager.DeregisterAll(player); - - //Inform + + // Inform UtilPlayer.message(player, F.main("Mount", "You spawned " + F.elem(GetName()) + ".")); - - //Store - _active.put(player, new MountTitanData(player, GetName())); + + // Store + _active.put(player, new MountTitanData(Manager.getDisguiseManager(), player, GetName())); } @Override - public void Disable(Player player) + public void Disable(Player player) { MountTitanData data = _active.remove(player); if (data != null) { data.clean(); - - //Inform + + // 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) { @@ -89,7 +89,7 @@ public class MountTitan extends Mount 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!")); @@ -98,29 +98,29 @@ public class MountTitan extends Mount 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())) + + 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 index 7f73ac764..f74915d6d 100644 --- a/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitanData.java +++ b/Plugins/Mineplex.Core/src/mineplex/core/mount/types/MountTitanData.java @@ -1,40 +1,49 @@ - - package mineplex.core.mount.types; import java.util.ArrayList; import mineplex.core.common.util.UtilAlg; +import mineplex.core.common.util.UtilEnt; import mineplex.core.common.util.UtilMath; +import mineplex.core.disguise.DisguiseManager; +import mineplex.core.disguise.disguises.DisguiseGuardian; +import mineplex.core.disguise.disguises.DisguiseMagmaCube; +import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.craftbukkit.v1_8_R3.entity.CraftLivingEntity; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; -import org.bukkit.entity.MagmaCube; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Player; -import org.bukkit.entity.Slime; import org.bukkit.inventory.ItemStack; +import org.bukkit.util.EulerAngle; import org.bukkit.util.Vector; -public class MountTitanData +public class MountTitanData { private String _owner; - private Slime _head; - + private LivingEntity _head; + private ArrayList _nodes; - public MountTitanData(Player player, String name) + public MountTitanData(DisguiseManager disguiseManager, Player player, String name) { _owner = player.getName(); - //Nodes + // Nodes _nodes = new ArrayList(); - for (int i=0 ; i<30 ; i++) + Location loc = player.getLocation(); + loc.setYaw(0); + loc.setPitch(0); + + for (int i = 0; i < 30; i++) { - ArmorStand node = player.getWorld().spawn(player.getLocation(), ArmorStand.class); + ArmorStand node = player.getWorld().spawn(loc, ArmorStand.class); node.setVisible(false); node.setGravity(false); @@ -43,12 +52,21 @@ public class MountTitanData _nodes.add(node); } - - //Head - _head = player.getWorld().spawn(player.getLocation(), MagmaCube.class); - _head.setSize(2); - + + // Head + _head = (LivingEntity) player.getWorld().spawnEntity(loc, EntityType.BAT); + UtilEnt.Vegetate(_head, true); + UtilEnt.silence(_head, true); + UtilEnt.setFakeHead(_head, true); + _head.setCustomName(player.getName() + "'s " + name); + + ((CraftLivingEntity) _head).getHandle().setMineplexInvisible(true); + + DisguiseMagmaCube disguise = new DisguiseMagmaCube(_head); + disguise.SetSize(2); + + disguiseManager.disguise(disguise); } public void mount(Player player, Entity entity) @@ -59,58 +77,102 @@ public class MountTitanData public void update() { - //Head + // Head if (_head.getPassenger() != null) - _head.setVelocity(_head.getPassenger().getLocation().getDirection().add(new Vector(0,0.2,0))); + { + _head.setVelocity(_head.getPassenger().getLocation().getDirection().add(new Vector(0, 0.2, 0))); - Location infront = _head.getLocation().add(0, -1.5, 0); + UtilEnt.CreatureLook(_head, _head.getPassenger().getLocation().getDirection()); + } + else + { + Player player = Bukkit.getPlayerExact(_owner); - //Move - for (int i=0 ; i<30 ; i++) + if (player != null) + { + Vector moving = null; + + if (UtilMath.offset(player, _head) > 12) + { + moving = _head.getLocation().getDirection().normalize(); + + Vector vec = moving.clone().subtract(UtilAlg.getTrajectory(player, _head)).normalize(); + + vec.setY(-vec.getY()); + + moving.add(vec.multiply(0.15)); + } + else + { + moving = _head.getLocation().getDirection(); + + moving.setX(moving.getX() + UtilMath.rr(0.1, true)); + moving.setY(moving.getY() + UtilMath.rr(0.3, true)); + moving.setZ(moving.getZ() + UtilMath.rr(0.1, true)); + } + + moving.normalize().multiply(0.5); + + UtilEnt.CreatureLook(_head, moving); + + _head.setVelocity(moving); + } + } + + Location infront = _head.getLocation().add(0, -1.3, 0); + infront.setYaw(0); + infront.setPitch(0); + + // Move + for (int i = 0; i < 30; i++) { ArmorStand node = _nodes.get(i); - //Move + Location loc = node.getLocation(); + + // 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))); - + + // Rotation + node.setHeadPose(UtilAlg.vectorToEuler(UtilAlg.getTrajectory(node.getLocation(), loc))); + infront = node.getLocation(); - - //Rotation - node.setHeadPose(UtilAlg.vectorToEuler(UtilAlg.getTrajectory(infront, node.getLocation()))); } - - - //Shuffle In + + // Shuffle In if (_head.getPassenger() == null) { - for (int i=_nodes.size()-1 ; i>=0 ; i--) + for (int i = _nodes.size() - 1; i >= 0; i--) { ArmorStand node = _nodes.get(i); - - if (i>0) - infront = _nodes.get(i-1).getLocation(); + + Location loc = node.getLocation(); + + if (i > 0) + infront = _nodes.get(i - 1).getLocation(); else - infront = _head.getLocation().add(0, -1.5, 0); + infront = _head.getLocation().add(0, -1.3, 0); node.teleport(infront); + + node.setHeadPose(new EulerAngle(0, -UtilAlg.GetYaw(UtilAlg.getTrajectory(node.getLocation(), loc)), 0)); + // node.setHeadPose(UtilAlg.vectorToEuler(UtilAlg.getTrajectory(node.getLocation(), loc))); } } } - - - public void clean() + public void clean() { _head.remove(); - + for (ArmorStand stand : _nodes) stand.remove(); } - public boolean ownsMount(Player player) + public boolean ownsMount(Player player) { return _owner.equals(player.getName()); }