Given Brett Hundley's struggles as a starter, the Packers' quarterback position doesn't project the same depth it once did.
First in a nine-part Packers position-analysis series.
GREEN BAY – A year ago, the Green Bay Packers looked to have one of the best quarterback situations in the NFL.
Here's a look at where the Packers' quarterback position stands in early February.
Well, they still have a two-time MVP quarterback. The best news for the Packers was that Rodgers apparently suffered no long-term effects from his broken right collarbone. At age 34, Rodgers should return to top form. Another factor in the Packers' favor is the increased longevity of top-shelf quarterbacks. More and more, elite passers are playing through their 30s and even into their 40s. That longevity allows the Packers to push back their search for Rodgers' eventual replacement. Now if they can just find a backup.
Not all of the Packers' quarterback issues were out of their control: Their lack of depth was self-inflicted. Exposing promising prospect Taysom Hill to the waiver wire last summer was one of former general manager Ted Thompson's biggest mistakes. Hill, an undrafted rookie out of BYU, clearly outplayed Hundley through the preseason but was not retained on the 53-man roster and was claimed on waivers by New Orleans. Perhaps he would've done a better job than Hundley keeping the Packers above water until Rodgers returned. He at least could have given them another viable option.
Gutekunst needs to learn from his predecessor's mistake. Given the physical toll of the NFL — Rodgers was far from the only franchise quarterback whose season ended because of injury — backup quarterbacks carry real value, especially for championship contenders. The biggest need for the team's quarterback depth chart is true competition behind Rodgers. That could mean investing a draft pick, most likely on Day 3. The Packers should have a well-stocked compensatory allotment to use on the position late in the draft. A bigger need is veteran experience behind Rodgers, and the market will be flush. Among potential options who could be available in free agency are Ryan Fitzpatrick, Drew Stanton, Geno Smith and Matt Moore, each of whom has starting experience but now projects as a backup.


Joan Marcus Fine Art, art gallery, listed under "Art Galleries" category, is located at Scottsdale AZ, 85259 and can be reached by 4804517892 phone number. Joan Marcus Fine Art has currently 0 reviews.
Browse all Art Galleries in Scottsdale AZ. Discover census data for Scottsdale, AZ.


text:
package com.lastabyss.psciv.generator;

import com.gmail.filoghost.holographicdisplays.api.Hologram;
import com.gmail.filoghost.holographicdisplays.api.HologramsAPI;
import com.lastabyss.psciv.PSCiv;
import com.lastabyss.psciv.data.BaseBlockVector;
import com.lastabyss.psciv.dialogue.Dialogue;
import com.lastabyss.psciv.dungeon.DungeonMaster;
import com.lastabyss.psciv.dungeon.DungeonOptions;
import com.lastabyss.psciv.dungeon.Room;
import com.lastabyss.psciv.dungeon.RoomDoor;
import com.lastabyss.psciv.io.SchematicReader;
import com.lastabyss.psciv.util.BlockUtils;
import com.lastabyss.psciv.util.Globals;
import com.lastabyss.psciv.util.Util;
import com.lastabyss.psciv.world.WorldManager;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.MaxChangedBlocksException;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.bukkit.BukkitWorld;
import com.sk89q.worldedit.extent.clipboard.BlockArrayClipboard;
import com.sk89q.worldedit.function.operation.ForwardExtentCopy;
import com.sk89q.worldedit.function.operation.Operations;
import com.sk89q.worldedit.patterns.Pattern;
import com.sk89q.worldedit.patterns.SingleBlockPattern;
import com.sk89q.worldedit.regions.CuboidRegion;
import net.md_5.bungee.api.ChatColor;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Biome;
import org.bukkit.block.Block;
import org.bukkit.block.CreatureSpawner;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.craftbukkit.v1_8_R3.CraftWorld;
import org.bukkit.entity.EntityType;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.BlockIterator;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Random;

/**
 * @author Navid
 */
public class DungeonWorldGenerator extends ChunkGenerator {

    /**
     * This contains a list of doors. Each list inside this list represents a room
     * with doors that haven't been connected yet.
     */
    private final List<Room> unconnectedRooms = new LinkedList<>();
    private final DungeonMaster dm;
    private final ArrayList<Room> placedRooms = new ArrayList();
    private Deque<BaseBlockVector> schemBlocks = null;
    private World world;
    private BukkitWorld bukkitWorld;
    private final WorldEdit we = Globals.we.getWorldEdit();
    private BukkitTask progressTask;

    //Generated - These will change as the dungeon progresses
    public Vector hardBoundsMin, hardBoundsMax;
    public String progressGag = ChatColor.GRAY + "Creating Dungeon...";
    public String progressMsg; //This is what the players will see while waiting for the dungeon to generate
    public boolean freezeProgressTask = false;
    public Map<Room, List<Location>> spawnPoints = new HashMap<>();
    public Map<Room, List<Location>> mobSpawners = new HashMap<>();
    public Map<Room, List<Location>> chestLocations = new HashMap<>();
    public Map<Room, Integer> placedTypes = new HashMap<>();
    public Room startRoom, endRoom, bossRoom, preloaderRoom, minibossRoom, winnerRoom;
    public Hologram bossHologram, minibossHologram;
    public Location preloaderPoint;
    public Location winnerPoint;
    public Location transitionPoint;

    public DungeonWorldGenerator(DungeonMaster master) {
        WorldManager.worldGenerating = true;
        this.dm = master;
        this.dm.setGenerator(this);
        SchematicReader reader = master.getReader();

        final int[] counter = {0};
        BukkitTask[] self = new BukkitTask[1];
        self[0] = Util.syncTimer(() -> {
            if (world == null) return;
            else self[0].cancel();
            progressTask = Util.asyncTimer(() -> {
                if (freezeProgressTask) return;
                if (progressGag.isEmpty() && progressMsg.isEmpty()) return;
                if (counter[0] == 100) {
                    progressGag = Dialogue.getRandomDialog(Dialogue.DUNGEON_CONSTRUCTION);
                    counter[0] = 0;
                }
                dm.getPlayers().forEach(p -> Util.sendTitle(p, 0, 100, 0, progressGag, progressMsg));
                counter[0]++;
            }, 0L, 1L);
            freezeProgressTask = false;
            progressGag = ChatColor.DARK_RED + "Be prepared.";
            progressMsg = ChatColor.RED + "Generating world...";
            Util.sync(() -> Util.async(() -> {
                reader.loadRooms(master.getOptions().getDungeonFolder(), world, dm.getOptions());
                preloader:
                {
                    Room room = reader.getByType("preloader").get(0).clone();
                    room.setPlacedAtMin(new Vector(10000, 0, 10000));
                    room.setPlacedAtMax(calcPlacedAtMax(room, room.getPlacedAtMin()));
                    translateRandomY(room);
                    EditSession editSession = we.getEditSessionFactory().getEditSession(bukkitWorld, Integer.MAX_VALUE);
                    Util.async(() -> {
                        for (int x = room.getPlacedRegion().getMinimumPoint().getBlockX() >> 4; x < room.getPlacedRegion().getMaximumPoint().getBlockX() >> 4; x++) {
                            for (int z = room.getPlacedRegion().getMinimumPoint().getBlockZ() >> 4; z < room.getPlacedRegion().getMaximumPoint().getBlockZ() >> 4; z++) {
                                final int fX = x;
                                final int fZ = z;
                                Util.runUnsafe(() -> world.getChunkAt(fX, fZ)); //Load the chunks before placing blocks, should help with strange issues
                            }
                        }
                        Util.sync(() -> room.getPlacedRegion().iterator().forEachRemaining(v -> {
                            BaseBlock block = room.getClipboard().getBlock(v);
                            BlockUtils.setBlockFast(world, v, block.getId(), (byte) block.getData());
                            world.getBlockAt(v.getBlockX(), v.getBlockY(), v.getBlockZ()).setTypeIdAndData(block.getId(), (byte) block.getData(), false);
                            if (isSpawnPoint(block)) {
                                float yaw = signDirToYaw(block.getData());
                                preloaderPoint = new Location(world, v.getX(), v.getY(), v.getZ(), yaw, 0);
                                preloaderPoint.getBlock().setType(Material.AIR, false);
                                Hologram hologram = HologramsAPI.createHologram(PSCiv.instance, preloaderPoint.add(0.5, 3, 0.5));
                                hologram.appendItemLine(dm.getOptions().getDifficulty().getItemIcon());
                                hologram.appendTextLine(dm.getOptions().getDungeonName());
                                hologram.appendTextLine(ChatColor.BOLD + ">>" + ChatColor.GREEN + "Spawn Point" + ChatColor.WHITE + ChatColor.BOLD + "<<");
                                hologram.appendTextLine(ChatColor.BOLD.toString() + ChatColor.RED + "Dungeon Entrance");
                                hologram.appendTextLine(Util.getSimpleXYZ(preloaderPoint));
                                hologram.appendItemLine(dm.getOptions().getDifficulty().getItemIcon());
                            } else if (block.hasNbtData()) {
                                try {
                                    editSession.setBlock(v, block);
                                } catch (MaxChangedBlocksException e) {
                                    e.printStackTrace();
                                }
                            }
                        }));
                        this.preloaderRoom = room;
                    });
                }
                winner:
                {
                    Room room = reader.getByType("winner").get(0).clone();
                    room.setPlacedAtMin(new Vector(30000, 0, 30000));
                    room.setPlacedAtMax(calcPlacedAtMax(room, room.getPlacedAtMin()));
                    translateRandomY(room);
                    EditSession editSession = we.getEditSessionFactory().getEditSession(bukkitWorld, Integer.MAX_VALUE);
                    Util.async(() -> {
                        for (int x = room.getPlacedRegion().getMinimumPoint().getBlockX() >> 4; x < room.getPlacedRegion().getMaximumPoint().getBlockX() >> 4; x++) {
                            for (int z = room.getPlacedRegion().getMinimumPoint().getBlockZ() >> 4; z < room.getPlacedRegion().getMaximumPoint().getBlockZ() >> 4; z++) {
                                final int fX = x;
                                final int fZ = z;
                                Util.runUnsafe(() -> world.getChunkAt(fX, fZ)); //Load the chunks before placing blocks, should help with strange issues
                            }
                        }
                        Util.sync(() -> room.getPlacedRegion().iterator().forEachRemaining(v -> {
                            BaseBlock block = room.getClipboard().getBlock(v);
                            BlockUtils.setBlockFast(world, v, block.getId(), (byte) block.getData());
                            world.getBlockAt(v.getBlockX(), v.getBlockY(), v.getBlockZ()).setTypeIdAndData(block.getId(), (byte) block.getData(), false);
                            if (isSpawnPoint(block)) {
                                float yaw = signDirToYaw(block.getData());
                                winnerPoint = new Location(world, v.getX(), v.getY(), v.getZ(), yaw, 0);
                                winnerPoint.getBlock().setType(Material.AIR, false);
                                Hologram hologram = HologramsAPI.createHologram(PSCiv.instance, winnerPoint.add(0.5, 3, 0.5));
                                hologram.appendItemLine(dm.getOptions().getDifficulty().getItemIcon());
                                hologram.appendTextLine(dm.getOptions().getDungeonName());
                                hologram.appendTextLine(ChatColor.BOLD + ">>" + ChatColor.GREEN + "Spawn Point" + ChatColor.WHITE + ChatColor.BOLD + "<<");
                                hologram.appendTextLine(ChatColor.BOLD.toString() + ChatColor.RED + "Dungeon Exit");
                                hologram.appendTextLine(Util.getSimpleXYZ(winnerPoint));
                                hologram.appendItemLine(dm.getOptions().getDifficulty().getItemIcon());
                            } else if (block.hasNbtData()) {
                                try {
                                    editSession.setBlock(v, block);
                                } catch (MaxChangedBlocksException e) {
                                    e.printStackTrace();
                                }
                            }
                        }));
                        this.winnerRoom = room;
                    });
                }
                transition:
                //This room is where players are held until the next dungeon loads, it's not like a preloader, it's just an empty black box
                {
                    CuboidRegion region = new CuboidRegion(new Vector(20000, 0, 20000), new Vector(20016, 256, 20016));
                    Vector center = region.getCenter();
                    transitionPoint = new Location(world, center.getX(), center.getY(), center.getZ());
                }
                Util.sync(() -> master.onDungeonWorldCreation());
            }));
        }, 0, 1);
    }

    @Override
    protected void finalize() throws Throwable {
        abruptEnd();
        super.finalize();
    }

    public void abruptEnd() {
        try {
            placedRooms.clear();
            progressTask.cancel();
            freezeProgressTask = true;
            dm.onFinish(false);
        } finally {
            dm.cleanup();
            WorldManager.worldGenerating = false;
        }
    }

    @Override
    public short[][] generateExtBlockSections(World world, Random random, int cx, int cz, BiomeGrid biomes) {
        if (bukkitWorld == null) {
            this.world = world;
            bukkitWorld = new BukkitWorld(world);
        }
        short[][] result = new short[world.getMaxHeight() / 16][];

        if (cx == 20000 >> 4 && cz == 20000 >> 4) {
            for (int x = 0; x < 16; x++) {
                for (int z = 0; z < 16; z++) {
                    for (int y = 0; y < 256; y++) {
                        if (y == 255 || y == 0) {
                            setBlock(result, x, y, z, (short) Material.OBSIDIAN.getId());
                        } else if (x == 15 || x == 0 || z == 15 || z == 0) {
                            setBlock(result, x, y, z, (short) Material.OBSIDIAN.getId());
                        } else {
                            setBlock(result, x, y, z, (short) 0);
                        }
                    }
                }
            }
        } else generateFillBlock(result);
        return result;
    }

    public void generateDungeon(SchematicReader reader, int currentFloor) {
        freezeProgressTask = false;
        progressGag = ChatColor.DARK_GREEN + "Be prepared.";
        Globals.log.info(progressMsg = ChatColor.YELLOW + "Loading rooms...");
        unconnectedRooms.clear();
        placedRooms.clear();
        placedTypes.clear();
        mobSpawners.clear();
        spawnPoints.clear();

        //Reset if floor isn't 0, ensures clean slate, setBlockFast does the trick here
        ((CraftWorld) world).setEnvironment(dm.getOptions().getEnvironment());
        if (currentFloor > 0)
            for (int x = hardBoundsMin.getBlockX() >> 4; x < hardBoundsMax.getBlockX() >> 4; x++) {
                for (int z = hardBoundsMin.getBlockZ() >> 4; z < hardBoundsMax.getBlockZ() >> 4; z++) {
                    regenerateChunk(x, z);
                }
            }

        Globals.log.info(progressMsg = "Letting world generate...");
        //Set options
        DungeonOptions options = dm.getDungeonOptionsMap().get(currentFloor);
        //End set options
        reader.loadRooms(options.getDungeonFloorFolder(), world, dm.getOptions());
        Globals.log.info(progressMsg = ChatColor.YELLOW + "Building layout...");
        Util.asyncLater(() -> {
            boolean bossPlaced = false;
            boolean endPlaced = false;
            boolean minibossPlaced = false;
            start:
            {
                Room room = reader.getByType("start").get(0).clone();
                room.setPlacedAtMin(dm.getOptions().getStartRoomLocation());
                room.setPlacedAtMax(calcPlacedAtMax(room, room.getPlacedAtMin()));
                this.startRoom = room;
                placedRooms.add(room);
            }
            while (!bossPlaced) {
                Room room = reader.getByType("boss").get(0).clone();
                room.setPlacedAtMin(new Vector(Util.random.nextInt(dm.getOptions().getSoftBoundsX()), 0, Util.random.nextInt(dm.getOptions().getSoftBoundsZ())));
                room.setPlacedAtMax(calcPlacedAtMax(room, room.getPlacedAtMin()));
                if (isRoomIntersecting(room)) continue;
                if (isTooClose(room, options.getRoomDistance())) continue;
                bossPlaced = true;
                bossRoom = room;
                placedRooms.add(room);
            }
            while (!minibossPlaced) {
                Room room = reader.getByType("miniboss").get(0).clone();
                room.setPlacedAtMin(new Vector(Util.random.nextInt(dm.getOptions().getSoftBoundsX()), 0, Util.random.nextInt(dm.getOptions().getSoftBoundsZ())));
                room.setPlacedAtMax(calcPlacedAtMax(room, room.getPlacedAtMin()));
                if (isRoomIntersecting(room)) continue;
                if (isTooClose(room, options.getRoomDistance())) continue;
                minibossPlaced = true;
                minibossRoom = room;
                placedRooms.add(room);
            }
            while (!endPlaced) {
                Room room = reader.getByType("end").get(0).clone();
                room.setPlacedAtMin(new Vector(Util.random.nextInt(dm.getOptions().getSoftBoundsX()), 0, Util.random.nextInt(dm.getOptions().getSoftBoundsZ())));
                room.setPlacedAtMax(calcPlacedAtMax(room, room.getPlacedAtMin()));
                if (isRoomIntersecting(room)) continue;
                if (isTooClose(room, options.getRoomDistance())) continue;
                endPlaced = true;
                endRoom = room;
                placedRooms.add(room);
            }
            for (int i = 0; i < dm.getOptions().getIterations(); i++) {
                List<Room> rooms = reader.getLoadedRoomsCopy();
                Collections.shuffle(rooms);
                rooms.stream().filter(room -> !isSpecialRoom(room)).forEach(room -> {
                    ConfigurationSection frequencies = dm.getOptions().getFrequencies();
                    if (frequencies != null && frequencies.isSet(room.getType())) {
                        int freq = frequencies.getInt(room.getType());
                        if (placedTypes.get(room).intValue() >= freq) return;
                    }
                    room.setPlacedAtMin(new Vector(Util.random.nextInt(dm.getOptions().getSoftBoundsX()), 0, Util.random.nextInt(dm.getOptions().getSoftBoundsZ())));
                    room.setPlacedAtMax(calcPlacedAtMax(room, room.getPlacedAtMin()));
                    if (isRoomIntersecting(room)) return;
                    if (isTooClose(room, options.getRoomDistance())) return;
                    placedRooms.add(room);
                    Integer count = placedTypes.get(room);
                    if (count != null)
                        placedTypes.put(room, count + 1);
                    else placedTypes.put(room, 1);
                });
            }
            Globals.log.info(progressMsg = ChatColor.YELLOW + "Counting blocks...");
            final int[] blockCounter = {0};
            for (Room r : placedRooms) {
                r.getPlacedRegion().iterator().forEachRemaining(b -> blockCounter[0]++);
                translateRandomY(r);
            }
            schemBlocks = new ArrayDeque<>(blockCounter[0]);

            Globals.log.info(progressMsg = ChatColor.YELLOW + "Building rooms...");
            for (Room room : placedRooms) {
                Vector min = room.getPlacedRegion().getMinimumPoint();
                Vector max = room.getPlacedRegion().getMaximumPoint();
                if (hardBoundsMin == null && hardBoundsMax == null) {
                    hardBoundsMin = min;
                    hardBoundsMax = max;
                }
                if (min.getBlockX() < hardBoundsMin.getBlockX()) {
                    hardBoundsMin = hardBoundsMin.setX(min.getX());
                }
                if (min.getBlockY() < hardBoundsMin.getBlockY()) {
                    hardBoundsMin = hardBoundsMin.setY(min.getY());
                }
                if (min.getBlockZ() < hardBoundsMin.getBlockZ()) {
                    hardBoundsMin = hardBoundsMin.setZ(min.getZ());
                }
                if (max.getBlockX() > hardBoundsMax.getBlockX()) {
                    hardBoundsMax = hardBoundsMax.setX(max.getX());
                }
                if (max.getBlockY() > hardBoundsMax.getBlockY()) {
                    hardBoundsMax = hardBoundsMax.setY(max.getY());
                }
                if (max.getBlockZ() > hardBoundsMax.getBlockZ()) {
                    hardBoundsMax = hardBoundsMax.setZ(max.getZ());
                }
                buildRoom(room);
            }

            hardBoundsMax = hardBoundsMax.add(1, 1, 1);
            hardBoundsMin = hardBoundsMin.subtract(1, 1, 1);

            Biome biome = dm.getOptions().getBiome();
            for (int x = hardBoundsMin.getBlockX(); x < hardBoundsMax.getBlockX(); x++) {
                for (int z = hardBoundsMin.getBlockZ(); z < hardBoundsMax.getBlockZ(); z++) {
                    world.setBiome(x, z, biome);
                }
            }

            Util.async(() -> {
                int chunkX = hardBoundsMax.getBlockX() >> 4;
                int chunkZ = hardBoundsMax.getBlockZ() >> 4;
                Globals.log.info("Force loaded chunk from 0,0 to : " + chunkX + ", " + chunkZ);
                for (final int[] x = {0}; x[0] <= chunkX; x[0]++) {
                    for (final int[] z = {0}; z[0] <= chunkZ; z[0]++) {
                        Util.runUnsafe(() -> world.getChunkAt(x[0], z[0]));
                    }
                }
                getPreloaderRoom().getPlacedRegion().iterator().forEachRemaining(v ->
                        Util.runUnsafe(() ->
                                BlockUtils.calculateLighting(world, v.getBlockX(), v.getBlockY(), v.getBlockZ())));

                getWinnerRoom().getPlacedRegion().iterator().forEachRemaining(v ->
                        Util.runUnsafe(() ->
                                BlockUtils.calculateLighting(world, v.getBlockX(), v.getBlockY(), v.getBlockZ())));

                Util.sync(() -> {
                    BukkitRunnable runnable = new BukkitRunnable() {
                        @Override
                        public void run() {
                            try {
                                Globals.log.info(progressMsg = ChatColor.YELLOW + "Finding doors...");
                                Util.syncLater(() -> {
                                    if (placedRooms.isEmpty()) {
                                        dm.broadcast(ChatColor.RED + "ERROR! What the hell? This dungeon has no ROOMS. WTF. TELL AN ADMIN.");
                                        abruptEnd();
                                        return;
                                    }
                                    for (Room room : placedRooms) {
                                        List<RoomDoor> doors = findDoors(room);
                                        if (!doors.isEmpty()) {
                                            room.setDoors(doors);
                                            unconnectedRooms.add(room);
                                        } else {
                                            dm.broadcast(ChatColor.RED + "ERROR! Tell an admin: No doors found for room: " + room.getPlacedRegion().getMinimumPoint());
                                        }
                                    }
                                    Util.syncLater(() -> {
                                        Globals.log.info(progressMsg = ChatColor.YELLOW + "Connecting rooms...");
                                        for (int i = 0; i < dm.getOptions().getPathIterations(); i++) {
                                            Room currentRoom = null;
                                            while (!unconnectedRooms.isEmpty()) {
                                                if (currentRoom == null)
                                                    currentRoom = unconnectedRooms.remove(0);
                                                RoomDoor currentDoor = null;
                                                RoomDoor closestDoor = null;
                                                double nearestDistSq = Double.MAX_VALUE;
                                                Room nearestRoom = null;
                                                //Look through all the closest rooms for the nearest door connection
                                                //Affects BOTH rooms
                                                for (RoomDoor door1 : currentRoom.getDoors()) {
                                                    for (Room room : unconnectedRooms) {
                                                        for (RoomDoor door2 : room.getDoors()) {
                                                            double distSq = door2.getBottomCenter().distanceSq(door1.getBottomCenter());
                                                            if (distSq < nearestDistSq) {
                                                                currentDoor = door1;
                                                                closestDoor = door2;
                                                                nearestRoom = door2.getParent();
                                                                nearestDistSq = distSq;
                                                            }
                                                        }
                                                    }
                                                }
                                                int radius = currentDoor.getRadius();
                                                Vector closestCenter = closestDoor.getBottomCenter();
                                                Vector currentCenter = currentDoor.getBottomCenter();
                                                Location from = new Location(world, currentCenter.getX(), currentCenter.getY(), currentCenter.getZ());
                                                Location to = new Location(world, closestCenter.getX(), closestCenter.getY(), closestCenter.getZ());
                                                double distance = currentCenter.distance(closestCenter);
                                                org.bukkit.util.Vector direction = to.toVector().subtract(from.toVector());
                                                try {
                                                    BlockIterator rayTrace = new BlockIterator(world, from.toVector(), direction, 0, (int) Math.round(distance));
                                                    while (rayTrace.hasNext()) {
                                                        Location loc = rayTrace.next().getLocation().add(0, radius, 0);
                                                        Util.sync(() -> {
                                                            if (Util.random.nextInt(10) < 5) {
                                                                carveSphere(radius, loc, dm.getOptions().getBridgeBlock().getId(), (byte) dm.getOptions().getBridgeBlock().getData());
                                                            } else {
                                                                carveCuboid(radius, radius, radius, loc, dm.getOptions().getBridgeBlock().getId(), (byte) dm.getOptions().getBridgeBlock().getData());
                                                            }
                                                            if (Util.random.nextInt(100) < 20) {
                                                                //place chest, place spawner, spawn tnt, spawn water, spawn lava
                                                                int n = Util.random.nextInt(5);//Randomly place a thing occasionally
                                                                switch (n) {
                                                                    case 0:
                                                                        loc.getBlock().setType(Material.CHEST, true);
                                                                        List<Location> chestLocs = chestLocations.get(Room.GLOBAL) == null ? new ArrayList<>() : chestLocations.get(Room.GLOBAL);
                                                                        chestLocs.add(loc);
                                                                        chestLocations.put(Room.GLOBAL, chestLocs);
                                                                        break;
                                                                    case 1:
                                                                        loc.getBlock().setType(Material.MOB_SPAWNER, true);
                                                                        List<Location> msLocs = mobSpawners.get(Room.GLOBAL) == null ? new ArrayList<>() : mobSpawners.get(Room.GLOBAL);
                                                                        msLocs.add(loc);
                                                                        mobSpawners.put(Room.GLOBAL, msLocs);
                                                                        break;
                                                                    case 2:
                                                                        world.spawnEntity(loc, EntityType.PRIMED_TNT);
                                                                        break;
                                                                    case 3:
                                                                        loc.getBlock().setType(Material.STATIONARY_WATER, true);
                                                                        break;
                                                                    case 4:
                                                                        loc.getBlock().setType(Material.STATIONARY_LAVA, true);
                                                                        break;
                                                                }
                                                            }
                                                        });
                                                    }
                                                } catch (Exception e) {
                                                    e.printStackTrace();
                                                    dm.broadcast(ChatColor.DARK_RED + "ERROR! Dungeon generation failed (start block null)... tell an admin about this.");
                                                    abruptEnd();
                                                    return;
                                                }
                                                if (!unconnectedRooms.remove(nearestRoom)) {
                                                    Globals.log.severe("ERROR! Failed to remove room from unconnectedRooms! The generation WILL fail!");
                                                    dm.broadcast(ChatColor.DARK_RED + "ERROR! Dungeon generation failed (failed array remove)... tell an admin about this.");
                                                    abruptEnd();
                                                    return;
                                                }
                                                currentRoom = nearestRoom;
                                            }
                                            List<Room> roomsClone = (List<Room>) placedRooms.clone();
                                            Collections.shuffle(roomsClone, Util.random);
                                            unconnectedRooms.addAll(roomsClone);
                                        }
                                        Util.syncLater(() -> {
                                            for (int x = 0; x < getHardBoundsMax().getBlockX() >> 4; x++) {
                                                for (int z = 0; z < getHardBoundsMax().getBlockZ() >> 4; z++) {
                                                    refreshChunk(x >> 4, z >> 4);
                                                }
                                            }
                                            freezeProgressTask = true;
                                            progressGag = ChatColor.DARK_GREEN + Dialogue.getRandomDialog(Dialogue.DUNGEON_CREATED);
                                            progressMsg = "Complete.";
                                            dm.getPlayers().forEach(p -> Util.sendTitle(p, 0, 50, 0, progressGag, progressMsg));
                                            Globals.log.info(ChatColor.YELLOW + "Dungeon complete, " + progressMsg);
                                            Util.syncLater(() -> {
                                                WorldManager.worldGenerating = false;
                                                dm.onStart();
                                            }, 60);
                                        }, 60);
                                    }, 50);
                                }, 40);
                            } catch (Exception e) {
                                e.printStackTrace();
                                dm.broadcast(ChatColor.DARK_RED + "ERROR! Dungeon generation failed... tell an admin about this.");
                                abruptEnd();
                            }
                        }
                    };
                    final int schemBlocksSize = schemBlocks.size();
                    Util.sync(() -> {
                        long snap = System.currentTimeMillis();
                        EditSession editSession = we.getEditSessionFactory().getEditSession(bukkitWorld, Integer.MAX_VALUE);
                        while (!schemBlocks.isEmpty()) {
                            BaseBlockVector block = schemBlocks.poll();
                            Vector v = block.getVector();
                            if (block.hasNbtData()) {
                                try {
                                    editSession.setBlock(v, block);
                                } catch (MaxChangedBlocksException e) {
                                    e.printStackTrace();
                                }
                            } else {
                                BlockUtils.setBlockFast(world, v.getBlockX(), v.getBlockY(), v.getBlockZ(), block.getId(), block.getByteData());
                            }
                        }
                        long snap2 = System.currentTimeMillis();
                        long time = snap2 - snap;
                        Globals.log.info(progressMsg = ChatColor.YELLOW + "Placed " + schemBlocksSize + " blocks in " + time + "ms");

                        Util.syncLater(() -> {
                            for (List<Location> list : spawnPoints.values()) {
                                for (Location loc : list) {
                                    loc.getBlock().setType(Material.AIR);
                                    Hologram hologram = HologramsAPI.createHologram(PSCiv.instance, loc.add(0.5, 3, 0.5));
                                    hologram.appendItemLine(dm.getOptions().getDifficulty().getItemIcon());
                                    hologram.appendTextLine(dm.getOptions().getDungeonName());
                                    hologram.appendTextLine(ChatColor.BOLD + ">>" + ChatColor.GREEN + "Spawn Point" + ChatColor.WHITE + ChatColor.BOLD + "<<");
                                    hologram.appendTextLine(ChatColor.BOLD + dm.getOptions().getFloorName());
                                    hologram.appendTextLine(Util.getSimpleXYZ(loc));
                                    hologram.appendItemLine(dm.getOptions().getDifficulty().getItemIcon());
                                }
                            }

                            List<EntityType> type = Arrays.asList(
                                    EntityType.SKELETON,
                                    EntityType.ZOMBIE,
                                    EntityType.SILVERFISH,
                                    EntityType.PIG_ZOMBIE,
                                    EntityType.BLAZE,
                                    EntityType.CAVE_SPIDER,
                                    EntityType.SPIDER,
                                    EntityType.ENDERMAN,
                                    EntityType.ENDERMITE,
                                    EntityType.WITCH,
                                    EntityType.CREEPER,
                                    EntityType.SLIME
                            );

                            CuboidRegion outerWalls = new CuboidRegion(hardBoundsMin.setY(0), hardBoundsMax.setY(256));
                            try {
                                Pattern pattern = new SingleBlockPattern(dm.getOptions().getBoundsBlock());
                                editSession.makeWalls(outerWalls, pattern);
                            } catch (MaxChangedBlocksException e) {
                                e.printStackTrace();
                            }

                            for (Room r : mobSpawners.keySet()) {
                                List<Location> list = mobSpawners.get(r);
                                for (Location loc : list) {
                                    if (r.getType().equals("boss")) {
                                        CreatureSpawner spawner = (CreatureSpawner) loc.getBlock().getState();
                                        spawner.setSpawnedType(Util.getRandomObject(type));
                                        spawner.setDelay(Integer.MAX_VALUE);
                                        Hologram hologram = HologramsAPI.createHologram(PSCiv.instance, loc.add(0.5, 3, 0.5));
                                        hologram.appendItemLine(dm.getOptions().getDifficulty().getItemIcon());
                                        hologram.appendTextLine(dm.getOptions().getDungeonName());
                                        hologram.appendTextLine(ChatColor.BOLD + ">>" + ChatColor.RED + "Boss" + ChatColor.WHITE + ChatColor.BOLD + "<<");
                                        hologram.appendTextLine(ChatColor.RED + "Click the Mob Spawner to start...");
                                        hologram.appendTextLine(Util.getSimpleXYZ(loc));
                                        hologram.appendItemLine(dm.getOptions().getDifficulty().getItemIcon());
                                        bossHologram = hologram;
                                        spawner.update();
                                    } else if (r.getType().equals("miniboss")) {
                                        CreatureSpawner spawner = (CreatureSpawner) loc.getBlock().getState();
                                        spawner.setSpawnedType(Util.getRandomObject(type));
                                        spawner.setDelay(Integer.MAX_VALUE);
                                        Hologram hologram = HologramsAPI.createHologram(PSCiv.instance, loc.add(0.5, 3, 0.5));
                                        hologram.appendItemLine(dm.getOptions().getDifficulty().getItemIcon());
                                        hologram.appendTextLine(dm.getOptions().getDungeonName());
                                        hologram.appendTextLine(ChatColor.BOLD + ">>" + ChatColor.RED + "Miniboss" + ChatColor.WHITE + ChatColor.BOLD + "<<");
                                        hologram.appendTextLine(ChatColor.RED + "Click the Mob Spawner to start...");
                                        hologram.appendTextLine(Util.getSimpleXYZ(loc));
                                        hologram.appendItemLine(dm.getOptions().getDifficulty().getItemIcon());
                                        minibossHologram = hologram;
                                        spawner.update();
                                    } else {
                                        CreatureSpawner spawner = (CreatureSpawner) loc.getBlock().getState();
                                        spawner.setSpawnedType(Util.getRandomObject(type));
                                        spawner.setDelay(getDungeonMaster().getOptions().getMobSpawnerDelay() * 20);
                                        spawner.update();
                                    }
                                }
                            }

                            for (Room room : chestLocations.keySet()) {
                                for (Location loc : chestLocations.get(room)) {
                                    //TODO: Do something with the chests, like add a loot thingy
                                }
                            }

                            for (int x = 0; x < getHardBoundsMax().getBlockX() >> 4; x++) {
                                for (int z = 0; z < getHardBoundsMax().getBlockZ() >> 4; z++) {
                                    refreshChunk(x >> 4, z >> 4);
                                }
                            }
                        }, 40L);
                        Util.syncLater(() -> {
                            Globals.log.info(progressMsg = ChatColor.YELLOW + "Preparing path-finder...");
                            runnable.runTaskLaterAsynchronously(PSCiv.instance, 20);
                        }, 20L);
                    });
                });
            });
        }, 20);
    }

    public void buildRoom(Room room) {
        room.getPlacedRegion().iterator().forEachRemaining(v -> {
            BaseBlock baseBlock = room.getClipboard().getBlock(v);
            List<Location> list;
            Location loc = new Location(world, v.getX(), v.getY(), v.getZ());
            if (isSpawnPoint(baseBlock)) {
                float yaw = signDirToYaw(baseBlock.getData());
                loc.setYaw(yaw);
                baseBlock.setId(Material.SIGN_POST.getId());
                if (spawnPoints.containsKey(room)) list = spawnPoints.get(room);
                else list = new ArrayList<>();
                list.add(loc);
                spawnPoints.put(room, list);
                dm.getParticles().put(loc, "spawn-point");
            } else if (isMobSpawner(baseBlock)) {
                float yaw = signDirToYaw(baseBlock.getData());
                loc.setYaw(yaw);
                baseBlock.setId(Material.MOB_SPAWNER.getId());
                if (mobSpawners.containsKey(room)) list = mobSpawners.get(room);
                else list = new ArrayList<>();
                list.add(loc);
                mobSpawners.put(room, list);
            } else if (isChest(baseBlock)) {
                if (chestLocations.containsKey(room)) list = chestLocations.get(room);
                else list = new ArrayList<>();
                list.add(loc);
                chestLocations.put(room, list);
            }
            schemBlocks.add(new BaseBlockVector(baseBlock, new Vector(v.getX(), v.getY(), v.getZ()), bukkitWorld));
        });
    }

    @Override
    public boolean canSpawn(World world, int x, int z) {
        return true;
    }

    public void regenerateChunk(int x, int z) {
        world.regenerateChunk(x, z);
        refreshChunk(x, z);
    }

    public void refreshChunk(int x, int z) {
        dm.getPlayers().forEach(p -> BlockUtils.queueChunkForUpdate(p, x, z));
    }

    public float signDirToYaw(int dir) {
        switch (dir) {
            case 0:
                return 0;
            case 1:
                return 22.5f;
            case 2:
                return 45;
            case 3:
                return 67.5f;
            case 4:
                return 90;
            case 5:
                return 112.5f;
            case 6:
                return 135;
            case 7:
                return 157.5f;
            case 8:
                return 180;
            case 9:
                return 202.5f;
            case 10:
                return 225;
            case 11:
                return 247.5f;
            case 12:
                return 270;
            case 13:
                return 292.5f;
            case 14:
                return 315;
            case 15:
                return 337.5f;
            default:
                return 0;

        }
    }

    public Hologram getBossHologram() {
        return bossHologram;
    }

    public Hologram getMinibossHologram() {
        return minibossHologram;
    }

    public ArrayList<Room> getPlacedRooms() {
        return placedRooms;
    }

    public boolean isSign(BaseBlock block) {
        if (block.hasNbtData()) {
            CompoundTag nbtData = block.getNbtData();
            if ((nbtData != null && nbtData.containsKey("id")) && nbtData.getString("id").equals("Sign")) return true;
        }
        return false;
    }

    public boolean isChest(BaseBlock block) {
        if (block.hasNbtData()) {
            CompoundTag nbtData = block.getNbtData();
            if ((nbtData != null && nbtData.containsKey("id")) && nbtData.getString("id").contains("Chest"))
                return true;
        }
        return false;
    }

    public boolean isSpawnPoint(BaseBlock block) {
        if (isSign(block)) {
            CompoundTag root = block.getNbtData();
            String firstLine = root.getString("Text1");
            if (firstLine.trim().toLowerCase().contains("[spawn point]")) {
                return true;
            }
        }
        return false;
    }

    public boolean isMobSpawner(BaseBlock block) {
        if (isSign(block)) {
            CompoundTag root = block.getNbtData();
            String firstLine = root.getString("Text1");
            if (firstLine.trim().toLowerCase().contains("[mob spawner]")) {
                return true;
            }
        }
        return false;
    }

    private void translateRandomY(Room room) {
        room.setPlacedAtMin(room.getPlacedAtMin().add(0, Util.random.nextInt(dm.getOptions().getHeightDistance()), 0));
        room.setPlacedAtMax(calcPlacedAtMax(room, room.getPlacedAtMin()));
    }

    private void setBlock(short[][] result, int x, int y, int z, short blockId) {
        if (result[y >> 4] == null) {
            result[y >> 4] = new short[4096];
        }
        result[y >> 4][((y & 0xF) << 8) | (z << 4) | x] = blockId;
    }

    private short getBlock(short[][] result, int x, int y, int z) {
        if (result[y >> 4] == null)
            return 0;
        if (!(y <= 256 && y >= 0 && x <= 16 && x >= 0 && z <= 16 && z >= 0))
            return 0;
        try {
            return result[y >> 4][((y & 0xF) << 8) | (z << 4) | x];
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }

    private void generateFillBlock(short[][] result) {
        for (int x = 0; x < 16; x++) {
            for (int z = 0; z < 16; z++) {
                for (int y = 0; y < 256; y++) {
                    if (y == 0) setBlock(result, x, 0, z, (short) Material.BARRIER.getId());
                    else
                        setBlock(result, x, y, z, Util.getCombinedId(dm.getOptions().getFillBlock().getId(), (byte) dm.getOptions().getFillBlock().getData()));
                }
            }
        }
    }

    /**
     * Carves a cuboid.
     *
     * @param length
     * @param height
     * @param width
     * @param loc
     * @param id
     * @param replaceData
     */
    public void carveCuboid(int length, int height, int width, Location loc, int id, byte replaceData) {
        int x = loc.getBlockX(), y = loc.getBlockY(), z = loc.getBlockZ();
        int minX = x - length;
        int minY = y - height;
        int minZ = z - width;
        int maxX = x + length;
        int maxY = y + height;
        int maxZ = z + width;
        for (int intX = minX; intX <= maxX; intX++)
            for (int intZ = minZ; intZ <= maxZ; intZ++)
                for (int intY = minY; intY <= maxY; intY++) {
                    Vector vector = new Vector(intX, intY, intZ);
                    if (!isPointIntersecting(vector)) {
                        BlockUtils.setBlockFast(world, vector, id, replaceData);
                    }
                }
    }

    /**
     * Carves a sphere
     *
     * @param radius
     * @param id          The block that will replace the existing block
     * @param replaceData The block data
     */
    public void carveSphere(int radius, Location loc, int id, byte replaceData) {
        int x = loc.getBlockX();
        int y = loc.getBlockY();
        int z = loc.getBlockZ();
        int minX = x - radius;
        int minY = y - radius;
        int minZ = z - radius;
        int maxX = x + radius;
        int maxY = y + radius;
        int maxZ = z + radius;
        for (int intX = minX; intX <= maxX; intX++) {
            for (int intZ = minZ; intZ <= maxZ; intZ++) {
                for (int intY = minY; intY <= maxY; intY++) {
                    Vector vector = new Vector(intX, intY, intZ);
                    if (vector.distanceSq(vector) <= radius * radius) {
                        if (!isPointIntersecting(vector)) {
                            BlockUtils.setBlockFast(world, vector, id, replaceData);
                        }
                    }
                }
            }
        }
    }

    /**
     * Carves a sphere with volume s
     * s^3 = size of blocks carved
     * Checks if a room is placed there
     *
     * @param radius
     * @param id          The block that will replace the existing block
     * @param replaceData The block data
     */
    public void carveDome(int radius, Location loc, int id, byte replaceData) {
        int x = loc.getBlockX();
        int y = loc.getBlockY();
        int z = loc.getBlockZ();
        int minX = x - radius;
        int minY = y - radius;
        int minZ = z - radius;
        int maxX = x + radius;
        int maxY = y + radius;
        int maxZ = z + radius;
        for (int intX = minX; intX <= maxX; intX++) {
            for (int intZ = minZ; intZ <= maxZ; intZ++) {
                for (int intY = minY + (maxY - minY) / 2; intY <= maxY; intY++) {
                    Vector vector = new Vector(intX, intY, intZ);
                    if (vector.distanceSq(vector) <= radius * radius) {
                        if (!isPointIntersecting(vector)) {
                            BlockUtils.setBlockFast(world, vector, id, replaceData);
                        }
                    }
                }
            }
        }
    }

    public boolean isRoomPlacedAt(Location loc) {
        return isRoomPlacedAt(new Vector(loc.getX(), loc.getY(), loc.getZ()));
    }

    public boolean isRoomPlacedAt(Vector v) {
        for (Room room : placedRooms) {
            if (room.getPlacedRegion().equals(v)) return true;
        }
        return false;
    }

    /**
     * This method returns true if it is intersecting any room
     * within the placedRooms list.
     *
     * @param room
     * @return
     */
    public boolean isRoomIntersecting(Room room) {
        for (Room r : placedRooms) {
            if (r.intersects(room)) return true;
        }
        return false;
    }

    public boolean isPointIntersecting(Vector vector) {
        for (Room placedRoom : placedRooms) {
            if (placedRoom.contains(vector)) return true;
        }
        if (preloaderRoom.contains(vector)) return true;
        if (winnerRoom.contains(vector)) return true;
        return false;
    }

    public boolean isSpecialRoom(Room room) {
        return room.getType().equals("start") ||
                room.getType().equals("boss") ||
                room.getType().equals("preloader") ||
                room.getType().equals("miniboss") ||
                room.getType().equals("end") ||
                room.getType().equals("winner");
    }

    public Room getRoomAtLocation(Location loc) {
        Vector vector = new Vector(loc.getX(), loc.getY(), loc.getZ());
        for (Room placedRoom : placedRooms) {
            if (placedRoom.contains(vector)) return placedRoom;
        }
        if (preloaderRoom.contains(vector)) return preloaderRoom;
        if (winnerRoom.contains(vector)) return winnerRoom;
        return Room.GLOBAL;
    }

    /**
     * Used internally when a player tries to break a block in the region.
     *
     * @param vector
     * @return
     */
    public boolean denyBlockBreak(Vector vector) {
        for (Room room : placedRooms) {
            for (BlockVector blockVector : room.getPlacedRegion().getWalls()) { //Ignore all walls, allows for mistakes in world generation
                if (blockVector.equals(vector)) return false;
            }
            if (room.contains(vector)) return true;
        }
        if (getPreloaderRoom().contains(vector)) return true;
        if (getWinnerRoom().contains(vector)) return true;
        return false;
    }

    public List<Vector> getCorners(CuboidRegion region) {
        return Arrays.asList(
                region.getMinimumPoint(),
                region.getMinimumPoint().add(region.getMaximumPoint().getX(), 0, 0),
                region.getMinimumPoint().add(0, region.getMaximumPoint().getY(), 0),
                region.getMinimumPoint().add(0, 0, region.getMaximumPoint().getZ()),
                region.getMaximumPoint(),
                region.getMaximumPoint().subtract(region.getMaximumPoint().getX(), 0, 0),
                region.getMaximumPoint().subtract(0, region.getMaximumPoint().getY(), 0),
                region.getMaximumPoint().subtract(0, 0, region.getMaximumPoint().getZ()));
    }

    /**
     * Detects all connected blocks of a type within
     * a room.
     *
     * @param room
     * @return
     */
    private List<RoomDoor> findDoors(Room room) {
        List<Block> storedDoorBlocks = new ArrayList<>();
        List<RoomDoor> roomDoors = new ArrayList<>();
        for (BlockVector next : room.getPlacedRegion()) {
            Block block = world.getBlockAt(next.getBlockX(), next.getBlockY(), next.getBlockZ());
            if (isDoorType(block)) {
                if (storedDoorBlocks.contains(block)) {
                    continue;
                }
                List<Block> doorBlocks = new ArrayList<>();
                searchDoorsRecur(world, next, doorBlocks);
                if (doorBlocks.isEmpty()) continue;
                storedDoorBlocks.addAll(doorBlocks);
                roomDoors.add(new RoomDoor(room, doorBlocks));
            }
        }
        return roomDoors;
    }

    /**
     * Resursive door search
     *
     * @param world
     * @param pos
     * @param doorBlocks
     */
    private void searchDoorsRecur(World world, Vector pos, List<Block> doorBlocks) {
        Block block = world.getBlockAt(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ());
        if (!isDoorType(block)) {
            return;
        }
        if (blockListContains(doorBlocks, block)) return;
        doorBlocks.add(block);
        block.setTypeId(0, false);
        searchDoorsRecur(world, pos.add(1, 0, 0).toBlockVector(), doorBlocks);
        searchDoorsRecur(world, pos.add(-1, 0, 0).toBlockVector(), doorBlocks);
        searchDoorsRecur(world, pos.add(0, 0, 1).toBlockVector(), doorBlocks);
        searchDoorsRecur(world, pos.add(0, 0, -1).toBlockVector(), doorBlocks);
        searchDoorsRecur(world, pos.add(0, 1, 0).toBlockVector(), doorBlocks);
        searchDoorsRecur(world, pos.add(0, -1, 0).toBlockVector(), doorBlocks);
    }

    private boolean blockListContains(List<Block> doorBlocks, Block block) {
        for (Block b : doorBlocks) if (b.getLocation().equals(block.getLocation())) return true;
        return false;
    }

    private boolean isDoorType(Block block) {
        return block.getTypeId() == dm.getOptions().getDoorBlock().getId() && block.getData() == dm.getOptions().getDoorBlock().getData();
    }

    /**
     * If the room is too close to any other room nearby based on the range,
     * this will return true.
     *
     * @param r1
     * @param range
     * @return
     */
    public boolean isTooClose(Room r1, double range) {
        double rangeSq = range * range;
        for (Room r2 : placedRooms) {
            List<Vector> corners = getCorners((CuboidRegion) r1.getPlacedRegion());
            List<Vector> corners2 = getCorners((CuboidRegion) r2.getPlacedRegion());
            for (Vector c1 : corners) {
                for (Vector c2 : corners2) {
                    if (c1.distanceSq(c2) < rangeSq) return true;
                }
            }
        }
        return false;
    }

    private Vector calcPlacedAtMax(Room room, Vector placedAtMin) {
        BlockArrayClipboard oldClip = room.getClipboard();
        Vector max = oldClip.getMaximumPoint().add(
                placedAtMin.subtract(oldClip.getMinimumPoint())
        );
        room.setPlacedRegion(new CuboidRegion(placedAtMin, max));

        BlockArrayClipboard newClip = new BlockArrayClipboard(room.getPlacedRegion());
        ForwardExtentCopy forward = new ForwardExtentCopy(
                oldClip,
                oldClip.getRegion(),
                newClip,
                placedAtMin
        );
        Operations.completeBlindly(forward);
        room.setClipboard(newClip);
        return max;
    }

    @Override
    public List<BlockPopulator> getDefaultPopulators(World world) {
        return super.getDefaultPopulators(world);
    }

    @Override
    public Location getFixedSpawnLocation(World world, Random random) {
        return getFixedSpawnLocation(world);
    }

    public Location getFixedSpawnLocation() {
        return getFixedSpawnLocation(world);
    }

    public Location getFixedSpawnLocation(World world) {
        return new Location(world, 0, 300000, 0);
    }

    public Map<Room, List<Location>> getSpawnPoints() {
        return spawnPoints;
    }

    public Map<Room, List<Location>> getMobSpawners() {
        return mobSpawners;
    }

    public Map<Room, List<Location>> getChestLocations() {
        return chestLocations;
    }

    public DungeonMaster getDungeonMaster() {
        return dm;
    }

    public Room getStartRoom() {
        return startRoom;
    }

    public Room getEndRoom() {
        return endRoom;
    }

    public Room getBossRoom() {
        return bossRoom;
    }

    public Room getMinibossRoom() {
        return minibossRoom;
    }

    public Room getPreloaderRoom() {
        return preloaderRoom;
    }

    public Location getPreloaderPoint() {
        return preloaderPoint;
    }

    public Vector getHardBoundsMin() {
        return hardBoundsMin;
    }

    public Vector getHardBoundsMax() {
        return hardBoundsMax;
    }

    public String getProgressGag() {
        return progressGag;
    }

    public String getProgressMsg() {
        return progressMsg;
    }

    public World getWorld() {
        return world;
    }

    public BukkitWorld getBukkitWorld() {
        return bukkitWorld;
    }

    public Location getTransitionPoint() {
        return transitionPoint;
    }

    public Room getWinnerRoom() {
        return winnerRoom;
    }
}

redpajama_set_name: RedPajamaGithub


Something I made to learn flashpunk(which I never used before). You can move around with arrow keys and place bombs with Z, destroy walls but you are invincible. If keyboard doesn't work, click on the game.
hahaha wish I had of read the description prior to playing it, I waited like 2 minutes for my 20+ bombs to go off in a glorious explosion. Was disappointed they didn't. Works really well though.


My favorite look of the Warriors, that color scheme works so well.
I would love to see a side by side comparison of your logos and the leagues current logos. One of the best series on these boards!
Whether he does or not, I'd still like to see the other Dallas team wear something close to it. Green needs to be in the mix, if not the main color.
Couldn't ask the WNBA to come up with anything better than what you have right here, outstanding. Carry over that color scheme for the Mavericks from the Wings please Mark Cuban, K thx.
As a Columbus fan, I feel your pain playing the Penguins in the playoffs... I hope by tomorrow you can update the Jackets side with another block lol.
I grew up about 10 minutes or so from ONU and my Fiance is a Muskie Alumni, class of '13! Great work so far, love me some OAC.
Fans LOVED the teal + Team Logic = Make Black the primary, got it.
The Supra for Toyota is supposed to be resurrected here soon, but the Mustang coming is the worst kept secret with the manufactures. Glad that it's becoming muscle again over sedans.
Even if Blue and Yellow aren't really well liked together in Columbus, for what it is you blended it well.I like the lighter color of blue in contrast with the 2 other colors, and making Black the main stripe is a good call.
Syracuse is that you? Laughable at best, fits the product on the field.
I'd say you nailed all 4 right on the head, perfect. I'd like to see the full set of all 4.


text:
SUPERGROUP THE WHEELBLOCKS (FEAT. CHRIS JERICHO, NITA STRAUSS, PHIL DEMMEL, JOHNNY CHRIST AND JOSH V) RELEASE COVER OF IRON MAIDEN'S "ACES HIGH"
August 7, 2020Dana 13 Comments
Supergroup The Wheelblocks featuring Chris Jericho (Fozzy), Nita Strauss (Alice Cooper), Phil Demmel (Vio-Lence, ex Machinehead), Johnny Christ (Avenged Sevenfold), and Josh V (Three 6 Mafia) release a cover track, Iron Maiden's Aces High, today through The Orchard/Madison Records. Watch the music video, featuring footage of each band member in quarantine, below. Then, go stream and purchase the track here
"Once again in the middle of a pandemic, I had the honor of getting together with some amazing musicians to play a cover of one of my favorite band's best songs!" exclaims The Wheelblocks singer Chris Jericho. "Aces High is not only one of the hardest vocals I've ever had the pleasure of singing in a studio, they were even harder to record while I was flying a fighter plane. As a result, I think the power (slave) of this song fits perfectly into the hard rock world of today and I'm excited to see Aces High fly as high up the charts as the protagonist of the song itself! So head up the runway, let off a shot burst and up The Wheelblocks!"
Along with Jericho, The Wheel Blocks are heavily loaded with talent, attitude, and swagger. Nita Strauss, frequently on the covers of world wide print magazines, has had a successful solo career and is the current touring guitarist for Alice Cooper. Phil Demmel rose to fame playing lead guitar in Machine Head between 2002 and 2018, making him their longest running member in that position. Johnny Christ is bass player and fan favorite for powerhouse metal band Avenged Sevenfold. Rounding out the line up is Josh V, touring drummer for Three 6 Mafia.
Chris Jericho has established himself as a multi-faceted talent with tens of millions of fans worldwide. Jericho is the lead singer of the internationally successful rock band Fozzy, which will be releasing their eighth full-length album coming Spring 2021. The pop culture icon is also one of the most recognized pro wrestlers, having built a world-renowned wrestling career, first with World Wrestling Entertainment and now with All Elite Wrestling (AEW). Additionally, Jericho is the host of the widely popular Talk Is Jericho podcast, as well as The Rock Of Jericho weekly radio show on SiriusXM Octane. He is also a four-time New York Times best-selling author, actor, and runs the entertainment news site Web Is Jericho.
Follow Chris online at:
‹ GUITARIST JOHN PETRUCCI RETURNS WITH HIS FIRST SOLO ALBUM IN 15 YEARS – "TERMINAL VELOCITY"
GUITARISTS AND MUSICIANS TO PARTICIPATE IN "SIX STRING SALUTE" VIRTUAL CONCERT ON SEPTEMBER 17TH ›
robert davenport on August 7, 2020 at 2:56 pm
First I hate quarantine videos , if you have no symptoms you can be in the same room , they are just not in the same part of the country – second what's the point of covering this song ? No chance to play it or sing it any better –
Ok , I watched 51 seconds of the video…. complete waste of time, not even close to the quality of the original
T on August 7, 2020 at 3:19 pm
How is Mike Portnoy not in this band. He's the default drummer for supergroups. Joking aside, a seriously good drummer though.
RobT on August 8, 2020 at 10:20 am
Not a fan of these quarantine projects but still this was pretty good. Jericho does a credible job with the vocal but I think his voice sounds too sharp pitched. Everything else sounds good and I'll admit the only real reason I watched it was for Nita Strauss. She was one of the best parts of an Alice Cooper show I had seen a couple years ago.
MikeyMan on August 8, 2020 at 10:41 am
We sure toss around the term "Supergroup" way too much!

redpajama_set_name: RedPajamaCommonCrawl


MR Online | Is there any way out of the U.S. student debt crisis?
Is there any way out of the U.S. student debt crisis?
Posted Apr 13, 2019 by Eds.
By working three jobs while in college and with some financial assistance from her mother, Karen Hawkins managed to pay off her undergraduate loans of US$12,000 eight years after completing her bachelor's degree at the University of Illinois at Urbana-Champaign.
However, paying off the US$55,000 in student debt that she accumulated after obtaining a master's degree at Northwestern University has proved a lot more difficult. "I feel like I'm going to carry this debt for forever, which is why I keep lowering my monthly payments," says Hawkins, a 43-year-old Chicago-based journalist and founder of Rebellious Magazine. "I think I'm down to US$250 a month now," she explains.
According to a report from the Brooking Institute, close to 40 per cent of borrowers who entered college in 2003-2004 are now at risk of defaulting on their student loans by 2023. Some experts have warned that all these student loans are a financial disaster waiting to happen, drawing parallels to the shoddy mortgage loans that caused the 2008 financial crisis. Others say that in order for there to be a financial bubble the price of an asset needs to far exceed that asset's actual value. For most people the increased earning power associated with a college degree still far exceeds the cost of getting that degree.
What is certain is that student debt is certainly influencing the labour market, says Douglas Webber, an associate professor of economics at Temple University in Philadelphia, pointing to evidence that degree holder are less interested in jobs with a public sector focus because of concerns over repaying their student debts. There's also limited evidence that people are delaying decisions like buying a house, getting married and having kids. "We're not at the point where those are huge effects right now, but if trends keep going the way they are, we'll probably see more of that," he says.
According to figures from the College Board, a higher education non-profit, tuition fees at public four-year institutions have increased 213 per cent over the last 30 years–from an annual average of US$3,190 in the 1987-1988 school year to US$9,970 in the 2017-2018 school year. According to a 2017 OECD report, the U.S. has the highest tuition rates of all 36 OECD countries. In countries like Australia, Canada and Japan the average annual tuition fees are around US$4,500, while a third of the countries examined in the report don't charge any tuition for bachelor's degrees at public institutions.
Although decreased state funding for public universities has been a long-standing trend, the 2008 recession exacerbated this development with many states trimming their budgets and cutting down on money for public colleges. According to the Center on Budget and Policy Priorities, overall state funding for public two- and four-year colleges was US$9 billion below the 2008 level in 2017, after adjusting for inflation.
The gap left between what states are willing to spend on education and what universities are charging in the way of tuition has been covered by debt. In the US, students can take out federal loans, which are issued by the Education Department and account for 90 per cent of loans, as well as bank-issued private loans to finance their education. Interest rates on the different types of federal loans ranged between 5.05 per cent and 7.60 per cent for the 2017-2018 school year.
Although graduates with tens of thousands of dollars of debt like Hawkins have dominated much of the news coverage on this issue, they are not the people who have been hit hardest by the student debt crisis.
The most vulnerable group by and large, experts warn, are students who drop out of college. This means they don't get the salary boost associated with a higher education degree, but they still have to pay off the loans they took out. Two-thirds of borrowers who default on their student loans, meaning they are more than 270 days delinquent on their loans, do so on amounts of less than US$10,000.
This is where the for-profit colleges come in, Webber explains. "Many of the people who have taken out US$5,000 went to a for-profit college, and on average those have pretty poor outcomes and enrol a lot of minority students," Webber explains.
To get the money it lent students back, the U.S. federal government can confiscate wages, tax refunds and even social security retirement benefits. Because many of the students who enrol in for-profit colleges "either don't graduate or get jobs that aren't worth the loans they took out, you have this debt that's going to accrue interest and the balance is just going to grow, and for many people it gets to a point where there's no way they can get out from under it," he says.
Women take out larger loans than men and they also take longer to pay off the loans due in part to the gender pay gap. These problems are all compounded for women of colour. Black women on average take on more student debt than any other group.
Lawmakers like 2020 U.S. presidential aspirant Bernie Sanders have proposed making public education tuition-free, while former president Barack Obama has proposed making two years of community college tuition free. Democratic senators also submitted a bill in 2017 that would allow private student loan borrowers to discharge their loans in bankruptcy proceedings, something that isn't currently possible.
Advocacy groups for young people have made tackling the student debt crisis one of their core issues. Setzer of the Young Invincibles says that addressing the student debt crisis would mean doing something both for those people who have accumulated debt and future generations of students.
"First we want one income-based repayment plan that would allow folks to spend 10 per cent of their discretionary income for 20 years and then have the rest of their debt forgiven," he says. "That would be highly effective. It would prevent defaults, and would allow people to manage their payments much easier." He adds that a handful income-based plans exist today but notes that they are highly confusing and that student loan servicers have no fiduciary duty to act in borrowers' best interests.


What is so radical about the idea that the central city is better off with fewer cars? Pedestrian-friendly zones honor our city centers, and in the long-term, dramatically INCREASE economic activity for local shopowners and taxi drivers too. Like our absence of government-sponsored health care, the United States is the only advanced industrial nation that does not follow this basic design concept in its major cities.


text:
Washington Wild Sends Letter to Governor Jay Inslee Urging for Funding for Trust Land Transfer Program
Posted on Oct 30, 2020 in Conservation News, WA Wild Blog
Morning Star photo courtesy of NRCA
Today, Washington Wild sent a letter to Governor Jay Inslee undersigned by 37 conservation, recreation, and wildlife organizations urging Inslee to include funding for the Trust Land Transfer (TLT) program in the Governor's budget for the 2021-23 session.
The ask for funding is to complete three high priority projects: Devils Lake, Morning Star, and Cascade River.
The Department of Natural Resources (DNR) manages more than 3 million acres of state trust forest, agricultural, range, and commercial properties. These properties earn income to fund schools, universities, capitol buildings, and other state institutions, while also helping to fund local services in many counties.
Trust Land Transfers keep high priority conservation lands in protected public ownership while maintaining and improving economic returns to the trust beneficiaries.
Since its inception in 1989, the Trust Land Transfer program has preserved more than 128,000 acres of state land for fish and wildlife habitat, recreation, education, and other community uses. Preserving land in this way has also sustained and improved potential future economic returns for schools and state and local governments.
Trust Land Transfers are recognized by the Department of Natural Resources as a much-needed asset management tool. However, a Trust Land Transfer project list was not proposed for the upcoming Governor's budget due to a perceived lack of support.
Washington Wild and the 37 undersigned organizations strongly support Trust Land Transfers. We've called on Inslee to fund these three high-priority projects that need completion:
Devils Lake — Located in Jefferson County on the Olympic Peninsula, the proposed Trust Land Transfer lands are 370 acres of School Trust lands within the Devils Lake Natural Resource Conservation Area (NRCA) managed by the Department of Natural Resources. The area includes one mile of intact forested shoreline on steep slopes along Dabob Bay. This area offers diverse wildlife habitat and helps protect the water quality and shellfish industry. The project has received broad support at public hearings from private citizens, shellfish businesses, Tribes, and county government.
Morning Star — Located in Snohomish County, the proposed Trust Land Transfer lands are 1,090 acres of Common School and State Forest Trust lands within the Morning Star Natural Resource Conservation Area (NRCA). The property is near Spada Lake—which is a key drinking water source for Snohomish County—and contains uncommon forest and wildlife, including old-growth forests.
Cascade River — The Cascade River Trust Land Transfer project includes approximately1,200 acres on both sides of the Cascade River above Marblemount. It contains timber that is difficult to manage due to steep and rocky terrain and habitat for multiple endangered species, including chinook salmon.
The Trust Land Transfer program protects the places that Washingtonians love while preserving an important revenue stream that pays for necessary services. The program is unique in that it allows the Department of Natural Resources to reposition its Trust assets for better economic return while also preserving valued landscapes in the state. Keeping this program alive and functional is critical for the future of conservation in Washington.


text:
Q: Passing values by form to create a query I have this structure:
taxonomy
    - term1
    -- child term1
    -- child term2

    -term2
    -- child term1
    -- child term2

I have two select boxes. First one shows the parent terms (term1 and term2) and the second one shows the childs of the selected parent.
I submit the form to "search-results.php". How can I get the values of both selects to create this kind of query?
$args = array(
   'tax_query' => array(
       array(
          'taxonomy' => 'state',
          'field' => 'slug',
          'terms' => array( term1, childTerm2 ),
          'operator' => 'IN'
       )
    )
);

Thanks.

A: It all depends on how you're trying to do it. When it comes to filtering results, i usually setup the form to use $_GET and filter the results when the page loads again:
if (isset($_GET['term'])) {
    $term = $_GET['term'];
} else {
    $term = 'defaultTerm';
}

if (isset($_GET['childterm'])) {
    $childterm = $_GET['childterm'];
} else {
    $childterm = 'defaultChild';
}

$args = array(
   'tax_query' => array(
       array(
          'taxonomy' => 'state',
          'field' => 'slug',
          'terms' => array( $term, $childterm ),
          'operator' => 'IN'
       )
    )
);

redpajama_set_name: RedPajamaStackExchange


U.S. Ambassador to Estonia: Who Is Sonny Masso?
The next U.S. ambassador to the Baltic nation of Estonia will be a conservative retired admiral whose Estonian father came to the U.S. after World War II. Nominated by President Trump on September 2, 2017, Edward "Sonny" Masso visited Estonia in 1998 to attend a 300th anniversary family reunion. He also served in the Navy with former Trump advisor Steve Bannon. If confirmed by the Senate, Masso would succeed James D. Melville Jr., a career foreign service officer whose service in Tallinn began in August 2015.
Masso earned a BA in History Education at the University of Mississippi in 1977, and was commissioned an ensign through the Navy ROTC. He was on full time active duty from 1977 to 1984, including service as a first lieutenant, navigator, and ASW officer on the USS Paul F. Foster, as a Joint Chiefs of Staff intern, and as an assignment officer in the Bureau of Naval Personnel. While serving on the Foster, Masso met and befriended fellow naval officer Stephen Bannon, a former advisor to Trump. In 1984, Masso transitioned to the Select Reserve, continuing to serve on a part-time basis.
As a select reservist, Masso served in various capacities, including as vice commander at Navy surface forces, US Pacific Fleet in San Diego from September 2003 to May 2006, and assistant deputy chief of Naval operations for manpower, personnel, training, and education from May 2006 to May 2007. He capped his Navy career as a commander at the U.S. Navy Personnel Command from May 2007 to March 2009, when he retired from the Navy.
In the private sector, Masso was vice president at Anteon Corporation, a military contractor that specialized in simulators and interrogator training, from 1996 to 2004. Later, he was senior vice president for Navy and missile defense programs at SAIC Corp, from June 2009 to December 2010, and president of Flagship Connection, an executive consulting firm in Washington, from December 2010 to August 2017.
Masso also served—very briefly—as chief operating officer of the North Carolina Department of Public Safety in Raleigh, North Carolina, from February to August 2013. He resigned abruptly, just a day after his boss, Secretary of Public Safety Kieran Shanahan, also quit without warning. The suddenness of these exits raised eyebrows, especially since Masso's letter of resignation provided no reason for his decision.
Masso is a senior fellow at the conservative Potomac Institute for Policy Studies, and has written for the right wing website Breitbart, attacking the multi-party deal over Iran's nuclear ambitions after originally supporting it.
Among his military awards and commendations, Masso has stated he is most proud of the Meritorious Unit Commendation he received as a member of Navy Command Center 106 for actions during and after the September 2001 attacks on the Pentagon and World Trade Center.
Edward Masso is married to Sherrie R. (Merrell) Masso, with whom he has two children, Alexis and Colin.


text:
La Plaça Major de Valladolid està situada en el centre de la ciutat de Valladolid a pocs metres d'altres monuments significatius com l'Església de San Benito el Real o l'Església de Santa Maria l'Antiga.
Presidida pel monument al repoblador de la ciutat, el Comte Ansúrez, la Plaça Major constitueix el principal espai de trobada dels val·lisoletans.

Història
A mitjan , Valladolid era un petit llogaret agrícola envoltat per una tanca defensiva. L'espai que ocupa la plaça Major i els seus voltants es trobava fora d'aquesta primera muralla, prop de la porta coneguda com a portella del Blat (en espanyol, postigo del Trigo), per on els mercaders entraven a la vila amb els aliments.

Quan el comte Pedro Ansúrez va obtenir el senyoriu de la vila en 1072, va fer construir un palau per a ell i la seva esposa donya Eylo Alfonso i les esglésies de Santa Maria la Major i de Santa María l'Antiga i es va instal·lar el concejo. La plaça de Santa Maria, era doncs el centre de la incipient urbs. Per la seva banda, al descampat on avui es troba la plaça es van anar construint diverses edificacions.

L'existència de la plaça Major en l'actual emplaçament va començar a definir-se a mitjan  quan el mercat es va desplaçar des de la Plaça de Santa Maria a la Plaça del Mercat, que des de començaments de la XVI es va anomenar Plaça Major. Els diferents gremis es van anar instal·lant al seu voltant, i va ser el Convent de Sant Francesc, fins a 1499, l'edifici més important dels voltants. A partir d'aquesta data, per mandat dels Reis Catòlics, va ser la Casa del Municipi la qual va presidir la vida de la ciutat.

Després de la seva destrucció, a causa de l'greu incendi que va començar el 21 de setembre de 1561 i que fins al 23 de setembre va destruir almenys 440 cases de la ciutat, el concejo va iniciar, l'endemà de la finalització de l'incendi, les tasques de reconstrucció. Es va encarregar a Francisco de Salamanca la construcció de botigues provisionals a la mateixa plaça i es va reallotjar als afectats per l'incendi, utilitzant per a això cases prestades pels mateixos veïns.

El mateix 24 de setembre, el concejo va prendre la decisió de sol·licitar ajuda per a la reedificació de la zona afectada a Felip II. La sol·licitud va ser lliurada en mà al rei pel corregidor de la ciutat, Luis de Ossorio. El 25 de setembre, després d'una nova reunió del concejo, es va decidir encarregar a Francisco de Salamanca el projecte de reconstrucció de la zona i un estudi previ en el que s'estudiés la distribució de l'espai urbà anterior a l'incendi. En aquest estudi previ ja es plasma la idea d'una gran plaça on es construirien les cases del consistori i s'ubicarien de manera ordenada els diferents gremis, oficis i serveis.

Els dies 9 i 10 d'octubre, Felip II va expedir una Reial Cèdula per la qual sol·licita al concejo la realització d'un informe tècnic i en la qual es consignen una sèrie de premisses per dur a terme el projecte com són l'obligació d'un sistema de carrers rectilinis i una nova traça urbana.

Després d'una sèrie de contactes a tres bandes entre el concejo, Francisco de Salamanca i Felip II, l'arquitecte va presentar el projecte definitiu al monarca que va ser aprovat excepte certes modificacions menors.

Fisonomia

La plaça, una de les més grans d'Espanya, és de planta rectangular, amb unes dimensions de 400 peus de llarg (uns 122 m) per 266 d'ample (uns 81 m), de proporció sesquiàltera (proporció de 3 a 2). Està completament porticada i les seves porxades descansen sobre columnes o pilars quadrats de granit, sent de tipus obert, és a dir, els carrers desemboquen en ella sense cap obstacle ni pantalla. Està envoltada per petits carrers gremials que recorden el passat mercantil de l'entorn.

Tradicionalment els habitatges de la plaça van tenir una alçada de tres pisos, sent la distribució de buits jerarquitzada. La planta primera posseïa balconades, la segona ampits i la tercera finestres senzilles. Aquesta fisonomia original va ser canviant al llarg del temps fins a l'actual, en què tots els buits dels pisos tenen balcons.

En l'anomenada vorera de Sant Francesc es troba el Teatre Zorrilla, inaugurat el 1884. Se situa en el mateix lloc en què s'alcés part del desaparegut Convent de Sant Francesc, immens conjunt monàstic, demolit totalment entre 1835 i 1850 i que abastava tot l'espai comprès entre les actuals carrers de Santiago, Montero Calvo i Duc de la Victòria. L'actual carrer constitució se sobre la desapareguda església gòtica del monestir i el carrer Menéndez i Pelayo, sobre diverses dependències i les antigues hortes.

Actualment, s'ha intentat tornar a l'homogeneïtat original mitjançant certs mecanismes, com el pintar de vermell totes les façanes de les edificacions, cosa històrica i estèticament discutible.

Sota la plaça hi ha un pàrquing públic.

En el flanc nord del seu traçat rectangular, s'alça la Casa Consistorial seu de l'Ajuntament de Valladolid

Monument al comte Pedro Ansúrez
Al centre de la plaça hi ha el Monument al comte Pedro Ansúrez, estàtua del repoblador de la ciutat, realitzada el 1903 per Aurelio Rodríguez-Vicente Carretero.

Es tracta d'un monument que consta d'un pedestal de base quadrangular que adopta forma piramidal al basament i en el suport de l'escultura, realitzat amb pedra de Campaspero, sobre el qual es troba l'escultura en bronze de Pedro Ansúrez.

L'estàtua del comte, que vesteix a la manera de l'època d'Alfons VI de Lleó, porta espasa i escut. El cos es troba inclinat lleugerament cap enrere amb la cama dreta avançada. A la mà esquerra subjecta enrotllat el document de fundació de la ciutat mentre que a la mà dreta subjecta el pendó de Castella.

Usos

Actualment la Plaça Major s'ha convertit en un lloc propici a la trobada i la convivència ciutadana en què es duen a terme diverses activitats culturals. En aquest sentit, durant la Fira i Festes de Nostra Senyora de Sant Llorenç es desenvolupen diversos concerts i altres activitats culturals. De la mateixa manera, durant les festes de Pere Regalado també acull actes del programa de festes. Així mateix, s'hi desenvolupa la Trobada Internacional de Mestres Escultors de Sorra durant els mesos de primavera.

És un dels espais on té lloc les actuacions del TAC (Festival de Teatre i Arts de carrer), que se celebra a finals de maig. Amb aquest festival es munten a la plaça dues grans graderies una amb un aforament 1500 persones i l'altre de 500 persones.

Durant la Setmana Santa de Valladolid discorren diverses processons i actes entre els quals destaquen el Sermó de les Set Paraules i la Processó General de la Sagrada Passió del Redemptor.

Des del punt de vista esportiu i com a punt de reunió dels val·lisoletans és el punt habitual de celebració per als èxits dels diversos equips esportius de la ciutat com el Reial Valladolid, l'Handbol Valladolid o el Club de Rugbi El Salvador. A més durant el mes de juliol acull un torneig de pàdel amb el qual es munta un espectacular camp en plena plaça.

Referències

Enllaços externs

Major Valladolid
Valladolid

redpajama_set_name: RedPajamaWikipedia


text:
Shedding light on Learning Communities at EARCOS
Between October 31 to November 2, Yew Chung International School of Beijing and other member schools attended the East Asia Regional Council of Schools (EARCOS) annual Leadership Conference in Malaysia. Considered a pioneer in the region, YCIS Beijing was invited, once again, to the conference to shed light on its innovative Learning Community Model and its implementation.
With 179 member schools in attendance hailing from Singapore, Thailand, Japan and Myanmar to name a few, the conference was an opportune moment for those invited to network with thought leaders in the education industry and to learn more about how we have responded to 21st century demands though Learning Communities.
Representatives from YCIS Beijing included Head of Primary, James Sweeney, Jane Martuneac Kang, Upper Primary Learning and Teaching Coordinator, and James Honey, Year 3 Learning Community Team Leader. The theme of their presentation was Building Learning Communities: A Transformative Process and it highlighted the transformation of a school from single-cell, traditional classroom teaching to dynamic, relevant Learning Communities.
"The focus was on the implementation of Learning Communities across the school - how all stakeholders played their part, the successes and future plans thereof" Mr. Sweeney asserted. Having implemented Learning Communities at YCIS Beijing several years ago, "We are considered a leader in the subject and we should share our experiences with our colleagues." he added.
During their presentation some of the key points James and his colleagues shared were the three Ts; 'Teams, Time and Tracking. "These are the essentials in making a successful Learning Community" explained James. They elaborated on each area and how schools can implement these if they wish to introduce the concept of Learning Communities effectively.
Due to our school's ever changing nature, it was crucial for us to share the process involved in remaining relevant and dynamic. "YCIS Beijing is a school that is always improving and has undergone lots of changes in recent years. We wanted to share our experiences and attendees wanted to learn about our continuous journey of improvement" said Mr. Sweeney.
Nurturing Growth and Building Relevance was the theme at this year's conference and in line with that, the YCIS Beijing team was able to indicate how Learning Communities do that to an audience of their peers from various International Schools. They were also able to share how for the school to undergo that kind of shift, collaborative work from all stakeholders was required.
To prospective parents who may still not clearly understand the Learning Community Model and the benefits thereof, James elaborated "Our aim is to create opportunities for students to not only advance their academic knowledge but also build their Dimensions of Learning. These are critical for life after school. Our Learning Community approach aims to create students that are critical thinkers, collaborators, people who preserve, self-regulate and innovate."
To learn more about Learning Communities, click here.


text:
Q: Mongoid: 2 models with a has_many and has_one relation to a third, sequence of execution seems to make a difference class Store
  include Mongoid::Document

  has_many :products
  attr_readonly :products

  def add_product section
    product = Product.new
    section.product = desk
    self.products <<= desk
  end
end

class Section
  include Mongoid::Document

  has_one :product
end

The above code doesn't quite work and the products array is never populated. However, if I simply switched the lines in the add_product method so that it looks like below, things appear to work fine:
    self.products <<= desk
    section.product = desk

I tried cloning desk and a few other quick and dirty tricks but it didn't make any difference. I am hoping to understand this behavior.