Fix items networking
All checks were successful
studiorailgun/Renderer/pipeline/head This commit looks good
@ -116,7 +116,7 @@
|
||||
"variants" : [
|
||||
{
|
||||
"id" : "hairshort1",
|
||||
"model" : "Models/hairshort1meshed.fbx",
|
||||
"model" : "Models/creatures/person2/hair/hairshort1meshed.fbx",
|
||||
"meshes" : [
|
||||
"Hair"
|
||||
]
|
||||
|
||||
@ -116,7 +116,7 @@
|
||||
"variants" : [
|
||||
{
|
||||
"id" : "hairshort1",
|
||||
"model" : "Models/hairshort1meshed.fbx",
|
||||
"model" : "Models/creatures/person2/hair/hairshort1meshed.fbx",
|
||||
"meshes" : [
|
||||
"Hair"
|
||||
]
|
||||
@ -334,7 +334,7 @@
|
||||
"maxHealth" : 100,
|
||||
"onDamageIFrames" : 30
|
||||
},
|
||||
"modelPath" : "Models/person2_1.glb"
|
||||
"modelPath" : "Models/creatures/person2/person2_1.glb"
|
||||
}
|
||||
],
|
||||
"files" : []
|
||||
|
||||
@ -29,7 +29,7 @@
|
||||
"growthModel": {
|
||||
"growthRate" : 0.001
|
||||
},
|
||||
"modelPath" : "Models/grass2.fbx"
|
||||
"modelPath" : "Models/foliage/grass2.fbx"
|
||||
},
|
||||
{
|
||||
"name" : "oak",
|
||||
|
||||
@ -84,7 +84,7 @@
|
||||
|
||||
{
|
||||
"itemId" : "shorts1",
|
||||
"modelPath": "Models/itemEntityShorts.fbx",
|
||||
"modelPath": "Models/items/itemEntityShorts.fbx",
|
||||
"tokens" : [
|
||||
"GRAVITY",
|
||||
"TARGETABLE"
|
||||
@ -107,7 +107,7 @@
|
||||
"equipWhitelist" : [
|
||||
{
|
||||
"creatureId" : "human",
|
||||
"model" : "Models/shorts1.fbx",
|
||||
"model" : "Models/creatures/person2/clothing/shorts1.fbx",
|
||||
"meshList" : [
|
||||
"ClothingItem"
|
||||
],
|
||||
@ -155,7 +155,7 @@
|
||||
|
||||
{
|
||||
"itemId" : "boots1",
|
||||
"modelPath": "Models/itemEntityShorts.fbx",
|
||||
"modelPath": "Models/boots1.glb",
|
||||
"tokens" : [
|
||||
"GRAVITY",
|
||||
"ARMOR",
|
||||
@ -179,16 +179,12 @@
|
||||
"equipWhitelist" : [
|
||||
{
|
||||
"creatureId" : "human",
|
||||
"model" : "Models/boots1.fbx",
|
||||
"model" : "Models/boots1.glb",
|
||||
"meshList" : [
|
||||
"BootLeft",
|
||||
"BootRight"
|
||||
],
|
||||
"meshMaskList" : [
|
||||
"FootLeft",
|
||||
"FootRight",
|
||||
"LowerLegLeft",
|
||||
"LowerLegRight"
|
||||
]
|
||||
}
|
||||
]
|
||||
|
||||
BIN
assets/Models/creatures/person2/clothing/belt1.glb
Normal file
BIN
assets/Models/creatures/person2/clothing/boots1.glb
Normal file
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 1.7 MiB |
@ -67,7 +67,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path" : "Models/person2_1.glb",
|
||||
"path" : "Models/creatures/person2/person2_1.glb",
|
||||
"globalTransform": {
|
||||
"rotation" : [0,0,0,1],
|
||||
"offset" : [0.0, 0.0, 0.0],
|
||||
@ -77,7 +77,7 @@
|
||||
]
|
||||
},
|
||||
{
|
||||
"path" : "Models/grass2.fbx",
|
||||
"path" : "Models/foliage/grass2.fbx",
|
||||
"globalTransform": {
|
||||
"rotation" : [0.0, 0.0, 0.0, 1.0],
|
||||
"offset" : [0.0, 0.0, 0.0],
|
||||
|
||||
@ -30,7 +30,7 @@
|
||||
"/Textures/transparent_blue.png"
|
||||
]
|
||||
},
|
||||
"Models/unitsphere_1.fbx": {
|
||||
"Models/basic/geometry/unitsphere_1.fbx": {
|
||||
"Sphere": [
|
||||
"/Textures/transparent_red.png",
|
||||
"/Textures/transparent_red.png"
|
||||
@ -324,19 +324,19 @@
|
||||
"/Textures/arrow1.png"
|
||||
]
|
||||
},
|
||||
"Models/lockoncrosshair1.fbx" : {
|
||||
"Models/engine/lockoncrosshair1.fbx" : {
|
||||
"Cube" : [
|
||||
"/Textures/w1.png",
|
||||
"/Textures/w1.png"
|
||||
]
|
||||
},
|
||||
"Models/shorts1.fbx" : {
|
||||
"Models/creatures/person2/clothing/shorts1.fbx" : {
|
||||
"ClothingItem" : [
|
||||
"/Textures/shorts1.png",
|
||||
"/Textures/shorts1.png"
|
||||
]
|
||||
},
|
||||
"Models/hairshort1meshed.fbx" : {
|
||||
"Models/creatures/person2/hair/hairshort1meshed.fbx" : {
|
||||
"Hair" : [
|
||||
"/Textures/b1.png",
|
||||
"/Textures/b1.png"
|
||||
@ -358,13 +358,13 @@
|
||||
"/Textures/shirt1.png"
|
||||
]
|
||||
},
|
||||
"Models/cloudRing.fbx" : {
|
||||
"Models/environment/cloudRing.fbx" : {
|
||||
"Sphere" : [
|
||||
"/Textures/cloudRing.png",
|
||||
"/Textures/cloudRing.png"
|
||||
]
|
||||
},
|
||||
"Models/skyboxSphere.fbx" : {
|
||||
"Models/environment/skyboxSphere.fbx" : {
|
||||
"Sphere" : [
|
||||
"/Textures/starrySky.png",
|
||||
"/Textures/starrySky.png"
|
||||
|
||||
|
Before Width: | Height: | Size: 214 KiB |
|
Before Width: | Height: | Size: 440 KiB |
|
Before Width: | Height: | Size: 692 KiB |
|
Before Width: | Height: | Size: 562 KiB |
|
Before Width: | Height: | Size: 3.2 MiB |
|
Before Width: | Height: | Size: 531 KiB |
|
Before Width: | Height: | Size: 178 KiB |
|
Before Width: | Height: | Size: 380 KiB |
|
Before Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 108 KiB |
32
docs/src/highlevel-design/equipstate/equipstate.md
Normal file
@ -0,0 +1,32 @@
|
||||
@page equipstate Equip State
|
||||
|
||||
|
||||
# Relevant Classes
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# Data Explanation
|
||||
## Item-side definitions
|
||||
|
||||
Items must define a property `equipClass`. This determines what type of item it is.
|
||||
The equip points on the creature then whitelist equipClass variants.
|
||||
|
||||
IE, I would define a sword as a "weapon", then assign the item type "weapon" to a given equippoint (ie the person's hand).
|
||||
|
||||
Furthermore, a creature can define a `equipWhitelist` array. This allows you to define per-item what creatures can equip it.
|
||||
The goal with this is to limit item equipping when we haven't modeled out a variant for a given creature.
|
||||
|
||||
IE, if you make a cool helmet for a human and don't bother to make one for dwarves, you could equipWhitelist it to just humans.
|
||||
|
||||
## Creature-side definitions
|
||||
|
||||
Creatures define an array `equipPoints`. This contains a list of points that the creature can equip items at.
|
||||
A given equipPoint controls the bone the item is attached to, offsets/rotations from that bone, and the types of equipment that can be attached at that point.
|
||||
|
||||
|
||||
## Equip Classes
|
||||
|
||||
They're basically category strings. There isn't any data intrinsic to an equipClass yet.
|
||||
Potentially these will eventually be broken out into a dedicated data object to support things like tooltips.
|
||||
@ -12,6 +12,7 @@ Discussion of, at a high game-design level, how everything should work and conne
|
||||
- @subpage macrosimtimeline
|
||||
- @subpage narrativemanager
|
||||
- @subpage itemsindex
|
||||
- @subpage equipstate
|
||||
- @subpage puzzleindex
|
||||
- @subpage fluidindex
|
||||
- @subpage locomotion
|
||||
|
||||
@ -220,8 +220,18 @@ UI Work
|
||||
- Level editor ability to destroy an entity on server, have it also destroy on client, AND not persist on save
|
||||
- Environment controls (not persisting in save yet)
|
||||
|
||||
Fix Movement Bug where player keeps running after releasing control
|
||||
|
||||
# TODO
|
||||
|
||||
UI Fixes
|
||||
- Refactor ui toolkit elements to separate absolute and relative position
|
||||
- Fix inventory menus
|
||||
|
||||
Touch Up working with items
|
||||
- Make sure the models are appropriately scaled
|
||||
- Remove all logic from before client-server separation
|
||||
|
||||
More Debug menus
|
||||
- Screen that shows the overall status of client scene
|
||||
- Number of entities
|
||||
|
||||
@ -25,7 +25,7 @@ public class Crosshair {
|
||||
|
||||
public static void initCrossHairEntity(){
|
||||
crossHairEntity = EntityCreationUtils.createClientSpatialEntity();
|
||||
EntityCreationUtils.makeEntityDrawable(crossHairEntity, "/Models/lockoncrosshair1.fbx");
|
||||
EntityCreationUtils.makeEntityDrawable(crossHairEntity, "/Models/engine/lockoncrosshair1.fbx");
|
||||
EntityUtils.setVisible(crossHairEntity, false);
|
||||
}
|
||||
|
||||
|
||||
@ -81,7 +81,7 @@ import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.btree.BehaviorTree;
|
||||
import electrosphere.entity.state.attack.AttackTree;
|
||||
import electrosphere.entity.state.attack.ShooterTree;
|
||||
import electrosphere.entity.state.equip.EquipState;
|
||||
import electrosphere.entity.state.equip.ClientEquipState;
|
||||
import electrosphere.entity.state.inventory.InventoryUtils;
|
||||
import electrosphere.entity.state.inventory.UnrelationalInventoryState;
|
||||
import electrosphere.entity.state.ironsight.IronSightTree;
|
||||
@ -821,9 +821,9 @@ public class ControlHandler {
|
||||
mainGameControlList.add(controls.get(INPUT_CODE_INTERACT));
|
||||
controls.get(INPUT_CODE_INTERACT).setOnPress(new ControlMethod(){public void execute(){
|
||||
if(Globals.playerEntity != null){
|
||||
if(EquipState.hasEquipState(Globals.playerEntity) && Crosshair.hasTarget()){
|
||||
if(ClientEquipState.hasEquipState(Globals.playerEntity) && Crosshair.hasTarget()){
|
||||
if(InventoryUtils.hasNaturalInventory(Globals.playerEntity)){
|
||||
InventoryUtils.attemptStoreItem(Globals.playerEntity, Crosshair.getTarget());
|
||||
InventoryUtils.clientAttemptStoreItem(Globals.playerEntity, Crosshair.getTarget());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -835,11 +835,11 @@ public class ControlHandler {
|
||||
mainGameControlList.add(controls.get(INPUT_CODE_DROP));
|
||||
controls.get(INPUT_CODE_DROP).setOnPress(new ControlMethod(){public void execute(){
|
||||
if(Globals.playerEntity != null){
|
||||
if(EquipState.hasEquipState(Globals.playerEntity)){
|
||||
if(ClientEquipState.hasEquipState(Globals.playerEntity)){
|
||||
UnrelationalInventoryState inventory = InventoryUtils.getNaturalInventory(Globals.playerEntity);
|
||||
if(inventory.getItems().size() > 0){
|
||||
Entity itemToDrop = inventory.getItems().get(0);
|
||||
InventoryUtils.attemptEjectItem(Globals.playerEntity,itemToDrop);
|
||||
InventoryUtils.clientAttemptEjectItem(Globals.playerEntity,itemToDrop);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1081,15 +1081,15 @@ public class ControlHandler {
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT).setOnPress(new ControlMethod(){public void execute(){
|
||||
Globals.elementManager.fireEvent(
|
||||
new MenuEvent(MenuEventType.INCREMENT),
|
||||
Globals.elementManager.getFocusedElement().getPositionX(),
|
||||
Globals.elementManager.getFocusedElement().getPositionY()
|
||||
Globals.elementManager.getFocusedElement().getAbsoluteX(),
|
||||
Globals.elementManager.getFocusedElement().getAbsoluteY()
|
||||
);
|
||||
}});
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT).setOnRepeat(new ControlMethod(){public void execute(){
|
||||
Globals.elementManager.fireEvent(
|
||||
new MenuEvent(MenuEventType.INCREMENT),
|
||||
Globals.elementManager.getFocusedElement().getPositionX(),
|
||||
Globals.elementManager.getFocusedElement().getPositionY()
|
||||
Globals.elementManager.getFocusedElement().getAbsoluteX(),
|
||||
Globals.elementManager.getFocusedElement().getAbsoluteY()
|
||||
);
|
||||
}});
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_INCREMENT).setRepeatTimeout(0.5f * Main.targetFrameRate);
|
||||
@ -1141,15 +1141,15 @@ public class ControlHandler {
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT).setOnPress(new ControlMethod(){public void execute(){
|
||||
Globals.elementManager.fireEvent(
|
||||
new MenuEvent(MenuEventType.DECREMENT),
|
||||
Globals.elementManager.getFocusedElement().getPositionX(),
|
||||
Globals.elementManager.getFocusedElement().getPositionY()
|
||||
Globals.elementManager.getFocusedElement().getAbsoluteX(),
|
||||
Globals.elementManager.getFocusedElement().getAbsoluteY()
|
||||
);
|
||||
}});
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT).setOnRepeat(new ControlMethod(){public void execute(){
|
||||
Globals.elementManager.fireEvent(
|
||||
new MenuEvent(MenuEventType.DECREMENT),
|
||||
Globals.elementManager.getFocusedElement().getPositionX(),
|
||||
Globals.elementManager.getFocusedElement().getPositionY()
|
||||
Globals.elementManager.getFocusedElement().getAbsoluteX(),
|
||||
Globals.elementManager.getFocusedElement().getAbsoluteY()
|
||||
);
|
||||
}});
|
||||
controls.get(DATA_STRING_INPUT_CODE_MENU_DECREMENT).setRepeatTimeout(0.5f * Main.targetFrameRate);
|
||||
|
||||
@ -513,13 +513,13 @@ public class Globals {
|
||||
//init fluid shader program
|
||||
FluidChunkModelGeneration.fluidChunkShaderProgram = ShaderProgram.loadSpecificShader("/Shaders/fluid2/fluid2.vs", "/Shaders/fluid2/fluid2.fs");
|
||||
//init models
|
||||
assetManager.addModelPathToQueue("Models/unitsphere.fbx");
|
||||
assetManager.addModelPathToQueue("Models/unitsphere_1.fbx");
|
||||
assetManager.addModelPathToQueue("Models/unitsphere_grey.fbx");
|
||||
assetManager.addModelPathToQueue("Models/SmallCube.fbx");
|
||||
assetManager.addModelPathToQueue("Models/unitcylinder.fbx");
|
||||
assetManager.addModelPathToQueue("Models/unitplane.fbx");
|
||||
assetManager.addModelPathToQueue("Models/unitcube.fbx");
|
||||
assetManager.addModelPathToQueue("Models/basic/geometry/unitsphere.fbx");
|
||||
assetManager.addModelPathToQueue("Models/basic/geometry/unitsphere_1.fbx");
|
||||
assetManager.addModelPathToQueue("Models/basic/geometry/unitsphere_grey.fbx");
|
||||
assetManager.addModelPathToQueue("Models/basic/geometry/SmallCube.fbx");
|
||||
assetManager.addModelPathToQueue("Models/basic/geometry/unitcylinder.fbx");
|
||||
assetManager.addModelPathToQueue("Models/basic/geometry/unitplane.fbx");
|
||||
assetManager.addModelPathToQueue("Models/basic/geometry/unitcube.fbx");
|
||||
imagePlaneModelID = assetManager.registerModel(RenderUtils.createPlaneModel("Shaders/plane/plane.vs", "Shaders/plane/plane.fs"));
|
||||
assetManager.addShaderToQueue("Shaders/plane/plane.vs", null, "Shaders/plane/plane.fs");
|
||||
solidPlaneModelID = assetManager.registerModel(RenderUtils.createInWindowPanel("Shaders/ui/plainBox/plainBox.vs", "Shaders/ui/plainBox/plainBox.fs"));
|
||||
|
||||
@ -209,23 +209,23 @@ public class ClientLoading {
|
||||
|
||||
//starry sky true skybox
|
||||
Entity skybox = EntityCreationUtils.createClientSpatialEntity();
|
||||
EntityCreationUtils.makeEntityDrawable(skybox, "Models/skyboxSphere.fbx");
|
||||
EntityCreationUtils.makeEntityDrawable(skybox, "Models/environment/skyboxSphere.fbx");
|
||||
DrawableUtils.disableCulling(skybox);
|
||||
EntityUtils.getRotation(skybox).rotateX((float)(-Math.PI/2.0f));
|
||||
EntityUtils.getScale(skybox).mul(200000.0f);
|
||||
Globals.assetManager.queueOverrideMeshShader("Models/skyboxSphere.fbx", "Sphere", "Shaders/skysphere/skysphere.vs", "Shaders/skysphere/skysphere.fs");
|
||||
Globals.assetManager.queueOverrideMeshShader("Models/environment/skyboxSphere.fbx", "Sphere", "Shaders/skysphere/skysphere.vs", "Shaders/skysphere/skysphere.fs");
|
||||
|
||||
//cloud ring pseudo skybox
|
||||
Entity cloudRing = EntityCreationUtils.createClientSpatialEntity();
|
||||
EntityCreationUtils.makeEntityDrawable(cloudRing, "Models/cloudRing.fbx");
|
||||
EntityCreationUtils.makeEntityDrawable(cloudRing, "Models/environment/cloudRing.fbx");
|
||||
DrawableUtils.disableCulling(cloudRing);
|
||||
EntityUtils.getRotation(cloudRing).rotateX((float)(-Math.PI/2.0f));
|
||||
EntityUtils.getScale(cloudRing).mul(100000.0f);
|
||||
Globals.clientScene.registerBehaviorTree(new ApplyRotationTree(cloudRing,new Quaterniond().rotationZ(0.0001)));
|
||||
Globals.assetManager.queueOverrideMeshShader("Models/cloudRing.fbx", "Sphere", "Shaders/skysphere/skysphere.vs", "Shaders/skysphere/skysphere.fs");
|
||||
Globals.assetManager.queueOverrideMeshShader("Models/environment/cloudRing.fbx", "Sphere", "Shaders/skysphere/skysphere.vs", "Shaders/skysphere/skysphere.fs");
|
||||
|
||||
Entity cursorTracker = EntityCreationUtils.createClientSpatialEntity();
|
||||
EntityCreationUtils.makeEntityDrawable(cursorTracker, "Models/unitsphere_1.fbx");
|
||||
EntityCreationUtils.makeEntityDrawable(cursorTracker, "Models/basic/geometry/unitsphere_1.fbx");
|
||||
EntityUtils.getScale(cursorTracker).set(30f);
|
||||
Globals.clientSceneWrapper.getScene().registerBehaviorTree(new BehaviorTree() {
|
||||
@Override
|
||||
|
||||
@ -54,9 +54,11 @@ public class Scene {
|
||||
* @param e The entity to register
|
||||
*/
|
||||
public void registerEntity(Entity e){
|
||||
entityIdMap.put(e.getId(), e);
|
||||
if(!entityIdMap.containsKey(e.getId())){
|
||||
entityList.add(e);
|
||||
}
|
||||
entityIdMap.put(e.getId(), e);
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers an entity to a given tag
|
||||
|
||||
@ -9,7 +9,7 @@ import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.entity.ServerEntityUtils;
|
||||
import electrosphere.entity.btree.BehaviorTree;
|
||||
import electrosphere.entity.state.collidable.Impulse;
|
||||
import electrosphere.entity.state.equip.EquipState;
|
||||
import electrosphere.entity.state.equip.ClientEquipState;
|
||||
import electrosphere.entity.state.movement.groundmove.GroundMovementTree;
|
||||
import electrosphere.entity.state.rotator.RotatorTree;
|
||||
import electrosphere.entity.types.attach.AttachUtils;
|
||||
@ -299,7 +299,7 @@ public class AttackTree implements BehaviorTree {
|
||||
Vector3d spawnPosition = new Vector3d(0,0,0);
|
||||
Quaterniond arrowRotation = new Quaterniond();
|
||||
String targetBone = null;
|
||||
EquipState equipState = EquipState.getEquipState(parent);
|
||||
ClientEquipState equipState = ClientEquipState.getEquipState(parent);
|
||||
EquipPoint weaponPoint = null;
|
||||
if((weaponPoint = equipState.getEquipPoint(attackingPoint)) != null){
|
||||
targetBone = weaponPoint.getBone();
|
||||
@ -395,8 +395,8 @@ public class AttackTree implements BehaviorTree {
|
||||
|
||||
String getAttackType(){
|
||||
String rVal = null;
|
||||
if(EquipState.hasEquipState(parent)){
|
||||
EquipState equipState = EquipState.getEquipState(parent);
|
||||
if(ClientEquipState.hasEquipState(parent)){
|
||||
ClientEquipState equipState = ClientEquipState.getEquipState(parent);
|
||||
for(String point : equipState.equippedPoints()){
|
||||
Entity item = equipState.getEquippedItemAtPoint(point);
|
||||
if(ItemUtils.isWeapon(item)){
|
||||
@ -430,8 +430,8 @@ public class AttackTree implements BehaviorTree {
|
||||
rVal = true;
|
||||
}
|
||||
} else {
|
||||
if(EquipState.hasEquipState(parent)){
|
||||
EquipState equipState = EquipState.getEquipState(parent);
|
||||
if(ClientEquipState.hasEquipState(parent)){
|
||||
ClientEquipState equipState = ClientEquipState.getEquipState(parent);
|
||||
// if(equipState.hasEquipPrimary()){
|
||||
// switch(attackType){
|
||||
// case EntityDataStrings.ATTACK_MOVE_TYPE_MELEE_SWING_ONE_HAND:
|
||||
|
||||
@ -9,7 +9,7 @@ import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.entity.ServerEntityUtils;
|
||||
import electrosphere.entity.btree.BehaviorTree;
|
||||
import electrosphere.entity.state.collidable.Impulse;
|
||||
import electrosphere.entity.state.equip.EquipState;
|
||||
import electrosphere.entity.state.equip.ServerEquipState;
|
||||
import electrosphere.entity.state.movement.groundmove.GroundMovementTree;
|
||||
import electrosphere.entity.state.movement.groundmove.ServerGroundMovementTree;
|
||||
import electrosphere.entity.state.rotator.RotatorTree;
|
||||
@ -300,7 +300,7 @@ public class ServerAttackTree implements BehaviorTree {
|
||||
Vector3d spawnPosition = new Vector3d(0,0,0);
|
||||
Quaterniond arrowRotation = new Quaterniond();
|
||||
String targetBone = null;
|
||||
EquipState equipState = EquipState.getEquipState(parent);
|
||||
ServerEquipState equipState = ServerEquipState.getEquipState(parent);
|
||||
EquipPoint weaponPoint = null;
|
||||
if((weaponPoint = equipState.getEquipPoint(attackingPoint)) != null){
|
||||
targetBone = weaponPoint.getBone();
|
||||
@ -393,8 +393,8 @@ public class ServerAttackTree implements BehaviorTree {
|
||||
|
||||
String getAttackType(){
|
||||
String rVal = null;
|
||||
if(EquipState.hasEquipState(parent)){
|
||||
EquipState equipState = EquipState.getEquipState(parent);
|
||||
if(ServerEquipState.hasEquipState(parent)){
|
||||
ServerEquipState equipState = ServerEquipState.getEquipState(parent);
|
||||
for(String point : equipState.equippedPoints()){
|
||||
Entity item = equipState.getEquippedItemAtPoint(point);
|
||||
if(ItemUtils.isWeapon(item)){
|
||||
@ -428,8 +428,8 @@ public class ServerAttackTree implements BehaviorTree {
|
||||
rVal = true;
|
||||
}
|
||||
} else {
|
||||
if(EquipState.hasEquipState(parent)){
|
||||
EquipState equipState = EquipState.getEquipState(parent);
|
||||
if(ServerEquipState.hasEquipState(parent)){
|
||||
ServerEquipState equipState = ServerEquipState.getEquipState(parent);
|
||||
// if(equipState.hasEquipPrimary()){
|
||||
// switch(attackType){
|
||||
// case EntityDataStrings.ATTACK_MOVE_TYPE_MELEE_SWING_ONE_HAND:
|
||||
|
||||
@ -0,0 +1,262 @@
|
||||
package electrosphere.entity.state.equip;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.ode4j.ode.DBody;
|
||||
|
||||
import electrosphere.engine.Globals;
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityDataStrings;
|
||||
import electrosphere.entity.EntityTags;
|
||||
import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.entity.state.gravity.GravityUtils;
|
||||
import electrosphere.entity.types.attach.AttachUtils;
|
||||
import electrosphere.entity.types.creature.CreatureUtils;
|
||||
import electrosphere.entity.types.item.ItemUtils;
|
||||
import electrosphere.game.data.creature.type.equip.EquipPoint;
|
||||
import electrosphere.game.data.item.type.EquipWhitelist;
|
||||
import electrosphere.net.parser.net.message.InventoryMessage;
|
||||
import electrosphere.net.parser.net.message.NetworkMessage;
|
||||
import electrosphere.net.synchronization.annotation.SynchronizedBehaviorTree;
|
||||
import electrosphere.renderer.actor.Actor;
|
||||
import electrosphere.renderer.actor.ActorMeshMask;
|
||||
|
||||
@SynchronizedBehaviorTree(name = "clientEquipState", isServer = false, correspondingTree="serverEquipState")
|
||||
/**
|
||||
* Client view of items equipped to a given entity
|
||||
*/
|
||||
public class ClientEquipState {
|
||||
|
||||
Entity parent;
|
||||
|
||||
List<EquipPoint> equipPoints = new LinkedList<EquipPoint>();
|
||||
Map<String,Entity> equipMap = new HashMap<String,Entity>();
|
||||
|
||||
public ClientEquipState(Entity parent, List<EquipPoint> equipPoints){
|
||||
this.parent = parent;
|
||||
for(EquipPoint point : equipPoints){
|
||||
this.equipPoints.add(point);
|
||||
}
|
||||
}
|
||||
|
||||
public List<String> equippedPoints(){
|
||||
return new LinkedList<String>(equipMap.keySet());
|
||||
}
|
||||
|
||||
public void commandAttemptEquip(Entity toEquip, EquipPoint point){
|
||||
boolean hasEquipped = hasEquippedAtPoint(point.getEquipPointId());
|
||||
boolean targetIsItem = ItemUtils.isItem(toEquip);
|
||||
boolean targetIsAttached = AttachUtils.isAttached(toEquip);
|
||||
boolean targetHasWhitelist = ItemUtils.hasEquipList(toEquip);
|
||||
String equipItemClass = ItemUtils.getEquipClass(toEquip);
|
||||
List<String> pointEquipClassList = point.getEquipClassWhitelist();
|
||||
boolean itemIsInPointWhitelist = pointEquipClassList.contains(equipItemClass);
|
||||
if(!hasEquipped && targetIsItem && !targetIsAttached && itemIsInPointWhitelist){
|
||||
//send packet to server requesting to equip
|
||||
String pointName = point.getEquipPointId();
|
||||
int serverSideID = Globals.clientSceneWrapper.mapClientToServerId(toEquip.getId());
|
||||
NetworkMessage requestPickupMessage = InventoryMessage.constructclientRequestEquipItemMessage(pointName, serverSideID);
|
||||
Globals.clientConnection.queueOutgoingMessage(requestPickupMessage);
|
||||
}
|
||||
}
|
||||
|
||||
public void clientAttemptEquip(Entity toEquip, EquipPoint point){
|
||||
boolean hasEquipped = hasEquippedAtPoint(point.getEquipPointId());
|
||||
boolean targetIsItem = ItemUtils.isItem(toEquip);
|
||||
boolean targetIsAttached = AttachUtils.isAttached(toEquip);
|
||||
boolean targetHasWhitelist = ItemUtils.hasEquipList(toEquip);
|
||||
String equipItemClass = ItemUtils.getEquipClass(toEquip);
|
||||
List<String> pointEquipClassList = point.getEquipClassWhitelist();
|
||||
boolean itemIsInPointWhitelist = pointEquipClassList.contains(equipItemClass);
|
||||
if(!hasEquipped && targetIsItem && !targetIsAttached && itemIsInPointWhitelist){
|
||||
if(targetHasWhitelist){
|
||||
//by attaching are we going to be replacing meshes?
|
||||
String parentCreatureId = CreatureUtils.getType(parent);
|
||||
List<EquipWhitelist> whitelist = ItemUtils.getEquipWhitelist(toEquip);
|
||||
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.clientAttachEntityToEntityAtBone(parent, toEquip, point.getBone(), AttachUtils.getEquipPointRotationOffset(point.getOffsetRotation()));
|
||||
//make uncollidable
|
||||
if(toEquip.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){
|
||||
DBody rigidBody = (DBody)toEquip.getData(EntityDataStrings.PHYSICS_COLLISION_BODY);
|
||||
Globals.clientSceneWrapper.getCollisionEngine().deregisterPhysicsObject(rigidBody);
|
||||
}
|
||||
//hide toEquip actor
|
||||
EntityUtils.setDraw(toEquip, false);
|
||||
//make untargetable
|
||||
Globals.clientSceneWrapper.getScene().removeEntityFromTag(toEquip, EntityTags.TARGETABLE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
//since we're not replacing meshes we must be attaching to a bone
|
||||
equipMap.put(point.getEquipPointId(),toEquip);
|
||||
AttachUtils.clientAttachEntityToEntityAtBone(parent, toEquip, point.getBone(), AttachUtils.getEquipPointRotationOffset(point.getOffsetRotation()));
|
||||
if(toEquip.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){
|
||||
DBody rigidBody = (DBody)toEquip.getData(EntityDataStrings.PHYSICS_COLLISION_BODY);
|
||||
Globals.clientSceneWrapper.getCollisionEngine().deregisterPhysicsObject(rigidBody);
|
||||
}
|
||||
Globals.clientSceneWrapper.getScene().removeEntityFromTag(toEquip, EntityTags.TARGETABLE);
|
||||
GravityUtils.clientAttemptDeactivateGravity(toEquip);
|
||||
}
|
||||
}
|
||||
|
||||
// if(!hasEquipPrimary() && ItemUtils.isItem(toEquip) && !AttachUtils.isAttached(toEquip)){
|
||||
// if(ItemUtils.hasEquipList(toEquip)){
|
||||
// String parentCreatureId = CreatureUtils.getType(parent);
|
||||
// List<EquipWhitelist> whitelist = ItemUtils.getEquipWhitelist(toEquip);
|
||||
// for(EquipWhitelist whitelistItem : whitelist){
|
||||
// if(whitelistItem.getCreatureId().equals(parentCreatureId)){
|
||||
// equipPrimary = 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, equipPrimaryBoneName);
|
||||
// //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(equipPrimary, false);
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// equipPrimary = toEquip;
|
||||
// AttachUtils.attachEntityToEntityAtBone(parent, toEquip, equipPrimaryBoneName);
|
||||
// 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);
|
||||
// }
|
||||
// Globals.entityManager.setTargetable(equipPrimary, false);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
public EquipPoint getEquipPoint(String name){
|
||||
for(EquipPoint point : equipPoints){
|
||||
if(point.getEquipPointId().equals(name)){
|
||||
return point;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public Entity getEquippedItemAtPoint(String point){
|
||||
return equipMap.get(point);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns whether the entity has an equip state
|
||||
* @param entity The entity to check
|
||||
* @return True if the entity contains an equip state, false otherwise
|
||||
*/
|
||||
public static boolean hasEquipState(Entity entity){
|
||||
return entity.containsKey(EntityDataStrings.EQUIP_STATE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the equip state on the entity
|
||||
* @param entity The entity to retrieve equip state from
|
||||
* @return The equip state on the entity
|
||||
*/
|
||||
public static ClientEquipState getEquipState(Entity entity){
|
||||
return (ClientEquipState)entity.getData(EntityDataStrings.EQUIP_STATE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the equip state on the entity
|
||||
* @param entity The entity to attach the equip state to
|
||||
* @param equipState The equip state to attach
|
||||
*/
|
||||
public static void setEquipState(Entity entity, ClientEquipState equipState){
|
||||
entity.putData(EntityDataStrings.EQUIP_STATE, equipState);
|
||||
}
|
||||
|
||||
// public void drop(Entity entity){
|
||||
// if(hasEquipPrimary()){
|
||||
// AttachUtils.detatchEntityFromEntityAtBone(parent,equipPrimary);
|
||||
// if(equipPrimary.getDataKeys().contains(EntityDataStrings.PHYSICS_COLLISION_BODY) && equipPrimary.getDataKeys().contains(EntityDataStrings.PHYSICS_COLLIDABLE)){
|
||||
// CollisionObject rigidBody = (CollisionObject)equipPrimary.getData(EntityDataStrings.PHYSICS_COLLISION_BODY);
|
||||
// Globals.collisionEngine.registerPhysicsObject(rigidBody);
|
||||
// }
|
||||
// Globals.entityManager.setTargetable(equipPrimary, true);
|
||||
// equipPrimary = null;
|
||||
// }
|
||||
// }
|
||||
|
||||
public void commandAttemptUnequip(String pointId){
|
||||
boolean hasEquipped = hasEquippedAtPoint(pointId);
|
||||
if(hasEquipped){
|
||||
//send packet to server requesting to equip
|
||||
NetworkMessage requestUnequipMessage = InventoryMessage.constructclientRequestUnequipItemMessage(pointId);
|
||||
Globals.clientConnection.queueOutgoingMessage(requestUnequipMessage);
|
||||
}
|
||||
}
|
||||
|
||||
public void clientTransformUnequipPoint(String pointId){
|
||||
Entity equipped = equipMap.remove(pointId);
|
||||
if(equipped != null){
|
||||
boolean targetHasWhitelist = ItemUtils.hasEquipList(equipped);
|
||||
if(targetHasWhitelist){
|
||||
//by attaching are we going to be replacing meshes?
|
||||
String parentCreatureId = CreatureUtils.getType(parent);
|
||||
List<EquipWhitelist> whitelist = ItemUtils.getEquipWhitelist(equipped);
|
||||
for(EquipWhitelist whitelistItem : whitelist){
|
||||
if(whitelistItem.getCreatureId().equals(parentCreatureId)){
|
||||
//put in map
|
||||
String modelName = whitelistItem.getModel();
|
||||
Actor parentActor = EntityUtils.getActor(parent);
|
||||
//queue meshes from display model to parent actor
|
||||
ActorMeshMask meshMask = parentActor.getMeshMask();
|
||||
for(String toUnblock : whitelistItem.getMeshMaskList()){
|
||||
meshMask.unblockMesh(toUnblock);
|
||||
}
|
||||
for(String toDraw : whitelistItem.getMeshList()){
|
||||
meshMask.removeAdditionalMesh(toDraw);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
AttachUtils.clientDetatchEntityFromEntityAtBone(parent, equipped);
|
||||
EntityUtils.cleanUpEntity(equipped);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean hasEquippedAtPoint(String point){
|
||||
return equipMap.containsKey(point);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -8,8 +8,6 @@ import java.util.Map;
|
||||
import org.joml.Vector3d;
|
||||
import org.ode4j.ode.DBody;
|
||||
|
||||
import electrosphere.client.targeting.crosshair.Crosshair;
|
||||
import electrosphere.collision.collidable.Collidable;
|
||||
import electrosphere.engine.Globals;
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityDataStrings;
|
||||
@ -28,25 +26,24 @@ import electrosphere.net.parser.net.message.InventoryMessage;
|
||||
import electrosphere.net.parser.net.message.NetworkMessage;
|
||||
import electrosphere.net.server.player.Player;
|
||||
import electrosphere.net.server.protocol.InventoryProtocol;
|
||||
import electrosphere.renderer.actor.Actor;
|
||||
import electrosphere.renderer.actor.ActorMeshMask;
|
||||
import electrosphere.net.synchronization.annotation.SynchronizedBehaviorTree;
|
||||
import electrosphere.server.datacell.Realm;
|
||||
import electrosphere.server.datacell.ServerDataCell;
|
||||
import electrosphere.server.datacell.utils.DataCellSearchUtils;
|
||||
import electrosphere.server.datacell.utils.ServerEntityTagUtils;
|
||||
|
||||
@SynchronizedBehaviorTree(name = "serverEquipState", isServer = true, correspondingTree="clientEquipState")
|
||||
/**
|
||||
*
|
||||
* @author amaterasu
|
||||
* Server view of items equipped onto an entity
|
||||
*/
|
||||
public class EquipState {
|
||||
public class ServerEquipState {
|
||||
|
||||
Entity parent;
|
||||
|
||||
List<EquipPoint> equipPoints = new LinkedList<EquipPoint>();
|
||||
Map<String,Entity> equipMap = new HashMap<String,Entity>();
|
||||
|
||||
public EquipState(Entity parent, List<EquipPoint> equipPoints){
|
||||
public ServerEquipState(Entity parent, List<EquipPoint> equipPoints){
|
||||
this.parent = parent;
|
||||
for(EquipPoint point : equipPoints){
|
||||
this.equipPoints.add(point);
|
||||
@ -67,14 +64,7 @@ public class EquipState {
|
||||
boolean itemIsInPointWhitelist = pointEquipClassList.contains(equipItemClass);
|
||||
if(!hasEquipped && targetIsItem && !targetIsAttached && itemIsInPointWhitelist){
|
||||
//if we're the server, perform the attempt, otherwise send packet to server requesting to equip
|
||||
if(Globals.RUN_SERVER){
|
||||
serverAttemptEquip(toEquip, point);
|
||||
} else {
|
||||
String pointName = point.getEquipPointId();
|
||||
int serverSideID = Globals.clientSceneWrapper.mapClientToServerId(toEquip.getId());
|
||||
NetworkMessage requestPickupMessage = InventoryMessage.constructclientRequestEquipItemMessage(pointName, serverSideID);
|
||||
Globals.clientConnection.queueOutgoingMessage(requestPickupMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -103,15 +93,6 @@ public class EquipState {
|
||||
equipMap.put(point.getEquipPointId(),inWorldItem);
|
||||
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.serverAttachEntityToEntityAtBone(parent, inWorldItem, point.getBone(), AttachUtils.getEquipPointRotationOffset(point.getOffsetRotation()));
|
||||
//make uncollidable
|
||||
@ -142,7 +123,7 @@ public class EquipState {
|
||||
//we need to send two packets
|
||||
//1) Remove item from original inventory
|
||||
//2) Add item with ID to "equipped" inventory
|
||||
//let clients know of the updates if we're the server
|
||||
//let clients know of the updates
|
||||
//get the parent (typically creature) that contains the in-inventory item
|
||||
Entity containingEntity = ItemUtils.getContainingParent(inInventoryEntity);
|
||||
//actually switch containers
|
||||
@ -182,105 +163,6 @@ public class EquipState {
|
||||
}
|
||||
}
|
||||
|
||||
public void clientAttemptEquip(Entity toEquip, EquipPoint point){
|
||||
boolean hasEquipped = hasEquippedAtPoint(point.getEquipPointId());
|
||||
boolean targetIsItem = ItemUtils.isItem(toEquip);
|
||||
boolean targetIsAttached = AttachUtils.isAttached(toEquip);
|
||||
boolean targetHasWhitelist = ItemUtils.hasEquipList(toEquip);
|
||||
String equipItemClass = ItemUtils.getEquipClass(toEquip);
|
||||
List<String> pointEquipClassList = point.getEquipClassWhitelist();
|
||||
boolean itemIsInPointWhitelist = pointEquipClassList.contains(equipItemClass);
|
||||
if(!hasEquipped && targetIsItem && !targetIsAttached && itemIsInPointWhitelist){
|
||||
if(targetHasWhitelist){
|
||||
//by attaching are we going to be replacing meshes?
|
||||
String parentCreatureId = CreatureUtils.getType(parent);
|
||||
List<EquipWhitelist> whitelist = ItemUtils.getEquipWhitelist(toEquip);
|
||||
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.clientAttachEntityToEntityAtBone(parent, toEquip, point.getBone(), AttachUtils.getEquipPointRotationOffset(point.getOffsetRotation()));
|
||||
//make uncollidable
|
||||
if(toEquip.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){
|
||||
DBody rigidBody = (DBody)toEquip.getData(EntityDataStrings.PHYSICS_COLLISION_BODY);
|
||||
Globals.clientSceneWrapper.getCollisionEngine().deregisterPhysicsObject(rigidBody);
|
||||
}
|
||||
//hide toEquip actor
|
||||
EntityUtils.setDraw(toEquip, false);
|
||||
//make untargetable
|
||||
Globals.clientSceneWrapper.getScene().removeEntityFromTag(toEquip, EntityTags.TARGETABLE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
//since we're not replacing meshes we must be attaching to a bone
|
||||
equipMap.put(point.getEquipPointId(),toEquip);
|
||||
AttachUtils.clientAttachEntityToEntityAtBone(parent, toEquip, point.getBone(), AttachUtils.getEquipPointRotationOffset(point.getOffsetRotation()));
|
||||
if(toEquip.containsKey(EntityDataStrings.PHYSICS_COLLISION_BODY) && toEquip.containsKey(EntityDataStrings.PHYSICS_COLLIDABLE)){
|
||||
DBody rigidBody = (DBody)toEquip.getData(EntityDataStrings.PHYSICS_COLLISION_BODY);
|
||||
Globals.clientSceneWrapper.getCollisionEngine().deregisterPhysicsObject(rigidBody);
|
||||
}
|
||||
Globals.clientSceneWrapper.getScene().removeEntityFromTag(toEquip, EntityTags.TARGETABLE);
|
||||
GravityUtils.clientAttemptDeactivateGravity(toEquip);
|
||||
}
|
||||
}
|
||||
|
||||
// if(!hasEquipPrimary() && ItemUtils.isItem(toEquip) && !AttachUtils.isAttached(toEquip)){
|
||||
// if(ItemUtils.hasEquipList(toEquip)){
|
||||
// String parentCreatureId = CreatureUtils.getType(parent);
|
||||
// List<EquipWhitelist> whitelist = ItemUtils.getEquipWhitelist(toEquip);
|
||||
// for(EquipWhitelist whitelistItem : whitelist){
|
||||
// if(whitelistItem.getCreatureId().equals(parentCreatureId)){
|
||||
// equipPrimary = 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, equipPrimaryBoneName);
|
||||
// //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(equipPrimary, false);
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// equipPrimary = toEquip;
|
||||
// AttachUtils.attachEntityToEntityAtBone(parent, toEquip, equipPrimaryBoneName);
|
||||
// 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);
|
||||
// }
|
||||
// Globals.entityManager.setTargetable(equipPrimary, false);
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
public EquipPoint getEquipPoint(String name){
|
||||
for(EquipPoint point : equipPoints){
|
||||
if(point.getEquipPointId().equals(name)){
|
||||
@ -308,8 +190,8 @@ public class EquipState {
|
||||
* @param entity The entity to retrieve equip state from
|
||||
* @return The equip state on the entity
|
||||
*/
|
||||
public static EquipState getEquipState(Entity entity){
|
||||
return (EquipState)entity.getData(EntityDataStrings.EQUIP_STATE);
|
||||
public static ServerEquipState getEquipState(Entity entity){
|
||||
return (ServerEquipState)entity.getData(EntityDataStrings.EQUIP_STATE);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -317,7 +199,7 @@ public class EquipState {
|
||||
* @param entity The entity to attach the equip state to
|
||||
* @param equipState The equip state to attach
|
||||
*/
|
||||
public static void setEquipState(Entity entity, EquipState equipState){
|
||||
public static void setEquipState(Entity entity, ServerEquipState equipState){
|
||||
entity.putData(EntityDataStrings.EQUIP_STATE, equipState);
|
||||
}
|
||||
|
||||
@ -336,13 +218,8 @@ public class EquipState {
|
||||
public void commandAttemptUnequip(String pointId){
|
||||
boolean hasEquipped = hasEquippedAtPoint(pointId);
|
||||
if(hasEquipped){
|
||||
//if we're the server, perform the attempt, otherwise send packet to server requesting to equip
|
||||
if(Globals.RUN_SERVER){
|
||||
//perform the attempt
|
||||
serverAttemptUnequip(pointId);
|
||||
} else {
|
||||
NetworkMessage requestUnequipMessage = InventoryMessage.constructclientRequestUnequipItemMessage(pointId);
|
||||
Globals.clientConnection.queueOutgoingMessage(requestUnequipMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -393,18 +270,6 @@ public class EquipState {
|
||||
// inventory.addItem(item);
|
||||
}
|
||||
|
||||
public void clientTransformUnequipPoint(String pointId){
|
||||
Entity equipped = equipMap.remove(pointId);
|
||||
if(equipped != null){
|
||||
boolean targetHasWhitelist = ItemUtils.hasEquipList(equipped);
|
||||
if(targetHasWhitelist){
|
||||
} else {
|
||||
AttachUtils.clientDetatchEntityFromEntityAtBone(parent, equipped);
|
||||
EntityUtils.cleanUpEntity(equipped);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void serverTransformUnequipPoint(String pointId){
|
||||
Entity equipped = equipMap.remove(pointId);
|
||||
if(equipped != null){
|
||||
@ -452,6 +317,4 @@ public class EquipState {
|
||||
public boolean hasEquippedAtPoint(String point){
|
||||
return equipMap.containsKey(point);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@ -6,7 +6,7 @@ import electrosphere.engine.Globals;
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.entity.btree.BehaviorTree;
|
||||
import electrosphere.entity.state.equip.EquipState;
|
||||
import electrosphere.entity.state.equip.ClientEquipState;
|
||||
import electrosphere.entity.types.item.ItemUtils;
|
||||
import electrosphere.game.data.creature.type.equip.EquipPoint;
|
||||
import electrosphere.menu.WindowStrings;
|
||||
@ -95,9 +95,9 @@ public class InventoryState implements BehaviorTree {
|
||||
}
|
||||
break;
|
||||
case SERVERCOMMANDUNEQUIPITEM: {
|
||||
if(Globals.playerEntity != null && EquipState.hasEquipState(Globals.playerEntity)){
|
||||
if(Globals.playerEntity != null && ClientEquipState.hasEquipState(Globals.playerEntity)){
|
||||
//unequip the item
|
||||
EquipState equipState = EquipState.getEquipState(Globals.playerEntity);
|
||||
ClientEquipState equipState = ClientEquipState.getEquipState(Globals.playerEntity);
|
||||
Entity entityInSlot = equipState.getEquippedItemAtPoint(message.getequipPointId());
|
||||
equipState.clientTransformUnequipPoint(message.getequipPointId());
|
||||
//destroy the in-world manifestation of said item
|
||||
|
||||
@ -7,7 +7,8 @@ import electrosphere.engine.Globals;
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityDataStrings;
|
||||
import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.entity.state.equip.EquipState;
|
||||
import electrosphere.entity.state.equip.ClientEquipState;
|
||||
import electrosphere.entity.state.equip.ServerEquipState;
|
||||
import electrosphere.entity.state.gravity.GravityUtils;
|
||||
import electrosphere.entity.types.creature.CreatureUtils;
|
||||
import electrosphere.entity.types.item.ItemUtils;
|
||||
@ -96,15 +97,12 @@ public class InventoryUtils {
|
||||
//destroy in-world entity and create in-inventory item
|
||||
//we're doing this so that we're not constantly sending networking messages for invisible entities attached to the player
|
||||
Entity inventoryItem = ItemUtils.serverRecreateContainerItem(item, creature);
|
||||
//destroy the item that was left over
|
||||
ItemUtils.serverDestroyInWorldItem(item);
|
||||
//store item in inventory
|
||||
inventory.addItem(inventoryItem);
|
||||
//set item containing parent
|
||||
ItemUtils.setContainingParent(inventoryItem, creature);
|
||||
//if we are the server, immediately send required packets
|
||||
if(Globals.RUN_SERVER){
|
||||
ServerDataCell dataCell = Globals.realmManager.getEntityRealm(item).getEntityDataCellMapper().getEntityDataCell(item);
|
||||
ServerDataCell dataCell = DataCellSearchUtils.getEntityDataCell(item);
|
||||
// ServerDataCell dataCell = Globals.dataCellLocationResolver.getDataCellAtPoint(EntityUtils.getPosition(item),item);
|
||||
dataCell.getScene().deregisterEntity(item);
|
||||
//broadcast destroy entity
|
||||
@ -117,7 +115,8 @@ public class InventoryUtils {
|
||||
//send message
|
||||
controllerPlayer.addMessage(InventoryMessage.constructaddItemToInventoryMessage(inventoryItem.getId(), ItemUtils.getType(inventoryItem)));
|
||||
}
|
||||
}
|
||||
//destroy the item that was left over
|
||||
ItemUtils.serverDestroyInWorldItem(item);
|
||||
}
|
||||
}
|
||||
|
||||
@ -126,18 +125,23 @@ public class InventoryUtils {
|
||||
* @param creature the creature which has a natural inventory
|
||||
* @param item the in-world item entity to store
|
||||
*/
|
||||
public static void attemptStoreItem(Entity creature, Entity item){
|
||||
if(Globals.RUN_SERVER){
|
||||
//if we're the server, immediately attempt the transform
|
||||
serverAttemptStoreItemTransform(creature,item);
|
||||
} else {
|
||||
//if we're the client, tell the server we want to try the transform
|
||||
public static void clientAttemptStoreItem(Entity creature, Entity item){
|
||||
//tell the server we want to try the transform
|
||||
NetworkMessage requestPickupMessage = InventoryMessage.constructaddItemToInventoryMessage(
|
||||
Globals.clientSceneWrapper.mapClientToServerId(item.getId()),
|
||||
ItemUtils.getType(item)
|
||||
);
|
||||
Globals.clientConnection.queueOutgoingMessage(requestPickupMessage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to store the in-world item entity in a creature inventory container
|
||||
* @param creature the creature which has a natural inventory
|
||||
* @param item the in-world item entity to store
|
||||
*/
|
||||
public static void serverAttemptStoreItem(Entity creature, Entity item){
|
||||
//immediately attempt the transform
|
||||
serverAttemptStoreItemTransform(creature,item);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -206,7 +210,7 @@ public class InventoryUtils {
|
||||
Entity realWorldItem = ItemUtils.getRealWorldEntity(item);
|
||||
if(realWorldItem != null){
|
||||
//drop item
|
||||
EquipState equipState = EquipState.getEquipState(creature);
|
||||
ServerEquipState equipState = ServerEquipState.getEquipState(creature);
|
||||
equipState.serverTransformUnequipPoint(inventorySlot);
|
||||
// equipState.serverAttemptUnequip(inventory.getItemSlot(item));
|
||||
//
|
||||
@ -245,16 +249,17 @@ public class InventoryUtils {
|
||||
}
|
||||
|
||||
//need creature so we can figure out where to drop the item
|
||||
public static void attemptEjectItem(Entity creature, Entity item){
|
||||
if(Globals.RUN_SERVER){
|
||||
public static void serverAttemptEjectItem(Entity creature, Entity item){
|
||||
//if we're the server, immediately attempt the transform
|
||||
serverAttemptEjectItemTransform(creature,item);
|
||||
} else {
|
||||
}
|
||||
|
||||
//need creature so we can figure out where to drop the item
|
||||
public static void clientAttemptEjectItem(Entity creature, Entity item){
|
||||
//if we're the client, tell the server we want to try the transform
|
||||
NetworkMessage requestPickupMessage = InventoryMessage.constructremoveItemFromInventoryMessage(Globals.clientSceneWrapper.mapClientToServerId(item.getId()));
|
||||
Globals.clientConnection.queueOutgoingMessage(requestPickupMessage);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* [CLIENT ONLY] Called when the server says to remove an item from all inventories
|
||||
@ -284,7 +289,7 @@ public class InventoryUtils {
|
||||
Entity realWorldItem = ItemUtils.getRealWorldEntity(item);
|
||||
if(realWorldItem != null){
|
||||
//drop item
|
||||
EquipState equipState = EquipState.getEquipState(creature);
|
||||
ClientEquipState equipState = ClientEquipState.getEquipState(creature);
|
||||
equipState.clientTransformUnequipPoint(inventory.getItemSlot(item));
|
||||
}
|
||||
//remove item from inventory
|
||||
|
||||
@ -6,7 +6,7 @@ import electrosphere.engine.Globals;
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.entity.btree.BehaviorTree;
|
||||
import electrosphere.entity.state.equip.EquipState;
|
||||
import electrosphere.entity.state.equip.ServerEquipState;
|
||||
import electrosphere.entity.types.item.ItemUtils;
|
||||
import electrosphere.game.data.creature.type.equip.EquipPoint;
|
||||
import electrosphere.menu.WindowStrings;
|
||||
@ -42,17 +42,17 @@ public class ServerInventoryState implements BehaviorTree {
|
||||
networkMessageQueue.remove(message);
|
||||
switch(message.getMessageSubtype()){
|
||||
case ADDITEMTOINVENTORY:
|
||||
InventoryUtils.attemptStoreItem(parent, EntityLookupUtils.getEntityById(message.getentityId()));
|
||||
InventoryUtils.serverAttemptStoreItem(parent, EntityLookupUtils.getEntityById(message.getentityId()));
|
||||
break;
|
||||
case REMOVEITEMFROMINVENTORY:
|
||||
InventoryUtils.attemptEjectItem(parent, EntityLookupUtils.getEntityById(message.getentityId()));
|
||||
InventoryUtils.serverAttemptEjectItem(parent, EntityLookupUtils.getEntityById(message.getentityId()));
|
||||
break;
|
||||
case CLIENTREQUESTEQUIPITEM:{
|
||||
//item to equip
|
||||
Entity target = EntityLookupUtils.getEntityById(message.getentityId());
|
||||
//perform transform if it makes sense
|
||||
if(InventoryUtils.hasEquipInventory(parent) && InventoryUtils.hasNaturalInventory(parent) && EquipState.hasEquipState(parent)){
|
||||
EquipState equipState = EquipState.getEquipState(parent);
|
||||
if(InventoryUtils.hasEquipInventory(parent) && InventoryUtils.hasNaturalInventory(parent) && ServerEquipState.hasEquipState(parent)){
|
||||
ServerEquipState equipState = ServerEquipState.getEquipState(parent);
|
||||
EquipPoint point = equipState.getEquipPoint(message.getequipPointId());
|
||||
equipState.commandAttemptEquip(target, point);
|
||||
}
|
||||
@ -60,8 +60,8 @@ public class ServerInventoryState implements BehaviorTree {
|
||||
break;
|
||||
case CLIENTREQUESTUNEQUIPITEM:{
|
||||
//make sure can unequip
|
||||
if(InventoryUtils.hasEquipInventory(parent) && InventoryUtils.hasNaturalInventory(parent) && EquipState.hasEquipState(parent)){
|
||||
EquipState equipState = EquipState.getEquipState(parent);
|
||||
if(InventoryUtils.hasEquipInventory(parent) && InventoryUtils.hasNaturalInventory(parent) && ServerEquipState.hasEquipState(parent)){
|
||||
ServerEquipState equipState = ServerEquipState.getEquipState(parent);
|
||||
EquipPoint point = equipState.getEquipPoint(message.getequipPointId());
|
||||
if(equipState.hasEquippedAtPoint(message.getequipPointId())){
|
||||
equipState.commandAttemptUnequip(message.getequipPointId());
|
||||
|
||||
@ -10,6 +10,7 @@ import electrosphere.renderer.actor.Actor;
|
||||
import electrosphere.renderer.model.Model;
|
||||
import electrosphere.server.datacell.ServerDataCell;
|
||||
import electrosphere.server.datacell.utils.ServerEntityTagUtils;
|
||||
import electrosphere.server.poseactor.PoseActor;
|
||||
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
@ -45,7 +46,7 @@ public class AttachUtils {
|
||||
if((parent = (Entity)currentEntity.getData(EntityDataStrings.ATTACH_PARENT))!=null){
|
||||
String targetBone;
|
||||
if((targetBone = (String)currentEntity.getData(EntityDataStrings.ATTACH_TARGET_BONE))!=null){
|
||||
Actor parentActor = EntityUtils.getActor(parent);
|
||||
PoseActor parentActor = EntityUtils.getPoseActor(parent);
|
||||
//get offset rotation
|
||||
Quaterniond offsetRotation = getRotationOffset(currentEntity);
|
||||
//transform bone space
|
||||
@ -420,7 +421,11 @@ public class AttachUtils {
|
||||
}
|
||||
|
||||
public static Quaterniond getEquipPointRotationOffset(List<Float> values){
|
||||
if(values.size() > 0){
|
||||
return new Quaterniond(values.get(0),values.get(1),values.get(2),values.get(3));
|
||||
} else {
|
||||
return new Quaterniond();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -25,7 +25,8 @@ import electrosphere.entity.state.attack.ServerAttackTree;
|
||||
import electrosphere.entity.state.attack.ShooterTree;
|
||||
import electrosphere.entity.state.collidable.ClientCollidableTree;
|
||||
import electrosphere.entity.state.collidable.ServerCollidableTree;
|
||||
import electrosphere.entity.state.equip.EquipState;
|
||||
import electrosphere.entity.state.equip.ClientEquipState;
|
||||
import electrosphere.entity.state.equip.ServerEquipState;
|
||||
import electrosphere.entity.state.gravity.ClientGravityTree;
|
||||
import electrosphere.entity.state.gravity.ServerGravityTree;
|
||||
import electrosphere.entity.state.idle.IdleTree;
|
||||
@ -227,7 +228,7 @@ public class CreatureUtils {
|
||||
}
|
||||
}
|
||||
if(rawType.getEquipPoints() != null && rawType.getEquipPoints().size() > 0){
|
||||
EquipState.setEquipState(rVal, new EquipState(rVal,rawType.getEquipPoints()));
|
||||
ClientEquipState.setEquipState(rVal, new ClientEquipState(rVal,rawType.getEquipPoints()));
|
||||
rVal.putData(EntityDataStrings.EQUIP_INVENTORY, RelationalInventoryState.buildRelationalInventoryStateFromEquipList(rawType.getEquipPoints()));
|
||||
}
|
||||
for(String token : rawType.getTokens()){
|
||||
@ -523,7 +524,7 @@ public class CreatureUtils {
|
||||
}
|
||||
}
|
||||
if(rawType.getEquipPoints() != null && rawType.getEquipPoints().size() > 0){
|
||||
EquipState.setEquipState(rVal, new EquipState(rVal,rawType.getEquipPoints()));
|
||||
ServerEquipState.setEquipState(rVal, new ServerEquipState(rVal,rawType.getEquipPoints()));
|
||||
rVal.putData(EntityDataStrings.EQUIP_INVENTORY, RelationalInventoryState.buildRelationalInventoryStateFromEquipList(rawType.getEquipPoints()));
|
||||
}
|
||||
for(String token : rawType.getTokens()){
|
||||
|
||||
@ -389,6 +389,7 @@ public class ItemUtils {
|
||||
Realm itemRealm = Globals.realmManager.getEntityRealm(item);
|
||||
//destroy physics
|
||||
//this deregisters from all four & unhooks rigid bodies from the physics runtime
|
||||
if(itemRealm != null){
|
||||
itemRealm.getCollisionEngine().destroyEntityThatHasPhysics(item);
|
||||
//destroy hitboxes
|
||||
List<Entity> hitboxes = HitboxUtils.getHitboxAssociatedList(item);
|
||||
@ -398,6 +399,7 @@ public class ItemUtils {
|
||||
HitboxUtils.getHitboxData(hitbox).setActive(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
//destroy graphics
|
||||
EntityUtils.cleanUpEntity(item);
|
||||
}
|
||||
|
||||
@ -1,6 +1,5 @@
|
||||
package electrosphere.game.data.item.type;
|
||||
|
||||
import electrosphere.entity.types.hitbox.HitboxData;
|
||||
import electrosphere.game.data.collidable.CollidableTemplate;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@ -21,7 +21,7 @@ public class WindowUtils {
|
||||
//todo: destroy elements as well
|
||||
mainMenu.clear();
|
||||
mainMenu.addChild(newMenu);
|
||||
mainMenu.applyYoga();
|
||||
mainMenu.applyYoga(0,0);
|
||||
Globals.elementManager.focusFirstElement();
|
||||
}
|
||||
}
|
||||
@ -35,6 +35,9 @@ public class WindowUtils {
|
||||
recursiveSetVisible(child, visible);
|
||||
}
|
||||
}
|
||||
if(visible){
|
||||
topLevelMenu.applyYoga(0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
public static String getInventoryWindowID(int id){
|
||||
@ -122,7 +125,7 @@ public class WindowUtils {
|
||||
Label loadingLabel = new Label(1.0f);
|
||||
loadingLabel.setText("LOADING");
|
||||
loadingWindow.addChild(loadingLabel);
|
||||
loadingWindow.applyYoga();
|
||||
loadingWindow.applyYoga(0,0);
|
||||
Globals.elementManager.registerWindow(WindowStrings.WINDOW_LOADING, loadingWindow);
|
||||
WindowUtils.recursiveSetVisible(loadingWindow, true);
|
||||
}
|
||||
@ -138,7 +141,7 @@ public class WindowUtils {
|
||||
}
|
||||
|
||||
static void initItemDragContainerWindow(){
|
||||
Window itemDragContainerWindow = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT,true);
|
||||
Window itemDragContainerWindow = new Window(0,0,Globals.WINDOW_WIDTH,Globals.WINDOW_HEIGHT,false);
|
||||
Globals.elementManager.registerWindow(WindowStrings.WINDOW_ITEM_DRAG_CONTAINER, itemDragContainerWindow);
|
||||
}
|
||||
|
||||
|
||||
118
src/main/java/electrosphere/menu/debug/ImGuiEntityMacros.java
Normal file
@ -0,0 +1,118 @@
|
||||
package electrosphere.menu.debug;
|
||||
|
||||
import electrosphere.engine.Globals;
|
||||
import electrosphere.entity.Entity;
|
||||
import electrosphere.entity.EntityUtils;
|
||||
import electrosphere.entity.types.creature.CreatureUtils;
|
||||
import electrosphere.entity.types.foliage.FoliageUtils;
|
||||
import electrosphere.entity.types.item.ItemUtils;
|
||||
import electrosphere.renderer.RenderingEngine;
|
||||
import electrosphere.renderer.actor.Actor;
|
||||
import electrosphere.renderer.actor.ActorMeshMask;
|
||||
import electrosphere.renderer.model.Mesh;
|
||||
import electrosphere.renderer.ui.imgui.ImGuiWindow;
|
||||
import electrosphere.renderer.ui.imgui.ImGuiWindow.ImGuiWindowCallback;
|
||||
import imgui.ImGui;
|
||||
|
||||
/**
|
||||
* Macros for creating imgui windows relating to entity debugging
|
||||
*/
|
||||
public class ImGuiEntityMacros {
|
||||
|
||||
protected static ImGuiWindow clientEntityWindow;
|
||||
private static boolean filterToCreatures = false;
|
||||
|
||||
protected static ImGuiWindow actorView;
|
||||
static Entity actorViewEntity;
|
||||
|
||||
/**
|
||||
* Creates the windows in this file
|
||||
*/
|
||||
protected static void createClientEntityWindows(){
|
||||
createClientEntityDebugWindow();
|
||||
createActorViewDebugWindow();
|
||||
}
|
||||
|
||||
/**
|
||||
* Client scene entity view
|
||||
*/
|
||||
protected static void createClientEntityDebugWindow(){
|
||||
clientEntityWindow = new ImGuiWindow("Client Entities");
|
||||
clientEntityWindow.setCallback(new ImGuiWindowCallback() {
|
||||
@Override
|
||||
public void exec() {
|
||||
//audio engine details
|
||||
ImGui.text("Client Entities");
|
||||
if(ImGui.checkbox("Filter to Creatures", filterToCreatures)){
|
||||
filterToCreatures = !filterToCreatures;
|
||||
}
|
||||
for(Entity entity : Globals.clientSceneWrapper.getScene().getEntityList()){
|
||||
//filters
|
||||
if(filterToCreatures && !CreatureUtils.isCreature(entity)){
|
||||
continue;
|
||||
}
|
||||
ImGui.beginGroup();
|
||||
ImGui.text("Id: " + entity.getId() + " (" + getEntityName(entity) + ")");
|
||||
if(CreatureUtils.isCreature(entity)){
|
||||
if(ImGui.button("Actor View")){
|
||||
actorViewEntity = entity;
|
||||
actorView.setOpen(true);
|
||||
}
|
||||
}
|
||||
ImGui.endGroup();
|
||||
}
|
||||
}
|
||||
});
|
||||
clientEntityWindow.setOpen(false);
|
||||
RenderingEngine.addImGuiWindow(clientEntityWindow);
|
||||
}
|
||||
|
||||
/**
|
||||
* Client scene entity view
|
||||
*/
|
||||
protected static void createActorViewDebugWindow(){
|
||||
actorView = new ImGuiWindow("Actor View");
|
||||
actorView.setCallback(new ImGuiWindowCallback() {
|
||||
@Override
|
||||
public void exec() {
|
||||
if(actorViewEntity != null && EntityUtils.getActor(actorViewEntity) != null){
|
||||
Actor actor = EntityUtils.getActor(actorViewEntity);
|
||||
|
||||
//mesh mask
|
||||
if(ImGui.collapsingHeader("Mesh Mask")){
|
||||
ActorMeshMask meshMask = actor.getMeshMask();
|
||||
ImGui.text("To Draw Meshes:");
|
||||
for(Mesh mesh : meshMask.getToDrawMeshes()){
|
||||
ImGui.text(mesh.getMeshName());
|
||||
}
|
||||
ImGui.text("Blocked Meshes:");
|
||||
for(String blocked : meshMask.getBlockedMeshes()){
|
||||
ImGui.text(blocked);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
actorView.setOpen(false);
|
||||
RenderingEngine.addImGuiWindow(actorView);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the displayed name of an entity (ie creature type, foliage type, terrain, etc)
|
||||
* @param entity
|
||||
* @return
|
||||
*/
|
||||
private static String getEntityName(Entity entity){
|
||||
if(CreatureUtils.isCreature(entity)){
|
||||
return CreatureUtils.getType(entity);
|
||||
}
|
||||
if(ItemUtils.isItem(entity)){
|
||||
return ItemUtils.getType(entity);
|
||||
}
|
||||
if(FoliageUtils.isFoliage(entity)){
|
||||
return FoliageUtils.getFoliageType(entity).getName();
|
||||
}
|
||||
return "Entity";
|
||||
}
|
||||
|
||||
}
|
||||