/*
* This program is free software: you can redistribute it and/or modify it under the terms of the GNU 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 General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If
* not, see <http://www.gnu.org/licenses/>.
*/
package silentium.gameserver.model.actor.stat;
import silentium.gameserver.model.L2ItemInstance;
import silentium.gameserver.model.L2Skill;
import silentium.gameserver.model.actor.L2Character;
import silentium.gameserver.model.actor.instance.L2PetInstance;
import silentium.gameserver.network.SystemMessageId;
import silentium.gameserver.network.serverpackets.InventoryUpdate;
import silentium.gameserver.network.serverpackets.SocialAction;
import silentium.gameserver.network.serverpackets.SystemMessage;
import silentium.gameserver.skills.Stats;
import silentium.gameserver.tables.PetDataTable;
public class PetStat extends SummonStat
{
public PetStat(L2PetInstance activeChar)
{
super(activeChar);
}
public boolean addExp(int value)
{
if (!super.addExp(value))
return false;
getActiveChar().updateAndBroadcastStatus(1);
return true;
}
@Override
public boolean addExpAndSp(long addToExp, int addToSp)
{
if (!super.addExpAndSp(addToExp, addToSp))
return false;
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.PET_EARNED_S1_EXP);
sm.addNumber((int) addToExp);
getActiveChar().getOwner().sendPacket(sm);
return true;
}
@Override
public final boolean addLevel(byte value)
{
if (getLevel() + value > (getMaxLevel() - 1))
return false;
boolean levelIncreased = super.addLevel(value);
if (levelIncreased)
getActiveChar().broadcastPacket(new SocialAction(getActiveChar(), 15));
return levelIncreased;
}
@Override
public final long getExpForLevel(int level)
{
return PetDataTable.getInstance().getPetLevelData(getActiveChar().getNpcId(), level).getPetMaxExp();
}
@Override
public L2PetInstance getActiveChar()
{
return (L2PetInstance) super.getActiveChar();
}
public final int getFeedBattle()
{
return getActiveChar().getPetLevelData().getPetFeedBattle();
}
public final int getFeedNormal()
{
return getActiveChar().getPetLevelData().getPetFeedNormal();
}
public final int getMaxFeed()
{
return getActiveChar().getPetLevelData().getPetMaxFeed();
}
@Override
public void setLevel(byte value)
{
getActiveChar().setPetData(PetDataTable.getInstance().getPetLevelData(getActiveChar().getTemplate().getNpcId(), value));
getActiveChar().stopFeed();
super.setLevel(value); // Set level.
getActiveChar().startFeed();
// If a control item exists and its level is different of the new level.
final L2ItemInstance controlItem = getActiveChar().getControlItem();
if (controlItem != null && controlItem.getEnchantLevel() != getLevel())
{
getActiveChar().sendPetInfosToOwner();
controlItem.setEnchantLevel(getLevel());
// Update item
InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(controlItem);
getActiveChar().getOwner().sendPacket(iu);
}
}
@Override
public int getMaxHp()
{
return (int) calcStat(Stats.MAX_HP, getActiveChar().getPetLevelData().getPetMaxHP(), null, null);
}
@Override
public int getMaxMp()
{
return (int) calcStat(Stats.MAX_MP, getActiveChar().getPetLevelData().getPetMaxMP(), null, null);
}
@Override
public int getMAtk(L2Character target, L2Skill skill)
{
double attack = getActiveChar().getPetLevelData().getPetMAtk();
if (skill != null)
attack += skill.getPower();
return (int) calcStat(Stats.MAGIC_ATTACK, attack, target, skill);
}
@Override
public int getMDef(L2Character target, L2Skill skill)
{
double defence = getActiveChar().getPetLevelData().getPetMDef();
return (int) calcStat(Stats.MAGIC_DEFENCE, defence, target, skill);
}
@Override
public int getPAtk(L2Character target)
{
return (int) calcStat(Stats.POWER_ATTACK, getActiveChar().getPetLevelData().getPetPAtk(), target, null);
}
@Override
public int getPDef(L2Character target)
{
return (int) calcStat(Stats.POWER_DEFENCE, getActiveChar().getPetLevelData().getPetPDef(), target, null);
}
@Override
public int getPAtkSpd()
{
int val = super.getPAtkSpd();
if (getActiveChar().isHungry())
val = val / 2;
return val;
}
@Override
public int getMAtkSpd()
{
int val = super.getMAtkSpd();
if (getActiveChar().isHungry())
val = val / 2;
return val;
}
}