- package cactusServer.models;
-
- import java.util.HashMap;
-
- import org.ntlab.radishforandroidstudio.framework.model3D.Position3D;
- import org.ntlab.radishforandroidstudio.framework.model3D.Quaternion3D;
-
- import cactusServer.entities.CameraState;
- import cactusServer.entities.EmoteState;
- import cactusServer.entities.Instance;
- import cactusServer.entities.Player;
- import cactusServer.utils.RandomStringGenerator;
-
- /**
- * インスタンスを管理するクラス
- *
- * @author r-isitani
- *
- */
- public class Instances {
- private static Instances theInstance = null;
- private HashMap<String, Instance> instanceMap = new HashMap<>(); // instanceのIDと実体を管理
- private HashMap<String, Player> playerMap = new HashMap<>();
-
- private Instances() {
- // // ダミーコード
- // instanceMap.put("test1", new Instance("test1", 0));
- // instanceMap.put("test2", new Instance("test2", 1));
- }
-
- /**
- * Instancesクラスを取得する (シングルトン)
- *
- * @return
- */
- public static Instances getInstance() {
- if (theInstance == null) {
- theInstance = new Instances();
- }
- return theInstance;
- }
-
- public HashMap<String, Instance> createInstance(String name, int stageID) {
- String id = RandomStringGenerator.generateUniqueString(Instance.UNIQUE_ID_LENGTH,
- RandomStringGenerator.ALPHA_NUMERIC, instanceMap.keySet());
- Instance instance = new Instance(name, stageID);
- instanceMap.put(id, instance);
- HashMap<String, Instance> returnedMap = new HashMap<>();
- returnedMap.put(id, instance);
- return returnedMap;
- }
-
- public HashMap<String, Player> createPlayer(String instanceID, String characterID, CameraState cameraState,
- EmoteState.EmoteType animationClassToStart) {
- String id = RandomStringGenerator.generateUniqueString(Player.UNIQUE_ID_LENGTH,
- RandomStringGenerator.ALPHA_NUMERIC, playerMap.keySet());
- Player player = new Player(instanceID, characterID, cameraState, animationClassToStart);
- playerMap.put(id, player);
- instanceMap.get(instanceID).getUniverse().place(player.getPlaceable());
- HashMap<String, Player> returnedMap = new HashMap<>();
- returnedMap.put(id, player);
- return returnedMap;
- }
-
- public HashMap<String, Instance> getInstances() {
- return instanceMap;
- }
-
- public Instance getInstance(String instanceId) {
- return instanceMap.get(instanceId);
- }
-
- /**
- * 全playerを返す
- */
- public HashMap<String, Player> getPlayers() {
- return playerMap;
- }
-
- /**
- * IDに対応するinstanceにいる全playerを返す
- *
- * @param instanceId
- */
- public HashMap<String, Player> getPlayers(String instanceId) {
- if (instanceId == null || instanceId.isEmpty()) {
- return getPlayers();
- }
- HashMap<String, Player> responsePlayers = new HashMap<>();
- for (String id : playerMap.keySet()) {
- Player player = playerMap.get(id);
- if (instanceId.equals(player.getInstanceID())) {
- responsePlayers.put(id, player);
- }
- }
- return responsePlayers;
- }
-
- public Player getPlayer(String playerId) {
- return playerMap.get(playerId);
- }
-
- public Instance updateInstance(String instanceId, Instance.State state) {
- Instance instance = instanceMap.get(instanceId);
- instance.update(state);
- return instance;
- }
-
- public Player updatePlayer(String playerId, String characterID, Position3D position, Quaternion3D angle,
- CameraState cameraState, EmoteState.EmoteType animationClassToStart) {
- long lastUpdateTime = System.nanoTime();
- Player player = playerMap.get(playerId);
- if (player != null) {
- String previousCharacterID = player.getCharacterID();
- player.update(characterID, position, angle, cameraState, animationClassToStart, lastUpdateTime);
- if (!(previousCharacterID.equals(player.getCharacterID()))) {
- String instanceID = player.getInstanceID();
- instanceMap.get(instanceID).getUniverse().place(player.getPlaceable());
- }
- }
- return player;
- }
-
- public Instance destroyInstance(String instanceId) {
- return instanceMap.remove(instanceId);
- }
-
- public Player destroyPlayer(String playerId) {
- Player player = playerMap.get(playerId);
- if (player == null) {
- return null;
- }
- player.destroy();
- return playerMap.remove(playerId);
- }
- }