/* * 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(); } }