diff --git a/src/main/java/cactusServer/entities/Player.java b/src/main/java/cactusServer/entities/Player.java index 8db7788..4120783 100644 --- a/src/main/java/cactusServer/entities/Player.java +++ b/src/main/java/cactusServer/entities/Player.java @@ -17,8 +17,11 @@ private Quaternion3D angle; private CameraState cameraState; private EmoteState emoteState; + private long lastOperateTime = System.nanoTime(); @JSONHint(ignore = true) public static final int UNIQUE_ID_LENGTH = 12; + @JSONHint(ignore = true) + public static final long STOP_TIME_LIMIT = (long)(30 * Math.pow(10, 9)); private Player() { // JSONDecode���̌Ăяo���p @@ -80,6 +83,11 @@ public EmoteState getEmoteState() { return emoteState; } + + @JSONHint(ignore = true) + public long getLastOperateTime() { + return lastOperateTime; + } public void setInstanceID(String instanceID) { this.instanceID = instanceID; @@ -112,6 +120,11 @@ public void setAnimationClassToStart(EmoteState.EmoteType animationClassToStart) { setEmoteState(new EmoteState(animationClassToStart)); } + + @JSONHint(ignore = true) + public void setLastOperateTime(long lastOperateTime) { + this.lastOperateTime = lastOperateTime; + } public Player update(String characterID, Position3D position, Quaternion3D angle, CameraState cameraState, EmoteState.EmoteType animationClassToStart) { diff --git a/src/main/java/cactusServer/models/Instances.java b/src/main/java/cactusServer/models/Instances.java index fb5ad77..32c7785 100644 --- a/src/main/java/cactusServer/models/Instances.java +++ b/src/main/java/cactusServer/models/Instances.java @@ -111,6 +111,13 @@ player.update(characterID, position, angle, cameraState, animationClassToStart); return player; } + + public Player updatePlayer(String playerId, String characterID, Position3D position, Quaternion3D angle, + CameraState cameraState, EmoteState.EmoteType animationClassToStart, long lastOperateTime) { + Player player = updatePlayer(playerId, characterID, position, angle, cameraState, animationClassToStart); + player.setLastOperateTime(lastOperateTime); + return player; + } public Instance destroyInstance(String instanceId) { return instanceMap.remove(instanceId); @@ -118,7 +125,12 @@ public Player destroyPlayer(String playerId) { Player player = playerMap.get(playerId); + if (player == null) { + return null; + } player.destroy(); + Instance instance = Instances.getInstance().getInstance(player.getInstanceID()); + instance.getUniverse().displace(player.getPlaceable()); return playerMap.remove(playerId); } } diff --git a/src/main/java/cactusServer/resources/PlayersRest.java b/src/main/java/cactusServer/resources/PlayersRest.java index 29d9cd7..0fadd0f 100644 --- a/src/main/java/cactusServer/resources/PlayersRest.java +++ b/src/main/java/cactusServer/resources/PlayersRest.java @@ -2,6 +2,7 @@ import java.util.HashMap; +import javax.ws.rs.DELETE; import javax.ws.rs.FormParam; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -19,6 +20,7 @@ import cactusServer.entities.EmoteState; import cactusServer.entities.Player; import cactusServer.models.Instances; +import cactusServer.utils.App; import net.arnx.jsonic.JSON; @Path("/instances/players") @@ -63,8 +65,17 @@ @FormParam("position") Position3D position, @FormParam("angle") Quaternion3D angle, @FormParam("cameraState") CameraState cameraState, @FormParam("animationClassToStart") EmoteState.EmoteType animationClassToStart) { - return JSON.encode(Instances.getInstance().updatePlayer(playerId, characterID, position, angle, cameraState, - animationClassToStart)); + Player player = Instances.getInstance().updatePlayer(playerId, characterID, position, angle, cameraState, + animationClassToStart, System.nanoTime()); + return JSON.encode(player); +// return JSON.encode(Instances.getInstance().updatePlayer(playerId, characterID, position, angle, cameraState, +// animationClassToStart)); } - + + @Path("/{playerId}") + @DELETE + @Produces(MediaType.TEXT_PLAIN) + public void deletePlayer(@PathParam("playerId") String playerId) { + Instances.getInstance().destroyPlayer(playerId); + } } diff --git a/src/main/java/cactusServer/utils/App.java b/src/main/java/cactusServer/utils/App.java index 60ec9da..f02f092 100644 --- a/src/main/java/cactusServer/utils/App.java +++ b/src/main/java/cactusServer/utils/App.java @@ -1,5 +1,7 @@ package cactusServer.utils; +import java.util.Iterator; +import java.util.Map; import java.util.Timer; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -40,14 +42,15 @@ Instances.getInstance(); Accounts.getInstance(); initDummy(); - start(1); + start(1000); System.out.println("pass"); } @Override - public void run() { + public void run() { //System.out.println("�^�X�N�����s"); CollisionManager.getCollision().collisionRun(); + deletePlayerOfExceedTimeLimit(); } public void start(int interval) { @@ -91,4 +94,25 @@ // System.out.println(JSON.encode(player1Decode, true)); // System.out.println(JSON.encode(player2Decode, true)); } + + private void deletePlayerOfExceedTimeLimit() { + long currentTime = System.nanoTime(); + Iterator> it = Instances.getInstance().getPlayers().entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + String playerId = entry.getKey(); + Player player = entry.getValue(); + long lastOperateTime = player.getLastOperateTime(); + System.out.println(currentTime + ", " + (lastOperateTime + Player.STOP_TIME_LIMIT) + " // playerId: " + playerId); + if (currentTime > (lastOperateTime + Player.STOP_TIME_LIMIT)) { + System.out.println("delete started (playerId: " + playerId + ")"); + player.destroy(); + Instance instance = Instances.getInstance().getInstance(player.getInstanceID()); + instance.getUniverse().displace(player.getPlaceable()); + it.remove(); + System.out.println("delete finished (playerId: " + playerId + ")"); + } + } + System.out.println(); + } } \ No newline at end of file