1
0
mirror of https://github.com/Rogiel/l2jserver2 synced 2025-12-08 08:23:11 +00:00

Change-Id: Ifa069a09d1b603781a2c9255d89b77cd6f25a359

This commit is contained in:
rogiel
2011-04-28 22:53:11 -03:00
parent 05e8355aaf
commit 54ef3c7fa2
38 changed files with 962 additions and 99 deletions

View File

@@ -1,17 +1,27 @@
package com.l2jserver.model.world;
import java.util.List;
import com.l2jserver.model.world.capability.Attackable;
import com.l2jserver.model.world.capability.Attacker;
import com.l2jserver.model.world.capability.Child;
import com.l2jserver.model.world.capability.Listenable;
import com.l2jserver.model.world.capability.Playable;
import com.l2jserver.model.world.capability.Spawnable;
import com.l2jserver.model.world.item.ItemEvent;
import com.l2jserver.model.world.item.ItemListener;
import com.l2jserver.util.Coordinate;
import com.l2jserver.util.factory.CollectionFactory;
public class Item extends AbstractObject implements Playable, Spawnable,
Attacker, Attackable, Child<Player> {
Attacker, Attackable, Child<Player>,
Listenable<ItemListener, ItemEvent> {
private final List<ItemListener> listeners = CollectionFactory
.newList(ItemListener.class);
@Override
public void spawn(Coordinate coordinate) {
}
@Override
@@ -26,6 +36,23 @@ public class Item extends AbstractObject implements Playable, Spawnable,
}
@Override
public void addListener(ItemListener listener) {
listeners.add(listener);
}
@Override
public void removeListener(ItemListener listener) {
listeners.remove(listener);
}
@Override
public void dispatch(ItemEvent e) {
for (final ItemListener listener : listeners) {
listener.dispatch(e);
}
}
@Override
public boolean isSpawned() {
// TODO Auto-generated method stub

View File

@@ -14,6 +14,7 @@ import com.l2jserver.model.world.capability.Spawnable;
import com.l2jserver.model.world.player.PlayerEvent;
import com.l2jserver.model.world.player.PlayerListener;
import com.l2jserver.util.Coordinate;
import com.l2jserver.util.factory.CollectionFactory;
/**
* {@link Player} is any object that can be controlled by the player. The most
@@ -24,6 +25,9 @@ import com.l2jserver.util.Coordinate;
public abstract class Player extends AbstractObject implements Playable,
Spawnable, Attacker, Attackable,
Listenable<PlayerListener, PlayerEvent>, Caster, Parent {
private final List<PlayerListener> listeners = CollectionFactory
.newList(PlayerListener.class);
@Override
public void spawn(Coordinate coordinate) {
@@ -43,37 +47,25 @@ public abstract class Player extends AbstractObject implements Playable,
@Override
public void addListener(PlayerListener listener) {
// TODO Auto-generated method stub
listeners.add(listener);
}
@Override
public void removeListener(PlayerListener listener) {
// TODO Auto-generated method stub
}
@Override
public List<PlayerListener> getListeners() {
// TODO Auto-generated method stub
return null;
}
@Override
public boolean support(Class<? extends PlayerEvent> eventType) {
return eventType.isAssignableFrom(PlayerEvent.class);
}
@Override
public Coordinate getPosition() {
// TODO Auto-generated method stub
return null;
listeners.remove(listener);
}
@Override
public void dispatch(PlayerEvent e) {
// TODO Auto-generated method stub
for (final PlayerListener listener : listeners) {
listener.dispatch(e);
}
}
@Override
public Coordinate getPosition() {
// TODO Auto-generated method stub
return null;
}
@Override

View File

@@ -0,0 +1,52 @@
package com.l2jserver.model.world;
import java.util.Iterator;
import java.util.Set;
import com.l2jserver.model.world.event.WorldEventDispatcher;
import com.l2jserver.model.world.filter.WorldObjectFilter;
import com.l2jserver.model.world.iterator.FilterIterator;
import com.l2jserver.util.factory.CollectionFactory;
public class World implements Iterable<WorldObject> {
private final Set<WorldObject> objects = CollectionFactory
.newSet(WorldObject.class);
private final WorldEventDispatcher dispatcher = new WorldEventDispatcher(
this);
public void add(WorldObject object) {
objects.add(object);
}
public void remove(WorldObject object) {
objects.remove(object);
}
public boolean contains(WorldObject object) {
return objects.contains(object);
}
public WorldEventDispatcher getDispatcher() {
return dispatcher;
}
@Override
public Iterator<WorldObject> iterator() {
return objects.iterator();
}
public <T extends WorldObject> Iterator<T> iterator(
final WorldObjectFilter<T> filter) {
return new FilterIterator<T>(filter, objects.iterator());
}
public <T extends WorldObject> Iterable<T> iterable(
final WorldObjectFilter<T> filter) {
return new Iterable<T>() {
@Override
public Iterator<T> iterator() {
return new FilterIterator<T>(filter, objects.iterator());
}
};
}
}

View File

@@ -1,7 +1,5 @@
package com.l2jserver.model.world.capability;
import java.util.List;
import com.l2jserver.model.world.AbstractObject;
import com.l2jserver.model.world.event.WorldEvent;
import com.l2jserver.model.world.event.WorldListener;
@@ -19,13 +17,27 @@ import com.l2jserver.model.world.event.WorldListener;
*/
public interface Listenable<L extends WorldListener<E>, E extends WorldEvent>
extends WorldCapability {
/**
* Adds a new listener
*
* @param listener
* the listener
*/
void addListener(L listener);
/**
* Removes an listener
*
* @param listener
* the listener
*/
void removeListener(L listener);
List<L> getListeners();
boolean support(Class<? extends E> eventType);
/**
* Don't use this method directly. It is called by the event dispatcher.
*
* @param e
* the event
*/
void dispatch(E e);
}

View File

@@ -1,5 +1,12 @@
package com.l2jserver.model.world.event;
public interface WorldEvent {
import com.l2jserver.model.world.WorldObject;
public interface WorldEvent {
WorldObject getObject();
/**
* Dispatch this event to all the objects
*/
void dispatch();
}

View File

@@ -0,0 +1,16 @@
package com.l2jserver.model.world.event;
import com.l2jserver.model.world.World;
public class WorldEventDispatcher {
private final World world;
public WorldEventDispatcher(World world) {
this.world = world;
}
public void dispatch(WorldEvent event) {
//TODO implement threaded model
event.dispatch();
}
}

View File

@@ -1,5 +1,20 @@
package com.l2jserver.model.world.event;
/**
* This is the most abstract listener for the listening engine.
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*
* @param <E>
* the received event type
*/
public interface WorldListener<E extends WorldEvent> {
void onAction(E e);
/**
* Once the event call is dispatched, the listener <b>WILL NOT</b> be
* removed. You must manually remove it from the <tt>event</tt> object.
*
* @param e
* the event
*/
void dispatch(E e);
}

View File

@@ -2,16 +2,16 @@ package com.l2jserver.model.world.filter;
import com.l2jserver.model.world.WorldObject;
public class AndFilter<O extends WorldObject> implements WorldFilter<O> {
private WorldFilter<O>[] filters;
public class AndFilter<O extends WorldObject> implements WorldObjectFilter<O> {
private WorldObjectFilter<O>[] filters;
public AndFilter(WorldFilter<O>... filters) {
public AndFilter(WorldObjectFilter<O>... filters) {
this.filters = filters;
}
@Override
public boolean accept(O object) {
for(final WorldFilter<O> filter : filters) {
for(final WorldObjectFilter<O> filter : filters) {
if(!filter.accept(object))
return false;
}

View File

@@ -2,10 +2,10 @@ package com.l2jserver.model.world.filter;
import com.l2jserver.model.world.WorldObject;
public class NotFilter<O extends WorldObject> implements WorldFilter<O> {
private WorldFilter<O> filter;
public class NotFilter<O extends WorldObject> implements WorldObjectFilter<O> {
private WorldObjectFilter<O> filter;
public NotFilter(WorldFilter<O> filter) {
public NotFilter(WorldObjectFilter<O> filter) {
this.filter = filter;
}

View File

@@ -2,16 +2,16 @@ package com.l2jserver.model.world.filter;
import com.l2jserver.model.world.WorldObject;
public class OrFilter<O extends WorldObject> implements WorldFilter<O> {
private WorldFilter<O>[] filters;
public class OrFilter<O extends WorldObject> implements WorldObjectFilter<O> {
private WorldObjectFilter<O>[] filters;
public OrFilter(WorldFilter<O>... filters) {
public OrFilter(WorldObjectFilter<O>... filters) {
this.filters = filters;
}
@Override
public boolean accept(O object) {
for(final WorldFilter<O> filter : filters) {
for(final WorldObjectFilter<O> filter : filters) {
if(filter.accept(object))
return true;
}

View File

@@ -3,18 +3,18 @@ package com.l2jserver.model.world.filter;
import com.l2jserver.model.world.WorldObject;
public final class WorldFilters {
public static final <O extends WorldObject> WorldFilter<O> and(
WorldFilter<O>... filters) {
public static final <O extends WorldObject> WorldObjectFilter<O> and(
WorldObjectFilter<O>... filters) {
return new AndFilter<O>(filters);
}
public static final <O extends WorldObject> WorldFilter<O> or(
WorldFilter<O>... filters) {
public static final <O extends WorldObject> WorldObjectFilter<O> or(
WorldObjectFilter<O>... filters) {
return new OrFilter<O>(filters);
}
public static final <O extends WorldObject> WorldFilter<O> notf(
WorldFilter<O> filter) {
public static final <O extends WorldObject> WorldObjectFilter<O> notf(
WorldObjectFilter<O> filter) {
return new NotFilter<O>(filter);
}
}

View File

@@ -7,7 +7,7 @@ import com.l2jserver.model.world.WorldObject;
*
* @author <a href="http://www.rogiel.com">Rogiel</a>
*/
public interface WorldFilter<O extends WorldObject> {
public interface WorldObjectFilter<O extends WorldObject> {
/**
* Test if <tt>object</tt> matches the filter requirements
*

View File

@@ -2,9 +2,9 @@ package com.l2jserver.model.world.filter.impl;
import com.l2jserver.model.id.ID;
import com.l2jserver.model.world.capability.Positionable;
import com.l2jserver.model.world.filter.WorldFilter;
import com.l2jserver.model.world.filter.WorldObjectFilter;
public class IDFilter implements WorldFilter<Positionable> {
public class IDFilter implements WorldObjectFilter<Positionable> {
private final ID id;
public IDFilter(final ID id) {

View File

@@ -0,0 +1,19 @@
package com.l2jserver.model.world.filter.impl;
import com.l2jserver.model.world.WorldObject;
import com.l2jserver.model.world.filter.WorldObjectFilter;
public class InstanceFilter<T extends WorldObject> implements WorldObjectFilter<T> {
private final Class<?> type;
public InstanceFilter(Class<?> instance) {
this.type = instance;
}
@Override
public boolean accept(T other) {
if (other == null)
return false;
return type.isInstance(other);
}
}

View File

@@ -1,10 +1,10 @@
package com.l2jserver.model.world.filter.impl;
import com.l2jserver.model.world.capability.Positionable;
import com.l2jserver.model.world.filter.WorldFilter;
import com.l2jserver.model.world.filter.WorldObjectFilter;
import com.l2jserver.util.Coordinate;
public class RangeFilter implements WorldFilter<Positionable> {
public class RangeFilter implements WorldObjectFilter<Positionable> {
private final Coordinate coordinate;
private final int range;

View File

@@ -0,0 +1,38 @@
package com.l2jserver.model.world.item;
import com.l2jserver.model.world.Item;
import com.l2jserver.model.world.Player;
import com.l2jserver.model.world.WorldObject;
import com.l2jserver.model.world.player.PlayerEvent;
public class ItemDropEvent implements ItemEvent, PlayerEvent {
private final Player player;
private final Item item;
public ItemDropEvent(Player player, Item item) {
this.player = player;
this.item = item;
}
@Override
public WorldObject getObject() {
return item;
}
@Override
public Player getPlayer() {
return player;
}
@Override
public Item getItem() {
return item;
}
@Override
public void dispatch() {
item.dispatch(this);
if (player != null)
player.dispatch(this);
}
}

View File

@@ -0,0 +1,55 @@
package com.l2jserver.model.world.iterator;
import java.util.Iterator;
import com.l2jserver.model.world.WorldObject;
import com.l2jserver.model.world.filter.WorldObjectFilter;
public class FilterIterator<O extends WorldObject> implements Iterator<O> {
private final Iterator<WorldObject> objects;
private final WorldObjectFilter<O> filter;
private O selected;
public FilterIterator(final WorldObjectFilter<O> filter,
Iterator<WorldObject> objects) {
this.filter = filter;
this.objects = objects;
}
@Override
public boolean hasNext() {
O next = findNext();
return (next != null);
}
@Override
public O next() {
try {
return findNext();
} finally {
selected = null;
}
}
@Override
public void remove() {
}
public O findNext() {
if (selected != null)
return selected;
while (objects.hasNext()) {
try {
@SuppressWarnings("unchecked")
final O object = (O) objects.next();
if (filter.accept(object)) {
selected = object;
return selected;
}
} catch (ClassCastException e) {
}
}
return null;
}
}

View File

@@ -20,4 +20,10 @@ public class PlayerSpawnEvent implements PlayerEvent, SpawnEvent {
public Player getPlayer() {
return player;
}
@Override
public void dispatch() {
if(player != null)
player.dispatch(this);
}
}

View File

@@ -0,0 +1,6 @@
package com.l2jserver.model.world.player;
import com.l2jserver.model.world.event.WorldEvent;
public interface TestEvent extends WorldEvent {
}