指定ポジションが指定エリア内にあるかどうかの判定メソッドをAreaクラスへ移し, AreaURIの設定メソッドについて,
Characterクラスには初期化用のinitAreaURIを,
Playerクラスには更新用のupdateAreaURIをそれぞれ持たせるようにした.
1 parent cbce1e5 commit a5177a7a7e0880489f0652deb9491c66186f36a2
r-isitani authored on 11 Jun 2018
Showing 3 changed files
View
41
src/main/java/cactusServer/entities/Area.java
package cactusServer.entities;
 
import java.util.HashSet;
 
import framework.model3D.Position3D;
import net.arnx.jsonic.JSONHint;
 
public class Area extends Entity{
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;
@JSONHint(ignore = true)
public static final int UNIQUE_ID_LENGTH = 12;
 
private Area() {
// JSONDecode時の呼び出し用
}
 
public Area(String name, Plain[] region, HashSet<Allowed> permissions) {
setName(name);
setRegion(region);
setPermissions(permissions);
}
 
public String getName() {
return name;
}
 
public Plain[] getRegion() {
return region;
}
 
public Plain getRegion(int index) {
return region[index];
}
 
public HashSet<Allowed> getPermissions() {
return permissions;
}
 
public boolean isPermission(Allowed allowed) {
return permissions.contains(allowed);
}
 
public boolean isSurroundingPosition(Position3D position) {
for (Plain plain : region) {
// ここに Plainのa,b,c,d と Characterのx,y,z を用いて, キャラクターが平面にいるかどうかの判定を行う
 
// double equation = (plain.getA() * position.getX()) + (plain.getB() *
// position.getY())
// + (plain.getC() * position.getZ()) + plain.getD();
// if (equation > 0) {
// return false;
// }
}
return true;
}
 
public void setName(String name) {
this.name = name;
}
 
public void setRegion(Plain[] region) {
this.region = region;
}
 
public void setPermissions(HashSet<Allowed> permissions) {
this.permissions = permissions;
}
 
public void addPermission(Allowed allowed) {
permissions.add(allowed);
}
 
public void removePermission(Allowed allowed) {
permissions.remove(allowed);
}
 
public static enum Allowed {
SHOOT, KILL;
}
}
View
51
src/main/java/cactusServer/entities/Character.java
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 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);
 
private String findAreaURI(Instance instance) {
// キャラクターのポジションを用いてどのエリア内にいるかを判定して当該エリアのURIに更新する
for (String areaId : instance.getAreaIdSet()) {
if (isInTheArea(instance.getArea(areaId))) {
int subStringStartIndex = areaURI.length() - Character.UNIQUE_ID_LENGTH;
Area area = instance.getArea(areaId);
if (area.isSurroundingPosition(position)) {
int subStringStartIndex = areaURI.length() - Area.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) {
for (Plain plain : area.getRegion()) {
// ここに Plainのa,b,c,d と Characterのx,y,z を用いて, キャラクターが平面にいるかどうかの判定を行う
 
// double equation = (plain.getA() * position.getX()) + (plain.getB() *
// position.getY())
// + (plain.getC() * position.getZ()) + plain.getD();
// if (equation > 0) {
// return false;
// }
}
return true;
}
 
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)) {
// キャラクターのポジションを用いてどのエリア内にいるかを判定して当該エリアのURIに更新する
setAreaURI(findAreaURI(instance));
}
}
 
public Item destroyItem(String itemId) {
return itemMap.remove(itemId);
}
}
View
38
src/main/java/cactusServer/entities/Player.java
private Position3D position;
private Angle angle;
private CameraState cameraState;
private EmoteState emoteState;
@JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12;
@JSONHint(ignore = true)
public static final int UNIQUE_ID_LENGTH = 12;
 
private Player() {
// JSONDecode時の呼び出し用
}
setCameraState(cameraState);
setEmoteState(new EmoteState(animationClassToStart));
readCharacterData(characterURI);
}
 
private Character getCharacter(String characterURI) {
String[] characterURISplit = characterURI.split("/"); // ……/instances/{instanceId}/characters/{characterId}
int splitSize = characterURISplit.length;
String characterId = characterURISplit[splitSize - 1];
public void setEmoteState(EmoteState emoteState) {
this.emoteState = emoteState;
}
 
public void setanimationClassToStart(EmoteState.EmoteType animationClassToStart) {
public void setAnimationClassToStart(EmoteState.EmoteType animationClassToStart) {
setEmoteState(new EmoteState(animationClassToStart));
}
 
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 (!previousArea.isSurroundingPosition(position)) {
// キャラクターのポジションを用いてどのエリア内にいるかを判定して当該エリアのURIに更新する
setAreaURI(findAreaURI(instance));
}
}
 
private String findAreaURI(Instance instance) {
// キャラクターのポジションを用いてどのエリア内にいるかを判定して当該エリアのURIに更新する
for (String areaId : instance.getAreaIdSet()) {
Area area = instance.getArea(areaId);
if (area.isSurroundingPosition(position)) {
int subStringStartIndex = areaURI.length() - Area.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.");
}
 
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);