/*
* 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 com.l2jserver.gameserver.model.actor.stat;
import com.l2jserver.gameserver.datatables.ExperienceTable;
import com.l2jserver.gameserver.datatables.PetDataTable;
import com.l2jserver.gameserver.model.L2Skill;
import com.l2jserver.gameserver.model.actor.L2Character;
import com.l2jserver.gameserver.model.actor.instance.L2PetInstance;
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;
import com.l2jserver.gameserver.skills.Stats;
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);
// The PetInfo packet wipes the PartySpelled (list of active spells' icons). Re-add them
getActiveChar().updateEffectIcons(true);
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().updateAndBroadcastStatus(1);
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);
// Sync up exp with current level
//if (getExp() > getExpForLevel(getLevel() + 1) || getExp() < getExpForLevel(getLevel())) setExp(Experience.LEVEL[getLevel()]);
//TODO : proper system msg if is any
//if (levelIncreased) getActiveChar().getOwner().sendMessage("Your pet has increased it's level.");
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(), 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().getNpcId(), level).getPetMaxExp();
}
catch (NullPointerException e)
{
if (getActiveChar() != null)
_log.warning("Pet objectId:" + getActiveChar().getObjectId() + ", NpcId:"+getActiveChar().getNpcId()+", 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().npcId, value));
if (getActiveChar().getPetLevelData() == null)
throw new IllegalArgumentException("No pet data for npc: "+getActiveChar().getTemplate().npcId+" 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 getMaxVisibleHp() { 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();
Stats stat = skill == null? null : skill.getStat();
if (stat != null)
{
switch (stat)
{
case AGGRESSION: attack += getActiveChar().getTemplate().baseAggression; break;
case BLEED: attack += getActiveChar().getTemplate().baseBleed; break;
case POISON: attack += getActiveChar().getTemplate().basePoison; break;
case STUN: attack += getActiveChar().getTemplate().baseStun; break;
case ROOT: attack += getActiveChar().getTemplate().baseRoot; break;
case MOVEMENT: attack += getActiveChar().getTemplate().baseMovement; break;
case CONFUSION: attack += getActiveChar().getTemplate().baseConfusion; break;
case SLEEP: attack += getActiveChar().getTemplate().baseSleep; break;
}
}
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;
}
@Override
public int getMaxLevel()
{
return ExperienceTable.getInstance().getMaxPetLevel();
}
}