Search in sources :

Example 11 with IConduit

use of crazypants.enderio.base.conduit.IConduit in project EnderIO by SleepyTrousers.

the class TileConduitBundle method doUpdate.

@Override
public void doUpdate() {
    Prof.start(getWorld(), "tick");
    for (IConduit conduit : getConduits()) {
        Prof.next(getWorld(), "", conduit);
        conduit.updateEntity(world);
    }
    if (!world.isRemote && conduitsDirty) {
        Prof.next(getWorld(), "neighborUpdate");
        doConduitsDirty();
    }
    // client side only, check for changes in rendering of the bundle
    if (world.isRemote) {
        Prof.next(getWorld(), "clientTick");
        updateEntityClient();
    }
    Prof.stop(getWorld());
}
Also used : IConduit(crazypants.enderio.base.conduit.IConduit)

Example 12 with IConduit

use of crazypants.enderio.base.conduit.IConduit in project EnderIO by SleepyTrousers.

the class TileConduitBundle method onAfterNbtRead.

@Override
protected void onAfterNbtRead() {
    super.onAfterNbtRead();
    if (world.isRemote) {
        // keep conduits sorted so the client side cache key is stable
        ConduitRegistry.sort(conduits);
        CopyOnWriteArrayList<IClientConduit> temp = new CopyOnWriteArrayList<>();
        for (IConduit c : conduits) {
            if (c instanceof IClientConduit) {
                c.setBundle(this);
                temp.add((IClientConduit) c);
            }
        }
        final ConduitCacheKey oldHashCode = new ConduitCacheKey(), newHashCode = new ConduitCacheKey();
        makeConduitHashCode(getClientConduits(), oldHashCode);
        makeConduitHashCode(temp, newHashCode);
        if (hasWorld() && getWorld().isRemote && oldHashCode.hashCode() != newHashCode.hashCode()) {
            clientUpdated = true;
        }
        // switch over atomically to avoid threading issues
        clientConduits = temp;
        conduits = new CopyOnWriteArrayList<IConduit>();
    } else {
        // no threads on server-side. but to be safe, conduits only go into the list after they got a bundle set
        // (a.k.a. "do better than World.addTileEntities()"
        serverConduits.clear();
        for (IConduit c : conduits) {
            if (c instanceof IServerConduit) {
                c.setBundle(this);
                serverConduits.add((IServerConduit) c);
            }
        }
        conduits.clear();
    }
    cachedCollidables.clear();
}
Also used : IClientConduit(crazypants.enderio.base.conduit.IClientConduit) IServerConduit(crazypants.enderio.base.conduit.IServerConduit) ConduitCacheKey(crazypants.enderio.conduits.render.BlockStateWrapperConduitBundle.ConduitCacheKey) IConduit(crazypants.enderio.base.conduit.IConduit) CopyOnWriteArrayList(java.util.concurrent.CopyOnWriteArrayList)

Example 13 with IConduit

use of crazypants.enderio.base.conduit.IConduit in project EnderIO by SleepyTrousers.

the class AbstractItemConduit method onItemUseFirst.

@Override
@Nonnull
public EnumActionResult onItemUseFirst(@Nonnull EntityPlayer player, @Nonnull World world, @Nonnull BlockPos pos, @Nonnull EnumFacing side, float hitX, float hitY, float hitZ, @Nonnull EnumHand hand) {
    ItemStack held = player.getHeldItem(hand);
    // Conduit replacement
    if (player.isSneaking()) {
        return EnumActionResult.PASS;
    }
    TileEntity te = world.getTileEntity(pos);
    if (te == null || !(te instanceof IConduitBundle)) {
        return EnumActionResult.PASS;
    }
    IConduitBundle bundle = (IConduitBundle) te;
    IConduit existingConduit = bundle.getConduit(getBaseConduitType());
    if (existingConduit == null) {
        return EnumActionResult.PASS;
    }
    ItemStack existingConduitAsItemStack = existingConduit.createItem();
    if (!ItemUtil.areStacksEqual(existingConduitAsItemStack, held)) {
        if (!world.isRemote) {
            IServerConduit newConduit = createConduit(held, player);
            if (newConduit == null) {
                return EnumActionResult.PASS;
            }
            bundle.removeConduit((IServerConduit) existingConduit);
            bundle.addConduit(newConduit);
            if (!player.capabilities.isCreativeMode) {
                held.shrink(1);
                for (ItemStack drop : existingConduit.getDrops()) {
                    if (!player.inventory.addItemStackToInventory(drop)) {
                        ItemUtil.spawnItemInWorldWithRandomMotion(world, drop, pos, hitX, hitY, hitZ, 1.1f);
                    }
                }
                player.inventoryContainer.detectAndSendChanges();
            }
            return EnumActionResult.FAIL;
        } else {
            player.swingArm(hand);
        }
    }
    return EnumActionResult.PASS;
}
Also used : TileEntity(net.minecraft.tileentity.TileEntity) IServerConduit(crazypants.enderio.base.conduit.IServerConduit) IConduitBundle(crazypants.enderio.base.conduit.IConduitBundle) IConduit(crazypants.enderio.base.conduit.IConduit) ItemStack(net.minecraft.item.ItemStack) Nonnull(javax.annotation.Nonnull)

Aggregations

IConduit (crazypants.enderio.base.conduit.IConduit)13 CollidableComponent (crazypants.enderio.base.conduit.geom.CollidableComponent)5 IServerConduit (crazypants.enderio.base.conduit.IServerConduit)4 Nonnull (javax.annotation.Nonnull)3 ItemStack (net.minecraft.item.ItemStack)3 TileEntity (net.minecraft.tileentity.TileEntity)3 EnumFacing (net.minecraft.util.EnumFacing)3 IConduitBundle (crazypants.enderio.base.conduit.IConduitBundle)2 ArrayList (java.util.ArrayList)2 CopyOnWriteArrayList (java.util.concurrent.CopyOnWriteArrayList)2 IBlockState (net.minecraft.block.state.IBlockState)2 World (net.minecraft.world.World)2 BoundingBox (com.enderio.core.client.render.BoundingBox)1 IClientConduit (crazypants.enderio.base.conduit.IClientConduit)1 RaytraceResult (crazypants.enderio.base.conduit.RaytraceResult)1 ConduitConnectorType (crazypants.enderio.base.conduit.geom.ConduitConnectorType)1 ConduitCacheKey (crazypants.enderio.conduits.render.BlockStateWrapperConduitBundle.ConduitCacheKey)1 HashSet (java.util.HashSet)1 TextureAtlasSprite (net.minecraft.client.renderer.texture.TextureAtlasSprite)1 SideOnly (net.minecraftforge.fml.relauncher.SideOnly)1