/*
* Copyright (C) 2004-2015 L2J Server
*
* This file is part of L2J Server.
*
* L2J Server 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.
*
* L2J Server 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 com.l2jserver.gameserver.model.actor.stat;
import com.l2jserver.gameserver.data.xml.impl.ExperienceData;
import com.l2jserver.gameserver.data.xml.impl.PetDataTable;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
import com.l2jserver.gameserver.model.skills.Skill;
import com.l2jserver.gameserver.model.stats.Stats;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.SocialAction;
import com.l2jserver.gameserver.network.serverpackets.StatusUpdate;
import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
public class PetStat extends SummonStat
{
public PetStat(L2PetInstance activeChar)
{
super(activeChar);
}
public boolean addExp(int value)
{
if (getActiveChar().isUncontrollable() || !super.addExp(value))
{
return false;
}
getActiveChar().updateAndBroadcastStatus(1);
// The PetInfo packet wipes the PartySpelled (list of active spells' icons). Re-add them
getActiveChar().updateEffectIcons(true);
return true;
}
public boolean addExpAndSp(long addToExp, long addToSp)
{
if (getActiveChar().isUncontrollable() || !addExp(addToExp))
{
return false;
}
SystemMessage sm = SystemMessage.getSystemMessage(SystemMessageId.YOUR_PET_GAINED_S1_XP);
sm.addLong(addToExp);
getActiveChar().updateAndBroadcastStatus(1);
getActiveChar().sendPacket(sm);
return true;
}
@Override
public final boolean addLevel(byte value)
{
if ((getLevel() + value) > (getMaxLevel() - 1))
{
return false;
}
boolean levelIncreased = super.addLevel(value);
// Sync up exp with current level
// if (getExp() > getExpForLevel(getLevel() + 1) || getExp() < getExpForLevel(getLevel())) setExp(Experience.LEVEL[getLevel()]);
StatusUpdate su = new StatusUpdate(getActiveChar());
su.addAttribute(StatusUpdate.LEVEL, getLevel());
su.addAttribute(StatusUpdate.MAX_HP, getMaxHp());
su.addAttribute(StatusUpdate.MAX_MP, getMaxMp());
getActiveChar().broadcastPacket(su);
if (levelIncreased)
{
getActiveChar().broadcastPacket(new SocialAction(getActiveChar().getObjectId(), SocialAction.LEVEL_UP));
}
// Send a Server->Client packet PetInfo to the L2PcInstance
getActiveChar().updateAndBroadcastStatus(1);
if (getActiveChar().getControlItem() != null)
{
getActiveChar().getControlItem().setEnchantLevel(getLevel());
}
return levelIncreased;
}
@Override
public final long getExpForLevel(int level)
{
try
{
return PetDataTable.getInstance().getPetLevelData(getActiveChar().getId(), level).getPetMaxExp();
}
catch (NullPointerException e)
{
if (getActiveChar() != null)
{
_log.warning("Pet objectId:" + getActiveChar().getObjectId() + ", NpcId:" + getActiveChar().getId() + ", level:" + level + " is missing data from pets_stats table!");
}
throw e;
}
}
@Override
public L2PetInstance getActiveChar()
{
return (L2PetInstance) super.getActiveChar();
}
public final int getFeedBattle()
{
return getActiveChar().getPetLevelData().getPetFeedBattle();
}
public final int getFeedNormal()
{
return getActiveChar().getPetLevelData().getPetFeedNormal();
}
@Override
public void setLevel(byte value)
{
getActiveChar().setPetData(PetDataTable.getInstance().getPetLevelData(getActiveChar().getTemplate().getId(), value));
if (getActiveChar().getPetLevelData() == null)
{
throw new IllegalArgumentException("No pet data for npc: " + getActiveChar().getTemplate().getId() + " level: " + value);
}
getActiveChar().stopFeed();
super.setLevel(value);
getActiveChar().startFeed();
if (getActiveChar().getControlItem() != null)
{
getActiveChar().getControlItem().setEnchantLevel(getLevel());
}
}
public final int getMaxFeed()
{
return getActiveChar().getPetLevelData().getPetMaxFeed();
}
@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, Skill skill)
{
return (int) calcStat(Stats.MAGIC_ATTACK, getActiveChar().getPetLevelData().getPetMAtk(), target, skill);
}
@Override
public int getMDef(L2Character target, Skill skill)
{
return (int) calcStat(Stats.MAGIC_DEFENCE, getActiveChar().getPetLevelData().getPetMDef(), 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;
}
@Override
public int getMaxLevel()
{
return ExperienceData.getInstance().getMaxPetLevel();
}
}