-
Notifications
You must be signed in to change notification settings - Fork 52
/
RomanColumnFamily.java
134 lines (107 loc) · 4.69 KB
/
RomanColumnFamily.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package org.terasology.Sample.blocks;
import gnu.trove.map.TByteObjectMap;
import gnu.trove.map.hash.TByteObjectHashMap;
import org.terasology.math.Side;
import org.terasology.math.SideBitFlag;
import org.terasology.math.geom.Vector3i;
import org.terasology.naming.Name;
import org.terasology.registry.In;
import org.terasology.world.WorldProvider;
import org.terasology.world.block.Block;
import org.terasology.world.block.BlockBuilderHelper;
import org.terasology.world.block.BlockUri;
import org.terasology.world.block.family.AbstractBlockFamily;
import org.terasology.world.block.family.BlockFamily;
import org.terasology.world.block.family.BlockSections;
import org.terasology.world.block.family.RegisterBlockFamily;
import org.terasology.world.block.family.UpdatesWithNeighboursFamily;
import org.terasology.world.block.loader.BlockFamilyDefinition;
import org.terasology.world.block.shapes.BlockShape;
import java.util.ArrayList;
@RegisterBlockFamily("romancolumn")
@BlockSections({"lone_block", "on_top", "on_bottom", "in_a_line"})
public class RomanColumnFamily extends AbstractBlockFamily implements UpdatesWithNeighboursFamily {
@In
WorldProvider worldProvider;
private TByteObjectMap<Block> blocks;
BlockUri blockUri;
// Archetype is the base block of the family
// attachmentSide is the side of the block that the block being placed is going to be attached to
public RomanColumnFamily(BlockFamilyDefinition definition, BlockShape shape, BlockBuilderHelper blockBuilder) {
super(definition, shape, blockBuilder);
}
public RomanColumnFamily(BlockFamilyDefinition definition, BlockBuilderHelper blockBuilder) {
super(definition, blockBuilder);
blocks = new TByteObjectHashMap<Block>();
blockUri = new BlockUri(definition.getUrn());
addConnection((byte) 0, "lone_block", definition, blockBuilder);
addConnection(SideBitFlag.getSide(Side.TOP), "on_bottom", definition, blockBuilder);
addConnection(SideBitFlag.getSide(Side.BOTTOM), "on_top", definition, blockBuilder);
addConnection(SideBitFlag.getSides(Side.TOP, Side.BOTTOM), "in_a_line", definition, blockBuilder);
this.setBlockUri(blockUri);
this.setCategory(definition.getCategories());
}
private void addConnection(Byte bitFlag, String section, BlockFamilyDefinition definition, BlockBuilderHelper blockBuilder) {
blocks.put(bitFlag, addBlock(definition, blockBuilder, section, blockUri, bitFlag));
}
private Block getProperBlock(WorldProvider worldProvider, Vector3i location) {
byte connections = 0;
for (Side connectSide : new Side[] {Side.TOP, Side.BOTTOM}) {
if (this.connectionCondition(location, connectSide)) {
connections += SideBitFlag.getSide(connectSide);
}
}
return blocks.get(connections);
}
private Block addBlock(BlockFamilyDefinition definition, BlockBuilderHelper blockBuilder, String section, BlockUri blockUri, byte sides) {
Block newBlock = blockBuilder.constructSimpleBlock(definition, section);
newBlock.setUri(new BlockUri(blockUri, new Name(String.valueOf(sides))));
newBlock.setBlockFamily(this);
return newBlock;
}
protected boolean connectionCondition(Vector3i blockLocation, Side connectSide) {
Vector3i neighborLocation = new Vector3i(blockLocation);
neighborLocation.add(connectSide.getVector3i());
if (worldProvider.isBlockRelevant(neighborLocation)) {
Block neighborBlock = worldProvider.getBlock(neighborLocation);
final BlockFamily blockFamily = neighborBlock.getBlockFamily();
if (blockFamily instanceof RomanColumnFamily) {
return true;
}
}
return false;
}
@Override
public BlockUri getURI() {
return blockUri;
}
@Override
public String getDisplayName() {
return "Roman Column";
}
@Override
public Block getBlockForPlacement(Vector3i location, Side attachmentSide, Side direction) {
return getProperBlock(worldProvider, location);
}
@Override
public Block getArchetypeBlock() {
return blocks.get((byte) 0);
}
@Override
public Block getBlockFor(BlockUri blockUri) {
for (Block block : blocks.valueCollection()) {
if (block.getURI().equals(blockUri)) {
return block;
}
}
return null;
}
@Override
public Iterable<Block> getBlocks() {
return blocks.valueCollection();
}
@Override
public Block getBlockForNeighborUpdate(Vector3i location, Block oldBlock) {
return getProperBlock(worldProvider, location);
}
}