Skip to content

Commit 3ba70ef

Browse files
committed
Now Wires are spent and dropped when connecting and disconnecting them
1 parent e1921a6 commit 3ba70ef

6 files changed

Lines changed: 69 additions & 38 deletions

File tree

src/main/java/falseresync/vivatech/common/item/PliersItem.java

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,33 @@
44
import falseresync.vivatech.common.power.GridVertex;
55
import net.minecraft.item.ItemStack;
66
import net.minecraft.item.ItemUsageContext;
7+
import net.minecraft.server.network.ServerPlayerEntity;
78
import net.minecraft.util.ActionResult;
8-
import net.minecraft.world.World;
9+
import net.minecraft.util.math.GlobalPos;
10+
import net.minecraft.util.math.MathHelper;
911

1012
public class PliersItem extends WireManagementItem {
1113
public PliersItem(Settings settings) {
1214
super(settings);
1315
}
1416

1517
@Override
16-
protected ActionResult manageWire(ItemUsageContext context, GridVertex vertexU, GridVertex vertexV) {
17-
if (!context.getWorld().isClient) {
18-
var gridsManager = Vivatech.getServerGridsLoader().getGridsManager(context.getWorld());
19-
var grid = gridsManager.find(vertexU.pos(), vertexV.pos());
18+
protected ActionResult manageWire(ItemUsageContext context, GlobalPos connection, GridVertex vertexU, GridVertex vertexV) {
19+
if (context.getPlayer() instanceof ServerPlayerEntity player) {
20+
var grid = Vivatech.getServerGridsLoader().getGridsManager(context.getWorld())
21+
.find(vertexU.pos(), vertexV.pos());
2022
if (grid == null) {
2123
return ActionResult.FAIL;
2224
}
23-
return grid.disconnect(vertexU, vertexV) ? ActionResult.CONSUME : ActionResult.FAIL;
25+
26+
if (grid.disconnect(vertexU, vertexV)) {
27+
player.getInventory().offerOrDrop(new ItemStack(VivatechItems.WIRE, MathHelper.floor(vertexU.pos().subtract(vertexV.pos()).toCenterPos().length())));
28+
return ActionResult.SUCCESS;
29+
}
30+
31+
return ActionResult.FAIL;
2432
}
2533

26-
return ActionResult.SUCCESS;
34+
return ActionResult.CONSUME;
2735
}
2836
}

src/main/java/falseresync/vivatech/common/item/WireItem.java

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@
99
import net.minecraft.entity.player.PlayerEntity;
1010
import net.minecraft.item.ItemStack;
1111
import net.minecraft.item.ItemUsageContext;
12+
import net.minecraft.server.network.ServerPlayerEntity;
1213
import net.minecraft.util.ActionResult;
1314
import net.minecraft.util.Colors;
14-
import net.minecraft.util.ItemScatterer;
15+
import net.minecraft.util.math.GlobalPos;
1516
import net.minecraft.util.math.MathHelper;
1617
import net.minecraft.world.World;
1718

@@ -21,16 +22,26 @@ public WireItem(Settings settings) {
2122
}
2223

2324
@Override
24-
protected ActionResult manageWire(ItemUsageContext context, GridVertex vertexU, GridVertex vertexV) {
25-
if (!context.getWorld().isClient) {
26-
var gridsManager = Vivatech.getServerGridsLoader().getGridsManager(context.getWorld());
27-
var grid = gridsManager.findOrCreate(vertexU.pos(), vertexV.pos(), WireType.V_230);
25+
protected ActionResult manageWire(ItemUsageContext context, GlobalPos connection, GridVertex vertexU, GridVertex vertexV) {
26+
if (context.getPlayer() instanceof ServerPlayerEntity player) {
27+
var stack = context.getStack();
28+
if (!connection.pos().isWithinDistance(player.getPos(), stack.getCount() * 5D/4)) {
29+
stack.remove(VivatechComponents.ITEM_BAR);
30+
player.dropItem(stack.copy(), true);
31+
player.getInventory().dropSelectedItem(true);
32+
return ActionResult.FAIL;
33+
}
34+
35+
var grid = Vivatech.getServerGridsLoader().getGridsManager(context.getWorld())
36+
.findOrCreate(vertexU.pos(), vertexV.pos(), WireType.V_230);
2837
if (grid.getWireType() != WireType.V_230) {
2938
return ActionResult.FAIL;
3039
}
40+
3141
if (grid.connect(vertexU, vertexV)) {
32-
context.getStack().remove(VivatechComponents.ITEM_BAR);
33-
context.getStack().decrement((int) (vertexU.pos().subtract(vertexV.pos()).toBottomCenterPos().length() * 4D/5));
42+
stack.remove(VivatechComponents.ITEM_BAR);
43+
stack.decrement(MathHelper.ceil(vertexU.pos().subtract(vertexV.pos()).toCenterPos().length()));
44+
player.setStackInHand(context.getHand(), stack);
3445
return ActionResult.SUCCESS;
3546
}
3647
}
@@ -53,17 +64,8 @@ public void inventoryTick(ItemStack stack, World world, Entity entity, int slot,
5364
return;
5465
}
5566

56-
if (!connection.pos().isWithinDistance(player.getPos(), stack.getCount() * 5D/4)) {
57-
stack.remove(VivatechComponents.CONNECTION);
58-
stack.remove(VivatechComponents.ITEM_BAR);
59-
player.getInventory().removeStack(player.getInventory().getSlotWithStack(stack));
60-
var middle = player.getPos().add(connection.pos().toCenterPos()).multiply(0.5f);
61-
ItemScatterer.spawn(world, middle.x, middle.y, middle.z, stack);
62-
return;
63-
}
64-
6567
stack.set(VivatechComponents.ITEM_BAR, new ItemBarComponent(
66-
MathHelper.clamp(Math.round(13 - (float) (connection.pos().getSquaredDistance(player.getPos()) * 13 / Math.pow(stack.getCount() * 5D/4, 2))), 0, 13),
68+
MathHelper.clamp(Math.round(13 - (float) (connection.pos().getSquaredDistance(player.getPos()) * 13 / Math.pow(stack.getCount(), 2))), 1, 13),
6769
Colors.WHITE
6870
));
6971
}

src/main/java/falseresync/vivatech/common/item/WireManagementItem.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import net.minecraft.block.BlockState;
77
import net.minecraft.entity.player.PlayerEntity;
88
import net.minecraft.item.Item;
9-
import net.minecraft.item.ItemStack;
109
import net.minecraft.item.ItemUsageContext;
1110
import net.minecraft.util.ActionResult;
1211
import net.minecraft.util.math.BlockPos;
@@ -47,11 +46,11 @@ public ActionResult useOnBlock(ItemUsageContext context) {
4746
var previousVertex = PowerSystem.GRID_VERTEX.find(world, connection.pos(), null);
4847
if (previousVertex != null) {
4948
stack.remove(VivatechComponents.CONNECTION);
50-
return manageWire(context, previousVertex, currentVertex);
49+
return manageWire(context, connection, previousVertex, currentVertex);
5150
}
5251

5352
return ActionResult.success(context.getWorld().isClient);
5453
}
5554

56-
protected abstract ActionResult manageWire(ItemUsageContext context, GridVertex vertexU, GridVertex vertexV);
55+
protected abstract ActionResult manageWire(ItemUsageContext context, GlobalPos connection, GridVertex vertexU, GridVertex vertexV);
5756
}

src/main/java/falseresync/vivatech/common/power/Grid.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
import net.fabricmc.fabric.api.lookup.v1.block.BlockApiCache;
66
import net.minecraft.block.AbstractFireBlock;
77
import net.minecraft.block.BlockState;
8+
import net.minecraft.item.ItemStack;
89
import net.minecraft.server.world.ServerWorld;
10+
import net.minecraft.util.ItemScatterer;
911
import net.minecraft.util.math.BlockPos;
1012
import net.minecraft.util.math.MathHelper;
1113
import net.minecraft.world.GameRules;
@@ -106,9 +108,7 @@ public boolean remove(BlockPos pos, BlockState state) {
106108
return false;
107109
}
108110

109-
for (var edge : graph.edgesOf(vertex)) {
110-
gridsManager.onWireRemoved(edge.toServerWire());
111-
}
111+
graph.edgesOf(vertex).forEach(this::onWireRemoved);
112112
if (!graph.removeVertex(vertex)) {
113113
return false;
114114
}
@@ -127,7 +127,7 @@ public boolean disconnect(GridEdge edge) {
127127
return false;
128128
}
129129

130-
gridsManager.onWireRemoved(edge.toServerWire());
130+
onWireRemoved(edge);
131131
partition();
132132
return true;
133133
}
@@ -170,6 +170,12 @@ private void onVertexRemoved(GridVertex vertex) {
170170
}
171171
}
172172

173+
private void onWireRemoved(GridEdge edge) {
174+
var serverWire = edge.toServerWire();
175+
gridsManager.onWireRemoved(serverWire);
176+
serverWire.drop(world, wireType);
177+
}
178+
173179
private void clearVertexAssociatedCollections(BlockPos pos) {
174180
gridsManager.getGridLookup().remove(pos);
175181
vertexCaches.remove(pos);

src/main/java/falseresync/vivatech/common/power/Wire.java

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,26 @@
11
package falseresync.vivatech.common.power;
22

33
import com.google.common.collect.ImmutableSet;
4+
import net.fabricmc.api.EnvType;
5+
import net.fabricmc.api.Environment;
6+
import net.minecraft.item.ItemStack;
47
import net.minecraft.network.RegistryByteBuf;
58
import net.minecraft.network.codec.PacketCodec;
6-
import net.minecraft.util.math.BlockPos;
7-
import net.minecraft.util.math.ChunkPos;
8-
import net.minecraft.util.math.ChunkSectionPos;
9-
import net.minecraft.util.math.Vec3d;
9+
import net.minecraft.util.ItemScatterer;
10+
import net.minecraft.util.math.*;
11+
import net.minecraft.world.World;
1012

1113
import java.util.Objects;
1214

13-
public record Wire(ImmutableSet<BlockPos> positions, BlockPos u, BlockPos v, Vec3d start, Vec3d end, Vec3d middle, ChunkPos chunkPos) {
15+
public record Wire(
16+
ImmutableSet<BlockPos> positions,
17+
BlockPos u,
18+
BlockPos v,
19+
@Environment(EnvType.CLIENT) Vec3d start,
20+
@Environment(EnvType.CLIENT) Vec3d end,
21+
Vec3d middle,
22+
ChunkPos chunkPos
23+
) {
1424
public static final PacketCodec<RegistryByteBuf, Wire> PACKET_CODEC = PacketCodec.tuple(
1525
BlockPos.PACKET_CODEC, Wire::u,
1626
BlockPos.PACKET_CODEC, Wire::v,
@@ -29,6 +39,10 @@ public static Wire createClientWire(BlockPos u, BlockPos v) {
2939
return new Wire(ImmutableSet.of(u, v), u, v, u.toCenterPos(), v.toCenterPos(), middle, chunkPos);
3040
}
3141

42+
public void drop(World world, WireType type) {
43+
ItemScatterer.spawn(world, middle.x, middle.y, middle.z, new ItemStack(type.item(), MathHelper.floor(u.subtract(v).toCenterPos().length())));
44+
}
45+
3246
@Override
3347
public boolean equals(Object o) {
3448
if (this == o) return true;
Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
package falseresync.vivatech.common.power;
22

33
import falseresync.lib.registry.RegistryObject;
4+
import falseresync.vivatech.common.item.VivatechItems;
45
import net.fabricmc.fabric.api.event.registry.FabricRegistryBuilder;
56
import net.fabricmc.fabric.api.event.registry.RegistryAttribute;
7+
import net.minecraft.item.Item;
68
import net.minecraft.registry.Registry;
79
import net.minecraft.registry.RegistryKey;
810

911
import static falseresync.vivatech.common.Vivatech.vtId;
1012

11-
public record WireType(int voltage, int maxCurrent, int overcurrentToleranceTime) {
13+
public record WireType(Item item, int voltage, int maxCurrent, int overcurrentToleranceTime) {
1214
public static final Registry<WireType> REGISTRY =
1315
FabricRegistryBuilder.<WireType>createSimple(RegistryKey.ofRegistry(vtId("wire_types")))
1416
.attribute(RegistryAttribute.MODDED)
1517
.attribute(RegistryAttribute.SYNCED)
1618
.buildAndRegister();
1719

18-
public static final @RegistryObject WireType V_230 = new WireType(230, 32, 100);
20+
public static final @RegistryObject WireType V_230 = new WireType(VivatechItems.WIRE, 230, 32, 100);
1921
}

0 commit comments

Comments
 (0)