forked from project-redbud/FunGame-Core
服务器插件优化;物品添加魔法技能组,文本优化 (#100)
* 添加了 SQLHelperFactory;完善了物品的描述信息;一些代码风格修改 * 构造的物品默认 1 级;为服务器插件添加控制器;添加邮件发送器的工厂;在物品中添加魔法技能组
This commit is contained in:
parent
3477b08a6c
commit
b25698d91b
@ -12,7 +12,10 @@ namespace Milimoe.FunGame.Core.Api.OpenEntityAdapter
|
||||
if (config[key] is Item prev)
|
||||
{
|
||||
Item next = prev.Copy();
|
||||
if (next is T t) config[key] = t;
|
||||
if (next is T t)
|
||||
{
|
||||
config[key] = t;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -38,47 +38,47 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
|
||||
/// <summary>
|
||||
/// 创建邮件服务
|
||||
/// </summary>
|
||||
/// <param name="SenderMailAddress"></param>
|
||||
/// <param name="SenderName"></param>
|
||||
/// <param name="SenderPassword"></param>
|
||||
/// <param name="Host"></param>
|
||||
/// <param name="Port"></param>
|
||||
/// <param name="OpenSSL"></param>
|
||||
public MailSender(string SenderMailAddress, string SenderName, string SenderPassword, string Host, int Port, bool OpenSSL)
|
||||
/// <param name="senderMailAddress"></param>
|
||||
/// <param name="senderName"></param>
|
||||
/// <param name="senderPassword"></param>
|
||||
/// <param name="host"></param>
|
||||
/// <param name="port"></param>
|
||||
/// <param name="ssl"></param>
|
||||
public MailSender(string senderMailAddress, string senderName, string senderPassword, string host, int port, bool ssl)
|
||||
{
|
||||
MailSenderID = Guid.NewGuid();
|
||||
_SmtpClientInfo = new SmtpClientInfo(SenderMailAddress, SenderName, SenderPassword, Host, Port, OpenSSL);
|
||||
_SmtpClientInfo = new SmtpClientInfo(senderMailAddress, senderName, senderPassword, host, port, ssl);
|
||||
if (!MailManager.MailSenders.ContainsKey(MailSenderID)) MailManager.MailSenders.Add(MailSenderID, this);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 创建完整邮件对象
|
||||
/// </summary>
|
||||
/// <param name="Subject"></param>
|
||||
/// <param name="Body"></param>
|
||||
/// <param name="Priority"></param>
|
||||
/// <param name="HTML"></param>
|
||||
/// <param name="ToList"></param>
|
||||
/// <param name="CCList"></param>
|
||||
/// <param name="BCCList"></param>
|
||||
/// <param name="subject"></param>
|
||||
/// <param name="body"></param>
|
||||
/// <param name="priority"></param>
|
||||
/// <param name="html"></param>
|
||||
/// <param name="toList"></param>
|
||||
/// <param name="ccList"></param>
|
||||
/// <param name="bccList"></param>
|
||||
/// <returns></returns>
|
||||
public MailObject CreateMail(string Subject, string Body, MailPriority Priority, bool HTML, string[] ToList, string[]? CCList = null, string[]? BCCList = null)
|
||||
public MailObject CreateMail(string subject, string body, MailPriority priority, bool html, string[] toList, string[]? ccList = null, string[]? bccList = null)
|
||||
{
|
||||
return new MailObject(this, Subject, Body, Priority, HTML, ToList, CCList, BCCList);
|
||||
return new MailObject(this, subject, body, priority, html, toList, ccList, bccList);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发送邮件
|
||||
/// </summary>
|
||||
/// <param name="Mail"></param>
|
||||
/// <param name="mail"></param>
|
||||
/// <returns></returns>
|
||||
public MailSendResult Send(MailObject Mail)
|
||||
public MailSendResult Send(MailObject mail)
|
||||
{
|
||||
_LastestResult = MailManager.Send(this, Mail, out _ErrorMsg);
|
||||
_LastestResult = MailManager.Send(this, mail, out _ErrorMsg);
|
||||
return _LastestResult;
|
||||
}
|
||||
|
||||
private bool IsDisposed = false;
|
||||
private bool _isDisposed = false;
|
||||
|
||||
/// <summary>
|
||||
/// 关闭邮件服务
|
||||
@ -92,17 +92,17 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
|
||||
/// <summary>
|
||||
/// 关闭邮件服务
|
||||
/// </summary>
|
||||
/// <param name="Disposing"></param>
|
||||
protected void Dispose(bool Disposing)
|
||||
/// <param name="disposing"></param>
|
||||
protected void Dispose(bool disposing)
|
||||
{
|
||||
if (!IsDisposed)
|
||||
if (!_isDisposed)
|
||||
{
|
||||
if (Disposing)
|
||||
if (disposing)
|
||||
{
|
||||
MailManager.Dispose(this);
|
||||
}
|
||||
}
|
||||
IsDisposed = true;
|
||||
_isDisposed = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -8,7 +8,7 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
|
||||
/// <summary>
|
||||
/// 需要在Server中继承此类实现
|
||||
/// </summary>
|
||||
public abstract class SQLHelper : ISQLHelper
|
||||
public abstract class SQLHelper : ISQLHelper, IDisposable
|
||||
{
|
||||
public abstract FunGameInfo.FunGame FunGameType { get; }
|
||||
public abstract SQLMode Mode { get; }
|
||||
@ -29,9 +29,9 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
|
||||
/// <summary>
|
||||
/// 执行一个指定的命令
|
||||
/// </summary>
|
||||
/// <param name="Script">命令</param>
|
||||
/// <param name="script">命令</param>
|
||||
/// <returns>影响的行数</returns>
|
||||
public abstract int Execute(string Script);
|
||||
public abstract int Execute(string script);
|
||||
|
||||
/// <summary>
|
||||
/// 查询DataSet
|
||||
@ -42,9 +42,9 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
|
||||
/// <summary>
|
||||
/// 执行指定的命令查询DataSet
|
||||
/// </summary>
|
||||
/// <param name="Script">命令</param>
|
||||
/// <param name="script">命令</param>
|
||||
/// <returns>结果集</returns>
|
||||
public abstract DataSet ExecuteDataSet(string Script);
|
||||
public abstract DataSet ExecuteDataSet(string script);
|
||||
|
||||
/// <summary>
|
||||
/// 执行指定的命令查询DataRow(可选实现)
|
||||
@ -52,16 +52,21 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
|
||||
/// <returns>结果行</returns>
|
||||
public virtual DataRow? ExecuteDataRow()
|
||||
{
|
||||
return null;
|
||||
return ExecuteDataRow(Script);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 执行指定的命令查询DataRow(可选实现)
|
||||
/// </summary>
|
||||
/// <param name="Script">命令</param>
|
||||
/// <param name="script">命令</param>
|
||||
/// <returns>结果行</returns>
|
||||
public virtual DataRow? ExecuteDataRow(string Script)
|
||||
public virtual DataRow? ExecuteDataRow(string script)
|
||||
{
|
||||
DataSet dataSet = ExecuteDataSet(script);
|
||||
if (dataSet.Tables.Count > 0 && dataSet.Tables[0].Rows.Count > 0)
|
||||
{
|
||||
return dataSet.Tables[0].Rows[0];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -84,5 +89,10 @@ namespace Milimoe.FunGame.Core.Api.Transmittal
|
||||
/// 回滚事务
|
||||
/// </summary>
|
||||
public abstract void Rollback();
|
||||
|
||||
/// <summary>
|
||||
/// 释放资源
|
||||
/// </summary>
|
||||
public abstract void Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,8 +1,10 @@
|
||||
using System.Data;
|
||||
using Milimoe.FunGame.Core.Api.EntityFactory;
|
||||
using Milimoe.FunGame.Core.Api.OpenEntityAdapter;
|
||||
using Milimoe.FunGame.Core.Api.Transmittal;
|
||||
using Milimoe.FunGame.Core.Entity;
|
||||
using Milimoe.FunGame.Core.Library.Constant;
|
||||
using Milimoe.FunGame.Core.Library.Exception;
|
||||
using Milimoe.FunGame.Core.Library.SQLScript.Entity;
|
||||
|
||||
namespace Milimoe.FunGame.Core.Api.Utility
|
||||
@ -80,78 +82,127 @@ namespace Milimoe.FunGame.Core.Api.Utility
|
||||
if (typeof(T) == typeof(Character))
|
||||
{
|
||||
foreach (EntityFactoryDelegate<Character> d in CharacterFactories)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (d.Invoke(id, name, args) is T character)
|
||||
{
|
||||
return character;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
TXTHelper.AppendErrorLog(e.GetErrorInfo());
|
||||
}
|
||||
}
|
||||
return (T)(object)GetCharacter();
|
||||
}
|
||||
if (typeof(T) == typeof(Inventory))
|
||||
{
|
||||
foreach (EntityFactoryDelegate<Inventory> d in InventoryFactories)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (d.Invoke(id, name, args) is T inventory)
|
||||
{
|
||||
return inventory;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
TXTHelper.AppendErrorLog(e.GetErrorInfo());
|
||||
}
|
||||
}
|
||||
return (T)(object)GetInventory();
|
||||
}
|
||||
if (typeof(T) == typeof(Skill))
|
||||
{
|
||||
foreach (EntityFactoryDelegate<Skill> d in SkillFactories)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (d.Invoke(id, name, args) is T skill)
|
||||
{
|
||||
return skill;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
TXTHelper.AppendErrorLog(e.GetErrorInfo());
|
||||
}
|
||||
}
|
||||
return (T)(object)new OpenSkill(id, name, args);
|
||||
}
|
||||
if (typeof(T) == typeof(Effect))
|
||||
{
|
||||
foreach (EntityFactoryDelegate<Effect> d in EffectFactories)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (d.Invoke(id, name, args) is T effect)
|
||||
{
|
||||
return effect;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
TXTHelper.AppendErrorLog(e.GetErrorInfo());
|
||||
}
|
||||
}
|
||||
return (T)(object)GetEffect();
|
||||
}
|
||||
if (typeof(T) == typeof(Item))
|
||||
{
|
||||
foreach (EntityFactoryDelegate<Item> d in ItemFactories)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (d.Invoke(id, name, args) is T item)
|
||||
{
|
||||
return item;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
TXTHelper.AppendErrorLog(e.GetErrorInfo());
|
||||
}
|
||||
}
|
||||
return (T)(object)GetItem();
|
||||
}
|
||||
if (typeof(T) == typeof(Room))
|
||||
{
|
||||
foreach (EntityFactoryDelegate<Room> d in RoomFactories)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (d.Invoke(id, name, args) is T room)
|
||||
{
|
||||
return room;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
TXTHelper.AppendErrorLog(e.GetErrorInfo());
|
||||
}
|
||||
}
|
||||
return (T)(object)GetRoom();
|
||||
}
|
||||
if (typeof(T) == typeof(User))
|
||||
{
|
||||
foreach (EntityFactoryDelegate<User> d in UserFactories)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (d.Invoke(id, name, args) is T user)
|
||||
{
|
||||
return user;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
TXTHelper.AppendErrorLog(e.GetErrorInfo());
|
||||
}
|
||||
}
|
||||
return (T)(object)GetUser();
|
||||
}
|
||||
throw new NotSupportedInstanceClassException();
|
||||
@ -197,6 +248,78 @@ namespace Milimoe.FunGame.Core.Api.Utility
|
||||
config.SaveConfig();
|
||||
}
|
||||
|
||||
internal HashSet<SQLHelperFactoryDelegate> SQLHelperFactories { get; } = [];
|
||||
|
||||
public delegate SQLHelper? SQLHelperFactoryDelegate();
|
||||
|
||||
/// <summary>
|
||||
/// 注册工厂方法 [SQLHelper]
|
||||
/// </summary>
|
||||
/// <param name="d"></param>
|
||||
public void RegisterFactory(SQLHelperFactoryDelegate d)
|
||||
{
|
||||
SQLHelperFactories.Add(d);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 构造一个 SQLHelper 实例
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public SQLHelper? GetSQLHelper()
|
||||
{
|
||||
foreach (SQLHelperFactoryDelegate d in SQLHelperFactories)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (d.Invoke() is SQLHelper helper)
|
||||
{
|
||||
return helper;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
TXTHelper.AppendErrorLog(e.GetErrorInfo());
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
internal HashSet<MailSenderFactoryDelegate> MailSenderFactories { get; } = [];
|
||||
|
||||
public delegate MailSender? MailSenderFactoryDelegate();
|
||||
|
||||
/// <summary>
|
||||
/// 注册工厂方法 [MailSender]
|
||||
/// </summary>
|
||||
/// <param name="d"></param>
|
||||
public void RegisterFactory(MailSenderFactoryDelegate d)
|
||||
{
|
||||
MailSenderFactories.Add(d);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 构造一个 MailSender 实例
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public MailSender? GetMailSender()
|
||||
{
|
||||
foreach (MailSenderFactoryDelegate d in MailSenderFactories)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (d.Invoke() is MailSender sender)
|
||||
{
|
||||
return sender;
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
TXTHelper.AppendErrorLog(e.GetErrorInfo());
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private readonly static CharacterFactory CharacterFactory = new();
|
||||
private readonly static InventoryFactory InventoryFactory = new();
|
||||
private readonly static SkillFactory SkillFactory = new();
|
||||
|
||||
@ -398,6 +398,27 @@ namespace Milimoe.FunGame.Core.Api.Utility
|
||||
|
||||
return $"{month}. {day}, {lastWriteTime.Year} {time}";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取下一次可交易的时间
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public static DateTime GetTradableTime(DateTime? date = null)
|
||||
{
|
||||
date ??= DateTime.Now;
|
||||
if (date is DateTime d)
|
||||
{
|
||||
if (d.Hour < 15)
|
||||
{
|
||||
return d.Date.AddDays(1).AddHours(15);
|
||||
}
|
||||
else
|
||||
{
|
||||
return d.Date.AddDays(2).AddHours(9);
|
||||
}
|
||||
}
|
||||
return DateTime.MinValue;
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
@ -125,7 +125,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
|
||||
WriteINI("Mailer", "Password", "");
|
||||
WriteINI("Mailer", "Host", "");
|
||||
WriteINI("Mailer", "Port", "587");
|
||||
WriteINI("Mailer", "OpenSSL", "true");
|
||||
WriteINI("Mailer", "SSL", "true");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -105,10 +105,10 @@ namespace Milimoe.FunGame.Core.Controller
|
||||
/// <param name="delegates"></param>
|
||||
public AddonController(IAddon addon, Dictionary<string, object> delegates) : base(addon, delegates)
|
||||
{
|
||||
if (delegates.ContainsKey("NewDataRequest")) MaskMethod_NewDataRequest = delegates["NewDataRequest"] != null ? (Func<DataRequestType, DataRequest>)delegates["NewDataRequest"]! : new(DefaultNewDataRequest);
|
||||
if (delegates.ContainsKey("NewLongRunningDataRequest")) MaskMethod_NewLongRunningDataRequest = delegates["NewLongRunningDataRequest"] != null ? (Func<DataRequestType, DataRequest>)delegates["NewLongRunningDataRequest"]! : new(DefaultNewDataRequest);
|
||||
if (delegates.ContainsKey("NewGamingRequest")) MaskMethod_NewGamingRequest = delegates["NewGamingRequest"] != null ? (Func<GamingType, DataRequest>)delegates["NewGamingRequest"]! : new(DefaultNewDataRequest);
|
||||
if (delegates.ContainsKey("NewLongRunningGamingRequest")) MaskMethod_NewLongRunningGamingRequest = delegates["NewLongRunningGamingRequest"] != null ? (Func<GamingType, DataRequest>)delegates["NewLongRunningGamingRequest"]! : new(DefaultNewDataRequest);
|
||||
if (delegates.TryGetValue("NewDataRequest", out object? value)) MaskMethod_NewDataRequest = value != null ? (Func<DataRequestType, DataRequest>)value : new(DefaultNewDataRequest);
|
||||
if (delegates.TryGetValue("NewLongRunningDataRequest", out value)) MaskMethod_NewLongRunningDataRequest = value != null ? (Func<DataRequestType, DataRequest>)value : new(DefaultNewDataRequest);
|
||||
if (delegates.TryGetValue("NewGamingRequest", out value)) MaskMethod_NewGamingRequest = value != null ? (Func<GamingType, DataRequest>)value : new(DefaultNewDataRequest);
|
||||
if (delegates.TryGetValue("NewLongRunningGamingRequest", out value)) MaskMethod_NewLongRunningGamingRequest = value != null ? (Func<GamingType, DataRequest>)value : new(DefaultNewDataRequest);
|
||||
MaskMethod_NewDataRequest ??= new(DefaultNewDataRequest);
|
||||
MaskMethod_NewLongRunningDataRequest ??= new(DefaultNewDataRequest);
|
||||
MaskMethod_NewGamingRequest ??= new(DefaultNewDataRequest);
|
||||
|
||||
111
Controller/ServerAddonController.cs
Normal file
111
Controller/ServerAddonController.cs
Normal file
@ -0,0 +1,111 @@
|
||||
using Milimoe.FunGame.Core.Api.Transmittal;
|
||||
using Milimoe.FunGame.Core.Api.Utility;
|
||||
using Milimoe.FunGame.Core.Interface.Addons;
|
||||
using Milimoe.FunGame.Core.Library.SQLScript.Common;
|
||||
|
||||
namespace Milimoe.FunGame.Core.Controller
|
||||
{
|
||||
/// <summary>
|
||||
/// 这个控制器在 Base 的基础上添加了 SQLHelper 和 MailSender
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <remarks>
|
||||
/// 新建一个ServerAddonController
|
||||
/// </remarks>
|
||||
/// <param name="addon"></param>
|
||||
/// <param name="delegates"></param>
|
||||
public class ServerAddonController<T>(IAddon addon, Dictionary<string, object> delegates) : BaseAddonController<T>(addon, delegates), IServerAddon where T : IAddon
|
||||
{
|
||||
/// <summary>
|
||||
/// 数据库连接器
|
||||
/// </summary>
|
||||
public SQLHelper? SQLHelper => _sqlHelper;
|
||||
|
||||
/// <summary>
|
||||
/// 邮件发送器
|
||||
/// </summary>
|
||||
public MailSender? MailSender => _mailSender;
|
||||
|
||||
private SQLHelper? _sqlHelper = null;
|
||||
private MailSender? _mailSender = null;
|
||||
private Task? _sqlPolling = null;
|
||||
private CancellationTokenSource? _cts = null;
|
||||
|
||||
/// <summary>
|
||||
/// 新建 SQLHelper
|
||||
/// </summary>
|
||||
public void NewSQLHelper()
|
||||
{
|
||||
if (_sqlHelper is null)
|
||||
{
|
||||
// 创建持久化 SQLHelper
|
||||
_sqlHelper = Factory.OpenFactory.GetSQLHelper();
|
||||
if (_sqlHelper != null)
|
||||
{
|
||||
_cts = new();
|
||||
_sqlPolling = Task.Run(async () =>
|
||||
{
|
||||
await Task.Delay(30);
|
||||
while (true)
|
||||
{
|
||||
if (_cts.Token.IsCancellationRequested)
|
||||
{
|
||||
break;
|
||||
}
|
||||
// 每两小时触发一次SQL服务器的心跳查询,防止SQL服务器掉线
|
||||
try
|
||||
{
|
||||
await Task.Delay(2 * 1000 * 3600);
|
||||
_sqlHelper?.ExecuteDataSet(ServerLoginLogs.Select_GetLastLoginTime());
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
break;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Error(e);
|
||||
}
|
||||
}
|
||||
}, _cts.Token);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteLine("已经创建过 SQLHelper 实例。");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 新建 MailSender
|
||||
/// </summary>
|
||||
public void NewMailSender()
|
||||
{
|
||||
if (_mailSender is null)
|
||||
{
|
||||
_mailSender = Factory.OpenFactory.GetMailSender();
|
||||
}
|
||||
else
|
||||
{
|
||||
WriteLine("已经创建过 MailSender 实例。");
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 关闭插件的服务
|
||||
/// </summary>
|
||||
public async void Close()
|
||||
{
|
||||
_mailSender?.Dispose();
|
||||
_mailSender = null;
|
||||
_cts?.Cancel();
|
||||
if (_sqlPolling != null)
|
||||
{
|
||||
await _sqlPolling;
|
||||
_sqlPolling.Dispose();
|
||||
_sqlPolling = null;
|
||||
}
|
||||
_cts?.Dispose();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1,5 +1,4 @@
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Text;
|
||||
using Milimoe.FunGame.Core.Api.Utility;
|
||||
using Milimoe.FunGame.Core.Interface.Entity;
|
||||
using Milimoe.FunGame.Core.Library.Constant;
|
||||
|
||||
@ -48,6 +48,23 @@
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 增加所有抗性,传入负数来减少
|
||||
/// </summary>
|
||||
/// <param name="value"></param>
|
||||
public void AddAllValue(double value)
|
||||
{
|
||||
None += value;
|
||||
Particle += value;
|
||||
Fleabane += value;
|
||||
Element += value;
|
||||
Shadow += value;
|
||||
Bright += value;
|
||||
PurityContemporary += value;
|
||||
PurityNatural += value;
|
||||
Starmark += value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 复制一个魔法抗性对象
|
||||
/// </summary>
|
||||
|
||||
@ -1,5 +1,4 @@
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Text;
|
||||
using System.Text;
|
||||
using Milimoe.FunGame.Core.Api.Utility;
|
||||
using Milimoe.FunGame.Core.Interface.Base;
|
||||
using Milimoe.FunGame.Core.Interface.Entity;
|
||||
@ -140,6 +139,14 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
e.Source = _character;
|
||||
}
|
||||
}
|
||||
foreach (Skill skill in Skills.Magics)
|
||||
{
|
||||
skill.Character = _character;
|
||||
foreach (Effect e in skill.Effects)
|
||||
{
|
||||
e.Source = _character;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -153,6 +160,11 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
/// </summary>
|
||||
public SkillGroup Skills { get; set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// 其他内容
|
||||
/// </summary>
|
||||
public Dictionary<string, object> Others { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 当装备物品时
|
||||
/// </summary>
|
||||
@ -175,6 +187,13 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach (Skill skill in Skills.Magics)
|
||||
{
|
||||
if (Character != null && skill.IsMagic && skill.Level > 0)
|
||||
{
|
||||
Character.Skills.Add(skill);
|
||||
}
|
||||
}
|
||||
if (Character != null) OnItemEquipped(Character, this, type);
|
||||
}
|
||||
|
||||
@ -185,15 +204,6 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
{
|
||||
if (Character != null)
|
||||
{
|
||||
if (Skills.Active != null)
|
||||
{
|
||||
List<Effect> effects = Character.Effects.Where(e => e.Skill == Skills.Active && e.Level > 0).ToList();
|
||||
foreach (Effect e in effects)
|
||||
{
|
||||
Character.Effects.Remove(e);
|
||||
e.OnEffectLost(Character);
|
||||
}
|
||||
}
|
||||
foreach (Skill skill in Skills.Passives)
|
||||
{
|
||||
List<Effect> effects = Character.Effects.Where(e => e.Skill == skill && e.Level > 0).ToList();
|
||||
@ -203,6 +213,10 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
e.OnEffectLost(Character);
|
||||
}
|
||||
}
|
||||
foreach (Skill skill in Skills.Magics)
|
||||
{
|
||||
Character.Skills.Remove(skill);
|
||||
}
|
||||
switch (type)
|
||||
{
|
||||
case EquipSlotType.MagicCardPack:
|
||||
@ -241,6 +255,10 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
{
|
||||
skill.GamingQueue = queue;
|
||||
}
|
||||
foreach (Skill skill in Skills.Magics)
|
||||
{
|
||||
skill.GamingQueue = queue;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@ -346,19 +364,44 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
/// 显示物品的详细信息
|
||||
/// </summary>
|
||||
/// <param name="isShowGeneralDescription">是否显示通用描述,而不是描述</param>
|
||||
/// <param name="isShowInStore">是否在商店中显示</param>
|
||||
/// <returns></returns>
|
||||
public string ToString(bool isShowGeneralDescription)
|
||||
public string ToString(bool isShowGeneralDescription, bool isShowInStore = false)
|
||||
{
|
||||
StringBuilder builder = new();
|
||||
|
||||
builder.AppendLine($"【{Name}】");
|
||||
builder.AppendLine($"{ItemSet.GetItemTypeName(ItemType) + (ItemType == ItemType.Weapon && WeaponType != WeaponType.None ? "-" + ItemSet.GetWeaponTypeName(WeaponType) : "")}" + (IsPurchasable && Price > 0 ? $" 售价:{Price}" : ""));
|
||||
|
||||
string itemquality = ItemSet.GetQualityTypeName(QualityType);
|
||||
string itemtype = ItemSet.GetItemTypeName(ItemType) + (ItemType == ItemType.Weapon && WeaponType != WeaponType.None ? "-" + ItemSet.GetWeaponTypeName(WeaponType) : "");
|
||||
if (itemtype != "") itemtype = $" {itemtype}";
|
||||
|
||||
builder.AppendLine($"{itemquality + itemtype}");
|
||||
|
||||
if (isShowInStore && Price > 0)
|
||||
{
|
||||
builder.AppendLine($"售价:{Price} {General.GameplayEquilibriumConstant.InGameCurrency}");
|
||||
}
|
||||
|
||||
if (RemainUseTimes > 0)
|
||||
{
|
||||
builder.AppendLine($"剩余可用次数:{RemainUseTimes}");
|
||||
builder.AppendLine($"{(isShowInStore ? "" : "剩余")}可用次数:{RemainUseTimes}");
|
||||
}
|
||||
|
||||
if (isShowInStore)
|
||||
{
|
||||
if (IsSellable)
|
||||
{
|
||||
builder.AppendLine($"购买此物品后可立即出售");
|
||||
}
|
||||
if (IsTradable)
|
||||
{
|
||||
DateTime date = DateTimeUtility.GetTradableTime();
|
||||
builder.AppendLine($"购买此物品后将在 {date.ToString(General.GeneralDateTimeFormatChinese)} 后可交易");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
List<string> sellandtrade = [""];
|
||||
if (IsSellable)
|
||||
{
|
||||
@ -368,17 +411,27 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
{
|
||||
sellandtrade.Add("可交易");
|
||||
}
|
||||
builder.AppendLine(string.Join(" ", sellandtrade).Trim());
|
||||
|
||||
if (!IsSellable && NextSellableTime != DateTime.MinValue)
|
||||
{
|
||||
builder.AppendLine($"此物品将在 {NextSellableTime.ToString(General.GeneralDateTimeFormatChinese)} 后可出售");
|
||||
}
|
||||
else if (!IsSellable)
|
||||
{
|
||||
sellandtrade.Add("不可出售");
|
||||
}
|
||||
|
||||
if (!IsTradable && NextTradableTime != DateTime.MinValue)
|
||||
{
|
||||
builder.AppendLine($"此物品将在 {NextTradableTime.ToString(General.GeneralDateTimeFormatChinese)} 后可交易");
|
||||
}
|
||||
else if (!IsTradable)
|
||||
{
|
||||
sellandtrade.Add("不可交易");
|
||||
}
|
||||
|
||||
builder.AppendLine(string.Join(" ", sellandtrade).Trim());
|
||||
}
|
||||
|
||||
if (isShowGeneralDescription && GeneralDescription != "")
|
||||
{
|
||||
@ -388,6 +441,12 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
{
|
||||
builder.AppendLine("物品描述:" + Description);
|
||||
}
|
||||
if (ItemType == ItemType.MagicCardPack && Skills.Magics.Count > 0)
|
||||
{
|
||||
builder.AppendLine("== 魔法卡 ==\r\n" + string.Join("\r\n", Skills.Magics.Select(m => m.ToString().Trim())));
|
||||
}
|
||||
|
||||
builder.AppendLine("== 物品技能 ==");
|
||||
|
||||
if (Skills.Active != null) builder.AppendLine($"{Skills.Active.ToString().Trim()}");
|
||||
foreach (Skill skill in Skills.Passives)
|
||||
@ -461,17 +520,24 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
item.NextTradableTime = NextTradableTime;
|
||||
item.RemainUseTimes = RemainUseTimes;
|
||||
item.Skills.Active = Skills.Active?.Copy();
|
||||
if (item.Skills.Active != null && copyLevel)
|
||||
if (item.Skills.Active != null)
|
||||
{
|
||||
item.Skills.Active.Level = Skills.Active?.Level ?? 0;
|
||||
item.Skills.Active.Level = copyLevel ? (Skills.Active?.Level ?? 1) : 1;
|
||||
}
|
||||
foreach (Skill skill in Skills.Passives)
|
||||
{
|
||||
Skill newskill = skill.Copy();
|
||||
newskill.Item = item;
|
||||
newskill.Level = copyLevel ? skill.Level : 0;
|
||||
newskill.Level = copyLevel ? skill.Level : 1;
|
||||
item.Skills.Passives.Add(newskill);
|
||||
}
|
||||
foreach (Skill skill in Skills.Magics)
|
||||
{
|
||||
Skill newskill = skill.Copy();
|
||||
newskill.Item = item;
|
||||
newskill.Level = copyLevel ? skill.Level : 1;
|
||||
item.Skills.Magics.Add(newskill);
|
||||
}
|
||||
return item;
|
||||
}
|
||||
|
||||
@ -491,6 +557,22 @@ namespace Milimoe.FunGame.Core.Entity
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置所有魔法的等级
|
||||
/// </summary>
|
||||
/// <param name="level"></param>
|
||||
public void SetMagicsLevel(int level)
|
||||
{
|
||||
if (Skills.Active != null)
|
||||
{
|
||||
Skills.Active.Level = level;
|
||||
}
|
||||
foreach (Skill skill in Skills.Magics)
|
||||
{
|
||||
skill.Level = level;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 所属的角色
|
||||
/// </summary>
|
||||
|
||||
@ -2,6 +2,7 @@
|
||||
{
|
||||
/// <summary>
|
||||
/// 物品只有一个主动技能,但是可以有很多个被动技能
|
||||
/// <para>魔法卡包具有很多个魔法技能</para>
|
||||
/// </summary>
|
||||
public class SkillGroup
|
||||
{
|
||||
@ -14,5 +15,10 @@
|
||||
/// 被动技能组
|
||||
/// </summary>
|
||||
public HashSet<Skill> Passives { get; set; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 魔法技能组
|
||||
/// </summary>
|
||||
public HashSet<Skill> Magics { get; set; } = [];
|
||||
}
|
||||
}
|
||||
|
||||
@ -4,7 +4,7 @@ using Milimoe.FunGame.Core.Library.Constant;
|
||||
|
||||
namespace Milimoe.FunGame.Core.Interface.Addons
|
||||
{
|
||||
public interface IGameModuleServer : IAddon, IServerAddon, IAddonController<IGameModuleServer>, IGameModuleDepend
|
||||
public interface IGameModuleServer : IAddon, IAddonController<IGameModuleServer>, IGameModuleDepend
|
||||
{
|
||||
public bool StartServer(string GameModule, Room Room, List<User> Users, IServerModel RoomMasterServerModel, Dictionary<string, IServerModel> ServerModels, params object[] args);
|
||||
|
||||
|
||||
@ -1,5 +1,3 @@
|
||||
using Milimoe.FunGame.Core.Api.Transmittal;
|
||||
using Milimoe.FunGame.Core.Api.Utility;
|
||||
using Milimoe.FunGame.Core.Controller;
|
||||
using Milimoe.FunGame.Core.Entity;
|
||||
using Milimoe.FunGame.Core.Interface.Addons;
|
||||
@ -44,26 +42,25 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon
|
||||
/// <summary>
|
||||
/// 包含了一些常用方法的控制器
|
||||
/// </summary>
|
||||
public BaseAddonController<IGameModuleServer> Controller
|
||||
public ServerAddonController<IGameModuleServer> Controller
|
||||
{
|
||||
get => _Controller ?? throw new NotImplementedException();
|
||||
set => _Controller = value;
|
||||
internal set => _Controller = value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// base控制器
|
||||
/// </summary>
|
||||
BaseAddonController<IGameModuleServer> IAddonController<IGameModuleServer>.Controller
|
||||
{
|
||||
get => Controller;
|
||||
set => _Controller = (ServerAddonController<IGameModuleServer>?)value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 控制器内部变量
|
||||
/// </summary>
|
||||
private BaseAddonController<IGameModuleServer>? _Controller;
|
||||
|
||||
/// <summary>
|
||||
/// 全局数据库连接器
|
||||
/// </summary>
|
||||
public SQLHelper? SQLHelper => Singleton.Get<SQLHelper>();
|
||||
|
||||
/// <summary>
|
||||
/// 全局邮件发送器
|
||||
/// </summary>
|
||||
public MailSender? MailSender => Singleton.Get<MailSender>();
|
||||
private ServerAddonController<IGameModuleServer>? _Controller;
|
||||
|
||||
/// <summary>
|
||||
/// 启动服务器监听 请在此处实现服务器逻辑
|
||||
|
||||
@ -1,13 +1,11 @@
|
||||
using Milimoe.FunGame.Core.Api.Transmittal;
|
||||
using Milimoe.FunGame.Core.Api.Utility;
|
||||
using Milimoe.FunGame.Core.Controller;
|
||||
using Milimoe.FunGame.Core.Controller;
|
||||
using Milimoe.FunGame.Core.Interface;
|
||||
using Milimoe.FunGame.Core.Interface.Addons;
|
||||
using Milimoe.FunGame.Core.Library.Common.Event;
|
||||
|
||||
namespace Milimoe.FunGame.Core.Library.Common.Addon
|
||||
{
|
||||
public abstract class ServerPlugin : IPlugin, IServerAddon
|
||||
public abstract class ServerPlugin : IPlugin
|
||||
{
|
||||
/// <summary>
|
||||
/// 插件名称
|
||||
@ -32,26 +30,25 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon
|
||||
/// <summary>
|
||||
/// 包含了一些常用方法的控制器
|
||||
/// </summary>
|
||||
public BaseAddonController<IPlugin> Controller
|
||||
public ServerAddonController<IPlugin> Controller
|
||||
{
|
||||
get => _Controller ?? throw new NotImplementedException();
|
||||
set => _Controller = value;
|
||||
internal set => _Controller = value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 全局数据库连接器
|
||||
/// base控制器
|
||||
/// </summary>
|
||||
public SQLHelper? SQLHelper => Singleton.Get<SQLHelper>();
|
||||
|
||||
/// <summary>
|
||||
/// 全局邮件发送器
|
||||
/// </summary>
|
||||
public MailSender? MailSender => Singleton.Get<MailSender>();
|
||||
BaseAddonController<IPlugin> IAddonController<IPlugin>.Controller
|
||||
{
|
||||
get => Controller;
|
||||
set => _Controller = (ServerAddonController<IPlugin>?)value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 控制器内部变量
|
||||
/// </summary>
|
||||
private BaseAddonController<IPlugin>? _Controller;
|
||||
private ServerAddonController<IPlugin>? _Controller;
|
||||
|
||||
/// <summary>
|
||||
/// 加载标记
|
||||
|
||||
@ -1,11 +1,9 @@
|
||||
using Milimoe.FunGame.Core.Api.Transmittal;
|
||||
using Milimoe.FunGame.Core.Api.Utility;
|
||||
using Milimoe.FunGame.Core.Controller;
|
||||
using Milimoe.FunGame.Core.Controller;
|
||||
using Milimoe.FunGame.Core.Interface.Addons;
|
||||
|
||||
namespace Milimoe.FunGame.Core.Library.Common.Addon
|
||||
{
|
||||
public abstract class WebAPIPlugin : IAddon, IServerAddon, IAddonController<IAddon>
|
||||
public abstract class WebAPIPlugin : IAddon, IAddonController<IAddon>
|
||||
{
|
||||
/// <summary>
|
||||
/// 插件名称
|
||||
@ -30,38 +28,37 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon
|
||||
/// <summary>
|
||||
/// 包含了一些常用方法的控制器
|
||||
/// </summary>
|
||||
public BaseAddonController<IAddon> Controller
|
||||
public ServerAddonController<IAddon> Controller
|
||||
{
|
||||
get => _Controller ?? throw new NotImplementedException();
|
||||
set => _Controller = value;
|
||||
internal set => _Controller = value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// base控制器
|
||||
/// </summary>
|
||||
BaseAddonController<IAddon> IAddonController<IAddon>.Controller
|
||||
{
|
||||
get => Controller;
|
||||
set => _Controller = (ServerAddonController<IAddon>?)value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 控制器内部变量
|
||||
/// </summary>
|
||||
private BaseAddonController<IAddon>? _Controller;
|
||||
|
||||
/// <summary>
|
||||
/// 全局数据库连接器
|
||||
/// </summary>
|
||||
public SQLHelper? SQLHelper => Singleton.Get<SQLHelper>();
|
||||
|
||||
/// <summary>
|
||||
/// 全局邮件发送器
|
||||
/// </summary>
|
||||
public MailSender? MailSender => Singleton.Get<MailSender>();
|
||||
private ServerAddonController<IAddon>? _Controller;
|
||||
|
||||
/// <summary>
|
||||
/// 加载标记
|
||||
/// </summary>
|
||||
private bool IsLoaded = false;
|
||||
private bool _isLoaded = false;
|
||||
|
||||
/// <summary>
|
||||
/// 加载插件
|
||||
/// </summary>
|
||||
public bool Load(params object[] objs)
|
||||
{
|
||||
if (IsLoaded)
|
||||
if (_isLoaded)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@ -69,9 +66,9 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon
|
||||
if (BeforeLoad(objs))
|
||||
{
|
||||
// 插件加载后,不允许再次加载此插件
|
||||
IsLoaded = true;
|
||||
_isLoaded = true;
|
||||
}
|
||||
return IsLoaded;
|
||||
return _isLoaded;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -94,6 +94,14 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
|
||||
SkillGroup skills = NetworkUtility.JsonDeserialize<SkillGroup>(ref reader, options) ?? new();
|
||||
result.Skills.Active = skills.Active;
|
||||
result.Skills.Passives = skills.Passives;
|
||||
result.Skills.Magics = skills.Magics;
|
||||
break;
|
||||
case nameof(Item.Others):
|
||||
Dictionary<string, object> values = NetworkUtility.JsonDeserialize<Dictionary<string, object>>(ref reader, options) ?? [];
|
||||
foreach (string key in values.Keys)
|
||||
{
|
||||
result.Others.Add(key, values[key]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -129,6 +137,8 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
|
||||
}
|
||||
writer.WritePropertyName(nameof(Item.Skills));
|
||||
JsonSerializer.Serialize(writer, value.Skills, options);
|
||||
writer.WritePropertyName(nameof(Item.Others));
|
||||
JsonSerializer.Serialize(writer, value.Others, options);
|
||||
|
||||
writer.WriteEndObject();
|
||||
}
|
||||
|
||||
@ -39,17 +39,17 @@ namespace Milimoe.FunGame.Core.Library.Common.Network
|
||||
/// <summary>
|
||||
/// 收件人列表
|
||||
/// </summary>
|
||||
public List<string> ToList { get; } = new();
|
||||
public List<string> ToList { get; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 抄送列表
|
||||
/// </summary>
|
||||
public List<string> CCList { get; } = new();
|
||||
public List<string> CCList { get; } = [];
|
||||
|
||||
/// <summary>
|
||||
/// 密送列表
|
||||
/// </summary>
|
||||
public List<string> BCCList { get; } = new();
|
||||
public List<string> BCCList { get; } = [];
|
||||
|
||||
public MailObject()
|
||||
{
|
||||
@ -59,80 +59,80 @@ namespace Milimoe.FunGame.Core.Library.Common.Network
|
||||
/// <summary>
|
||||
/// 使用MailSender工具类创建邮件对象
|
||||
/// </summary>
|
||||
/// <param name="Sender"></param>
|
||||
public MailObject(MailSender Sender)
|
||||
/// <param name="sender"></param>
|
||||
public MailObject(MailSender sender)
|
||||
{
|
||||
this.Sender = Sender.SmtpClientInfo.SenderMailAddress;
|
||||
this.SenderName = Sender.SmtpClientInfo.SenderName;
|
||||
this.Sender = sender.SmtpClientInfo.SenderMailAddress;
|
||||
this.SenderName = sender.SmtpClientInfo.SenderName;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用地址和名称创建邮件对象
|
||||
/// </summary>
|
||||
/// <param name="Sender"></param>
|
||||
/// <param name="SenderName"></param>
|
||||
public MailObject(string Sender, string SenderName)
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="senderName"></param>
|
||||
public MailObject(string sender, string senderName)
|
||||
{
|
||||
this.Sender = Sender;
|
||||
this.SenderName = SenderName;
|
||||
this.Sender = sender;
|
||||
this.SenderName = senderName;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用地址和名称创建邮件对象,同时写主题、内容、单个收件人
|
||||
/// </summary>
|
||||
/// <param name="Sender"></param>
|
||||
/// <param name="Subject"></param>
|
||||
/// <param name="Body"></param>
|
||||
/// <param name="To"></param>
|
||||
public MailObject(MailSender Sender, string Subject, string Body, string To)
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="subject"></param>
|
||||
/// <param name="body"></param>
|
||||
/// <param name="to"></param>
|
||||
public MailObject(MailSender sender, string subject, string body, string to)
|
||||
{
|
||||
this.Sender = Sender.SmtpClientInfo.SenderMailAddress;
|
||||
this.SenderName = Sender.SmtpClientInfo.SenderName;
|
||||
this.Subject = Subject;
|
||||
this.Body = Body;
|
||||
ToList.Add(To);
|
||||
this.Sender = sender.SmtpClientInfo.SenderMailAddress;
|
||||
this.SenderName = sender.SmtpClientInfo.SenderName;
|
||||
this.Subject = subject;
|
||||
this.Body = body;
|
||||
ToList.Add(to);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用地址和名称创建邮件对象,同时写主题、内容、单个收件人、单个抄送
|
||||
/// </summary>
|
||||
/// <param name="Sender"></param>
|
||||
/// <param name="Subject"></param>
|
||||
/// <param name="Body"></param>
|
||||
/// <param name="To"></param>
|
||||
/// <param name="CC"></param>
|
||||
public MailObject(MailSender Sender, string Subject, string Body, string To, string CC)
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="subject"></param>
|
||||
/// <param name="body"></param>
|
||||
/// <param name="to"></param>
|
||||
/// <param name="cc"></param>
|
||||
public MailObject(MailSender sender, string subject, string body, string to, string cc)
|
||||
{
|
||||
this.Sender = Sender.SmtpClientInfo.SenderMailAddress;
|
||||
this.SenderName = Sender.SmtpClientInfo.SenderName;
|
||||
this.Subject = Subject;
|
||||
this.Body = Body;
|
||||
ToList.Add(To);
|
||||
CCList.Add(CC);
|
||||
this.Sender = sender.SmtpClientInfo.SenderMailAddress;
|
||||
this.SenderName = sender.SmtpClientInfo.SenderName;
|
||||
this.Subject = subject;
|
||||
this.Body = body;
|
||||
ToList.Add(to);
|
||||
CCList.Add(cc);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 完整的创建邮件对象
|
||||
/// </summary>
|
||||
/// <param name="Sender"></param>
|
||||
/// <param name="Subject"></param>
|
||||
/// <param name="Body"></param>
|
||||
/// <param name="Priority"></param>
|
||||
/// <param name="HTML"></param>
|
||||
/// <param name="ToList"></param>
|
||||
/// <param name="CCList"></param>
|
||||
/// <param name="BCCList"></param>
|
||||
public MailObject(MailSender Sender, string Subject, string Body, MailPriority Priority, bool HTML, string[] ToList, string[]? CCList = null, string[]? BCCList = null)
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="subject"></param>
|
||||
/// <param name="body"></param>
|
||||
/// <param name="priority"></param>
|
||||
/// <param name="html"></param>
|
||||
/// <param name="toList"></param>
|
||||
/// <param name="ccList"></param>
|
||||
/// <param name="bccList"></param>
|
||||
public MailObject(MailSender sender, string subject, string body, MailPriority priority, bool html, string[] toList, string[]? ccList = null, string[]? bccList = null)
|
||||
{
|
||||
this.Sender = Sender.SmtpClientInfo.SenderMailAddress;
|
||||
this.SenderName = Sender.SmtpClientInfo.SenderName;
|
||||
this.Subject = Subject;
|
||||
this.Body = Body;
|
||||
this.Priority = Priority;
|
||||
this.HTML = HTML;
|
||||
AddTo(ToList);
|
||||
if (CCList != null) AddCC(CCList);
|
||||
if (BCCList != null) AddBCC(BCCList);
|
||||
Sender = sender.SmtpClientInfo.SenderMailAddress;
|
||||
SenderName = sender.SmtpClientInfo.SenderName;
|
||||
Subject = subject;
|
||||
Body = body;
|
||||
Priority = priority;
|
||||
HTML = html;
|
||||
AddTo(toList);
|
||||
if (ccList != null) AddCC(ccList);
|
||||
if (bccList != null) AddBCC(bccList);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@ -482,6 +482,34 @@ namespace Milimoe.FunGame.Core.Library.Constant
|
||||
_ => EquipSlotType.None
|
||||
};
|
||||
}
|
||||
|
||||
public static string GetQualityTypeName(QualityType type)
|
||||
{
|
||||
return type switch
|
||||
{
|
||||
QualityType.Green => "优秀",
|
||||
QualityType.Blue => "稀有",
|
||||
QualityType.Purple => "史诗",
|
||||
QualityType.Orange => "传说",
|
||||
QualityType.Red => "神话",
|
||||
QualityType.Gold => "不朽",
|
||||
_ => "普通"
|
||||
};
|
||||
}
|
||||
|
||||
public static QualityType GetQualityTypeFromName(string name)
|
||||
{
|
||||
return name switch
|
||||
{
|
||||
"优秀" => QualityType.Green,
|
||||
"稀有" => QualityType.Blue,
|
||||
"史诗" => QualityType.Purple,
|
||||
"传说" => QualityType.Orange,
|
||||
"神话" => QualityType.Red,
|
||||
"不朽" => QualityType.Gold,
|
||||
_ => QualityType.White
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
public class SkillSet
|
||||
|
||||
@ -28,6 +28,19 @@
|
||||
public const string FunGame_Version = "v1.0";
|
||||
public const string FunGame_VersionPatch = "";
|
||||
|
||||
public const string FunGameCoreTitle = @" _____ _ _ _ _ ____ _ __ __ _____ ____ ___ ____ _____
|
||||
| ___| | | | \ | |/ ___| / \ | \/ | ____| / ___/ _ \| _ \| ____|
|
||||
| |_ | | | | \| | | _ / _ \ | |\/| | _| | | | | | | |_) | _|
|
||||
| _| | |_| | |\ | |_| |/ ___ \| | | | |___ | |__| |_| | _ <| |___
|
||||
|_| \___/|_| \_|\____/_/ \_\_| |_|_____| \____\___/|_| \_\_____|
|
||||
";
|
||||
|
||||
public const string FunGameServerTitle = @" _____ _ _ _ _ ____ _ __ __ _____ ____ _____ ______ _______ ____
|
||||
| ___| | | | \ | |/ ___| / \ | \/ | ____| / ___|| ____| _ \ \ / / ____| _ \
|
||||
| |_ | | | | \| | | _ / _ \ | |\/| | _| \___ \| _| | |_) \ \ / /| _| | |_) |
|
||||
| _| | |_| | |\ | |_| |/ ___ \| | | | |___ ___) | |___| _ < \ V / | |___| _ <
|
||||
|_| \___/|_| \_|\____/_/ \_\_| |_|_____| |____/|_____|_| \_\ \_/ |_____|_| \_\
|
||||
";
|
||||
public static string GetInfo(FunGame FunGameType)
|
||||
{
|
||||
string type = FunGameType switch
|
||||
|
||||
@ -753,7 +753,8 @@ namespace Milimoe.FunGame.Core.Library.Constant
|
||||
Blue,
|
||||
Purple,
|
||||
Orange,
|
||||
Red
|
||||
Red,
|
||||
Gold
|
||||
}
|
||||
|
||||
public enum RarityType
|
||||
|
||||
@ -4,28 +4,21 @@ namespace Milimoe.FunGame.Core.Model
|
||||
{
|
||||
public class SmtpClientInfo : IMailSender
|
||||
{
|
||||
public string Host => _Host;
|
||||
public int Port => _Port;
|
||||
public bool OpenSSL => _OpenSSL;
|
||||
public string SenderMailAddress => _SenderMailAddress;
|
||||
public string SenderName => _SenderName;
|
||||
public string SenderPassword => _SenderPassword;
|
||||
public string SenderMailAddress { get; set; } = "";
|
||||
public string SenderName { get; set; } = "";
|
||||
public string SenderPassword { get; set; } = "";
|
||||
public string Host { get; set; } = "";
|
||||
public int Port { get; set; } = 587;
|
||||
public bool SSL { get; set; } = false;
|
||||
|
||||
private string _Host = "";
|
||||
private int _Port = 587;
|
||||
private bool _OpenSSL = true;
|
||||
private string _SenderMailAddress = "";
|
||||
private string _SenderName = "";
|
||||
private string _SenderPassword = "";
|
||||
|
||||
internal SmtpClientInfo(string SenderMailAddress, string SenderName, string SenderPassword, string Host, int Port, bool OpenSSL)
|
||||
internal SmtpClientInfo(string senderMailAddress, string senderName, string senderPassword, string host, int port, bool ssl)
|
||||
{
|
||||
_Host = Host;
|
||||
_Port = Port;
|
||||
_OpenSSL = OpenSSL;
|
||||
_SenderMailAddress = SenderMailAddress;
|
||||
_SenderName = SenderName;
|
||||
_SenderPassword = SenderPassword;
|
||||
SenderMailAddress = senderMailAddress;
|
||||
SenderName = senderName;
|
||||
SenderPassword = senderPassword;
|
||||
Host = host;
|
||||
Port = port;
|
||||
SSL = ssl;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -25,11 +25,11 @@ namespace Milimoe.FunGame.Core.Service
|
||||
/// <summary>
|
||||
/// 获取某个已经保存过的邮件服务
|
||||
/// </summary>
|
||||
/// <param name="MailSenderID"></param>
|
||||
/// <param name="mailSenderID"></param>
|
||||
/// <returns></returns>
|
||||
internal static MailSender? GetSender(Guid MailSenderID)
|
||||
internal static MailSender? GetSender(Guid mailSenderID)
|
||||
{
|
||||
if (MailSenders.TryGetValue(MailSenderID, out MailSender? value))
|
||||
if (MailSenders.TryGetValue(mailSenderID, out MailSender? value))
|
||||
{
|
||||
return value;
|
||||
}
|
||||
@ -39,60 +39,60 @@ namespace Milimoe.FunGame.Core.Service
|
||||
/// <summary>
|
||||
/// 统一调用此方法发送邮件
|
||||
/// </summary>
|
||||
/// <param name="Sender"></param>
|
||||
/// <param name="Mail"></param>
|
||||
/// <param name="ErrorMsg"></param>
|
||||
/// <param name="sender"></param>
|
||||
/// <param name="mail"></param>
|
||||
/// <param name="errorMsg"></param>
|
||||
/// <returns></returns>
|
||||
internal static MailSendResult Send(MailSender Sender, MailObject Mail, out string ErrorMsg)
|
||||
internal static MailSendResult Send(MailSender sender, MailObject mail, out string errorMsg)
|
||||
{
|
||||
ErrorMsg = "";
|
||||
errorMsg = "";
|
||||
try
|
||||
{
|
||||
SmtpClientInfo Info = Sender.SmtpClientInfo;
|
||||
SmtpClient Smtp;
|
||||
Guid MailSenderID = Sender.MailSenderID;
|
||||
if (!SmtpClients.TryGetValue(MailSenderID, out SmtpClient? value))
|
||||
SmtpClientInfo info = sender.SmtpClientInfo;
|
||||
SmtpClient smtp;
|
||||
Guid senderID = sender.MailSenderID;
|
||||
if (!SmtpClients.TryGetValue(senderID, out SmtpClient? value))
|
||||
{
|
||||
Smtp = new()
|
||||
smtp = new()
|
||||
{
|
||||
Host = Info.Host,
|
||||
Port = Info.Port,
|
||||
EnableSsl = Info.OpenSSL,
|
||||
Host = info.Host,
|
||||
Port = info.Port,
|
||||
EnableSsl = info.SSL,
|
||||
DeliveryMethod = SmtpDeliveryMethod.Network,
|
||||
Credentials = new NetworkCredential(Info.SenderMailAddress, Info.SenderPassword)
|
||||
Credentials = new NetworkCredential(info.SenderMailAddress, info.SenderPassword)
|
||||
};
|
||||
SmtpClients.Add(MailSenderID, Smtp);
|
||||
SmtpClients.Add(senderID, smtp);
|
||||
}
|
||||
else Smtp = value;
|
||||
else smtp = value;
|
||||
MailMessage Msg = new()
|
||||
{
|
||||
Subject = Mail.Subject,
|
||||
Subject = mail.Subject,
|
||||
SubjectEncoding = General.DefaultEncoding,
|
||||
Body = Mail.Body,
|
||||
Body = mail.Body,
|
||||
BodyEncoding = General.DefaultEncoding,
|
||||
From = new MailAddress(Mail.Sender, Mail.SenderName, General.DefaultEncoding),
|
||||
IsBodyHtml = Mail.HTML,
|
||||
Priority = Mail.Priority
|
||||
From = new MailAddress(mail.Sender, mail.SenderName, General.DefaultEncoding),
|
||||
IsBodyHtml = mail.HTML,
|
||||
Priority = mail.Priority
|
||||
};
|
||||
foreach (string To in Mail.ToList)
|
||||
foreach (string To in mail.ToList)
|
||||
{
|
||||
if (To.Trim() != "") Msg.To.Add(To);
|
||||
}
|
||||
foreach (string CC in Mail.CCList)
|
||||
foreach (string CC in mail.CCList)
|
||||
{
|
||||
if (CC.Trim() != "") Msg.CC.Add(CC);
|
||||
}
|
||||
foreach (string BCC in Mail.BCCList)
|
||||
foreach (string BCC in mail.BCCList)
|
||||
{
|
||||
if (BCC.Trim() != "") Msg.Bcc.Add(BCC);
|
||||
}
|
||||
Smtp.SendMailAsync(Msg);
|
||||
smtp.SendMailAsync(Msg);
|
||||
return MailSendResult.Success;
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
ErrorMsg = e.GetErrorInfo();
|
||||
Api.Utility.TXTHelper.AppendErrorLog(ErrorMsg);
|
||||
errorMsg = e.GetErrorInfo();
|
||||
Api.Utility.TXTHelper.AppendErrorLog(errorMsg);
|
||||
return MailSendResult.Fail;
|
||||
}
|
||||
}
|
||||
@ -100,18 +100,18 @@ namespace Milimoe.FunGame.Core.Service
|
||||
/// <summary>
|
||||
/// 关闭邮件服务
|
||||
/// </summary>
|
||||
/// <param name="Sender"></param>
|
||||
/// <param name="sender"></param>
|
||||
/// <returns></returns>
|
||||
internal static bool Dispose(MailSender Sender)
|
||||
internal static bool Dispose(MailSender sender)
|
||||
{
|
||||
try
|
||||
{
|
||||
Guid MailSenderID = Sender.MailSenderID;
|
||||
if (SmtpClients.TryGetValue(MailSenderID, out SmtpClient? value))
|
||||
Guid senderID = sender.MailSenderID;
|
||||
if (SmtpClients.TryGetValue(senderID, out SmtpClient? value))
|
||||
{
|
||||
value.Dispose();
|
||||
SmtpClients.Remove(MailSenderID);
|
||||
MailSenders.Remove(MailSenderID);
|
||||
SmtpClients.Remove(senderID);
|
||||
MailSenders.Remove(senderID);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user