监听器系统
L2J 监听器系统是一种基于优先级的事件驱动架构,旨在将游戏核心与基于脚本的逻辑解耦。它允许开发人员“挂钩”到特定的游戏事件(如战斗、角色登录或物品创建),并执行自定义代码,而无需直接修改核心引擎的源代码。
核心概念
该系统建立在四个主要支柱之上:
- EventType:表示游戏中特定发生情况的枚举(常量)(例如:
CREATURE_KILL,PLAYER_LOGIN,NPC_TALK)。 - BaseEvent:数据载体。每种事件类型都有一个对应的
BaseEvent实现(例如:CreatureKill事件),包含有关该特定发生情况的所有相关信息。 - ListenersContainer:一种专门的存储容器,用于保存各种事件的监听器。L2J 中的许多对象(玩家、NPC、城堡、血盟)都实现或拥有
ListenersContainer。 - EventDispatcher:管理通知过程的引擎,确保按照正确的优先级顺序调用监听器。
工作原理:执行生命周期
当世界中发生动作时(例如,玩家攻击怪物):
- 事件实例化:核心引擎创建一个新的
AttackableAttack事件对象,填充攻击者、目标、伤害和所使用的技能。 - 分发:核心调用
EventDispatcher.getInstance().notifyEvent(event, targetContainer)。 - 监听器检索:分发器从以下位置提取针对该
EventType注册的所有监听器:- 本地容器:涉及的特定目标(例如:被攻击的怪物)。
- 全局容器:集中式容器,如
Containers.Global()或Containers.Players()。
- 优先级排序:监听器按其
priority