Skip to content

Commit

Permalink
Implemented outlet component
Browse files Browse the repository at this point in the history
  • Loading branch information
AndyNoob committed Sep 1, 2024
1 parent 7984095 commit 9a032e1
Show file tree
Hide file tree
Showing 5 changed files with 133 additions and 87 deletions.
43 changes: 30 additions & 13 deletions menu/src/main/java/comfortable_andy/brew/menu/Menu.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,12 @@ public void handleClick(InventoryClickEvent event) {
boolean clickedMenu = clickedInventory == renderer.getInventory();
switch (event.getAction()) {
case MOVE_TO_OTHER_INVENTORY -> {
handleMoveItems(event.getView(), !clickedMenu, entity, event.getSlot(), -1, event::setCurrentItem);
event.setCancelled(true);
if(!handleMoveItems(event.getView(), !clickedMenu, entity, event.getSlot(), -1, event::setCurrentItem))
event.setCancelled(true);
}
case COLLECT_TO_CURSOR -> {
final ItemStack collecting = event.getCursor();
for (ItemStack stack : event.getView().getTopInventory()) {
for (ItemStack stack : otherInventory) {
if (collecting.isSimilar(stack)) {
event.setCancelled(true);
break;
Expand All @@ -87,32 +87,43 @@ public void handleClick(InventoryClickEvent event) {
entity,
-1,
event.getSlot(),
i -> entity.setItemOnCursor(i)
entity::setItemOnCursor
)) {
event.setCancelled(true);
return;
}
} else if (event.getClick() == ClickType.NUMBER_KEY) {
if (!clickedMenu) return;
if (handleMoveItems(
handleMoveItems(
event.getView(),
true,
entity,
event.getHotbarButton(),
event.getSlot(),
i -> event.getView().getBottomInventory().setItem(event.getHotbarButton(), i)
)
|| handleMoveItems(
);
handleMoveItems(
event.getView(),
false,
entity,
event.getSlot(),
event.getHotbarButton(),
null
);
} else if (event.getAction().name().contains("PICKUP") && clickedMenu) {
if (handleMoveItems(
event.getView(),
false,
entity,
event.getSlot(),
-1,
null
)) {
// TODO handle this
event.setCancelled(true);
return;
}
}
if (!clickedMenu) return;
MenuAction.ActionModifier modifier = MenuAction.ActionModifier.NONE;
final MenuAction.ActionType type = switch (event.getClick()) {
case DROP, LEFT, SWAP_OFFHAND -> MenuAction.ActionType.LEFT;
Expand Down Expand Up @@ -178,7 +189,7 @@ public boolean handleClick(Inventory inventory, MenuAction.ActionType type, @Nul

public boolean handleMoveItems(InventoryView view, boolean toMenu, HumanEntity who, @Range(from = -1, to = 53) int from, @Range(from = -1, to = 53) int destination, @Nullable Consumer<ItemStack> remainderHandler) {
if (toMenu) {
ItemStack moving = from == -1 ? who.getItemOnCursor() : view.getBottomInventory().getItem(destination);
ItemStack moving = from == -1 ? who.getItemOnCursor() : view.getBottomInventory().getItem(from);
final Map<Component, Vector2i> componentsAt;
if (destination == -1)
componentsAt = this.renderer.getComponentsInView(view.getTopInventory(), true);
Expand All @@ -193,11 +204,11 @@ public boolean handleMoveItems(InventoryView view, boolean toMenu, HumanEntity w
);
}
List<Component> components = new ArrayList<>(componentsAt.keySet());
if (components.size() > 1) return false;
if (components.size() != 1) return false;
Component component = components.get(0);
if (!(component instanceof ItemInletComponent inlet)) return false;
assert remainderHandler != null;
remainderHandler.accept(inlet.tryTakeInItems(who, componentsAt.get(component), moving));
remainderHandler.accept(inlet.tryTakeInItems(who, destination == -1 ? null : componentsAt.get(component), moving));
} else {
if (from == -1) return false;
final var componentsAt = this.renderer.componentsAt(
Expand All @@ -209,17 +220,23 @@ public boolean handleMoveItems(InventoryView view, boolean toMenu, HumanEntity w
true
);
List<Component> components = new ArrayList<>(componentsAt.keySet());
if (components.size() > 1) return false;
if (components.size() != 1) return false;
Component component = components.get(0);
if (!(component instanceof ItemOutletComponent outlet)) return false;
ItemStack out = outlet.tryTakeOutItems(who, componentsAt.get(component));
if (out == null) return false;
if (destination == -1) {
who.setItemOnCursor(out);
if (who.getItemOnCursor().isEmpty()) who.setItemOnCursor(out);
else {
for (Map.Entry<Integer, ItemStack> entry : view.getBottomInventory().addItem(out).entrySet()) {
who.getWorld().dropItem(who.getEyeLocation(), entry.getValue());
}
};
} else {
view.getBottomInventory().setItem(destination, out);
}
}
this.renderer.render();
return true;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
package comfortable_andy.brew.menu.componenets.defaults;

import comfortable_andy.brew.menu.componenets.Renderer;
import comfortable_andy.brew.menu.componenets.StaticComponent;
import org.bukkit.Material;
import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.Range;
import org.joml.Vector2i;

public class SimpleInletComponent extends StaticComponent implements ItemInletComponent {

protected final ItemStack[] contents;
private final int width;
protected final int halfWidth, halfHeight;

public SimpleInletComponent(@NotNull Vector2i position, @Range(from = 1, to = Long.MAX_VALUE) int width, @Range(from = 1, to = Long.MAX_VALUE) int height) {
super(position);

contents = new ItemStack[width * height];
this.width = width;
halfWidth = width / 2;
halfHeight = height / 2;

for (int x = 0; x < width; x++) {
for (int y = 0; y < height; y++) {
getCollisionTable().set(x - halfWidth, y - halfHeight);
}
}
}

public void updateContents() {
for (int i = 0; i < contents.length; i++) {
Vector2i xy = from(i);
getItemTable().set(xy.x, xy.y, contents[i]);
}
}

@Override
public ItemStack tryTakeInItems(HumanEntity who, @Nullable Vector2i relPos, ItemStack item) {
if (relPos == null) {
for (int i = 0; i < contents.length; i++) {
if (item.isEmpty()) {
updateContents();
return item;
}
ItemStack cur = contents[i];
if (cur == null || cur.isEmpty()) {
contents[i] = item;
updateContents();
return new ItemStack(Material.AIR);
}
if (cur.getAmount() >= item.getMaxStackSize()) continue;
if (!cur.isSimilar(item)) continue;
final int total = item.getAmount() + cur.getAmount();
final int actualNew = Math.min(cur.getMaxStackSize(), total);
cur.setAmount(actualNew);
final int remainder = total - actualNew;
item.setAmount(remainder);
}
updateContents();
return item;
} else {
final int index = from(relPos);
// either merge or swap
final ItemStack cur = contents[index];
if (cur == null) {
contents[index] = item;
updateContents();
return new ItemStack(Material.AIR);
} else if (cur.isSimilar(item)) {
if (cur.getAmount() >= cur.getMaxStackSize()) {
updateContents();
return null;
}
final int total = item.getAmount() + cur.getAmount();
final int actualNew = Math.min(cur.getMaxStackSize(), total);
cur.setAmount(actualNew);
final int remainder = total - actualNew;
item.setAmount(remainder);
updateContents();
return item;
} else {
contents[index] = item;
updateContents();
return cur;
}
}
}

protected int from(Vector2i xy) {
return (Renderer.Direction.UP.get().y * xy.y + halfHeight) * width + (Renderer.Direction.RIGHT.get().x * xy.x + halfWidth);
}

protected Vector2i from(int i) {
return new Vector2i(Renderer.Direction.RIGHT.get().x * i % width - halfWidth, Renderer.Direction.UP.get().y * (i / width - halfHeight));
}

}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package comfortable_andy.brew.test_plugin.components;
package comfortable_andy.brew.menu.componenets.defaults;

import comfortable_andy.brew.menu.componenets.defaults.ItemOutletComponent;
import org.bukkit.entity.HumanEntity;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import comfortable_andy.brew.menu.Menu;
import comfortable_andy.brew.menu.componenets.Renderer;
import comfortable_andy.brew.menu.componenets.defaults.*;
import comfortable_andy.brew.test_plugin.components.SimpleInletComponent;
import io.papermc.paper.command.brigadier.CommandSourceStack;
import io.papermc.paper.command.brigadier.Commands;
import io.papermc.paper.plugin.lifecycle.event.types.LifecycleEvents;
Expand Down Expand Up @@ -133,7 +132,7 @@ private void registerCommands() {
if (!(sender instanceof HumanEntity entity)) return 0;
var menu = menus.compute(entity, (k, v) -> {
Menu m = new Menu("ew", "32", "32432");
m.addComponent(new SimpleInletComponent(new Vector2i(0, 0), 3, 3));
m.addComponent(new SimpleOutInletComponent(new Vector2i(0, 0), 3, 3));
return m;
});
openInv(entity, menu);
Expand Down

This file was deleted.

0 comments on commit 9a032e1

Please sign in to comment.