Fix issue with a class listening to an event more then once.

This commit is contained in:
AlgorithmX2 2014-01-05 02:46:38 -06:00
parent 4e28df467f
commit f948999f10

View file

@ -1,10 +1,12 @@
package appeng.me; package appeng.me;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.Hashtable; import java.util.Hashtable;
import java.util.Set; import java.util.Set;
import appeng.api.networking.IGridHost;
import appeng.api.networking.IGridNode; import appeng.api.networking.IGridNode;
import appeng.api.networking.events.MENetworkEvent; import appeng.api.networking.events.MENetworkEvent;
import appeng.api.networking.events.MENetworkEventSubscribe; import appeng.api.networking.events.MENetworkEventSubscribe;
@ -20,14 +22,14 @@ public class NetworkEventBus
}; };
class MENetworkEventInfo class EventMethod
{ {
public final Class objClass; public final Class objClass;
public final Method objMethod; public final Method objMethod;
public final Class objEvent; public final Class objEvent;
public MENetworkEventInfo(Class Event, Class ObjClass, Method ObjMethod) { public EventMethod(Class Event, Class ObjClass, Method ObjMethod) {
this.objClass = ObjClass; this.objClass = ObjClass;
this.objMethod = ObjMethod; this.objMethod = ObjMethod;
this.objEvent = Event; this.objEvent = Event;
@ -53,6 +55,23 @@ public class NetworkEventBus
} }
}; };
class MENetworkEventInfo
{
private ArrayList<EventMethod> methods = new ArrayList();
public void Add(Class Event, Class ObjClass, Method ObjMethod)
{
methods.add( new EventMethod( Event, ObjClass, ObjMethod ) );
}
public void invoke(Object obj, MENetworkEvent e) throws NetworkEventDone
{
for (EventMethod em : methods)
em.invoke( obj, e );
}
};
private static Set<Class> readClasses = new HashSet(); private static Set<Class> readClasses = new HashSet();
private static Hashtable<Class<? extends MENetworkEvent>, Hashtable<Class, MENetworkEventInfo>> events = new Hashtable(); private static Hashtable<Class<? extends MENetworkEvent>, Hashtable<Class, MENetworkEventInfo>> events = new Hashtable();
@ -77,7 +96,13 @@ public class NetworkEventBus
if ( classEvents == null ) if ( classEvents == null )
events.put( types[0], classEvents = new Hashtable() ); events.put( types[0], classEvents = new Hashtable() );
classEvents.put( listAs, new MENetworkEventInfo( types[0], c, m ) ); MENetworkEventInfo thisEvent = classEvents.get( listAs );
if ( thisEvent == null )
thisEvent = new MENetworkEventInfo();
thisEvent.Add( types[0], c, m );
classEvents.put( listAs, thisEvent );
} }
else else
throw new RuntimeException( "Invalid ME Network Event Subscriber, " + m.getName() + "s Parameter must extend MENetworkEvent." ); throw new RuntimeException( "Invalid ME Network Event Subscriber, " + m.getName() + "s Parameter must extend MENetworkEvent." );