package client; import javax.swing.JOptionPane; /** * Trida reprezentujici hlavni prijmaci vlakno. */ public class Prijmani extends Thread { /** instance spojeni */ private Spojeni spojeni; /** atribut ukonceni vlakna */ private boolean konec = true; /** instance hlavniho okna */ private HlavniOkno okno; /** * Konstruktor tridy Prijmani. * * @param spojeni - spojeni * @param okno - hlavni okno */ public Prijmani(Spojeni spojeni, HlavniOkno okno){ this.spojeni = spojeni; this.okno = okno; } /** * Metoda pro obsluhu funkce vlakna. Na zaklade prijate zpravy * rozhodne prislusnou akci. */ @Override public void run(){ while(konec){ String zprava = spojeni.prijem(); if(zprava != null){ switch (zprava) { case "J": posliJmeno(false); break; case "N": posliJmeno(true); break; case "O": prijmyOtazku(); break; case "P": prijmyHrace(); break; case "C": prijmyCekej(); break; case "M": prijmyMuzes(); break; case "B": prijmyBody(); break; case "K": prijmyKonec(); break; case "V": prijmyVzdali(); break; case "Z": posliZiju(); break; case "X": prijmyKill(); break; case "U": prijmyKonecCinnosit(); break; case "E": konecSpojeni(); break; } } } } /** * Metoda pro oznameni ukonceni cinnosti serveru. */ private void prijmyKonecCinnosit(){ okno.zastavStopky(); konec = false; spojeni.zavriSpojeni(); JOptionPane.showMessageDialog(null, "Server ukoncil svou cinnost"); System.exit(0); } /** * Metoda pro prijmuti killu od serveru. */ private void prijmyKill(){ okno.zastavStopky(); konec = false; spojeni.zavriSpojeni(); JOptionPane.showMessageDialog(null, "Dostal jsi kill."); System.exit(0); } /** * Metoda pro reakci na ztratu spojeni. */ private void konecSpojeni(){ spojeni.zavriSpojeni(); konec = false; if(okno.getStopky().getInterval() == 0) JOptionPane.showMessageDialog(null, "Trvalo ti to moc dlouho. Koncis."); else JOptionPane.showMessageDialog(null, "Ztrata spojeni."); System.exit(1); } /** * Metoda pro poslani zpravy o zivote. */ private void posliZiju(){ spojeni.posli("Z;;"); } /** * Metoda pro poslani jmena hlavniho hrace. * * @param existujici - existujici hrac na serveru */ private void posliJmeno(boolean existujici){ String zprava = "Zadejte jmeno:"; if(existujici) zprava = "Hrac existuje. Zadjete jine jmeno:"; while(true){ String jmeno = JOptionPane.showInputDialog(null, zprava); if(jmeno != null && !jmeno.isEmpty()){ if(jmeno.length() < 49){ if(!jmeno.matches("\\|") && !jmeno.matches(";")){ if(jmeno.matches("^\\w+$")){ jmeno += ";;"; spojeni.posli("J;;"); spojeni.posli(String.format("%02d;;",jmeno.length())); spojeni.posli(jmeno); jmeno = jmeno.replaceAll(";;", ""); okno.getHrac().setJmeno(jmeno); break; } else{ zprava = "Jmeno obsahuje zakazane znaky.\nZadjete jmeno znovu:"; System.out.println("Jmeno obsahuje zakazane znaky."); } } else{ zprava = "Jmeno obsahuje zakazane znaky (|, ;).\nZadjete jmeno znovu:"; System.out.println("Jmeno obsahuje zakazane znaky."); } }else{ zprava = "Jmeno je prilis dlouhe (max. 49 znaku).\nZadjete jmeno znovu:"; System.out.println("Jmeno je prilis dlouhe."); } } else if(jmeno == null){ konec = false; spojeni.zavriSpojeni(); System.exit(0); } else{ zprava = "Nebylo zadano jmeno. Zadjete jmeno znovu:"; System.out.println("Nebylo zadano jmeno."); } } } /** * Metoda pro prijem otazky. */ private void prijmyOtazku(){ int velikost_prijmu = prijemVelikosti(4); if(velikost_prijmu != 0){ String zprava = spojeni.prijemDelky(velikost_prijmu); String []poleOdpovedi = zprava.split("\\|"); okno.getOtazka().setOtazka(poleOdpovedi); } else System.out.println("Nastala chyba pri prijmu otazky."); } /** * Metoda pro prijem velikosti zpravy, ktera se bude prijmat. * * @param ocekavana - maximalni ocekavana velikost v radech (napr. 3 = max. 999) */ private int prijemVelikosti(int ocekavana){ String velikost = spojeni.prijemDelky(ocekavana); if(velikost == null){ System.out.println("Prisla spatna velikost zpravy."); return 0; } int velikost_prijmu = 0; try{ velikost_prijmu = Integer.parseInt(velikost); }catch(NumberFormatException e){ System.out.println("Chyba pri parsovani velikosti prijmu."); } return velikost_prijmu; } /** * Metoda pro prijeti hracu ve hre. */ private void prijmyHrace(){ int velikost_prijmu = 0; velikost_prijmu = prijemVelikosti(5); if(velikost_prijmu != 0){ String zprava = spojeni.prijemDelky(velikost_prijmu); if(zprava != null){ String []poleOdpovedi = zprava.split("\\|"); Hrac [] poleHracu = new Hrac[poleOdpovedi.length]; for(int i=0; i