package com.aionemu.gameserver.model.gameobjects.player.title;
import java.util.Collection;
import java.util.LinkedHashMap;
import com.aionemu.gameserver.dao.PlayerTitleListDAO;
import com.aionemu.gameserver.dataholders.DataManager;
import com.aionemu.gameserver.model.Race;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.stats.listeners.TitleChangeListener;
import com.aionemu.gameserver.model.templates.TitleTemplate;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
import com.aionemu.gameserver.network.aion.serverpackets.SM_TITLE_INFO;
import com.aionemu.gameserver.taskmanager.tasks.ExpireTimerTask;
import com.aionemu.gameserver.utils.PacketSendUtility;
/**
* @author xavier, cura, xTz
*/
public class TitleList {
private final LinkedHashMap<Integer, Title> titles;
private Player owner;
public TitleList() {
this.titles = new LinkedHashMap<>();
this.owner = null;
}
public void setOwner(Player owner) {
this.owner = owner;
}
public Player getOwner() {
return owner;
}
public boolean contains(int titleId) {
return titles.containsKey(titleId);
}
public void addEntry(int titleId, int remaining) {
TitleTemplate tt = DataManager.TITLE_DATA.getTitleTemplate(titleId);
if (tt == null) {
throw new IllegalArgumentException("Invalid title id " + titleId);
}
titles.put(titleId, new Title(tt, titleId, remaining));
}
public boolean addTitle(int titleId, boolean questReward, int time) {
TitleTemplate tt = DataManager.TITLE_DATA.getTitleTemplate(titleId);
if (tt == null) {
throw new IllegalArgumentException("Invalid title id " + titleId);
}
if (owner != null) {
if (owner.getRace() != tt.getRace() && tt.getRace() != Race.PC_ALL) {
PacketSendUtility.sendMessage(owner, "This title is not available for your race.");
return false;
}
Title entry = new Title(tt, titleId, time);
if (!titles.containsKey(titleId)) {
titles.put(titleId, entry);
ExpireTimerTask.getInstance().registerExpirable(entry, owner);
PlayerTitleListDAO.storeTitles(owner, entry);
} else {
PacketSendUtility.sendPacket(owner, SM_SYSTEM_MESSAGE.STR_TOOLTIP_LEARNED_TITLE());
return false;
}
if (questReward)
PacketSendUtility.sendPacket(owner, SM_SYSTEM_MESSAGE.STR_QUEST_GET_REWARD_TITLE(tt.getL10n()));
else
PacketSendUtility.sendPacket(owner, SM_SYSTEM_MESSAGE.STR_MSG_GET_CASH_TITLE(tt.getL10n()));
PacketSendUtility.sendPacket(owner, new SM_TITLE_INFO(owner));
return true;
}
return false;
}
public void setDisplayTitle(int titleId) {
PacketSendUtility.sendPacket(owner, new SM_TITLE_INFO(titleId));
PacketSendUtility.broadcastPacketAndReceive(owner, (new SM_TITLE_INFO(owner, titleId)));
owner.getCommonData().setTitleId(titleId);
owner.getController().updateNearbyQuests();
}
public void setBonusTitle(int bonusTitleId) {
PacketSendUtility.sendPacket(owner, new SM_TITLE_INFO(6, bonusTitleId));
if (owner.getCommonData().getBonusTitleId() > 0) {
if (owner.getGameStats() != null) {
TitleChangeListener.onBonusTitleChange(owner.getGameStats(), owner.getCommonData().getBonusTitleId(), false);
}
}
owner.getCommonData().setBonusTitleId(bonusTitleId);
if (bonusTitleId > 0 && owner.getGameStats() != null) {
TitleChangeListener.onBonusTitleChange(owner.getGameStats(), bonusTitleId, true);
}
}
public void removeTitle(int titleId) {
if (!titles.containsKey(titleId))
return;
if (owner.getCommonData().getTitleId() == titleId)
setDisplayTitle(-1);
if (owner.getCommonData().getBonusTitleId() == titleId)
setBonusTitle(-1);
titles.remove(titleId);
PacketSendUtility.sendPacket(owner, new SM_TITLE_INFO(owner));
PlayerTitleListDAO.removeTitle(owner.getObjectId(), titleId);
}
public int size() {
return titles.size();
}
public Collection<Title> getTitles() {
return titles.values();
}
}