@Override public boolean ramassePotion(int refRMI, int refPotion) throws RemoteException { boolean res = false; VuePersonnage vuePersonnage = personnages.get(refRMI); VuePotion vuePotion = potions.get(refPotion); if (vuePersonnage.isActionExecutee()) { // si une action a deja ete executee logActionDejaExecutee(refRMI); } else { // sinon, on tente de jouer l'interaction int distance = Calculs.distanceChebyshev(vuePersonnage.getPosition(), vuePotion.getPosition()); // on teste la distance entre le personnage et la potion if (distance <= Constantes.DISTANCE_MIN_INTERACTION) { new Ramassage(this, vuePersonnage, vuePotion).interagit(); personnages.get(refRMI).executeAction(); res = true; } else { logger.warning( Constantes.nomClasse(this), nomRaccourciClient(refRMI) + " a tente d'interagir avec " + vuePotion.getElement().getNom() + ", alors qu'il est trop eloigne !\nDistance = " + distance); } } return res; }
@Override public HashMap<Integer, Point> getVoisins(int refRMI) throws RemoteException { HashMap<Integer, Point> res = new HashMap<Integer, Point>(); VuePersonnage courant = personnages.get(refRMI); VuePersonnage tempPers; // personnages for (int refVoisin : personnages.keySet()) { tempPers = personnages.get(refVoisin); if (estVoisin(courant, tempPers)) { res.put(refVoisin, tempPers.getPosition()); } } VuePotion tempPot; // potions for (int refVoisin : potions.keySet()) { tempPot = potions.get(refVoisin); if (estVoisin(courant, tempPot)) { res.put(refVoisin, tempPot.getPosition()); } } return res; }
/** * Verifie que les deux elements sont voisins, l'element courant etant un personnage. Pour etre un * voisin : ils doivent etre differents, ils doivent etre a une distance inferieure ou egale a la * vision, il doivent etre actifs. * * @param courant personnage courant * @param voisin element voisin * @return vrai si l'element donne est bien un voisin */ private boolean estVoisin(VuePersonnage courant, VueElement<?> voisin) throws RemoteException { boolean res = courant.getElement().estVivant() && Calculs.distanceChebyshev(voisin.getPosition(), courant.getPosition()) <= Constantes.VISION; if (voisin instanceof VuePersonnage) { // potion res = res && ((VuePersonnage) voisin).getElement().estVivant() && voisin.getRefRMI() != courant.getRefRMI(); } return res; }