use of org.terasology.world.chunks.Chunk in project Terasology by MovingBlocks.
the class LocalChunkView method getBlockAt.
@Override
public Block getBlockAt(Vector3i pos) {
int index = chunkIndexOf(pos);
Chunk chunk = chunks[index];
if (chunk != null) {
return chunk.getBlock(ChunkMath.calcBlockPos(pos));
}
return null;
}
use of org.terasology.world.chunks.Chunk in project Terasology by MovingBlocks.
the class LightMerger method merge.
private void merge(Chunk chunk) {
Chunk[] localChunks = assembleLocalChunks(chunk);
localChunks[CENTER_INDEX] = chunk;
List<BatchPropagator> propagators = Lists.newArrayList();
propagators.add(new StandardBatchPropagator(new LightPropagationRules(), new LocalChunkView(localChunks, lightRules)));
PropagatorWorldView regenWorldView = new LocalChunkView(localChunks, sunlightRegenRules);
PropagationRules sunlightRules = new SunlightPropagationRules(regenWorldView);
PropagatorWorldView sunlightWorldView = new LocalChunkView(localChunks, sunlightRules);
BatchPropagator sunlightPropagator = new StandardBatchPropagator(sunlightRules, sunlightWorldView);
propagators.add(new SunlightRegenBatchPropagator(sunlightRegenRules, regenWorldView, sunlightPropagator, sunlightWorldView));
propagators.add(sunlightPropagator);
for (BatchPropagator propagator : propagators) {
// Propagate Inwards
for (Side side : Side.values()) {
Vector3i adjChunkPos = side.getAdjacentPos(chunk.getPosition());
LitChunk adjChunk = chunkProvider.getChunkUnready(adjChunkPos);
if (adjChunk != null) {
propagator.propagateBetween(adjChunk, chunk, side.reverse(), false);
}
}
// Propagate Outwards
for (Side side : Side.values()) {
Vector3i adjChunkPos = side.getAdjacentPos(chunk.getPosition());
LitChunk adjChunk = chunkProvider.getChunk(adjChunkPos);
if (adjChunk != null) {
propagator.propagateBetween(chunk, adjChunk, side, true);
}
}
}
for (BatchPropagator propagator : propagators) {
propagator.process();
}
chunk.deflateSunlight();
}
use of org.terasology.world.chunks.Chunk in project Terasology by MovingBlocks.
the class LocalChunkProviderTest method mockChunkAt.
private static Chunk mockChunkAt(final int x, final int y, final int z) {
final Chunk chunk = mock(Chunk.class);
when(chunk.getPosition()).thenReturn(new Vector3i(x, y, z));
return chunk;
}
use of org.terasology.world.chunks.Chunk in project Terasology by MovingBlocks.
the class LocalChunkProviderTest method testCompleteUpdateSendsBlockActivatedEvents.
@Test
public void testCompleteUpdateSendsBlockActivatedEvents() throws Exception {
final Chunk chunk = mockChunkAt(0, 0, 0);
final TShortObjectHashMap<TIntList> blockPositionMappings = new TShortObjectHashMap<>();
final short blockId = 42;
final EntityRef blockEntity = mock(EntityRef.class);
registerBlockWithIdAndEntity(blockId, blockEntity, blockManager);
blockPositionMappings.put(blockId, withPositions(new Vector3i(1, 2, 3)));
final ReadyChunkInfo readyChunkInfo = ReadyChunkInfo.createForRestoredChunk(chunk, blockPositionMappings, mock(ChunkStore.class), Collections.emptyList());
when(chunkFinalizer.completeFinalization()).thenReturn(readyChunkInfo);
chunkProvider.completeUpdate();
final ArgumentCaptor<Event> eventArgumentCaptor = ArgumentCaptor.forClass(Event.class);
verify(blockEntity, atLeastOnce()).send(eventArgumentCaptor.capture());
final Event event = eventArgumentCaptor.getAllValues().get(1);
assertThat(event, instanceOf(OnActivatedBlocks.class));
assertThat(((OnActivatedBlocks) event).getBlockPositions(), hasItem(new Vector3i(1, 2, 3)));
}
use of org.terasology.world.chunks.Chunk in project Terasology by MovingBlocks.
the class LocalChunkProviderTest method testCompleteUpdateSendsBlockAddedEvents.
@Test
public void testCompleteUpdateSendsBlockAddedEvents() throws Exception {
final Chunk chunk = mockChunkAt(0, 0, 0);
final short blockId = 42;
final EntityRef blockEntity = mock(EntityRef.class);
registerBlockWithIdAndEntity(blockId, blockEntity, blockManager);
final TShortObjectHashMap<TIntList> blockPositionMappings = new TShortObjectHashMap<>();
blockPositionMappings.put(blockId, withPositions(new Vector3i(1, 2, 3)));
final ReadyChunkInfo readyChunkInfo = ReadyChunkInfo.createForRestoredChunk(chunk, blockPositionMappings, mock(ChunkStore.class), Collections.emptyList());
when(chunkFinalizer.completeFinalization()).thenReturn(readyChunkInfo);
chunkProvider.completeUpdate();
final ArgumentCaptor<Event> eventArgumentCaptor = ArgumentCaptor.forClass(Event.class);
verify(blockEntity, atLeastOnce()).send(eventArgumentCaptor.capture());
final Event event = eventArgumentCaptor.getAllValues().get(0);
assertThat(event, instanceOf(OnAddedBlocks.class));
assertThat(((OnAddedBlocks) event).getBlockPositions(), hasItem(new Vector3i(1, 2, 3)));
}
Aggregations