Skip to content

Commit 626bf40

Browse files
committed
feat: ✨ Added linked storage to SB Create integration
1 parent e5c526b commit 626bf40

8 files changed

Lines changed: 107 additions & 16 deletions

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ mod_id=sophisticatedcore
77
mod_name=Sophisticated Core
88
mod_license=All Rights Reserved
99
mod_group_id=net.p3pp3rf1y
10-
mod_version=1.5.0
10+
mod_version=1.5.1
1111
sonar_project_key=sophisticatedcore:SophisticatedCore
1212
github_package_url=https://maven.pkg.github.com/P3pp3rF1y/SophisticatedCore
1313

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
@@ -39,7 +39,7 @@ public int getContraptionEntityId() {
3939
return contraptionEntityId;
4040
}
4141

42-
private void sendStorageSettingsToClient() {
42+
protected void sendStorageSettingsToClient() {
4343
if (player.level().isClientSide) {
4444
return;
4545
}

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

Lines changed: 26 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;
@@ -27,6 +28,8 @@
2728
import javax.annotation.Nullable;
2829

2930
import java.util.List;
31+
import java.util.Objects;
32+
import java.util.Optional;
3033
import java.util.function.BiFunction;
3134

3235
public class EnderLinkerItem extends ItemBase {
@@ -44,12 +47,12 @@ public int getMaxStackSize(ItemStack stack) {
4447

4548
@Override
4649
public boolean overrideStackedOnOther(ItemStack linker, Slot slot, ClickAction action, Player player) {
47-
return action == ClickAction.SECONDARY && tryLinkStack(player, linker, slot.getItem());
50+
return action == ClickAction.SECONDARY && tryLinkItemInteractionTarget(player, linker, () -> slot.getItem(), null).isPresent();
4851
}
4952

5053
@Override
5154
public boolean overrideOtherStackedOnMe(ItemStack linker, ItemStack endpoint, Slot slot, ClickAction action, Player player, SlotAccess carriedAccess) {
52-
return action == ClickAction.SECONDARY && tryLinkStack(player, linker, endpoint);
55+
return action == ClickAction.SECONDARY && tryLinkItemInteractionTarget(player, linker, () -> endpoint, null).isPresent();
5356
}
5457

5558
@Override
@@ -73,20 +76,31 @@ private static LinkAttempt tryLinkBlock(Player player, ItemStack linker, Level l
7376
if (level.isClientSide) {
7477
return LinkAttempt.SUCCESS;
7578
}
76-
return level instanceof ServerLevel && linkBlock(player, linker, endpoint, pos) ? LinkAttempt.SUCCESS : LinkAttempt.FAILURE;
79+
Optional<LinkedStorageService.LinkResult> result = tryLinkInteractionTarget(player, linker, endpoint, pos);
80+
return result.isPresent() && result.get() == LinkedStorageService.LinkResult.SUCCESS ? LinkAttempt.SUCCESS : LinkAttempt.FAILURE;
7781
}
7882

79-
private static boolean tryLinkStack(Player player, ItemStack linker, ItemStack endpoint) {
80-
if (!LinkedStorageService.isLinkCandidate(endpoint)) {
81-
return false;
82-
}
83-
linkWithFeedback(player, linker, null, (level, linkerToBind) -> LinkedStorageService.linkWithResult(level, player.getUUID(), linkerToBind, endpoint));
84-
return true;
83+
public static Optional<LinkedStorageService.LinkResult> tryLinkItemInteractionTarget(Player player, ItemStack linker,
84+
ILinkedStorageItemInteractionTarget target, @Nullable BlockPos feedbackPos) {
85+
return tryLinkInteractionTarget(player, linker, target, feedbackPos);
8586
}
8687

87-
private static boolean linkBlock(Player player, ItemStack linker, ILinkedStorageBlockEndpoint endpoint, BlockPos blockPos) {
88-
return linkWithFeedback(player, linker, blockPos, (level, linkerToBind) -> LinkedStorageService.linkWithResult(level, player.getUUID(), linkerToBind,
89-
endpoint)) == LinkedStorageService.LinkResult.SUCCESS;
88+
public static Optional<LinkedStorageService.LinkResult> tryLinkInteractionTarget(Player player, ItemStack linker, ILinkedStorageInteractionTarget target,
89+
@Nullable BlockPos feedbackPos) {
90+
if (!target.isLinkedStorageLinkCandidate()) {
91+
return Optional.empty();
92+
}
93+
94+
LinkedStorageEndpointData previousEndpoint = target.getLinkedStorageEndpointData();
95+
LinkedStorageService.LinkResult result = linkWithFeedback(player, linker, feedbackPos,
96+
(level, linkerToBind) -> target.link(level, player.getUUID(), linkerToBind));
97+
if (result == LinkedStorageService.LinkResult.SUCCESS && player instanceof ServerPlayer serverPlayer) {
98+
LinkedStorageEndpointData currentEndpoint = target.getLinkedStorageEndpointData();
99+
if (!Objects.equals(previousEndpoint, currentEndpoint)) {
100+
target.onLinkedStorageEndpointChanged(serverPlayer, previousEndpoint, currentEndpoint);
101+
}
102+
}
103+
return Optional.of(result);
90104
}
91105

92106
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: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package net.p3pp3rf1y.sophisticatedcore.linkedstorage;
2+
3+
import net.minecraft.server.level.ServerLevel;
4+
import net.minecraft.world.item.ItemStack;
5+
6+
import java.util.UUID;
7+
8+
public interface ILinkedStorageItemInteractionTarget extends ILinkedStorageInteractionTarget {
9+
ItemStack getLinkedStorageItem();
10+
11+
@Override
12+
default boolean isLinkedStorageLinkCandidate() {
13+
return LinkedStorageService.isLinkCandidate(getLinkedStorageItem());
14+
}
15+
16+
@Override
17+
default LinkedStorageEndpointData getLinkedStorageEndpointData() {
18+
return LinkedStorageStackData.getEndpoint(getLinkedStorageItem());
19+
}
20+
21+
@Override
22+
default LinkedStorageService.LinkResult link(ServerLevel level, UUID playerId, ItemStack linker) {
23+
return LinkedStorageService.linkWithResult(level, playerId, linker, getLinkedStorageItem());
24+
}
25+
}

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)