package net.minecraft.world.level; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.core.Holder; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.server.MinecraftServer; import net.minecraft.sounds.SoundEvent; import net.minecraft.sounds.SoundSource; import net.minecraft.util.RandomSource; import net.minecraft.world.Difficulty; import net.minecraft.world.DifficultyInstance; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkSource; import net.minecraft.world.level.gameevent.GameEvent; import net.minecraft.world.level.gameevent.GameEvent.Context; import net.minecraft.world.level.redstone.NeighborUpdater; import net.minecraft.world.level.storage.LevelData; import net.minecraft.world.phys.Vec3; import net.minecraft.world.ticks.ScheduledTick; import net.minecraft.world.ticks.TickPriority; import org.jetbrains.annotations.Nullable; public interface LevelAccessor extends CommonLevelAccessor, LevelTimeAccess, ScheduledTickAccess { @Override default long dayTime() { return this.getLevelData().getDayTime(); } long nextSubTickCount(); @Override default ScheduledTick createTick(BlockPos pos, T type, int delay, TickPriority priority) { return new ScheduledTick<>(type, pos, this.getLevelData().getGameTime() + delay, priority, this.nextSubTickCount()); } @Override default ScheduledTick createTick(BlockPos pos, T type, int delay) { return new ScheduledTick<>(type, pos, this.getLevelData().getGameTime() + delay, this.nextSubTickCount()); } /** * Returns the world's WorldInfo object */ LevelData getLevelData(); DifficultyInstance getCurrentDifficultyAt(BlockPos pos); @Nullable MinecraftServer getServer(); default Difficulty getDifficulty() { return this.getLevelData().getDifficulty(); } /** * Gets the world's chunk provider */ ChunkSource getChunkSource(); @Override default boolean hasChunk(int chunkX, int chunkZ) { return this.getChunkSource().hasChunk(chunkX, chunkZ); } RandomSource getRandom(); default void updateNeighborsAt(BlockPos pos, Block block) { } default void neighborShapeChanged(Direction direction, BlockPos pos, BlockPos neighborPos, BlockState neighborState, int flags, int recursionLeft) { NeighborUpdater.executeShapeUpdate(this, direction, pos, neighborPos, neighborState, flags, recursionLeft - 1); } default void playSound(@Nullable Entity entity, BlockPos pos, SoundEvent sound, SoundSource source) { this.playSound(entity, pos, sound, source, 1.0F, 1.0F); } void playSound(@Nullable Entity entity, BlockPos pos, SoundEvent sound, SoundSource source, float volume, float pitch); void addParticle(ParticleOptions particle, double x, double y, double z, double xSpeed, double ySpeed, double zSpeed); void levelEvent(@Nullable Entity entity, int type, BlockPos pos, int data); default void levelEvent(int type, BlockPos pos, int data) { this.levelEvent(null, type, pos, data); } void gameEvent(Holder gameEvent, Vec3 pos, Context context); default void gameEvent(@Nullable Entity entity, Holder gameEvent, Vec3 pos) { this.gameEvent(gameEvent, pos, new Context(entity, null)); } default void gameEvent(@Nullable Entity entity, Holder gameEvent, BlockPos pos) { this.gameEvent(gameEvent, pos, new Context(entity, null)); } default void gameEvent(Holder gameEvent, BlockPos pos, Context context) { this.gameEvent(gameEvent, Vec3.atCenterOf(pos), context); } default void gameEvent(ResourceKey gameEvent, BlockPos pos, Context context) { this.gameEvent(this.registryAccess().lookupOrThrow(Registries.GAME_EVENT).getOrThrow(gameEvent), pos, context); } }