51 private static final Map<Integer, Set<CombatListenerSet>> ITEM_LISTENERS =
new HashMap<>();
52 public static final Map<Integer, CombatListener<Npc>> NPC_LISTENERS =
new HashMap<>();
53 public static final Map<Integer, CombatStrategy<Npc>> NPC_STRATEGIES =
new HashMap<>();
55 public static void load() {
56 loadItems(
"com.osroyale.game.world.entity.combat.attack.listener.item");
57 loadNpcs(
"com.osroyale.game.world.entity.combat.attack.listener.npc");
60 private static void loadItems(
final String pkg) {
61 try (
final ScanResult scanResult =
65 .enableAnnotationInfo()
70 final MethodInfoList constructorInfos = classInfo.getDeclaredConstructorInfo();
71 final MethodInfo constructorInfo = constructorInfos.get(0);
72 final Constructor<?> constructor = constructorInfo.loadClassAndGetConstructor();
74 final Object instance = constructor.newInstance();
78 final Annotation annotation = annotationInfo.loadClassAndInstantiate();
81 for (
int item : meta.
items()) {
82 Set<CombatListenerSet>
set = ITEM_LISTENERS.getOrDefault(item,
new HashSet<>());
83 set.add(
new CombatListenerSet(meta.
items(), meta.
requireAll(), listener));
84 ITEM_LISTENERS.put(item,
set);
86 }
catch (Exception ex) {
87 logger.error(String.format(
"Error loading item set combat listener=%s", classInfo.getSimpleName()), ex);
91 logger.info(String.format(
"Loaded: %d item set combat listeners.", ITEM_LISTENERS.size()));
94 private static void loadNpcs(
final String pkg) {
95 try (
final ScanResult scanResult =
99 .enableAnnotationInfo()
104 final MethodInfoList constructorInfos = classInfo.getDeclaredConstructorInfo();
105 final MethodInfo constructorInfo = constructorInfos.get(0);
106 final Constructor<?> constructor = constructorInfo.loadClassAndGetConstructor();
108 final Object instance = constructor.newInstance();
112 final Annotation annotation = annotationInfo.loadClassAndInstantiate();
115 for (
int npc : meta.
npcs()) {
116 NPC_LISTENERS.put(npc, listener);
118 }
catch (Exception ex) {
119 logger.error(String.format(
"Error loading npc combat listener=%s", classInfo.getSimpleName()), ex);
123 logger.info(String.format(
"Loaded: %d npc combat listeners.", NPC_LISTENERS.size()));
126 public static void addListener(
Player player,
int id) {
127 Set<CombatListenerSet> sets = ITEM_LISTENERS.get(
id);
133 for (CombatListenerSet
set : sets) {
134 if (
set.requireAll && !player.equipment.
containsAll(
set.set)) {
138 if (!
set.requireAll && !player.equipment.
containsAny(
set.set)) {
142 player.
getCombat().addListener(
set.listener);
146 public static void removeListener(
Player player,
int id) {
147 Set<CombatListenerSet> sets = ITEM_LISTENERS.get(
id);
153 for (CombatListenerSet
set : sets) {
154 if (
set.requireAll && player.equipment.
containsAll(
set.set)) {
158 if (!
set.requireAll && player.equipment.
containsAny(
set.set)) {
162 player.
getCombat().removeListener(
set.listener);
166 public static final class CombatListenerSet {
167 private final int[]
set;
168 private final boolean requireAll;
173 this.requireAll = requireAll;
174 this.listener = listener;
178 public boolean equals(Object obj) {
181 if (obj instanceof CombatListenerSet) {
182 CombatListenerSet other = (CombatListenerSet) obj;
183 return Arrays.equals(other.set,
set) && other.requireAll == requireAll;
189 public int hashCode() {
190 return Objects.hash(
set, requireAll);
194 public String toString() {
195 return "ItemSet[set=" + Arrays.toString(
set) +
", requireAll=" + requireAll +
"]";