Fix up iron golem, add slam attack
This commit is contained in:
parent
379ee9271a
commit
1f5cd624a4
@ -10,6 +10,7 @@ import java.util.TreeSet;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
@ -354,10 +355,25 @@ public class UtilAlg
|
||||
return bestLoc;
|
||||
}
|
||||
|
||||
public static Vector calculateVelocity(Vector from, Vector to, double heightGain, Entity entity)
|
||||
{
|
||||
if (entity instanceof LivingEntity)
|
||||
{
|
||||
return calculateVelocity(from, to, heightGain, 1.15);
|
||||
}
|
||||
else
|
||||
{
|
||||
return calculateVelocity(from, to, heightGain, 0.115);
|
||||
}
|
||||
}
|
||||
|
||||
public static Vector calculateVelocity(Vector from, Vector to, double heightGain)
|
||||
{
|
||||
// Gravity of a potion
|
||||
double gravity = 0.115;
|
||||
return calculateVelocity(from, to, heightGain, 0.115);
|
||||
}
|
||||
|
||||
public static Vector calculateVelocity(Vector from, Vector to, double heightGain, double gravity)
|
||||
{
|
||||
// Block locations
|
||||
int endGain = to.getBlockY() - from.getBlockY();
|
||||
|
||||
|
@ -53,7 +53,7 @@ public abstract class WorldEvent implements Listener
|
||||
private List<EventCreature> _creatures;
|
||||
// Block Restore
|
||||
private BlockRestoreMap _blocks;
|
||||
private boolean _instantSchematic;
|
||||
private boolean _isArcade;
|
||||
private double _difficulty = 1;
|
||||
|
||||
public WorldEvent(DamageManager damageManager, BlockRestore blockRestore, ConditionManager conditionManager, String name,
|
||||
@ -99,9 +99,9 @@ public abstract class WorldEvent implements Listener
|
||||
_difficulty = difficulty;
|
||||
}
|
||||
|
||||
public void setInstantSchematic(boolean instantSchematic)
|
||||
public void setArcadeGame(boolean isArcade)
|
||||
{
|
||||
_instantSchematic = instantSchematic;
|
||||
_isArcade = isArcade;
|
||||
}
|
||||
|
||||
public void loadMap()
|
||||
@ -289,16 +289,19 @@ public abstract class WorldEvent implements Listener
|
||||
@Override
|
||||
public void run(List<BlockData> data)
|
||||
{
|
||||
for (BlockData blockData : data)
|
||||
if (!_isArcade)
|
||||
{
|
||||
_blocks.addBlockData(blockData);
|
||||
for (BlockData blockData : data)
|
||||
{
|
||||
_blocks.addBlockData(blockData);
|
||||
}
|
||||
}
|
||||
|
||||
onComplete.run();
|
||||
}
|
||||
});
|
||||
|
||||
task.setBlocksPerTick(_instantSchematic ? 2000000 : 100);
|
||||
task.setBlocksPerTick(_isArcade ? 2000000 : 100);
|
||||
task.start();
|
||||
}
|
||||
|
||||
|
@ -12,7 +12,6 @@ import mineplex.core.common.util.UtilBlock;
|
||||
import mineplex.core.common.util.UtilEnt;
|
||||
import mineplex.core.common.util.UtilMath;
|
||||
import mineplex.core.common.util.UtilPlayer;
|
||||
import mineplex.core.common.util.UtilServer;
|
||||
import mineplex.core.common.util.UtilTime;
|
||||
import mineplex.core.updater.UpdateType;
|
||||
import mineplex.core.updater.event.UpdateEvent;
|
||||
@ -25,6 +24,7 @@ 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.GolemRupture;
|
||||
import mineplex.minecraft.game.core.boss.ironwizard.abilities.GolemSlam;
|
||||
import mineplex.minecraft.game.core.boss.ironwizard.abilities.GolemWallExplode;
|
||||
import mineplex.minecraft.game.core.damage.CustomDamageEvent;
|
||||
|
||||
@ -52,6 +52,7 @@ public class GolemCreature extends EventCreature<IronGolem>
|
||||
private ArrayList<GolemAbility> _currentAbilities = new ArrayList<GolemAbility>();
|
||||
private double _canCaveIn = 450;
|
||||
private Vector _afkWalk = new Vector();
|
||||
private long _lastSlam;
|
||||
|
||||
public GolemCreature(GolemBoss boss, Location location, double maxHealth)
|
||||
{
|
||||
@ -197,7 +198,7 @@ public class GolemCreature extends EventCreature<IronGolem>
|
||||
}
|
||||
}
|
||||
|
||||
{ // Rumble
|
||||
{ // Rupture
|
||||
ArrayList<Player> players = getPlayers(dist, 30);
|
||||
|
||||
if (!players.isEmpty())
|
||||
@ -206,6 +207,15 @@ public class GolemCreature extends EventCreature<IronGolem>
|
||||
}
|
||||
}
|
||||
|
||||
{ // Slam
|
||||
ArrayList<Player> players = getPlayers(dist, 30);
|
||||
|
||||
if (!players.isEmpty() && UtilTime.elapsed(_lastSlam, 20000))
|
||||
{
|
||||
weight.put(GolemSlam.class, 6);
|
||||
}
|
||||
}
|
||||
|
||||
if (_canCaveIn <= 0) // Cave in
|
||||
{
|
||||
ArrayList<Player> players = getPlayers(dist, 30);
|
||||
@ -318,10 +328,14 @@ public class GolemCreature extends EventCreature<IronGolem>
|
||||
{
|
||||
_canCaveIn = 450;
|
||||
}
|
||||
else if (ability instanceof GolemSlam)
|
||||
{
|
||||
_lastSlam = System.currentTimeMillis();
|
||||
}
|
||||
|
||||
Bukkit.getPluginManager().registerEvents(ability, _boss.getPlugin());
|
||||
|
||||
// Bukkit.broadcastMessage("Ability: " + _currentAbility.getClass().getSimpleName());
|
||||
// Bukkit.broadcastMessage("Prepare fair maidens for " + ability.getClass().getSimpleName() + "!");
|
||||
|
||||
System.out.print("Golem boss is using " + ability.getClass().getSimpleName());
|
||||
|
||||
|
@ -33,6 +33,7 @@ import org.bukkit.entity.FallingBlock;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.block.BlockPhysicsEvent;
|
||||
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
@ -215,6 +216,15 @@ public class GolemCaveIn extends GolemAbility
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPhysics(BlockPhysicsEvent event)
|
||||
{
|
||||
if (_blocks.contains(event.getBlock()))
|
||||
{
|
||||
event.setCancelled(true);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick()
|
||||
{
|
||||
@ -242,23 +252,6 @@ 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)
|
||||
|
@ -105,7 +105,7 @@ public class GolemExplodingAura extends GolemAbility
|
||||
@Override
|
||||
public void tick()
|
||||
{
|
||||
if (_tick < 25 * 25)
|
||||
if (_tick < 25 * 25 && getGolem().getHealth() > 30)
|
||||
{
|
||||
double angle = (2 * Math.PI) / UtilMath.random.nextDouble();
|
||||
double x = 1.7 * Math.cos(angle);
|
||||
|
@ -12,6 +12,7 @@ import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.craftbukkit.v1_7_R4.entity.CraftIronGolem;
|
||||
import org.bukkit.entity.Item;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.bukkit.entity.Player;
|
||||
@ -36,6 +37,7 @@ 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;
|
||||
import net.minecraft.server.v1_7_R4.EntityIronGolem;
|
||||
|
||||
public class GolemRupture extends GolemAbility
|
||||
{
|
||||
@ -191,6 +193,12 @@ public class GolemRupture extends GolemAbility
|
||||
target.setY(loc.getY());
|
||||
|
||||
_ruptures.add(new HashMap.SimpleEntry(loc, target));
|
||||
|
||||
UtilEnt.CreatureLook(getEntity(), player.getLocation());
|
||||
|
||||
EntityIronGolem golem = ((CraftIronGolem) getEntity()).getHandle();
|
||||
|
||||
golem.world.broadcastEntityEffect(golem, (byte) 4);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -0,0 +1,259 @@
|
||||
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 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.UtilPlayer;
|
||||
import mineplex.core.updater.UpdateType;
|
||||
import mineplex.core.updater.event.UpdateEvent;
|
||||
import mineplex.minecraft.game.core.boss.ironwizard.GolemCreature;
|
||||
|
||||
import org.bukkit.Effect;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.Entity;
|
||||
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;
|
||||
|
||||
public class GolemSlam extends GolemAbility
|
||||
{
|
||||
private ArrayList<Item> _items = new ArrayList<Item>();
|
||||
private int _ticksFinished;
|
||||
private int _stage;
|
||||
private Vector _target;
|
||||
private int _ticksJumped;
|
||||
|
||||
public GolemSlam(GolemCreature creature)
|
||||
{
|
||||
super(creature);
|
||||
|
||||
Player target = getTarget();
|
||||
|
||||
if (target != null)
|
||||
{
|
||||
_target = UtilAlg.calculateVelocity(getLocation().toVector(),
|
||||
target.getLocation().toVector().setY(getLocation().getY()), 2, getEntity());
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean canMove()
|
||||
{
|
||||
return !UtilEnt.isGrounded(getEntity()) && _stage == 1;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasFinished()
|
||||
{
|
||||
return _stage == 2 && --_ticksFinished <= 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setFinished()
|
||||
{
|
||||
for (Item item : _items)
|
||||
{
|
||||
item.remove();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void tick()
|
||||
{
|
||||
Entity entity = getEntity();
|
||||
|
||||
if (_stage == 0)
|
||||
{
|
||||
UtilEnt.CreatureLook(getEntity(), getLocation().add(_target));
|
||||
|
||||
entity.getWorld().playSound(entity.getLocation(), Sound.IRONGOLEM_THROW, 4, 0);
|
||||
|
||||
entity.setVelocity(_target);
|
||||
_stage++;
|
||||
}
|
||||
else if (_stage == 1)
|
||||
{
|
||||
_ticksJumped++;
|
||||
|
||||
if (_ticksJumped > 4 && getLocation().subtract(0, 0.2, 0).getBlock().getType() != Material.AIR)
|
||||
{
|
||||
explodeRupture(getLocation());
|
||||
|
||||
_stage = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@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 true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Player getTarget()
|
||||
{
|
||||
Player target = null;
|
||||
double dist = 0;
|
||||
|
||||
for (Player player : UtilPlayer.getNearby(getLocation(), 30, true))
|
||||
{
|
||||
if (!player.hasLineOfSight(getEntity()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
double d = player.getLocation().distance(getLocation());
|
||||
|
||||
if (d < 10)
|
||||
{
|
||||
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())
|
||||
{
|
||||
if (cur.equals(getEntity()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
}
|
@ -248,6 +248,8 @@ public class BossBattles extends TeamGame
|
||||
bossDisplay.start();
|
||||
bossDisplay.spawnHologram();
|
||||
|
||||
_displays.add(bossDisplay);
|
||||
|
||||
System.out.print(
|
||||
"Registered " + bossDisplay.getClass().getSimpleName());
|
||||
}
|
||||
@ -327,7 +329,7 @@ public class BossBattles extends TeamGame
|
||||
_currentBoss = createInstance(boss.getBoss(),
|
||||
new Location(WorldData.World, 0, 6, 0));
|
||||
|
||||
_currentBoss.setInstantSchematic(true);
|
||||
_currentBoss.setArcadeGame(true);
|
||||
_currentBoss.setDifficulty(0.6);
|
||||
|
||||
_currentBoss.loadMap();
|
||||
|
Loading…
Reference in New Issue
Block a user