package cactusServer.entities; import java.net.URI; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import cactusServer.utils.RandomStringGenerator; import framework.model3D.Position3D; import net.arnx.jsonic.JSONHint; 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; 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 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; } public Item getItem(String itemId) { return itemMap.get(itemId); } public List<Item> getItems() { List<Item> itemList = new ArrayList<>(); for (Item item : itemMap.values()) { itemList.add(item); } return itemList; } 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()); 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 updateAreaURI() { // キャラクターのポジションを用いてどのエリア内にいるかを判定して当該エリアのURIに更新する } public Item destroyItem(String itemId) { return itemMap.remove(itemId); } }