- public String GetGE(int win)
- {
- long time = System.currentTimeMillis() - _startTime;
- int initGUID = _init0.getGUID();
- int type = Constants.FIGHT_TYPE_CHALLENGE;// toujours 0
- if(_type == Constants.FIGHT_TYPE_AGRESSION)//Sauf si gain d'honneur
- type = _type;
- StringBuilder Packet = new StringBuilder();
- Packet.append("GE").append(time).append("|").append(initGUID).append("|").append(type).append("|");
- ArrayList<Fighter> TEAM1 = new ArrayList<Fighter>();
- ArrayList<Fighter> TEAM2 = new ArrayList<Fighter>();
- if(win == 1)
- {
- TEAM1.addAll(_team0.values());
- TEAM2.addAll(_team1.values());
- }
- else
- {
- TEAM1.addAll(_team1.values());
- TEAM2.addAll(_team0.values());
- }
- //Traque
- Personnage curp = null;
- for(Fighter F : TEAM1)
- {
- if(F.isInvocation())continue;
- if(TEAM1.size() == 1) curp = F.getPersonnage();
- }
- for(Fighter F : TEAM2)
- {
- if(F.isInvocation())continue;
- if(curp != null && curp.get_traque() != null && curp.get_traque().get_traqued() == F.getPersonnage())
- {
- SocketManager.GAME_SEND_MESSAGE(curp, "Thomas Sacre : Contrat fini, reviens me voir pour recuperer ta recompense.", "000000");
- curp.get_traque().set_traqued(null);
- curp.get_traque().set_time(-2);
- }
- }
- //fin
- /* DEBUG
- System.out.println("TEAM1: lvl="+TEAM1lvl);
- System.out.println("TEAM2: lvl="+TEAM2lvl);
- //*/
- //DROP SYSTEM
- //Calcul de la PP de groupe
- int groupPP = 0,minkamas = 0,maxkamas = 0;
- for(Fighter F : TEAM1)if(!F.isInvocation() || (F.getMob() != null && F.getMob().getTemplate().getID() ==258))groupPP += F.getTotalStats().getEffect(Constants.STATS_ADD_PROS);
- if(groupPP <0)groupPP =0;
- //Calcul des drops possibles
- ArrayList<Drop> possibleDrops = new ArrayList<Drop>();
- for(Fighter F : TEAM2)
- {
- if(F.isInvocation() || F.getMob() == null)continue;
- minkamas += F.getMob().getTemplate().getMinKamas();
- maxkamas += F.getMob().getTemplate().getMaxKamas();
- for(Drop D : F.getMob().getDrops())
- {
- if(D.getMinProsp() <= groupPP)
- {
- //On augmente le taux en fonction de la PP
- int taux = (int)((groupPP * D.get_taux()*Ancestra.RATE_DROP)/100);
- possibleDrops.add(new Drop(D.get_itemID(),0,taux,D.get_max()));
- }
- }
- }
- //On Réordonne la liste en fonction de la PP
- ArrayList<Fighter> Temp = new ArrayList<Fighter>();
- Fighter curMax = null;
- while(Temp.size() < TEAM1.size())
- {
- int curPP = -1;
- for(Fighter F : TEAM1)
- {
- //S'il a plus de PP et qu'il n'est pas listé
- if(F.getTotalStats().getEffect(Constants.STATS_ADD_PROS) > curPP && !Temp.contains(F))
- {
- curMax = F;
- curPP = F.getTotalStats().getEffect(Constants.STATS_ADD_PROS);
- }
- }
- Temp.add(curMax);
- }
- //On enleve les invocs
- TEAM1.clear();
- TEAM1.addAll(Temp);
- /* DEBUG
- System.out.println("DROP: PP ="+groupPP);
- System.out.println("DROP: nbr="+possibleDrops.size());
- System.out.println("DROP: Kam="+totalkamas);
- //*/
- //FIN DROP SYSTEM
- //XP SYSTEM
- long totalXP = 0;
- for(Fighter F : TEAM2)
- {
- if(F.isInvocation() || F.getMob() == null)continue;
- totalXP += F.getMob().getBaseXp();
- }
- /* DEBUG
- System.out.println("TEAM1: xpTotal="+totalXP);
- //*/
- //FIN XP SYSTEM
- //Capture d'âmes
- boolean mobCapturable = true;
- for(Fighter F : TEAM2)
- {
- try
- {
- mobCapturable &= F.getMob().getTemplate().isCapturable();
- }catch (Exception e) {
- mobCapturable = false;
- break;
- }
- }
- isCapturable |= mobCapturable;
- if(isCapturable)
- {
- boolean isFirst = true;
- int maxLvl = 0;
- String pierreStats = "";
- for(Fighter F : TEAM2) //Création de la pierre et verifie si le groupe peut être capturé
- {
- if(!isFirst)
- pierreStats += "|";
- pierreStats += F.getMob().getTemplate().getID() + "," + F.get_lvl();//Converti l'ID du monstre en Hex et l'ajoute au stats de la futur pierre d'âme
- isFirst = false;
- if(F.get_lvl() > maxLvl) //Trouve le monstre au plus haut lvl du groupe (pour la puissance de la pierre)
- maxLvl = F.get_lvl();
- }
- pierrePleine = new PierreAme(World.getNewItemGuid(),1,7010,Constants.ITEM_POS_NO_EQUIPED,pierreStats); //Crée la pierre d'âme
- for(Fighter F : TEAM1) //Récupère les captureur
- {
- if(!F.isInvocation() && F.isState(Constants.ETAT_CAPT_AME))
- {
- _captureur.add(F);
- }
- }
- if(_captureur.size() > 0 && !World.isArenaMap(get_map().get_id())) //S'il y a des captureurs
- {
- for (int i = 0; i < _captureur.size(); i++)
- {
- try
- {
- Fighter f = _captureur.get(Formulas.getRandomValue(0, _captureur.size()-1)); //Récupère un captureur au hasard dans la liste
- if(!(f.getPersonnage().getObjetByPos(Constants.ITEM_POS_ARME).getTemplate().getType() == Constants.ITEM_TYPE_PIERRE_AME))
- {
- _captureur.remove(f);
- continue;
- }
- Couple<Integer,Integer> pierreJoueur = Formulas.decompPierreAme(f.getPersonnage().getObjetByPos(Constants.ITEM_POS_ARME));//Récupère les stats de la pierre équippé
- if(pierreJoueur.second < maxLvl) //Si la pierre est trop faible
- {
- _captureur.remove(f);
- continue;
- }
- int captChance = Formulas.totalCaptChance(pierreJoueur.first, f.getPersonnage());
- if(Formulas.getRandomValue(1, 100) <= captChance) //Si le joueur obtiens la capture
- {
- //Retire la pierre vide au personnage et lui envoie ce changement
- int pierreVide = f.getPersonnage().getObjetByPos(Constants.ITEM_POS_ARME).getGuid();
- f.getPersonnage().deleteItem(pierreVide);
- SocketManager.GAME_SEND_REMOVE_ITEM_PACKET(f.getPersonnage(), pierreVide);
- captWinner = f._id;
- break;
- }
- }
- catch(NullPointerException e)
- {
- continue;
- }
- }
- }
- }
- //Fin Capture
- for(Fighter i : TEAM1)
- {
- if(i.hasLeft()) continue;//Si il abandonne, il ne gagne pas d'xp
- if(i._double != null)continue;//Pas de double dans les gains
- if(type == Constants.FIGHT_TYPE_CHALLENGE)
- {
- if(i.isInvocation() && i.getMob() != null && i.getMob().getTemplate().getID() != 258)continue;
- long winxp = Formulas.getXpWinPvm2(i,TEAM1,TEAM2,totalXP);
- AtomicReference<Long> XP = new AtomicReference<Long>();
- XP.set(winxp);
- long guildxp = Formulas.getGuildXpWin(i,XP);
- long mountxp = 0;
- if(i.getPersonnage() != null && i.getPersonnage().isOnMount())
- {
- mountxp = Formulas.getMountXpWin(i,XP);
- i.getPersonnage().getMount().addXp(mountxp);
- SocketManager.GAME_SEND_Re_PACKET(i.getPersonnage(),"+",i.getPersonnage().getMount());
- }
- int winKamas = Formulas.getKamasWin(i,TEAM1,minkamas,maxkamas);
- String drops = "";
- //Drop system
- ArrayList<Drop> temp = new ArrayList<Drop>();
- temp.addAll(possibleDrops);
- Map<Integer,Integer> itemWon = new TreeMap<Integer,Integer>();
- for(Drop D : temp)
- {
- int t = (int)(D.get_taux()*100);//Permet de gerer des taux>0.01
- int jet = Formulas.getRandomValue(0, 100*100);
- if(jet < t)
- {
- ObjTemplate OT = World.getObjTemplate(D.get_itemID());
- if(OT == null)continue;
- //on ajoute a la liste
- itemWon.put(OT.getID(),(itemWon.get(OT.getID())==null?0:itemWon.get(OT.getID()))+1);
- D.setMax(D.get_max()-1);
- if(D.get_max() == 0)possibleDrops.remove(D);
- }
- }
- if(i._id == captWinner && pierrePleine != null) //S'il à capturé le groupe
- {
- if(drops.length() >0)drops += ",";
- drops += pierrePleine.getTemplate().getID()+"~"+1;
- if(i.getPersonnage().addObjet(pierrePleine, false))
- World.addObjet(pierrePleine, true);
- }
- for(Entry<Integer,Integer> entry : itemWon.entrySet())
- {
- ObjTemplate OT = World.getObjTemplate(entry.getKey());
- if(OT == null)continue;
- if(drops.length() >0)drops += ",";
- drops += entry.getKey()+"~"+entry.getValue();
- Objet obj = OT.createNewItem(entry.getValue(), false);
- if(i.getPersonnage().addObjet(obj, true))
- World.addObjet(obj, true);
- }
- //fin drop system
- winxp = XP.get();
- if(winxp != 0 && i.getPersonnage() != null)
- i.getPersonnage().addXp(winxp);
- if(winKamas != 0 && i.getPersonnage() != null)
- i.getPersonnage().addKamas(winKamas);
- if(guildxp > 0 && i.getPersonnage().getGuildMember() != null)
- i.getPersonnage().getGuildMember().giveXpToGuild(guildxp);
- Packet.append("2;").append(i.getGUID()).append(";").append(i.getPacketsName()).append(";").append(i.get_lvl()).append(";").append((i.isDead() ? "1" : "0" )).append(";");
- Packet.append(i.xpString(";")).append(";");
- Packet.append((winxp == 0?"":winxp)).append(";");
- Packet.append((guildxp == 0?"":guildxp)).append(";");
- Packet.append((mountxp == 0?"":mountxp)).append(";");
- Packet.append(drops).append(";");//Drop
- Packet.append((winKamas == 0?"":winKamas)).append("|");
- }else
- {
- // Si c'est un neutre, on ne gagne pas de points
- int winH = 0;
- int winD = 0;
- if(type == Constants.FIGHT_TYPE_AGRESSION)
- {
- if(_init1.getPersonnage().get_align() != 0 && _init0.getPersonnage().get_align() != 0)
- {
- if(_init1.getPersonnage().get_compte().get_curIP().compareTo(_init0.getPersonnage().get_compte().get_curIP()) != 0 || Ancestra.CONFIG_ALLOW_MULE_PVP)
- {
- winH = Formulas.calculHonorWin(TEAM1,TEAM2,i);
- }
- if(i.getPersonnage().getDeshonor() > 0) winD = -1;
- }
- }
- Personnage P = i.getPersonnage();
- if(P.get_honor()+winH<0)winH = -P.get_honor();
- P.addHonor(winH);
- P.setDeshonor(P.getDeshonor()+winD);
- Packet.append("2;").append(i.getGUID()).append(";").append(i.getPacketsName()).append(";").append(i.get_lvl()).append(";").append((i.isDead() ? "1" : "0" )).append(";");
- Packet.append((P.get_align()!=Constants.ALIGNEMENT_NEUTRE?World.getExpLevel(P.getGrade()).pvp:0)).append(";");
- Packet.append(P.get_honor()).append(";");
- int maxHonor = World.getExpLevel(P.getGrade()+1).pvp;
- if(maxHonor == -1)maxHonor = World.getExpLevel(P.getGrade()).pvp;
- Packet.append((P.get_align()!=Constants.ALIGNEMENT_NEUTRE?maxHonor:0)).append(";");
- Packet.append(winH).append(";");
- Packet.append(P.getGrade()).append(";");
- Packet.append(P.getDeshonor()).append(";");
- Packet.append(winD);
- Packet.append(";;0;0;0;0;0|");
- }
- }
- for(Fighter i : TEAM2)
- {
- if(i._double != null)continue;//Pas de double dans les gains
- if(i.isInvocation() && i.getMob().getTemplate().getID() != 285)continue;//On affiche pas les invocs
- if(_type != Constants.FIGHT_TYPE_AGRESSION)
- {
- if(i.getPDV() == 0 || i.hasLeft())
- {
- Packet.append("0;").append(i.getGUID()).append(";").append(i.getPacketsName()).append(";").append(i.get_lvl()).append(";1").append(";").append(i.xpString(";")).append(";;;;|");
- }else
- {
- Packet.append("0;").append(i.getGUID()).append(";").append(i.getPacketsName()).append(";").append(i.get_lvl()).append(";0").append(";").append(i.xpString(";")).append(";;;;|");
- }
- }else
- {
- // Si c'est un neutre, on ne gagne pas de points
- int winH = 0;
- int winD = 0;
- if(_init1.getPersonnage().get_align() != 0 && _init0.getPersonnage().get_align() != 0)
- {
- if(_init1.getPersonnage().get_compte().get_curIP().compareTo(_init0.getPersonnage().get_compte().get_curIP()) != 0 || Ancestra.CONFIG_ALLOW_MULE_PVP)
- {
- winH = Formulas.calculHonorWin(TEAM1,TEAM2,i);
- }
- }
- Personnage P = i.getPersonnage();
- if(P.get_honor()+winH<0)winH = -P.get_honor();
- P.addHonor(winH);
- if(P.getDeshonor()-winD<0) winD = 0;
- P.setDeshonor(P.getDeshonor()-winD);
- Packet.append("0;").append(i.getGUID()).append(";").append(i.getPacketsName()).append(";").append(i.get_lvl()).append(";").append((i.isDead() ? "1" : "0" )).append(";");
- Packet.append((P.get_align()!=Constants.ALIGNEMENT_NEUTRE?World.getExpLevel(P.getGrade()).pvp:0)).append(";");
- Packet.append(P.get_honor()).append(";");
- int maxHonor = World.getExpLevel(P.getGrade()+1).pvp;
- if(maxHonor == -1)maxHonor = World.getExpLevel(P.getGrade()).pvp;
- Packet.append((P.get_align()!=Constants.ALIGNEMENT_NEUTRE?maxHonor:0)).append(";");
- Packet.append(winH).append(";");
- Packet.append(P.getGrade()).append(";");
- Packet.append(P.getDeshonor()).append(";");
- Packet.append(winD);
- Packet.append(";;0;0;0;0;0|");
- }
- }
- if(Percepteur.GetPercoByMapID(_map.get_id()) != null && _type == 4)//On a un percepteur ONLY PVM ?
- {
- Percepteur p = Percepteur.GetPercoByMapID(_map.get_id());
- long winxp = (int)Math.floor(Formulas.getXpWinPerco(p,TEAM1,TEAM2,totalXP)/100);
- long winkamas = (int)Math.floor(Formulas.getKamasWinPerco(minkamas,maxkamas)/100);
- p.setXp(p.getXp()+winxp);
- p.setKamas(p.getKamas()+winkamas);
- Packet.append("5;").append(p.getGuid()).append(";").append(p.get_N1()).append(",").append(p.get_N2()).append(";").append(World.getGuild(p.get_guildID()).get_lvl()).append(";0;");
- Guild G = World.getGuild(p.get_guildID());
- Packet.append(G.get_lvl()).append(";");
- Packet.append(G.get_xp()).append(";");
- Packet.append(World.getGuildXpMax(G.get_lvl())).append(";");
- Packet.append(";");//XpGagner
- Packet.append(winxp).append(";");//XpGuilde
- Packet.append(";");//Monture
- String drops = "";
- ArrayList<Drop> temp = new ArrayList<Drop>();
- temp.addAll(possibleDrops);
- Map<Integer,Integer> itemWon = new TreeMap<Integer,Integer>();
- for(Drop D : temp)
- {
- int t = (int)(D.get_taux()*100);//Permet de gerer des taux>0.01
- int jet = Formulas.getRandomValue(0, 100*100);
- if(jet < t)
- {
- ObjTemplate OT = World.getObjTemplate(D.get_itemID());
- if(OT == null)continue;
- //on ajoute a la liste
- itemWon.put(OT.getID(),(itemWon.get(OT.getID())==null?0:itemWon.get(OT.getID()))+1);
- D.setMax(D.get_max()-1);
- if(D.get_max() == 0)possibleDrops.remove(D);
- }
- }
- for(Entry<Integer,Integer> entry : itemWon.entrySet())
- {
- ObjTemplate OT = World.getObjTemplate(entry.getKey());
- if(OT == null)continue;
- if(drops.length() >0)drops += ",";
- drops += entry.getKey()+"~"+entry.getValue();
- Objet obj = OT.createNewItem(entry.getValue(), false);
- p.addObjet(obj);
- World.addObjet(obj, true);
- }
- Packet.append(drops).append(";");//Drop
- Packet.append(winkamas).append("|");
- SQLManager.UPDATE_PERCO(p);
- }
- return Packet.toString();
- }