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);
}
}
}