Character equip screen

This commit is contained in:
austin 2022-03-06 15:17:32 -05:00
parent ec0ac741e5
commit 0cc3057d51
20 changed files with 683 additions and 122 deletions

View File

@ -16,8 +16,12 @@ public class Control {
ControlMethod onPress; ControlMethod onPress;
ControlMethod onRelease; ControlMethod onRelease;
ControlMethod onRepeat; ControlMethod onRepeat;
ControlMethod onClick;
MouseCallback onMove; MouseCallback onMove;
float pressFrame = 0;
float repeatTimeout = 0;
public boolean isIsKey() { public boolean isIsKey() {
return type == ControlType.KEY; return type == ControlType.KEY;
} }
@ -64,6 +68,10 @@ public class Control {
onMove = method; onMove = method;
} }
public void setOnClick(ControlMethod method){
onClick = method;
}
public void onPress(){ public void onPress(){
if(onPress != null){ if(onPress != null){
onPress.execute(); onPress.execute();
@ -87,6 +95,28 @@ public class Control {
onMove.execute(event); onMove.execute(event);
} }
} }
public void onClick(){
if(onClick != null){
onClick.execute();
}
}
public float getPressFrame(){
return this.pressFrame;
}
public void setPressFrame(float frame){
pressFrame = frame;
}
public float getRepeatTimeout(){
return this.repeatTimeout;
}
public void setRepeatTimeout(float timeout){
repeatTimeout = timeout;
}
public interface ControlMethod { public interface ControlMethod {

View File

@ -70,6 +70,7 @@ public class ControlHandler {
public static final String INPUT_CODE_INTERACT = "interact"; public static final String INPUT_CODE_INTERACT = "interact";
public static final String INPUT_CODE_DROP = "drop"; public static final String INPUT_CODE_DROP = "drop";
public static final String INPUT_CODE_INVENTORY_OPEN = "inventoryOpen"; public static final String INPUT_CODE_INVENTORY_OPEN = "inventoryOpen";
public static final String INPUT_CODE_CHARACTER_OPEN = "characterOpen";
public static final String DATA_STRING_INPUT_CODE_MENU_INCREMENT = "menuIncrement"; public static final String DATA_STRING_INPUT_CODE_MENU_INCREMENT = "menuIncrement";
public static final String DATA_STRING_INPUT_CODE_MENU_DECREMENT = "menuDecrement"; public static final String DATA_STRING_INPUT_CODE_MENU_DECREMENT = "menuDecrement";
@ -188,6 +189,7 @@ public class ControlHandler {
handler.addControl(INPUT_CODE_INTERACT, new Control(ControlType.KEY,GLFW_KEY_E)); handler.addControl(INPUT_CODE_INTERACT, new Control(ControlType.KEY,GLFW_KEY_E));
handler.addControl(INPUT_CODE_DROP, new Control(ControlType.KEY,GLFW_KEY_Y)); handler.addControl(INPUT_CODE_DROP, new Control(ControlType.KEY,GLFW_KEY_Y));
handler.addControl(INPUT_CODE_INVENTORY_OPEN, new Control(ControlType.KEY,GLFW_KEY_I)); handler.addControl(INPUT_CODE_INVENTORY_OPEN, new Control(ControlType.KEY,GLFW_KEY_I));
handler.addControl(INPUT_CODE_CHARACTER_OPEN, new Control(ControlType.KEY,GLFW_KEY_C));
/* /*
Map the menu navigation controls Map the menu navigation controls
@ -301,6 +303,7 @@ public class ControlHandler {
case INVENTORY: case INVENTORY:
runHandlers(inventoryControlList); runHandlers(inventoryControlList);
runHandlers(menuNavigationControlList);
break; break;
case NO_INPUT: case NO_INPUT:
@ -724,7 +727,7 @@ public class ControlHandler {
Main menu dialog toggle Main menu dialog toggle
*/ */
mainGameControlList.add(controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU)); mainGameControlList.add(controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU));
controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).setOnPress(new ControlMethod(){public void execute(){ controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).setOnClick(new ControlMethod(){public void execute(){
// Globals.elementManager.registerWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, MenuGenerators.createInGameMainMenu()); // Globals.elementManager.registerWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, MenuGenerators.createInGameMainMenu());
// Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU); // Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU);
@ -733,6 +736,7 @@ public class ControlHandler {
mainMenuWindow.addChild(mainMenuInGame); mainMenuWindow.addChild(mainMenuInGame);
Globals.elementManager.registerWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, mainMenuWindow); Globals.elementManager.registerWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, mainMenuWindow);
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), true); WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), true);
Globals.elementManager.focusFirstElement();
Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU); Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU);
Globals.controlHandler.showMouse(); Globals.controlHandler.showMouse();
// Element mainMenu = MenuGenerators.createInGameMainMenu(); // Element mainMenu = MenuGenerators.createInGameMainMenu();
@ -740,20 +744,18 @@ public class ControlHandler {
// MenuGenerators.makeMenuDrawable(mainMenu); // MenuGenerators.makeMenuDrawable(mainMenu);
// Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU); // Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU);
}}); }});
controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).setRepeatTimeout(0.5f);
/* /*
Open inventory Open inventory
*/ */
mainGameControlList.add(controls.get(INPUT_CODE_INVENTORY_OPEN)); mainGameControlList.add(controls.get(INPUT_CODE_INVENTORY_OPEN));
controls.get(INPUT_CODE_INVENTORY_OPEN).setOnPress(new ControlMethod(){public void execute(){ inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_OPEN));
if(InventoryUtils.hasNaturalInventory(Globals.playerCharacter)){ controls.get(INPUT_CODE_INVENTORY_OPEN).setOnClick(new ControlMethod(){public void execute(){
if(InventoryUtils.hasNaturalInventory(Globals.playerCharacter) && Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(InventoryUtils.getNaturalInventory(Globals.playerCharacter).getId())) == null){
//create window //create window
Window mainMenuWindow = new Window(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter); UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter);
//create window contents Window mainMenuWindow = MenuGenerators.createNaturalInventoryMenu(inventory);
Element inventoryUI = MenuGenerators.createNaturalInventoryMenu(inventory);
//add contents
mainMenuWindow.addChild(inventoryUI);
//register //register
Globals.elementManager.registerWindow(WindowUtils.getInventoryWindowID(inventory.getId()), mainMenuWindow); Globals.elementManager.registerWindow(WindowUtils.getInventoryWindowID(inventory.getId()), mainMenuWindow);
//make visible //make visible
@ -761,8 +763,33 @@ public class ControlHandler {
//controls //controls
Globals.controlHandler.setHandlerState(ControlsState.INVENTORY); Globals.controlHandler.setHandlerState(ControlsState.INVENTORY);
Globals.controlHandler.showMouse(); Globals.controlHandler.showMouse();
//
Globals.openInventoriesCount++;
} }
}}); }});
controls.get(INPUT_CODE_INVENTORY_OPEN).setRepeatTimeout(0.5f);
/*
Open character
*/
mainGameControlList.add(controls.get(INPUT_CODE_CHARACTER_OPEN));
inventoryControlList.add(controls.get(INPUT_CODE_CHARACTER_OPEN));
controls.get(INPUT_CODE_CHARACTER_OPEN).setOnClick(new ControlMethod(){public void execute(){
if(InventoryUtils.hasEquipInventory(Globals.playerCharacter) && Globals.elementManager.getWindow(WindowStrings.WINDOW_CHARACTER) == null){
//create window
Window mainMenuWindow = MenuGenerators.createCharacterMenu(InventoryUtils.getEquipInventory(Globals.playerCharacter));
//register
Globals.elementManager.registerWindow(WindowStrings.WINDOW_CHARACTER, mainMenuWindow);
//make visible
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_CHARACTER), true);
//controls
Globals.controlHandler.setHandlerState(ControlsState.INVENTORY);
Globals.controlHandler.showMouse();
//
Globals.openInventoriesCount++;
}
}});
controls.get(INPUT_CODE_CHARACTER_OPEN).setRepeatTimeout(0.5f);
} }
@ -781,13 +808,13 @@ public class ControlHandler {
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT)); menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT));
controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT).setOnPress(new ControlMethod(){public void execute(){ controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT).setOnPress(new ControlMethod(){public void execute(){
// Globals.currentMenu.incrementMenuOption(); // Globals.currentMenu.incrementMenuOption();
Globals.elementManager.focusNextElement(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN)); Globals.elementManager.focusNextElement();
}}); }});
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT)); menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT));
controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT).setOnPress(new ControlMethod(){public void execute(){ controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT).setOnPress(new ControlMethod(){public void execute(){
// Globals.currentMenu.decrementMenuOption(); // Globals.currentMenu.decrementMenuOption();
Globals.elementManager.focusPreviousElement(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN)); Globals.elementManager.focusPreviousElement();
}}); }});
menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_SELECT)); menuNavigationControlList.add(controls.get(DATA_STRING_INPUT_CODE_MENU_SELECT));
@ -806,10 +833,12 @@ public class ControlHandler {
// // MenuCallbacks.backout(Globals.currentMenu); // // MenuCallbacks.backout(Globals.currentMenu);
// Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN); // Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN);
// }}); // }});
controls.get(DATA_STRING_INPUT_CODE_MENU_BACKOUT).setOnRelease(new ControlMethod(){public void execute(){ controls.get(DATA_STRING_INPUT_CODE_MENU_BACKOUT).setOnClick(new ControlMethod(){public void execute(){
// MenuCallbacks.backout(Globals.currentMenu); // MenuCallbacks.backout(Globals.currentMenu);
Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN); Globals.elementManager.navigateBackwards();
// Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN);
}}); }});
controls.get(DATA_STRING_INPUT_CODE_MENU_BACKOUT).setRepeatTimeout(0.5f);
} }
@ -880,16 +909,16 @@ public class ControlHandler {
/* /*
Close inventory Close inventory
*/ */
inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_CLOSE)); // inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_CLOSE));
controls.get(INPUT_CODE_INVENTORY_CLOSE).setOnPress(new ControlMethod(){public void execute(){ // controls.get(INPUT_CODE_INVENTORY_CLOSE).setOnPress(new ControlMethod(){public void execute(){
// MenuCallbacks.backout(Globals.currentMenu); // // MenuCallbacks.backout(Globals.currentMenu);
UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter); // UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter);
Element inventoryWindow = Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(inventory.getId())); // Element inventoryWindow = Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(inventory.getId()));
WindowUtils.recursiveSetVisible(inventoryWindow, false); // WindowUtils.recursiveSetVisible(inventoryWindow, false);
hideMouse(); // hideMouse();
Globals.elementManager.unregisterWindow(WindowUtils.getInventoryWindowID(inventory.getId())); // Globals.elementManager.unregisterWindow(WindowUtils.getInventoryWindowID(inventory.getId()));
Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME); // Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
}}); // }});
/* /*
Item manipulation Item manipulation
*/ */
@ -945,15 +974,22 @@ public class ControlHandler {
if(!control.isState()){ if(!control.isState()){
//on press //on press
control.onPress(); control.onPress();
control.setPressFrame(Main.lastFrame);
} else { } else {
//on repeat //on repeat
control.onRepeat(); if(Main.lastFrame - control.getPressFrame() > control.getRepeatTimeout()){
control.onRepeat();
}
} }
control.setState(true); control.setState(true);
} else { } else {
if(control.isState()){ if(control.isState()){
//on release //on release
control.onRelease(); control.onRelease();
//on click
if(Main.lastFrame - control.getPressFrame() < control.getRepeatTimeout()){
control.onClick();
}
} else { } else {
} }
control.setState(false); control.setState(false);

View File

@ -106,6 +106,7 @@ public class LoadingThread extends Thread {
case LOAD_TITLE_MENU: case LOAD_TITLE_MENU:
WindowUtils.recursiveSetVisible(loadingWindow,false); WindowUtils.recursiveSetVisible(loadingWindow,false);
WindowUtils.focusWindow(WindowStrings.WINDOW_MENU_MAIN);
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN), true); WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN), true);
break; break;

View File

@ -146,7 +146,9 @@ public class EntityDataStrings {
public static final String ITEM_IS_WEAPON = "itemIsWeapon"; public static final String ITEM_IS_WEAPON = "itemIsWeapon";
public static final String ITEM_IS_ARMOR = "itemIsArmor"; public static final String ITEM_IS_ARMOR = "itemIsArmor";
public static final String ITEM_EQUIP_WHITELIST = "itemEquipWhitelist"; public static final String ITEM_EQUIP_WHITELIST = "itemEquipWhitelist";
public static final String ITEM_EQUIP_CLASS = "itemEquipClass";
public static final String ITEM_ICON = "itemIcon"; public static final String ITEM_ICON = "itemIcon";
public static final String ITEM_IN_WORLD_REPRESENTATION = "itemInWorldRepresentation";
/* /*

View File

@ -181,7 +181,6 @@ public class EntityManager {
} }
if(drawableList.contains(e)){ if(drawableList.contains(e)){
drawableList.remove(e); drawableList.remove(e);
EntityUtils.cleanUpDrawableEntity(e);
} }
if(entityList.contains(e)){ if(entityList.contains(e)){
entityList.remove(e); entityList.remove(e);

View File

@ -48,7 +48,7 @@ public class EquipState {
boolean targetIsItem = ItemUtils.isItem(toEquip); boolean targetIsItem = ItemUtils.isItem(toEquip);
boolean targetIsAttached = AttachUtils.isAttached(toEquip); boolean targetIsAttached = AttachUtils.isAttached(toEquip);
boolean targetHasWhitelist = ItemUtils.hasEquipList(toEquip); boolean targetHasWhitelist = ItemUtils.hasEquipList(toEquip);
String equipItemClass = "";//somehow resolve from toEquip String equipItemClass = ItemUtils.getEquipClass(toEquip);//somehow resolve from toEquip
List<String> pointEquipClassList = point.getEquipClassWhitelist(); List<String> pointEquipClassList = point.getEquipClassWhitelist();
boolean itemIsInPointWhitelist = pointEquipClassList.contains(equipItemClass); boolean itemIsInPointWhitelist = pointEquipClassList.contains(equipItemClass);
if(!hasEquipped && targetIsItem && !targetIsAttached && itemIsInPointWhitelist){ if(!hasEquipped && targetIsItem && !targetIsAttached && itemIsInPointWhitelist){
@ -153,7 +153,47 @@ public class EquipState {
// } // }
public void unequipPoint(String pointId){ public void unequipPoint(String pointId){
equipMap.remove(pointId); Entity equipped = equipMap.remove(pointId);
if(equipped != null){
boolean targetHasWhitelist = ItemUtils.hasEquipList(equipped);
if(targetHasWhitelist){
//have to do fancy mesh removal nonsense
//basically the reverse of below
// List<EquipWhitelist> whitelist = ItemUtils.getEquipWhitelist(equipped);
// for(EquipWhitelist whitelistItem : whitelist){
// if(whitelistItem.getCreatureId().equals(parentCreatureId)){
// //put in map
// equipMap.put(point.getEquipPointId(),toEquip);
// String modelName = whitelistItem.getModel();
// Globals.assetManager.addModelPathToQueue(modelName);
// Actor parentActor = EntityUtils.getActor(parent);
// //queue meshes from display model to parent actor
// ActorMeshMask meshMask = parentActor.getMeshMask();
// for(String toBlock : whitelistItem.getMeshMaskList()){
// meshMask.blockMesh(modelName, toBlock);
// }
// for(String toDraw : whitelistItem.getMeshList()){
// meshMask.queueMesh(modelName, toDraw);
// }
// //attach to parent bone
// AttachUtils.attachEntityToEntityAtBone(parent, toEquip, point.getBone());
// //make uncollidable
// if(toEquip.getDataKeys().contains(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.getDataKeys().contains(EntityDataStrings.PHYSICS_COLLIDABLE)){
// CollisionObject rigidBody = (CollisionObject)toEquip.getData(EntityDataStrings.PHYSICS_COLLISION_BODY);
// Globals.collisionEngine.deregisterPhysicsObject(rigidBody);
// }
// //hide toEquip actor
// EntityUtils.setDraw(toEquip, false);
// //make untargetable
// Globals.entityManager.setTargetable(toEquip, false);
// break;
// }
// }
} else {
AttachUtils.detatchEntityFromEntityAtBone(parent, equipped);
EntityUtils.cleanUpDrawableEntity(equipped);
}
}
} }

View File

@ -6,9 +6,11 @@ import org.joml.Vector3f;
import electrosphere.entity.Entity; import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings; import electrosphere.entity.EntityDataStrings;
import electrosphere.entity.EntityUtils; import electrosphere.entity.EntityUtils;
import electrosphere.entity.state.equip.EquipState;
import electrosphere.entity.state.gravity.GravityUtils; import electrosphere.entity.state.gravity.GravityUtils;
import electrosphere.entity.types.creature.CreatureUtils; import electrosphere.entity.types.creature.CreatureUtils;
import electrosphere.entity.types.item.ItemUtils; import electrosphere.entity.types.item.ItemUtils;
import electrosphere.main.Globals;
public class InventoryUtils { public class InventoryUtils {
@ -21,6 +23,14 @@ public class InventoryUtils {
return (UnrelationalInventoryState)target.getData(EntityDataStrings.NATURAL_INVENTORY); return (UnrelationalInventoryState)target.getData(EntityDataStrings.NATURAL_INVENTORY);
} }
public static boolean hasEquipInventory(Entity target){
return target.getDataKeys().contains(EntityDataStrings.EQUIP_INVENTORY);
}
public static RelationalInventoryState getEquipInventory(Entity target){
return (RelationalInventoryState)target.getData(EntityDataStrings.EQUIP_INVENTORY);
}
public static void attemptStoreItem(Entity creature, Entity item){ public static void attemptStoreItem(Entity creature, Entity item){
boolean creatureIsCreature = CreatureUtils.isCreature(creature); boolean creatureIsCreature = CreatureUtils.isCreature(creature);
boolean itemIsItem = ItemUtils.isItem(item); boolean itemIsItem = ItemUtils.isItem(item);
@ -45,12 +55,28 @@ public class InventoryUtils {
//verify creature is creature, item is item, inventory exists, and item is in inventory //verify creature is creature, item is item, inventory exists, and item is in inventory
boolean creatureIsCreature = CreatureUtils.isCreature(creature); boolean creatureIsCreature = CreatureUtils.isCreature(creature);
boolean itemIsItem = ItemUtils.isItem(item); boolean itemIsItem = ItemUtils.isItem(item);
boolean hasInventory = hasNaturalInventory(creature); boolean hasNaturalInventory = hasNaturalInventory(creature);
if(creatureIsCreature && itemIsItem && hasInventory){ boolean hasEquipInventory = hasEquipInventory(creature);
//get inventory if(creatureIsCreature && itemIsItem){
UnrelationalInventoryState inventory = getNaturalInventory(creature); if(hasNaturalInventory){
//remove item from inventory //get inventory
inventory.removeItem(item); UnrelationalInventoryState inventory = getNaturalInventory(creature);
//remove item from inventory
inventory.removeItem(item);
}
if(hasEquipInventory){
//get inventory
RelationalInventoryState inventory = getEquipInventory(creature);
//get real world item
Entity realWorldItem = ItemUtils.getRealWorldEntity(item);
if(realWorldItem != null){
//drop item
EquipState equipState = (EquipState)creature.getData(EntityDataStrings.EQUIP_STATE);
equipState.unequipPoint(inventory.getItemSlot(item));
}
//remove item from inventory
inventory.tryRemoveItem(item);
}
//compose item into in-world entity //compose item into in-world entity
Entity inWorldItem = ItemUtils.spawnBasicItem(ItemUtils.getType(item)); Entity inWorldItem = ItemUtils.spawnBasicItem(ItemUtils.getType(item));
//delete in container item //delete in container item
@ -64,4 +90,36 @@ public class InventoryUtils {
} }
} }
//need creature so we can figure out where to drop the item
public static void attemptDestroyItem(Entity creature, Entity item){
//verify creature is creature, item is item, inventory exists, and item is in inventory
boolean creatureIsCreature = CreatureUtils.isCreature(creature);
boolean itemIsItem = ItemUtils.isItem(item);
boolean hasNaturalInventory = hasNaturalInventory(creature);
boolean hasEquipInventory = hasEquipInventory(creature);
if(creatureIsCreature && itemIsItem){
if(hasNaturalInventory){
//get inventory
UnrelationalInventoryState inventory = getNaturalInventory(creature);
//remove item from inventory
inventory.removeItem(item);
}
if(hasEquipInventory){
//get inventory
RelationalInventoryState inventory = getEquipInventory(creature);
//get real world item
Entity realWorldItem = ItemUtils.getRealWorldEntity(item);
if(realWorldItem != null){
//drop item
EquipState equipState = (EquipState)creature.getData(EntityDataStrings.EQUIP_STATE);
equipState.unequipPoint(inventory.getItemSlot(item));
}
//remove item from inventory
inventory.tryRemoveItem(item);
}
//delete in container item
ItemUtils.destroyInInventoryItem(item);
}
}
} }

View File

@ -6,24 +6,29 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import electrosphere.entity.Entity; import electrosphere.entity.Entity;
import electrosphere.entity.types.item.ItemUtils;
import electrosphere.game.data.creature.type.equip.EquipPoint; import electrosphere.game.data.creature.type.equip.EquipPoint;
public class RelationalInventoryState { public class RelationalInventoryState {
Map<String,Entity> items = new HashMap<String,Entity>(); Map<String,Entity> items = new HashMap<String,Entity>();
Map<String,List<String>> slotWhitelists = new HashMap<String,List<String>>();
Map<String,EquipPoint> equipPoints = new HashMap<String,EquipPoint>();
public static RelationalInventoryState buildRelationalInventoryStateFromStringList(List<String> slots){ // public static RelationalInventoryState buildRelationalInventoryStateFromStringList(List<String> slots){
RelationalInventoryState rVal = new RelationalInventoryState(); // RelationalInventoryState rVal = new RelationalInventoryState();
for(String slot : slots){ // for(String slot : slots){
rVal.items.put(slot,null); // rVal.items.put(slot,null);
} // }
return rVal; // return rVal;
} // }
public static RelationalInventoryState buildRelationalInventoryStateFromEquipList(List<EquipPoint> points){ public static RelationalInventoryState buildRelationalInventoryStateFromEquipList(List<EquipPoint> points){
RelationalInventoryState rVal = new RelationalInventoryState(); RelationalInventoryState rVal = new RelationalInventoryState();
for(EquipPoint point : points){ for(EquipPoint point : points){
rVal.items.put(point.getEquipPointId(),null); rVal.items.put(point.getEquipPointId(),null);
rVal.slotWhitelists.put(point.getEquipPointId(),point.getEquipClassWhitelist());
rVal.equipPoints.put(point.getEquipPointId(),point);
} }
return rVal; return rVal;
} }
@ -42,6 +47,17 @@ public class RelationalInventoryState {
return items.get(slot); return items.get(slot);
} }
public String getItemSlot(Entity item){
if(items.containsValue(item)){
for(String slot : items.keySet()){
if(items.get(slot) == item){
return slot;
}
}
}
return null;
}
public boolean hasItemInSlot(String slot){ public boolean hasItemInSlot(String slot){
//if the slot is a key return if the value at the key isn't null, otherwise return false //if the slot is a key return if the value at the key isn't null, otherwise return false
return items.containsKey(slot) ? items.get(slot) != null : false; return items.containsKey(slot) ? items.get(slot) != null : false;
@ -51,4 +67,29 @@ public class RelationalInventoryState {
return new LinkedList<String>(items.keySet()); return new LinkedList<String>(items.keySet());
} }
public Entity tryRemoveItem(Entity item){
if(items.containsValue(item)){
for(String slot : items.keySet()){
if(items.get(slot) == item){
items.remove(slot);
items.put(slot,null);
return item;
}
}
}
return null;
}
public boolean canEquipItemToSlot(Entity item, String slot){
String itemClass = ItemUtils.getEquipClass(item);
if(slotWhitelists.get(slot).contains(itemClass)){
return true;
}
return false;
}
public EquipPoint getEquipPointFromSlot(String slot){
return equipPoints.get(slot);
}
} }

View File

@ -29,7 +29,7 @@ public class AttachUtils {
if(parent.getDataKeys().contains(EntityDataStrings.ATTACH_CHILDREN_LIST)){ if(parent.getDataKeys().contains(EntityDataStrings.ATTACH_CHILDREN_LIST)){
getChildrenList(parent).add(toAttach); getChildrenList(parent).add(toAttach);
} else { } else {
LinkedList<Entity> childrenEntities = new LinkedList(); LinkedList<Entity> childrenEntities = new LinkedList<Entity> ();
childrenEntities.add(toAttach); childrenEntities.add(toAttach);
parent.putData(EntityDataStrings.ATTACH_CHILDREN_LIST, childrenEntities); parent.putData(EntityDataStrings.ATTACH_CHILDREN_LIST, childrenEntities);
} }

View File

@ -115,6 +115,9 @@ public class ItemUtils {
} else { } else {
rVal.putData(EntityDataStrings.ITEM_ICON,genericItemIconPath); rVal.putData(EntityDataStrings.ITEM_ICON,genericItemIconPath);
} }
if(item.getEquipClass() != null){
rVal.putData(EntityDataStrings.ITEM_EQUIP_CLASS,item.getEquipClass());
}
rVal.putData(EntityDataStrings.DRAW_CAST_SHADOW, true); rVal.putData(EntityDataStrings.DRAW_CAST_SHADOW, true);
rVal.putData(EntityDataStrings.ITEM_IS_ITEM, true); rVal.putData(EntityDataStrings.ITEM_IS_ITEM, true);
rVal.putData(EntityDataStrings.ITEM_TYPE, name); rVal.putData(EntityDataStrings.ITEM_TYPE, name);
@ -210,6 +213,7 @@ public class ItemUtils {
rVal.putData(EntityDataStrings.ITEM_EQUIP_WHITELIST, getEquipWhitelist(item)); rVal.putData(EntityDataStrings.ITEM_EQUIP_WHITELIST, getEquipWhitelist(item));
} }
rVal.putData(EntityDataStrings.ITEM_ICON,ItemUtils.getItemIcon(item)); rVal.putData(EntityDataStrings.ITEM_ICON,ItemUtils.getItemIcon(item));
rVal.putData(EntityDataStrings.ITEM_EQUIP_CLASS, item.getData(EntityDataStrings.ITEM_EQUIP_CLASS));
rVal.putData(EntityDataStrings.ITEM_IS_ITEM, true); rVal.putData(EntityDataStrings.ITEM_IS_ITEM, true);
rVal.putData(EntityDataStrings.ITEM_TYPE, item.getData(EntityDataStrings.ITEM_TYPE)); rVal.putData(EntityDataStrings.ITEM_TYPE, item.getData(EntityDataStrings.ITEM_TYPE));
Globals.entityManager.registerEntity(rVal); Globals.entityManager.registerEntity(rVal);
@ -248,4 +252,16 @@ public class ItemUtils {
return (String)item.getData(EntityDataStrings.ITEM_ICON); return (String)item.getData(EntityDataStrings.ITEM_ICON);
} }
public static String getEquipClass(Entity item){
return (String)item.getData(EntityDataStrings.ITEM_EQUIP_CLASS);
}
public static void setRealWorldEntity(Entity inInventory, Entity inWorld){
inInventory.putData(EntityDataStrings.ITEM_IN_WORLD_REPRESENTATION, inWorld);
}
public static Entity getRealWorldEntity(Entity inInventory){
return (Entity) inInventory.getData(EntityDataStrings.ITEM_IN_WORLD_REPRESENTATION);
}
} }

View File

@ -14,6 +14,7 @@ public class Item {
List<EquipWhitelist> equipWhitelist; List<EquipWhitelist> equipWhitelist;
String idleAnim; String idleAnim;
String iconPath; String iconPath;
String equipClass;
public String getItemId() { public String getItemId() {
return itemId; return itemId;
@ -46,5 +47,9 @@ public class Item {
public String getIconPath(){ public String getIconPath(){
return iconPath; return iconPath;
} }
public String getEquipClass(){
return equipClass;
}
} }

View File

@ -277,6 +277,7 @@ public class Globals {
//manager for all widgets currently being drawn to screen //manager for all widgets currently being drawn to screen
public static ElementManager elementManager; public static ElementManager elementManager;
public static int openInventoriesCount = 0;
//collision world data //collision world data
public static CommonWorldData commonWorldData; public static CommonWorldData commonWorldData;
@ -300,7 +301,7 @@ public class Globals {
//drag item state //drag item state
public static Entity draggedItem = null; public static Entity draggedItem = null;
public static UnrelationalInventoryState dragSourceInventory = null; public static Object dragSourceInventory = null;

View File

@ -1,12 +1,17 @@
package electrosphere.menu; package electrosphere.menu;
import electrosphere.controls.ControlHandler.ControlsState;
import electrosphere.engine.LoadingThread; import electrosphere.engine.LoadingThread;
import electrosphere.entity.Entity; import electrosphere.entity.Entity;
import electrosphere.entity.EntityDataStrings;
import electrosphere.entity.state.equip.EquipState;
import electrosphere.entity.state.inventory.InventoryUtils; import electrosphere.entity.state.inventory.InventoryUtils;
import electrosphere.entity.state.inventory.RelationalInventoryState;
import electrosphere.entity.state.inventory.UnrelationalInventoryState; import electrosphere.entity.state.inventory.UnrelationalInventoryState;
import electrosphere.entity.types.item.ItemUtils; import electrosphere.entity.types.item.ItemUtils;
import electrosphere.game.server.saves.SaveUtils; import electrosphere.game.server.saves.SaveUtils;
import electrosphere.main.Globals; import electrosphere.main.Globals;
import electrosphere.main.Main;
import electrosphere.net.NetUtils; import electrosphere.net.NetUtils;
import electrosphere.renderer.ui.ClickableElement; import electrosphere.renderer.ui.ClickableElement;
import electrosphere.renderer.ui.DrawableElement; import electrosphere.renderer.ui.DrawableElement;
@ -14,7 +19,10 @@ import electrosphere.renderer.ui.Element;
import electrosphere.renderer.ui.FocusableElement; import electrosphere.renderer.ui.FocusableElement;
import electrosphere.renderer.ui.WidgetUtils; import electrosphere.renderer.ui.WidgetUtils;
import electrosphere.renderer.ui.Window; import electrosphere.renderer.ui.Window;
import electrosphere.renderer.ui.ClickableElement.ClickEventCallback;
import electrosphere.renderer.ui.DraggableElement.DragEventCallback; import electrosphere.renderer.ui.DraggableElement.DragEventCallback;
import electrosphere.renderer.ui.FocusableElement.FocusEventCallback;
import electrosphere.renderer.ui.NavigableElement.NavigationEventCallback;
import electrosphere.renderer.ui.elements.Button; import electrosphere.renderer.ui.elements.Button;
import electrosphere.renderer.ui.elements.Div; import electrosphere.renderer.ui.elements.Div;
import electrosphere.renderer.ui.elements.ImagePanel; import electrosphere.renderer.ui.elements.ImagePanel;
@ -22,10 +30,14 @@ import electrosphere.renderer.ui.elements.Label;
import electrosphere.renderer.ui.elements.TextInput; import electrosphere.renderer.ui.elements.TextInput;
import electrosphere.renderer.ui.events.ClickEvent; import electrosphere.renderer.ui.events.ClickEvent;
import electrosphere.renderer.ui.events.DragEvent; import electrosphere.renderer.ui.events.DragEvent;
import electrosphere.renderer.ui.events.FocusEvent;
import electrosphere.renderer.ui.events.NavigationEvent;
import electrosphere.renderer.ui.form.FormElement; import electrosphere.renderer.ui.form.FormElement;
import java.util.List; import java.util.List;
import javax.management.relation.Relation;
/** /**
* *
* @author amaterasu * @author amaterasu
@ -379,28 +391,43 @@ public class MenuGenerators {
} }
public static Element worldItemDropCaptureWindow(){ public static Element worldItemDropCaptureWindow(){
Div rVal = new Div(); Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT);
rVal.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ Div div = new Div();
div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){
if(Globals.draggedItem != null){ if(Globals.draggedItem != null){
//remove item from inventory if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){
Globals.dragSourceInventory.removeItem(Globals.draggedItem); UnrelationalInventoryState inventory = (UnrelationalInventoryState) Globals.dragSourceInventory;
//drop item //drop item
InventoryUtils.attemptEjectItem(Globals.playerCharacter,Globals.draggedItem); InventoryUtils.attemptEjectItem(Globals.playerCharacter,Globals.draggedItem);
//clear ui //clear ui
WindowUtils.cleanItemWindow(); WindowUtils.cleanItemDraggingWindow();
String sourceWindowId = WindowUtils.getInventoryWindowID(Globals.dragSourceInventory.getId()); String sourceWindowId = WindowUtils.getInventoryWindowID(inventory.getId());
WindowUtils.replaceWindowContents(sourceWindowId,MenuGenerators.createNaturalInventoryMenu(Globals.dragSourceInventory)); WindowUtils.replaceWindow(sourceWindowId,MenuGenerators.createNaturalInventoryMenu(inventory));
//null globals //null globals
Globals.dragSourceInventory = null; Globals.dragSourceInventory = null;
Globals.draggedItem = null; Globals.draggedItem = null;
return false; return false;
} else if(Globals.dragSourceInventory instanceof RelationalInventoryState){
RelationalInventoryState inventory = (RelationalInventoryState) Globals.dragSourceInventory;
//drop item
InventoryUtils.attemptEjectItem(Globals.playerCharacter,Globals.draggedItem);
//clear ui
WindowUtils.cleanItemDraggingWindow();
String sourceWindowId = WindowStrings.WINDOW_CHARACTER;
WindowUtils.replaceWindow(sourceWindowId,MenuGenerators.createCharacterMenu(inventory));
//null globals
Globals.dragSourceInventory = null;
Globals.draggedItem = null;
return false;
}
} }
return true; return true;
}}); }});
rVal.setPositionX(0); div.setPositionX(0);
rVal.setPositionY(0); div.setPositionY(0);
rVal.setWidth(Globals.WINDOW_WIDTH); div.setWidth(Globals.WINDOW_WIDTH);
rVal.setHeight(Globals.WINDOW_HEIGHT); div.setHeight(Globals.WINDOW_HEIGHT);
rVal.addChild(div);
return rVal; return rVal;
} }
@ -409,7 +436,14 @@ public class MenuGenerators {
int width = 500; int width = 500;
int height = 500; int height = 500;
// int screenLeft = (Globals.WINDOW_WIDTH - width)/2; // int screenLeft = (Globals.WINDOW_WIDTH - width)/2;
FormElement rVal = new FormElement(); Div rVal = new Div();
rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), false);
Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN);
Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
Globals.controlHandler.hideMouse();
return false;
}});
//black texture background //black texture background
ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture); ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture);
@ -419,65 +453,101 @@ public class MenuGenerators {
rVal.addChild(imagePanel); rVal.addChild(imagePanel);
//label 1 (back) //label 1 (back)
Button backButton = new Button();
Label backLabel = new Label(100,50,1.0f); Label backLabel = new Label(100,50,1.0f);
backLabel.setText("Back"); backLabel.setText("Back");
rVal.addChild(backLabel); backButton.addChild(backLabel);
rVal.addChild(backButton);
backButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), false);
Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN);
Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
Globals.controlHandler.hideMouse();
return false;
}});
//label 2 (quit) //label 2 (quit)
Button quitButton = new Button();
Label quitLabel = new Label(100,150,1.0f); Label quitLabel = new Label(100,150,1.0f);
quitLabel.setText("Quit"); quitLabel.setText("QUIT");
rVal.addChild(quitLabel); quitButton.addChild(quitLabel);
rVal.addChild(quitButton);
quitButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
Main.running = false;
return false;
}});
return rVal; return rVal;
} }
public static Element createNaturalInventoryMenu(UnrelationalInventoryState inventory){ public static Window createNaturalInventoryMenu(UnrelationalInventoryState inventory){
// int screenTop = Globals.WINDOW_HEIGHT - 150;
int width = 500; int width = 500;
int height = 500; int height = 500;
// int screenLeft = (Globals.WINDOW_WIDTH - width)/2;
Div rVal = new Div();
rVal.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){ Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT);
Div div = new Div();
rVal.addChild(div);
rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(inventory.getId())), false);
Globals.elementManager.unregisterWindow(WindowUtils.getInventoryWindowID(inventory.getId()));
//
Globals.openInventoriesCount--;
if(Globals.openInventoriesCount == 0){
Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
Globals.controlHandler.hideMouse();
}
return false;
}});
div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){
if(Globals.draggedItem != null){ if(Globals.draggedItem != null){
if(Globals.dragSourceInventory != inventory){ if(Globals.dragSourceInventory != inventory){
UnrelationalInventoryState sourceInventory = Globals.dragSourceInventory; if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){
//transfer item UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState)Globals.dragSourceInventory;
Globals.dragSourceInventory.removeItem(Globals.draggedItem); //transfer item
inventory.addItem(Globals.draggedItem); sourceInventory.removeItem(Globals.draggedItem);
//null out global state inventory.addItem(Globals.draggedItem);
Globals.dragSourceInventory = null; //null out global state
Globals.draggedItem = null; Globals.dragSourceInventory = null;
//clear item container ui Globals.draggedItem = null;
WindowUtils.cleanItemWindow(); //clear item container ui
//rerender both inventories WindowUtils.cleanItemDraggingWindow();
//re-render inventory //rerender both inventories
WindowUtils.replaceWindowContents(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory)); //re-render inventory
//re-render inventory WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory));
WindowUtils.replaceWindowContents(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory)); //re-render inventory
WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory));
}
} else { } else {
//clear ui //clear ui
WindowUtils.cleanItemWindow(); WindowUtils.cleanItemDraggingWindow();
//re-render inventory //re-render inventory
WindowUtils.replaceWindowContents(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory)); WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory));
} }
return false; return false;
} }
return true; return true;
}}); }});
div.setOnClick(new ClickEventCallback() {public boolean execute(ClickEvent event){
WindowUtils.focusWindow(WindowStrings.WINDOW_MENU_INVENTORY);
return false;
}});
//black texture background //black texture background
ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture); ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture);
// imagePanel.setWidth(width); // imagePanel.setWidth(width);
// imagePanel.setHeight(height); // imagePanel.setHeight(height);
// imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture)); // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture));
rVal.addChild(imagePanel); div.addChild(imagePanel);
//label 1 (inventory) //label 1 (inventory)
Label inventoryLabel = new Label(10,10,1.0f); Label inventoryLabel = new Label(10,10,1.0f);
inventoryLabel.setText("INVENTORY"); inventoryLabel.setText("INVENTORY");
rVal.addChild(inventoryLabel); div.addChild(inventoryLabel);
int columns = 8; int columns = 8;
int columnWidth = 60; int columnWidth = 60;
@ -506,7 +576,7 @@ public class MenuGenerators {
// System.out.println("Drag start"); // System.out.println("Drag start");
Globals.dragSourceInventory = inventory; Globals.dragSourceInventory = inventory;
Globals.draggedItem = inventory.getItems().get(itemId); Globals.draggedItem = inventory.getItems().get(itemId);
rVal.removeChild(panel); div.removeChild(panel);
WindowUtils.pushItemIconToItemWindow(panel); WindowUtils.pushItemIconToItemWindow(panel);
return false; return false;
}}); }});
@ -516,28 +586,225 @@ public class MenuGenerators {
panel.setPositionY(event.getCurrentY() - panelHeight / 2); panel.setPositionY(event.getCurrentY() - panelHeight / 2);
return false; return false;
}}); }});
// panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){ } else {
// // panel.setPositionX(posX); panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){
// // panel.setPositionY(posY); if(Globals.dragSourceInventory instanceof RelationalInventoryState){
// //now the fun begins :) RelationalInventoryState sourceInventory = (RelationalInventoryState) Globals.dragSourceInventory;
// //if transfer item Entity item = Globals.draggedItem;
// // remove item from current inventory //destroy real world item
// // place item in new inventory if(ItemUtils.getRealWorldEntity(item) != null){
// // trigger recreation of the menu System.out.println("Destroy real world item");
// //if drop item ItemUtils.destroyInWorldItem(ItemUtils.getRealWorldEntity(item));
// // remove item from current inventory }
// // create item in world in front of character //eject from equip state
// // trigger recreation of the menu InventoryUtils.attemptDestroyItem(Globals.playerCharacter,item);
// //if neither of above //add to unrelational
// // replace item icon position to origin sourceInventory.tryRemoveItem(item);
// // System.out.println("Release drag"); inventory.addItem(item);
// return false; //update ui
// }}); Globals.dragSourceInventory = null;
Globals.draggedItem = null;
//clear item container ui
WindowUtils.cleanItemDraggingWindow();
//rerender both inventories
//re-render inventory
WindowUtils.replaceWindow(WindowStrings.WINDOW_CHARACTER, MenuGenerators.createCharacterMenu(sourceInventory));
//re-render inventory
WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory));
}
//now the fun begins :)
//if transfer item
// remove item from current inventory
// place item in new inventory
// trigger recreation of the menu
//if drop item
// remove item from current inventory
// create item in world in front of character
// trigger recreation of the menu
//if neither of above
// replace item icon position to origin
// System.out.println("Release drag");
return false;
}});
} }
// imagePanel.setWidth(width); // imagePanel.setWidth(width);
// imagePanel.setHeight(height); // imagePanel.setHeight(height);
// imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture)); // imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture));
rVal.addChild(panel); div.addChild(panel);
}
return rVal;
}
public static Window createCharacterMenu(RelationalInventoryState inventory){
// int screenTop = Globals.WINDOW_HEIGHT - 150;
int width = 500;
int height = 500;
// int screenLeft = (Globals.WINDOW_WIDTH - width)/2;
Window rVal = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT);
Div div = new Div();
div.setPositionX(1000);
rVal.addChild(div);
rVal.setOnNavigationCallback(new NavigationEventCallback() {public boolean execute(NavigationEvent event){
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_CHARACTER), false);
Globals.elementManager.unregisterWindow(WindowStrings.WINDOW_CHARACTER);
//
Globals.openInventoriesCount--;
if(Globals.openInventoriesCount == 0){
Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
Globals.controlHandler.hideMouse();
}
return false;
}});
div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){
if(Globals.draggedItem != null){
if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){
UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState)Globals.dragSourceInventory;
//null out global state
Globals.dragSourceInventory = null;
Globals.draggedItem = null;
//clear item container ui
WindowUtils.cleanItemDraggingWindow();
//rerender both inventories
//re-render inventory
WindowUtils.replaceWindow(WindowStrings.WINDOW_CHARACTER, MenuGenerators.createCharacterMenu(inventory));
//re-render inventory
WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory));
}
return false;
}
return true;
}});
div.setOnClick(new ClickEventCallback() {public boolean execute(ClickEvent event){
WindowUtils.focusWindow(WindowStrings.WINDOW_CHARACTER);
return false;
}});
//black texture background
ImagePanel imagePanel = new ImagePanel(1000,0,width,height,Globals.blackTexture);
// imagePanel.setWidth(width);
// imagePanel.setHeight(height);
// imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture));
div.addChild(imagePanel);
//label 1 (inventory)
Label inventoryLabel = new Label(1010,10,1.0f);
inventoryLabel.setText("CHARACTER");
div.addChild(inventoryLabel);
// int columns = 8;
// int columnWidth = 60;
// int rowHeight = 60;
int slotSpacing = 30;
List<String> slots = inventory.getSlots();
int numSlots = slots.size();
int numRows = (numSlots / 2) + (numSlots % 2 == 1 ? 1 : 0);
int incrementer = 0;
for(int i = 0; i < numSlots; i++){
String texturePath = "Textures/icons/itemIconEmpty.png";
boolean hasItem = false;
if(inventory.getItemSlot(slots.get(i)) != null){
Entity currentItem = inventory.getItemSlot(slots.get(i));
//get texture path from item
texturePath = ItemUtils.getItemIcon(currentItem);
//flag that this isn't an empty slot
hasItem = true;
}
if(!Globals.assetManager.hasLoadedTexture(texturePath)){
Globals.assetManager.addTexturePathtoQueue(texturePath);
}
int panelWidth = 50;
int panelHeight = 50;
int posX = 1000 + 20;
if((incrementer % 2) == 1){
posX = posX + 400;
}
int posY = 60 + (i / 2 * (panelHeight + slotSpacing));
ImagePanel panel = new ImagePanel(posX,posY,panelWidth,panelHeight,texturePath);
if(hasItem == true){
int itemId = i;
panel.setOnDragStart(new DragEventCallback() {public boolean execute(DragEvent event){
// System.out.println("Drag start");
Globals.dragSourceInventory = inventory;
Globals.draggedItem = inventory.getItemSlot(slots.get(itemId));
div.removeChild(panel);
WindowUtils.pushItemIconToItemWindow(panel);
return false;
}});
panel.setOnDrag(new DragEventCallback() {public boolean execute(DragEvent event){
// System.out.println("Drag");
panel.setPositionX(event.getCurrentX() - panelWidth / 2);
panel.setPositionY(event.getCurrentY() - panelHeight / 2);
return false;
}});
} else {
int itemId = i;
panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){
// panel.setPositionX(posX);
// panel.setPositionY(posY);
if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){
UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState) Globals.dragSourceInventory;
Entity item = Globals.draggedItem;
if(inventory.canEquipItemToSlot(item, slots.get(itemId))){
//transfer item
sourceInventory.removeItem(item);
inventory.addItem(slots.get(itemId), item);
//hydrate inventory item
Entity inWorldItem = ItemUtils.spawnBasicItem(ItemUtils.getType(item));
//bind in world with in inventory
ItemUtils.setRealWorldEntity(item, inWorldItem);
//fire equip event to equip state
EquipState equipState = (EquipState)Globals.playerCharacter.getData(EntityDataStrings.EQUIP_STATE);
equipState.attemptEquip(inWorldItem,inventory.getEquipPointFromSlot(slots.get(itemId)));
}
//update ui
Globals.dragSourceInventory = null;
Globals.draggedItem = null;
//clear item container ui
WindowUtils.cleanItemDraggingWindow();
//rerender both inventories
//re-render inventory
WindowUtils.replaceWindow(WindowStrings.WINDOW_CHARACTER, MenuGenerators.createCharacterMenu(inventory));
//re-render inventory
WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory));
}
//now the fun begins :)
//if transfer item
// remove item from current inventory
// place item in new inventory
// trigger recreation of the menu
//if drop item
// remove item from current inventory
// create item in world in front of character
// trigger recreation of the menu
//if neither of above
// replace item icon position to origin
// System.out.println("Release drag");
//rebuild inventory windows
return false;
}});
}
div.addChild(panel);
//create the slot text
posX = 1000 + 80;
if((incrementer % 2) == 1){
posX = posX + 190;
}
posY = posY + 15;
Label slotText = new Label(posX, posY, 0.4f);
slotText.setText(slots.get(i));
div.addChild(slotText);
incrementer++;
} }
return rVal; return rVal;

View File

@ -9,5 +9,6 @@ public class WindowStrings {
public static final String WINDOW_LOADING = "windowLoading"; public static final String WINDOW_LOADING = "windowLoading";
public static final String WINDDOW_ITEM_DROP = "itemDrop"; public static final String WINDDOW_ITEM_DROP = "itemDrop";
public static final String WINDOW_ITEM_DRAG_CONTAINER = "itemDragContainer"; public static final String WINDOW_ITEM_DRAG_CONTAINER = "itemDragContainer";
public static final String WINDOW_CHARACTER = "windowCharacter";
} }

View File

@ -16,7 +16,7 @@ public class WindowUtils {
//todo: destroy elements as well //todo: destroy elements as well
mainMenu.getChildren().clear(); mainMenu.getChildren().clear();
mainMenu.addChild(newMenu); mainMenu.addChild(newMenu);
Globals.elementManager.focusFirstElement(mainMenu); Globals.elementManager.focusFirstElement();
} }
} }
@ -42,7 +42,7 @@ public class WindowUtils {
//todo: destroy elements as well //todo: destroy elements as well
mainMenu.getChildren().clear(); mainMenu.getChildren().clear();
mainMenu.addChild(content); mainMenu.addChild(content);
Globals.elementManager.focusFirstElement(mainMenu); Globals.elementManager.focusFirstElement();
} }
} }
@ -53,12 +53,18 @@ public class WindowUtils {
Globals.elementManager.pushWindowToFront(targetWindow); Globals.elementManager.pushWindowToFront(targetWindow);
} }
public static void cleanItemWindow(){ public static void cleanItemDraggingWindow(){
Window targetWindow = (Window) Globals.elementManager.getWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER); Window targetWindow = (Window) Globals.elementManager.getWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER);
targetWindow.getChildren().clear(); targetWindow.getChildren().clear();
recursiveSetVisible(targetWindow, false); recursiveSetVisible(targetWindow, false);
} }
public static void replaceWindow(String window, Window windowEl){
Globals.elementManager.unregisterWindow(window);
Globals.elementManager.registerWindow(window, windowEl);
recursiveSetVisible(windowEl, true);
Globals.elementManager.focusFirstElement();
}
@ -89,9 +95,7 @@ public class WindowUtils {
} }
static void initItemDropWindow(){ static void initItemDropWindow(){
Window itemDropWindow = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT); Globals.elementManager.registerWindow(WindowStrings.WINDDOW_ITEM_DROP, MenuGenerators.worldItemDropCaptureWindow());
Globals.elementManager.registerWindow(WindowStrings.WINDDOW_ITEM_DROP, itemDropWindow);
WindowUtils.replaceWindowContents(WindowStrings.WINDDOW_ITEM_DROP, MenuGenerators.worldItemDropCaptureWindow());
} }
static void initItemDragContainerWindow(){ static void initItemDragContainerWindow(){
@ -99,4 +103,10 @@ public class WindowUtils {
Globals.elementManager.registerWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER, itemDragContainerWindow); Globals.elementManager.registerWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER, itemDragContainerWindow);
} }
public static void focusWindow(String window){
Element windowEl = Globals.elementManager.getWindow(window);
Globals.elementManager.unregisterWindow(window);
Globals.elementManager.registerWindow(window, windowEl);
}
} }

View File

@ -14,7 +14,9 @@ import electrosphere.renderer.ui.events.DragEvent;
import electrosphere.renderer.ui.events.Event; import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.events.FocusEvent; import electrosphere.renderer.ui.events.FocusEvent;
import electrosphere.renderer.ui.events.MouseEvent; import electrosphere.renderer.ui.events.MouseEvent;
import electrosphere.renderer.ui.events.NavigationEvent;
import electrosphere.renderer.ui.events.DragEvent.DragEventType; import electrosphere.renderer.ui.events.DragEvent.DragEventType;
import electrosphere.renderer.ui.events.NavigationEvent.NavigationEventType;
/** /**
* *
@ -34,7 +36,7 @@ public class ElementManager {
elementList.add(w); elementList.add(w);
} }
if(elementList.size() == 1){ if(elementList.size() == 1){
focusFirstElement(w); focusFirstElement();
} }
} }
@ -51,6 +53,9 @@ public class ElementManager {
if(elementList.contains(w)){ if(elementList.contains(w)){
elementList.remove(w); elementList.remove(w);
} }
if(elementList.size() > 0){
focusFirstElement();
}
} }
public void pushWindowToFront(Window window){ public void pushWindowToFront(Window window){
@ -75,8 +80,8 @@ public class ElementManager {
return currentFocusedElement; return currentFocusedElement;
} }
public void focusFirstElement(Element topLevel){ public void focusFirstElement(){
List<FocusableElement> focusables = getFocusableList(topLevel,new LinkedList<FocusableElement>()); List<FocusableElement> focusables = getFocusableList(elementList.get(elementList.size() - 1),new LinkedList<FocusableElement>());
if(focusables.size() > 0){ if(focusables.size() > 0){
if(currentFocusedElement != null){ if(currentFocusedElement != null){
currentFocusedElement.handleEvent(new FocusEvent(false)); currentFocusedElement.handleEvent(new FocusEvent(false));
@ -86,8 +91,8 @@ public class ElementManager {
} }
} }
public void focusNextElement(Element topLevel){ public void focusNextElement(){
List<FocusableElement> focusables = getFocusableList(topLevel,new LinkedList<FocusableElement>()); List<FocusableElement> focusables = getFocusableList(elementList.get(elementList.size() - 1),new LinkedList<FocusableElement>());
if(focusables.contains(currentFocusedElement)){ if(focusables.contains(currentFocusedElement)){
int index = focusables.indexOf(currentFocusedElement); int index = focusables.indexOf(currentFocusedElement);
if(index + 1 >= focusables.size()){ if(index + 1 >= focusables.size()){
@ -103,8 +108,8 @@ public class ElementManager {
} }
} }
public void focusPreviousElement(Element topLevel){ public void focusPreviousElement(){
List<FocusableElement> focusables = getFocusableList(topLevel,new LinkedList<FocusableElement>()); List<FocusableElement> focusables = getFocusableList(elementList.get(elementList.size() - 1),new LinkedList<FocusableElement>());
if(focusables.contains(currentFocusedElement)){ if(focusables.contains(currentFocusedElement)){
int index = focusables.indexOf(currentFocusedElement); int index = focusables.indexOf(currentFocusedElement);
if(index - 1 < 0){ if(index - 1 < 0){
@ -207,5 +212,10 @@ public class ElementManager {
} }
fireEvent(event,event.getCurrentX(),event.getCurrentY()); fireEvent(event,event.getCurrentX(),event.getCurrentY());
} }
public void navigateBackwards(){
NavigationEvent event = new NavigationEvent(NavigationEventType.BACKWARD);
fireEvent(event,currentFocusedElement.getPositionX(),currentFocusedElement.getPositionY());
}
} }

View File

@ -8,7 +8,7 @@ public interface NavigableElement extends Element {
public interface NavigationEventCallback { public interface NavigationEventCallback {
public void execute(NavigationEvent event); public boolean execute(NavigationEvent event);
} }

View File

@ -6,6 +6,7 @@ import electrosphere.renderer.Model;
import electrosphere.renderer.framebuffer.Framebuffer; import electrosphere.renderer.framebuffer.Framebuffer;
import electrosphere.renderer.framebuffer.FramebufferUtils; import electrosphere.renderer.framebuffer.FramebufferUtils;
import electrosphere.renderer.ui.events.Event; import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.events.NavigationEvent;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
@ -17,7 +18,7 @@ import static org.lwjgl.opengl.GL30.*;
* *
* @author amaterasu * @author amaterasu
*/ */
public class Window implements DrawableElement, ContainerElement { public class Window implements DrawableElement, ContainerElement, NavigableElement {
List<Element> childList = new LinkedList<Element>(); List<Element> childList = new LinkedList<Element>();
Framebuffer widgetBuffer; Framebuffer widgetBuffer;
Material customMat = new Material(); Material customMat = new Material();
@ -26,6 +27,8 @@ public class Window implements DrawableElement, ContainerElement {
Vector3f boxDimensions = new Vector3f(); Vector3f boxDimensions = new Vector3f();
Vector3f texPosition = new Vector3f(0,0,0); Vector3f texPosition = new Vector3f(0,0,0);
Vector3f texScale = new Vector3f(1,1,0); Vector3f texScale = new Vector3f(1,1,0);
NavigationEventCallback navCallback;
public Window(int positionX, int positionY, int width, int height){ public Window(int positionX, int positionY, int width, int height){
//TODO: figure out why this has to be 1920x1080 //TODO: figure out why this has to be 1920x1080
@ -197,7 +200,18 @@ public class Window implements DrawableElement, ContainerElement {
} }
public boolean handleEvent(Event event){ public boolean handleEvent(Event event){
return true; boolean propagate = true;
if(event instanceof NavigationEvent && navCallback != null){
if(!navCallback.execute((NavigationEvent)event)){
propagate = false;
}
}
return propagate;
}
@Override
public void setOnNavigationCallback(NavigationEventCallback callback) {
navCallback = callback;
} }
} }

View File

@ -9,13 +9,15 @@ import electrosphere.renderer.ui.DraggableElement;
import electrosphere.renderer.ui.DrawableElement; import electrosphere.renderer.ui.DrawableElement;
import electrosphere.renderer.ui.Element; import electrosphere.renderer.ui.Element;
import electrosphere.renderer.ui.FocusableElement; import electrosphere.renderer.ui.FocusableElement;
import electrosphere.renderer.ui.NavigableElement;
import electrosphere.renderer.ui.events.ClickEvent; import electrosphere.renderer.ui.events.ClickEvent;
import electrosphere.renderer.ui.events.DragEvent; import electrosphere.renderer.ui.events.DragEvent;
import electrosphere.renderer.ui.events.Event; import electrosphere.renderer.ui.events.Event;
import electrosphere.renderer.ui.events.FocusEvent; import electrosphere.renderer.ui.events.FocusEvent;
import electrosphere.renderer.ui.events.NavigationEvent;
import electrosphere.renderer.ui.events.DragEvent.DragEventType; import electrosphere.renderer.ui.events.DragEvent.DragEventType;
public class Div implements ClickableElement,ContainerElement,DraggableElement,FocusableElement,DrawableElement { public class Div implements ClickableElement,ContainerElement,DraggableElement,FocusableElement,DrawableElement,NavigableElement {
ClickEventCallback onClick; ClickEventCallback onClick;
FocusEventCallback onFocus; FocusEventCallback onFocus;
@ -23,6 +25,7 @@ public class Div implements ClickableElement,ContainerElement,DraggableElement,F
DragEventCallback onDragStart; DragEventCallback onDragStart;
DragEventCallback onDrag; DragEventCallback onDrag;
DragEventCallback onDragRelease; DragEventCallback onDragRelease;
NavigationEventCallback onNavigate;
boolean focused = false; boolean focused = false;
List<Element> childList = new LinkedList<Element>(); List<Element> childList = new LinkedList<Element>();
@ -293,6 +296,13 @@ public class Div implements ClickableElement,ContainerElement,DraggableElement,F
} }
} }
} }
if(event instanceof NavigationEvent){
if(onNavigate != null){
if(onNavigate.execute((NavigationEvent)event)){
propagate = false;
}
}
}
return propagate; return propagate;
} }
@ -319,6 +329,12 @@ public class Div implements ClickableElement,ContainerElement,DraggableElement,F
} }
} }
@Override
public void setOnNavigationCallback(NavigationEventCallback callback) {
// TODO Auto-generated method stub
onNavigate = callback;
}

View File

@ -1,5 +1,19 @@
package electrosphere.renderer.ui.events; package electrosphere.renderer.ui.events;
public class NavigationEvent implements Event { public class NavigationEvent implements Event {
public static enum NavigationEventType {
FORWARD,
BACKWARD,
}
NavigationEventType type;
public NavigationEvent(NavigationEventType type){
this.type = type;
}
public NavigationEventType getType(){
return type;
}
} }