Fixed issues with inventory hover and picking up inventory items

This commit is contained in:
josua 2020-07-28 13:15:18 +10:00
parent c60d03428d
commit af72420f9d
12 changed files with 179 additions and 68 deletions

View File

@ -16,6 +16,7 @@ import projectzombie.entity.player.EntityPlayer;
import projectzombie.init.Entities; import projectzombie.init.Entities;
import projectzombie.init.Items; import projectzombie.init.Items;
import projectzombie.init.LayerGenerators; import projectzombie.init.LayerGenerators;
import projectzombie.init.Recipies;
import projectzombie.init.Resources; import projectzombie.init.Resources;
import projectzombie.init.Sounds; import projectzombie.init.Sounds;
import projectzombie.init.Tasks; import projectzombie.init.Tasks;
@ -68,6 +69,7 @@ public class Main
Tasks.init(); Tasks.init();
Tiles.init(); Tiles.init();
LayerGenerators.init(); LayerGenerators.init();
Recipies.init();
// Create the display // Create the display
window = new DisplayWindow(); window = new DisplayWindow();

View File

@ -11,6 +11,19 @@ public class Recipies
{ {
public static ArrayList<Recipe> recipies; public static ArrayList<Recipe> recipies;
public static void init()
{
recipies = new ArrayList<Recipe>();
recipies.add(new RecipeBasic(
new ItemStack[] {
new ItemStack(Items.FLINT, 2, (short)0),
new ItemStack(Items.PLANT_FIBRE, 5, (short)0),
}, new Crafting[] {
Crafting.BASIC,
}, new ItemStack(Items.AMMO, 99, (short)0)));
}
public static Recipe[] getCraftableRecipies(Crafting tool) public static Recipe[] getCraftableRecipies(Crafting tool)
{ {
int size = 0; int size = 0;
@ -32,17 +45,4 @@ public class Recipies
return craftable_recipies; return craftable_recipies;
} }
public static void init()
{
recipies = new ArrayList<Recipe>();
recipies.add(new RecipeBasic(
new ItemStack[] {
new ItemStack(Items.FLINT, 2, (short)0),
new ItemStack(Items.PLANT_FIBRE, 5, (short)0),
}, new Crafting[] {
Crafting.BASIC,
}, new ItemStack(Items.AMMO, 99, (short)0)));
}
} }

View File

@ -3,6 +3,7 @@ package projectzombie.input.types;
import gl_engine.MathHelpers; import gl_engine.MathHelpers;
import gl_engine.vec.Vec2d; import gl_engine.vec.Vec2d;
import projectzombie.Main; import projectzombie.Main;
import projectzombie.inventory.Crafting;
import projectzombie.menu.MenuGamePause; import projectzombie.menu.MenuGamePause;
import projectzombie.menu.MenuInventory; import projectzombie.menu.MenuInventory;
import projectzombie.menu.MenuInventoryBasic; import projectzombie.menu.MenuInventoryBasic;
@ -77,7 +78,7 @@ public class InputGame implements Input
@Override @Override
public void openInventory() { public void openInventory() {
Main.menu = new MenuInventoryBasic(Main.menu); Main.menu = new MenuInventoryBasic(Main.menu, Crafting.BASIC);
} }
@Override @Override

View File

@ -48,7 +48,7 @@ public abstract class MenuInventory extends Menu
Inventory inventory = Main.player.getInventory(); Inventory inventory = Main.player.getInventory();
itemHolder = new GUIItemHolder(); itemHolder = new GUIItemHolder(top_gui);
item_slots = new GUIItemSlot[42]; item_slots = new GUIItemSlot[42];
armor_slots = new GUIItemSlot[6]; armor_slots = new GUIItemSlot[6];
@ -235,7 +235,7 @@ public abstract class MenuInventory extends Menu
public void update() { public void update() {
super.update(); super.update();
top_gui.update(new Vec2d(CursorPosCallback.mx, CursorPosCallback.my)); top_gui.update(CursorPosCallback.getCursorPos());
} }
} }

View File

@ -2,22 +2,55 @@ package projectzombie.menu;
import gl_engine.matrix.Matrix4; import gl_engine.matrix.Matrix4;
import gl_engine.vec.Vec2d; import gl_engine.vec.Vec2d;
import projectzombie.init.Items;
import projectzombie.init.Models; import projectzombie.init.Models;
import projectzombie.init.Recipies;
import projectzombie.inventory.Crafting;
import projectzombie.inventory.recipe.Recipe;
import projectzombie.menu.gui.GUIContainerSlider; import projectzombie.menu.gui.GUIContainerSlider;
import projectzombie.menu.gui.GUIItemSlot;
import projectzombie.menu.gui.GUIItemSlotGetter;
import projectzombie.util.math.ItemStack;
public class MenuInventoryBasic extends MenuInventory public class MenuInventoryBasic extends MenuInventory
{ {
private GUIContainerSlider slider; private GUIContainerSlider slider;
public MenuInventoryBasic(Menu parent) { public MenuInventoryBasic(Menu parent, Crafting tool) {
super(parent); super(parent);
Recipe[] recipies = Recipies.getCraftableRecipies(tool);
slider = new GUIContainerSlider(new Vec2d( slider = new GUIContainerSlider(new Vec2d(
Models.UI_INVENTORY.getWidth() * 1 / 256.0, Models.UI_INVENTORY.getWidth() * 21 / 256.0,
-Models.UI_INVENTORY.getHeight() * 127 / 256.0), new Vec2d( -Models.UI_INVENTORY.getHeight() * 127 / 256.0), new Vec2d(
Models.UI_INVENTORY.getWidth() * 254 / 256.0, Models.UI_INVENTORY.getWidth() * 234 / 256.0,
Models.UI_INVENTORY.getHeight() * 254 / 256.0), 100); Models.UI_INVENTORY.getHeight() * 254 / 256.0), 100);
for(int i=0;i<recipies.length;i++)
{
GUIItemSlot slot = new GUIItemSlot(itemHolder, 1.5, true, new GUIItemSlotGetter()
{
@Override
public void setItemStack(ItemStack stack) {
}
@Override
public boolean isAllowed(ItemStack stack) {
return false;
}
@Override
public ItemStack getItemStack() {
return new ItemStack(Items.ACORN, 3, (short)0);
}
});
slot.setPos(new Vec2d(4, i));
slider.add(slot);
}
gui.add(slider); gui.add(slider);
} }
@ -32,5 +65,4 @@ public class MenuInventoryBasic extends MenuInventory
super.render(); super.render();
} }
} }

View File

@ -100,7 +100,7 @@ public class GUI implements GUIContainer
@Override @Override
public boolean checkMouseHover(Vec2d pos) { public boolean checkMouseHover(Vec2d pos) {
return false; return true;
} }
@Override @Override
@ -238,4 +238,28 @@ public class GUI implements GUIContainer
} }
} }
@Override
public GUIItemSlot getHoveringItemSlot(Vec2d mousePos)
{
for(GUIComponent c : components)
{
if(c.checkMouseHover(mousePos))
{
if(c instanceof GUIItemSlot) {
return (GUIItemSlot)c;
}
if(c instanceof GUIContainer)
{
GUIItemSlot slot = ((GUIContainer)c).getHoveringItemSlot(mousePos);
if(slot != null) {
return slot;
}
}
}
}
return null;
}
} }

View File

@ -110,4 +110,9 @@ public class GUIButtonGroup implements GUIContainer
buttons.clear(); buttons.clear();
} }
@Override
public GUIItemSlot getHoveringItemSlot(Vec2d mousePos) {
return null;
}
} }

View File

@ -1,7 +1,11 @@
package projectzombie.menu.gui; package projectzombie.menu.gui;
import gl_engine.vec.Vec2d;
public interface GUIContainer extends GUIComponent public interface GUIContainer extends GUIComponent
{ {
public GUIItemSlot getHoveringItemSlot(Vec2d mousePos);
public void add(GUIComponent c); public void add(GUIComponent c);
public void clear(); public void clear();
} }

View File

@ -168,4 +168,35 @@ public class GUIContainerSlider implements GUIComponent, GUIContainer
components.clear(); components.clear();
} }
@Override
public GUIItemSlot getHoveringItemSlot(Vec2d mousePos)
{
if(mousePos.y < pos.y || mousePos.y > pos.y + size.y) {
return null;
}
mousePos = mousePos.add(new Vec2d(0, -scroll));
for(GUIComponent c : components)
{
if(c.checkMouseHover(mousePos))
{
if(c instanceof GUIItemSlot) {
return (GUIItemSlot)c;
}
if(c instanceof GUIContainer)
{
GUIItemSlot slot = ((GUIContainer)c).getHoveringItemSlot(mousePos);
if(slot != null) {
return slot;
}
}
}
}
return null;
}
} }

View File

@ -14,9 +14,10 @@ public class GUIItemHolder implements GUIComponent
{ {
private GUIItemSlot hover = null; private GUIItemSlot hover = null;
private ItemStack holding = ItemStack.getEmpty(); private ItemStack holding = ItemStack.getEmpty();
private GUIContainer gui;
public void setHover(GUIItemSlot slot) { public GUIItemHolder(GUIContainer gui) {
this.hover = slot; this.gui = gui;
} }
@Override @Override
@ -38,14 +39,11 @@ public class GUIItemHolder implements GUIComponent
Text.render("" + holding.count, text_matrix); Text.render("" + holding.count, text_matrix);
} }
} }
hover = null;
} }
@Override @Override
public void update(Vec2d mousePos) { public void update(Vec2d mousePos) {
// TODO Auto-generated method stub hover = gui.getHoveringItemSlot(mousePos);
} }
@Override @Override
@ -89,18 +87,29 @@ public class GUIItemHolder implements GUIComponent
} }
// Put 1 item into the slot if the hovered slot is empty or equal to the holding slot // Put 1 item into the slot if the hovered slot is empty or equal to the holding slot
else if((hover.isEmpty() && this.hover.isItemAllowed(holding)) || hover.stackEquals(holding)) else
{ {
hover.count += 1; ItemStack stack_from = hover;
holding.count -= 1; ItemStack stack_to = holding;
hover.item = holding.item; if(!this.hover.isItemAllowed(stack_to)) {
hover.meta = holding.meta; stack_from = holding;
stack_to = hover;
}
this.hover.setItemStack(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 = null;
} }
@Override @Override
@ -128,22 +137,27 @@ public class GUIItemHolder implements GUIComponent
// Are these the same item // Are these the same item
if(holding.stackEquals(hover) && !holding.isEmpty() && !hover.isEmpty()) if(holding.stackEquals(hover) && !holding.isEmpty() && !hover.isEmpty())
{ {
if(this.hover.isItemAllowed(holding)) ItemStack stack_from = hover;
{ ItemStack stack_to = holding;
// Merge the hover stack into the holding stack
if(holding.count + hover.count > holding.item.max) {
int overflow = holding.count + hover.count - holding.item.max;
hover.count = holding.item.max;
holding.count = overflow;
}
else { if(!this.hover.isItemAllowed(stack_to)) {
hover.count += holding.count; stack_from = holding;
holding.count = 0; stack_to = hover;
}
this.hover.setItemStack(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);
} }
else if(holding.isEmpty() || this.hover.isItemAllowed(holding)) else if(holding.isEmpty() || this.hover.isItemAllowed(holding))
@ -161,8 +175,6 @@ public class GUIItemHolder implements GUIComponent
this.hover.setItemStack(hover); this.hover.setItemStack(hover);
} }
this.hover = null;
} }
@Override @Override

View File

@ -71,8 +71,6 @@ public class GUIItemSlot implements GUIComponent
Models.UI_ITEM_HOVER.setModel(hover_matrix); Models.UI_ITEM_HOVER.setModel(hover_matrix);
Models.UI_ITEM_HOVER.render(); Models.UI_ITEM_HOVER.render();
itemHolder.setHover(this);
} }
if(renderItem && !stack.isEmpty()) if(renderItem && !stack.isEmpty())
@ -98,16 +96,6 @@ public class GUIItemSlot implements GUIComponent
return pos.x > px && pos.x < px + hitboxSize && pos.y > py && pos.y < py + hitboxSize; return pos.x > px && pos.x < px + hitboxSize && pos.y > py && pos.y < py + hitboxSize;
} }
@Override
public void onMouseClick(Vec2d pos) {
itemHolder.setHover(this);
}
@Override
public void onRightClick(Vec2d pos) {
itemHolder.setHover(this);
}
@Override @Override
public void onActivate() { public void onActivate() {
} }
@ -124,4 +112,12 @@ public class GUIItemSlot implements GUIComponent
public void onScroll(Vec2d mousePos, double amount) { public void onScroll(Vec2d mousePos, double amount) {
} }
@Override
public void onRightClick(Vec2d mousePos) {
}
@Override
public void onMouseClick(Vec2d mousePos) {
}
} }

View File

@ -29,10 +29,14 @@ public class ItemStack implements IBdfClassManager
return false; return false;
} }
public boolean stackEquals(ItemStack other) { public boolean stackEquals(ItemStack other)
if(other.item != item) return false; {
if(other.meta != meta) return false; if(other.item != item)
return true; return false;
if(other.meta == -1 || meta == -1)
return true;
return (other.meta == meta);
} }
@Override @Override