{"action":"created","comment":{"url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/pulls/comments/63282470","id":63282470,"diff_hunk":"@@ -60,229 +109,334 @@ public void startExecuting()\n                         String.format(\"Builder (%d:%d) ERROR - Starting and missing work order(%d)\",\n                                       worker.getColony().getID(),\n                                       worker.getCitizenData().getId(), job.getWorkOrderId()));\n-                return;\n+                return this.getState();\n             }\n             Building building = job.getColony().getBuilding(wo.getBuildingId());\n             if (building == null)\n             {\n                 Log.logger.error(\n                         String.format(\"Builder (%d:%d) ERROR - Starting and missing building(%s)\",\n                                       worker.getColony().getID(), worker.getCitizenData().getId(), wo.getBuildingId()));\n-                return;\n+                return this.getState();\n             }\n-            //Don't go through the CLEAR stage for repairs and upgrades\n-            if (building.getBuildingLevel() > 0) {\n-                job.stage = JobBuilder.Stage.REQUEST_MATERIALS;\n \n-                if (!job.hasSchematic() || !incrementBlock()) {\n-                    return;\n+            LanguageHandler.sendPlayersLocalizedMessage(EntityUtils.getPlayersFromUUID(world, worker.getColony().getPermissions().getMessagePlayers()),\n+                                                        \"entity.builder.messageBuildStart\",\n+                                                        job.getSchematic().getName());\n+\n+            //Don't go through the CLEAR stage for repairs and upgrades\n+            if (building.getBuildingLevel() > 0)\n+            {\n+                ((BuildingBuilder) getOwnBuilding()).setCleared(true);\n+                if (!job.hasSchematic() || !incrementBlock())\n+                {\n+                    return this.getState();\n                 }\n-            } else {\n-                job.stage = JobBuilder.Stage.CLEAR;\n-                if (!job.hasSchematic() || !job.getSchematic().decrementBlock()) {\n-                    return;\n+                return AIState.BUILDER_REQUEST_MATERIALS;\n+            }\n+            else\n+            {\n+                if (!job.hasSchematic() || !job.getSchematic().decrementBlock())\n+                {\n+                    return this.getState();\n                 }\n+                return AIState.START_WORKING;\n             }\n-\n-\n-            LanguageHandler.sendPlayersLocalizedMessage(EntityUtils.getPlayersFromUUID(world, worker.getColony().getPermissions().getMessagePlayers()), \"entity.builder.messageBuildStart\", job.getSchematic().getName());\n         }\n         BlockPosUtil.tryMoveLivingToXYZ(worker, job.getSchematic().getPosition());\n \n-        worker.setStatus(EntityCitizen.Status.WORKING);\n+        return AIState.IDLE;\n+    }\n+\n+    private boolean incrementBlock()\n+    {\n+        return job.getSchematic().incrementBlock();//method returns false if there is no next block (schematic finished)\n     }\n \n-    @Override\n-    public void updateTask()\n+    private void loadSchematic()\n     {\n-        //Don't work every single tick\n-        if(worker.getOffsetTicks() % job.getWorkInterval() != 0)\n+        WorkOrderBuild workOrder = job.getWorkOrder();\n+        if (workOrder == null)\n         {\n             return;\n         }\n \n-        WorkOrderBuild wo = job.getWorkOrder();\n-        if(wo == null || job.getColony().getBuilding(wo.getBuildingId()) == null || !job.hasSchematic())\n+        BlockPos pos      = workOrder.getBuildingId();\n+        Building building = worker.getColony().getBuilding(pos);\n+\n+        if (building == null)\n         {\n-            job.complete();\n+            Log.logger.warn(\"Building does not exist - removing build request\");\n+            worker.getColony().getWorkManager().removeWorkOrder(workOrder);\n             return;\n         }\n \n-        //TODO: break this up to make it more readable\n-        switch(job.stage)\n+        String name = building.getStyle() + '/' + workOrder.getUpgradeName();\n+\n+        try\n         {\n-            case CLEAR:\n-                clearStep();\n-                break;\n-            case REQUEST_MATERIALS:\n-                if(!Configurations.builderInfiniteResources)\n-                {\n-                    requestMaterials();\n-                }\n-                job.stage = JobBuilder.Stage.STRUCTURE;\n-                break;\n-            case STRUCTURE:\n-                structureStep();\n-                break;\n-            case DECORATIONS:\n-                decorationStep();\n-                break;\n-            case ENTITIES:\n-                //TODO use iterator to do this overtime\n-                job.getSchematic().getEntities().forEach(this::spawnEntity);\n-                completeBuild();\n-                break;\n-            default:\n-                System.out.println(\"Case not implemented: \" + job.stage.toString());\n+            job.setSchematic(new Schematic(world, name));\n+        }\n+        catch (IllegalStateException e)\n+        {\n+            Log.logger.warn(String.format(\"Schematic: (%s) does not exist - removing build request\", name), e);\n+            job.setSchematic(null);\n+            return;\n         }\n+\n+        job.getSchematic().rotate(building.getRotation());\n+        job.getSchematic().setPosition(pos);\n+        ((BuildingBuilder) getOwnBuilding()).setCleared(false);\n+    }\n+\n+    private AIState startWorkingAtOwnBuilding()\n+    {\n+        if (walkToBuilding())\n+        {\n+            return getState();\n+        }\n+        return BUILDER_CLEAR_STEP;\n     }\n \n     /**\n-     * This method will be overridden by AI implementations\n+     * Will lead the worker to a good position to construct.\n+     *\n+     * @return true if the position has been reached.\n      */\n-    @Override\n-    protected void workOnTask()\n+    private boolean goToConstructionSite()\n     {\n-        //TODO: rework the builder to use workOnTask eventually\n+        if (workFrom == null)\n+        {\n+            workFrom = getWorkingPosition();\n+        }\n+\n+        return walkToBlock(workFrom) || worker.getPosition().distanceSq(workFrom) >= 10;\n     }\n \n-    @Override\n-    public boolean continueExecuting()\n+    /**\n+     * Calculates the working position. Takes a min distance from width and length.\n+     * Then finds the floor level at that distance and then check if it does contain two air levels.\n+     *\n+     * @return BlockPos position to work from.\n+     */\n+    private BlockPos getWorkingPosition()\n     {\n-        return super.continueExecuting() /* <== this.shouldExecute() */ && job.hasSchematic();\n+        //get length or width either is larger.\n+        int          length     = job.getSchematic().getLength();\n+        int          width      = job.getSchematic().getWidth();\n+        int          distance   = width > length ? width : length;\n+        EnumFacing[] directions = {EnumFacing.EAST, EnumFacing.WEST, EnumFacing.NORTH, EnumFacing.SOUTH};\n+\n+        //then get a solid place with two air spaces above it in any direction.\n+        for (EnumFacing direction : directions)\n+        {\n+            BlockPos positionInDirection = getPositionInDirection(direction, distance);\n+            if (!world.getBlockState(positionInDirection.up(AIR_SPACE_ABOVE_TO_CHECK)).getBlock().getMaterial().isSolid()\n+                && !world.getBlockState(positionInDirection.up(AIR_SPACE_ABOVE_TO_CHECK)).getBlock().getMaterial().isLiquid()\n+                && world.getBlockState(positionInDirection).getBlock().getMaterial().isSolid())\n+            {\n+                return positionInDirection;\n+            }\n+        }\n+\n+        //if necessary we can could implement calling getWorkingPosition recursively and add some \"offset\" to the sides.\n+        return job.getSchematic().getPosition();\n     }\n \n-    @Override\n-    public void resetTask()\n+    /**\n+     * Gets a floorPosition in a particular direction\n+     *\n+     * @param facing   the direction\n+     * @param distance the distance\n+     * @return a BlockPos position.\n+     */\n+    private BlockPos getPositionInDirection(EnumFacing facing, int distance)\n     {\n-        super.resetTask();\n-        worker.setCurrentItemOrArmor(0, null);\n+        return getFloor(job.getSchematic().getPosition().offset(facing, distance));\n     }\n \n-    private void clearStep()\n+    /**\n+     * Calculates the floor level\n+     *\n+     * @param position input position\n+     * @return returns BlockPos position with air above\n+     */\n+    private BlockPos getFloor(BlockPos position)\n     {\n-        if(worker.getStatus() != EntityCitizen.Status.GETTING_ITEMS)\n+        //If the position is floating in Air go downwards\n+        if (!world.getBlockState(position).getBlock().getMaterial().isSolid() && !world.getBlockState(position).getBlock().getMaterial().isLiquid())\n         {\n-            if(!worker.isWorkerAtSiteWithMove(job.getSchematic().getPosition(), 3))\n-            {\n-                return;\n-            }\n-            worker.setStatus(EntityCitizen.Status.WORKING);\n+            return getFloor(position.down());\n+        }\n+        //If there is no air above the block go upwards\n+        if (!world.getBlockState(position.up()).getBlock().getMaterial().isSolid() && !world.getBlockState(position.up()).getBlock().getMaterial().isLiquid())\n+        {\n+            return position;\n         }\n+        return getFloor(position.up());\n+    }\n \n-        BlockPos coords = job.getSchematic().getBlockPosition();\n-        int      x      = coords.getX();\n-        int      y      = coords.getY();\n-        int      z      = coords.getZ();\n+    private AIState clearStep()\n+    {\n+        if (((BuildingBuilder) getOwnBuilding()).isCleared())\n+        {\n+            return AIState.BUILDER_STRUCTURE_STEP;\n+        }\n \n-        Block worldBlock = world.getBlockState(coords).getBlock();\n+        BlockPos coordinates = job.getSchematic().getBlockPosition();\n+        Block    worldBlock  = world.getBlockState(coordinates).getBlock();\n \n-        if(worldBlock != Blocks.air && !(worldBlock instanceof AbstractBlockHut) && worldBlock != Blocks.bedrock)\n+        if (worldBlock != Blocks.air && !(worldBlock instanceof AbstractBlockHut) && worldBlock != Blocks.bedrock)\n         {\n-            if(!Configurations.builderInfiniteResources)//We need to deal with materials\n+            //Fill workFrom with the position from where the builder should build.\n+            if (goToConstructionSite())\n             {\n-                if(!handleMaterials(Blocks.air, 0, worldBlock, world.getBlockState(coords))) return;\n+                return this.getState();\n             }\n \n-            worker.setCurrentItemOrArmor(0, null);\n+            worker.faceBlock(coordinates);\n+            if (Configurations.builderInfiniteResources || worldBlock.getMaterial().isLiquid())//We need to deal with materials\n+            {\n+                worker.setCurrentItemOrArmor(0, null);\n \n-            if(!world.setBlockToAir(coords))\n+                if (!world.setBlockToAir(coordinates))\n+                {\n+                    //TODO: create own logger in class\n+                    Log.logger.error(String.format(\"Block break failure at %d, %d, %d\", coordinates.getX(), coordinates.getY(), coordinates.getZ()));\n+                    //TODO handle - for now, just skipping\n+                }\n+                worker.swingItem();\n+            }\n+            else\n             {\n-                //TODO: create own logger in class\n-                Log.logger.error(String.format(\"Block break failure at %d, %d, %d\", x, y, z));\n-                //TODO handle - for now, just skipping\n+                if (!mineBlock(coordinates))\n+                {\n+                    return this.getState();\n+                }\n             }\n-            worker.swingItem();\n         }\n \n-        if(!job.getSchematic().findNextBlockToClear())//method returns false if there is no next block (schematic finished)\n+        if (!job.getSchematic().findNextBlockToClear())//method returns false if there is no next block (schematic finished)\n         {\n-            job.stage = JobBuilder.Stage.STRUCTURE;\n             job.getSchematic().reset();\n             incrementBlock();\n+            ((BuildingBuilder) getOwnBuilding()).setCleared(true);\n+            return AIState.BUILDER_REQUEST_MATERIALS;\n         }\n-        worker.swingItem();\n+        return this.getState();\n     }\n \n-    private void requestMaterials()\n+    private AIState requestMaterials()\n     {\n-        //TODO thread this\n-        while(job.getSchematic().findNextBlock())\n+        //todo as soon as material handling has been implemented this should be set to work!\n+        //We need to deal with materials\n+        if (!Configurations.builderInfiniteResources)\n         {\n-            if(job.getSchematic().doesSchematicBlockEqualWorldBlock())\n+            //TODO thread this\n+            while (job.getSchematic().findNextBlock())\n             {\n-                continue;\n-            }\n+                if (job.getSchematic().doesSchematicBlockEqualWorldBlock())\n+                {\n+                    continue;\n+                }\n \n-            Block block = job.getSchematic().getBlock();\n-            IBlockState metadata = job.getSchematic().getMetadata();\n-            ItemStack itemstack = new ItemStack(block, 1);\n+                Block       block     = job.getSchematic().getBlock();\n+                IBlockState metadata  = job.getSchematic().getMetadata();\n+                ItemStack   itemstack = new ItemStack(block, 1);\n \n-            Block worldBlock = BlockPosUtil.getBlock(world, job.getSchematic().getBlockPosition());\n+                Block worldBlock = BlockPosUtil.getBlock(world, job.getSchematic().getBlockPosition());\n \n-            if(itemstack.getItem() != null && block != null && block != Blocks.air && worldBlock != Blocks.bedrock && !(worldBlock instanceof AbstractBlockHut) && !isBlockFree(block, 0))\n-            {\n-                //TODO add item to prerequisites\n+                if (itemstack.getItem() != null\n+                    && block != null\n+                    && block != Blocks.air\n+                    && worldBlock != Blocks.bedrock\n+                    && !(worldBlock instanceof AbstractBlockHut)\n+                    && !isBlockFree(block, 0))\n+                {\n+                    if (checkOrRequestItems(new ItemStack(block)))\n+                    {\n+                        job.getSchematic().reset();\n+                        return this.getState();\n+                    }\n+                }\n             }\n+            job.getSchematic().reset();\n+            incrementBlock();\n         }\n-        job.getSchematic().reset();\n-        incrementBlock();\n+        return AIState.BUILDER_STRUCTURE_STEP;\n+    }\n \n-        //TODO maybe print needed items, depends on how system works\n+    /**\n+     * Defines blocks that can be built for free\n+     *\n+     * @param block    The block to check if it is free\n+     * @param metadata The metadata of the block\n+     * @return true or false\n+     */\n+    private boolean isBlockFree(Block block, int metadata)\n+    {\n+        return block == null\n+               || BlockUtils.isWater(block.getDefaultState())\n+               || block.equals(Blocks.leaves)\n+               || block.equals(Blocks.leaves2)\n+               || block.equals(Blocks.double_plant) && Utils.testFlag(metadata, 0x08)","path":"src/main/java/com/minecolonies/entity/ai/EntityAIWorkBuilder.java","position":490,"original_position":490,"commit_id":"1f7979668877e3c14985e6a29b6ce313eb4f7d09","original_commit_id":"1f7979668877e3c14985e6a29b6ce313eb4f7d09","user":{"login":"Kostronor","id":644950,"avatar_url":"https://avatars.githubusercontent.com/u/644950?v=3","gravatar_id":"","url":"https://api.github.com/users/Kostronor","html_url":"https://github.com/Kostronor","followers_url":"https://api.github.com/users/Kostronor/followers","following_url":"https://api.github.com/users/Kostronor/following{/other_user}","gists_url":"https://api.github.com/users/Kostronor/gists{/gist_id}","starred_url":"https://api.github.com/users/Kostronor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Kostronor/subscriptions","organizations_url":"https://api.github.com/users/Kostronor/orgs","repos_url":"https://api.github.com/users/Kostronor/repos","events_url":"https://api.github.com/users/Kostronor/events{/privacy}","received_events_url":"https://api.github.com/users/Kostronor/received_events","type":"User","site_admin":false},"body":"![MAJOR](https://raw.githubusercontent.com/SonarCommunity/sonar-github/master/images/severity-major.png) Add parentheses to make the operator precedence explicit. [![rule](https://raw.githubusercontent.com/SonarCommunity/sonar-github/master/images/rule.png)](http://home.kk-sc.de:9000/coding_rules#rule_key=squid%3AS864)\n","created_at":"2016-05-14T21:40:47Z","updated_at":"2016-05-14T21:40:47Z","html_url":"https://github.com/MinecoloniesDevs/Minecolonies/pull/3#discussion_r63282470","pull_request_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/pulls/3","_links":{"self":{"href":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/pulls/comments/63282470"},"html":{"href":"https://github.com/MinecoloniesDevs/Minecolonies/pull/3#discussion_r63282470"},"pull_request":{"href":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/pulls/3"}}},"pull_request":{"url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/pulls/3","id":70103077,"html_url":"https://github.com/MinecoloniesDevs/Minecolonies/pull/3","diff_url":"https://github.com/MinecoloniesDevs/Minecolonies/pull/3.diff","patch_url":"https://github.com/MinecoloniesDevs/Minecolonies/pull/3.patch","issue_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/issues/3","number":3,"state":"open","locked":false,"title":"Minecol 14 builder removes own floor and","user":{"login":"Kostronor","id":644950,"avatar_url":"https://avatars.githubusercontent.com/u/644950?v=3","gravatar_id":"","url":"https://api.github.com/users/Kostronor","html_url":"https://github.com/Kostronor","followers_url":"https://api.github.com/users/Kostronor/followers","following_url":"https://api.github.com/users/Kostronor/following{/other_user}","gists_url":"https://api.github.com/users/Kostronor/gists{/gist_id}","starred_url":"https://api.github.com/users/Kostronor/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Kostronor/subscriptions","organizations_url":"https://api.github.com/users/Kostronor/orgs","repos_url":"https://api.github.com/users/Kostronor/repos","events_url":"https://api.github.com/users/Kostronor/events{/privacy}","received_events_url":"https://api.github.com/users/Kostronor/received_events","type":"User","site_admin":false},"body":"","created_at":"2016-05-14T20:30:02Z","updated_at":"2016-05-14T21:40:48Z","closed_at":null,"merged_at":null,"merge_commit_sha":"dd1339ca6836429fa2441f74717b7a5a0e1b0c63","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/pulls/3/commits","review_comments_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/pulls/3/comments","review_comment_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/pulls/comments{/number}","comments_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/issues/3/comments","statuses_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/statuses/1f7979668877e3c14985e6a29b6ce313eb4f7d09","head":{"label":"MinecoloniesDevs:MINECOL-14-builder-removes-own-floor-and","ref":"MINECOL-14-builder-removes-own-floor-and","sha":"1f7979668877e3c14985e6a29b6ce313eb4f7d09","user":{"login":"MinecoloniesDevs","id":19327260,"avatar_url":"https://avatars.githubusercontent.com/u/19327260?v=3","gravatar_id":"","url":"https://api.github.com/users/MinecoloniesDevs","html_url":"https://github.com/MinecoloniesDevs","followers_url":"https://api.github.com/users/MinecoloniesDevs/followers","following_url":"https://api.github.com/users/MinecoloniesDevs/following{/other_user}","gists_url":"https://api.github.com/users/MinecoloniesDevs/gists{/gist_id}","starred_url":"https://api.github.com/users/MinecoloniesDevs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MinecoloniesDevs/subscriptions","organizations_url":"https://api.github.com/users/MinecoloniesDevs/orgs","repos_url":"https://api.github.com/users/MinecoloniesDevs/repos","events_url":"https://api.github.com/users/MinecoloniesDevs/events{/privacy}","received_events_url":"https://api.github.com/users/MinecoloniesDevs/received_events","type":"Organization","site_admin":false},"repo":{"id":58642151,"name":"Minecolonies","full_name":"MinecoloniesDevs/Minecolonies","owner":{"login":"MinecoloniesDevs","id":19327260,"avatar_url":"https://avatars.githubusercontent.com/u/19327260?v=3","gravatar_id":"","url":"https://api.github.com/users/MinecoloniesDevs","html_url":"https://github.com/MinecoloniesDevs","followers_url":"https://api.github.com/users/MinecoloniesDevs/followers","following_url":"https://api.github.com/users/MinecoloniesDevs/following{/other_user}","gists_url":"https://api.github.com/users/MinecoloniesDevs/gists{/gist_id}","starred_url":"https://api.github.com/users/MinecoloniesDevs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MinecoloniesDevs/subscriptions","organizations_url":"https://api.github.com/users/MinecoloniesDevs/orgs","repos_url":"https://api.github.com/users/MinecoloniesDevs/repos","events_url":"https://api.github.com/users/MinecoloniesDevs/events{/privacy}","received_events_url":"https://api.github.com/users/MinecoloniesDevs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/MinecoloniesDevs/Minecolonies","description":"","fork":false,"url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies","forks_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/forks","keys_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/keys{/key_id}","collaborators_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/teams","hooks_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/hooks","issue_events_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/issues/events{/number}","events_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/events","assignees_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/assignees{/user}","branches_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/branches{/branch}","tags_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/tags","blobs_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/git/refs{/sha}","trees_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/git/trees{/sha}","statuses_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/statuses/{sha}","languages_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/languages","stargazers_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/stargazers","contributors_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/contributors","subscribers_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/subscribers","subscription_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/subscription","commits_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/commits{/sha}","git_commits_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/git/commits{/sha}","comments_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/comments{/number}","issue_comment_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/issues/comments{/number}","contents_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/contents/{+path}","compare_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/compare/{base}...{head}","merges_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/merges","archive_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/downloads","issues_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/issues{/number}","pulls_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/pulls{/number}","milestones_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/milestones{/number}","notifications_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/labels{/name}","releases_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/releases{/id}","deployments_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/deployments","created_at":"2016-05-12T13:04:58Z","updated_at":"2016-05-14T02:37:16Z","pushed_at":"2016-05-14T21:38:29Z","git_url":"git://github.com/MinecoloniesDevs/Minecolonies.git","ssh_url":"git@github.com:MinecoloniesDevs/Minecolonies.git","clone_url":"https://github.com/MinecoloniesDevs/Minecolonies.git","svn_url":"https://github.com/MinecoloniesDevs/Minecolonies","homepage":null,"size":5114,"stargazers_count":1,"watchers_count":1,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":1,"default_branch":"master"}},"base":{"label":"MinecoloniesDevs:master","ref":"master","sha":"07429133ef904aa91f08e03be815c85e15cf4a85","user":{"login":"MinecoloniesDevs","id":19327260,"avatar_url":"https://avatars.githubusercontent.com/u/19327260?v=3","gravatar_id":"","url":"https://api.github.com/users/MinecoloniesDevs","html_url":"https://github.com/MinecoloniesDevs","followers_url":"https://api.github.com/users/MinecoloniesDevs/followers","following_url":"https://api.github.com/users/MinecoloniesDevs/following{/other_user}","gists_url":"https://api.github.com/users/MinecoloniesDevs/gists{/gist_id}","starred_url":"https://api.github.com/users/MinecoloniesDevs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MinecoloniesDevs/subscriptions","organizations_url":"https://api.github.com/users/MinecoloniesDevs/orgs","repos_url":"https://api.github.com/users/MinecoloniesDevs/repos","events_url":"https://api.github.com/users/MinecoloniesDevs/events{/privacy}","received_events_url":"https://api.github.com/users/MinecoloniesDevs/received_events","type":"Organization","site_admin":false},"repo":{"id":58642151,"name":"Minecolonies","full_name":"MinecoloniesDevs/Minecolonies","owner":{"login":"MinecoloniesDevs","id":19327260,"avatar_url":"https://avatars.githubusercontent.com/u/19327260?v=3","gravatar_id":"","url":"https://api.github.com/users/MinecoloniesDevs","html_url":"https://github.com/MinecoloniesDevs","followers_url":"https://api.github.com/users/MinecoloniesDevs/followers","following_url":"https://api.github.com/users/MinecoloniesDevs/following{/other_user}","gists_url":"https://api.github.com/users/MinecoloniesDevs/gists{/gist_id}","starred_url":"https://api.github.com/users/MinecoloniesDevs/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MinecoloniesDevs/subscriptions","organizations_url":"https://api.github.com/users/MinecoloniesDevs/orgs","repos_url":"https://api.github.com/users/MinecoloniesDevs/repos","events_url":"https://api.github.com/users/MinecoloniesDevs/events{/privacy}","received_events_url":"https://api.github.com/users/MinecoloniesDevs/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/MinecoloniesDevs/Minecolonies","description":"","fork":false,"url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies","forks_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/forks","keys_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/keys{/key_id}","collaborators_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/teams","hooks_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/hooks","issue_events_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/issues/events{/number}","events_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/events","assignees_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/assignees{/user}","branches_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/branches{/branch}","tags_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/tags","blobs_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/git/refs{/sha}","trees_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/git/trees{/sha}","statuses_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/statuses/{sha}","languages_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/languages","stargazers_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/stargazers","contributors_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/contributors","subscribers_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/subscribers","subscription_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/subscription","commits_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/commits{/sha}","git_commits_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/git/commits{/sha}","comments_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/comments{/number}","issue_comment_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/issues/comments{/number}","contents_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/contents/{+path}","compare_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/compare/{base}...{head}","merges_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/merges","archive_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/downloads","issues_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/issues{/number}","pulls_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/pulls{/number}","milestones_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/milestones{/number}","notifications_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/labels{/name}","releases_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/releases{/id}","deployments_url":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/deployments","created_at":"2016-05-12T13:04:58Z","updated_at":"2016-05-14T02:37:16Z","pushed_at":"2016-05-14T21:38:29Z","git_url":"git://github.com/MinecoloniesDevs/Minecolonies.git","ssh_url":"git@github.com:MinecoloniesDevs/Minecolonies.git","clone_url":"https://github.com/MinecoloniesDevs/Minecolonies.git","svn_url":"https://github.com/MinecoloniesDevs/Minecolonies","homepage":null,"size":5114,"stargazers_count":1,"watchers_count":1,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":1,"forks":0,"open_issues":1,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/pulls/3"},"html":{"href":"https://github.com/MinecoloniesDevs/Minecolonies/pull/3"},"issue":{"href":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/issues/3"},"comments":{"href":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/issues/3/comments"},"review_comments":{"href":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/pulls/3/comments"},"review_comment":{"href":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/pulls/3/commits"},"statuses":{"href":"https://api.github.com/repos/MinecoloniesDevs/Minecolonies/statuses/1f7979668877e3c14985e6a29b6ce313eb4f7d09"}}}}