diff --git a/assets/Data/foliage.json b/assets/Data/foliage.json new file mode 100644 index 00000000..402d4c9b --- /dev/null +++ b/assets/Data/foliage.json @@ -0,0 +1,23 @@ +{ + "foliageList" : [ + { + "name" : "FallOak1", + "tokens" : [ + "BLENDER_ROTATION" + ], + "physicsObjects" : [ + { + "type" : "CYLINDER", + "dimension1" : 0.1, + "dimension2" : 0.45, + "dimension3" : 0.1, + "offsetX" : 0, + "offsetY" : 0.45, + "offsetZ" : 0 + } + ], + "modelPath" : "Models/falloak1.fbx" + } + + ] +} diff --git a/src/main/java/electrosphere/engine/LoadingThread.java b/src/main/java/electrosphere/engine/LoadingThread.java index 893e1cfb..0ca031d5 100644 --- a/src/main/java/electrosphere/engine/LoadingThread.java +++ b/src/main/java/electrosphere/engine/LoadingThread.java @@ -19,6 +19,7 @@ import electrosphere.game.server.world.ServerWorldData; import electrosphere.entity.types.attach.AttachUtils; import electrosphere.entity.types.particle.ParticleUtils; import electrosphere.entity.types.collision.CollisionObjUtils; +import electrosphere.entity.types.foliage.FoliageUtils; import electrosphere.entity.types.structure.StructureUtils; import electrosphere.game.collision.PhysicsUtils; import electrosphere.game.collision.collidable.Collidable; @@ -345,7 +346,8 @@ public class LoadingThread extends Thread { Vector2i townLoc = Town.findValidTownLocation(); if(townLoc != null){ int chunkSize = Globals.serverTerrainManager.getChunkWidth(); - Globals.spawnPoint = new Vector3f((townLoc.x - 3) * chunkSize, Globals.serverTerrainManager.getHeightAtPosition(townLoc.x * chunkSize,townLoc.y * chunkSize), townLoc.y * chunkSize); + Globals.spawnPoint = new Vector3f(townLoc.x * chunkSize, Globals.serverTerrainManager.getHeightAtPosition(townLoc.x * chunkSize,townLoc.y * chunkSize), townLoc.y * chunkSize); +// System.out.println("Setting spawn point @ " + Globals.spawnPoint); Town.createTown(townLoc.x,townLoc.y); } } @@ -522,14 +524,14 @@ public class LoadingThread extends Thread { //// EntityUtils.getEntityRotation(tree).rotateAxis((float)-Math.PI/2.0f, new Vector3f(1,0,0)); // } - for(int i = 0; i < 250; i++){ - Random rand = new Random(); - String treePath = "Models/falloak1.fbx"; - Entity tree = EntityUtils.spawnDrawableEntity(treePath); - EntityUtils.getPosition(tree).set(rand.nextFloat() * 105 + 1, 0, rand.nextFloat() * 105 + 1); - EntityUtils.getRotation(tree).rotateLocalX(-(float)Math.PI/2.0f).rotateZ(rand.nextFloat()); -// EntityUtils.getEntityRotation(tree).rotateAxis((float)-Math.PI/2.0f, new Vector3f(1,0,0)); - } +// for(int i = 0; i < 250; i++){ +// Random rand = new Random(); +// String treePath = "Models/falloak1.fbx"; +// Entity tree = EntityUtils.spawnDrawableEntity(treePath); +// EntityUtils.getPosition(tree).set(rand.nextFloat() * 105 + 1, 0, rand.nextFloat() * 105 + 1); +// EntityUtils.getRotation(tree).rotateLocalX(-(float)Math.PI/2.0f).rotateZ(rand.nextFloat()); +//// EntityUtils.getEntityRotation(tree).rotateAxis((float)-Math.PI/2.0f, new Vector3f(1,0,0)); +// } // Random rand = new Random(); // for(int i = 0; i < 1000; i++){ @@ -548,14 +550,18 @@ public class LoadingThread extends Thread { // ActorUtils.applyBlenderTransformer(building); //spawn evil goblin - Entity goblin = CreatureUtils.spawnBasicCreature("Goblin"); - CreatureUtils.positionCharacter(goblin, new Vector3f(30, 0, 30)); - EntityUtils.getScale(goblin).set(0.005f); - //give evil goblin sword - Entity goblinSword = ItemUtils.spawnBasicItem("Katana"); - AttachUtils.attachEntityToEntityAtBone(goblin, goblinSword, "Bone.031"); - //attach ai to evil goblin - MindlessAttacker.attachToCreature(goblin); +// Entity goblin = CreatureUtils.spawnBasicCreature("Goblin"); +// CollisionObjUtils.positionCharacter(goblin, new Vector3f(30, 0, 30)); +// EntityUtils.getScale(goblin).set(0.005f); +// //give evil goblin sword +// Entity goblinSword = ItemUtils.spawnBasicItem("Katana"); +// AttachUtils.attachEntityToEntityAtBone(goblin, goblinSword, "Bone.031"); +// //attach ai to evil goblin +// MindlessAttacker.attachToCreature(goblin); + + Entity fallOak = FoliageUtils.spawnBasicFoliage("FallOak1"); + EntityUtils.getPosition(fallOak).set(1,0,3); +// CollisionObjUtils.positionCharacter(fallOak, new Vector3f(1, 0, 3)); // // // Entity testHomie = CreatureUtils.spawnBasicCreature("Human"); diff --git a/src/main/java/electrosphere/entity/EntityDataStrings.java b/src/main/java/electrosphere/entity/EntityDataStrings.java index d25a0a83..0d17d642 100644 --- a/src/main/java/electrosphere/entity/EntityDataStrings.java +++ b/src/main/java/electrosphere/entity/EntityDataStrings.java @@ -104,6 +104,7 @@ public class EntityDataStrings { public static final String COLLISION_ENTITY_TYPE_PLANE = "collisionTypePlane"; public static final String COLLISION_ENTITY_TYPE_CUBE = "collisionTypeCube"; + public static final String COLLISION_ENTITY_TYPE_CYLINDER = "collisionTypeCylinder"; public static final String COLLISION_ENTITY_DATA_TYPE_HIT = "collisionDataTypeHit"; @@ -162,7 +163,11 @@ public class EntityDataStrings { public static final String STRUCTURE_IS_STRUCTURE = "structureIsStructure"; public static final String STRUCTURE_TYPE = "structureType"; - + /* + Foliage entity + */ + public static final String FOLIAGE_IS_FOLIAGE = "foliageIsFoliage"; + public static final String FOLIAGE_TYPE = "foliageType"; /* Entity categories diff --git a/src/main/java/electrosphere/entity/state/IdleTree.java b/src/main/java/electrosphere/entity/state/IdleTree.java index a544ea91..23950ee5 100644 --- a/src/main/java/electrosphere/entity/state/IdleTree.java +++ b/src/main/java/electrosphere/entity/state/IdleTree.java @@ -54,19 +54,19 @@ public class IdleTree { } public void simulate(){ - float velocity = CreatureUtils.getVelocity(parent); - float acceleration = CreatureUtils.getAcceleration(parent); - float maxNaturalVelocity = CreatureUtils.getMaxNaturalVelocity(parent); Actor entityActor = EntityUtils.getActor(parent); - Vector3f position = EntityUtils.getPosition(parent); - Vector3f movementVector = CreatureUtils.getMovementVector(parent); - Vector3f newPosition; boolean hasMovementTree = parent.getDataKeys().contains(EntityDataStrings.DATA_STRING_MOVEMENT_BT); - MovementTree movementTree = CreatureUtils.getEntityMovementTree(parent); + MovementTree movementTree = null; + if(hasMovementTree){ + movementTree = CreatureUtils.getEntityMovementTree(parent); + } boolean hasAttackTree = parent.getDataKeys().contains(EntityDataStrings.ATTACK_TREE); - AttackTree attackTree = CreatureUtils.getAttackTree(parent); + AttackTree attackTree = null; + if(hasAttackTree){ + attackTree = CreatureUtils.getAttackTree(parent); + } //parse attached network messages for(EntityMessage message : networkMessageQueue){ diff --git a/src/main/java/electrosphere/entity/types/collision/CollisionObjUtils.java b/src/main/java/electrosphere/entity/types/collision/CollisionObjUtils.java index b10ae263..d956c95e 100644 --- a/src/main/java/electrosphere/entity/types/collision/CollisionObjUtils.java +++ b/src/main/java/electrosphere/entity/types/collision/CollisionObjUtils.java @@ -4,6 +4,7 @@ import electrosphere.collision.dispatch.CollisionObject; import electrosphere.collision.shapes.CylinderShape; import electrosphere.entity.Entity; import electrosphere.entity.EntityDataStrings; +import electrosphere.entity.EntityUtils; import electrosphere.entity.types.attach.AttachUtils; import electrosphere.game.collision.PhysicsUtils; import electrosphere.game.collision.collidable.Collidable; @@ -66,6 +67,30 @@ public class CollisionObjUtils { return rVal; } + public static Entity spawnCollisionCylinder(Vector3f scale, Vector3f position, Quaternionf rotation){ + Entity rVal = new Entity(); + + CollisionObject cubeObject = PhysicsUtils.getCylinderObject(scale); + javax.vecmath.Matrix4f planeTransform = new javax.vecmath.Matrix4f( + PhysicsUtils.jomlToVecmathQuaternionf(rotation), + PhysicsUtils.jomlToVecmathVector3f(position), + 1.0f); + cubeObject.setWorldTransform(new electrosphere.linearmath.Transform(planeTransform)); + Collidable collidable = new Collidable(rVal, Collidable.TYPE_STRUCTURE); + Globals.collisionEngine.registerCollisionObject(cubeObject, collidable); + Globals.collisionEngine.registerStructurePhysicsEntity(rVal); + + rVal.putData(EntityDataStrings.COLLISION_ENTITY_TYPE_CYLINDER, true); + rVal.putData(EntityDataStrings.DATA_STRING_POSITION, position); + rVal.putData(EntityDataStrings.DATA_STRING_ROTATION, rotation); + rVal.putData(EntityDataStrings.DATA_STRING_SCALE, scale); + rVal.putData(EntityDataStrings.COLLISION_ENTITY_COLLISION_OBJECT, cubeObject); + rVal.putData(EntityDataStrings.COLLISION_ENTITY_COLLIDABLE, collidable); + + Globals.entityManager.registerEntity(rVal); + return rVal; + } + public static Entity attachCollisionPlane(Vector3f scale, Vector3f position, Quaternionf rotation, Entity parent){ Entity rVal = spawnCollisionPlane(scale, position, rotation); @@ -83,5 +108,23 @@ public class CollisionObjUtils { return rVal; } + public static Entity attachCollisionCylinder(Vector3f scale, Vector3f position, Quaternionf rotation, Entity parent){ + Entity rVal = spawnCollisionCylinder(scale, position, rotation); + + AttachUtils.attachEntityToEntity(parent, rVal); + + return rVal; + } + + public static CollisionObject getCollisionBody(Entity e){ + return (CollisionObject)e.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); + } + + public static void positionCharacter(Entity e, Vector3f position){ + EntityUtils.getPosition(e).set(position); + Quaternionf rotation = EntityUtils.getRotation(e); + CollisionObject body = getCollisionBody(e); + PhysicsUtils.setRigidBodyTransform(position, rotation, body); + } } diff --git a/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java b/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java index 57609a79..60e2d635 100644 --- a/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java +++ b/src/main/java/electrosphere/entity/types/creature/CreatureUtils.java @@ -83,7 +83,7 @@ public class CreatureUtils { PhysicsObject physicsTemplate = rawType.getPhysicsObject(); switch(physicsTemplate.getType()){ case "CYLINDER": - CollisionObject rigidBody = PhysicsUtils.getCylinderBody(1f, new Vector3f(physicsTemplate.getDimension1(),physicsTemplate.getDimension2(),physicsTemplate.getDimension3())); + CollisionObject rigidBody = PhysicsUtils.getCylinderObject(new Vector3f(physicsTemplate.getDimension1(),physicsTemplate.getDimension2(),physicsTemplate.getDimension3())); Collidable collidable = new Collidable(rVal, Collidable.TYPE_CREATURE); rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY, rigidBody); rVal.putData(EntityDataStrings.PHYSICS_COLLISION_BODY_OFFSET, new Vector3f(physicsTemplate.getOffsetX(),physicsTemplate.getOffsetY(),physicsTemplate.getOffsetZ())); @@ -228,14 +228,7 @@ public class CreatureUtils { return (IdleTree)e.getData(EntityDataStrings.IDLE_TREE); } - public static CollisionObject getCreatureRigidBody(Entity e){ - return (CollisionObject)e.getData(EntityDataStrings.PHYSICS_COLLISION_BODY); - } - public static void positionCharacter(Entity e, Vector3f position){ - EntityUtils.getPosition(e).set(position); - Quaternionf rotation = EntityUtils.getRotation(e); - CollisionObject body = getCreatureRigidBody(e); - PhysicsUtils.setRigidBodyTransform(position, rotation, body); - } + + } diff --git a/src/main/java/electrosphere/entity/types/foliage/FoliageUtils.java b/src/main/java/electrosphere/entity/types/foliage/FoliageUtils.java new file mode 100644 index 00000000..34a7e8c0 --- /dev/null +++ b/src/main/java/electrosphere/entity/types/foliage/FoliageUtils.java @@ -0,0 +1,64 @@ +package electrosphere.entity.types.foliage; + +import electrosphere.collision.dispatch.CollisionObject; +import electrosphere.entity.Entity; +import electrosphere.entity.EntityDataStrings; +import electrosphere.entity.EntityUtils; +import electrosphere.entity.state.IdleTree; +import electrosphere.entity.types.collision.CollisionObjUtils; +import electrosphere.game.collision.PhysicsUtils; +import electrosphere.game.collision.collidable.Collidable; +import electrosphere.game.config.foliage.type.FoliageType; +import electrosphere.game.config.foliage.type.PhysicsObject; +import electrosphere.main.Globals; +import electrosphere.renderer.ActorUtils; +import java.util.List; +import org.joml.Matrix4f; +import org.joml.Quaternionf; +import org.joml.Vector3f; +import org.joml.Vector4f; + +/** + * + * @author amaterasu + */ +public class FoliageUtils { + + + public static Entity spawnBasicFoliage(String type){ + FoliageType rawType = Globals.gameConfigCurrent.getFoliageMap().getFoliage(type); + Entity rVal = EntityUtils.spawnDrawableEntity(rawType.getModelPath()); +// if(rawType.getPhysicsObjects() != null){ +// List physicsObjects = rawType.getPhysicsObjects(); +// for(PhysicsObject physicsTemplate : physicsObjects){ +// switch(physicsTemplate.getType()){ +// case "CYLINDER": +//// Matrix4f rotationTransform = new Matrix4f().rotate(rotation); +//// Vector4f rotatedPosition = rotationTransform.transform(new Vector4f(physicsTemplate.(),physicsTemplate.getPositionY(),physicsTemplate.getPositionZ(),1.0f)); +//// Vector3f cubePosition = new Vector3f(position).add(rotatedPosition.x,rotatedPosition.y,rotatedPosition.z); +//// Quaternionf cubeRotation = new Quaternionf(rotation).mul(new Quaternionf(physicsTemplate.getRotationX(),template.getRotationY(),physicsTemplate.getRotationZ(),physicsTemplate.getRotationW())).normalize(); +// CollisionObjUtils.attachCollisionCube(new Vector3f(1,1,1), position, rotation, rVal); +// break; +// } +// } +// } + for(String token : rawType.getTokens()){ + switch(token){ + case "BLENDER_TRANSFORM": + ActorUtils.applyBlenderTransformer(rVal); + break; + case "BLENDER_ROTATION": + ActorUtils.applyBlenderRotation(rVal); + break; + } + } + //idle tree & generic stuff all creatures have +// rVal.putData(EntityDataStrings.IDLE_TREE, new IdleTree(rVal)); +// Globals.entityManager.registerCreatureEntity(rVal); + rVal.putData(EntityDataStrings.FOLIAGE_IS_FOLIAGE, true); + rVal.putData(EntityDataStrings.FOLIAGE_TYPE, type); + return rVal; + } + + +} diff --git a/src/main/java/electrosphere/game/collision/PhysicsUtils.java b/src/main/java/electrosphere/game/collision/PhysicsUtils.java index d6a99fd2..f38431b9 100644 --- a/src/main/java/electrosphere/game/collision/PhysicsUtils.java +++ b/src/main/java/electrosphere/game/collision/PhysicsUtils.java @@ -306,15 +306,10 @@ public class PhysicsUtils { // return cylinderRigidBody; // } - public static CollisionObject getCylinderBody(float mass, Vector3f dimensions){ + public static CollisionObject getCylinderObject(Vector3f dimensions){ CylinderShape cylinderShape = new CylinderShape(jomlToVecmathVector3f(dimensions)); -// DefaultMotionState defaultMotionState = new DefaultMotionState(new Transform(new javax.vecmath.Matrix4f(new javax.vecmath.Quat4f(0,1,0,1),new javax.vecmath.Vector3f(0,0,0),1.0f))); -// RigidBodyConstructionInfo cylinderRigidBodyCI = new RigidBodyConstructionInfo(mass, defaultMotionState, cylinderShape); -// RigidBody cylinderRigidBody = new RigidBody(cylinderRigidBodyCI); CollisionObject cylinderCollisionObject = new CollisionObject(); cylinderCollisionObject.setCollisionShape(cylinderShape); -// cylinderRigidBody.setAngularFactor(1.0f); -// cylinderRigidBody.setFriction(0.8f); return cylinderCollisionObject; } diff --git a/src/main/java/electrosphere/game/config/Config.java b/src/main/java/electrosphere/game/config/Config.java index b91e8d45..a13424e0 100644 --- a/src/main/java/electrosphere/game/config/Config.java +++ b/src/main/java/electrosphere/game/config/Config.java @@ -1,6 +1,7 @@ package electrosphere.game.config; import electrosphere.game.config.creature.type.model.CreatureTypeMap; +import electrosphere.game.config.foliage.type.model.FoliageTypeMap; import electrosphere.game.config.item.type.model.ItemTypeMap; import electrosphere.game.config.structure.type.model.StructureTypeMap; import electrosphere.util.FileLoadingUtils; @@ -14,12 +15,14 @@ public class Config { CreatureTypeMap creatureMap; StructureTypeMap structureTypeMap; ItemTypeMap itemMap; + FoliageTypeMap foliageMap; public static Config loadDefaultConfig(){ Config config = new Config(); config.creatureMap = FileLoadingUtils.loadObjectFromAssetPath("Data/creatures.json", CreatureTypeMap.class); config.itemMap = FileLoadingUtils.loadObjectFromAssetPath("Data/items.json", ItemTypeMap.class); config.structureTypeMap = FileLoadingUtils.loadObjectFromAssetPath("Data/structures.json", StructureTypeMap.class); + config.foliageMap = FileLoadingUtils.loadObjectFromAssetPath("Data/foliage.json", FoliageTypeMap.class); return config; } @@ -34,5 +37,9 @@ public class Config { public ItemTypeMap getItemMap() { return itemMap; } + + public FoliageTypeMap getFoliageMap() { + return foliageMap; + } } diff --git a/src/main/java/electrosphere/game/config/foliage/type/FoliageType.java b/src/main/java/electrosphere/game/config/foliage/type/FoliageType.java new file mode 100644 index 00000000..265f2158 --- /dev/null +++ b/src/main/java/electrosphere/game/config/foliage/type/FoliageType.java @@ -0,0 +1,32 @@ +package electrosphere.game.config.foliage.type; + +import java.util.List; + +/** + * + * @author amaterasu + */ +public class FoliageType { + + String name; + String modelPath; + List physicsObjects; + List tokens; + + public String getName() { + return name; + } + + public String getModelPath() { + return modelPath; + } + + public List getPhysicsObjects() { + return physicsObjects; + } + + public List getTokens() { + return tokens; + } + +} diff --git a/src/main/java/electrosphere/game/config/foliage/type/PhysicsObject.java b/src/main/java/electrosphere/game/config/foliage/type/PhysicsObject.java new file mode 100644 index 00000000..50f1915b --- /dev/null +++ b/src/main/java/electrosphere/game/config/foliage/type/PhysicsObject.java @@ -0,0 +1,51 @@ +package electrosphere.game.config.foliage.type; + +import electrosphere.game.config.creature.type.*; + +/** + * + * @author amaterasu + */ +public class PhysicsObject { + + String type; + + float dimension1; + float dimension2; + float dimension3; + + float offsetX; + float offsetY; + float offsetZ; + + public String getType() { + return type; + } + + public float getDimension1() { + return dimension1; + } + + public float getDimension2() { + return dimension2; + } + + public float getDimension3() { + return dimension3; + } + + public float getOffsetX() { + return offsetX; + } + + public float getOffsetY() { + return offsetY; + } + + public float getOffsetZ() { + return offsetZ; + } + + + +} diff --git a/src/main/java/electrosphere/game/config/foliage/type/model/FoliageTypeMap.java b/src/main/java/electrosphere/game/config/foliage/type/model/FoliageTypeMap.java new file mode 100644 index 00000000..0a564554 --- /dev/null +++ b/src/main/java/electrosphere/game/config/foliage/type/model/FoliageTypeMap.java @@ -0,0 +1,27 @@ +package electrosphere.game.config.foliage.type.model; + +import electrosphere.game.config.foliage.type.FoliageType; +import java.util.List; + +/** + * + * @author amaterasu + */ +public class FoliageTypeMap { + + List foliageList; + + public List getFoliageList() { + return foliageList; + } + + public FoliageType getFoliage(String name){ + for(FoliageType foliage : foliageList){ + if(foliage.getName().matches(name)){ + return foliage; + } + } + return null; + } + +} diff --git a/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainManager.java b/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainManager.java index c242016f..144e1c31 100644 --- a/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainManager.java +++ b/src/main/java/electrosphere/game/server/terrain/manager/ServerTerrainManager.java @@ -317,4 +317,8 @@ public class ServerTerrainManager { } } + public long getRandomizerAtPoint(int worldX, int worldY){ + return model.getRad5RandomizerValuesAtPosition(worldX, worldY)[2][2]; + } + } diff --git a/src/main/java/electrosphere/game/server/world/ServerWorldData.java b/src/main/java/electrosphere/game/server/world/ServerWorldData.java index 1c31ac47..580ac0ae 100644 --- a/src/main/java/electrosphere/game/server/world/ServerWorldData.java +++ b/src/main/java/electrosphere/game/server/world/ServerWorldData.java @@ -42,6 +42,7 @@ public class ServerWorldData { int worldSizeDiscrete; int dynamicInterpolationRatio; float randomDampener; + boolean isArena = false; public static ServerWorldData createArenaWorld(){ ServerWorldData rVal = new ServerWorldData(); @@ -51,6 +52,7 @@ public class ServerWorldData { rVal.dynamicInterpolationRatio = 100; rVal.worldSizeDiscrete = 2; rVal.randomDampener = 0.0f; + rVal.isArena = true; return rVal; } @@ -97,6 +99,10 @@ public class ServerWorldData { public float getRelativeLocation(float real, int world){ return real - (world * dynamicInterpolationRatio); } + + public boolean isArena() { + return isArena; + } diff --git a/src/main/java/electrosphere/game/server/world/datacell/DataCellManager.java b/src/main/java/electrosphere/game/server/world/datacell/DataCellManager.java index 63ccc037..dc455ee7 100644 --- a/src/main/java/electrosphere/game/server/world/datacell/DataCellManager.java +++ b/src/main/java/electrosphere/game/server/world/datacell/DataCellManager.java @@ -4,6 +4,7 @@ import electrosphere.entity.Entity; import electrosphere.entity.EntityUtils; import electrosphere.game.collision.CommonWorldData; import electrosphere.game.server.world.ServerWorldData; +import electrosphere.logger.LoggerInterface; import electrosphere.main.Globals; import electrosphere.net.parser.net.message.NetworkMessage; import electrosphere.net.server.Player; @@ -40,12 +41,12 @@ public class DataCellManager { x >= 0 && x < discreteWorldSize && y >= 0 && y < discreteWorldSize ){ - System.out.println("Add player to " + x + " " + y); + LoggerInterface.loggerEngine.DEBUG("DataCellManager: Add player to " + x + " " + y); if(dataCells[x][y] != null){ dataCells[x][y].addPlayer(player); } else { //create data cell - dataCells[x][y] = new ServerDataCell(); + dataCells[x][y] = ServerDataCell.loadCellAtWorldCoord(x, y); //add player dataCells[x][y].addPlayer(player); } @@ -91,7 +92,7 @@ public class DataCellManager { dataCells[x][y].addPlayer(player); } else { //create data cell - dataCells[x][y] = new ServerDataCell(); + dataCells[x][y] = ServerDataCell.loadCellAtWorldCoord(x, y); //add player dataCells[x][y].addPlayer(player); } diff --git a/src/main/java/electrosphere/game/server/world/datacell/EnvironmentGenerator.java b/src/main/java/electrosphere/game/server/world/datacell/EnvironmentGenerator.java new file mode 100644 index 00000000..ed61c9cc --- /dev/null +++ b/src/main/java/electrosphere/game/server/world/datacell/EnvironmentGenerator.java @@ -0,0 +1,34 @@ +package electrosphere.game.server.world.datacell; + +import electrosphere.entity.Entity; +import electrosphere.entity.EntityUtils; +import electrosphere.entity.types.collision.CollisionObjUtils; +import electrosphere.entity.types.foliage.FoliageUtils; +import electrosphere.main.Globals; +import java.util.List; +import java.util.Random; +import org.joml.Quaternionf; +import org.joml.Vector3f; + +/** + * + * @author amaterasu + */ +public class EnvironmentGenerator { + + + public static void generatePlains(List entityList, int worldX, int worldY, long randomizer){ + Random rand = new Random(randomizer); + int targetNum = (int)(rand.nextFloat() * 10) + 10; + for(int i = 0; i < targetNum; i++){ + Entity newTree = FoliageUtils.spawnBasicFoliage("FallOak1"); + entityList.add(newTree); + float posX = worldX * Globals.serverWorldData.getDynamicInterpolationRatio() + (float)(rand.nextFloat() * Globals.serverWorldData.getDynamicInterpolationRatio()); + float posZ = worldY * Globals.serverWorldData.getDynamicInterpolationRatio() + (float)(rand.nextFloat() * Globals.serverWorldData.getDynamicInterpolationRatio()); + float posY = Globals.serverTerrainManager.getHeightAtPosition(posX, posZ); +// System.out.println("Spawning tree at: " + posX + "," + posY + "," + posZ); +// CollisionObjUtils.positionCharacter(newTree, new Vector3f(posX,posY,posZ)); + EntityUtils.getPosition(newTree).set(posX,posY,posZ); + } + } +} diff --git a/src/main/java/electrosphere/game/server/world/datacell/ServerDataCell.java b/src/main/java/electrosphere/game/server/world/datacell/ServerDataCell.java index fe252223..05b14d2c 100644 --- a/src/main/java/electrosphere/game/server/world/datacell/ServerDataCell.java +++ b/src/main/java/electrosphere/game/server/world/datacell/ServerDataCell.java @@ -6,7 +6,6 @@ import electrosphere.entity.types.item.ItemUtils; import electrosphere.entity.types.structure.StructureUtils; import electrosphere.net.server.Player; import electrosphere.game.server.character.Character; -import electrosphere.game.server.world.virtualcell.VirtualCell; import electrosphere.main.Globals; import electrosphere.net.parser.net.message.NetworkMessage; import java.util.LinkedList; @@ -30,10 +29,21 @@ public class ServerDataCell { * first comes into range of the cell. * @param virtualCell */ - public ServerDataCell(){ + ServerDataCell(){ } + + public static ServerDataCell loadCellAtWorldCoord(int worldX, int worldY){ + ServerDataCell rVal = new ServerDataCell(); + if(!Globals.serverWorldData.isArena()){ //in other words, if not arena mode + //if on disk (has already been generated) + //else create from scratch + EnvironmentGenerator.generatePlains(rVal.loadedEntities, worldX, worldY, Globals.serverTerrainManager.getRandomizerAtPoint(worldX, worldY)); + } + return rVal; + } + /** * Add a player to the current datacell. This should be done if a player moves * into close enough proximity with the cell that they are concerned with diff --git a/src/main/java/electrosphere/game/server/world/virtualcell/VirtualCell.java b/src/main/java/electrosphere/game/server/world/virtualcell/VirtualCell.java deleted file mode 100644 index e067951e..00000000 --- a/src/main/java/electrosphere/game/server/world/virtualcell/VirtualCell.java +++ /dev/null @@ -1,31 +0,0 @@ -package electrosphere.game.server.world.virtualcell; - -import java.util.List; -import electrosphere.game.server.character.Character; -import java.util.LinkedList; - -/** - * Container of virtual character data related to a position. The intention isn't - * to have it perform simulation itself. - */ -public class VirtualCell { - - List characterList = new LinkedList(); - - - public void addCharacter(Character c){ - if(!characterList.contains(c)){ - characterList.add(c); - } - } - - public void removeCharacter(Character c){ - characterList.remove(c); - } - - public List getCharacters(){ - return characterList; - } - - -} diff --git a/src/main/java/electrosphere/game/server/world/virtualcell/VirtualCellManager.java b/src/main/java/electrosphere/game/server/world/virtualcell/VirtualCellManager.java deleted file mode 100644 index 4f122c68..00000000 --- a/src/main/java/electrosphere/game/server/world/virtualcell/VirtualCellManager.java +++ /dev/null @@ -1,15 +0,0 @@ -package electrosphere.game.server.world.virtualcell; - -/** - * - * @author amaterasu - */ -public class VirtualCellManager { - - VirtualCell[][] virtualCells; - - public VirtualCellManager() { - - } - -} diff --git a/src/main/java/electrosphere/main/Globals.java b/src/main/java/electrosphere/main/Globals.java index 1245eb9e..5216b323 100644 --- a/src/main/java/electrosphere/main/Globals.java +++ b/src/main/java/electrosphere/main/Globals.java @@ -29,7 +29,6 @@ import electrosphere.game.server.terrain.manager.ServerTerrainManager; import electrosphere.game.server.town.Town; import electrosphere.game.server.world.ServerWorldData; import electrosphere.game.server.world.datacell.DataCellManager; -import electrosphere.game.server.world.virtualcell.VirtualCellManager; import electrosphere.game.state.MicroSimulation; import electrosphere.menu.Menu; import electrosphere.net.client.ClientNetworking; @@ -114,7 +113,6 @@ public class Globals { //current world // public static ServerWorldData serverWorldData; - public static VirtualCellManager virtualCellManager; public static DataCellManager dataCellManager; // diff --git a/src/main/java/electrosphere/net/server/ServerConnectionHandler.java b/src/main/java/electrosphere/net/server/ServerConnectionHandler.java index 76336c49..7db746ab 100644 --- a/src/main/java/electrosphere/net/server/ServerConnectionHandler.java +++ b/src/main/java/electrosphere/net/server/ServerConnectionHandler.java @@ -5,6 +5,7 @@ import electrosphere.entity.Entity; import electrosphere.entity.EntityUtils; import electrosphere.entity.types.item.ItemUtils; import electrosphere.entity.types.attach.AttachUtils; +import electrosphere.entity.types.collision.CollisionObjUtils; import electrosphere.logger.LoggerInterface; import electrosphere.main.Globals; import electrosphere.main.Main; @@ -98,7 +99,7 @@ public class ServerConnectionHandler implements Runnable { //spawn player in world Entity newPlayerCharacter = CreatureUtils.spawnBasicCreature("Human"); playerCharacterID = newPlayerCharacter.getId(); - CreatureUtils.positionCharacter(newPlayerCharacter, new Vector3f(Globals.spawnPoint.x,Globals.spawnPoint.y,Globals.spawnPoint.z)); + CollisionObjUtils.positionCharacter(newPlayerCharacter, new Vector3f(Globals.spawnPoint.x,Globals.spawnPoint.y,Globals.spawnPoint.z)); //attach player object to player character newPlayerObject.setPlayerEntity(newPlayerCharacter); newPlayerObject.setWorldX(Globals.serverWorldData.convertRealToChunkSpace(Globals.spawnPoint.x)); diff --git a/src/main/java/electrosphere/renderer/ActorUtils.java b/src/main/java/electrosphere/renderer/ActorUtils.java index 7f801feb..2eef4b98 100644 --- a/src/main/java/electrosphere/renderer/ActorUtils.java +++ b/src/main/java/electrosphere/renderer/ActorUtils.java @@ -23,5 +23,9 @@ public class ActorUtils { EntityUtils.getScale(actorEntity).set(0.005f); } + public static void applyBlenderRotation(Entity actorEntity){ + EntityUtils.getRotation(actorEntity).rotateLocalX((float)-Math.PI/2); + } + }