Search in sources :

Example 16 with AbstractTileEntityColonyBuilding

use of com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding in project minecolonies by Minecolonies.

the class EntityAIWorkDeliveryman method deliver.

/**
 * Deliver the items to the hut. TODO: Current precondition: The dman's inventory may only consist of the requested itemstack.
 *
 * @return the next state.
 */
private IAIState deliver() {
    final IRequest<? extends IDeliverymanRequestable> currentTask = job.getCurrentTask();
    if (!(currentTask instanceof DeliveryRequest)) {
        // Since prepareDelivery() was called earlier, go dumping first and then restart.
        return DUMPING;
    }
    worker.getCitizenData().setVisibleStatus(DELIVERING);
    worker.getCitizenStatusHandler().setLatestStatus(new TranslationTextComponent("com.minecolonies.coremod.status.delivering"));
    final ILocation targetBuildingLocation = ((Delivery) currentTask.getRequest()).getTarget();
    if (!targetBuildingLocation.isReachableFromLocation(worker.getLocation())) {
        Log.getLogger().info(worker.getCitizenColonyHandler().getColony().getName() + ": " + worker.getName() + ": Can't inter dimension yet: ");
        return START_WORKING;
    }
    if (!worker.isWorkerAtSiteWithMove(targetBuildingLocation.getInDimensionLocation(), MIN_DISTANCE_TO_WAREHOUSE)) {
        setDelay(WALK_DELAY);
        return DELIVERY;
    }
    final TileEntity tileEntity = world.getBlockEntity(targetBuildingLocation.getInDimensionLocation());
    if (!(tileEntity instanceof TileEntityColonyBuilding)) {
        // TODO: Non-Colony deliveries are unsupported yet. Fix that at some point in time.
        job.finishRequest(true);
        return START_WORKING;
    }
    final IBuilding targetBuilding = ((AbstractTileEntityColonyBuilding) tileEntity).getBuilding();
    boolean success = true;
    boolean extracted = false;
    final IItemHandler workerInventory = worker.getInventoryCitizen();
    for (int i = 0; i < workerInventory.getSlots(); i++) {
        if (workerInventory.getStackInSlot(i).isEmpty()) {
            continue;
        }
        final ItemStack stack = workerInventory.extractItem(i, Integer.MAX_VALUE, false);
        if (ItemStackUtils.isEmpty(stack)) {
            continue;
        }
        extracted = true;
        final ItemStack insertionResultStack;
        // TODO: Please only push items into the target that were actually requested.
        if (targetBuilding instanceof AbstractBuilding) {
            insertionResultStack = InventoryUtils.forceItemStackToItemHandler(targetBuilding.getCapability(ITEM_HANDLER_CAPABILITY, null).orElseGet(null), stack, ((IBuilding) targetBuilding)::isItemStackInRequest);
        } else {
            // Buildings that are not inherently part of the request system, but just receive a delivery, cannot have their items replaced.
            // Therefore, the keep-predicate always returns true.
            insertionResultStack = InventoryUtils.forceItemStackToItemHandler(targetBuilding.getCapability(ITEM_HANDLER_CAPABILITY, null).orElseGet(null), stack, itemStack -> true);
        }
        if (!ItemStackUtils.isEmpty(insertionResultStack)) {
            if (ItemStack.matches(insertionResultStack, stack) && worker.getCitizenData() != null) {
                // The replaced stack is the same as the one we tried to put into the inventory.
                // Meaning, replacing failed.
                success = false;
                if (targetBuilding.hasModule(WorkerBuildingModule.class)) {
                    worker.getCitizenData().triggerInteraction(new PosBasedInteraction(new TranslationTextComponent(COM_MINECOLONIES_COREMOD_JOB_DELIVERYMAN_NAMEDCHESTFULL, targetBuilding.getFirstModuleOccurance(WorkerBuildingModule.class).getFirstCitizen().getName()), ChatPriority.IMPORTANT, new TranslationTextComponent(COM_MINECOLONIES_COREMOD_JOB_DELIVERYMAN_CHESTFULL), targetBuilding.getID()));
                } else {
                    worker.getCitizenData().triggerInteraction(new PosBasedInteraction(new TranslationTextComponent(COM_MINECOLONIES_COREMOD_JOB_DELIVERYMAN_CHESTFULL, new StringTextComponent(" :" + targetBuilding.getSchematicName())), ChatPriority.IMPORTANT, new TranslationTextComponent(COM_MINECOLONIES_COREMOD_JOB_DELIVERYMAN_CHESTFULL), targetBuildingLocation.getInDimensionLocation()));
                }
            }
            // Insert the result back into the inventory so we do not lose it.
            workerInventory.insertItem(i, insertionResultStack, false);
        }
    }
    if (!extracted) {
        // This can only happen if the dman's inventory was completely empty.
        // Let the retry-system handle this case.
        worker.decreaseSaturationForContinuousAction();
        worker.getCitizenItemHandler().setHeldItem(Hand.MAIN_HAND, SLOT_HAND);
        job.finishRequest(false);
        // No need to go dumping in this case.
        return START_WORKING;
    }
    worker.getCitizenExperienceHandler().addExperience(1.5D);
    worker.decreaseSaturationForContinuousAction();
    worker.getCitizenItemHandler().setHeldItem(Hand.MAIN_HAND, SLOT_HAND);
    job.finishRequest(true);
    return success ? START_WORKING : DUMPING;
}
Also used : TileEntityRack(com.minecolonies.api.tileentities.TileEntityRack) IItemHandler(net.minecraftforge.items.IItemHandler) IRequest(com.minecolonies.api.colony.requestsystem.request.IRequest) ItemStackUtils(com.minecolonies.api.util.ItemStackUtils) AbstractTileEntityColonyBuilding(com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding) DeliveryRequest(com.minecolonies.coremod.colony.requestsystem.requests.StandardRequests.DeliveryRequest) IWareHouse(com.minecolonies.api.colony.buildings.workerbuildings.IWareHouse) PickupRequest(com.minecolonies.coremod.colony.requestsystem.requests.StandardRequests.PickupRequest) TileEntityColonyBuilding(com.minecolonies.api.tileentities.TileEntityColonyBuilding) PosBasedInteraction(com.minecolonies.coremod.colony.interactionhandling.PosBasedInteraction) TranslationTextComponent(net.minecraft.util.text.TranslationTextComponent) ArrayList(java.util.ArrayList) JobDeliveryman(com.minecolonies.coremod.colony.jobs.JobDeliveryman) ItemStack(net.minecraft.item.ItemStack) IDeliverymanRequestable(com.minecolonies.api.colony.requestsystem.requestable.deliveryman.IDeliverymanRequestable) IAIState(com.minecolonies.api.entity.ai.statemachine.states.IAIState) StringTextComponent(net.minecraft.util.text.StringTextComponent) Hand(net.minecraft.util.Hand) ITEM_HANDLER_CAPABILITY(net.minecraftforge.items.CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) Delivery(com.minecolonies.api.colony.requestsystem.requestable.deliveryman.Delivery) AITarget(com.minecolonies.api.entity.ai.statemachine.AITarget) Log(com.minecolonies.api.util.Log) TICKS_SECOND(com.minecolonies.api.util.constant.Constants.TICKS_SECOND) Constants(com.minecolonies.api.util.constant.Constants) AbstractEntityAIInteract(com.minecolonies.coremod.entity.ai.basic.AbstractEntityAIInteract) TranslationConstants(com.minecolonies.api.util.constant.TranslationConstants) ILocation(com.minecolonies.api.colony.requestsystem.location.ILocation) VisibleCitizenStatus(com.minecolonies.api.entity.citizen.VisibleCitizenStatus) ChatPriority(com.minecolonies.api.colony.interactionhandling.ChatPriority) AbstractBuilding(com.minecolonies.coremod.colony.buildings.AbstractBuilding) StandardInteraction(com.minecolonies.coremod.colony.interactionhandling.StandardInteraction) BlockPos(net.minecraft.util.math.BlockPos) IRequestable(com.minecolonies.api.colony.requestsystem.requestable.IRequestable) AIWorkerState(com.minecolonies.api.entity.ai.statemachine.states.AIWorkerState) Nullable(org.jetbrains.annotations.Nullable) List(java.util.List) WorkerBuildingModule(com.minecolonies.coremod.colony.buildings.modules.WorkerBuildingModule) BuildingDeliveryman(com.minecolonies.coremod.colony.buildings.workerbuildings.BuildingDeliveryman) IBuilding(com.minecolonies.api.colony.buildings.IBuilding) InventoryUtils(com.minecolonies.api.util.InventoryUtils) ResourceLocation(net.minecraft.util.ResourceLocation) TileEntity(net.minecraft.tileentity.TileEntity) ItemStorage(com.minecolonies.api.crafting.ItemStorage) NotNull(org.jetbrains.annotations.NotNull) DeliveryRequest(com.minecolonies.coremod.colony.requestsystem.requests.StandardRequests.DeliveryRequest) IItemHandler(net.minecraftforge.items.IItemHandler) IBuilding(com.minecolonies.api.colony.buildings.IBuilding) AbstractTileEntityColonyBuilding(com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding) TileEntityColonyBuilding(com.minecolonies.api.tileentities.TileEntityColonyBuilding) WorkerBuildingModule(com.minecolonies.coremod.colony.buildings.modules.WorkerBuildingModule) PosBasedInteraction(com.minecolonies.coremod.colony.interactionhandling.PosBasedInteraction) TileEntity(net.minecraft.tileentity.TileEntity) ILocation(com.minecolonies.api.colony.requestsystem.location.ILocation) AbstractTileEntityColonyBuilding(com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding) TranslationTextComponent(net.minecraft.util.text.TranslationTextComponent) StringTextComponent(net.minecraft.util.text.StringTextComponent) Delivery(com.minecolonies.api.colony.requestsystem.requestable.deliveryman.Delivery) ItemStack(net.minecraft.item.ItemStack) AbstractBuilding(com.minecolonies.coremod.colony.buildings.AbstractBuilding)

Example 17 with AbstractTileEntityColonyBuilding

use of com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding in project minecolonies by ldtteam.

the class AbstractBuilding method onDestroyed.

@Override
public void onDestroyed() {
    final AbstractTileEntityColonyBuilding tileEntityNew = this.getTileEntity();
    final World world = colony.getWorld();
    final Block block = world.getBlockState(this.getPosition()).getBlock();
    if (tileEntityNew != null) {
        InventoryUtils.dropItemHandler(tileEntityNew.getInventory(), world, tileEntityNew.getPosition().getX(), tileEntityNew.getPosition().getY(), tileEntityNew.getPosition().getZ());
        world.updateNeighbourForOutputSignal(this.getPosition(), block);
    }
    ChunkDataHelper.claimColonyChunks(colony, false, this.getID(), getClaimRadius(getBuildingLevel()));
    ConstructionTapeHelper.removeConstructionTape(getCorners(), world);
    getModules(IBuildingEventsModule.class).forEach(IBuildingEventsModule::onDestroyed);
}
Also used : AbstractTileEntityColonyBuilding(com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding) AirBlock(net.minecraft.block.AirBlock) Block(net.minecraft.block.Block) World(net.minecraft.world.World)

Example 18 with AbstractTileEntityColonyBuilding

use of com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding in project minecolonies by ldtteam.

the class ItemResourceScroll method useOn.

/**
 * Used when clicking on block in world.
 *
 * @param ctx the context of use.
 * @return the result
 */
@Override
@NotNull
public ActionResultType useOn(ItemUseContext ctx) {
    final ItemStack scroll = ctx.getPlayer().getItemInHand(ctx.getHand());
    final CompoundNBT compound = checkForCompound(scroll);
    TileEntity entity = ctx.getLevel().getBlockEntity(ctx.getClickedPos());
    if (entity instanceof TileEntityColonyBuilding) {
        compound.putInt(TAG_COLONY_ID, ((AbstractTileEntityColonyBuilding) entity).getColonyId());
        BlockPosUtil.write(compound, TAG_BUILDER, ((AbstractTileEntityColonyBuilding) entity).getPosition());
        if (!ctx.getLevel().isClientSide) {
            LanguageHandler.sendPlayerMessage(ctx.getPlayer(), TranslationConstants.COM_MINECOLONIES_SCROLL_BUILDER_SET, ((AbstractTileEntityColonyBuilding) entity).getColony().getName());
        }
    } else if (ctx.getLevel().isClientSide) {
        openWindow(compound, ctx.getPlayer());
    }
    return ActionResultType.SUCCESS;
}
Also used : TileEntity(net.minecraft.tileentity.TileEntity) CompoundNBT(net.minecraft.nbt.CompoundNBT) AbstractTileEntityColonyBuilding(com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding) AbstractTileEntityColonyBuilding(com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding) TileEntityColonyBuilding(com.minecolonies.api.tileentities.TileEntityColonyBuilding) ItemStack(net.minecraft.item.ItemStack) NotNull(org.jetbrains.annotations.NotNull)

Example 19 with AbstractTileEntityColonyBuilding

use of com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding in project minecolonies by ldtteam.

the class ItemClipboard method useOn.

@Override
@NotNull
public ActionResultType useOn(final ItemUseContext ctx) {
    final ItemStack clipboard = ctx.getPlayer().getItemInHand(ctx.getHand());
    final CompoundNBT compound = checkForCompound(clipboard);
    final TileEntity entity = ctx.getLevel().getBlockEntity(ctx.getClickedPos());
    if (entity instanceof TileEntityColonyBuilding) {
        compound.putInt(TAG_COLONY, ((AbstractTileEntityColonyBuilding) entity).getColonyId());
        if (!ctx.getLevel().isClientSide) {
            LanguageHandler.sendPlayerMessage(ctx.getPlayer(), TranslationConstants.COM_MINECOLONIES_CLIPBOARD_COLONY_SET, ((AbstractTileEntityColonyBuilding) entity).getColony().getName());
        }
    } else if (ctx.getLevel().isClientSide) {
        openWindow(compound, ctx.getLevel(), ctx.getPlayer());
    }
    return ActionResultType.SUCCESS;
}
Also used : TileEntity(net.minecraft.tileentity.TileEntity) CompoundNBT(net.minecraft.nbt.CompoundNBT) AbstractTileEntityColonyBuilding(com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding) AbstractTileEntityColonyBuilding(com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding) TileEntityColonyBuilding(com.minecolonies.api.tileentities.TileEntityColonyBuilding) ItemStack(net.minecraft.item.ItemStack) NotNull(org.jetbrains.annotations.NotNull)

Example 20 with AbstractTileEntityColonyBuilding

use of com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding in project minecolonies by ldtteam.

the class CreateColonyMessage method onExecute.

@Override
public void onExecute(final NetworkEvent.Context ctxIn, final boolean isLogicalServer) {
    final ServerPlayerEntity sender = ctxIn.getSender();
    final World world = ctxIn.getSender().level;
    if (sender == null) {
        return;
    }
    if (sender.getStats().getValue(Stats.ITEM_USED.get(ModItems.supplyChest)) <= 0 && !sender.isCreative()) {
        LanguageHandler.sendPlayerMessage(sender, "com.minecolonies.coremod.supplyneed");
        return;
    }
    final IColony colony = IColonyManager.getInstance().getClosestColony(world, townHall);
    String style = Constants.DEFAULT_STYLE;
    final TileEntity tileEntity = world.getBlockEntity(townHall);
    if (!(tileEntity instanceof TileEntityColonyBuilding)) {
        LanguageHandler.sendPlayerMessage(sender, "com.minecolonies.coremod.gui.colony.create.notileentity");
        return;
    }
    if (!((AbstractTileEntityColonyBuilding) tileEntity).getStyle().isEmpty()) {
        style = ((AbstractTileEntityColonyBuilding) tileEntity).getStyle();
    }
    if (MineColonies.getConfig().getServer().restrictColonyPlacement.get()) {
        final double spawnDistance = Math.sqrt(BlockPosUtil.getDistanceSquared2D(townHall, ((ServerWorld) world).getSharedSpawnPos()));
        if (spawnDistance < MineColonies.getConfig().getServer().minDistanceFromWorldSpawn.get()) {
            if (!world.isClientSide) {
                LanguageHandler.sendPlayerMessage(sender, CANT_PLACE_COLONY_TOO_CLOSE_TO_SPAWN, MineColonies.getConfig().getServer().minDistanceFromWorldSpawn.get());
            }
            return;
        } else if (spawnDistance > MineColonies.getConfig().getServer().maxDistanceFromWorldSpawn.get()) {
            if (!world.isClientSide) {
                LanguageHandler.sendPlayerMessage(sender, CANT_PLACE_COLONY_TOO_FAR_FROM_SPAWN, MineColonies.getConfig().getServer().maxDistanceFromWorldSpawn.get());
            }
            return;
        }
    }
    if (colony != null && !IColonyManager.getInstance().isFarEnoughFromColonies(world, townHall)) {
        LanguageHandler.sendPlayerMessage(sender, "com.minecolonies.coremod.gui.colony.denied.tooclose", colony.getName());
        return;
    }
    final IColony ownedColony = IColonyManager.getInstance().getIColonyByOwner(world, sender);
    if (ownedColony == null) {
        IColonyManager.getInstance().createColony(world, townHall, sender, style);
        IColonyManager.getInstance().getIColonyByOwner(world, sender).getBuildingManager().addNewBuilding((TileEntityColonyBuilding) tileEntity, world);
        LanguageHandler.sendPlayerMessage((PlayerEntity) sender, "com.minecolonies.coremod.progress.colony_founded");
        return;
    }
    LanguageHandler.sendPlayerMessage((PlayerEntity) sender, "com.minecolonies.coremod.gui.colony.create.failed");
}
Also used : TileEntity(net.minecraft.tileentity.TileEntity) ServerWorld(net.minecraft.world.server.ServerWorld) AbstractTileEntityColonyBuilding(com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding) AbstractTileEntityColonyBuilding(com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding) TileEntityColonyBuilding(com.minecolonies.api.tileentities.TileEntityColonyBuilding) IColony(com.minecolonies.api.colony.IColony) ServerPlayerEntity(net.minecraft.entity.player.ServerPlayerEntity) ServerWorld(net.minecraft.world.server.ServerWorld) World(net.minecraft.world.World)

Aggregations

AbstractTileEntityColonyBuilding (com.minecolonies.api.tileentities.AbstractTileEntityColonyBuilding)20 TileEntity (net.minecraft.tileentity.TileEntity)16 TileEntityColonyBuilding (com.minecolonies.api.tileentities.TileEntityColonyBuilding)12 ItemStack (net.minecraft.item.ItemStack)8 NotNull (org.jetbrains.annotations.NotNull)8 CompoundNBT (net.minecraft.nbt.CompoundNBT)6 IBuilding (com.minecolonies.api.colony.buildings.IBuilding)4 World (net.minecraft.world.World)4 AirBlock (net.minecraft.block.AirBlock)3 BlockPos (net.minecraft.util.math.BlockPos)3 IBlueprintDataProvider (com.ldtteam.structurize.blocks.interfaces.IBlueprintDataProvider)2 PlacementSettings (com.ldtteam.structurize.util.PlacementSettings)2 AbstractBlockHut (com.minecolonies.api.blocks.AbstractBlockHut)2 IColony (com.minecolonies.api.colony.IColony)2 IWareHouse (com.minecolonies.api.colony.buildings.workerbuildings.IWareHouse)2 ChatPriority (com.minecolonies.api.colony.interactionhandling.ChatPriority)2 ILocation (com.minecolonies.api.colony.requestsystem.location.ILocation)2 IRequest (com.minecolonies.api.colony.requestsystem.request.IRequest)2 IRequestable (com.minecolonies.api.colony.requestsystem.requestable.IRequestable)2 Delivery (com.minecolonies.api.colony.requestsystem.requestable.deliveryman.Delivery)2