238 lines
5.4 KiB
Java
238 lines
5.4 KiB
Java
package projectzombie.menu.gui;
|
|
|
|
import gl_engine.matrix.Matrix4;
|
|
import gl_engine.vec.Vec2d;
|
|
import gl_engine.vec.Vec3d;
|
|
import projectzombie.Main;
|
|
import projectzombie.entity.EntityItem;
|
|
import projectzombie.model.Model;
|
|
import projectzombie.text.Text;
|
|
import projectzombie.util.math.ItemStack;
|
|
import projectzombie.world.layer.Layer;
|
|
|
|
public class GUIItemHolder implements GUIComponent
|
|
{
|
|
private GUIItemSlot hover = null;
|
|
private ItemStack holding = ItemStack.getEmpty();
|
|
private GUIContainer gui;
|
|
|
|
public GUIItemHolder(GUIContainer gui) {
|
|
this.gui = gui;
|
|
}
|
|
|
|
@Override
|
|
public void render(Matrix4 matrix, Vec2d mousePos, boolean canHover)
|
|
{
|
|
if(!holding.isEmpty())
|
|
{
|
|
Model model = holding.item.getModel(holding.meta).getGuiModel();
|
|
matrix = Matrix4.multiply(Matrix4.translate(mousePos.x - 0.425, mousePos.y - 0.425, 0), matrix);
|
|
|
|
model.setModel(matrix);
|
|
model.render();
|
|
|
|
if(holding.count > 1)
|
|
{
|
|
Matrix4 text_matrix = Matrix4.multiply(matrix, Matrix4.translate(-0.75 / 4, -0.75 / 4, 0));
|
|
text_matrix = Matrix4.multiply(Matrix4.scale(new Vec3d(0.4, 0.4, 0.4)), text_matrix);
|
|
|
|
Text.render("" + holding.count, text_matrix);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void update(Vec2d mousePos) {
|
|
hover = gui.getHoveringItemSlot(mousePos);
|
|
}
|
|
|
|
@Override
|
|
public boolean checkMouseHover(Vec2d pos) {
|
|
return true;
|
|
}
|
|
|
|
private void hoverToStack(Vec2d pos)
|
|
{
|
|
ItemStack hover = this.hover.getItemStack();
|
|
|
|
if(!holding.isEmpty() && (!holding.stackEquals(hover) || holding.count + hover.count > holding.item.max)) {
|
|
return;
|
|
}
|
|
|
|
holding.count += hover.count;
|
|
holding.meta = hover.meta;
|
|
holding.item = hover.item;
|
|
|
|
hover.count = 0;
|
|
|
|
this.hover.setItemStack(hover);
|
|
this.hover.getter.onRemoveItemStack();
|
|
}
|
|
|
|
@Override
|
|
public void onRightClick(Vec2d pos)
|
|
{
|
|
// Drop part of the holding item if the hover item doesn't exist
|
|
if(hover == null)
|
|
{
|
|
if(!holding.isEmpty())
|
|
{
|
|
Layer layer = Main.world.getLayer();
|
|
|
|
layer.spawnEntity(new EntityItem(
|
|
Main.player.getPos(), Main.player.getVelocity(),
|
|
new ItemStack(holding.item, 1, holding.meta),
|
|
Math.toRadians(Main.player.angle)));
|
|
|
|
holding.count -= 1;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if(hover.getter.mustTakeAll()) {
|
|
hoverToStack(pos);
|
|
return;
|
|
}
|
|
|
|
ItemStack hover = this.hover.getItemStack();
|
|
|
|
// Split the hovered slot in half if the holding slot is empty
|
|
if(holding.isEmpty())
|
|
{
|
|
holding.item = hover.item;
|
|
holding.meta = hover.meta;
|
|
|
|
holding.count = (int)Math.ceil(hover.count / 2.0);
|
|
hover.count = (int)Math.floor(hover.count / 2.0);
|
|
|
|
this.hover.setItemStack(hover);
|
|
this.hover.getter.onRemoveItemStack();
|
|
}
|
|
|
|
// Put 1 item into the slot if the hovered slot is empty or equal to the holding slot
|
|
else
|
|
{
|
|
ItemStack stack_from = hover;
|
|
ItemStack stack_to = holding;
|
|
|
|
if(!this.hover.isItemAllowed(stack_to)) {
|
|
stack_from = holding;
|
|
stack_to = hover;
|
|
}
|
|
|
|
if(
|
|
stack_from.count + 1 <= stack_from.item.max && stack_to.count - 1 <= stack_to.item.max &&
|
|
(stack_from.isEmpty() || stack_from.stackEquals(stack_to))
|
|
) {
|
|
stack_from.count += 1;
|
|
stack_to.count -= 1;
|
|
|
|
stack_from.item = stack_to.item;
|
|
stack_from.meta = stack_to.meta;
|
|
|
|
this.hover.setItemStack(hover);
|
|
this.hover.getter.onRemoveItemStack();
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onMouseClick(Vec2d pos)
|
|
{
|
|
// Drop the holding item if the hover item doesn't exist
|
|
if(hover == null)
|
|
{
|
|
if(!holding.isEmpty())
|
|
{
|
|
Layer layer = Main.world.getLayer();
|
|
|
|
layer.spawnEntity(new EntityItem(
|
|
Main.player.getPos(), Main.player.getVelocity(),
|
|
holding.copy(), Math.toRadians(Main.player.angle)));
|
|
|
|
holding.count = 0;
|
|
}
|
|
|
|
return;
|
|
}
|
|
|
|
if(hover.getter.mustTakeAll()) {
|
|
hoverToStack(pos);
|
|
return;
|
|
}
|
|
|
|
ItemStack hover = this.hover.getItemStack();
|
|
|
|
// Are these the same item
|
|
if(holding.stackEquals(hover) && !holding.isEmpty() && !hover.isEmpty())
|
|
{
|
|
ItemStack stack_from = hover;
|
|
ItemStack stack_to = holding;
|
|
|
|
if(!this.hover.isItemAllowed(stack_to)) {
|
|
stack_from = holding;
|
|
stack_to = hover;
|
|
}
|
|
|
|
// Merge the hover stack into the holding stack
|
|
if(stack_to.count + stack_from.count > stack_to.item.max) {
|
|
int overflow = stack_to.count + stack_from.count - stack_to.item.max;
|
|
stack_from.count = stack_to.item.max;
|
|
stack_to.count = overflow;
|
|
}
|
|
|
|
else {
|
|
stack_from.count += stack_to.count;
|
|
stack_to.count = 0;
|
|
}
|
|
|
|
this.hover.setItemStack(hover);
|
|
this.hover.getter.onRemoveItemStack();
|
|
}
|
|
|
|
else if(holding.isEmpty() || this.hover.isItemAllowed(holding))
|
|
{
|
|
// Swap the stacks
|
|
ItemStack stack = holding.copy();
|
|
|
|
holding.count = hover.count;
|
|
holding.item = hover.item;
|
|
holding.meta = hover.meta;
|
|
|
|
hover.count = stack.count;
|
|
hover.item = stack.item;
|
|
hover.meta = stack.meta;
|
|
|
|
this.hover.setItemStack(hover);
|
|
this.hover.getter.onRemoveItemStack();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onActivate() {
|
|
// TODO Auto-generated method stub
|
|
|
|
}
|
|
|
|
@Override
|
|
public void onBack()
|
|
{
|
|
if(!holding.isEmpty())
|
|
{
|
|
Layer layer = Main.world.getLayer();
|
|
|
|
layer.spawnEntity(new EntityItem(
|
|
Main.player.getPos(), Main.player.getVelocity(),
|
|
holding.copy(), Math.toRadians(Main.player.angle)));
|
|
|
|
holding.count = 0;
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onScroll(Vec2d mousePos, double amount) {
|
|
}
|
|
|
|
}
|