diff --git a/Api/Factory/ItemFactory.cs b/Api/Factory/ItemFactory.cs
index 891cfd9..f686d81 100644
--- a/Api/Factory/ItemFactory.cs
+++ b/Api/Factory/ItemFactory.cs
@@ -12,16 +12,13 @@ namespace Milimoe.FunGame.Core.Api.Factory
public Item Create(ItemType type = ItemType.Passive)
{
- switch (type)
+ _EntityType = typeof(Item);
+ return type switch
{
- case ItemType.Passive:
- _EntityType = typeof(PassiveItem);
- return PassiveItem.GetInstance();
- case ItemType.Active:
- default:
- _EntityType = typeof(ActiveItem);
- return PassiveItem.GetInstance();
- }
+ ItemType.Passive => new(false),
+ ItemType.Active => new(true),
+ _ => new(false)
+ };
}
public Item Create()
diff --git a/Api/Factory/SkillFactory.cs b/Api/Factory/SkillFactory.cs
index 3bc7209..53cdbb3 100644
--- a/Api/Factory/SkillFactory.cs
+++ b/Api/Factory/SkillFactory.cs
@@ -12,16 +12,13 @@ namespace Milimoe.FunGame.Core.Api.Factory
internal Skill Create(SkillType type = SkillType.Passive)
{
- switch (type)
+ _EntityType = typeof(Skill);
+ return type switch
{
- case SkillType.Passive:
- _EntityType = typeof(PassiveSkill);
- return PassiveSkill.GetInstance();
- case SkillType.Active:
- default:
- _EntityType = typeof(ActiveSkill);
- return ActiveSkill.GetInstance();
- }
+ SkillType.Passive => new(false),
+ SkillType.Active => new(true),
+ _ => new(false)
+ };
}
public Skill Create()
diff --git a/Api/Transmittal/DataRequest.cs b/Api/Transmittal/DataRequest.cs
index 028232a..8ce30e8 100644
--- a/Api/Transmittal/DataRequest.cs
+++ b/Api/Transmittal/DataRequest.cs
@@ -7,7 +7,8 @@ using Milimoe.FunGame.Core.Library.Exception;
namespace Milimoe.FunGame.Core.Api.Transmittal
{
///
- /// 需要配合Milimoe.FunGame.Core.Library.Constant.DataRequestType使用
+ /// 需要配合 使用
+ /// 如果是 的数据请求,则配合 使用
/// 确保已添加对应的枚举
///
public class DataRequest
@@ -15,12 +16,12 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
///
/// 数据请求结果
///
- public RequestResult Result => Worker.Result;
+ public RequestResult Result => Worker != null ? Worker.Result : (GamingWorker != null ? GamingWorker.Result : RequestResult.Missing);
///
/// 详细错误信息
///
- public string Error => Worker.Error;
+ public string Error => Worker != null ? Worker.Error : (GamingWorker != null ? GamingWorker.Error : "");
// 获取ResultData中key值对应的Json字符串
// -- 此索引器仅返回Json字符串,对象类型请使用反序列化方法GetResult() --
@@ -30,7 +31,9 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
{
get
{
- return Worker.ResultData[key];
+ if (Worker != null) return Worker.ResultData[key];
+ else if (GamingWorker != null) return GamingWorker.ResultData[key];
+ return null;
}
set
{
@@ -41,11 +44,16 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
///
/// 私有的实现类
///
- private readonly SocketRequest Worker;
+ private readonly SocketRequest? Worker;
+
+ ///
+ /// 私有的实现类(这是局内请求的)
+ ///
+ private readonly GamingRequest? GamingWorker;
///
/// 基于本地已连接的 创建新的数据请求
- /// 使用 中的 创建一个新的请求
+ /// 使用 中的 创建一个新的请求
///
///
///
@@ -55,6 +63,46 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
Worker = new(Socket, RequestType, Guid.NewGuid(), IsLongRunning);
}
+ ///
+ /// 基于本地已连接的 创建新的数据请求
+ /// 使用 中的 创建一个新的请求
+ /// 此数据请求只能调用异步方法 请求数据
+ ///
+ ///
+ ///
+ ///
+ internal DataRequest(HTTPClient WebSocket, DataRequestType RequestType, bool IsLongRunning = false)
+ {
+ Worker = new(WebSocket, RequestType, Guid.NewGuid(), IsLongRunning);
+ }
+
+ ///
+ /// 基于本地已连接的 创建新的局内()数据请求
+ /// 使用 中的 创建一个新的请求
+ /// 此构造方法是给 提供的
+ ///
+ ///
+ ///
+ ///
+ internal DataRequest(Socket Socket, GamingType GamingType, bool IsLongRunning = false)
+ {
+ GamingWorker = new(Socket, GamingType, Guid.NewGuid(), IsLongRunning);
+ }
+
+ ///
+ /// 基于本地已连接的 创建新的局内()数据请求
+ /// 使用 中的 创建一个新的请求
+ /// 此构造方法是给 提供的
+ /// 此数据请求只能调用异步方法 请求数据
+ ///
+ ///
+ ///
+ ///
+ internal DataRequest(HTTPClient WebSocket, GamingType GamingType, bool IsLongRunning = false)
+ {
+ GamingWorker = new(WebSocket, GamingType, Guid.NewGuid(), IsLongRunning);
+ }
+
///
/// 添加数据
///
@@ -62,8 +110,16 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
///
public void AddRequestData(string key, object? value)
{
- if (Worker.RequestData.ContainsKey(key)) Worker.RequestData[key] = value;
- else Worker.RequestData.Add(key, value);
+ if (Worker != null)
+ {
+ if (Worker.RequestData.ContainsKey(key)) Worker.RequestData[key] = value;
+ else Worker.RequestData.Add(key, value);
+ }
+ else if (GamingWorker != null)
+ {
+ if (GamingWorker.RequestData.ContainsKey(key)) GamingWorker.RequestData[key] = value;
+ else GamingWorker.RequestData.Add(key, value);
+ }
}
///
@@ -71,16 +127,20 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
///
public void Dispose()
{
- Worker.Dispose();
+ Worker?.Dispose();
+ GamingWorker?.Dispose();
}
///
/// 向服务器发送数据请求
+ /// 警告: 调用此方法将抛出异常。请调用并等待
///
///
+ ///
public RequestResult SendRequest()
{
- Worker.SendRequest();
+ Worker?.SendRequest();
+ GamingWorker?.SendRequest();
return Result;
}
@@ -90,7 +150,14 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
///
public async Task SendRequestAsync()
{
- await Worker.SendRequestAsync();
+ if (Worker != null)
+ {
+ await Worker.SendRequestAsync();
+ }
+ else if (GamingWorker != null)
+ {
+ await GamingWorker.SendRequestAsync();
+ }
return Result;
}
@@ -102,33 +169,65 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
///
public T? GetResult(string key)
{
- return GetHashtableJsonObject(Worker.ResultData, key);
+ if (Worker != null)
+ {
+ return GetHashtableJsonObject(Worker.ResultData, key);
+ }
+ else if (GamingWorker != null)
+ {
+ return GetHashtableJsonObject(GamingWorker.ResultData, key);
+ }
+ return default;
}
- private class SocketRequest(Socket? Socket, DataRequestType RequestType, Guid RequestID, bool IsLongRunning = false) : SocketHandlerController(Socket)
+ ///
+ /// 常规数据请求
+ ///
+ private class SocketRequest : SocketHandlerController
{
public Hashtable RequestData { get; } = [];
public Hashtable ResultData => _ResultData;
public RequestResult Result => _Result;
public string Error => _Error;
- private readonly Socket? Socket = Socket;
- private readonly DataRequestType RequestType = RequestType;
- private readonly Guid RequestID = RequestID;
- private readonly bool _IsLongRunning = IsLongRunning;
+ private readonly Socket? Socket = null;
+ private readonly HTTPClient? WebSocket = null;
+ private readonly DataRequestType RequestType = DataRequestType.UnKnown;
+ private readonly Guid RequestID = Guid.Empty;
+ private readonly bool IsLongRunning = false;
private Hashtable _ResultData = [];
private RequestResult _Result = RequestResult.Missing;
private string _Error = "";
+ public SocketRequest(Socket? Socket, DataRequestType RequestType, Guid RequestID, bool IsLongRunning = false) : base(Socket)
+ {
+ this.Socket = Socket;
+ this.RequestType = RequestType;
+ this.RequestID = RequestID;
+ this.IsLongRunning = IsLongRunning;
+ }
+
+ public SocketRequest(HTTPClient? WebSocket, DataRequestType RequestType, Guid RequestID, bool IsLongRunning = false) : base(WebSocket)
+ {
+ this.WebSocket = WebSocket;
+ this.RequestType = RequestType;
+ this.RequestID = RequestID;
+ this.IsLongRunning = IsLongRunning;
+ }
+
public void SendRequest()
{
try
{
SetWorking();
- if (Socket?.Send(SocketMessageType.DataRequest, RequestType, RequestID, RequestData) == SocketResult.Success)
+ if (Socket != null && Socket.Send(SocketMessageType.DataRequest, RequestType, RequestID, RequestData) == SocketResult.Success)
{
WaitForWorkDone();
}
+ else if (WebSocket != null)
+ {
+ throw new AsyncRequestException();
+ }
else throw new ConnectFailedException();
}
catch (Exception e)
@@ -144,7 +243,11 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
try
{
SetWorking();
- if (Socket?.Send(SocketMessageType.DataRequest, RequestType, RequestID, RequestData) == SocketResult.Success)
+ if (Socket != null && Socket.Send(SocketMessageType.DataRequest, RequestType, RequestID, RequestData) == SocketResult.Success)
+ {
+ await WaitForWorkDoneAsync();
+ }
+ else if (WebSocket != null && await WebSocket.Send(SocketMessageType.DataRequest, RequestType, RequestID, RequestData) == SocketResult.Success)
{
await WaitForWorkDoneAsync();
}
@@ -168,7 +271,115 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
Guid id = SocketObject.GetParam(1);
if (type == RequestType && id == RequestID)
{
- if (!_IsLongRunning) Dispose();
+ if (!IsLongRunning) Dispose();
+ Work = SocketObject;
+ Working = false;
+ _ResultData = SocketObject.GetParam(2) ?? [];
+ _Result = RequestResult.Success;
+ }
+ }
+ }
+ catch (Exception e)
+ {
+ Working = false;
+ _Result = RequestResult.Fail;
+ _Error = e.GetErrorInfo();
+ }
+ }
+ }
+
+ ///
+ /// 游戏局内请求
+ ///
+ private class GamingRequest : SocketHandlerController
+ {
+ public Hashtable RequestData { get; } = [];
+ public Hashtable ResultData => _ResultData;
+ public RequestResult Result => _Result;
+ public string Error => _Error;
+
+ private readonly Socket? Socket = null;
+ private readonly HTTPClient? WebSocket = null;
+ private readonly GamingType GamingType = GamingType.None;
+ private readonly Guid RequestID = Guid.Empty;
+ private readonly bool IsLongRunning = false;
+ private Hashtable _ResultData = [];
+ private RequestResult _Result = RequestResult.Missing;
+ private string _Error = "";
+
+ public GamingRequest(Socket? Socket, GamingType GamingType, Guid RequestID, bool IsLongRunning = false) : base(Socket)
+ {
+ this.Socket = Socket;
+ this.GamingType = GamingType;
+ this.RequestID = RequestID;
+ this.IsLongRunning = IsLongRunning;
+ }
+
+ public GamingRequest(HTTPClient? WebSocket, GamingType GamingType, Guid RequestID, bool IsLongRunning = false) : base(WebSocket)
+ {
+ this.WebSocket = WebSocket;
+ this.GamingType = GamingType;
+ this.RequestID = RequestID;
+ this.IsLongRunning = IsLongRunning;
+ }
+
+ public void SendRequest()
+ {
+ try
+ {
+ SetWorking();
+ if (Socket != null && Socket.Send(SocketMessageType.DataRequest, GamingType, RequestID, RequestData) == SocketResult.Success)
+ {
+ WaitForWorkDone();
+ }
+ else if (WebSocket != null)
+ {
+ throw new AsyncRequestException();
+ }
+ else throw new ConnectFailedException();
+ }
+ catch (Exception e)
+ {
+ Working = false;
+ _Result = RequestResult.Fail;
+ _Error = e.GetErrorInfo();
+ }
+ }
+
+ public async Task SendRequestAsync()
+ {
+ try
+ {
+ SetWorking();
+ if (Socket != null && Socket.Send(SocketMessageType.DataRequest, GamingType, RequestID, RequestData) == SocketResult.Success)
+ {
+ await WaitForWorkDoneAsync();
+ }
+ else if (WebSocket != null && await WebSocket.Send(SocketMessageType.DataRequest, GamingType, RequestID, RequestData) == SocketResult.Success)
+ {
+ await WaitForWorkDoneAsync();
+ }
+ else throw new ConnectFailedException();
+ }
+ catch (Exception e)
+ {
+ Working = false;
+ _Result = RequestResult.Fail;
+ _Error = e.GetErrorInfo();
+ }
+ }
+
+ public override void SocketHandler(SocketObject SocketObject)
+ {
+ try
+ {
+ if (SocketObject.SocketType == SocketMessageType.DataRequest)
+ {
+ GamingType type = SocketObject.GetParam(0);
+ Guid id = SocketObject.GetParam(1);
+ if (type == GamingType && id == RequestID)
+ {
+ if (!IsLongRunning) Dispose();
Work = SocketObject;
Working = false;
_ResultData = SocketObject.GetParam(2) ?? [];
diff --git a/Api/Transmittal/WebDataRequest.cs b/Api/Transmittal/WebDataRequest.cs
deleted file mode 100644
index f1906db..0000000
--- a/Api/Transmittal/WebDataRequest.cs
+++ /dev/null
@@ -1,137 +0,0 @@
-using System.Collections;
-using Milimoe.FunGame.Core.Library.Common.Network;
-using Milimoe.FunGame.Core.Library.Constant;
-using Milimoe.FunGame.Core.Library.Exception;
-
-namespace Milimoe.FunGame.Core.Api.Transmittal
-{
- public class WebDataRequest
- {
- ///
- /// 数据请求结果
- ///
- public RequestResult Result => Worker.Result;
-
- ///
- /// 详细错误信息
- ///
- public string Error => Worker.Error;
-
- // 获取ResultData中key值对应的Json字符串
- // -- 此索引器仅返回Json字符串,对象类型请使用反序列化方法GetResult() --
- // -- 当然也可以自己反序列化 --
- // -- 基本类型可能有效,但仍建议使用反序列化方法 --
- public object? this[string key]
- {
- get
- {
- return Worker.ResultData[key];
- }
- set
- {
- AddRequestData(key, value);
- }
- }
-
- ///
- /// 私有的实现类
- ///
- private readonly WebSocketRequest Worker;
-
- ///
- /// 基于本地已连接的 创建新的数据请求
- ///
- ///
- ///
- internal WebDataRequest(HTTPClient Socket, DataRequestType RequestType)
- {
- Worker = new(Socket, RequestType, Guid.NewGuid());
- }
-
- ///
- /// 添加数据
- ///
- ///
- ///
- public void AddRequestData(string key, object? value)
- {
- if (Worker.RequestData.ContainsKey(key)) Worker.RequestData[key] = value;
- else Worker.RequestData.Add(key, value);
- }
-
- ///
- /// 向服务器发送数据请求
- ///
- ///
- public async Task SendRequest()
- {
- await Worker.SendRequestAsync();
- return Result;
- }
-
- ///
- /// 异步向服务器发送数据请求
- ///
- ///
- public async Task SendRequestAsync()
- {
- await Worker.SendRequestAsync();
- return Result;
- }
-
- ///
- /// 获取指定key对应的反序列化对象
- ///
- ///
- ///
- ///
- public T? GetResult(string key)
- {
- return GetHashtableJsonObject(Worker.ResultData, key);
- }
-
- private class WebSocketRequest(HTTPClient? Socket, DataRequestType RequestType, Guid RequestID)
- {
- public Hashtable RequestData { get; } = [];
- public Hashtable ResultData => _ResultData;
- public RequestResult Result => _Result;
- public string Error => _Error;
-
- private readonly HTTPClient? Socket = Socket;
- private readonly DataRequestType RequestType = RequestType;
- private readonly Guid RequestID = RequestID;
- private readonly Hashtable _ResultData = [];
- private RequestResult _Result = RequestResult.Missing;
- private string _Error = "";
-
- public async Task SendRequestAsync()
- {
- try
- {
- if (Socket != null)
- {
- await Socket.Send(SocketMessageType.DataRequest, RequestType, RequestID, RequestData);
- }
- else throw new ConnectFailedException();
- }
- catch (Exception e)
- {
- _Result = RequestResult.Fail;
- _Error = e.GetErrorInfo();
- }
- }
- }
-
- ///
- /// 反序列化Hashtable中的Json对象
- ///
- ///
- ///
- ///
- ///
- public static T? GetHashtableJsonObject(Hashtable hashtable, string key)
- {
- return Service.JsonManager.GetObject(hashtable, key);
- }
- }
-}
diff --git a/Api/Utility/Factory.cs b/Api/Utility/Factory.cs
index 5a31eec..2fbd36e 100644
--- a/Api/Utility/Factory.cs
+++ b/Api/Utility/Factory.cs
@@ -34,7 +34,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
}
///
- /// 获取物品实例,默认返回Passiveitem 被动物品 需要强制转换
+ /// 获取物品实例
///
/// Item类型 主动 或 被动
///
@@ -43,24 +43,6 @@ namespace Milimoe.FunGame.Core.Api.Utility
return ItemFactory.Create(type);
}
- ///
- /// 获取主动物品实例
- ///
- ///
- public static ActiveItem GetActiveItem()
- {
- return (ActiveItem)ItemFactory.Create(ItemType.Active);
- }
-
- ///
- /// 获取被动物品实例
- ///
- ///
- public static PassiveItem GetPassiveItem()
- {
- return (PassiveItem)ItemFactory.Create(ItemType.Passive);
- }
-
///
/// 获取房间实例
///
@@ -156,7 +138,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
}
///
- /// 获取技能实例,默认返回PassiveSkill 被动技能 需要强制转换
+ /// 获取技能实例
///
/// Skill类型 主动 或 被动
///
@@ -165,24 +147,6 @@ namespace Milimoe.FunGame.Core.Api.Utility
return SkillFactory.Create(type);
}
- ///
- /// 获取主动技能实例
- ///
- ///
- public static ActiveSkill GetActiveSkill()
- {
- return (ActiveSkill)SkillFactory.Create(SkillType.Active);
- }
-
- ///
- /// 获取被动技能实例
- ///
- ///
- public static PassiveSkill GetPassiveSkill()
- {
- return (PassiveSkill)SkillFactory.Create(SkillType.Passive);
- }
-
///
/// 获取用户实例
///
diff --git a/Api/Utility/GameModuleLoader.cs b/Api/Utility/GameModuleLoader.cs
index 6d328c9..63868cc 100644
--- a/Api/Utility/GameModuleLoader.cs
+++ b/Api/Utility/GameModuleLoader.cs
@@ -1,5 +1,4 @@
using System.Collections;
-using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Service;
@@ -11,12 +10,12 @@ namespace Milimoe.FunGame.Core.Api.Utility
///
/// 适用于客户端的模组集
///
- public Dictionary Modes { get; } = [];
+ public Dictionary Modules { get; } = [];
///
/// 适用于服务器的模组集
///
- public Dictionary ServerModes { get; } = [];
+ public Dictionary ServerModules { get; } = [];
///
/// 游戏地图集
@@ -26,27 +25,24 @@ namespace Milimoe.FunGame.Core.Api.Utility
///
/// 角色表
///
- public List Characters { get; } = [];
+ public Dictionary Characters { get; } = [];
///
/// 技能表
///
- public List Skills { get; } = [];
+ public Dictionary Skills { get; } = [];
///
/// 物品表
///
- public List- Items { get; } = [];
+ public Dictionary Items { get; } = [];
- private GameModuleLoader()
- {
-
- }
+ private GameModuleLoader() { }
///
/// 传入 类型来创建指定端的模组读取器
- /// runtime = 时,仅读取
- /// runtime = 时,仅读取
+ /// runtime = 时,仅读取
+ /// runtime = 时,仅读取
/// 都会读取
///
/// 传入 类型来创建指定端的模组读取器
@@ -58,12 +54,12 @@ namespace Milimoe.FunGame.Core.Api.Utility
GameModuleLoader loader = new();
if (runtime == FunGameInfo.FunGame.FunGame_Desktop)
{
- AddonManager.LoadGameModules(loader.Modes, loader.Characters, loader.Skills, loader.Items, delegates, otherobjs);
+ AddonManager.LoadGameModules(loader.Modules, loader.Characters, loader.Skills, loader.Items, delegates, otherobjs);
AddonManager.LoadGameMaps(loader.Maps, otherobjs);
}
else if (runtime == FunGameInfo.FunGame.FunGame_Server)
{
- AddonManager.LoadGameModulesForServer(loader.ServerModes, loader.Characters, loader.Skills, loader.Items, delegates, otherobjs);
+ AddonManager.LoadGameModulesForServer(loader.ServerModules, loader.Characters, loader.Skills, loader.Items, delegates, otherobjs);
AddonManager.LoadGameMaps(loader.Maps, otherobjs);
}
return loader;
@@ -79,11 +75,11 @@ namespace Milimoe.FunGame.Core.Api.Utility
{
get
{
- return Modes[name];
+ return Modules[name];
}
set
{
- Modes.TryAdd(name, value);
+ Modules.TryAdd(name, value);
}
}
@@ -94,7 +90,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
///
public GameModuleServer GetServerMode(string name)
{
- return ServerModes[name];
+ return ServerModules[name];
}
///
diff --git a/Api/Utility/General.cs b/Api/Utility/General.cs
index 9ec6466..4c79ac1 100644
--- a/Api/Utility/General.cs
+++ b/Api/Utility/General.cs
@@ -328,7 +328,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
#region 加密服务
///
- /// 使用HMACSHA512算法加密
+ /// 加密服务工具箱
///
public class Encryption
{
@@ -380,6 +380,9 @@ namespace Milimoe.FunGame.Core.Api.Utility
}
}
+ ///
+ /// 为字符串(string)添加扩展方法
+ ///
public static class StringExtension
{
///
@@ -398,6 +401,9 @@ namespace Milimoe.FunGame.Core.Api.Utility
#region 验证服务
+ ///
+ /// 验证码服务工具箱
+ ///
public class Verification
{
///
@@ -503,6 +509,9 @@ namespace Milimoe.FunGame.Core.Api.Utility
#region 多线程服务
+ ///
+ /// 多线程服务工具箱
+ ///
public class TaskUtility
{
///
diff --git a/Controller/AddonController.cs b/Controller/AddonController.cs
index 35dadbb..12973ce 100644
--- a/Controller/AddonController.cs
+++ b/Controller/AddonController.cs
@@ -22,35 +22,83 @@ namespace Milimoe.FunGame.Core.Controller
private Func MaskMethod_NewLongRunningDataRequest { get; set; }
///
- /// 基于本地已连接的Socket创建新的数据请求
+ /// 基于本地已连接的Socket创建新的局内数据请求
+ ///
+ private Func MaskMethod_NewGamingRequest { get; set; }
+
+ ///
+ /// 基于本地已连接的Socket创建长时间运行的局内数据请求
+ ///
+ private Func MaskMethod_NewLongRunningGamingRequest { get; set; }
+
+ ///
+ /// 基于本地已连接的Socket创建新的数据请求
+ /// 此方法只允许插件调用,如果是模组和模组服务器调用此方法将抛出异常
///
///
///
- ///
+ ///
public DataRequest NewDataRequest(DataRequestType type)
{
- if (typeof(T).IsAssignableFrom(typeof(IGameModuleServer)))
+ if (typeof(IGameModule).IsAssignableFrom(typeof(T)) || typeof(IGameModuleServer).IsAssignableFrom(typeof(T)))
{
- throw new ModuleServerNewDataRequestException();
+ throw new InvalidNewDataRequestException();
}
return MaskMethod_NewDataRequest(type);
}
///
- /// 基于本地已连接的Socket创建长时间运行的数据请求
+ /// 基于本地已连接的Socket创建长时间运行的数据请求
+ /// 此方法只允许插件调用,如果是模组和模组服务器调用此方法将抛出异常
///
///
///
- ///
+ ///
public DataRequest NewLongRunningDataRequest(DataRequestType type)
{
- if (typeof(T).IsAssignableFrom(typeof(IGameModuleServer)))
+ if (typeof(IGameModule).IsAssignableFrom(typeof(T)) || typeof(IGameModuleServer).IsAssignableFrom(typeof(T)))
{
- throw new ModuleServerNewDataRequestException();
+ throw new InvalidNewDataRequestException();
}
return MaskMethod_NewLongRunningDataRequest(type);
}
+ ///
+ /// 基于本地已连接的Socket创建新的局内()数据请求
+ /// 此方法是给 提供的,但是 也能调用
+ /// 模组服务器调用此方法将抛出异常
+ ///
+ ///
+ ///
+ ///
+ ///
+ public DataRequest NewDataRequest(GamingType type)
+ {
+ if (typeof(IGameModuleServer).IsAssignableFrom(typeof(T)))
+ {
+ throw new InvalidNewDataRequestException();
+ }
+ return MaskMethod_NewGamingRequest(type);
+ }
+
+ ///
+ /// 基于本地已连接的Socket创建长时间运行的局内()数据请求
+ /// 此方法是给 提供的,但是 也能调用
+ /// 模组服务器调用此方法将抛出异常
+ ///
+ ///
+ ///
+ ///
+ ///
+ public DataRequest NewLongRunningDataRequest(GamingType type)
+ {
+ if (typeof(IGameModuleServer).IsAssignableFrom(typeof(T)))
+ {
+ throw new InvalidNewDataRequestException();
+ }
+ return MaskMethod_NewLongRunningGamingRequest(type);
+ }
+
///
/// 新建一个AddonController
///
@@ -60,10 +108,16 @@ namespace Milimoe.FunGame.Core.Controller
{
if (delegates.ContainsKey("NewDataRequest")) MaskMethod_NewDataRequest = delegates["NewDataRequest"] != null ? (Func)delegates["NewDataRequest"]! : new(DefaultNewDataRequest);
if (delegates.ContainsKey("NewLongRunningDataRequest")) MaskMethod_NewLongRunningDataRequest = delegates["NewLongRunningDataRequest"] != null ? (Func)delegates["NewLongRunningDataRequest"]! : new(DefaultNewDataRequest);
+ if (delegates.ContainsKey("NewGamingRequest")) MaskMethod_NewDataRequest = delegates["NewGamingRequest"] != null ? (Func)delegates["NewGamingRequest"]! : new(DefaultNewDataRequest);
+ if (delegates.ContainsKey("NewLongRunningGamingRequest")) MaskMethod_NewLongRunningDataRequest = delegates["NewLongRunningGamingRequest"] != null ? (Func)delegates["NewLongRunningGamingRequest"]! : new(DefaultNewDataRequest);
MaskMethod_NewDataRequest ??= new(DefaultNewDataRequest);
MaskMethod_NewLongRunningDataRequest ??= new(DefaultNewDataRequest);
+ MaskMethod_NewGamingRequest ??= new(DefaultNewDataRequest);
+ MaskMethod_NewLongRunningGamingRequest ??= new(DefaultNewDataRequest);
}
- private DataRequest DefaultNewDataRequest(DataRequestType type) => throw new ConnectFailedException();
+ private DataRequest DefaultNewDataRequest(DataRequestType type) => throw new InvalidNewDataRequestException();
+
+ private DataRequest DefaultNewDataRequest(GamingType type) => throw new InvalidNewDataRequestException();
}
}
diff --git a/Controller/RunTimeController.cs b/Controller/RunTimeController.cs
index 8a0c7e1..ed17982 100644
--- a/Controller/RunTimeController.cs
+++ b/Controller/RunTimeController.cs
@@ -286,6 +286,40 @@ namespace Milimoe.FunGame.Core.Controller
throw new ConnectFailedException();
}
+ ///
+ /// 基于本地已连接的Socket创建新的局内()数据请求
+ /// 此方法是给 提供的
+ ///
+ ///
+ ///
+ ///
+ public DataRequest NewDataRequest(GamingType GamingType)
+ {
+ if (_Socket != null)
+ {
+ DataRequest request = new(_Socket, GamingType);
+ return request;
+ }
+ throw new ConnectFailedException();
+ }
+
+ ///
+ /// 基于本地已连接的Socket创建长时间运行的局内()数据请求
+ /// 此方法是给 提供的
+ ///
+ ///
+ ///
+ ///
+ public DataRequest NewLongRunningDataRequest(GamingType GamingType)
+ {
+ if (_Socket != null)
+ {
+ DataRequest request = new(_Socket, GamingType, true);
+ return request;
+ }
+ throw new ConnectFailedException();
+ }
+
///
/// 开始接收服务器信息
///
diff --git a/Controller/SocketHandlerController.cs b/Controller/SocketHandlerController.cs
index fce84bc..f83ac96 100644
--- a/Controller/SocketHandlerController.cs
+++ b/Controller/SocketHandlerController.cs
@@ -21,7 +21,12 @@ namespace Milimoe.FunGame.Core.Controller
///
/// Socket
///
- private readonly Socket _Socket;
+ private readonly Socket? _Socket;
+
+ ///
+ /// WebSocket
+ ///
+ private readonly HTTPClient? _WebSocket;
///
/// 继承请调用base构造
@@ -37,6 +42,20 @@ namespace Milimoe.FunGame.Core.Controller
else throw new SocketCreateReceivingException();
}
+ ///
+ /// 继承请调用base构造
+ ///
+ /// Socket
+ public SocketHandlerController(HTTPClient? websocket)
+ {
+ if (websocket != null)
+ {
+ _WebSocket = websocket;
+ websocket.BindEvent(new SocketManager.SocketReceiveHandler(SocketHandler));
+ }
+ else throw new SocketCreateReceivingException();
+ }
+
///
/// 继承请重写此方法
///
@@ -71,7 +90,8 @@ namespace Milimoe.FunGame.Core.Controller
{
if (Disposing)
{
- _Socket.BindEvent(new SocketManager.SocketReceiveHandler(SocketHandler), true);
+ _Socket?.BindEvent(new SocketManager.SocketReceiveHandler(SocketHandler), true);
+ _WebSocket?.BindEvent(new SocketManager.SocketReceiveHandler(SocketHandler), true);
}
}
IsDisposed = true;
diff --git a/Docs/FunGame.Core.xml b/Docs/FunGame.Core.xml
index 9311262..47f76f0 100644
--- a/Docs/FunGame.Core.xml
+++ b/Docs/FunGame.Core.xml
@@ -6,7 +6,8 @@
- 需要配合Milimoe.FunGame.Core.Library.Constant.DataRequestType使用
+ 需要配合 使用
+ 如果是 的数据请求,则配合 使用
确保已添加对应的枚举
@@ -25,6 +26,11 @@
私有的实现类
+
+
+ 私有的实现类(这是局内请求的)
+
+
基于本地已连接的 创建新的数据请求
@@ -34,6 +40,37 @@
+
+
+ 基于本地已连接的 创建新的数据请求
+ 使用 中的 创建一个新的请求
+ 此数据请求只能调用异步方法 请求数据
+
+
+
+
+
+
+
+ 基于本地已连接的 创建新的局内()数据请求
+ 使用 中的 创建一个新的请求
+ 此构造方法是给 提供的
+
+
+
+
+
+
+
+ 基于本地已连接的 创建新的局内()数据请求
+ 使用 中的 创建一个新的请求
+ 此构造方法是给 提供的
+ 此数据请求只能调用异步方法 请求数据
+
+
+
+
+
添加数据
@@ -49,8 +86,10 @@
向服务器发送数据请求
+ 警告: 调用此方法将抛出异常。请调用并等待
+
@@ -66,6 +105,16 @@
+
+
+ 常规数据请求
+
+
+
+
+ 游戏局内请求
+
+
反序列化Hashtable中的Json对象
@@ -204,64 +253,6 @@
回滚事务
-
-
- 数据请求结果
-
-
-
-
- 详细错误信息
-
-
-
-
- 私有的实现类
-
-
-
-
- 基于本地已连接的 创建新的数据请求
-
-
-
-
-
-
- 添加数据
-
-
-
-
-
-
- 向服务器发送数据请求
-
-
-
-
-
- 异步向服务器发送数据请求
-
-
-
-
-
- 获取指定key对应的反序列化对象
-
-
-
-
-
-
-
- 反序列化Hashtable中的Json对象
-
-
-
-
-
-
获取角色实例
@@ -276,23 +267,11 @@
- 获取物品实例,默认返回Passiveitem 被动物品 需要强制转换
+ 获取物品实例
Item类型 主动 或 被动
-
-
- 获取主动物品实例
-
-
-
-
-
- 获取被动物品实例
-
-
-
获取房间实例
@@ -333,23 +312,11 @@
- 获取技能实例,默认返回PassiveSkill 被动技能 需要强制转换
+ 获取技能实例
Skill类型 主动 或 被动
-
-
- 获取主动技能实例
-
-
-
-
-
- 获取被动技能实例
-
-
-
获取用户实例
@@ -389,12 +356,12 @@
-
+
适用于客户端的模组集
-
+
适用于服务器的模组集
@@ -422,8 +389,8 @@
传入 类型来创建指定端的模组读取器
- runtime = 时,仅读取
- runtime = 时,仅读取
+ runtime = 时,仅读取
+ runtime = 时,仅读取
都会读取
传入 类型来创建指定端的模组读取器
@@ -638,7 +605,7 @@
- 使用HMACSHA512算法加密
+ 加密服务工具箱
@@ -665,6 +632,11 @@
私钥
+
+
+ 为字符串(string)添加扩展方法
+
+
使用HMACSHA512算法加密
@@ -673,6 +645,11 @@
秘钥
+
+
+ 验证码服务工具箱
+
+
生成验证码
@@ -702,6 +679,11 @@
+
+
+ 多线程服务工具箱
+
+
开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步
@@ -1162,21 +1144,55 @@
基于本地已连接的Socket创建长时间运行的数据请求
+
+
+ 基于本地已连接的Socket创建新的局内数据请求
+
+
+
+
+ 基于本地已连接的Socket创建长时间运行的局内数据请求
+
+
- 基于本地已连接的Socket创建新的数据请求
+ 基于本地已连接的Socket创建新的数据请求
+ 此方法只允许插件调用,如果是模组和模组服务器调用此方法将抛出异常
-
+
- 基于本地已连接的Socket创建长时间运行的数据请求
+ 基于本地已连接的Socket创建长时间运行的数据请求
+ 此方法只允许插件调用,如果是模组和模组服务器调用此方法将抛出异常
-
+
+
+
+
+ 基于本地已连接的Socket创建新的局内()数据请求
+ 此方法是给 提供的,但是 也能调用
+ 模组服务器调用此方法将抛出异常
+
+
+
+
+
+
+
+
+ 基于本地已连接的Socket创建长时间运行的局内()数据请求
+ 此方法是给 提供的,但是 也能调用
+ 模组服务器调用此方法将抛出异常
+
+
+
+
+
@@ -1357,6 +1373,24 @@
+
+
+ 基于本地已连接的Socket创建新的局内()数据请求
+ 此方法是给 提供的
+
+
+
+
+
+
+
+ 基于本地已连接的Socket创建长时间运行的局内()数据请求
+ 此方法是给 提供的
+
+
+
+
+
开始接收服务器信息
@@ -1452,12 +1486,23 @@
Socket
+
+
+ WebSocket
+
+
继承请调用base构造
Socket
+
+
+ 继承请调用base构造
+
+ Socket
+
继承请重写此方法
@@ -1497,6 +1542,251 @@
触发关闭事件
+
+
+ 实体的数字ID
+
+
+
+
+ 实体的唯一ID
+
+
+
+
+ 实体的名称
+
+
+
+
+ 角色的名字
+
+
+
+
+ 角色的昵称
+
+
+
+
+ 角色所属的玩家
+
+
+
+
+ 角色统计数据
+
+
+
+
+ 魔法属性
+
+
+
+
+ 角色定位1
+
+
+
+
+ 角色定位2
+
+
+
+
+ 角色定位3
+
+
+
+
+ 角色评级
+
+
+
+
+ 晋升点数
+
+
+
+
+ 等级
+
+
+
+
+ 经验值
+
+
+
+
+ 基础生命值
+
+
+
+
+ 生命值
+
+
+
+
+ 基础魔法值
+
+
+
+
+ 魔法值
+
+
+
+
+ 能量
+
+
+
+
+ 基础攻击力
+
+
+
+
+ 攻击力
+
+
+
+
+ 基础物理护甲
+
+
+
+
+ 物理护甲
+
+
+
+
+ 物理伤害减免(%)
+
+
+
+
+ 魔法抗性(%)
+
+
+
+
+ 物理穿透(%)
+
+
+
+
+ 魔法穿透(%)
+
+
+
+
+ 生命回复力
+
+
+
+
+ 魔法回复力
+
+
+
+
+ 能量回复力
+
+
+
+
+ 基础力量
+
+
+
+
+ 基础敏捷
+
+
+
+
+ 基础智力
+
+
+
+
+ 力量
+
+
+
+
+ 敏捷
+
+
+
+
+ 智力
+
+
+
+
+ 力量成长值
+
+
+
+
+ 敏捷成长值
+
+
+
+
+ 智力成长值
+
+
+
+
+ 速度
+
+
+
+
+ 行动系数(%)
+
+
+
+
+ 加速系数(%)
+
+
+
+
+ 攻击距离
+
+
+
+
+ 暴击率(%)
+
+
+
+
+ 暴击伤害
+
+
+
+
+ 闪避率(%)
+
+
+
+
+ 角色的技能组
+
+
+
+
+ 角色携带的物品
+
+
记录 的生涯、赛季统计数据
@@ -1641,7 +1931,7 @@
模组:必须继承基类:
- 继承事件接口并实现其方法来使模组生效。例如继承:
+ 继承事件接口并实现其方法来使模组生效。例如继承:
@@ -1655,6 +1945,21 @@
地图:必须继承基类:
+
+
+ 角色:必须继承基类:
+
+
+
+
+ 技能:必须继承基类:
+
+
+
+
+ 物品:必须继承基类:
+
+
必须继承基类:
@@ -1772,7 +2077,7 @@
必须重写此方法,游戏的主要逻辑写在这里面
- 此方法会在 时调用
+ 此方法会在 时调用
@@ -1828,32 +2133,70 @@
- 模组的依赖集合
+ 模组的依赖集合
+ (地图名称()的数组)
+ (角色模组名称()的数组)
+ (技能模组名称()的数组)
+ (物品模组名称()的数组)
- 模组的依赖集合
+ 模组的依赖集合
+ (地图名称()的数组)
+ (角色模组名称()的数组)
+ (技能模组名称()的数组)
+ (物品模组名称()的数组)
-
+
模组所使用的地图组
-
+
模组所使用的角色组
-
+
+
+ 模组所使用的技能组
+
+
+
模组所使用的物品组
+
+
+ 实际使用的地图组对象
+ 请使用 自动填充,不要自己添加
+
+
+
+
+ 实际使用的角色组对象
+ 请使用 自动填充,不要自己添加
+
+
- 模组所使用的技能组
+ 实际使用的技能组对象
+ 请使用 自动填充,不要自己添加
+
+
+
+
+ 实际使用的物品组对象
+ 请使用 自动填充,不要自己添加
+
+
+
+
+ 获得所有的依赖项
+ 此方法会自动填充
@@ -1904,7 +2247,7 @@
-
+
@@ -2586,13 +2929,20 @@
游戏的参数
-
+
+
+ 此实例所属的玩家
+
+
+
传入游戏所需的参数,构造一个Gaming实例
+
+
@@ -2604,7 +2954,6 @@
消息类型
接收到的数据
- 底层会将哈希表中的数据发送给服务器
@@ -2650,7 +2999,7 @@
-
+
从modules目录加载所有模组
@@ -2662,7 +3011,7 @@
-
+
从modules目录加载所有适用于服务器的模组
@@ -2682,6 +3031,15 @@
+
+
+ 添加构造好的模组类实例到字典中
+
+ 加载的类型
+ 循环程序集的类型
+ 实例的字典
+ 加载时触发的检查方法,返回false不添加
+
默认的序列化选项
diff --git a/Entity/BaseEntity.cs b/Entity/BaseEntity.cs
index 59bcc0a..b8f15a3 100644
--- a/Entity/BaseEntity.cs
+++ b/Entity/BaseEntity.cs
@@ -4,8 +4,19 @@ namespace Milimoe.FunGame.Core.Entity
{
public abstract class BaseEntity : IBaseEntity
{
+ ///
+ /// 实体的数字ID
+ ///
public virtual long Id { get; set; } = 0;
+
+ ///
+ /// 实体的唯一ID
+ ///
public virtual Guid Guid { get; set; } = Guid.Empty;
+
+ ///
+ /// 实体的名称
+ ///
public virtual string Name { get; set; } = "";
public abstract bool Equals(IBaseEntity? other);
diff --git a/Entity/Character/Character.cs b/Entity/Character/Character.cs
index 81d7a51..c14d576 100644
--- a/Entity/Character/Character.cs
+++ b/Entity/Character/Character.cs
@@ -1,56 +1,239 @@
-using System.Collections;
-using Milimoe.FunGame.Core.Interface.Entity;
+using Milimoe.FunGame.Core.Interface.Entity;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.Core.Entity
{
- public class Character : BaseEntity
+ public class Character : BaseEntity, ICopyable
{
+ ///
+ /// 角色的名字
+ ///
public string FirstName { get; set; } = "";
+
+ ///
+ /// 角色的昵称
+ ///
public string NickName { get; set; } = "";
+
+ ///
+ /// 角色所属的玩家
+ ///
public User? User { get; set; } = null;
- public CharacterStatistics? Statistics { get; set; } = null; // 角色统计数据
- public MagicType MagicType { get; set; } // 魔法属性
- public RoleType FirstRoleType { get; set; } // 角色定位1
- public RoleType SecondRoleType { get; set; } // 角色定位2
- public RoleType ThirdRoleType { get; set; } // 角色定位3
- public RoleRating RoleRating { get; set; } // 角色评级
- public int Promotion { get; set; } // 晋升点数
+
+ ///
+ /// 角色统计数据
+ ///
+ public CharacterStatistics? Statistics { get; set; } = null;
+
+ ///
+ /// 魔法属性
+ ///
+ public MagicType MagicType { get; set; } = MagicType.Particle;
+
+ ///
+ /// 角色定位1
+ ///
+ public RoleType FirstRoleType { get; set; } = RoleType.Core;
+
+ ///
+ /// 角色定位2
+ ///
+ public RoleType SecondRoleType { get; set; } = RoleType.Guardian;
+
+ ///
+ /// 角色定位3
+ ///
+ public RoleType ThirdRoleType { get; set; } = RoleType.Vanguard;
+
+ ///
+ /// 角色评级
+ ///
+ public RoleRating RoleRating { get; set; } = RoleRating.E;
+
+ ///
+ /// 晋升点数
+ ///
+ public int Promotion { get; set; } = 0;
+
+ ///
+ /// 等级
+ ///
public int Level { get; set; } = 1;
- public decimal EXP { get; set; } // 经验值
- public decimal BaseHP { get; set; } // 基础生命值
- public decimal HP { get; set; }
- public decimal BaseMP { get; set; } // 基础魔法值
- public decimal MP { get; set; }
- public decimal EP { get; set; }
- public decimal BaseATK { get; set; } // 基础攻击力
- public decimal ATK { get; set; }
- public decimal DEF { get; set; } // Defence 物理护甲
- public decimal PDR { get; set; } // Physical Damage Reduction 物理伤害减免
- public decimal MDF { get; set; } // Magical Defence 魔法抗性
- public decimal PhysicalPenetration { get; set; } // Physical Penetration 物理穿透
- public decimal MagicalPenetration { get; set; } // Magical Penetration 魔法穿透
- public decimal HR { get; set; } = 0; // Health Regeneration 生命回复力
- public decimal MR { get; set; } = 0; // Mana Regeneration 魔法回复力
- public decimal ER { get; set; } = 0; // Eenergy Regeneration 能量回复力
- public decimal BaseSTR { get; set; } // 基础力量
- public decimal BaseAGI { get; set; } // 基础敏捷
- public decimal BaseINT { get; set; } // 基础智力
- public decimal STR { get; set; } // Strength 力量
- public decimal AGI { get; set; } // Agility 敏捷
- public decimal INT { get; set; } // Intelligence 智力
- public decimal STRGrowth { get; set; } // Strength Growth 力量成长值
- public decimal AGIGrowth { get; set; } // Agility Growth 敏捷成长值
- public decimal INTGrowth { get; set; } // Intelligence Growth 智力成长值
- public decimal SPD { get; set; } // Speed 速度
- public decimal ActionCoefficient { get; set; } // Action Coefficient 行动系数
- public decimal AccelerationCoefficient { get; set; } // Acceleration Coefficient 加速系数
- public decimal ATR { get; set; } // Attack Range 攻击距离
- public decimal CritRate { get; set; } = 0.05M; // 暴击率
- public decimal CritDMG { get; set; } = 1.25M; // 暴击伤害
- public decimal EvadeRate { get; set; } = 0.05M; // 闪避率
- public Hashtable Skills { get; set; } = [];
- public Hashtable Items { get; set; } = [];
+
+ ///
+ /// 经验值
+ ///
+ public decimal EXP { get; set; } = 0;
+
+ ///
+ /// 基础生命值
+ ///
+ public decimal BaseHP { get; set; } = 0;
+
+ ///
+ /// 生命值
+ ///
+ public decimal HP { get; set; } = 0;
+
+ ///
+ /// 基础魔法值
+ ///
+ public decimal BaseMP { get; set; } = 0;
+
+ ///
+ /// 魔法值
+ ///
+ public decimal MP { get; set; } = 0;
+
+ ///
+ /// 能量
+ ///
+ public decimal EP { get; set; } = 0;
+
+ ///
+ /// 基础攻击力
+ ///
+ public decimal BaseATK { get; set; } = 0;
+
+ ///
+ /// 攻击力
+ ///
+ public decimal ATK { get; set; } = 0;
+
+ ///
+ /// 基础物理护甲
+ ///
+ public decimal BaseDEF { get; set; } = 0;
+
+ ///
+ /// 物理护甲
+ ///
+ public decimal DEF { get; set; } = 0;
+
+ ///
+ /// 物理伤害减免(%)
+ ///
+ public decimal PDR { get; set; } = 0;
+
+ ///
+ /// 魔法抗性(%)
+ ///
+ public decimal MDF { get; set; } = 0;
+
+ ///
+ /// 物理穿透(%)
+ ///
+ public decimal PhysicalPenetration { get; set; } = 0;
+
+ ///
+ /// 魔法穿透(%)
+ ///
+ public decimal MagicalPenetration { get; set; } = 0;
+
+ ///
+ /// 生命回复力
+ ///
+ public decimal HR { get; set; } = 0;
+
+ ///
+ /// 魔法回复力
+ ///
+ public decimal MR { get; set; } = 0;
+
+ ///
+ /// 能量回复力
+ ///
+ public decimal ER { get; set; } = 0;
+
+ ///
+ /// 基础力量
+ ///
+ public decimal BaseSTR { get; set; } = 0;
+
+ ///
+ /// 基础敏捷
+ ///
+ public decimal BaseAGI { get; set; } = 0;
+
+ ///
+ /// 基础智力
+ ///
+ public decimal BaseINT { get; set; } = 0;
+
+ ///
+ /// 力量
+ ///
+ public decimal STR { get; set; } = 0;
+
+ ///
+ /// 敏捷
+ ///
+ public decimal AGI { get; set; } = 0;
+
+ ///
+ /// 智力
+ ///
+ public decimal INT { get; set; } = 0;
+
+ ///
+ /// 力量成长值
+ ///
+ public decimal STRGrowth { get; set; } = 0;
+
+ ///
+ /// 敏捷成长值
+ ///
+ public decimal AGIGrowth { get; set; } = 0;
+
+ ///
+ /// 智力成长值
+ ///
+ public decimal INTGrowth { get; set; } = 0;
+
+ ///
+ /// 速度
+ ///
+ public decimal SPD { get; set; } = 0;
+
+ ///
+ /// 行动系数(%)
+ ///
+ public decimal ActionCoefficient { get; set; } = 0;
+
+ ///
+ /// 加速系数(%)
+ ///
+ public decimal AccelerationCoefficient { get; set; } = 0;
+
+ ///
+ /// 攻击距离
+ ///
+ public decimal ATR { get; set; } = 0;
+
+ ///
+ /// 暴击率(%)
+ ///
+ public decimal CritRate { get; set; } = 0.05M;
+
+ ///
+ /// 暴击伤害
+ ///
+ public decimal CritDMG { get; set; } = 1.25M;
+
+ ///
+ /// 闪避率(%)
+ ///
+ public decimal EvadeRate { get; set; } = 0.05M;
+
+ ///
+ /// 角色的技能组
+ ///
+ public Dictionary Skills { get; set; } = [];
+
+ ///
+ /// 角色携带的物品
+ ///
+ public Dictionary Items { get; set; } = [];
protected Character()
{
@@ -62,9 +245,89 @@ namespace Milimoe.FunGame.Core.Entity
return new();
}
+ public void SetDefaultBase()
+ {
+ HP = BaseHP;
+ MP = BaseMP;
+ ATK = BaseATK;
+ DEF = BaseDEF;
+ STR = BaseSTR;
+ AGI = BaseAGI;
+ INT = BaseINT;
+ }
+
public override bool Equals(IBaseEntity? other)
{
return other is Character c && c.Name == Name;
}
+
+ public override string ToString()
+ {
+ string str = (Name + " " + FirstName).Trim();
+ if (NickName != "")
+ {
+ if (str != "") str += ", ";
+ str += NickName;
+ }
+ if (User != null && User.Username != "")
+ {
+ str += "(" + User.Username + ")";
+ }
+ return str;
+ }
+
+ public Character Copy()
+ {
+ Character c = new()
+ {
+ Name = Name,
+ FirstName = FirstName,
+ NickName = NickName,
+ Statistics = Statistics,
+ MagicType = MagicType,
+ FirstRoleType = FirstRoleType,
+ SecondRoleType = SecondRoleType,
+ ThirdRoleType = ThirdRoleType,
+ RoleRating = RoleRating,
+ Promotion = Promotion,
+ Level = Level,
+ EXP = EXP,
+ BaseHP = BaseHP,
+ HP = HP,
+ BaseMP = BaseMP,
+ MP = MP,
+ EP = EP,
+ BaseATK = BaseATK,
+ ATK = ATK,
+ BaseDEF = BaseDEF,
+ DEF = DEF,
+ PDR = PDR,
+ MDF = MDF,
+ PhysicalPenetration = PhysicalPenetration,
+ MagicalPenetration = MagicalPenetration,
+ HR = HR,
+ MR = MR,
+ ER = ER,
+ BaseSTR = BaseSTR,
+ BaseAGI = BaseAGI,
+ BaseINT = BaseINT,
+ STR = STR,
+ AGI = AGI,
+ INT = INT,
+ STRGrowth = STRGrowth,
+ AGIGrowth = AGIGrowth,
+ INTGrowth = INTGrowth,
+ SPD = SPD,
+ ActionCoefficient = ActionCoefficient,
+ AccelerationCoefficient = AccelerationCoefficient,
+ ATR = ATR,
+ CritRate = CritRate,
+ CritDMG = CritDMG,
+ EvadeRate = EvadeRate,
+ Skills = Skills,
+ Items = Items,
+ };
+ return c;
+ }
}
}
diff --git a/Entity/Item/ActiveItem.cs b/Entity/Item/ActiveItem.cs
deleted file mode 100644
index 69a3d06..0000000
--- a/Entity/Item/ActiveItem.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using Milimoe.FunGame.Core.Interface.Entity;
-
-namespace Milimoe.FunGame.Core.Entity
-{
- public class ActiveItem : Item
- {
- public ActiveSkill? Skill { get; set; } = null;
-
- protected ActiveItem()
- {
- Active = true;
- }
-
- protected ActiveItem(int id, string name)
- {
- Active = true;
- Id = id;
- Name = name;
- }
-
- internal static ActiveItem GetInstance()
- {
- return new();
- }
-
- internal static ActiveItem GetInstance(int id, string name)
- {
- return new(id, name);
- }
-
- public override bool Equals(IBaseEntity? other)
- {
- return other is ActiveItem i && i.Name == Name;
- }
- }
-}
diff --git a/Entity/Item/Item.cs b/Entity/Item/Item.cs
index 8be28a7..d0bd868 100644
--- a/Entity/Item/Item.cs
+++ b/Entity/Item/Item.cs
@@ -1,8 +1,9 @@
-using Milimoe.FunGame.Core.Interface.Entity;
+using System;
+using Milimoe.FunGame.Core.Interface.Entity;
namespace Milimoe.FunGame.Core.Entity
{
- public abstract class Item : BaseEntity, IItem
+ public class Item : BaseEntity, IItem
{
public string Describe { get; set; } = "";
public decimal Price { get; set; }
@@ -10,5 +11,16 @@ namespace Milimoe.FunGame.Core.Entity
public bool Active { get; set; }
public bool Enable { get; set; }
public Character? Character { get; set; } = null;
+ public Skill? Skill { get; set; } = null;
+
+ internal Item(bool active = false)
+ {
+ Active = active;
+ }
+
+ public override bool Equals(IBaseEntity? other)
+ {
+ return other is Item c && c.Name == Name;
+ }
}
}
diff --git a/Entity/Item/PassiveItem.cs b/Entity/Item/PassiveItem.cs
deleted file mode 100644
index 5af2c25..0000000
--- a/Entity/Item/PassiveItem.cs
+++ /dev/null
@@ -1,36 +0,0 @@
-using Milimoe.FunGame.Core.Interface.Entity;
-
-namespace Milimoe.FunGame.Core.Entity
-{
- public class PassiveItem : Item
- {
- public PassiveSkill? Skill { get; set; } = null;
-
- protected PassiveItem()
- {
- Active = false;
- }
-
- protected PassiveItem(int id, string name)
- {
- Active = false;
- Id = id;
- Name = name;
- }
-
- internal static PassiveItem GetInstance()
- {
- return new();
- }
-
- internal static PassiveItem GetInstance(int id, string name)
- {
- return new(id, name);
- }
-
- public override bool Equals(IBaseEntity? other)
- {
- return other is PassiveItem i && i.Name == Name;
- }
- }
-}
diff --git a/Entity/Skill/ActiveSkill.cs b/Entity/Skill/ActiveSkill.cs
deleted file mode 100644
index 9981dbb..0000000
--- a/Entity/Skill/ActiveSkill.cs
+++ /dev/null
@@ -1,35 +0,0 @@
-using Milimoe.FunGame.Core.Interface.Entity;
-
-namespace Milimoe.FunGame.Core.Entity
-{
- public class ActiveSkill : Skill
- {
- public decimal MP { get; set; } = 0;
- public decimal EP { get; set; } = 0;
- public decimal Reference1 { get; set; } = 0;
- public decimal Reference2 { get; set; } = 0;
- public decimal Reference3 { get; set; } = 0;
- public decimal Reference4 { get; set; } = 0;
- public decimal Reference5 { get; set; } = 0;
- public decimal Reference6 { get; set; } = 0;
- public decimal Reference7 { get; set; } = 0;
- public decimal Reference8 { get; set; } = 0;
- public decimal Reference9 { get; set; } = 0;
- public decimal Reference10 { get; set; } = 0;
-
- protected ActiveSkill()
- {
- Active = true;
- }
-
- internal static ActiveSkill GetInstance()
- {
- return new();
- }
-
- public override bool Equals(IBaseEntity? other)
- {
- return other is ActiveSkill s && s.Name == Name;
- }
- }
-}
diff --git a/Entity/Skill/PassiveSkill.cs b/Entity/Skill/PassiveSkill.cs
deleted file mode 100644
index 2dec9f0..0000000
--- a/Entity/Skill/PassiveSkill.cs
+++ /dev/null
@@ -1,33 +0,0 @@
-using Milimoe.FunGame.Core.Interface.Entity;
-
-namespace Milimoe.FunGame.Core.Entity
-{
- public class PassiveSkill : Skill
- {
- public decimal Reference1 { get; set; } = 0;
- public decimal Reference2 { get; set; } = 0;
- public decimal Reference3 { get; set; } = 0;
- public decimal Reference4 { get; set; } = 0;
- public decimal Reference5 { get; set; } = 0;
- public decimal Reference6 { get; set; } = 0;
- public decimal Reference7 { get; set; } = 0;
- public decimal Reference8 { get; set; } = 0;
- public decimal Reference9 { get; set; } = 0;
- public decimal Reference10 { get; set; } = 0;
-
- protected PassiveSkill()
- {
- Active = false;
- }
-
- internal static PassiveSkill GetInstance()
- {
- return new();
- }
-
- public override bool Equals(IBaseEntity? other)
- {
- return other is PassiveSkill s && s.Name == Name;
- }
- }
-}
diff --git a/Entity/Skill/Skill.cs b/Entity/Skill/Skill.cs
index db23e80..ef5b7e4 100644
--- a/Entity/Skill/Skill.cs
+++ b/Entity/Skill/Skill.cs
@@ -1,13 +1,24 @@
-using Milimoe.FunGame.Core.Library.Constant;
+using Milimoe.FunGame.Core.Interface.Entity;
+using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.Core.Entity
{
- public abstract class Skill : BaseEntity
+ public class Skill : BaseEntity, IActiveEnable
{
public string Describe { get; set; } = "";
public char Key { get; set; }
public bool Active { get; set; }
public bool Enable { get; set; }
public MagicType MagicType { get; set; }
+
+ internal Skill(bool active = false)
+ {
+ Active = active;
+ }
+
+ public override bool Equals(IBaseEntity? other)
+ {
+ return other is Skill c && c.Name == Name;
+ }
}
}
diff --git a/Interface/Base/Addons/IGameModuleServer.cs b/Interface/Base/Addons/IGameModuleServer.cs
index 118c33a..4fdce63 100644
--- a/Interface/Base/Addons/IGameModuleServer.cs
+++ b/Interface/Base/Addons/IGameModuleServer.cs
@@ -7,7 +7,7 @@ namespace Milimoe.FunGame.Core.Interface.Addons
{
public interface IGameModuleServer : IAddon, IAddonController, IGameModuleDepend
{
- public bool StartServer(string GameModule, Room Room, List Users, IServerModel RoomMasterServerModel, Dictionary OthersServerModel, params object[] args);
+ public bool StartServer(string GameModule, Room Room, List Users, IServerModel RoomMasterServerModel, Dictionary ServerModels, params object[] args);
public Hashtable GamingMessageHandler(string username, GamingType type, Hashtable data);
}
diff --git a/Interface/Base/HTTP/IHTTPClient.cs b/Interface/Base/HTTP/IHTTPClient.cs
index d86dccc..8101dd1 100644
--- a/Interface/Base/HTTP/IHTTPClient.cs
+++ b/Interface/Base/HTTP/IHTTPClient.cs
@@ -8,5 +8,6 @@ namespace Milimoe.FunGame.Core.Interface.HTTP
{
public Task Send(SocketMessageType type, params object[] objs);
public SocketObject SocketObject_Handler(SocketObject objs);
+ public void BindEvent(Delegate method, bool remove = false);
}
}
diff --git a/Interface/Base/IServerModel.cs b/Interface/Base/IServerModel.cs
index 66b90ae..d993e9d 100644
--- a/Interface/Base/IServerModel.cs
+++ b/Interface/Base/IServerModel.cs
@@ -1,5 +1,4 @@
using Milimoe.FunGame.Core.Entity;
-using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Core.Library.Common.Network;
using Milimoe.FunGame.Core.Library.Constant;
@@ -59,7 +58,7 @@ namespace Milimoe.FunGame.Core.Interface.Base
///
/// 开始接收客户端消息
- /// 请勿在 中调用此方法
+ /// 请勿在 中调用此方法
///
///
///
@@ -67,7 +66,7 @@ namespace Milimoe.FunGame.Core.Interface.Base
///
/// 启动对客户端的监听
- /// 请勿在 中调用此方法
+ /// 请勿在 中调用此方法
///
public void Start();
}
diff --git a/Interface/Base/Sockets/IClientSocket.cs b/Interface/Base/Sockets/IClientSocket.cs
index 46c526b..7b621a4 100644
--- a/Interface/Base/Sockets/IClientSocket.cs
+++ b/Interface/Base/Sockets/IClientSocket.cs
@@ -8,6 +8,6 @@ namespace Milimoe.FunGame.Core.Interface.Sockets
public void StartReceiving(Task t);
public SocketResult Send(SocketMessageType type, params object[] objs);
public Library.Common.Network.SocketObject[] Receive();
- public void BindEvent(Delegate Method, bool Remove = false);
+ public void BindEvent(Delegate method, bool remove = false);
}
}
diff --git a/Interface/Entity/Base/ICopyable.cs b/Interface/Entity/Base/ICopyable.cs
new file mode 100644
index 0000000..a1e5b39
--- /dev/null
+++ b/Interface/Entity/Base/ICopyable.cs
@@ -0,0 +1,7 @@
+namespace Milimoe.FunGame.Core.Interface.Entity
+{
+ public interface ICopyable
+ {
+ public T Copy();
+ }
+}
diff --git a/Interface/Event/GamingEventHandlers.cs b/Interface/Event/GamingEventHandlers.cs
index 82d3262..2f885f5 100644
--- a/Interface/Event/GamingEventHandlers.cs
+++ b/Interface/Event/GamingEventHandlers.cs
@@ -9,269 +9,146 @@ namespace Milimoe.FunGame.Core.Interface
///
public interface IGamingEventHandler
{
- public delegate void BeforeEventHandler(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public delegate void AfterEventHandler(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public delegate void SucceedEventHandler(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public delegate void FailedEventHandler(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public delegate void GamingEventHandler(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingConnectEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingConnect;
- public event AfterEventHandler? AfterGamingConnect;
- public event SucceedEventHandler? SucceedGamingConnect;
- public event FailedEventHandler? FailedGamingConnect;
+ public event GamingEventHandler? GamingConnect;
- public void OnBeforeGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingDisconnectEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingDisconnect;
- public event AfterEventHandler? AfterGamingDisconnect;
- public event SucceedEventHandler? SucceedGamingDisconnect;
- public event FailedEventHandler? FailedGamingDisconnect;
+ public event GamingEventHandler? GamingDisconnect;
- public void OnBeforeGamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingReconnectEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingReconnect;
- public event AfterEventHandler? AfterGamingReconnect;
- public event SucceedEventHandler? SucceedGamingReconnect;
- public event FailedEventHandler? FailedGamingReconnect;
+ public event GamingEventHandler? GamingReconnect;
- public void OnBeforeGamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingBanCharacterEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingBanCharacter;
- public event AfterEventHandler? AfterGamingBanCharacter;
- public event SucceedEventHandler? SucceedGamingBanCharacter;
- public event FailedEventHandler? FailedGamingBanCharacter;
+ public event GamingEventHandler? GamingBanCharacter;
- public void OnBeforeGamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingPickCharacterEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingPickCharacter;
- public event AfterEventHandler? AfterGamingPickCharacter;
- public event SucceedEventHandler? SucceedGamingPickCharacter;
- public event FailedEventHandler? FailedGamingPickCharacter;
+ public event GamingEventHandler? GamingPickCharacter;
- public void OnBeforeGamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingRandomEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingRandom;
- public event AfterEventHandler? AfterGamingRandom;
- public event SucceedEventHandler? SucceedGamingRandom;
- public event FailedEventHandler? FailedGamingRandom;
+ public event GamingEventHandler? GamingRandom;
- public void OnBeforeGamingRandomEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingRandomEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingRandomEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingRandomEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingRandomEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingRoundEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingRound;
- public event AfterEventHandler? AfterGamingRound;
- public event SucceedEventHandler? SucceedGamingRound;
- public event FailedEventHandler? FailedGamingRound;
+ public event GamingEventHandler? GamingRound;
- public void OnBeforeGamingRoundEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingRoundEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingRoundEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingRoundEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingRoundEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingLevelUpEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingLevelUp;
- public event AfterEventHandler? AfterGamingLevelUp;
- public event SucceedEventHandler? SucceedGamingLevelUp;
- public event FailedEventHandler? FailedGamingLevelUp;
+ public event GamingEventHandler? GamingLevelUp;
- public void OnBeforeGamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingMoveEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingMove;
- public event AfterEventHandler? AfterGamingMove;
- public event SucceedEventHandler? SucceedGamingMove;
- public event FailedEventHandler? FailedGamingMove;
+ public event GamingEventHandler? GamingMove;
- public void OnBeforeGamingMoveEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingMoveEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingMoveEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingMoveEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingMoveEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingAttackEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingAttack;
- public event AfterEventHandler? AfterGamingAttack;
- public event SucceedEventHandler? SucceedGamingAttack;
- public event FailedEventHandler? FailedGamingAttack;
+ public event GamingEventHandler? GamingAttack;
- public void OnBeforeGamingAttackEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingAttackEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingAttackEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingAttackEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingAttackEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingSkillEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingSkill;
- public event AfterEventHandler? AfterGamingSkill;
- public event SucceedEventHandler? SucceedGamingSkill;
- public event FailedEventHandler? FailedGamingSkill;
+ public event GamingEventHandler? GamingSkill;
- public void OnBeforeGamingSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingSkillEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingItemEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingItem;
- public event AfterEventHandler? AfterGamingItem;
- public event SucceedEventHandler? SucceedGamingItem;
- public event FailedEventHandler? FailedGamingItem;
+ public event GamingEventHandler? GamingItem;
- public void OnBeforeGamingItemEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingItemEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingItemEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingItemEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingItemEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingMagicEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingMagic;
- public event AfterEventHandler? AfterGamingMagic;
- public event SucceedEventHandler? SucceedGamingMagic;
- public event FailedEventHandler? FailedGamingMagic;
+ public event GamingEventHandler? GamingMagic;
- public void OnBeforeGamingMagicEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingMagicEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingMagicEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingMagicEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingMagicEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingBuyEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingBuy;
- public event AfterEventHandler? AfterGamingBuy;
- public event SucceedEventHandler? SucceedGamingBuy;
- public event FailedEventHandler? FailedGamingBuy;
+ public event GamingEventHandler? GamingBuy;
- public void OnBeforeGamingBuyEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingBuyEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingBuyEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingBuyEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingBuyEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingSuperSkillEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingSuperSkill;
- public event AfterEventHandler? AfterGamingSuperSkill;
- public event SucceedEventHandler? SucceedGamingSuperSkill;
- public event FailedEventHandler? FailedGamingSuperSkill;
+ public event GamingEventHandler? GamingSuperSkill;
- public void OnBeforeGamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingPauseEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingPause;
- public event AfterEventHandler? AfterGamingPause;
- public event SucceedEventHandler? SucceedGamingPause;
- public event FailedEventHandler? FailedGamingPause;
+ public event GamingEventHandler? GamingPause;
- public void OnBeforeGamingPauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingPauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingPauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingPauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingPauseEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingUnpauseEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingUnpause;
- public event AfterEventHandler? AfterGamingUnpause;
- public event SucceedEventHandler? SucceedGamingUnpause;
- public event FailedEventHandler? FailedGamingUnpause;
+ public event GamingEventHandler? GamingUnpause;
- public void OnBeforeGamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingSurrenderEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingSurrender;
- public event AfterEventHandler? AfterGamingSurrender;
- public event SucceedEventHandler? SucceedGamingSurrender;
- public event FailedEventHandler? FailedGamingSurrender;
+ public event GamingEventHandler? GamingSurrender;
- public void OnBeforeGamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingUpdateInfoEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingUpdateInfo;
- public event AfterEventHandler? AfterGamingUpdateInfo;
- public event SucceedEventHandler? SucceedGamingUpdateInfo;
- public event FailedEventHandler? FailedGamingUpdateInfo;
+ public event GamingEventHandler? GamingUpdateInfo;
- public void OnBeforeGamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingPunishEventHandler : IGamingEventHandler
{
- public event BeforeEventHandler? BeforeGamingPunish;
- public event AfterEventHandler? AfterGamingPunish;
- public event SucceedEventHandler? SucceedGamingPunish;
- public event FailedEventHandler? FailedGamingPunish;
+ public event GamingEventHandler? GamingPunish;
- public void OnBeforeGamingPunishEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnAfterGamingPunishEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnSucceedGamingPunishEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void OnFailedGamingPunishEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void OnGamingPunishEvent(object sender, GamingEventArgs e, Hashtable data);
}
}
diff --git a/Interface/Event/GamingEvents.cs b/Interface/Event/GamingEvents.cs
index 36fc350..4061ae8 100644
--- a/Interface/Event/GamingEvents.cs
+++ b/Interface/Event/GamingEvents.cs
@@ -6,161 +6,101 @@ namespace Milimoe.FunGame.Core.Interface
{
public interface IGamingConnectEvent
{
- public void BeforeGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingConnectEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingDisconnectEvent
{
- public void BeforeGamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingReconnectEvent
{
- public void BeforeGamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingBanCharacterEvent
{
- public void BeforeGamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingPickCharacterEvent
{
- public void BeforeGamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingRandomEvent
{
- public void BeforeGamingRandomEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingRandomEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingRandomEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingRandomEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingRandomEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingRoundEvent
{
- public void BeforeGamingRoundEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingRoundEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingRoundEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingRoundEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingRoundEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingLevelUpEvent
{
- public void BeforeGamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingMoveEvent
{
- public void BeforeGamingMoveEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingMoveEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingMoveEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingMoveEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingMoveEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingAttackEvent
{
- public void BeforeGamingAttackEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingAttackEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingAttackEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingAttackEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingAttackEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingSkillEvent
{
- public void BeforeGamingSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingSkillEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingItemEvent
{
- public void BeforeGamingItemEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingItemEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingItemEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingItemEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingItemEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingMagicEvent
{
- public void BeforeGamingMagicEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingMagicEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingMagicEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingMagicEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingMagicEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingBuyEvent
{
- public void BeforeGamingBuyEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingBuyEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingBuyEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingBuyEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingBuyEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingSuperSkillEvent
{
- public void BeforeGamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingPauseEvent
{
- public void BeforeGamingPauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingPauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingPauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingPauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingPauseEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingUnpauseEvent
{
- public void BeforeGamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingSurrenderEvent
{
- public void BeforeGamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingUpdateInfoEvent
{
- public void BeforeGamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data);
}
public interface IGamingPunishEvent
{
- public void BeforeGamingPunishEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void AfterGamingPunishEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void SucceedGamingPunishEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
- public void FailedGamingPunishEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result);
+ public void GamingPunishEvent(object sender, GamingEventArgs e, Hashtable data);
}
}
diff --git a/Library/Common/Addon/Example/ExampleGameModule.cs b/Library/Common/Addon/Example/ExampleGameModule.cs
index a82ecf5..096e296 100644
--- a/Library/Common/Addon/Example/ExampleGameModule.cs
+++ b/Library/Common/Addon/Example/ExampleGameModule.cs
@@ -1,4 +1,5 @@
using System.Collections;
+using Milimoe.FunGame.Core.Api.Transmittal;
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Interface;
@@ -7,7 +8,6 @@ using Milimoe.FunGame.Core.Library.Common.Event;
using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Model;
-// 此演示包含GameModule、GameModuleServer、GameMap
namespace Milimoe.FunGame.Core.Library.Common.Addon.Example
{
///
@@ -18,17 +18,17 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon.Example
public static GameModuleDepend GameModuleDepend => _depends;
private static readonly string[] Maps = ["Example GameMap"];
- private static readonly string[] Characters = [];
- private static readonly string[] Items = [];
- private static readonly string[] Skills = [];
- private static readonly GameModuleDepend _depends = new(Maps, Characters, Items, Skills);
+ private static readonly string[] Characters = ["Example CharacterModule"];
+ private static readonly string[] Skills = ["Example SkillModule"];
+ private static readonly string[] Items = ["Example ItemModule"];
+ private static readonly GameModuleDepend _depends = new(Maps, Characters, Skills, Items);
}
///
/// 模组:必须继承基类:
- /// 继承事件接口并实现其方法来使模组生效。例如继承:
+ /// 继承事件接口并实现其方法来使模组生效。例如继承:
///
- public class ExampleGameModule : GameModule, IGamingConnectEvent
+ public class ExampleGameModule : GameModule, IGamingUpdateInfoEvent
{
public override string Name => "FunGame Example GameModule";
@@ -38,7 +38,7 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon.Example
public override string Author => "FunGamer";
- public override string DefaultMap => GameModuleDepend.Maps.Length > 0 ? GameModuleDepend.Maps[0] : "";
+ public override string DefaultMap => GameModuleDepend.MapsDepend.Length > 0 ? GameModuleDepend.MapsDepend[0] : "";
public override GameModuleDepend GameModuleDepend => ExampleGameModuleConstant.GameModuleDepend;
@@ -66,37 +66,28 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon.Example
// 如果没有,则不需要重写此方法
}
- public void BeforeGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void GamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data)
{
- // 此方法预处理攻击消息
- // 如果这里将Cancel设置为true,那么这个方法结束后,后续的事件就会终止
- e.Cancel = true;
- }
-
- public void AfterGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
-
- }
-
- public void SucceedGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
-
- }
-
- public void FailedGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- _ = DiscountGameModuleServer();
- }
-
- public async Task DiscountGameModuleServer()
- {
- // 这是一个主动请求服务器的示例:
- Api.Transmittal.DataRequest request = Controller.NewDataRequest(DataRequestType.Gaming);
- request.AddRequestData("type", GamingType.Disconnect);
- if (await request.SendRequestAsync() == RequestResult.Success)
+ // 在下方的Server示例中,服务器发来的data中,包含check字符串,因此客户端要主动发起确认连接的请求。
+ if (data.ContainsKey("info_type"))
{
- string msg = request.GetResult("msg") ?? string.Empty;
- Controller.WriteLine(msg);
+ // 反序列化得到指定key的值
+ string info_type = DataRequest.GetHashtableJsonObject(data, "info_type") ?? "";
+ if (info_type == "check")
+ {
+ Guid token = DataRequest.GetHashtableJsonObject(data, "connect_token");
+ // 发起连接确认请求
+ DataRequest request = Controller.NewDataRequest(GamingType.Connect);
+ // 传递参数
+ request.AddRequestData("username", ((Gaming)sender).CurrentUser.Username);
+ request.AddRequestData("connect_token", token);
+ if (request.SendRequest() == RequestResult.Success)
+ {
+ string msg = request.GetResult("msg") ?? "";
+ Controller.WriteLine(msg);
+ }
+ request.Dispose();
+ }
}
}
}
@@ -115,41 +106,61 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon.Example
public override string Author => "FunGamer";
- public override string DefaultMap => GameModuleDepend.Maps.Length > 0 ? GameModuleDepend.Maps.First() : "";
+ public override string DefaultMap => GameModuleDepend.MapsDepend.Length > 0 ? GameModuleDepend.MapsDepend.First() : "";
public override GameModuleDepend GameModuleDepend => ExampleGameModuleConstant.GameModuleDepend;
protected Room Room = General.HallInstance;
protected List Users = [];
protected IServerModel? RoomMaster;
- protected Dictionary Others = [];
protected Dictionary All = [];
- public override bool StartServer(string GameModule, Room Room, List Users, IServerModel RoomMasterServerModel, Dictionary OthersServerModel, params object[] Args)
+ public override bool StartServer(string GameModule, Room Room, List Users, IServerModel RoomMasterServerModel, Dictionary ServerModels, params object[] Args)
{
// 将参数转为本地属性
this.Room = Room;
this.Users = Users;
RoomMaster = RoomMasterServerModel;
- Others = OthersServerModel;
- if (RoomMaster != null)
- {
- // 这里获得了每名玩家的服务线程,保存为一个字典
- All = OthersServerModel.ToDictionary(k => k.Key, v => v.Value);
- All.Add(RoomMaster.User.Username, RoomMaster);
- }
+ All = ServerModels;
// 创建一个线程执行Test()
TaskUtility.NewTask(Test).OnError(Controller.Error);
return true;
}
private readonly List ConnectedUser = [];
+ private readonly Dictionary UserData = [];
private async Task Test()
{
- // 通常,我们可以对客户端的连接状态进行确认,此方法展示如何确认客户端的连接
Controller.WriteLine("欢迎各位玩家进入房间 " + Room.Roomid + " 。");
- SendAll(SocketMessageType.Gaming, GamingType.Connect);
+
+ // 通常,我们可以对客户端的连接状态进行确认,此方法展示如何确认客户端的连接
+ // 有两种确认的方式,1是服务器主动确认,2是客户端发起确认
+ // 在FunGame项目中,建议永远使用客户端主动发起请求,因为服务器主动发起的实现难度较高
+ // 下面的演示基于综合的两种情况:服务器主动发送通知,客户端收到后,发起确认
+ // UpdateInfo是一个灵活的类型。如果发送check字符串,意味着服务器要求客户端发送确认
+ Hashtable data = [];
+ data.Add("info_type", "check");
+
+ // 进阶示例:传递一个token,让客户端返回
+ Guid token = Guid.NewGuid();
+ data.Add("connect_token", token);
+
+ // 我们保存到字典UserData中,这样可以方便跨方法检查变量
+ foreach (string username in Users.Select(u => u.Username).Distinct())
+ {
+ if (UserData.TryGetValue(username, out Hashtable? value))
+ {
+ value.Add("connect_token", token);
+ }
+ else
+ {
+ UserData.Add(username, []);
+ UserData[username].Add("connect_token", token);
+ }
+ }
+ SendAllGamingMessage(GamingType.UpdateInfo, data);
+
// 新建一个线程等待所有玩家确认
while (true)
{
@@ -168,15 +179,46 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon.Example
{
case GamingType.Connect:
// 编写处理“连接”命令的逻辑
- ConnectedUser.Add(Users.Where(u => u.Username == username).First());
- Controller.WriteLine(username + "已经连接。");
+ // 如果需要处理客户端传递的参数:获取与客户端约定好的参数key对应的值
+ string un = NetworkUtility.JsonDeserializeFromHashtable(data, "username") ?? "";
+ Guid token = NetworkUtility.JsonDeserializeFromHashtable(data, "connect_token");
+ if (un == username && UserData.TryGetValue(username, out Hashtable? value) && value != null && (value["connect_token"]?.Equals(token) ?? false))
+ {
+ ConnectedUser.Add(Users.Where(u => u.Username == username).First());
+ Controller.WriteLine(username + " 已经连接。");
+ }
+ else Controller.WriteLine(username + " 确认连接失败!");
break;
}
return result;
}
- private void SendAll(SocketMessageType type, params object[] args)
+ // === 下面是一些常用的工具方法,用于服务器给客户端发送消息,可以直接添加到你的项目中 === //
+
+ protected void SendAllGamingMessage(GamingType type, Hashtable data)
+ {
+ // 循环服务线程,向所有玩家发送局内消息
+ foreach (IServerModel s in All.Values)
+ {
+ if (s != null && s.Socket != null)
+ {
+ s.Send(s.Socket, SocketMessageType.Gaming, type, data);
+ }
+ }
+ }
+
+ protected void SendGamingMessage(string username, GamingType type, Hashtable data)
+ {
+ // 向指定玩家发送局内消息
+ IServerModel s = All[username];
+ if (s != null && s.Socket != null)
+ {
+ s.Send(s.Socket, SocketMessageType.Gaming, type, data);
+ }
+ }
+
+ protected void SendAll(SocketMessageType type, params object[] args)
{
// 循环服务线程,向所有玩家发送消息
foreach (IServerModel s in All.Values)
@@ -187,6 +229,16 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon.Example
}
}
}
+
+ protected void Send(string username, SocketMessageType type, params object[] args)
+ {
+ // 向指定玩家发送消息
+ IServerModel s = All[username];
+ if (s != null && s.Socket != null)
+ {
+ s.Send(s.Socket, type, args);
+ }
+ }
}
///
@@ -208,4 +260,94 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon.Example
public override float Size => 4.0f;
}
+
+ ///
+ /// 角色:必须继承基类:
+ ///
+ public class ExampleCharacterModule : CharacterModule
+ {
+ public override string Name => "Example CharacterModule";
+
+ public override string Description => "My First CharacterModule";
+
+ public override string Version => "1.0.0";
+
+ public override string Author => "FunGamer";
+
+ public override List Characters
+ {
+ get
+ {
+ List list = [];
+ // 构建一个你想要的角色
+ Character c = Factory.GetCharacter();
+ c.Name = "Oshima";
+ c.FirstName = "Shiya";
+ c.NickName = "OSM";
+ c.MagicType = MagicType.PurityNatural;
+ c.BaseHP = 30;
+ c.BaseSTR = 20;
+ c.BaseAGI = 10;
+ c.BaseINT = 5;
+ c.BaseATK = 100;
+ c.BaseDEF = 10;
+ list.Add(c);
+ return list;
+ }
+ }
+ }
+
+ ///
+ /// 技能:必须继承基类:
+ ///
+ public class ExampleSkillModule : SkillModule
+ {
+ public override string Name => "Example SkillModule";
+
+ public override string Description => "My First SkillModule";
+
+ public override string Version => "1.0.0";
+
+ public override string Author => "FunGamer";
+
+ public override List Skills
+ {
+ get
+ {
+ List list = [];
+ Skill s = Factory.GetSkill();
+ s.Name = "Example Skill";
+ s.MagicType = MagicType.PurityNatural;
+ list.Add(s);
+ return list;
+ }
+ }
+ }
+
+ ///
+ /// 物品:必须继承基类:
+ ///
+ public class ExampleItemModule : ItemModule
+ {
+ public override string Name => "Example ItemModule";
+
+ public override string Description => "My First ItemModule";
+
+ public override string Version => "1.0.0";
+
+ public override string Author => "FunGamer";
+
+ public override List
- Items
+ {
+ get
+ {
+ List
- list = [];
+ Item i = Factory.GetItem();
+ i.Name = "Example Item";
+ i.Price = 20;
+ list.Add(i);
+ return list;
+ }
+ }
+ }
}
diff --git a/Library/Common/Addon/GameModule.cs b/Library/Common/Addon/GameModule.cs
index 7061242..f94528f 100644
--- a/Library/Common/Addon/GameModule.cs
+++ b/Library/Common/Addon/GameModule.cs
@@ -160,663 +160,243 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon
if (this is IGamingConnectEvent)
{
IGamingConnectEvent bind = (IGamingConnectEvent)this;
- BeforeGamingConnect += bind.BeforeGamingConnectEvent;
- AfterGamingConnect += bind.AfterGamingConnectEvent;
- SucceedGamingConnect += bind.SucceedGamingConnectEvent;
- FailedGamingConnect += bind.FailedGamingConnectEvent;
+ GamingConnect += bind.GamingConnectEvent;
}
if (this is IGamingDisconnectEvent)
{
IGamingDisconnectEvent bind = (IGamingDisconnectEvent)this;
- BeforeGamingDisconnect += bind.BeforeGamingDisconnectEvent;
- AfterGamingDisconnect += bind.AfterGamingDisconnectEvent;
- SucceedGamingDisconnect += bind.SucceedGamingDisconnectEvent;
- FailedGamingDisconnect += bind.FailedGamingDisconnectEvent;
+ GamingDisconnect += bind.GamingDisconnectEvent;
}
if (this is IGamingReconnectEvent)
{
IGamingReconnectEvent bind = (IGamingReconnectEvent)this;
- BeforeGamingReconnect += bind.BeforeGamingReconnectEvent;
- AfterGamingReconnect += bind.AfterGamingReconnectEvent;
- SucceedGamingReconnect += bind.SucceedGamingReconnectEvent;
- FailedGamingReconnect += bind.FailedGamingReconnectEvent;
+ GamingReconnect += bind.GamingReconnectEvent;
}
if (this is IGamingBanCharacterEvent)
{
IGamingBanCharacterEvent bind = (IGamingBanCharacterEvent)this;
- BeforeGamingBanCharacter += bind.BeforeGamingBanCharacterEvent;
- AfterGamingBanCharacter += bind.AfterGamingBanCharacterEvent;
- SucceedGamingBanCharacter += bind.SucceedGamingBanCharacterEvent;
- FailedGamingBanCharacter += bind.FailedGamingBanCharacterEvent;
+ GamingBanCharacter += bind.GamingBanCharacterEvent;
}
if (this is IGamingPickCharacterEvent)
{
IGamingPickCharacterEvent bind = (IGamingPickCharacterEvent)this;
- BeforeGamingPickCharacter += bind.BeforeGamingPickCharacterEvent;
- AfterGamingPickCharacter += bind.AfterGamingPickCharacterEvent;
- SucceedGamingPickCharacter += bind.SucceedGamingPickCharacterEvent;
- FailedGamingPickCharacter += bind.FailedGamingPickCharacterEvent;
+ GamingPickCharacter += bind.GamingPickCharacterEvent;
}
if (this is IGamingRandomEvent)
{
IGamingRandomEvent bind = (IGamingRandomEvent)this;
- BeforeGamingRandom += bind.BeforeGamingRandomEvent;
- AfterGamingRandom += bind.AfterGamingRandomEvent;
- SucceedGamingRandom += bind.SucceedGamingRandomEvent;
- FailedGamingRandom += bind.FailedGamingRandomEvent;
+ GamingRandom += bind.GamingRandomEvent;
}
if (this is IGamingRoundEvent)
{
IGamingRoundEvent bind = (IGamingRoundEvent)this;
- BeforeGamingRound += bind.BeforeGamingRoundEvent;
- AfterGamingRound += bind.AfterGamingRoundEvent;
- SucceedGamingRound += bind.SucceedGamingRoundEvent;
- FailedGamingRound += bind.FailedGamingRoundEvent;
+ GamingRound += bind.GamingRoundEvent;
}
if (this is IGamingLevelUpEvent)
{
IGamingLevelUpEvent bind = (IGamingLevelUpEvent)this;
- BeforeGamingLevelUp += bind.BeforeGamingLevelUpEvent;
- AfterGamingLevelUp += bind.AfterGamingLevelUpEvent;
- SucceedGamingLevelUp += bind.SucceedGamingLevelUpEvent;
- FailedGamingLevelUp += bind.FailedGamingLevelUpEvent;
+ GamingLevelUp += bind.GamingLevelUpEvent;
}
if (this is IGamingMoveEvent)
{
IGamingMoveEvent bind = (IGamingMoveEvent)this;
- BeforeGamingMove += bind.BeforeGamingMoveEvent;
- AfterGamingMove += bind.AfterGamingMoveEvent;
- SucceedGamingMove += bind.SucceedGamingMoveEvent;
- FailedGamingMove += bind.FailedGamingMoveEvent;
+ GamingMove += bind.GamingMoveEvent;
}
if (this is IGamingAttackEvent)
{
IGamingAttackEvent bind = (IGamingAttackEvent)this;
- BeforeGamingAttack += bind.BeforeGamingAttackEvent;
- AfterGamingAttack += bind.AfterGamingAttackEvent;
- SucceedGamingAttack += bind.SucceedGamingAttackEvent;
- FailedGamingAttack += bind.FailedGamingAttackEvent;
+ GamingAttack += bind.GamingAttackEvent;
}
if (this is IGamingSkillEvent)
{
IGamingSkillEvent bind = (IGamingSkillEvent)this;
- BeforeGamingSkill += bind.BeforeGamingSkillEvent;
- AfterGamingSkill += bind.AfterGamingSkillEvent;
- SucceedGamingSkill += bind.SucceedGamingSkillEvent;
- FailedGamingSkill += bind.FailedGamingSkillEvent;
+ GamingSkill += bind.GamingSkillEvent;
}
if (this is IGamingItemEvent)
{
IGamingItemEvent bind = (IGamingItemEvent)this;
- BeforeGamingItem += bind.BeforeGamingItemEvent;
- AfterGamingItem += bind.AfterGamingItemEvent;
- SucceedGamingItem += bind.SucceedGamingItemEvent;
- FailedGamingItem += bind.FailedGamingItemEvent;
+ GamingItem += bind.GamingItemEvent;
}
if (this is IGamingMagicEvent)
{
IGamingMagicEvent bind = (IGamingMagicEvent)this;
- BeforeGamingMagic += bind.BeforeGamingMagicEvent;
- AfterGamingMagic += bind.AfterGamingMagicEvent;
- SucceedGamingMagic += bind.SucceedGamingMagicEvent;
- FailedGamingMagic += bind.FailedGamingMagicEvent;
+ GamingMagic += bind.GamingMagicEvent;
}
if (this is IGamingBuyEvent)
{
IGamingBuyEvent bind = (IGamingBuyEvent)this;
- BeforeGamingBuy += bind.BeforeGamingBuyEvent;
- AfterGamingBuy += bind.AfterGamingBuyEvent;
- SucceedGamingBuy += bind.SucceedGamingBuyEvent;
- FailedGamingBuy += bind.FailedGamingBuyEvent;
+ GamingBuy += bind.GamingBuyEvent;
}
if (this is IGamingSuperSkillEvent)
{
IGamingSuperSkillEvent bind = (IGamingSuperSkillEvent)this;
- BeforeGamingSuperSkill += bind.BeforeGamingSuperSkillEvent;
- AfterGamingSuperSkill += bind.AfterGamingSuperSkillEvent;
- SucceedGamingSuperSkill += bind.SucceedGamingSuperSkillEvent;
- FailedGamingSuperSkill += bind.FailedGamingSuperSkillEvent;
+ GamingSuperSkill += bind.GamingSuperSkillEvent;
}
if (this is IGamingPauseEvent)
{
IGamingPauseEvent bind = (IGamingPauseEvent)this;
- BeforeGamingPause += bind.BeforeGamingPauseEvent;
- AfterGamingPause += bind.AfterGamingPauseEvent;
- SucceedGamingPause += bind.SucceedGamingPauseEvent;
- FailedGamingPause += bind.FailedGamingPauseEvent;
+ GamingPause += bind.GamingPauseEvent;
}
if (this is IGamingUnpauseEvent)
{
IGamingUnpauseEvent bind = (IGamingUnpauseEvent)this;
- BeforeGamingUnpause += bind.BeforeGamingUnpauseEvent;
- AfterGamingUnpause += bind.AfterGamingUnpauseEvent;
- SucceedGamingUnpause += bind.SucceedGamingUnpauseEvent;
- FailedGamingUnpause += bind.FailedGamingUnpauseEvent;
+ GamingUnpause += bind.GamingUnpauseEvent;
}
if (this is IGamingSurrenderEvent)
{
IGamingSurrenderEvent bind = (IGamingSurrenderEvent)this;
- BeforeGamingSurrender += bind.BeforeGamingSurrenderEvent;
- AfterGamingSurrender += bind.AfterGamingSurrenderEvent;
- SucceedGamingSurrender += bind.SucceedGamingSurrenderEvent;
- FailedGamingSurrender += bind.FailedGamingSurrenderEvent;
+ GamingSurrender += bind.GamingSurrenderEvent;
}
if (this is IGamingUpdateInfoEvent)
{
IGamingUpdateInfoEvent bind = (IGamingUpdateInfoEvent)this;
- BeforeGamingUpdateInfo += bind.BeforeGamingUpdateInfoEvent;
- AfterGamingUpdateInfo += bind.AfterGamingUpdateInfoEvent;
- SucceedGamingUpdateInfo += bind.SucceedGamingUpdateInfoEvent;
- FailedGamingUpdateInfo += bind.FailedGamingUpdateInfoEvent;
+ GamingUpdateInfo += bind.GamingUpdateInfoEvent;
}
if (this is IGamingPunishEvent)
{
IGamingPunishEvent bind = (IGamingPunishEvent)this;
- BeforeGamingPunish += bind.BeforeGamingPunishEvent;
- AfterGamingPunish += bind.AfterGamingPunishEvent;
- SucceedGamingPunish += bind.SucceedGamingPunishEvent;
- FailedGamingPunish += bind.FailedGamingPunishEvent;
+ GamingPunish += bind.GamingPunishEvent;
}
}
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingConnect;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingConnect;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingConnect;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingConnect;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingDisconnect;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingDisconnect;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingDisconnect;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingDisconnect;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingReconnect;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingReconnect;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingReconnect;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingReconnect;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingBanCharacter;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingBanCharacter;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingBanCharacter;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingBanCharacter;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingPickCharacter;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingPickCharacter;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingPickCharacter;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingPickCharacter;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingRandom;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingRandom;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingRandom;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingRandom;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingRound;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingRound;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingRound;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingRound;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingLevelUp;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingLevelUp;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingLevelUp;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingLevelUp;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingMove;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingMove;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingMove;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingMove;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingAttack;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingAttack;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingAttack;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingAttack;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingSkill;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingSkill;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingSkill;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingSkill;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingItem;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingItem;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingItem;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingItem;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingMagic;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingMagic;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingMagic;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingMagic;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingBuy;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingBuy;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingBuy;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingBuy;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingSuperSkill;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingSuperSkill;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingSuperSkill;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingSuperSkill;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingPause;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingPause;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingPause;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingPause;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingUnpause;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingUnpause;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingUnpause;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingUnpause;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingSurrender;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingSurrender;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingSurrender;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingSurrender;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingUpdateInfo;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingUpdateInfo;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingUpdateInfo;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingUpdateInfo;
- public event IGamingEventHandler.BeforeEventHandler? BeforeGamingPunish;
- public event IGamingEventHandler.AfterEventHandler? AfterGamingPunish;
- public event IGamingEventHandler.SucceedEventHandler? SucceedGamingPunish;
- public event IGamingEventHandler.FailedEventHandler? FailedGamingPunish;
+ 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 OnBeforeGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data)
{
- BeforeGamingConnect?.Invoke(sender, e, data, result);
+ GamingConnect?.Invoke(sender, e, data);
}
- public void OnAfterGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data)
{
- AfterGamingConnect?.Invoke(sender, e, data, result);
+ GamingDisconnect?.Invoke(sender, e, data);
}
- public void OnSucceedGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data)
{
- SucceedGamingConnect?.Invoke(sender, e, data, result);
+ GamingReconnect?.Invoke(sender, e, data);
}
- public void OnFailedGamingConnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data)
{
- FailedGamingConnect?.Invoke(sender, e, data, result);
+ GamingBanCharacter?.Invoke(sender, e, data);
}
- public void OnBeforeGamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data)
{
- BeforeGamingDisconnect?.Invoke(sender, e, data, result);
+ GamingPickCharacter?.Invoke(sender, e, data);
}
- public void OnAfterGamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingRandomEvent(object sender, GamingEventArgs e, Hashtable data)
{
- AfterGamingDisconnect?.Invoke(sender, e, data, result);
+ GamingRandom?.Invoke(sender, e, data);
}
- public void OnSucceedGamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingRoundEvent(object sender, GamingEventArgs e, Hashtable data)
{
- SucceedGamingDisconnect?.Invoke(sender, e, data, result);
+ GamingRound?.Invoke(sender, e, data);
}
- public void OnFailedGamingDisconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data)
{
- FailedGamingDisconnect?.Invoke(sender, e, data, result);
+ GamingLevelUp?.Invoke(sender, e, data);
}
- public void OnBeforeGamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingMoveEvent(object sender, GamingEventArgs e, Hashtable data)
{
- BeforeGamingReconnect?.Invoke(sender, e, data, result);
+ GamingMove?.Invoke(sender, e, data);
}
- public void OnAfterGamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingAttackEvent(object sender, GamingEventArgs e, Hashtable data)
{
- AfterGamingReconnect?.Invoke(sender, e, data, result);
+ GamingAttack?.Invoke(sender, e, data);
}
- public void OnSucceedGamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingSkillEvent(object sender, GamingEventArgs e, Hashtable data)
{
- SucceedGamingReconnect?.Invoke(sender, e, data, result);
+ GamingSkill?.Invoke(sender, e, data);
}
- public void OnFailedGamingReconnectEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingItemEvent(object sender, GamingEventArgs e, Hashtable data)
{
- FailedGamingReconnect?.Invoke(sender, e, data, result);
+ GamingItem?.Invoke(sender, e, data);
}
- public void OnBeforeGamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingMagicEvent(object sender, GamingEventArgs e, Hashtable data)
{
- BeforeGamingBanCharacter?.Invoke(sender, e, data, result);
+ GamingMagic?.Invoke(sender, e, data);
}
- public void OnAfterGamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingBuyEvent(object sender, GamingEventArgs e, Hashtable data)
{
- AfterGamingBanCharacter?.Invoke(sender, e, data, result);
+ GamingBuy?.Invoke(sender, e, data);
}
- public void OnSucceedGamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data)
{
- SucceedGamingBanCharacter?.Invoke(sender, e, data, result);
+ GamingSuperSkill?.Invoke(sender, e, data);
}
- public void OnFailedGamingBanCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingPauseEvent(object sender, GamingEventArgs e, Hashtable data)
{
- FailedGamingBanCharacter?.Invoke(sender, e, data, result);
+ GamingPause?.Invoke(sender, e, data);
}
- public void OnBeforeGamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data)
{
- BeforeGamingPickCharacter?.Invoke(sender, e, data, result);
+ GamingUnpause?.Invoke(sender, e, data);
}
- public void OnAfterGamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data)
{
- AfterGamingPickCharacter?.Invoke(sender, e, data, result);
+ GamingSurrender?.Invoke(sender, e, data);
}
- public void OnSucceedGamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data)
{
- SucceedGamingPickCharacter?.Invoke(sender, e, data, result);
+ GamingUpdateInfo?.Invoke(sender, e, data);
}
- public void OnFailedGamingPickCharacterEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
+ public void OnGamingPunishEvent(object sender, GamingEventArgs e, Hashtable data)
{
- FailedGamingPickCharacter?.Invoke(sender, e, data, result);
- }
-
- public void OnBeforeGamingRandomEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- BeforeGamingRandom?.Invoke(sender, e, data, result);
- }
-
- public void OnAfterGamingRandomEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- AfterGamingRandom?.Invoke(sender, e, data, result);
- }
-
- public void OnSucceedGamingRandomEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- SucceedGamingRandom?.Invoke(sender, e, data, result);
- }
-
- public void OnFailedGamingRandomEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- FailedGamingRandom?.Invoke(sender, e, data, result);
- }
-
- public void OnBeforeGamingRoundEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- BeforeGamingRound?.Invoke(sender, e, data, result);
- }
-
- public void OnAfterGamingRoundEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- AfterGamingRound?.Invoke(sender, e, data, result);
- }
-
- public void OnSucceedGamingRoundEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- SucceedGamingRound?.Invoke(sender, e, data, result);
- }
-
- public void OnFailedGamingRoundEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- FailedGamingRound?.Invoke(sender, e, data, result);
- }
-
- public void OnBeforeGamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- BeforeGamingLevelUp?.Invoke(sender, e, data, result);
- }
-
- public void OnAfterGamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- AfterGamingLevelUp?.Invoke(sender, e, data, result);
- }
-
- public void OnSucceedGamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- SucceedGamingLevelUp?.Invoke(sender, e, data, result);
- }
-
- public void OnFailedGamingLevelUpEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- FailedGamingLevelUp?.Invoke(sender, e, data, result);
- }
-
- public void OnBeforeGamingMoveEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- BeforeGamingMove?.Invoke(sender, e, data, result);
- }
-
- public void OnAfterGamingMoveEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- AfterGamingMove?.Invoke(sender, e, data, result);
- }
-
- public void OnSucceedGamingMoveEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- SucceedGamingMove?.Invoke(sender, e, data, result);
- }
-
- public void OnFailedGamingMoveEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- FailedGamingMove?.Invoke(sender, e, data, result);
- }
-
- public void OnBeforeGamingAttackEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- BeforeGamingAttack?.Invoke(sender, e, data, result);
- }
-
- public void OnAfterGamingAttackEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- AfterGamingAttack?.Invoke(sender, e, data, result);
- }
-
- public void OnSucceedGamingAttackEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- SucceedGamingAttack?.Invoke(sender, e, data, result);
- }
-
- public void OnFailedGamingAttackEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- FailedGamingAttack?.Invoke(sender, e, data, result);
- }
-
- public void OnBeforeGamingSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- BeforeGamingSkill?.Invoke(sender, e, data, result);
- }
-
- public void OnAfterGamingSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- AfterGamingSkill?.Invoke(sender, e, data, result);
- }
-
- public void OnSucceedGamingSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- SucceedGamingSkill?.Invoke(sender, e, data, result);
- }
-
- public void OnFailedGamingSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- FailedGamingSkill?.Invoke(sender, e, data, result);
- }
-
- public void OnBeforeGamingItemEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- BeforeGamingItem?.Invoke(sender, e, data, result);
- }
-
- public void OnAfterGamingItemEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- AfterGamingItem?.Invoke(sender, e, data, result);
- }
-
- public void OnSucceedGamingItemEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- SucceedGamingItem?.Invoke(sender, e, data, result);
- }
-
- public void OnFailedGamingItemEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- FailedGamingItem?.Invoke(sender, e, data, result);
- }
-
- public void OnBeforeGamingMagicEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- BeforeGamingMagic?.Invoke(sender, e, data, result);
- }
-
- public void OnAfterGamingMagicEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- AfterGamingMagic?.Invoke(sender, e, data, result);
- }
-
- public void OnSucceedGamingMagicEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- SucceedGamingMagic?.Invoke(sender, e, data, result);
- }
-
- public void OnFailedGamingMagicEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- FailedGamingMagic?.Invoke(sender, e, data, result);
- }
-
- public void OnBeforeGamingBuyEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- BeforeGamingBuy?.Invoke(sender, e, data, result);
- }
-
- public void OnAfterGamingBuyEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- AfterGamingBuy?.Invoke(sender, e, data, result);
- }
-
- public void OnSucceedGamingBuyEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- SucceedGamingBuy?.Invoke(sender, e, data, result);
- }
-
- public void OnFailedGamingBuyEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- FailedGamingBuy?.Invoke(sender, e, data, result);
- }
-
- public void OnBeforeGamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- BeforeGamingSuperSkill?.Invoke(sender, e, data, result);
- }
-
- public void OnAfterGamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- AfterGamingSuperSkill?.Invoke(sender, e, data, result);
- }
-
- public void OnSucceedGamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- SucceedGamingSuperSkill?.Invoke(sender, e, data, result);
- }
-
- public void OnFailedGamingSuperSkillEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- FailedGamingSuperSkill?.Invoke(sender, e, data, result);
- }
-
- public void OnBeforeGamingPauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- BeforeGamingPause?.Invoke(sender, e, data, result);
- }
-
- public void OnAfterGamingPauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- AfterGamingPause?.Invoke(sender, e, data, result);
- }
-
- public void OnSucceedGamingPauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- SucceedGamingPause?.Invoke(sender, e, data, result);
- }
-
- public void OnFailedGamingPauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- FailedGamingPause?.Invoke(sender, e, data, result);
- }
-
- public void OnBeforeGamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- BeforeGamingUnpause?.Invoke(sender, e, data, result);
- }
-
- public void OnAfterGamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- AfterGamingUnpause?.Invoke(sender, e, data, result);
- }
-
- public void OnSucceedGamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- SucceedGamingUnpause?.Invoke(sender, e, data, result);
- }
-
- public void OnFailedGamingUnpauseEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- FailedGamingUnpause?.Invoke(sender, e, data, result);
- }
-
- public void OnBeforeGamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- BeforeGamingSurrender?.Invoke(sender, e, data, result);
- }
-
- public void OnAfterGamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- AfterGamingSurrender?.Invoke(sender, e, data, result);
- }
-
- public void OnSucceedGamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- SucceedGamingSurrender?.Invoke(sender, e, data, result);
- }
-
- public void OnFailedGamingSurrenderEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- FailedGamingSurrender?.Invoke(sender, e, data, result);
- }
-
- public void OnBeforeGamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- BeforeGamingUpdateInfo?.Invoke(sender, e, data, result);
- }
-
- public void OnAfterGamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- AfterGamingUpdateInfo?.Invoke(sender, e, data, result);
- }
-
- public void OnSucceedGamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- SucceedGamingUpdateInfo?.Invoke(sender, e, data, result);
- }
-
- public void OnFailedGamingUpdateInfoEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- FailedGamingUpdateInfo?.Invoke(sender, e, data, result);
- }
-
- public void OnBeforeGamingPunishEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- BeforeGamingPunish?.Invoke(sender, e, data, result);
- }
-
- public void OnAfterGamingPunishEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- AfterGamingPunish?.Invoke(sender, e, data, result);
- }
-
- public void OnSucceedGamingPunishEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- SucceedGamingPunish?.Invoke(sender, e, data, result);
- }
-
- public void OnFailedGamingPunishEvent(object sender, GamingEventArgs e, Hashtable data, Hashtable result)
- {
- FailedGamingPunish?.Invoke(sender, e, data, result);
+ GamingPunish?.Invoke(sender, e, data);
}
}
}
diff --git a/Library/Common/Addon/GameModuleDepend.cs b/Library/Common/Addon/GameModuleDepend.cs
index 82c5d06..7898824 100644
--- a/Library/Common/Addon/GameModuleDepend.cs
+++ b/Library/Common/Addon/GameModuleDepend.cs
@@ -1,28 +1,84 @@
-namespace Milimoe.FunGame.Core.Library.Common.Addon
+using Milimoe.FunGame.Core.Api.Utility;
+using Milimoe.FunGame.Core.Entity;
+
+namespace Milimoe.FunGame.Core.Library.Common.Addon
{
///
- /// 模组的依赖集合
+ /// 模组的依赖集合
+ /// (地图名称()的数组)
+ /// (角色模组名称()的数组)
+ /// (技能模组名称()的数组)
+ /// (物品模组名称()的数组)
///
- public readonly struct GameModuleDepend(string[] Maps, string[] Characters, string[] Items, string[] Skills)
+ public readonly struct GameModuleDepend(string[] maps, string[] characters, string[] skills, string[] items)
{
///
/// 模组所使用的地图组
///
- public string[] Maps { get; } = Maps;
+ public string[] MapsDepend { get; } = maps;
///
/// 模组所使用的角色组
///
- public string[] Characters { get; } = Characters;
-
- ///
- /// 模组所使用的物品组
- ///
- public string[] Items { get; } = Items;
+ public string[] CharactersDepend { get; } = characters;
///
/// 模组所使用的技能组
///
- public string[] Skills { get; } = Skills;
+ public string[] SkillsDepend { get; } = skills;
+
+ ///
+ /// 模组所使用的物品组
+ ///
+ public string[] ItemsDepend { get; } = items;
+
+ ///
+ /// 实际使用的地图组对象
+ /// 请使用 自动填充,不要自己添加
+ ///
+ public List Maps { get; } = [];
+
+ ///
+ /// 实际使用的角色组对象
+ /// 请使用 自动填充,不要自己添加
+ ///
+ public List Characters { get; } = [];
+
+ ///
+ /// 实际使用的技能组对象
+ /// 请使用 自动填充,不要自己添加
+ ///
+ public List Skills { get; } = [];
+
+ ///
+ /// 实际使用的物品组对象
+ /// 请使用 自动填充,不要自己添加
+ ///
+ public List
- Items { get; } = [];
+
+ ///
+ /// 获得所有的依赖项
+ /// 此方法会自动填充
+ ///
+ public void GetDependencies(GameModuleLoader loader)
+ {
+ Maps.Clear();
+ Characters.Clear();
+ Skills.Clear();
+ Items.Clear();
+ Maps.AddRange(loader.Maps.Keys.Where(MapsDepend.Contains).Select(str => loader.Maps[str]));
+ foreach (CharacterModule modules in loader.Characters.Keys.Where(CharactersDepend.Contains).Select(str => loader.Characters[str]))
+ {
+ Characters.AddRange(modules.Characters);
+ }
+ foreach (SkillModule modules in loader.Skills.Keys.Where(SkillsDepend.Contains).Select(str => loader.Skills[str]))
+ {
+ Skills.AddRange(modules.Skills);
+ }
+ foreach (ItemModule modules in loader.Items.Keys.Where(ItemsDepend.Contains).Select(str => loader.Items[str]))
+ {
+ Items.AddRange(modules.Items);
+ }
+ }
}
}
diff --git a/Library/Common/Addon/GameModuleServer.cs b/Library/Common/Addon/GameModuleServer.cs
index 25b85cc..c244e64 100644
--- a/Library/Common/Addon/GameModuleServer.cs
+++ b/Library/Common/Addon/GameModuleServer.cs
@@ -60,10 +60,10 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon
///
///
///
- ///
+ ///
///
///
- public abstract bool StartServer(string GameModule, Room Room, List Users, IServerModel RoomMasterServerModel, Dictionary OthersServerModel, params object[] Args);
+ public abstract bool StartServer(string GameModule, Room Room, List Users, IServerModel RoomMasterServerModel, Dictionary ServerModels, params object[] Args);
///
/// 接收并处理GamingMessage
diff --git a/Library/Common/Network/ClientSocket.cs b/Library/Common/Network/ClientSocket.cs
index fef4424..bac6577 100644
--- a/Library/Common/Network/ClientSocket.cs
+++ b/Library/Common/Network/ClientSocket.cs
@@ -54,15 +54,15 @@ namespace Milimoe.FunGame.Core.Library.Common.Network
return SocketResult.NotSent;
}
- public void BindEvent(Delegate Method, bool Remove = false)
+ public void BindEvent(Delegate method, bool remove = false)
{
- if (!Remove)
+ if (!remove)
{
- SocketManager.SocketReceive += (SocketManager.SocketReceiveHandler)Method;
+ SocketManager.SocketReceive += (SocketManager.SocketReceiveHandler)method;
}
else
{
- SocketManager.SocketReceive -= (SocketManager.SocketReceiveHandler)Method;
+ SocketManager.SocketReceive -= (SocketManager.SocketReceiveHandler)method;
}
}
diff --git a/Library/Common/Network/HTTPClient.cs b/Library/Common/Network/HTTPClient.cs
index 0138444..8b77099 100644
--- a/Library/Common/Network/HTTPClient.cs
+++ b/Library/Common/Network/HTTPClient.cs
@@ -86,6 +86,18 @@ namespace Milimoe.FunGame.Core.Library.Common.Network
return new(SocketMessageType.Unknown, Guid.Empty);
}
+ public void BindEvent(Delegate method, bool remove = false)
+ {
+ if (!remove)
+ {
+ SocketManager.SocketReceive += (SocketManager.SocketReceiveHandler)method;
+ }
+ else
+ {
+ SocketManager.SocketReceive -= (SocketManager.SocketReceiveHandler)method;
+ }
+ }
+
public void Close()
{
_Listening = false;
diff --git a/Library/Common/Network/Socket.cs b/Library/Common/Network/Socket.cs
index c410840..a3a32b6 100644
--- a/Library/Common/Network/Socket.cs
+++ b/Library/Common/Network/Socket.cs
@@ -65,15 +65,15 @@ namespace Milimoe.FunGame.Core.Library.Common.Network
}
}
- public void BindEvent(Delegate Method, bool Remove = false)
+ public void BindEvent(Delegate method, bool remove = false)
{
- if (!Remove)
+ if (!remove)
{
- SocketManager.SocketReceive += (SocketManager.SocketReceiveHandler)Method;
+ SocketManager.SocketReceive += (SocketManager.SocketReceiveHandler)method;
}
else
{
- SocketManager.SocketReceive -= (SocketManager.SocketReceiveHandler)Method;
+ SocketManager.SocketReceive -= (SocketManager.SocketReceiveHandler)method;
}
}
diff --git a/Library/Exception/Exception.cs b/Library/Exception/Exception.cs
index dcf109e..4f283ea 100644
--- a/Library/Exception/Exception.cs
+++ b/Library/Exception/Exception.cs
@@ -160,8 +160,13 @@
public override string Message => "构造对象实例遇到错误 (#10032)";
}
- public class ModuleServerNewDataRequestException : Exception
+ public class InvalidNewDataRequestException : Exception
{
- public override string Message => "试图在GameModuleServer类中创建数据请求 (#10033)";
+ public override string Message => "试图在不支持的类中创建数据请求 (#10033)";
+ }
+
+ public class AsyncRequestException : Exception
+ {
+ public override string Message => "数据请求必须以异步方式发送 (#10034)";
}
}
diff --git a/Model/Gaming.cs b/Model/Gaming.cs
index d903cfe..e4dfd84 100644
--- a/Model/Gaming.cs
+++ b/Model/Gaming.cs
@@ -23,10 +23,16 @@ namespace Milimoe.FunGame.Core.Model
///
public GamingEventArgs EventArgs { get; }
- private Gaming(GameModule module, Room room, List users)
+ ///
+ /// 此实例所属的玩家
+ ///
+ public User CurrentUser { get; }
+
+ private Gaming(GameModule module, Room room, User user, List users)
{
GameModule = module;
EventArgs = new(room, users);
+ CurrentUser = user;
}
///
@@ -34,12 +40,16 @@ namespace Milimoe.FunGame.Core.Model
///
///
///
+ ///
///
+ ///
///
///
- public static Gaming StartGame(GameModule module, Room room, List users, params object[] args)
+ public static Gaming StartGame(GameModule module, Room room, User user, List users, GameModuleLoader loader, params object[] args)
{
- Gaming instance = new(module, room, users);
+ Gaming instance = new(module, room, user, users);
+ // 读取模组的依赖集合
+ module.GameModuleDepend.GetDependencies(loader);
// 新建线程来启动模组的界面
TaskUtility.NewTask(() =>
{
@@ -57,437 +67,174 @@ namespace Milimoe.FunGame.Core.Model
///
/// 消息类型
/// 接收到的数据
- /// 底层会将哈希表中的数据发送给服务器
- public Hashtable GamingHandler(GamingType type, Hashtable data)
+ public void GamingHandler(GamingType type, Hashtable data)
{
- Hashtable result = [];
switch (type)
{
case GamingType.Connect:
- Connect(data, result);
+ Connect(data);
break;
case GamingType.Disconnect:
- Disconnect(data, result);
+ Disconnect(data);
break;
case GamingType.Reconnect:
- Reconnect(data, result);
+ Reconnect(data);
break;
case GamingType.BanCharacter:
- BanCharacter(data, result);
+ BanCharacter(data);
break;
case GamingType.PickCharacter:
- PickCharacter(data, result);
+ PickCharacter(data);
break;
case GamingType.Random:
- Random(data, result);
+ Random(data);
break;
case GamingType.Round:
- Round(data, result);
+ Round(data);
break;
case GamingType.LevelUp:
- LevelUp(data, result);
+ LevelUp(data);
break;
case GamingType.Move:
- Move(data, result);
+ Move(data);
break;
case GamingType.Attack:
- Attack(data, result);
+ Attack(data);
break;
case GamingType.Skill:
- Skill(data, result);
+ Skill(data);
break;
case GamingType.Item:
- Item(data, result);
+ Item(data);
break;
case GamingType.Magic:
- Magic(data, result);
+ Magic(data);
break;
case GamingType.Buy:
- Buy(data, result);
+ Buy(data);
break;
case GamingType.SuperSkill:
- SuperSkill(data, result);
+ SuperSkill(data);
break;
case GamingType.Pause:
- Pause(data, result);
+ Pause(data);
break;
case GamingType.Unpause:
- Unpause(data, result);
+ Unpause(data);
break;
case GamingType.Surrender:
- Surrender(data, result);
+ Surrender(data);
break;
case GamingType.UpdateInfo:
- UpdateInfo(data, result);
+ UpdateInfo(data);
break;
case GamingType.Punish:
- Punish(data, result);
+ Punish(data);
break;
case GamingType.None:
default:
break;
}
- return result;
}
- private void Connect(Hashtable data, Hashtable result)
+ private void Connect(Hashtable data)
{
- GameModule.OnBeforeGamingConnectEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingConnectEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingConnectEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingConnectEvent(this, EventArgs, data, result);
+ GameModule.OnGamingConnectEvent(this, EventArgs, data);
}
- private void Disconnect(Hashtable data, Hashtable result)
+ private void Disconnect(Hashtable data)
{
- GameModule.OnBeforeGamingDisconnectEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingDisconnectEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingDisconnectEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingDisconnectEvent(this, EventArgs, data, result);
+ GameModule.OnGamingDisconnectEvent(this, EventArgs, data);
}
- private void Reconnect(Hashtable data, Hashtable result)
+ private void Reconnect(Hashtable data)
{
- GameModule.OnBeforeGamingReconnectEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingReconnectEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingReconnectEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingReconnectEvent(this, EventArgs, data, result);
+ GameModule.OnGamingReconnectEvent(this, EventArgs, data);
}
- private void BanCharacter(Hashtable data, Hashtable result)
+ private void BanCharacter(Hashtable data)
{
- GameModule.OnBeforeGamingBanCharacterEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingBanCharacterEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingBanCharacterEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingBanCharacterEvent(this, EventArgs, data, result);
+ GameModule.OnGamingBanCharacterEvent(this, EventArgs, data);
}
- private void PickCharacter(Hashtable data, Hashtable result)
+ private void PickCharacter(Hashtable data)
{
- GameModule.OnBeforeGamingPickCharacterEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingPickCharacterEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingPickCharacterEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingPickCharacterEvent(this, EventArgs, data, result);
+ GameModule.OnGamingPickCharacterEvent(this, EventArgs, data);
}
- private void Random(Hashtable data, Hashtable result)
+ private void Random(Hashtable data)
{
- GameModule.OnBeforeGamingRandomEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingRandomEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingRandomEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingRandomEvent(this, EventArgs, data, result);
+ GameModule.OnGamingRandomEvent(this, EventArgs, data);
}
- private void Round(Hashtable data, Hashtable result)
+ private void Round(Hashtable data)
{
- GameModule.OnBeforeGamingRoundEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingRoundEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingRoundEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingRoundEvent(this, EventArgs, data, result);
+ GameModule.OnGamingRoundEvent(this, EventArgs, data);
}
- private void LevelUp(Hashtable data, Hashtable result)
+ private void LevelUp(Hashtable data)
{
- GameModule.OnBeforeGamingLevelUpEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingLevelUpEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingLevelUpEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingLevelUpEvent(this, EventArgs, data, result);
+ GameModule.OnGamingLevelUpEvent(this, EventArgs, data);
}
- private void Move(Hashtable data, Hashtable result)
+ private void Move(Hashtable data)
{
- GameModule.OnBeforeGamingMoveEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingMoveEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingMoveEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingMoveEvent(this, EventArgs, data, result);
+ GameModule.OnGamingMoveEvent(this, EventArgs, data);
}
- private void Attack(Hashtable data, Hashtable result)
+ private void Attack(Hashtable data)
{
- GameModule.OnBeforeGamingAttackEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingAttackEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingAttackEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingAttackEvent(this, EventArgs, data, result);
+ GameModule.OnGamingAttackEvent(this, EventArgs, data);
}
- private void Skill(Hashtable data, Hashtable result)
+ private void Skill(Hashtable data)
{
- GameModule.OnBeforeGamingSkillEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingSkillEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingSkillEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingSkillEvent(this, EventArgs, data, result);
+ GameModule.OnGamingSkillEvent(this, EventArgs, data);
}
- private void Item(Hashtable data, Hashtable result)
+ private void Item(Hashtable data)
{
- GameModule.OnBeforeGamingItemEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingItemEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingItemEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingItemEvent(this, EventArgs, data, result);
+ GameModule.OnGamingItemEvent(this, EventArgs, data);
}
- private void Magic(Hashtable data, Hashtable result)
+ private void Magic(Hashtable data)
{
- GameModule.OnBeforeGamingMagicEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingMagicEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingMagicEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingMagicEvent(this, EventArgs, data, result);
+ GameModule.OnGamingMagicEvent(this, EventArgs, data);
}
- private void Buy(Hashtable data, Hashtable result)
+ private void Buy(Hashtable data)
{
- GameModule.OnBeforeGamingBuyEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingBuyEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingBuyEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingBuyEvent(this, EventArgs, data, result);
+ GameModule.OnGamingBuyEvent(this, EventArgs, data);
}
- private void SuperSkill(Hashtable data, Hashtable result)
+ private void SuperSkill(Hashtable data)
{
- GameModule.OnBeforeGamingSuperSkillEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingSuperSkillEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingSuperSkillEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingSuperSkillEvent(this, EventArgs, data, result);
+ GameModule.OnGamingSuperSkillEvent(this, EventArgs, data);
}
- private void Pause(Hashtable data, Hashtable result)
+ private void Pause(Hashtable data)
{
- GameModule.OnBeforeGamingPauseEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingPauseEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingPauseEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingPauseEvent(this, EventArgs, data, result);
+ GameModule.OnGamingPauseEvent(this, EventArgs, data);
}
- private void Unpause(Hashtable data, Hashtable result)
+ private void Unpause(Hashtable data)
{
- GameModule.OnBeforeGamingUnpauseEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingUnpauseEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingUnpauseEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingUnpauseEvent(this, EventArgs, data, result);
+ GameModule.OnGamingUnpauseEvent(this, EventArgs, data);
}
- private void Surrender(Hashtable data, Hashtable result)
+ private void Surrender(Hashtable data)
{
- GameModule.OnBeforeGamingSurrenderEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingSurrenderEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingSurrenderEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingSurrenderEvent(this, EventArgs, data, result);
+ GameModule.OnGamingSurrenderEvent(this, EventArgs, data);
}
- private void UpdateInfo(Hashtable data, Hashtable result)
+ private void UpdateInfo(Hashtable data)
{
- GameModule.OnBeforeGamingUpdateInfoEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingUpdateInfoEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingUpdateInfoEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingUpdateInfoEvent(this, EventArgs, data, result);
+ GameModule.OnGamingUpdateInfoEvent(this, EventArgs, data);
}
- private void Punish(Hashtable data, Hashtable result)
+ private void Punish(Hashtable data)
{
- GameModule.OnBeforeGamingPunishEvent(this, EventArgs, data, result);
- if (EventArgs.Cancel)
- {
- return;
- }
- if (!EventArgs.Cancel)
- {
- GameModule.OnSucceedGamingPunishEvent(this, EventArgs, data, result);
- }
- else
- {
- GameModule.OnFailedGamingPunishEvent(this, EventArgs, data, result);
- }
- GameModule.OnAfterGamingPunishEvent(this, EventArgs, data, result);
+ GameModule.OnGamingPunishEvent(this, EventArgs, data);
}
}
}
diff --git a/Service/AddonManager.cs b/Service/AddonManager.cs
index 50247f3..3110929 100644
--- a/Service/AddonManager.cs
+++ b/Service/AddonManager.cs
@@ -1,6 +1,6 @@
using System.Collections;
using System.Reflection;
-using Milimoe.FunGame.Core.Entity;
+using Milimoe.FunGame.Core.Interface.Addons;
using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Core.Library.Constant;
@@ -26,15 +26,17 @@ namespace Milimoe.FunGame.Core.Service
// 加载目录下所有的DLL
Assembly assembly = Assembly.LoadFrom(dll);
- // 遍历DLL中继承了Plugin的类型
foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Plugin))))
{
- Plugin? instance = (Plugin?)Activator.CreateInstance(type);
- if (instance != null && instance.Load(otherobjs) && instance.Name.Trim() != "")
+ AddAddonInstances(type, plugins, (instance) =>
{
- instance.Controller = new(instance, delegates);
- plugins.TryAdd(instance.Name, instance);
- }
+ if (instance.Load(otherobjs))
+ {
+ instance.Controller = new(instance, delegates);
+ return true;
+ }
+ return false;
+ });
}
}
@@ -51,7 +53,7 @@ namespace Milimoe.FunGame.Core.Service
///
///
///
- internal static Dictionary LoadGameModules(Dictionary modules, List characters, List skills, List- items, Hashtable delegates, params object[] otherobjs)
+ internal static Dictionary LoadGameModules(Dictionary modules, Dictionary characters, Dictionary skills, Dictionary items, Hashtable delegates, params object[] otherobjs)
{
if (!Directory.Exists(ReflectionSet.GameModuleFolderPath)) return modules;
@@ -61,40 +63,31 @@ namespace Milimoe.FunGame.Core.Service
{
Assembly assembly = Assembly.LoadFrom(dll);
- foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(GameModule))))
+ foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => typeof(IAddon).IsAssignableFrom(type)))
{
- GameModule? instance = (GameModule?)Activator.CreateInstance(type);
- if (instance != null && instance.Load(otherobjs) && instance.Name.Trim() != "")
+ if (type.IsSubclassOf(typeof(GameModule)))
{
- instance.Controller = new(instance, delegates);
- modules.TryAdd(instance.Name, instance);
+ AddAddonInstances(type, modules, (instance) =>
+ {
+ if (instance.Load(otherobjs))
+ {
+ instance.Controller = new(instance, delegates);
+ return true;
+ }
+ return false;
+ });
}
- }
-
- foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Character))))
- {
- Character? instance = (Character?)Activator.CreateInstance(type);
- if (instance != null && instance.Name.Trim() != "" && !characters.Contains(instance))
+ else if (type.IsSubclassOf(typeof(CharacterModule)))
{
- characters.Add(instance);
+ AddAddonInstances(type, characters, (instance) => instance.Load(otherobjs));
}
- }
-
- foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Skill))))
- {
- Skill? instance = (Skill?)Activator.CreateInstance(type);
- if (instance != null && instance.Name.Trim() != "" && !skills.Contains(instance))
+ else if (type.IsSubclassOf(typeof(SkillModule)))
{
- skills.Add(instance);
+ AddAddonInstances(type, skills, (instance) => instance.Load(otherobjs));
}
- }
-
- foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Item))))
- {
- Item? instance = (Item?)Activator.CreateInstance(type);
- if (instance != null && instance.Name.Trim() != "" && !items.Contains(instance))
+ else if (type.IsSubclassOf(typeof(ItemModule)))
{
- items.Add(instance);
+ AddAddonInstances(type, items, (instance) => instance.Load(otherobjs));
}
}
}
@@ -112,7 +105,7 @@ namespace Milimoe.FunGame.Core.Service
///
///
///
- internal static Dictionary LoadGameModulesForServer(Dictionary modules, List characters, List skills, List
- items, Hashtable delegates, params object[] otherobjs)
+ internal static Dictionary LoadGameModulesForServer(Dictionary modules, Dictionary characters, Dictionary skills, Dictionary items, Hashtable delegates, params object[] otherobjs)
{
if (!Directory.Exists(ReflectionSet.GameModuleFolderPath)) return modules;
@@ -122,40 +115,31 @@ namespace Milimoe.FunGame.Core.Service
{
Assembly assembly = Assembly.LoadFrom(dll);
- foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(GameModuleServer))))
+ foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => typeof(IAddon).IsAssignableFrom(type)))
{
- GameModuleServer? instance = (GameModuleServer?)Activator.CreateInstance(type);
- if (instance != null && instance.Load(otherobjs) && instance.Name.Trim() != "")
+ if (type.IsSubclassOf(typeof(GameModuleServer)))
{
- instance.Controller = new(instance, delegates);
- modules.TryAdd(instance.Name, instance);
+ AddAddonInstances(type, modules, (instance) =>
+ {
+ if (instance.Load(otherobjs))
+ {
+ instance.Controller = new(instance, delegates);
+ return true;
+ }
+ return false;
+ });
}
- }
-
- foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Character))))
- {
- Character? instance = (Character?)Activator.CreateInstance(type);
- if (instance != null && instance.Name.Trim() != "" && !characters.Contains(instance))
+ else if (type.IsSubclassOf(typeof(CharacterModule)))
{
- characters.Add(instance);
+ AddAddonInstances(type, characters, (instance) => instance.Load(otherobjs));
}
- }
-
- foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Skill))))
- {
- Skill? instance = (Skill?)Activator.CreateInstance(type);
- if (instance != null && instance.Name.Trim() != "" && !skills.Contains(instance))
+ else if (type.IsSubclassOf(typeof(SkillModule)))
{
- skills.Add(instance);
+ AddAddonInstances(type, skills, (instance) => instance.Load(otherobjs));
}
- }
-
- foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(Item))))
- {
- Item? instance = (Item?)Activator.CreateInstance(type);
- if (instance != null && instance.Name.Trim() != "" && !items.Contains(instance))
+ else if (type.IsSubclassOf(typeof(ItemModule)))
{
- items.Add(instance);
+ AddAddonInstances(type, items, (instance) => instance.Load(otherobjs));
}
}
}
@@ -181,15 +165,31 @@ namespace Milimoe.FunGame.Core.Service
foreach (Type type in assembly.GetTypes().AsEnumerable().Where(type => type.IsSubclassOf(typeof(GameMap))))
{
- GameMap? instance = (GameMap?)Activator.CreateInstance(type);
- if (instance != null && instance.Load(objs) && instance.Name.Trim() != "")
- {
- maps.TryAdd(instance.Name, instance);
- }
+ AddAddonInstances(type, maps, (instance) => instance.Load(objs));
}
}
return maps;
}
+
+ ///
+ /// 添加构造好的模组类实例到字典中
+ ///
+ /// 加载的类型
+ /// 循环程序集的类型
+ /// 实例的字典
+ /// 加载时触发的检查方法,返回false不添加
+ private static void AddAddonInstances(Type type, Dictionary dictionary, Func? isadd = null) where T : IAddon
+ {
+ T? instance = (T?)Activator.CreateInstance(type);
+ if (instance != null)
+ {
+ string name = instance.Name;
+ if (!string.IsNullOrWhiteSpace(name) && (isadd == null || isadd(instance)))
+ {
+ dictionary.TryAdd(name.Trim(), instance);
+ }
+ }
+ }
}
}
\ No newline at end of file