Undead Camp

This commit is contained in:
Shaun Bennett 2015-06-26 01:05:36 -05:00
parent 7f530f6593
commit 1865e41144
7 changed files with 420 additions and 85 deletions

View File

@ -1,66 +0,0 @@
package mineplex.game.clans.clans.worldevent;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import org.bukkit.Location;
import net.minecraft.server.v1_7_R4.World;
import mineplex.game.clans.clans.worldevent.event.WorldEvent;
import mineplex.game.clans.clans.worldevent.event.boss.slime.SlimeBoss;
import mineplex.game.clans.clans.worldevent.event.kinghill.KingHill;
public class ConcreteWorldEventFactory implements WorldEventFactory
{
private WorldEventManager _eventManager;
private List<Class<? extends WorldEvent>> _eventClasses;
private Random _random;
public ConcreteWorldEventFactory(WorldEventManager eventManager)
{
_eventManager = eventManager;
_random = new Random();
_eventClasses = new ArrayList<Class<? extends WorldEvent>>();
_eventClasses.add(SlimeBoss.class);
_eventClasses.add(KingHill.class);
}
@Override
public WorldEvent fromName(Location location, String name)
{
if (name.equalsIgnoreCase("slime"))
{
return new SlimeBoss(_eventManager, location);
} else if (name.equalsIgnoreCase("kinghill"))
{
return new KingHill(_eventManager, location);
}
else
{
return null;
}
}
@Override
public WorldEvent random(Location location)
{
WorldEvent worldEvent = null;
Class<? extends WorldEvent> clazz = _eventClasses.get(_random.nextInt(_eventClasses.size()));
try
{
worldEvent = clazz.getConstructor(WorldEventManager.class, Location.class).newInstance(_eventManager, location);
}
catch (Exception e)
{
e.printStackTrace();
}
return worldEvent;
}
}

View File

@ -1,12 +0,0 @@
package mineplex.game.clans.clans.worldevent;
import org.bukkit.Location;
import mineplex.game.clans.clans.worldevent.event.WorldEvent;
public interface WorldEventFactory
{
public WorldEvent fromName(Location location, String name);
public WorldEvent random(Location location);
}

View File

@ -36,7 +36,6 @@ import mineplex.minecraft.game.core.damage.DamageManager;
public class WorldEventManager extends MiniPlugin implements ScoreboardElement public class WorldEventManager extends MiniPlugin implements ScoreboardElement
{ {
private final WorldEventFactory _factory;
private final List<WorldEvent> _events; private final List<WorldEvent> _events;
private Random _random; private Random _random;
@ -55,7 +54,6 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement
_terrainFinder = new EventTerrainFinder(this, clansManager); _terrainFinder = new EventTerrainFinder(this, clansManager);
_clansManager = clansManager; _clansManager = clansManager;
_damageManager = damageManager; _damageManager = damageManager;
_factory = new ConcreteWorldEventFactory(this);
_events = new LinkedList<WorldEvent>(); _events = new LinkedList<WorldEvent>();
_lastEventEnd = System.currentTimeMillis(); _lastEventEnd = System.currentTimeMillis();
updateNextEventTime(); updateNextEventTime();
@ -124,8 +122,9 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement
Location location = _terrainFinder.findArea(Bukkit.getWorlds().get(0), 30, 30); Location location = _terrainFinder.findArea(Bukkit.getWorlds().get(0), 30, 30);
if (location != null) if (location != null)
{ {
WorldEvent event = _factory.random(location); WorldEventType[] types = WorldEventType.values();
initializeEvent(event); WorldEvent worldEvent = types[_random.nextInt(types.length)].createInstance(this, location);
initializeEvent(worldEvent);
} }
else else
{ {
@ -145,9 +144,15 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement
public WorldEvent startEventFromName(Location location, String name) public WorldEvent startEventFromName(Location location, String name)
{ {
WorldEvent event = _factory.fromName(location, name); WorldEventType eventType = WorldEventType.valueOf(name);
if (event != null) initializeEvent(event); if (eventType != null)
return event; {
WorldEvent event = eventType.createInstance(this, location);
initializeEvent(event);
return event;
}
return null;
} }
public void clearEvents() public void clearEvents()
@ -174,6 +179,11 @@ public class WorldEventManager extends MiniPlugin implements ScoreboardElement
return _damageManager; return _damageManager;
} }
public EventTerrainFinder getTerrainFinder()
{
return _terrainFinder;
}
@Override @Override
public void addCommands() public void addCommands()
{ {

View File

@ -0,0 +1,40 @@
package mineplex.game.clans.clans.worldevent;
import org.bukkit.Location;
import mineplex.game.clans.clans.worldevent.event.WorldEvent;
import mineplex.game.clans.clans.worldevent.event.boss.slime.SlimeBoss;
import mineplex.game.clans.clans.worldevent.event.kinghill.KingHill;
import mineplex.game.clans.clans.worldevent.event.undead.UndeadCamp;
public enum WorldEventType
{
SLIME_KING("Slime King", SlimeBoss.class),
KING_OF_THE_HILL("King of The Hill", KingHill.class),
UNDEAD_CAMP("Undead Camp", UndeadCamp.class);
private String _name;
private Class<? extends WorldEvent> _clazz;
WorldEventType(String name, Class<? extends WorldEvent> clazz)
{
_name = name;
_clazz = clazz;
}
public WorldEvent createInstance(WorldEventManager eventManager, Location centerLocation)
{
WorldEvent worldEvent = null;
try
{
worldEvent = _clazz.getConstructor(WorldEventManager.class, Location.class).newInstance(eventManager, centerLocation);
}
catch (Exception e)
{
e.printStackTrace();
}
return worldEvent;
}
}

View File

@ -213,6 +213,11 @@ public abstract class WorldEvent implements Listener
task.start(); task.start();
} }
protected HashMap<Block, BlockData> getBlocks()
{
return _blocks;
}
public void setBlock(Block block, int id, byte data) public void setBlock(Block block, int id, byte data)
{ {
if (!_blocks.containsKey(block)) if (!_blocks.containsKey(block))

View File

@ -0,0 +1,31 @@
package mineplex.game.clans.clans.worldevent.event.undead;
import org.bukkit.Material;
import org.bukkit.material.MaterialData;
public enum CampType
{
OAK(new MaterialData(Material.LOG, (byte) 0), new MaterialData(Material.WOOD, (byte) 0)),
SPRUCE(new MaterialData(Material.LOG, (byte) 1), new MaterialData(Material.WOOD, (byte) 1)),
BIRCH(new MaterialData(Material.LOG, (byte) 2), new MaterialData(Material.WOOD, (byte) 2)),
JUNGLE(new MaterialData(Material.LOG, (byte) 3), new MaterialData(Material.WOOD, (byte) 3));
private MaterialData _log;
private MaterialData _wood;
CampType(MaterialData log, MaterialData wood)
{
_log = log;
_wood = wood;
}
public MaterialData getLog()
{
return _log;
}
public MaterialData getWood()
{
return _wood;
}
}

View File

@ -0,0 +1,327 @@
package mineplex.game.clans.clans.worldevent.event.undead;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilWorld;
import mineplex.game.clans.clans.worldevent.WorldEventManager;
import mineplex.game.clans.clans.worldevent.event.EventState;
import mineplex.game.clans.clans.worldevent.event.WorldEvent;
public class UndeadCamp extends WorldEvent
{
private int _mod = 4;
private int _areaSize = 18;
private int _hutCur = 0;
private int _poleCur = 0;
private int _towerCur = 0;
private int _hutMax = 0;
private int _poleMax = 0;
private int _towerMax = 0;
private int _minZombie = 0;
private CampType _campType;
public UndeadCamp(WorldEventManager eventManager, Location centerLocation)
{
super(eventManager, "Undead Camp", centerLocation);
_areaSize = (int) (8 * _mod);
_hutMax = (int) (_mod * _mod * (UtilMath.r(4) + 1));
_towerMax = (int) (_mod * _mod * (UtilMath.r(4) + 3));
_poleMax = (int) (_mod * _mod * (UtilMath.r(11) + 10));
_minZombie = (int) (_mod * (UtilMath.r(9) + 8));
_campType = CampType.JUNGLE;
}
@Override
protected void customStart()
{
}
@Override
protected void customTick()
{
System.out.println("tick");
if (getState() == EventState.PREPARE)
{
System.out.println("prep");
if (_hutCur < _hutMax) createHut();
// else if (getCreatures().size() < _minZombie) createZombie();
else if (_towerCur < _towerMax) createTower();
else if (_poleCur < _poleMax) createLamp();
else
{
System.out.println("Constructed " + getName() + " at " + UtilWorld.locToStrClean(getCenterLocation()) + ".");
setState(EventState.LIVE);
}
}
}
private void createHut()
{
int hutX = UtilMath.r(4) + 2;
int hutZ = UtilMath.r(4) + 2;
int hutY = UtilMath.r(2) + 3;
int buffer = Math.max(hutX, hutZ)/2 + 1;
Location loc = getEventManager().getTerrainFinder().locateSpace(getCenterLocation(), _areaSize-buffer, hutX, hutY+2, hutZ, true, false, getBlocks().keySet());
if (loc == null)
return;
boolean xWall = (Math.random() > 0.5);
boolean zWall = (Math.random() > 0.5);
//Base
for (int x = -hutX; x <= hutX; x++)
for (int z = -hutZ; z <=hutZ ; z++)
{
Block block = loc.getBlock().getRelative(x, -1, z);
//Space
for (int y=0 ; y<=hutY ; y++)
setBlock(loc.getBlock().getRelative(x, y, z), 0, (byte) 0);
//Walls
if (!xWall && x == -hutX || xWall && x == hutX || !zWall && z == -hutZ || zWall && z == hutZ)
for (int y = 0; y <=hutY ; y++)
setBlock(loc.getBlock().getRelative(x, y, z), _campType.getWood().getItemTypeId(), _campType.getWood().getData());
//Corners
if (Math.abs(x) == hutX && Math.abs(z) == hutZ)
{
setBlock(block, _campType.getLog().getItemTypeId(), _campType.getLog().getData());
for (int y=0 ; y<=hutY ; y++)
setBlock(loc.getBlock().getRelative(x, y, z), _campType.getLog().getItemTypeId(), _campType.getLog().getData());
//Support Stands
boolean support = true;
Block below = block;
while (support)
{
below = below.getRelative(BlockFace.DOWN);
if (!UtilBlock.fullSolid(below) || below.isLiquid())
setBlock(below, _campType.getLog().getItemTypeId(), _campType.getLog().getData());
else
support = false;
}
}
//Floor & Roof
else
{
setBlock(block, _campType.getWood().getItemTypeId(), _campType.getWood().getData());
setBlock(loc.getBlock().getRelative(x, hutY-1, z), 126, (byte)8);
}
//Insides
if (Math.abs(x) != hutX && Math.abs(z) != hutZ)
{
if (Math.random() > 0.90)
addChest(block.getRelative(BlockFace.UP));
else if (Math.random() > 0.95)
addFurnace(block.getRelative(BlockFace.UP));
// else if (Math.random() > 0.95)
// CreatureRegister(new UndeadWarrior(this, block.getRelative(BlockFace.UP).getLocation().add(0.5, 0.5, 0.5)));
}
}
_hutCur++;
}
private void addChest(Block chest)
{
Block side;
int adj = 0;
side = chest.getRelative(BlockFace.NORTH);
if (side.getType() == Material.CHEST)
{
adj++;
if (side.getRelative(BlockFace.NORTH).getType() == Material.CHEST) return;
if (side.getRelative(BlockFace.SOUTH).getType() == Material.CHEST) return;
if (side.getRelative(BlockFace.EAST).getType() == Material.CHEST) return;
if (side.getRelative(BlockFace.WEST).getType() == Material.CHEST) return;
}
side = chest.getRelative(BlockFace.SOUTH);
if (side.getType() == Material.CHEST)
{
adj++;
if (side.getRelative(BlockFace.NORTH).getType() == Material.CHEST) return;
if (side.getRelative(BlockFace.SOUTH).getType() == Material.CHEST) return;
if (side.getRelative(BlockFace.EAST).getType() == Material.CHEST) return;
if (side.getRelative(BlockFace.WEST).getType() == Material.CHEST) return;
}
side = chest.getRelative(BlockFace.EAST);
if (side.getType() == Material.CHEST)
{
adj++;
if (side.getRelative(BlockFace.NORTH).getType() == Material.CHEST) return;
if (side.getRelative(BlockFace.SOUTH).getType() == Material.CHEST) return;
if (side.getRelative(BlockFace.EAST).getType() == Material.CHEST) return;
if (side.getRelative(BlockFace.WEST).getType() == Material.CHEST) return;
}
side = chest.getRelative(BlockFace.WEST);
if (side.getType() == Material.CHEST)
{
adj++;
if (side.getRelative(BlockFace.NORTH).getType() == Material.CHEST) return;
if (side.getRelative(BlockFace.SOUTH).getType() == Material.CHEST) return;
if (side.getRelative(BlockFace.EAST).getType() == Material.CHEST) return;
if (side.getRelative(BlockFace.WEST).getType() == Material.CHEST) return;
}
if (adj > 1)
return;
setBlock(chest, 130, (byte)(UtilMath.r(4) + 2));
// _chests.add(chest);
}
private void addFurnace(Block chest)
{
setBlock(chest, 61, (byte) (UtilMath.r(4) + 2));
// _chests.add(chest);
}
private void createZombie()
{
Location loc = getEventManager().getTerrainFinder().locateSpace(getCenterLocation(), _areaSize, 0, 3, 0, false, true, getBlocks().keySet());
if (loc == null)
return;
// CreatureRegister(new UndeadWarrior(this, loc.add(0.5, 0.5, 0.5)));
_poleCur++;
// ResetIdleTicks();
}
private void createTower()
{
int towerX = UtilMath.r(3) + 1;
int towerZ = UtilMath.r(3) + 1;
int towerY = UtilMath.r(4) + 3;
int buffer = Math.max(towerX, towerZ)/2 + 1;
Location loc = getEventManager().getTerrainFinder().locateSpace(getCenterLocation(), _areaSize - buffer, towerX, towerY + 2, towerZ, false, true, getBlocks().keySet());
if (loc == null)
return;
int ladder = UtilMath.r(4);
//Base
for (int x=-towerX ; x<=towerX ; x++)
for (int z=-towerZ ; z<=towerZ ; z++)
{
Block block = loc.getBlock().getRelative(x, towerY, z);
//Space
for (int y=0 ; y<=towerY ; y++)
setBlock(loc.getBlock().getRelative(x, y, z), 0, (byte) 0);
//Corner
if (Math.abs(x) == towerX && Math.abs(z) == towerZ)
{
setBlock(block, _campType.getWood().getItemTypeId(), _campType.getWood().getData());
setBlock(block.getRelative(BlockFace.UP), 85, (byte) 0);
//Support Stands
boolean support = true;
Block below = block;
while (support)
{
below = below.getRelative(BlockFace.DOWN);
if (!UtilBlock.fullSolid(below) && !below.isLiquid())
setBlock(below, 85, (byte) 0);
else if (below.isLiquid())
setBlock(below, _campType.getLog().getItemTypeId(), _campType.getLog().getData());
else
support = false;
}
//Ladder
if (ladder == 0 && x == -towerX && z == -towerZ ||
ladder == 1 && x == -towerX && z == towerZ ||
ladder == 2 && x == towerX && z == -towerZ ||
ladder == 3 && x == towerX && z == towerZ)
{
boolean laddering = true;
below = block;
while (laddering)
{
below = below.getRelative(BlockFace.DOWN);
if (!UtilBlock.fullSolid(below))
{
setBlock(below, _campType.getWood().getItemTypeId(), _campType.getWood().getData());
if (ladder == 0) setBlock(below.getRelative(-1, 0, 0), 65, (byte) 4);
else if (ladder == 1) setBlock(below.getRelative(-1, 0, 0), 65, (byte) 4);
else if (ladder == 2) setBlock(below.getRelative(1, 0, 0), 65, (byte) 5);
else if (ladder == 3) setBlock(below.getRelative(1, 0, 0), 65, (byte) 5);
}
else
laddering = false;
}
}
}
//Platform
else
setBlock(block, 126, (byte) 8);
//Features
if (Math.random() > 0.95)
addChest(block.getRelative(BlockFace.UP));
// else if (Math.random() > 0.95)
// CreatureRegister(new UndeadArcher(this, block.getRelative(BlockFace.UP).getLocation().add(0.5, 0.5, 0.5)));
}
_towerCur++;
}
private void createLamp()
{
Location loc = getEventManager().getTerrainFinder().locateSpace(getCenterLocation(), _areaSize, 0, 4, 0, false, true, getBlocks().keySet());
if (loc == null)
return;
setBlock(loc.getBlock(), 85, (byte) 0);
setBlock(loc.getBlock().getRelative(BlockFace.UP), 85, (byte) 0);
setBlock(loc.getBlock().getRelative(BlockFace.UP).getRelative(BlockFace.UP), 50, (byte)0);
_poleCur++;
}
}