@wezrule: Yes I mean using setWalkDirection
. I did turn the physics debug on and the CharacterControl also just disappear and reappear. No I have not try the bettercharactercontroller yet but will try it now (Once the electricity is back -.- , sending posts from my laptop). Is the new charactercontroller called bettercharactercontroller? or something else?(Will google this till get your reply :google: ) Since you mentioned you only ever had 1 main charactercontrol, then does having multiple characterControl cause problem? I used the character control because for me it seems easy to move the NPC cubes, just point them to a Vector location and then they just move there smoothly. 
Ahhh touche @pspeed and here I thought what a good job I did XD . Any way here is the classes and codes for the cube. I am really sorry for so many classes but that’s is the only way I think I can do make the codes much more understandable. Main.java class can be ignored since it only calls for setup but if you want to check it I still provided it. If there are any problems then I would assume it to be in class NPCGenerator.java, TownPeople.java and maybe BasicCharacter.java(though this class only sets up model, node, position and characterControl) .
Ok here is the code(Posting code and classes related to the cubes):
Main.java (This is where every setup is called especially the generators)
[java]
package Main;
import Character.BasicCharacter;
import Character.TownPeople;
import Character.Player;
import Generator.EnemyGenerator;
import Generator.NPCGenerator;
import Generator.QuestGenerator;
import Generator.StoneGenerator;
import Generator.StructureGenerator;
import Generator.TreeGenerator;
import Object.Ground;
import Object.TV;
import Obstacle.Inn;
import Obstacle.LumberCamp;
import Obstacle.Tree;
import Other.Effect;
import Other.Map;
import Other.PlaneConvertion;
import Other.QuestLog;
import Other.Resource;
import com.jme3.app.SimpleApplication;
import com.jme3.bullet.BulletAppState;
import com.jme3.input.ChaseCamera;
import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.niftygui.NiftyJmeDisplay;
import com.jme3.renderer.Camera;
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.texture.FrameBuffer;
import com.jme3.texture.Image.Format;
import com.jme3.texture.Texture.MagFilter;
import com.jme3.texture.Texture.MinFilter;
import com.jme3.texture.Texture2D;
import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.elements.Element;
import de.lessvoid.nifty.elements.render.TextRenderer;
/**
-
test
-
@author kamran
*/
public class Main extends SimpleApplication {
Ground ground, townGround;
Player player;
static TreeGenerator treeGenerator;
static StoneGenerator stoneGenerator;
static StructureGenerator structureGenerator;
static NPCGenerator npcGenerator;
static QuestGenerator questGenerator;
static EnemyGenerator enemyGenerator;
static Resource res;
static QuestLog questLog;
Map map;
PlaneConvertion planeConvertion;
TV tv;
Effect effect;
public Nifty nifty, niftyMesh;
public static String state = “None”;
public ViewPort viewPortMesh;
private BulletAppState bulletAppState;
private AmbientLight al;
private DirectionalLight dl;
private ChaseCamera cc;
private int loadValue = 0, barWidth = 0, loadOffset = 0;
public static void main(String[] args) {
Main app = new Main();
app.start();
}
@Override
public void simpleInitApp() {
viewPort.setBackgroundColor(new ColorRGBA(0.7f,0.8f,1f,1f));
flyCam.setMoveSpeed(10);
// setDisplayFps(false);
// setDisplayStatView(false);
inputManager.deleteMapping( SimpleApplication.INPUT_MAPPING_EXIT );
setupLight();
// setupMap();
loadGUI();
setupAvatar();
// setupQuestLog();
// setupPlayer();
// setupResource();
// setupGround();
// setupCollision();
// setupTreeGenerator();
// setupStoneGenerator();
// setupStructureGenerator();
// setupNPCGenerator();
// setupQuestGenerator();
// setupEnemyGenerator();
// setupPlaneConvertion();
// setupCamera();
}
//////////////////////Generators/////////////////////
private void setupTreeGenerator(){
treeGenerator = new TreeGenerator(assetManager, bulletAppState, res);
rootNode.attachChild(treeGenerator.rootNode);
}
private void setupStoneGenerator(){
stoneGenerator = new StoneGenerator(assetManager, bulletAppState, res);
rootNode.attachChild(stoneGenerator.rootNode);
}
private void setupStructureGenerator(){
structureGenerator = new StructureGenerator(assetManager, bulletAppState,
res);
rootNode.attachChild(structureGenerator.rootNode);
}
private void setupNPCGenerator(){
npcGenerator = new NPCGenerator(assetManager, bulletAppState,
structureGenerator, treeGenerator,
stoneGenerator,
player,
map,
res);
rootNode.attachChild(npcGenerator.rootNode);
}
private void setupQuestGenerator(){
questGenerator = new QuestGenerator(assetManager, bulletAppState, nifty,
questLog, res);
rootNode.attachChild(questGenerator.rootNode);
}
private void setupEnemyGenerator(){
enemyGenerator = new EnemyGenerator(assetManager, bulletAppState, player,
npcGenerator);
rootNode.attachChild(enemyGenerator.rootNode);
}
////////////////////////Screens//////////////////////
public void loadGUI(){
flyCam.setDragToRotate(true);
NiftyJmeDisplay niftyDisplay = new NiftyJmeDisplay(assetManager,
inputManager,
audioRenderer,
viewPort);
nifty = niftyDisplay.getNifty();
nifty.fromXml("Interface/GameGUI.xml", "mainmenu");
guiViewPort.addProcessor(niftyDisplay);
}
public void loadInternalScreen(String newScreen){
System.out.println(“Before Internal Screen”);
player.enableInput = true;
cc.setDragToRotate(false);
nifty.gotoScreen(newScreen);
System.out.println(“In Internal Screen”);
}
///////////////////////Nifty Methods/////////////////
public void placeStructure(String type){
// if(type.equals(“Inn”)){
// structureGenerator.loadTempModel(“Inn”);
// }
structureGenerator.loadTempModel(type);
player.buildMode = true;
// inputManager.setCursorVisible(false);
nifty.gotoScreen(“blank”);
player.structure = true;
}
public void startGame(){
state = "Load";
}
public void changeToHud(){
player.changeToHud = true;
}
public void checkLog(){
int id = Integer.parseInt(getElement("textQuestId").getRenderer(TextRenderer.class).getOriginalText());
if(!questLog.isActive(id)){
questLog.makeActive(id);
}
questGenerator.setupCondition(id);
changeToHud();
}
//////////////////////////END////////////////////////
private void setupAvatar(){
// tv = new TV(assetManager, new Vector3f(1.5f, -1, 6), “TV”, 1.52f);
tv = new TV(assetManager, new Vector3f(0, 0, 0), “TV”, -0.52f);
tv.rootNode.setLocalTranslation(new Vector3f(1.5f, -1, 6));
// rootNode.attachChild(tv.rootNode);
viewPortMesh = renderManager.createPreView("NiftyView", new Camera(1024, 768));
viewPortMesh.setClearFlags(true, true, true);
NiftyJmeDisplay niftyDisplay = new NiftyJmeDisplay(assetManager,
inputManager,
audioRenderer,
viewPortMesh);
niftyMesh = niftyDisplay.getNifty();
niftyMesh.fromXml("Interface/ProfileInfo.xml", "profile");
viewPortMesh.addProcessor(niftyDisplay);
Texture2D depthTex = new Texture2D(1024, 768, Format.Depth);
FrameBuffer fb = new FrameBuffer(1024, 768, 1);
fb.setDepthTexture(depthTex);
Texture2D tex = new Texture2D(1024, 768, Format.RGBA8);
tex.setMinFilter(MinFilter.Trilinear);
tex.setMagFilter(MagFilter.Bilinear);
fb.setColorTexture(tex);
viewPortMesh.setClearFlags(true, true, true);
viewPortMesh.setOutputFrameBuffer(fb);
tv.matScreen.setTexture("ColorMap", tex);
rootNode.attachChild(tv.rootNode);
// Box b = new Box(new Vector3f(1, -0.04f, 6.045f), 0.95f, 0.95f, 0.01f);
// Geometry geom = new Geometry(“Box”, b);
// Material mat = new Material(assetManager, “Common/MatDefs/Misc/Unshaded.j3md”);
// mat.setTexture(“ColorMap”, tex);
// geom.setMaterial(mat);
// geom.rotate(0, -0.52f, 0);
// rootNode.attachChild(geom);
}
private void initGame(){
flyCam.setDragToRotate(false);
setupLight();
setupMap();
setupQuestLog();
setupPlayer();
setupResource();
setupGround();
setupCollision();
setupTreeGenerator();
setupStoneGenerator();
setupStructureGenerator();
setupNPCGenerator();
setupQuestGenerator();
setupEnemyGenerator();
setupPlaneConvertion();
setupCamera();
state = "Play";
nifty.gotoScreen("hud");
}
private void setupQuestLog(){
questLog = new QuestLog();
}
private void setupResource(){
res = new Resource(nifty, player);
}
private void setupPlaneConvertion(){
planeConvertion = new PlaneConvertion(inputManager);
}
private void setupCamera(){
cc = new ChaseCamera(cam, player.model, inputManager);
cc.setDragToRotate(false);
cc.setDefaultDistance(3);
cc.setMinDistance(3);
cc.setMaxDistance(4);
cc.setMinVerticalRotation(0.523f);
cc.setMaxVerticalRotation(0.785f);
}
private void setupMap(){
map = new Map();
}
private void setupPlayer(){
player = new Player(inputManager ,assetManager, "Player",
new Vector3f(2, 3, 0), 0, nifty);
rootNode.attachChild(player.rootNode);
}
private void setupGround(){
ground = new Ground(assetManager, Vector3f.ZERO, "Ground");
townGround = new Ground(assetManager, new Vector3f(0, 0.01f, 0), "TownGround");
rootNode.attachChild(ground.rootNode);
rootNode.attachChild(townGround.rootNode);
}
private void setupCollision(){
bulletAppState = new BulletAppState();
stateManager.attach(bulletAppState);
// bulletAppState.getPhysicsSpace().enableDebug(assetManager); //<-----for debugging only
bulletAppState.getPhysicsSpace().add(ground.rigid);
bulletAppState.getPhysicsSpace().add(townGround.rigid);
bulletAppState.getPhysicsSpace().add(player.control);
///////Temp Colision for testing/////
}
private void setupLight(){
al = new AmbientLight();
al.setColor(ColorRGBA.White.mult(1.3f));
rootNode.addLight(al);
dl = new DirectionalLight();
dl.setColor(ColorRGBA.White);
dl.setDirection(new Vector3f(2.8f,-2.8f,-2.8f).normalizeLocal());
rootNode.addLight(dl);
}
public Element getElement(final String id)
{
return nifty.getCurrentScreen().findElementByName(id);
}
public void exitNow(){
// stop();
System.exit(0);
}
@Override
public void simpleUpdate(float tpf) {
if(state.equals("Play")){
UpdatePlayer();
UpdateResource();
UpdateNPCGenerator();
UpdateQuestGenerator();
UpdateEnemyGenerator();
UpdateTreeGeneratro();
UpdateStoneGenerator();
UpdateStructureGenerator();
// effect.Update(); //<---------------------Test Effects
}else{
UpdateLoadMenu();
}
// if(state.equals(“Init”)){
// state = “None”;
// getElement(“barGlow”).setWidth((int)1);
// loadAmount = 1;
// initGame();
// }
if(state.equals("Load")){
nifty.gotoScreen("load");
flyCam.setDragToRotate(false);
state = "SetupMap";
barWidth = getElement("barGlow").getWidth();
loadOffset = barWidth / 14;
getElement("barGlow").setWidth(loadOffset);
rootNode.detachChild(tv.rootNode);
viewPortMesh = null;
niftyMesh.exit();
niftyMesh = null;
}
}
// setupLight();
// setupMap();
// setupQuestLog();
// setupPlayer();
// setupResource();
// setupGround();
// setupCollision();
// setupTreeGenerator();
// setupStoneGenerator();
// setupStructureGenerator();
// setupNPCGenerator();
// setupQuestGenerator();
// setupEnemyGenerator();
// setupPlaneConvertion();
// setupCamera();
private void UpdateLoadMenu(){
if(state.equals("SetupMap")){
setupMap();
state = "SetupQuestLog";
loadValue += loadOffset;
getElement("barGlow").setWidth(loadValue);
}else if(state.equals("SetupQuestLog")){
setupQuestLog();
state = "SetupPlayer";
loadValue += loadOffset;
getElement("barGlow").setWidth(loadValue);
}else if(state.equals("SetupPlayer")){
setupPlayer();
state = "SetupResource";
loadValue += loadOffset;
getElement("barGlow").setWidth(loadValue);
}else if(state.equals("SetupResource")){
setupResource();
state = "SetupGround";
loadValue += loadOffset;
getElement("barGlow").setWidth(loadValue);
}else if(state.equals("SetupGround")){
setupGround();
state = "SetupCollision";
loadValue += loadOffset;
getElement("barGlow").setWidth(loadValue);
}else if(state.equals("SetupCollision")){
setupCollision();
state = "SetupTreeGenerator";
loadValue += loadOffset;
getElement("barGlow").setWidth(loadValue);
}else if(state.equals("SetupTreeGenerator")){
setupTreeGenerator();
state = "SetupStoneGenerator";
loadValue += loadOffset;
getElement("barGlow").setWidth(loadValue);
}else if(state.equals("SetupStoneGenerator")){
setupStoneGenerator();
state = "SetupStructureGenerator";
loadValue += loadOffset;
getElement("barGlow").setWidth(loadValue);
}else if(state.equals("SetupStructureGenerator")){
setupStructureGenerator();
state = "SetupNPCGenerator";
loadValue += loadOffset;
getElement("barGlow").setWidth(loadValue);
}else if(state.equals("SetupNPCGenerator")){
setupNPCGenerator();
state = "SetupQuestGenerator";
loadValue += loadOffset;
getElement("barGlow").setWidth(loadValue);
}else if(state.equals("SetupQuestGenerator")){
setupQuestGenerator();
state = "SetupEnemyGenerator";
loadValue += loadOffset;
getElement("barGlow").setWidth(loadValue);
}else if(state.equals("SetupEnemyGenerator")){
setupEnemyGenerator();
state = "SetupPlaneConvertion";
loadValue += loadOffset;
getElement("barGlow").setWidth(loadValue);
}else if(state.equals("SetupPlaneConvertion")){
setupPlaneConvertion();
state = "SetupCamera";
loadValue += loadOffset;
getElement("barGlow").setWidth(barWidth);
}else if(state.equals("SetupCamera")){
setupCamera();
state = "Play";
nifty.gotoScreen("hud");
loadValue = 0;
// effect = new Effect(assetManager, new Vector3f(0, 0.5f, 0));
// effect.setupCharge();
// rootNode.attachChild(effect.rootNode);
}
}
private void UpdateStructureGenerator(){
structureGenerator.Update();
}
private void UpdateTreeGeneratro(){
treeGenerator.Update();
}
private void UpdateStoneGenerator(){
stoneGenerator.Update();
}
private void UpdateNPCGenerator(){
npcGenerator.Update();
}
private void UpdateQuestGenerator(){
questGenerator.Update();
if(player.interact){
player.interact = false;
if(questGenerator.npcCollidable(player.collidable)){
player.enableInput = false;
cc.setDragToRotate(true);
}
}
if(player.changeToHud){
nifty.gotoScreen("hud");
player.changeToHud = false;
player.enableInput = true;
cc.setDragToRotate(false);
res.UpdateAllValue();
}
}
private void UpdateEnemyGenerator(){
enemyGenerator.Update();
}
private void UpdateResource(){
res.Update();
}
private void UpdatePlayer(){
if(!player.structure){
player.Update(
cam.getDirection().clone().multLocal(player.speed),
cam.getLeft().clone().multLocal(player.speed),
cam.getRotation().clone());
if(player.build){
player.build = false;
if(!nifty.getCurrentScreen().getScreenId().equals("build")){
nifty.gotoScreen("build");
player.enableInput = false;
// player.buildMode = true;
cc.setDragToRotate(true);
}else{
nifty.gotoScreen(“hud”);
player.enableInput = true;
// player.buildMode = false;
cc.setDragToRotate(false);
}
}
}else{
planeConvertion.structureSpotPosition(cam, townGround.rootNode, structureGenerator);
if(player.leftClick){
structureGenerator.addStructure();
player.structure = false;
player.enableInput = true;
// player.buildMode = false;
cc.setDragToRotate(false);
nifty.gotoScreen(“hud”);
}
}
if(player.esc){
if(!nifty.getCurrentScreen().getScreenId().equals("right")){
nifty.gotoScreen("right");
player.enableInput = false;
cc.setDragToRotate(true);
player.esc = false;
}else{
nifty.gotoScreen("hud");
player.enableInput = true;
cc.setDragToRotate(false);
player.esc = false;
}
}
listener.setLocation(player.control.getPhysicsLocation());
listener.setRotation(cam.getRotation());
// System.out.println("Listener Location: " + listener.getLocation());
// System.out.println("Listener Rotation: " + listener.getRotation());
// getElement(“text”).getRenderer(TextRenderer.class).setText("Position: " + player.control.getPhysicsLocation());
}
@Override
public void simpleRender(RenderManager rm) {
//TODO: add render code
}
}
[/java]
NPCGenerator.java (This is the class where the cubes are created and their Updates are called)
[java]
package Generator;
import Character.Player;
import Character.TownPeople;
import Other.Map;
import Other.Resource;
import com.jme3.asset.AssetManager;
import com.jme3.bullet.BulletAppState;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
import de.lessvoid.nifty.Nifty;
import de.lessvoid.nifty.elements.Element;
import de.lessvoid.nifty.elements.render.TextRenderer;
import java.util.Random;
public class NPCGenerator {
public Node rootNode;
public TownPeople [] npcs;
private Resource res;
private AssetManager assetManager;
private BulletAppState bulletAppState;
private Random random;
public NPCGenerator(AssetManager assetManager,
BulletAppState bulletAppState, StructureGenerator sg,
TreeGenerator tg, StoneGenerator stng, Player player, Map map,
Resource res){
this.assetManager = assetManager;
this.bulletAppState = bulletAppState;
this.res = res;
rootNode = new Node("NPCGenerator");
random = new Random();
setupBasicNPC(sg, tg, stng, player, map);
}
private void setupBasicNPC(StructureGenerator sg,
TreeGenerator tg, StoneGenerator stng, Player player, Map map){
npcs = new TownPeople[6];
res.addResource("pop", npcs.length);
for(int i = 0; i < npcs.length; i++){
if(random.nextInt(10) < 5){
npcs[i] = new TownPeople(assetManager, "Blue",
new Vector3f(i, 1, i), i, sg, tg, stng, player, map);
}else{
npcs[i] = new TownPeople(assetManager, "Red",
new Vector3f(i, 1, i), i, sg, tg, stng, player, map);
}
rootNode.attachChild(npcs[i].rootNode);
bulletAppState.getPhysicsSpace().add(npcs[i].control);
}
}
private void removeNPC(int i){
rootNode.detachChild(npcs[i].rootNode);
bulletAppState.getPhysicsSpace().remove(npcs[i].control);
npcs[i].removed = true;
res.decreaseResource("pop", 1);
}
public void Update(){
for(int i = 0; i < npcs.length; i++){
if(npcs[i].alive){
npcs[i].Update();
}else if(!npcs[i].removed){
removeNPC(i);
}
}
}
}
[/java]
BasicCharacter.java (This is where the cube model and characterControl is created. This class is mainly for setting up the Nodes, Spatial, Position and CharacterControl)
[java]
package Character;
import Other.BasicSound;
import Other.Effect;
import com.jme3.asset.AssetManager;
import com.jme3.bullet.collision.shapes.CapsuleCollisionShape;
import com.jme3.bullet.control.CharacterControl;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
import java.awt.geom.CubicCurve2D;
public class BasicCharacter {
public Node rootNode, charNode;
public CharacterControl control;
public Spatial model;
public float speed, hp;
public boolean alive = true, removed = false;
protected Effect effect;
protected BasicSound sound;
protected AssetManager assetManager;
protected Vector3f position, walkDirection;
protected String type;
protected int number;
protected Material matModel;
public BasicCharacter(AssetManager assetManager, String type,
Vector3f position, int number){
this.assetManager = assetManager;
this.type = type;
this.position = position;
this.number = number;
walkDirection = new Vector3f(0, 0, 0);
rootNode = new Node(type + number);
charNode = new Node("Char " + type + number);
speed = 0;
init();
setupControl();
setupEffect();
setupSound();
charNode.attachChild(model);
charNode.setLocalTranslation(position);
charNode.addControl(control);
rootNode.attachChild(charNode);
}
private void setupSound(){
sound = new BasicSound(assetManager);
charNode.attachChild(sound.rootNode);
}
private void setupEffect(){
effect = new Effect(assetManager, new Vector3f(0, 0, 0));
charNode.attachChild(effect.rootNode);
}
private void init(){
if(type.equals("Player")){
model = assetManager.loadModel("Models/Cubes/Cube/Cube.mesh.j3o").clone();
model.scale(0.1f, 0.1f, 0.1f);
matModel = assetManager.loadMaterial("Materials/Cubes/Cube/Yellow.j3m");
model.setMaterial(matModel);
model.setLocalTranslation(new Vector3f(0, -0.15f, 0));
}
if(type.equals("Blue")){
model = assetManager.loadModel("Models/Cubes/Cube/Cube.mesh.j3o").clone();
model.scale(0.1f, 0.1f, 0.1f);
matModel = assetManager.loadMaterial("Materials/Cubes/Cube/Blue.j3m");
model.setMaterial(matModel);
model.setLocalTranslation(new Vector3f(0, -0.15f, 0));
}
if(type.equals("Red")){
model = assetManager.loadModel("Models/Cubes/Cube/Cube.mesh.j3o").clone();
model.scale(0.1f, 0.1f, 0.1f);
matModel = assetManager.loadMaterial("Materials/Cubes/Cube/Red.j3m");
model.setMaterial(matModel);
model.setLocalTranslation(new Vector3f(0, -0.15f, 0));
}
if(type.equals("Green")){
model = assetManager.loadModel("Models/Cubes/Cube/Cube.mesh.j3o").clone();
model.scale(0.1f, 0.1f, 0.1f);
matModel = assetManager.loadMaterial("Materials/Cubes/Cube/Green_Smile.j3m");
model.setMaterial(matModel);
model.setLocalTranslation(new Vector3f(0, -0.15f, 0));
}
if(type.equals("PurpleEnemy")){
model = assetManager.loadModel("Models/Cubes/Cube/Cube.mesh.j3o").clone();
model.scale(0.1f, 0.1f, 0.1f);
matModel = assetManager.loadMaterial("Materials/Cubes/Cube/Purple_Enemy.j3m");
model.setMaterial(matModel);
model.setLocalTranslation(new Vector3f(0, -0.15f, 0));
}
}
private void setupControl(){
CapsuleCollisionShape shape = new CapsuleCollisionShape(0.15f, 0.07f, 1);
control = new CharacterControl(shape, 0.05f);
control.setJumpSpeed(2f);
control.setGravity(4f);
control.setFallSpeed(5f);
// control.setPhysicsLocation(position);
}
public Spatial getModel(){
return model;
}
}
[/java]
TownPeople.java (This is the main cube class. This class defines the cubes. Here it loads the axe and other models needed for the cube)
[java]
package Character;
import Generator.StoneGenerator;
import Generator.StructureGenerator;
import Generator.TreeGenerator;
import Other.Brain;
import Other.Map;
import com.jme3.animation.LoopMode;
import com.jme3.asset.AssetManager;
import com.jme3.material.Material;
import com.jme3.math.Quaternion;
import com.jme3.math.Vector3f;
import com.jme3.scene.Spatial;
import java.util.Random;
public class TownPeople extends BasicAnimation{
public float townSize;
public String jobType = "None";
protected Vector3f target;
protected boolean move = false, isWorking = false, toggle = false;
protected float happiness = 50;
private Spatial weapon, jobObject;
private Brain brain;
private Random random;
private int ranX, ranZ, workTime = 1000;
private Material smile, sad, matWeapon, matJO;
private float jobRot = 0f;
public TownPeople(AssetManager assetManager, String type, Vector3f position,
int number, StructureGenerator structureGenerator,
TreeGenerator treeGenerator, StoneGenerator sg, Player player, Map map){
super(assetManager, type, position, number);
brain = new Brain(structureGenerator, treeGenerator, sg, player, map);
townSize = 5;
speed = 0.005f;
hp = 100;
random = new Random();
target = new Vector3f(0, 0, 0);
setupMaterials();
setupAllSound();
}
private void setupAllSound(){
sound.setupWalk();
sound.setupJump(1);
}
private void setupMaterials(){
if(type.equals("Blue")){
smile = assetManager.loadMaterial("Materials/Cubes/Cube/BlueSmile.j3m");
sad = assetManager.loadMaterial("Materials/Cubes/Cube/BlueSad.j3m");
}
if(type.equals("Red")){
smile = assetManager.loadMaterial("Materials/Cubes/Cube/RedSmile.j3m");
sad = assetManager.loadMaterial("Materials/Cubes/Cube/RedSad.j3m");
}
}
public void Update(){
brain.Update();
UpdateMovement();
brainStatus();
}
/**
* Updates the .updateModelBound of the object
*/
private void UpdateModel(){
model.updateModelBound();
}
/**
* Updates The Movement of the town cubes.
*/
public void UpdateMovement(){
//Random Movement
if(brain.state.equals("Random Movement")){
if(!move){
if(random.nextInt(1000) == 1){
move = true;
if(random.nextInt(6) < 3){
ranX = random.nextInt(5);
}else{
ranX = -1 * random.nextInt(5);
}
if(random.nextInt(6) < 3){
ranZ = random.nextInt(5);
}else{
ranZ = -1 * random.nextInt(5);
}
target = new Vector3f(ranX, 0, ranZ);
animWalk(1, 1.5f);
}
if(random.nextInt(1000) == 2){
control.jump();
animJump(1, 0.9f);
sound.jump.play();
}
}else{
Vector3f toTarget = target.subtract(control.getPhysicsLocation());
control.setWalkDirection(new Vector3f(toTarget.x * speed,
0,
toTarget.z * speed));
control.setViewDirection(new Vector3f(toTarget.x,
0,
toTarget.z));
sound.walk.play();
if(toTarget.length() < 2){
target.set(0,0,0);
control.setWalkDirection(target);
move = false;
animStand(1, 1);
}
}
if(!jobType.equals("None")){
if(workTime < 0){
workTime = 1000;
brain.gotoWork(jobType);
animWalk(1, 1.5f);
}
workTime--;
}
}
if(brain.state.equals("Map Out")){
brain.findMin();
if(!channel.getAnimationName().equals("Walk1")){
animWalk(1, 1.5f);
}
}
//Moves towards job site example: tree
if(brain.state.equals("Job Site")){
Vector3f toTarget = brain.target.subtract(control.getPhysicsLocation());
control.setWalkDirection(new Vector3f(toTarget.x * speed,
0,
toTarget.z * speed));
control.setViewDirection(new Vector3f(toTarget.x,
0,
toTarget.z));
sound.walk.play();
if(toTarget.length() < 1f){
if(brain.nextPos()){
target.set(0,0,0);
control.setWalkDirection(target);
animStand(1, 1);
brain.state = "Do Work";
}
// brain.decesionMode = true;
// doWork();
}
}
//Does Work
if(brain.state.equals("Do Work")){
doWork();
}
//Checks out the new place/s like structure/s
if(brain.state.equals("New Place")){
if(!channel.getAnimationName().equals("Walk1")){
animWalk(1, 1.5f);
}
Vector3f toTarget = brain.target.subtract(control.getPhysicsLocation());
control.setWalkDirection(new Vector3f(toTarget.x * speed,
0,
toTarget.z * speed));
control.setViewDirection(new Vector3f(toTarget.x,
0,
toTarget.z));
sound.walk.play();
if(toTarget.length() < 2){
target.set(0,0,0);
control.setWalkDirection(target);
brain.decesionMode = true;
animStand(1, 1f);
}
}
//Goes to Job Building
if(brain.state.equals("Job Building")){
if(!channel.getAnimationName().equals("Walk1")){
animWalk(1, 1.5f);
}
Vector3f toTarget = brain.target.subtract(control.getPhysicsLocation());
control.setWalkDirection(new Vector3f(toTarget.x * speed,
0,
toTarget.z * speed));
control.setViewDirection(new Vector3f(toTarget.x,
0,
toTarget.z));
sound.walk.play();
if(toTarget.length() < 2){
if(brain.prePos()){
brain.state = "Random Movement";
brain.addResource("None", 10);
brain.resetPath();
animStand(1, 1);
if(jobType.equals("Lumberjack") || jobType.equals("Miner")){
charNode.detachChild(jobObject);
}
}
}
}
}
private void brainStatus(){
if(brain.status.equals("Lower Happiness")){
lowerHappiness();
loadMaterial();
brain.status = "None";
}
if(brain.status.equals("Increase Happiness")){
increaseHappiness();
loadMaterial();
brain.status = "None";
}
if(brain.status.equals("Lumberjack")){
jobType = brain.status;
increaseHappiness();
loadMaterial();
loadWeapon();
loadJobObject();
brain.status = "None";
}
if(brain.status.equals("Miner")){
jobType = brain.status;
increaseHappiness();
loadMaterial();
loadWeapon();
loadJobObject();
brain.status = "None";
}
}
private void loadJobObject(){
if(jobType.equals("Lumberjack")){
jobObject = assetManager.loadModel("Models/Obstacles/Plank/Plank.mesh.j3o").clone();
jobObject.scale(0.07f, 0.005f, 0.5f);
matJO = assetManager.loadMaterial("Materials/Obstacles/Plank/Plank.j3m");
jobObject.setMaterial(matJO);
jobObject.setLocalTranslation(-0.08f, 0.05f, 0);
// charNode.attachChild(jobObject);
}
if(jobType.equals("Miner")){
jobObject = assetManager.loadModel("Models/Obstacles/Stone/Stone.mesh.j3o").clone();
jobObject.scale(0.05f, 0.05f, 0.05f);
matJO = assetManager.loadMaterial("Materials/Obstacles/Stone/Stone.j3m");
jobObject.setMaterial(matJO);
jobObject.setLocalTranslation(-0.08f, 0.05f, 0);
// charNode.attachChild(jobObject);
}
}
private void loadWeapon(){
if(brain.status.equals("Lumberjack")){
weapon = assetManager.loadModel("Models/Weapons/Axe/Axe.mesh.j3o").clone();
weapon.scale(0.01f, 0.15f, 0.01f);
matWeapon = assetManager.loadMaterial("Materials/Weapons/Axe/Axe.j3m");
weapon.setMaterial(matWeapon);
weapon.setLocalTranslation(0.1f, -0.1f, 0);
weapon.rotate(-0.79f, 0, 0);
charNode.attachChild(weapon);
effect.setupDebris2(Vector3f.ZERO);
sound.setupWood(1);
}
if(brain.status.equals("Miner")){
weapon = assetManager.loadModel("Models/Weapons/PickAxe/PickAxe.mesh.j3o").clone();
weapon.scale(0.01f, 0.15f, 0.01f);
matWeapon = assetManager.loadMaterial("Materials/Weapons/PickAxe/PickAxe.j3m");
weapon.setMaterial(matWeapon);
weapon.setLocalTranslation(0.1f, -0.1f, 0);
weapon.rotate(-0.79f, 0, 0);
charNode.attachChild(weapon);
effect.setupDebris2(Vector3f.ZERO);
sound.setupStone(1);
}
}
private void lowerHappiness(){
happiness -= 20;
}
private void increaseHappiness(){
happiness += 20;
}
private void loadMaterial(){
if(happiness < 50){
model.setMaterial(sad);
}else if(happiness > 60){
model.setMaterial(smile);
}else if(happiness >= 50 && happiness <= 60){
model.setMaterial(matModel);
}
}
private void doWork(){
if(jobType.equals("Lumberjack")){
if(!isWorking){
weapon.rotate(0.79f, 0, 0);
weapon.rotate(0, 0, -1.57f);
isWorking = true;
}
if(jobRot <= -1.57f){
toggle = true;
sound.wood.play();
effect.onceEmit();
brain.decreaseObjectHP(jobType);
}
if(jobRot >= 1.57f){
toggle = false;
}
if(toggle){
jobRot+=0.002f;
Quaternion tempRot = rootNode.getLocalRotation();
tempRot.fromAngleAxis(jobRot, new Vector3f(0, 1, 0));
rootNode.setLocalRotation(tempRot);
}else{
jobRot-=0.002f;
Quaternion tempRot = rootNode.getLocalRotation();
tempRot.fromAngleAxis(jobRot, new Vector3f(0, 1, 0));
rootNode.setLocalRotation(tempRot);
}
if(!brain.isObjectAlive(jobType)){
isWorking = false;
Quaternion tempRot = rootNode.getLocalRotation();
tempRot.fromAngleAxis(0, new Vector3f(0, 1, 0));
rootNode.setLocalRotation(tempRot);
weapon.rotate(-0.79f, 0, 0);
weapon.rotate(0, 0, 1.57f);
weapon.setLocalRotation(tempRot);
weapon.rotate(-0.79f, 0, 0);
charNode.attachChild(jobObject);
brain.state = "Job Building";
}
}
if(jobType.equals("Miner")){
if(!isWorking){
weapon.rotate(0.79f, 0, 0);
weapon.rotate(0, 0, -1.57f);
isWorking = true;
}
if(jobRot <= -1.57f){
toggle = true;
sound.stone.play();
effect.onceEmit();
brain.decreaseObjectHP(jobType);
}
if(jobRot >= 1.57f){
toggle = false;
}
if(toggle){
jobRot+=0.002f;
Quaternion tempRot = rootNode.getLocalRotation();
tempRot.fromAngleAxis(jobRot, new Vector3f(0, 1, 0));
rootNode.setLocalRotation(tempRot);
}else{
jobRot-=0.002f;
Quaternion tempRot = rootNode.getLocalRotation();
tempRot.fromAngleAxis(jobRot, new Vector3f(0, 1, 0));
rootNode.setLocalRotation(tempRot);
}
if(!brain.isObjectAlive(jobType)){
isWorking = false;
Quaternion tempRot = rootNode.getLocalRotation();
tempRot.fromAngleAxis(0, new Vector3f(0, 1, 0));
rootNode.setLocalRotation(tempRot);
weapon.rotate(-0.79f, 0, 0);
weapon.rotate(0, 0, 1.57f);
weapon.setLocalRotation(tempRot);
weapon.rotate(-0.79f, 0, 0);
charNode.attachChild(jobObject);
brain.state = "Job Building";
}
}
}
public void setupTownSize(float townSize){
this.townSize = townSize;
}
public void decreaseHP(float amount){
hp -= amount;
if(hp <= 0){
alive = false;
target.set(0,0,0);
control.setWalkDirection(target);
}
}
public void increaseHP(float amount){
hp += amount;
}
}
[/java]
Brain.java (This class does all the decisions for the cube)
[java]
package Other;
import Character.Player;
import Database.BrainDB;
import Generator.StoneGenerator;
import Generator.StructureGenerator;
import Generator.TreeGenerator;
import com.jme3.math.Vector3f;
import java.util.Random;
public class Brain {
public BrainDB [] database;
public Vector3f target, posHome, posJob;
public boolean home = false, job = false, jobTime = false;
public boolean newPlace = false, decesionMode = false;
public String status = "None", state = "Random Movement";
public Vector3f [] storedPoints;
public int pointStored = 0;
private StructureGenerator structureGenerator;
private TreeGenerator treeGenerator;
private StoneGenerator sg;
private Map map;
private Player player;
private int newPointer = 0, timer = 1000, indexTree = 0, jobPointer = -1,
homePointer = -1, indexStone = 0;
private Random random;
public Brain(StructureGenerator structureGenerator,
TreeGenerator treeGenerator, StoneGenerator sg,
Player player, Map map){
this.structureGenerator = structureGenerator;
this.treeGenerator = treeGenerator;
this.sg = sg;
this.player = player;
this.map = map;
database = new BrainDB[0];
target = new Vector3f(0, 0, 0);
random = new Random();
storedPoints = new Vector3f[0];
}
private void increaseDB(){
BrainDB [] temp = database;
database = new BrainDB[structureGenerator.database.length];
for(int i = 0; i < temp.length; i++){
database[i] = temp[i];
}
temp = null;
}
private void checkDatabase(){
if(database.length != structureGenerator.database.length){
newPlace = true;
state = "New Place";
increaseDB();
for(int i = 0; i < database.length; i++){
if(database[i] == null){
database[i] = new BrainDB(structureGenerator.database[i].name,
structureGenerator.database[i].number,
structureGenerator.database[i].position);
}
}
}
}
private void pointerUpdate(){
for(int i = 0; i < database.length; i++){
if(!database[i].visit){
newPointer = i;
target = database[i].position;
state = "New Place";
}
}
}
private void decide(){
if(database[newPointer].name.equals("Inn")){
if(!home){
if(structureGenerator.database[newPointer].obstacle.getAvailabe()){
home = true;
homePointer = newPointer;
addResource("home", 100);
posHome = database[newPointer].position;
status = "Increase Happiness";
state = "Random Movement";
}else{
status = "Lower Happiness";
state = "Random Movement";
}
}else{
state = "Random Movement";
}
}
if(database[newPointer].name.equals("LumberCamp")){
if(!job){
if(structureGenerator.database[newPointer].obstacle.getAvailabe()){
job = true;
jobTime = true;
jobPointer = newPointer;
posJob = database[newPointer].position;
indexTree = random.nextInt(treeGenerator.trees.length - 1); //random selection
// indexTree = 11; //<----- Change this back to random selection
if(treeGenerator.trees[indexTree].getAvailabe()){
target = treeGenerator.trees[indexTree].position;
}else{
for(int i = 0; i < treeGenerator.trees.length; i++){
if(treeGenerator.trees[i].getAvailabe()){
target = treeGenerator.trees[i].position;
indexTree = i;
break;
}
}
}
status = “Lumberjack”;
// state = “Job Site”; //<—Comment it out if Map Out does not work.
state = “Map Out”;
}else{
status = “Lower Happiness”;
state = “Random Movement”;
}
}else{
state = “Random Movement”;
}
}
if(database[newPointer].name.equals("Quarry")){
if(!job){
if(structureGenerator.database[newPointer].obstacle.getAvailabe()){
job = true;
jobTime = true;
jobPointer = newPointer;
posJob = database[newPointer].position;
indexStone = random.nextInt(sg.stones.length - 1); //random selection
// indexStone = 5; //<----- Change this back to random selection
if(sg.stones[indexStone].getAvailabe()){
target = sg.stones[indexStone].position;
}else{
for(int i = 0; i < sg.stones.length; i++){
if(sg.stones[i].getAvailabe()){
target = sg.stones[i].position;
indexStone = i;
break;
}
}
}
status = “Miner”;
// state = “Job Site”; //<—Comment it out if Map Out does not work.
state = “Map Out”;
}else{
status = “Lower Happiness”;
state = “Random Movement”;
}
}else{
state = “Random Movement”;
}
}
database[newPointer].visit = true;
decesionMode = false;
newPlace = false;
}
public void gotoWork(String type){
if(type.equals("Lumberjack")){
indexTree = random.nextInt(treeGenerator.trees.length - 1); //random selection
if(treeGenerator.trees[indexTree].alive){
if(treeGenerator.trees[indexTree].getAvailabe()){
target = treeGenerator.trees[indexTree].position;
state = "Map Out";
}else{
for(int i = 0; i < treeGenerator.trees.length; i++){
if(treeGenerator.trees[indexTree].alive){
if(treeGenerator.trees[i].getAvailabe()){
target = treeGenerator.trees[i].position;
indexTree = i;
state = "Map Out";
break;
}else{
state = "Random MOvement";
}
}
}
}
}else{
for(int i = 0; i < treeGenerator.trees.length; i++){
if(treeGenerator.trees[indexTree].alive){
if(treeGenerator.trees[i].getAvailabe()){
target = treeGenerator.trees[i].position;
indexTree = i;
state = "Map Out";
break;
}else{
state = "Random MOvement";
}
}
}
}
}
if(type.equals("Miner")){
indexStone = random.nextInt(sg.stones.length - 1); //random selection
if(sg.stones[indexStone].alive){
if(sg.stones[indexStone].getAvailabe()){
target = sg.stones[indexStone].position;
state = "Map Out";
}else{
for(int i = 0; i < sg.stones.length; i++){
if(sg.stones[indexStone].alive){
if(sg.stones[i].getAvailabe()){
target = sg.stones[i].position;
indexStone = i;
state = "Map Out";
break;
}else{
state = "Random MOvement";
}
}
}
}
}else{
for(int i = 0; i < sg.stones.length; i++){
if(sg.stones[indexStone].alive){
if(sg.stones[i].getAvailabe()){
target = sg.stones[i].position;
indexStone = i;
state = "Map Out";
break;
}else{
state = "Random MOvement";
}
}
}
}
}
}
///////// Related to Map/////////
public void findMin(){
// System.out.println(“Before Null checking”);
// if(target == null){
// System.out.println(“Target: Null”);
// }
// if(map.paths == null){
// System.out.println(“map.path: Null”);
// }
// System.out.println(“After Null checking”);
Vector3f tempTarget = target.subtract(map.paths[0].position);
float minDist = tempTarget.length();
int id = 0;
for(int i = 1; i < map.paths.length; i++){
if(target.subtract(map.paths[i].position).length() < minDist){
id = i;
minDist = target.subtract(map.paths[i].position).length();
}
}
// System.out.println("Shortest Point: " + id);
increasePoints();
storedPoints[storedPoints.length - 1] = posJob;
increasePoints();
storedPoints[1] = map.paths[0].position;
MapOut(map.paths[0], id, -1);
increasePoints();
storedPoints[storedPoints.length - 1] = target;
state = “Job Site”;
target = storedPoints[pointStored];
}
public void resetPath(){
storedPoints = null;
storedPoints = new Vector3f[0];
pointStored = 0;
}
private void MapOut(PathNode point, int destID, int preID){
// if(point.id == destID){
// System.out.println(point.id);
// return;
// }
//
// if(point.size == 1){
// increasePoints();
// storedPoints[storedPoints.length - 1] = point.adjs[0].position;
// MapOut(point.adjs[0], destID, point.id);
// System.out.println(point.id);
// }else{
// float minDist = 0;
// if(point.adjs[0].id != preID){
// minDist = map.paths[destID].position.subtract(point.adjs[0].position).length();
// }else{
// minDist = map.paths[destID].position.subtract(point.adjs[1].position).length();
// }
// int id = 0;
// for(int i = 1; i < point.adjs.length; i++){
// if(map.paths[destID].position.subtract(point.adjs[i].position).length() < minDist){
// minDist = map.paths[destID].position.subtract(point.adjs[i].position).length();
// id = i;
// }
// }
//
// increasePoints();
// storedPoints[storedPoints.length - 1] = point.adjs[id].position;
// MapOut(point.adjs[id], destID, point.id);
// System.out.println(point.id);
// }
while(true){
// System.out.println(“Inside Loop”);
// System.out.println("Current Point: " + point.id);
// System.out.println("Pre Point: " + preID);
if(point.id == destID){
// System.out.println(“Broke Loop”);
break;
}
float minDist = 0;
int id = 0;
if(point.adjs[0].id != preID){
minDist = map.paths[destID].position.subtract(point.adjs[0].position).length();
}else{
minDist = map.paths[destID].position.subtract(point.adjs[1].position).length();
id = 1;
}
// System.out.println(“Default Min Distance”);
for(int i = 1; i < point.adjs.length; i++){
// System.out.println(“Searching Min Dist”);
if(map.paths[destID].position.subtract(point.adjs[i].position).length() < minDist && point.adjs[i].id != preID){
minDist = map.paths[destID].position.subtract(point.adjs[i].position).length();
id = i;
}
}
// System.out.println(“Increase Size”);
increasePoints();
// System.out.println(“Added”);
storedPoints[storedPoints.length - 1] = point.adjs[id].position;
// System.out.println(“New Point”);
preID = point.id;
point = point.adjs[id];
}
}
public boolean nextPos(){
boolean reached = false;
pointStored++;
if(pointStored >= storedPoints.length){
reached = true;
return reached;
}
target = storedPoints[pointStored];
return reached;
}
public boolean prePos(){
boolean reached = false;
pointStored--;
if(pointStored < 0){
reached = true;
return reached;
}
target = storedPoints[pointStored];
return reached;
}
private void increasePoints(){
Vector3f [] temp = storedPoints;
storedPoints = new Vector3f[storedPoints.length + 1];
for(int i = 0; i < temp.length; i++){
storedPoints[i] = temp[i];
}
temp = null;
}
///////////////END////////////
public void addResource(String type, float amount){
// System.out.println(“Brain: AddResource”);
if(!type.equals(“home”)){
structureGenerator.database[jobPointer].obstacle.addResource(amount);
}else{
structureGenerator.database[homePointer].obstacle.addResource(amount);
}
}
public void Update(){
// if(!decesionMode){
//// if(player.added){
//// player.added = false;
//// checkDatabase();
//// pointerUpdate();
//// newPlace = true;
//// timer = 500;
//// }
//
// if(timer < 0){
// if(!state.equals(“Do Work”) && !state.equals(“Job Site”)
// && !state.equals(“Job Building”)){
// if(!newPlace){
// checkDatabase();
// if(newPlace){
// pointerUpdate();
// }
// }
// }
// timer = 1000;
// }
//
// timer–;
// }else{
// decide();
// }
if(!decesionMode){
if(timer < 0){
if(!state.equals(“Do Work”) && !state.equals(“Job Site”)
&& !state.equals(“Job Building”)){
checkDatabase();
pointerUpdate();
}
timer = 1000;
}
timer–;
}else{
decide();
}
}
public void decreaseObjectHP(String jobTitle){
if(jobTitle.equals("Lumberjack")){
treeGenerator.trees[indexTree].decreaseHP(20f);
}
if(jobTitle.equals("Miner")){
sg.stones[indexStone].decreaseHP(20f);
}
}
public boolean isObjectAlive(String jobTitle){
if(jobTitle.equals("Lumberjack")){
return treeGenerator.trees[indexTree].alive;
}
if(jobTitle.equals("Miner")){
return sg.stones[indexStone].alive;
}
return false;
}
}
[/java]