类net.minecraftforge.common.util.LazyOptional源码实例Demo

下面列出了怎么用net.minecraftforge.common.util.LazyOptional的API类实例代码及写法,或者点击链接到github查看源代码。

源代码1 项目: patchwork-api   文件: CapabilityDispatcher.java
@Nonnull
@Override
public <T> LazyOptional<T> getCapability(Capability<T> cap, @Nullable Direction side) {
	for (ICapabilityProvider provider : providers) {
		LazyOptional<T> ret = provider.getCapability(cap, side);

		//noinspection ConstantConditions
		if (ret == null) {
			throw new RuntimeException(
					String.format(
							"Provider %s.getCapability() returned null; return LazyOptional.empty() instead!",
							provider.getClass().getTypeName()
					)
			);
		}

		if (ret.isPresent()) {
			return ret;
		}
	}

	return LazyOptional.empty();
}
 
源代码2 项目: CodeChickenLib   文件: CapabilityCache.java
/**
 * Notifies {@link CapabilityCache} of a {@link Block#onNeighborChange} event.<br/>
 * Marks all empty capabilities provided by <code>from</code> block, to be re-cached
 * next query.
 *
 * @param from The from position.
 */
public void onNeighborChanged(BlockPos from) {
    if (world == null || pos == null) {
        return;
    }
    BlockPos offset = from.subtract(pos);
    int diff = MathHelper.absSum(offset);
    int side = MathHelper.toSide(offset);
    if (side < 0 || diff != 1) {
        return;
    }
    Direction sideChanged = Direction.BY_INDEX[side];

    Iterables.concat(selfCache.entrySet(), getCacheForSide(sideChanged).entrySet()).forEach(entry -> {
        Object2IntPair<LazyOptional<?>> pair = entry.getValue();
        if (pair.getKey() != null && !pair.getKey().isPresent()) {
            pair.setKey(null);
            pair.setValue(ticks);
        }
    });
}
 
源代码3 项目: CodeChickenLib   文件: CapabilityCache.java
/**
 * Gets a capability from the block in <code>to</code> direction from {@link CapabilityCache}'s
 * position. For example, calling this with <code>NORTH</code>, will get a capability from the block
 * IN <code>NORTH</code> direction on ITS <code>SOUTH</code> face.
 *
 * @param capability The capability to get.
 * @param to         The direction to ask.
 * @return A {@link LazyOptional} of the capability, may be empty.
 */
public <T> LazyOptional<T> getCapability(Capability<T> capability, Direction to) {
    Objects.requireNonNull(capability, "Null capability.");
    if (world == null || pos == null) {
        return LazyOptional.empty().cast();
    }
    Map<Capability<?>, Object2IntPair<LazyOptional<?>>> sideCache = getCacheForSide(to);
    Object2IntPair<LazyOptional<?>> cache = sideCache.get(capability);
    if (cache == null) {
        cache = new Object2IntPair<>(null, ticks);
        sideCache.put(capability, cache);
        return tryReCache(capability, to, cache).cast();
    }
    LazyOptional<?> lookup = cache.getKey();
    if (lookup == null || !lookup.isPresent()) {
        return tryReCache(capability, to, cache).cast();
    }
    return lookup.cast();
}
 
源代码4 项目: CodeChickenLib   文件: CapabilityCache.java
private LazyOptional<?> tryReCache(Capability<?> capability, Direction to, Object2IntPair<LazyOptional<?>> cache) {
    boolean isFirst = cache.getKey() == null;
    if (isFirst || !cache.getKey().isPresent()) {
        if (isFirst || cache.getValue() + waitTicks <= ticks) {
            LazyOptional<?> lookup = requestCapability(capability, to);
            if (lookup.isPresent()) {
                cache.setKey(lookup);
                cache.setValue(ticks);
                lookup.addListener(l -> {//TODO, probably not needed? we check every lookup anyway..
                    //When the LazyOptional notifies us that its gone,
                    //set the cache to empty, and mark ticks.
                    cache.setKey(LazyOptional.empty());
                    cache.setValue(ticks);
                });
            } else {
                cache.setKey(LazyOptional.empty());
                cache.setValue(ticks);
            }
        }
    }
    return cache.getKey();
}
 
源代码5 项目: MiningGadgets   文件: ModificationTable.java
@Override
public void onReplaced(BlockState state, World worldIn, BlockPos pos, BlockState newState, boolean isMoving) {
    if (newState.getBlock() != this) {
        TileEntity tileEntity = worldIn.getTileEntity(pos);
        if (tileEntity != null) {
            LazyOptional<IItemHandler> cap = tileEntity.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY);
            cap.ifPresent(handler -> {
                for(int i = 0; i < handler.getSlots(); ++i) {
                    InventoryHelper.spawnItemStack(worldIn, pos.getX(), pos.getY(), pos.getZ(), handler.getStackInSlot(i));
                }
            });
        }
        super.onReplaced(state, worldIn, pos, newState, isMoving);
    }
}
 
@Nonnull
@Override
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
    if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
        return handler.cast();
    }
    return super.getCapability(cap, side);
}
 
源代码7 项目: EnderStorage   文件: TileEnderChest.java
@Nonnull
@Override
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
    if (!removed && cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) {
        return itemHandler.cast();
    }
    return super.getCapability(cap, side);
}
 
源代码8 项目: EnderStorage   文件: TileEnderTank.java
@Override
public void onFrequencySet() {
    if (world == null) {
        return;
    }
    if (!world.isRemote) {
        liquid_state.setFrequency(frequency);
    }
    fluidHandler.invalidate();
    fluidHandler = LazyOptional.of(this::getStorage);
}
 
源代码9 项目: EnderStorage   文件: TileEnderTank.java
@Nonnull
@Override
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
    if (!removed && cap == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY) {
        return fluidHandler.cast();
    }
    return super.getCapability(cap, side);
}
 
源代码10 项目: CodeChickenLib   文件: SimpleCapProvider.java
@Nonnull
@Override
public <R> LazyOptional<R> getCapability(@Nonnull Capability<R> cap, @Nullable Direction side) {
    if (capability == cap) {
        return instanceOpt.cast();
    }
    return null;
}
 
源代码11 项目: CodeChickenLib   文件: CapabilityCache.java
private LazyOptional<?> requestCapability(Capability<?> capability, Direction to) {
    TileEntity tile = world.getTileEntity(pos.offset(to));
    Direction inverse = to == null ? null : to.getOpposite();
    if (tile != null) {
        return tile.getCapability(capability, inverse);
    }
    return LazyOptional.empty();
}
 
源代码12 项目: Survivalist   文件: ChoppingBlockRenderer.java
@Override
public void render(ChoppingBlockTileEntity te, float partialTicks, MatrixStack matrixStack, IRenderTypeBuffer buffer, int p_225616_5_, int p_225616_6_)
{
    BlockState state = te.getWorld().getBlockState(te.getPos());
    if (!(state.getBlock() instanceof ChoppingBlock))
        return;

    //if (destroyStage < 0)
    {
        matrixStack.push();

        ItemRenderer itemRenderer = mc.getItemRenderer();

        LazyOptional<IItemHandler> linv = te.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY);
        linv.ifPresent((inv) -> {
            ItemStack stack = inv.getStackInSlot(0);
            if (stack.getCount() > 0)
            {
                matrixStack.push();
                matrixStack.translate(0.5, 0.5, 0.5);

                matrixStack.translate(0, -4.5 / 16.0f, 0);
                matrixStack.scale(2, 2, 2);

                IBakedModel ibakedmodel = itemRenderer.getItemModelWithOverrides(stack, te.getWorld(), (LivingEntity) null);
                itemRenderer.renderItem(stack, ItemCameraTransforms.TransformType.GROUND, true, matrixStack, buffer, p_225616_5_, p_225616_6_, ibakedmodel);
                /*int breakStage = te.getBreakStage();
                if (breakStage >= 0)
                {
                    renderItem(stack, ItemCameraTransforms.TransformType.GROUND, breakStage);
                }*/

                matrixStack.pop();
            }
        });

        matrixStack.pop();
    }
}
 
源代码13 项目: Survivalist   文件: ChoppingBlockTileEntity.java
@Override
@Nonnull
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side)
{
    if (cap == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
        return slotInventoryGetter.cast();
    return super.getCapability(cap, side);
}
 
源代码14 项目: Survivalist   文件: SawmillTileEntity.java
@Override
public <T> LazyOptional<T> getCapability(Capability<T> capability, @Nullable Direction facing)
{
    if (capability == ITEMS_CAP)
    {
        if (facing == Direction.UP) return top_provider.cast();
        if (facing == Direction.DOWN) return bottom_provider.cast();
        if (facing != null) return sides_provider.cast();
        return combined_provider.cast();
    }

    return super.getCapability(capability, facing);
}
 
源代码15 项目: Survivalist   文件: ItemBreakingTracker.java
@SubscribeEvent
public void attachCapabilities(AttachCapabilitiesEvent<Entity> e)
{
    if (!ConfigManager.SERVER.enableScraping.get())
        return;
    final Entity entity = e.getObject();

    if (!(entity instanceof ServerPlayerEntity))
        return;

    if (entity.world == null || entity.world.isRemote)
        return;

    e.addCapability(PROP_KEY, new ICapabilityProvider()
    {
        ItemBreakingTracker cap = new ItemBreakingTracker();
        LazyOptional<ItemBreakingTracker> cap_provider = LazyOptional.of(() -> cap);

        {
            cap.init(entity, entity.world);
        }

        @SuppressWarnings("unchecked")
        @Override
        public <T> LazyOptional<T> getCapability(Capability<T> capability, @Nullable Direction facing)
        {
            if (capability == TRACKER)
                return cap_provider.cast();
            return LazyOptional.empty();
        }
    });
}
 
源代码16 项目: Survivalist   文件: DryingRackTileEntity.java
@Override
public <T> LazyOptional<T> getCapability(Capability<T> capability, @Nullable Direction facing)
{
    if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY)
        return itemsProvider.cast();
    return super.getCapability(capability, facing);
}
 
源代码17 项目: patchwork-api   文件: CapabilityProvider.java
@Override
@Nonnull
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
	final CapabilityDispatcher disp = getCapabilities();
	return !valid || disp == null ? LazyOptional.empty() : disp.getCapability(cap, side);
}
 
源代码18 项目: patchwork-api   文件: ICapabilityProvider.java
@Nonnull
default <T> LazyOptional<T> getCapability(@Nonnull final Capability<T> cap) {
	return getCapability(cap, null);
}
 
源代码19 项目: patchwork-api   文件: Capability.java
public @Nonnull <R> LazyOptional<R> orEmpty(Capability<R> toCheck, LazyOptional<T> inst) {
	return this == toCheck ? inst.cast() : LazyOptional.empty();
}
 
源代码20 项目: patchwork-api   文件: CapabilityProviderHolder.java
@Nonnull
default <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
	return getCapabilityProvider().getCapability(cap, side);
}
 
源代码21 项目: patchwork-api   文件: CapabilityProviderHolder.java
@Nonnull
default <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap) {
	return getCapabilityProvider().getCapability(cap);
}
 
源代码22 项目: MiningGadgets   文件: CapabilityEnergyProvider.java
@Nonnull
@Override
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
    return cap == CapabilityEnergy.ENERGY ? capability.cast() : LazyOptional.empty();
}
 
源代码23 项目: EnderStorage   文件: TileEnderChest.java
@Override
public void onFrequencySet() {
    itemHandler.invalidate();
    itemHandler = LazyOptional.of(() -> new InvWrapper(getStorage()));
}
 
源代码24 项目: CodeChickenLib   文件: SimpleCapProvider.java
public SimpleCapProvider(Capability<T> capability, T instance) {
    this.capability = capability;
    this.instance = instance;
    instanceOpt = LazyOptional.of(() -> this.instance);
}
 
源代码25 项目: CodeChickenLib   文件: CapabilityCache.java
private Map<Capability<?>, Object2IntPair<LazyOptional<?>>> getCacheForSide(Direction side) {
    if (side == null) {
        return selfCache;
    }
    return sideCache.computeIfAbsent(side, s -> new HashMap<>());
}
 
源代码26 项目: Survivalist   文件: ItemBreakingTracker.java
public static LazyOptional<ItemBreakingTracker> get(PlayerEntity p)
{
    return p.getCapability(Handler.TRACKER, null);
}
 
源代码27 项目: patchwork-api   文件: ICapabilityProvider.java
/**
 * Retrieves the {@link LazyOptional optional} handler for the capability requested on the specific side.
 * The return value <strong>CAN</strong> be the same for multiple faces.
 *
 * <p>Modders are encouraged to cache this value, using the listener capabilities of the optional to
 * be notified if the requested capability get lost.
 *
 * @param capability The {@link Capability capability} to check
 * @param direction  The {@link Direction direction} to check from,
 *                   <strong>CAN BE NULL</strong>. Null is defined to represent 'internal' or 'self'
 * @return The requested a {@link LazyOptional optional} holding the requested capability.
 */
@Nonnull
<T> LazyOptional<T> getCapability(@Nonnull Capability<T> capability, @Nullable Direction direction);
 
 类方法
 同包方法