/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package tools.packet;
import client.MapleCharacter;
import client.MapleClient;
import constants.WorldConstants;
import constants.WorldConstants.WorldOption;
import handling.SendPacketOpcode;
import java.util.LinkedList;
import java.util.List;
import server.farm.MapleFarm;
import tools.Pair;
import tools.data.MaplePacketLittleEndianWriter;
/**
*
* @author Itzik
*/
public class FarmPacket {
public static byte[] enterFarm(MapleClient c) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_OPEN.getValue());
PacketHelper.addCharacterInfo(mplew, c.getPlayer());
MapleFarm f = c.getFarm();
long time = System.currentTimeMillis();
/* Farm House positions:
* 000 001 002 003 004
* 025 026 027 028 029
* 050 051 052 053 054
* 075 076 077 078 079
* 100 101 102 103 104 //104 is base position
*/
List<Integer> house = new LinkedList();
int houseBase = 104;
int houseId = 4150001; //15x15 house need to code better houses
for (int i = 0; i < 5; i++) { //5x5
for (int j = 0; j < 5; j++) { //5x5
house.add(houseBase - j - i); //104 base position
}
}
for (int i = 0; i < 25 * 25; i++) { //2D building at every position
boolean housePosition = house.contains(i);
mplew.writeInt(housePosition ? houseId : 0); //building that the position contains
mplew.writeInt(i == houseBase ? houseId : 0); //building that the position bases
mplew.writeZeroBytes(5);
mplew.writeLong(PacketHelper.getTime(time));
}
mplew.writeInt(14);
mplew.writeInt(14);
mplew.writeInt(0);
mplew.writeLong(PacketHelper.getTime(time + 180000));
return mplew.getPacket();
}
public static byte[] farmQuestData(List<Pair<Integer, String>> canStart, List<Pair<Integer, String>> completed) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_QUEST_DATA.getValue());
mplew.writeInt(canStart.size());
for (Pair<Integer, String> i : canStart) {
mplew.writeInt(i.getLeft());
mplew.writeMapleAsciiString(i.getRight());
}
mplew.writeInt(completed.size());
for (Pair<Integer, String> i : completed) {
mplew.writeInt(i.getLeft());
mplew.writeMapleAsciiString(i.getRight());
}
return mplew.getPacket();
}
public static byte[] alertQuest(int questId, int status) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.QUEST_ALERT.getValue());
mplew.writeInt(questId);
mplew.write((byte) status);
return mplew.getPacket();
}
public static byte[] updateMonsterInfo(List<Pair<Integer, Integer>> monsters) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_MONSTER_INFO.getValue());
mplew.writeInt(monsters.size());
for (Pair<Integer, Integer> i : monsters) {
mplew.writeInt(i.getLeft());
mplew.writeInt(i.getRight());
}
return mplew.getPacket();
}
public static byte[] updateAesthetic(int quantity) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.AESTHETIC_POINT.getValue());
mplew.writeInt(quantity);
return mplew.getPacket();
}
public static byte[] spawnFarmMonster1() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SPAWN_FARM_MONSTER1.getValue());
mplew.writeInt(0);
mplew.write(1);
mplew.writeInt(0); //if 1 then same as spawnmonster2 but last byte is 1
return mplew.getPacket();
}
public static byte[] farmPacket1() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_PACKET1.getValue());
mplew.writeZeroBytes(4);
return mplew.getPacket();
}
public static byte[] farmPacket4() {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_PACKET4.getValue());
mplew.writeZeroBytes(4);
return mplew.getPacket();
}
public static byte[] updateQuestInfo(int id, int mode, String data) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_QUEST_INFO.getValue());
mplew.writeInt(id);
mplew.write((byte) mode);
mplew.writeMapleAsciiString(data);
return mplew.getPacket();
}
public static byte[] farmMessage(String msg) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_MESSAGE.getValue());
mplew.writeMapleAsciiString(msg);
return mplew.getPacket();
}
public static byte[] updateItemQuantity(int id, int quantity) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_ITEM_GAIN.getValue());
mplew.writeInt(id);
mplew.writeInt(quantity);
return mplew.getPacket();
}
public static byte[] itemPurchased(int id) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_ITEM_PURCHASED.getValue());
mplew.writeInt(id);
mplew.write(1);
return mplew.getPacket();
}
public static byte[] showExpGain(int quantity, int mode) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_EXP.getValue());
mplew.writeInt(quantity);
mplew.writeInt(mode);
return mplew.getPacket();
}
public static byte[] updateWaru(int quantity) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.UPDATE_WARU.getValue());
mplew.writeInt(quantity);
return mplew.getPacket();
}
public static byte[] showWaruHarvest(int slot, int quantity) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.HARVEST_WARU.getValue());
mplew.write(0);
mplew.writeInt(slot);
mplew.writeInt(quantity);
return mplew.getPacket();
}
public static byte[] spawnFarmMonster(MapleClient c, int id) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.SPAWN_FARM_MONSTER2.getValue());
mplew.writeInt(0);
mplew.write(1);
mplew.writeInt(1);
mplew.writeInt(1);
mplew.writeInt(c.getFarm().getId());
mplew.writeInt(1);
mplew.writeInt(id);
mplew.writeMapleAsciiString(""); //monster.getName()
mplew.writeInt(1); //level?
mplew.writeInt(0);
mplew.writeInt(15);
mplew.writeInt(3); //monster.getNurturesLeft()
mplew.writeInt(20); //monster.getPlaysLeft()
mplew.writeInt(0);
long time = System.currentTimeMillis(); //should be server time
mplew.writeLong(PacketHelper.getTime(time));
mplew.writeLong(PacketHelper.getTime(time + 25920000000000L));
mplew.writeLong(PacketHelper.getTime(time + 25920000000000L));
for (int i = 0; i < 4; i++) {
mplew.writeLong(PacketHelper.getTime(time));
}
mplew.writeInt(-1);
mplew.writeInt(-1);
mplew.writeZeroBytes(12);
mplew.write(0);
return mplew.getPacket();
}
public static byte[] updateMonster(List<Pair<Integer, Long>> monsters) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.UPDATE_MONSTER.getValue());
mplew.write(monsters.size());
for (Pair<Integer, Long> monster : monsters) {
mplew.writeInt(monster.getLeft()); //mob id as regular monster
mplew.writeLong(PacketHelper.getTime(monster.getRight())); //expire
}
return mplew.getPacket();
}
public static byte[] updateMonsterQuantity(int itemId, int monsterId) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_MONSTER_GAIN.getValue());
mplew.write(0);
mplew.writeInt(itemId);
mplew.write(1);
mplew.writeInt(monsterId);
mplew.writeInt(1); //quantity?
return mplew.getPacket();
}
public static byte[] renameMonster(int index, String name) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.RENAME_MONSTER.getValue());
mplew.writeInt(0);
mplew.writeInt(index);
mplew.writeMapleAsciiString(name);
return mplew.getPacket();
}
public static byte[] updateFarmFriends(List<MapleFarm> friends) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_FRIENDS.getValue());
mplew.writeInt(friends.size());
for (MapleFarm f : friends) {
mplew.writeInt(f.getId());
mplew.writeMapleAsciiString(f.getName());
mplew.writeZeroBytes(5);
}
mplew.writeInt(0); //blocked?
mplew.writeInt(0); //follower
return mplew.getPacket();
}
public static byte[] updateFarmInfo(MapleClient c) {
return updateFarmInfo(c, false);
}
public static byte[] updateFarmInfo(MapleClient c, boolean newname) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_INFO.getValue());
mplew.writeInt(c.getFarm().getId()); //Farm ID
mplew.writeInt(0);
mplew.writeLong(0); //decodeMoney ._.
//first real farm info
PacketHelper.addFarmInfo(mplew, c, 2);
mplew.write(0);
//then fake farm info
if (newname) {
mplew.writeMapleAsciiString("Creating...");
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.write(2);
mplew.writeInt(0);
mplew.writeInt(0);
mplew.writeInt(1);
} else { //or real info again incase name wasn't chosen this time
PacketHelper.addFarmInfo(mplew, c, 2);
}
mplew.write(0);
mplew.writeInt(0);
mplew.writeInt(-1);
mplew.write(0);
System.out.println(mplew.toString());
return mplew.getPacket();
}
public static byte[] updateUserFarmInfo(MapleCharacter chr, boolean update) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_USER_INFO.getValue());
mplew.write(update);
if (update) {
mplew.writeInt(chr.getWorld());
mplew.writeMapleAsciiString(WorldConstants.getNameById(chr.getWorld()));
mplew.writeInt(chr.getId()); //Not sure if character id or farm id
mplew.writeMapleAsciiString(chr.getName());
}
return mplew.getPacket();
}
public static byte[] sendFarmRanking(MapleCharacter chr, List<Pair<MapleFarm, Integer>> rankings) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_RANKING.getValue());
mplew.writeInt(0); //Visitors
mplew.writeInt(0); //Playtime
mplew.writeInt(0); //Combinations
mplew.writeInt(rankings.size());
int i = 0;
for (Pair<MapleFarm, Integer> best : rankings) {
mplew.writeInt(i); //Type; 0 = visitors 1 = playtime 2 = combinations
mplew.writeInt(best.getLeft().getId());
mplew.writeMapleAsciiString(best.getLeft().getName());
mplew.writeInt(best.getRight()); //Value of type
if (i < 2) {
i++;
}
}
mplew.write(0); //Boolean; enable or disable entry reward button
return mplew.getPacket();
}
public static byte[] updateAvatar(Pair<WorldOption, MapleCharacter> from, Pair<WorldOption, MapleCharacter> to, boolean change) {
MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
mplew.writeShort(SendPacketOpcode.FARM_AVATAR.getValue());
mplew.write(change);
mplew.writeInt(from.getLeft().getWorld());
mplew.writeMapleAsciiString(WorldConstants.getNameById(from.getLeft().getWorld()));
mplew.writeInt(from.getRight().getId());
mplew.writeMapleAsciiString(from.getRight().getName());
if (change) {
mplew.writeInt(to.getLeft().getWorld());
mplew.writeMapleAsciiString(WorldConstants.getNameById(to.getLeft().getWorld()));
mplew.writeInt(to.getRight().getId());
mplew.writeMapleAsciiString(to.getRight().getName());
}
return mplew.getPacket();
}
}