1
1
package juuxel .adorn .block ;
2
2
3
- import it .unimi .dsi .fastutil .bytes .Byte2ObjectMap ;
4
- import it .unimi .dsi .fastutil .bytes .Byte2ObjectOpenHashMap ;
5
3
import juuxel .adorn .block .property .FrontConnection ;
6
4
import juuxel .adorn .block .variant .BlockVariant ;
7
5
import juuxel .adorn .lib .AdornStats ;
@@ -52,8 +50,8 @@ public class SofaBlock extends SeatBlock implements Waterloggable, SneakClickHan
52
50
public static final EnumProperty <FrontConnection > FRONT_CONNECTION = EnumProperty .of ("front" , FrontConnection .class );
53
51
public static final BooleanProperty WATERLOGGED = Properties .WATERLOGGED ;
54
52
55
- private static final Byte2ObjectMap < VoxelShape > OUTLINE_SHAPE_MAP = buildShapeMap (false );
56
- private static final Byte2ObjectMap < VoxelShape > COLLISION_SHAPE_MAP = buildShapeMap (true );
53
+ private static final VoxelShape [] OUTLINE_SHAPES = buildShapes (false );
54
+ private static final VoxelShape [] COLLISION_SHAPES = buildShapes (true );
57
55
private static final String DESCRIPTION_KEY = "block.adorn.sofa.description" ;
58
56
59
57
public SofaBlock (BlockVariant variant ) {
@@ -168,26 +166,26 @@ private BlockState updateConnections(BlockState state, WorldAccess world, BlockP
168
166
169
167
@ Override
170
168
public VoxelShape getOutlineShape (BlockState state , BlockView world , BlockPos pos , ShapeContext context ) {
171
- return OUTLINE_SHAPE_MAP . get (
169
+ return OUTLINE_SHAPES [
172
170
getShapeKey (
173
171
state .get (FACING ),
174
172
state .get (CONNECTED_LEFT ),
175
173
state .get (CONNECTED_RIGHT ),
176
174
state .get (FRONT_CONNECTION )
177
175
)
178
- ) ;
176
+ ] ;
179
177
}
180
178
181
179
@ Override
182
180
public VoxelShape getCollisionShape (BlockState state , BlockView world , BlockPos pos , ShapeContext context ) {
183
- return COLLISION_SHAPE_MAP . get (
181
+ return COLLISION_SHAPES [
184
182
getShapeKey (
185
183
state .get (FACING ),
186
184
state .get (CONNECTED_LEFT ),
187
185
state .get (CONNECTED_RIGHT ),
188
186
state .get (FRONT_CONNECTION )
189
187
)
190
- ) ;
188
+ ] ;
191
189
}
192
190
193
191
@ Override
@@ -210,7 +208,7 @@ public double getSittingOffset(World world, BlockState state, BlockPos pos) {
210
208
return 0.4375 ; // 7/16
211
209
}
212
210
213
- private static Byte2ObjectMap < VoxelShape > buildShapeMap (boolean thin ) {
211
+ private static VoxelShape [] buildShapes (boolean thin ) {
214
212
var bottom = createCuboidShape (0.0 , 2.0 , 0.0 , 16.0 , 7.0 , 16.0 );
215
213
var leftArms = Shapes .buildShapeRotations (5 , 7 , 13 , 16 , 13 , 16 );
216
214
var rightArms = Shapes .buildShapeRotations (5 , 7 , 0 , 16 , 13 , 3 );
@@ -220,7 +218,7 @@ private static Byte2ObjectMap<VoxelShape> buildShapeMap(boolean thin) {
220
218
var leftCorners = Shapes .buildShapeRotations (5 , 7 , 11 , 16 , 16 , 16 );
221
219
var rightCorners = Shapes .buildShapeRotations (5 , 7 , 0 , 16 , 16 , 5 );
222
220
var booleans = new boolean [] { true , false };
223
- Byte2ObjectMap < VoxelShape > result = new Byte2ObjectOpenHashMap <>() ;
221
+ var result = new VoxelShape [ 48 ] ;
224
222
for (var facing : FACING .getValues ()) {
225
223
for (var left : booleans ) {
226
224
for (var right : booleans ) {
@@ -240,18 +238,18 @@ private static Byte2ObjectMap<VoxelShape> buildShapeMap(boolean thin) {
240
238
case RIGHT -> parts .add (rightCorners .get (facing ));
241
239
}
242
240
243
- var key = getShapeKey (facing , left , right , front );
241
+ int key = getShapeKey (facing , left , right , front );
244
242
var shape = VoxelShapes .union (bottom , parts .toArray (VoxelShape []::new ));
245
- result . put ( key , shape ) ;
243
+ result [ key ] = shape ;
246
244
}
247
245
}
248
246
}
249
247
}
250
248
return result ;
251
249
}
252
250
253
- private static byte getShapeKey (Direction facing , boolean left , boolean right , FrontConnection front ) {
254
- return ( byte ) ( facing . getHorizontal () << 5 | (left ? 1 : 0 ) << 3 | (right ? 1 : 0 ) << 2 | front . ordinal () );
251
+ private static int getShapeKey (Direction facing , boolean left , boolean right , FrontConnection front ) {
252
+ return front . ordinal () << 4 | (left ? 1 : 0 ) << 3 | (right ? 1 : 0 ) << 2 | facing . getHorizontal ( );
255
253
}
256
254
257
255
public static @ Nullable Direction getSleepingDirection (BlockView world , BlockPos pos ) {
0 commit comments