关于l2j_server研究(一)

原创
2012/10/25 19:12
阅读数 2.4K

L2j_server研究 Powered by chenlei

本文只是在自己看源码写的一点点,很乱。有什么可以直接线上讨论群:275459491  陈磊


1.       事件,事件监听器机制;

L2j_server世界中的所有的事件,都对应有一个事件监听器:InterfaceEnvet—事件接口(l2Event),所有的事件都会去具体实现InterfaceEnvet,从而构成游戏中的事件源。当然这里对于物品的事件就是(创建,销毁,丢弃,拾取,交易,装备)等事件;监听器:L2j_server中,有一个L2JListener的抽象类(主要有些函数需要子类去实现硬编码),有一个变量就是L2PcInstance---游戏的玩家角色,另外就是两个函数:register(),unregister(),注册监听事件,取消监听事件,这里针对物品的话就是,注册的NewItemListener(抽象类定义有不同的行为(所有的事件监听器都是抽象类))这个监听器,每个监听器上有一个事件监听list,物品的话,就是newItemListeners,不同的监听器,有定义不同的行为,具体的子类去实现监听器的行为;这里public boolean onCreate(ItemCreateEvent event)—注意了这里是返回的boolean;物品的创建,这样就和具体的事件关联了。另外还有一个重要的类L2Script,成员变量_listeners。他包含了所有事件的监听列表,在L2Script抽象类中,注册,移除监听器;注册事件,取消事件通知是对应的,事件的监听针对角色的行为。

2.       物品系统:

物品系统分三类:L2Item,L2ItemInstance,L2ItemTable. 这三个类构成了L2j的服务端物品架构;L2Item抽象类,规定物品的基础属性,

L2ItemInstance 是指将一个物体呈现在客户端上时所包含的属性以及方法。比如是否是有时间上的限制,是什么样的东西?防具还是武器,魔法效果,呈现地点;注意,构造函数中L2ItemInstance(int objectId, int itemId),物品的世界唯一ID,物品itemId,此外,是呈现在游戏世界中的物品l2word,因此继承l2object,并且指明类型setInstanceType(InstanceType.L2ItemInstance);Ientable类主要实现物品的加载,

类型划分的Map

  

*/

    public static final Map<String, Integer> _materials = new FastMap<>();//材料

    public static final Map<String, Integer> _crystalTypes = new FastMap<>(); // 水晶

    public static final Map<String, Integer> _slots = new FastMap<>();

 

 

    public static final Map<String, L2WeaponType> _weaponTypes = new FastMap<>();

    public static final Map<String, L2ArmorType> _armorTypes = new FastMap<>();

   

 

 

    private L2Item[] _allTemplates; //配置--存储物品的数组

 

    private Map<Integer, L2EtcItem> _etcItems;

    private Map<Integer, L2Armor> _armors;

    private Map<Integer, L2Weapon> _weapons;

这里一大堆的map,所有的物品信息都是在DocumentEngine.getInstance().loadItems()加载,配置全是xml,在datapack中,分类加载,最后绑定物品到一个数组中_allTemplates,根据下标快速获取Itempublic L2ItemInstance createItem(String process, int itemId, long count, L2PcInstance actor, Object reference)—产生物品,根据物品的ItemID,IDfactory,组装一个物品;---注意这里是actor触发即是playerdestroyItemString args[]….)销毁物品,有一个关键字synchronizedItem,这里就不说为什了。整个物品基础系统就有了。

具体的还有很多,譬如容器(背包吧)Inventory…..后面在说吧

3.L2j_server的业务处理

L2j_server的业务处理的对象引用,基本上都是使用的单例模式,

public class a{

private a(){}

public static a getInstance(){

return singleton.obj;

}

private static final class singleton{

private static final a obj=new a();

}

}

这样在处理业务时,就节省了系统创建对象的开销,并且在多线程的环境下,是线程安全的。

欢迎讨论


 

 

展开阅读全文
打赏
0
1 收藏
分享
加载中
更多评论
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部