diff --git a/src/main/java/cactusServer/entities/Area.java b/src/main/java/cactusServer/entities/Area.java index 3dc0ee4..5fec585 100644 --- a/src/main/java/cactusServer/entities/Area.java +++ b/src/main/java/cactusServer/entities/Area.java @@ -2,10 +2,13 @@ import java.util.HashSet; +import net.arnx.jsonic.JSONHint; + public class Area extends Entity{ private String name; private Plain[] region; // �C�ӌ‚̕��ʂ̕����� private HashSet permissions; // �G���A���ʼn”\�Ȃ��Ƃ̗��� + @JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12; private Area() { // JSONDecode���̌Ăяo���p diff --git a/src/main/java/cactusServer/entities/Character.java b/src/main/java/cactusServer/entities/Character.java index 671a985..289a173 100644 --- a/src/main/java/cactusServer/entities/Character.java +++ b/src/main/java/cactusServer/entities/Character.java @@ -4,12 +4,14 @@ 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; @@ -17,12 +19,13 @@ private CharacterModel model; private String areaURI; private HashMap 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���̌Ăяo���p } - + public Character(String accountURI, String name, Position3D position, Angle angle, CharacterModel model) { setAccountURI(accountURI); setName(name); @@ -32,10 +35,20 @@ updateAreaURI(); } + public Character(String instanceId, String accountURI, String name, Position3D position, Angle angle, + CharacterModel model) { + setAccountURI(accountURI); + setName(name); + setPosition(position); + setAngle(angle); + setModel(model); + updateAreaURI(); + } + public String getAccountURI() { return accountURI; } - + public String getName() { return name; } @@ -43,7 +56,7 @@ public Position3D getPosition() { return position; } - + public Angle getAngle() { return angle; } @@ -51,16 +64,16 @@ 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 getItems() { List itemList = new ArrayList<>(); @@ -73,7 +86,7 @@ public void setAccountURI(String accountURI) { this.accountURI = accountURI; } - + public void setName(String name) { this.name = name; } @@ -81,7 +94,7 @@ public void setPosition(Position3D position) { this.position = position; } - + public void setAngle(Angle angle) { this.angle = angle; } @@ -89,7 +102,7 @@ public void setModel(CharacterModel model) { this.model = model; } - + public void setAreaURI(String areaURI) { this.areaURI = areaURI; } @@ -97,13 +110,14 @@ 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 entry : itemMap.entrySet()) { if (entry.getValue().equals(item)) { @@ -112,7 +126,7 @@ } return false; } - + public Item changeAmountOfItem(String itemId, int amountOfChange) { Item item = itemMap.get(itemId).changeAmount(amountOfChange); if (item.isEmpty()) { @@ -120,11 +134,50 @@ } return item; } - - private void updateAreaURI() { - // �L�����N�^�[�̃|�W�V������p���Ăǂ̃G���A���ɂ��邩�𔻒肵�ē��Y�G���A��URI�ɍX�V���� + + private void initAreaURI(String instanceId) { + Instance instance = Instances.getInstance().getInstance(instanceId); + areaURI = findAreaURI(instance); } - + + private String findAreaURI(Instance instance) { + // �L�����N�^�[�̃|�W�V������p���Ăǂ̃G���A���ɂ��邩�𔻒肵�ē��Y�G���A��URI�ɍX�V���� + 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("/"); // �c�c/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); + // ���݂̃L�����N�^�[�̃|�W�V�������X�V�O�ɂ����G���A���ɂ��邩�ǂ����𔻒� + if (isInTheArea(previousArea)) { + return; // �X�V�O�ɂ����G���A���ɂ���΃G���AURI��ύX����K�v�͂Ȃ� + } + // �L�����N�^�[�̃|�W�V������p���Ăǂ̃G���A���ɂ��邩�𔻒肵�ē��Y�G���A��URI�ɍX�V���� + areaURI = findAreaURI(instance); + } + public Item destroyItem(String itemId) { return itemMap.remove(itemId); } diff --git a/src/main/java/cactusServer/entities/Instance.java b/src/main/java/cactusServer/entities/Instance.java index e1b58e6..59485b2 100644 --- a/src/main/java/cactusServer/entities/Instance.java +++ b/src/main/java/cactusServer/entities/Instance.java @@ -30,7 +30,7 @@ private HashMap areaMap = new HashMap<>(); private HashMap objMap = new HashMap<>(); private HashMap 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���̌Ăяo���p @@ -101,21 +101,21 @@ } public IDAddressedEntity createArea(String name, Plain[] region, HashSet 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); diff --git a/src/main/java/cactusServer/entities/Item.java b/src/main/java/cactusServer/entities/Item.java index 88533bb..0055397 100644 --- a/src/main/java/cactusServer/entities/Item.java +++ b/src/main/java/cactusServer/entities/Item.java @@ -1,8 +1,11 @@ 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���̌Ăяo���p diff --git a/src/main/java/cactusServer/entities/Object.java b/src/main/java/cactusServer/entities/Object.java index bed51eb..4cee989 100644 --- a/src/main/java/cactusServer/entities/Object.java +++ b/src/main/java/cactusServer/entities/Object.java @@ -3,6 +3,7 @@ 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; @@ -11,6 +12,7 @@ private Angle angle; private Attribute attribute; private ObjectModel model; + @JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12; private Object() { // JSONDecode���̌Ăяo���p diff --git a/src/main/java/cactusServer/entities/Player.java b/src/main/java/cactusServer/entities/Player.java index 0c59537..adad705 100644 --- a/src/main/java/cactusServer/entities/Player.java +++ b/src/main/java/cactusServer/entities/Player.java @@ -2,6 +2,7 @@ import cactusServer.models.Instances; import framework.model3D.Position3D; +import net.arnx.jsonic.JSONHint; public class Player extends Entity { private String instanceURI; @@ -11,6 +12,7 @@ private Angle angle; private CameraState cameraState; private EmoteState emoteState; + @JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12; private Player() { // JSONDecode���̌Ăяo���p @@ -24,13 +26,17 @@ setEmoteState(new EmoteState(animationClassToStart)); readCharacterData(characterURI); } - - private void readCharacterData(String characterURI) { + + private Character getCharacter(String characterURI) { String[] characterURISplit = characterURI.split("/"); // �c�c/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()); @@ -99,4 +105,15 @@ 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); + } } diff --git a/src/main/java/cactusServer/models/Instances.java b/src/main/java/cactusServer/models/Instances.java index 13aae02..f68c77c 100644 --- a/src/main/java/cactusServer/models/Instances.java +++ b/src/main/java/cactusServer/models/Instances.java @@ -21,7 +21,7 @@ private static Instances theInstance = null; private HashMap instanceMap = new HashMap<>(); // instance��ID�Ǝ��̂��Ǘ� private HashMap playerMap = new HashMap<>(); - private static final int UNIQUE_ID_LENGTH = 12; +// private static final int UNIQUE_ID_LENGTH = 12; private Instances() { @@ -48,7 +48,7 @@ * @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); @@ -57,7 +57,7 @@ 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); diff --git a/src/main/java/cactusServer/utils/MyParamConverterProvider.java b/src/main/java/cactusServer/utils/MyParamConverterProvider.java index 1f5f41a..61ed672 100644 --- a/src/main/java/cactusServer/utils/MyParamConverterProvider.java +++ b/src/main/java/cactusServer/utils/MyParamConverterProvider.java @@ -7,6 +7,12 @@ import javax.ws.rs.ext.ParamConverterProvider; import javax.ws.rs.ext.Provider; +/** + * Rest�n�N���X�̃��\�b�h�ɂ�����,�@FormParam�A�m�e�[�V�������‚����������̌^��FormParam�̐��������
+ * �������Ă��Ȃ��ꍇ��, ���Y�����𖞂������������S���N���X + * @author r-isitani + * + */ @Provider public class MyParamConverterProvider implements ParamConverterProvider { @Override