/**
*
*@author Keal - Falyptus
*/
// Pose de prisme -> Action.java -> apply()
case 95://Poser un prisme
DofusMap map = perso.getCurCarte();
SubArea subArea = map.getSubArea();
if(!Conquest.CanDepositPrism(perso.getActorId(), subArea.getId()))
break;
int templatePrism = Integer.parseInt(args);
perso.removeByTemplateID(templatePrism, 1);
Prism prism = new Prism(World.getNewPrismId(), perso.getAlign(), (byte)perso.getALvl(), map.getId(), perso.getCurCell().getID());
World.addPrism(prism);
map.addPrism(prism);
subArea.setAlignement(prism.getAlign());
subArea.setPrism(prism);
SocketManager.GAME_SEND_MAP_PRISM_GM_PACKET(map);
SQLManager.SAVE_PRISM(prism);
break;
//Condition pour poser un prisme -> World.java -> CanDepositPrism()
public static boolean CanDepositPrism(int playerId, int id) {
SubArea subArea = World.getSubArea(id);
Player out = World.getPersonnage(playerId);
boolean toReturn = true;
if(out.getLvl() < 10 || out.getALvl() < 3)
{
SocketManager.GAME_SEND_Im_PACKET(out, "1155");
toReturn = false;
}
if(toReturn && !out.isShowingWings() || out.getLastTimeShowWings() - 300000 < 0)
{
SocketManager.GAME_SEND_Im_PACKET(out, "1148");
toReturn = false;
}
if(toReturn && subArea.getPrism() != null)
{
SocketManager.GAME_SEND_Im_PACKET(out, "1149");
toReturn = false;
}
if(toReturn && out.getCurCarte().getPlacesStr().length() < 5)
{
SocketManager.GAME_SEND_Im_PACKET(out, "1145");
toReturn = false;
}
Alignment alignment = World.getAlignment(subArea.getAlignement());
if(toReturn && alignment.getSubAreasOwned()-alignment.getAreasOwned()+1
< 17*alignment.getAreasOwned())
{
SocketManager.GAME_SEND_Im_PACKET(out, "1152");
toReturn = false;
}
if(toReturn)
{
int numbEnemies = 0;
int otherAlign = out.getAlign() == 1 ? 2 : 1;
for(Player player : subArea.getPlayers())
{
if(player.getAlign() == otherAlign)
{
numbEnemies++;
if(numbEnemies == 20)
break;
}
}
if(numbEnemies == 20)
{
SocketManager.GAME_SEND_Im_PACKET(out, "1153");
toReturn = false;
}
}
//TODO: Check des territoires adjacents.
return toReturn;
}
}
// Utiliser un prisme -> GameThread.java -> parseGameActionPacket()
case 512://Utiliser un prisme
game_use_prism();
break;
private void game_use_prism() {
StringBuilder packet = new StringBuilder(10*World.getPrisms().size());
Prism prism = _player.getCurCarte().getPrism();
if(prism == null || prism.getAlign() != _player.getAlign() || prism.getFight() != null)
{
SocketManager.GAME_SEND_Im_PACKET(_player, "1143");
return;
}
if(!_player.isShowingWings())
{
SocketManager.GAME_SEND_Im_PACKET(_player, "1144");
return;
}
String subAreaImpossible = ",161,162,163,164,165,166,167,";
for(Prism curPrism : World.getPrisms().values()) {
if(curPrism == null)
continue;
DofusMap mapPrism = World.getMap(curPrism.getMapId());
int subArea = World.getMap(curPrism.getMapId()).getSubArea().getId();
if(curPrism.getId() == prism.getId() || mapPrism.hasEndFightAction(0)) //FIXME Si c'est une map de donjon (pas forcément car des maps peuvent avoir des actions de tp sans pour autant être un dj)
continue;
if(subAreaImpossible.contains(","+subArea+","))
continue;
if(curPrism.getAlign() == _player.getAlign())
{
packet.append('|').append(curPrism.getMapId()).append(';')
.append(Formulas.calculPrismCost(_player.getCurCarte(), mapPrism,
_player.getALvl()));
}
}
SocketManager.GAME_SEND_SUBWAY_PRISM_CREATE(_player, packet.toString());
}
//Création d'un transport de prisme/Quitter un prisme après téléportation -> GameThread.java -> parseWaypointPacket()
case 'p':
Waypoint_prismCreate(packet);
break;
case 'w':
Waypoint_prismQuit();
break;
private void Waypoint_prismCreate(String packet)
{
if (_player.getDeshonor() >= 2)
{
SocketManager.GAME_SEND_Im_PACKET(_player, "183");
return;
}
if(!_player.isShowingWings())
{
SocketManager.GAME_SEND_Im_PACKET(_player, "1144");
return;
}
Prism prism = World.getMap(Integer.parseInt(packet.substring(2))).getPrism();
if(prism == null) return;
int price = Formulas.calculPrismCost(_player.getCurCarte(), World.getMap(prism.getMapId()), _player);
if(_player.getKamas() - price < 0)
{
SocketManager.GAME_SEND_Im_PACKET(_player, "182");
return;
}
SocketManager.GAME_SEND_Wp_PACKET(_player, prism.getMapId());
_player.teleport(prism.getMapId(), prism.getCellId()+1);
_player.setKamas(_player.getKamas() - price);
SocketManager.GAME_SEND_Im_PACKET(_player, "046");
SocketManager.GAME_SEND_SUBWAY_PRISM_EXIT(_player);
}
private void Waypoint_prismQuit()
{
SocketManager.GAME_SEND_SUBWAY_PRISM_EXIT(_player);
}
//Formule du calcul du coût du prisme -> Formulas.java -> calculPrismCost()
public static int calculPrismCost(DofusMap map1, DofusMap map2, int aLvl)
{
int cost = (25 * (Math.abs(map2.getX() - map1.getX())
+ Math.abs(map2.getY() - map1.getY()) - 1));
int bonusSoustract = 0;
double coef = 0.01;
for (int i = 0; i < aLvl; i++) {
coef += 0.01;
bonusSoustract += cost * coef;
}
cost -= bonusSoustract;
return cost;
}
//Paquet qui affiche les Prismes leur données -> SocketManager.java -> GAME_SEND_SUBWAY_PRISM_CREATE()
public static void GAME_SEND_SUBWAY_PRISM_CREATE(Player player, String data) {
String packet = "Wp"+data;
send(player, packet);
}
//Paquet qui permet de quitter l'UI Prisme -> SocketManager.java -> GAME_SEND_SUBWAY_PRISM_EXIT()
public static void GAME_SEND_SUBWAY_PRISM_EXIT(Player player)
{
String packet = "Ww";
send(player, packet);
}