From ce1873a639714770f2da132ec7f00a66a47a993f Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Tue, 22 Jun 2021 21:55:47 +0000 Subject: [PATCH] Addition of OnCreatureSee event. --- .../l2jmobius/gameserver/ai/AbstractAI.java | 5 +- .../gameserver/model/actor/Creature.java | 61 +++++++++++++++++++ .../model/events/AbstractScript.java | 23 +++++++ .../gameserver/model/events/EventType.java | 2 + .../events/impl/creature/OnCreatureSee.java | 52 ++++++++++++++++ .../l2jmobius/gameserver/ai/AbstractAI.java | 5 +- .../gameserver/model/actor/Creature.java | 61 +++++++++++++++++++ .../model/events/AbstractScript.java | 23 +++++++ .../gameserver/model/events/EventType.java | 2 + .../events/impl/creature/OnCreatureSee.java | 52 ++++++++++++++++ 10 files changed, 284 insertions(+), 2 deletions(-) create mode 100644 L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/events/impl/creature/OnCreatureSee.java create mode 100644 L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/events/impl/creature/OnCreatureSee.java diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/ai/AbstractAI.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/ai/AbstractAI.java index af0c606d7a..eab37c2507 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/ai/AbstractAI.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/ai/AbstractAI.java @@ -298,6 +298,7 @@ public abstract class AbstractAI implements Ctrl { case EVT_THINK: { + _actor.updateSeenCreatures(); onEvtThink(); break; } @@ -384,7 +385,9 @@ public abstract class AbstractAI implements Ctrl } case EVT_FORGET_OBJECT: { - onEvtForgetObject((WorldObject) args[0]); + final WorldObject worldObject = (WorldObject) args[0]; + _actor.removeSeenCreature(worldObject); + onEvtForgetObject(worldObject); break; } case EVT_CANCEL: diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Creature.java index 93b90197b9..34f6e9d415 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Creature.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/actor/Creature.java @@ -83,6 +83,7 @@ import org.l2jmobius.gameserver.model.actor.tasks.creature.MagicUseTask; import org.l2jmobius.gameserver.model.actor.tasks.creature.NotifyAITask; import org.l2jmobius.gameserver.model.actor.tasks.creature.QueuedMagicUseTask; import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate; +import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; import org.l2jmobius.gameserver.model.actor.transform.Transform; import org.l2jmobius.gameserver.model.actor.transform.TransformTemplate; import org.l2jmobius.gameserver.model.clan.Clan; @@ -97,6 +98,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureAttacked; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageDealt; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageReceived; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKill; +import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillUse; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported; import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcSkillSee; @@ -279,6 +281,9 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe private final Map _knownRelations = new ConcurrentHashMap<>(); + private Set _seenCreatures = null; + private int _seenCreatureRange = Config.ALT_PARTY_RANGE; + /** A list containing the dropped items of this fake player. */ private final List _fakePlayerDrops = new CopyOnWriteArrayList<>(); @@ -2440,6 +2445,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe { getSkillChannelized().abortChannelization(); } + return true; } @@ -2464,6 +2470,12 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe // Remove all effects, do not broadcast changes. _effectList.stopAllEffectsWithoutExclusions(false, false); + // Forget all seen creatures. + if (_seenCreatures != null) + { + _seenCreatures.clear(); + } + // Cancel the BuffFinishTask related to this creature. cancelBuffFinishTask(); @@ -6746,6 +6758,55 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe return _knownRelations; } + public void initSeenCreatures() + { + if (_seenCreatures == null) + { + synchronized (this) + { + if (_seenCreatures == null) + { + if (isNpc()) + { + final NpcTemplate template = ((Npc) this).getTemplate(); + if ((template != null) && (template.getAggroRange() > 0)) + { + _seenCreatureRange = template.getAggroRange(); + } + } + + _seenCreatures = ConcurrentHashMap.newKeySet(1); + } + } + } + } + + public void updateSeenCreatures() + { + if ((_seenCreatures == null) || _isDead || !isSpawned()) + { + return; + } + + World.getInstance().forEachVisibleObjectInRange(this, Creature.class, _seenCreatureRange, creature -> + { + if (_seenCreatures.add(creature)) + { + EventDispatcher.getInstance().notifyEventAsync(new OnCreatureSee(this, creature), this); + } + }); + } + + public void removeSeenCreature(WorldObject worldObject) + { + if (_seenCreatures == null) + { + return; + } + + _seenCreatures.remove(worldObject); + } + public int getKarma() { return _karma; diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/events/AbstractScript.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/events/AbstractScript.java index 5441b40e7f..5176affd4c 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/events/AbstractScript.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/events/AbstractScript.java @@ -64,6 +64,7 @@ import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent; import org.l2jmobius.gameserver.model.events.annotations.RegisterType; import org.l2jmobius.gameserver.model.events.impl.IBaseEvent; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKill; +import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureZoneEnter; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureZoneExit; import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcCanBeSeen; @@ -834,6 +835,28 @@ public abstract class AbstractScript extends ManagedScript return registerConsumer(callback, EventType.ON_NPC_CREATURE_SEE, ListenerRegisterType.NPC, npcIds); } + /** + * Provides instant callback operation when {@link Creature} sees another creature. + * @param callback + * @param npcIds + * @return + */ + protected final List setCreatureSeeId(Consumer callback, int... npcIds) + { + return registerConsumer(callback, EventType.ON_CREATURE_SEE, ListenerRegisterType.NPC, npcIds); + } + + /** + * Provides instant callback operation when {@link Creature} sees another creature. + * @param callback + * @param npcIds + * @return + */ + protected final List setCreatureSeeId(Consumer callback, Collection npcIds) + { + return registerConsumer(callback, EventType.ON_CREATURE_SEE, ListenerRegisterType.NPC, npcIds); + } + // --------------------------------------------------------------------------------------------------------------------------- /** diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/events/EventType.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/events/EventType.java index ec19081c7f..95f15d8bf4 100644 --- a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/events/EventType.java +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/events/EventType.java @@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureAttacked; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageDealt; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageReceived; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKill; +import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillUse; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureZoneEnter; @@ -133,6 +134,7 @@ public enum EventType ON_CREATURE_DAMAGE_RECEIVED(OnCreatureDamageReceived.class, void.class), ON_CREATURE_DAMAGE_DEALT(OnCreatureDamageDealt.class, void.class), ON_CREATURE_KILL(OnCreatureKill.class, void.class, TerminateReturn.class), + ON_CREATURE_SEE(OnCreatureSee.class, void.class), ON_CREATURE_SKILL_USE(OnCreatureSkillUse.class, void.class, TerminateReturn.class), ON_CREATURE_TELEPORTED(OnCreatureTeleported.class, void.class), ON_CREATURE_ZONE_ENTER(OnCreatureZoneEnter.class, void.class), diff --git a/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/events/impl/creature/OnCreatureSee.java b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/events/impl/creature/OnCreatureSee.java new file mode 100644 index 0000000000..680c1d548c --- /dev/null +++ b/L2J_Mobius_CT_2.4_Epilogue/java/org/l2jmobius/gameserver/model/events/impl/creature/OnCreatureSee.java @@ -0,0 +1,52 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program 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. + * + * This program 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 this program. If not, see . + */ +package org.l2jmobius.gameserver.model.events.impl.creature; + +import org.l2jmobius.gameserver.model.actor.Creature; +import org.l2jmobius.gameserver.model.events.EventType; +import org.l2jmobius.gameserver.model.events.impl.IBaseEvent; + +/** + * @author UnAfraid + */ +public class OnCreatureSee implements IBaseEvent +{ + private final Creature _seer; + private final Creature _seen; + + public OnCreatureSee(Creature seer, Creature seen) + { + _seer = seer; + _seen = seen; + } + + public Creature getSeer() + { + return _seer; + } + + public Creature getSeen() + { + return _seen; + } + + @Override + public EventType getType() + { + return EventType.ON_CREATURE_SEE; + } +} \ No newline at end of file diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/ai/AbstractAI.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/ai/AbstractAI.java index af0c606d7a..eab37c2507 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/ai/AbstractAI.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/ai/AbstractAI.java @@ -298,6 +298,7 @@ public abstract class AbstractAI implements Ctrl { case EVT_THINK: { + _actor.updateSeenCreatures(); onEvtThink(); break; } @@ -384,7 +385,9 @@ public abstract class AbstractAI implements Ctrl } case EVT_FORGET_OBJECT: { - onEvtForgetObject((WorldObject) args[0]); + final WorldObject worldObject = (WorldObject) args[0]; + _actor.removeSeenCreature(worldObject); + onEvtForgetObject(worldObject); break; } case EVT_CANCEL: diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Creature.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Creature.java index f2dc37abdd..99b2cd668c 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Creature.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/actor/Creature.java @@ -83,6 +83,7 @@ import org.l2jmobius.gameserver.model.actor.tasks.creature.MagicUseTask; import org.l2jmobius.gameserver.model.actor.tasks.creature.NotifyAITask; import org.l2jmobius.gameserver.model.actor.tasks.creature.QueuedMagicUseTask; import org.l2jmobius.gameserver.model.actor.templates.CreatureTemplate; +import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; import org.l2jmobius.gameserver.model.actor.transform.Transform; import org.l2jmobius.gameserver.model.actor.transform.TransformTemplate; import org.l2jmobius.gameserver.model.clan.Clan; @@ -97,6 +98,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureAttacked; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageDealt; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageReceived; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKill; +import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillUse; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported; import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcSkillSee; @@ -280,6 +282,9 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe private final Map _knownRelations = new ConcurrentHashMap<>(); + private Set _seenCreatures = null; + private int _seenCreatureRange = Config.ALT_PARTY_RANGE; + /** A list containing the dropped items of this fake player. */ private final List _fakePlayerDrops = new CopyOnWriteArrayList<>(); @@ -2442,6 +2447,7 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe { getSkillChannelized().abortChannelization(); } + return true; } @@ -2466,6 +2472,12 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe // Remove all effects, do not broadcast changes. _effectList.stopAllEffectsWithoutExclusions(false, false); + // Forget all seen creatures. + if (_seenCreatures != null) + { + _seenCreatures.clear(); + } + // Cancel the BuffFinishTask related to this creature. cancelBuffFinishTask(); @@ -6748,6 +6760,55 @@ public abstract class Creature extends WorldObject implements ISkillsHolder, IDe return _knownRelations; } + public void initSeenCreatures() + { + if (_seenCreatures == null) + { + synchronized (this) + { + if (_seenCreatures == null) + { + if (isNpc()) + { + final NpcTemplate template = ((Npc) this).getTemplate(); + if ((template != null) && (template.getAggroRange() > 0)) + { + _seenCreatureRange = template.getAggroRange(); + } + } + + _seenCreatures = ConcurrentHashMap.newKeySet(1); + } + } + } + } + + public void updateSeenCreatures() + { + if ((_seenCreatures == null) || _isDead || !isSpawned()) + { + return; + } + + World.getInstance().forEachVisibleObjectInRange(this, Creature.class, _seenCreatureRange, creature -> + { + if (_seenCreatures.add(creature)) + { + EventDispatcher.getInstance().notifyEventAsync(new OnCreatureSee(this, creature), this); + } + }); + } + + public void removeSeenCreature(WorldObject worldObject) + { + if (_seenCreatures == null) + { + return; + } + + _seenCreatures.remove(worldObject); + } + public int getKarma() { return _karma; diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/events/AbstractScript.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/events/AbstractScript.java index 5441b40e7f..5176affd4c 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/events/AbstractScript.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/events/AbstractScript.java @@ -64,6 +64,7 @@ import org.l2jmobius.gameserver.model.events.annotations.RegisterEvent; import org.l2jmobius.gameserver.model.events.annotations.RegisterType; import org.l2jmobius.gameserver.model.events.impl.IBaseEvent; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKill; +import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureZoneEnter; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureZoneExit; import org.l2jmobius.gameserver.model.events.impl.creature.npc.OnNpcCanBeSeen; @@ -834,6 +835,28 @@ public abstract class AbstractScript extends ManagedScript return registerConsumer(callback, EventType.ON_NPC_CREATURE_SEE, ListenerRegisterType.NPC, npcIds); } + /** + * Provides instant callback operation when {@link Creature} sees another creature. + * @param callback + * @param npcIds + * @return + */ + protected final List setCreatureSeeId(Consumer callback, int... npcIds) + { + return registerConsumer(callback, EventType.ON_CREATURE_SEE, ListenerRegisterType.NPC, npcIds); + } + + /** + * Provides instant callback operation when {@link Creature} sees another creature. + * @param callback + * @param npcIds + * @return + */ + protected final List setCreatureSeeId(Consumer callback, Collection npcIds) + { + return registerConsumer(callback, EventType.ON_CREATURE_SEE, ListenerRegisterType.NPC, npcIds); + } + // --------------------------------------------------------------------------------------------------------------------------- /** diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/events/EventType.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/events/EventType.java index ec19081c7f..95f15d8bf4 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/events/EventType.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/events/EventType.java @@ -26,6 +26,7 @@ import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureAttacked; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageDealt; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureDamageReceived; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureKill; +import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSee; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureSkillUse; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureTeleported; import org.l2jmobius.gameserver.model.events.impl.creature.OnCreatureZoneEnter; @@ -133,6 +134,7 @@ public enum EventType ON_CREATURE_DAMAGE_RECEIVED(OnCreatureDamageReceived.class, void.class), ON_CREATURE_DAMAGE_DEALT(OnCreatureDamageDealt.class, void.class), ON_CREATURE_KILL(OnCreatureKill.class, void.class, TerminateReturn.class), + ON_CREATURE_SEE(OnCreatureSee.class, void.class), ON_CREATURE_SKILL_USE(OnCreatureSkillUse.class, void.class, TerminateReturn.class), ON_CREATURE_TELEPORTED(OnCreatureTeleported.class, void.class), ON_CREATURE_ZONE_ENTER(OnCreatureZoneEnter.class, void.class), diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/events/impl/creature/OnCreatureSee.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/events/impl/creature/OnCreatureSee.java new file mode 100644 index 0000000000..680c1d548c --- /dev/null +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/events/impl/creature/OnCreatureSee.java @@ -0,0 +1,52 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program 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. + * + * This program 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 this program. If not, see . + */ +package org.l2jmobius.gameserver.model.events.impl.creature; + +import org.l2jmobius.gameserver.model.actor.Creature; +import org.l2jmobius.gameserver.model.events.EventType; +import org.l2jmobius.gameserver.model.events.impl.IBaseEvent; + +/** + * @author UnAfraid + */ +public class OnCreatureSee implements IBaseEvent +{ + private final Creature _seer; + private final Creature _seen; + + public OnCreatureSee(Creature seer, Creature seen) + { + _seer = seer; + _seen = seen; + } + + public Creature getSeer() + { + return _seer; + } + + public Creature getSeen() + { + return _seen; + } + + @Override + public EventType getType() + { + return EventType.ON_CREATURE_SEE; + } +} \ No newline at end of file