IDの長さを決めている定数フィールドに関しての変更と, CharacterのareaURIに関する処理の追加.
・各リソースに付加されるIDの長さを決めている定数フィールドを,
IDを付加するクラスが持っていたところを,IDを付加されるクラスが持つように変更.
・CharacterのareaURIに関するメソッドを追加.
1 parent 8281861 commit 34da607fb609f63937c43b9c599bb3ada303a4e8
r-isitani authored on 11 Jun 2018
Showing 8 changed files
View
3
■■
src/main/java/cactusServer/entities/Area.java
package cactusServer.entities;
 
import java.util.HashSet;
 
import net.arnx.jsonic.JSONHint;
 
public class Area extends Entity{
private String name;
private Plain[] region; // 任意個の平面の方程式
private HashSet<Allowed> permissions; // エリア内で可能なことの羅列
@JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12;
 
private Area() {
// JSONDecode時の呼び出し用
}
View
115
src/main/java/cactusServer/entities/Character.java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
 
import cactusServer.models.Instances;
import cactusServer.utils.RandomStringGenerator;
import framework.model3D.Position3D;
import net.arnx.jsonic.JSONHint;
 
public class Character extends Entity{
public class Character extends Entity {
private String accountURI;
private String name;
private Position3D position;
private Angle angle;
private CharacterModel model;
private String areaURI;
private HashMap<String, Item> itemMap = new HashMap<>();
private static final int UNIQUE_ID_LENGTH = 12;
@JSONHint(ignore = true)
public static final int UNIQUE_ID_LENGTH = 12;
 
private Character() {
// JSONDecode時の呼び出し用
}
 
public Character(String accountURI, String name, Position3D position, Angle angle, CharacterModel model) {
setAccountURI(accountURI);
setName(name);
setPosition(position);
setAngle(angle);
setModel(model);
updateAreaURI();
}
 
public Character(String instanceId, String accountURI, String name, Position3D position, Angle angle,
CharacterModel model) {
setAccountURI(accountURI);
setName(name);
setPosition(position);
setAngle(angle);
 
public String getAccountURI() {
return accountURI;
}
 
public String getName() {
return name;
}
 
public Position3D getPosition() {
return position;
}
 
public Angle getAngle() {
return angle;
}
 
public CharacterModel getModel() {
return model;
}
 
public String getAreaURI() {
return areaURI;
}
 
@JSONHint(ignore = true)
public Item getItem(String itemId) {
return itemMap.get(itemId);
}
 
@JSONHint(ignore = true)
public List<Item> getItems() {
List<Item> itemList = new ArrayList<>();
for (Item item : itemMap.values()) {
 
public void setAccountURI(String accountURI) {
this.accountURI = accountURI;
}
 
public void setName(String name) {
this.name = name;
}
 
public void setPosition(Position3D position) {
this.position = position;
}
 
public void setAngle(Angle angle) {
this.angle = angle;
}
 
public void setModel(CharacterModel model) {
this.model = model;
}
 
public void setAreaURI(String areaURI) {
this.areaURI = areaURI;
}
 
public AddressedEntity createItem(String name, int amount) {
Item item = new Item(name, amount);
if (!hasItem(item)) {
String id = RandomStringGenerator.generateUniqueString(UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, itemMap.keySet());
String id = RandomStringGenerator.generateUniqueString(Item.UNIQUE_ID_LENGTH,
RandomStringGenerator.ALPHA_NUMERIC, itemMap.keySet());
itemMap.put(id, item);
return new IDAddressedEntity(id, item);
}
return null;
}
 
public boolean hasItem(Item item) {
for (Map.Entry<String, Item> entry : itemMap.entrySet()) {
if (entry.getValue().equals(item)) {
return true;
}
}
return false;
}
 
public Item changeAmountOfItem(String itemId, int amountOfChange) {
Item item = itemMap.get(itemId).changeAmount(amountOfChange);
if (item.isEmpty()) {
destroyItem(itemId);
}
return item;
}
 
private void initAreaURI(String instanceId) {
Instance instance = Instances.getInstance().getInstance(instanceId);
areaURI = findAreaURI(instance);
}
 
private String findAreaURI(Instance instance) {
// キャラクターのポジションを用いてどのエリア内にいるかを判定して当該エリアのURIに更新する
for (String areaId : instance.getAreaIdSet()) {
if (isInTheArea(instance.getArea(areaId))) {
int subStringStartIndex = areaURI.length() - Character.UNIQUE_ID_LENGTH;
StringBuilder newAreaURI = new StringBuilder();
return newAreaURI.append(areaURI.substring(0, subStringStartIndex)).append(areaId).toString();
}
}
throw new IllegalStateException("Character is in the unknown area");
}
 
private boolean isInTheArea(Area area) {
boolean inTheArea = false;
for (Plain plain : area.getRegion()) {
// double equation = (plain.getA() * position.getX()) + (plain.getB() *
// position.getY())
// + (plain.getC() * position.getZ()) + plain.getD();
// inTheArea = (equation < 0);
}
return inTheArea;
}
 
private void updateAreaURI() {
String[] areaURISplit = areaURI.split("/"); // ……/instances/{instanceId}/areas/{areaId}
int splitSize = areaURISplit.length;
String instanceId = areaURISplit[splitSize - 3];
String previousAreaId = areaURISplit[splitSize - 1];
Instance instance = Instances.getInstance().getInstance(instanceId);
Area previousArea = instance.getArea(previousAreaId);
// 現在のキャラクターのポジションが更新前にいたエリア内にいるかどうかを判定
if (isInTheArea(previousArea)) {
return; // 更新前にいたエリア内にいればエリアURIを変更する必要はない
}
// キャラクターのポジションを用いてどのエリア内にいるかを判定して当該エリアのURIに更新する
areaURI = findAreaURI(instance);
}
 
public Item destroyItem(String itemId) {
return itemMap.remove(itemId);
}
}
View
8
src/main/java/cactusServer/entities/Instance.java
 
private HashMap<String, Area> areaMap = new HashMap<>();
private HashMap<String, Object> objMap = new HashMap<>();
private HashMap<String, Character> characterMap = new HashMap<>();
private static final int UNIQUE_ID_LENGTH = 12;
@JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12;
 
private Instance() {
// JSONDecode時の呼び出し用
}
this.stage = stage;
}
 
public IDAddressedEntity createArea(String name, Plain[] region, HashSet<Allowed> permissions) {
String id = RandomStringGenerator.generateUniqueString(UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, areaMap.keySet());
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, ObjectModel model) {
String id = RandomStringGenerator.generateUniqueString(UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, objMap.keySet());
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);
}
public IDAddressedEntity createCharacter(String accountURI, String name, Position3D position, Angle angle, CharacterModel model) {
String id = RandomStringGenerator.generateUniqueString(UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, characterMap.keySet());
String id = RandomStringGenerator.generateUniqueString(Character.UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC, characterMap.keySet());
Character character = new Character(accountURI, name, position, angle, model);
characterMap.put(id, character);
return new IDAddressedEntity(id, character);
}
View
3
■■
src/main/java/cactusServer/entities/Item.java
package cactusServer.entities;
 
import net.arnx.jsonic.JSONHint;
 
public class Item extends Entity{
private String name;
private int amount;
@JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12;
private Item() {
// JSONDecode時の呼び出し用
}
View
2
■■■
src/main/java/cactusServer/entities/Object.java
 
import framework.model3D.Position3D;
import framework.physics.AngularVelocity3D;
import framework.physics.Velocity3D;
import net.arnx.jsonic.JSONHint;
 
public class Object extends Entity {
private Position3D position;
private Velocity3D velocity;
private AngularVelocity3D angularVelocity;
private Angle angle;
private Attribute attribute;
private ObjectModel model;
@JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12;
 
private Object() {
// JSONDecode時の呼び出し用
}
View
27
src/main/java/cactusServer/entities/Player.java
package cactusServer.entities;
 
import cactusServer.models.Instances;
import framework.model3D.Position3D;
import net.arnx.jsonic.JSONHint;
 
public class Player extends Entity {
private String instanceURI;
private String characterURI;
private Position3D position;
private Angle angle;
private CameraState cameraState;
private EmoteState emoteState;
@JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12;
 
private Player() {
// JSONDecode時の呼び出し用
}
setCameraState(cameraState);
setEmoteState(new EmoteState(animationClassToStart));
readCharacterData(characterURI);
}
 
private void readCharacterData(String characterURI) {
private Character getCharacter(String characterURI) {
String[] characterURISplit = characterURI.split("/"); // ……/instances/{instanceId}/characters/{characterId}
int splitSize = characterURISplit.length;
String characterId = characterURISplit[splitSize - 1];
String instanceId = characterURISplit[splitSize - 3];
Character character = Instances.getInstance().getInstance(instanceId).getCharacter(characterId);
return Instances.getInstance().getInstance(instanceId).getCharacter(characterId);
}
 
private void readCharacterData(String characterURI) {
Character character = getCharacter(characterURI);
setPosition(character.getPosition());
setAngle(character.getAngle());
setAreaURI(character.getAreaURI());
}
 
public void updateEmoteType(EmoteState.EmoteType animationClassToStart) {
this.emoteState.setEmoteType(animationClassToStart);
}
public void deletePlayer() {
writeCharacterData(characterURI);
}
private void writeCharacterData(String characterURI) {
Character character = getCharacter(characterURI);
character.setPosition(position);
character.setAngle(angle);
character.setAreaURI(areaURI);
}
}
View
6
src/main/java/cactusServer/models/Instances.java
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 static final int UNIQUE_ID_LENGTH = 12;
// private static final int UNIQUE_ID_LENGTH = 12;
 
private Instances() {
 
}
* @param stageModel
* @return
*/
public IDAddressedEntity createInstance(String name, Instance.State state, String stageModel) {
String id = RandomStringGenerator.generateUniqueString(UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC,
String id = RandomStringGenerator.generateUniqueString(Instance.UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC,
instanceMap.keySet());
Instance instance = new Instance(name, state, stageModel);
instanceMap.put(id, instance);
return new IDAddressedEntity(id, instance);
}
 
public IDAddressedEntity createPlayer(String instanceURI, String characterURI, CameraState cameraState,
EmoteState.EmoteType animationClassToStart) {
String id = RandomStringGenerator.generateUniqueString(UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC,
String id = RandomStringGenerator.generateUniqueString(Player.UNIQUE_ID_LENGTH, RandomStringGenerator.ALPHA_NUMERIC,
playerMap.keySet());
Player player = new Player(instanceURI, characterURI, cameraState, animationClassToStart);
playerMap.put(id, player);
return new IDAddressedEntity(id, player);
View
6
src/main/java/cactusServer/utils/MyParamConverterProvider.java
import javax.ws.rs.ext.ParamConverter;
import javax.ws.rs.ext.ParamConverterProvider;
import javax.ws.rs.ext.Provider;
 
/**
* Rest系クラスのメソッドにおいて, FormParamアノテーションをつけた仮引数の型がFormParamの制約条件を<br>
* 満たしていない場合に, 当該条件を満たさせる役割を担うクラス
* @author r-isitani
*
*/
@Provider
public class MyParamConverterProvider implements ParamConverterProvider {
@Override
@SuppressWarnings("unchecked")