Character equip screen
This commit is contained in:
parent
ec0ac741e5
commit
0cc3057d51
@ -16,8 +16,12 @@ public class Control {
|
||||
ControlMethod onPress;
|
||||
ControlMethod onRelease;
|
||||
ControlMethod onRepeat;
|
||||
ControlMethod onClick;
|
||||
MouseCallback onMove;
|
||||
|
||||
float pressFrame = 0;
|
||||
float repeatTimeout = 0;
|
||||
|
||||
public boolean isIsKey() {
|
||||
return type == ControlType.KEY;
|
||||
}
|
||||
@ -64,6 +68,10 @@ public class Control {
|
||||
onMove = method;
|
||||
}
|
||||
|
||||
public void setOnClick(ControlMethod method){
|
||||
onClick = method;
|
||||
}
|
||||
|
||||
public void onPress(){
|
||||
if(onPress != null){
|
||||
onPress.execute();
|
||||
@ -87,6 +95,28 @@ public class Control {
|
||||
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 {
|
||||
|
||||
@ -70,6 +70,7 @@ public class ControlHandler {
|
||||
public static final String INPUT_CODE_INTERACT = "interact";
|
||||
public static final String INPUT_CODE_DROP = "drop";
|
||||
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_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_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_CHARACTER_OPEN, new Control(ControlType.KEY,GLFW_KEY_C));
|
||||
|
||||
/*
|
||||
Map the menu navigation controls
|
||||
@ -301,6 +303,7 @@ public class ControlHandler {
|
||||
|
||||
case INVENTORY:
|
||||
runHandlers(inventoryControlList);
|
||||
runHandlers(menuNavigationControlList);
|
||||
break;
|
||||
|
||||
case NO_INPUT:
|
||||
@ -724,7 +727,7 @@ public class ControlHandler {
|
||||
Main menu dialog toggle
|
||||
*/
|
||||
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.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU);
|
||||
|
||||
@ -733,6 +736,7 @@ public class ControlHandler {
|
||||
mainMenuWindow.addChild(mainMenuInGame);
|
||||
Globals.elementManager.registerWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN, mainMenuWindow);
|
||||
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_INGAME_MAIN), true);
|
||||
Globals.elementManager.focusFirstElement();
|
||||
Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU);
|
||||
Globals.controlHandler.showMouse();
|
||||
// Element mainMenu = MenuGenerators.createInGameMainMenu();
|
||||
@ -740,20 +744,18 @@ public class ControlHandler {
|
||||
// MenuGenerators.makeMenuDrawable(mainMenu);
|
||||
// Globals.controlHandler.setHandlerState(ControlsState.IN_GAME_MAIN_MENU);
|
||||
}});
|
||||
controls.get(DATA_STRING_INPUT_CODE_IN_GAME_MAIN_MENU).setRepeatTimeout(0.5f);
|
||||
|
||||
/*
|
||||
Open inventory
|
||||
*/
|
||||
mainGameControlList.add(controls.get(INPUT_CODE_INVENTORY_OPEN));
|
||||
controls.get(INPUT_CODE_INVENTORY_OPEN).setOnPress(new ControlMethod(){public void execute(){
|
||||
if(InventoryUtils.hasNaturalInventory(Globals.playerCharacter)){
|
||||
inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_OPEN));
|
||||
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
|
||||
Window mainMenuWindow = new Window(0, 0, Globals.WINDOW_WIDTH, Globals.WINDOW_HEIGHT);
|
||||
UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter);
|
||||
//create window contents
|
||||
Element inventoryUI = MenuGenerators.createNaturalInventoryMenu(inventory);
|
||||
//add contents
|
||||
mainMenuWindow.addChild(inventoryUI);
|
||||
Window mainMenuWindow = MenuGenerators.createNaturalInventoryMenu(inventory);
|
||||
//register
|
||||
Globals.elementManager.registerWindow(WindowUtils.getInventoryWindowID(inventory.getId()), mainMenuWindow);
|
||||
//make visible
|
||||
@ -761,8 +763,33 @@ public class ControlHandler {
|
||||
//controls
|
||||
Globals.controlHandler.setHandlerState(ControlsState.INVENTORY);
|
||||
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));
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT).setOnPress(new ControlMethod(){public void execute(){
|
||||
// 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));
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT).setOnPress(new ControlMethod(){public void execute(){
|
||||
// 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));
|
||||
@ -806,10 +833,12 @@ public class ControlHandler {
|
||||
// // MenuCallbacks.backout(Globals.currentMenu);
|
||||
// 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);
|
||||
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
|
||||
*/
|
||||
inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_CLOSE));
|
||||
controls.get(INPUT_CODE_INVENTORY_CLOSE).setOnPress(new ControlMethod(){public void execute(){
|
||||
// MenuCallbacks.backout(Globals.currentMenu);
|
||||
UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter);
|
||||
Element inventoryWindow = Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(inventory.getId()));
|
||||
WindowUtils.recursiveSetVisible(inventoryWindow, false);
|
||||
hideMouse();
|
||||
Globals.elementManager.unregisterWindow(WindowUtils.getInventoryWindowID(inventory.getId()));
|
||||
Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
|
||||
}});
|
||||
// inventoryControlList.add(controls.get(INPUT_CODE_INVENTORY_CLOSE));
|
||||
// controls.get(INPUT_CODE_INVENTORY_CLOSE).setOnPress(new ControlMethod(){public void execute(){
|
||||
// // MenuCallbacks.backout(Globals.currentMenu);
|
||||
// UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerCharacter);
|
||||
// Element inventoryWindow = Globals.elementManager.getWindow(WindowUtils.getInventoryWindowID(inventory.getId()));
|
||||
// WindowUtils.recursiveSetVisible(inventoryWindow, false);
|
||||
// hideMouse();
|
||||
// Globals.elementManager.unregisterWindow(WindowUtils.getInventoryWindowID(inventory.getId()));
|
||||
// Globals.controlHandler.setHandlerState(ControlsState.MAIN_GAME);
|
||||
// }});
|
||||
/*
|
||||
Item manipulation
|
||||
*/
|
||||
@ -945,15 +974,22 @@ public class ControlHandler {
|
||||
if(!control.isState()){
|
||||
//on press
|
||||
control.onPress();
|
||||
control.setPressFrame(Main.lastFrame);
|
||||
} else {
|
||||
//on repeat
|
||||
control.onRepeat();
|
||||
if(Main.lastFrame - control.getPressFrame() > control.getRepeatTimeout()){
|
||||
control.onRepeat();
|
||||
}
|
||||
}
|
||||
control.setState(true);
|
||||
} else {
|
||||
if(control.isState()){
|
||||
//on release
|
||||
control.onRelease();
|
||||
//on click
|
||||
if(Main.lastFrame - control.getPressFrame() < control.getRepeatTimeout()){
|
||||
control.onClick();
|
||||
}
|
||||
} else {
|
||||
}
|
||||
control.setState(false);
|
||||
|
||||
@ -106,6 +106,7 @@ public class LoadingThread extends Thread {
|
||||
|
||||
case LOAD_TITLE_MENU:
|
||||
WindowUtils.recursiveSetVisible(loadingWindow,false);
|
||||
WindowUtils.focusWindow(WindowStrings.WINDOW_MENU_MAIN);
|
||||
WindowUtils.recursiveSetVisible(Globals.elementManager.getWindow(WindowStrings.WINDOW_MENU_MAIN), true);
|
||||
break;
|
||||
|
||||
|
||||
@ -146,7 +146,9 @@ public class EntityDataStrings {
|
||||
public static final String ITEM_IS_WEAPON = "itemIsWeapon";
|
||||
public static final String ITEM_IS_ARMOR = "itemIsArmor";
|
||||
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_IN_WORLD_REPRESENTATION = "itemInWorldRepresentation";
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@ -181,7 +181,6 @@ public class EntityManager {
|
||||
}
|
||||
if(drawableList.contains(e)){
|
||||
drawableList.remove(e);
|
||||
EntityUtils.cleanUpDrawableEntity(e);
|
||||
}
|
||||
if(entityList.contains(e)){
|
||||
entityList.remove(e);
|
||||
|
||||
@ -48,7 +48,7 @@ public class EquipState {
|
||||
boolean targetIsItem = ItemUtils.isItem(toEquip);
|
||||
boolean targetIsAttached = AttachUtils.isAttached(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();
|
||||
boolean itemIsInPointWhitelist = pointEquipClassList.contains(equipItemClass);
|
||||
if(!hasEquipped && targetIsItem && !targetIsAttached && itemIsInPointWhitelist){
|
||||
@ -153,7 +153,47 @@ public class EquipState {
|
||||
// }
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -6,9 +6,11 @@ import org.joml.Vector3f;
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityDataStrings;
|
||||
import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.entity.state.equip.EquipState;
|
||||
import electrosphere.entity.state.gravity.GravityUtils;
|
||||
import electrosphere.entity.types.creature.CreatureUtils;
|
||||
import electrosphere.entity.types.item.ItemUtils;
|
||||
import electrosphere.main.Globals;
|
||||
|
||||
public class InventoryUtils {
|
||||
|
||||
@ -21,6 +23,14 @@ public class InventoryUtils {
|
||||
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){
|
||||
boolean creatureIsCreature = CreatureUtils.isCreature(creature);
|
||||
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
|
||||
boolean creatureIsCreature = CreatureUtils.isCreature(creature);
|
||||
boolean itemIsItem = ItemUtils.isItem(item);
|
||||
boolean hasInventory = hasNaturalInventory(creature);
|
||||
if(creatureIsCreature && itemIsItem && hasInventory){
|
||||
//get inventory
|
||||
UnrelationalInventoryState inventory = getNaturalInventory(creature);
|
||||
//remove item from inventory
|
||||
inventory.removeItem(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);
|
||||
}
|
||||
//compose item into in-world entity
|
||||
Entity inWorldItem = ItemUtils.spawnBasicItem(ItemUtils.getType(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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -6,24 +6,29 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.types.item.ItemUtils;
|
||||
import electrosphere.game.data.creature.type.equip.EquipPoint;
|
||||
|
||||
public class RelationalInventoryState {
|
||||
|
||||
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){
|
||||
RelationalInventoryState rVal = new RelationalInventoryState();
|
||||
for(String slot : slots){
|
||||
rVal.items.put(slot,null);
|
||||
}
|
||||
return rVal;
|
||||
}
|
||||
// public static RelationalInventoryState buildRelationalInventoryStateFromStringList(List<String> slots){
|
||||
// RelationalInventoryState rVal = new RelationalInventoryState();
|
||||
// for(String slot : slots){
|
||||
// rVal.items.put(slot,null);
|
||||
// }
|
||||
// return rVal;
|
||||
// }
|
||||
|
||||
public static RelationalInventoryState buildRelationalInventoryStateFromEquipList(List<EquipPoint> points){
|
||||
RelationalInventoryState rVal = new RelationalInventoryState();
|
||||
for(EquipPoint point : points){
|
||||
rVal.items.put(point.getEquipPointId(),null);
|
||||
rVal.slotWhitelists.put(point.getEquipPointId(),point.getEquipClassWhitelist());
|
||||
rVal.equipPoints.put(point.getEquipPointId(),point);
|
||||
}
|
||||
return rVal;
|
||||
}
|
||||
@ -42,6 +47,17 @@ public class RelationalInventoryState {
|
||||
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){
|
||||
//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;
|
||||
@ -51,4 +67,29 @@ public class RelationalInventoryState {
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -29,7 +29,7 @@ public class AttachUtils {
|
||||
if(parent.getDataKeys().contains(EntityDataStrings.ATTACH_CHILDREN_LIST)){
|
||||
getChildrenList(parent).add(toAttach);
|
||||
} else {
|
||||
LinkedList<Entity> childrenEntities = new LinkedList();
|
||||
LinkedList<Entity> childrenEntities = new LinkedList<Entity> ();
|
||||
childrenEntities.add(toAttach);
|
||||
parent.putData(EntityDataStrings.ATTACH_CHILDREN_LIST, childrenEntities);
|
||||
}
|
||||
|
||||
@ -115,6 +115,9 @@ public class ItemUtils {
|
||||
} else {
|
||||
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.ITEM_IS_ITEM, true);
|
||||
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_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_TYPE, item.getData(EntityDataStrings.ITEM_TYPE));
|
||||
Globals.entityManager.registerEntity(rVal);
|
||||
@ -248,4 +252,16 @@ public class ItemUtils {
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -14,6 +14,7 @@ public class Item {
|
||||
List<EquipWhitelist> equipWhitelist;
|
||||
String idleAnim;
|
||||
String iconPath;
|
||||
String equipClass;
|
||||
|
||||
public String getItemId() {
|
||||
return itemId;
|
||||
@ -46,5 +47,9 @@ public class Item {
|
||||
public String getIconPath(){
|
||||
return iconPath;
|
||||
}
|
||||
|
||||
public String getEquipClass(){
|
||||
return equipClass;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -277,6 +277,7 @@ public class Globals {
|
||||
|
||||
//manager for all widgets currently being drawn to screen
|
||||
public static ElementManager elementManager;
|
||||
public static int openInventoriesCount = 0;
|
||||
|
||||
//collision world data
|
||||
public static CommonWorldData commonWorldData;
|
||||
@ -300,7 +301,7 @@ public class Globals {
|
||||
|
||||
//drag item state
|
||||
public static Entity draggedItem = null;
|
||||
public static UnrelationalInventoryState dragSourceInventory = null;
|
||||
public static Object dragSourceInventory = null;
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,12 +1,17 @@
|
||||
package electrosphere.menu;
|
||||
|
||||
import electrosphere.controls.ControlHandler.ControlsState;
|
||||
import electrosphere.engine.LoadingThread;
|
||||
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.RelationalInventoryState;
|
||||
import electrosphere.entity.state.inventory.UnrelationalInventoryState;
|
||||
import electrosphere.entity.types.item.ItemUtils;
|
||||
import electrosphere.game.server.saves.SaveUtils;
|
||||
import electrosphere.main.Globals;
|
||||
import electrosphere.main.Main;
|
||||
import electrosphere.net.NetUtils;
|
||||
import electrosphere.renderer.ui.ClickableElement;
|
||||
import electrosphere.renderer.ui.DrawableElement;
|
||||
@ -14,7 +19,10 @@ import electrosphere.renderer.ui.Element;
|
||||
import electrosphere.renderer.ui.FocusableElement;
|
||||
import electrosphere.renderer.ui.WidgetUtils;
|
||||
import electrosphere.renderer.ui.Window;
|
||||
import electrosphere.renderer.ui.ClickableElement.ClickEventCallback;
|
||||
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.Div;
|
||||
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.events.ClickEvent;
|
||||
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 java.util.List;
|
||||
|
||||
import javax.management.relation.Relation;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author amaterasu
|
||||
@ -379,28 +391,43 @@ public class MenuGenerators {
|
||||
}
|
||||
|
||||
public static Element worldItemDropCaptureWindow(){
|
||||
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();
|
||||
div.setOnDragRelease(new DragEventCallback() {public boolean execute(DragEvent event){
|
||||
if(Globals.draggedItem != null){
|
||||
//remove item from inventory
|
||||
Globals.dragSourceInventory.removeItem(Globals.draggedItem);
|
||||
//drop item
|
||||
InventoryUtils.attemptEjectItem(Globals.playerCharacter,Globals.draggedItem);
|
||||
//clear ui
|
||||
WindowUtils.cleanItemWindow();
|
||||
String sourceWindowId = WindowUtils.getInventoryWindowID(Globals.dragSourceInventory.getId());
|
||||
WindowUtils.replaceWindowContents(sourceWindowId,MenuGenerators.createNaturalInventoryMenu(Globals.dragSourceInventory));
|
||||
//null globals
|
||||
Globals.dragSourceInventory = null;
|
||||
Globals.draggedItem = null;
|
||||
return false;
|
||||
if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){
|
||||
UnrelationalInventoryState inventory = (UnrelationalInventoryState) Globals.dragSourceInventory;
|
||||
//drop item
|
||||
InventoryUtils.attemptEjectItem(Globals.playerCharacter,Globals.draggedItem);
|
||||
//clear ui
|
||||
WindowUtils.cleanItemDraggingWindow();
|
||||
String sourceWindowId = WindowUtils.getInventoryWindowID(inventory.getId());
|
||||
WindowUtils.replaceWindow(sourceWindowId,MenuGenerators.createNaturalInventoryMenu(inventory));
|
||||
//null globals
|
||||
Globals.dragSourceInventory = null;
|
||||
Globals.draggedItem = null;
|
||||
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;
|
||||
}});
|
||||
rVal.setPositionX(0);
|
||||
rVal.setPositionY(0);
|
||||
rVal.setWidth(Globals.WINDOW_WIDTH);
|
||||
rVal.setHeight(Globals.WINDOW_HEIGHT);
|
||||
div.setPositionX(0);
|
||||
div.setPositionY(0);
|
||||
div.setWidth(Globals.WINDOW_WIDTH);
|
||||
div.setHeight(Globals.WINDOW_HEIGHT);
|
||||
rVal.addChild(div);
|
||||
return rVal;
|
||||
}
|
||||
|
||||
@ -409,7 +436,14 @@ public class MenuGenerators {
|
||||
int width = 500;
|
||||
int height = 500;
|
||||
// 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
|
||||
ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture);
|
||||
@ -419,65 +453,101 @@ public class MenuGenerators {
|
||||
rVal.addChild(imagePanel);
|
||||
|
||||
//label 1 (back)
|
||||
Button backButton = new Button();
|
||||
Label backLabel = new Label(100,50,1.0f);
|
||||
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)
|
||||
Button quitButton = new Button();
|
||||
Label quitLabel = new Label(100,150,1.0f);
|
||||
quitLabel.setText("Quit");
|
||||
rVal.addChild(quitLabel);
|
||||
quitLabel.setText("QUIT");
|
||||
quitButton.addChild(quitLabel);
|
||||
rVal.addChild(quitButton);
|
||||
quitButton.setOnClick(new ClickableElement.ClickEventCallback(){public boolean execute(ClickEvent event){
|
||||
Main.running = false;
|
||||
return false;
|
||||
}});
|
||||
|
||||
return rVal;
|
||||
}
|
||||
|
||||
public static Element createNaturalInventoryMenu(UnrelationalInventoryState inventory){
|
||||
// int screenTop = Globals.WINDOW_HEIGHT - 150;
|
||||
public static Window createNaturalInventoryMenu(UnrelationalInventoryState inventory){
|
||||
int width = 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.dragSourceInventory != inventory){
|
||||
UnrelationalInventoryState sourceInventory = Globals.dragSourceInventory;
|
||||
//transfer item
|
||||
Globals.dragSourceInventory.removeItem(Globals.draggedItem);
|
||||
inventory.addItem(Globals.draggedItem);
|
||||
//null out global state
|
||||
Globals.dragSourceInventory = null;
|
||||
Globals.draggedItem = null;
|
||||
//clear item container ui
|
||||
WindowUtils.cleanItemWindow();
|
||||
//rerender both inventories
|
||||
//re-render inventory
|
||||
WindowUtils.replaceWindowContents(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory));
|
||||
//re-render inventory
|
||||
WindowUtils.replaceWindowContents(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory));
|
||||
if(Globals.dragSourceInventory instanceof UnrelationalInventoryState){
|
||||
UnrelationalInventoryState sourceInventory = (UnrelationalInventoryState)Globals.dragSourceInventory;
|
||||
//transfer item
|
||||
sourceInventory.removeItem(Globals.draggedItem);
|
||||
inventory.addItem(Globals.draggedItem);
|
||||
//null out global state
|
||||
Globals.dragSourceInventory = null;
|
||||
Globals.draggedItem = null;
|
||||
//clear item container ui
|
||||
WindowUtils.cleanItemDraggingWindow();
|
||||
//rerender both inventories
|
||||
//re-render inventory
|
||||
WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory));
|
||||
//re-render inventory
|
||||
WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(sourceInventory.getId()), MenuGenerators.createNaturalInventoryMenu(sourceInventory));
|
||||
}
|
||||
} else {
|
||||
//clear ui
|
||||
WindowUtils.cleanItemWindow();
|
||||
WindowUtils.cleanItemDraggingWindow();
|
||||
//re-render inventory
|
||||
WindowUtils.replaceWindowContents(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory));
|
||||
WindowUtils.replaceWindow(WindowUtils.getInventoryWindowID(inventory.getId()), MenuGenerators.createNaturalInventoryMenu(inventory));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}});
|
||||
|
||||
div.setOnClick(new ClickEventCallback() {public boolean execute(ClickEvent event){
|
||||
WindowUtils.focusWindow(WindowStrings.WINDOW_MENU_INVENTORY);
|
||||
return false;
|
||||
}});
|
||||
|
||||
//black texture background
|
||||
ImagePanel imagePanel = new ImagePanel(0,0,width,height,Globals.blackTexture);
|
||||
// imagePanel.setWidth(width);
|
||||
// imagePanel.setHeight(height);
|
||||
// imagePanel.setTexture(Globals.assetManager.fetchTexture(Globals.blackTexture));
|
||||
rVal.addChild(imagePanel);
|
||||
div.addChild(imagePanel);
|
||||
|
||||
//label 1 (inventory)
|
||||
Label inventoryLabel = new Label(10,10,1.0f);
|
||||
inventoryLabel.setText("INVENTORY");
|
||||
rVal.addChild(inventoryLabel);
|
||||
div.addChild(inventoryLabel);
|
||||
|
||||
int columns = 8;
|
||||
int columnWidth = 60;
|
||||
@ -506,7 +576,7 @@ public class MenuGenerators {
|
||||
// System.out.println("Drag start");
|
||||
Globals.dragSourceInventory = inventory;
|
||||
Globals.draggedItem = inventory.getItems().get(itemId);
|
||||
rVal.removeChild(panel);
|
||||
div.removeChild(panel);
|
||||
WindowUtils.pushItemIconToItemWindow(panel);
|
||||
return false;
|
||||
}});
|
||||
@ -516,28 +586,225 @@ public class MenuGenerators {
|
||||
panel.setPositionY(event.getCurrentY() - panelHeight / 2);
|
||||
return false;
|
||||
}});
|
||||
// panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){
|
||||
// // panel.setPositionX(posX);
|
||||
// // panel.setPositionY(posY);
|
||||
// //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;
|
||||
// }});
|
||||
} else {
|
||||
panel.setOnDragRelease(new DragEventCallback(){public boolean execute(DragEvent event){
|
||||
if(Globals.dragSourceInventory instanceof RelationalInventoryState){
|
||||
RelationalInventoryState sourceInventory = (RelationalInventoryState) Globals.dragSourceInventory;
|
||||
Entity item = Globals.draggedItem;
|
||||
//destroy real world item
|
||||
if(ItemUtils.getRealWorldEntity(item) != null){
|
||||
System.out.println("Destroy real world item");
|
||||
ItemUtils.destroyInWorldItem(ItemUtils.getRealWorldEntity(item));
|
||||
}
|
||||
//eject from equip state
|
||||
InventoryUtils.attemptDestroyItem(Globals.playerCharacter,item);
|
||||
//add to unrelational
|
||||
sourceInventory.tryRemoveItem(item);
|
||||
inventory.addItem(item);
|
||||
//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.setHeight(height);
|
||||
// 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;
|
||||
|
||||
@ -9,5 +9,6 @@ public class WindowStrings {
|
||||
public static final String WINDOW_LOADING = "windowLoading";
|
||||
public static final String WINDDOW_ITEM_DROP = "itemDrop";
|
||||
public static final String WINDOW_ITEM_DRAG_CONTAINER = "itemDragContainer";
|
||||
public static final String WINDOW_CHARACTER = "windowCharacter";
|
||||
|
||||
}
|
||||
|
||||
@ -16,7 +16,7 @@ public class WindowUtils {
|
||||
//todo: destroy elements as well
|
||||
mainMenu.getChildren().clear();
|
||||
mainMenu.addChild(newMenu);
|
||||
Globals.elementManager.focusFirstElement(mainMenu);
|
||||
Globals.elementManager.focusFirstElement();
|
||||
}
|
||||
}
|
||||
|
||||
@ -42,7 +42,7 @@ public class WindowUtils {
|
||||
//todo: destroy elements as well
|
||||
mainMenu.getChildren().clear();
|
||||
mainMenu.addChild(content);
|
||||
Globals.elementManager.focusFirstElement(mainMenu);
|
||||
Globals.elementManager.focusFirstElement();
|
||||
}
|
||||
}
|
||||
|
||||
@ -53,12 +53,18 @@ public class WindowUtils {
|
||||
Globals.elementManager.pushWindowToFront(targetWindow);
|
||||
}
|
||||
|
||||
public static void cleanItemWindow(){
|
||||
public static void cleanItemDraggingWindow(){
|
||||
Window targetWindow = (Window) Globals.elementManager.getWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER);
|
||||
targetWindow.getChildren().clear();
|
||||
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(){
|
||||
Window itemDropWindow = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT);
|
||||
Globals.elementManager.registerWindow(WindowStrings.WINDDOW_ITEM_DROP, itemDropWindow);
|
||||
WindowUtils.replaceWindowContents(WindowStrings.WINDDOW_ITEM_DROP, MenuGenerators.worldItemDropCaptureWindow());
|
||||
Globals.elementManager.registerWindow(WindowStrings.WINDDOW_ITEM_DROP, MenuGenerators.worldItemDropCaptureWindow());
|
||||
}
|
||||
|
||||
static void initItemDragContainerWindow(){
|
||||
@ -99,4 +103,10 @@ public class WindowUtils {
|
||||
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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -14,7 +14,9 @@ import electrosphere.renderer.ui.events.DragEvent;
|
||||
import electrosphere.renderer.ui.events.Event;
|
||||
import electrosphere.renderer.ui.events.FocusEvent;
|
||||
import electrosphere.renderer.ui.events.MouseEvent;
|
||||
import electrosphere.renderer.ui.events.NavigationEvent;
|
||||
import electrosphere.renderer.ui.events.DragEvent.DragEventType;
|
||||
import electrosphere.renderer.ui.events.NavigationEvent.NavigationEventType;
|
||||
|
||||
/**
|
||||
*
|
||||
@ -34,7 +36,7 @@ public class ElementManager {
|
||||
elementList.add(w);
|
||||
}
|
||||
if(elementList.size() == 1){
|
||||
focusFirstElement(w);
|
||||
focusFirstElement();
|
||||
}
|
||||
}
|
||||
|
||||
@ -51,6 +53,9 @@ public class ElementManager {
|
||||
if(elementList.contains(w)){
|
||||
elementList.remove(w);
|
||||
}
|
||||
if(elementList.size() > 0){
|
||||
focusFirstElement();
|
||||
}
|
||||
}
|
||||
|
||||
public void pushWindowToFront(Window window){
|
||||
@ -75,8 +80,8 @@ public class ElementManager {
|
||||
return currentFocusedElement;
|
||||
}
|
||||
|
||||
public void focusFirstElement(Element topLevel){
|
||||
List<FocusableElement> focusables = getFocusableList(topLevel,new LinkedList<FocusableElement>());
|
||||
public void focusFirstElement(){
|
||||
List<FocusableElement> focusables = getFocusableList(elementList.get(elementList.size() - 1),new LinkedList<FocusableElement>());
|
||||
if(focusables.size() > 0){
|
||||
if(currentFocusedElement != null){
|
||||
currentFocusedElement.handleEvent(new FocusEvent(false));
|
||||
@ -86,8 +91,8 @@ public class ElementManager {
|
||||
}
|
||||
}
|
||||
|
||||
public void focusNextElement(Element topLevel){
|
||||
List<FocusableElement> focusables = getFocusableList(topLevel,new LinkedList<FocusableElement>());
|
||||
public void focusNextElement(){
|
||||
List<FocusableElement> focusables = getFocusableList(elementList.get(elementList.size() - 1),new LinkedList<FocusableElement>());
|
||||
if(focusables.contains(currentFocusedElement)){
|
||||
int index = focusables.indexOf(currentFocusedElement);
|
||||
if(index + 1 >= focusables.size()){
|
||||
@ -103,8 +108,8 @@ public class ElementManager {
|
||||
}
|
||||
}
|
||||
|
||||
public void focusPreviousElement(Element topLevel){
|
||||
List<FocusableElement> focusables = getFocusableList(topLevel,new LinkedList<FocusableElement>());
|
||||
public void focusPreviousElement(){
|
||||
List<FocusableElement> focusables = getFocusableList(elementList.get(elementList.size() - 1),new LinkedList<FocusableElement>());
|
||||
if(focusables.contains(currentFocusedElement)){
|
||||
int index = focusables.indexOf(currentFocusedElement);
|
||||
if(index - 1 < 0){
|
||||
@ -207,5 +212,10 @@ public class ElementManager {
|
||||
}
|
||||
fireEvent(event,event.getCurrentX(),event.getCurrentY());
|
||||
}
|
||||
|
||||
public void navigateBackwards(){
|
||||
NavigationEvent event = new NavigationEvent(NavigationEventType.BACKWARD);
|
||||
fireEvent(event,currentFocusedElement.getPositionX(),currentFocusedElement.getPositionY());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -8,7 +8,7 @@ public interface NavigableElement extends Element {
|
||||
|
||||
public interface NavigationEventCallback {
|
||||
|
||||
public void execute(NavigationEvent event);
|
||||
public boolean execute(NavigationEvent event);
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -6,6 +6,7 @@ import electrosphere.renderer.Model;
|
||||
import electrosphere.renderer.framebuffer.Framebuffer;
|
||||
import electrosphere.renderer.framebuffer.FramebufferUtils;
|
||||
import electrosphere.renderer.ui.events.Event;
|
||||
import electrosphere.renderer.ui.events.NavigationEvent;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
@ -17,7 +18,7 @@ import static org.lwjgl.opengl.GL30.*;
|
||||
*
|
||||
* @author amaterasu
|
||||
*/
|
||||
public class Window implements DrawableElement, ContainerElement {
|
||||
public class Window implements DrawableElement, ContainerElement, NavigableElement {
|
||||
List<Element> childList = new LinkedList<Element>();
|
||||
Framebuffer widgetBuffer;
|
||||
Material customMat = new Material();
|
||||
@ -26,6 +27,8 @@ public class Window implements DrawableElement, ContainerElement {
|
||||
Vector3f boxDimensions = new Vector3f();
|
||||
Vector3f texPosition = new Vector3f(0,0,0);
|
||||
Vector3f texScale = new Vector3f(1,1,0);
|
||||
|
||||
NavigationEventCallback navCallback;
|
||||
|
||||
public Window(int positionX, int positionY, int width, int height){
|
||||
//TODO: figure out why this has to be 1920x1080
|
||||
@ -197,7 +200,18 @@ public class Window implements DrawableElement, ContainerElement {
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -9,13 +9,15 @@ import electrosphere.renderer.ui.DraggableElement;
|
||||
import electrosphere.renderer.ui.DrawableElement;
|
||||
import electrosphere.renderer.ui.Element;
|
||||
import electrosphere.renderer.ui.FocusableElement;
|
||||
import electrosphere.renderer.ui.NavigableElement;
|
||||
import electrosphere.renderer.ui.events.ClickEvent;
|
||||
import electrosphere.renderer.ui.events.DragEvent;
|
||||
import electrosphere.renderer.ui.events.Event;
|
||||
import electrosphere.renderer.ui.events.FocusEvent;
|
||||
import electrosphere.renderer.ui.events.NavigationEvent;
|
||||
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;
|
||||
FocusEventCallback onFocus;
|
||||
@ -23,6 +25,7 @@ public class Div implements ClickableElement,ContainerElement,DraggableElement,F
|
||||
DragEventCallback onDragStart;
|
||||
DragEventCallback onDrag;
|
||||
DragEventCallback onDragRelease;
|
||||
NavigationEventCallback onNavigate;
|
||||
boolean focused = false;
|
||||
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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,5 +1,19 @@
|
||||
package electrosphere.renderer.ui.events;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user