package servlet; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import account.Account; import account.AccountManager; import framework.model3D.Position3D; import game.Game; import game.Stage; import room.Room; import room.RoomManager; public class RoomServlet extends HttpServlet { public static final int TEAM_RED = 0; public static final int TEAM_BLUE = 1; // 受け取る部分 ↓reqで受け取る ↓respで返す public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException { // RoomManagerを使うために宣言しておく ↓シングルトンパターンを利用しているため RoomManager roommgr = RoomManager.getInstance(); AccountManager accountmgr = AccountManager.getInstance(); // 返す文字の宣言 ↓返すためresp PrintWriter printwriter = resp.getWriter(); /******************************* * パラメータを受け取る req *******************************/ String state = req.getParameter("state"); String sId = req.getSession().getId(); String clSelfWait = req.getParameter("wait"); /******************************* * sIdからアカウントを取得 *******************************/ Account svSelf = accountmgr.getAccount(sId); //部屋を取得 Room myRoom = svSelf.getRoom(); //最終通信時間を更新 svSelf.setFinalConnectTime(); /******************************* * enter / update の処理 *******************************/ if((state.equals("enter")) || (state.equals("update"))) { if(state.equals("enter")) { System.out.println("<state> : " + state); } printwriter.println("<room>"); //waitが異なる時、更新する if(!clSelfWait.equals(svSelf.getWait())) { svSelf.setWait(clSelfWait); } //Room内の人の最終接続時間確認 myRoom.removeNotConnectMember(); //Room内のアカウント情報を取得 Account account = new Account(); for(int i=0; i<myRoom.getMemberCount(); i++) { account = myRoom.getMember(i); printwriter.println("<player sid=\"" + account.getsId() + "\" name = \"" + account.getName() + "\" wait = \"" + account.getWait() +"\">"); printwriter.println("</player>"); if(state.equals("enter")) { System.out.println("player" + i + " sId : " + account.getsId()); System.out.println(" wait : " + account.getWait()); } } printwriter.println("</room>"); } /******************************* * exit の処理 *******************************/ else if(state.equals("exit")) { //部屋から自分を削除 myRoom.removeMember(svSelf); //部屋の人数が0になった場合部屋を削除 if(myRoom.getMemberCount() == 0) { roommgr.removeRoom(myRoom); } printwriter.println("<result id=\"ok\">"); printwriter.println("</result>"); } /******************************* * divide の処理 *******************************/ else if(state.equals("divide")){ System.out.println("state : divide"); if(myRoom.getDivideFlag() == 0) { myRoom.setDivideFlag(1); myRoom.divideTeam(); myRoom.setDivideFlag(2); } //他のクライアントがチーム分け処理中の場合、ngを送信する if(myRoom.getDivideFlag() != 2) { printwriter.println("<divide id=\"ng\">"); printwriter.println("</divide>"); } //チーム分け完了していた場合 チーム分け情報転送 if(myRoom.getDivideFlag() == 2) { Game game = new Game(); game = myRoom.getGame(); int myTeam = 0; int myNum = 0; printwriter.println("<team>"); //赤チームの情報を転送 printwriter.println("<teamRed>"); System.out.println("+++++++ teamRed +++++++"); for(int i=0; i<Room.MAX_MEMBERS/2; i++){ Account ac = new Account(); ac = game.getTeamMember(i, TEAM_RED); String getsId = ac.getsId(); String getname = ac.getName(); printwriter.println("<player sid=\""+getsId+"\" name=\""+ getname +"\">"); printwriter.println("</player>"); //自分が存在するとき myTeam=0,myNum=0~2 if(getsId.equals(sId)){ myTeam = 0; myNum = i; } } printwriter.println("</teamRed>"); //青チームの情報を転送 printwriter.println("<teamBlue>"); System.out.println("+++++++ teamBlue +++++++"); for(int i=0; i<Room.MAX_MEMBERS/2; i++){ Account ac = new Account(); ac = game.getTeamMember(i, TEAM_BLUE); String getsId = ac.getsId(); String getname = ac.getName(); printwriter.println("<player sid=\""+getsId+"\" name=\""+ getname +"\">"); printwriter.println("</player>"); //自分が存在するとき myTeam=1,myNum=0~2 if(getsId.equals(sId)){ myTeam = 1; myNum = i; } } printwriter.println("</teamBlue>"); //自分の座標を設定 Stage stage = new Stage(); Position3D p = stage.getSpawnPoint(myTeam, myNum); System.out.println("point x=" + p.getX() + " y=" + p.getY() + " z=" + p.getZ()); printwriter.println("<point x=\"" + p.getX() + "\" y=\"" + p.getY() + "\" z=\"" + p.getZ() + "\"></point>"); printwriter.println("</team>"); } } } // 返す部分(テスト用) public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, java.io.IOException { // 共有させることによってこちらだけで実効できる doPost(req, resp); } }