• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

CyclopsMC / IntegratedDynamics / 20210191346

14 Dec 2025 03:32PM UTC coverage: 19.514% (-33.5%) from 53.061%
20210191346

push

github

rubensworks
Remove deprecations

663 of 8728 branches covered (7.6%)

Branch coverage included in aggregate %.

6786 of 29445 relevant lines covered (23.05%)

1.09 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/src/main/java/org/cyclops/integrateddynamics/gametest/GameTestsOffsets.java
1
package org.cyclops.integrateddynamics.gametest;
2

3
import net.minecraft.core.BlockPos;
4
import net.minecraft.core.Direction;
5
import net.minecraft.core.Vec3i;
6
import net.minecraft.gametest.framework.GameTestHelper;
7
import net.minecraft.network.chat.Component;
8
import net.minecraft.world.InteractionHand;
9
import net.minecraft.world.entity.player.Player;
10
import net.minecraft.world.item.ItemStack;
11
import net.minecraft.world.item.Items;
12
import net.minecraft.world.level.GameType;
13
import net.minecraft.world.level.block.Blocks;
14
import net.minecraft.world.level.block.RedStoneWireBlock;
15
import net.minecraft.world.level.block.state.properties.RedstoneSide;
16
import net.minecraft.world.phys.BlockHitResult;
17
import net.minecraft.world.phys.Vec3;
18
import org.cyclops.cyclopscore.gametest.GameTest;
19
import org.cyclops.integrateddynamics.RegistryEntries;
20
import org.cyclops.integrateddynamics.api.part.IPartType;
21
import org.cyclops.integrateddynamics.api.part.PartPos;
22
import org.cyclops.integrateddynamics.api.part.write.IPartStateWriter;
23
import org.cyclops.integrateddynamics.core.block.IgnoredBlockStatus;
24
import org.cyclops.integrateddynamics.core.helper.PartHelpers;
25
import org.cyclops.integrateddynamics.core.part.PartTypes;
26
import org.cyclops.integrateddynamics.part.aspect.Aspects;
27

28
import static org.cyclops.integrateddynamics.gametest.GameTestHelpersIntegratedDynamics.createVariableFromReader;
29
import static org.cyclops.integrateddynamics.gametest.GameTestHelpersIntegratedDynamics.placeVariableInWriter;
30

31
public class GameTestsOffsets {
×
32

33
    public static final String TEMPLATE_EMPTY = "integrateddynamics:empty10";
34
    public static final BlockPos POS = BlockPos.ZERO.offset(4, 0, 2);
×
35

36
    @GameTest(template = TEMPLATE_EMPTY)
37
    public void testOffsetsRedstoneReaderToWriter(GameTestHelper helper) {
38
        // Place cable
39
        helper.setBlock(POS, RegistryEntries.BLOCK_CABLE.value());
×
40
        helper.setBlock(POS.east(), RegistryEntries.BLOCK_CABLE.value());
×
41

42
        // Place redstone reader
43
        PartPos posReader = PartPos.of(helper.getLevel(), helper.absolutePos(POS), Direction.WEST);
×
44
        PartHelpers.addPart(helper.getLevel(), helper.absolutePos(POS), Direction.WEST, PartTypes.REDSTONE_READER, new ItemStack(PartTypes.REDSTONE_READER.getItem()));
×
45
        increaseMaxOffset(helper, posReader, 4);
×
46
        boolean changedOffsetReader = setOffset(posReader, new Vec3i(-2, 0, 0));
×
47

48
        // Place redstone writer
49
        PartPos posWriter = PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST);
×
50
        PartHelpers.addPart(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST, PartTypes.REDSTONE_WRITER, new ItemStack(PartTypes.REDSTONE_WRITER.getItem()));
×
51
        increaseMaxOffset(helper, posWriter, 4);
×
52
        boolean changedOffsetWriter = setOffset(posWriter, new Vec3i(2, 0, 0));
×
53

54
        // Produce a redstone signal
55
        helper.setBlock(POS.offset(-2, 0, 0).west().below(), Blocks.STONE);
×
56
        helper.setBlock(POS.offset(-2, 0, 0).west(), Blocks.REDSTONE_WIRE);
×
57
        helper.setBlock(POS.offset(-2, 0, 0).west().west().below(), Blocks.STONE);
×
58
        helper.setBlock(POS.offset(-2, 0, 0).west().west(), Blocks.REDSTONE_WIRE);
×
59
        helper.setBlock(POS.offset(-2, 0, 0).west().west().west().below(), Blocks.STONE);
×
60
        helper.setBlock(POS.offset(-2, 0, 0).west().west().west(), Blocks.REDSTONE_TORCH);
×
61

62
        // Writer redstone signal from redstone reader to variable card
63
        ItemStack variableAspect = createVariableFromReader(helper.getLevel(), PartPos.of(helper.getLevel(), helper.absolutePos(POS), Direction.WEST), Aspects.Read.Redstone.INTEGER_VALUE);
×
64

65
        // Place variable in writer
66
        placeVariableInWriter(helper, helper.getLevel(), PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST), Aspects.Write.Redstone.INTEGER, variableAspect);
×
67

68
        // Place redstone wire next to redstone writer
69
        helper.setBlock(POS.offset(2, 0, 0).east().east().below(), Blocks.STONE);
×
70
        helper.setBlock(POS.offset(2, 0, 0).east().east(), Blocks.REDSTONE_WIRE);
×
71
        helper.setBlock(POS.offset(2, 0, 0).east().east().east().below(), Blocks.STONE);
×
72
        helper.setBlock(POS.offset(2, 0, 0).east().east().east(), Blocks.REDSTONE_WIRE);
×
73

74
        helper.succeedWhen(() -> {
×
75
            helper.assertTrue(changedOffsetReader, Component.literal("Setting offset in reader failed"));
×
76
            helper.assertTrue(changedOffsetWriter, Component.literal("Setting offset in writer failed"));
×
77

78
            helper.assertBlockProperty(POS.offset(2, 0, 0).east().east(), RedStoneWireBlock.WEST, RedstoneSide.SIDE);
×
79
            helper.assertBlockProperty(POS.offset(2, 0, 0).east().east(), RedStoneWireBlock.POWER, 14);
×
80

81
            IPartStateWriter partStateWriter = (IPartStateWriter) PartHelpers.getPart(PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST)).getState();
×
82
            helper.assertFalse(partStateWriter.isDeactivated(), Component.literal("Writer is deactivated"));
×
83
            helper.assertValueEqual(
×
84
                    PartTypes.REDSTONE_WRITER.getBlockState(PartHelpers.getPartContainerChecked(PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST)), Direction.EAST).getValue(IgnoredBlockStatus.STATUS),
×
85
                    IgnoredBlockStatus.Status.ACTIVE,
86
                    Component.literal("Block status is incorrect")
×
87
            );
88
            helper.assertValueEqual(partStateWriter.getActiveAspect(), Aspects.Write.Redstone.INTEGER, Component.literal("Active aspect is incorrect"));
×
89
            helper.assertTrue(partStateWriter.getErrors(Aspects.Write.Redstone.INTEGER).isEmpty(), Component.literal("Active aspect has errors"));
×
90
        });
×
91
    }
×
92

93
    @GameTest(template = TEMPLATE_EMPTY)
94
    public void testOffsetsRedstoneReaderToWriterOffset(GameTestHelper helper) {
95
        // Place cable
96
        helper.setBlock(POS, RegistryEntries.BLOCK_CABLE.value());
×
97
        helper.setBlock(POS.east(), RegistryEntries.BLOCK_CABLE.value());
×
98

99
        // Place redstone reader
100
        PartPos posReader = PartPos.of(helper.getLevel(), helper.absolutePos(POS), Direction.WEST);
×
101
        PartHelpers.addPart(helper.getLevel(), helper.absolutePos(POS), Direction.WEST, PartTypes.REDSTONE_READER, new ItemStack(PartTypes.REDSTONE_READER.getItem()));
×
102
        increaseMaxOffset(helper, posReader, 4);
×
103
        boolean changedOffsetReader = setOffset(posReader, new Vec3i(-2, 0, 0));
×
104

105
        // Place redstone writer
106
        PartPos posWriter = PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST);
×
107
        PartHelpers.addPart(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST, PartTypes.REDSTONE_WRITER, new ItemStack(PartTypes.REDSTONE_WRITER.getItem()));
×
108
        increaseMaxOffset(helper, posWriter, 4);
×
109
        boolean changedOffsetWriter = setOffset(posWriter, new Vec3i(2, 0, 0));
×
110

111
        // Produce a redstone signal
112
        helper.setBlock(POS.offset(-2, 0, 0).west().below(), Blocks.STONE);
×
113
        helper.setBlock(POS.offset(-2, 0, 0).west(), Blocks.REDSTONE_WIRE);
×
114
        helper.setBlock(POS.offset(-2, 0, 0).west().west().below(), Blocks.STONE);
×
115
        helper.setBlock(POS.offset(-2, 0, 0).west().west(), Blocks.REDSTONE_WIRE);
×
116
        helper.setBlock(POS.offset(-2, 0, 0).west().west().west().below(), Blocks.STONE);
×
117
        helper.setBlock(POS.offset(-2, 0, 0).west().west().west(), Blocks.REDSTONE_TORCH);
×
118

119
        // Writer redstone signal from redstone reader to variable card
120
        ItemStack variableAspect = createVariableFromReader(helper.getLevel(), PartPos.of(helper.getLevel(), helper.absolutePos(POS), Direction.WEST), Aspects.Read.Redstone.INTEGER_VALUE);
×
121

122
        // Place variable in writer
123
        placeVariableInWriter(helper, helper.getLevel(), PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST), Aspects.Write.Redstone.INTEGER, variableAspect);
×
124

125
        // Place redstone wire next to redstone writer
126
        helper.setBlock(POS.offset(2, 0, 0).east().east().below(), Blocks.STONE);
×
127
        helper.setBlock(POS.offset(2, 0, 0).east().east(), Blocks.REDSTONE_WIRE);
×
128
        helper.setBlock(POS.offset(2, 0, 0).east().east().east().below(), Blocks.STONE);
×
129
        helper.setBlock(POS.offset(2, 0, 0).east().east().east(), Blocks.REDSTONE_WIRE);
×
130

131
        helper.succeedWhen(() -> {
×
132
            helper.assertTrue(changedOffsetReader, Component.literal("Setting offset in reader failed"));
×
133
            helper.assertTrue(changedOffsetWriter, Component.literal("Setting offset in writer failed"));
×
134

135
            helper.assertBlockProperty(POS.offset(2, 0, 0).east().east(), RedStoneWireBlock.WEST, RedstoneSide.SIDE);
×
136
            helper.assertBlockProperty(POS.offset(2, 0, 0).east().east(), RedStoneWireBlock.POWER, 14);
×
137

138
            IPartStateWriter partStateWriter = (IPartStateWriter) PartHelpers.getPart(PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST)).getState();
×
139
            helper.assertFalse(partStateWriter.isDeactivated(), Component.literal("Writer is deactivated"));
×
140
            helper.assertValueEqual(
×
141
                    PartTypes.REDSTONE_WRITER.getBlockState(PartHelpers.getPartContainerChecked(PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST)), Direction.EAST).getValue(IgnoredBlockStatus.STATUS),
×
142
                    IgnoredBlockStatus.Status.ACTIVE,
143
                    Component.literal("Block status is incorrect")
×
144
            );
145
            helper.assertValueEqual(partStateWriter.getActiveAspect(), Aspects.Write.Redstone.INTEGER, Component.literal("Active aspect is incorrect"));
×
146
            helper.assertTrue(partStateWriter.getErrors(Aspects.Write.Redstone.INTEGER).isEmpty(), Component.literal("Active aspect has errors"));
×
147
        });
×
148
    }
×
149

150
    @GameTest(template = TEMPLATE_EMPTY)
151
    public void testOffsetsRedstoneReaderToWriterOffsetAndSide(GameTestHelper helper) {
152
        // Place cable
153
        helper.setBlock(POS, RegistryEntries.BLOCK_CABLE.value());
×
154
        helper.setBlock(POS.east(), RegistryEntries.BLOCK_CABLE.value());
×
155

156
        // Place redstone reader
157
        PartPos posReader = PartPos.of(helper.getLevel(), helper.absolutePos(POS), Direction.WEST);
×
158
        PartHelpers.addPart(helper.getLevel(), helper.absolutePos(POS), Direction.WEST, PartTypes.REDSTONE_READER, new ItemStack(PartTypes.REDSTONE_READER.getItem()));
×
159
        increaseMaxOffset(helper, posReader, 4);
×
160
        boolean changedOffsetReader = setOffset(posReader, new Vec3i(-2, 0, 0));
×
161
        setOffsetSide(posReader, Direction.SOUTH);
×
162

163
        // Place redstone writer
164
        PartPos posWriter = PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST);
×
165
        PartHelpers.addPart(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST, PartTypes.REDSTONE_WRITER, new ItemStack(PartTypes.REDSTONE_WRITER.getItem()));
×
166
        increaseMaxOffset(helper, posWriter, 4);
×
167
        boolean changedOffsetWriter = setOffset(posWriter, new Vec3i(2, 0, 0));
×
168
        setOffsetSide(posWriter, Direction.SOUTH);
×
169

170
        // Produce a redstone signal
171
        helper.setBlock(POS.offset(-2, 0, 0).west().below(), Blocks.STONE);
×
172
        helper.setBlock(POS.offset(-2, 0, 0).west(), Blocks.REDSTONE_WIRE);
×
173
        helper.setBlock(POS.offset(-2, 0, 0).west().west().below(), Blocks.STONE);
×
174
        helper.setBlock(POS.offset(-2, 0, 0).west().west(), Blocks.REDSTONE_WIRE);
×
175
        helper.setBlock(POS.offset(-2, 0, 0).west().west().west().below(), Blocks.STONE);
×
176
        helper.setBlock(POS.offset(-2, 0, 0).west().west().west(), Blocks.REDSTONE_TORCH);
×
177

178
        // Writer redstone signal from redstone reader to variable card
179
        ItemStack variableAspect = createVariableFromReader(helper.getLevel(), PartPos.of(helper.getLevel(), helper.absolutePos(POS), Direction.WEST), Aspects.Read.Redstone.INTEGER_VALUE);
×
180

181
        // Place variable in writer
182
        placeVariableInWriter(helper, helper.getLevel(), PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST), Aspects.Write.Redstone.INTEGER, variableAspect);
×
183

184
        // Place redstone wire next to redstone writer
185
        helper.setBlock(POS.offset(2, 0, 0).east().east().below(), Blocks.STONE);
×
186
        helper.setBlock(POS.offset(2, 0, 0).east().east(), Blocks.REDSTONE_WIRE);
×
187
        helper.setBlock(POS.offset(2, 0, 0).east().east().east().below(), Blocks.STONE);
×
188
        helper.setBlock(POS.offset(2, 0, 0).east().east().east(), Blocks.REDSTONE_WIRE);
×
189

190
        helper.succeedWhen(() -> {
×
191
            helper.assertTrue(changedOffsetReader, Component.literal("Setting offset in reader failed"));
×
192
            helper.assertTrue(changedOffsetWriter, Component.literal("Setting offset in writer failed"));
×
193

194
            helper.assertBlockProperty(POS.offset(2, 0, 0).east().east(), RedStoneWireBlock.WEST, RedstoneSide.SIDE);
×
195
            helper.assertBlockProperty(POS.offset(2, 0, 0).east().east(), RedStoneWireBlock.POWER, 14);
×
196

197
            IPartStateWriter partStateWriter = (IPartStateWriter) PartHelpers.getPart(PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST)).getState();
×
198
            helper.assertFalse(partStateWriter.isDeactivated(), Component.literal("Writer is deactivated"));
×
199
            helper.assertValueEqual(
×
200
                    PartTypes.REDSTONE_WRITER.getBlockState(PartHelpers.getPartContainerChecked(PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST)), Direction.EAST).getValue(IgnoredBlockStatus.STATUS),
×
201
                    IgnoredBlockStatus.Status.ACTIVE,
202
                    Component.literal("Block status is incorrect")
×
203
            );
204
            helper.assertValueEqual(partStateWriter.getActiveAspect(), Aspects.Write.Redstone.INTEGER, Component.literal("Active aspect is incorrect"));
×
205
            helper.assertTrue(partStateWriter.getErrors(Aspects.Write.Redstone.INTEGER).isEmpty(), Component.literal("Active aspect has errors"));
×
206
        });
×
207
    }
×
208

209
    @GameTest(template = TEMPLATE_EMPTY)
210
    public void testOffsetsRedstoneReaderToWriterOnlySide(GameTestHelper helper) {
211
        // Place cable
212
        helper.setBlock(POS, RegistryEntries.BLOCK_CABLE.value());
×
213
        helper.setBlock(POS.east(), RegistryEntries.BLOCK_CABLE.value());
×
214

215
        // Place redstone reader
216
        PartPos posReader = PartPos.of(helper.getLevel(), helper.absolutePos(POS), Direction.WEST);
×
217
        PartHelpers.addPart(helper.getLevel(), helper.absolutePos(POS), Direction.WEST, PartTypes.REDSTONE_READER, new ItemStack(PartTypes.REDSTONE_READER.getItem()));
×
218
        increaseMaxOffset(helper, posReader, 4);
×
219
        setOffsetSide(posReader, Direction.SOUTH);
×
220

221
        // Place redstone writer
222
        PartPos posWriter = PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST);
×
223
        PartHelpers.addPart(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST, PartTypes.REDSTONE_WRITER, new ItemStack(PartTypes.REDSTONE_WRITER.getItem()));
×
224
        increaseMaxOffset(helper, posWriter, 4);
×
225
        setOffsetSide(posWriter, Direction.SOUTH);
×
226

227
        // Produce a redstone signal
228
        helper.setBlock(POS.west().below(), Blocks.STONE);
×
229
        helper.setBlock(POS.west(), Blocks.REDSTONE_WIRE);
×
230
        helper.setBlock(POS.west().west().below(), Blocks.STONE);
×
231
        helper.setBlock(POS.west().west(), Blocks.REDSTONE_WIRE);
×
232
        helper.setBlock(POS.west().west().west().below(), Blocks.STONE);
×
233
        helper.setBlock(POS.west().west().west(), Blocks.REDSTONE_TORCH);
×
234

235
        // Writer redstone signal from redstone reader to variable card
236
        ItemStack variableAspect = createVariableFromReader(helper.getLevel(), PartPos.of(helper.getLevel(), helper.absolutePos(POS), Direction.WEST), Aspects.Read.Redstone.INTEGER_VALUE);
×
237

238
        // Place variable in writer
239
        placeVariableInWriter(helper, helper.getLevel(), PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST), Aspects.Write.Redstone.INTEGER, variableAspect);
×
240

241
        // Place redstone wire next to redstone writer
242
        helper.setBlock(POS.east().east().below(), Blocks.STONE);
×
243
        helper.setBlock(POS.east().east(), Blocks.REDSTONE_WIRE);
×
244
        helper.setBlock(POS.east().east().east().below(), Blocks.STONE);
×
245
        helper.setBlock(POS.east().east().east(), Blocks.REDSTONE_WIRE);
×
246

247
        helper.succeedWhen(() -> {
×
248
            helper.assertBlockProperty(POS.east().east(), RedStoneWireBlock.WEST, RedstoneSide.SIDE);
×
249
            helper.assertBlockProperty(POS.east().east(), RedStoneWireBlock.POWER, 14);
×
250

251
            IPartStateWriter partStateWriter = (IPartStateWriter) PartHelpers.getPart(PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST)).getState();
×
252
            helper.assertFalse(partStateWriter.isDeactivated(), Component.literal("Writer is deactivated"));
×
253
            helper.assertValueEqual(
×
254
                    PartTypes.REDSTONE_WRITER.getBlockState(PartHelpers.getPartContainerChecked(PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST)), Direction.EAST).getValue(IgnoredBlockStatus.STATUS),
×
255
                    IgnoredBlockStatus.Status.ACTIVE,
256
                    Component.literal("Block status is incorrect")
×
257
            );
258
            helper.assertValueEqual(partStateWriter.getActiveAspect(), Aspects.Write.Redstone.INTEGER, Component.literal("Active aspect is incorrect"));
×
259
            helper.assertTrue(partStateWriter.getErrors(Aspects.Write.Redstone.INTEGER).isEmpty(), Component.literal("Active aspect has errors"));
×
260
        });
×
261
    }
×
262

263
    @GameTest(template = TEMPLATE_EMPTY)
264
    public void testOffsetsRedstoneReaderToWriterNoMaxOffset(GameTestHelper helper) {
265
        // Place cable
266
        helper.setBlock(POS, RegistryEntries.BLOCK_CABLE.value());
×
267
        helper.setBlock(POS.east(), RegistryEntries.BLOCK_CABLE.value());
×
268

269
        // Place redstone reader
270
        PartPos posReader = PartPos.of(helper.getLevel(), helper.absolutePos(POS), Direction.WEST);
×
271
        PartHelpers.addPart(helper.getLevel(), helper.absolutePos(POS), Direction.WEST, PartTypes.REDSTONE_READER, new ItemStack(PartTypes.REDSTONE_READER.getItem()));
×
272
        boolean changedOffsetReader = setOffset(posReader, new Vec3i(-2, 0, 0));
×
273

274
        // Place redstone writer
275
        PartPos posWriter = PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST);
×
276
        PartHelpers.addPart(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST, PartTypes.REDSTONE_WRITER, new ItemStack(PartTypes.REDSTONE_WRITER.getItem()));
×
277
        boolean changedOffsetWriter = setOffset(posWriter, new Vec3i(2, 0, 0));
×
278

279
        // Produce a redstone signal
280
        helper.setBlock(POS.offset(-2, 0, 0).west().below(), Blocks.STONE);
×
281
        helper.setBlock(POS.offset(-2, 0, 0).west(), Blocks.REDSTONE_WIRE);
×
282
        helper.setBlock(POS.offset(-2, 0, 0).west().west().below(), Blocks.STONE);
×
283
        helper.setBlock(POS.offset(-2, 0, 0).west().west(), Blocks.REDSTONE_WIRE);
×
284
        helper.setBlock(POS.offset(-2, 0, 0).west().west().west().below(), Blocks.STONE);
×
285
        helper.setBlock(POS.offset(-2, 0, 0).west().west().west(), Blocks.REDSTONE_TORCH);
×
286

287
        // Writer redstone signal from redstone reader to variable card
288
        ItemStack variableAspect = createVariableFromReader(helper.getLevel(), PartPos.of(helper.getLevel(), helper.absolutePos(POS), Direction.WEST), Aspects.Read.Redstone.INTEGER_VALUE);
×
289

290
        // Place variable in writer
291
        placeVariableInWriter(helper, helper.getLevel(), PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST), Aspects.Write.Redstone.INTEGER, variableAspect);
×
292

293
        // Place redstone wire next to redstone writer
294
        helper.setBlock(POS.offset(2, 0, 0).east().east().below(), Blocks.STONE);
×
295
        helper.setBlock(POS.offset(2, 0, 0).east().east(), Blocks.REDSTONE_WIRE);
×
296
        helper.setBlock(POS.offset(2, 0, 0).east().east().east().below(), Blocks.STONE);
×
297
        helper.setBlock(POS.offset(2, 0, 0).east().east().east(), Blocks.REDSTONE_WIRE);
×
298

299
        helper.succeedWhen(() -> {
×
300
            helper.assertFalse(changedOffsetReader, Component.literal("Setting offset in reader did not fail"));
×
301
            helper.assertFalse(changedOffsetWriter, Component.literal("Setting offset in writer did not fail"));
×
302

303
            helper.assertBlockProperty(POS.offset(2, 0, 0).east().east(), RedStoneWireBlock.WEST, RedstoneSide.SIDE);
×
304
            helper.assertBlockProperty(POS.offset(2, 0, 0).east().east(), RedStoneWireBlock.POWER, 0);
×
305
        });
×
306
    }
×
307

308
    @GameTest(template = TEMPLATE_EMPTY)
309
    public void testOffsetsRedstoneReaderToWriterInsufficientMaxOffset(GameTestHelper helper) {
310
        // Place cable
311
        helper.setBlock(POS, RegistryEntries.BLOCK_CABLE.value());
×
312
        helper.setBlock(POS.east(), RegistryEntries.BLOCK_CABLE.value());
×
313

314
        // Place redstone reader
315
        PartPos posReader = PartPos.of(helper.getLevel(), helper.absolutePos(POS), Direction.WEST);
×
316
        PartHelpers.addPart(helper.getLevel(), helper.absolutePos(POS), Direction.WEST, PartTypes.REDSTONE_READER, new ItemStack(PartTypes.REDSTONE_READER.getItem()));
×
317
        increaseMaxOffset(helper, posReader, 1);
×
318
        boolean changedOffsetReader = setOffset(posReader, new Vec3i(-2, 0, 0));
×
319

320
        // Place redstone writer
321
        PartPos posWriter = PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST);
×
322
        PartHelpers.addPart(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST, PartTypes.REDSTONE_WRITER, new ItemStack(PartTypes.REDSTONE_WRITER.getItem()));
×
323
        increaseMaxOffset(helper, posWriter, 1);
×
324
        boolean changedOffsetWriter = setOffset(posWriter, new Vec3i(2, 0, 0));
×
325

326
        // Produce a redstone signal
327
        helper.setBlock(POS.offset(-2, 0, 0).west().below(), Blocks.STONE);
×
328
        helper.setBlock(POS.offset(-2, 0, 0).west(), Blocks.REDSTONE_WIRE);
×
329
        helper.setBlock(POS.offset(-2, 0, 0).west().west().below(), Blocks.STONE);
×
330
        helper.setBlock(POS.offset(-2, 0, 0).west().west(), Blocks.REDSTONE_WIRE);
×
331
        helper.setBlock(POS.offset(-2, 0, 0).west().west().west().below(), Blocks.STONE);
×
332
        helper.setBlock(POS.offset(-2, 0, 0).west().west().west(), Blocks.REDSTONE_TORCH);
×
333

334
        // Writer redstone signal from redstone reader to variable card
335
        ItemStack variableAspect = createVariableFromReader(helper.getLevel(), PartPos.of(helper.getLevel(), helper.absolutePos(POS), Direction.WEST), Aspects.Read.Redstone.INTEGER_VALUE);
×
336

337
        // Place variable in writer
338
        placeVariableInWriter(helper, helper.getLevel(), PartPos.of(helper.getLevel(), helper.absolutePos(POS.east()), Direction.EAST), Aspects.Write.Redstone.INTEGER, variableAspect);
×
339

340
        // Place redstone wire next to redstone writer
341
        helper.setBlock(POS.offset(2, 0, 0).east().east().below(), Blocks.STONE);
×
342
        helper.setBlock(POS.offset(2, 0, 0).east().east(), Blocks.REDSTONE_WIRE);
×
343
        helper.setBlock(POS.offset(2, 0, 0).east().east().east().below(), Blocks.STONE);
×
344
        helper.setBlock(POS.offset(2, 0, 0).east().east().east(), Blocks.REDSTONE_WIRE);
×
345

346
        helper.succeedWhen(() -> {
×
347
            helper.assertFalse(changedOffsetReader, Component.literal("Setting offset in reader did not fail"));
×
348
            helper.assertFalse(changedOffsetWriter, Component.literal("Setting offset in writer did not fail"));
×
349

350
            helper.assertBlockProperty(POS.offset(2, 0, 0).east().east(), RedStoneWireBlock.WEST, RedstoneSide.SIDE);
×
351
            helper.assertBlockProperty(POS.offset(2, 0, 0).east().east(), RedStoneWireBlock.POWER, 0);
×
352
        });
×
353
    }
×
354

355
    @GameTest(template = TEMPLATE_EMPTY)
356
    public void testOffsetsDropOnBreak(GameTestHelper helper) {
357
        // Place cable
358
        helper.setBlock(POS.above(), RegistryEntries.BLOCK_CABLE.value());
×
359
        helper.setBlock(POS.above().east(), RegistryEntries.BLOCK_CABLE.value());
×
360

361
        // Place redstone reader
362
        PartPos posReader = PartPos.of(helper.getLevel(), helper.absolutePos(POS.above()), Direction.WEST);
×
363
        PartHelpers.addPart(helper.getLevel(), helper.absolutePos(POS.above()), Direction.WEST, PartTypes.REDSTONE_READER, new ItemStack(PartTypes.REDSTONE_READER.getItem()));
×
364
        increaseMaxOffset(helper, posReader, 4);
×
365
        boolean changedOffsetReader = setOffset(posReader, new Vec3i(-2, 0, 0));
×
366

367
        // Remove redstone reader with pickaxe
368
        Player player = helper.makeMockPlayer(GameType.SURVIVAL);
×
369
        player.setShiftKeyDown(true); // To remove part!
×
370
        facePlayerToPart(player, posReader);
×
371
        ItemStack toolStack = new ItemStack(Items.DIAMOND_PICKAXE);
×
372
        player.setItemInHand(InteractionHand.MAIN_HAND, toolStack);
×
373
        helper.getBlockState(POS.above()).onDestroyedByPlayer(helper.getLevel(), helper.absolutePos(POS.above()), player, toolStack, true, helper.getLevel().getFluidState(helper.absolutePos(POS.above())));
×
374

375
        helper.succeedWhen(() -> {
×
376
            helper.assertTrue(changedOffsetReader, Component.literal("Setting offset in reader failed"));
×
377

378
            helper.assertItemEntityPresent(PartTypes.REDSTONE_READER.getItem());
×
379
            helper.assertItemEntityPresent(RegistryEntries.ITEM_ENHANCEMENT_OFFSET.value());
×
380
        });
×
381
    }
×
382

383
    @GameTest(template = TEMPLATE_EMPTY)
384
    public void testOffsetsNoDropOnBreakWithoutOffsets(GameTestHelper helper) {
385
        // Place cable
386
        helper.setBlock(POS.above(), RegistryEntries.BLOCK_CABLE.value());
×
387
        helper.setBlock(POS.above().east(), RegistryEntries.BLOCK_CABLE.value());
×
388

389
        // Place redstone reader
390
        PartPos posReader = PartPos.of(helper.getLevel(), helper.absolutePos(POS.above()), Direction.WEST);
×
391
        PartHelpers.addPart(helper.getLevel(), helper.absolutePos(POS.above()), Direction.WEST, PartTypes.REDSTONE_READER, new ItemStack(PartTypes.REDSTONE_READER.getItem()));
×
392

393
        // Remove redstone reader with pickaxe
394
        Player player = helper.makeMockPlayer(GameType.SURVIVAL);
×
395
        player.setShiftKeyDown(true); // To remove part!
×
396
        facePlayerToPart(player, posReader);
×
397
        ItemStack toolStack = new ItemStack(Items.DIAMOND_PICKAXE);
×
398
        player.setItemInHand(InteractionHand.MAIN_HAND, toolStack);
×
399
        helper.getBlockState(POS.above()).onDestroyedByPlayer(helper.getLevel(), helper.absolutePos(POS.above()), player, toolStack, true, helper.getLevel().getFluidState(helper.absolutePos(POS.above())));
×
400

401
        helper.succeedWhen(() -> {
×
402
            helper.assertItemEntityPresent(PartTypes.REDSTONE_READER.getItem());
×
403
            helper.assertItemEntityNotPresent(RegistryEntries.ITEM_ENHANCEMENT_OFFSET.value());
×
404
        });
×
405
    }
×
406

407
    public static void increaseMaxOffset(GameTestHelper helper, PartPos partPos, int offset) {
408
        Player player = helper.makeMockPlayer(GameType.SURVIVAL);
×
409
        ItemStack itemStack = new ItemStack(RegistryEntries.ITEM_ENHANCEMENT_OFFSET.value());
×
410
        RegistryEntries.ITEM_ENHANCEMENT_OFFSET.value().setEnhancementValue(itemStack, offset);
×
411
        player.setItemInHand(InteractionHand.MAIN_HAND, itemStack);
×
412
        facePlayerToPart(player, partPos);
×
413

414
        partPos.getPos().getLevel(true).getBlockState(partPos.getPos().getBlockPos()).useItemOn(itemStack, helper.getLevel(), player,
×
415
                InteractionHand.MAIN_HAND,
416
                new BlockHitResult(
417
                        partPos.getPos().getBlockPos().getCenter(),
×
418
                        partPos.getSide(),
×
419
                        partPos.getPos().getBlockPos(),
×
420
                        false));
421
    }
×
422

423
    public static void facePlayerToPart(Player player, PartPos partPos) {
424
        player.setYRot(partPos.getSide().getRotation().y() * 180);
×
425
        player.setPos(partPos.getPos().getBlockPos().getCenter()
×
426
                .add(0, -1.5, 0)
×
427
                .add(Vec3.atLowerCornerOf(partPos.getSide().getUnitVec3i()).multiply(0.75, 0.75, 0.75))
×
428
        );
429

430
//        helper.getLevel().sendParticles(new ParticleBlurData(1, 1, 1, 1, 100), player.position().x, player.position().y + player.getEyeHeight(), player.position().z, 10, 0, 0, 0, 0); // For debugging
431
    }
×
432

433
    public static boolean setOffset(PartPos partPos, Vec3i offset) {
434
        PartHelpers.PartStateHolder<?, ?> partAndState = PartHelpers.getPart(partPos);
×
435
        return ((IPartType) partAndState.getPart()).setTargetOffset(partAndState.getState(), partPos, offset);
×
436
    }
437

438
    public static void setOffsetSide(PartPos partPos, Direction direction) {
439
        PartHelpers.PartStateHolder<?, ?> partAndState = PartHelpers.getPart(partPos);
×
440
        ((IPartType) partAndState.getPart()).setTargetSideOverride(partAndState.getState(), direction);
×
441
    }
×
442

443
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc