/** * setzt, dass der Client bereit zum Spielen ist. Wenn alle Clients bereit zum Spielen sind, * wird allen ein Startsignal geschickt * * @param zeile Daten des Clients */ private void behandleBereitsein(String zeile) { bereit = true; int id = Integer.parseInt(zeile.substring(zeile.indexOf(";") + 1)); MultiplayerSpiel spiel = getSpielById(id); spiel.addSpieler(spieler); boolean alleBereit = true; for (MultiplayerSpieler spieler : spiel.getAlleSpieler()) for (ArduinoRacerConnectionThread thread : threads) if (spieler.getId() == thread.spieler.getId()) alleBereit &= thread.bereit; System.out.println("ALLEBEREIT?" + alleBereit); if (alleBereit) { spiele.remove(spiel); try { sendeVerfuegbareSpieleAnAlle(); } catch (Exception e1) { e1.printStackTrace(); } for (MultiplayerSpieler spieler : spiel.getAlleSpieler()) for (ArduinoRacerConnectionThread thread : threads) if (spieler.getId() == thread.spieler.getId()) { try { thread.out.writeObject(SPIEL_START); System.out.println(SPIEL_START); thread.out.flush(); } catch (Exception e) { e.printStackTrace(); } } } }
/** * passt die Daten (Auto, Name) des Spielers an und schickt diesem seine zugewiesene ID * * @param zeile Daten, auf die der Spieler angepasst werden soll * @throws IOException wenn das Senden der ID fehlschlägt */ private void behandleSpielerdetails(String zeile) throws IOException { spieler = new MultiplayerSpieler(); spieler.setAuto( new MultiplayerAuto( Integer.parseInt(zeile.substring(AUTO.length(), zeile.indexOf(";"))))); zeile = zeile.substring(zeile.indexOf(";") + 1); spieler.setName(zeile); synchronized (this) { spieler.setId(currentID++); } out.writeObject(spieler.getId()); }
/** fragt die Eingaben des Clients ab und reagiert dementsprechend */ @Override public void run() { try { String zeile = null; while ((zeile = in.readLine()) != null && !zeile.equals(CLOSE)) { System.out.println(zeile); synchronized (spiele) { if (zeile.indexOf(UMFRAGE_VERFUEGBARE_SPIELE) == 0) { sendeVerfuegbareSpiele(); } else if (zeile.indexOf(AUTO) == 0) { behandleSpielerdetails(zeile); } else if (zeile.indexOf(SPIEL_BEITRITT) == 0) { behandleBeitritt(zeile); } else if (zeile.indexOf(SPIEL_RUECKTRITT) == 0) { behandleRuecktritt(zeile); } else if (zeile.indexOf(SPIEL) == 0) { behandleNeuesSpiel(zeile); } else if (zeile.indexOf(SPIELER_BEREIT) == 0) { behandleBereitsein(zeile); } else if (zeile.indexOf(SPIEL_LOESCHUNG) == 0) { behandleSpielLoeschen(zeile); } } } } catch (Exception e) { e.printStackTrace(); } finally { try { out.close(); in.close(); client.close(); threads.remove(this); System.out.println("close" + spiele.size()); for (int i = 0; i < spiele.size(); i++) { if (spiele.get(i).getSpielersteller().getId() == spieler.getId()) { spiele.remove(i); i = spiele.size() + 1; } else System.err.println( spiele.get(i).getSpielersteller().getId() + " != " + spieler.getId()); } } catch (Exception e) { e.printStackTrace(); } } }
/** * löscht das Spiel, das den übergebenen Daten entspricht, jedoch nur, wenn der Client, der das * Spiel löschen will das Spiel erstellt hat. Nachdem das Spiel gelöscht wird, werden alle * Spiele an alle Clients geschickt * * @param zeile Daten, des zu löschenden Spiels */ private void behandleSpielLoeschen(String zeile) { zeile = zeile.substring(zeile.indexOf(";") + 1); MultiplayerSpiel spiel = getSpielById(Integer.parseInt(zeile)); if (spiel.getSpielersteller().getId() == spieler.getId()) { spiele.remove(spiel); sendeVerfuegbareSpieleAnAlle(); } }
/** * behandelt einen Beitritt des Clients zu ein Spiel. Dabei werden die übergebenen Daten zu * einem vorhanden Spiel zugewiesen und bei einem erfolglosen Beitritt eine dementsprechende * Meldung geschickt. Ansonsten wir eine Beitrittsbestätigung geschickt. * * @param zeile Daten des Clients * @throws IOException Wenn beim Senden ein Fehler auftritt */ private void behandleBeitritt(String zeile) throws IOException { System.out.println("behandleBeitritt"); int id = Integer.parseInt(zeile.substring(zeile.indexOf(";") + 1)); MultiplayerSpiel spiel = getSpielById(id); String grund = null; if (spiel == null) grund = "Teilnahme am Spiel fehlgeschlagen"; else if (spiel.hasSpieler(spieler.getId())) grund = "Spieler mit Ihrer ID ist bereits im Spiel vorhanden"; else if (spiel.hasAutofarbe(spieler.getAuto().getFarbe())) grund = "Spieler mit Ihrem Auto ist bereits im Spiel vorhanden"; else if (spiel.hasSpielername(spieler.getName())) grund = "Spieler mit Ihrem Name ist bereits im Spiel vorhanden"; else { spiel.addSpieler(spieler); out.writeObject(BEITRITTS_BESTAETIGUNG + ";" + id); out.flush(); sendeVerfuegbareSpieleAnAlle(); if (spiel.getGesamtSpieler() == spiel.getBegetetreteneSpieler()) { for (MultiplayerSpieler spieler : spiel.getSpieler()) for (ArduinoRacerConnectionThread thread : threads) if (spieler.getId() == thread.spieler.getId()) { thread.out.writeObject(SPIEL_OK); System.out.println("SPIEL_PK"); thread.out.flush(); } System.out.println(spiel.getSpielersteller().getId() + threads.toString()); for (ArduinoRacerConnectionThread thread : threads) if (spiel.getSpielersteller().getId() == thread.spieler.getId()) { thread.out.writeObject(SPIEL_OK); System.out.println("SPIEL_OK TO SERVER"); } } } if (grund != null) { out.writeObject(BEITRITTS_ABSAGE + ";" + id + ";" + grund); out.flush(); } }
/** * löscht den Spieler vom übergeben Spiel und sendet alle Spiele an alle. * * @param zeile Daten, des Spiels, bei dem der Spieler gelöscht werden soll */ private void behandleRuecktritt(String zeile) { MultiplayerSpiel spiel = getSpielById(Integer.parseInt(zeile.substring(zeile.indexOf(";") + 1))); spiel.removeSpieler(spieler.getId()); sendeVerfuegbareSpieleAnAlle(); }
public String toString() { return spieler.getId() + ""; }