Package pu.web.client

Source Code of pu.web.client.PU_Protocol

package pu.web.client;

import pu.web.client.gui.impl.PU_ChatChannel;
import pu.web.client.gui.impl.PU_ChatPanel;
import pu.web.client.gui.impl.PU_Text;
import pu.web.client.resources.fonts.Fonts;

public class PU_Protocol
{
  private PU_Connection mConn;
 
  public PU_Protocol(PU_Connection conn)
  {
    mConn = conn;
  }
 
  public void parsePacket(PU_Packet packet)
  {
    byte header = packet.readUint8();
    //
    switch(header)
    {
      case PU_Packet.HEADER_LOGIN:
        receiveLoginStatus(packet);
        break;
       
      case PU_Packet.HEADER_IDENTITY:
        receiveIdentity(packet);
        break;
       
      case PU_Packet.HEADER_TILES:
        receiveTiles(packet);
        break;
       
      case PU_Packet.HEADER_WALK:
        receiveCreatureMove(packet);
        break;
       
      case PU_Packet.HEADER_TURN:
        receiveCreatureTurn(packet);
        break;
       
      case PU_Packet.HEADER_WARP:
        receiveWarp(packet);
        break;
       
      case PU_Packet.HEADER_REFRESHCOMPLETE:
        receiveTilesRefreshed(packet);
        break;
       
      case PU_Packet.HEADER_ADDCREATURE:
        receiveAddCreature(packet);
        break;
       
      case PU_Packet.HEADER_REMOVECREATURE:
        receiveRemoveCreature(packet);
        break;
       
      case PU_Packet.HEADER_CHAT:
        receiveChat(packet);
        break;
       
      case PU_Packet.HEADER_POKEMONPARTY:
        receivePokemonData(packet);
        break;
       
      default:
        PUWeb.log("Received packet with unknown header: " + header);
    }
  }
 
  // Send
  public void sendLogin(String username, String password, int version)
  {
    PU_Packet packet = new PU_Packet();
    packet.addUInt8(PU_Packet.HEADER_LOGIN);
    packet.addString(username);
    packet.addString(password);
    packet.addUint16(version);
    mConn.sendPacket(packet);   
  }
 
  public void sendRequestLogin()
  {
    PU_Packet packet = new PU_Packet();
    packet.addUInt8(PU_Packet.HEADER_LOGIN);
    mConn.sendPacket(packet);
  }
 
  public void sendWalk(int direction, boolean requestTiles)
  {
    PU_Packet packet = new PU_Packet();
    packet.addUInt8(PU_Packet.HEADER_WALK);
    packet.addUint16(direction);
    if(requestTiles)
    {
      packet.addUint16(1);
    }
    else
    {
      packet.addUint16(0);
    }
    mConn.sendPacket(packet);
  }
 
  public void sendTurn(int direction)
  {
    PU_Packet packet = new PU_Packet();
    packet.addUInt8(PU_Packet.HEADER_TURN);
    packet.addUint16(direction);
    mConn.sendPacket(packet);
  }
 
  public void sendRefreshTiles()
  {
    PU_Packet packet = new PU_Packet();
    packet.addUInt8(PU_Packet.HEADER_REFRESHWORLD);
    mConn.sendPacket(packet);
  }
 
  public void sendChat(int channel, int speakType, String message)
  {
    PU_Packet packet = new PU_Packet();
    packet.addUInt8(PU_Packet.HEADER_CHAT);
    packet.addUInt8((byte)speakType);
    packet.addUint16(channel);
    packet.addString(""); // receiver
    packet.addString(message);
    mConn.sendPacket(packet);
  }
 
  // Receive
  public void receiveLoginStatus(PU_Packet packet)
  {
    int loginStatus = packet.readUint8();
    PU_Login.setLoginStatus(loginStatus);
  }
 
  public void receiveIdentity(PU_Packet packet)
  {
    PU_Player player = new PU_Player(packet.readUint64());
    player.setName(packet.readString());
    int x = (short)packet.readUint16();
    int y = (short)packet.readUint16();
    player.setPosition(x, y);
    //player.setDirection(packet.readUint16());
    packet.readUint16();
    player.setMoney(packet.readUint32());
   
    for(int part = PU_Player.BODY_UPPER; part <= PU_Player.BODY_LOWER; part++)
    {
      player.setBodyPart(part, packet.readUint8());
      long color = packet.readUint32();
      int blue = (int)((byte) (color));
      int green = (int)((byte) (color >> 8));
      int red = (int)((byte) (color >> 16));
      player.getBodyPart(part).setColor(red, green, blue);
    }
   
    PUWeb.map().addCreature(player);
    PUWeb.game().setSelf(player);
  }
 
  public void receiveTiles(PU_Packet packet)
  {
    int tileCount = packet.readUint16();
    if(tileCount > 0)
    {
      for(int i = 0; i < tileCount; i++)
      {
        receiveTile(packet);
      }
    }
  }
 
  public void receiveTile(PU_Packet packet)
  {
    boolean tileExists = true;
    int[] layers = new int[]{-1, -1, -1};
   
    int x = (short)packet.readUint16();
    int y = (short)packet.readUint16();
    int movement = packet.readUint16();
   
    PU_Tile tile = PUWeb.map().getTile(x, y);
    if(tile == null)
      tileExists = false;
   
    int numLayers = packet.readUint16();
    for(int i = 0; i < numLayers; i++)
    {
      int layer = packet.readUint16();
      int id = (int)packet.readUint32();
     
      layers[layer] = id;
    }
   
    if(!tileExists)
    {
      tile = PUWeb.map().addTile(x, y);
      tile.setMovement(movement);
     
      for(int i = 0; i < 3; i++)
      {
        if(layers[i] != -1)
        {
          tile.addLayer(i, layers[i]);
        }
      }
    }
    else
    {
      long signature = (long)movement;
      int shift = 16;
      for(int i = 0; i < 3; i++)
      {
        if(layers[i] != -1)
        {
          signature |= ((long)layers[i] << shift);
        }
        shift += 16;
      }
     
      if(tile.getSignature() != signature)
      {
        tile.setMovement(movement);
        for(int i = 0; i < 3; i++)
        {
          tile.removeLayer(i);
          if(layers[i] != -1)
          {
            tile.addLayer(i, layers[i]);
          }
        }
      }
    }
   
    packet.readUint16(); // town id
    packet.readString(); // town name
  }
 
  public void receiveCreatureMove(PU_Packet packet)
  {
    PU_Creature creature = PUWeb.map().getCreatureById(packet.readUint64());
    int fromX = (short)packet.readUint16();
    int fromY = (short)packet.readUint16();
    int toX = (short)packet.readUint16();
    int toY = (short)packet.readUint16();
    PU_Tile toTile = PUWeb.map().getTile(toX, toY);
    PU_Tile fromTile = PUWeb.map().getTile(fromX, fromY);
    if(creature != null)
    {
      if(Math.abs(fromX-toX) > 1 || Math.abs(fromY-toY) > 1)
      {
        creature.setPosition(toX, toY);
      }
      else
      {
        if(creature instanceof PU_Player)
        {
          ((PU_Player)creature).receiveWalk(fromTile, toTile);
        }
      }
    }
  }
 
  public void receiveCreatureTurn(PU_Packet packet)
  {
    PU_Creature creature = PUWeb.map().getCreatureById(packet.readUint32());
    int direction = packet.readUint16();
    if(creature != null && creature != PUWeb.game().getSelf())
    {
      creature.setDirection(direction);
    }
  }
 
  public void receiveWarp(PU_Packet packet)
  {
    int x = (short)packet.readUint16();
    int y = (short)packet.readUint16();
   
    PUWeb.game().setState(PU_Game.GAMESTATE_LOADING);
   
    PU_Player self = PUWeb.game().getSelf();
    if(self != null)
    {
      self.cancelWalk();
      self.setPosition(x, y);
    }
   
    sendRefreshTiles();
  }
 
  public void receiveTilesRefreshed(PU_Packet packet)
  {
    PUWeb.game().setState(PU_Game.GAMESTATE_WORLD);
  }
 
  public void receiveAddCreature(PU_Packet packet)
  {
    PU_Player player = new PU_Player(packet.readUint64());
    player.setName(packet.readString());
    int x = (short)packet.readUint16();
    int y = (short)packet.readUint16();
    player.setPosition(x, y);
    player.setDirection(packet.readUint16());
   
    for(int part = PU_Player.BODY_UPPER; part <= PU_Player.BODY_LOWER; part++)
    {
      player.setBodyPart(part, packet.readUint8());
      long color = packet.readUint32();
      int blue = (int)((byte) (color));
      int green = (int)((byte) (color >> 8));
      int red = (int)((byte) (color >> 16));
      player.getBodyPart(part).setColor(red, green, blue);
    }
   
    PUWeb.map().addCreature(player);
  }
 
  public void receiveRemoveCreature(PU_Packet packet)
  {
    PUWeb.map().removeCreature(packet.readUint64());
  }
 
  public void receiveChat(PU_Packet packet)
  {
    long playerId = packet.readUint64();
    String name = packet.readString();
    int speakType = packet.readUint8();
    int channel = packet.readUint16();
    String message = packet.readString();

    if(!message.equals(""))
    {
      if(speakType == PU_ChatPanel.SPEAK_PRIVATE)
      {
        //PM YO
      }
      else
      {
        PU_Text text = new PU_Text(PUWeb.resources().getFont(Fonts.FONT_ARIALBLK_BOLD_14));
        if(name.equals(PUWeb.game().getSelf().getName()))
        {
          text.add(name + ": ", 150, 1, 150);
        }
        else
        {
          text.add(name + ": ", 0, 27, 150);
        }
       
        text.add(message, 0, 0, 0);
       
        if(channel == PU_ChatChannel.CHANNEL_LOCAL)
        {
          PUWeb.game().getOnscreenChat().add(name, message);
        }
       
        PU_ChatPanel chatPanel = PUWeb.game().getChatPanel();
        if(chatPanel != null)
        {
          chatPanel.addMessage(channel, text);
        }
      }
    }
  }
 
  public void receivePokemonData(PU_Packet packet)
  {
    for(int i = 0; i < 6; i++)
    {
      int slot = packet.readUint8();
      long id = packet.readUint32();
      if(id != 0)
      {
        PU_Pokemon pokemon = new PU_Pokemon();
        pokemon.setId(id);
        pokemon.setSpeciesId(packet.readUint16());
        pokemon.setName(packet.readString());
        pokemon.setLevel(packet.readUint16());
        pokemon.setExpCurrent(packet.readUint32());
        pokemon.setExpTnl(packet.readUint32());
        pokemon.setExpPerc((int)Math.floor(((float)pokemon.getExpCurrent()/(float)pokemon.getExpTnl())*100.0f));
        pokemon.setHp(packet.readUint16());
        pokemon.setHpmax(packet.readUint16());
        pokemon.setType1(packet.readUint16());
        pokemon.setType2(packet.readUint16());
        pokemon.setNature(packet.readUint16());
        pokemon.setSex(packet.readUint8());
       
        for(int stat = 0; stat < 6; stat++)
        {
          pokemon.setStat(stat, packet.readUint8());
        }
       
        for(int j = 0; j < 4; j++)
        {
          int attackSlot = packet.readUint8();
          long attackId = packet.readUint32();
          if(attackId != 0)
          {
            PU_Attack attack = new PU_Attack();
            attack.setId(attackId);
            attack.setName(packet.readString());
            attack.setFlavor(packet.readString());
            attack.setTypeName(packet.readString());
            attack.setPp(packet.readUint8());
            attack.setMaxPp(packet.readUint8());
            attack.setPower(packet.readUint8());
            attack.setAccuracy(packet.readUint8());
            attack.setTargetId(packet.readUint8());
            pokemon.setAttack(attackSlot, attack);
          }
        }
        if(PUWeb.game().getSelf() != null)
        {
          PUWeb.game().getSelf().setPokemon(slot, pokemon);
        }
      }
    }
  }
}
TOP

Related Classes of pu.web.client.PU_Protocol

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.