diff --git a/Plugins/.idea/artifacts/Mineplex_Hub_jar.xml b/Plugins/.idea/artifacts/Mineplex_Hub_jar.xml
index 370ba8bd7..55d803b0b 100644
--- a/Plugins/.idea/artifacts/Mineplex_Hub_jar.xml
+++ b/Plugins/.idea/artifacts/Mineplex_Hub_jar.xml
@@ -21,6 +21,7 @@
+
\ No newline at end of file
diff --git a/Plugins/.idea/modules.xml b/Plugins/.idea/modules.xml
index be0eb0bae..a8626a3f1 100644
--- a/Plugins/.idea/modules.xml
+++ b/Plugins/.idea/modules.xml
@@ -17,7 +17,6 @@
-
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 602b5d974..cb2397a72 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
@@ -651,6 +651,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/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());
}