/* * This function is used to determine if the player clicked on the inside of a solid wooden box. * * Returns NPCHouse of what you clicked on, whether it's a real building or not. The returned * NPCHouse has a boolean to indicate if it is a valid house or not. */ public static NPCHouse isBox(World worldIn, BlockPos pos, EnumFacing side) { BlockPos une = pos, unw = pos, use = pos, usw = pos, dne = pos, dnw = pos, dse = pos, dsw = pos; boolean isBuilding = false; // D-U-N-S-W-E assess: switch (side.getIndex()) { case 0: // assume ceiling // while not wall && wood, go in direction to find wall // know is ceiling, so we can us a block at least 2 below && can only click ceiling from // inside, so one in any Cardinal direction can be assumed as wood for wall checks // move east and west, checking if wall with 2 blocks down and 1 block north (neCorner une = pos.north().east(); unw = pos.north().west(); use = pos.south().east(); usw = pos.south().west(); // make sure all start corners are actually wood, else fail if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, usw))) { isBuilding = false; break assess; } // these are clearly not wooden, but we need them to check for walls, when they become // wooden, we have found walls dne = une.down(); dnw = unw.down(); dse = use.down(); dsw = usw.down(); if ((BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dnw) && BlockHelper.isWooden(worldIn, dse) && BlockHelper.isWooden(worldIn, dsw))) { isBuilding = false; break assess; } // move corners to find walls in order, north, south, east, west while (!BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)) { // if we're no longer looking at wood, then it's not a domicile, so fail if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, unw))) { isBuilding = false; break assess; } une = une.north(); unw = unw.north(); dne = dne.north(); dnw = dnw.north(); } while (!BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)) { // if we're no longer looking at wood, then it's not a domicile, so fail if (!(BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, usw))) { isBuilding = false; break assess; } use = use.south(); usw = usw.south(); dse = dse.south(); dsw = dsw.south(); } while (!BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)) { // if we're no longer looking at wood, then it's not a domicile, so fail if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, use))) { isBuilding = false; break assess; } une = une.east(); use = use.east(); dne = dne.east(); dse = dse.east(); } while (!BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw)) { // if we're no longer looking at wood, then it's not a domicile, so fail if (!(BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, usw))) { isBuilding = false; break assess; } unw = unw.west(); usw = usw.west(); dnw = dnw.west(); dsw = dsw.west(); } // We now have the real upper corners of the building, let's find out if we have a floor! // :) while (!BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)) { if (!(BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dnw) && BlockHelper.isWooden(worldIn, dse) && BlockHelper.isWooden(worldIn, dsw))) { // for some reason it's going past all of them and I've no f*****g clue why. isBuilding = false; break assess; } dne = dne.down(); dnw = dnw.down(); dse = dse.down(); dsw = dsw.down(); } // This should be all of our corners. Let's run another check on every wall and floor just // to make sure its' not missing pieces on us. :D if ((BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw) && BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw) && BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw) && BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw) && BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse) && BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw))) { isBuilding = true; break assess; } isBuilding = false; break assess; case 1: // assume floor dne = pos.north().east(); dnw = pos.north().west(); dse = pos.south().east(); dsw = pos.south().west(); if (!(BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dnw) && BlockHelper.isWooden(worldIn, dse) && BlockHelper.isWooden(worldIn, dsw))) { isBuilding = false; break assess; } une = dne.up(); unw = dnw.up(); use = dse.up(); usw = dsw.up(); if ((BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, usw))) { isBuilding = false; break assess; } // Start finding Walls in order: N-S-E-W while (!BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)) { if (!(BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dnw))) { isBuilding = false; break assess; } une = une.north(); unw = unw.north(); dne = dne.north(); dnw = dnw.north(); } while (!BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)) { if (!(BlockHelper.isWooden(worldIn, dse) && BlockHelper.isWooden(worldIn, dsw))) { isBuilding = false; break assess; } use = use.south(); usw = usw.south(); dse = dse.south(); dsw = dsw.south(); } while (!BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)) { if (!(BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dse))) { isBuilding = false; break assess; } une = une.east(); use = use.east(); dne = dne.east(); dse = dse.east(); } while (!BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw)) { if (!(BlockHelper.isWooden(worldIn, dnw) && BlockHelper.isWooden(worldIn, dsw))) { isBuilding = false; break assess; } unw = unw.west(); usw = usw.west(); dnw = dnw.west(); dsw = dsw.west(); } // Find the Roof! while (!BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)) { if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, usw))) { isBuilding = false; break assess; } une = une.up(); unw = unw.up(); use = use.up(); usw = usw.up(); } if ((BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw) && BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw) && BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw) && BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw) && BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse) && BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw))) { isBuilding = true; break assess; } isBuilding = false; break assess; case 2: // assume ewWall (North facing side) use = pos.up().east(); usw = pos.up().west(); dse = pos.down().east(); dsw = pos.down().west(); if (!(BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, usw) && BlockHelper.isWooden(worldIn, dse) && BlockHelper.isWooden(worldIn, dsw))) { isBuilding = false; break assess; } une = use.north(); unw = usw.north(); dne = dse.north(); dnw = dsw.north(); if ((BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dnw))) { isBuilding = false; break assess; } // First, we check Ceiling and Floor while (!BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)) { if (!(BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, usw))) { isBuilding = false; break assess; } une = une.up(); unw = unw.up(); use = use.up(); usw = usw.up(); } while (!BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)) { if (!(BlockHelper.isWooden(worldIn, dse) && BlockHelper.isWooden(worldIn, dsw))) { isBuilding = false; break assess; } dne = dne.down(); dnw = dnw.down(); dse = dse.down(); dsw = dsw.down(); } // Now we check the Eastern and Western Walls while (!BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)) { if (!(BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, dse))) { isBuilding = false; break assess; } une = une.east(); use = use.east(); dne = dne.east(); dse = dse.east(); } while (!BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw)) { if (!(BlockHelper.isWooden(worldIn, usw) && BlockHelper.isWooden(worldIn, dsw))) { isBuilding = false; break assess; } unw = unw.west(); usw = usw.west(); dnw = dnw.west(); dsw = dsw.west(); } // Finally, we check for the North Wall while (!BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)) { if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dnw))) { isBuilding = false; break assess; } une = une.north(); unw = unw.north(); dne = dne.north(); dnw = dnw.north(); } if ((BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw) && BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw) && BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw) && BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw) && BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse) && BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw))) { isBuilding = true; break assess; } isBuilding = false; break assess; case 3: // assume ewWall (South facing Wall - North wall of room) une = pos.up().east(); unw = pos.up().west(); dne = pos.down().east(); dnw = pos.down().west(); if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dnw))) { isBuilding = false; break assess; } use = une.south(); usw = unw.south(); dse = dne.south(); dsw = dnw.south(); if ((BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, usw) && BlockHelper.isWooden(worldIn, dse) && BlockHelper.isWooden(worldIn, dsw))) { isBuilding = false; break assess; } // First, we check Ceiling and Floor while (!BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)) { if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, unw))) { isBuilding = false; break assess; } une = une.up(); unw = unw.up(); use = use.up(); usw = usw.up(); } while (!BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)) { if (!(BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dnw))) { isBuilding = false; break assess; } dne = dne.down(); dnw = dnw.down(); dse = dse.down(); dsw = dsw.down(); } // Now we check the Eastern and Western Walls while (!BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)) { if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, dne))) { isBuilding = false; break assess; } une = une.east(); use = use.east(); dne = dne.east(); dse = dse.east(); } while (!BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw)) { if (!(BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, dnw))) { isBuilding = false; break assess; } unw = unw.west(); usw = usw.west(); dnw = dnw.west(); dsw = dsw.west(); } // Finally, we check for the South Wall while (!BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)) { if (!(BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, usw) && BlockHelper.isWooden(worldIn, dse) && BlockHelper.isWooden(worldIn, dsw))) { isBuilding = false; break assess; } use = use.south(); usw = usw.south(); dse = dse.south(); dsw = dsw.south(); } if ((BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw) && BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw) && BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw) && BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw) && BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse) && BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw))) { isBuilding = true; break assess; } isBuilding = false; break assess; case 4: // assume nsWall (West Facing Wall - Eastern wall of room) une = pos.up().north(); use = pos.up().south(); dne = pos.down().north(); dse = pos.down().south(); if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dse))) { isBuilding = false; break assess; } unw = une.west(); usw = use.west(); dnw = dne.west(); dsw = dse.west(); if ((BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, usw) && BlockHelper.isWooden(worldIn, dnw) && BlockHelper.isWooden(worldIn, dsw))) { isBuilding = false; break assess; } // First we check the Ceiling and Floor // First, we check Ceiling and Floor while (!BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)) { if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, use))) { isBuilding = false; break assess; } une = une.up(); unw = unw.up(); use = use.up(); usw = usw.up(); } while (!BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)) { if (!(BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dse))) { isBuilding = false; break assess; } dne = dne.down(); dnw = dnw.down(); dse = dse.down(); dsw = dsw.down(); } // Next we are gonna check the North and South Walls while (!BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)) { if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, dne))) { isBuilding = false; break assess; } une = une.north(); unw = unw.north(); dne = dne.north(); dnw = dnw.north(); } while (!BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)) { if (!(BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, dse))) { isBuilding = false; break assess; } use = use.south(); usw = usw.south(); dse = dse.south(); dsw = dsw.south(); } // Finally, we move West! while (!BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw)) { if (!(BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, usw) && BlockHelper.isWooden(worldIn, dnw) && BlockHelper.isWooden(worldIn, dsw))) { isBuilding = false; break assess; } unw = unw.west(); usw = usw.west(); dnw = dnw.west(); dsw = dsw.west(); } if ((BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw) && BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw) && BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw) && BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw) && BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse) && BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw))) { isBuilding = true; break assess; } isBuilding = false; break assess; case 5: // assume nsWall (East Facing Wall - Western wall of room) unw = pos.up().north(); usw = pos.up().south(); dnw = pos.down().north(); dsw = pos.down().south(); if (!(BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, usw) && BlockHelper.isWooden(worldIn, dnw) && BlockHelper.isWooden(worldIn, dsw))) { isBuilding = false; break assess; } une = unw.east(); use = usw.east(); dne = dnw.east(); dse = dsw.east(); if ((BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dse))) { isBuilding = false; break assess; } // First we check the Ceiling and Floor // First, we check Ceiling and Floor while (!BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw)) { if (!(BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, usw))) { isBuilding = false; break assess; } une = une.up(); unw = unw.up(); use = use.up(); usw = usw.up(); } while (!BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw)) { if (!(BlockHelper.isWooden(worldIn, dnw) && BlockHelper.isWooden(worldIn, dsw))) { isBuilding = false; break assess; } dne = dne.down(); dnw = dnw.down(); dse = dse.down(); dsw = dsw.down(); } // Next we are gonna check the North and South Walls while (!BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw)) { if (!(BlockHelper.isWooden(worldIn, unw) && BlockHelper.isWooden(worldIn, dnw))) { isBuilding = false; break assess; } une = une.north(); unw = unw.north(); dne = dne.north(); dnw = dnw.north(); } while (!BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw)) { if (!(BlockHelper.isWooden(worldIn, usw) && BlockHelper.isWooden(worldIn, dsw))) { isBuilding = false; break assess; } use = use.south(); usw = usw.south(); dse = dse.south(); dsw = dsw.south(); } // Finally, we move East! while (!BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse)) { if (!(BlockHelper.isWooden(worldIn, une) && BlockHelper.isWooden(worldIn, use) && BlockHelper.isWooden(worldIn, dne) && BlockHelper.isWooden(worldIn, dse))) { isBuilding = false; break assess; } une = une.east(); use = use.east(); dne = dne.east(); dse = dse.east(); } if ((BlockHelper.isSolidPlatform(worldIn, une, unw, use, usw) && BlockHelper.isSolidPlatform(worldIn, dne, dnw, dse, dsw) && BlockHelper.isSolidEWWall(worldIn, une, unw, dne, dnw) && BlockHelper.isSolidEWWall(worldIn, use, usw, dse, dsw) && BlockHelper.isSolidNSWall(worldIn, une, use, dne, dse) && BlockHelper.isSolidNSWall(worldIn, unw, usw, dnw, dsw))) { isBuilding = true; break assess; } isBuilding = false; break assess; } NPCHouse house = new NPCHouse(unw, une, usw, use, dnw, dne, dsw, dse, isBuilding); return house; }