Autor Tema: [JAVA] Koliseo para BustEmu - Traducido de Ancestra  (Leído 1353 veces)

Desconectado Player-xD

  • Administrador
  • Usuario Héroe
  • *****
  • Mensajes: 829
  • Karma: +3/-2
  • ¡PrivateDofus! - El conocimiento es gratuito
    • Ver Perfil
    • ¡PrivateDofus!
[JAVA] Koliseo para BustEmu - Traducido de Ancestra
« on: 15 de Noviembre de 2017, 02:18:09 pm »
Koliseo para BustEmu - Traducido de Ancestra

Buenas amigos, hoy les traigo un código que encontré en T! pero corregí algunas cosas que estaban mal. Pronto lo posteo para Ancestra.

Código: [Seleccionar]
package variables;

import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Random;

import estaticos.Bustemu;
import estaticos.GestorSalida;
import estaticos.MundoDofus;

import variables.Personaje.Grupo;

public class Arena extends Thread {

private static ArrayList<Arena> arenas = new ArrayList<Arena>();
private static Timer kick;
private ArrayList<Personaje> equipo1 = new ArrayList<Personaje>();
private ArrayList<Personaje> equipo2 = new ArrayList<Personaje>();
private int nivel_promedio;
private boolean bloqueado = false;
public int PERSONAS_EN_EL_KOLISEO;
public static final int LEVEL_RANGE = 25;
public static final int MAX_JUGADORES_POR_KOLISEO = 3;

private Arena(Personaje p) {
arenas.add(this);
nivel_promedio = p.getNivel();
equipo1.add(p);
PERSONAS_EN_EL_KOLISEO = 3;
GestorSalida.GAME_SEND_MESSAGE(p, "Se ha inscrito en el Koliseo de tipo : " + PERSONAS_EN_EL_KOLISEO + "v" + PERSONAS_EN_EL_KOLISEO, Bustemu.COLOR_BLEU);
start();
}

private Arena(Grupo g) {
PERSONAS_EN_EL_KOLISEO = g.getNumeroPjs();
groupJoinTeam(g,equipo1,this);
nivel_promedio = (int)(equipo1.get(0).getNivel() + equipo1.get(1).getNivel())/2;
arenas.add(this);
start();
}
public void run() {
while (!bloqueado) {
while (equipo1.size() < PERSONAS_EN_EL_KOLISEO || equipo2.size() < PERSONAS_EN_EL_KOLISEO) // tant qu'il n'y a pas assez de monde
{
try {
Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } } // on attends un peu.
bloqueado = this.ready();
if (!bloqueado) {
sendBusyMessage(equipo1);
sendBusyMessage(equipo2);
try {
Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); }
kickAllBusy(equipo1);
kickAllBusy(equipo2);
}
}
teleport();
GestorSalida.GAME_SEND_MAP_NEW_DUEL_TO_MAP(equipo1.get(0).getMapa(), equipo1.get(0).getID(), equipo2.get(0).getID());
try {
Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); }
GestorSalida.GAME_SEND_MAP_START_DUEL_TO_MAP(equipo2.get(0).getMapa(), equipo1.get(0).getID(), equipo2.get(0).getID());
equipo1.get(0).getMapa().newKoli(equipo1, equipo2);
try {
Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); }
for (int i=1; i<PERSONAS_EN_EL_KOLISEO; i++) {
equipo1.get(0).getPelea().unirsePelea(equipo1.get(i), equipo1.get(0).getID());
equipo2.get(0).getPelea().unirsePelea(equipo2.get(i), equipo2.get(0).getID());
}
}

public static void setUpTimer() {
kick = new Timer();
kick.schedule(new TimerTask() {

public void run() {
for (Arena a : arenas) {
a.kickAllBusy(a.equipo1);
a.kickAllBusy(a.equipo2);
}
}
}, 240000L, 240000L);
}

private void kickAllBusy(ArrayList<Personaje> team) {
ArrayList<Personaje> tokick = new ArrayList<Personaje>();
for (Personaje p : team) {
if (p==null || p.getPelea()!=null || !p.enLinea()) {
GestorSalida.GAME_SEND_MESSAGE(p, "Se ha descrito del Koliseo por inactividad.", Bustemu.COLOR_BLEU);
tokick.add(p);
}
}
for (Personaje p : tokick)
delPerso(p);
}
private void sendBusyMessage(ArrayList<Personaje> team) {
for (Personaje p : team) {
if (p.getPelea()==null && !p.estaAusente())
GestorSalida.GAME_SEND_MESSAGE(p, "Los dos equipos estan completos pero algunos jugadores estan ausentes.", Bustemu.COLOR_BLEU);
else
GestorSalida.GAME_SEND_MESSAGE(p, "Gracias por hacer que este disponible, el Kolizeum comenzara pronto.", Bustemu.COLOR_BLEU);
}
}

private int getRandomMap() {
Random rand = new Random();
switch(rand.nextInt(4)+1) {
case 1 :
return 85000;
case 2 :
return 85001;
case 3 :
return 85002;
case 4 :
return 85003;
default :
return 85000;
}

}

private void teleport() {
short MAP_ID = (short) getRandomMap();
for (Personaje p : equipo1)
p.teleport(MAP_ID, MundoDofus.getMapa(MAP_ID).getRandomCeldaIDLibre());
for (Personaje p : equipo2)
p.teleport(MAP_ID, MundoDofus.getMapa(MAP_ID).getRandomCeldaIDLibre());
}

private boolean ready() {
boolean ready = true;
for ( Personaje p : equipo1 )
ready = p.enLinea() && p.getPelea()==null && ready;
for ( Personaje p : equipo2 )
ready = p.enLinea() && p.getPelea()==null && ready;
return ready;
}

private static Arena getArena(int lvl) {
for (Arena a : arenas) {
if ((((a.nivel_promedio - lvl) < LEVEL_RANGE && (a.nivel_promedio - lvl) > -LEVEL_RANGE)) && !a.bloqueado)
return a;
}
return null;
}

private static Arena getArenaForGroupeBySize(Grupo group) {
for (Arena a : arenas) {
if (a.equipo1.size()+group.getNumeroPjs()<=a.PERSONAS_EN_EL_KOLISEO) {
groupJoinTeam(group,a.equipo1,a);
return a;
} else
if (a.equipo2.size()+group.getNumeroPjs()<=a.PERSONAS_EN_EL_KOLISEO) {
groupJoinTeam(group,a.equipo2,a);
return a;
}
}
return null;
}

private static void groupJoinTeam(Grupo g,ArrayList<Personaje> team, Arena a) {
for (Personaje p : g.getPersos()) {
team.add(p);
p.setArena(a);
GestorSalida.GAME_SEND_MESSAGE(p, "Se ha inscrito en el Koliseo de tipo : " + a.PERSONAS_EN_EL_KOLISEO + "v" + a.PERSONAS_EN_EL_KOLISEO, Bustemu.COLOR_BLEU);
}

}
public synchronized void delPerso(Personaje p) {
if (equipo1.contains(p))
equipo1.remove(p);
else
equipo2.remove(p);
if (this.isEmpty())
delArena(this);
p.setArena(null);
}

private static void delArena(Arena a) {
a.interrupt();
arenas.remove(a);
}

private boolean isEmpty() {
return equipo1.size()==0 && equipo2.size()==0;
}

public long getKamasReward() {
return this.PERSONAS_EN_EL_KOLISEO*10000;
}

public long getXpReward(Personaje p) {
return 80000000L; // xp al final de la pelea del koliseo
}

public static synchronized void addPerso(Personaje p) {
Arena a = getArena(p.getNivel());
if (a==null)
a = new Arena(p);
else {
if (a.equipo1.size()<a.PERSONAS_EN_EL_KOLISEO) {
a.equipo1.add(p);
GestorSalida.GAME_SEND_MESSAGE(p, "Se ha inscrito en el Koliseo de tipo : " + a.PERSONAS_EN_EL_KOLISEO + "v" + a.PERSONAS_EN_EL_KOLISEO, Bustemu.COLOR_BLEU);
}
else if (a.equipo2.size()<a.PERSONAS_EN_EL_KOLISEO) {
GestorSalida.GAME_SEND_MESSAGE(p, "Se ha inscrito en el Koliseo de tipo : " + a.PERSONAS_EN_EL_KOLISEO + "v" + a.PERSONAS_EN_EL_KOLISEO, Bustemu.COLOR_BLEU);
a.equipo2.add(p);
} else
a = new Arena(p);
}
p.setArena(a);
}

public static synchronized void addGroup(Grupo group) {
Arena a = getArenaForGroupeBySize(group);
if (a==null)
a = new Arena(group);
}

public boolean estaBloqueado() {
return this.bloqueado;
}

public String infos(Personaje p) {
kickAllBusy(equipo1);
kickAllBusy(equipo2);
StringBuilder infos = new StringBuilder("Esta en el koliseo de tipo "+PERSONAS_EN_EL_KOLISEO+"v"+PERSONAS_EN_EL_KOLISEO+".nEn su equipo hay :");
int count;
if (equipo1.contains(p)) {
infos.append(equipo1.size());
count = equipo2.size();
} else {
infos.append(equipo2.size());
count = equipo1.size();
}
infos.append(" jugadores, y en el equipo contrario hay : "+count+" jugadores.");
return infos.toString();
}
}

Buscamos Mapa.java y pegamos lo siguiente donde quede más prolijo:

Código: [Seleccionar]
public Pelea newKoli(ArrayList<Personaje> team1,ArrayList<Personaje> team2) {
int id = 1;
if (!_peleas.isEmpty())
id = ((Integer) (_peleas.keySet().toArray()[_peleas.size() - 1])) + 1;
Pelea f = new Pelea(0, this, team1, team2);
_peleas.put((short) id, f);
return f;
}

Nos vamos a Pelea.java y buscamos public Pelea, después reemplazamos por:

Código: [Seleccionar]
public Pelea(int id, Mapa mapa, ArrayList<Personaje> team1, ArrayList<Personaje> team2) {
_tipo = 0;
_id = (short) id;
_mapaCopia = mapa.copiarMapa();
_mapaReal = mapa;
_luchInit1 = new Luchador(this, team1.get(0));
_luchInit2 = new Luchador(this, team2.get(0));
_equipo1.put(team1.get(0).getID(), _luchInit1);
_equipo2.put(team2.get(0).getID(), _luchInit2);
GestorSalida.GAME_SEND_ILF_PACKET(team1.get(0), 0);
GestorSalida.GAME_SEND_ILF_PACKET(team2.get(0), 0);
GestorSalida.GAME_SEND_FIGHT_GJK_PACKET_TO_FIGHT(this, 7, 2, 0, 1, 0,45000L, _tipo);
_tiempoTurno = new Timer(45000, null);
_tiempoTurno.start();
_celdasPos1 = analizarPosiciones(0);
_celdasPos2 = analizarPosiciones(0);
GestorSalida.GAME_SEND_FIGHT_PLACES_PACKET_TO_FIGHT(this, 1, _mapaCopia.getPosicionesPelea(), 0);
GestorSalida.GAME_SEND_FIGHT_PLACES_PACKET_TO_FIGHT(this, 2, _mapaCopia.getPosicionesPelea(), 1);
_celdaColor1 = 1;
_celdaColor2 = 0;
GestorSalida.GAME_SEND_GA_PACKET_TO_FIGHT(this, 3, 950, team1.get(0).getID() + "", team1.get(0).getID() + ","+ 8 + ",0");
GestorSalida.GAME_SEND_GA_PACKET_TO_FIGHT(this, 3, 950, team1.get(0).getID() + "", team1.get(0).getID() + ","+ 3 + ",0");
GestorSalida.GAME_SEND_GA_PACKET_TO_FIGHT(this, 3, 950, team2.get(0).getID() + "", team2.get(0).getID() + ","+ 8 + ",0");
GestorSalida.GAME_SEND_GA_PACKET_TO_FIGHT(this, 3, 950, team2.get(0).getID() + "", team2.get(0).getID() + ","+ 3 + ",0";
_luchInit1.setCeldaPelea(getCeldaRandom(_celdasPos1));
_luchInit2.setCeldaPelea(getCeldaRandom(_celdasPos2));
_luchInit1.getPersonaje().getCelda().removerPersonaje(_luchInit1.getID());
_luchInit2.getPersonaje().getCelda().removerPersonaje(_luchInit2.getID());
_luchInit1.getCeldaPelea().addLuchador(_luchInit1);
_luchInit2.getCeldaPelea().addLuchador(_luchInit2);
_luchInit1.getPersonaje().setPelea(this);
_luchInit1.setEquipoBin(0);
_luchInit2.getPersonaje().setPelea(this);
_luchInit2.setEquipoBin(1);
GestorSalida.GAME_SEND_ERASE_ON_MAP_TO_MAP(_luchInit1.getPersonaje().getMapa(), _luchInit1.getID());
GestorSalida.GAME_SEND_ERASE_ON_MAP_TO_MAP(_luchInit2.getPersonaje().getMapa(), _luchInit2.getID());
GestorSalida.GAME_SEND_GAME_ADDFLAG_PACKET_TO_MAP(_luchInit1.getPersonaje().getMapa(), 0, _luchInit1.getID(), _luchInit2.getID(), _luchInit1.getPersonaje().getCelda().getID(),"0;-1", _luchInit2.getPersonaje().getCelda().getID(), "0;-1");
GestorSalida.GAME_SEND_ADD_IN_TEAM_PACKET_TO_MAP(_luchInit1.getPersonaje().getMapa(), _luchInit1.getID(), _luchInit1);
GestorSalida.GAME_SEND_ADD_IN_TEAM_PACKET_TO_MAP(_luchInit1.getPersonaje().getMapa(), _luchInit2.getID(), _luchInit2);
GestorSalida.ENVIAR_GM_LUCHADOR_A_TODA_PELEA(this, 7, _mapaCopia);
setEstado((byte) 2);
}

Ahora en Pelea.java buscamos: for (Luchador ganador : ganadores) { y debajo pegamos:

Código: [Seleccionar]
if (ganador.getPersonaje()!=null && ganador.getPersonaje().getArena()!=null && ganador.getPersonaje().getArena().estaBloqueado()) {
ganador.getPersonaje().addKamas(ganador.getPersonaje().getArena().getKamasReward());
GestorSalida.GAME_SEND_MESSAGE(ganador.getPersonaje(), "Buena victoria ! Ha ganado "+ ganador.getPersonaje().getArena().getKamasReward() + " kamas.", Bustemu.COLOR_BLEU);
ganador.getPersonaje().addExp(ganador.getPersonaje().getArena().getXpReward(ganador.getPersonaje()));
GestorSalida.GAME_SEND_MESSAGE(ganador.getPersonaje(), "Tambien ganas "+ ganador.getPersonaje().getArena().getXpReward(ganador.getPersonaje()) + " xp.", Bustemu.COLOR_BLEU);
MundoDofus.addObjeto(MundoDofus.objetoIniciarServer(GestorSQL.getSigIDObjeto(), 123456, ganador.getPersonaje().getArena().PERSONAS_EN_EL_KOLISEO, -1, "", equipoGanador),true); // le 123456 est l'id de l'objet à rajouter ! a changer
GestorSalida.GAME_SEND_MESSAGE(ganador.getPersonaje(), "Tambien ganas "+ ganador.getPersonaje().getArena().PERSONAS_EN_EL_KOLISEO + " Kolizetons.", Bustemu.COLOR_BLEU);
ganador.getPersonaje().teleport((short) 10114, (short) 280);
ganador.getPersonaje().getArena().delPerso(ganador.getPersonaje());
}

Ahora también en Pelea.java buscamos for (Luchador perdedor : perdedores) y debajo pegamos:

Código: [Seleccionar]
if (perdedor.getPersonaje()!=null && perdedor.getPersonaje().getArena()!=null && perdedor.getPersonaje().getArena().estaBloqueado()) {
GestorSalida.GAME_SEND_MESSAGE(perdedor.getPersonaje(), "Has perdido, es lamentable.", Bustemu.COLOR_ROUGE);
perdedor.getPersonaje().teleport((short) 10111, (short) 297); // map de retour pour les perdants
perdedor.getPersonaje().getArena().delPerso(perdedor.getPersonaje());
}

Ahora nos vamos a Personaje.java y pegamos lo siguiente donde quede mas prolijo:

Código: [Seleccionar]
private Arena arena;
ublic Arena getArena() {
return arena;
}

public void setArena(Arena arena) {
this.arena = arena;
}

Los comandos para entrar al Koliseo serían los siguientes:

Código: [Seleccionar]
if(mensajeC.length()>4 && mensajeC.substring(1, 5).equalsIgnoreCase("koli";){
if (_perso.getArena()==null) {
if (_perso.getGrupo()==null) {
Arena.addPerso(_perso);
} else if (_perso.getGrupo().getNumeroPjs()<=Arena.MAX_JUGADORES_POR_KOLISEO)
Arena.addGroup(_perso.getGrupo());
else
GestorSalida.GAME_SEND_MESSAGE(_perso, "Por desgracia, su grupo es demasiado grande para el Koliseo. La cantidad maxima de jugadores es : " + Arena.MAX_JUGADORES_POR_KOLISEO, Bustemu.COLOR_ROUGE);
} else if (_perso.getPelea()!=null) {
GestorSalida.GAME_SEND_MESSAGE(_perso, "No se puede dar de baja ahora !", Bustemu.COLOR_ROUGE);
} else {
_perso.getArena().delPerso(_perso);
GestorSalida.GAME_SEND_MESSAGE(_perso, "Se ha descrito del Koliseo.", Bustemu.COLOR_ROUGE);
}
return;
}


if (mensajeC.length()>8 && mensajeC.substring(1, 9).equalsIgnoreCase("infokoli";) {
if (_perso.getArena()!=null) {
GestorSalida.GAME_SEND_MESSAGE(_perso, _perso.getArena().infos(_perso), Bustemu.COLOR_BLEU);
} else
GestorSalida.GAME_SEND_MESSAGE(_perso, "Para entrar en el Koliseo teclee .koli", Bustemu.COLOR_VERT);
return;
}

Créditos:
Aidemu
ADahorea