- Fixed maps

- Spawners
This commit is contained in:
AlexTheCoder 2015-12-10 22:48:57 -05:00
parent 118bde5484
commit fe933913e8
4 changed files with 414 additions and 30 deletions

View File

@ -0,0 +1,106 @@
package mineplex.core.map;
import java.util.ArrayList;
import java.util.List;
import mineplex.core.common.util.UtilInv;
import mineplex.core.common.util.UtilPlayer;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.map.MapView;
import org.bukkit.map.MapView.Scale;
public class TeamMap
{
List<Player> _players;
final ItemStack _map;
public TeamMap(List<Player> display, Location loc, Scale scale)
{
_players = display;
MapView view = Bukkit.createMap(loc.getWorld());
view.setCenterX(loc.getBlockX());
view.setCenterZ(loc.getBlockZ());
view.setScale(scale);
_map = new ItemStack(Material.MAP);
_map.setDurability(view.getId());
}
public void update(Player... forceRemove)
{
if (forceRemove != null)
{
for (Player remove : forceRemove)
{
_players.remove(remove);
}
}
List<Player> confirmed = new ArrayList<Player>();
for (Player check : _players)
{
if (!UtilPlayer.isOnline(check.getName()))
continue;
if (UtilPlayer.isSpectator(check))
continue;
confirmed.add(check);
}
_players.clear();
for (Player add : confirmed)
_players.add(add);
}
public void giveMaps()
{
update(null);
for (Player player : _players)
{
UtilInv.insert(player, _map);
UtilInv.Update(player);
}
}
public void giveMap(Player player)
{
giveMap(player, true, "");
}
public void giveMap(Player player, boolean add, String displayName, String... lore)
{
if (!_players.contains(player))
{
if (add)
{
_players.add(player);
}
}
ItemStack map = _map.clone();
ItemMeta im = map.getItemMeta();
if (!displayName.equalsIgnoreCase(""))
im.setDisplayName(displayName);
List<String> lores = new ArrayList<String>();
for (String s : lore)
lores.add(s);
if (!lores.isEmpty())
im.setLore(lores);
map.setItemMeta(im);
UtilInv.insert(player, map);
UtilInv.Update(player);
}
}

View File

@ -1,13 +1,19 @@
package nautilus.game.arcade.game.games.minecraftleague;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentHashMap;
import mineplex.core.common.Rank;
import mineplex.core.common.util.C;
import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilAction;
import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilInv;
import mineplex.core.common.util.UtilPlayer;
import mineplex.core.common.util.UtilTextMiddle;
import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilTime.TimeUnit;
import mineplex.core.map.TeamMap;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
import nautilus.game.arcade.ArcadeManager;
@ -18,6 +24,7 @@ import nautilus.game.arcade.game.GameTeam;
import nautilus.game.arcade.game.GameTeam.PlayerState;
import nautilus.game.arcade.game.TeamGame;
import nautilus.game.arcade.game.games.minecraftleague.data.PlayerRespawnPoint;
import nautilus.game.arcade.game.games.minecraftleague.data.Spawner;
import nautilus.game.arcade.game.games.minecraftleague.data.TeamCrystal;
import nautilus.game.arcade.game.games.minecraftleague.kit.KitPlayer;
import nautilus.game.arcade.kit.Kit;
@ -30,27 +37,42 @@ import org.bukkit.Sound;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftPlayer;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.ItemFrame;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.entity.TNTPrimed;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockIgniteEvent.IgniteCause;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.CreatureSpawnEvent.SpawnReason;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryType;
import org.bukkit.event.inventory.PrepareItemCraftEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.map.MapView.Scale;
import org.bukkit.util.Vector;
import com.google.common.base.Objects;
public class MinecraftLeague extends TeamGame
{
private ConcurrentHashMap<GameTeam, TeamCrystal> _crystals = new ConcurrentHashMap<GameTeam, TeamCrystal>();
private ConcurrentHashMap<Player, PlayerRespawnPoint> _customRespawns = new ConcurrentHashMap<Player, PlayerRespawnPoint>();
private ConcurrentHashMap<GameTeam, TeamMap> _maps = new ConcurrentHashMap<GameTeam, TeamMap>();
private List<Spawner> _spawners = new ArrayList<Spawner>();
private long _liveTime = 0;
private boolean _overTime = false;
public MinecraftLeague(ArcadeManager manager)
{
@ -188,6 +210,11 @@ public class MinecraftLeague extends TeamGame
}
}
public TeamMap getMap(GameTeam team)
{
return _maps.get(team);
}
@Override
public void ParseData()
{
@ -196,6 +223,12 @@ public class MinecraftLeague extends TeamGame
_crystals.put(GetTeam(ChatColor.RED), new TeamCrystal(this, GetTeam(ChatColor.RED), redLoc));
_crystals.put(GetTeam(ChatColor.AQUA), new TeamCrystal(this, GetTeam(ChatColor.AQUA), blueLoc));
_maps.put(GetTeam(ChatColor.RED), new TeamMap(new ArrayList<Player>(), redLoc, Scale.CLOSE));
_maps.put(GetTeam(ChatColor.AQUA), new TeamMap(new ArrayList<Player>(), redLoc, Scale.CLOSE));
_spawners.add(new Spawner(this, WorldData.GetDataLocs("GREEN").get(0), EntityType.CREEPER));
_spawners.add(new Spawner(this, WorldData.GetDataLocs("BLACK").get(0), EntityType.SKELETON));
}
@Override
@ -226,6 +259,8 @@ public class MinecraftLeague extends TeamGame
Scoreboard.WriteBlank();
Scoreboard.Write(C.cYellowB + "Time Elapsed");
Scoreboard.Write(UtilTime.MakeStr(_liveTime));
if (_overTime)
Scoreboard.Write(C.cDRedB + "Overtime");
Scoreboard.WriteBlank();
Scoreboard.Write(C.cRedB + "Red Team");
@ -277,6 +312,22 @@ public class MinecraftLeague extends TeamGame
{
crystal.update();
}
for (TeamMap map : _maps.values())
{
map.update(null);
}
for (Spawner spawner : _spawners)
{
spawner.update();
}
if (UtilTime.elapsed(GetStateTime(), UtilTime.convert(15, TimeUnit.MINUTES, TimeUnit.MILLISECONDS)))
{
_overTime = true;
UtilTextMiddle.display(C.cDRed + "Overtime", C.cDRed + "Dying will now cause your crystal to lose 20 health!");
}
}
}
@ -352,9 +403,15 @@ public class MinecraftLeague extends TeamGame
Material type = player.getItemInHand().getType();
int level = player.getItemInHand().getEnchantmentLevel(Enchantment.DAMAGE_ALL);
double damage = DamageAmount.getDamageAmount(type).getDamage(level, DamageType.getDamageType(type));
if (!crystal.damage(damage, player))
player.playSound(crystal.getLocation(), Sound.ZOMBIE_WOODBREAK, 1, 0);
if (DamageAmount.getDamageAmount(type) != DamageAmount.NONE)
{
player.getItemInHand().setDurability((short) (player.getItemInHand().getDurability() + 1));
UtilInv.Update(player);
}
}
}
@ -421,39 +478,127 @@ public class MinecraftLeague extends TeamGame
((CraftPlayer)player).getHandle().k = false;
UtilAction.velocity(player, new Vector(0,1.2,0));
getMap(GetTeam(player)).update(player);
return;
}
if (_overTime)
_crystals.get(GetTeam(player)).damage(20, null);
}
@EventHandler
public void onTNT(BlockIgniteEvent event)
public void onDrop(PlayerDropItemEvent event)
{
if (event.getBlock().getType() == Material.TNT)
if (!IsLive())
return;
ItemStack item = event.getItemDrop().getItemStack();
if (item.getType() != Material.MAP)
return;
event.setCancelled(true);
UtilPlayer.message(event.getPlayer(), F.main("Game", "You cannot drop your team map!"));
}
@EventHandler
public void preventMapMoveInventories(InventoryClickEvent event)
{
if (!IsLive())
return;
if (event.getWhoClicked() instanceof Player)
{
if (event.getCause() != IgniteCause.FLINT_AND_STEEL)
Player p = (Player)event.getWhoClicked();
if (p.getOpenInventory().getTopInventory().getType() == InventoryType.PLAYER)
return;
if (event.getPlayer() == null)
if (p.getOpenInventory().getTopInventory().getType() == InventoryType.CREATIVE)
return;
final Location loc = event.getBlock().getLocation();
final Player player = event.getPlayer();
Bukkit.getScheduler().runTaskLater(Manager.getPlugin(), new Runnable()
{
public void run()
{
for (Entity e : UtilEnt.getAllInRadius(loc, 2).keySet())
{
if (e instanceof TNTPrimed)
{
e.setCustomName(player.getName());
e.setCustomNameVisible(false);
}
}
}
}, 5);
}
Inventory inv = event.getClickedInventory();
if (inv == null)
return;
for (ItemStack item : new ItemStack[]
{
event.getCurrentItem(), event.getCursor()
})
{
if (item == null || item.getType() != Material.MAP)
continue;
if (inv.getHolder() instanceof Player ? !event.isShiftClick() : Objects.equal(event.getCurrentItem(), item))
continue;
event.setCancelled(true);
UtilPlayer.message(event.getWhoClicked(), F.main("Game", "You cannot store team maps inside containers!"));
return;
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onDie(PlayerDeathEvent event)
{
if (!IsLive())
return;
List<ItemStack> newDrops = new ArrayList<ItemStack>();
for (ItemStack item : event.getDrops())
{
if (item.getType() == Material.MAP)
continue;
newDrops.add(item);
}
event.getDrops().clear();
for (ItemStack item : newDrops)
event.getDrops().add(item);
}
@EventHandler
public void preventMapInItemFrame(PlayerInteractEntityEvent event)
{
if (!IsLive())
return;
if (!(event.getRightClicked() instanceof ItemFrame))
return;
ItemStack item = event.getPlayer().getItemInHand();
if (item == null || item.getType() != Material.MAP)
return;
event.setCancelled(true);
}
@EventHandler
public void craftMap(PrepareItemCraftEvent event)
{
if (!IsLive())
return;
if (event.getInventory().getResult().getType() == Material.EMPTY_MAP || event.getInventory().getResult().getType() == Material.MAP)
event.getInventory().setResult(new ItemStack(Material.AIR));
}
@EventHandler
public void onSpawnerActivate(CreatureSpawnEvent event)
{
if (!IsLive())
return;
if (event.getSpawnReason() != SpawnReason.SPAWNER)
return;
event.setCancelled(true);
}
@EventHandler

View File

@ -0,0 +1,123 @@
package nautilus.game.arcade.game.games.minecraftleague.data;
import java.util.ArrayList;
import java.util.List;
import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilTime;
import mineplex.core.common.util.UtilTime.TimeUnit;
import nautilus.game.arcade.game.games.minecraftleague.MinecraftLeague;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.EntityType;
public class Spawner
{
protected MinecraftLeague Host;
private Location _spawnerBlock;
private EntityType _toSpawn;
private long _lastSpawned;
private boolean _canSpawn = true;
@SuppressWarnings("deprecation")
public Spawner(MinecraftLeague host, Location spawnerBlock, EntityType toSpawn)
{
Host = host;
_spawnerBlock = spawnerBlock;
_toSpawn = toSpawn;
_lastSpawned = System.currentTimeMillis();
spawnerBlock.getBlock().setTypeIdAndData(Material.MOB_SPAWNER.getId(), (byte)toSpawn.getTypeId(), false);
}
private List<Location> getLocations(Location base, int changeX, int changeY, int changeZ)
{
List<Location> locs = new ArrayList<Location>();
for(int x = (base.getBlockX() - changeX); x <= (base.getBlockX() + changeX); x++)
{
for(int y = (base.getBlockY() - changeY); y <= (base.getBlockY() + changeY); y++)
{
for(int z = (base.getBlockZ() - changeZ); z <= (base.getBlockZ() + changeZ); z++)
{
Location loc = new Location(base.getWorld(), x, y, z);
locs.add(loc);
}
}
}
return locs;
}
private boolean canSpawnMob(Location l)
{
Block b = l.getBlock();
if ((b.getType() != Material.AIR) && !b.getType().toString().contains("WATER") && !UtilBlock.airFoliage(b))
return false;
Block b2 = b.getRelative(BlockFace.UP);
if ((b2.getType() != Material.AIR) && !b2.getType().toString().contains("WATER") && !UtilBlock.airFoliage(b2))
return false;
return true;
}
private void spawn()
{
if (!_canSpawn)
return;
List<Location> possible = getLocations(_spawnerBlock, 2, 1, 2);
boolean spawned = false;
int i = UtilMath.r(possible.size());
while (!spawned)
{
Location l = possible.get(i);
if (canSpawnMob(l))
{
Host.getArcadeManager().GetCreature().SpawnEntity(l, _toSpawn);
spawned = true;
_lastSpawned = System.currentTimeMillis();
continue;
}
int newi = 0;
if (i == (possible.size() - 1))
i = newi;
else
i++;
}
for (Location l : possible)
{
if (!spawned)
{
if (canSpawnMob(l))
{
Host.getArcadeManager().GetCreature().SpawnEntity(l, _toSpawn);
spawned = true;
_lastSpawned = System.currentTimeMillis();
}
}
}
}
public void update()
{
if (_spawnerBlock.getBlock().getType() != Material.MOB_SPAWNER)
_canSpawn = false;
else
_canSpawn = true;
if (_canSpawn)
{
if (!UtilTime.elapsed(_lastSpawned, UtilTime.convert(20, TimeUnit.SECONDS, TimeUnit.MILLISECONDS)))
_canSpawn = false;
else
_canSpawn = true;
}
spawn();
}
}

View File

@ -1,13 +1,18 @@
package nautilus.game.arcade.game.games.minecraftleague.kit;
import mineplex.core.common.util.C;
import mineplex.core.map.TeamMap;
import nautilus.game.arcade.ArcadeManager;
import nautilus.game.arcade.game.games.minecraftleague.MinecraftLeague;
import nautilus.game.arcade.kit.Kit;
import nautilus.game.arcade.kit.KitAvailability;
import nautilus.game.arcade.kit.Perk;
import org.bukkit.Material;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
public class KitPlayer extends Kit
{
@ -25,13 +30,18 @@ public class KitPlayer extends Kit
new Perk[]
{
}, EntityType.ZOMBIE, null);
}, EntityType.PLAYER, new ItemStack(Material.DIAMOND_SWORD));
}
@Override
public void GiveItems(Player player)
{
TeamMap tmap = ((MinecraftLeague)Manager.GetGame()).getMap(Manager.GetGame().GetTeam(player));
if (tmap == null)
return;
tmap.giveMap(player, true, C.cGold + "Team Map", C.cGray + "This map contains", C.cGray + "the locations of", C.cGray + "your teammates.");
}
@Override