/*
* 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.controllers;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import org.apache.commons.lang.ArrayUtils;
import com.aionemu.gameserver.controllers.attack.AttackResult;
import com.aionemu.gameserver.controllers.attack.AttackStatus;
import com.aionemu.gameserver.controllers.movement.ActionObserver;
import com.aionemu.gameserver.controllers.movement.AttackCalcObserver;
import com.aionemu.gameserver.model.gameobjects.Creature;
import com.aionemu.gameserver.model.gameobjects.Item;
import com.aionemu.gameserver.model.gameobjects.player.Player;
/**
* @author ATracer
*
*/
public class ObserveController
{
// TODO revisit here later
protected Queue<ActionObserver> moveObservers = new ConcurrentLinkedQueue<ActionObserver>();
protected Queue<ActionObserver> attackObservers = new ConcurrentLinkedQueue<ActionObserver>();
protected Queue<ActionObserver> attackedObservers = new ConcurrentLinkedQueue<ActionObserver>();
protected ActionObserver[] observers = new ActionObserver[0];
protected ActionObserver[] equipObservers = new ActionObserver[0];
protected AttackCalcObserver[] attackCalcObservers = new AttackCalcObserver[0];
/**
*
* @param observer
*/
public void attach(ActionObserver observer)
{
switch(observer.getObserverType())
{
case ATTACK:
attackObservers.add(observer);
break;
case ATTACKED:
attackedObservers.add(observer);
break;
case MOVE:
moveObservers.add(observer);
break;
}
}
/**
* notify that creature moved
*/
protected void notifyMoveObservers()
{
while(!moveObservers.isEmpty())
{
ActionObserver observer = moveObservers.poll();
observer.moved();
}
synchronized(observers)
{
for(ActionObserver observer : observers)
{
observer.moved();
}
}
}
/**
* notify that creature attacking
*/
public void notifyAttackObservers(Creature creature)
{
while(!attackObservers.isEmpty())
{
ActionObserver observer = attackObservers.poll();
observer.attack(creature);
}
synchronized(observers)
{
for(ActionObserver observer : observers)
{
observer.attack(creature);
}
}
}
/**
* notify that creature attacked
*/
protected void notifyAttackedObservers(Creature creature)
{
while(!attackedObservers.isEmpty())
{
ActionObserver observer = attackedObservers.poll();
observer.attacked(creature);
}
synchronized(observers)
{
for(ActionObserver observer : observers)
{
observer.attacked(creature);
}
}
}
/**
*
* @param item
* @param owner
*/
public void notifyItemEquip(Item item, Player owner)
{
synchronized(equipObservers)
{
for(ActionObserver observer : equipObservers)
{
observer.equip(item, owner);
}
}
}
/**
*
* @param item
* @param owner
*/
public void notifyItemUnEquip(Item item, Player owner)
{
synchronized(equipObservers)
{
for(ActionObserver observer : equipObservers)
{
observer.unequip(item, owner);
}
}
}
/**
*
* @param observer
*/
public void addObserver(ActionObserver observer)
{
synchronized(observers)
{
observers = (ActionObserver[]) ArrayUtils.add(observers, observer);
}
}
/**
*
* @param observer
*/
public void addEquipObserver(ActionObserver observer)
{
synchronized(equipObservers)
{
equipObservers = (ActionObserver[]) ArrayUtils.add(equipObservers, observer);
}
}
/**
*
* @param observer
*/
public void addAttackCalcObserver(AttackCalcObserver observer)
{
synchronized(attackCalcObservers)
{
attackCalcObservers = (AttackCalcObserver[]) ArrayUtils.add(attackCalcObservers, observer);
}
}
/**
*
* @param observer
*/
public void removeObserver(ActionObserver observer)
{
synchronized(observers)
{
observers = (ActionObserver[]) ArrayUtils.removeElement(observers, observer);
}
}
/**
*
* @param observer
*/
public void removeEquipObserver(ActionObserver observer)
{
synchronized(equipObservers)
{
equipObservers = (ActionObserver[]) ArrayUtils.removeElement(equipObservers, observer);
}
}
/**
*
* @param observer
*/
public void removeAttackCalcObserver(AttackCalcObserver observer)
{
synchronized(attackCalcObservers)
{
attackCalcObservers = (AttackCalcObserver[]) ArrayUtils.removeElement(attackCalcObservers, observer);
}
}
/**
*
* @param status
* @return true or false
*/
public boolean checkAttackStatus(AttackStatus status)
{
synchronized(attackCalcObservers)
{
for(AttackCalcObserver observer : attackCalcObservers)
{
if(observer.checkStatus(status))
return true;
}
}
return false;
}
/**
* @param attackList
*/
public void checShieldStatus(List<AttackResult> attackList)
{
synchronized(attackCalcObservers)
{
for(AttackCalcObserver observer : attackCalcObservers)
{
observer.checkShield(attackList);
}
}
}
}