package handling.channel.handler;
import clientside.MapleCharacter;
import clientside.MapleClient;
import clientside.MapleDisease;
import client.inventory.Item;
import client.inventory.MapleInventoryType;
import client.inventory.MaplePet;
import client.inventory.PetCommand;
import constants.GameConstants;
import handling.world.MaplePartyCharacter;
import java.awt.Point;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.concurrent.locks.Lock;
import server.MapleInventoryManipulator;
import server.MapleItemInformationProvider;
import server.Randomizer;
import server.life.MapleMonster;
import server.maps.FieldLimitType;
import server.maps.MapleMapItem;
import server.maps.MapleMapObject;
import server.maps.MapleMapObjectType;
import server.movement.LifeMovementFragment;
import tools.data.LittleEndianAccessor;
import tools.packet.CField;
import tools.packet.CWvsContext;
import tools.packet.PetPacket;
public class PetHandler {
public static final void SpawnPet(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr) {
slea.readInt();
chr.spawnPet(slea.readByte(), slea.readByte() > 0);
}
public static final void Pet_AutoPotion(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr) {
slea.skip(GameConstants.GMS ? 9 : 1);
slea.readInt();
short slot = slea.readShort();
if ((chr == null) || (!chr.isAlive()) || (chr.getMapId() == 749040100) || (chr.getMap() == null) || (chr.hasDisease(MapleDisease.POTION))) {
return;
}
Item toUse = chr.getInventory(MapleInventoryType.USE).getItem(slot);
if ((toUse == null) || (toUse.getQuantity() < 1) || (toUse.getItemId() != slea.readInt())) {
c.getSession().write(CWvsContext.enableActions());
return;
}
long time = System.currentTimeMillis();
if (chr.getNextConsume() > time) {
chr.dropMessage(5, "You may not use this item yet.");
c.getSession().write(CWvsContext.enableActions());
return;
}
if (!FieldLimitType.PotionUse.check(chr.getMap().getFieldLimit())) {
if (MapleItemInformationProvider.getInstance().getItemEffect(toUse.getItemId()).applyTo(chr)) {
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, slot, (short) 1, false);
if (chr.getMap().getConsumeItemCoolTime() > 0) {
chr.setNextConsume(time + chr.getMap().getConsumeItemCoolTime() * 1000);
}
}
} else {
c.getSession().write(CWvsContext.enableActions());
}
}
public static final void PetChat(int petid, short command, String text, MapleCharacter chr) {
if ((chr == null) || (chr.getMap() == null) || (chr.getPet(petid) == null)) {
return;
}
chr.getMap().broadcastMessage(chr, PetPacket.petChat(chr.getId(), command, text, (byte) petid), true);
}
public static final void PetCommand(MaplePet pet, PetCommand petCommand, MapleClient c, MapleCharacter chr) {
if (petCommand == null) {
return;
}
byte petIndex = chr.getPetIndex(pet);
boolean success = false;
if (Randomizer.nextInt(99) <= petCommand.getProbability()) {
success = true;
if (pet.getCloseness() < 30000) {
int newCloseness = pet.getCloseness() + petCommand.getIncrease() * c.getChannelServer().getTraitRate();
if (newCloseness > 30000) {
newCloseness = 30000;
}
pet.setCloseness(newCloseness);
if (newCloseness >= GameConstants.getClosenessNeededForLevel(pet.getLevel() + 1)) {
pet.setLevel(pet.getLevel() + 1);
c.getSession().write(CField.EffectPacket.showOwnPetLevelUp(petIndex));
chr.getMap().broadcastMessage(PetPacket.showPetLevelUp(chr, petIndex));
}
c.getSession().write(PetPacket.updatePet(pet, chr.getInventory(MapleInventoryType.CASH).getItem((short) (byte) pet.getInventoryPosition()), true));
}
}
chr.getMap().broadcastMessage(PetPacket.commandResponse(chr.getId(), (byte) petCommand.getSkillId(), petIndex, success, false));
}
public static final void PetFood(LittleEndianAccessor slea, MapleClient c, MapleCharacter chr) {
int previousFullness = 100;
MaplePet pet = null;
if (chr == null) {
return;
}
for (MaplePet pets : chr.getPets()) {
if ((pets.getSummoned())
&& (pets.getFullness() < previousFullness)) {
previousFullness = pets.getFullness();
pet = pets;
}
}
if (pet == null) {
c.getSession().write(CWvsContext.enableActions());
return;
}
slea.readInt();
short slot = slea.readShort();
int itemId = slea.readInt();
Item petFood = c.getPlayer().getInventory(MapleInventoryType.USE).getItem(slot);
if ((petFood == null) || (petFood.getItemId() != itemId) || (petFood.getQuantity() <= 0) || (itemId / 10000 != 212)) {
c.getSession().write(CWvsContext.enableActions());
return;
}
boolean gainCloseness = false;
if (Randomizer.nextInt(99) <= 50) {
gainCloseness = true;
}
if (pet.getFullness() < 100) {
int newFullness = pet.getFullness() + 30;
if (newFullness > 100) {
newFullness = 100;
}
pet.setFullness(newFullness);
byte index = chr.getPetIndex(pet);
if ((gainCloseness) && (pet.getCloseness() < 30000)) {
int newCloseness = pet.getCloseness() + 1;
if (newCloseness > 30000) {
newCloseness = 30000;
}
pet.setCloseness(newCloseness);
if (newCloseness >= GameConstants.getClosenessNeededForLevel(pet.getLevel() + 1)) {
pet.setLevel(pet.getLevel() + 1);
c.getSession().write(CField.EffectPacket.showOwnPetLevelUp(index));
chr.getMap().broadcastMessage(PetPacket.showPetLevelUp(chr, index));
}
}
c.getSession().write(PetPacket.updatePet(pet, chr.getInventory(MapleInventoryType.CASH).getItem((short) (byte) pet.getInventoryPosition()), true));
chr.getMap().broadcastMessage(c.getPlayer(), PetPacket.commandResponse(chr.getId(), (byte) 1, index, true, true), true);
} else {
if (gainCloseness) {
int newCloseness = pet.getCloseness() - 1;
if (newCloseness < 0) {
newCloseness = 0;
}
pet.setCloseness(newCloseness);
if (newCloseness < GameConstants.getClosenessNeededForLevel(pet.getLevel())) {
pet.setLevel(pet.getLevel() - 1);
}
}
c.getSession().write(PetPacket.updatePet(pet, chr.getInventory(MapleInventoryType.CASH).getItem((short) (byte) pet.getInventoryPosition()), true));
chr.getMap().broadcastMessage(chr, PetPacket.commandResponse(chr.getId(), (byte) 1, chr.getPetIndex(pet), false, true), true);
}
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, slot, (short) 1, true, false);
c.getSession().write(CWvsContext.enableActions());
}
public static final void MovePet(LittleEndianAccessor slea, MapleCharacter chr) {
if (chr == null) {
return;
}
int petId = (int) slea.readLong();
slea.skip(13);
List<LifeMovementFragment> res = MovementParse.parseMovement(slea, 3);
List<MapleMapObject> objects;
if ((res != null) && (chr != null) && (res.size() != 0) && (chr.getMap() != null)) {
MaplePet pet = chr.getPet(GameConstants.GMS ? chr.getPetIndex(petId) : petId);
if (pet == null) {
return;
}
pet.updatePosition(res);
chr.getMap().broadcastMessage(chr, PetPacket.movePet(chr.getId(), petId, chr.getPetIndex(petId), res), false);
if ((chr.hasBlockedInventory()) || (chr.getStat().pickupRange <= 0.0D) || (chr.inPVP())) {
return;
}
chr.setScrolledPosition((short) 0);
objects = chr.getMap().getMapObjectsInRange(chr.getTruePosition(), chr.getRange(), Arrays.asList(new MapleMapObjectType[]{MapleMapObjectType.ITEM}));
for (LifeMovementFragment move : res) {
Point pp = move.getPosition();
boolean foundItem = false;
for (MapleMapObject mapitemz : objects) {
if (((mapitemz instanceof MapleMapItem)) && ((Math.abs(pp.x - mapitemz.getTruePosition().x) <= chr.getStat().pickupRange) || (Math.abs(mapitemz.getTruePosition().x - pp.x) <= chr.getStat().pickupRange)) && ((Math.abs(pp.y - mapitemz.getTruePosition().y) <= chr.getStat().pickupRange) || (Math.abs(mapitemz.getTruePosition().y - pp.y) <= chr.getStat().pickupRange))) {
MapleMapItem mapitem = (MapleMapItem) mapitemz;
Lock lock = mapitem.getLock();
lock.lock();
try {
if (mapitem.isPickedUp()) {
lock.unlock();
} else if ((mapitem.getQuest() > 0) && (chr.getQuestStatus(mapitem.getQuest()) != 1)) {
lock.unlock();
} else if ((mapitem.getOwner() != chr.getId()) && (mapitem.isPlayerDrop())) {
lock.unlock();
} else if ((mapitem.getOwner() != chr.getId()) && (((!mapitem.isPlayerDrop()) && (mapitem.getDropType() == 0)) || ((mapitem.isPlayerDrop()) && (chr.getMap().getEverlast())))) {
lock.unlock();
} else if ((!mapitem.isPlayerDrop()) && ((mapitem.getDropType() == 1) || (mapitem.getDropType() == 3)) && (mapitem.getOwner() != chr.getId())) {
lock.unlock();
} else if ((mapitem.getDropType() == 2) && (mapitem.getOwner() != chr.getId())) {
lock.unlock();
} else if (mapitem.getMeso() > 0) {
if ((chr.getParty() != null) && (mapitem.getOwner() != chr.getId())) {
List<MapleCharacter> toGive = new LinkedList();
int splitMeso = mapitem.getMeso() * 40 / 100;
for (MaplePartyCharacter z : chr.getParty().getMembers()) {
MapleCharacter m = chr.getMap().getCharacterById(z.getId());
if ((m != null) && (m.getId() != chr.getId())) {
toGive.add(m);
}
}
for (MapleCharacter m : toGive) {
m.gainMeso(splitMeso / toGive.size(), true, true);
}
chr.gainMeso(mapitem.getMeso() - splitMeso, true, true);
} else {
chr.gainMeso(mapitem.getMeso(), true, true);
}
InventoryHandler.removeItem_Pet(chr, mapitem, petId);
foundItem = true;
} else if (mapitem.getItem().getItemId() / 10000 != 291) {
if (InventoryHandler.useItem(chr.getClient(), mapitem.getItemId())) {
InventoryHandler.removeItem_Pet(chr, mapitem, petId);
} else if (MapleInventoryManipulator.checkSpace(chr.getClient(), mapitem.getItem().getItemId(), mapitem.getItem().getQuantity(), mapitem.getItem().getOwner())) {
if ((mapitem.getItem().getQuantity() >= 50) && (mapitem.getItem().getItemId() == 2340000)) {
chr.getClient().setMonitored(true);
}
if (MapleInventoryManipulator.addFromDrop(chr.getClient(), mapitem.getItem(), true, mapitem.getDropper() instanceof MapleMonster)) {
InventoryHandler.removeItem_Pet(chr, mapitem, petId);
foundItem = true;
}
}
}
} finally {
lock.unlock();
}
}
}
if (foundItem) {
return;
}
}
}
}
}