/* * Copyright 2013 MovingBlocks * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.terasology.world.block.family; import gnu.trove.map.TByteObjectMap; import org.terasology.math.Side; import org.terasology.math.SideBitFlag; import org.terasology.math.geom.Vector3i; import org.terasology.world.BlockEntityRegistry; import org.terasology.world.WorldProvider; import org.terasology.world.block.Block; import org.terasology.world.block.BlockUri; import java.util.List; import java.util.Locale; public class UpdatesWithNeighboursFamily extends AbstractBlockFamily { private ConnectionCondition connectionCondition; private Block archetypeBlock; private TByteObjectMap<Block> blocks; private byte connectionSides; public UpdatesWithNeighboursFamily(ConnectionCondition connectionCondition, BlockUri blockUri, List<String> categories, Block archetypeBlock, TByteObjectMap<Block> blocks, byte connectionSides) { super(blockUri, categories); this.connectionCondition = connectionCondition; this.archetypeBlock = archetypeBlock; this.blocks = blocks; this.connectionSides = connectionSides; for (Block block : blocks.valueCollection()) { block.setBlockFamily(this); } } @Override public Block getArchetypeBlock() { return archetypeBlock; } @Override public Block getBlockForPlacement(WorldProvider worldProvider, BlockEntityRegistry blockEntityRegistry, Vector3i location, Side attachmentSide, Side direction) { byte connections = 0; for (Side connectSide : SideBitFlag.getSides(connectionSides)) { if (connectionCondition.isConnectingTo(location, connectSide, worldProvider, blockEntityRegistry)) { connections += SideBitFlag.getSide(connectSide); } } return blocks.get(connections); } public Block getBlockForNeighborUpdate(WorldProvider worldProvider, BlockEntityRegistry blockEntityRegistry, Vector3i location, Block oldBlock) { byte connections = 0; for (Side connectSide : SideBitFlag.getSides(connectionSides)) { if (connectionCondition.isConnectingTo(location, connectSide, worldProvider, blockEntityRegistry)) { connections += SideBitFlag.getSide(connectSide); } } return blocks.get(connections); } @Override public Block getBlockFor(BlockUri blockUri) { if (getURI().equals(blockUri.getFamilyUri())) { try { byte connections = Byte.parseByte(blockUri.getIdentifier().toString().toLowerCase(Locale.ENGLISH)); return blocks.get(connections); } catch (IllegalArgumentException e) { return null; } } return null; } @Override public Iterable<Block> getBlocks() { return blocks.valueCollection(); } }