Skip to content

Commit 39e4adb

Browse files
committed
feat: ✨ Added linked storage to SB Create integration
1 parent 6a19ada commit 39e4adb

8 files changed

Lines changed: 112 additions & 16 deletions

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ loader_version_range=[4,)
1515
mod_id=sophisticatedcore
1616
mod_name=Sophisticated Core
1717
mod_license=All Rights Reserved
18-
mod_version=1.5.0
18+
mod_version=1.5.1
1919
mod_group_id=net.p3pp3rf1y
2020
mod_authors=P3pp3rF1y
2121
mod_description=A library / shared functionality mod for Sophisticated Storage and Backpacks

src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/create/MountedStorageBase.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,4 +97,8 @@ protected void onOpen(ServerLevel level, Vec3 pos) {
9797
public void onContraptionDestroyed() {
9898

9999
}
100+
101+
public void onContraptionRemoved() {
102+
103+
}
100104
}

src/main/java/net/p3pp3rf1y/sophisticatedcore/compat/create/MountedStorageSettingsContainerMenuBase.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public int getContraptionEntityId() {
4141
return contraptionEntityId;
4242
}
4343

44-
private void sendStorageSettingsToClient() {
44+
protected void sendStorageSettingsToClient() {
4545
if (player.level().isClientSide) {
4646
return;
4747
}

src/main/java/net/p3pp3rf1y/sophisticatedcore/linkedstorage/EnderLinkerItem.java

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import net.minecraft.core.particles.ParticleTypes;
66
import net.minecraft.network.chat.Component;
77
import net.minecraft.server.level.ServerLevel;
8+
import net.minecraft.server.level.ServerPlayer;
89
import net.minecraft.sounds.SoundEvents;
910
import net.minecraft.sounds.SoundSource;
1011
import net.minecraft.world.InteractionResult;
@@ -29,6 +30,8 @@
2930
import javax.annotation.Nullable;
3031

3132
import java.util.List;
33+
import java.util.Objects;
34+
import java.util.Optional;
3235
import java.util.function.BiFunction;
3336

3437
public class EnderLinkerItem extends ItemBase {
@@ -46,12 +49,12 @@ public int getMaxStackSize(ItemStack stack) {
4649

4750
@Override
4851
public boolean overrideStackedOnOther(ItemStack linker, Slot slot, ClickAction action, Player player) {
49-
return action == ClickAction.SECONDARY && tryLinkStack(player, linker, slot.getItem());
52+
return action == ClickAction.SECONDARY && tryLinkItemEndpoint(player, linker, slot.getItem()).isPresent();
5053
}
5154

5255
@Override
5356
public boolean overrideOtherStackedOnMe(ItemStack linker, ItemStack endpoint, Slot slot, ClickAction action, Player player, SlotAccess carriedAccess) {
54-
return action == ClickAction.SECONDARY && tryLinkStack(player, linker, endpoint);
57+
return action == ClickAction.SECONDARY && tryLinkItemEndpoint(player, linker, endpoint).isPresent();
5558
}
5659

5760
@Override
@@ -75,23 +78,38 @@ private static TriState tryLinkBlock(Player player, ItemStack linker, Level leve
7578
if (level.isClientSide()) {
7679
return TriState.TRUE;
7780
}
78-
if (!(level instanceof ServerLevel) || !linkBlock(player, linker, endpoint, pos)) {
81+
Optional<LinkedStorageService.LinkResult> result = tryLinkInteractionTarget(player, linker, endpoint, pos);
82+
if (result.isEmpty() || result.get() != LinkedStorageService.LinkResult.SUCCESS) {
7983
return TriState.FALSE;
8084
}
8185
return TriState.TRUE;
8286
}
8387

84-
private static boolean tryLinkStack(Player player, ItemStack linker, ItemStack endpoint) {
85-
if (!LinkedStorageService.isLinkCandidate(endpoint)) {
86-
return false;
87-
}
88-
linkWithFeedback(player, linker, null, (level, linkerToBind) -> LinkedStorageService.linkWithResult(level, player.getUUID(), linkerToBind, endpoint));
89-
return true;
88+
public static Optional<LinkedStorageService.LinkResult> tryLinkItemInteractionTarget(Player player, ItemStack linker,
89+
ILinkedStorageItemInteractionTarget target, @Nullable BlockPos feedbackPos) {
90+
return tryLinkInteractionTarget(player, linker, target, feedbackPos);
91+
}
92+
93+
private static Optional<LinkedStorageService.LinkResult> tryLinkItemEndpoint(Player player, ItemStack linker, ItemStack endpoint) {
94+
return tryLinkItemInteractionTarget(player, linker, () -> endpoint, null);
9095
}
9196

92-
private static boolean linkBlock(Player player, ItemStack linker, ILinkedStorageBlockEndpoint endpoint, BlockPos blockPos) {
93-
return linkWithFeedback(player, linker, blockPos, (level, linkerToBind) -> LinkedStorageService.linkWithResult(level, player.getUUID(), linkerToBind,
94-
endpoint)) == LinkedStorageService.LinkResult.SUCCESS;
97+
public static Optional<LinkedStorageService.LinkResult> tryLinkInteractionTarget(Player player, ItemStack linker, ILinkedStorageInteractionTarget target,
98+
@Nullable BlockPos feedbackPos) {
99+
if (!target.isLinkedStorageLinkCandidate()) {
100+
return Optional.empty();
101+
}
102+
103+
LinkedStorageEndpointData previousEndpoint = target.getLinkedStorageEndpointData();
104+
LinkedStorageService.LinkResult result = linkWithFeedback(player, linker, feedbackPos,
105+
(level, linkerToBind) -> target.link(level, player.getUUID(), linkerToBind));
106+
if (result == LinkedStorageService.LinkResult.SUCCESS && player instanceof ServerPlayer serverPlayer) {
107+
LinkedStorageEndpointData currentEndpoint = target.getLinkedStorageEndpointData();
108+
if (!Objects.equals(previousEndpoint, currentEndpoint)) {
109+
target.onLinkedStorageEndpointChanged(serverPlayer, previousEndpoint, currentEndpoint);
110+
}
111+
}
112+
return Optional.of(result);
95113
}
96114

97115
private static LinkedStorageService.LinkResult linkWithFeedback(Player player, ItemStack linker, @Nullable BlockPos blockPos,
Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,26 @@
11
package net.p3pp3rf1y.sophisticatedcore.linkedstorage;
22

3+
import net.minecraft.server.level.ServerLevel;
4+
import net.minecraft.world.item.ItemStack;
5+
36
import javax.annotation.Nullable;
47

5-
public interface ILinkedStorageBlockEndpoint {
8+
import java.util.UUID;
9+
10+
public interface ILinkedStorageBlockEndpoint extends ILinkedStorageInteractionTarget {
11+
@Override
12+
default boolean isLinkedStorageLinkCandidate() {
13+
return true;
14+
}
15+
616
@Nullable
17+
@Override
718
LinkedStorageEndpointData getLinkedStorageEndpointData();
819

920
ILinkedStorageEndpointAdapter<ILinkedStorageBlockEndpoint> getLinkedStorageBlockEndpointAdapter();
21+
22+
@Override
23+
default LinkedStorageService.LinkResult link(ServerLevel level, UUID playerId, ItemStack linker) {
24+
return LinkedStorageService.linkWithResult(level, playerId, linker, this);
25+
}
1026
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package net.p3pp3rf1y.sophisticatedcore.linkedstorage;
2+
3+
import net.minecraft.server.level.ServerLevel;
4+
import net.minecraft.server.level.ServerPlayer;
5+
import net.minecraft.world.item.ItemStack;
6+
7+
import javax.annotation.Nullable;
8+
9+
import java.util.UUID;
10+
11+
public interface ILinkedStorageInteractionTarget {
12+
boolean isLinkedStorageLinkCandidate();
13+
14+
@Nullable
15+
LinkedStorageEndpointData getLinkedStorageEndpointData();
16+
17+
LinkedStorageService.LinkResult link(ServerLevel level, UUID playerId, ItemStack linker);
18+
19+
default void onLinkedStorageEndpointChanged(ServerPlayer player, @Nullable LinkedStorageEndpointData previousEndpoint,
20+
@Nullable LinkedStorageEndpointData currentEndpoint) {
21+
}
22+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package net.p3pp3rf1y.sophisticatedcore.linkedstorage;
2+
3+
import net.minecraft.server.level.ServerLevel;
4+
import net.minecraft.world.item.ItemStack;
5+
import net.p3pp3rf1y.sophisticatedcore.init.ModCoreDataComponents;
6+
7+
import java.util.UUID;
8+
9+
public interface ILinkedStorageItemInteractionTarget extends ILinkedStorageInteractionTarget {
10+
ItemStack getLinkedStorageItem();
11+
12+
@Override
13+
default boolean isLinkedStorageLinkCandidate() {
14+
return LinkedStorageService.isLinkCandidate(getLinkedStorageItem());
15+
}
16+
17+
@Override
18+
default LinkedStorageEndpointData getLinkedStorageEndpointData() {
19+
return getLinkedStorageItem().get(ModCoreDataComponents.LINKED_STORAGE_ENDPOINT);
20+
}
21+
22+
@Override
23+
default LinkedStorageService.LinkResult link(ServerLevel level, UUID playerId, ItemStack linker) {
24+
return LinkedStorageService.linkWithResult(level, playerId, linker, getLinkedStorageItem());
25+
}
26+
}

src/main/java/net/p3pp3rf1y/sophisticatedcore/mixin/create/MixinAbstractContraptionEntity.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,17 @@ public class MixinAbstractContraptionEntity {
1818
@Inject(method = "remove", at = @At("HEAD"))
1919
private void cleanupMountedStoragesOnDestroy(Entity.RemovalReason removalReason, CallbackInfo ci) {
2020
AbstractContraptionEntity contraptionEntity = (AbstractContraptionEntity) (Object) this;
21-
if (contraptionEntity.level().isClientSide() || contraption == null || contraption.disassembled || removalReason != Entity.RemovalReason.KILLED) {
21+
if (contraptionEntity.level().isClientSide() || contraption == null) {
22+
return;
23+
}
24+
25+
contraption.getStorage().getAllItemStorages().values().forEach(storage -> {
26+
if (storage instanceof MountedStorageBase mountedStorage) {
27+
mountedStorage.onContraptionRemoved();
28+
}
29+
});
30+
31+
if (contraption.disassembled || removalReason != Entity.RemovalReason.KILLED) {
2232
return;
2333
}
2434

0 commit comments

Comments
 (0)