/*
* This file is part of aion-unique <aion-unique.org>.
*
* aion-unique 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.
*
* aion-unique 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 aion-unique. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aionemu.gameserver.services;
import com.aionemu.gameserver.model.gameobjects.Creature;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.network.aion.serverpackets.SM_ABYSS_RANK;
import com.aionemu.gameserver.network.aion.serverpackets.SM_ABYSS_RANK_UPDATE;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.aionemu.gameserver.utils.stats.StatFunctions;
import com.google.inject.Inject;
/**
* @author ATracer
*
*/
public class AbyssService
{
@Inject
private LegionService legionService;
/**
* Very basic method for now
*
* @param victim
* @param winner
*/
public void doReward(Player defeated, Player winner)
{
int pointsGained = Math.round(winner.getAbyssRank().getRank().getPointsGained() * winner.getRates().getApPlayerRate());
int pointsLost = Math.round(defeated.getAbyssRank().getRank().getPointsLost() * defeated.getRates().getApPlayerRate());
// Level penalty calc
int difference = winner.getLevel() - defeated.getLevel();
switch(difference)
{
case 3:
pointsGained = Math.round(pointsGained * 0.85f);
pointsLost = Math.round(pointsLost * 0.85f);
break;
case 4:
pointsGained = Math.round(pointsGained * 0.65f);
pointsLost = Math.round(pointsLost * 0.65f);
break;
case -2:
pointsGained = Math.round(pointsGained * 1.1f);
break;
case -3:
pointsGained = Math.round(pointsGained * 1.2f);
break;
}
if(difference > 4)
{
pointsGained = Math.round(pointsGained * 0.1f);
pointsLost = Math.round(pointsLost * 0.1f);
}
if(difference < -3)
{
pointsGained = Math.round(pointsGained * 1.3f);
}
// Abyss rank penalty calc
int winnerAbyssRank = winner.getAbyssRank().getRank().getId();
int defeatedAbyssRank = defeated.getAbyssRank().getRank().getId();
int abyssRankDifference = winnerAbyssRank - defeatedAbyssRank;
if(winnerAbyssRank <= 7 && abyssRankDifference > 0)
{
float penaltyPercent = abyssRankDifference * 0.05f;
pointsGained -= Math.round(pointsGained * penaltyPercent);
}
// AP farm protection
if(defeated.getAbyssRank().getAp() < pointsGained)
pointsGained = StatFunctions.calculateSoloAPReward(winner, defeated);
int oldWinnerAbyssRank = winner.getAbyssRank().getRank().getId();
int oldDefeatedAbyssRank = defeated.getAbyssRank().getRank().getId();
defeated.getAbyssRank().addAp(-pointsLost);
if(defeated.getAbyssRank().getRank().getId() != oldDefeatedAbyssRank)
PacketSendUtility.broadcastPacket(defeated, new SM_ABYSS_RANK_UPDATE(defeated));
winner.getAbyssRank().addAp(pointsGained);
if(winner.isLegionMember())
legionService.addContributionPoints(winner.getLegion(), pointsGained);
if(winner.getAbyssRank().getRank().getId() != oldWinnerAbyssRank)
PacketSendUtility.broadcastPacket(winner, new SM_ABYSS_RANK_UPDATE(winner));
winner.getAbyssRank().setAllKill();
PacketSendUtility.sendPacket(defeated, new SM_ABYSS_RANK(defeated.getAbyssRank()));
PacketSendUtility.sendPacket(winner, new SM_ABYSS_RANK(winner.getAbyssRank()));
PacketSendUtility.sendPacket(winner, SM_SYSTEM_MESSAGE.EARNED_ABYSS_POINT(String.valueOf(pointsGained)));
PacketSendUtility.sendPacket(defeated, new SM_SYSTEM_MESSAGE(1340002, winner.getName()));
}
/**
*
* @param victim
* @param winner
*/
public void doReward(Creature victim, Player winner)
{
int apReward = StatFunctions.calculateSoloAPReward(winner, victim);
int oldWinnerAbyssRank = winner.getAbyssRank().getRank().getId();
winner.getAbyssRank().addAp(apReward);
if(winner.isLegionMember())
legionService.addContributionPoints(winner.getLegion(), apReward);
if(winner.getAbyssRank().getRank().getId() != oldWinnerAbyssRank)
PacketSendUtility.broadcastPacket(winner, new SM_ABYSS_RANK_UPDATE(winner));
winner.getAbyssRank().setAllKill();
PacketSendUtility.sendPacket(winner, new SM_ABYSS_RANK(winner.getAbyssRank()));
PacketSendUtility.sendPacket(winner, SM_SYSTEM_MESSAGE.EARNED_ABYSS_POINT(String.valueOf(apReward)));
}
public void doReward(Player winner, int apReward)
{
winner.getAbyssRank().addAp(apReward);
if(winner.isLegionMember())
legionService.addContributionPoints(winner.getLegion(), apReward);
PacketSendUtility.broadcastPacket(winner, new SM_ABYSS_RANK_UPDATE(winner));
winner.getAbyssRank().setAllKill();
PacketSendUtility.sendPacket(winner, new SM_ABYSS_RANK(winner.getAbyssRank()));
PacketSendUtility.sendPacket(winner, SM_SYSTEM_MESSAGE.EARNED_ABYSS_POINT(String.valueOf(apReward)));
}
}