Skip to content

Commit

Permalink
Made /i drop items if your inventory is full, and added Unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Calcilore committed Jan 29, 2025
1 parent 719d38c commit 5f007f7
Show file tree
Hide file tree
Showing 9 changed files with 97 additions and 4 deletions.
2 changes: 1 addition & 1 deletion src/main/java/net/estools/Commands/Give/GiveItem.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ public boolean execute(EsCommandSender sender, String[] args) {
if (isSetHandItem) {
p.setMainHand(item);
} else {
p.getInventory().addItem(item);
p.getInventory().addItemOrDrop(item, p.getLocation().add(-p.getWidth(), 0.0, -p.getWidth()));
}
send(sender, "&aGave &6%s", item.getType());
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,16 @@ public EsLocation getLocation() {
return BukkitHelper.fromBukkitLocation(bukkitEntity.getLocation());
}

@Override
public double getWidth() {
return bukkitEntity.getWidth();
}

@Override
public double getHeight() {
return bukkitEntity.getHeight();
}

@Override
public boolean leaveVehicle() {
if (bukkitEntity instanceof LivingEntity) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,20 @@
package net.estools.ServerApi.Implementations.Bukkit;

import net.estools.ServerApi.EsLocation;
import net.estools.ServerApi.EsMaterial;
import net.estools.ServerApi.Implementations.Bukkit.Helpers.BukkitHelper;
import net.estools.ServerApi.Interfaces.EsInventory;
import net.estools.ServerApi.Interfaces.EsItemStack;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;

import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

public class BukkitInventory implements EsInventory {
private final @NotNull Inventory bukkitInv;
Expand Down Expand Up @@ -39,6 +43,18 @@ public void addItem(EsItemStack stack) {
bukkitInv.addItem(((BukkitItemStack) stack).getBukkitItem());
}

@Override
public void addItemOrDrop(EsItemStack stack, EsLocation location) {
HashMap<Integer, ItemStack> failed = bukkitInv.addItem(((BukkitItemStack) stack).getBukkitItem());

Location loc = BukkitHelper.toBukkitLocation(location);
World world = Objects.requireNonNull(loc.getWorld());

for (ItemStack item : failed.values()) {
world.dropItemNaturally(loc, item);
}
}

@Override
public void setContents(EsItemStack[] items) {
ItemStack[] bukkitItems = new ItemStack[items.length];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
package net.estools.ServerApi.Implementations.Folia;

import net.estools.ServerApi.EsLocation;
import net.estools.ServerApi.EsMaterial;
import net.estools.ServerApi.Implementations.Bukkit.BukkitItemStack;
import net.estools.ServerApi.Implementations.Bukkit.Helpers.BukkitHelper;
import net.estools.ServerApi.Interfaces.EsInventory;
import net.estools.ServerApi.Interfaces.EsItemStack;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;

Expand Down Expand Up @@ -90,6 +93,14 @@ public void addItem(EsItemStack stack) {
bukkitInv.addItem(((FoliaItemStack) stack).getBukkitItem());
}

@Override
public void addItemOrDrop(EsItemStack stack, EsLocation location) {
HashMap<Integer, ItemStack> failed = bukkitInv.addItem(((BukkitItemStack) stack).getBukkitItem());
for (ItemStack item : failed.values()) {
((World) location.getWorld()).dropItemNaturally(BukkitHelper.toBukkitLocation(location), item);
}
}

@Override
public void clear() {
bukkitInv.clear();
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/net/estools/ServerApi/Interfaces/EsEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@ public interface EsEntity extends EsCommandSender {
UUID getUniqueId();
void teleport(EsLocation loc);
EsLocation getLocation();
double getWidth();
double getHeight();
boolean leaveVehicle();
List<EsEntity> getPassengers();
Set<String> getScoreboardTags();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package net.estools.ServerApi.Interfaces;

import net.estools.ServerApi.EsLocation;
import net.estools.ServerApi.EsMaterial;

import java.util.Map;
Expand All @@ -8,6 +9,7 @@ public interface EsInventory {
void setItem(int slot, EsItemStack item);
EsItemStack getItem(int slot);
void addItem(EsItemStack stack);
void addItemOrDrop(EsItemStack stack, EsLocation location);
void setContents(EsItemStack[] items);
EsItemStack[] getContents();
void clear();
Expand Down
24 changes: 24 additions & 0 deletions src/test/java/net/estools/Commands/GiveItemCommandTest.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.estools.Commands;

import net.estools.EsToolsUnitTest;
import net.estools.Implementation.TestItemStack;
import net.estools.ServerApi.EsMaterial;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
Expand All @@ -20,8 +21,12 @@ public void invalidItem() {
@Test
public void giveItem() {
player.getInventory().clear();
world.getEntities().clear();
executeAssertSuccess("i dirt");
Assertions.assertEquals(EsMaterial.fromKey("dirt"), player.getInventory().getItem(0).getType());

// make sure it didn't drop the item
Assertions.assertFalse(world.getEntities().stream().anyMatch(entity -> entity.getType().equals("ITEM")));
}

@Test
Expand All @@ -32,8 +37,27 @@ public void invalidAmount() {
@Test
public void giveItemAmount() {
player.getInventory().clear();
world.getEntities().clear();
executeAssertSuccess("i dirt 69");
Assertions.assertEquals(EsMaterial.fromKey("dirt"), player.getInventory().getItem(0).getType());
Assertions.assertEquals(69, player.getInventory().getItem(0).getAmount());

// make sure it didn't drop the item
Assertions.assertFalse(world.getEntities().stream().anyMatch(entity -> entity.getType().equals("ITEM")));
}

@Test
public void giveItemDrop() {
player.getInventory().clear();
world.getEntities().clear();

// fill inventory
for (int i = 0; i < 54; i++) {
player.getInventory().addItem(new TestItemStack(EsMaterial.fromKey("dirt"), 64));
}

// add item, see if it dropped item
executeAssertSuccess("i dirt");
Assertions.assertTrue(world.getEntities().stream().anyMatch(entity -> entity.getType().equals("ITEM")));
}
}
10 changes: 10 additions & 0 deletions src/test/java/net/estools/Implementation/TestEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,16 @@ public EsLocation getLocation() {
return location;
}

@Override
public double getWidth() {
return 0.3;
}

@Override
public double getHeight() {
return 0.3;
}

@Override
public boolean leaveVehicle() {
if (vehicle == null) {
Expand Down
24 changes: 21 additions & 3 deletions src/test/java/net/estools/Implementation/TestInventory.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package net.estools.Implementation;

import net.estools.NotImplementedException;
import net.estools.ServerApi.EsLocation;
import net.estools.ServerApi.EsMaterial;
import net.estools.ServerApi.Interfaces.EsInventory;
import net.estools.ServerApi.Interfaces.EsItemStack;
Expand Down Expand Up @@ -44,14 +45,31 @@ public EsItemStack getItem(int slot) {
/**
* Adds item to first null slot.
*/
@Override
public void addItem(EsItemStack stack) {
public boolean addItemInternal(EsItemStack stack) {
for (int i = 0; i < items.length; i++) {
if (items[i] == null) {
items[i] = stack;
return;
return true;
}
}

return false;
}

@Override
public void addItem(EsItemStack stack) {
addItemInternal(stack);
}

@Override
public void addItemOrDrop(EsItemStack stack, EsLocation location) {
if (!addItemInternal(stack)) {
TestWorld world = (TestWorld) location.getWorld();

TestEntity entity = new TestEntity(world, "ITEM");
entity.teleport(location);
world.addEntity(entity);
}
}

@Override
Expand Down

0 comments on commit 5f007f7

Please sign in to comment.