import java.net.*; import javax.swing.*; import java.io.*; import java.util.zip.*; import java.awt.event.*; import java.util.*; import java.awt.*; public class Client extends Thread implements KeyListener, MouseListener{ final static int serverPort = 27055; final long walklag = 250; long lastwalk = 0; long lastshot = 0; long lastheartbeat; final long heartbeatdelay = 3000; public HashMap scoreBoard; final InetAddress server; public Player p; DatagramSocket s; final InetAddress group; public int num; public GameMap map; private Carto c; private Controls con; private Scores scor; private StatsPanel stat; private ItemPanel ipanel; private WepPanel wpanel; private JFrame F; public Client(InetAddress serv, Player playa) throws SocketException, UnknownHostException, IOException, ClassNotFoundException { map = null; server = serv; group = InetAddress.getByName("228.5.6.7"); s = new DatagramSocket(27099); //s.joinGroup(group); p = playa; Thread t = new Thread(this); c = new Carto(map); c.addMouseListener(this); con = new Controls(); stat = new StatsPanel(this); ipanel = new ItemPanel(p,c); wpanel = new WepPanel(p,c); scor = new Scores(scoreBoard); F = new JFrame(); F.addKeyListener(this); F.setSize(900,700); wpanel.set(); stat.set(); wpanel.repaint(); stat.repaint(); F.getContentPane().add(BorderLayout.NORTH, stat); F.getContentPane().add(BorderLayout.NORTH, wpanel); F.getContentPane().add(BorderLayout.NORTH, ipanel); F.getContentPane().add(BorderLayout.WEST, scor); F.getContentPane().add(BorderLayout.SOUTH, con); F.getContentPane().add(c); F.setVisible(true); requestNum(); typeHandler(); lastheartbeat = System.currentTimeMillis(); t.start(); } public void run() { while(true) { if(p.isDead()) { try { sendPlayer(); } catch (IOException e) { e.printStackTrace(System.err); } catch (ClassNotFoundException e) { e.printStackTrace(System.err); }; p.x=1337; } if(System.currentTimeMillis() > (lastheartbeat + heartbeatdelay)) { try { sendHeartbeat(); } catch (IOException e) { e.printStackTrace(System.err); } catch (ClassNotFoundException e) { e.printStackTrace(System.err); } lastheartbeat = System.currentTimeMillis(); } try { typeHandler(); } catch (IOException e) { e.printStackTrace(System.err); } catch (ClassNotFoundException e) { e.printStackTrace(System.err); } //try { sendChat(s,new Plaintext(new Player("bar"),"foo")); } //catch (IOException e) { System.out.println("here"); return; } //catch (ClassNotFoundException e) { return; } } } private void requestNum() throws IOException,ClassNotFoundException { ByteArrayOutputStream byteArr = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteArr); out.writeObject("GETMAPNUM"); DatagramPacket query = new DatagramPacket(byteArr.toByteArray(), byteArr.toByteArray().length, server, serverPort); s.send(query); //System.out.println("SKEET SKEET2"); } private void sendHeartbeat() throws IOException,ClassNotFoundException { ByteArrayOutputStream byteArr = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteArr); out.writeObject("HELO"); DatagramPacket query = new DatagramPacket(byteArr.toByteArray(), byteArr.toByteArray().length, server, serverPort); s.send(query); //System.out.println("SKEET SKEET2"); } private void sendPlayer() throws IOException,ClassNotFoundException { ByteArrayOutputStream byteArr = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteArr); out.writeObject(p); DatagramPacket query = new DatagramPacket(byteArr.toByteArray(), byteArr.toByteArray().length, server, serverPort); s.send(query); //System.out.println("SKEET SKEET2"); } private void typeHandler() throws IOException, SocketException, ClassNotFoundException { byte[] buffer = new byte[102400]; DatagramPacket reply = new DatagramPacket(buffer, buffer.length); s.receive(reply); ObjectInputStream inputBuffer = new ObjectInputStream(new GZIPInputStream(new ByteArrayInputStream(reply.getData()))); Object object = inputBuffer.readObject(); //System.out.println(object.getClass()); if(object instanceof GameMap) { map = (GameMap) object; //System.out.println("map gotten"); c.setMap(map); c.repaint(); } else if(object instanceof String) { System.out.println(object); } else if(object instanceof HashMap) { scoreBoard = (HashMap)object; scor.set(); scor.repaint(); } else if(object.getClass().isArray()) { int[] tmp = (int[]) object; p.setLocation(tmp[0],tmp[1]); System.out.println("sup"+tmp[0]+tmp[1]); } else if(object instanceof Integer) { //System.out.println("SKEET SKEET"); //System.out.println(object); num = (Integer) object; p.setMapNum(num); //s.joinGroup(group); } else if( object instanceof Ammunition) { p.healthDrain((Ammunition) object); stat.set(); } } public void sendChat(MulticastSocket s, String text) throws IOException, SocketException { ByteArrayOutputStream byteArr = new ByteArrayOutputStream(); ObjectOutputStream o = new ObjectOutputStream(byteArr); o.writeObject(text); DatagramPacket packet = new DatagramPacket(byteArr.toByteArray(), byteArr.toByteArray().length, group, 31337); try { s.send(packet); } catch (IOException e) { return; } } public void keyPressed(KeyEvent e) { String in = e.getKeyChar() + ""; if ("wasd".indexOf(in)!=-1) { long now = System.currentTimeMillis(); if (now-lastwalk>=walklag) { int x = p.getx(); int y = p.gety(); if (in.equals("w")) x-=1; if (in.equals("a")) y-=1; if (in.equals("s")) x+=1; if (in.equals("d")) y+=1; if (map.isValid(x,y)&&map.isEmpty(x,y)) try {lastwalk = now; System.out.println("sending...?");sendMove(x,y); } catch (IOException ioe) {System.out.println("NOT SENDING");}; } } } public void mouseClicked(MouseEvent e) { if(e.BUTTON1==e.getButton()) { System.out.println("gotclick"); long now = System.currentTimeMillis(); if(now - lastshot > p.currentWep().cooldown()) { int dx = e.getX() - (p.gety() * 20 + 10); int dy = (p.getx() * 20 + 10) - e.getY(); double theta = Math.atan(1.0*dy/dx); if (theta < 0) {theta += Math.PI; if (dx > 0) theta += Math.PI;} else {if (dx < 0) theta += Math.PI;} Ammunition a = p.currentWep().ammo(); a.set(p.getx()*20+10,p.gety()*20+10,theta,p); try { lastshot = now; requestAmmo(a); p.currentWep().use(); } catch (IOException ioe) {}; } } } public void sendMove(int x, int y) throws IOException, SocketException { ByteArrayOutputStream byteArr = new ByteArrayOutputStream(); ObjectOutputStream o = new ObjectOutputStream(byteArr); o.writeObject(new int[]{x,y}); DatagramPacket packet = new DatagramPacket(byteArr.toByteArray(), byteArr.toByteArray().length, server, serverPort); s.send(packet); } public void requestAmmo(Ammunition a) throws IOException, SocketException { System.out.println("shooting"); ByteArrayOutputStream byteArr = new ByteArrayOutputStream(); ObjectOutputStream o = new ObjectOutputStream(byteArr); o.writeObject(a); DatagramPacket packet = new DatagramPacket(byteArr.toByteArray(), byteArr.toByteArray().length, server, serverPort); s.send(packet); } public void keyReleased(KeyEvent e) {} public void keyTyped(KeyEvent e) {} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {} public static void main(String args[]) throws IOException, ClassNotFoundException, SocketException, FileNotFoundException, InterruptedException { if(args.length > 0) { Client me = new Client(InetAddress.getByName(args[0]), new Player(args[1])); } else { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Enter your desired name: "); String name = in.readLine(); System.out.println("Enter the server you want to connect to (localhost for your own computer): "); String addr = in.readLine(); Client me = new Client(InetAddress.getByName(addr), new Player(name)); } }