using System.Collections; using Milimoe.FunGame.Core.Controller; using Milimoe.FunGame.Core.Interface; using Milimoe.FunGame.Core.Interface.Addons; using Milimoe.FunGame.Core.Library.Common.Event; using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Model; namespace Milimoe.FunGame.Core.Library.Common.Addon { public abstract class GameModule : IGameModule { /// /// 模组名称 /// public abstract string Name { get; } /// /// 模组描述 /// public abstract string Description { get; } /// /// 模组版本 /// public abstract string Version { get; } /// /// 模组作者 /// public abstract string Author { get; } /// /// 默认地图 /// public abstract string DefaultMap { get; } /// /// 模组的依赖集合 /// public abstract GameModuleDepend GameModuleDepend { get; } /// /// 适用的房间模式 /// public abstract RoomType RoomType { get; } /// /// 是否连接其他的服务器模组 /// public bool IsConnectToOtherServerModule { get; set; } = false; /// /// 如果将 设置为true,那么此属性必须指定一个存在的服务器模组的 名称。 /// public string AssociatedServerModuleName { get => IsConnectToOtherServerModule ? _AssociatedServerModuleName : Name; set => _AssociatedServerModuleName = value; } /// /// 包含了一些常用方法的控制器 /// public AddonController Controller { get => _Controller ?? throw new NotImplementedException(); internal set => _Controller = value; } /// /// base控制器,没有DataRequest /// BaseAddonController IAddonController.Controller { get => Controller; set => _Controller = (AddonController?)value; } /// /// 控制器内部变量 /// private AddonController? _Controller; /// /// 必须重写此方法,游戏的主要逻辑写在这里面 /// 此方法会在 时调用 /// /// /// /// public abstract void StartGame(Gaming instance, params object[] args); /// /// 如模组有界面,请重写此方法 /// /// /// public virtual void StartUI(params object[] args) { } /// /// 加载标记 /// private bool IsLoaded = false; /// /// 加载模组 /// public bool Load(params object[] objs) { if (IsLoaded) { return false; } // BeforeLoad可以阻止加载此模组 if (BeforeLoad()) { // 模组加载后,不允许再次加载此模组 IsLoaded = true; // 初始化此模组(传入委托或者Model) Init(objs); // 触发绑定事件 BindEvent(); // 如果加载后需要执行代码,请重写AfterLoad方法 AfterLoad(); } return IsLoaded; } /// /// 模组加载后需要做的事 /// protected virtual void AfterLoad() { // override } /// /// 允许返回false来阻止加载此模组 /// /// protected virtual bool BeforeLoad() { return true; } /// /// 传递委托以便让模组调用 /// private void Init(params object[] objs) { if (objs.Length > 0) Session = (Session)objs[0]; if (objs.Length > 1) Config = (FunGameConfig)objs[1]; } /// /// Session对象 /// protected Session Session = new(); /// /// Config对象 /// protected FunGameConfig Config = new(); /// /// 关联的服务器模组名称 /// private string _AssociatedServerModuleName = ""; /// /// 绑定事件。在后触发 /// private void BindEvent() { if (this is IGamingConnectEvent) { IGamingConnectEvent bind = (IGamingConnectEvent)this; GamingConnect += bind.GamingConnectEvent; } if (this is IGamingDisconnectEvent) { IGamingDisconnectEvent bind = (IGamingDisconnectEvent)this; GamingDisconnect += bind.GamingDisconnectEvent; } if (this is IGamingReconnectEvent) { IGamingReconnectEvent bind = (IGamingReconnectEvent)this; GamingReconnect += bind.GamingReconnectEvent; } if (this is IGamingBanCharacterEvent) { IGamingBanCharacterEvent bind = (IGamingBanCharacterEvent)this; GamingBanCharacter += bind.GamingBanCharacterEvent; } if (this is IGamingPickCharacterEvent) { IGamingPickCharacterEvent bind = (IGamingPickCharacterEvent)this; GamingPickCharacter += bind.GamingPickCharacterEvent; } if (this is IGamingRandomEvent) { IGamingRandomEvent bind = (IGamingRandomEvent)this; GamingRandom += bind.GamingRandomEvent; } if (this is IGamingRoundEvent) { IGamingRoundEvent bind = (IGamingRoundEvent)this; GamingRound += bind.GamingRoundEvent; } if (this is IGamingLevelUpEvent) { IGamingLevelUpEvent bind = (IGamingLevelUpEvent)this; GamingLevelUp += bind.GamingLevelUpEvent; } if (this is IGamingMoveEvent) { IGamingMoveEvent bind = (IGamingMoveEvent)this; GamingMove += bind.GamingMoveEvent; } if (this is IGamingAttackEvent) { IGamingAttackEvent bind = (IGamingAttackEvent)this; GamingAttack += bind.GamingAttackEvent; } if (this is IGamingSkillEvent) { IGamingSkillEvent bind = (IGamingSkillEvent)this; GamingSkill += bind.GamingSkillEvent; } if (this is IGamingItemEvent) { IGamingItemEvent bind = (IGamingItemEvent)this; GamingItem += bind.GamingItemEvent; } if (this is IGamingMagicEvent) { IGamingMagicEvent bind = (IGamingMagicEvent)this; GamingMagic += bind.GamingMagicEvent; } if (this is IGamingBuyEvent) { IGamingBuyEvent bind = (IGamingBuyEvent)this; GamingBuy += bind.GamingBuyEvent; } if (this is IGamingSuperSkillEvent) { IGamingSuperSkillEvent bind = (IGamingSuperSkillEvent)this; GamingSuperSkill += bind.GamingSuperSkillEvent; } if (this is IGamingPauseEvent) { IGamingPauseEvent bind = (IGamingPauseEvent)this; GamingPause += bind.GamingPauseEvent; } if (this is IGamingUnpauseEvent) { IGamingUnpauseEvent bind = (IGamingUnpauseEvent)this; GamingUnpause += bind.GamingUnpauseEvent; } if (this is IGamingSurrenderEvent) { IGamingSurrenderEvent bind = (IGamingSurrenderEvent)this; GamingSurrender += bind.GamingSurrenderEvent; } if (this is IGamingUpdateInfoEvent) { IGamingUpdateInfoEvent bind = (IGamingUpdateInfoEvent)this; GamingUpdateInfo += bind.GamingUpdateInfoEvent; } if (this is IGamingPunishEvent) { IGamingPunishEvent bind = (IGamingPunishEvent)this; GamingPunish += bind.GamingPunishEvent; } } public event IGamingEventHandler.GamingEventHandler? GamingConnect; public event IGamingEventHandler.GamingEventHandler? GamingDisconnect; public event IGamingEventHandler.GamingEventHandler? GamingReconnect; public event IGamingEventHandler.GamingEventHandler? GamingBanCharacter; public event IGamingEventHandler.GamingEventHandler? GamingPickCharacter; public event IGamingEventHandler.GamingEventHandler? GamingRandom; public event IGamingEventHandler.GamingEventHandler? GamingRound; public event IGamingEventHandler.GamingEventHandler? GamingLevelUp; public event IGamingEventHandler.GamingEventHandler? GamingMove; public event IGamingEventHandler.GamingEventHandler? GamingAttack; public event IGamingEventHandler.GamingEventHandler? GamingSkill; public event IGamingEventHandler.GamingEventHandler? GamingItem; public event IGamingEventHandler.GamingEventHandler? GamingMagic; public event IGamingEventHandler.GamingEventHandler? GamingBuy; public event IGamingEventHandler.GamingEventHandler? GamingSuperSkill; public event IGamingEventHandler.GamingEventHandler? GamingPause; public event IGamingEventHandler.GamingEventHandler? GamingUnpause; public event IGamingEventHandler.GamingEventHandler? GamingSurrender; public event IGamingEventHandler.GamingEventHandler? GamingUpdateInfo; public event IGamingEventHandler.GamingEventHandler? GamingPunish; public void OnGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data) { GamingConnect?.Invoke(sender, e, data); } public void OnGamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data) { GamingDisconnect?.Invoke(sender, e, data); } public void OnGamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data) { GamingReconnect?.Invoke(sender, e, data); } public void OnGamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data) { GamingBanCharacter?.Invoke(sender, e, data); } public void OnGamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data) { GamingPickCharacter?.Invoke(sender, e, data); } public void OnGamingRandomEvent(object sender, GamingEventArgs e, Hashtable data) { GamingRandom?.Invoke(sender, e, data); } public void OnGamingRoundEvent(object sender, GamingEventArgs e, Hashtable data) { GamingRound?.Invoke(sender, e, data); } public void OnGamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data) { GamingLevelUp?.Invoke(sender, e, data); } public void OnGamingMoveEvent(object sender, GamingEventArgs e, Hashtable data) { GamingMove?.Invoke(sender, e, data); } public void OnGamingAttackEvent(object sender, GamingEventArgs e, Hashtable data) { GamingAttack?.Invoke(sender, e, data); } public void OnGamingSkillEvent(object sender, GamingEventArgs e, Hashtable data) { GamingSkill?.Invoke(sender, e, data); } public void OnGamingItemEvent(object sender, GamingEventArgs e, Hashtable data) { GamingItem?.Invoke(sender, e, data); } public void OnGamingMagicEvent(object sender, GamingEventArgs e, Hashtable data) { GamingMagic?.Invoke(sender, e, data); } public void OnGamingBuyEvent(object sender, GamingEventArgs e, Hashtable data) { GamingBuy?.Invoke(sender, e, data); } public void OnGamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data) { GamingSuperSkill?.Invoke(sender, e, data); } public void OnGamingPauseEvent(object sender, GamingEventArgs e, Hashtable data) { GamingPause?.Invoke(sender, e, data); } public void OnGamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data) { GamingUnpause?.Invoke(sender, e, data); } public void OnGamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data) { GamingSurrender?.Invoke(sender, e, data); } public void OnGamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data) { GamingUpdateInfo?.Invoke(sender, e, data); } public void OnGamingPunishEvent(object sender, GamingEventArgs e, Hashtable data) { GamingPunish?.Invoke(sender, e, data); } } }