package com.sk89q.mapbook; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.craftbukkit.block.CraftChest; import org.bukkit.craftbukkit.block.CraftDispenser; import org.bukkit.craftbukkit.block.CraftFurnace; import org.bukkit.craftbukkit.entity.CraftPlayer; import org.bukkit.craftbukkit.maps.CraftShape; import org.bukkit.entity.Player; import org.bukkit.event.Event; import org.bukkit.event.Event.Priority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockListener; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.map.MapListener; import org.bukkit.event.player.PlayerAnimationEvent; import org.bukkit.event.player.PlayerEggThrowEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInventoryEvent; import org.bukkit.event.player.PlayerListener; import org.bukkit.event.player.PlayerLoginEvent; import org.bukkit.event.player.PlayerPreLoginEvent; import org.bukkit.event.vehicle.VehicleListener; import org.bukkit.event.vehicle.VehicleMoveEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.maps.ContextualMapRenderer; import org.bukkit.maps.MapCanvas; import org.bukkit.maps.MapCursorCollection; import org.bukkit.maps.MapPrintOrder; import org.bukkit.maps.MapRenderer; import org.bukkit.maps.MapType; import org.bukkit.maps.MapView; import org.bukkit.maps.Shape; import com.sk89q.mapbook.SubwayBase.ListenerObject; import com.sk89q.worldedit.blocks.ItemType; public class SubwayBase implements ContextualMapRenderer { private MapBookPlugin plugin; public SubwayBase(MapBookPlugin s) { plugin = s; } HashMap<Player, ListenerObject> players = new HashMap<Player, ListenerObject>(); public class ListenerObject { protected CraftFurnace lastFurnaceClicked; protected CraftDispenser lastDispencerClicked; protected CraftChest lastChestClicked; } public void render(MapView map, MapCanvas canvas, Player player) { map.setRate(15); map.setPrintOrder(MapPrintOrder.Sequential); for (int i = 0; i < 128; i++) { for (int j = 0; j < 128; j++) { canvas.setPixel(i, j, (byte) 14); } } int x, z; map.setCenterX(x = player.getLocation().getBlockX()); map.setCenterZ(z = player.getLocation().getBlockZ()); int scale = 8; int halfScreen = (128 / 2); int halfWorldScreen = halfScreen * scale; for (Location loc : stations) { if (loc.getBlockX() > (x - halfWorldScreen) && loc.getBlockZ() > (z - halfWorldScreen) && loc.getBlockX() < (x + halfWorldScreen) && loc.getBlockZ() < (z + halfWorldScreen)) { map.getDrawer().setForeColor((byte) 44); map.getDrawer().setBackColor((byte) 39); map.getDrawer().fillCircle( (loc.getBlockX() - x) / scale + halfScreen, (loc.getBlockZ() - z) / scale + halfScreen, 5); } } ArrayList<Little> lits = new ArrayList<Little>(); for (int i = 0; i < tracks.size(); i++) { Location track = tracks.get(i).Loc; if (track.getBlockX() > (x - halfWorldScreen) && track.getBlockZ() > (z - halfWorldScreen) && track.getBlockX() < (x + halfWorldScreen) && track.getBlockZ() < (z + halfWorldScreen)) { lits.add(new Little((track.getBlockX() - x) / scale + halfScreen, (track.getBlockZ() - z) / scale + halfScreen, tracks.get(i).HasCart)); } } map.getDrawer().setForeColor((byte) 48); map.getDrawer().setBackColor((byte) 29); for (int i = 0; i < lits.size() - 1; i++) { Little t = lits.get(i); Little t2 = lits.get(i + 1); map.getDrawer().drawLine(t.X, t.Z, t2.X, t2.Z, 2); map.getDrawer().setForeColor((byte) 47); map.getDrawer().setBackColor((byte) 35); if (t.HasCart) { map.getDrawer().fillCircle((t.X) / scale + halfScreen, (t.Z) / scale + halfScreen, 9); } } } public class Little { int X; int Z; boolean HasCart; public Little(int x, int z, boolean cn) { X = x; Z = z; HasCart = cn; } } int tick = 0; public boolean ReadyToSetRailwayStation; ArrayList<Location> stations = new ArrayList<Location>(); ArrayList<TrackPiece> tracks = new ArrayList<TrackPiece>(); public class TrackPiece { Location Loc; boolean HasCart; public TrackPiece(Location l, boolean c) { Loc = l; HasCart = c; } } public void initialize(MapView map) { Listener pe = new PlayerListener() { private Player player; public void onPlayerInteract(PlayerInteractEvent event) { // if (!ReadyToSetRailwayStation) // return; player = event.getPlayer(); ReadyToSetRailwayStation = true; Block block = event.getClickedBlock(); Material type = block.getType(); if (type == Material.OBSIDIAN) { stations.add(block.getLocation()); player.sendMessage("Adding station " + stations.size()); } if (type == Material.RAILS) { searchForTracks(block.getLocation().getWorld(), block .getLocation().getBlockX(), block.getLocation() .getBlockY(), block.getLocation().getBlockZ()); player.sendMessage("Done. Found " + tracks.size()); } } private void searchForTracks(World world, int x, int y, int z) { int count = 0; count += searchForTracksRec(world, x - 1, y, z) ? 1 : 0; count += searchForTracksRec(world, x + 1, y, z) ? 1 : 0; if (count > 2) return; count += searchForTracksRec(world, x, y, z - 1) ? 1 : 0; if (count > 2) return; count += searchForTracksRec(world, x, y, z + 1) ? 1 : 0; if (count > 2) return; count += searchForTracksRec(world, x - 1, y - 1, z) ? 1 : 0; if (count > 2) return; count += searchForTracksRec(world, x + 1, y - 1, z) ? 1 : 0; if (count > 2) return; count += searchForTracksRec(world, x, y - 1, z - 1) ? 1 : 0; if (count > 2) return; count += searchForTracksRec(world, x, y - 1, z + 1) ? 1 : 0; if (count > 2) return; count += searchForTracksRec(world, x - 1, y + 1, z) ? 1 : 0; if (count > 2) return; count += searchForTracksRec(world, x + 1, y + 1, z) ? 1 : 0; if (count > 2) return; count += searchForTracksRec(world, x, y + 1, z - 1) ? 1 : 0; if (count > 2) return; count += searchForTracksRec(world, x, y + 1, z + 1) ? 1 : 0; } private boolean searchForTracksRec(World world, int x, int y, int z) { player.sendMessage("doing " + x + " " + y + " " + z); if (world.getBlockTypeIdAt(x, y, z) != Material.RAILS.getId()) return false; Block block; block = world.getBlockAt(x, y, z); for (TrackPiece tc : tracks) { Location t = tc.Loc; if (t.getBlockX() == x && t.getBlockY() == y && t.getBlockZ() == z) return false; } tracks.add(new TrackPiece(block.getLocation(), false)); searchForTracks(world, block.getLocation().getBlockX(), block .getLocation().getBlockY(), block.getLocation() .getBlockZ()); return true; } }; Listener pec = new VehicleListener() { public void onVehicleMove(VehicleMoveEvent event) { World world = event.getVehicle().getWorld(); Location loc = event.getVehicle().getLocation(); int tid = world.getBlockTypeIdAt(loc.getBlockX(), loc.getBlockY() , loc.getBlockZ()); if (tid == Material.RAILS.getId()) { for (TrackPiece tc : tracks) { Location t = tc.Loc; if (t.getBlockX() == loc.getBlockX() && t.getBlockY() == loc.getBlockY() && t.getBlockZ() == loc.getBlockZ()) { tc.HasCart = true; } } } } }; plugin.getServer() .getPluginManager() .registerEvent(Event.Type.PLAYER_INTERACT, pe, Priority.Normal, plugin); plugin.getServer() .getPluginManager() .registerEvent(Event.Type.VEHICLE_MOVE, pec, Priority.Normal, plugin); } }