FunGame.Core 需要配合Milimoe.FunGame.Core.Library.Constant.DataRequestType使用 确保已添加对应的枚举 数据请求结果 详细错误信息 私有的实现类 基于本地已连接的Socket创建新的数据请求 使用RunTimeModel中的NewDataRequest创建一个新的请求 添加数据 长时间运行的数据请求需要在使用完毕后自行关闭 向服务器发送数据请求 异步向服务器发送数据请求 获取指定key对应的反序列化对象 反序列化Hashtable中的Json对象 邮件服务内部ID Smtp客户端信息 上一个邮件发送的结果 上一个邮件的发送错误信息(如果发送失败) 内部变量 创建邮件服务 创建完整邮件对象 发送邮件 关闭邮件服务 关闭邮件服务 需要在Server中继承此类实现 执行一个命令 影响的行数 执行一个指定的命令 命令 影响的行数 查询DataSet 结果集 执行指定的命令查询DataSet 命令 结果集 执行指定的命令查询DataRow(可选实现) 结果行 执行指定的命令查询DataRow(可选实现) 命令 结果行 关闭连接 创建一个SQL事务 提交事务 回滚事务 获取角色实例 获取库存实例 获取物品实例,默认返回Passiveitem 被动物品 需要强制转换 Item类型 主动 或 被动 获取主动物品实例 获取被动物品实例 获取房间实例 房间内部序列号 房间号 创建时间 房主 房间类型 游戏模组 房间状态 房间密码 通过DataSet获取房间实例 通过DataSet获取房间列表 获取大厅(-1号房) 获取技能实例,默认返回PassiveSkill 被动技能 需要强制转换 Skill类型 主动 或 被动 获取主动技能实例 获取被动技能实例 获取用户实例 获取用户实例 获取用户实例 获取用户实例 网络服务工具箱 判断字符串是否是IP地址 判断字符串是否为邮箱地址 判断字符串是否是正常的用户名(只有中英文和数字) 获取用户名长度 判断字符串是否是一个FunGame可接受的服务器地址 判断参数是否是一个FunGame可接受的服务器地址 获取服务器的延迟 服务器IP地址 返回目标对象的Json字符串 返回目标对象的Json字符串 可指定反序列化选项 反序列化Json对象 反序列化Json对象 可指定反序列化选项 反序列化Hashtable中的Json对象 反序列化Hashtable中的Json对象 可指定反序列化选项 时间服务工具箱 获取系统时间 格式化类型 通过字符串转换为DateTime对象 时间字符串 转换失败返回当前时间 获取系统时间并转为字符串 格式化类型 获取系统短日期 获取系统日期 使用HMACSHA512算法加密 使用HMACSHA512算法加密 需要加密的值 秘钥 使用RSA算法加密 明文 公钥 使用RSA算法解密 密文 私钥 使用HMACSHA512算法加密 需要加密的值 秘钥 生成验证码 类型 长度 数字验证码 字母验证码 混合验证码 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步 开启一个计时器任务 See: , , 获取FunGame.Implement.dll中接口的实现方法 程序集 接口代号 获取接口实现类类名 接口类型 获取接口方法名(支持属性) 方法 公开方法:获取FunGame.Implement.DLL中指定方法(属性)的返回值 接口代号 方法代号(支持属性) 是否是方法(如是属性请传入false) 创建一个Json工具类 此工具类拥有单独的序列化选项,支持添加自定义转换器 继承自 序列化选项 已经默认添加了下列转换器: , , 注册一个自定义转换器,支持 注册多个自定义转换器,支持 获取Json字符串 反序列化Json对象 反序列化Json对象,此方法可能无法返回正确的类型,请注意辨别 反序列化Hashtable中Key对应的Json对象 反序列化多个Json对象 注意必须是相同的Json对象才可以使用此方法解析 Private JsonSerializerOptions 单例表:表中的对象以类名作为Key保存,并以Key获取该对象,Key具有唯一约束 用于储存单例对象使用 查询目标的类是否已经有实例 单例对象 将目标和目标的类添加至单例表 单例对象 添加单例到单例表时遇到错误 将目标和目标的类从单例表中移除 单例对象 获取单例对象 目标类 不能从单例表中获取到指定的单例 获取单例对象 目标类 不能从单例表中获取到指定的单例 默认的配置文件名称 写入ini文件 Section 文件名,缺省为FunGame.ini 读取ini文件 Section 文件名,缺省为FunGame.ini 读取到的值 查询ini文件是否存在 文件名,缺省为FunGame.ini 是否存在 初始化ini模板文件 读取TXT文件内容 文件名 相对路径 内容 Aka. 2FA 双重认证 双因素身份验证 SQLHelper 允许为空 不使用SQL模式 使用SQL模式 记录对应账号的密文到数据库中 检查账号是否需要2FA 2FA验证 每30秒刷新 6位数字2FA验证码 ----- PUBLIC KEY ----- ----- SECRET SIGN ----- 创键私钥,用于绑定账号,并生成两个文件,需要用户保存 生成随机秘钥字符串 生成基于当前时间戳的6位数字2FA验证码 获取当前时间节点 生成验证码 拆分字符串中的密文和私钥 此类实现服务器连接、断开连接、心跳检测、创建数据请求等功能 -- 需要继承并实现部分方法 -- 与服务器的连接套接字实例 套接字是否已经连接 接收服务器信息的线程 用于类内赋值 是否正在接收服务器信息 断开服务器连接 连接服务器 获取服务器地址 string:IP地址;int:端口号 此方法将在连接服务器前触发 客户端可以重写此方法 服务器IP 服务器端口 重写时可以提供额外的连接参数 false:中止连接 此方法将在连接服务器后触发(Connect结果返回前) 客户端可以重写此方法 连接服务器后返回的一些数据,可以使用也可以修改它们 客户端需要自行实现自动登录的事务 关闭所有连接 输出消息 自定处理异常的方法 -- 一般放在catch中 -- 基于本地已连接的Socket创建新的数据请求 基于本地已连接的Socket创建长时间运行的数据请求 开始接收服务器信息 获取服务器已发送的信息为SocketObject数组 具体接收服务器信息以及处理信息的方法 客户端接收到服务器断开连接的通知后的处理方法 客户端接收到服务器系统消息后的处理方法 客户端接收到服务器心跳后的处理方法 客户端接收到强制退出登录的通知后的处理方法 客户端接收到聊天信息后的处理方法 客户端接收到更换房主后的处理方法 客户端接收到匹配房间成功后的处理方法 客户端接收到开始游戏信息后的处理方法 客户端接收到游戏结束信息后的处理方法 客户端接收到局内消息后的处理方法 继承 AsyncAwaiter 用法: 1、调用Socket.Send()前,请设置为等待状态:SetWorking(); 2、调用Socket.Send() == Success后,请等待任务完成:WaitForWorkDone(); 3、在其他任何地方修改Working状态,均会使任务终止。 接收到的SocketObject实例 Socket 继承请调用base构造 Socket 继承请重写此方法 SocketObject 判断是否已经Disposed 公开的Dispose方法 关闭时 关闭事件 Controller关闭时事件 不建议new Dispose()方法,建议使用事件 事件会在base.Dispose()执行前触发 触发关闭事件 记录 的生涯、赛季统计数据 Key为赛季(long),每个key代表第key赛季,key = 0时为生涯数据。 窗体继承这些接口便能实现事件,或为插件预留。 局内事件的接口,与 配套使用 这是最基本的接口,要求客户端实现 服务端和客户端都应该实现这个接口,用于初始化支持的Mod列表 必须继承基类: 继承事件接口并实现其方法来使插件生效。例如继承: 地图名称 地图描述 地图版本 地图作者 宽度 高度 格子大小 加载标记 加载地图 加载后需要做的事 允许返回false来阻止加载此地图 模组名称 模组描述 模组版本 模组作者 模组所使用的地图 加载标记 加载模组 模组加载后需要做的事 允许返回false来阻止加载此模组 传递委托以便让模组调用 输出系统消息 基于本地已连接的Socket创建新的数据请求 基于本地已连接的Socket创建长时间运行的数据请求 Session对象 Config对象 绑定事件。在后触发 插件名称 插件描述 插件版本 插件作者 加载标记 加载插件 插件加载后需要做的事 允许返回false来阻止加载此插件 传递委托以便让插件调用 输出系统消息 基于本地已连接的Socket创建新的数据请求 基于本地已连接的Socket创建长时间运行的数据请求 Session对象 Config对象 绑定事件。在后触发 继承这个类可以获得异步等待的功能 参考实现 接收到的实例 是否处于等待的状态 异步操作前,请设置为等待状态 等待任务完成(需要自己异步) 异步等待任务完成 任务的等待器,可以设置在任务完成后需要的操作 任务是否完成 捕获到的异常 内部实现类 实现参见 构造一个等待器 返回TaskAwaiter可以连续的调用方法 但是意义不大,前一个OnCompleted方法并不会等待下一个方法 可以理解为并行广播 在捕获到异常时,将触发Error事件 发件人邮箱 发件人名称 邮件主题 邮件内容 邮件优先级 内容是否支持HTML 收件人列表 抄送列表 密送列表 使用MailSender工具类创建邮件对象 使用地址和名称创建邮件对象 使用地址和名称创建邮件对象,同时写主题、内容、单个收件人 使用地址和名称创建邮件对象,同时写主题、内容、单个收件人、单个抄送 完整的创建邮件对象 发送邮件 -- 适合创建一次性邮件并发送 -- 添加收件人 添加多个收件人 添加抄送 添加多个抄送 添加密送 添加多个密送 从参数列表中获取指定类型和索引的参数 类型 索引 类型的参数 索引超过数组上限 配合 使用,也别忘了修改 需要同步更新 将通信类型的枚举转换为字符串 通信类型 等效字符串 需要同步更新 RunTime Main Register Login Room Gaming 获取Type的等效字符串 获取Type的等效字符串 获取Type的等效字符串 获取字符串对应的枚举 添加-debug启动项将开启DebugMode(仅适用于Desktop或Console) 目前支持禁用心跳检测功能 此类保存常用的对象常量 空的实体类 用于object返回 默认的未知用户 大厅(空房间)实例 默认的字符编码 默认的时间格式 默认的时间值(1970年8月1日8点0分0秒) 最多自动重试连接次数 1C2G推荐的任务数量 2C2G推荐的任务数量 4C4G推荐的任务数量 默认Socket数据包大小 默认Stream传输大小 配合 使用,也别忘了修改 配合 使用,也别忘了修改 配合 使用 需要同步更新 需要同步更新 Commands 是否自动连接服务器 是否自动登录 是否在匹配中 是否连接上服务器 是否正在重连 是否自动重连 是否在房间中 当前所处的房间类型 服务器名称 公告 自动登录的账号 自动登录的密码 自动登录的秘钥 服务器IP地址 服务器端口号 SocketToken LoginKey 已登录的用户 已登录用户名 所处的房间 从plugins目录加载所有插件 从gamemodes目录加载所有模组 从gamemaps目录加载所有地图 默认的序列化选项 获取Json字符串 获取Json字符串 反序列化Json对象 反序列化Json对象 反序列化Json对象,此方法可能无法返回正确的类型,请注意辨别 反序列化Json对象,此方法可能无法返回正确的类型,请注意辨别 反序列化SocketObject中索引为index的Json对象 反序列化Hashtable中Key对应的Json对象 反序列化Hashtable中Key对应的Json对象 反序列化多个Json对象 注意必须是相同的Json对象才可以使用此方法解析 反序列化多个Json对象 注意必须是相同的Json对象才可以使用此方法解析 用于保存Smtp客户端 一个邮件服务对应一个Smtp客户端 用于保存邮件服务 允许服务器同时存在多个服务 获取某个已经保存过的邮件服务 统一调用此方法发送邮件 关闭邮件服务 目前的Model数量 最大接受的Model数量 可参与高并发的字典,但添加效率较低 Init ModelManager MaxModel 获取Model对象 Model的Key Model对象 向Model管理器中添加Model Model的Key Model对象 True:操作成功 从Model管理器中移除Model Model的Key True:操作成功 将Model移除,并取得这个Model Model的Key Model对象 被移除的Model 将Model移除,并取得这个Model Model的Key 被移除的Model 清空Model管理器 获取Model对象的列表 客户端专用Socket 服务器端专用Socket 创建服务器监听Socket 监听端口号 最大连接数量 服务器端专用Socket 创建一个监听到客户端Socket 客户端IP地址[0]和客户端Socket[1] 创建客户端Socket 服务器IP地址 服务器监听端口 客户端专用Socket 用于服务器端向客户端Socket发送信息 客户端Socket Socket信息容器 通信结果 用于客户端向服务器Socket发送信息 Socket信息容器 通信结果 用于客户端接收服务器信息 SocketObject 用于服务器接收客户端信息 客户端Socket SocketObject 用于客户端接收服务器信息(数组版) SocketObjects 用于服务器接收客户端信息(数组版) 客户端Socket SocketObjects 监听事件的委托 SocketObject 监听事件 触发异步监听事件 SocketObject 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步 开启一个任务:调用返回对象的OnCompleted()方法可以执行后续操作,支持异步 内部实现类 返回ITaskAwaiter可以进一步调用方法 但是意义不大,前一个OnCompleted方法并不会等待下一个方法 可以理解为并行广播 在捕获到异常时,将触发Error事件