import java.awt.Cursor; import java.text.DecimalFormat; import java.net.Socket; import java.awt.Graphics; import java.net.UnknownHostException; import javax.swing.JOptionPane; import java.io.IOException; import java.net.SocketException; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseMotionAdapter; import java.awt.event.MouseAdapter; import java.awt.Color; import java.awt.event.MouseEvent; import java.io.BufferedReader; import java.io.FileReader; import java.awt.Robot; import java.awt.AWTException; import java.awt.image.BufferedImage; import java.awt.Toolkit; import java.awt.Point; public class PlayPanel extends GamePanel { public static boolean STOPTHREAD_AFTER_START = false; private boolean requestedFocus = false; public static int objectsDrawn = 0; // Used to assign a specific id to any object // Server only public static long instanceID = 0; private boolean pressU, pressD, pressL, pressR; public static String name; public static boolean host; // are you hosting? public static String gameType = null; // data lists public static BulletList bList; // bullets public static GrenadeList nList; // nades // mouse controller private Robot mouseForcer; // map details public static String mapFile; public static int mapWidth; public static int mapHeight; public static int redSpawns = 0; public static int blueSpawns = 0; public static int[][] map; public static final int OBJ_FLOOR = 0; public static final int OBJ_WALL = 1; public static final int OBJ_CRATE = 2; public static final int OBJ_RED_SPAWN = 3; public static final int OBJ_BLUE_SPAWN = 4; // images private BufferedImage floorImg = Sprite.loadImage("Images/floor.gif",false); private BufferedImage wallImg = Sprite.loadImage("Images/wall.gif",false); private BufferedImage crateImg = Sprite.loadImage("Images/crate.gif",false); // view vars public static int viewX = 0; public static int viewY = 0; // minimap public static int miniMapX = 20; public static int miniMapY = 20; public static boolean showMiniMap = true; // mouse vars private Cursor cursor = Toolkit.getDefaultToolkit().createCustomCursor(Sprite.loadImage("Images/cursor.gif",true),new Point(16,16),"Blah"); private int mouseX = 0; private int mouseY = 0; private int mousePrevX = 0; private int mousePrevY = 0; private int mouseDir = 0; private int mousePrevDir = 0; private boolean mouseMoving = false; private boolean sentDir = false; private int sentMouseDir = 0; // fps private DecimalFormat df = new DecimalFormat("0"); // ping board private boolean showPingBoard = false; private static final int PING_BOARD_X = 150; private static final int PING_BOARD_Y = 75; // time vars/flags for each game round public double timeLimit = Time.minutesToNano(2); public double timeLimitHalf = timeLimit / 2.0; public double timeLimitQuarter = timeLimit / 4.0; public double timeLimitQuarterHalf = timeLimit / 8.0; public long timeStart; public boolean showQuarterHalfMessage = false; public boolean showQuarterMessage = false; public boolean showHalfMessage = false; public long doneTimeStart; // respawn time private double respawnTime = Time.secondsToNano(5); // For hosting only public static GameServer gameServer; public static int maxPlayers; // For hosting and joining Socket sock; GameReceiver receiver; GameSender sender; // chat vars private final int maxChatLines = 5; public Chat gameChat = new Chat(maxChatLines); private String inputLine = ""; private boolean chatting = false; // whether we are typing // database of all the players public static PlayerList pList; public static String rawScoreData = null; private boolean showMyPlayerDetails = false; // Yourself public static Player you = null; private GameFrame gameFrame; // Sound private SoundStore soundManager = SoundStore.get();; public static Sound NADE_EXPLODE_SND; public static Sound GUN_PLASMA_SND; // Debug mode constructor public PlayPanel(GameFrame frame, String yourName, String gameType, String mapFile) { //GameVars.bgMusic.playAsMusic(1f,1f); you = null; // set up your own equipment for (int i = 0; i < GameVars.equipment.length; i++) { GameVars.equipment[i] = "n/a"; } GameVars.equipment[3] = "upgrade_optics"; // load map this.mapFile = mapFile; if (!loadMap(mapFile)) { JOptionPane.showMessageDialog(this,"Could not find: "+mapFile); System.exit(0); } // init lists pList = new PlayerList(); nList = new GrenadeList(); bList = new BulletList(); // you are host host = true; this.maxPlayers = 1; try { mouseForcer = new Robot(); } catch (AWTException e) { System.out.println("Could not set up mouseForcer"); } GameState.current = GameState.IN_GAME; this.name = yourName; gameFrame = frame; this.gameType = gameType; // set up server gameServer = new GameServer(this,3000); // start timer if you are playing tag/deathmatch/teammatch if (gameType.equals(GameVars.TAG) || gameType.equals(GameVars.DEATH_MATCH) || gameType.equals(GameVars.TEAM_MATCH)) { timeStart = System.nanoTime(); } // add listeners this.addKeyListener(keyL); this.addMouseListener(mouseL); this.addMouseMotionListener(mouseMotionL); // change the cursor this.setCursor(cursor); // connect to your own server joinGame("127.0.0.1",3000); } // Hosting constructor public PlayPanel(GameFrame frame, String yourName, String gameName, String gameType, int maxPlayers, String mapFile) { soundManager.init(); try { NADE_EXPLODE_SND = soundManager.getOgg("Sound/nade_explode.ogg"); GUN_PLASMA_SND = soundManager.getOgg("Sound/gun_plasma.ogg"); } catch (IOException ioe) { System.out.println(ioe); } you = null; // load map this.mapFile = mapFile; if (!loadMap(mapFile)) { JOptionPane.showMessageDialog(this,"Could not find: "+mapFile); System.exit(0); } // init lists pList = new PlayerList(); nList = new GrenadeList(); bList = new BulletList(); // you are host host = true; this.maxPlayers = maxPlayers; try { mouseForcer = new Robot(); } catch (AWTException e) { System.out.println("Could not set up mouseForcer"); } GameState.current = GameState.IN_GAME; this.name = yourName; gameFrame = frame; this.gameType = gameType; // set up server gameServer = new GameServer(this,3000); // now that server is set up, attempt to submit to lobby game list frame.lobby.sender.send("*HOSTING*"+GameVars.myIP+"*3000*"+gameName+"*"+gameType); // start timer if you are playing tag/deathmatch/teammatch if (gameType.equals(GameVars.TAG) || gameType.equals(GameVars.DEATH_MATCH) || gameType.equals(GameVars.TEAM_MATCH)) { timeStart = System.nanoTime(); } // add listeners this.addKeyListener(keyL); this.addMouseListener(mouseL); this.addMouseMotionListener(mouseMotionL); // change the cursor this.setCursor(cursor); // connect to your own server joinGame("127.0.0.1",3000); } // Join Constructor public PlayPanel(GameFrame frame, String yourName, Socket sock, String gameType) { you = null; // init lists pList = new PlayerList(); nList = new GrenadeList(); bList = new BulletList(); GameState.current = GameState.IN_GAME; this.name = yourName; gameFrame = frame; host = false; this.gameType = gameType; // tell lobby that you are in a game frame.lobby.sender.send("*PLAYING*"); this.addKeyListener(keyL); this.addMouseListener(mouseL); this.addMouseMotionListener(mouseMotionL); this.setCursor(cursor); this.sock = sock; try { sock.setTcpNoDelay(true); } catch (SocketException se) { System.out.println("Could not disable Nagle's Algorithm"); } sender = new GameSender(sock); receiver = new GameReceiver(this, sock); } // loads a map public boolean loadMap(String mapFile) { try { redSpawns = 0; blueSpawns = 0; BufferedReader in = new BufferedReader(new FileReader("./Maps/"+mapFile)); String[] data = GameVars.getItems(in.readLine()); int newWidth = Integer.parseInt(data[1]); int newHeight = Integer.parseInt(data[2]); map = new int[newWidth][newHeight]; for (int j = 0; j < newHeight; j++) { data = GameVars.getItems(in.readLine()); for (int i = 0; i < newWidth; i++) { map[i][j] = Integer.parseInt(data[i]); if (map[i][j] == OBJ_RED_SPAWN) { redSpawns++; } else if (map[i][j] == OBJ_BLUE_SPAWN) { blueSpawns++; } } } mapWidth = newWidth*50; mapHeight = newHeight*50; return true; } catch (IOException e) { return false; } } // for hosting only public void joinGame(String ip,int port) { try { sock = new Socket(ip, port); } catch (UnknownHostException uhe) { System.err.println("Unable to connect: "+uhe); JOptionPane.showMessageDialog(null,"Could not connect to game.","Message",JOptionPane.OK_OPTION); System.exit(0); } catch (IOException ioe) { System.err.println("Unable to connect: "+ioe); JOptionPane.showMessageDialog(null,"Could not connect to game.","Message",JOptionPane.OK_OPTION); System.exit(0); } try { sock.setTcpNoDelay(true); } catch (SocketException se) { System.out.println("Could not disable Nagle's Algorithm"); } sender = new GameSender(sock); receiver = new GameReceiver(this, sock); } // Closes the socket connection to the game server // Must be called before closing in and out readers // Closing the sock terminates data = in.readLine() public void closeSock() { try { sock.close(); } catch (IOException ioe) { System.out.println("IOException: " + ioe); } } KeyAdapter keyL = new KeyAdapter() { public void keyPressed(KeyEvent e) { int keyCode = e.getKeyCode(); // player movement keys if (!chatting) { if (keyCode == KeyEvent.VK_W) { pressU = true; } if (keyCode == KeyEvent.VK_S) { pressD = true; } if (keyCode == KeyEvent.VK_D) { pressR = true; } if (keyCode == KeyEvent.VK_A) { pressL = true; } } if (chatting) { if (keyCode == e.VK_BACK_SPACE) { if (inputLine.length() > 0) { inputLine = inputLine.substring(0, inputLine.length() - 1); } } } } public void keyReleased(KeyEvent e) { int keyCode = e.getKeyCode(); // Enter key if (keyCode == e.VK_ENTER) { if (chatting) { boolean sendMessage = true; String message = inputLine.trim(); if (message.length() == 0) { sendMessage = false; } if (sendMessage) { inputLine = ""; sender.send("*MESSAGE*" + gameFrame.lobby.name + ": " + message); // return the user to the game chatting = false; } else { // the message was empty so user must want to exit chat chatting = false; } } else { // user must want to chat chatting = true; } } // Escape key if (keyCode == KeyEvent.VK_ESCAPE) { stopThread(); } // F1 key for debugging if (keyCode == KeyEvent.VK_F1) { if (showMyPlayerDetails) { showMyPlayerDetails = false; } else { showMyPlayerDetails = true; } } // F2 key for minimap toggle if (keyCode == KeyEvent.VK_F2) { if (showMiniMap) { showMiniMap = false; } else { showMiniMap = true; } } // player movement keys, reload key if (!chatting) { if (keyCode == KeyEvent.VK_W) { pressU = false; } if (keyCode == KeyEvent.VK_S) { pressD = false; } if (keyCode == KeyEvent.VK_D) { pressR = false; } if (keyCode == KeyEvent.VK_A) { pressL = false; } if (keyCode == KeyEvent.VK_R) { if (you != null) { if (!you.respawning) { you.getPrimaryGun().reload(); } } } } // chatting keys if (chatting) { char keyChar = e.getKeyChar(); String validChar = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`1234567890-= ~!@#$%^&*()_+{}|:<>?[];',./"; if (validChar.indexOf(String.valueOf(keyChar)) != -1) { inputLine = inputLine + keyChar; } } } }; MouseMotionAdapter mouseMotionL = new MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { //if (getSource() == e.MOUSE_MOVED) { // mouseMoving = true; //} //else { // mouseMoving = false; //} mouseX = e.getX(); mouseY = e.getY(); } public void mouseDragged(MouseEvent e) { mouseX = e.getX(); mouseY = e.getY(); } }; MouseAdapter mouseL = new MouseAdapter() { public void mousePressed(MouseEvent e) { int button = e.getButton(); if (button == e.BUTTON1) { if (GameState.current == GameState.IN_GAME) { if (gameType.equals(GameVars.DEATH_MATCH) || gameType.equals(GameVars.TEAM_MATCH)) { if (you != null) { if (!you.respawning) { you.getPrimaryGun().fire(mouseDir, sender); } } } } } if (button == e.BUTTON3) { if (GameState.current == GameState.IN_GAME) { if (gameType.equals(GameVars.DEATH_MATCH) || gameType.equals(GameVars.TEAM_MATCH)) { if (you != null) { if (!you.respawning && you.getNades() > 0) { you.setNades(you.getNades() - 1); sender.send("*NEW_NADE*"); } } } } } } // if the mouse gets out of the game, move it back in public void mouseExited(MouseEvent e) { if (GameVars.autoKeepCursor) { mouseForcer.mouseMove(gameFrame.getX() + mouseX, gameFrame.getY() + mouseY); } } }; public void gameUpdate() { if (!this.hasFocus() && !requestedFocus) { this.setFocusable(true); this.requestFocus(); requestedFocus = true; } if (STOPTHREAD_AFTER_START) { stopThread(); } if (you != null) { // perform primary gun update you.getPrimaryGun().gunUpdate(); // calculate fire direction double yourX = you.getX(); double yourY = you.getY(); double yourXScreen = yourX - viewX; double yourYScreen = yourY - viewY; double angle = Math.atan2( -(mouseY - yourYScreen), (mouseX - yourXScreen)); angle = (angle + Math.PI * 2) % (Math.PI * 2); mouseDir = (int) Math.toDegrees(angle); you.setFireDirection(mouseDir); // check if your direction has changed if (mousePrevDir != mouseDir) { } } if (mousePrevX != mouseX || mousePrevY != mouseY) { mouseMoving = true; sentDir = false; mousePrevX = mouseX; mousePrevY = mouseY; } else { mouseMoving = false; if (!sentDir) { if (Math.abs(mouseDir-sentMouseDir) > 30) { if (host) { ListNode current = gameServer.clientList.first; while (current != null) { Client client = (Client) current.getValue(); if (client.inGame) { if (client.getClientName() != name) { client.sendMessage("*DIR*" + name + "*" + mouseDir); } } current = current.next(); } } else { this.sender.send("*DIR*" + mouseDir); } sentDir = true; sentMouseDir = mouseDir; } } } // perform time check if we are playing tag/deathmatch/teammatch and we are host if (host) { if (gameType.equals(GameVars.TAG) || gameType.equals(GameVars.DEATH_MATCH) || gameType.equals(GameVars.TEAM_MATCH)){ if (GameState.current == GameState.IN_GAME) { long timeDiff = System.nanoTime() - timeStart; if (timeDiff > (long) timeLimit) { // stop the game GameState.current = GameState.ROUND_OVER; // tell everyone the round is over gameServer.broadcast("*MESSAGE3*Round finished"); ListNode current = pList.first; while (current != null) { Player temp = (Player)current.getValue(); // if anyone is still respawing, respawn them if (temp.respawning) { // respawn the dead guy pList.respawn(temp.getName()); // tell everyone that this player has respawned gameServer.broadcast("*RESPAWN*" + temp.getName()); } ListNode current2 = gameServer.clientList.first; while (current2 != null) { Client client = (Client) current2.getValue(); if (client.inGame) { client.sendMessage("*MOVE*" + name + "*-1*" + (int) temp.getX() + "*" + (int) temp.getY()); if (temp.getName().equals(client.getClientName())) { client.sendMessage("*POINTS*"+temp.getScore()); } } current2 = current2.next(); } // send player info to master server for point additions if (!gameType.equals(GameVars.TAG)) { if (!GameVars.DEBUG_MODE) { this.gameFrame.lobby.sender.send("*RESULT*" + temp.getName() + "*" + temp.getScore()); } } current = current.next(); } // send server generated score board String[] data = pList.sortScoreDescending(); String rawData = "*SCORE*"; for (int i = 0; i < data.length; i++) { rawData = rawData + data[i] + "|"+pList.getPlayer(data[i]).getScore()+"*"; } gameServer.broadcast(rawData); // start the done timer doneTimeStart = System.nanoTime(); } if (timeDiff > (long) (timeLimit - timeLimitQuarterHalf) && !showQuarterHalfMessage) { gameServer.broadcast("*MESSAGE3*"+Time.nanoToSecondsString(timeLimitQuarterHalf) +" left"); showQuarterHalfMessage = true; } if (timeDiff > (long) (timeLimit - timeLimitQuarter) && !showQuarterMessage) { gameServer.broadcast("*MESSAGE3*"+Time.nanoToSecondsString(timeLimitQuarter)+" left"); showQuarterMessage = true; } if (timeDiff > (long) (timeLimit - timeLimitHalf) && !showHalfMessage) { gameServer.broadcast("*MESSAGE3*"+Time.nanoToSecondsString(timeLimitHalf)+" left"); showHalfMessage = true; } } else if (GameState.current == GameState.ROUND_OVER) { long timeDiff = System.nanoTime() - doneTimeStart; if ((double)timeDiff > 12000000000.0) { // past 12 seconds // reset everyone's scores on server ListNode current = pList.first; while (current != null) { Player temp = (Player)current.getValue(); temp.resetScore(); current = current.next(); } // tell everyone that the game has started gameServer.broadcast("*START*"); // start the game GameState.current = GameState.IN_GAME; // randomize the next it if we are playing tag if (gameType.equals(GameVars.TAG)) { int random = (int) (Math.random() * pList.getTotal()); gameServer.broadcast("*NEWIT*" + pList.getPlayer(random).getName()); } // reset time and time flags timeStart = System.nanoTime(); showQuarterHalfMessage = false; showQuarterMessage = false; showHalfMessage = false; } } } } if (GameState.current == GameState.IN_GAME) { if (you != null) { // update your view updateView(); if (!you.respawning) { int dir = getKeyBoardDir(); if (you.getDirection() != dir) { if (host) { you.setDirection(dir); if (GameVars.serverType == GameVars.SERVTYPE_DEADRECK) { ListNode current = gameServer.clientList.first; while (current != null) { Client client = (Client) current.getValue(); if (client.inGame) { if (!client.getClientName().equals(name)) { client.sendMessage("*MOVE*" + name + "*" + dir + "*" + (int) you.getX() + "*" + (int) you.getY()); } } current = current.next(); } } // dont need to set speed to 0 because the update velocity doesnt // update if the dir is not in 0-360 } else { you.setDirection(dir); sender.send("*MOVE*" + dir); } } } } } // update bullets if we are playing deathmatch if (gameType.equals(GameVars.DEATH_MATCH) || gameType.equals(GameVars.TEAM_MATCH)) { bList.updateAll(); } // update grenades if we are playing deathmatch if (gameType.equals(GameVars.DEATH_MATCH) || gameType.equals(GameVars.TEAM_MATCH)) { nList.updateAll(); } // update all player's movements ListNode current = pList.first; while (current != null) { Player player = (Player) current.getValue(); player.update(); if (host) { // if this player is respawning, check timer to respawn him if (player.respawning) { if (System.nanoTime() - player.lastDeathTime > respawnTime) { // respawn the dead guy pList.respawn(player.getName()); // tell everyone that this player has respawned gameServer.broadcast("*RESPAWN*" + player.getName()); player.setDirection(-1); ListNode current2 = gameServer.clientList.first; while (current2 != null) { Client client = (Client) current2.getValue(); if (client.inGame) { if (!client.getClientName().equals(name)) { client.sendMessage("*MOVE*" + name + "*-1*" + (int) player.getX() + "*" + (int) player.getY()); } } current2 = current2.next(); } } } else { if (GameVars.serverType == GameVars.SERVTYPE_ABSOLUTE) { // if the player is still moving, then broadcast, except yourself if (player.getDirection() != -1) { ListNode current2 = gameServer.clientList.first; while (current2 != null) { Client client = (Client) current2.getValue(); if (client.inGame) { if (!client.getClientName().equals(PlayPanel.name)) { client.sendMessage("*MOVE_POS*" + player.getName() + "*" + (int) player.getX() + "*" + (int) player.getY()); } } current2 = current2.next(); } } } } // check player collision if we are playing tag if (gameType.equals(GameVars.TAG)) { if (Player.whoIsIt.equals(player.getName())) { ListNode current2 = pList.first; while (current2 != null) { Player temp = (Player) current2.getValue(); if (!temp.getName().equals(player.getName())) { if (player.intersects(temp)) { temp.incScore( -1); double randomX = Math.random() * (GameFrame.frameWidth - 15); double randomY = Math.random() * (GameFrame.frameHeight - 15); temp.setLocation(randomX, randomY); gameServer.broadcast("*NEWIT*" + temp.getName()); gameServer.broadcast("*MESSAGE3*" + temp.getName() + " is now it."); } } current2 = current2.next(); } } } // check bullet collision if we are playing team match if (gameType.equals(GameVars.TEAM_MATCH)) { if (!player.respawning) { ListNode current2 = bList.first; while (current2 != null) { Bullet temp = (Bullet) current2.getValue(); // make sure this isnt this guy's bullet if (!temp.getOwner().equals(player.getName())) { if (temp.getBounds().intersects(player.getBounds())) { // give the bullet's owner a point if he didn't kill someone on his team Player bulletOwner = pList.getPlayer(temp.getOwner()); int bulletOwnerTeam = bulletOwner.getTeam(); int playerTeam = player.getTeam(); if (bulletOwnerTeam != playerTeam) { bulletOwner.incScore(1); // tell everyone who died gameServer.broadcast("*DEAD_PLAYER*" + player.getName()); // start timer on the dead guy's respawn player.lastDeathTime = System.nanoTime(); // tell everyone to get rid of that bullet gameServer.broadcast("*DEAD_BULLET*" + temp.getID()); // tell everyone who killed who gameServer.broadcast("*MESSAGE2*" + bulletOwner.getName() + " killed " + player.getName()); } } } current2 = current2.next(); } } } // check bullet collision if we are playing deathmatch if (gameType.equals(GameVars.DEATH_MATCH)) { if (!player.respawning) { ListNode current2 = bList.first; while (current2 != null) { Bullet temp = (Bullet) current2.getValue(); // make sure this isnt this guy's bullet if (!temp.getOwner().equals(player.getName())) { if (temp.getBounds().intersects(player.getBounds())) { // give the bullet's owner a point Player bulletOwner = pList.getPlayer(temp.getOwner()); bulletOwner.incScore(1); // tell everyone who died gameServer.broadcast("*DEAD_PLAYER*" + player.getName()); // start timer on the dead guy's respawn player.lastDeathTime = System.nanoTime(); // tell everyone to get rid of that bullet gameServer.broadcast("*DEAD_BULLET*" + temp.getID()); // tell everyone who killed who gameServer.broadcast("*MESSAGE2*" + bulletOwner.getName() + " killed " + player.getName()); } } current2 = current2.next(); } } } } current = current.next(); } } // Updates the coordinates of the view private void updateView() { // if you are in the game if (you != null) { viewX = (int)you.getX() - GameFrame.frameWidth/2; viewY = (int)you.getY() - GameFrame.frameHeight/2; } } public static boolean isSolid(int tile) { switch (tile) { case OBJ_CRATE: return true; case OBJ_WALL: return true; } return false; } public void gameRender() { objectsDrawn = 0; // clear background dbg.setColor(Color.black); dbg.fillRect(0, 0, this.getWidth(), this.getHeight()); dbg.setFont(GameVars.normalFont); int[][] tempMap = map; for (int i = 0; i < tempMap.length; i++) { for (int j = 0; j < tempMap[0].length; j++) { if (viewX < i*50+50 && viewX+GameFrame.frameWidth > i*50 && viewY < j*50+50 && viewY+GameFrame.frameHeight > j*50) { if (tempMap[i][j] == OBJ_FLOOR) { dbg.drawImage(floorImg, i * 50 - viewX, j * 50 - viewY, null); objectsDrawn++; } else if (tempMap[i][j] == OBJ_WALL) { dbg.drawImage(wallImg, i * 50 - viewX, j * 50 - viewY, null); objectsDrawn++; } else if (tempMap[i][j] == OBJ_CRATE) { dbg.drawImage(crateImg, i * 50 - viewX, j * 50 - viewY, null); objectsDrawn++; } else if (tempMap[i][j] == OBJ_RED_SPAWN) { dbg.drawImage(floorImg, i * 50 - viewX, j * 50 - viewY, null); objectsDrawn++; } else if (tempMap[i][j] == OBJ_BLUE_SPAWN) { dbg.drawImage(floorImg, i * 50 - viewX, j * 50 - viewY, null); objectsDrawn++; } } } } // draw minimap if (showMiniMap) { dbg.setColor(Color.white); dbg.drawRect(miniMapX, miniMapY, (tempMap.length * 50) / 10, (tempMap[0].length * 50) / 10); dbg.drawRect(miniMapX + viewX / 10, miniMapY + viewY / 10, GameFrame.frameWidth / 10, GameFrame.frameHeight / 10); for (int i = 0; i < tempMap.length; i++) { for (int j = 0; j < tempMap[0].length; j++) { if (tempMap[i][j] == OBJ_WALL) { dbg.setColor(Color.white); dbg.fillRect(miniMapX + (i * 50) / 10, miniMapY + (j * 50) / 10, 5, 5); } else if (tempMap[i][j] == OBJ_CRATE) { dbg.setColor(Color.yellow); dbg.fillRect(miniMapX + (i * 50) / 10, miniMapY + (j * 50) / 10, 5, 5); } } } ListNode current = pList.first; while (current != null) { Player obj = (Player) current.getValue(); if (!obj.respawning) { if (gameType.equals(GameVars.TEAM_MATCH)) { if (obj.getTeam() == GameVars.TEAM_RED) { dbg.setColor(Color.red); } else if (obj.getTeam() == GameVars.TEAM_BLUE) { dbg.setColor(Color.blue); } } else { if (obj.getName().equals(name)) { dbg.setColor(Color.red); } else { dbg.setColor(Color.yellow); } } dbg.drawRect(PlayPanel.miniMapX + (int) ((obj.getX()) / 10), PlayPanel.miniMapY + (int) ((obj.getY()) / 10), 1, 1); } current = current.next(); } } // draw game objects nList.drawAll(dbg); pList.drawAll(dbg); bList.drawAll(dbg); if (GameVars.equipment[3].equals("upgrade_optics")) { if (you != null) { double yourX = you.getX(); double yourY = you.getY(); if (!you.respawning) { // draw sniper line dbg.setColor(Color.green); dbg.drawLine((int) (yourX - viewX), (int) (yourY - viewY), (int) (mouseX), (int) (mouseY)); // draw detect radius // dbg.setColor(Color.green); // dbg.drawOval((int) (yourX - viewX) - 300, (int) (yourY - viewY) - 300, 600, 600); // draw enemy indicators ListNode current = pList.first; while (current != null) { Player temp = (Player) current.getValue(); if (!temp.getName().equals(name)) { if (GameVars.distance(yourX, yourY, temp.getX(), temp.getY()) < 400) { if (gameType.equals(GameVars.DEATH_MATCH) || gameType.equals(GameVars.TAG)) { if (!temp.respawning) { dbg.setColor(Color.red); dbg.drawLine((int) (yourX - viewX), (int) (yourY - viewY), (int) (temp.getX() - viewX), (int) (temp.getY() - viewY)); } } if (gameType.equals(GameVars.TEAM_MATCH)) { if (!temp.respawning) { if (temp.getTeam() != you.getTeam()) { dbg.setColor(Color.red); dbg.drawLine((int) (yourX - viewX), (int) (yourY - viewY), (int) (temp.getX() - viewX), (int) (temp.getY() - viewY)); } } } } } current = current.next(); } } } } // draw the chat dbg.setFont(GameVars.normalFont); gameChat.drawChat(dbg,10,380); // draw score board if the round is over if (GameState.current == GameState.ROUND_OVER) { drawScoreBoard(dbg); } dbg.setColor(Color.white); dbg.setFont(GameVars.normalFont); dbg.drawString("FPS: "+df.format(fpsCounter.getAverageFPS()),5,15); if (showMyPlayerDetails) { if (you != null) { dbg.drawString("Player Pos: " + (int)you.getX() + "," + (int)you.getY(), 400, 15); } dbg.drawString("View Pos: " + viewX + "," + viewY,400,30); dbg.drawString("Fire Pos: " + mouseX + "," + mouseY, 400, 45); dbg.drawString("Fire Dir: " + mouseDir, 400, 60); dbg.drawString("Objects Drawn: " + objectsDrawn, 400, 75); } //dbg.drawString("Time: "+this.nanosecToString(System.nanoTime()-timeStart),150,15); if (chatting) { dbg.drawString("Say: " + inputLine + "|", 10, 480); } if (you != null) { if (you.respawning) { dbg.setColor(Color.GREEN); dbg.setFont(GameVars.largeFont); dbg.drawString("Respawning...", 120, 150); } dbg.setFont(GameVars.headingFont); if (you.getPrimaryGun().isReloading()) { dbg.setColor(Color.red); dbg.drawString("RELOADING",490,330); } dbg.setColor(Color.blue); dbg.drawString(you.getPrimaryGun().getName(),490,355); dbg.setColor(Color.orange); dbg.drawString("Ammo: "+you.getPrimaryGun().getAmmo(),490,370); dbg.drawString("Nades: "+you.getNades(),490,385); } } public void drawScoreBoard(Graphics g) { int x = 150; int y = 75; Color color = new Color(50,50,50,175); g.setColor(color); g.fillRect(x,y,300,350); g.setColor(Color.GREEN); g.setFont(GameVars.headingFont); g.drawString("Round Results",x+20,y+25); g.setColor(Color.YELLOW); g.setFont(GameVars.normalFont); g.drawString("Player Name",x+20,y+45); g.drawString("Score",x+130,y+45); g.setColor(Color.WHITE); boolean done = false; int count = 0; String temp = rawScoreData; int redPoints = 0; int bluePoints = 0; while (!done) { if (rawScoreData == null) { done = true; } else { int i = temp.indexOf("|"); if (i == -1) { done = true; } else { String player = temp.substring(0,i); temp = temp.substring(i + 1); i = temp.indexOf("*"); String score = temp.substring(0,i); temp = temp.substring(i + 1); Player obj = pList.getPlayer(player); if (obj != null) { if (obj.getTeam() == GameVars.TEAM_RED) { g.setColor(Color.red); redPoints += Integer.parseInt(score); } else if (obj.getTeam() == GameVars.TEAM_BLUE) { g.setColor(Color.blue); bluePoints += Integer.parseInt(score); } } g.drawString(player,x+20,y+65+count*20); g.drawString(score,x+130,y+65+count*20); count++; } } } g.setFont(GameVars.normalFont); g.setColor(Color.YELLOW); g.drawString("Next round will start in a moment",x+20,y+325); if (gameType.equals(GameVars.TEAM_MATCH)) { g.setFont(GameVars.headingFont); g.setColor(Color.red); g.drawString("Red Score: "+redPoints,x+20,y+300); g.setColor(Color.blue); g.drawString("Blue Score: "+bluePoints,x+165,y+300); g.setFont(GameVars.largeFont); if (redPoints > bluePoints) { g.setColor(Color.red); g.drawString("Red Team Wins",x+35,y+380); } if (bluePoints > redPoints) { g.setColor(Color.blue); g.drawString("Blue Team Wins",x+35,y+380); } if (redPoints == bluePoints) { g.setColor(Color.white); g.drawString("It is a Tie",x+35,y+380); } g.setFont(GameVars.normalFont); } } private void drawPingBoard(Graphics g) { Color color = new Color(50,50,50,175); g.setColor(color); g.fillRect(PING_BOARD_X,PING_BOARD_Y,180,20*pList.getTotal()); g.setFont(GameVars.normalFont); int i = 0; ListNode current = pList.first; while (current != null) { Player temp = (Player)current.getValue(); g.setColor(Color.white); g.drawString(GameVars.getValidText(g, temp.getName(), 100), PING_BOARD_X + 5, PING_BOARD_Y + 15+20*i); g.setColor(Color.green); //g.drawString(""+temp.getPing()+" ms",PING_BOARD_X+115,PING_BOARD_Y+15); i++; current = current.next(); } } public void onExit() { // To close the connection try { sender.closeOutStream(); receiver.closeInStream(); if (sock != null) { sock.close(); } } catch (IOException ioe) { System.err.println(ioe); } catch (NullPointerException npe) { System.err.println(npe); } if (host) { if (you != null) { if (you.getTeam() == GameVars.TEAM_RED) { GameVars.TOTAL_RED--; } if (you.getTeam() == GameVars.TEAM_BLUE) { GameVars.TOTAL_BLUE--; } } if (!GameVars.DEBUG_MODE) { // tell lobby to take off your game listing gameFrame.lobby.sender.send("*HOSTINGOFF*"); } // shutdown server gameServer.stopServer(); } else { // tell lobby that you are back from a game gameFrame.lobby.sender.send("*BACK*"); } if (GameVars.DEBUG_MODE) { System.exit(0); } else { //GUN_PLASMA_SND.restartMusic(1f,1f); //GUN_PLASMA_SND.restartMusic(); //GameVars.NADE_EXPLODE_SND.restartMusic(); gameFrame.lobby.lf.setVisible(true); gameFrame.lobby.startThread(20, 50); gameFrame.dispose(); } } private int getKeyBoardDir() { if (pressU && !pressD && !pressR && !pressL) { // up return 90; } else if (!pressU && pressD && !pressR && !pressL) { // down return 270; } else if (!pressU && !pressD && pressR && !pressL) { // right return 0; } else if (!pressU && !pressD && !pressR && pressL) { // left return 180; } else if (pressU && !pressD && pressR && !pressL) { // up-right return 45; } else if (pressU && !pressD && !pressR && pressL) { // up-left return 135; } else if (!pressU && pressD && pressR && !pressL) { // down-right return 315; } else if (!pressU && pressD && !pressR && pressL) { // down-left return 225; } else { // stop return -1; } } }