/*
* 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.configs.main.CustomConfig;
import com.aionemu.gameserver.dataholders.SkillTreeData;
import com.aionemu.gameserver.model.PlayerClass;
import com.aionemu.gameserver.model.Race;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.gameobjects.player.SkillList;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SKILL_LIST;
import com.aionemu.gameserver.skillengine.model.learn.SkillLearnTemplate;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.google.inject.Inject;
/**
* @author ATracer
*
*/
public class SkillLearnService
{
@Inject
private SkillTreeData skillTreeData;
/**
*
* @param player
* @param isNewCharacter
*/
public void addNewSkills(Player player, boolean isNewCharacter)
{
int level = player.getCommonData().getLevel();
PlayerClass playerClass = player.getCommonData().getPlayerClass();
Race playerRace = player.getCommonData().getRace();
if(isNewCharacter)
{
player.setSkillList(new SkillList());
}
addSkills(player, level, playerClass, playerRace, isNewCharacter);
}
/**
* Recursively check missing skills and add them to player
*
* @param player
*/
public void addMissingSkills(Player player)
{
int level = player.getCommonData().getLevel();
PlayerClass playerClass = player.getCommonData().getPlayerClass();
Race playerRace = player.getCommonData().getRace();
for(int i = 0; i <= level; i++)
{
addSkills(player, i, playerClass, playerRace, false);
}
if(!playerClass.isStartingClass())
{
PlayerClass startinClass = PlayerClass.getStartingClassFor(playerClass);
for(int i = 1; i < 10; i++)
{
addSkills(player, i, startinClass, playerRace, false);
}
if (player.getSkillList().getSkillEntry(30001) != null)
{
int skillLevel = player.getSkillList().getSkillLevel(30001);
player.getSkillList().removeSkill(30001);
PacketSendUtility.sendPacket(player, new SM_SKILL_LIST(player));
player.getSkillList().addSkill(player, 30002, skillLevel, true);
}
}
}
/**
* Adds skill to player according to the specified level, class and race
*
* @param player
* @param level
* @param playerClass
* @param playerRace
* @param isNewCharacter
*/
private void addSkills(Player player, int level, PlayerClass playerClass, Race playerRace, boolean isNewCharacter)
{
SkillLearnTemplate[] skillTemplates =
skillTreeData.getTemplatesFor(playerClass, level, playerRace);
SkillList playerSkillList = player.getSkillList();
for(SkillLearnTemplate template : skillTemplates)
{
if(!checkLearnIsPossible(playerSkillList, template))
continue;
playerSkillList.addSkill(player, template.getSkillId(), template.getSkillLevel(), !isNewCharacter);
}
}
/**
* Check SKILL_AUTOLEARN property
* Check skill already leanred
* Check skill template autolearn attribute
*
* @param playerSkillList
* @param template
* @return
*/
private boolean checkLearnIsPossible(SkillList playerSkillList, SkillLearnTemplate template)
{
if(CustomConfig.SKILL_AUTOLEARN || playerSkillList.isSkillPresent(template.getSkillId()))
return true;
if(template.isAutolearn())
return true;
return false;
}
}