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