package org.reunionemu.jreunion.game;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
import org.reunionemu.jcommon.ParsedItem;
import org.reunionemu.jreunion.dao.QuestStateBaseDao;
import org.reunionemu.jreunion.events.Event;
import org.reunionemu.jreunion.events.EventListener;
import org.reunionemu.jreunion.events.client.ClientDisconnectEvent;
import org.reunionemu.jreunion.events.client.ClientEvent.ClientFilter;
import org.reunionemu.jreunion.events.map.ItemPickupEvent;
import org.reunionemu.jreunion.events.map.PlayerLogoutEvent;
import org.reunionemu.jreunion.events.network.NetworkAcceptEvent;
import org.reunionemu.jreunion.events.session.SessionEvent;
import org.reunionemu.jreunion.game.Equipment.Slot;
import org.reunionemu.jreunion.game.items.equipment.Armor;
import org.reunionemu.jreunion.game.items.pet.PetEgg;
import org.reunionemu.jreunion.game.quests.QuestState;
import org.reunionemu.jreunion.model.Quest;
import org.reunionemu.jreunion.server.Client;
import org.reunionemu.jreunion.server.Client.State;
import org.reunionemu.jreunion.server.DatabaseUtils;
import org.reunionemu.jreunion.server.LocalMap;
import org.reunionemu.jreunion.server.PacketFactory.Type;
import org.reunionemu.jreunion.server.PacketParser;
import org.reunionemu.jreunion.server.Reference;
import org.reunionemu.jreunion.server.Server;
import org.reunionemu.jreunion.server.Session;
import org.reunionemu.jreunion.server.SessionList;
import org.reunionemu.jreunion.server.Tools;
import org.reunionemu.jreunion.server.beans.SpringApplicationContext;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
/**
* @author Aidamina
* @license http://reunion.googlecode.com/svn/trunk/license.txt
*/
@Configurable
public abstract class Player extends LivingObject implements EventListener {
private long defense = 0;
private Map<Skill, Integer> skills = new HashMap<Skill, Integer>();
private long totalExp;
private long lvlUpExp;
private long lime; // Gold
private int slot;
@Autowired
QuestStateBaseDao<QuestState> questStateDao;
private int petId; //used during server loading
private Pet pet;
public int playerId = -1 ; //id used for database storage
private boolean isInCombat; // 0 - Peace Mode; 1 - Attack Mode
private long strength;
private long wisdom;
private long dexterity;
private long constitution;
private long leadership;
private Sex sex; // 0 - Male; 1 - Female
private long speed;
private long statusPoints;
private Inventory inventory;
private long penaltyPoints;
private long adminState; // 0 - normal user; 255 - SuperGM
private Session playerSession;
private long hairStyle;
private Equipment equipment;
private List<Long> attackQueue = new Vector<Long>();
private QuickSlotBar quickSlotBar;
private QuestState questState;
private Stash stash;
private Exchange exchange;
private long guildId;
private long guildLevel;
private Client client;
private String requestedToGuild;
private Party party;
private long mana;
private long electricity;
private long stamina;
private String guildName;
private Shop shop;
private long social;
public Player(Client client) {
super();
this.setClient(client);
client.setPlayer(this);
inventory = new Inventory();
equipment = new Equipment(this);
quickSlotBar = new QuickSlotBar(this);
stash = new Stash(this);
exchange = new Exchange(this);
client.addEventListener(ClientDisconnectEvent.class, this, new ClientFilter(client));
}
public int getPlayerId() {
return playerId;
}
public void setPlayerId(int playerId) {
this.playerId = playerId;
}
public int getSlot() {
return slot;
}
public void setSlot(int slot) {
this.slot = slot;
}
public static enum Sex{
MALE, //0
FEMALE //1
}
public static enum Race{
BULKAN(0), //0
KAILIPTON(1), //1
AIDIA(2), //2
HUMAN(3), //3
HYBRIDER(4), //4
PET(5), //5
UNDEFINED(6); //6
int value;
Race(int value){
this.value = value;
}
public int value(){
return value;
}
public static Race byValue(int raceId){
for(Race race:Race.values())
{
if(race.value()==raceId){
return race;
}
}
return null;
}
}
public Client getClient() {
return client;
}
public void setClient(Client client) {
this.client = client;
}
private static Integer sessionRadius;
public String getGuildRequestName()
{
return requestedToGuild;
}
public void setGuildRequestName(String name)
{
this.requestedToGuild = name;
}
public void addAttack(long attack) {
if (attackQueue.size() >= 5) {
attackQueue.remove(0);
}
attackQueue.add(attack);
}
public void clearAttackQueue() {
attackQueue.clear();
}
/****** Manages the Item Drop ******/
public void dropItem(int playerId) {
HandPosition handPosition = getInventory().getHoldingItem();
if (handPosition == null) {
LoggerFactory.getLogger(Player.class).error("Failed to get Player "+this+" holding item (HandPosition=NULL)");
return;
}
Item<?> item = handPosition.getItem();
if (item == null) {
LoggerFactory.getLogger(Player.class).error("Failed to get Player "+this+" holding item (Item=NULL)");
return;
}
LocalMap map = getPosition().getLocalMap();
RoamingItem roamingItem = map.getWorld().getCommand().dropItem(getPosition(), item, this);
LoggerFactory.getLogger(Player.class).info("Player "+this+" droped roaming item "+roamingItem);
getInventory().setHoldingItem(null);
}
public long getAdminState() {
return adminState;
}
@Override
public synchronized void setHp(long hp){
long before = this.getHp();
super.setHp(hp);
if(before!=this.getHp())
this.sendStatus(Status.HP);
}
public void sendStatus(Status status) {
if(client.getState()==State.INGAME||client.getState()==State.LOADED){
long min=0,max=0;
switch (status) {
case HP: //0
min = getHp();
max = getMaxHp();
break;
case MANA: //1
min = getMana();
max = getMaxMana();
break;
case STAMINA: //2
min = getStamina();
max = getMaxStamina();
break;
case ELECTRICITY: //3
min = getElectricity();
max = getMaxElectricity();
break;
case LEVEL: //4
min = getLevel();
break;
case LIME: //10
min = getLime();
break;
case TOTALEXP:
min = getTotalExp();
break;
case LEVELUPEXP: //12
min = getLevelUpExp();
break;
case STATUSPOINTS: //13
min = getStatusPoints();
break;
case STRENGTH: //14
min = getStrength();
break;
case WISDOM: //15
min = getWisdom();
break;
case DEXTERITY: //16
min = getDexterity();
break;
case CONSTITUTION: //17
min = getConstitution();
break;
case LEADERSHIP: //18
min = getLeadership();
break;
case PENALTYPOINTS: //19
min = getPenaltyPoints();
break;
default:
throw new RuntimeException(status+" not implemented yet");
}
client.sendPacket(Type.STATUS, status.value(), min, max);
}
}
public abstract long getMaxElectricity();
public abstract long getMaxMana();
public abstract long getMaxStamina();
public synchronized void setStamina(long stamina){
long before = this.stamina;
this.stamina = Tools.between(stamina, 0l, getMaxStamina());
if(before!=this.stamina)
this.sendStatus(Status.STAMINA);
}
public abstract long getBaseDamage();
public List<Long> getAttackQueue() {
return attackQueue;
}
public long getBestAttack() {
long bestAttack = 0;
for(long queuedAttack : getAttackQueue()){
if(queuedAttack > bestAttack)
bestAttack = queuedAttack;
}
return bestAttack;
}
public boolean isInCombat() {
return isInCombat;
}
public long getConstitution() {
return constitution;
}
public long getDef() {
return defense;
}
public long getDexterity() {
return dexterity;
}
/*** Return the distance between the player and the living object ***/
public long getDistance(LivingObject livingObject) {
double xcomp = Math.pow(livingObject.getPosition().getX() - getPosition().getX(), 2);
double ycomp = Math.pow(livingObject.getPosition().getY() - getPosition().getY(), 2);
double distance = Math.sqrt(xcomp + ycomp);
return (long)distance;
}
public Equipment getEquipment() {
return equipment;
}
public Exchange getExchange() {
return exchange;
}
public long getGuildId() {
return guildId;
}
public long getGuildLvl() {
return guildLevel;
}
public long getHairStyle() {
return hairStyle;
}
public Inventory getInventory() {
return inventory;
}
public long getLeadership() {
return leadership;
}
public long getLime() {
return lime;
}
public long getLevelUpExp() {
return lvlUpExp;
}
public long getPenaltyPoints() {
return penaltyPoints;
}
public Quest getQuest() {
if(getQuestState()!=null){
return getQuestState().getQuest();
}
return null;
}
public QuestState getQuestState() {
return questState;
}
public QuickSlotBar getQuickSlotBar() {
return quickSlotBar;
}
public long getElectricity() {
return electricity;
}
public long getStamina() {
return stamina;
}
public long getMana() {
return mana;
}
public synchronized void setMana(long mana) {
long before = this.mana;
this.mana = Tools.between(mana, 0l, getMaxMana());
if(before!=this.mana)
sendStatus(Status.MANA);
}
public synchronized void setElectricity(long electricity) {
long before = this.electricity;
this.electricity = Tools.between(electricity, 0l, getMaxElectricity());
if(this.electricity!=before)
sendStatus(Status.ELECTRICITY);
}
public Race getRace() {
if(this instanceof BulkanPlayer)
return Race.BULKAN;
if(this instanceof AidiaPlayer)
return Race.AIDIA;
if(this instanceof KailiptonPlayer)
return Race.KAILIPTON;
if(this instanceof HumanPlayer)
return Race.HUMAN;
if(this instanceof HybriderPlayer)
return Race.HYBRIDER;
throw new RuntimeException("Unknown race: "+this);
}
public void spawn() {
//TODO: fix respawn
/*
int defaultSpawnId = Integer.parseInt(Reference.getInstance().getMapReference().getItemById(getPosition().getMap().getId()).getMemberValue("DefaultSpawnId"));
ParsedItem defaultSpawn = getPosition().getMap().getPlayerSpawnReference().getItemById(defaultSpawnId);
Parser playerSpawns = getPosition().getMap().getPlayerSpawnReference();
Iterator<ParsedItem> iter = playerSpawns.getItemListIterator();
while (iter.hasNext()) {
ParsedItem item = iter.next();
if (Integer.parseInt(item.getMemberValue("Id"))!=defaultSpawnId) {
Rectangle rectangle = new Rectangle(Integer.parseInt(item
.getMemberValue("TargetX")), Integer.parseInt(item
.getMemberValue("TargetY")), Integer.parseInt(item
.getMemberValue("TargetWidth")), Integer.parseInt(item
.getMemberValue("TargetHeight")));
if (rectangle.contains(getPosition().getX(), getPosition().getY())) {
Server.getInstance()
.getWorld()
.getCommand()
.GoToPos(
this,
Integer.parseInt(item
.getMemberValue("X"))
+ (int) (Integer.parseInt(item
.getMemberValue("Width")) * Math
.random()),
Integer.parseInt(item
.getMemberValue("Y"))
+ (int) (Integer.parseInt(item
.getMemberValue("Height")) * Math
.random()));
return;
}
}
}
int x = Integer.parseInt(defaultSpawn.getMemberValue("X"));
int y = Integer.parseInt(defaultSpawn.getMemberValue("Y"));
int width = Integer.parseInt(defaultSpawn.getMemberValue("Width"));
int height = Integer.parseInt(defaultSpawn.getMemberValue("Height"));
Random rand = new Random(System.currentTimeMillis());
int spawnX = x+(width>0?rand.nextInt(width):0);
int spawnY = y+(height>0?rand.nextInt(height):0);
Server.getInstance()
.getWorld()
.getCommand()
.GoToPos(this,spawnX,spawnY);
*/
//this.setPosition(new Position(7026, 5220, 106, this.getPosition().getLocalMap(), 0.0f));
//getClient().getWorld().getCommand().GoToPos(this, this.getPosition());
PlayerSpawn defaultSpawn = this.getPosition().getLocalMap().getDefaultSpawn();
//TODO: Gracefully handle respawn
defaultSpawn.spawn(this);
}
/**
* @return Returns the playerSession.
* @uml.property name="playerSession"
*/
public Session getSession() {
return playerSession;
}
public Sex getSex() {
return sex;
}
public long getSpeed() {
return speed;
}
public Stash getStash() {
return stash;
}
public long getStatusPoints() {
return statusPoints;
}
public long getMaxStatusPoints() {
return (getLevel() <= 250) ? getLevel()*3 : 250*3+(getLevel()-250)*10;
}
public long getStrength() {
return strength;
}
public long getTotalExp() {
return totalExp;
}
public long getWisdom() {
return wisdom;
}
public static Player createPlayer(Client client, Race race){
if (race == Race.BULKAN) return new BulkanPlayer(client);
else if (race == Race.KAILIPTON) return new KailiptonPlayer(client);
else if (race == Race.AIDIA) return new AidiaPlayer(client);
else if (race == Race.HUMAN) return new HumanPlayer(client);
else if (race == Race.HYBRIDER) return new HybriderPlayer(client);
throw new RuntimeException("Invalid race: "+race);
}
/*** Manages the Items add/Remove from Trade Box ***/
public void itemExchange(int posX, int posY) {
Client client = getClient();
if (client == null) {
return;
}
if (getInventory().getHoldingItem() == null) {// removing exchange item
ExchangeItem item = getExchange().getItem(posX, posY);
if (item == null) {
return;
}
InventoryItem invItem = new InventoryItem(item.getItem(), new InventoryPosition( 0, 0, 0));
getInventory().setHoldingItem(new HandPosition(invItem.getItem()));
getExchange().removeItem(item);
LoggerFactory.getLogger(Player.class).info("Item "+item.getItem()+" removed from exchange inventory of Player "+this);
} else { //adding exchange item
Item<?> item = getInventory().getHoldingItem().getItem();
ExchangeItem newExchangeItem = new ExchangeItem(item, posX, posY);
ExchangeItem oldExchangeItem = null;
int x = 0, y = 0;
while (oldExchangeItem == null && x < item.getType().getSizeX()) {
while (oldExchangeItem == null && y < item.getType().getSizeY()) {
oldExchangeItem = getExchange().getItem(posX + x, posY + y);
y++;
}
y = 0;
x++;
}
if (oldExchangeItem == null) {
getInventory().setHoldingItem(null);
} else { //if player is holding an item then store it at the exchange
InventoryItem invItem = new InventoryItem(
oldExchangeItem.getItem(), new InventoryPosition( 0, 0, 0));
getInventory().setHoldingItem(new HandPosition(invItem.getItem()));
getExchange().removeItem(oldExchangeItem);
LoggerFactory.getLogger(Player.class).info("Item "+oldExchangeItem.getItem()+" removed from exchange inventory of Player "+this);
}
//get (remove) the item from the exchange
getExchange().addItem(newExchangeItem);
LoggerFactory.getLogger(Player.class).info("Item "+newExchangeItem.getItem()+
" stored in Player "+this+" exchange inventory at position {x:"+x+", y:"+y+"}");
}
}
/****** Load Items at Trade Box ******/
public void loadExchange() {
Client client = getClient();
if (client == null) {
return;
}
Iterator<ExchangeItem> exchangeIter = getExchange()
.itemListIterator();
while (exchangeIter.hasNext()) {
ExchangeItem exchangeItem = exchangeIter.next();
Item<?> item = exchangeItem.getItem();
if(item.getEntityId()==-1){
client.getPlayer().getPosition().getLocalMap().createEntityId(item);
}
client.sendPacket(Type.INVEN, exchangeItem, client.getVersion());
// inven [Tab] [UniqueId] [Type] [PosX] [PosY] [Gems] [Special]
}
}
@Override
public void loadFromReference(int id) {
ParsedItem parsedItem = Reference.getInstance().getExpReference()
.getItemById(id);
if (parsedItem == null) {
// cant find Item in the reference continue to load defaults:
setLevelUpExp(1000);
} else {
if (parsedItem.checkMembers(new String[] { "Exp" })) {
// use member from file
try{
setLevelUpExp(Long.parseLong(parsedItem.getMemberValue("Exp")));
}
catch(Exception NumerFormatException)
{
setLevelUpExp(1000);
LoggerFactory.getLogger(Player.class).info(getName()+
" level up experience value, not supported by LONG");
}
} else {
// use default
setLevelUpExp(1000);
}
}
}
/****** load Inventory Items ******/
public void loadInventory() {
Client client = getClient();
if (client == null) {
return;
}
Iterator<InventoryItem> invIter = getInventory()
.getInventoryIterator();
while (invIter.hasNext()) {
InventoryItem invItem = invIter.next();
Item<?> item = invItem.getItem();
if(item.getEntityId()==-1){
client.getPlayer().getPosition().getLocalMap().createEntityId(item);
}
client.sendPacket(Type.INVEN, invItem, client.getVersion());
}
if(getInventory().getHoldingItem() != null){
Item<?> holdingItem = getInventory().getHoldingItem().getItem();
getPosition().getLocalMap().createEntityId(holdingItem);
getClient().sendPacket(Type.EXTRA, holdingItem);
}
}
/****** load Quick Slot Items ******/
public void loadQuickSlot() {
Client client = getClient();
if (client == null) {
return;
}
Iterator<QuickSlotItem> quickSlot = getQuickSlotBar()
.getQuickSlotIterator();
while (quickSlot.hasNext()) {
QuickSlotItem qsItem = quickSlot.next();
Item<?> item = qsItem.getItem();
if(item.getEntityId()==-1){
client.getPlayer().getPosition().getLocalMap().createEntityId(item);
}
client.sendPacket(Type.QUICK, qsItem);
}
}
/****** load Equipment Items ******/
public void loadEquipment(LocalMap localMap) {
if(localMap == null)
return;
for(Equipment.Slot slot: Equipment.Slot.values()){
Item<?> item = getEquipment().getItem(slot);
if(item == null)
continue;
if(item.getEntityId()==-1){
localMap.createEntityId(item);
}
}
}
/****** load Stash Items ******/
public void loadStash(LocalMap localMap) {
if(localMap == null)
return;
Iterator<StashItem> stashIter = getStash().itemListIterator();
while(stashIter.hasNext()){
StashItem stashItem = (StashItem) stashIter.next();
Item<?> item = stashItem.getItem();
if(item == null)
continue;
if(item.getEntityId()==-1){
localMap.createEntityId(item);
}
}
}
/****** Manages the char Logout ******/
public synchronized void save() {
if(getEntityId() != -1){
LoggerFactory.getLogger(this.getClass()).info("Player " + getName() + " saving...\n");
try{
DatabaseUtils.getDinamicInstance().saveSkills(this);
}catch(Exception e){
LoggerFactory.getLogger(this.getClass()).warn(""+getName()+": Skills saving failed ...",e);
}
try{
DatabaseUtils.getDinamicInstance().saveInventory(this);
}catch(Exception e){
LoggerFactory.getLogger(this.getClass()).warn(""+getName()+": Inventory saving failed ...",e);
}
try{
DatabaseUtils.getDinamicInstance().savePet(this);
}catch(Exception e){
LoggerFactory.getLogger(this.getClass()).warn(""+getName()+": Pet saving failed ...",e);
}
try{
DatabaseUtils.getDinamicInstance().savePetEquipment(getPet());
}catch(Exception e){
LoggerFactory.getLogger(this.getClass()).warn(""+getName()+": Pet Equipment saving failed ...",e);
}
try{
DatabaseUtils.getDinamicInstance().saveCharacter(this);
}catch(Exception e){
LoggerFactory.getLogger(this.getClass()).warn(""+getName()+": Character saving failed ...",e);
}
try{
DatabaseUtils.getDinamicInstance().saveEquipment(this);
}catch(Exception e){
LoggerFactory.getLogger(this.getClass()).warn(""+getName()+": Equipment saving failed ...",e);
}
try{
DatabaseUtils.getDinamicInstance().saveStash(getClient());
}catch(Exception e){
LoggerFactory.getLogger(this.getClass()).warn(""+getName()+": Stash saving failed ...",e);
}
try{
DatabaseUtils.getDinamicInstance().saveExchange(this);
}catch(Exception e){
LoggerFactory.getLogger(this.getClass()).warn(""+getName()+": Exchange saving failed ...",e);
}
try{
DatabaseUtils.getDinamicInstance().saveQuickSlot(this);
}catch(Exception e){
LoggerFactory.getLogger(this.getClass()).warn(""+getName()+": QuickSlot saving failed ...",e);
}
//DatabaseUtils.getDinamicInstance().saveQuest(this);
}
LoggerFactory.getLogger(this.getClass()).info("Player " + getName() + " saving complete!\n");
}
public void loseStamina(long ammount) {
setStamina(getStamina() - ammount);
}
/****** Manages the Pick command ******/
// When you pick up an item, or buy something from merchant
public void pickItem(Item<?> item, int neededTab) {
Client client = getClient();
InventoryItem inventoryItem = getInventory().storeItem(item, neededTab);
if (inventoryItem == null) {
inventoryItem = new InventoryItem(item, new InventoryPosition(0, 0, 0));
getInventory().setHoldingItem(new HandPosition(inventoryItem.getItem()));
}
client.sendPacket(Type.PICK, inventoryItem);
}
/****** Manages the Pickup command ******/
public void pickupItem(RoamingItem roamingItem) {
Client client = getClient();
Player owner = roamingItem.getOwner();
if(owner!=null && owner!=this) {
client.sendPacket(Type.SAY, "This item belongs to " + owner.getName());
return;
}
roamingItem.stopDeleteTimer();
getPosition().getLocalMap().fireEvent(ItemPickupEvent.class, this, roamingItem);
LoggerFactory.getLogger(PacketParser.class).info("Player "+this+ " picked up roaming item " + roamingItem);
// S> pickup [CharID]
}
public void place(Position position, int unknown, boolean running) {
setIsRunning(running);
//synchronized(this){
setPosition(position);
setTargetPosition(position.clone());
//}
this.getInterested().sendPacket(Type.PLACE, this, unknown);
}
/****** revive player when he dies ******/
public void revive() {
long hp = getLevel() <= 30 ? getMaxHp() : (long)(getMaxHp()*.1);
setHp(hp);
spawn();
update();
}
public int getSkillLevel(Skill skill){
return skills.get(skill);
}
public java.util.Map<Skill, Integer> getSkills() {
return skills;
}
abstract public List<Skill> getDefensiveSkills();
public List<Skill> getActiveShieldSkills(){
List<Skill> activeShieldSkills = new Vector<Skill>();
//for(Skill skill : skills.get(key)){
//}
return activeShieldSkills;
}
public void say(String text) {
if(text.charAt(0) != '@')
{
SessionList<Session> list = getInterested().getSessions();
list.sendPacket(Type.SAY, text, this);
//getInterested().sendPacket(Type.SAY, text, this);
getClient().sendPacket(Type.SAY, text, this);
}
}
public void resetSkills()
{
java.util.Map<Skill,Integer> playerSkills = new HashMap<Skill,Integer> ();
playerSkills = getSkills();
// reset player skills to its minimum level
for(Skill skill: playerSkills.keySet()){
skill.reset(this);
}
}
public void setAdminState(long adminState) {
this.adminState = adminState;
}
public void setIsInCombat(boolean isInCombat) {
this.isInCombat = isInCombat;
getInterested().sendPacket(Type.COMBAT, this);
}
public void setConstitution(long cons) {
this.constitution = cons;
sendStatus(Status.CONSTITUTION);
sendStatus(Status.HP);
//sendStatus(Status.STAMINA);
}
public void setDefense() {
this.defense = 0;
for(Equipment.Slot slot: Equipment.Slot.values()){
Item<?> item = getEquipment().getItem(slot);
if(item==null)
continue;
if(item.is(Armor.class)){
this.defense += ((Armor)item.getType()).getDef(item);
}
}
}
public void setDexterity(long dex) {
this.dexterity = dex;
sendStatus(Status.DEXTERITY);
sendStatus(Status.ELECTRICITY);
}
public void setEquipment(Equipment equipment) {
this.equipment = equipment;
}
public void setGuildId(long guildId) {
this.guildId = guildId;
}
@Override
public void setLevel(int level) {
super.setLevel(level);
loadFromReference(level);
if(client.getState()==State.INGAME) {
sendStatus(Status.LEVEL);
client.sendPacket(Type.LEVELUP, this);
getInterested().sendPacket(Type.LEVELUP, this);
if(getAdminState() == 0)
{
if(getLevel() < 250 && level == 250)
{
client.sendPacket(Type.EVENTNOTICE, getName()+" reached Meta level");
getInterested().sendPacket(Type.EVENTNOTICE, getName()+" reached Meta level");
}
else if(level > 250 && level < 300 && level % 10 == 0)
{
client.sendPacket(Type.EVENTNOTICE, getName()+" reached level "+level+" of the Meta level");
getInterested().sendPacket(Type.EVENTNOTICE, getName()+" reached level "+level+" of the Meta level");
}
else if(getLevel() < 300 && level == 300)
{
client.sendPacket(Type.EVENTNOTICE, getName()+" reached High-Meta level");
getInterested().sendPacket(Type.EVENTNOTICE, getName()+" reached High-Meta level");
} else if (level > 300 &&level % 10 == 0)
{
client.sendPacket(Type.EVENTNOTICE, getName()+" reached lvl "+ level+" of the High-Meta level");
getInterested().sendPacket(Type.EVENTNOTICE, getName()+" reached lvl "+ level+" of the High-Meta level");
}
}
setHp(this.getMaxHp());
setMana(this.getMaxHp());
setElectricity(this.getMaxElectricity());
setStamina(this.getMaxStamina());
}
}
public void setGuildLevel(long guildLevel) {
this.guildLevel = guildLevel;
}
public void setHairStyle(long hairStyle) {
this.hairStyle = hairStyle;
}
public void setLeadership(long lead) {
this.leadership = lead;
sendStatus(Status.LEADERSHIP);
sendStatus(Status.HP);
sendStatus(Status.MANA);
sendStatus(Status.STAMINA);
sendStatus(Status.ELECTRICITY);
}
public void setLime(long lime) {
//check if player inventory lime limit is reached.
long limeLimit = Server.getInstance().getWorld().getServerSetings().getInventoryLimeLimit();
if(lime > limeLimit){
long limeOverLimit = lime - limeLimit;
lime = limeLimit;
Item<?> item = Server.getInstance().getWorld().getItemManager().create(925); //scroll
getPosition().getLocalMap().createEntityId(item);
item.setExtraStats((int)limeOverLimit);
InventoryItem inventoryItem = getInventory().storeItem(item, -1);
getClient().sendPacket(Type.MSG, "Inventory maximum lime limit reached. A scroll as been added to inventory.");
client.sendPacket(Type.PICK, inventoryItem);
}
this.lime = lime;
this.sendStatus(Status.LIME);
}
public void setLevelUpExp(long lvlUpExp) {
//synchronized(this) {
int maxLevel = Server.getInstance().getWorld().getServerSetings().getPlayerMaxLevel();
boolean hasMaxLevel = ((maxLevel != 0) ? true : false);
if(!hasMaxLevel || maxLevel > getLevel())
{
if(lvlUpExp<=0){
this.setLevel(getLevel()+1);
setStatusPoints(((this.getLevel() > 250) ? getStatusPoints()+10 : getStatusPoints()+3));
this.setLevelUpExp(this.getLevelUpExp());
}
else{
this.lvlUpExp = lvlUpExp;
sendStatus(Status.LEVELUPEXP);
}
}
//}
}
public void setPenaltyPoints(long penaltyPoints) {
this.penaltyPoints = penaltyPoints;
sendStatus(Status.PENALTYPOINTS);
}
public void setQuest(Quest quest) {
if(quest == null){
if (getQuestState()!=null){
if(getQuestState().isComplete()){
client.sendPacket(Type.QT, "end " + getQuest().getId());
}else{
client.sendPacket(Type.SAY, "Quest cancelled.");
client.sendPacket(Type.QT, "get -1");
}
setQuestState(null);
}
} else{
setQuestState(questStateDao.create(quest));
client.sendPacket(Type.QT, "get " + quest.getId());
}
}
public void setQuestState(QuestState questState){
if(this.questState!=null){
questStateDao.delete(this.questState);
}
this.questState = questState;
}
public void setSession(Session session) {
playerSession = session;
}
public void setSex(Sex sex) {
this.sex = sex;
}
public void setSpeed(long speed) {
this.speed = speed;
}
public void setStatusPoints(long statusPoints) {
this.statusPoints = statusPoints;
sendStatus(Status.STATUSPOINTS);
}
public void setStrength(long str) {
this.strength = str;
sendStatus(Status.STRENGTH);
sendStatus(Status.HP);
sendStatus(Status.STAMINA);
}
public void setTotalExp(long totalExp) {
this.totalExp = totalExp;
sendStatus(Status.TOTALEXP);
}
public void setWisdom(long wisdom) {
this.wisdom = wisdom;
sendStatus(Status.WISDOM);
sendStatus(Status.MANA);
}
public void setSocial(long emotionId) {
this.social = emotionId;
getInterested().sendPacket(Type.SOCIAL, this, emotionId);
}
public long getSocial(){
return this.social;
}
public void stop(Position position) {
//synchronized(this) {
setPosition(position);
setTargetPosition(position.clone());
//}
this.getInterested().sendPacket(Type.S_CHAR, this);
}
public void tell(String targetName, String text) {
if(targetName.equals(getName()))
return;
Client client = getClient();
Player targetPlayer = client.getWorld().getPlayerManager().getPlayer(targetName);
if (targetPlayer == null) {
client.sendPacket(Type.SAY, targetName+" is not online!");
return;
}
client.sendPacket(Type.WISPER, text, this ,"->Whisper*");
targetPlayer.getClient().sendPacket(Type.WISPER, text, this, "<-Whisper*");
}
public static enum Status {
HP(0),
MANA(1),
STAMINA(2),
ELECTRICITY(3),
LEVEL(4),
LIME(10),
TOTALEXP(11),
LEVELUPEXP(12),
STATUSPOINTS(13),
STRENGTH(14),
WISDOM(15),
DEXTERITY(16),
CONSTITUTION(17),
LEADERSHIP(18),
PENALTYPOINTS(19),
//TODO: Finish this
;
int value;
Status(int value){
this.value = value;
}
public int value(){
return value;
}
public static Status byValue(int statusId){
for(Status status:Status.values())
{
if(status.value()==statusId){
return status;
}
}
return null;
}
}
/****** Handles all the Status Updates ******/
public void updateStatus(int id, long curr, long max) {
Client client = this.getClient();
if (client == null) {
return;
}
switch (id) {
case 4: { // Player Level Status
setLevel(getLevel() + (int)curr);
client.sendPacket(Type.STATUS, id, getLevel(), max);
DatabaseUtils.getDinamicInstance()
.updateCharStatus(this, id, getLevel());
client.sendPacket(Type.LEVELUP, this);
getInterested().sendPacket(Type.LEVELUP, this);
break;
}
case 10: { // Player Lime Status
setLime(getLime() + curr);
client.sendPacket(Type.STATUS, id, getLime(), max);
DatabaseUtils.getDinamicInstance().updateCharStatus(this, id, getLime());
break;
}
case 11: { // Player Total Exp Status
setTotalExp(getTotalExp() + curr);
client.sendPacket(Type.STATUS, id, getTotalExp(), max);
DatabaseUtils.getDinamicInstance().updateCharStatus(this, id,
getTotalExp());
break;
}
case 12: { // Player Next Level Up Exp Status
if (curr <= 0) {
updateStatus(4, 1, 0);
updateStatus(13, 3, 0);
updateStatus(0, getMaxHp(), getMaxHp());
updateStatus(1, getMaxMana(), getMaxMana());
updateStatus(2, getMaxStamina(), getMaxStamina());
updateStatus(3, getMaxElectricity(), getMaxElectricity());
loadFromReference(getLevel());
client.sendPacket(Type.STATUS, id, getLevelUpExp(), max);
DatabaseUtils.getDinamicInstance().updateCharStatus(this, id,
getLevelUpExp());
} else {
setLevelUpExp(curr);
client.sendPacket(Type.STATUS, id, getLevelUpExp(), max);
DatabaseUtils.getDinamicInstance().updateCharStatus(this, id,
getLevelUpExp());
}
break;
}
case 13: { // Player Distribution Status Points
setStatusPoints(getStatusPoints() + curr);
client.sendPacket(Type.STATUS, id, getStatusPoints(), max);
DatabaseUtils.getDinamicInstance().updateCharStatus(this, id,
getStatusPoints());
break;
}
case 14: { // Player Strenght Status
if (getStatusPoints() <= 0) {
return;
}
setStrength(getStrength() + curr);
client.sendPacket(Type.STATUS, id, getStrength(), max);
DatabaseUtils.getDinamicInstance().updateCharStatus(this, id, getStrength());
updateStatus(0, getHp(), getMaxHp() + (getStrength() / 50) + 1);
updateStatus(2, getStamina(), getMaxStamina() + (getStrength() / 60) + 1);
updateStatus(13, -1, 0);
break;
}
case 15: { // Player Wisdom Status
if (getStatusPoints() <= 0) {
return;
}
setWisdom(getWisdom() + curr);
client.sendPacket(Type.STATUS, id, getWisdom(), max);
DatabaseUtils.getDinamicInstance().updateCharStatus(this, id, getWisdom());
updateStatus(1, getMana(), getMaxMana() + (getWisdom() / 50) + 2);
updateStatus(3, getElectricity(), getMaxElectricity() + (getWisdom() / 50) + 1);
updateStatus(13, -1, 0);
break;
}
case 16: { // Player Dex Status
if (getStatusPoints() <= 0) {
return;
}
setDexterity(getDexterity() + curr);
client.sendPacket(Type.STATUS, id, getDexterity(), max);
DatabaseUtils.getDinamicInstance().updateCharStatus(this, id, getDexterity());
updateStatus(1, getMana(), getMaxMana() + (getDexterity() / 50) + 1);
updateStatus(3, getElectricity(), getMaxElectricity() + (getDexterity() / 50) + 2);
updateStatus(13, -1, 0);
break;
}
case 17: { // Player Strain Status
if (getStatusPoints() <= 0) {
return;
}
setConstitution(getConstitution() + curr);
client.sendPacket(Type.STATUS, id, getConstitution(), max);
DatabaseUtils.getDinamicInstance().updateCharStatus(this, id, getConstitution());
updateStatus(0, getHp(), getMaxHp() + (getConstitution() / 50) + 2);
updateStatus(2, getStamina(), getMaxStamina() + (getConstitution() / 50) + 1);
updateStatus(13, -1, 0);
break;
}
case 18: { // Player Charisma Status
if (getStatusPoints() <= 0) {
return;
}
setLeadership(getLeadership() + curr);
client.sendPacket(Type.STATUS, id, getLeadership(), max);
DatabaseUtils.getDinamicInstance().updateCharStatus(this, id, getLeadership());
if (getLeadership() % 2 == 0) {
updateStatus(0, getHp(), getMaxHp() + 1);
updateStatus(1, getMana(), getMaxMana() + 1);
updateStatus(2, getStamina(), getMaxStamina() + 1);
updateStatus(3, getElectricity(), getMaxElectricity() + 1);
}
updateStatus(13, -1, 0);
break;
}
case 19: { // Player Penalty Points Status ([inGame=packet] -> 100=10;
// 1000=100; 10000=1000)
client.sendPacket(Type.STATUS, id, curr, max);
DatabaseUtils.getDinamicInstance().updateCharStatus(this, id,
getPenaltyPoints());
break;
}
}
// S> status [StatusConstant] [Current] [Max]
// DatabaseUtils.getInstance().saveCharStatus(this);
}
public void wearSlot(Slot slot) {
int flyStatus = 0;
HandPosition handPosition = getInventory().getHoldingItem();
//InventoryItem invItem = new InventoryItem(getInventory().getHoldingItem().getItem(),
// new InventoryPosition(0,0,0));
//player removed wearing equipment.
if (handPosition == null) {
getInventory().setHoldingItem(new HandPosition(getEquipment().getItem(slot)));
getEquipment().setItem(slot, null);
getInterested().sendPacket(Type.CHAR_REMOVE, this, slot);
LoggerFactory.getLogger(Player.class).info("Player "+this+" removed equipment "
+getInventory().getHoldingItem().getItem());
//check if the removed equipment is a PetEgg.
if(getInventory().getHoldingItem().getItem().getType() instanceof PetEgg){
getPet().setBreeding(false);
getPet().stopBreeding();
}
}
//player is equipping an item.
else {
InventoryItem invItem = new InventoryItem(getInventory().getHoldingItem().getItem(),
new InventoryPosition(0,0,0));
Item<?> wearingItem = getEquipment().getItem(slot);
//check if the equipment slot is already occupied and replace it.
if( (wearingItem != null) ){
getInventory().setHoldingItem(new HandPosition(wearingItem));
getInterested().sendPacket(Type.CHAR_REMOVE, this, slot);
LoggerFactory.getLogger(Player.class).info("Player "+this+" removed equipment "+wearingItem);
} else {
getInventory().setHoldingItem(null);
}
getEquipment().setItem(slot, invItem.getItem());
getInterested().sendPacket(Type.CHAR_WEAR, this, slot, invItem.getItem());
LoggerFactory.getLogger(Player.class).info("Player "+this+" equiped item "+invItem.getItem());
flyStatus = invItem.getItem().getExtraStats() >= 268435456 ? 1 : 0;
//check if the equipped item is a PetEgg.
if(invItem.getItem().getType() instanceof PetEgg){
getPet().setBreeding(true);
getPet().startBreeding();
}
}
// DatabaseUtils.getInstance().saveEquipment(this);
getClient().sendPacket(Type.SKY, this, flyStatus);
setDefense();
}
/**
* @param sessionRadius the sessionRadius to set
*/
public void setSessionRadius(int sessionRadius) {
Player.sessionRadius = sessionRadius;
}
/**
* @return the sessionRadius
*/
public int getSessionRadius() {
if(Player.sessionRadius==null){
setSessionRadius((int)getClient().getWorld().getServerSetings().getSessionRadius());
}
return Player.sessionRadius;
}
@Override
public void enter(Session session){
session.getOwner().getClient().sendPacket(Type.IN_CHAR, this, false);
if(getShop() != null && getPosition().getLocalMap().getShop(this) != null) {
session.getOwner().getClient().sendPacket(Type.U_SHOP, "in", this, getShop().getDescription());
}
}
@Override
public void exit(Session session){
session.getOwner().getClient().sendPacket(Type.OUT, this);
}
public void handleEvent(Event event){
Server.getInstance().getNetwork().addEventListener(NetworkAcceptEvent.class, this);
if(event instanceof ClientDisconnectEvent){
ClientDisconnectEvent clientDisconnectEvent = (ClientDisconnectEvent) event;
LoggerFactory.getLogger(Player.class).debug(""+clientDisconnectEvent.getSource());
Position position = getPosition();
if(position!=null&&position.getMap()!=null){
LocalMap map = getPosition().getLocalMap();
map.fireEvent(PlayerLogoutEvent.class, this);
}
}
if(event instanceof SessionEvent){
SessionEvent sessionEvent = (SessionEvent) event;
}
}
public String toString(){
StringBuffer buffer = new StringBuffer();
buffer.append("{");
buffer.append("id:");
buffer.append(getEntityId());
buffer.append("("+getPlayerId()+")");
buffer.append(", ");
buffer.append("name:");
buffer.append(getName());
if(Server.logger.isDebugEnabled()){
buffer.append(", ");
buffer.append("race:");
buffer.append(getRace());
buffer.append(", ");
buffer.append("level:");
buffer.append(getLevel());
}
buffer.append("}");
return buffer.toString();
}
public Skill getSkill(int id){
Skill skill = getPosition().getLocalMap().getWorld().getSkillManager().getSkill(id);
return skills.containsKey(skill)?skill:null;
}
public void setSkillLevel(Skill skill, int level) {
skills.put(skill, level);
}
public void addStatus(Status status) {
//synchronized(this){
long statusPoints = getStatusPoints();
if(getStatusPoints()>0){
switch(status){
case STRENGTH: //14
setStrength(getStrength()+1);
break;
case WISDOM: //15
setWisdom(getWisdom()+1);
break;
case DEXTERITY: //16
setDexterity(getDexterity()+1);
break;
case CONSTITUTION: //17
setConstitution(getConstitution()+1);
break;
case LEADERSHIP: //18
setLeadership(getLeadership()+1);
break;
default:
throw new RuntimeException("Invalid Status: "+status);
}
setStatusPoints(statusPoints-1);
}
//}
}
public void setGuildName(String name) {
guildName = name;
}
public String getGuildName()
{
return guildName;
}
public Pet getPet() {
return pet;
}
public void setPet(Pet pet) {
this.pet = pet;
}
public Party getParty() {
return party;
}
public void setParty(Party party) {
this.party = party;
}
public int isMeta(){
return (getLevel() >= 250 ? 1 : 0);
}
public int isHiMeta(){
return (getLevel() >= 300 ? 1 : 0);
}
public int getPetId() {
return petId;
}
public void setPetId(int petId) {
this.petId = petId;
}
public Shop getShop() {
return shop;
}
public void setShop(Shop shop) {
this.shop = shop;
}
public void addLime(Integer lime) {
setLime(getLime()+lime);
}
public void addExperience(int experience){
setTotalExp(getTotalExp()+experience);
setLevelUpExp(getLevelUpExp()-experience);
}
}