package cactusServer.entities; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Set; import cactusServer.entities.Entity; import cactusServer.entities.Object; import cactusServer.entities.Area.Allowed; import cactusServer.entities.Object.Attribute; import cactusServer.utils.RandomStringGenerator; import cactusServer.entities.Character; import framework.model3D.ModelFactory; import framework.model3D.Object3D; import framework.model3D.Position3D; import framework.model3D.Universe; import framework.physics.AngularVelocity3D; import framework.physics.Ground; import framework.physics.Velocity3D; import net.arnx.jsonic.JSONHint; import template.shooting.Stage; /** * インスタンス * * @author r-isitani * */ public class Instance extends Entity { private String name; private State state; private String stageURI; private Universe universe; private Stage stage; private HashMap<String, Area> areaMap = new HashMap<>(); private HashMap<String, Object> objMap = new HashMap<>(); private HashMap<String, Character> characterMap = new HashMap<>(); @JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12; private Instance() { // JSONDecode時の呼び出し用 } /** * (引数は現時点での仮のもの) * * @param name * インスタンス名 */ public Instance(String name, State state, String stageURI) { setName(name); setState(state); setStage(stageURI); initUniverse(); } private void initUniverse() { universe = new Universe(); // stageURIを元にして読み込むステージのファイル名(相対パス)を作る予定 String stageFileName = ""; // ステージの3Dデータを読み込み配置する Object3D stageObj = ModelFactory.loadModel(stageFileName, false, true).createObject(); stage = new Stage(stageObj, "jimen1"); universe.place(stage); } public String getName() { return name; } public State getState() { return state; } public String getStage() { return stageURI; } @JSONHint(ignore = true) public Universe getUniverse() { return universe; } @JSONHint(ignore = true) public Set<String> getAreaIdSet() { return areaMap.keySet(); } @JSONHint(ignore = true) public Area getArea(String areaId) { return areaMap.get(areaId); } @JSONHint(ignore = true) public Set<String> getObjIdSet() { return objMap.keySet(); } @JSONHint(ignore = true) public Object getObject(String objId) { return objMap.get(objId); } @JSONHint(ignore = true) public List<Character> getCharacters() { return new ArrayList<Character>(characterMap.values()); } @JSONHint(ignore = true) public Character getCharacter(String characterId) { return characterMap.get(characterId); } public void setName(String name) { this.name = name; } public void setState(State state) { this.state = state; } public void setStage(String stageURI) { this.stageURI = stageURI; } public IDAddressedEntity createArea(String name, Plain[] region, HashSet<Allowed> permissions) { String id = RandomStringGenerator.generateUniqueString(Area.UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, areaMap.keySet()); Area area = new Area(name, region, permissions); areaMap.put(id, area); return new IDAddressedEntity(id, area); } public IDAddressedEntity createObject(Position3D position, Velocity3D velocity, AngularVelocity3D angularVelocity, Angle angle, Attribute attribute, String model) { String id = RandomStringGenerator.generateUniqueString(Object.UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, objMap.keySet()); Object object = new Object(position, velocity, angularVelocity, angle, attribute, model); objMap.put(id, object); return new IDAddressedEntity(id, object); } /** * InstancesRestとのエラー解消用 (後で消す) */ public IDAddressedEntity createObject(Position3D position, Velocity3D velocity, AngularVelocity3D angularVelocity, Angle angle, Attribute attribute, ObjectModel model) { String id = RandomStringGenerator.generateUniqueString(Object.UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, objMap.keySet()); Object object = new Object(position, velocity, angularVelocity, angle, attribute, ""); objMap.put(id, object); return new IDAddressedEntity(id, object); } public IDAddressedEntity createCharacter(String instanceId, String accountURI, String name, Position3D position, Angle angle, String model) { String id = RandomStringGenerator.generateUniqueString(Character.UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, characterMap.keySet()); Character character = new Character(instanceId, accountURI, name, position, angle, model); characterMap.put(id, character); return new IDAddressedEntity(id, character); } public Character updateCharacter(String characterId, Position3D position, Angle angle, String model) { Character character = characterMap.get(characterId); character.update(position, angle, model, null); // areaURI(第4引数)の更新は呼び出し先で自動で行われる return character; } public Character destroyCharacter(String characterId) { return characterMap.remove(characterId); } public Area destroyArea(String areaId) { return areaMap.remove(areaId); } public Object destroyObject(String objId) { return objMap.remove(objId); } public static enum State { AVAILABLE, MAINTENANCE; } }