More event stuff!

This commit is contained in:
Shaun Bennett 2015-06-11 23:35:29 -05:00
parent 9cdf69b19d
commit d24f01ba86
13 changed files with 130 additions and 261 deletions

View File

@ -55,7 +55,7 @@ public class ClansRegions
* Initializes a server-side clan and claims area according to the
* location and radius properties passed in.
* @param clanName - the name of the clan to create/claim territory for
* @param location - the center location to begin the claim
* @param locations - the center location to begin the claim
* @param chunkRadius - the radius (in chunks) to claim
* @param claimOffset - the initial offset in claim (creating a 'hole' with chunk offset radius)
* @param safe - whether the chunk claimed is considered a 'safe' (pvp-free) region.

View File

@ -36,10 +36,4 @@ public class ConcreteWorldEventFactory implements WorldEventFactory
{
return null;
}
@Override
public WorldEvent randomFromType(Location locationm, WorldEventType type)
{
return null;
}
}

View File

@ -15,6 +15,7 @@ import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.clans.ClansManager;
import mineplex.game.clans.clans.worldevent.command.WorldEventCommand;
import mineplex.game.clans.clans.worldevent.event.EventState;
import mineplex.game.clans.clans.worldevent.event.WorldEvent;
import mineplex.minecraft.game.core.damage.DamageManager;
@ -68,7 +69,7 @@ public class WorldEventManager extends MiniPlugin implements WorldEventListener
while (iterator.hasNext())
{
WorldEvent event = iterator.next();
if (event.isRunning()) event.cancel();
if (event.getState() != EventState.END) event.cancel();
HandlerList.unregisterAll(event);
iterator.remove();
}
@ -93,17 +94,6 @@ public class WorldEventManager extends MiniPlugin implements WorldEventListener
_events.remove(event);
}
@EventHandler
public void update(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK) return;
for (WorldEvent e : _events)
{
e.tick();
}
}
@Override
public void addCommands()
{

View File

@ -21,7 +21,7 @@ public abstract class EventCreature<T extends LivingEntity> implements Listener
// Spawn Data
private T _entity;
private Class<T> _entityClass;
private Class<? extends T> _entityClass;
private Location _spawnLocation;
// Creature Data
@ -51,15 +51,20 @@ public abstract class EventCreature<T extends LivingEntity> implements Listener
spawnEntity();
}
protected void spawnEntity()
protected final void spawnEntity()
{
_entity = _spawnLocation.getWorld().spawn(_spawnLocation, _entityClass);
Location spawnLocation = _entity == null ? _spawnLocation : _entity.getLocation();
T entity = _spawnLocation.getWorld().spawn(spawnLocation, getEntityClass());
setEntity(entity);
updateEntityHealth();
updateName();
_entity.setRemoveWhenFarAway(false);
entity.setRemoveWhenFarAway(false);
spawnCustom();
}
protected abstract void spawnCustom();
protected void updateEntityHealth()
{
_entity.setMaxHealth(10000d);
@ -85,12 +90,18 @@ public abstract class EventCreature<T extends LivingEntity> implements Listener
_entity.setCustomNameVisible(_useName);
}
protected void remove()
public void remove()
{
remove(true);
}
public void remove(boolean removeFromEvent)
{
if (_entity != null)
_entity.remove();
_event.removeCreature(this);
if (removeFromEvent)
_event.removeCreature(this);
}
protected final void die()
@ -118,9 +129,21 @@ public abstract class EventCreature<T extends LivingEntity> implements Listener
public void setEntity(T entity)
{
if (_entity != null) _entity.remove();
_entity = entity;
}
public Class<? extends T> getEntityClass()
{
return _entityClass;
}
public void setEntityClass(Class<? extends T> clazz)
{
_entityClass = clazz;
}
public Location getSpawnLocation()
{
return _spawnLocation;
@ -225,6 +248,5 @@ public abstract class EventCreature<T extends LivingEntity> implements Listener
updateEntityHealth();
applyDamage(event.GetDamage());
}
}

View File

@ -2,6 +2,7 @@ package mineplex.game.clans.clans.worldevent.event;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
@ -12,6 +13,7 @@ import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener;
import mineplex.core.common.util.UtilServer;
import mineplex.core.creature.Creature;
import mineplex.core.data.BlockData;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
@ -63,6 +65,7 @@ public abstract class WorldEvent implements Listener
public final void cancel()
{
setState(EventState.END);
clearCreatures();
customCancel();
}
@ -130,6 +133,11 @@ public abstract class WorldEvent implements Listener
return _centerLocation;
}
protected List<EventCreature> getCreatures()
{
return _creatures;
}
public void registerCreature(EventCreature creature)
{
UtilServer.getServer().getPluginManager().registerEvents(creature, _eventManager.getPlugin());
@ -142,6 +150,22 @@ public abstract class WorldEvent implements Listener
_creatures.remove(creature);
}
public void clearCreatures()
{
for (EventCreature creature : _creatures)
{
creature.remove(false);
HandlerList.unregisterAll(creature);
}
_creatures.clear();
}
public void restoreBlocks()
{
}
public void setBlock(Block block, int id, byte data)
{
if (!_blocks.containsKey(block))

View File

@ -1,90 +0,0 @@
package mineplex.game.clans.clans.worldevent.event.boss;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import mineplex.core.common.util.UtilTextBottom;
import mineplex.game.clans.clans.worldevent.WorldEventManager;
import mineplex.game.clans.clans.worldevent.event.WorldEvent;
import mineplex.game.clans.clans.worldevent.WorldEventListener;
import mineplex.minecraft.game.core.damage.DamageManager;
public abstract class BossEvent extends WorldEvent
{
private double _maxHealth;
private double _health;
private double _lastHealth;
// Action Bar Messages
private float _radiusSquared;
public BossEvent(WorldEventManager eventManager, DamageManager damageManager, String name, Location center, float radius, double maxHealth)
{
super(eventManager, damageManager, name, center);
_health = maxHealth;
_maxHealth = maxHealth;
setRadius(radius);
}
@Override
protected void customTick()
{
if (_lastHealth != _health || getTicks() % 20 == 0)
{
for (Player player : Bukkit.getServer().getOnlinePlayers())
{
if (player.getWorld().equals(getCenterLocation().getWorld()) && getCenterLocation().distanceSquared(player.getLocation()) < _radiusSquared)
{
UtilTextBottom.displayProgress(getName(), _health / _maxHealth, player);
}
}
}
_lastHealth = _health;
if (_health <= 0)
{
onDeath();
if (_health <= 0) // only finish if the health is still less than 0
for (WorldEventListener listener : getListeners()) listener.onComplete(this);
}
}
public void setRadius(float radius)
{
_radiusSquared = radius * radius;
}
protected abstract void onDeath();
protected void damage(double health)
{
_health -= health;
}
protected void setMaxHealth(double maxHealth)
{
_maxHealth = maxHealth;
}
public void setHealth(double health)
{
_health = health;
}
public double getHealth()
{
return _health;
}
public double getMaxHealth()
{
return _maxHealth;
}
public boolean inRange(Location loc)
{
return loc.distanceSquared(getCenterLocation()) <= _radiusSquared;
}
}

View File

@ -1,33 +1,25 @@
package mineplex.game.clans.clans.worldevent.event.boss.slime;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.entity.EntityType;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.SlimeSplitEvent;
import mineplex.game.clans.clans.worldevent.WorldEventManager;
import mineplex.game.clans.clans.worldevent.event.boss.BossEvent;
import mineplex.game.clans.clans.worldevent.creature.EventCreature;
import mineplex.game.clans.clans.worldevent.event.EventState;
import mineplex.game.clans.clans.worldevent.event.WorldEvent;
import mineplex.game.clans.clans.worldevent.event.boss.slime.creature.SlimeCreature;
import mineplex.minecraft.game.core.damage.DamageManager;
public class SlimeBoss extends BossEvent
public class SlimeBoss extends WorldEvent
{
private static final int MAX_SIZE = 10;
private static final int MIN_SIZE = 1;
private List<SlimePart> _slimes;
public SlimeBoss(WorldEventManager eventManager, DamageManager damageManager, Location center)
{
super(eventManager, damageManager, "Slime King", center, 100, 300);
_slimes = new LinkedList<SlimePart>();
super(eventManager, damageManager, "Slime King", center);
spawnSlime(center, MAX_SIZE);
}
@ -36,81 +28,20 @@ public class SlimeBoss extends BossEvent
protected void customStart()
{
Bukkit.broadcastMessage("Custom Start");
spawnSlime(getCenterLocation(), 10);
setState(EventState.LIVE);
}
@Override
protected void customCancel()
{
Bukkit.broadcastMessage("Custom Cancel");
// Remove all the slime entities!
for (SlimePart slime : _slimes)
{
slime.getEntity().remove();
}
}
@Override
protected void customTick()
{
super.customTick();
for (SlimePart slimePart : _slimes)
{
slimePart.tick();
}
}
@EventHandler
public void onSlimeDamage(EntityDamageEvent event)
{
if (event.getEntity().getType() == EntityType.SLIME)
{
for (SlimePart slimePart : _slimes)
{
if (event.getEntity().equals(slimePart.getEntity()))
{
// slime.setHealth(slime.getMaxHealth());
// event.setDamage(0);
break;
}
}
}
}
@EventHandler
public void onSplit(SlimeSplitEvent event)
{
for (SlimePart slimeData : _slimes)
{
if (event.getEntity().equals(slimeData.getEntity()))
event.setCancelled(true);
}
}
@EventHandler
public void onDeath(EntityDeathEvent event)
{
if (event.getEntity().getType() == EntityType.SLIME)
{
Iterator<SlimePart> slimeIterator = _slimes.iterator();
while (slimeIterator.hasNext())
{
SlimePart slimePart = slimeIterator.next();
if (slimePart.getEntity().equals(event.getEntity()))
{
splitSlime(slimePart);
event.setDroppedExp(0);
slimeIterator.remove();
break;
}
}
// Check if our main boss died every time a slime entity dies
checkDeath();
}
}
/**
@ -118,10 +49,22 @@ public class SlimeBoss extends BossEvent
*/
private void checkDeath()
{
if (_slimes.size() == 0)
if (getCreatures().size() == 0)
{
// SLIME IS DEAD!
setHealth(0);
setState(EventState.END);
Bukkit.broadcastMessage("FINISHED!");
}
}
@Override
public void removeCreature(EventCreature creature)
{
super.removeCreature(creature);
if (creature instanceof SlimeCreature)
{
splitSlime(((SlimeCreature) creature));
checkDeath();
}
}
@ -145,7 +88,7 @@ public class SlimeBoss extends BossEvent
return 40 * slimeSize;
}
private void splitSlime(SlimePart slime)
public void splitSlime(SlimeCreature slime)
{
int splitCount = getSplitCount(slime.getSize());
int splitSize = getSplitSize(slime.getSize());
@ -159,16 +102,11 @@ public class SlimeBoss extends BossEvent
}
}
private SlimePart spawnSlime(Location location, int size)
private SlimeCreature spawnSlime(Location location, int size)
{
SlimePart slimePart = new SlimePart(this, location, size, getMaxSlimeHealth(size), getEnrageTicks(size));
_slimes.add(slimePart);
return slimePart;
SlimeCreature slimeCreature = new SlimeCreature(this, location, size, getMaxSlimeHealth(size), getEnrageTicks(size));
registerCreature(slimeCreature);
return slimeCreature;
}
@Override
protected void onDeath()
{
Bukkit.broadcastMessage("DEATH");
}
}

View File

@ -1,7 +1,6 @@
package mineplex.game.clans.clans.worldevent.event.boss.slime.ability;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.bukkit.Bukkit;
@ -11,7 +10,7 @@ import org.bukkit.util.Vector;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilPlayer;
import mineplex.game.clans.clans.worldevent.event.boss.slime.SlimePart;
import mineplex.game.clans.clans.worldevent.event.boss.slime.creature.SlimeCreature;
public class AbsorbAbility extends SlimeAbility
{
@ -20,7 +19,7 @@ public class AbsorbAbility extends SlimeAbility
private int _pulseCount;
private int _maxDistance;
public AbsorbAbility(SlimePart slime)
public AbsorbAbility(SlimeCreature slime)
{
super(slime);
_ticksPerPulse = 20;
@ -57,8 +56,8 @@ public class AbsorbAbility extends SlimeAbility
Vector dir = UtilAlg.getTrajectory2d(player, getSlime().getEntity());
dir.setY(0.4);
player.setVelocity(dir);
getSlime().getBoss().getDamageManager().NewDamageEvent(player, getSlime().getEntity(), null,
EntityDamageEvent.DamageCause.MAGIC, getDamage(distance), false, false, false, getSlime().getBoss().getName(), "Absorb");
getSlime().getEvent().getDamageManager().NewDamageEvent(player, getSlime().getEntity(), null,
EntityDamageEvent.DamageCause.MAGIC, getDamage(distance), false, false, false, getSlime().getEvent().getName(), "Absorb");
}
}

View File

@ -10,14 +10,14 @@ import org.bukkit.util.Vector;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilPlayer;
import mineplex.game.clans.clans.worldevent.event.boss.slime.SlimePart;
import mineplex.game.clans.clans.worldevent.event.boss.slime.creature.SlimeCreature;
public class LeapAbility extends SlimeAbility
{
private Player _target;
private int _jumpTick;
public LeapAbility(SlimePart slime)
public LeapAbility(SlimeCreature slime)
{
super(slime);

View File

@ -19,7 +19,7 @@ import mineplex.core.projectile.IThrown;
import mineplex.core.projectile.ProjectileManager;
import mineplex.core.projectile.ProjectileUser;
import mineplex.core.updater.UpdateType;
import mineplex.game.clans.clans.worldevent.event.boss.slime.SlimePart;
import mineplex.game.clans.clans.worldevent.event.boss.slime.creature.SlimeCreature;
public class RocketAbility extends SlimeAbility implements IThrown
{
@ -28,12 +28,12 @@ public class RocketAbility extends SlimeAbility implements IThrown
private int _rocketsHit;
private LinkedList<ShotData> _shots;
public RocketAbility(SlimePart slime)
public RocketAbility(SlimeCreature slime)
{
this(slime, 5);
}
public RocketAbility(SlimePart slime, int rocketCount)
public RocketAbility(SlimeCreature slime, int rocketCount)
{
super(slime);
_rocketCount = rocketCount;
@ -97,7 +97,7 @@ public class RocketAbility extends SlimeAbility implements IThrown
projectile.setSize(2);
_shots.add(new ShotData(projectile, target));
ProjectileManager pm = getSlime().getBoss().getEventManager().getClans().getProjectile();
ProjectileManager pm = getSlime().getEvent().getEventManager().getClans().getProjectile();
pm.AddThrow(projectile, getSlime().getEntity(), this, -1, true, true, true, null, 0, 0, UtilParticle.ParticleType.SLIME, UpdateType.FASTEST, 1F);
Bukkit.broadcastMessage("Shot Slime at target " + target);

View File

@ -12,7 +12,7 @@ import mineplex.core.common.util.UtilAlg;
import mineplex.core.common.util.UtilParticle;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilServer;
import mineplex.game.clans.clans.worldevent.event.boss.slime.SlimePart;
import mineplex.game.clans.clans.worldevent.event.boss.slime.creature.SlimeCreature;
public class SlamAbility extends SlimeAbility
{
@ -27,12 +27,12 @@ public class SlamAbility extends SlimeAbility
private final int _jumpTick;
private final int _diveTick;
public SlamAbility(SlimePart slime)
public SlamAbility(SlimeCreature slime)
{
this(slime, 40, 60, 80);
}
public SlamAbility(SlimePart slime, int lockTick, int jumpTick, int diveTick)
public SlamAbility(SlimeCreature slime, int lockTick, int jumpTick, int diveTick)
{
super(slime);
_hasTarget = false;

View File

@ -1,15 +1,15 @@
package mineplex.game.clans.clans.worldevent.event.boss.slime.ability;
import mineplex.game.clans.clans.worldevent.event.boss.slime.SlimePart;
import mineplex.game.clans.clans.worldevent.event.boss.slime.creature.SlimeCreature;
public abstract class SlimeAbility
{
private SlimePart _slime;
private SlimeCreature _slime;
private boolean _idle;
private int _ticks;
private int _idleTicks;
public SlimeAbility(SlimePart slime)
public SlimeAbility(SlimeCreature slime)
{
_slime = slime;
}
@ -42,7 +42,7 @@ public abstract class SlimeAbility
return _idle;
}
public SlimePart getSlime()
public SlimeCreature getSlime()
{
return _slime;
}

View File

@ -1,59 +1,53 @@
package mineplex.game.clans.clans.worldevent.event.boss.slime;
package mineplex.game.clans.clans.worldevent.event.boss.slime.creature;
import org.bukkit.Location;
import org.bukkit.entity.MagmaCube;
import org.bukkit.entity.Slime;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.SlimeSplitEvent;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import mineplex.game.clans.clans.worldevent.creature.EventCreature;
import mineplex.game.clans.clans.worldevent.event.boss.slime.SlimeBoss;
import mineplex.game.clans.clans.worldevent.event.boss.slime.ability.AbsorbAbility;
import mineplex.game.clans.clans.worldevent.event.boss.slime.ability.LeapAbility;
import mineplex.game.clans.clans.worldevent.event.boss.slime.ability.RocketAbility;
import mineplex.game.clans.clans.worldevent.event.boss.slime.ability.SlamAbility;
import mineplex.game.clans.clans.worldevent.event.boss.slime.ability.SlimeAbility;
public class SlimePart
public class SlimeCreature extends EventCreature<Slime>
{
private SlimeBoss _boss;
private Slime _slime;
private SlimeAbility _currentAbility;
private Location _spawnLocation;
private boolean _enraged;
// Storing size here incase one of the slime states decide to change the slime size
private int _size;
private double _maxHealth;
private int _ticksLived;
private int _enrageTicks;
public SlimePart(SlimeBoss boss, Location location, int size, double maxHealth, int enrageTicks)
public SlimeCreature(SlimeBoss boss, Location location, int size, double maxHealth, int enrageTicks)
{
super(boss, location, "Slime King", true, maxHealth, Slime.class);
_boss = boss;
_spawnLocation = location;
_enraged = false;
_size = size;
_maxHealth = maxHealth;
_ticksLived = 0;
_enrageTicks = enrageTicks;
spawn(location);
}
private void spawn(Location location)
@Override
protected void spawnCustom()
{
double health = _maxHealth;
// Remove old slime
if (_slime != null)
{
health = _slime.getHealth();
_slime.remove();
}
_slime = location.getWorld().spawn(location, _enraged ? MagmaCube.class : Slime.class);
_slime.setMaxHealth(_maxHealth);
_slime.setHealth(health);
_slime.setSize(_size);
getEntity().setSize(_size);
}
public void tick()
@EventHandler
public void abilityTick(UpdateEvent event)
{
if (event.getType() != UpdateType.TICK)
return;
_ticksLived++;
if (_currentAbility == null || (_currentAbility.isIdle() && _currentAbility.getIdleTicks() > 80))
@ -86,20 +80,23 @@ public class SlimePart
_currentAbility.tick();
}
@EventHandler
public void onSplit(SlimeSplitEvent event)
{
if (event.getEntity().equals(getEntity()))
event.setCancelled(true);
}
public void setEnraged(boolean enraged)
{
if (enraged != _enraged)
{
_enraged = enraged;
spawn(_slime.getLocation());
setEntityClass(_enraged ? MagmaCube.class : Slime.class);
spawnEntity();
}
}
public SlimeBoss getBoss()
{
return _boss;
}
public boolean isEnraged()
{
return _enraged;
@ -110,13 +107,8 @@ public class SlimePart
return _size;
}
public Location getSpawnLocation()
@Override
public void dieCustom()
{
return _spawnLocation;
}
public Slime getEntity()
{
return _slime;
}
}