package org.pokenet.client.network;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.apache.mina.core.service.IoHandlerAdapter;
import org.apache.mina.core.session.IoSession;
import org.pokenet.client.GameClient;
import org.pokenet.client.backend.BattleManager;
import org.pokenet.client.backend.ItemDatabase;
import org.pokenet.client.backend.MoveLearningManager;
import org.pokenet.client.backend.Translator;
import org.pokenet.client.backend.entity.HMObject;
import org.pokenet.client.backend.entity.OurPlayer;
import org.pokenet.client.backend.entity.Player;
import org.pokenet.client.backend.entity.Player.Direction;
import org.pokenet.client.backend.time.WeatherService.Weather;
import org.pokenet.client.ui.frames.SpriteChooserDialog;
/**
* Handles packets received from the server
* @author shadowkanji
* @author ZombieBear
* @author Nushio
*
*/
public class TcpProtocolHandler extends IoHandlerAdapter {
private GameClient m_game;
/**
* Default constructor
* @param gameClient
*/
public TcpProtocolHandler(GameClient game) {
m_game = game;
}
/**
* Called when we lose or close the connection
*/
public void sessionClosed(IoSession session) {
m_game.reset();
List<String> translated = new ArrayList<String>();
translated = Translator.translate("_LOGIN");
GameClient.messageDialog(translated.get(40), GameClient.getInstance().getDisplay());
}
/**
* Called when connected is made to the server
*/
public void sessionOpened(IoSession session) {
System.out.println("Connected to game server.");
}
/**
* Catches networking exceptions
* @param session
*/
public void exceptionCaught(IoSession session, Throwable cause) {
cause.printStackTrace();
}
/**
* Processes movement changes
* @param player
* @param direction
*/
private void processMovement(int player, char direction) {
Player p = m_game.getMapMatrix().getPlayer(player);
if(p == null)
return;
switch(direction) {
case 'D':
p.queueMovement(Direction.Down);
break;
case 'U':
p.queueMovement(Direction.Up);
break;
case 'L':
p.queueMovement(Direction.Left);
break;
case 'R':
p.queueMovement(Direction.Right);
break;
}
}
/**
* Once a message is received, this method is called
*/
public void messageReceived(IoSession session, Object m) {
List<String> translated = new ArrayList<String>();
translated = Translator.translate("_LOGIN");
Player p;
String message = (String) m;
System.out.println("INFO: " + message);
String [] details;
switch(message.charAt(0)) {
case 'R':
//Server Revision Info
GameClient.getInstance().getLoginScreen().setServerRevision(message.substring(1));
break;
case '!':
//Server notification
GameClient.messageDialog(message.substring(1), GameClient.getInstance().getDisplay());
break;
case 'q':
//Server announcement
GameClient.getInstance().getUi().getChat().addAnnouncement(message.substring(1));
break;
case 'T':
//Trade
switch(message.charAt(1)) {
case 's':
//Start trade TsTRAINERNAME
GameClient.getInstance().getUi().startTrade(message.substring(2));
break;
case 'o':
//An offer was made ToPOKEINDEX,MONEYNUM
String[] offerData = message.substring(2).split(",");
GameClient.getInstance().getUi().getTrade().getOffer(Integer.parseInt(offerData[0]),
Integer.parseInt(offerData[1]));
break;
case 'c':
//The offer was cancelled
GameClient.getInstance().getUi().getTrade().cancelTheirOffer();
break;
case 'i':
//A pokemon is being added to the trade dialog TiPOKEINDEX,POKEDATA
String[] data = message.substring(3).split(",");
GameClient.getInstance().getUi().getTrade().addPoke(Integer.parseInt(String.valueOf(
message.charAt(2))), data);
break;
case 'f':
//Trading is done
GameClient.getInstance().getUi().stopTrade();
break;
}
break;
case 's':
//Party swapping. Received as s0,5. Pokemons in party at 0 and 5 were swapped around
m_game.getOurPlayer().swapPokemon(Integer.parseInt(message.substring(1, message.indexOf(','))),
Integer.parseInt(message.substring(message.indexOf(',') + 1)) );
break;
case 'S':
//Shop
switch(message.charAt(1)) {
case 'l': //Shop List
HashMap<Integer, Integer> stock = new HashMap<Integer, Integer>();
String[] merchData = message.substring(2).split(",");
for (int i = 0; i < merchData.length; i++) {
String[] tempStockData = merchData[i].split(":");
stock.put(Integer.parseInt(tempStockData[0]), Integer.parseInt(tempStockData[1]));
}
GameClient.getInstance().getUi().startShop(stock);
break;
case 'n': //N is for No Money
GameClient.messageDialog("You can't afford this item", GameClient.getInstance().getDisplay());
break;
case 'f': //F is for Full Pockets. Can't carry any more
GameClient.messageDialog("You can't carry any new items", GameClient.getInstance().getDisplay());
break;
case 'c': //Cant Carry more of that Type
GameClient.messageDialog("You can't carry any more "+message.substring(2),
GameClient.getInstance().getDisplay());
break;
case 'd': //You don't have the item you're trying to sell!
GameClient.messageDialog("You don't have a "+message.substring(2),
GameClient.getInstance().getDisplay());
break;
case 'b': //Bought Item
try {
GameClient.getInstance().getUi().getNPCSpeech().advance();
GameClient.getInstance().getUi().getNPCSpeech().advance();
} catch (Exception e) {}
GameClient.getInstance().getUi().talkToNPC(
"You bought a " + ItemDatabase.getInstance().
getItem(Integer.parseInt(message.substring(2))).getName());
GameClient.getInstance().getUi().getShop().m_timer.reset();
GameClient.getInstance().getUi().getShop().m_timer.resume();
break;
case 's': //Sold Item
try {
GameClient.getInstance().getUi().getNPCSpeech().advance();
GameClient.getInstance().getUi().getNPCSpeech().advance();
} catch (Exception e) {}
GameClient.getInstance().getUi().talkToNPC(
"You sold a " + ItemDatabase.getInstance().
getItem(Integer.parseInt(message.substring(2))).getName());
GameClient.getInstance().getUi().getShop().m_timer.reset();
GameClient.getInstance().getUi().getShop().m_timer.resume();
break;
case 'S': //Sprite selection
GameClient.getInstance().getDisplay().add(new SpriteChooserDialog());
break;
}
break;
case 'B':
//Box access - receiving a string of pokedex numbers, e.g. B15,23,24,
int[] pokes = new int[30];
/*
* NOTE: -1 identifies that no pokemon is in a slot
*/
if(message.length() > 1) {
String[] indexes = message.substring(1).split(",");
for (int i = 0; i < 30; i++){
if(indexes.length > i)
if(indexes[i] == null || indexes[i].compareTo("") == 0)
pokes[i] = -1;
else
pokes[i] = (Integer.parseInt(indexes[i]));
else
pokes[i] = -1;
}
} else {
for (int i = 0; i < pokes.length; i++){
pokes[i] = -1;
}
}
if (GameClient.getInstance().getUi().getStorageBox() == null){
GameClient.getInstance().getUi().useStorageBox(pokes);
} else {
GameClient.getInstance().getUi().getStorageBox().changeBox(pokes);
}
break;
case 'b':
//Battle information
switch(message.charAt(1)) {
case 'i':
//Battle started -> biISWILD,POKEAMOUNT
BattleManager.getInstance().startBattle(message.charAt(2),
Integer.parseInt(message.substring(3)));
break;
case 'I':
//Won an item in battle
String item = ItemDatabase.getInstance().getItem(Integer.parseInt(message.substring(2))).getName();
GameClient.getInstance().getOurPlayer().addItem(Integer.parseInt(message.substring(2)), 1);
BattleManager.getInstance().getTimeLine().informItemDropped(item);
break;
case 'p':
//No PP left for move -> bpMOVENAME
BattleManager.getInstance().getTimeLine().informNoPP(message.substring(2));
break;
case 'P':
//Receive enemy poke data -> bPINDEX,NAME,LEVEL,GENDER,MAXHP,CURHP,SPRITENUM,ISSHINY
String[] data = message.substring(2).split(",");
BattleManager.getInstance().setEnemyPoke(Integer.parseInt(data[0]),
data[1], Integer.parseInt(data[2]), Integer.parseInt(data[3]), Integer.parseInt(
data[4]), Integer.parseInt(data[5]), Integer.parseInt(data[6]),
Boolean.valueOf(data[7]));
break;
case 'n':
//Receive the enemy trainer's name
BattleManager.getInstance().setEnemyName(message.substring(2));
break;
case '!':
//Other battle message not specified by packets below
BattleManager.getInstance().getTimeLine().showMessage(message.substring(2));
break;
case '@':
//Victory condition
switch(message.charAt(2)) {
case 'w':
//Our player won
BattleManager.getInstance().getTimeLine().informVictory();
break;
case 'l':
//Our player lost
BattleManager.getInstance().getTimeLine().informLoss();
break;
case 'p':
//Our player caught the Pokemon
BattleManager.getInstance().endBattle();
break;
}
break;
case 'F':
//A pokemon fainted -> bFPOKEMON
BattleManager.getInstance().getTimeLine().informFaintedPoke(
message.substring(2));
break;
case 'M':
//A move was used -> bMPOKEMON,MOVENAME
BattleManager.getInstance().getTimeLine().informMoveUsed(
message.substring(2).split(","));
break;
case 'm':
//Move requested
BattleManager.getInstance().getTimeLine().informMoveRequested();
break;
case '.':
//Exp gain -> b.POKEMON,EXPAMOUNT
BattleManager.getInstance().getTimeLine().informExperienceGained(
message.substring(2).split(","));
break;
case 'e':
//A Pokemon received a status effect -> beTRAINER.POKEMON,EFFECT
BattleManager.getInstance().getTimeLine().informStatusChanged(
Integer.parseInt(String.valueOf(message.charAt(2))), message.substring(3).split(","));
break;
case 'E':
//A Pokemon had a status effect removed -> bEPOKEMON,EFFECT
BattleManager.getInstance().getTimeLine().informStatusHealed(
Integer.parseInt(String.valueOf(message.charAt(2))), message.substring(3).split(","));
break;
case 's':
//Switch in Pokemon requested
BattleManager.getInstance().getTimeLine().informSwitchRequested();
break;
case 'S':
//A switch occured -> bSTRAINERNAME,NEWPOKEMON
BattleManager.getInstance().getTimeLine().informSwitch(
message.substring(2).split(","));
break;
case 'h':
/*
* Receiving health info (health value, not health lost)
* (don't ask why there's two methods for this, shoddy needs em for some reason)
* NOTE: 0 is always our player
*/
switch(message.charAt(2)) {
case '0':
//Our pokemon's health
BattleManager.getInstance().getTimeLine().informHealthChanged(
message.substring(2).split(","), 0);
break;
case '1':
//Enemy pokemon's health
BattleManager.getInstance().getTimeLine().informHealthChanged(
message.substring(2).split(","), 1);
break;
}
break;
case 'r':
//The player tried to run ->bHSUCCESS
switch(message.charAt(2)) {
case '1':
//Successfully ran away
BattleManager.getInstance().getTimeLine().informRun(true);
break;
case '2':
//Failed to run away
BattleManager.getInstance().getTimeLine().informRun(false);
break;
}
break;
case '$':
//Receiving earnings
BattleManager.getInstance().getTimeLine().informMoneyGain(Integer.parseInt(
message.substring(2)));
break;
case 'l':
//Inform pokemon level up
final String[] levelData = message.substring(2).split(",");
BattleManager.getInstance().getTimeLine().informLevelUp(levelData[0],
Integer.parseInt(levelData[1]));
break;
}
break;
case 'P':
//Pokemon information
switch(message.charAt(1)) {
case 'S':
//Stats update
details = message.substring(3).split(",");
m_game.getOurPlayer().updatePokemon(Integer.parseInt(String.valueOf(message.charAt(2))), details);
m_game.getUi().refreshParty();
break;
case 'N':
//A pokemon left the party
m_game.getOurPlayer().setPokemon(Integer.parseInt(String.valueOf(message.charAt(2))), null);
m_game.getUi().refreshParty();
break;
case 'i':
//Initialise a pokemon
details = message.substring(3).split(",");
m_game.getOurPlayer().setPokemon(Integer.parseInt(message.substring(2, 3)), details);
break;
case 'm':
/*
* Move learning by levelling up, received as (for example) Pm0EMBER
* The 3rd character is the index of the pokemon in
* the player's party and the rest is the move name
* NOTE: This packet is for informing the client a move wants to be learned
* if the client allows the move learning, the server does not send a reply
* to confirm it was learned, as it is ensured it is learned
*/
MoveLearningManager.getInstance().queueMoveLearning(Integer.parseInt(String.valueOf(
message.charAt(2))), message.substring(3));
break;
case 'M':
/* Move learning by TM, this packet is confirmation that the moved was learned */
m_game.getOurPlayer().getPokemon()[Integer.parseInt(String.valueOf(message.charAt(2)))]
.setMoves(Integer.parseInt(String.valueOf(message.charAt(3)))
, message.substring(4));
m_game.getUi().update(false);
break;
case 'e':
//EXP gain
int p1 = Integer.parseInt(String.valueOf(message.charAt(2)));
int exp = m_game.getOurPlayer().getPokemon()[p1].getExp() + Integer.parseInt(message.substring(3));
m_game.getOurPlayer().getPokemon()[p1].setExp(exp);
m_game.getUi().update(false);
break;
case 'E':
/*
* A pokemon would like to evolve, received as PE1
* 1 is the index of the pokemon in the party
* Reply to server with the same packet except
* with a 0 at the end if the evolution was cancelled
* or a 1 if it was allowed, e.g. PE10
*/
GameClient.getInstance().getUi().tryEvolve(Integer.parseInt(String.valueOf(message.charAt(2))));
break;
case 'l':
//Level change
String[] levelData = message.substring(2).split(",");
m_game.getOurPlayer().getPokemon()[Integer.parseInt(levelData[0])].setLevel(
Integer.parseInt(levelData[1]));
m_game.getUi().update(false);
break;
case 'h':
//HP Change - through item usage
m_game.getOurPlayer().getPokemon()[Integer.parseInt(String.valueOf(message.charAt(2)))]
.setCurHP(Integer.parseInt(message.substring(3)));
m_game.getUi().update(false);
break;
case 'p':
//PP data - Pp POKEINDEX MOVEINDEX CURRENTPP , MAXPP
details = message.substring(4).split(",");
int poke = Integer.parseInt(String.valueOf(message.charAt(2)));
int move = Integer.parseInt(String.valueOf(message.charAt(3)));
m_game.getOurPlayer().getPokemon()[poke].setMoveCurPP(move, Integer.parseInt(String.valueOf(details[0])));
m_game.getOurPlayer().getPokemon()[poke].setMoveMaxPP(move, Integer.parseInt(String.valueOf(details[1])));
break;
}
break;
case 'F':
//Fishing packets
switch(message.charAt(1)) {
case 'F': //You can't use that rod at your current level
GameClient.messageDialog("You need to have a fishing level of " +
message.substring(2) + " to use that rod!", GameClient.getInstance().getDisplay());
break;
case 'f': //You can't fish on land!
GameClient.messageDialog("You can't fish on land!", GameClient.getInstance().getDisplay());
break;
case 'U': //It got away! (Too strong for you)
GameClient.messageDialog("The fish was too strong for you! \n" +
"It got away!", GameClient.getInstance().getDisplay());
break;
case 'u': //Not even a nibble!
GameClient.messageDialog("Not even a nibble!", GameClient.getInstance().getDisplay());
break;
}
break;
case 'C':
//Chat packet
m_game.getUi().messageReceived(message.substring(1));
break;
case 'c':
//Something changed
switch (message.charAt(1)){
case 'h':
// You need a higher trainer level to use an HM Object
GameClient.messageDialog("You are not strong enough to do this.\n" +
"Your trainer level must be " + message.substring(2) + " to do this.",
GameClient.getInstance().getDisplay());
break;
case 'B':
//Badge change
switch(message.charAt(2)) {
case 'i':
/*
* All of the player's badges. Received as 0000001100001110000
* 0 = no badge
* 1 = badge earned
* The string will be 41 chars long
* 0 - 7 Kanto Badges
* 8 - 15 Johto Badges
* 16 - 23 Hoenn Badges
* 24 - 31 Sinnoh Badges
* 32 - 35 Orange Islands Badges
* 36 - 41 Undefined
*/
m_game.getOurPlayer().initBadges(message.substring(3));
GameClient.getInstance().setOurPlayer(m_game.getOurPlayer());
break;
case 'a':
//Add a badge
m_game.getOurPlayer().addBadge(Integer.valueOf(message.substring(3)));
break;
}
break;
case 's':
//You gained a skill level or your skills are being initialized
switch (message.charAt(2)){
case 'b':
//Breeding
if(m_game.getOurPlayer().getBreedingLevel() != -1 && m_game.getOurPlayer().getBreedingLevel() != Integer.parseInt(message.substring(3)))
GameClient.getInstance().getUi().getChat().addSystemMessage("*" + "Congratulations! Your breeding level is now " + message.substring(3) + ".");
m_game.getOurPlayer().setBreedingLevel(Integer.parseInt(message.substring(3)));
break;
case 'f':
//Fishing
if(m_game.getOurPlayer().getFishingLevel() != -1 && m_game.getOurPlayer().getFishingLevel() != Integer.parseInt(message.substring(3)))
GameClient.getInstance().getUi().getChat().addSystemMessage("*" + "Congratulations! Your fishing level is now " + message.substring(3) + ".");
m_game.getOurPlayer().setFishingLevel(Integer.parseInt(message.substring(3)));
break;
case 't':
//Trainer
if(m_game.getOurPlayer().getTrainerLevel() != -1 && m_game.getOurPlayer().getTrainerLevel() != Integer.parseInt(message.substring(3)))
GameClient.getInstance().getUi().getChat().addSystemMessage("*" + "Congratulations! Your trainer level is now " + message.substring(3) + ".");
m_game.getOurPlayer().setTrainerLevel(Integer.parseInt(message.substring(3)));
break;
case 'c':
//Coordinating
if(m_game.getOurPlayer().getCoordinatingLevel() != -1 && m_game.getOurPlayer().getCoordinatingLevel() != Integer.parseInt(message.substring(3)))
GameClient.getInstance().getUi().getChat().addSystemMessage("*" + "Congratulations! Your coordinating level is now " + message.substring(3) + ".");
m_game.getOurPlayer().setCoordinatingLevel(Integer.parseInt(message.substring(3)));
break;
}
break;
case 'W':
//Weather Change
switch(message.charAt(2)) {
case 'n':
//Normal
m_game.getWeatherService().setWeather(Weather.NORMAL);
break;
case 'r':
//Rain
m_game.getWeatherService().setWeather(Weather.RAIN);
break;
case 'h':
//Hail
m_game.getWeatherService().setWeather(Weather.HAIL);
break;
case 'f':
//Fog
m_game.getWeatherService().setWeather(Weather.FOG);
break;
case 'S':
//Sandstorm
m_game.getWeatherService().setWeather(Weather.SANDSTORM);
break;
}
break;
case 'M':
//Money change
m_game.getOurPlayer().setMoney(Integer.parseInt(message.substring(2)));
GameClient.getInstance().getUi().update(true);
break;
case 'H':
//Pokes were healed
for (int i = 0; i < GameClient.getInstance().getOurPlayer().getPokemon().length; i++){
if (GameClient.getInstance().getOurPlayer().getPokemon()[i] != null){
GameClient.getInstance().getOurPlayer().getPokemon()[i].setCurHP(
GameClient.getInstance().getOurPlayer().getPokemon()[i].getMaxHP());
for (int x = 0; x < 4; x++){
GameClient.getInstance().getOurPlayer().getPokemon()[i].setMoveCurPP(x,
GameClient.getInstance().getOurPlayer().getPokemon()[i].
getMoveMaxPP()[x]);
}
}
}
m_game.getUi().update(false);
break;
case 'D':
//Facing down
p = m_game.getMapMatrix().getPlayer(Integer.parseInt(message.substring(2)));
if(p != null) {
p.setDirection(Direction.Down);
p.loadSpriteImage();
}
break;
case 'L':
//Facing Left
p = m_game.getMapMatrix().getPlayer(Integer.parseInt(message.substring(2)));
if(p != null) {
p.setDirection(Direction.Left);
p.loadSpriteImage();
}
break;
case 'R':
//Facing Right
p = m_game.getMapMatrix().getPlayer(Integer.parseInt(message.substring(2)));
if(p != null) {
p.setDirection(Direction.Right);
p.loadSpriteImage();
}
break;
case 'U':
//Facing Up
p = m_game.getMapMatrix().getPlayer(Integer.parseInt(message.substring(2)));
if(p != null) {
p.setDirection(Direction.Up);
p.loadSpriteImage();
}
break;
case 'S':
//Sprite change
details = message.substring(2).split(",");
p = m_game.getMapMatrix().getPlayer(Integer.parseInt(details[0]));
if(p != null) {
p.setSprite(Integer.parseInt(details[1]));
p.loadSpriteImage();
}
break;
}
break;
case 'U':
//Updating our player co-ordinates (probably went out of sync)
//Ux,y
p = m_game.getOurPlayer();
details = message.substring(1).split(",");
p.setX(Integer.parseInt(details[0]));
p.setY(Integer.parseInt(details[1]));
p.setServerX(p.getX());
p.setServerY(p.getY());
/* Reposition screen above player */
m_game.getMapMatrix().getCurrentMap().setXOffset(400 - p.getX(), false);
m_game.getMapMatrix().getCurrentMap().setYOffset(300 - p.getY(), false);
m_game.getMapMatrix().recalibrate();
break;
case 'M':
//Player movements
//Mdirpid,dirpid
details = message.substring(1).split(",");
for(int i = 0; i < details.length; i++) {
processMovement(Integer.parseInt(details[i].substring(1)),
details[i].charAt(0));
}
break;
case 'm':
//Map Information
switch(message.charAt(1)) {
case 'i':
//Initialise players
m_game.getMapMatrix().getPlayers().clear();
m_game.getMapMatrix().getPlayers().trimToSize();
details = message.substring(2).split(",");
/*
* Parse all the information. This packet contains details for all players on this map
*/
for(int i = 0; i < details.length - 1; i++) {
p = new Player();
try {
HMObject hm = new HMObject(HMObject.parseHMObject(details[i]));
i++;
hm.setId(Integer.parseInt(details[i]));
i ++;
hm.setSprite(Integer.parseInt(details[i]));
i ++;
hm.setX(Integer.parseInt(details[i]));
hm.setServerX(Integer.parseInt(details[i]));
i++;
hm.setY(Integer.parseInt(details[i]));
hm.setServerY(Integer.parseInt(details[i]));
i++;
hm.setDirection(Direction.Down);
hm.loadSpriteImage();
p = hm;
} catch (Exception e) {
p.setUsername(details[i]);
i++;
p.setId(Integer.parseInt(details[i]));
i++;
p.setSprite(Integer.parseInt(details[i]));
i++;
p.setX(Integer.parseInt(details[i]));
p.setServerX(Integer.parseInt(details[i]));
i++;
p.setY(Integer.parseInt(details[i]));
p.setServerY(Integer.parseInt(details[i]));
i++;
switch(details[i].charAt(0)) {
case 'D':
p.setDirection(Direction.Down);
break;
case 'L':
p.setDirection(Direction.Left);
break;
case 'R':
p.setDirection(Direction.Right);
break;
case 'U':
p.setDirection(Direction.Up);
break;
default:
p.setDirection(Direction.Down);
break;
}
p.loadSpriteImage();
}
if(p.getId() == m_game.getPlayerId()) {
/*
* This dude is our player! Store this information
*/
p.setOurPlayer(true);
OurPlayer pl;
if(m_game.getOurPlayer() == null) {
pl = new OurPlayer();
} else {
pl = new OurPlayer(m_game.getOurPlayer());
}
pl.set(p);
m_game.setOurPlayer(pl);
m_game.getMapMatrix().addPlayer(pl);
GameClient.getInstance().setOurPlayer(pl);
GameClient.getInstance().getOurPlayer().setAnimating(true);
} else{
m_game.getMapMatrix().addPlayer(p);
}
}
break;
case 'a':
//Add player
details = message.substring(2).split(",");
p = new Player();
try {
HMObject hm = new HMObject(HMObject.parseHMObject(details[0]));
hm.setId(Integer.parseInt(details[1]));
hm.setSprite(Integer.parseInt(details[2]));
hm.setX(Integer.parseInt(details[3]));
hm.setServerX(Integer.parseInt(details[3]));
hm.setY(Integer.parseInt(details[4]));
hm.setServerY(Integer.parseInt(details[4]));
hm.setDirection(Direction.Down);
hm.loadSpriteImage();
p = hm;
p.setId(hm.getId());
} catch (Exception e) {
p.setUsername(details[0]);
p.setId(Integer.parseInt(details[1]));
p.setSprite(Integer.parseInt(details[2]));
p.setX(Integer.parseInt(details[3]));
p.setY(Integer.parseInt(details[4]));
p.setServerX(Integer.parseInt(details[3]));
p.setServerY(Integer.parseInt(details[4]));
switch(details[5].charAt(0)) {
case 'D':
p.setDirection(Direction.Down);
break;
case 'L':
p.setDirection(Direction.Left);
break;
case 'R':
p.setDirection(Direction.Right);
break;
case 'U':
p.setDirection(Direction.Up);
break;
default:
p.setDirection(Direction.Down);
break;
}
}
m_game.getMapMatrix().addPlayer(p);
break;
case 'F':
//Friends list
switch(message.charAt(1)) {
case 'i':
//Initialise
GameClient.getInstance().getUi().initFriendsList(message.substring(2).split(","));
break;
case 'a':
//A friend was added
GameClient.getInstance().getUi().getFriendsList().addFriend(message.substring(2));
break;
case 'r':
//A friend was removed
GameClient.getInstance().getUi().getFriendsList().removeFriend(message.substring(2));
break;
}
break;
case 'r':
//Remove player
m_game.getMapMatrix().removePlayer(Integer.parseInt(message.substring(2)));
break;
case 's':
//Set the map and weather
details = message.substring(3).split(",");
m_game.getMapMatrix().setNewMapPos(message.charAt(2));
m_game.setMap(Integer.parseInt(details[0]), Integer.parseInt(details[1]));
switch(Integer.parseInt(details[2])) {
case 0:
m_game.getWeatherService().setWeather(Weather.NORMAL);
break;
case 1:
m_game.getWeatherService().setWeather(Weather.RAIN);
break;
case 2:
m_game.getWeatherService().setWeather(Weather.HAIL);
break;
case 3:
m_game.getWeatherService().setWeather(Weather.SANDSTORM);
break;
case 4:
m_game.getWeatherService().setWeather(Weather.FOG);
break;
default:
m_game.getWeatherService().setWeather(Weather.NORMAL);
break;
}
break;
}
break;
case 'p':
//Change password packets
switch(message.charAt(1)) {
case 's':
//Successful password change
if(m_game.getPacketGenerator().isUpdatingHashMethod()) {
m_game.getPacketGenerator().login(m_game.getPacketGenerator().getLastUsername(), m_game.getPacketGenerator().getLastPassword());
}
break;
case 'e':
//Password change failed
if(m_game.getPacketGenerator().isUpdatingHashMethod()) {
// could just copy and paste code from login packet section
// but then that part of the code is useless
// opting in favor of the "stupid" way so that login stuff stays in one place
m_game.getPacketGenerator().login(m_game.getPacketGenerator().getLastUsername(), m_game.getPacketGenerator().getLastPassword());
}
break;
}
break;
case 'l':
//Login Information
switch(message.charAt(1)) {
case 's':
//Sucessful login
details = message.substring(2).split(",");
m_game.getLoginScreen().setVisible(false);
m_game.getLoadingScreen().setVisible(false);
m_game.setPlayerId(Integer.parseInt(details[0]));
m_game.getUi().setVisible(true);
m_game.getUi().getChat().setVisible(true);
m_game.getTimeService().setTime(Integer.parseInt(details[1].substring(0, 2)),
Integer.parseInt(details[1].substring(2)));
break;
case 'u':
//Unknown problem occurred
GameClient.messageDialog("An unknown problem occurred!", GameClient.getInstance().getDisplay());
m_game.getLoadingScreen().setVisible(false);
m_game.getLoginScreen().enableLogin();
break;
case 'e':
//Error
// if this is in response to the update hash attempt, then display the error message
if(m_game.getPacketGenerator().isUpdatingHashMethod()) {
// end attempt to update their password hash
m_game.getPacketGenerator().endUpdateHashMethod();
GameClient.messageDialog(translated.get(21), GameClient.getInstance().getDisplay());
m_game.getLoadingScreen().setVisible(false);
m_game.getLoginScreen().enableLogin();
} else {
// begin attempt to update password hash
m_game.getPacketGenerator().updatePasswordHashMethod();
}
break;
case '1':
//Account server offline
GameClient.messageDialog(translated.get(22), GameClient.getInstance().getDisplay());
m_game.getLoadingScreen().setVisible(false);
m_game.getLoginScreen().showLogin();
break;
case '2':
//Server full
GameClient.messageDialog("This server is full, please try another",
GameClient.getInstance().getDisplay());
m_game.getLoadingScreen().setVisible(false);
m_game.getLoginScreen().showLogin();
break;
case '3':
//You are logged in elsewhere
GameClient.messageDialog("You are still being logged out of another server,\n" +
"please try again later.",
GameClient.getInstance().getDisplay());
m_game.getLoadingScreen().setVisible(false);
m_game.getLoginScreen().showLogin();
break;
case '4':
//Banned
GameClient.messageDialog("You've been banned.",
GameClient.getInstance().getDisplay());
m_game.getLoadingScreen().setVisible(false);
m_game.getLoginScreen().showLogin();
break;
}
break;
case 'I': //I is for Items
switch(message.charAt(1)) {
case 'u': //Update item totals
details = message.substring(2).split(",");
GameClient.getInstance().getOurPlayer().addItem(Integer.parseInt(details[0]),Integer.parseInt(details[1]));
break;
case 'r': //Remove item from bag
details = message.substring(2).split(",");
m_game.getOurPlayer().removeItem(Integer.parseInt(details[0]), Integer.parseInt(details[1]));
break;
case 'i': //Item used
try {
GameClient.getInstance().getUi().getNPCSpeech().advance();
GameClient.getInstance().getUi().getNPCSpeech().advance();
} catch (Exception e) {}
details = message.substring(2).split(",");
GameClient.getInstance().getUi().talkToNPC(details[0]);
break;
}
break;
case 'r':
switch(message.charAt(1)) {
case '!':
//A notification regarding the request
switch(message.charAt(2)) {
case '0':
//The player logged out
break;
case '1':
//Players must stand beside each other to battle
GameClient.getInstance().getUi().getChat().addSystemMessage("You must be standing next to and facing the person you want to battle.");
break;
case '2':
//PvP is disabled on this map
GameClient.getInstance().getUi().getChat().addSystemMessage("You are not allowed to PvP in this map.");
break;
case '3':
//You must be within 3 squares to force this player to battle
GameClient.getInstance().getUi().getChat().addSystemMessage("You must be within 3 squares of this player to battle.");
break;
case '4':
GameClient.getInstance().getUi().getChat().addSystemMessage("You need to have more than one pokemon and/or you must wait 1 minute before trading again.");
break;
}
break;
case 't':
//Trade Request
GameClient.getInstance().getUi().getReqWindow().addRequest(message.substring(2), "trade");
break;
case 'b':
//Battle Request
GameClient.getInstance().getUi().getReqWindow().addRequest(message.substring(2), "battle");
break;
case 'c':
//Request canceled
GameClient.getInstance().getUi().getReqWindow().removeOffer(message.substring(2));
break;
case 's':
//Sucessful registration
GameClient.messageDialog(translated.get(23), GameClient.getInstance().getDisplay());
m_game.getLoadingScreen().setVisible(false);
m_game.getLoginScreen().showLogin();
break;
case '1':
//Account server offline
GameClient.messageDialog(translated.get(24), GameClient.getInstance().getDisplay());
m_game.getLoginScreen().getRegistration().enableRegistration();
m_game.getLoadingScreen().setVisible(false);
break;
case '2':
GameClient.messageDialog(translated.get(25), GameClient.getInstance().getDisplay());
m_game.getLoginScreen().getRegistration().enableRegistration();
m_game.getLoadingScreen().setVisible(false);
break;
case '3':
GameClient.messageDialog(translated.get(26), GameClient.getInstance().getDisplay());
m_game.getLoginScreen().getRegistration().enableRegistration();
m_game.getLoadingScreen().setVisible(false);
break;
case '4':
GameClient.messageDialog(translated.get(27), GameClient.getInstance().getDisplay());
m_game.getLoginScreen().getRegistration().enableRegistration();
m_game.getLoadingScreen().setVisible(false);
break;
case '5':
GameClient.messageDialog(translated.get(41), GameClient.getInstance().getDisplay());
m_game.getLoginScreen().getRegistration().enableRegistration();
m_game.getLoadingScreen().setVisible(false);
break;
case '6':
GameClient.messageDialog("Email too long!", GameClient.getInstance().getDisplay());
m_game.getLoginScreen().getRegistration().enableRegistration();
m_game.getLoadingScreen().setVisible(false);
break;
}
break;
}
}
}