Iron Wizard, fixed iron golem custom name
This commit is contained in:
parent
102fcd8e73
commit
9d3f125c9e
@ -238,9 +238,10 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
}
|
||||
|
||||
int newId = UtilEnt.getNewEntityId();
|
||||
sendProtocolPackets(owner, spawnPacket.a, newId, entityName, verifier);
|
||||
_entityMap.get(owner.getName()).put(spawnPacket.a, newId);
|
||||
sendProtocolPackets(owner, spawnPacket.a, newId, entityName, verifier, true);
|
||||
|
||||
_entityNameMap.get(owner.getName()).put(spawnPacket.a, entityName);
|
||||
_entityMap.get(owner.getName()).put(spawnPacket.a, newId);
|
||||
|
||||
break;
|
||||
}
|
||||
@ -250,10 +251,10 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
{
|
||||
PacketPlayOutEntityMetadata metaPacket = (PacketPlayOutEntityMetadata)packet;
|
||||
|
||||
if (!_entityMap.get(owner.getName()).containsKey(metaPacket.a) && metaPacket.a != 777777 && !_ignoreSkulls.contains(metaPacket.a))
|
||||
if (metaPacket.a != 777777 && !_ignoreSkulls.contains(metaPacket.a))
|
||||
{
|
||||
String entityName = "";
|
||||
boolean nameShowing = false;
|
||||
boolean nameShowing = _entityMap.get(owner.getName()).containsKey(metaPacket.a);
|
||||
|
||||
for (WatchableObject watchable : (List<WatchableObject>)metaPacket.b)
|
||||
{
|
||||
@ -267,12 +268,27 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
}
|
||||
}
|
||||
|
||||
if (!_entityMap.get(owner.getName()).containsKey(metaPacket.a)
|
||||
|| !_entityMap.get(owner.getName()).get(metaPacket.a).equals(entityName))
|
||||
{
|
||||
if (nameShowing && !entityName.isEmpty())
|
||||
{
|
||||
int newId = UtilEnt.getNewEntityId();
|
||||
sendProtocolPackets(owner, metaPacket.a, newId, entityName, verifier);
|
||||
_entityMap.get(owner.getName()).put(metaPacket.a, newId);
|
||||
int newId;
|
||||
|
||||
if (_entityMap.get(owner.getName()).containsKey(metaPacket.a))
|
||||
{
|
||||
newId = _entityMap.get(owner.getName()).get(metaPacket.a);
|
||||
}
|
||||
else
|
||||
{
|
||||
newId = UtilEnt.getNewEntityId();
|
||||
}
|
||||
|
||||
sendProtocolPackets(owner, metaPacket.a, newId, entityName, verifier,
|
||||
!_entityMap.get(owner.getName()).containsKey(metaPacket.a));
|
||||
|
||||
_entityNameMap.get(owner.getName()).put(metaPacket.a, entityName);
|
||||
_entityMap.get(owner.getName()).put(metaPacket.a, newId);
|
||||
}
|
||||
else if (!entityName.isEmpty())
|
||||
{
|
||||
@ -280,6 +296,7 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (packet instanceof PacketPlayOutEntityDestroy)
|
||||
{
|
||||
try
|
||||
@ -447,7 +464,7 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
}
|
||||
}
|
||||
|
||||
private void sendProtocolPackets(final Player owner, final int entityId, final int newEntityId, String entityName, final PacketVerifier packetList)
|
||||
private void sendProtocolPackets(final Player owner, final int entityId, final int newEntityId, final String entityName, final PacketVerifier packetList, final boolean newPacket)
|
||||
{
|
||||
CustomTagEvent event = new CustomTagEvent(owner, entityId, entityName);
|
||||
_plugin.getServer().getPluginManager().callEvent(event);
|
||||
@ -456,6 +473,34 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(getPlugin(), new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
final DataWatcher watcher = new DataWatcher(new DummyEntity(((CraftWorld) owner.getWorld()).getHandle()));
|
||||
|
||||
watcher.a(0, Byte.valueOf((byte) 0));
|
||||
watcher.a(1, Short.valueOf((short) 300));
|
||||
watcher.a(2, "");
|
||||
watcher.a(3, Byte.valueOf((byte) 0));
|
||||
watcher.a(4, Byte.valueOf((byte) 0));
|
||||
watcher.a(7, Integer.valueOf(0));
|
||||
watcher.a(8, Byte.valueOf((byte) 0));
|
||||
watcher.a(9, Byte.valueOf((byte) 0));
|
||||
watcher.a(6, Float.valueOf(1.0F));
|
||||
watcher.a(10, Byte.valueOf((byte) 0));
|
||||
|
||||
// Set invisible
|
||||
int i1 = watcher.getInt(0);
|
||||
watcher.watch(0, Byte.valueOf((byte) (i1 | 1 << 5)));
|
||||
|
||||
// Set small
|
||||
byte b1 = watcher.getByte(10);
|
||||
b1 = (byte) (b1 | 0x1);
|
||||
|
||||
watcher.watch(10, Byte.valueOf(b1));
|
||||
|
||||
watcher.watch(2, finalEntityName);
|
||||
watcher.watch(3, Byte.valueOf((byte) 1));
|
||||
|
||||
if (newPacket)
|
||||
{
|
||||
final PacketPlayOutSpawnEntityLiving packet = new PacketPlayOutSpawnEntityLiving();
|
||||
packet.a = newEntityId;
|
||||
@ -506,32 +551,6 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
packet.g = (int) (var6 * 8000.0D);
|
||||
packet.h = (int) (var8 * 8000.0D);
|
||||
|
||||
final DataWatcher watcher = new DataWatcher(new DummyEntity(((CraftWorld)owner.getWorld()).getHandle()));
|
||||
|
||||
watcher.a(0, Byte.valueOf((byte)0));
|
||||
watcher.a(1, Short.valueOf((short)300));
|
||||
watcher.a(2, "");
|
||||
watcher.a(3, Byte.valueOf((byte) 0));
|
||||
watcher.a(4, Byte.valueOf((byte)0));
|
||||
watcher.a(7, Integer.valueOf(0));
|
||||
watcher.a(8, Byte.valueOf((byte)0));
|
||||
watcher.a(9, Byte.valueOf((byte)0));
|
||||
watcher.a(6, Float.valueOf(1.0F));
|
||||
watcher.a(10, Byte.valueOf((byte)0));
|
||||
|
||||
// Set invisible
|
||||
int i1 = watcher.getInt(0);
|
||||
watcher.watch(0, Byte.valueOf((byte)(i1 | 1 << 5)));
|
||||
|
||||
// Set small
|
||||
byte b1 = watcher.getByte(10);
|
||||
b1 = (byte)(b1 | 0x1);
|
||||
|
||||
watcher.watch(10, Byte.valueOf(b1));
|
||||
|
||||
watcher.watch(2, finalEntityName);
|
||||
watcher.watch(3, Byte.valueOf((byte)1));
|
||||
|
||||
packet.l = watcher;
|
||||
|
||||
packetList.bypassProcess(packet);
|
||||
@ -542,6 +561,15 @@ public class CustomTagFix extends MiniPlugin implements IPacketHandler, NCPHook
|
||||
vehiclePacket.c = entityId;
|
||||
|
||||
packetList.bypassProcess(vehiclePacket);
|
||||
}
|
||||
else
|
||||
{
|
||||
PacketPlayOutEntityMetadata entityMetadata = new PacketPlayOutEntityMetadata();
|
||||
entityMetadata.a = newEntityId;
|
||||
entityMetadata.b = watcher.c();
|
||||
|
||||
packetList.bypassProcess(entityMetadata);
|
||||
}
|
||||
|
||||
/* TODO dynamic attach handling?
|
||||
if (_entityVehicleMap.get(owner).containsValue(entityId))
|
||||
|
@ -3,6 +3,7 @@ package mineplex.minecraft.game.core.boss;
|
||||
import java.util.UUID;
|
||||
|
||||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.common.util.UtilMath;
|
||||
import mineplex.core.updater.UpdateType;
|
||||
import mineplex.core.updater.event.UpdateEvent;
|
||||
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
|
||||
@ -50,6 +51,11 @@ public abstract class EventCreature<T extends LivingEntity> implements Listener
|
||||
_showHealthName = true;
|
||||
}
|
||||
|
||||
public double getDifficulty()
|
||||
{
|
||||
return getEvent().getDifficulty();
|
||||
}
|
||||
|
||||
protected final void spawnEntity()
|
||||
{
|
||||
Location spawnLocation = _entity == null ? _spawnLocation : _entity.getLocation();
|
||||
@ -87,6 +93,7 @@ public abstract class EventCreature<T extends LivingEntity> implements Listener
|
||||
|
||||
_entity.setCustomName( name);
|
||||
_entity.setCustomNameVisible(_useName);
|
||||
System.out.print(name);
|
||||
}
|
||||
|
||||
public void remove()
|
||||
|
@ -54,6 +54,7 @@ public abstract class WorldEvent implements Listener
|
||||
// Block Restore
|
||||
private BlockRestoreMap _blocks;
|
||||
private boolean _instantSchematic;
|
||||
private double _difficulty = 1;
|
||||
|
||||
public WorldEvent(DamageManager damageManager, BlockRestore blockRestore, ConditionManager conditionManager, String name,
|
||||
Location cornerLocation)
|
||||
@ -93,6 +94,11 @@ public abstract class WorldEvent implements Listener
|
||||
}
|
||||
}
|
||||
|
||||
public void setDifficulty(double difficulty)
|
||||
{
|
||||
_difficulty = difficulty;
|
||||
}
|
||||
|
||||
public void setInstantSchematic(boolean instantSchematic)
|
||||
{
|
||||
_instantSchematic = instantSchematic;
|
||||
@ -110,6 +116,11 @@ public abstract class WorldEvent implements Listener
|
||||
});
|
||||
}
|
||||
|
||||
public double getDifficulty()
|
||||
{
|
||||
return _difficulty;
|
||||
}
|
||||
|
||||
public void loadMap(Runnable runnable)
|
||||
{
|
||||
if (_schematic == null)
|
||||
@ -121,6 +132,11 @@ public abstract class WorldEvent implements Listener
|
||||
setMap(map, runnable);
|
||||
}
|
||||
|
||||
public Schematic getSchematic()
|
||||
{
|
||||
return _schematic;
|
||||
}
|
||||
|
||||
public ConditionManager getCondition()
|
||||
{
|
||||
return _conditionManager;
|
||||
@ -267,8 +283,8 @@ public abstract class WorldEvent implements Listener
|
||||
{
|
||||
_map = map;
|
||||
|
||||
SchematicRunnable task = new SchematicRunnable(_damageManager.getPlugin(), map.getSchematic(),
|
||||
_cornerLocation.getBlock(), new Callback<List<BlockData>>()
|
||||
SchematicRunnable task = new SchematicRunnable(_damageManager.getPlugin(), map.getSchematic(), _cornerLocation.getBlock(),
|
||||
new Callback<List<BlockData>>()
|
||||
{
|
||||
@Override
|
||||
public void run(List<BlockData> data)
|
||||
|
@ -24,7 +24,7 @@ import mineplex.minecraft.game.core.boss.ironwizard.abilities.GolemCaveIn;
|
||||
import mineplex.minecraft.game.core.boss.ironwizard.abilities.GolemEarthquake;
|
||||
import mineplex.minecraft.game.core.boss.ironwizard.abilities.GolemExplodingAura;
|
||||
import mineplex.minecraft.game.core.boss.ironwizard.abilities.GolemMeleeAttack;
|
||||
import mineplex.minecraft.game.core.boss.ironwizard.abilities.GolemRumble;
|
||||
import mineplex.minecraft.game.core.boss.ironwizard.abilities.GolemRupture;
|
||||
import mineplex.minecraft.game.core.boss.ironwizard.abilities.GolemWallExplode;
|
||||
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
|
||||
|
||||
@ -62,11 +62,11 @@ public class GolemCreature extends EventCreature<IronGolem>
|
||||
|
||||
_preferedCombos.put(GolemEarthquake.class, new Class[]
|
||||
{
|
||||
GolemBlockHail.class, GolemRumble.class
|
||||
GolemBlockHail.class, GolemRupture.class
|
||||
});
|
||||
_preferedCombos.put(GolemMeleeAttack.class, new Class[]
|
||||
{
|
||||
GolemEarthquake.class, GolemRumble.class
|
||||
GolemEarthquake.class, GolemRupture.class
|
||||
});
|
||||
_preferedCombos.put(GolemCaveIn.class, new Class[]
|
||||
{
|
||||
@ -76,7 +76,7 @@ public class GolemCreature extends EventCreature<IronGolem>
|
||||
{
|
||||
GolemEarthquake.class
|
||||
});
|
||||
_preferedCombos.put(GolemRumble.class, new Class[]
|
||||
_preferedCombos.put(GolemRupture.class, new Class[]
|
||||
{
|
||||
GolemBlockShot.class
|
||||
});
|
||||
@ -147,7 +147,7 @@ public class GolemCreature extends EventCreature<IronGolem>
|
||||
double hp = getHealthPercent();
|
||||
|
||||
{ // Melee
|
||||
ArrayList<Player> players = getPlayers(dist, 2.5);
|
||||
ArrayList<Player> players = getPlayers(dist, UtilMath.r(10) == 0 ? 4 : 3);
|
||||
|
||||
if (!players.isEmpty())
|
||||
{
|
||||
@ -202,7 +202,7 @@ public class GolemCreature extends EventCreature<IronGolem>
|
||||
|
||||
if (!players.isEmpty())
|
||||
{
|
||||
weight.put(GolemRumble.class, (int) Math.min(5, dist.get(players.get(0))));
|
||||
weight.put(GolemRupture.class, (int) Math.min(5, dist.get(players.get(0))));
|
||||
}
|
||||
}
|
||||
|
||||
@ -368,6 +368,7 @@ public class GolemCreature extends EventCreature<IronGolem>
|
||||
}
|
||||
|
||||
Vector vec = null;
|
||||
boolean superWalk = false;
|
||||
|
||||
if (target != null)
|
||||
{
|
||||
@ -384,6 +385,7 @@ public class GolemCreature extends EventCreature<IronGolem>
|
||||
if (target != null && dist < 8)
|
||||
{
|
||||
vec.multiply(-1);
|
||||
superWalk = true;
|
||||
}
|
||||
|
||||
if (!UtilAlg.HasSight(getEntity().getLocation(),
|
||||
@ -425,7 +427,8 @@ public class GolemCreature extends EventCreature<IronGolem>
|
||||
{
|
||||
// if (vec.length() > 1)
|
||||
{
|
||||
UtilEnt.CreatureMoveFast(getEntity(), getEntity().getLocation().add(vec), target != null ? 1.5F : 1.1F);
|
||||
UtilEnt.CreatureMoveFast(getEntity(), getEntity().getLocation().add(vec),
|
||||
(target != null ? 1.8F : 1.1F) + (superWalk ? 0.4F : 0));
|
||||
}
|
||||
}
|
||||
|
||||
@ -492,7 +495,7 @@ public class GolemCreature extends EventCreature<IronGolem>
|
||||
|
||||
if (modifier > 0)
|
||||
{
|
||||
event.AddMod("Ranged Resistance", modifier);
|
||||
event.AddMod("Ranged Resistance", 1 - modifier);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -168,8 +168,8 @@ public class GolemBlockHail extends GolemAbility
|
||||
|
||||
net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) cur).getHandle();
|
||||
Vec3D vec3d = Vec3D.a(nmsEntity.locX, nmsEntity.locY, nmsEntity.locZ);
|
||||
Vec3D vec3d1 = Vec3D.a(nmsEntity.locX + nmsEntity.motX, nmsEntity.locY + nmsEntity.motY, nmsEntity.locZ
|
||||
+ nmsEntity.motZ);
|
||||
Vec3D vec3d1 = Vec3D.a(nmsEntity.locX + nmsEntity.motX, nmsEntity.locY + nmsEntity.motY,
|
||||
nmsEntity.locZ + nmsEntity.motZ);
|
||||
|
||||
MovingObjectPosition finalObjectPosition = nmsEntity.world.rayTrace(vec3d, vec3d1, false, true, false);
|
||||
vec3d = Vec3D.a(nmsEntity.locX, nmsEntity.locY, nmsEntity.locZ);
|
||||
@ -180,8 +180,7 @@ public class GolemBlockHail extends GolemAbility
|
||||
vec3d1 = Vec3D.a(finalObjectPosition.pos.a, finalObjectPosition.pos.b, finalObjectPosition.pos.c);
|
||||
}
|
||||
|
||||
for (Object entity : ((CraftWorld) cur.getWorld()).getHandle().getEntities(
|
||||
((CraftEntity) cur).getHandle(),
|
||||
for (Object entity : ((CraftWorld) cur.getWorld()).getHandle().getEntities(((CraftEntity) cur).getHandle(),
|
||||
((CraftEntity) cur).getHandle().boundingBox.a(((CraftEntity) cur).getHandle().motX,
|
||||
((CraftEntity) cur).getHandle().motY, ((CraftEntity) cur).getHandle().motZ).grow(2, 2, 2)))
|
||||
{
|
||||
@ -222,17 +221,15 @@ public class GolemBlockHail extends GolemAbility
|
||||
|
||||
// if (canDamage(victim))
|
||||
{
|
||||
getGolem()
|
||||
.getEvent()
|
||||
.getDamageManager()
|
||||
.NewDamageEvent((LivingEntity) victim, getEntity(), null, DamageCause.CONTACT, 6, true, true, false,
|
||||
"Iron Wizard Block Hail", "Iron Wizard Block Hail");
|
||||
getGolem().getEvent().getDamageManager().NewDamageEvent((LivingEntity) victim, getEntity(), null,
|
||||
DamageCause.CONTACT, 6 * getGolem().getDifficulty(), true, true, false, "Iron Wizard Block Hail",
|
||||
"Iron Wizard Block Hail");
|
||||
}
|
||||
|
||||
if (victim instanceof Player)
|
||||
{
|
||||
getGolem().getEvent().getCondition().Factory()
|
||||
.Slow("Iron Wizard Block Hail", (LivingEntity) victim, getEntity(), 3, 2, false, false, false, false);
|
||||
getGolem().getEvent().getCondition().Factory().Slow("Iron Wizard Block Hail", (LivingEntity) victim,
|
||||
getEntity(), 3, 2, false, false, false, false);
|
||||
}
|
||||
|
||||
fallingIterator.remove();
|
||||
@ -247,8 +244,8 @@ public class GolemBlockHail extends GolemAbility
|
||||
nmsEntity.motX = ((float) (finalObjectPosition.pos.a - nmsEntity.locX));
|
||||
nmsEntity.motY = ((float) (finalObjectPosition.pos.b - nmsEntity.locY));
|
||||
nmsEntity.motZ = ((float) (finalObjectPosition.pos.c - nmsEntity.locZ));
|
||||
float f2 = MathHelper.sqrt(nmsEntity.motX * nmsEntity.motX + nmsEntity.motY * nmsEntity.motY + nmsEntity.motZ
|
||||
* nmsEntity.motZ);
|
||||
float f2 = MathHelper.sqrt(
|
||||
nmsEntity.motX * nmsEntity.motX + nmsEntity.motY * nmsEntity.motY + nmsEntity.motZ * nmsEntity.motZ);
|
||||
nmsEntity.locX -= nmsEntity.motX / f2 * 0.0500000007450581D;
|
||||
nmsEntity.locY -= nmsEntity.motY / f2 * 0.0500000007450581D;
|
||||
nmsEntity.locZ -= nmsEntity.motZ / f2 * 0.0500000007450581D;
|
||||
@ -261,8 +258,9 @@ public class GolemBlockHail extends GolemAbility
|
||||
}
|
||||
else
|
||||
{
|
||||
UtilParticle.PlayParticle(ParticleType.BLOCK_DUST.getParticle(Material.STONE, 0), cur.getLocation()
|
||||
.add(0, 0.5, 0), 0.3F, 0.3F, 0.3F, 0, 2, UtilParticle.ViewDist.NORMAL, UtilServer.getPlayers());
|
||||
UtilParticle.PlayParticle(ParticleType.BLOCK_DUST.getParticle(Material.STONE, 0),
|
||||
cur.getLocation().add(0, 0.5, 0), 0.3F, 0.3F, 0.3F, 0, 2, UtilParticle.ViewDist.NORMAL,
|
||||
UtilServer.getPlayers());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -306,10 +304,8 @@ public class GolemBlockHail extends GolemAbility
|
||||
{
|
||||
if (canDamage(player))
|
||||
{
|
||||
getGolem()
|
||||
.getEvent()
|
||||
.getDamageManager()
|
||||
.NewDamageEvent(player, getEntity(), null, DamageCause.CONTACT, 6, true, true, false,
|
||||
getGolem().getEvent().getDamageManager().NewDamageEvent(player, getEntity(), null,
|
||||
DamageCause.CONTACT, 6 * getGolem().getDifficulty(), true, true, false,
|
||||
"Iron Wizard Protection", "Iron Wizard Protection");
|
||||
|
||||
loc.getWorld().playEffect(player.getLocation(), Effect.STEP_SOUND, Material.OBSIDIAN.getId());
|
||||
@ -435,12 +431,10 @@ public class GolemBlockHail extends GolemAbility
|
||||
FallingBlock b = loc.getWorld().spawnFallingBlock(loc, floatingBlock.getMaterial(), (byte) 0);
|
||||
b.setDropItem(false);
|
||||
|
||||
Vector vec = UtilAlg.calculateVelocity(
|
||||
loc.toVector(),
|
||||
_target.getLocation()
|
||||
.toVector()
|
||||
.add(new Vector(UtilMath.r(6 + (_currentLevel * 2)) - (2 + _currentLevel), 0, UtilMath
|
||||
.r(6 + (_currentLevel * 2)) - (2 + _currentLevel))), 6);
|
||||
Vector vec = UtilAlg.calculateVelocity(loc.toVector(),
|
||||
_target.getLocation().toVector().add(new Vector(UtilMath.r(6 + (_currentLevel * 2)) - (2 + _currentLevel), 0,
|
||||
UtilMath.r(6 + (_currentLevel * 2)) - (2 + _currentLevel))),
|
||||
6);
|
||||
|
||||
b.setVelocity(vec);
|
||||
|
||||
|
@ -110,8 +110,8 @@ public class GolemCaveIn extends GolemAbility
|
||||
|
||||
net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) cur).getHandle();
|
||||
Vec3D vec3d = Vec3D.a(nmsEntity.locX, nmsEntity.locY, nmsEntity.locZ);
|
||||
Vec3D vec3d1 = Vec3D.a(nmsEntity.locX + nmsEntity.motX, nmsEntity.locY + nmsEntity.motY, nmsEntity.locZ
|
||||
+ nmsEntity.motZ);
|
||||
Vec3D vec3d1 = Vec3D.a(nmsEntity.locX + nmsEntity.motX, nmsEntity.locY + nmsEntity.motY,
|
||||
nmsEntity.locZ + nmsEntity.motZ);
|
||||
|
||||
MovingObjectPosition finalObjectPosition = nmsEntity.world.rayTrace(vec3d, vec3d1, false, true, false);
|
||||
vec3d = Vec3D.a(nmsEntity.locX, nmsEntity.locY, nmsEntity.locZ);
|
||||
@ -122,8 +122,7 @@ public class GolemCaveIn extends GolemAbility
|
||||
vec3d1 = Vec3D.a(finalObjectPosition.pos.a, finalObjectPosition.pos.b, finalObjectPosition.pos.c);
|
||||
}
|
||||
|
||||
for (Object entity : ((CraftWorld) cur.getWorld()).getHandle().getEntities(
|
||||
((CraftEntity) cur).getHandle(),
|
||||
for (Object entity : ((CraftWorld) cur.getWorld()).getHandle().getEntities(((CraftEntity) cur).getHandle(),
|
||||
((CraftEntity) cur).getHandle().boundingBox.a(((CraftEntity) cur).getHandle().motX,
|
||||
((CraftEntity) cur).getHandle().motY, ((CraftEntity) cur).getHandle().motZ).grow(2, 2, 2)))
|
||||
{
|
||||
@ -164,11 +163,9 @@ public class GolemCaveIn extends GolemAbility
|
||||
|
||||
if (canDamage(victim))
|
||||
{
|
||||
getGolem()
|
||||
.getEvent()
|
||||
.getDamageManager()
|
||||
.NewDamageEvent((LivingEntity) victim, getEntity(), null, DamageCause.CONTACT, 6, true, true, false,
|
||||
"Iron Wizard Cave In", "Iron Wizard Cave In");
|
||||
getGolem().getEvent().getDamageManager().NewDamageEvent((LivingEntity) victim, getEntity(), null,
|
||||
DamageCause.CONTACT, 6 * getGolem().getDifficulty(), true, true, false, "Iron Wizard Cave In",
|
||||
"Iron Wizard Cave In");
|
||||
}
|
||||
|
||||
cur.remove();
|
||||
@ -183,8 +180,8 @@ public class GolemCaveIn extends GolemAbility
|
||||
nmsEntity.motX = ((float) (finalObjectPosition.pos.a - nmsEntity.locX));
|
||||
nmsEntity.motY = ((float) (finalObjectPosition.pos.b - nmsEntity.locY));
|
||||
nmsEntity.motZ = ((float) (finalObjectPosition.pos.c - nmsEntity.locZ));
|
||||
float f2 = MathHelper.sqrt(nmsEntity.motX * nmsEntity.motX + nmsEntity.motY * nmsEntity.motY + nmsEntity.motZ
|
||||
* nmsEntity.motZ);
|
||||
float f2 = MathHelper.sqrt(
|
||||
nmsEntity.motX * nmsEntity.motX + nmsEntity.motY * nmsEntity.motY + nmsEntity.motZ * nmsEntity.motZ);
|
||||
nmsEntity.locX -= nmsEntity.motX / f2 * 0.0500000007450581D;
|
||||
nmsEntity.locY -= nmsEntity.motY / f2 * 0.0500000007450581D;
|
||||
nmsEntity.locZ -= nmsEntity.motZ / f2 * 0.0500000007450581D;
|
||||
@ -196,8 +193,9 @@ public class GolemCaveIn extends GolemAbility
|
||||
}
|
||||
else
|
||||
{
|
||||
UtilParticle.PlayParticle(ParticleType.BLOCK_DUST.getParticle(Material.STONE, 0), cur.getLocation()
|
||||
.add(0, 0.5, 0), 0.3F, 0.3F, 0.3F, 0, 2, UtilParticle.ViewDist.NORMAL, UtilServer.getPlayers());
|
||||
UtilParticle.PlayParticle(ParticleType.BLOCK_DUST.getParticle(Material.STONE, 0),
|
||||
cur.getLocation().add(0, 0.5, 0), 0.3F, 0.3F, 0.3F, 0, 2, UtilParticle.ViewDist.NORMAL,
|
||||
UtilServer.getPlayers());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -244,9 +242,27 @@ public class GolemCaveIn extends GolemAbility
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
blocks = UtilShapes.getSphereBlocks(l, 3, 3, true);
|
||||
|
||||
for (Location loc : blocks)
|
||||
{
|
||||
if (loc.getBlockY() >= l.getBlockY())
|
||||
{
|
||||
Block b = loc.getBlock();
|
||||
|
||||
if (b.getType() == Material.AIR)
|
||||
{
|
||||
_blocks.add(b);
|
||||
|
||||
b.setType(Material.FENCE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (_tick % 5 == 0)
|
||||
|
||||
{
|
||||
for (Player player : UtilPlayer.getNearby(getLocation(), 2.5, true))
|
||||
{
|
||||
@ -256,9 +272,10 @@ public class GolemCaveIn extends GolemAbility
|
||||
}
|
||||
|
||||
if (_tick < 200)
|
||||
|
||||
{
|
||||
Location loc = getLocation();
|
||||
loc.setY(loc.getY() + 8);
|
||||
loc.setY(loc.getY() + 4);
|
||||
|
||||
for (int i = 0; i < 30; i++)
|
||||
{
|
||||
@ -295,8 +312,8 @@ public class GolemCaveIn extends GolemAbility
|
||||
dist = 10;
|
||||
}
|
||||
|
||||
Location l = players.get(UtilMath.r(players.size())).getLocation()
|
||||
.add(UtilMath.r(dist * 2) - dist, 0, UtilMath.r(dist * 2) - dist);
|
||||
Location l = players.get(UtilMath.r(players.size())).getLocation().add(UtilMath.r(dist * 2) - dist, 0,
|
||||
UtilMath.r(dist * 2) - dist);
|
||||
l.setY(loc.getY());
|
||||
|
||||
Block b = l.getBlock();
|
||||
@ -320,6 +337,7 @@ public class GolemCaveIn extends GolemAbility
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -96,9 +96,9 @@ public class GolemEarthquake extends GolemAbility
|
||||
}
|
||||
|
||||
UtilParticle.PlayParticle(ParticleType.BLOCK_DUST.getParticle(Material.DIRT, 0),
|
||||
_center.clone().add(x * range, 0.1, z * range), (x != 0) ? 0 : (range / 2), 0.1F, (z != 0) ? 0
|
||||
: (range / 2), 0, (int) (range * 4), UtilParticle.ViewDist.NORMAL, UtilServer
|
||||
.getPlayers());
|
||||
_center.clone().add(x * range, 0.1, z * range), (x != 0) ? 0 : (range / 2), 0.1F,
|
||||
(z != 0) ? 0 : (range / 2), 0, (int) (range * 4), UtilParticle.ViewDist.NORMAL,
|
||||
UtilServer.getPlayers());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -138,14 +138,12 @@ public class GolemEarthquake extends GolemAbility
|
||||
{
|
||||
_damaged.add(player.getUniqueId());
|
||||
|
||||
getGolem()
|
||||
.getEvent()
|
||||
.getDamageManager()
|
||||
.NewDamageEvent((LivingEntity) player, getEntity(), null, DamageCause.CONTACT, 12, false, true, false,
|
||||
"Iron Wizard Earthquake", "Iron Wizard Earthquake");
|
||||
getGolem().getEvent().getDamageManager().NewDamageEvent((LivingEntity) player, getEntity(), null,
|
||||
DamageCause.CONTACT, 12 * getGolem().getDifficulty(), false, true, false, "Iron Wizard Earthquake",
|
||||
"Iron Wizard Earthquake");
|
||||
|
||||
getGolem().getEvent().getCondition().Factory()
|
||||
.Slow("Earthquake", (LivingEntity) player, getEntity(), 3, 1, false, false, false, false);
|
||||
getGolem().getEvent().getCondition().Factory().Slow("Earthquake", (LivingEntity) player, getEntity(), 3, 1, false,
|
||||
false, false, false);
|
||||
|
||||
// Velocity
|
||||
UtilAction.velocity(player, UtilAlg.getTrajectory2d(getLocation().toVector(), player.getLocation().toVector()),
|
||||
|
@ -117,11 +117,8 @@ public class GolemExplodingAura extends GolemAbility
|
||||
|
||||
for (Player player : UtilPlayer.getNearby(getLocation(), 3, true))
|
||||
{
|
||||
getGolem()
|
||||
.getEvent()
|
||||
.getDamageManager()
|
||||
.NewDamageEvent(player, getEntity(), null, DamageCause.CONTACT, 2, true, true, false,
|
||||
"Iron Wizard Protection", "Iron Wizard Protection");
|
||||
getGolem().getEvent().getDamageManager().NewDamageEvent(player, getEntity(), null, DamageCause.CONTACT,
|
||||
2 * getGolem().getDifficulty(), true, true, false, "Iron Wizard Protection", "Iron Wizard Protection");
|
||||
UtilAction.velocity(player, UtilAlg.getTrajectory(getEntity(), player), 1, true, 0.3, 0, 0.3, false);
|
||||
}
|
||||
}
|
||||
@ -296,8 +293,8 @@ public class GolemExplodingAura extends GolemAbility
|
||||
|
||||
net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) cur).getHandle();
|
||||
Vec3D vec3d = Vec3D.a(nmsEntity.locX, nmsEntity.locY, nmsEntity.locZ);
|
||||
Vec3D vec3d1 = Vec3D.a(nmsEntity.locX + nmsEntity.motX, nmsEntity.locY + nmsEntity.motY, nmsEntity.locZ
|
||||
+ nmsEntity.motZ);
|
||||
Vec3D vec3d1 = Vec3D.a(nmsEntity.locX + nmsEntity.motX, nmsEntity.locY + nmsEntity.motY,
|
||||
nmsEntity.locZ + nmsEntity.motZ);
|
||||
|
||||
MovingObjectPosition finalObjectPosition = nmsEntity.world.rayTrace(vec3d, vec3d1, false, true, false);
|
||||
vec3d = Vec3D.a(nmsEntity.locX, nmsEntity.locY, nmsEntity.locZ);
|
||||
@ -308,8 +305,7 @@ public class GolemExplodingAura extends GolemAbility
|
||||
vec3d1 = Vec3D.a(finalObjectPosition.pos.a, finalObjectPosition.pos.b, finalObjectPosition.pos.c);
|
||||
}
|
||||
|
||||
for (Object entity : ((CraftWorld) cur.getWorld()).getHandle().getEntities(
|
||||
((CraftEntity) cur).getHandle(),
|
||||
for (Object entity : ((CraftWorld) cur.getWorld()).getHandle().getEntities(((CraftEntity) cur).getHandle(),
|
||||
((CraftEntity) cur).getHandle().boundingBox.a(((CraftEntity) cur).getHandle().motX,
|
||||
((CraftEntity) cur).getHandle().motY, ((CraftEntity) cur).getHandle().motZ).grow(2, 2, 2)))
|
||||
{
|
||||
@ -350,20 +346,15 @@ public class GolemExplodingAura extends GolemAbility
|
||||
|
||||
// if (canDamage(victim))
|
||||
{
|
||||
getGolem()
|
||||
.getEvent()
|
||||
.getDamageManager()
|
||||
.NewDamageEvent((LivingEntity) victim, getEntity(), null, DamageCause.CONTACT, 6, true, true, false,
|
||||
"Blocky Iron Wizard Aura", "Blocky Iron Wizard Aura");
|
||||
getGolem().getEvent().getDamageManager().NewDamageEvent((LivingEntity) victim, getEntity(), null,
|
||||
DamageCause.CONTACT, 6 * getGolem().getDifficulty(), true, true, false, "Blocky Iron Wizard Aura",
|
||||
"Blocky Iron Wizard Aura");
|
||||
}
|
||||
|
||||
if (victim instanceof Player)
|
||||
{
|
||||
getGolem()
|
||||
.getEvent()
|
||||
.getCondition()
|
||||
.Factory()
|
||||
.Slow("Blocky Iron Wizard Aura", (LivingEntity) victim, getEntity(), 3, 2, false, false, false, false);
|
||||
getGolem().getEvent().getCondition().Factory().Slow("Blocky Iron Wizard Aura", (LivingEntity) victim,
|
||||
getEntity(), 3, 2, false, false, false, false);
|
||||
}
|
||||
|
||||
fallingIterator.remove();
|
||||
@ -390,8 +381,8 @@ public class GolemExplodingAura extends GolemAbility
|
||||
nmsEntity.motX = ((float) (finalObjectPosition.pos.a - nmsEntity.locX));
|
||||
nmsEntity.motY = ((float) (finalObjectPosition.pos.b - nmsEntity.locY));
|
||||
nmsEntity.motZ = ((float) (finalObjectPosition.pos.c - nmsEntity.locZ));
|
||||
float f2 = MathHelper.sqrt(nmsEntity.motX * nmsEntity.motX + nmsEntity.motY * nmsEntity.motY + nmsEntity.motZ
|
||||
* nmsEntity.motZ);
|
||||
float f2 = MathHelper.sqrt(
|
||||
nmsEntity.motX * nmsEntity.motX + nmsEntity.motY * nmsEntity.motY + nmsEntity.motZ * nmsEntity.motZ);
|
||||
nmsEntity.locX -= nmsEntity.motX / f2 * 0.0500000007450581D;
|
||||
nmsEntity.locY -= nmsEntity.motY / f2 * 0.0500000007450581D;
|
||||
nmsEntity.locZ -= nmsEntity.motZ / f2 * 0.0500000007450581D;
|
||||
@ -404,8 +395,9 @@ public class GolemExplodingAura extends GolemAbility
|
||||
}
|
||||
else
|
||||
{
|
||||
UtilParticle.PlayParticle(ParticleType.BLOCK_DUST.getParticle(Material.STONE, 0), cur.getLocation()
|
||||
.add(0, 0.5, 0), 0.3F, 0.3F, 0.3F, 0, 2, UtilParticle.ViewDist.NORMAL, UtilServer.getPlayers());
|
||||
UtilParticle.PlayParticle(ParticleType.BLOCK_DUST.getParticle(Material.STONE, 0),
|
||||
cur.getLocation().add(0, 0.5, 0), 0.3F, 0.3F, 0.3F, 0, 2, UtilParticle.ViewDist.NORMAL,
|
||||
UtilServer.getPlayers());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ public class GolemMeleeAttack extends GolemAbility
|
||||
@Override
|
||||
public Player getTarget()
|
||||
{
|
||||
return getTarget(2);
|
||||
return getTarget(4);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -55,7 +55,7 @@ public class GolemMeleeAttack extends GolemAbility
|
||||
{
|
||||
_attacked = true;
|
||||
|
||||
for (Player target : UtilPlayer.getNearby(getLocation(), 2.5, true))
|
||||
for (Player target : UtilPlayer.getNearby(getLocation(), 4, true))
|
||||
{
|
||||
if (target.getVelocity().length() > 0.5)
|
||||
{
|
||||
@ -64,17 +64,13 @@ public class GolemMeleeAttack extends GolemAbility
|
||||
|
||||
UtilEnt.CreatureLook(getEntity(), target);
|
||||
|
||||
getGolem()
|
||||
.getEvent()
|
||||
.getDamageManager()
|
||||
.NewDamageEvent(target, getEntity(), null, DamageCause.ENTITY_ATTACK, 6, false, true, false,
|
||||
"Iron Wizard Melee Attack", "Iron Wizard Melee Attack");
|
||||
getGolem().getEvent().getDamageManager().NewDamageEvent(target, getEntity(), null, DamageCause.ENTITY_ATTACK,
|
||||
6 * getGolem().getDifficulty(), false, true, false, "Iron Wizard Melee Attack", "Iron Wizard Melee Attack");
|
||||
|
||||
Vector vec = getLocation().getDirection();
|
||||
vec.setY(0).normalize().multiply(0.2);
|
||||
vec.setY(1);
|
||||
vec.setY(0).normalize().setY(0.5).multiply(2.4);
|
||||
|
||||
UtilAction.velocity(target, vec, 1.4, false, 0, 0, 2, false);
|
||||
UtilAction.velocity(target, vec);
|
||||
|
||||
getGolem().getEvent().getCondition().Factory().Falling("Iron Wizard Throw", target, getEntity(), 3, false, false);
|
||||
|
||||
|
@ -185,19 +185,17 @@ public class GolemRumble extends GolemAbility
|
||||
|
||||
if (canDamage(entity))
|
||||
{
|
||||
getGolem()
|
||||
.getEvent()
|
||||
.getDamageManager()
|
||||
.NewDamageEvent((LivingEntity) entity, getEntity(), null, DamageCause.CONTACT, 4, false, true,
|
||||
false, "Iron Wizard Rumble", "Iron Wizard Rumble");
|
||||
getGolem().getEvent().getDamageManager().NewDamageEvent((LivingEntity) entity, getEntity(), null,
|
||||
DamageCause.CONTACT, 4 * getGolem().getDifficulty(), false, true, false, "Iron Wizard Rumble",
|
||||
"Iron Wizard Rumble");
|
||||
}
|
||||
|
||||
UtilAction.velocity(entity, _vec.clone(), 1.5, true, 0, 0.2, 1, true);
|
||||
|
||||
if (entity instanceof Player)
|
||||
{
|
||||
getGolem().getEvent().getCondition().Factory()
|
||||
.Slow("Rumble", (LivingEntity) entity, getEntity(), 3, 1, false, false, false, false);
|
||||
getGolem().getEvent().getCondition().Factory().Slow("Rumble", (LivingEntity) entity, getEntity(), 3, 1,
|
||||
false, false, false, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,348 @@
|
||||
package mineplex.minecraft.game.core.boss.ironwizard.abilities;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.Map.Entry;
|
||||
|
||||
import org.bukkit.Effect;
|
||||
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.Item;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
||||
import org.bukkit.event.inventory.InventoryPickupItemEvent;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import mineplex.core.common.util.UtilAction;
|
||||
import mineplex.core.common.util.UtilAlg;
|
||||
import mineplex.core.common.util.UtilBlock;
|
||||
import mineplex.core.common.util.UtilEnt;
|
||||
import mineplex.core.common.util.UtilMath;
|
||||
import mineplex.core.common.util.UtilParticle;
|
||||
import mineplex.core.common.util.UtilPlayer;
|
||||
import mineplex.core.common.util.UtilServer;
|
||||
import mineplex.core.common.util.UtilParticle.ParticleType;
|
||||
import mineplex.core.common.util.UtilParticle.ViewDist;
|
||||
import mineplex.core.itemstack.ItemStackFactory;
|
||||
import mineplex.core.updater.UpdateType;
|
||||
import mineplex.core.updater.event.UpdateEvent;
|
||||
import mineplex.core.common.util.UtilTime;
|
||||
import mineplex.minecraft.game.core.boss.ironwizard.GolemCreature;
|
||||
|
||||
public class GolemRupture extends GolemAbility
|
||||
{
|
||||
private ArrayList<Entry<Location, Location>> _ruptures = new ArrayList<Entry<Location, Location>>();
|
||||
private HashMap<Location, Long> _ruptureTime = new HashMap<Location, Long>();
|
||||
private ArrayList<String> _targetted = new ArrayList<String>();
|
||||
private int _rupturesLeft;
|
||||
private int _tick;
|
||||
private ArrayList<Item> _items = new ArrayList<Item>();
|
||||
private int _ticksFinished;
|
||||
|
||||
public GolemRupture(GolemCreature creature)
|
||||
{
|
||||
super(creature);
|
||||
|
||||
if (creature.getHealthPercent() > 0.75)
|
||||
{
|
||||
_rupturesLeft = 2;
|
||||
}
|
||||
else if (creature.getHealthPercent() > 0.5)
|
||||
{
|
||||
_rupturesLeft = 5;
|
||||
}
|
||||
else
|
||||
{
|
||||
_rupturesLeft = 10;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canMove()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void HopperPickup(InventoryPickupItemEvent event)
|
||||
{
|
||||
if (_items.contains(event.getItem()))
|
||||
event.setCancelled(true);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void ItemDestroy(UpdateEvent event)
|
||||
{
|
||||
if (event.getType() != UpdateType.TICK)
|
||||
return;
|
||||
|
||||
if (_items.isEmpty())
|
||||
return;
|
||||
|
||||
Iterator<Item> itemIterator = _items.iterator();
|
||||
|
||||
while (itemIterator.hasNext())
|
||||
{
|
||||
Item item = itemIterator.next();
|
||||
|
||||
if (item.isDead() || !item.isValid())
|
||||
{
|
||||
item.remove();
|
||||
itemIterator.remove();
|
||||
}
|
||||
else if (UtilEnt.isGrounded(item) || item.getTicksLived() > 60)
|
||||
{
|
||||
item.getWorld().playEffect(item.getLocation(), Effect.STEP_SOUND, item.getItemStack().getTypeId());
|
||||
item.remove();
|
||||
itemIterator.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean inProgress()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFinished()
|
||||
{
|
||||
return _rupturesLeft <= 0 && _ruptures.isEmpty() && --_ticksFinished <= 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFinished()
|
||||
{
|
||||
for (Item item : _items)
|
||||
{
|
||||
item.remove();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick()
|
||||
{
|
||||
Iterator<Entry<Location, Location>> itel = _ruptures.iterator();
|
||||
|
||||
while (itel.hasNext())
|
||||
{
|
||||
Entry<Location, Location> entry = itel.next();
|
||||
|
||||
if (entry.getKey().distance(entry.getValue()) > 0)
|
||||
{
|
||||
Vector vec = entry.getValue().toVector().subtract(entry.getKey().toVector());
|
||||
|
||||
if (vec.length() > 1)
|
||||
{
|
||||
vec = vec.normalize();
|
||||
}
|
||||
|
||||
entry.getKey().add(vec);
|
||||
}
|
||||
|
||||
if (entry.getKey().distance(entry.getValue()) < 0.1)
|
||||
{
|
||||
if (!_ruptureTime.containsKey(entry.getKey()))
|
||||
{
|
||||
_ruptureTime.put(entry.getKey(), System.currentTimeMillis());
|
||||
}
|
||||
else if (UtilTime.elapsed(_ruptureTime.get(entry.getKey()), 150))
|
||||
{
|
||||
itel.remove();
|
||||
|
||||
explodeRupture(entry.getKey());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (_tick % 10 == 0 && _rupturesLeft > 0)
|
||||
{
|
||||
_rupturesLeft--;
|
||||
|
||||
Location loc = getLocation().add(UtilMath.random.nextFloat() - 0.5, 0, UtilMath.random.nextFloat() - 0.5);
|
||||
|
||||
loc.setY(loc.getBlockY());
|
||||
|
||||
for (int y = 0; y > -3; y--)
|
||||
{
|
||||
if (!UtilBlock.airFoliage(loc.getBlock().getRelative(0, y, 0)))
|
||||
{
|
||||
loc.setY(loc.getY() + y);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Player player = getTarget();
|
||||
|
||||
if (player != null)
|
||||
{
|
||||
_targetted.add(player.getName());
|
||||
|
||||
Location target = player.getLocation();
|
||||
target.setY(loc.getY());
|
||||
|
||||
_ruptures.add(new HashMap.SimpleEntry(loc, target));
|
||||
}
|
||||
else
|
||||
{
|
||||
_rupturesLeft = 0;
|
||||
}
|
||||
}
|
||||
|
||||
for (Entry<Location, Location> entry : _ruptures)
|
||||
{
|
||||
entry.getKey().getWorld().playSound(entry.getKey(), Sound.DIG_GRAVEL, 2.5F, 0.9F);
|
||||
|
||||
// if (_tick % 3 == 0)
|
||||
{
|
||||
UtilParticle.PlayParticle(ParticleType.BLOCK_DUST.getParticle(Material.DIRT, 0),
|
||||
entry.getKey().clone().add(0, 1.1, 0), 1F, 0, 1F, 0, 70, ViewDist.NORMAL, UtilServer.getPlayers());
|
||||
}
|
||||
}
|
||||
|
||||
_tick++;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Player getTarget()
|
||||
{
|
||||
Player target = null;
|
||||
double dist = 0;
|
||||
|
||||
for (Player player : UtilPlayer.getNearby(getLocation(), 30, true))
|
||||
{
|
||||
if (!player.hasLineOfSight(getEntity()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (_targetted.contains(player.getName()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
double d = player.getLocation().distance(getLocation());
|
||||
|
||||
if (d < 7)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
boolean valid = true;
|
||||
|
||||
for (Entry<Location, Location> loc : _ruptures)
|
||||
{
|
||||
if (loc.getValue().distance(player.getLocation()) < 1.5)
|
||||
{
|
||||
valid = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!valid)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (target == null || dist > d)
|
||||
{
|
||||
target = player;
|
||||
dist = d;
|
||||
}
|
||||
}
|
||||
|
||||
return target;
|
||||
}
|
||||
|
||||
private void explodeRupture(Location loc)
|
||||
{
|
||||
loc.add(0, 1.1, 0);
|
||||
loc.setX(loc.getBlockX() + 0.5);
|
||||
loc.setZ(loc.getBlockZ() + 0.5);
|
||||
|
||||
// Fling
|
||||
HashMap<LivingEntity, Double> targets = UtilEnt.getInRadius(loc, 3.5);
|
||||
for (LivingEntity cur : targets.keySet())
|
||||
{
|
||||
// Velocity
|
||||
UtilAction.velocity(cur,
|
||||
UtilAlg.getTrajectory2d(loc.toVector().add(new Vector(0.5, 0, 0.5)), cur.getLocation().toVector()),
|
||||
0.8 + 0.8 * targets.get(cur), true, 0, 0.4 + 1.0 * targets.get(cur), 1.4, true);
|
||||
|
||||
// Condition
|
||||
getGolem().getEvent().getCondition().Factory().Falling("Rupture", cur, getEntity(), 10, false, true);
|
||||
|
||||
// Damage Event
|
||||
getGolem().getEvent().getDamageManager().NewDamageEvent(cur, getEntity(), null, DamageCause.CUSTOM,
|
||||
4 * getGolem().getDifficulty(), false, true, false, "Iron Wizard", "Rupture");
|
||||
}
|
||||
|
||||
ArrayList<Block> blocks = new ArrayList<Block>();
|
||||
|
||||
for (int x = -3; x <= 3; x++)
|
||||
{
|
||||
for (int z = -3; z <= 3; z++)
|
||||
{
|
||||
for (int y = 0; y <= 1; y++)
|
||||
{
|
||||
for (int i = 0; i < 2; i++)
|
||||
{
|
||||
if (Math.sqrt(x * x + z * z + y * y) <= 3)
|
||||
{
|
||||
blocks.add(loc.clone().add(x, y, z).getBlock());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Collections.shuffle(blocks);
|
||||
|
||||
// Blocks
|
||||
int done = 0;
|
||||
Iterator<Block> itel = blocks.iterator();
|
||||
|
||||
while (done < 30 && itel.hasNext())
|
||||
{
|
||||
Block block = itel.next();
|
||||
|
||||
Vector vec = new Vector(Math.random() - 0.5, Math.random() - 0.5, Math.random() - 0.5).normalize();
|
||||
|
||||
if (!UtilBlock.airFoliage(block))
|
||||
continue;
|
||||
|
||||
// Add Directional
|
||||
vec.add(UtilAlg.getTrajectory(loc.getBlock().getLocation(), block.getLocation().add(0.5, 0, 0.5)));
|
||||
|
||||
// Add Up
|
||||
vec.add(new Vector(0, 1.6, 0));
|
||||
|
||||
vec.normalize();
|
||||
|
||||
// Scale
|
||||
vec.multiply(0.1 + 0.3 * Math.random() + 0.6);
|
||||
|
||||
// Block!
|
||||
Item item = loc.getWorld().dropItem(block.getLocation().add(0.5, 0, 0.5), new ItemStack(Material.DIRT.getId(), 0));
|
||||
item.setVelocity(vec);
|
||||
item.setPickupDelay(50000);
|
||||
_items.add(item);
|
||||
|
||||
// Effect
|
||||
loc.getWorld().playEffect(block.getLocation(), Effect.STEP_SOUND, Material.DIRT.getId());
|
||||
|
||||
done++;
|
||||
}
|
||||
|
||||
_ticksFinished = 20;
|
||||
}
|
||||
}
|
@ -139,8 +139,8 @@ public class GolemWallExplode extends GolemAbility
|
||||
|
||||
net.minecraft.server.v1_7_R4.Entity nmsEntity = ((CraftEntity) cur).getHandle();
|
||||
Vec3D vec3d = Vec3D.a(nmsEntity.locX, nmsEntity.locY, nmsEntity.locZ);
|
||||
Vec3D vec3d1 = Vec3D.a(nmsEntity.locX + nmsEntity.motX, nmsEntity.locY + nmsEntity.motY, nmsEntity.locZ
|
||||
+ nmsEntity.motZ);
|
||||
Vec3D vec3d1 = Vec3D.a(nmsEntity.locX + nmsEntity.motX, nmsEntity.locY + nmsEntity.motY,
|
||||
nmsEntity.locZ + nmsEntity.motZ);
|
||||
|
||||
MovingObjectPosition finalObjectPosition = nmsEntity.world.rayTrace(vec3d, vec3d1, false, true, false);
|
||||
vec3d = Vec3D.a(nmsEntity.locX, nmsEntity.locY, nmsEntity.locZ);
|
||||
@ -151,8 +151,7 @@ public class GolemWallExplode extends GolemAbility
|
||||
vec3d1 = Vec3D.a(finalObjectPosition.pos.a, finalObjectPosition.pos.b, finalObjectPosition.pos.c);
|
||||
}
|
||||
|
||||
for (Object entity : ((CraftWorld) cur.getWorld()).getHandle().getEntities(
|
||||
((CraftEntity) cur).getHandle(),
|
||||
for (Object entity : ((CraftWorld) cur.getWorld()).getHandle().getEntities(((CraftEntity) cur).getHandle(),
|
||||
((CraftEntity) cur).getHandle().boundingBox.a(((CraftEntity) cur).getHandle().motX,
|
||||
((CraftEntity) cur).getHandle().motY, ((CraftEntity) cur).getHandle().motZ).grow(2, 2, 2)))
|
||||
{
|
||||
@ -193,11 +192,9 @@ public class GolemWallExplode extends GolemAbility
|
||||
|
||||
if (canDamage(victim))
|
||||
{
|
||||
getGolem()
|
||||
.getEvent()
|
||||
.getDamageManager()
|
||||
.NewDamageEvent((LivingEntity) victim, getEntity(), null, DamageCause.CONTACT, 6, true, true, false,
|
||||
"Iron Wizard Wall Explosion", "Iron Wizard Wall Explosion");
|
||||
getGolem().getEvent().getDamageManager().NewDamageEvent((LivingEntity) victim, getEntity(), null,
|
||||
DamageCause.CONTACT, 6 * getGolem().getDifficulty(), true, true, false, "Iron Wizard Wall Explosion",
|
||||
"Iron Wizard Wall Explosion");
|
||||
}
|
||||
|
||||
cur.remove();
|
||||
@ -216,8 +213,8 @@ public class GolemWallExplode extends GolemAbility
|
||||
nmsEntity.motX = ((float) (finalObjectPosition.pos.a - nmsEntity.locX));
|
||||
nmsEntity.motY = ((float) (finalObjectPosition.pos.b - nmsEntity.locY));
|
||||
nmsEntity.motZ = ((float) (finalObjectPosition.pos.c - nmsEntity.locZ));
|
||||
float f2 = MathHelper.sqrt(nmsEntity.motX * nmsEntity.motX + nmsEntity.motY * nmsEntity.motY + nmsEntity.motZ
|
||||
* nmsEntity.motZ);
|
||||
float f2 = MathHelper.sqrt(
|
||||
nmsEntity.motX * nmsEntity.motX + nmsEntity.motY * nmsEntity.motY + nmsEntity.motZ * nmsEntity.motZ);
|
||||
nmsEntity.locX -= nmsEntity.motX / f2 * 0.0500000007450581D;
|
||||
nmsEntity.locY -= nmsEntity.motY / f2 * 0.0500000007450581D;
|
||||
nmsEntity.locZ -= nmsEntity.motZ / f2 * 0.0500000007450581D;
|
||||
@ -229,8 +226,9 @@ public class GolemWallExplode extends GolemAbility
|
||||
}
|
||||
else
|
||||
{
|
||||
UtilParticle.PlayParticle(ParticleType.BLOCK_DUST.getParticle(Material.STONE, 0), cur.getLocation()
|
||||
.add(0, 0.5, 0), 0.3F, 0.3F, 0.3F, 0, 2, UtilParticle.ViewDist.NORMAL, UtilServer.getPlayers());
|
||||
UtilParticle.PlayParticle(ParticleType.BLOCK_DUST.getParticle(Material.STONE, 0),
|
||||
cur.getLocation().add(0, 0.5, 0), 0.3F, 0.3F, 0.3F, 0, 2, UtilParticle.ViewDist.NORMAL,
|
||||
UtilServer.getPlayers());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7,10 +7,13 @@ import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.EventPriority;
|
||||
import org.bukkit.event.HandlerList;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.common.util.UtilAlg;
|
||||
import mineplex.core.common.util.UtilBlock;
|
||||
import mineplex.core.common.util.UtilMath;
|
||||
import mineplex.core.common.util.UtilShapes;
|
||||
import mineplex.core.common.util.UtilWorld;
|
||||
@ -34,8 +37,8 @@ import nautilus.game.arcade.kit.Kit;
|
||||
public class BossBattles extends TeamGame
|
||||
{
|
||||
private WorldEvent _currentBoss;
|
||||
private BattleBoss _chosenBoss = BattleBoss.values()[UtilMath.r(BattleBoss
|
||||
.values().length)];
|
||||
private BattleBoss _chosenBoss = BattleBoss.values()[UtilMath
|
||||
.r(BattleBoss.values().length)];
|
||||
private ArrayList<BossDisplay> _displays = new ArrayList<BossDisplay>();
|
||||
|
||||
public BossBattles(ArcadeManager manager)
|
||||
@ -114,24 +117,6 @@ public class BossBattles extends TeamGame
|
||||
// If the event was cancelled, we don't need to run a cleanup
|
||||
if (_currentBoss.getState() == EventState.COMPLETE)
|
||||
_currentBoss.cleanup();
|
||||
|
||||
_currentBoss = null;
|
||||
Damage = false;
|
||||
|
||||
SpectatorSpawn = UtilWorld.averageLocation(GetTeamList().get(0)
|
||||
.GetSpawns());
|
||||
|
||||
for (Player player : GetPlayers(false))
|
||||
{
|
||||
if (!IsAlive(player))
|
||||
{
|
||||
RespawnPlayer(player);
|
||||
}
|
||||
else
|
||||
{
|
||||
player.teleport(GetTeamList().get(0).GetSpawn());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void setPicked(Player player, BattleBoss battleBoss)
|
||||
@ -170,11 +155,64 @@ public class BossBattles extends TeamGame
|
||||
for (BossDisplay display : _displays)
|
||||
{
|
||||
HandlerList.unregisterAll(display);
|
||||
display.removeHologram();
|
||||
display.removeBoss();
|
||||
}
|
||||
|
||||
_displays.clear();
|
||||
}
|
||||
|
||||
@EventHandler(priority = EventPriority.HIGH)
|
||||
public void onPrepare(GameStateChangeEvent event)
|
||||
{
|
||||
if (event.GetState() != GameState.Prepare)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
double distAway = Math.max(_currentBoss.getSchematic().getWidth(),
|
||||
_currentBoss.getSchematic().getLength()) / 2;
|
||||
|
||||
distAway += Math.min(20, distAway * 0.2);
|
||||
|
||||
for (Location loc : GetTeamList().get(0).GetSpawns())
|
||||
{
|
||||
double maxDist = loc.toVector().setY(0).length();
|
||||
|
||||
Vector vec = UtilAlg.getTrajectory2d(new Vector(), loc.toVector());
|
||||
|
||||
loc.setX(0);
|
||||
loc.setZ(0);
|
||||
|
||||
loc.add(vec.multiply(Math.min(maxDist, distAway)));
|
||||
|
||||
vec.normalize().multiply(-1);
|
||||
|
||||
boolean foundSafe = false;
|
||||
|
||||
for (int i = 0; i < 50; i++)
|
||||
{
|
||||
for (int y = 200; y > 0; y--)
|
||||
{
|
||||
loc.setY(y);
|
||||
|
||||
if (UtilBlock.solid(loc.getBlock().getRelative(0, -1, 0)))
|
||||
{
|
||||
foundSafe = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (foundSafe)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
loc.add(vec);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onGamePrepare(GameStateChangeEvent event)
|
||||
{
|
||||
@ -194,8 +232,8 @@ public class BossBattles extends TeamGame
|
||||
{
|
||||
Location loc = locations.get(i).clone();
|
||||
|
||||
loc.setDirection(UtilAlg.getTrajectory(loc, Manager.GetLobby()
|
||||
.GetSpawn()));
|
||||
loc.setDirection(UtilAlg.getTrajectory(loc,
|
||||
Manager.GetLobby().GetSpawn()));
|
||||
|
||||
Constructor<? extends BossDisplay> constructor = boss
|
||||
.getBossDisplay().getConstructor(BossBattles.class,
|
||||
@ -208,9 +246,10 @@ public class BossBattles extends TeamGame
|
||||
getArcadeManager().getPlugin());
|
||||
|
||||
bossDisplay.start();
|
||||
bossDisplay.spawnHologram();
|
||||
|
||||
System.out.print("Registered "
|
||||
+ bossDisplay.getClass().getSimpleName());
|
||||
System.out.print(
|
||||
"Registered " + bossDisplay.getClass().getSimpleName());
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
@ -261,17 +300,17 @@ public class BossBattles extends TeamGame
|
||||
if (clazz != SlimeBoss.class)
|
||||
{
|
||||
worldEvent = (WorldEvent) con.newInstance(
|
||||
getArcadeManager().GetDamage(), getArcadeManager()
|
||||
.GetBlockRestore(), getArcadeManager()
|
||||
.GetCondition(), centerLocation);
|
||||
getArcadeManager().GetDamage(),
|
||||
getArcadeManager().GetBlockRestore(),
|
||||
getArcadeManager().GetCondition(), centerLocation);
|
||||
}
|
||||
else
|
||||
{
|
||||
worldEvent = (WorldEvent) con.newInstance(
|
||||
getArcadeManager().GetDamage(), getArcadeManager()
|
||||
.GetBlockRestore(), getArcadeManager()
|
||||
.GetCondition(), getArcadeManager()
|
||||
.GetProjectile(), centerLocation);
|
||||
getArcadeManager().GetDamage(),
|
||||
getArcadeManager().GetBlockRestore(),
|
||||
getArcadeManager().GetCondition(),
|
||||
getArcadeManager().GetProjectile(), centerLocation);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -285,10 +324,11 @@ public class BossBattles extends TeamGame
|
||||
|
||||
private void setNewBoss(BattleBoss boss)
|
||||
{
|
||||
_currentBoss = createInstance(boss.getBoss(), new Location(
|
||||
WorldData.World, 0, 6, 0));
|
||||
_currentBoss = createInstance(boss.getBoss(),
|
||||
new Location(WorldData.World, 0, 6, 0));
|
||||
|
||||
_currentBoss.setInstantSchematic(true);
|
||||
_currentBoss.setDifficulty(0.6);
|
||||
|
||||
_currentBoss.loadMap();
|
||||
}
|
||||
|
@ -3,15 +3,26 @@ package nautilus.game.arcade.game.games.bossbattles.displays;
|
||||
import nautilus.game.arcade.game.games.bossbattles.BattleBoss;
|
||||
import nautilus.game.arcade.game.games.bossbattles.BossBattles;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
|
||||
import mineplex.core.common.util.UtilAlg;
|
||||
import mineplex.core.hologram.Hologram;
|
||||
import mineplex.core.updater.UpdateType;
|
||||
import mineplex.core.updater.event.UpdateEvent;
|
||||
|
||||
public abstract class BossDisplay implements Listener
|
||||
{
|
||||
private Location _bossLocation;
|
||||
protected BossBattles Plugin;
|
||||
private BattleBoss _boss;
|
||||
private Hologram _hologram;
|
||||
private ArrayList<Entity> _entities = new ArrayList<Entity>();
|
||||
|
||||
public BossDisplay(BossBattles plugin, BattleBoss boss, Location location)
|
||||
{
|
||||
@ -20,6 +31,37 @@ public abstract class BossDisplay implements Listener
|
||||
_bossLocation = location;
|
||||
}
|
||||
|
||||
public void addEntity(Entity entity)
|
||||
{
|
||||
_entities.add(entity);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void preventMovement(UpdateEvent event)
|
||||
{
|
||||
if (event.getType() != UpdateType.TICK)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (Entity entity : _entities)
|
||||
{
|
||||
Location loc = entity.getLocation();
|
||||
|
||||
if (loc.distance(_bossLocation) > 0.1)
|
||||
{
|
||||
loc = _bossLocation.clone();
|
||||
loc.setY(entity.getLocation().getY());
|
||||
loc.setDirection(
|
||||
UtilAlg.getTrajectory2d(entity.getLocation(), loc));
|
||||
|
||||
entity.teleport(loc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public abstract String getDisplayName();
|
||||
|
||||
public Location getLocation()
|
||||
{
|
||||
return _bossLocation;
|
||||
@ -30,8 +72,33 @@ public abstract class BossDisplay implements Listener
|
||||
Plugin.setPicked(player, _boss);
|
||||
}
|
||||
|
||||
public abstract void removeBoss();
|
||||
public void removeBoss()
|
||||
{
|
||||
for (Entity entity : _entities)
|
||||
{
|
||||
entity.remove();
|
||||
}
|
||||
}
|
||||
|
||||
public abstract void start();
|
||||
|
||||
public void spawnHologram()
|
||||
{
|
||||
_hologram = new Hologram(Plugin.getArcadeManager().getHologramManager(),
|
||||
getHologramLocation(), getDisplayName());
|
||||
|
||||
_hologram.start();
|
||||
}
|
||||
|
||||
public Hologram getHologram()
|
||||
{
|
||||
return _hologram;
|
||||
}
|
||||
|
||||
public void removeHologram()
|
||||
{
|
||||
_hologram.stop();
|
||||
}
|
||||
|
||||
public abstract Location getHologramLocation();
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package nautilus.game.arcade.game.games.bossbattles.displays;
|
||||
|
||||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.common.util.UtilEnt;
|
||||
import nautilus.game.arcade.game.games.bossbattles.BattleBoss;
|
||||
import nautilus.game.arcade.game.games.bossbattles.BossBattles;
|
||||
@ -31,23 +32,39 @@ public class IronWizardDisplay extends BossDisplay
|
||||
setChosen(event.getPlayer());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeBoss()
|
||||
{
|
||||
_golem.remove();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start()
|
||||
{
|
||||
Plugin.CreatureAllowOverride = true;
|
||||
|
||||
_golem = (IronGolem) getLocation().getWorld().spawnEntity(
|
||||
getLocation(), EntityType.IRON_GOLEM);
|
||||
_golem = (IronGolem) getLocation().getWorld().spawnEntity(getLocation(),
|
||||
EntityType.IRON_GOLEM);
|
||||
_golem.teleport(getLocation());
|
||||
UtilEnt.Vegetate(_golem);
|
||||
|
||||
Plugin.CreatureAllowOverride = false;
|
||||
|
||||
addEntity(_golem);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDisplayName()
|
||||
{
|
||||
return C.cGray + "Iron Wizard";
|
||||
}
|
||||
|
||||
@Override
|
||||
public Location getHologramLocation()
|
||||
{
|
||||
return _golem.getEyeLocation().add(0, 0.3, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void spawnHologram()
|
||||
{
|
||||
super.spawnHologram();
|
||||
|
||||
getHologram().setFollowEntity(_golem);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,5 +1,6 @@
|
||||
package nautilus.game.arcade.game.games.bossbattles.displays;
|
||||
|
||||
import mineplex.core.common.util.C;
|
||||
import mineplex.core.common.util.UtilEnt;
|
||||
import nautilus.game.arcade.game.games.bossbattles.BattleBoss;
|
||||
import nautilus.game.arcade.game.games.bossbattles.BossBattles;
|
||||
@ -32,12 +33,6 @@ public class SlimeKingDisplay extends BossDisplay
|
||||
setChosen(event.getPlayer());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void removeBoss()
|
||||
{
|
||||
_slime.remove();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void start()
|
||||
{
|
||||
@ -52,6 +47,28 @@ public class SlimeKingDisplay extends BossDisplay
|
||||
UtilEnt.Vegetate(_slime);
|
||||
|
||||
Plugin.CreatureAllowOverride = false;
|
||||
|
||||
addEntity(_slime);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDisplayName()
|
||||
{
|
||||
return C.cDGreen + "Slime King";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void spawnHologram()
|
||||
{
|
||||
super.spawnHologram();
|
||||
|
||||
getHologram().setFollowEntity(_slime);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Location getHologramLocation()
|
||||
{
|
||||
return _slime.getEyeLocation().add(0, 0.1, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user