From 32d645776e50a99844c3fbdbabeef3c68c523e40 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sat, 5 Jan 2019 10:14:52 -0500 Subject: [PATCH] Add Multipart add/remove hooks --- .../AbstractContainerBlockEntity.java | 17 ++++++++++------- .../simplemultipart/multipart/Multipart.java | 18 ++++++++++++++++++ .../multipart/MultipartState.java | 16 ++++++++++++++++ 3 files changed, 44 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/shadowfacts/simplemultipart/container/AbstractContainerBlockEntity.java b/src/main/java/net/shadowfacts/simplemultipart/container/AbstractContainerBlockEntity.java index 743e8da..993d116 100644 --- a/src/main/java/net/shadowfacts/simplemultipart/container/AbstractContainerBlockEntity.java +++ b/src/main/java/net/shadowfacts/simplemultipart/container/AbstractContainerBlockEntity.java @@ -120,7 +120,6 @@ public abstract class AbstractContainerBlockEntity extends BlockEntity implement return; } - Entry e = new Entry(this, partState, null); if (partState.getMultipart() instanceof MultipartEntityProvider) { e.entity = ((MultipartEntityProvider)partState.getMultipart()).createMultipartEntity(partState, this); @@ -128,17 +127,20 @@ public abstract class AbstractContainerBlockEntity extends BlockEntity implement } parts.add(e); + partState.onPartAdded(e); + invalidateSidePartCache(); updateWorld(); } @Override public void remove(MultipartView view) { - if (view.getContainer() != this) { + if (view.getContainer() != this || !(view instanceof Entry)) { return; } - parts.removeIf(e -> e.state == view.getState() && e.entity == view.getEntity()); + parts.remove(view); + view.getState().onPartRemoved(view); if (parts.isEmpty()) { world.setBlockState(pos, Blocks.AIR.getDefaultState()); @@ -150,18 +152,19 @@ public abstract class AbstractContainerBlockEntity extends BlockEntity implement @Override public boolean breakPart(MultipartView view) { - Optional entry = parts.stream().filter(e -> e.state == view.getState() && e.entity == view.getEntity()).findFirst(); - if (!entry.isPresent()) { + if (view.getContainer() != this || !(view instanceof Entry)) { return false; } + Entry e = (Entry)view; + if (world instanceof ServerWorld) { - List drops = getDroppedStacks(entry.get(), (ServerWorld)world, pos); + List drops = getDroppedStacks(e, (ServerWorld)world, pos); drops.forEach(stack -> Block.dropStack(world, pos, stack)); // TODO: don't drop if player is creative } - remove(view); + remove(e); updateWorld(); diff --git a/src/main/java/net/shadowfacts/simplemultipart/multipart/Multipart.java b/src/main/java/net/shadowfacts/simplemultipart/multipart/Multipart.java index 40745a1..102f5ab 100644 --- a/src/main/java/net/shadowfacts/simplemultipart/multipart/Multipart.java +++ b/src/main/java/net/shadowfacts/simplemultipart/multipart/Multipart.java @@ -13,6 +13,7 @@ import net.minecraft.world.loot.LootSupplier; import net.minecraft.world.loot.LootTables; import net.minecraft.world.loot.context.LootContext; import net.shadowfacts.simplemultipart.SimpleMultipart; +import net.shadowfacts.simplemultipart.container.MultipartContainer; import net.shadowfacts.simplemultipart.util.MultipartPlacementContext; import java.util.List; @@ -143,4 +144,21 @@ public abstract class Multipart { return false; } + /** + * Called after this multipart (and it's entity, if there is one) has been added to the container. + * @param view The view of this part. + */ + @Deprecated + public void onPartAdded(MultipartView view) { + } + + /** + * Called after this part has been removed from its container. + * @param view The view of this part. + * The multipart entity and container in this view are still present, but the part is no longer in the container. + */ + @Deprecated + public void onPartRemoved(MultipartView view) { + } + } diff --git a/src/main/java/net/shadowfacts/simplemultipart/multipart/MultipartState.java b/src/main/java/net/shadowfacts/simplemultipart/multipart/MultipartState.java index f84592a..b7adf3a 100644 --- a/src/main/java/net/shadowfacts/simplemultipart/multipart/MultipartState.java +++ b/src/main/java/net/shadowfacts/simplemultipart/multipart/MultipartState.java @@ -57,4 +57,20 @@ public class MultipartState extends AbstractPropertyContainer