using Milimoe.FunGame.Core.Api.Utility; 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 abstract int MaxUsers { get; } /// /// 是否隐藏主界面 /// public abstract bool HideMain { get; } /// /// 是否连接其他的服务器模组 /// public bool IsConnectToOtherServerModule { get; set; } = false; /// /// 如果将 设置为true,那么此属性必须指定一个存在的服务器模组的 名称。 /// public string AssociatedServerModuleName { get => IsConnectToOtherServerModule ? _associatedServerModuleName : Name; set => _associatedServerModuleName = value; } /// /// 记录该模组的加载器 /// public GameModuleLoader? ModuleLoader { get; set; } = null; /// /// 包含了一些常用方法的控制器 /// 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(objs)) { // 模组加载后,不允许再次加载此模组 _isLoaded = true; // 初始化此模组(传入委托或者Model) Init(objs); // 触发绑定事件 BindEvent(); } return _isLoaded; } /// /// 卸载模组 /// /// public void UnLoad(params object[] objs) { BindEvent(false); } /// /// 模组完全加载后需要做的事 /// public virtual void AfterLoad(GameModuleLoader loader, params object[] args) { // override } /// /// 允许返回false来阻止加载此模组 /// /// protected virtual bool BeforeLoad(params object[] objs) { return true; } /// /// 传递委托以便让模组调用 /// private void Init(params object[] objs) { if (objs.Length > 0 && objs[0] is Session session) { _session = session; } if (objs.Length > 1 && objs[1] is FunGameConfig config) { _config = config; } } /// /// Session对象 /// protected Session _session = new(); /// /// Config对象 /// protected FunGameConfig _config = new(); /// /// 关联的服务器模组名称 /// private string _associatedServerModuleName = ""; /// /// 绑定事件。在后触发 /// private void BindEvent(bool isAdd = true) { if (this is IGamingConnectEvent connect) { if (isAdd) { GamingConnect += connect.GamingConnectEvent; } else { GamingConnect -= connect.GamingConnectEvent; } } if (this is IGamingDisconnectEvent disconnect) { if (isAdd) { GamingDisconnect += disconnect.GamingDisconnectEvent; } else { GamingDisconnect -= disconnect.GamingDisconnectEvent; } } if (this is IGamingReconnectEvent reconnect) { if (isAdd) { GamingReconnect += reconnect.GamingReconnectEvent; } else { GamingReconnect -= reconnect.GamingReconnectEvent; } } if (this is IGamingBanCharacterEvent ban) { if (isAdd) { GamingBanCharacter += ban.GamingBanCharacterEvent; } else { GamingBanCharacter -= ban.GamingBanCharacterEvent; } } if (this is IGamingPickCharacterEvent pick) { if (isAdd) { GamingPickCharacter += pick.GamingPickCharacterEvent; } else { GamingPickCharacter -= pick.GamingPickCharacterEvent; } } if (this is IGamingRandomEvent random) { if (isAdd) { GamingRandom += random.GamingRandomEvent; } else { GamingRandom -= random.GamingRandomEvent; } } if (this is IGamingRoundEvent round) { if (isAdd) { GamingRound += round.GamingRoundEvent; } else { GamingRound -= round.GamingRoundEvent; } } if (this is IGamingLevelUpEvent levelUp) { if (isAdd) { GamingLevelUp += levelUp.GamingLevelUpEvent; } else { GamingLevelUp -= levelUp.GamingLevelUpEvent; } } if (this is IGamingMoveEvent move) { if (isAdd) { GamingMove += move.GamingMoveEvent; } else { GamingMove -= move.GamingMoveEvent; } } if (this is IGamingAttackEvent attack) { if (isAdd) { GamingAttack += attack.GamingAttackEvent; } else { GamingAttack -= attack.GamingAttackEvent; } } if (this is IGamingSkillEvent skill) { if (isAdd) { GamingSkill += skill.GamingSkillEvent; } else { GamingSkill -= skill.GamingSkillEvent; } } if (this is IGamingItemEvent item) { if (isAdd) { GamingItem += item.GamingItemEvent; } else { GamingItem -= item.GamingItemEvent; } } if (this is IGamingMagicEvent magic) { if (isAdd) { GamingMagic += magic.GamingMagicEvent; } else { GamingMagic -= magic.GamingMagicEvent; } } if (this is IGamingBuyEvent buy) { if (isAdd) { GamingBuy += buy.GamingBuyEvent; } else { GamingBuy -= buy.GamingBuyEvent; } } if (this is IGamingSuperSkillEvent super) { if (isAdd) { GamingSuperSkill += super.GamingSuperSkillEvent; } else { GamingSuperSkill -= super.GamingSuperSkillEvent; } } if (this is IGamingPauseEvent pause) { if (isAdd) { GamingPause += pause.GamingPauseEvent; } else { GamingPause -= pause.GamingPauseEvent; } } if (this is IGamingUnpauseEvent unpause) { if (isAdd) { GamingUnpause += unpause.GamingUnpauseEvent; } else { GamingUnpause -= unpause.GamingUnpauseEvent; } } if (this is IGamingSurrenderEvent surrender) { if (isAdd) { GamingSurrender += surrender.GamingSurrenderEvent; } else { GamingSurrender -= surrender.GamingSurrenderEvent; } } if (this is IGamingUpdateInfoEvent update) { if (isAdd) { GamingUpdateInfo += update.GamingUpdateInfoEvent; } else { GamingUpdateInfo -= update.GamingUpdateInfoEvent; } } if (this is IGamingPunishEvent punish) { if (isAdd) { GamingPunish += punish.GamingPunishEvent; } else { GamingPunish -= punish.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, Dictionary data) { GamingConnect?.Invoke(sender, e, data); } public void OnGamingDisconnectEvent(object sender, GamingEventArgs e, Dictionary data) { GamingDisconnect?.Invoke(sender, e, data); } public void OnGamingReconnectEvent(object sender, GamingEventArgs e, Dictionary data) { GamingReconnect?.Invoke(sender, e, data); } public void OnGamingBanCharacterEvent(object sender, GamingEventArgs e, Dictionary data) { GamingBanCharacter?.Invoke(sender, e, data); } public void OnGamingPickCharacterEvent(object sender, GamingEventArgs e, Dictionary data) { GamingPickCharacter?.Invoke(sender, e, data); } public void OnGamingRandomEvent(object sender, GamingEventArgs e, Dictionary data) { GamingRandom?.Invoke(sender, e, data); } public void OnGamingRoundEvent(object sender, GamingEventArgs e, Dictionary data) { GamingRound?.Invoke(sender, e, data); } public void OnGamingLevelUpEvent(object sender, GamingEventArgs e, Dictionary data) { GamingLevelUp?.Invoke(sender, e, data); } public void OnGamingMoveEvent(object sender, GamingEventArgs e, Dictionary data) { GamingMove?.Invoke(sender, e, data); } public void OnGamingAttackEvent(object sender, GamingEventArgs e, Dictionary data) { GamingAttack?.Invoke(sender, e, data); } public void OnGamingSkillEvent(object sender, GamingEventArgs e, Dictionary data) { GamingSkill?.Invoke(sender, e, data); } public void OnGamingItemEvent(object sender, GamingEventArgs e, Dictionary data) { GamingItem?.Invoke(sender, e, data); } public void OnGamingMagicEvent(object sender, GamingEventArgs e, Dictionary data) { GamingMagic?.Invoke(sender, e, data); } public void OnGamingBuyEvent(object sender, GamingEventArgs e, Dictionary data) { GamingBuy?.Invoke(sender, e, data); } public void OnGamingSuperSkillEvent(object sender, GamingEventArgs e, Dictionary data) { GamingSuperSkill?.Invoke(sender, e, data); } public void OnGamingPauseEvent(object sender, GamingEventArgs e, Dictionary data) { GamingPause?.Invoke(sender, e, data); } public void OnGamingUnpauseEvent(object sender, GamingEventArgs e, Dictionary data) { GamingUnpause?.Invoke(sender, e, data); } public void OnGamingSurrenderEvent(object sender, GamingEventArgs e, Dictionary data) { GamingSurrender?.Invoke(sender, e, data); } public void OnGamingUpdateInfoEvent(object sender, GamingEventArgs e, Dictionary data) { GamingUpdateInfo?.Invoke(sender, e, data); } public void OnGamingPunishEvent(object sender, GamingEventArgs e, Dictionary data) { GamingPunish?.Invoke(sender, e, data); } } }