/*
OrpheusMS: MapleStory Private Server based on OdinMS
Copyright (C) 2012 Aaron Weiss <aaron@deviant-core.net>
Patrick Huy <patrick.huy@frz.cc>
Matthias Butz <matze@odinms.de>
Jan Christian Meyer <vimes@odinms.de>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package net.server.handlers.channel;
import client.IItem;
import client.MapleCharacter;
import constants.ExpTable;
import client.MapleClient;
import client.MapleInventoryType;
import client.MaplePet;
import client.autoban.AutobanManager;
import tools.Randomizer;
import net.AbstractMaplePacketHandler;
import server.MapleInventoryManipulator;
import tools.MaplePacketCreator;
import tools.data.input.SeekableLittleEndianAccessor;
public final class PetFoodHandler extends AbstractMaplePacketHandler {
public final void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
MapleCharacter chr = c.getPlayer();
AutobanManager abm = chr.getAutobanManager();
if (abm.getLastSpam(2) + 500 > System.currentTimeMillis()) {
c.announce(MaplePacketCreator.enableActions());
return;
}
abm.spam(2);
abm.setTimestamp(1, slea.readInt());
if (chr.getNoPets() == 0) {
c.getSession().write(MaplePacketCreator.enableActions());
return;
}
int previousFullness = 100;
byte slot = 0;
MaplePet[] pets = chr.getPets();
for (byte i = 0; i < 3; i++) {
if (pets[i] != null) {
if (pets[i].getFullness() < previousFullness) {
slot = i;
previousFullness = pets[i].getFullness();
}
}
}
MaplePet pet = chr.getPet(slot);
byte pos = (byte) slea.readShort();
int itemId = slea.readInt();
IItem use = chr.getInventory(MapleInventoryType.USE).getItem(pos);
if (use == null || (itemId / 10000) != 212 || use.getItemId() != itemId)
return;
boolean gainCloseness = false;
if (Randomizer.nextInt(101) > 50) {
gainCloseness = true;
}
if (pet.getFullness() < 100) {
int newFullness = pet.getFullness() + 30;
if (newFullness > 100)
newFullness = 100;
pet.setFullness(newFullness);
if (gainCloseness && pet.getCloseness() < 30000) {
int newCloseness = pet.getCloseness() + 1;
if (newCloseness > 30000) {
newCloseness = 30000;
}
pet.setCloseness(newCloseness);
if (newCloseness >= ExpTable.getClosenessNeededForLevel(pet.getLevel())) {
pet.setLevel((byte) (pet.getLevel() + 1));
c.announce(MaplePacketCreator.showOwnPetLevelUp(chr.getPetIndex(pet)));
chr.getMap().broadcastMessage(MaplePacketCreator.showPetLevelUp(c.getPlayer(), chr.getPetIndex(pet)));
}
}
chr.getMap().broadcastMessage(MaplePacketCreator.commandResponse(chr.getId(), slot, 1, true));
} else {
if (gainCloseness) {
int newCloseness = pet.getCloseness() - 1;
if (newCloseness < 0) {
newCloseness = 0;
}
pet.setCloseness(newCloseness);
if (pet.getLevel() > 1 && newCloseness < ExpTable.getClosenessNeededForLevel(pet.getLevel())) {
pet.setLevel((byte) (pet.getLevel() - 1));
}
}
chr.getMap().broadcastMessage(MaplePacketCreator.commandResponse(chr.getId(), slot, 0, false));
}
MapleInventoryManipulator.removeFromSlot(c, MapleInventoryType.USE, pos, (short) 1, false);
IItem petz = chr.getInventory(MapleInventoryType.CASH).getItem(pet.getPosition());
c.announce(MaplePacketCreator.updateSlot(petz));
c.announce(MaplePacketCreator.enableActions());
}
}