Skip to content

Commit

Permalink
Made /open give you back your items when you close the inventory
Browse files Browse the repository at this point in the history
  • Loading branch information
Calcilore committed Feb 21, 2025
1 parent 5f007f7 commit a803630
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 3 deletions.
41 changes: 38 additions & 3 deletions src/main/java/net/estools/Commands/Open.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,28 @@

import net.estools.Main;
import net.estools.PlayerCommand;
import net.estools.ServerApi.EsEventListener;
import net.estools.ServerApi.EsInventoryType;
import net.estools.ServerApi.Interfaces.EsCommandSender;
import net.estools.ServerApi.Interfaces.EsPlayer;
import net.estools.ServerApi.EsLocation;
import net.estools.ServerApi.Events.EsInventoryCloseEvent;
import net.estools.ServerApi.Interfaces.*;

import java.util.*;

// TODO: Make functional: anvil, blast_furnace, furnace, smoker, brewing, cartography, enchanting, grindstone, loom,
// smithing
public class Open extends PlayerCommand {
public class Open extends PlayerCommand implements EsEventListener {
private static final Set<EsInventoryType> INVALID_TYPES = new HashSet<>(Arrays.asList(EsInventoryType.CRAFTING,
EsInventoryType.CHISELED_BOOKSHELF, EsInventoryType.COMPOSTER, EsInventoryType.CREATIVE,
EsInventoryType.JUKEBOX, EsInventoryType.MERCHANT, EsInventoryType.PLAYER, EsInventoryType.ENCHANTING));

private static final HashSet<UUID> playersWithOpenInv = new HashSet<>();

@Override
public void onEnable() {
Main.registerEvents(this);
}

@Override
public boolean execute(EsCommandSender sender, String[] args) {
if (args.length == 0) {
Expand Down Expand Up @@ -55,6 +64,11 @@ public boolean execute(EsCommandSender sender, String[] args) {
target.openInventory(Main.server.createInventory(target, type));
}

// Workbench already handles items dropping, so no need to mark as opened
if (type != EsInventoryType.WORKBENCH) {
playersWithOpenInv.add(target.getUniqueId());
}

send(sender, "&aOpened inventory!");
return true;
}
Expand All @@ -77,4 +91,25 @@ public List<String> tabComplete(EsCommandSender sender, String[] args, String lA

return new ArrayList<>();
}

@Override
public void executeEvent(EsEvent event) {
if (!(event instanceof EsInventoryCloseEvent)) {
return;
}

EsInventoryCloseEvent e = (EsInventoryCloseEvent) event;
EsPlayer player = e.getPlayer();
UUID uid = player.getUniqueId();
EsLocation dropLoc = player.getLocation();

if (playersWithOpenInv.remove(uid)) {
EsInventory inv = e.getInventory();
for (EsItemStack item : inv.getContents()) {
if (item != null) {
player.getInventory().addItemOrDrop(item, dropLoc);
}
}
}
}
}
14 changes: 14 additions & 0 deletions src/test/java/net/estools/Commands/OpenCommandTest.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package net.estools.Commands;

import net.estools.Implementation.TestItemStack;
import net.estools.ServerApi.EsMaterial;
import net.estools.ServerApi.Events.EsInventoryCloseEvent;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.Arrays;

public class OpenCommandTest extends EsToolsCommandTest {

@Test
Expand All @@ -15,6 +20,15 @@ public void openInventory() {
player.closeInventory();
executeAssertSuccess("open chest");
Assertions.assertNotNull(player.getOpenInventory());

// add dirt to chest, close inventory, now the player should have dirt in inventory
player.getOpenInventory().addItem(new TestItemStack(EsMaterial.fromKey("dirt"), 1));

triggerEvent(new EsInventoryCloseEvent(player, player.getOpenInventory()));
player.closeInventory();

Assertions.assertTrue(Arrays.stream(player.getInventory().getContents())
.anyMatch(i -> i != null && i.getType().equals(EsMaterial.fromKey("dirt"))));
}

@Test
Expand Down

0 comments on commit a803630

Please sign in to comment.