Search in sources :

Example 31 with LocatableBlock

use of org.spongepowered.api.world.LocatableBlock in project SpongeCommon by SpongePowered.

the class TrackingUtil method randomTickFluid.

@SuppressWarnings("rawtypes")
public static void randomTickFluid(final TrackedWorldBridge mixinWorld, final FluidState state, final BlockPos pos, final Random random) {
    final ServerLevel world = (ServerLevel) mixinWorld;
    final org.spongepowered.api.world.server.ServerWorld apiWorld = (org.spongepowered.api.world.server.ServerWorld) world;
    if (ShouldFire.TICK_BLOCK_EVENT) {
        final BlockSnapshot currentTickBlock = mixinWorld.bridge$createSnapshot(state.createLegacyBlock(), pos, BlockChangeFlags.NONE);
        final TickBlockEvent event = SpongeEventFactory.createTickBlockEventRandom(PhaseTracker.getCauseStackManager().currentCause(), currentTickBlock);
        SpongeCommon.post(event);
        if (event.isCancelled()) {
            return;
        }
    }
    final LocatableBlock locatable = new SpongeLocatableBlockBuilder().world(apiWorld).position(pos.getX(), pos.getY(), pos.getZ()).state((BlockState) state.createLegacyBlock()).build();
    final FluidTickContext phaseContext = TickPhase.Tick.RANDOM_FLUID.createPhaseContext(PhaseTracker.SERVER).source(locatable).fluid(state);
    // We have to associate any notifiers in case of scheduled block updates from other sources
    final PhaseContext<@NonNull ?> currentContext = PhaseTracker.getInstance().getPhaseContext();
    currentContext.appendNotifierPreBlockTick(world, pos, phaseContext);
    // Now actually switch to the new phase
    try (final PhaseContext<@NonNull ?> context = phaseContext) {
        context.buildAndSwitch();
        PhaseTracker.LOGGER.trace(TrackingUtil.FLUID_TICK, () -> "Wrapping Random Fluid Tick: " + state.toString());
        state.randomTick(world, pos, random);
    } catch (final Exception | NoClassDefFoundError e) {
        PhasePrinter.printExceptionFromPhase(PhaseTracker.getInstance().stack, e, phaseContext);
    }
}
Also used : ServerLevel(net.minecraft.server.level.ServerLevel) SpongeLocatableBlockBuilder(org.spongepowered.common.world.server.SpongeLocatableBlockBuilder) SpongeBlockSnapshot(org.spongepowered.common.block.SpongeBlockSnapshot) BlockSnapshot(org.spongepowered.api.block.BlockSnapshot) FluidTickContext(org.spongepowered.common.event.tracking.phase.tick.FluidTickContext) TickBlockEvent(org.spongepowered.api.event.block.TickBlockEvent) BlockState(org.spongepowered.api.block.BlockState) LocatableBlock(org.spongepowered.api.world.LocatableBlock)

Example 32 with LocatableBlock

use of org.spongepowered.api.world.LocatableBlock in project SpongeCommon by SpongePowered.

the class BlockTickContext method source.

@Override
public BlockTickContext source(final Object owner) {
    super.source(owner);
    if (owner instanceof LocatableBlock) {
        final LocatableBlock locatableBlock = (LocatableBlock) owner;
        final Block block = ((BlockState) locatableBlock.blockState()).getBlock();
        this.tickingBlock = (BlockBridge) block;
        this.providesModifier = !(block instanceof LiquidBlock);
        this.world = locatableBlock.world();
        if (block instanceof TrackableBridge) {
            final TrackableBridge trackable = (TrackableBridge) block;
            this.setBlockEvents(trackable.bridge$allowsBlockEventCreation()).setBulkBlockCaptures(trackable.bridge$allowsBlockBulkCaptures()).setEntitySpawnEvents(trackable.bridge$allowsEntityEventCreation()).setBulkEntityCaptures(trackable.bridge$allowsEntityBulkCaptures());
        }
    }
    return this;
}
Also used : BlockState(net.minecraft.world.level.block.state.BlockState) LocatableBlock(org.spongepowered.api.world.LocatableBlock) Block(net.minecraft.world.level.block.Block) LiquidBlock(net.minecraft.world.level.block.LiquidBlock) LocatableBlock(org.spongepowered.api.world.LocatableBlock) TrackableBridge(org.spongepowered.common.bridge.TrackableBridge) LiquidBlock(net.minecraft.world.level.block.LiquidBlock)

Example 33 with LocatableBlock

use of org.spongepowered.api.world.LocatableBlock in project SpongeCommon by SpongePowered.

the class FluidTickContext method source.

@Override
public FluidTickContext source(final Object owner) {
    super.source(owner);
    if (owner instanceof LocatableBlock) {
        final LocatableBlock locatableBlock = (LocatableBlock) owner;
        final Block block = ((BlockState) locatableBlock.blockState()).getBlock();
        this.providesModifier = !(block instanceof LiquidBlock);
        this.world = locatableBlock.world();
        if (block instanceof TrackableBridge) {
            final TrackableBridge trackable = (TrackableBridge) block;
            this.setBlockEvents(trackable.bridge$allowsBlockEventCreation()).setBulkBlockCaptures(trackable.bridge$allowsBlockBulkCaptures()).setEntitySpawnEvents(trackable.bridge$allowsEntityEventCreation()).setBulkEntityCaptures(trackable.bridge$allowsEntityBulkCaptures());
        }
    }
    return this;
}
Also used : BlockState(net.minecraft.world.level.block.state.BlockState) LocatableBlock(org.spongepowered.api.world.LocatableBlock) Block(net.minecraft.world.level.block.Block) LiquidBlock(net.minecraft.world.level.block.LiquidBlock) LocatableBlock(org.spongepowered.api.world.LocatableBlock) TrackableBridge(org.spongepowered.common.bridge.TrackableBridge) LiquidBlock(net.minecraft.world.level.block.LiquidBlock)

Example 34 with LocatableBlock

use of org.spongepowered.api.world.LocatableBlock in project SpongeCommon by SpongePowered.

the class ServerLevelMixin_Tracker method tracker$associatePhaseContextDataWithBlockEvent.

@Redirect(method = "blockEvent", at = @At(value = "INVOKE", target = "Lit/unimi/dsi/fastutil/objects/ObjectLinkedOpenHashSet;add(Ljava/lang/Object;)Z", remap = false))
private boolean tracker$associatePhaseContextDataWithBlockEvent(final ObjectLinkedOpenHashSet<BlockEventData> list, final Object data, final BlockPos pos, final Block blockIn, final int eventID, final int eventParam) {
    final PhaseContext<@NonNull ?> currentContext = PhaseTracker.getInstance().getPhaseContext();
    final BlockEventData blockEventData = (BlockEventData) data;
    final TrackableBlockEventDataBridge blockEvent = (TrackableBlockEventDataBridge) blockEventData;
    // Short circuit phase states who do not track during block events
    if (currentContext.ignoresBlockEvent()) {
        return list.add(blockEventData);
    }
    final BlockState state = this.shadow$getBlockState(pos);
    if (((TrackableBridge) blockIn).bridge$allowsBlockEventCreation()) {
        blockEvent.bridge$setSourceUserUUID(currentContext.getActiveUserUUID());
        if (((BlockStateBridge) state).bridge$hasTileEntity()) {
            blockEvent.bridge$setTileEntity((BlockEntity) this.shadow$getBlockEntity(pos));
        }
        if (blockEvent.bridge$getTileEntity() == null) {
            final LocatableBlock locatable = new SpongeLocatableBlockBuilder().world((org.spongepowered.api.world.server.ServerWorld) this).position(pos.getX(), pos.getY(), pos.getZ()).state((org.spongepowered.api.block.BlockState) state).build();
            blockEvent.bridge$setTickingLocatable(locatable);
        }
    }
    // allow tracking to take place for other/future phases
    if (!((TrackableBridge) blockIn).bridge$allowsBlockEventCreation()) {
        return list.add((BlockEventData) data);
    }
    // In pursuant with our block updates management, we chose to
    // effectively allow the block event get added to the list, but
    // we log the transaction so that we can call the change block event
    // pre, and if needed, undo the add to the list.
    currentContext.appendNotifierToBlockEvent(this, pos, blockEvent);
    // This is very common with pistons as they add block events while blocks are being notified.
    if (ShouldFire.CHANGE_BLOCK_EVENT_PRE) {
        if (blockIn instanceof PistonBaseBlock) {
            // We only fire pre events for pistons
            if (SpongeCommonEventFactory.handlePistonEvent(this, pos, state, eventID)) {
                return false;
            }
        } else {
            if (SpongeCommonEventFactory.callChangeBlockEventPre((ServerLevelBridge) this, pos).isCancelled()) {
                return false;
            }
        }
    }
    currentContext.getTransactor().logBlockEvent(state, this, pos, blockEvent);
    return list.add(blockEventData);
}
Also used : SpongeLocatableBlockBuilder(org.spongepowered.common.world.server.SpongeLocatableBlockBuilder) TrackableBlockEventDataBridge(org.spongepowered.common.bridge.world.level.TrackableBlockEventDataBridge) TrackableBridge(org.spongepowered.common.bridge.TrackableBridge) PistonBaseBlock(net.minecraft.world.level.block.piston.PistonBaseBlock) BlockState(net.minecraft.world.level.block.state.BlockState) LocatableBlock(org.spongepowered.api.world.LocatableBlock) ServerLevelBridge(org.spongepowered.common.bridge.server.level.ServerLevelBridge) BlockEventData(net.minecraft.world.level.BlockEventData) BlockStateBridge(org.spongepowered.common.bridge.world.level.block.state.BlockStateBridge) Redirect(org.spongepowered.asm.mixin.injection.Redirect)

Aggregations

LocatableBlock (org.spongepowered.api.world.LocatableBlock)34 BlockState (org.spongepowered.api.block.BlockState)13 BlockSnapshot (org.spongepowered.api.block.BlockSnapshot)9 IBlockState (net.minecraft.block.state.IBlockState)8 StackFrame (org.spongepowered.api.event.CauseStackManager.StackFrame)8 World (org.spongepowered.api.world.World)8 PhaseTracker (org.spongepowered.common.event.tracking.PhaseTracker)8 Entity (org.spongepowered.api.entity.Entity)7 CauseStackManager (org.spongepowered.api.event.CauseStackManager)7 IMixinWorldServer (org.spongepowered.common.interfaces.world.IMixinWorldServer)7 SpongeLocatableBlockBuilder (org.spongepowered.common.world.server.SpongeLocatableBlockBuilder)7 ArrayList (java.util.ArrayList)6 ServerLevel (net.minecraft.server.level.ServerLevel)6 TickBlockEvent (org.spongepowered.api.event.block.TickBlockEvent)6 SpongeBlockSnapshot (org.spongepowered.common.block.SpongeBlockSnapshot)6 List (java.util.List)5 Optional (java.util.Optional)4 Collectors (java.util.stream.Collectors)4 Sponge (org.spongepowered.api.Sponge)4 Player (org.spongepowered.api.entity.living.player.Player)4