Skip to content

Commit 8915796

Browse files
committed
fix: Releasing a mob from a stack of vials deletes the rest of the vials in the stack
Closes: GH-1146
1 parent c9db225 commit 8915796

File tree

1 file changed

+30
-23
lines changed

1 file changed

+30
-23
lines changed

enderio-base/src/main/java/com/enderio/base/common/item/tool/SoulVialItem.java

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -108,24 +108,24 @@ public void addDetailedTooltips(ItemStack itemStack, @Nullable Player player, Li
108108
// region Interactions
109109

110110
@Override
111-
public InteractionResult interactLivingEntity(ItemStack pStack, Player pPlayer, LivingEntity pInteractionTarget,
112-
InteractionHand pUsedHand) {
113-
if (pPlayer.level().isClientSide) {
111+
public InteractionResult interactLivingEntity(ItemStack stack, Player player, LivingEntity interactionTarget,
112+
InteractionHand usedHand) {
113+
if (player.level().isClientSide) {
114114
return InteractionResult.FAIL;
115115
}
116116

117-
Optional<ItemStack> itemStack = catchEntity(pStack, pInteractionTarget,
118-
component -> pPlayer.displayClientMessage(component, true));
117+
Optional<ItemStack> itemStack = catchEntity(stack, interactionTarget,
118+
component -> player.displayClientMessage(component, true));
119119
if (itemStack.isPresent()) {
120120
ItemStack filledVial = itemStack.get();
121-
ItemStack hand = pPlayer.getItemInHand(pUsedHand);
121+
ItemStack hand = player.getItemInHand(usedHand);
122122
if (hand.isEmpty()) {
123123
hand.setCount(1); // Forge will fire the destroyItemEvent and vanilla replaces it to
124124
// ItemStack.EMPTY if this isn't done
125-
pPlayer.setItemInHand(pUsedHand, filledVial);
125+
player.setItemInHand(usedHand, filledVial);
126126
} else {
127-
if (!pPlayer.addItem(filledVial)) {
128-
pPlayer.drop(filledVial, false);
127+
if (!player.addItem(filledVial)) {
128+
player.drop(filledVial, false);
129129
}
130130
}
131131
return InteractionResult.SUCCESS;
@@ -134,20 +134,25 @@ public InteractionResult interactLivingEntity(ItemStack pStack, Player pPlayer,
134134
}
135135

136136
@Override
137-
public InteractionResult useOn(UseOnContext pContext) {
138-
if (pContext.getLevel().isClientSide) {
137+
public InteractionResult useOn(UseOnContext context) {
138+
if (context.getLevel().isClientSide) {
139139
return InteractionResult.FAIL;
140140
}
141141

142-
Player player = pContext.getPlayer();
142+
Player player = context.getPlayer();
143143

144144
// Only players may use the soul vial
145145
if (player == null) {
146146
return InteractionResult.FAIL;
147147
}
148148

149-
return releaseEntity(pContext.getLevel(), pContext.getItemInHand(), pContext.getClickedFace(),
150-
pContext.getClickedPos(), emptyVial -> player.setItemInHand(pContext.getHand(), emptyVial));
149+
return releaseEntity(context.getLevel(), context.getItemInHand(), context.getClickedFace(), context.getClickedPos(), () -> {
150+
context.getItemInHand().shrink(1);
151+
var emptyVial = EIOItems.SOUL_VIAL.get().getDefaultInstance();
152+
if (!player.addItem(emptyVial)) {
153+
player.drop(emptyVial, false);
154+
}
155+
});
151156
}
152157

153158
/**
@@ -199,7 +204,7 @@ private static Optional<ItemStack> catchEntity(ItemStack soulVial, LivingEntity
199204
}
200205

201206
private static InteractionResult releaseEntity(Level level, ItemStack filledVial, Direction face, BlockPos pos,
202-
Consumer<ItemStack> emptyVialSetter) {
207+
Runnable vialConsumed) {
203208
var storedSoul = filledVial.get(EIODataComponents.SOUL);
204209

205210
if (storedSoul != null && storedSoul.hasEntity()) {
@@ -220,7 +225,8 @@ private static InteractionResult releaseEntity(Level level, ItemStack filledVial
220225
ent.setYRot(rotation);
221226
level.addFreshEntity(ent);
222227
});
223-
emptyVialSetter.accept(EIOItems.SOUL_VIAL.get().getDefaultInstance());
228+
229+
vialConsumed.run();
224230
}
225231

226232
return InteractionResult.SUCCESS;
@@ -261,7 +267,7 @@ public static void onLivingInteract(PlayerInteractEvent.EntityInteractSpecific e
261267
stack = stack.copy();
262268
}
263269

264-
if (stack.is(EIOItems.SOUL_VIAL.get())) {
270+
if (stack.is(EIOItems.SOUL_VIAL)) {
265271
if (event.getTarget() instanceof AbstractHorse || event.getTarget() instanceof Villager
266272
|| event.getTarget() instanceof WanderingTrader || event.getTarget() instanceof Wolf) {
267273
stack.interactLivingEntity(event.getEntity(), (LivingEntity) event.getTarget(), event.getHand());
@@ -291,10 +297,12 @@ protected ItemStack execute(BlockSource source, ItemStack stack) {
291297

292298
private ItemStack release(BlockSource source, ItemStack stack) {
293299
Direction dispenserDirection = source.state().getValue(DispenserBlock.FACING);
294-
AtomicReference<ItemStack> emptyVial = new AtomicReference<>();
295-
releaseEntity(source.level(), stack, dispenserDirection, source.pos(), emptyVial::set);
296-
if (emptyVial.get() != null) {
297-
return emptyVial.get();
300+
AtomicReference<ItemStack> resultStack = new AtomicReference<>();
301+
releaseEntity(source.level(), stack, dispenserDirection, source.pos(),
302+
() -> this.consumeWithRemainder(source, stack, EIOItems.SOUL_VIAL.get().getDefaultInstance()));
303+
304+
if (resultStack.get() != null) {
305+
return resultStack.get();
298306
} else {
299307
this.setSuccess(false);
300308
return stack;
@@ -308,8 +316,7 @@ private ItemStack capture(BlockSource source, ItemStack stack) {
308316
living -> !(living instanceof Player))) {
309317

310318
// Copy, consumeWithRemainder will shrink the stack.
311-
Optional<ItemStack> filledVial = catchEntity(stack.copy(), livingentity, component -> {
312-
});
319+
Optional<ItemStack> filledVial = catchEntity(stack.copy(), livingentity, component -> {});
313320
if (filledVial.isPresent()) {
314321
return this.consumeWithRemainder(source, stack, filledVial.get());
315322
}

0 commit comments

Comments
 (0)