From 5d4b5c989a99c5b08a3e9d0a309989ad80871050 Mon Sep 17 00:00:00 2001 From: Ls <2391972606@qq.com> Date: Mon, 15 Jun 2026 17:31:34 +0800 Subject: [PATCH 01/14] =?UTF-8?q?=E5=B1=B1=E5=AF=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Web/package-lock.json | 129 -------------- Web/src/config/BaseConfig.ts | 10 +- Web/src/extends/TimeExtend.ts | 195 +++++++++++---------- Web/src/pages/index.vue | 7 +- Web/src/pages/user/home/study/Practise.vue | 164 +++++++++++++++++ Web/src/pages/user/home/study/index.vue | 54 +++++- Web/src/pages/user/index.vue | 128 +++++++------- Web/src/services/user/PractiseService.ts | 33 ++++ 8 files changed, 428 insertions(+), 292 deletions(-) create mode 100644 Web/src/pages/user/home/study/Practise.vue create mode 100644 Web/src/services/user/PractiseService.ts diff --git a/Web/package-lock.json b/Web/package-lock.json index 0fec814..e06cb01 100644 --- a/Web/package-lock.json +++ b/Web/package-lock.json @@ -1856,9 +1856,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1876,9 +1873,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1896,9 +1890,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1916,9 +1907,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1936,9 +1924,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1956,9 +1941,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1976,9 +1958,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1996,9 +1975,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2220,9 +2196,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2240,9 +2213,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2260,9 +2230,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2280,9 +2247,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2300,9 +2264,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2320,9 +2281,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2340,9 +2298,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2360,9 +2315,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2594,9 +2546,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2614,9 +2563,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2634,9 +2580,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2654,9 +2597,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2674,9 +2614,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2694,9 +2631,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2714,9 +2648,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2734,9 +2665,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2959,9 +2887,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2983,9 +2908,6 @@ "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3007,9 +2929,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3031,9 +2950,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3055,9 +2971,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3079,9 +2992,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3572,9 +3482,6 @@ "arm" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3589,9 +3496,6 @@ "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3606,9 +3510,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3623,9 +3524,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3640,9 +3538,6 @@ "loong64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3657,9 +3552,6 @@ "loong64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3674,9 +3566,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3691,9 +3580,6 @@ "ppc64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3708,9 +3594,6 @@ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3725,9 +3608,6 @@ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3742,9 +3622,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3759,9 +3636,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -3776,9 +3650,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ diff --git a/Web/src/config/BaseConfig.ts b/Web/src/config/BaseConfig.ts index 5ef10a7..18c1514 100644 --- a/Web/src/config/BaseConfig.ts +++ b/Web/src/config/BaseConfig.ts @@ -2,8 +2,8 @@ 统一配置中心 */ export class BaseConfig { -public static BaseUrl:string="https://localhost:7198"; -public static BaseMediaUrl:string="https://localhost:7198"; -// public static BaseUrl:string="http://kx.iyba.cn:5291"; -// public static BaseMediaUrl:string="http://kx.iyba.cn:5291"; -} \ No newline at end of file + public static BaseUrl: string = 'https://192.168.0.142:7198' + public static BaseMediaUrl: string = 'https://192.168.0.142:7198' + // public static BaseUrl:string="http://kx.iyba.cn:5291"; + // public static BaseMediaUrl:string="http://kx.iyba.cn:5291"; +} diff --git a/Web/src/extends/TimeExtend.ts b/Web/src/extends/TimeExtend.ts index 192bb96..4846fa8 100644 --- a/Web/src/extends/TimeExtend.ts +++ b/Web/src/extends/TimeExtend.ts @@ -1,100 +1,115 @@ export class TimeExtend { - /** - * 格式化日期 - * @param date 日期对象/时间戳/日期字符串 - * @param format 格式化模板 - * 示例:yyyy-MM-dd、yyyy-MM-dd HH:mm:ss、HH:mm:ss、yyyy年MM月dd日 - */ - public static Format(date: Date | string | number, format = 'yyyy-MM-dd HH:mm:ss'): string { - let targetDate: Date - if (typeof date === 'number') { - date = date - 28800; - targetDate = date.toString().length === 10 ? new Date(date * 1000) : new Date(date) - } else { - targetDate = new Date(date) - } - - if (isNaN(targetDate.getTime())) return '' - - const year = targetDate.getFullYear() - const month = targetDate.getMonth() + 1 - const day = targetDate.getDate() - const hours = targetDate.getHours() - const minutes = targetDate.getMinutes() - const seconds = targetDate.getSeconds() - - const pad = (num: number) => num.toString().padStart(2, '0') - - return format - .replace('yyyy', String(year)) - .replace('MM', pad(month)) - .replace('dd', pad(day)) - .replace('HH', pad(hours)) - .replace('hh', pad(hours > 12 ? hours - 12 : hours)) - .replace('mm', pad(minutes)) - .replace('ss', pad(seconds)) + /** + * 格式化日期 + * @param date 日期对象/时间戳/日期字符串 + * @param format 格式化模板 + * 示例:yyyy-MM-dd、yyyy-MM-dd HH:mm:ss、HH:mm:ss、yyyy年MM月dd日 + */ + public static Format(date: Date | string | number, format = 'yyyy-MM-dd HH:mm:ss'): string { + let targetDate: Date + if (typeof date === 'number') { + date = date - 28800 + targetDate = date.toString().length === 10 ? new Date(date * 1000) : new Date(date) + } else { + targetDate = new Date(date) } - /** - * 获取当前时间格式化字符串 - * @param format 格式 - */ - public static Now(format = 'yyyy-MM-dd HH:mm:ss'): string { - return this.Format(new Date(), format) - } + if (isNaN(targetDate.getTime())) return '' - /** - * 获取当前毫秒时间戳 - */ - public static GetTimeStamp(): number { - return Date.now() - } + const year = targetDate.getFullYear() + const month = targetDate.getMonth() + 1 + const day = targetDate.getDate() + const hours = targetDate.getHours() + const minutes = targetDate.getMinutes() + const seconds = targetDate.getSeconds() - /** - * 获取当前秒级时间戳 - */ - public static GetSecondStamp(): number { - return Math.floor(Date.now() / 1000) + 28800 - } + const pad = (num: number) => num.toString().padStart(2, '0') - /** - * 获取当前日期 yyyy-MM-dd - */ - public static GetDateStr(): string { - return this.Now('yyyy-MM-dd') - } + return format + .replace('yyyy', String(year)) + .replace('MM', pad(month)) + .replace('dd', pad(day)) + .replace('HH', pad(hours)) + .replace('hh', pad(hours > 12 ? hours - 12 : hours)) + .replace('mm', pad(minutes)) + .replace('ss', pad(seconds)) + } - /** - * 获取当前时分秒 HH:mm:ss - */ - public static GetTimeStr(): string { - return this.Now('HH:mm:ss') - } + /** + * 获取当前时间格式化字符串 + * @param format 格式 + */ + public static Now(format = 'yyyy-MM-dd HH:mm:ss'): string { + return this.Format(new Date(), format) + } - /** - * 时间字符串 转换为 指定格式字符串 - * 场景:把 "2025-01-01 12:30:45" 转成 "2025年01月01日" / "01-01 12:30" 等 - * @param timeStr 时间字符串(如 2025-01-01、2025/01/01 12:30、2025-01-01 12:30:45) - * @param format 目标格式 - */ - public static StrToFormat(timeStr: string, format = 'yyyy-MM-dd HH:mm:ss'): string { - return this.Format(timeStr, format); - } - /** - * 时间字符串 转 日期对象 - * @param timeStr 时间字符串 - */ - public static StrToDate(timeStr: string): Date | null { - const date = new Date(timeStr); - return isNaN(date.getTime()) ? null : date; - } + /** + * 获取当前毫秒时间戳 + */ + public static GetTimeStamp(): number { + return Date.now() + } - /** - * 时间字符串 转 秒级时间戳 - * @param timeStr 时间字符串 - */ - public static StrToSecondStamp(timeStr: string): number | null { - const date = this.StrToDate(timeStr); - return date ? Math.floor(date.getTime() / 1000) : null; + /** + * 获取当前秒级时间戳 + */ + public static GetSecondStamp(): number { + return Math.floor(Date.now() / 1000) + 28800 + } + + /** + * 获取当前日期 yyyy-MM-dd + */ + public static GetDateStr(): string { + return this.Now('yyyy-MM-dd') + } + + /** + * 获取当前时分秒 HH:mm:ss + */ + public static GetTimeStr(): string { + return this.Now('HH:mm:ss') + } + + /** + * 时间字符串 转换为 指定格式字符串 + * 场景:把 "2025-01-01 12:30:45" 转成 "2025年01月01日" / "01-01 12:30" 等 + * @param timeStr 时间字符串(如 2025-01-01、2025/01/01 12:30、2025-01-01 12:30:45) + * @param format 目标格式 + */ + public static StrToFormat(timeStr: string, format = 'yyyy-MM-dd HH:mm:ss'): string { + return this.Format(timeStr, format) + } + /** + * 时间字符串 转 日期对象 + * @param timeStr 时间字符串 + */ + public static StrToDate(timeStr: string): Date | null { + const date = new Date(timeStr) + return isNaN(date.getTime()) ? null : date + } + + /** + * 时间字符串 转 秒级时间戳 + * @param timeStr 时间字符串 + */ + public static StrToSecondStamp(timeStr: string): number | null { + const date = this.StrToDate(timeStr) + return date ? Math.floor(date.getTime() / 1000) : null + } + + /** + * 计算目标时间与当前时间的剩余分钟数 + * @param timeStr 时间字符串 + */ + public static GetRemainingMinutes(timeStr: string): number { + const target = new Date(timeStr.replace(/-/g, '/')) + const now = new Date() + const diffMs = target.getTime() - now.getTime() + if (Math.floor(diffMs / 1000 / 60) <= 0) { + return 0 + } else { + return Math.floor(diffMs / 1000 / 60) } -} \ No newline at end of file + } +} diff --git a/Web/src/pages/index.vue b/Web/src/pages/index.vue index 33c05f7..461dd5a 100644 --- a/Web/src/pages/index.vue +++ b/Web/src/pages/index.vue @@ -31,8 +31,9 @@
- 【{{ item.areaId }}区】{{ item.nick }}({{ (item.sex == null || item.sex == '') ? - "未知" : item.sex }}) + 【{{ item.areaId }}区】{{ item.nick }}({{ (item.sex == null || item.sex + == '') ? + "未知" : item.sex }})
@@ -128,7 +129,7 @@ const Initialize = async (): Promise => { /**自动登录 */ const login = async (code: string): Promise => { - let result = await LoginService.TwLogin(code); + let result = await LoginService.TwLogin(code); if (result.code == 0) { StateHelper.SetSid(result.data.token); await Initialize(); diff --git a/Web/src/pages/user/home/study/Practise.vue b/Web/src/pages/user/home/study/Practise.vue new file mode 100644 index 0000000..694e64d --- /dev/null +++ b/Web/src/pages/user/home/study/Practise.vue @@ -0,0 +1,164 @@ + + + + + + \ No newline at end of file diff --git a/Web/src/pages/user/home/study/index.vue b/Web/src/pages/user/home/study/index.vue index 41a40c8..e879909 100644 --- a/Web/src/pages/user/home/study/index.vue +++ b/Web/src/pages/user/home/study/index.vue @@ -1 +1,53 @@ - \ No newline at end of file + + + + + + \ No newline at end of file diff --git a/Web/src/pages/user/index.vue b/Web/src/pages/user/index.vue index c47d08c..d67f512 100644 --- a/Web/src/pages/user/index.vue +++ b/Web/src/pages/user/index.vue @@ -1,88 +1,88 @@ \ No newline at end of file diff --git a/Web/src/services/user/PractiseService.ts b/Web/src/services/user/PractiseService.ts new file mode 100644 index 0000000..989b374 --- /dev/null +++ b/Web/src/services/user/PractiseService.ts @@ -0,0 +1,33 @@ +export class PractiseService { + /** + * 获取山寨修炼列表信息 + * GET /Practise/GetUserPractise + */ + static async GetUserPractise(page: number) { + return await ApiService.Request('get', '/Practise/GetUserPractise', { page }) + } + + /** + * 获取修炼道具 + * GET /Practise/MakeGoodsList + */ + static async MakeGoodsList() { + return await ApiService.Request('get', '/Practise/MakeGoodsList', {}) + } + + /** + * 立即修炼 + * GET /Practise/MakeGoods + */ + static async MakeGoods(par: string) { + return await ApiService.Request('post', '/Practise/MakeGoods', { par }) + } + + /** + * 完成修炼 + * GET /Practise/OkPractise + */ + static async OkPractise(par: string) { + return await ApiService.Request('post', '/Practise/OkPractise', { par }) + } +} From 5cd6151b964f49bde3775df5f71013dbcc9dd55e Mon Sep 17 00:00:00 2001 From: Putoo <290555932@qq.com> Date: Tue, 16 Jun 2026 18:30:53 +0800 Subject: [PATCH 02/14] 1212121 --- .../model/UserEquSuit.cs | 8 + Service/Application.Domain/Enum/EquEnum.cs | 6 + .../Services/Interface/Equ/IGameEquService.cs | 2 + .../Services/Service/Equ/GameEquService.cs | 83 +++++++++- .../Controllers/Pub/EquController.cs | 85 +++++++++- .../Controllers/User/BagController.cs | 11 +- Web/src/components/Business/GameEqu.vue | 21 +++ Web/src/components/Business/GamePopup.vue | 5 +- Web/src/config/BaseConfig.ts | 4 +- Web/src/pages/prop/equ.vue | 10 +- Web/src/pages/user/bag/index.vue | 4 +- Web/src/pages/user/equ/index.vue | 147 +++++++++++++----- Web/src/pages/user/equ/suit.vue | 68 ++++++++ Web/src/services/Index/EquService.ts | 16 ++ 14 files changed, 413 insertions(+), 57 deletions(-) create mode 100644 Service/Application.Domain.Entity/model/UserEquSuit.cs create mode 100644 Web/src/components/Business/GameEqu.vue create mode 100644 Web/src/pages/user/equ/suit.vue diff --git a/Service/Application.Domain.Entity/model/UserEquSuit.cs b/Service/Application.Domain.Entity/model/UserEquSuit.cs new file mode 100644 index 0000000..612af94 --- /dev/null +++ b/Service/Application.Domain.Entity/model/UserEquSuit.cs @@ -0,0 +1,8 @@ +namespace Application.Domain.Entity; + +public class UserEquSuit +{ + public string suitCode { get; set; } + public string suitName { get; set; } + public List SuitAttr { get; set; } +} \ No newline at end of file diff --git a/Service/Application.Domain/Enum/EquEnum.cs b/Service/Application.Domain/Enum/EquEnum.cs index 0469997..8c21736 100644 --- a/Service/Application.Domain/Enum/EquEnum.cs +++ b/Service/Application.Domain/Enum/EquEnum.cs @@ -21,5 +21,11 @@ public static class EquEnum Ornaments = 3, //佩戴 Fashion = 1, //时装 Wing = 1, //羽翼 + Decorate = 5, //装饰 + } + + public enum SuitAttrNeedType + { + ON_EQU } } \ No newline at end of file diff --git a/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs b/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs index 3b7d4c4..3d6876b 100644 --- a/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs +++ b/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs @@ -13,6 +13,7 @@ public interface IGameEquService RefAsync Total, bool isRemOn = false); Task> GetUserEquData(string userId, int equId); + Task> GetUserEquData(string userId, string code, List noUeId); Task GetUserEquInfo(string ueId); Task GetUserEquByEquIdCount(string userId, int equId); Task> GetUserEquByEquId(string userId, int equId); @@ -28,6 +29,7 @@ public interface IGameEquService Task> GetUserOnEqu(string userId); Task EquOnOrDown(unit_user_equ data, int state); + Task> GetUserEquSuit(string userId); #endregion #region 辅助 diff --git a/Service/Application.Domain/Services/Service/Equ/GameEquService.cs b/Service/Application.Domain/Services/Service/Equ/GameEquService.cs index c0d54d8..343ffcd 100644 --- a/Service/Application.Domain/Services/Service/Equ/GameEquService.cs +++ b/Service/Application.Domain/Services/Service/Equ/GameEquService.cs @@ -56,11 +56,18 @@ public class GameEquService(ISqlSugarClient DbClient, IRedisCache redis) : IGame public async Task> GetUserEquData(string userId, int equId) { - long onTime = TimeExtend.GetTimeStampSeconds; var db = DbClient.AsTenant().GetConnectionWithAttr(); return await db.Queryable().Where(it => it.userId == userId && it.equId == equId).ToListAsync(); } + public async Task> GetUserEquData(string userId, string code, List noUeId) + { + var db = DbClient.AsTenant().GetConnectionWithAttr(); + return await db.Queryable().Where(it => it.userId == userId && it.code == code) + .WhereIF(noUeId.Count > 0, it => !noUeId.Contains(it.ueId)) + .ToListAsync(); + } + public async Task GetUserEquInfo(string ueId) { var db = DbClient.AsTenant().GetConnectionWithAttr(); @@ -325,6 +332,15 @@ public class GameEquService(ISqlSugarClient DbClient, IRedisCache redis) : IGame } } + private async Task ClearUserOnEqu(string userId) + { + var key = string.Format(UserCache.BaseCacheKeys, "EquData", "UserOnEqu"); + await redis.DelHashAsync(key, userId); + //清理套装缓存 + key = string.Format(UserCache.BaseCacheKeys, "EquData:UserEquSuit", userId); + await redis.DelAsync(key); + } + public async Task EquOnOrDown(unit_user_equ data, int state) { data.isOn = state; @@ -334,21 +350,84 @@ public class GameEquService(ISqlSugarClient DbClient, IRedisCache redis) : IGame var equInfo = await GetEquInfo((int)data.equId); if (equInfo.useTime > 0) { - data.useEndTime = TimeExtend.GetTimeStampBySeconds(DateTime.Now.AddDays((int)equInfo.useTime)) ; + data.useEndTime = TimeExtend.GetTimeStampBySeconds(DateTime.Now.AddDays((int)equInfo.useTime)); } } + var db = DbClient.AsTenant().GetConnectionWithAttr(); bool result = await db.Updateable(data).ExecuteCommandAsync() > 0; if (result) { + await ClearUserOnEqu(data.userId); } return result; } + /// + /// 获取个人套装 + /// + /// + /// + public async Task> GetUserEquSuit(string userId) + { + List result = new List(); + long time = TimeExtend.GetTimeStampSeconds; + var key = string.Format(UserCache.BaseCacheKeys, "EquData:UserEquSuit", userId); + if (await redis.ExistsAsync(key)) + { + result = await redis.GetAsync>(key); + } + else + { + List opSuit = new List(); + var onEquData = await GetUserOnEqu(userId); + string[] onEqu = onEquData.Select(it => it.equId.ToString()).ToArray(); + onEquData = onEquData.FindAll(it => it.useEndTime > time && it.durability > 0); + foreach (var item in onEquData) + { + if (item.suitCode != "0" && !string.IsNullOrEmpty(item.suitCode)) + { + if (!opSuit.Contains(item.suitCode)) + { + opSuit.Add(item.suitCode); + } + } + } + foreach (var suit in opSuit) + { + UserEquSuit temp = new UserEquSuit(); + var suitInfo = await GetEuqSuitInfo(suit); + if (suitInfo != null) + { + temp.suitCode = suitInfo.suitCode; + temp.suitName = suitInfo.suitName; + temp.SuitAttr = new List(); + foreach (var item in suitInfo.attr) + { + if (item.NeedType == nameof(EquEnum.SuitAttrNeedType.ON_EQU)) + { + bool same = item.NeedData.All(item => onEqu.Contains(item)); + if (same) + { + temp.SuitAttr.Add(item); + } + } + } + if (temp.SuitAttr.Count > 0) //存在满足条件得属性 + { + result.Add(temp); + } + } + } + await redis.SetAsync(key, result, 300); + } + + return result; + } #endregion diff --git a/Service/Application.Web/Controllers/Pub/EquController.cs b/Service/Application.Web/Controllers/Pub/EquController.cs index 25f6584..11b416b 100644 --- a/Service/Application.Web/Controllers/Pub/EquController.cs +++ b/Service/Application.Web/Controllers/Pub/EquController.cs @@ -138,7 +138,8 @@ public class EquController : ControllerBase { string userId = StateHelper.userId; var data = await _equService.GetUserOnEqu(userId); - return PoAction.Ok(data); + var suit = await _equService.GetUserEquSuit(userId); + return PoAction.Ok(new { data, suit }); } /// @@ -200,6 +201,7 @@ public class EquController : ControllerBase return PoAction.Message($"该装备最多穿戴{equInfo.canEqualUp}件!"); } } + bool isOk = true; if (string.IsNullOrEmpty(de)) { @@ -222,6 +224,7 @@ public class EquController : ControllerBase { return PoAction.Message("装备未穿戴!"); } + if (DownOnEqu.code != equInfo.code) { return PoAction.Message("装备部位不一致!"); @@ -260,6 +263,82 @@ public class EquController : ControllerBase } } } - - + + /// + /// 获取可穿戴装备 + /// + /// + /// + [HttpGet] + public async Task GetCanOnEqu(int type) + { + string code = nameof(EquEnum.EquPlace.Hold); + switch (type) + { + case 1: + code = nameof(EquEnum.EquPlace.Hold); + break; + case 2: + code = nameof(EquEnum.EquPlace.Vice); + break; + case 3: + code = nameof(EquEnum.EquPlace.Head); + break; + case 4: + code = nameof(EquEnum.EquPlace.Wear); + break; + case 5: + code = nameof(EquEnum.EquPlace.Waist); + break; + case 6: + code = nameof(EquEnum.EquPlace.Foot); + break; + case 7: + code = nameof(EquEnum.EquPlace.Ornaments); + break; + case 8: + code = nameof(EquEnum.EquPlace.Fashion); + break; + case 9: + code = nameof(EquEnum.EquPlace.Wing); + break; + case 10: + code = nameof(EquEnum.EquPlace.Decorate); + break; + } + + string userId = StateHelper.userId; + var userOnEqu = await _equService.GetUserOnEqu(userId); + var NoEqu = userOnEqu.FindAll(it => it.code == code).Select(it => it.ueId).ToList(); + var CanEqu = await _equService.GetUserEquData(userId, code, NoEqu); + long onTime = TimeExtend.GetTimeStampSeconds; + CanEqu = CanEqu.FindAll(it => it.isAppr == 1 && it.useEndTime > onTime); + CanEqu = CanEqu.OrderByDescending(it => it.lev).ToList(); + return PoAction.Ok(CanEqu); + } + + /// + /// 获取激活套装属性 + /// + /// + /// + [HttpGet] + public async Task GetUserOnSuitInfo(string suitCode) + { + var userId = StateHelper.userId; + var onSuit = await _equService.GetUserEquSuit(userId); + var suit = onSuit.Find(it => it.suitCode == suitCode); + if (suit == null) + { + return PoAction.Message("套装不存在!"); + } + + var data = await _equService.GetEuqSuitInfo(suitCode); + if (data == null) + { + return PoAction.Message("套装不存在!"); + } + + return PoAction.Ok(new { data, suit }); + } } \ No newline at end of file diff --git a/Service/Application.Web/Controllers/User/BagController.cs b/Service/Application.Web/Controllers/User/BagController.cs index 6b150b5..1b5fdf0 100644 --- a/Service/Application.Web/Controllers/User/BagController.cs +++ b/Service/Application.Web/Controllers/User/BagController.cs @@ -24,7 +24,7 @@ public class BagController : ControllerBase _equService = equService; _accService = accService; } - + /// /// 获取背包信息 /// @@ -33,7 +33,6 @@ public class BagController : ControllerBase public async Task GetUserBagData() { string userId = StateHelper.userId; - var accInfo = await _accService.GetUserAccInfo(userId); long gold = (long)accInfo.gold; long cowry = (long)accInfo.cowry; @@ -76,13 +75,13 @@ public class BagController : ControllerBase } var data = await _equService.GetUserEquData(userId, _t, query, page, 10, total); - return PoAction.Ok(new { data, total.Value }); + return PoAction.Ok(new { data, total = total.Value}); } else if (type == 1) { List code = new List() { nameof(GoodsEnum.Code.Drug) }; var data = await _goodsService.GetUserGoodsData(userId, code, new List(), query, page, 10, total); - return PoAction.Ok(new { data, total.Value }); + return PoAction.Ok(new { data, total = total.Value }); } else if (type == 2) { @@ -120,11 +119,11 @@ public class BagController : ControllerBase } var data = await _goodsService.GetUserGoodsData(userId, code, noCode, query, page, 10, total); - return PoAction.Ok(new { data, total.Value }); + return PoAction.Ok(new { data, total = total.Value }); } else { - return PoAction.Ok(new { data = new List(), total.Value }); + return PoAction.Ok(new { data = new List(), total = total.Value }); } } } \ No newline at end of file diff --git a/Web/src/components/Business/GameEqu.vue b/Web/src/components/Business/GameEqu.vue new file mode 100644 index 0000000..0c29519 --- /dev/null +++ b/Web/src/components/Business/GameEqu.vue @@ -0,0 +1,21 @@ + + \ No newline at end of file diff --git a/Web/src/components/Business/GamePopup.vue b/Web/src/components/Business/GamePopup.vue index 5f766b7..5feba96 100644 --- a/Web/src/components/Business/GamePopup.vue +++ b/Web/src/components/Business/GamePopup.vue @@ -17,7 +17,10 @@ const props = defineProps({ // 字段名、类型、默认值 - isShow: Boolean, + isShow: { + type: Boolean, + default: false + }, title: String }) const visible = ref(props.isShow) diff --git a/Web/src/config/BaseConfig.ts b/Web/src/config/BaseConfig.ts index 18c1514..8f881cf 100644 --- a/Web/src/config/BaseConfig.ts +++ b/Web/src/config/BaseConfig.ts @@ -2,8 +2,8 @@ 统一配置中心 */ export class BaseConfig { - public static BaseUrl: string = 'https://192.168.0.142:7198' - public static BaseMediaUrl: string = 'https://192.168.0.142:7198' + public static BaseUrl: string = 'https://localhost:7198' + public static BaseMediaUrl: string = 'https://localhost:7198/' // public static BaseUrl:string="http://kx.iyba.cn:5291"; // public static BaseMediaUrl:string="http://kx.iyba.cn:5291"; } diff --git a/Web/src/pages/prop/equ.vue b/Web/src/pages/prop/equ.vue index d939664..ed8a2c1 100644 --- a/Web/src/pages/prop/equ.vue +++ b/Web/src/pages/prop/equ.vue @@ -55,7 +55,6 @@ 部位:{{ EquTool.GetEquPlaceName(equData.code) }}
等级:{{ equData.lev }}
- 品阶:{{ EquTool.EquStartTips(equData.start) }}
品质:equData.qualityName
@@ -117,16 +116,13 @@
- ◈{{equData.isOn==1?"卸下装备":"穿戴装备"}}
-
- - ◈洗练
+ ◈{{ equData.isOn == 1 ? "卸下装备" : "穿戴装备" }}
觉醒
- ◈升星
+ ◈洗练
{{ equData.isLock == 0 ? "绑定" : "解绑" }}
@@ -189,7 +185,7 @@ const BindData = async (): Promise => { /**穿/卸装备 */ const UpOrDownEqu = async () => { MessageExtend.LoadingToast("操作中..."); - let result = await EquService.DownOrUpEqu(ueId,""); + let result = await EquService.DownOrUpEqu(ueId, ""); MessageExtend.LoadingClose(); if (result.code == 0) { await BindData(); diff --git a/Web/src/pages/user/bag/index.vue b/Web/src/pages/user/bag/index.vue index e749c2f..c32a241 100644 --- a/Web/src/pages/user/bag/index.vue +++ b/Web/src/pages/user/bag/index.vue @@ -50,7 +50,7 @@
{{ PageExtend.GetPageIndex(currentPage, 10, index + 1) }}. {{ item.equName }}({{ item.lev }}级) - (穿) + (装) (未鉴定) (过期) (损坏) @@ -144,6 +144,7 @@ const BindData = async (): Promise => { /**切换背包 */ const ChangeBag = async (_type: string): Promise => { + currentPage.value = 1; type.value = _type; type_ch.value = '0'; serch.value=''; @@ -151,6 +152,7 @@ const ChangeBag = async (_type: string): Promise => { } const ChangeChildBag = async (ch: string): Promise => { + currentPage.value = 1; type_ch.value = ch; await BindData(); } diff --git a/Web/src/pages/user/equ/index.vue b/Web/src/pages/user/equ/index.vue index 6adb65c..1976fcc 100644 --- a/Web/src/pages/user/equ/index.vue +++ b/Web/src/pages/user/equ/index.vue @@ -1,72 +1,76 @@ \ No newline at end of file diff --git a/Web/src/pages/user/equ/suit.vue b/Web/src/pages/user/equ/suit.vue new file mode 100644 index 0000000..119bfbb --- /dev/null +++ b/Web/src/pages/user/equ/suit.vue @@ -0,0 +1,68 @@ + + \ No newline at end of file diff --git a/Web/src/services/Index/EquService.ts b/Web/src/services/Index/EquService.ts index 847e5d2..38a5195 100644 --- a/Web/src/services/Index/EquService.ts +++ b/Web/src/services/Index/EquService.ts @@ -38,4 +38,20 @@ export class EquService { static async DownOrUpEqu(ueId: string, de: string) { return await ApiService.Request("get", "/Equ/DownOrUpEqu", { ueId, de }); } + + /** + * 获取可穿戴装备 + * GET /Equ/GetCanOnEqu + */ + static async GetCanOnEqu(type: number) { + return await ApiService.Request("get", "/Equ/GetCanOnEqu", { type }); + } + + /** + * 获取激活套装属性 + * GET /Equ/GetUserOnSuitInfo + */ + static async GetUserOnSuitInfo(suitCode: string) { + return await ApiService.Request("get", "/Equ/GetUserOnSuitInfo", { suitCode }); + } } \ No newline at end of file From 3b0f1e37eeb46560462eeade6fe8bbfa7996089c Mon Sep 17 00:00:00 2001 From: Putoo <290555932@qq.com> Date: Wed, 17 Jun 2026 19:22:35 +0800 Subject: [PATCH 03/14] 12121 --- .../logdb/ot/game_broadcast.cs | 13 + .../model/CheckTowerNeeds.cs | 30 ++ .../model/EquAwaken.cs | 1 - .../model/EquAwakenData.cs | 36 ++ .../model/TowerNeed.cs | 16 +- .../model/TowerNeeds.cs | 111 +++++ .../resource/game/game_dic.cs | 27 ++ .../resource/game/game_equ_awaken.cs | 39 ++ .../resource/game/game_equ_up.cs | 39 ++ Service/Application.Domain/Enum/GameEnum.cs | 5 + .../Application.Domain/Enum/MessageEnum.cs | 8 + .../Services/Interface/Equ/IGameEquService.cs | 20 +- .../Services/Interface/Pub/IGameDicService.cs | 6 + .../Services/Interface/Pub/IMessageService.cs | 7 + .../Services/Service/Equ/GameEquService.cs | 97 +++++ .../Services/Service/Map/GameMapService.cs | 8 +- .../Services/Service/Pub/GameDicService.cs | 19 + .../Services/Service/Pub/MessageService.cs | 58 ++- .../Application.Domain/Tool/Base/GameBus.cs | 165 ++++++- .../Controllers/Map/MapController.cs | 4 +- .../Controllers/Pub/EquController.cs | 403 ++++++++++++++++- .../Controllers/User/BagController.cs | 14 + .../Model/RequestParms/Equ/EquUpParms.cs | 7 + .../RequestParms/User/CheckUserPropParms.cs | 6 + Web/public/images/broad/award.gif | Bin 0 -> 58343 bytes Web/public/images/broad/gift.gif | Bin 0 -> 4153 bytes Web/public/images/broad/hot1.gif | Bin 0 -> 17732 bytes Web/public/images/broad/promote.gif | Bin 0 -> 4501 bytes Web/public/images/broad/remind.gif | Bin 0 -> 3657 bytes Web/public/images/broad/system.gif | Bin 0 -> 2477 bytes Web/src/components/Base/Aimage.vue | 6 +- Web/src/components/Business/GameBroadcast.vue | 408 ++++++++++++++++++ .../components/Business/GamePropVerify.vue | 18 + Web/src/pages/map/index.vue | 7 +- Web/src/pages/prop/equ.vue | 90 +++- Web/src/pages/user/bag/index.vue | 2 +- Web/src/pages/user/equ/awaken.vue | 48 +++ Web/src/pages/user/equ/up.vue | 147 +++++++ Web/src/services/Index/EquService.ts | 35 ++ Web/src/services/user/BagService.ts | 11 +- 40 files changed, 1856 insertions(+), 55 deletions(-) create mode 100644 Service/Application.Domain.Entity/logdb/ot/game_broadcast.cs create mode 100644 Service/Application.Domain.Entity/model/CheckTowerNeeds.cs create mode 100644 Service/Application.Domain.Entity/model/EquAwakenData.cs create mode 100644 Service/Application.Domain.Entity/model/TowerNeeds.cs create mode 100644 Service/Application.Domain.Entity/resource/game/game_dic.cs create mode 100644 Service/Application.Domain.Entity/resource/game/game_equ_awaken.cs create mode 100644 Service/Application.Domain.Entity/resource/game/game_equ_up.cs create mode 100644 Service/Application.Domain/Services/Interface/Pub/IGameDicService.cs create mode 100644 Service/Application.Domain/Services/Service/Pub/GameDicService.cs create mode 100644 Service/Application.Web/Model/RequestParms/Equ/EquUpParms.cs create mode 100644 Service/Application.Web/Model/RequestParms/User/CheckUserPropParms.cs create mode 100644 Web/public/images/broad/award.gif create mode 100644 Web/public/images/broad/gift.gif create mode 100644 Web/public/images/broad/hot1.gif create mode 100644 Web/public/images/broad/promote.gif create mode 100644 Web/public/images/broad/remind.gif create mode 100644 Web/public/images/broad/system.gif create mode 100644 Web/src/components/Business/GameBroadcast.vue create mode 100644 Web/src/components/Business/GamePropVerify.vue create mode 100644 Web/src/pages/user/equ/awaken.vue create mode 100644 Web/src/pages/user/equ/up.vue diff --git a/Service/Application.Domain.Entity/logdb/ot/game_broadcast.cs b/Service/Application.Domain.Entity/logdb/ot/game_broadcast.cs new file mode 100644 index 0000000..0ac16cb --- /dev/null +++ b/Service/Application.Domain.Entity/logdb/ot/game_broadcast.cs @@ -0,0 +1,13 @@ +namespace Application.Domain.Entity; + +public class game_broadcast +{ + public string Id { get; set; } + public int area { get; set; } + public string code { get; set; } + public string userId { get; set; } + public string userNo { get; set; } + public string nick { get; set; } + public string msg { get; set; } + public long endTime { get; set; } +} \ No newline at end of file diff --git a/Service/Application.Domain.Entity/model/CheckTowerNeeds.cs b/Service/Application.Domain.Entity/model/CheckTowerNeeds.cs new file mode 100644 index 0000000..98f08a2 --- /dev/null +++ b/Service/Application.Domain.Entity/model/CheckTowerNeeds.cs @@ -0,0 +1,30 @@ +namespace Application.Domain.Entity; + +public class CheckTowerNeeds +{ + private bool _result; + + public bool result + { get { return this._result; } set { this._result = value; } } + + private System.Int32 _isDeal; + + /// + /// 0不可交易1可交易 + /// + public System.Int32 isDeal + { get { return this._isDeal; } set { this._isDeal = value; } } + + private System.Int32 _isGive; + + /// + /// 0不可交易1可交易 + /// + public System.Int32 isGive + { get { return this._isGive; } set { this._isGive = value; } } + + private List _Needs; + + public List Needs + { get { return this._Needs; } set { this._Needs = value; } } +} \ No newline at end of file diff --git a/Service/Application.Domain.Entity/model/EquAwaken.cs b/Service/Application.Domain.Entity/model/EquAwaken.cs index f21bf14..352ba9b 100644 --- a/Service/Application.Domain.Entity/model/EquAwaken.cs +++ b/Service/Application.Domain.Entity/model/EquAwaken.cs @@ -31,7 +31,6 @@ public class EquAwaken /// /// /// - [SqlSugar.SugarColumn(ColumnDataType = "varchar(max)", IsJson = true)] public List awaken { get { return this._awaken; } set { this._awaken = value; } } } \ No newline at end of file diff --git a/Service/Application.Domain.Entity/model/EquAwakenData.cs b/Service/Application.Domain.Entity/model/EquAwakenData.cs new file mode 100644 index 0000000..f9312fa --- /dev/null +++ b/Service/Application.Domain.Entity/model/EquAwakenData.cs @@ -0,0 +1,36 @@ +namespace Application.Domain.Entity; + +public class EquAwakenData +{ + private System.Int32 _lev; + + /// + /// + /// + public System.Int32 lev + { get { return this._lev; } set { this._lev = value; } } + + private System.Int32 _success; + + /// + /// + /// + public System.Int32 success + { get { return this._success; } set { this._success = value; } } + + private List _need; + + /// + /// + /// + public List need + { get { return this._need; } set { this._need = value; } } + + private List _attr; + + /// + /// + /// + public List attr + { get { return this._attr; } set { this._attr = value; } } +} \ No newline at end of file diff --git a/Service/Application.Domain.Entity/model/TowerNeed.cs b/Service/Application.Domain.Entity/model/TowerNeed.cs index 373d076..f27a720 100644 --- a/Service/Application.Domain.Entity/model/TowerNeed.cs +++ b/Service/Application.Domain.Entity/model/TowerNeed.cs @@ -26,20 +26,20 @@ public class TowerNeed public System.String parameter { get { return this._parameter; } set { this._parameter = value; } } - private System.Int32 _count; + private long _count; /// /// /// - public System.Int32 count + public long count { get { return this._count; } set { this._count = value; } } - private System.Int32 _retCount; + private long _retCount; /// /// /// - public System.Int32 retCount + public long retCount { get { return this._retCount; } set { this._retCount = value; } } private System.Int32 _isOp; @@ -57,4 +57,12 @@ public class TowerNeed ///
public System.Int32 isAsk { get { return this._isAsk; } set { this._isAsk = value; } } + + private long _onCount; + + /// + /// + /// + public long onCount + { get { return this._onCount; } set { this._onCount = value; } } } \ No newline at end of file diff --git a/Service/Application.Domain.Entity/model/TowerNeeds.cs b/Service/Application.Domain.Entity/model/TowerNeeds.cs new file mode 100644 index 0000000..050df10 --- /dev/null +++ b/Service/Application.Domain.Entity/model/TowerNeeds.cs @@ -0,0 +1,111 @@ +namespace Application.Domain.Entity; + +public class TowerNeeds +{ + private System.Int32 _Id; + + /// + /// + /// + public System.Int32 Id + { + get { return this._Id; } + set { this._Id = value; } + } + + private System.String _code; + + /// + /// + /// + public System.String code + { + get { return this._code; } + set { this._code = value; } + } + + private System.String _name; + + /// + /// + /// + public System.String name + { + get { return this._name; } + set { this._name = value; } + } + + private System.String _parameter; + + /// + /// + /// + public System.String parameter + { + get { return this._parameter; } + set { this._parameter = value; } + } + + private long _count; + + /// + /// + /// + public long count + { + get { return this._count; } + set { this._count = value; } + } + + private long _retCount; + + /// + /// + /// + public long retCount + { + get { return this._retCount; } + set { this._retCount = value; } + } + + private System.Int32 _isOp; + + /// + /// + /// + public System.Int32 isOp + { + get { return this._isOp; } + set { this._isOp = value; } + } + + private System.Int32 _isAsk; + + /// + /// + /// + public System.Int32 isAsk + { + get { return this._isAsk; } + set { this._isAsk = value; } + } + + private long _onCount; + + /// + /// + /// + public long onCount + { + get { return this._onCount; } + set { this._onCount = value; } + } + + private List _NeedItem; + + public List NeedItem + { + get { return this._NeedItem; } + set { this._NeedItem = value; } + } +} \ No newline at end of file diff --git a/Service/Application.Domain.Entity/resource/game/game_dic.cs b/Service/Application.Domain.Entity/resource/game/game_dic.cs new file mode 100644 index 0000000..d4013fb --- /dev/null +++ b/Service/Application.Domain.Entity/resource/game/game_dic.cs @@ -0,0 +1,27 @@ +using SqlSugar; +using System; + +namespace Application.Domain.Entity +{ + [Tenant("Kg.SeaTime.Resource")] + public class game_dic + { + /// + /// code + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? code { get; set; } + + /// + /// sign + /// + [SugarColumn(IsNullable = true)] + public string? sign { get; set; } + + /// + /// remark + /// + [SugarColumn(Length = 255, IsNullable = true)] + public string? remark { get; set; } + } +} \ No newline at end of file diff --git a/Service/Application.Domain.Entity/resource/game/game_equ_awaken.cs b/Service/Application.Domain.Entity/resource/game/game_equ_awaken.cs new file mode 100644 index 0000000..e7b62ff --- /dev/null +++ b/Service/Application.Domain.Entity/resource/game/game_equ_awaken.cs @@ -0,0 +1,39 @@ +using SqlSugar; +using System; + +namespace Application.Domain.Entity +{ + [Tenant("Kg.SeaTime.Resource")] + public class game_equ_awaken + { + /// + /// 特性表 + /// + [SugarColumn(IsPrimaryKey = true, Length = 50)] + public string atId { get; set; } + + /// + /// 特性名称 + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? name { get; set; } + + /// + /// levAttr + /// + [SugarColumn(IsNullable = true,IsJson = true)] + public List levAttr { get; set; } + + /// + /// 权重 + /// + [SugarColumn(IsNullable = true)] + public int? random { get; set; } + + /// + /// 可觉醒装备 + /// + [SugarColumn(IsNullable = true)] + public string? position { get; set; } + } +} \ No newline at end of file diff --git a/Service/Application.Domain.Entity/resource/game/game_equ_up.cs b/Service/Application.Domain.Entity/resource/game/game_equ_up.cs new file mode 100644 index 0000000..c84fcdc --- /dev/null +++ b/Service/Application.Domain.Entity/resource/game/game_equ_up.cs @@ -0,0 +1,39 @@ +using SqlSugar; +using System; + +namespace Application.Domain.Entity +{ + [Tenant("Kg.SeaTime.Resource")] + public class game_equ_up + { + /// + /// euId + /// + [SugarColumn(IsPrimaryKey = true)] + public int euId { get; set; } + + /// + /// onLev + /// + [SugarColumn(IsNullable = true)] + public int? onLev { get; set; } + + /// + /// maxLev + /// + [SugarColumn(IsNullable = true)] + public int? maxLev { get; set; } + + /// + /// okChance + /// + [SugarColumn(IsNullable = true)] + public int? okChance { get; set; } + + /// + /// needData + /// + [SugarColumn(IsNullable = true,IsJson = true)] + public List needData { get; set; } + } +} \ No newline at end of file diff --git a/Service/Application.Domain/Enum/GameEnum.cs b/Service/Application.Domain/Enum/GameEnum.cs index 56434e5..b99b983 100644 --- a/Service/Application.Domain/Enum/GameEnum.cs +++ b/Service/Application.Domain/Enum/GameEnum.cs @@ -57,4 +57,9 @@ public static class GameEnum RetVigour, MapTo, } + + public enum DicCode + { + Awaken,//觉醒配置 + } } \ No newline at end of file diff --git a/Service/Application.Domain/Enum/MessageEnum.cs b/Service/Application.Domain/Enum/MessageEnum.cs index c3a18ac..2fd9480 100644 --- a/Service/Application.Domain/Enum/MessageEnum.cs +++ b/Service/Application.Domain/Enum/MessageEnum.cs @@ -8,4 +8,12 @@ public static class MessageEnum Marry,//婚姻消息 Trade,//交易通知 } + public enum BroadcastCode + { + Gift, + System, + Award, + Remind, + Promote + } } \ No newline at end of file diff --git a/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs b/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs index 3d6876b..937c5c4 100644 --- a/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs +++ b/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs @@ -6,7 +6,9 @@ public interface IGameEquService Task GetEquInfo(int equId); Task GetEuqSuitInfo(string suitCode); + #endregion + #region 用户装备 Task> GetUserEquData(string userId, int type, string equName, int PageIndex, int PageSize, @@ -21,6 +23,7 @@ public interface IGameEquService Task UpdateUserEquInfo(unit_user_equ equData, bool isAddLog = false, string code = "", string remark = ""); + Task DeductUserEqu(string userId, List equData, string remark); Task DeductUserEqu(string userId, int equId, int count, string remark); @@ -30,12 +33,25 @@ public interface IGameEquService Task> GetUserOnEqu(string userId); Task EquOnOrDown(unit_user_equ data, int state); Task> GetUserEquSuit(string userId); + #endregion - #region 辅助 + #region 觉醒相关 + + Task GetEquAwakenInfo(string atId); + Task GetRandomOneAwakenByCode(string code); + Task GetEquAwakenInfoByLev(string atId, int lev); + + #endregion + + #region 强化相关 + + Task GetUserEquUpData(int lev); + #endregion + + #region 辅助 Task GetUserEquWeightSum(string userId); - #endregion } \ No newline at end of file diff --git a/Service/Application.Domain/Services/Interface/Pub/IGameDicService.cs b/Service/Application.Domain/Services/Interface/Pub/IGameDicService.cs new file mode 100644 index 0000000..f7f34d3 --- /dev/null +++ b/Service/Application.Domain/Services/Interface/Pub/IGameDicService.cs @@ -0,0 +1,6 @@ +namespace Application.Domain; + +public interface IGameDicService +{ + Task GetDicInfo(string code); +} \ No newline at end of file diff --git a/Service/Application.Domain/Services/Interface/Pub/IMessageService.cs b/Service/Application.Domain/Services/Interface/Pub/IMessageService.cs index bf1ca05..07044cc 100644 --- a/Service/Application.Domain/Services/Interface/Pub/IMessageService.cs +++ b/Service/Application.Domain/Services/Interface/Pub/IMessageService.cs @@ -43,4 +43,11 @@ public interface IMessageService List btns = null, int days = 10); #endregion + + #region 广播消息 + + Task> GetBroadcastData(int area); + Task SendBroadcast(string userId, string code, string msg); + + #endregion } \ No newline at end of file diff --git a/Service/Application.Domain/Services/Service/Equ/GameEquService.cs b/Service/Application.Domain/Services/Service/Equ/GameEquService.cs index 343ffcd..5e2e576 100644 --- a/Service/Application.Domain/Services/Service/Equ/GameEquService.cs +++ b/Service/Application.Domain/Services/Service/Equ/GameEquService.cs @@ -191,6 +191,11 @@ public class GameEquService(ISqlSugarClient DbClient, IRedisCache redis) : IGame { await AddEquLog(equData, code, remark); } + + if (equData.isOn == 1) + { + await ClearUserOnEqu(equData.userId); + } } return result; @@ -429,6 +434,98 @@ public class GameEquService(ISqlSugarClient DbClient, IRedisCache redis) : IGame return result; } + #endregion + + #region 觉醒 + + public async Task GetEquAwakenInfo(string atId) + { + string key = string.Format(BaseCache.BaseCacheKeys, "EquData", "AwakenData"); + var data = await redis.GetHashAsync(key, atId); + if (data == null) + { + var db = DbClient.AsTenant().GetConnectionWithAttr(); + data = await db.Queryable().Where(i => i.atId == atId).SingleAsync(); + if (data != null) + { + await redis.AddHashAsync(key, atId, data); + } + } + + return data; + } + + public async Task GetRandomOneAwakenByCode(string code) + { + game_equ_awaken attr = new game_equ_awaken(); + var db = DbClient.AsTenant().GetConnectionWithAttr(); + var list = await db.Queryable().Where(i => i.position.Contains(code)).ToListAsync(); + if (list.Count == 0) + { + return null; + } + + List data = new List(); + List weights = new List(); + List result = new List(); + Random rand = new Random(); + + foreach (var item in list) + { + data.Add(item); + weights.Add(ushort.Parse(item.random.ToString())); + } + + RandomAssist random = new RandomAssist(1); + + result = random.ControllerRandomExtract(rand, data, weights); + if (result.Count > 0) + { + attr = result[0] as game_equ_awaken; + return attr; + } + else + { + return null; + } + } + + public async Task GetEquAwakenInfoByLev(string atId, int lev) + { + var awakenInfo = await GetEquAwakenInfo(atId); + EquAwakenData awaken = new EquAwakenData(); + foreach (var item in awakenInfo.levAttr) + { + if (item.lev == lev) + { + return item; + } + } + + return null; + } + + #endregion + + #region 强化相关 + + public async Task GetUserEquUpData(int lev) + { + string key = string.Format(BaseCache.BaseCacheKeys, "EquData", "EquUpData"); + var data = await redis.GetHashAsync(key, lev.ToString()); + if (data == null) + { + var db = DbClient.AsTenant().GetConnectionWithAttr(); + data = await db.Queryable().Where(i => i.onLev <= lev && i.maxLev >= lev).FirstAsync(); + if (data != null) + { + await redis.AddHashAsync(key, lev.ToString(), data); + } + } + return data; + } + + #endregion #region 辅助方法 diff --git a/Service/Application.Domain/Services/Service/Map/GameMapService.cs b/Service/Application.Domain/Services/Service/Map/GameMapService.cs index ed31d1e..5b25721 100644 --- a/Service/Application.Domain/Services/Service/Map/GameMapService.cs +++ b/Service/Application.Domain/Services/Service/Map/GameMapService.cs @@ -832,7 +832,7 @@ public class GameMapService(ISqlSugarClient DbClient, IRedisCache redis) : IGame if (!string.IsNullOrEmpty(offSet)) { var offsetData = JsonConvert.DeserializeObject(offSet); - var chekResult = await GameBus.CheakNeed(userId, offsetData, ""); + var chekResult = await GameBus.CheckNeed(userId, offsetData); if (chekResult.result) { if (offsetData.isOp == 0) @@ -858,7 +858,7 @@ public class GameMapService(ISqlSugarClient DbClient, IRedisCache redis) : IGame public async Task> GetMapBus(string BusCode, int v, int l) { - string key = string.Format(BaseCache.BaseCacheKeys, "CITY_MAP_BUS", BusCode); + string key = string.Format(BaseCache.BaseCacheKeys, "CityMapBus", BusCode); var data = await redis.GetAsync>(key); if (data == null) { @@ -877,7 +877,7 @@ public class GameMapService(ISqlSugarClient DbClient, IRedisCache redis) : IGame public async Task GetMapBusInfo(int busId) { - string key = string.Format(BaseCache.BaseCacheKeys, "CITY_MAP_BUS", "BUS_INFO"); + string key = string.Format(BaseCache.BaseCacheKeys, "CityMapBus", "BUS_INFO"); if (await redis.HExistsHashAsync(key, busId.ToString())) { return await redis.GetHashAsync(key, busId.ToString()); @@ -925,6 +925,7 @@ public class GameMapService(ISqlSugarClient DbClient, IRedisCache redis) : IGame #endregion #region 地图资源 + public async Task GetMapResInfo(string resId) { string key = string.Format(BaseCache.BaseCacheKeys, "CityData", "MapResInfo"); @@ -938,6 +939,7 @@ public class GameMapService(ISqlSugarClient DbClient, IRedisCache redis) : IGame return data; } + public async Task> GetMapRes(string mapId) { string key = string.Format(BaseCache.BaseCacheKeys, "CityData", "MapRes"); diff --git a/Service/Application.Domain/Services/Service/Pub/GameDicService.cs b/Service/Application.Domain/Services/Service/Pub/GameDicService.cs new file mode 100644 index 0000000..91d74a5 --- /dev/null +++ b/Service/Application.Domain/Services/Service/Pub/GameDicService.cs @@ -0,0 +1,19 @@ +namespace Application.Domain; + +public class GameDicService(ISqlSugarClient DbClient, IRedisCache redis) : IGameDicService, ITransient +{ + public async Task GetDicInfo(string code) + { + string key = string.Format(BaseCache.BaseCacheKey, "DicData"); + if (await redis.HExistsHashAsync(key, code)) + { + return await redis.GetHashAsync(key, code); + } + + var db = DbClient.AsTenant().GetConnectionWithAttr(); + var data = await db.Queryable().Where(it => it.code == code).SingleAsync(); + await redis.AddHashAsync(key, code, data); + return data; + } + +} \ No newline at end of file diff --git a/Service/Application.Domain/Services/Service/Pub/MessageService.cs b/Service/Application.Domain/Services/Service/Pub/MessageService.cs index 214af37..9d0a658 100644 --- a/Service/Application.Domain/Services/Service/Pub/MessageService.cs +++ b/Service/Application.Domain/Services/Service/Pub/MessageService.cs @@ -311,8 +311,9 @@ public class MessageService(ISqlSugarClient DbClient, IRedisCache redis) : IMess return await db.Queryable().Where(it => it.state == 0 && it.token == token).AnyAsync(); } - public async Task SendEventMsg(string userId, string code, string name, string sign, string pars,string token, - List btns=null, int days = 10) + public async Task SendEventMsg(string userId, string code, string name, string sign, string pars, + string token, + List btns = null, int days = 10) { unit_user_message_event data = new unit_user_message_event(); data.eventId = StringAssist.NewGuid; @@ -331,8 +332,9 @@ public class MessageService(ISqlSugarClient DbClient, IRedisCache redis) : IMess } else { - data.btns = btns; + data.btns = btns; } + data.addTime = DateTime.Now; data.endTime = TimeExtend.GetTimeStampBySeconds(DateTime.Now.AddDays(days)); data.token = token; @@ -347,4 +349,54 @@ public class MessageService(ISqlSugarClient DbClient, IRedisCache redis) : IMess } #endregion + + #region 广播消息 + + public async Task> GetBroadcastData(int area) + { + List data = new List(); + string key = string.Format(BaseCache.BaseCacheKey, "GameBroadcast"); + var result = await redis.GetHashAllAsync(key); + if (result.Count > 0) + { + data = result.Values.ToList(); + } + + long time = TimeExtend.GetTimeStampSeconds; + data = data.FindAll(it => (it.area == area || it.area == 0) && it.endTime > time); + data = data.OrderByDescending(it => it.endTime).Take(2).ToList(); + return data; + } + + public async Task SendBroadcast(string userId, string code, string msg) + { + game_broadcast add = new game_broadcast(); + add.Id = StringAssist.NewGuid; + add.userId = userId; + add.code = code; + add.msg = msg; + int area = 0; + if (add.userId == "0") + { + add.area = 0; + add.userNo = "0"; + add.nick = "海精灵"; + } + else + { + var userService = App.GetService(); + var userInfo = await userService.GetUserInfoByUserId(userId); + add.area = (int)userInfo.areaId; + add.userNo = userInfo.userNo; + add.nick = userInfo.nick; + area = add.area; + } + + add.endTime = TimeExtend.GetTimeStampSeconds + 300; + string key = string.Format(BaseCache.BaseCacheKey, "GameBroadcast"); + bool result = await redis.AddHashAsync(key, add.Id, add); + return result; + } + + #endregion } \ No newline at end of file diff --git a/Service/Application.Domain/Tool/Base/GameBus.cs b/Service/Application.Domain/Tool/Base/GameBus.cs index c1e295a..027528a 100644 --- a/Service/Application.Domain/Tool/Base/GameBus.cs +++ b/Service/Application.Domain/Tool/Base/GameBus.cs @@ -1,6 +1,6 @@ namespace Application.Domain; -public class GameBus +public static class GameBus { #region 物品资源操作 @@ -96,20 +96,24 @@ public class GameBus #region 验证 - public static async Task CheakNeed(string userId, TowerNeed item, string sid, int count = 1) + public static async Task CheckNeed(string userId, TowerNeed item, int count = 1) { CheckTowerNeed result = new CheckTowerNeed(); + result.Needs = new List(); bool isok = true; int isDeal = 1; int isGive = 1; - + item.isAsk = 1; if (item.code == nameof(GameEnum.PropCode.Equ)) { var equService = App.GetService(); int MyCount = await equService.GetUserEquByEquIdCount(userId, Convert.ToInt32(item.parameter)); - int neecCount = item.count * count; - if (MyCount < neecCount) + long needCount = item.count * count; + item.count = needCount; + item.onCount = MyCount; + if (MyCount < needCount) { + item.isAsk = 0; isok = false; } } @@ -132,29 +136,38 @@ public class GameBus } } - int needCount = item.count * count; + long needCount = item.count * count; + item.count = needCount; + item.onCount = MyCount; if (MyCount < needCount) { isok = false; + item.isAsk = 0; } } else if (item.code == nameof(GameEnum.PropCode.copper)) { var accService = App.GetService(); var MyAcc = await accService.GetUserAccInfo(userId, nameof(AccEnum.AccType.copper)); - decimal needAcc = item.count * count; + long needAcc = item.count * count; + item.count = needAcc; + item.onCount = MyAcc; if (MyAcc < needAcc) { isok = false; + item.isAsk = 0; } } else if (item.code == nameof(GameEnum.PropCode.gold)) { var accService = App.GetService(); var MyAcc = await accService.GetUserAccInfo(userId, nameof(AccEnum.AccType.gold)); - decimal needAcc = item.count * count; + long needAcc = item.count * count; + item.count = needAcc; + item.onCount = MyAcc; if (MyAcc < needAcc) { + item.isAsk = 0; isok = false; } } @@ -162,9 +175,12 @@ public class GameBus { var attrService = App.GetService(); var MyAcc = await attrService.GetUserVigourInfo(userId); - decimal neecAcc = item.count * count; - if (MyAcc.vitality < neecAcc) + long needAcc = item.count * count; + item.count = needAcc; + item.onCount = (long)MyAcc.vitality; + if (MyAcc.vitality < needAcc) { + item.isAsk = 0; isok = false; } } @@ -172,6 +188,8 @@ public class GameBus { var attrService = App.GetService(); var MyLev = await attrService.GetUserLev(userId); + item.count = item.count; + item.onCount = MyLev; if (MyLev < item.count) { isok = false; @@ -181,18 +199,20 @@ public class GameBus result.result = isok; result.isDeal = isDeal; result.isGive = isGive; + result.Needs.Add(item); return result; } - public static async Task CheakNeed(string userId, List needs, string sid, int count = 1) + public static async Task CheckNeed(string userId, List needs, int count = 1) { CheckTowerNeed result = new CheckTowerNeed(); + result.Needs = new List(); bool isok = true; int isDeal = 1; int isGive = 1; foreach (var item in needs) { - var cheakResult = await CheakNeed(userId, item, sid, count); + var cheakResult = await CheckNeed(userId, item, count); if (isok) { isok = cheakResult.result; @@ -208,7 +228,116 @@ public class GameBus isGive = 0; } - item.isAsk = cheakResult.result ? 1 : 0; + result.Needs.AddRange(cheakResult.Needs); + } + + result.result = isok; + result.isDeal = isDeal; + result.isGive = isGive; + return result; + } + + public static async Task CheckNeeds(string userId, List needs, int count = 1) + { + CheckTowerNeeds result = new CheckTowerNeeds(); + bool isok = true; + int isDeal = 1; + int isGive = 1; + result.Needs = new List(); + foreach (var item in needs) + { + item.isAsk = 1; + if (item.code == nameof(GameEnum.PropCode.Equ)) + { + var equService = App.GetService(); + int MyCount = await equService.GetUserEquByEquIdCount(userId, Convert.ToInt32(item.parameter)); + long needCount = item.count * count; + item.count = needCount; + item.onCount = MyCount; + if (MyCount < needCount) + { + item.isAsk = 0; + isok = false; + } + } + else if (item.code == nameof(GameEnum.PropCode.Goods)) + { + int MyCount = 0; + var goodsService = App.GetService(); + var goodsInfo = await goodsService.GetUserGoodsInfo(userId, Convert.ToInt32(item.parameter)); + if (goodsInfo != null) + { + MyCount = (int)goodsInfo.count; + if (goodsInfo.isDeal == 0) + { + isDeal = 0; + } + + if (goodsInfo.isGive == 0) + { + isGive = 0; + } + } + + long needCount = item.count * count; + item.count = needCount; + item.onCount = MyCount; + if (MyCount < needCount) + { + isok = false; + item.isAsk = 0; + } + } + else if (item.code == nameof(GameEnum.PropCode.copper)) + { + var accService = App.GetService(); + var MyAcc = await accService.GetUserAccInfo(userId, nameof(AccEnum.AccType.copper)); + long needAcc = item.count * count; + item.count = needAcc; + item.onCount = MyAcc; + if (MyAcc < needAcc) + { + isok = false; + item.isAsk = 0; + } + } + else if (item.code == nameof(GameEnum.PropCode.gold)) + { + var accService = App.GetService(); + var MyAcc = await accService.GetUserAccInfo(userId, nameof(AccEnum.AccType.gold)); + long needAcc = item.count * count; + item.count = needAcc; + item.onCount = MyAcc; + if (MyAcc < needAcc) + { + item.isAsk = 0; + isok = false; + } + } + else if (item.code == nameof(GameEnum.PropCode.vigour)) //活力 + { + var attrService = App.GetService(); + var MyAcc = await attrService.GetUserVigourInfo(userId); + long needAcc = item.count * count; + item.count = needAcc; + item.onCount = (long)MyAcc.vitality; + if (MyAcc.vitality < needAcc) + { + item.isAsk = 0; + isok = false; + } + } + else if (item.code == nameof(GameEnum.PropCode.lev)) + { + var attrService = App.GetService(); + var MyLev = await attrService.GetUserLev(userId); + item.count = item.count; + item.onCount = MyLev; + if (MyLev < item.count) + { + isok = false; + } + } result.Needs.Add(item); } @@ -240,7 +369,7 @@ public class GameBus foreach (var item in timeAward) { var onAward = result.FindIndex(it => it.code == item.code && it.parameter == item.par); - if(onAward>-1) + if (onAward > -1) { result[onAward].count += item.count; } @@ -256,7 +385,6 @@ public class GameBus result.Add(add); } } - } return result; @@ -271,10 +399,12 @@ public class GameBus { return result; } + if (random.data.Count == 0) { return result; } + double totalWeight = random.data.Sum(it => it.chance); int rnd = _randomInstance.Next(Convert.ToInt32(totalWeight) + 1); double current = 0; @@ -290,6 +420,7 @@ public class GameBus return result; } + private static List RandomHandleByChance(RandomModel random, int luck = 0) { var _randomInstance = new Random(); @@ -299,11 +430,12 @@ public class GameBus { return result; } + if (random.data.Count == 0) { return result; } - + foreach (var item in random.data) { double rnd = _randomInstance.NextDouble(); @@ -313,6 +445,7 @@ public class GameBus result.Add(item); } } + return result; } diff --git a/Service/Application.Web/Controllers/Map/MapController.cs b/Service/Application.Web/Controllers/Map/MapController.cs index 62b717e..53667f0 100644 --- a/Service/Application.Web/Controllers/Map/MapController.cs +++ b/Service/Application.Web/Controllers/Map/MapController.cs @@ -132,6 +132,7 @@ public class MapController : ControllerBase #endregion + var broadcast = await _messageService.GetBroadcastData(area); object ret = new { @@ -143,7 +144,8 @@ public class MapController : ControllerBase nearUser, noReadMsg = noReadMsg[3], business, - mapRes + mapRes, + broadcast }; return PoAction.Ok(ret); diff --git a/Service/Application.Web/Controllers/Pub/EquController.cs b/Service/Application.Web/Controllers/Pub/EquController.cs index 11b416b..5baff62 100644 --- a/Service/Application.Web/Controllers/Pub/EquController.cs +++ b/Service/Application.Web/Controllers/Pub/EquController.cs @@ -1,4 +1,5 @@ using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; namespace Application.Web.Controllers.Pub; @@ -13,12 +14,17 @@ public class EquController : ControllerBase private readonly IGameEquService _equService; private readonly IUnitUserAttrService _attrService; private readonly IUnitUserService _userService; + private readonly IGameDicService _dicService; + private readonly IMessageService _messageService; - public EquController(IGameEquService equService, IUnitUserAttrService attrService, IUnitUserService userService) + public EquController(IGameEquService equService, IUnitUserAttrService attrService, IUnitUserService userService, + IGameDicService dicService, IMessageService messageService) { _equService = equService; _attrService = attrService; _userService = userService; + _dicService = dicService; + _messageService = messageService; } /// @@ -109,12 +115,6 @@ public class EquController : ControllerBase return PoAction.Message("装备不存在!"); } - if (equInfo.isAppr == 0) - { - return PoAction.Message("装备未鉴定!"); - } - - equInfo.isLock = equInfo.isLock == 0 ? 1 : 0; bool result = await _equService.UpdateUserEquInfo(equInfo); @@ -341,4 +341,393 @@ public class EquController : ControllerBase return PoAction.Ok(new { data, suit }); } + + /// + /// 获取装备觉醒所需 + /// + /// + /// + [HttpGet] + public async Task GetEquAwakenInfo(string ue) + { + string userId = StateHelper.userId; + var equData = await _equService.GetUserEquInfo(ue); + if (equData == null) + { + return PoAction.Message("装备不存在!"); + } + + if (equData.userId != userId) + { + return PoAction.Message("装备不存在!"); + } + + if (equData.isAppr == 0) + { + return PoAction.Message("装备未鉴定!"); + } + + if (equData.useEndTime < TimeExtend.GetTimeStampSeconds) + { + return PoAction.Message("装备已过期!"); + } + + CheckTowerNeed result = new CheckTowerNeed(); + if (equData.EquAwaken.Count == 0) + { + var dicConfig = await _dicService.GetDicInfo(nameof(GameEnum.DicCode.Awaken)); + List need = JsonConvert.DeserializeObject>(dicConfig.sign); + result = await GameBus.CheckNeed(userId, need); + } + else + { + var upAwaken = + await _equService.GetEquAwakenInfoByLev(equData.EquAwaken[0].atId, equData.EquAwaken[0].lev + 1); + if (upAwaken == null) + { + return PoAction.Message("觉醒已达到上限!"); + } + + result = await GameBus.CheckNeed(userId, upAwaken.need); + } + + return PoAction.Ok(result); + } + + /// + /// 觉醒装备 + /// + /// + /// 0重置,1正常觉醒 + /// + [HttpGet] + public async Task HandleEquAwaken(string ue, int type) + { + string userId = StateHelper.userId; + var equData = await _equService.GetUserEquInfo(ue); + if (equData == null) + { + return PoAction.Message("装备不存在!"); + } + + if (equData.userId != userId) + { + return PoAction.Message("装备不存在!"); + } + + if (equData.isAppr == 0) + { + return PoAction.Message("装备未鉴定!"); + } + + if (equData.useEndTime < TimeExtend.GetTimeStampSeconds) + { + return PoAction.Message("装备已过期!"); + } + + EquAwakenData onAwaken = new EquAwakenData(); + game_equ_awaken newAwaken = new game_equ_awaken(); + CheckTowerNeed result = new CheckTowerNeed(); + if (type == 0) //重置 + { + newAwaken = await _equService.GetRandomOneAwakenByCode(equData.code); + if (newAwaken == null) + { + return PoAction.Message("该部件装备不可觉醒!"); + } + + onAwaken = newAwaken.levAttr.Find(it => it.lev == 1); + var dicConfig = await _dicService.GetDicInfo(nameof(GameEnum.DicCode.Awaken)); + List need = JsonConvert.DeserializeObject>(dicConfig.sign); + result = await GameBus.CheckNeed(userId, need); + } + else + { + if (equData.EquAwaken.Count == 0) + { + newAwaken = await _equService.GetRandomOneAwakenByCode(equData.code); + if (newAwaken == null) + { + return PoAction.Message("该部件装备不可觉醒!"); + } + + onAwaken = newAwaken.levAttr.Find(it => it.lev == 1); + var dicConfig = await _dicService.GetDicInfo(nameof(GameEnum.DicCode.Awaken)); + List need = JsonConvert.DeserializeObject>(dicConfig.sign); + result = await GameBus.CheckNeed(userId, need); + } + else + { + var upAwaken = + await _equService.GetEquAwakenInfoByLev(equData.EquAwaken[0].atId, equData.EquAwaken[0].lev + 1); + if (upAwaken == null) + { + return PoAction.Message("觉醒已达到上限!"); + } + + newAwaken = await _equService.GetEquAwakenInfo(equData.EquAwaken[0].atId); + onAwaken = upAwaken; + result = await GameBus.CheckNeed(userId, upAwaken.need); + } + } + + if (result.result == false) + { + return PoAction.Message("不满足觉醒条件!"); + } + + if (await GameBus.UpdateBag(userId, 0, result.Needs, "觉醒装备")) + { + if (RandomAssist.CheakRandom(onAwaken.success)) + { + EquAwaken awaken = new EquAwaken(); + awaken.atId = newAwaken.atId; + awaken.name = newAwaken.name; + awaken.lev = onAwaken.lev; + awaken.awaken = onAwaken.attr; + equData.EquAwaken = [awaken]; + if (await _equService.UpdateUserEquInfo(equData, true, "觉醒", "装备觉醒")) + { + string msg = $"[{equData.equName}]装备的特性【{awaken.name}】升至{awaken.lev}级!"; + await _messageService.SendBroadcast(userId, nameof(MessageEnum.BroadcastCode.Promote), msg); + //此处为觉醒成功,返回相关数据 + var nextAwaken = + await _equService.GetEquAwakenInfoByLev(equData.EquAwaken[0].atId, + equData.EquAwaken[0].lev + 1); + var nextResult = new CheckTowerNeed() + { + result = false, + Needs = new List() + }; + if (nextAwaken != null) + { + nextResult = await GameBus.CheckNeed(userId, nextAwaken.need); + } + + return PoAction.Ok(new { state = 1, awaken = equData.EquAwaken, result = nextResult }, "觉醒成功!"); + } + else + { + return PoAction.Message("觉醒异常,请稍后尝试!"); + } + } + else + { + //此处为觉醒成功,返回相关数据 + var nextAwaken = + await _equService.GetEquAwakenInfoByLev(equData.EquAwaken[0].atId, + equData.EquAwaken[0].lev + 1); + var nextResult = new CheckTowerNeed() + { + result = false, + Needs = new List() + }; + if (nextAwaken != null) + { + nextResult = await GameBus.CheckNeed(userId, nextAwaken.need); + } + + return PoAction.Ok(new { state = 0, awaken = equData.EquAwaken, result = nextResult }, "觉醒失败!"); + } + } + else + { + return PoAction.Message("觉醒异常,请稍后尝试!"); + } + + return PoAction.Ok(result); + } + + /// + /// 获取强化信息 + /// + /// + /// + [HttpGet] + public async Task GetEquUpInfo(string ueId) + { + string userId = StateHelper.userId; + var equInfo = await _equService.GetUserEquInfo(ueId); + if (equInfo == null) + { + return PoAction.Message("装备不存在!"); + } + + if (equInfo.userId != userId) + { + return PoAction.Message("装备不存在!"); + } + + if (equInfo.isAppr == 0) + { + return PoAction.Message("装备未鉴定!"); + } + + long time = TimeExtend.GetTimeStampSeconds; + if (equInfo.useEndTime < time) + { + return PoAction.Message("装备已过期!"); + } + + if (equInfo.isIntensify == 0) + { + return PoAction.Message("装备不可强化!"); + } + + bool isMax = false; + int upLev = (int)equInfo.intensifyLev + 1; + var needs = await _equService.GetUserEquUpData(upLev); + if (needs == null) + { + isMax = true; + } + + CheckTowerNeeds result = new CheckTowerNeeds(); + result.result = false; + result.Needs = new List(); + if (!isMax) + { + result = await GameBus.CheckNeeds(userId, needs.needData); + } + + return PoAction.Ok(new + { + equData = equInfo, + isMax, + result + }); + } + + /// + /// 强化装备 + /// + /// + /// + [HttpPost] + public async Task HandleEquUp([FromBody] EquUpParms parms) + { + string ueId = parms.ueId; + string userId = StateHelper.userId; + var equInfo = await _equService.GetUserEquInfo(ueId); + if (equInfo == null) + { + return PoAction.Message("装备不存在!"); + } + + if (equInfo.userId != userId) + { + return PoAction.Message("装备不存在!"); + } + + if (equInfo.isAppr == 0) + { + return PoAction.Message("装备未鉴定!"); + } + + long time = TimeExtend.GetTimeStampSeconds; + if (equInfo.useEndTime < time) + { + return PoAction.Message("装备已过期!"); + } + + if (equInfo.isIntensify == 0) + { + return PoAction.Message("装备不可强化!"); + } + + int upLev = (int)equInfo.intensifyLev + 1; + var needs = await _equService.GetUserEquUpData(upLev); + if (needs == null) + { + return PoAction.Message("已达到最大强化等级!"); + } + + List reqNeeds = JsonConvert.DeserializeObject>(parms.needs); + //验证材料 + foreach (var item in needs.needData) + { + var onNeed = reqNeeds.Find(it => it.Id == item.Id); + if (item.NeedItem.Any(it => it.code == onNeed.code && it.parameter == onNeed.parameter) == false && + item.code != onNeed.code && item.parameter != onNeed.parameter) + { + return PoAction.Message("材料错误!"); + } + } + + var result = await GameBus.CheckNeeds(userId, reqNeeds); + if (result.result == false) + { + return PoAction.Message("材料不足!"); + } + + if (await GameBus.UpdateBag(userId, 0, reqNeeds, $"强化装备:{ueId}")) + { + CheckTowerNeeds nexResult = new CheckTowerNeeds(); + nexResult.result = false; + nexResult.Needs = new List(); + bool isMax = false; + int state = 0; + int okNum = (int)needs.okChance; + if (RandomAssist.CheakRandom(okNum)) + { + state = 1; + equInfo.intensifyLev = upLev; + equInfo.isDeal = result.isDeal; + equInfo.isGive = result.isGive; + if (await _equService.UpdateUserEquInfo(equInfo, true, "强化", "强化装备") == false) + { + return PoAction.Message("强化异常,请联系客服!"); + } + + var nextNeeds = await _equService.GetUserEquUpData((int)equInfo.intensifyLev + 1); + if (needs == null) + { + isMax = true; + } + else + { + var nexts = nextNeeds.euId == needs.euId ? reqNeeds : nextNeeds.needData; + nexResult = await GameBus.CheckNeeds(userId, nexts); + } + } + else //执行材料返还 + { + List retProp = new List(); + foreach (var item in reqNeeds) + { + if (item.retCount > 0 && item.isOp == 1) + { + TowerGet temp = new TowerGet() + { + code = item.code, + name = item.name, + parameter = item.parameter, + count = item.count + }; + retProp.Add(temp); + } + } + + if (retProp.Count > 0) + { + await GameBus.UpdateBag(userId, 1, retProp, "强化失败,返还"); + } + + nexResult = await GameBus.CheckNeeds(userId, reqNeeds); + } + + + return PoAction.Ok(new + { + state, + equData = equInfo, + isMax, + result = nexResult + }); + } + else + { + return PoAction.Message("强化错误,请稍后尝试!"); + } + } } \ No newline at end of file diff --git a/Service/Application.Web/Controllers/User/BagController.cs b/Service/Application.Web/Controllers/User/BagController.cs index 1b5fdf0..2fe4a17 100644 --- a/Service/Application.Web/Controllers/User/BagController.cs +++ b/Service/Application.Web/Controllers/User/BagController.cs @@ -126,4 +126,18 @@ public class BagController : ControllerBase return PoAction.Ok(new { data = new List(), total = total.Value }); } } + + /// + /// 验证用户道具 + /// + /// + /// + [HttpPost] + public async Task CheckUserProp([FromBody] CheckUserPropParms parms) + { + string userId = StateHelper.userId; + List needs = JsonConvert.DeserializeObject>(parms.needs); + var result = await GameBus.CheckNeeds(userId, needs, 1); + return PoAction.Ok(result); + } } \ No newline at end of file diff --git a/Service/Application.Web/Model/RequestParms/Equ/EquUpParms.cs b/Service/Application.Web/Model/RequestParms/Equ/EquUpParms.cs new file mode 100644 index 0000000..e20f461 --- /dev/null +++ b/Service/Application.Web/Model/RequestParms/Equ/EquUpParms.cs @@ -0,0 +1,7 @@ +namespace Application.Web; + +public class EquUpParms +{ + public string ueId { get; set; } + public string needs { get; set; } +} \ No newline at end of file diff --git a/Service/Application.Web/Model/RequestParms/User/CheckUserPropParms.cs b/Service/Application.Web/Model/RequestParms/User/CheckUserPropParms.cs new file mode 100644 index 0000000..0a33a6f --- /dev/null +++ b/Service/Application.Web/Model/RequestParms/User/CheckUserPropParms.cs @@ -0,0 +1,6 @@ +namespace Application.Web; + +public class CheckUserPropParms +{ + public string needs { get; set; } +} \ No newline at end of file diff --git a/Web/public/images/broad/award.gif b/Web/public/images/broad/award.gif new file mode 100644 index 0000000000000000000000000000000000000000..c1c151bc18a255d4ba3804d4c475e4e0cac44546 GIT binary patch literal 58343 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 literal 0 HcmV?d00001 diff --git a/Web/public/images/broad/hot1.gif b/Web/public/images/broad/hot1.gif new file mode 100644 index 0000000000000000000000000000000000000000..5d6d0157c30797d2d0370c34dc45f786b74e4c37 GIT binary patch literal 17732 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 literal 0 HcmV?d00001 diff --git a/Web/public/images/broad/promote.gif b/Web/public/images/broad/promote.gif new file mode 100644 index 0000000000000000000000000000000000000000..f86aca17e745c55ddc44d6ccbec646ef1efd0b1d GIT binary patch literal 4501 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 V%bKzA=8?HCzLnb>8H2Lk_-`lthE@Oo literal 0 HcmV?d00001 diff --git a/Web/public/images/broad/system.gif b/Web/public/images/broad/system.gif new file mode 100644 index 0000000000000000000000000000000000000000..aeff5156695282b2e235299540d0016bce454a65 GIT binary patch literal 2477 zcmeHIdsGu=79Spx;Dd_AM_XNnAhaq;CJzWni4qb(tU*MmwzXX*$shre3CTbL)?D|5eo@PAR)=@L_v4Yal7a2*+2LDW9FOt z`rZ5c?)@e3a`G1bWe>i)-P--o(bS7OalE+?KhiZptu%*J zn1L(xE*)b85~ZWRc^ZR&~eY;1XKo}Eu#gkc0e(bTt6hGPo;u@( zdds|gBY+voE;-N>wo?Om$34f{UiaofT)t5jpa{lb;vKO< zr-G#!2nI@!O>!llGJK|m0?K84%KA_-BvuKLH2KOrHL@-*K1rIFA?3;_E0%*1I-X9U zQXm)%>J*tu4Nu3Xz%o>V@QA%jOs9a4O|T3;Mc`6^E=(b+MnDb?qDmnM0y$io43@xB zi6jJMLQDo7V$&IHDg^OZTppVZPA&=or~JV%$~R7_!C<8nnZlM6 z*pt4{Z~F3tY6QkmbrOnZPPIWo8j7KsG*ksLnKU-|+IqQChH5oSTxay8WD%m4=OD5e zHL3s~lgyJpCjm&B%9RrBL*+;%2vx=95zXUG3`pOUI8_{(Sj|@4vfr@!R$bZLKZm&z(JU`qark zooN2%>*HTFeR=GQ&l?+#9ywh9*`c~W*47;S^g#6=_J6YP~6}K`rCR!wn5=5?8&X0JV#|`I%g|b;p21KV(LzXRF^4hDxL5l+^ z0igfy7A<_`<(C%BpEuX<#W}vSU+|eVbH;RUGRbS2r-wUn-2_-YrvX4Y5aPPlTt8)i zJPa)IUbwQUrmfJu4$LZ?9ZMB}jTX;x)4N^z$dPAxW83naW2?y?>-7b09$4qBvgYDl zLG-F2pwX|E6y&4Bz&TL`z8AdKodjnW0WW${3Q|%;Z96|Lb`Pi?sHu%D3d=aMb8TTy z*B-C%qJ#=?yU#qPD&gbtl-udmeC^=%-G)1EZ6s29oe%k6IdB6AR>+=!|1{5Mis^*V z8<;~VRsjC|>5H2N>I7StlCf_)*9M5@z8n^DmsBCrm(27{PaEkvxEmCfCM~Y4jjRfa zZrGT6RTjIK_D(%p=exMQ;8{!;;r{_Fl>k!*5@1sY;2+`Rw`d=ew0hn$grf7kmf}8N z|Ag+XZLy{C4I6(*Ts5C9?{5kKM literal 0 HcmV?d00001 diff --git a/Web/src/components/Base/Aimage.vue b/Web/src/components/Base/Aimage.vue index 087fa08..c5a224d 100644 --- a/Web/src/components/Base/Aimage.vue +++ b/Web/src/components/Base/Aimage.vue @@ -1,5 +1,7 @@ \ No newline at end of file diff --git a/Web/src/components/Business/GameBroadcast.vue b/Web/src/components/Business/GameBroadcast.vue new file mode 100644 index 0000000..aa5778f --- /dev/null +++ b/Web/src/components/Business/GameBroadcast.vue @@ -0,0 +1,408 @@ + + + \ No newline at end of file diff --git a/Web/src/components/Business/GamePropVerify.vue b/Web/src/components/Business/GamePropVerify.vue new file mode 100644 index 0000000..02255c2 --- /dev/null +++ b/Web/src/components/Business/GamePropVerify.vue @@ -0,0 +1,18 @@ + + \ No newline at end of file diff --git a/Web/src/pages/map/index.vue b/Web/src/pages/map/index.vue index aa44778..2153825 100644 --- a/Web/src/pages/map/index.vue +++ b/Web/src/pages/map/index.vue @@ -1,7 +1,8 @@ \ No newline at end of file diff --git a/Web/src/pages/user/bag/index.vue b/Web/src/pages/user/bag/index.vue index c32a241..411e82f 100644 --- a/Web/src/pages/user/bag/index.vue +++ b/Web/src/pages/user/bag/index.vue @@ -54,7 +54,7 @@ (未鉴定) (过期) (损坏) - (锁) + (绑)
diff --git a/Web/src/pages/user/equ/awaken.vue b/Web/src/pages/user/equ/awaken.vue new file mode 100644 index 0000000..8f13f8e --- /dev/null +++ b/Web/src/pages/user/equ/awaken.vue @@ -0,0 +1,48 @@ + + \ No newline at end of file diff --git a/Web/src/pages/user/equ/up.vue b/Web/src/pages/user/equ/up.vue new file mode 100644 index 0000000..f828b88 --- /dev/null +++ b/Web/src/pages/user/equ/up.vue @@ -0,0 +1,147 @@ + + \ No newline at end of file diff --git a/Web/src/services/Index/EquService.ts b/Web/src/services/Index/EquService.ts index 38a5195..ccc6a8c 100644 --- a/Web/src/services/Index/EquService.ts +++ b/Web/src/services/Index/EquService.ts @@ -54,4 +54,39 @@ export class EquService { static async GetUserOnSuitInfo(suitCode: string) { return await ApiService.Request("get", "/Equ/GetUserOnSuitInfo", { suitCode }); } + + /** + * 获取装备觉醒所需 + * GET /Equ/GetEquAwakenInfo + */ + static async GetEquAwakenInfo(ue: string) { + return await ApiService.Request("get", "/Equ/GetEquAwakenInfo", { ue }); + } + + /** + * 觉醒装备 + * GET /Equ/HandleEquAwaken + * @param type 0重置,1正常觉醒 + */ + static async HandleEquAwaken(ue: string, type: number) { + return await ApiService.Request("get", "/Equ/HandleEquAwaken", { ue, type }); + } + + /** + * 获取强化信息 + * GET /Equ/GetEquUpInfo + */ + static async GetEquUpInfo(ueId: string) { + return await ApiService.Request("get", "/Equ/GetEquUpInfo", { ueId }); + } + + /** + * 强化装备 + * POST /Equ/HandleEquUp + * @param ueId body + * @param needs body + */ + static async HandleEquUp(ueId: string, needs: string) { + return await ApiService.Request("post", "/Equ/HandleEquUp", { ueId, needs }); + } } \ No newline at end of file diff --git a/Web/src/services/user/BagService.ts b/Web/src/services/user/BagService.ts index bd83acc..0892817 100644 --- a/Web/src/services/user/BagService.ts +++ b/Web/src/services/user/BagService.ts @@ -8,10 +8,19 @@ export class BagService { } /** - * GetUserBagProp + * 获取用户道具数据 * GET /User/Bag/GetUserBagProp */ static async GetUserBagProp(type: number, ch: number, query: string, page: number) { return await ApiService.Request("get", "/User/Bag/GetUserBagProp", { type, ch, query, page }); } + + /** + * 验证用户道具 + * POST /User/Bag/CheckUserProp + * @param needs body + */ + static async CheckUserProp(needs: string) { + return await ApiService.Request("post", "/User/Bag/CheckUserProp", { needs }); + } } \ No newline at end of file From 429701983601deb96139925254a9fd85a6820d9f Mon Sep 17 00:00:00 2001 From: Putoo <290555932@qq.com> Date: Wed, 17 Jun 2026 19:31:21 +0800 Subject: [PATCH 04/14] 121212 --- .../Application.Web/Controllers/Pub/EquController.cs | 6 ++++++ Web/src/pages/user/equ/up.vue | 12 +++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/Service/Application.Web/Controllers/Pub/EquController.cs b/Service/Application.Web/Controllers/Pub/EquController.cs index 5baff62..f67438b 100644 --- a/Service/Application.Web/Controllers/Pub/EquController.cs +++ b/Service/Application.Web/Controllers/Pub/EquController.cs @@ -689,6 +689,12 @@ public class EquController : ControllerBase var nexts = nextNeeds.euId == needs.euId ? reqNeeds : nextNeeds.needData; nexResult = await GameBus.CheckNeeds(userId, nexts); } + + if (equInfo.intensifyLev >= 60) + { + string msg = $"[{equInfo.equName}]装备强化至{equInfo.intensifyLev}级!"; + await _messageService.SendBroadcast(userId, nameof(MessageEnum.BroadcastCode.Promote), msg); + } } else //执行材料返还 { diff --git a/Web/src/pages/user/equ/up.vue b/Web/src/pages/user/equ/up.vue index f828b88..92011c1 100644 --- a/Web/src/pages/user/equ/up.vue +++ b/Web/src/pages/user/equ/up.vue @@ -44,7 +44,7 @@ 4.使用龙泉水装备会不可交易,使用正龙泉水装备自动为可交易状态。
- +
@@ -74,8 +74,7 @@ onMounted(async () => { } }) const BindData = async (): Promise => { - let result = await EquService.GetEquUpInfo(ueId); - console.log(result); + let result = await EquService.GetEquUpInfo(ueId); if (result.code == 0) { equData.value = result.data.equData; isMax.value = result.data.isMax; @@ -98,7 +97,7 @@ const ChangeProp = (data: any) => { } const ChangePropOk = async (data: any) => { - MessageExtend.LoadingToast("切换中..."); + MessageExtend.LoadingToast("更换中..."); needs.value.forEach(it => { if (it.id == changeNum.value) { it.name = data.name; @@ -108,8 +107,7 @@ const ChangePropOk = async (data: any) => { } }); let _needs = JSON.stringify(needs.value); - let result = await BagService.CheckUserProp(_needs); - console.log(result); + let result = await BagService.CheckUserProp(_needs); MessageExtend.LoadingClose(); if (result.code == 0) { verifyData.value = result.data; @@ -117,7 +115,7 @@ const ChangePropOk = async (data: any) => { showChange.value = false; } else { - MessageExtend.ShowDialog("材料切换", result.msg); + MessageExtend.ShowDialog("材料更换", result.msg); } } From ad49fbb1b125742b3cef156c8a5adedeb70bb41e Mon Sep 17 00:00:00 2001 From: Putoo <290555932@qq.com> Date: Thu, 18 Jun 2026 18:54:22 +0800 Subject: [PATCH 05/14] 121212 --- Kx.SeaTime.sln.DotSettings.user | 1 + .../model/RandomDataBase.cs | 7 + .../resource/game/game_equ_attr.cs | 81 ++++++ .../resource/game/game_equ_make.cs | 45 ++++ .../view/MakePaperView.cs | 7 + .../Application.Domain/Config/GameConfig.cs | 1 + Service/Application.Domain/Enum/GameEnum.cs | 4 + .../Services/Interface/Equ/IGameEquService.cs | 11 +- .../Services/Service/Equ/GameEquService.cs | 236 +++++++++++++++++- .../Application.Domain/Tool/Base/GameBus.cs | 28 +++ .../Application.Domain/Tool/Base/GameTool.cs | 36 ++- .../Controllers/Map/StoreController.cs | 13 +- .../Controllers/Pub/BusinessController.cs | 134 ++++++++++ .../Controllers/Pub/EquController.cs | 193 +++++++++++++- .../Controllers/Pub/RecoverController.cs | 194 +++++++++++++- .../Controllers/User/BagController.cs | 16 +- .../RequestParms/User/CheckUserPropParms.cs | 2 + Web/public/images/equ/gw.png | Bin 0 -> 1288 bytes Web/public/images/equ/hm.gif | Bin 0 -> 3684 bytes Web/public/images/equ/l.gif | Bin 0 -> 608 bytes Web/public/images/equ/ly.gif | Bin 0 -> 2793 bytes Web/public/images/equ/ms.png | Bin 0 -> 1342 bytes Web/public/images/equ/r.gif | Bin 0 -> 615 bytes Web/public/images/equ/sy.png | Bin 0 -> 770 bytes Web/public/images/equ/tq.png | Bin 0 -> 1064 bytes Web/public/images/equ/ty.png | Bin 0 -> 1290 bytes Web/public/images/equ/zx.png | Bin 0 -> 1233 bytes Web/src/assets/css/style.css | 167 ++++++++++++- Web/src/components/Business/GameEqu.vue | 16 +- Web/src/pages/business/equmake.vue | 105 ++++++++ Web/src/pages/business/retEqu.vue | 71 ++++++ Web/src/pages/map/index.vue | 5 +- Web/src/pages/prop/equ.vue | 27 +- Web/src/pages/user/bag/index.vue | 23 +- Web/src/pages/user/equ/index.vue | 20 +- Web/src/pages/user/equ/quality.vue | 147 +++++++++++ Web/src/pages/user/equ/up.vue | 6 +- Web/src/services/Index/BusinessService.ts | 17 ++ Web/src/services/Index/EquService.ts | 24 ++ Web/src/services/Index/RecoverService.ts | 16 ++ Web/src/services/user/BagService.ts | 6 +- Web/src/utility‌/EquTool.ts | 97 +++++++ 42 files changed, 1694 insertions(+), 62 deletions(-) create mode 100644 Service/Application.Domain.Entity/model/RandomDataBase.cs create mode 100644 Service/Application.Domain.Entity/resource/game/game_equ_attr.cs create mode 100644 Service/Application.Domain.Entity/resource/game/game_equ_make.cs create mode 100644 Service/Application.Domain.Entity/view/MakePaperView.cs create mode 100644 Service/Application.Web/Controllers/Pub/BusinessController.cs create mode 100644 Web/public/images/equ/gw.png create mode 100644 Web/public/images/equ/hm.gif create mode 100644 Web/public/images/equ/l.gif create mode 100644 Web/public/images/equ/ly.gif create mode 100644 Web/public/images/equ/ms.png create mode 100644 Web/public/images/equ/r.gif create mode 100644 Web/public/images/equ/sy.png create mode 100644 Web/public/images/equ/tq.png create mode 100644 Web/public/images/equ/ty.png create mode 100644 Web/public/images/equ/zx.png create mode 100644 Web/src/pages/business/equmake.vue create mode 100644 Web/src/pages/business/retEqu.vue create mode 100644 Web/src/pages/user/equ/quality.vue create mode 100644 Web/src/services/Index/BusinessService.ts diff --git a/Kx.SeaTime.sln.DotSettings.user b/Kx.SeaTime.sln.DotSettings.user index f1f5bbe..b8201f6 100644 --- a/Kx.SeaTime.sln.DotSettings.user +++ b/Kx.SeaTime.sln.DotSettings.user @@ -5,6 +5,7 @@ ForceIncluded ForceIncluded ForceIncluded + ForceIncluded ForceIncluded ForceIncluded ForceIncluded diff --git a/Service/Application.Domain.Entity/model/RandomDataBase.cs b/Service/Application.Domain.Entity/model/RandomDataBase.cs new file mode 100644 index 0000000..cdfbea9 --- /dev/null +++ b/Service/Application.Domain.Entity/model/RandomDataBase.cs @@ -0,0 +1,7 @@ +namespace Application.Domain.Entity; + +public class RandomDataBase +{ + public double random { get; set; } + public object data { get; set; } +} \ No newline at end of file diff --git a/Service/Application.Domain.Entity/resource/game/game_equ_attr.cs b/Service/Application.Domain.Entity/resource/game/game_equ_attr.cs new file mode 100644 index 0000000..145b8f2 --- /dev/null +++ b/Service/Application.Domain.Entity/resource/game/game_equ_attr.cs @@ -0,0 +1,81 @@ +using SqlSugar; +using System; + +namespace Application.Domain.Entity +{ + [Tenant("Kg.SeaTime.Resource")] + public class game_equ_attr + { + /// + /// erId + /// + [SugarColumn(IsPrimaryKey = true, Length = 50)] + public string erId { get; set; } + + /// + /// equCode + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? equCode { get; set; } + + /// + /// minLev + /// + [SugarColumn(IsNullable = true)] + public int? minLev { get; set; } + + /// + /// maxLev + /// + [SugarColumn(IsNullable = true)] + public int? maxLev { get; set; } + + /// + /// 权重 + /// + [SugarColumn(IsNullable = true)] + public int? random { get; set; } + + /// + /// 属性类型:Number 数值 float 百分比 + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? nt { get; set; } + + /// + /// 属性 + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? code { get; set; } + + /// + /// compute + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? compute { get; set; } + + /// + /// min_v + /// + [SugarColumn(Length = 18, IsNullable = true)] + public decimal? min_v { get; set; } + + /// + /// max_v + /// + [SugarColumn(Length = 18, IsNullable = true)] + public decimal? max_v { get; set; } + + /// + /// tips + /// + [SugarColumn(Length = 255, IsNullable = true)] + public string? tips { get; set; } + + /// + /// remark + /// + [SugarColumn(Length = 255, IsNullable = true)] + public string? remark { get; set; } + } +} diff --git a/Service/Application.Domain.Entity/resource/game/game_equ_make.cs b/Service/Application.Domain.Entity/resource/game/game_equ_make.cs new file mode 100644 index 0000000..035b685 --- /dev/null +++ b/Service/Application.Domain.Entity/resource/game/game_equ_make.cs @@ -0,0 +1,45 @@ +using SqlSugar; +using System; + +namespace Application.Domain.Entity +{ + [Tenant("Kg.SeaTime.Resource")] + public class game_equ_make + { + /// + /// mkId + /// + [SugarColumn(IsPrimaryKey = true, Length = 50)] + public string mkId { get; set; } + + /// + /// goodsId + /// + [SugarColumn(IsNullable = true)] + public int? goodsId { get; set; } + + /// + /// equId + /// + [SugarColumn(IsNullable = true)] + public int? equId { get; set; } + + /// + /// equName + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? equName { get; set; } + + /// + /// random + /// + [SugarColumn(IsNullable = true)] + public int? random { get; set; } + + /// + /// 是否随机特性 + /// + [SugarColumn(IsNullable = true)] + public int? rdAttr { get; set; } + } +} \ No newline at end of file diff --git a/Service/Application.Domain.Entity/view/MakePaperView.cs b/Service/Application.Domain.Entity/view/MakePaperView.cs new file mode 100644 index 0000000..c6ec2f7 --- /dev/null +++ b/Service/Application.Domain.Entity/view/MakePaperView.cs @@ -0,0 +1,7 @@ +namespace Application.Domain.Entity; + +public class MakePaperView +{ + public game_goods goods { get; set; } + public long count { get; set; } +} \ No newline at end of file diff --git a/Service/Application.Domain/Config/GameConfig.cs b/Service/Application.Domain/Config/GameConfig.cs index 9b0ba43..0c643ed 100644 --- a/Service/Application.Domain/Config/GameConfig.cs +++ b/Service/Application.Domain/Config/GameConfig.cs @@ -17,4 +17,5 @@ public static class GameConfig public const int GameAutoDrugGoodsId = 10001;//急救箱物品ID public const int GameToMapNeedCopper = 5;//传送每海里费用 public const int TeamCacheTime = 300;//队伍缓存时间 + public const int GameEquApprGoods = 10001;//鉴定装备道具 } \ No newline at end of file diff --git a/Service/Application.Domain/Enum/GameEnum.cs b/Service/Application.Domain/Enum/GameEnum.cs index b99b983..06c8b14 100644 --- a/Service/Application.Domain/Enum/GameEnum.cs +++ b/Service/Application.Domain/Enum/GameEnum.cs @@ -55,11 +55,15 @@ public static class GameEnum RetBlood, RetMorale, RetVigour, + RetEqu, MapTo, + Store, + Make, } public enum DicCode { Awaken,//觉醒配置 + Quality,//洗练配置 } } \ No newline at end of file diff --git a/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs b/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs index 937c5c4..9313e39 100644 --- a/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs +++ b/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs @@ -20,7 +20,8 @@ public interface IGameEquService Task GetUserEquByEquIdCount(string userId, int equId); Task> GetUserEquByEquId(string userId, int equId); Task AddUserEqu(string userId, int equId, int count, string remark); - + Task AddUserEqu(unit_user_equ equData, string remark); + Task AddUserEqu(string userId, int equId, bool rdAttr = false, string remark = ""); Task UpdateUserEquInfo(unit_user_equ equData, bool isAddLog = false, string code = "", string remark = ""); @@ -44,14 +45,22 @@ public interface IGameEquService #endregion + #region 洗练属性/词条 + + Task> GetRandomEquAttr(string equCode, int lev); + + #endregion + #region 强化相关 Task GetUserEquUpData(int lev); + #endregion #region 辅助 Task GetUserEquWeightSum(string userId); + Task GetMakeEquByGoodsId(int goodsId); #endregion } \ No newline at end of file diff --git a/Service/Application.Domain/Services/Service/Equ/GameEquService.cs b/Service/Application.Domain/Services/Service/Equ/GameEquService.cs index 5e2e576..1962f3a 100644 --- a/Service/Application.Domain/Services/Service/Equ/GameEquService.cs +++ b/Service/Application.Domain/Services/Service/Equ/GameEquService.cs @@ -180,6 +180,115 @@ public class GameEquService(ISqlSugarClient DbClient, IRedisCache redis) : IGame return result; } + public async Task AddUserEqu(unit_user_equ equData, string remark) + { + var db = DbClient.AsTenant().GetConnectionWithAttr(); + var result = await db.Insertable(equData).ExecuteCommandAsync() > 0; + if (result) + { + //添加日志 + await AddEquLogs([equData], 1, remark, true); + //更新负重 + int weightCount = Convert.ToInt32(equData.weight); + if (weightCount > 0) + { + var attrService = App.GetService(); + await attrService.UpdateUserWeight(equData.userId, 1, weightCount); + } + } + + return result; + } + + public async Task AddUserEqu(string userId, int equId, bool rdAttr = false, string remark = "") + { + var equ = await GetEquInfo(equId); + if (equ == null) + { + return null; + } + + unit_user_equ ue = new unit_user_equ(); + string ueId = StringAssist.NewGuid; + ue.ueId = ueId; + ue.userId = userId; + ue.owerId = userId; + ue.equId = equ.equId; + ue.equName = equ.equName; + ue.unitEquName = equ.equName; + ue.img = equ.img; + ue.sign = ""; + ue.isAppr = 1; + if (equ.isAppr == 0) + { + ue.minAtk = equ.minAtk; + ue.maxAtk = equ.maxAtk; + ue.Defense = Convert.ToInt32(equ.defense); + ue.Agility = Convert.ToInt32(equ.agility); + ue.Morale = Convert.ToInt32(equ.morale); + ue.Blood = Convert.ToInt32(equ.blood); + } + else + { + ue.minAtk = RandomAssist.GetFormatedNumeric((int)equ.minAtk, (int)equ.maxAtk); + ue.maxAtk = RandomAssist.GetFormatedNumeric((int)equ.minAtk, (int)equ.maxAtk); + string[] def = equ.defense.Split('-'); + ue.Defense = RandomAssist.GetFormatedNumeric(Convert.ToInt32(def[0]), Convert.ToInt32(def[1])); + string[] agi = equ.agility.Split('-'); + ue.Agility = RandomAssist.GetFormatedNumeric(Convert.ToInt32(agi[0]), Convert.ToInt32(agi[1])); + string[] mor = equ.morale.Split('-'); + ue.Morale = RandomAssist.GetFormatedNumeric(Convert.ToInt32(mor[0]), Convert.ToInt32(mor[1])); + string[] blo = equ.blood.Split('-'); + ue.Blood = RandomAssist.GetFormatedNumeric(Convert.ToInt32(blo[0]), Convert.ToInt32(blo[1])); + } + + ue.code = equ.code; + ue.suitCode = equ.suitCode; + ue.lev = equ.lev; + ue.durability = equ.durability; + ue.maxdurability = equ.durability; + ue.isIntensify = equ.isIntensify; + ue.intensifyLev = 0; + ue.isLock = 0; + ue.holeCount = equ.holeCount; + ue.sex = equ.sex; + ue.weight = equ.weight; + ue.sysPrice = equ.sysPrice; + ue.qualityAttr = new List(); + if (rdAttr == false) + { + ue.quality = equ.quality; + ue.qualityName = GameTool.GetEquQualityName((int)ue.quality); + ue.EquAttr = equ.equAttr; + } + else + { + var randomAttr = await GetRandomEquAttr(equ.code, (int)equ.lev); + ue.quality = randomAttr.Count; + ue.qualityName = GameTool.GetEquQualityName((int)ue.quality); + ue.EquAttr = randomAttr; + } + + ue.canEqualUp = equ.canEqualUp; + ue.isDeal = equ.isDeal; + ue.isGive = equ.isGive; + ue.opTime = 0; + ue.start = 0; + ue.EquMent = new EquMent(); + ue.EquAwaken = new List(); + ue.GemMent = new List(); + ue.useEndTime = TimeExtend.GetTimeStampBySeconds(DateTime.Now.AddYears(20)); + ue.isOn = 0; + if (await AddUserEqu(ue, remark)) + { + return ue; + } + else + { + return null; + } + } + public async Task UpdateUserEquInfo(unit_user_equ equData, bool isAddLog = false, string code = "", string remark = "") { @@ -507,6 +616,93 @@ public class GameEquService(ISqlSugarClient DbClient, IRedisCache redis) : IGame #endregion + #region 洗练属性/词条 + + private async Task> GetEquAttrData(string erCode) + { + string key = string.Format(BaseCache.BaseCacheKeys, "EquData", "EquAttrData"); + if (await redis.HExistsHashAsync(key, erCode)) + { + return await redis.GetHashAsync>(key, erCode); + } + + var db = DbClient.AsTenant().GetConnectionWithAttr(); + var data = await db.Queryable().Where(it => it.equCode == erCode).ToListAsync(); + await redis.AddHashAsync(key, erCode, data); + return data; + } + + public async Task> GetRandomEquAttr(string equCode, int lev) + { + //计算出的数量 + List numData = new List() + { + new RandomDataBase() { random = 100, data = 1 }, + new RandomDataBase() { random = 90, data = 2 }, + new RandomDataBase() { random = 80, data = 3 }, + new RandomDataBase() { random = 50, data = 4 }, + new RandomDataBase() { random = 30, data = 5 }, + new RandomDataBase() { random = 15, data = 6 }, + new RandomDataBase() { random = 5, data = 7 }, + }; + var numR = GameBus.GetRandomByWeight(numData); + int onNum = Convert.ToInt32(numR.data); + var attrData = await GetEquAttrData(equCode); + attrData = attrData.FindAll(it => it.minLev <= lev && it.maxLev >= lev); + + //开始随机拿属性权重 + List data = new List(); + List weights = new List(); + List attrResult = new List(); + Random rand = new Random(); + + foreach (var item in attrData) + { + data.Add(item); + weights.Add(ushort.Parse(item.random.ToString())); + } + + RandomAssist random = new RandomAssist(onNum); + + attrResult = random.ControllerRandomExtract(rand, data, weights); + List result = new List(); + if (attrResult.Count > 0) + { + foreach (var item in attrResult) + { + var onAttr = item as game_equ_attr; + + AttrItem temp = new AttrItem(); + temp.code = onAttr.code; + temp.compute = onAttr.compute; + if (onAttr.nt == "Number") + { + int onMin = Convert.ToInt32(onAttr.min_v); + int onMax = Convert.ToInt32(onAttr.max_v); + int onPar = RandomAssist.GetFormatedNumeric(onMin, onMax + 1); + temp.parameter = onPar; + string onTip = temp.parameter.ToString().TrimEnd('0').TrimEnd('.'); + temp.tip = string.Format(onAttr.tips, onTip); + } + else + { + int onMin = Convert.ToInt32(onAttr.min_v * 100); + int onMax = Convert.ToInt32(onAttr.max_v * 100); + int onPar = RandomAssist.GetFormatedNumeric(onMin, onMax + 1); + temp.parameter = Math.Round(Convert.ToDecimal(onPar / 100.000M), 2); + string onTip = (temp.parameter * 100).ToString().TrimEnd('0').TrimEnd('.'); + temp.tip = string.Format(onAttr.tips, onTip); + } + + result.Add(temp); + } + } + + return result; + } + + #endregion + #region 强化相关 public async Task GetUserEquUpData(int lev) @@ -522,9 +718,9 @@ public class GameEquService(ISqlSugarClient DbClient, IRedisCache redis) : IGame await redis.AddHashAsync(key, lev.ToString(), data); } } + return data; } - #endregion @@ -537,5 +733,43 @@ public class GameEquService(ISqlSugarClient DbClient, IRedisCache redis) : IGame return data.Sum(it => (int)it.weight); } + private async Task> GetEquMakeData(int goodsId) + { + string key = string.Format(BaseCache.BaseCacheKeys, "EquData", "EquUpData"); + if (await redis.HExistsHashAsync(key, goodsId.ToString())) + { + return await redis.GetHashAsync>(key, goodsId.ToString()); + } + + var db = DbClient.AsTenant().GetConnectionWithAttr(); + var data = await db.Queryable().Where(it => it.goodsId == goodsId).ToListAsync(); + await redis.AddHashAsync(key, goodsId.ToString(), data); + return data; + } + + public async Task GetMakeEquByGoodsId(int goodsId) + { + //构建随机数据 + List equBase = new List(); + var equData = await GetEquMakeData(goodsId); + foreach (var me in equData) + { + RandomDataBase temp = new RandomDataBase(); + temp.random = (double)me.random; + temp.data = me; + equBase.Add(temp); + } + + var makeEqu = GameBus.GetRandomByWeight(equBase); + if (makeEqu == null) + { + return null; + } + + var onMakeEqu = makeEqu.data as game_equ_make; + + return onMakeEqu; + } + #endregion } \ No newline at end of file diff --git a/Service/Application.Domain/Tool/Base/GameBus.cs b/Service/Application.Domain/Tool/Base/GameBus.cs index 027528a..64ead07 100644 --- a/Service/Application.Domain/Tool/Base/GameBus.cs +++ b/Service/Application.Domain/Tool/Base/GameBus.cs @@ -64,6 +64,11 @@ public static class GameBus isok = await accService.UpdateUserAcc(userId, operate, nameof(AccEnum.AccType.teach), count, nameof(AccEnum.Name.其他), remark); } + else if (goodsType.Equals(nameof(GameEnum.PropCode.map))) + { + var mapService = App.GetService(); + isok = await mapService.AddUserCityMap(userId, Convert.ToInt32(parameter)); + } return isok; } @@ -338,6 +343,7 @@ public static class GameBus isok = false; } } + result.Needs.Add(item); } @@ -351,6 +357,28 @@ public static class GameBus #region 概率 + public static RandomDataBase GetRandomByWeight(List data) + { + var _randomInstance = new Random(); + if (data.Count == 0) + { + return null; + } + double totalWeight = data.Sum(it => it.random); + int rnd = _randomInstance.Next(Convert.ToInt32(totalWeight) + 1); + double current = 0; + foreach (var item in data) + { + current += item.random; + if (rnd < current) + { + return item; + } + } + + return null; + } + public static List GetRandomGoods(RandomModel random, int count = 1, int luck = 0) { List result = new List(); diff --git a/Service/Application.Domain/Tool/Base/GameTool.cs b/Service/Application.Domain/Tool/Base/GameTool.cs index 3def85b..f9c2bb5 100644 --- a/Service/Application.Domain/Tool/Base/GameTool.cs +++ b/Service/Application.Domain/Tool/Base/GameTool.cs @@ -138,7 +138,41 @@ public class GameTool return result; } - + + public static string GetEquQualityName(int count) + { + string result = "白"; + switch (count) + { + case 1: + result = "红"; + break; + case 2: + result = "橙"; + break; + case 3: + result = "黄"; + break; + case 4: + result = "绿"; + break; + case 5: + result = "青"; + break; + case 6: + result = "粉"; + break; + case 7: + result = "紫"; + break; + case 8: + result = "金"; + break; + + } + return result; + } + #region 距离计算 /// diff --git a/Service/Application.Web/Controllers/Map/StoreController.cs b/Service/Application.Web/Controllers/Map/StoreController.cs index b9ddabe..7a2d084 100644 --- a/Service/Application.Web/Controllers/Map/StoreController.cs +++ b/Service/Application.Web/Controllers/Map/StoreController.cs @@ -50,6 +50,10 @@ public class StoreController : ControllerBase { return PoAction.Message("Npc不存在!"); } + if (!npcInfo.bus.Any(it => it.code == nameof(GameEnum.NpcBusCode.Store))) + { + return PoAction.Message("业务不可用!"); + } var onMap = await _mapService.GetUserOnMapId(userId); if (npcInfo.mapId != onMap) @@ -84,6 +88,10 @@ public class StoreController : ControllerBase { return PoAction.Message("Npc不存在!"); } + if (!npcInfo.bus.Any(it => it.code == nameof(GameEnum.NpcBusCode.Store))) + { + return PoAction.Message("业务不可用!"); + } var onMap = await _mapService.GetUserOnMapId(userId); if (npcInfo.mapId != onMap) @@ -157,7 +165,10 @@ public class StoreController : ControllerBase { return PoAction.Message("Npc不存在!"); } - + if (!npcInfo.bus.Any(it => it.code == nameof(GameEnum.NpcBusCode.Store))) + { + return PoAction.Message("业务不可用!"); + } var onMap = await _mapService.GetUserOnMapId(userId); if (npcInfo.mapId != onMap) { diff --git a/Service/Application.Web/Controllers/Pub/BusinessController.cs b/Service/Application.Web/Controllers/Pub/BusinessController.cs new file mode 100644 index 0000000..d0c1a8c --- /dev/null +++ b/Service/Application.Web/Controllers/Pub/BusinessController.cs @@ -0,0 +1,134 @@ +using Microsoft.AspNetCore.Mvc; +using Newtonsoft.Json; + +namespace Application.Web.Controllers.Pub; + +/// +/// 业务操作接口 +/// +[Route("[controller]/[action]")] +[ApiController] +[Authorize] +public class BusinessController : ControllerBase +{ + private readonly IGameMapService _mapService; + private readonly IGameEquService _equService; + private readonly IGameGoodsService _goodsService; + + public BusinessController(IGameEquService equService, IGameGoodsService goodsService, IGameMapService mapService) + { + _equService = equService; + _goodsService = goodsService; + _mapService = mapService; + } + + /// + /// 获取打造图纸 + /// + /// + [HttpGet] + public async Task GetEquPaper() + { + string userId = StateHelper.userId; + var data = await _goodsService.GetUserGoodsData(userId, nameof(GoodsEnum.Code.Paper)); + List result = new List(); + foreach (var item in data) + { + MakePaperView temp = new MakePaperView(); + temp.goods = await _goodsService.GetGoodsInfo((int)item.goodsId); + temp.count = (long)item.count; + result.Add(temp); + } + + return PoAction.Ok(result); + } + + /// + /// 打造装备 + /// + /// + /// + /// + [HttpGet] + public async Task HandleEquPaper(int npcId, int goodsId) + { + string userId = StateHelper.userId; + + #region NPC验证 + + var npcInfo = await _mapService.GetNpcInfo(npcId); + if (npcInfo == null) + { + return PoAction.Message("Npc不存在!"); + } + + if (npcInfo.status != 1) + { + return PoAction.Message("Npc不存在!"); + } + + if (!npcInfo.bus.Any(it => it.code == nameof(GameEnum.NpcBusCode.Make))) + { + return PoAction.Message("业务不可用!"); + } + + var onMap = await _mapService.GetUserOnMapId(userId); + if (npcInfo.mapId != onMap) + { + return PoAction.Message("Npc不存在!"); + } + + #endregion + + var myGoods = await _goodsService.GetUserGoodsInfo(userId, goodsId); + if (myGoods == null) + { + return PoAction.Message("暂无图纸!"); + } + + if (myGoods.count < 1) + { + return PoAction.Message("暂无图纸!"); + } + + if (myGoods.code != nameof(GoodsEnum.Code.Paper)) + { + return PoAction.Message("非图纸材料,无法打造!"); + } + + string needstr = await _goodsService.GetGoodsContent(goodsId); + var needs = JsonConvert.DeserializeObject>(needstr); + var check = await GameBus.CheckNeed(userId, needs); + if (check.result) + { + if (await GameBus.UpdateBag(userId, 0, needs, "装备打造")) + { + var onEqu = await _equService.GetMakeEquByGoodsId(goodsId); + if (onEqu == null) + { + return PoAction.Message("打造失败,请联系客服!"); + } + + //发放装备 + bool isRd = onEqu.rdAttr != 0; + var getEqu = await _equService.AddUserEqu(userId, (int)onEqu.equId, isRd, "打造装备"); + if (getEqu != null) + { + return PoAction.Ok(getEqu.ueId, $"打造成功,获得装备[{onEqu.equName}]"); + } + else + { + return PoAction.Message("打造失败,请稍后尝试!"); + } + } + else + { + return PoAction.Message("打造失败,请稍后尝试!"); + } + } + else + { + return PoAction.Message("材料不足!"); + } + } +} \ No newline at end of file diff --git a/Service/Application.Web/Controllers/Pub/EquController.cs b/Service/Application.Web/Controllers/Pub/EquController.cs index f67438b..8601127 100644 --- a/Service/Application.Web/Controllers/Pub/EquController.cs +++ b/Service/Application.Web/Controllers/Pub/EquController.cs @@ -16,15 +16,17 @@ public class EquController : ControllerBase private readonly IUnitUserService _userService; private readonly IGameDicService _dicService; private readonly IMessageService _messageService; + private readonly IGameGoodsService _goodsService; public EquController(IGameEquService equService, IUnitUserAttrService attrService, IUnitUserService userService, - IGameDicService dicService, IMessageService messageService) + IGameDicService dicService, IMessageService messageService, IGameGoodsService goodsService) { _equService = equService; _attrService = attrService; _userService = userService; _dicService = dicService; _messageService = messageService; + _goodsService = goodsService; } /// @@ -142,6 +144,71 @@ public class EquController : ControllerBase return PoAction.Ok(new { data, suit }); } + /// + /// 鉴定装备 + /// + /// + /// + [HttpGet] + public async Task ApprEqu(string ueId) + { + string userId = StateHelper.userId; + var equInfo = await _equService.GetUserEquInfo(ueId); + if (equInfo == null) + { + return PoAction.Message("装备不存在!"); + } + + if (equInfo.userId != userId) + { + return PoAction.Message("装备不存在!"); + } + + if (equInfo.isAppr == 1) + { + return PoAction.Message("装备已鉴定!"); + } + + var resEqu = await _equService.GetEquInfo((int)equInfo.equId); + if (resEqu.isAppr == 0) + { + return PoAction.Message("装备数据异常,联系客服!"); + } + + var myGoods = await _goodsService.GetUserGoodsCount(userId, GameConfig.GameEquApprGoods); + if (myGoods < 1) + { + return PoAction.Message("暂无装备鉴定符!"); + } + + if (await _goodsService.UpdateUserGoods(userId, 0, GameConfig.GameEquApprGoods, 1, "鉴定装备")) + { + equInfo.minAtk = RandomAssist.GetFormatedNumeric((int)resEqu.minAtk, (int)resEqu.maxAtk); + equInfo.maxAtk = RandomAssist.GetFormatedNumeric((int)equInfo.minAtk, (int)resEqu.maxAtk); + string[] def = resEqu.defense.Split('-'); + equInfo.Defense = RandomAssist.GetFormatedNumeric(Convert.ToInt32(def[0]), Convert.ToInt32(def[1])); + string[] agi = resEqu.agility.Split('-'); + equInfo.Agility = RandomAssist.GetFormatedNumeric(Convert.ToInt32(agi[0]), Convert.ToInt32(agi[1])); + string[] mor = resEqu.morale.Split('-'); + equInfo.Morale = RandomAssist.GetFormatedNumeric(Convert.ToInt32(mor[0]), Convert.ToInt32(mor[1])); + string[] blo = resEqu.blood.Split('-'); + equInfo.Blood = RandomAssist.GetFormatedNumeric(Convert.ToInt32(blo[0]), Convert.ToInt32(blo[1])); + equInfo.isAppr = 1; + if (await _equService.UpdateUserEquInfo(equInfo)) + { + return PoAction.Ok(true, "装备鉴定成功!"); + } + else + { + return PoAction.Message("鉴定失败,请稍后尝试!"); + } + } + else + { + return PoAction.Message("鉴定失败,请稍后尝试!"); + } + } + /// /// 穿/卸装备 /// @@ -680,7 +747,7 @@ public class EquController : ControllerBase } var nextNeeds = await _equService.GetUserEquUpData((int)equInfo.intensifyLev + 1); - if (needs == null) + if (nextNeeds == null) { isMax = true; } @@ -693,7 +760,7 @@ public class EquController : ControllerBase if (equInfo.intensifyLev >= 60) { string msg = $"[{equInfo.equName}]装备强化至{equInfo.intensifyLev}级!"; - await _messageService.SendBroadcast(userId, nameof(MessageEnum.BroadcastCode.Promote), msg); + await _messageService.SendBroadcast(userId, nameof(MessageEnum.BroadcastCode.Promote), msg); } } else //执行材料返还 @@ -708,7 +775,7 @@ public class EquController : ControllerBase code = item.code, name = item.name, parameter = item.parameter, - count = item.count + count = item.retCount }; retProp.Add(temp); } @@ -736,4 +803,122 @@ public class EquController : ControllerBase return PoAction.Message("强化错误,请稍后尝试!"); } } + + /// + /// 获取洗练装备属性 + /// + /// + /// + [HttpGet] + public async Task GetEquQualityInfo(string ueId) + { + string userId = StateHelper.userId; + var equInfo = await _equService.GetUserEquInfo(ueId); + if (equInfo == null) + { + return PoAction.Message("装备不存在!"); + } + + if (equInfo.userId != userId) + { + return PoAction.Message("装备不存在!"); + } + + if (equInfo.isAppr == 0) + { + return PoAction.Message("装备未鉴定!"); + } + + long time = TimeExtend.GetTimeStampSeconds; + if (equInfo.useEndTime < time) + { + return PoAction.Message("装备已过期!"); + } + + List CanOp = new List() + { "Hold", "Vice", "Head", "Wear", "Waist", "Foot", "Ornaments" }; + if (!CanOp.Contains(equInfo.code)) + { + return PoAction.Message("该部件不可洗练!"); + } + + var dicConfig = await _dicService.GetDicInfo(nameof(GameEnum.DicCode.Quality)); + List need = JsonConvert.DeserializeObject>(dicConfig.sign); + CheckTowerNeed result = await GameBus.CheckNeed(userId, need); + + return PoAction.Ok(new + { + equData = equInfo, + result + }); + } + + /// + /// 洗练装备 + /// + /// + /// + [HttpGet] + public async Task HandleEquQuality(string ueId) + { + string userId = StateHelper.userId; + var equInfo = await _equService.GetUserEquInfo(ueId); + if (equInfo == null) + { + return PoAction.Message("装备不存在!"); + } + + if (equInfo.userId != userId) + { + return PoAction.Message("装备不存在!"); + } + + if (equInfo.isAppr == 0) + { + return PoAction.Message("装备未鉴定!"); + } + + long time = TimeExtend.GetTimeStampSeconds; + if (equInfo.useEndTime < time) + { + return PoAction.Message("装备已过期!"); + } + + List CanOp = new List() + { "Hold", "Vice", "Head", "Wear", "Waist", "Foot", "Ornaments" }; + if (!CanOp.Contains(equInfo.code)) + { + return PoAction.Message("该部件不可洗练!"); + } + + var dicConfig = await _dicService.GetDicInfo(nameof(GameEnum.DicCode.Quality)); + List need = JsonConvert.DeserializeObject>(dicConfig.sign); + CheckTowerNeed result = await GameBus.CheckNeed(userId, need); + if (result.result) + { + if (await GameBus.UpdateBag(userId, 0, need, "洗练装备")) + { + var attr = await _equService.GetRandomEquAttr(equInfo.code, (int)equInfo.lev); + equInfo.quality = attr.Count; + equInfo.qualityName = GameTool.GetEquQualityName(attr.Count); + equInfo.EquAttr = attr; + if (await _equService.UpdateUserEquInfo(equInfo, true, "洗练装备", "洗练装备")) + { + return PoAction.Ok(true, "洗练成功!"); + } + else + { + return PoAction.Message("洗练失败,请稍后尝试!"); + } + } + else + { + return PoAction.Message("洗练失败,请稍后尝试!"); + } + } + else + { + return PoAction.Message("洗练失败,请稍后尝试!"); + } + } } \ No newline at end of file diff --git a/Service/Application.Web/Controllers/Pub/RecoverController.cs b/Service/Application.Web/Controllers/Pub/RecoverController.cs index 66bf461..29ec57f 100644 --- a/Service/Application.Web/Controllers/Pub/RecoverController.cs +++ b/Service/Application.Web/Controllers/Pub/RecoverController.cs @@ -12,11 +12,15 @@ public class RecoverController : ControllerBase { private readonly IUnitUserAttrService _attrService; private readonly IGameMapService _mapService; + private readonly IUnitUserAccService _accService; + private readonly IGameEquService _equService; - public RecoverController(IUnitUserAttrService attrService, IGameMapService mapService) + public RecoverController(IUnitUserAttrService attrService, IGameMapService mapService,IUnitUserAccService accService,IGameEquService equService) { _attrService = attrService; _mapService = mapService; + _accService = accService; + _equService = equService; } /// @@ -179,6 +183,194 @@ public class RecoverController : ControllerBase #endregion + var data = await _attrService.GetUserVigourInfo(userId); + string time = TimeAssist.GetDateTimeYMDString(0); + if (data.upTime == time) + { + return PoAction.Message("今天已恢复过活力啦!"); + } + if (data.vitality >= data.upVitality) + { + return PoAction.Message("活力满满,无需恢复!"); + } + + bool result = await _attrService.UpdateUserVigour(userId, 2, (long)data.upVitality,time); + if (result) + { + return PoAction.Ok(true); + } + else + { + return PoAction.Message("恢复失败,请稍后尝试!"); + } + } + + /// + /// 获取恢复耐久的装备 + /// + /// + /// + [HttpGet] + public async Task GetUserRecoverEqu(int npcId) + { + string userId = StateHelper.userId; + + #region NPC验证 + + var npcInfo = await _mapService.GetNpcInfo(npcId); + if (npcInfo == null) + { + return PoAction.Message("Npc不存在!"); + } + + if (npcInfo.status != 1) + { + return PoAction.Message("Npc不存在!"); + } + + if (!npcInfo.bus.Any(it => it.code == nameof(GameEnum.NpcBusCode.RetEqu))) + { + return PoAction.Message("业务不可用!"); + } + + var onMap = await _mapService.GetUserOnMapId(userId); + if (npcInfo.mapId != onMap) + { + return PoAction.Message("Npc不存在!"); + } + + #endregion + + int need = 0; + var data = await _equService.GetUserOnEqu(userId); + var needData = data.FindAll(it => + it.isAppr == 1 && it.durability < it.maxdurability && it.useEndTime > TimeExtend.GetTimeStampSeconds); + need = needData.Sum(it => (int)it.maxdurability - (int)it.durability); + return PoAction.Ok(new { data, need }); + } + + /// + /// 恢复装备耐久 + /// + /// + /// + /// + [HttpGet] + public async Task RecoverEqu(int npcId,string? ueId) + { + string userId = StateHelper.userId; + + #region NPC验证 + + var npcInfo = await _mapService.GetNpcInfo(npcId); + if (npcInfo == null) + { + return PoAction.Message("Npc不存在!"); + } + + if (npcInfo.status != 1) + { + return PoAction.Message("Npc不存在!"); + } + + if (!npcInfo.bus.Any(it => it.code == nameof(GameEnum.NpcBusCode.RetEqu))) + { + return PoAction.Message("业务不可用!"); + } + + var onMap = await _mapService.GetUserOnMapId(userId); + if (npcInfo.mapId != onMap) + { + return PoAction.Message("Npc不存在!"); + } + + #endregion + + if (string.IsNullOrEmpty(ueId)) + { + var myEqu = await _equService.GetUserOnEqu(userId); + myEqu = myEqu.FindAll(it => + it.isAppr == 1 && it.durability < it.maxdurability && it.useEndTime > TimeExtend.GetTimeStampSeconds); + int need = myEqu.Sum(it => (int)it.maxdurability - (int)it.durability); + if (need < 1) + { + return PoAction.Message("耐久已满,无需恢复!"); + } + + var myAcc = await _accService.GetUserAccInfo(userId, nameof(AccEnum.AccType.copper)); + if (need > myAcc) + { + return PoAction.Message("铜贝不足!"); + } + + if (await _accService.UpdateUserCopper(userId, 0, need, "修复装备")) + { + foreach (var item in myEqu) + { + item.durability = item.maxdurability; + await _equService.UpdateUserEquInfo(item); + } + return PoAction.Ok(true, $"恢复成功,花费{need}铜贝!"); + } + else + { + return PoAction.Message("恢复失败,请稍后尝试!"); + } + } + else + { + var equInfo = await _equService.GetUserEquInfo(ueId); + if (equInfo == null) + { + return PoAction.Message("装备不存在!"); + } + + if (equInfo.userId != userId) + { + return PoAction.Message("装备不存在!"); + } + + if (equInfo.isAppr != 1) + { + return PoAction.Message("装备未鉴定!"); + } + + if (equInfo.useEndTime < TimeExtend.GetTimeStampSeconds) + { + return PoAction.Message("装备已过期!"); + } + + if (equInfo.durability >= equInfo.maxdurability) + { + return PoAction.Message("耐久已满,无需恢复!"); + } + + int need = (int)equInfo.maxdurability - (int)equInfo.durability; + var myAcc = await _accService.GetUserAccInfo(userId, nameof(AccEnum.AccType.copper)); + if (need > myAcc) + { + return PoAction.Message("铜贝不足!"); + } + + if (await _accService.UpdateUserCopper(userId, 0, need, "修复装备")) + { + equInfo.durability = equInfo.maxdurability; + if (await _equService.UpdateUserEquInfo(equInfo)) + { + return PoAction.Ok(true, $"恢复成功,花费{need}铜贝!"); + } + else + { + return PoAction.Message("恢复失败,请稍后尝试!"); + } + } + else + { + return PoAction.Message("恢复失败,请稍后尝试!"); + } + } + + var data = await _attrService.GetUserVigourInfo(userId); string time = TimeAssist.GetDateTimeYMDString(0); if (data.upTime == time) diff --git a/Service/Application.Web/Controllers/User/BagController.cs b/Service/Application.Web/Controllers/User/BagController.cs index 2fe4a17..3d0dda9 100644 --- a/Service/Application.Web/Controllers/User/BagController.cs +++ b/Service/Application.Web/Controllers/User/BagController.cs @@ -136,8 +136,18 @@ public class BagController : ControllerBase public async Task CheckUserProp([FromBody] CheckUserPropParms parms) { string userId = StateHelper.userId; - List needs = JsonConvert.DeserializeObject>(parms.needs); - var result = await GameBus.CheckNeeds(userId, needs, 1); - return PoAction.Ok(result); + parms.count = parms.count < 1 ? 1 : parms.count; + if (parms.type == 0) + { + List needs = JsonConvert.DeserializeObject>(parms.needs); + var result = await GameBus.CheckNeed(userId, needs, parms.count); + return PoAction.Ok(result); + } + else + { + List needs = JsonConvert.DeserializeObject>(parms.needs); + var result = await GameBus.CheckNeeds(userId, needs, parms.count); + return PoAction.Ok(result); + } } } \ No newline at end of file diff --git a/Service/Application.Web/Model/RequestParms/User/CheckUserPropParms.cs b/Service/Application.Web/Model/RequestParms/User/CheckUserPropParms.cs index 0a33a6f..1d9788e 100644 --- a/Service/Application.Web/Model/RequestParms/User/CheckUserPropParms.cs +++ b/Service/Application.Web/Model/RequestParms/User/CheckUserPropParms.cs @@ -2,5 +2,7 @@ public class CheckUserPropParms { + public int type { get; set; } + public int count { get; set; } public string needs { get; set; } } \ No newline at end of file diff --git a/Web/public/images/equ/gw.png b/Web/public/images/equ/gw.png new file mode 100644 index 0000000000000000000000000000000000000000..f312486e99d8aa076a56b1da5acdd82a76d6b188 GIT binary patch literal 1288 zcmXX_3rv#-5dIyAqI4q+r{YH3W^^uWV;HB&R8S!TLzI`=A+HK{GBv0On-ZZ22!dEz zOG_#5YNd7+5l|Gg#Zf2-l)m4uzkh%GvaLk~R&`}F`R=>ReYv~jE?0Fhejj2*&HIGnd@-Oe#={20Vt>#x z1t^xH+W5QbBoTGCVUcN2JZG742n;VC@+_lD+n55RbHUD0X(0Z(E1?{E%umh3uG;>hX_xyXrKXsx(b(9d#IvCz#n1 zD~D(Ny-kL0ckpG}7M84{8*CiV;d_lgT~qu?mG8tlM38b1PF~0W=_At-I1`%U(pXnuJ7>=EeCfKJ1(5iApR`V?EkRKpwY8jf-ZEzA{ z&h`rKpSE%YB2=U03151mMG<^u&g^ms6~d5ee(a6cp!r1x+0-{`8&jDEc=95ui8cfU zU$Nrol5Mq4xk-MJ=2BZ!kD+aRF(H^&o!Q{I(Z5e{;`$CTX4QHoorMEmKzw) zX0#UP*rX(jq+V5S7wEMcDpiC*Gn+3=Z;<9RLtPWLQPFG2p}=(U!m*|YZ1@lnW{!%I zNP7C1`N@=ZRB5<7smdS=eSB@MR25ExV1)E%rFn|p{#mm-;f6X z(8?My?!_9yufw+13`%d2pWo-XK`FzC3-ZSZm?@=6NDtmO2Q9nILkJM3 zqE;=q&YwTNKkOUXyhD@mrBC0_hm4=T4WrXeA^B;$mFZex z^`ji^d@}14AmS!Z-@Uf-tdrZqea2<6Y`21cgm~qv3x8mqtS#t9Od5R3{SVJ2ZyDcY zPgn04?BNJFA5*cI-4#$*1JtOoXQVyt`Fets5E$@PTxD;u>T&vTmq3=@QFWYkTZ2$lO literal 0 HcmV?d00001 diff --git a/Web/public/images/equ/hm.gif b/Web/public/images/equ/hm.gif new file mode 100644 index 0000000000000000000000000000000000000000..617119b6e6bf101400260941f7f0a72ce4731cb3 GIT binary patch literal 3684 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 literal 0 HcmV?d00001 diff --git a/Web/public/images/equ/l.gif b/Web/public/images/equ/l.gif new file mode 100644 index 0000000000000000000000000000000000000000..ccb64a810d0120c78971c57fd7490cae320a6338 GIT binary patch literal 608 zcmZ?wbhEHb6k!lyc$UmC*Lmta$S<;Nn|X*bqgygBFC zRHeG@hF!-3+a{|tOjNGF(7y5Oy%$r|8+Vs%`1<10GWTh-mFpiZKK1n2ofYoWZf5jf zn0@s8!c+I=9be-){mSfP?=L@ky71&$`Gy59Q;)^;zr6VL`tlRY4LaT(z4zk4?U(bm z?X>RSS+e1F?ZOky+c&sOS*%ch&}GUk^Pcs#6Lx2<-0CuAdoj>GKkwDf-=fj_?d7Kx zvh|M^oOrcj->ZvHFJ?@Be*E6seHYg0cW%^ZU1rz6U88k^dczU3o-G!=bG2Hw%GNJY zsQ-NLC zw6?XksdaRBu=?~&u<}z8oY0-57ppt1Bgxp`VorNfgqiK4wj@_Zi50C$mW-T9n(LCB z8D)|Tw<$5QBzYyRNU~5I79L2DAe2QxK{1^KP*jr4BomSeJA_U4RiKJYCIdvWnFI)KVU~)2F{~{>(RL&hno3yyr_~bc7Ja zoB?Oxt^r_diRv1>AUa$qJz3j(s~6Z39n+K&zde3Q_a^6-bW`t^u(qX7Up|dItekUn z8Q!LC`}T9X#1^xhbhJ*?;FpuZLf6 z>)TO#u{pbAWz)4oJFe|n)U|Htw;`{F_~2dH{;hcxXIEAAZ2#fm&FG_L^N(of@0u@e znU~sC|v2DCXj{dmPMFMrKHrfd7|^qnU^ zUc289Y>!`g+L*Z`tKejL-%sD%esCjpYfQtXZCCGI+1$IS>*kr&J?o9#b?bXJEIn73 zd$QVaZtb=!tyMi+RfknjLtK0RG55ygqGNjE_;N+NKC5+M+Hqsp_JovnL-tX9W_xkw z@zT(PikQ8!^D(jo|+OC zk{HfqLlg@D07z3tTp}pObQt;c57MhKynxVw5+YBg3}8O$IL!oQ(g5aMejF614kPkq zQHwQ1%HsG`d~pGeN|`}{pub+ESEv<)4g>WHxl$|A2QV?IN|!2UrOD&KD2j3*E{Dryksd57W(9xCL*aJU#HpQr#53t({wf>u=ETNGV5z+{aN&$|{LL~bO z2q*+$I3nP)5F}T^%0&>EB@sXZmJlU-!i0RTFOtg~jhDX1+uQbe2v36Y5SFhHmyohW zFqQ=MKKs9gd~?t4hc$%i*z!boEQ~rh+H>%lFQ735y>%S9?1+#O5|dNavd{p zIVNKX5STASaVd+7qbLg@2ojhtjNCty5-Z&n>K#3Vg0&~>;JKKP2K8MwKXeE z#_APSl@;Y>rH19pmM&RbqAxBg)M+(~)GDPyUa(M>pO;HWaS4{QAbbA2kFqi|=BB5m zrX(jNCd9|Z#>|P1ii`*shlPd&2L%TB`-xDYz?YBkxG=Zx25C5sl~ny@y#~Lc4|g&c(u?4^iJ$)8mySiK;u7c&&j>G(G89QgI{<8 zbWg_!{lUJ_P|Jxa>?va5ILbH&`X;qopI2zFR|>6@2A5XaQ>EUBiQ8g4!0=}K^fT+C zr*8ExdeP}rT5buY-9p+Kj}zQPKE9PkC%oDSU!4W~4BxXn5kyV3r{#ncm)co@MU`tQ zV&FQb;$v#x;T#Lw4$8CrE?;B)4QU*zk9q*4)(h+xLw6f$9A{7_cqSBqIjb#FSJR2k z33s|{KzB$sht=cA3_ombW%);~4cG#9q}|s%fO3z@YC~Rv z(ZEbd64oYIc>m2YI_<(>n}f(PpX{hDCc!R`oK z8=KhJUSr~*tDS2be~{Z4Q&}I=;#le=0c@txdJ^*|5V1~JSmL~lLsj&8-++>#$7LRX zl~vB}b24?sz&5TfLr!z@IB)NSx1<4A@XJ;uhBTVHV`t+-z-@f+5Y5BdSh|0~xS2MM zd0m#1ime|Lvm4GH3fYrQ%NXbkp-or0Kh3`sGMN!S&NH@UD7e#|veP}_LaA3z&Eyba z&Xwk@H4O2}e24MWcTC#>6u=6gk`i+vburx#6e*5cYKSz@y$tBIlIRfyy}1pjzz3tA a&ZP#SA<@$?waTDKpPFu{^P!Nc_4^;NiSTUz literal 0 HcmV?d00001 diff --git a/Web/public/images/equ/ms.png b/Web/public/images/equ/ms.png new file mode 100644 index 0000000000000000000000000000000000000000..7c48fcd6668127db281ff9d9ee260089b3bcb217 GIT binary patch literal 1342 zcmV-E1;P4>P)xN#00093P)t-sM{rCZ zo5nSP!y%i-HG#u4fWsM{#WH}yHi5$xpu`rS#U7-{J%q&|qsJSh$3cb08KcJ*pTr!c z$Q7W(8KT7%pu`rS#Tul>9i_-LfWsf1#vr4|I)cO=q{teg#~q}|Bc#bPk;o&R$2^0@ zL95UmrN|(r$tR@BBc;hjh{qYD#zLFTX}H@WrO7I&%sYa_D4E7bipW-<&~Uoj9G=A; zq{ma1%}c4#9i+%1q{%m`&K;h{6`;i|sLUXy$Q7W)8=}S@rN|Ya#DUJ}r`z#e!rbQc z{Ob1o_51$k_5ADi{nG6A+wl3x==ZPQ@WbZx*Y5gRyV`)w=dRuE)$RCo%jVMT`Qr2X z`ThUi@cBx#)5_@dvEA;Y+3&90?3dN;yW#I+#on0H-aUV&@-;jh|uYC z%H)mG>u<^9X2#%!%Go@!(QnA&AgRkavCt~4%wELa6`;gv$Khec-(khxTe`>}t*-WIr^vvk?q1fx-@%n_$=d#}K^!ol|!ro%T-jCAi&gu4=)#vH;`c<^n zdduY~tIe$3?ZD*pGp){+(&eA~gqq}uMr z=JdJZ^lHcA*Y5e6*6%p4&{w8RT0)a>h^8O;*!(poz&-l&EmM<>y6RjwA}E{ z>iJl?*oDvMV!+7f^!niP`@7@zlh57D>G;#?^pw=+eaG2>%h#CI>xatQY{=lY;qzU* z#$m$Lr`P3##NwjVwCF$R@vG{PFt^7btZ2R>e%O zE5~w^5~7#-`?z6Atb0?(+7UcJf|kS)l}j)8C)p zpWivNf6LsCTAz^Ammf>hY#0O`zrD^)+O=U)e|@#r#_KLwA8f4|I2>NwJ+~)1GR)1* z-96yq&4+KSco;Y=)6ecs3Grx*@bH|mZcW6sr{??&tOmN<*Us{*^Yv^A@SU9+cEQ+; zpMjl2Ng*(^seS5{c`Fvi&s?ozWT?-;z|J8hoz|Kh>g*g8x~yA8TT__{6ikwga?>Y7 zEe?!IU#_mmBLfO0NSJb|a&xP3F*7l-ure?J0C9nqx=a(iS^xk507*qoM6N<$f`eim AdjJ3c literal 0 HcmV?d00001 diff --git a/Web/public/images/equ/r.gif b/Web/public/images/equ/r.gif new file mode 100644 index 0000000000000000000000000000000000000000..d4c62824ffe4fba6d4c8299835dbc217173f5c3a GIT binary patch literal 615 zcmV-t0+{_rNk%w1VH5xq0Oo%HzDbtYe6Z}&<&S%3O}XW}Mla#?Nr7 z!+^ERa;*IH_v4eV>7KUDeW|o4h4bF&%ZIbun8fC%!P$nk&^(W*EQY*Xl+>KY*pa@~ zrOMZv#==vas4In^HHzf4)7Y8C-<-qs>G7E;f|V_V)sVc}qREydfYEZE%3!3WErp&V zfVLoj(d4-~jbF1T^ z$lZOQz(|$1E{Mf9jO)nW;FY!Oz1P4{n%|?!(RHx3I*y?&h5!HmA^8LW004ggEC2ui z02BZe000NXfPaF6goTEOh=Ngxi53}*haNj20+59tZ#X%Ygb*e~L7amiU1|uTf<|<8 z5uyoGX#gUvoID6{0BbXx1wUp@07y%m0!0!f07DYQX9`&WFki$z1bhHJ3Wy0)n280O&06Rw8 BOCxN#0004EP)t-sM{rDF z8HQjPhF>6wU>=BI9EV^Yh+r9pU>%2FA&FobhF~6uY)+kCDveu1m|{qpUq_l-M44Yk znRiv8byJ{kP@Y^wnO-oDT0@xs|NmS%la*?#V@aEBPMuvll>Ywz{{8-4I+MGJyk0Sn z{PXzGq|4B>)$Ql*)xw&_tbMih^7-x1htl?;)7YD?91Tv-s|SQ*!JV^_wDul^!WMd z^2~_2&zZxphPz%ynb)Jqb5Nd_Vy0n9o0ns!WKEr*X{l{cpKef|Vo95MSE6Q3o$%o9 zePE~k`~9|ty8G<&+^x^0lf{K#r=@MH^5pQUb+Gu|>hb9F`1JYp?)K=s*L`8AmTj&2 z^7pHDu=?@$bylL9cC*-=#N4*k*00g1fw-!Jx&He6w~M`^ZL1)%HI@JX01R|ePE!Cd zaF}ZF`5@x__K@_q0RsR4010qNS#tmY3labT3lag+-G2N400AyZL_t&-l~s{dZ^J+k zgzxOwv6DS8+hHg(bDJ_VGc)7=uP&r^9!J{I%(tj4EXlHj(O-oWm3SUel~C0TYkJJ5 z)Sxt`YvHmNAwG3i*LSx~my$@y)rfC!fSu>lE#Qkp6JAL74F=%Yj~721Ys-c%a+Mh6 zu(^Mqd%M|tT`BOaf)G}H7vSvs{p0iM`h0E(ToogUP!pV`!f1nk>Q0R25wXa{eD=AuL79??4Fs0&$QfWyNDjH2?qr07*qoM6N<$f&_q? A%m4rY literal 0 HcmV?d00001 diff --git a/Web/public/images/equ/tq.png b/Web/public/images/equ/tq.png new file mode 100644 index 0000000000000000000000000000000000000000..13c5e37acb2630edda7173ad2ac4668d3efdbd16 GIT binary patch literal 1064 zcmXYvc}yI26vqchQK`jh_hcaqEXB3JZ-vSV6fG@KSU_0zVwVDPFNfTRy|__?El|rP zrD*U-trSpVThYd}X+sf9QxFk}Aad>e=GYl1OM~toPNT`YlK08`zT~}TMQp@A2PX#v zLH5Zb!<201JoRVo*!X<{breBtLlrUV@QC6VTq%I@LR`iBuYd{>uIBu2Dn72_L!}U^ zMJxl=0vN}3c~B){F&Hm`Dk0Q3u>dAViDE#v0P+-IIsk3-Vkf|CDNzB)GXUlSq6kp6 zQmPsdC4i~{=J%vb8!*>!TbTfc?fVt>Hw*smG z;Q4@Q^M+Y~de@C^^}-W)WUdpg<6{{Bi$k#_fGJRu9$*O)ybze)lE7?WZj#bQRs~>h z15><&JPWXtSIBonc!~>_2{tU`mAlvK)c(MzY2(WZOq;Q#bAF{}KdrC(e{mj)K zn9?0nqD=Q|_(=|P!3T>MWAW(reFb%jUBeqo16x<$*t+&6St*4EDbsP7>F~h~lE*jY zmY^Z8JVVyS?v1XQUj)S=sVRdkbtC$vH5)|OcZZKN=y-Am?MRHF?}A8rvX(D zOyOd((Aivj(0taNFbIhxE_K@N@tD@KR*xrgEz^3c65Sd+@;4Ph8xK(>F56h0Wj)h^ zWm#Y`nJ;241raGcrh!j4dNO@MPwoWZ8V->qz_mOwkH39C&a#|IH@wVr$(Y_iT+g@s zWnez>-x`t=Y0gxcE1t%~wOk_2g*3Pmg%YYjLX~>qdM*})ZuLZ)&-u~y0aOJF6U0=R zci5F*Z?Rt`C|Aa+5N3C0CGR8j)naBP&w63kx?{Ckcdfe?)zC7_JXaj4FGG;MFFkde znZ;@=g4h`3VaL>hu8dk+$5@#x*3mxm_T+@e^t8vFdlL@)Ov8&g-bJ#hcE9cY*=bEJ zzR|j`@@G$e85KP#3i1sN(|atava*IAeA_z9jp=cKlw*)GzHH*3~uSUb&k+wseq~8y;z%p6$7Do?}W~?wtQ2!??JT zb=csYlY^mcz!Qm>Vt_-^dSPe(u7|H6FVu}j*~QGH3;60har)|o#Z zA+0t-0l!8Q8ZA7^pAQaLUS4ZB@r<3F Z9b)sfdSLa@-Z}OTh&((tZ1{L;{l65l1bP4f literal 0 HcmV?d00001 diff --git a/Web/public/images/equ/ty.png b/Web/public/images/equ/ty.png new file mode 100644 index 0000000000000000000000000000000000000000..a9f3e11b60c4194933ff8ec8d14ffdeeda6db1f5 GIT binary patch literal 1290 zcmX9-c~Dbl5Rav0tOq(uDRPW}5JEu8plHRaSW!e`M1oos(F%i#7lTk0Er;4VPOVxi zC5Q*oDhi0i5RhAnh-d-Jp^$*V0CI>C2zl>&?|tvvhUv`yc7HRwzuiA}_gt_vVEPoB zDFT6Ddf;0B5L2|Az+^L%FWvHCg+O2?2$qDd4v3L3Web^7H>7e$r6wXqDlsbZ_}`c^ zF)9($g>J}HQ0hfL6wyjI^vDxcE@3N06Ov*Nq;f+=VpJ?foCN-D<@1`Zf9tk~M+hKxDJEPJMU!RW=A+~8$A zl#Yke*!qp^a~aovo_xq6`b;vKOS+u#a5_=XCtbE|-x(NA093|3bs?|)d5s4iNF$@S zz<7(i{hqXW1C__O&I4mHFqMFHKodx%v_Sk3N>E@m~@}VtlfG4S1RU5~!ulUWh7EE;onL{%D+r91a$W(Qnxeio)blf0H+WQg}ws%3m!{8B5i zmsiX)srTgOCee1UGT-_}?P6`~n%_>Rv_vXahWQ^j6cH4+?z`Pr?=>vjE;aX@9no{@ z^2^>lIU1HK^{di8c5aU9-d6b6U36|^!jZ$!di#YdWmkS8=v+!mftNC?F=P*kQubJ_ z+3zY@aXjVslvPgIx8Cf&VEoti)y0oD)kU%Du;Uiy=A*)zv3&bKHoQ5Ru#fA0lH((b zw6?Zxe-a&aC@z5=HKZMVFn8;cZGnoEa%b;|+LHdc*AkbsSNzzAW0uZv_LDa)KLN&m ztyWvrQB|<#=g($eEd4VhL-~HjmM?ua-L*C|GpkB|nv|B5gg!+Z|GsfrCJVB)v!6C? anxHM?Y{ZH6azE2z1c9ri{`ueTI`tnMd>^U+ literal 0 HcmV?d00001 diff --git a/Web/public/images/equ/zx.png b/Web/public/images/equ/zx.png new file mode 100644 index 0000000000000000000000000000000000000000..3d9d9e6ecaebf1b32f1484a5ee7c55c7df637857 GIT binary patch literal 1233 zcmX9+3sjP47=D$~S!qozO=p*tE6WRrsG(F&ElH#1TF$dfP(S!LsjRU(Cj@{otQ$g7vK2eIM%5coOW!yG{8*us$_*MToT@{t8T63Vmmn>hA+hxnsgfr`0 zIc;#+!0Y*EC$)MRqaMm%EY58AOH~q5RcJ~LTp0;Sl5f#WLGi;7UYl!L^E$c;#0GES zO%Pm9yE_eMA1^^Jq{0x$Za(thO(d-*X20~)!aK2Pjd0}!fvH5v3UVEOoqXsWRK46<`!aIxHK;T^ zdOZ_Lsg6#PIUMQs%DEn$r6#2{fMU$!_+7a2oRF{bP~&)Qeks+i2O2jY?hIxs!w=TrS+)3#*6?%{@HIZi?l`lWZsm+*Bmdi% zA5Z!k^m>blrC){ST3AMrSY%?YbdF%Ol!kB)VZpeXOZU+u88;k97E zH*NeKEF>d-zUe;;G#eip;xB86D zPIh*E|MC^m*=GNV4K5Qz>`+MiT`c+p?iT;>I-5Q#_ZTnvi%cd1peJ+stH;%5 - - {{ equData.equName }}({{ equData.lev }}级) - - - {{ equData.equName }}({{ equData.lev }}级) - + + + + + + \ No newline at end of file diff --git a/Web/src/pages/business/equmake.vue b/Web/src/pages/business/equmake.vue new file mode 100644 index 0000000..3f8adaf --- /dev/null +++ b/Web/src/pages/business/equmake.vue @@ -0,0 +1,105 @@ + + \ No newline at end of file diff --git a/Web/src/pages/business/retEqu.vue b/Web/src/pages/business/retEqu.vue new file mode 100644 index 0000000..a15745b --- /dev/null +++ b/Web/src/pages/business/retEqu.vue @@ -0,0 +1,71 @@ + + \ No newline at end of file diff --git a/Web/src/pages/map/index.vue b/Web/src/pages/map/index.vue index 2153825..25abd0b 100644 --- a/Web/src/pages/map/index.vue +++ b/Web/src/pages/map/index.vue @@ -1,8 +1,5 @@ \ No newline at end of file diff --git a/Web/src/pages/user/equ/index.vue b/Web/src/pages/user/equ/index.vue index a0feec4..7349756 100644 --- a/Web/src/pages/user/equ/index.vue +++ b/Web/src/pages/user/equ/index.vue @@ -73,10 +73,12 @@ 套装:{{ item.suitName }} -
+
我的九宫牌
我的圣痕
+ 我的药品栏
装备物品 +
@@ -195,7 +197,7 @@ const chooseEqu = async (type: number, data: Array) => { } const OnEqu = async (ueId: string) => { - showChooseEqu.value = false; + showChooseEqu.value = false; await DownAndOnEqu(ueId, ""); } const ChangeEqu = async (ueId: string) => { diff --git a/Web/src/services/user/UserService.ts b/Web/src/services/user/UserService.ts index c184230..a485adc 100644 --- a/Web/src/services/user/UserService.ts +++ b/Web/src/services/user/UserService.ts @@ -58,11 +58,35 @@ export class UserService { return await ApiService.Request("post", "/User/User/UpdateUserSign", { sign }); } - /** + /** * 获取用户技能 * GET /User/User/GetUserSkill */ static async GetUserSkill() { return await ApiService.Request("get", "/User/User/GetUserSkill"); } + + /** + * 获取个人药品栏 + * GET /User/User/GetUserDrugColumn + */ + static async GetUserDrugColumn() { + return await ApiService.Request("get", "/User/User/GetUserDrugColumn"); + } + + /** + * 移除药品栏药品 + * GET /User/User/RemoverUserDrug + */ + static async RemoverUserDrug(id: string) { + return await ApiService.Request("get", "/User/User/RemoverUserDrug", { id }); + } + + /** + * 添加到药品栏 + * GET /User/User/AddUserDrug + */ + static async AddUserDrug(goodsId: number, count: number) { + return await ApiService.Request("get", "/User/User/AddUserDrug", { goodsId, count }); + } } \ No newline at end of file From c374f27d16b1c7d8ca37c65e52688e29f558c4e4 Mon Sep 17 00:00:00 2001 From: Putoo <290555932@qq.com> Date: Thu, 25 Jun 2026 18:39:45 +0800 Subject: [PATCH 07/14] 111 --- .../game/user/unit_user_monster.cs | 69 +++++++ .../model/MapMonsterModel.cs | 11 ++ .../resource/game/game_monster.cs | 117 +++++++++++ .../resource/game/game_monster_map.cs | 57 ++++++ .../Application.Domain/Enum/MonsterEnum.cs | 15 ++ .../Services/Interface/Equ/IGameEquService.cs | 2 +- .../Interface/Monster/IGameMonsterService.cs | 15 ++ .../Services/Service/Equ/GameEquService.cs | 3 +- .../Service/Monster/GameMonsterService.cs | 183 ++++++++++++++++++ .../Controllers/Map/MapController.cs | 16 +- .../Controllers/Map/StoreController.cs | 20 +- Web/src/pages/map/index.vue | 12 +- Web/src/pages/user/bag/drug.vue | 67 +++++++ 13 files changed, 571 insertions(+), 16 deletions(-) create mode 100644 Service/Application.Domain.Entity/game/user/unit_user_monster.cs create mode 100644 Service/Application.Domain.Entity/model/MapMonsterModel.cs create mode 100644 Service/Application.Domain.Entity/resource/game/game_monster.cs create mode 100644 Service/Application.Domain.Entity/resource/game/game_monster_map.cs create mode 100644 Service/Application.Domain/Enum/MonsterEnum.cs create mode 100644 Service/Application.Domain/Services/Interface/Monster/IGameMonsterService.cs create mode 100644 Service/Application.Domain/Services/Service/Monster/GameMonsterService.cs create mode 100644 Web/src/pages/user/bag/drug.vue diff --git a/Service/Application.Domain.Entity/game/user/unit_user_monster.cs b/Service/Application.Domain.Entity/game/user/unit_user_monster.cs new file mode 100644 index 0000000..2a6a918 --- /dev/null +++ b/Service/Application.Domain.Entity/game/user/unit_user_monster.cs @@ -0,0 +1,69 @@ +using SqlSugar; +using System; + +namespace Application.Domain.Entity +{ + [Tenant("Kg.SeaTime.Game")] + public class unit_user_monster + { + /// + /// umId + /// + [SugarColumn(IsPrimaryKey = true, Length = 50)] + public string umId { get; set; } + + /// + /// userId + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? userId { get; set; } + + /// + /// areaCode + /// + [SugarColumn(Length = 255, IsNullable = true)] + public string? areaCode { get; set; } + + /// + /// mapId + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? mapId { get; set; } + + /// + /// monsterId + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? monsterId { get; set; } + + /// + /// monsterName + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? monsterName { get; set; } + + /// + /// code + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? code { get; set; } + + /// + /// par + /// + [SugarColumn(Length = 255, IsNullable = true)] + public string? par { get; set; } + + /// + /// addTime + /// + [SugarColumn(IsNullable = true)] + public long? addTime { get; set; } + + /// + /// endTime + /// + [SugarColumn(IsNullable = true)] + public long? endTime { get; set; } + } +} \ No newline at end of file diff --git a/Service/Application.Domain.Entity/model/MapMonsterModel.cs b/Service/Application.Domain.Entity/model/MapMonsterModel.cs new file mode 100644 index 0000000..2b58f98 --- /dev/null +++ b/Service/Application.Domain.Entity/model/MapMonsterModel.cs @@ -0,0 +1,11 @@ +namespace Application.Domain.Entity; + +public class MapMonsterModel +{ + public string monterId { get; set; } + public string name { get; set; } + /// + /// 0地图怪物 1生成怪物 + /// + public int type { get; set; } +} \ No newline at end of file diff --git a/Service/Application.Domain.Entity/resource/game/game_monster.cs b/Service/Application.Domain.Entity/resource/game/game_monster.cs new file mode 100644 index 0000000..abc3a76 --- /dev/null +++ b/Service/Application.Domain.Entity/resource/game/game_monster.cs @@ -0,0 +1,117 @@ +using SqlSugar; +using System; + +namespace Application.Domain.Entity +{ + [Tenant("Kg.SeaTime.Resource")] + public class game_monster + { + /// + /// monsterId + /// + [SugarColumn(IsPrimaryKey = true, Length = 50)] + public string monsterId { get; set; } + + /// + /// name + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? name { get; set; } + + /// + /// 怪物应用区域 + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? code { get; set; } + + /// + /// lev + /// + [SugarColumn(IsNullable = true)] + public int? lev { get; set; } + + /// + /// exp + /// + [SugarColumn(IsNullable = true)] + public long? exp { get; set; } + + /// + /// copper + /// + [SugarColumn(IsNullable = true)] + public long? copper { get; set; } + + /// + /// petExp + /// + [SugarColumn(IsNullable = true)] + public long? petExp { get; set; } + + /// + /// minAtk + /// + [SugarColumn(IsNullable = true)] + public int? minAtk { get; set; } + + /// + /// maxAtk + /// + [SugarColumn(IsNullable = true)] + public int? maxAtk { get; set; } + + /// + /// defense + /// + [SugarColumn(IsNullable = true)] + public int? defense { get; set; } + + /// + /// agility + /// + [SugarColumn(IsNullable = true)] + public int? agility { get; set; } + + /// + /// blood + /// + [SugarColumn(Length = 62, IsNullable = true)] + public decimal? blood { get; set; } + + /// + /// 怪物属性 + /// + [SugarColumn(IsNullable = true,IsJson = true)] + public List attr { get; set; } + + /// + /// 怪物技能 + /// + [SugarColumn(IsNullable = true)] + public string? skill { get; set; } + + /// + /// award + /// + [SugarColumn(Length = 3000, IsNullable = true)] + public string? award { get; set; } + + /// + /// 支持复制战斗0不支持 1支持 + /// + [SugarColumn(IsNullable = true)] + public int? isCopy { get; set; } + + /// + /// 怪物说明 + /// + [SugarColumn(Length = 255, IsNullable = true)] + public string? remark { get; set; } + + /// + /// 用于后台操作标记,无其他作用 + /// + [SugarColumn(Length = 255, IsNullable = true)] + public string? markTips { get; set; } + } +} diff --git a/Service/Application.Domain.Entity/resource/game/game_monster_map.cs b/Service/Application.Domain.Entity/resource/game/game_monster_map.cs new file mode 100644 index 0000000..1d40beb --- /dev/null +++ b/Service/Application.Domain.Entity/resource/game/game_monster_map.cs @@ -0,0 +1,57 @@ +using SqlSugar; +using System; + +namespace Application.Domain.Entity +{ + [Tenant("Kg.SeaTime.Resource")] + public class game_monster_map + { + /// + /// mmId + /// + [SugarColumn(IsPrimaryKey = true, Length = 50)] + public string mmId { get; set; } + + /// + /// mapId + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? mapId { get; set; } + + /// + /// monsterId + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? monsterId { get; set; } + + /// + /// monsterName + /// + [SugarColumn(Length = 50, IsNullable = true)] + public string? monsterName { get; set; } + + /// + /// addCount + /// + [SugarColumn(IsNullable = true)] + public int? addCount { get; set; } + + /// + /// chance + /// + [SugarColumn(IsNullable = true)] + public int? chance { get; set; } + + /// + /// sTime + /// + [SugarColumn(IsNullable = true)] + public int? sTime { get; set; } + + /// + /// eTime + /// + [SugarColumn(IsNullable = true)] + public int? eTime { get; set; } + } +} \ No newline at end of file diff --git a/Service/Application.Domain/Enum/MonsterEnum.cs b/Service/Application.Domain/Enum/MonsterEnum.cs new file mode 100644 index 0000000..2ffb97d --- /dev/null +++ b/Service/Application.Domain/Enum/MonsterEnum.cs @@ -0,0 +1,15 @@ +namespace Application.Domain; + +public static class MonsterEnum +{ + public enum Code + { + + } + public enum AreaCode + { + Own,//个人怪物 + Public,//公共怪物 + Team,//队伍怪物 + } +} \ No newline at end of file diff --git a/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs b/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs index 9313e39..0015dff 100644 --- a/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs +++ b/Service/Application.Domain/Services/Interface/Equ/IGameEquService.cs @@ -12,7 +12,7 @@ public interface IGameEquService #region 用户装备 Task> GetUserEquData(string userId, int type, string equName, int PageIndex, int PageSize, - RefAsync Total, bool isRemOn = false); + RefAsync Total, bool isRemOn = false, bool isRemLock = false); Task> GetUserEquData(string userId, int equId); Task> GetUserEquData(string userId, string code, List noUeId); diff --git a/Service/Application.Domain/Services/Interface/Monster/IGameMonsterService.cs b/Service/Application.Domain/Services/Interface/Monster/IGameMonsterService.cs new file mode 100644 index 0000000..73df623 --- /dev/null +++ b/Service/Application.Domain/Services/Interface/Monster/IGameMonsterService.cs @@ -0,0 +1,15 @@ +namespace Application.Domain; + +public interface IGameMonsterService +{ + #region 地图怪物 + + Task> GetMonsterDataByMap(string mapId); + + Task CreateMonsterToMap(string userId, string mapId, string areaCode, string monsterId, + int count = 1, int time = 0, string par = ""); + + Task> GetMapMonster(string userId, string mapId, string teamId); + + #endregion +} \ No newline at end of file diff --git a/Service/Application.Domain/Services/Service/Equ/GameEquService.cs b/Service/Application.Domain/Services/Service/Equ/GameEquService.cs index 1962f3a..a03b4ca 100644 --- a/Service/Application.Domain/Services/Service/Equ/GameEquService.cs +++ b/Service/Application.Domain/Services/Service/Equ/GameEquService.cs @@ -39,7 +39,7 @@ public class GameEquService(ISqlSugarClient DbClient, IRedisCache redis) : IGame #region 用户装备 public async Task> GetUserEquData(string userId, int type, string equName, int PageIndex, - int PageSize, RefAsync Total, bool isRemOn = false) + int PageSize, RefAsync Total, bool isRemOn = false, bool isRemLock = false) { long onTime = TimeExtend.GetTimeStampSeconds; var db = DbClient.AsTenant().GetConnectionWithAttr(); @@ -48,6 +48,7 @@ public class GameEquService(ISqlSugarClient DbClient, IRedisCache redis) : IGame .WhereIF(type == 1, it => it.isOn == 1) .WhereIF(type == 3, it => it.isAppr == 0) .WhereIF(isRemOn, it => it.isOn == 0) + .WhereIF(isRemLock, it => it.isLock == 0) .WhereIF(!string.IsNullOrEmpty(equName), it => it.equName.Contains(equName) || it.unitEquName.Contains(equName)) .OrderByDescending(it => it.lev) diff --git a/Service/Application.Domain/Services/Service/Monster/GameMonsterService.cs b/Service/Application.Domain/Services/Service/Monster/GameMonsterService.cs new file mode 100644 index 0000000..603de1a --- /dev/null +++ b/Service/Application.Domain/Services/Service/Monster/GameMonsterService.cs @@ -0,0 +1,183 @@ +using Microsoft.VisualBasic.CompilerServices; + +namespace Application.Domain; + +public class GameMonsterService(ISqlSugarClient DbClient, IRedisCache redis) : IGameMonsterService, ITransient +{ + #region 基础资源库 + + public async Task GetMonsterInfo(string monsterId) + { + string key = string.Format(BaseCache.BaseCacheKeys, "MonsterData", "MonsterInfo"); + if (await redis.HExistsHashAsync(key, monsterId)) + { + return await redis.GetHashAsync(key, monsterId); + } + + var db = DbClient.AsTenant().GetConnectionWithAttr(); + var data = await db.Queryable().Where(it => it.monsterId == monsterId).SingleAsync(); + await redis.AddHashAsync(key, monsterId, data); + return data; + } + + #endregion + + #region 地图怪物 + + public async Task> GetMonsterDataByMap(string mapId) + { + string key = string.Format(BaseCache.BaseCacheKeys, "MonsterData", "MonsterOnMap"); + if (await redis.HExistsHashAsync(key, mapId)) + { + return await redis.GetHashAsync>(key, mapId); + } + + var db = DbClient.AsTenant().GetConnectionWithAttr(); + var data = await db.Queryable().Where(it => it.mapId == mapId).ToListAsync(); + await redis.AddHashAsync(key, mapId, data); + return data; + } + + public async Task CreateMonsterToMap(string userId, string mapId, string areaCode, string monsterId, + int count = 1, int time = 0, string par = "") + { + bool result = false; + var monsterInfo = await GetMonsterInfo(monsterId); + if (monsterInfo != null) + { + time = time <= 0 ? 7 * 24 * 60 : time; + long onTime = TimeExtend.GetTimeStampSeconds; + long endTime = onTime + time * 60; + List data = new List(); + for (int i = 0; i < count; i++) + { + data.Add(new unit_user_monster() + { + umId = StringAssist.NewGuid, + userId = userId, + areaCode = areaCode, + mapId = mapId, + monsterId = monsterId, + monsterName = monsterInfo.name, + code = monsterInfo.code, + par = par, + addTime = onTime, + endTime = endTime + }); + } + + if (data.Count > 0) + { + var createDb = DbClient.AsTenant().GetConnectionWithAttr(); + await createDb.Insertable(data).ExecuteCommandAsync(); + } + + result = true; + } + + if (result) + { + await ClearCreateMonster(mapId); + } + + return result; + } + + private async Task> GetCreateMonsterByMapId(string mapId) + { + string key = string.Format(BaseCache.BaseCacheKeys, "MonsterData", "CreateMonsterOnMap"); + if (await redis.HExistsHashAsync(key, mapId)) + { + return await redis.GetHashAsync>(key, mapId); + } + + var db = DbClient.AsTenant().GetConnectionWithAttr(); + var data = await db.Queryable().Where(it => it.mapId == mapId).ToListAsync(); + await redis.AddHashAsync(key, mapId, data); + return data; + } + + private async Task ClearCreateMonster(string mapId) + { + string key = string.Format(BaseCache.BaseCacheKeys, "MonsterData", "CreateMonsterOnMap"); + await redis.DelHashAsync(key, mapId); + } + + public async Task> GetMapMonster(string userId, string mapId, string teamId) + { + List result = new List(); + var mapMonster = await GetMonsterDataByMap(mapId); + if (mapMonster.Count > 0) + { + int random = 0; //此处需要判断用户状态中的几率 + int onTime = TimeAssist.GetHourNum; + foreach (var item in mapMonster) + { + if (item.sTime < onTime && item.eTime > onTime) + { + if (RandomAssist.CheakRandom((int)item.chance + random)) + { + for (int i = 0; i < item.addCount; i++) + { + MapMonsterModel temp = new MapMonsterModel() + { + monterId = item.mmId, + name = item.monsterName, + type = 0 + }; + result.Add(temp); + } + } + } + } + } + + //此处追加个人生成怪物 + List createData = new List(); + var createMonster = await GetCreateMonsterByMapId(mapId); + if (createMonster.Count > 0) + { + long onTime = TimeExtend.GetTimeStampSeconds; + createMonster = createMonster.FindAll(it => it.endTime > onTime); + + createData.AddRange(createMonster.FindAll(it => + it.userId == userId || it.areaCode == nameof(MonsterEnum.AreaCode.Public))); + if (!string.IsNullOrEmpty(teamId) && teamId != "0") + { + var teamService = App.GetService(); + var teamMember = await teamService.GetTeamMember(teamId); + teamMember = teamMember.FindAll(it => it.userId != userId); + var onCreate = createMonster.FindAll(it => + teamMember.Any(team => + team.userId == it.userId && it.areaCode == nameof(MonsterEnum.AreaCode.Team))); + foreach (var item in onCreate) + { + if (createData.Any(it => it.umId == item.umId)) + { + continue; + } + + createData.Add(item); + } + } + } + + if (createData.Count > 0) + { + foreach (var item in createData) + { + MapMonsterModel temp = new MapMonsterModel() + { + monterId = item.umId, + name = item.monsterName, + type = 1 + }; + result.Add(temp); + } + } + + return result; + } + + #endregion +} \ No newline at end of file diff --git a/Service/Application.Web/Controllers/Map/MapController.cs b/Service/Application.Web/Controllers/Map/MapController.cs index bbf8a73..4ac2652 100644 --- a/Service/Application.Web/Controllers/Map/MapController.cs +++ b/Service/Application.Web/Controllers/Map/MapController.cs @@ -21,9 +21,12 @@ public class MapController : ControllerBase private readonly IGameSkillService _skillService; private readonly IGameGoodsService _goodsService; private readonly IGameTeamService _teamService; + private readonly IGameMonsterService _monsterService; + public MapController(IUnitUserService userService, IGameMapService mapService, IGameChatService chatService, IUnitUserAttrService attrService, IMessageService messageService, IUnitUserWeight weightService, - IUnitUserAccService accService, IGameSkillService skillService,IGameGoodsService goodsService,IGameTeamService teamService) + IUnitUserAccService accService, IGameSkillService skillService, IGameGoodsService goodsService, + IGameTeamService teamService, IGameMonsterService monsterService) { _userService = userService; _mapService = mapService; @@ -35,6 +38,7 @@ public class MapController : ControllerBase _skillService = skillService; _goodsService = goodsService; _teamService = teamService; + _monsterService = monsterService; } #region 地图相关 @@ -89,14 +93,17 @@ public class MapController : ControllerBase #endregion //公聊信息 - var myTeam = await _teamService.GetUserTeamData(userId); - string teamId =myTeam.teamId ; + var myTeam = await _teamService.GetUserTeamData(userId); + string teamId = myTeam.teamId; string groupId = ""; var chatData = await _chatService.GetChatTop(userId, area, 2, teamId, groupId); var npcData = await _mapService.GetMapNpc(mapInfo.mapId); //NPC信息 npcData = npcData.FindAll(it => GameTool.AreaVerify(StateHelper.areaId, it.areaId)); + + //获取怪物 + var monsterData = await _monsterService.GetMapMonster(userId, mapInfo.mapId, teamId); var nearUser = await _mapService.GetMapUser(mapInfo.mapId, area, (int)mapInfo.lookArea, [userId], 3); //获取附近的人 @@ -145,7 +152,8 @@ public class MapController : ControllerBase noReadMsg = noReadMsg[3], business, mapRes, - broadcast + broadcast, + monster = monsterData }; return PoAction.Ok(ret); diff --git a/Service/Application.Web/Controllers/Map/StoreController.cs b/Service/Application.Web/Controllers/Map/StoreController.cs index 7a2d084..6a4c20f 100644 --- a/Service/Application.Web/Controllers/Map/StoreController.cs +++ b/Service/Application.Web/Controllers/Map/StoreController.cs @@ -50,6 +50,7 @@ public class StoreController : ControllerBase { return PoAction.Message("Npc不存在!"); } + if (!npcInfo.bus.Any(it => it.code == nameof(GameEnum.NpcBusCode.Store))) { return PoAction.Message("业务不可用!"); @@ -88,6 +89,7 @@ public class StoreController : ControllerBase { return PoAction.Message("Npc不存在!"); } + if (!npcInfo.bus.Any(it => it.code == nameof(GameEnum.NpcBusCode.Store))) { return PoAction.Message("业务不可用!"); @@ -165,10 +167,12 @@ public class StoreController : ControllerBase { return PoAction.Message("Npc不存在!"); } + if (!npcInfo.bus.Any(it => it.code == nameof(GameEnum.NpcBusCode.Store))) { return PoAction.Message("业务不可用!"); } + var onMap = await _mapService.GetUserOnMapId(userId); if (npcInfo.mapId != onMap) { @@ -179,25 +183,25 @@ public class StoreController : ControllerBase if (type == 0) { - var data = await _equService.GetUserEquData(userId, 0, query, page, 10, total, true); - return PoAction.Ok(new { data, total.Value }); + var data = await _equService.GetUserEquData(userId, 0, query, page, 10, total, true, true); + return PoAction.Ok(new { data, total = total.Value }); } else if (type == 1) { List code = new List() { nameof(GoodsEnum.Code.Drug) }; var data = await _goodsService.GetUserGoodsData(userId, code, new List(), query, page, 10, total); - return PoAction.Ok(new { data, total.Value }); + return PoAction.Ok(new { data, total = total.Value }); } else if (type == 2) { List code = new List(); List noCode = new List() { nameof(GoodsEnum.Code.Drug) }; var data = await _goodsService.GetUserGoodsData(userId, code, noCode, query, page, 10, total); - return PoAction.Ok(new { data, total.Value }); + return PoAction.Ok(new { data, total = total.Value }); } else { - return PoAction.Ok(new { data = new List(), total.Value }); + return PoAction.Ok(new { data = new List(), total = total.Value }); } } @@ -229,7 +233,7 @@ public class StoreController : ControllerBase return PoAction.Message("Npc不存在!"); } - if (parms.type == 0)//装备 + if (parms.type == 0) //装备 { var equInfo = await _equService.GetUserEquInfo(parms.id); if (equInfo == null) @@ -259,7 +263,7 @@ public class StoreController : ControllerBase } else { - return PoAction.Message("出售失败,请稍后尝试!"); + return PoAction.Message("出售失败,请稍后尝试!"); } } else //物品 @@ -288,7 +292,7 @@ public class StoreController : ControllerBase } else { - return PoAction.Message("出售失败,请稍后尝试!"); + return PoAction.Message("出售失败,请稍后尝试!"); } } } diff --git a/Web/src/pages/map/index.vue b/Web/src/pages/map/index.vue index 25abd0b..edd122b 100644 --- a/Web/src/pages/map/index.vue +++ b/Web/src/pages/map/index.vue @@ -1,7 +1,7 @@ \ No newline at end of file diff --git a/Web/src/pages/user/bag/index.vue b/Web/src/pages/user/bag/index.vue index 6cfa7d9..5fafd37 100644 --- a/Web/src/pages/user/bag/index.vue +++ b/Web/src/pages/user/bag/index.vue @@ -1,15 +1,16 @@ \ No newline at end of file diff --git a/Web/src/pages/user/index.vue b/Web/src/pages/user/index.vue index d67f512..3b08a59 100644 --- a/Web/src/pages/user/index.vue +++ b/Web/src/pages/user/index.vue @@ -25,6 +25,14 @@ 活力:{{ vitality }}
罪恶值:0
帮派:无
+
+ ---◈BUFF状态◈---
+
+ ✧{{item.name}}:{{item.tips}}(剩余{{ item.endTime - TimeExtend.GetSecondStamp() }}秒) +
+ +
+ @@ -58,6 +66,7 @@ const vitality = ref(0); const expData = ref({}); const attrData = ref({}); const accData = ref({}); +const buff = ref([]); onMounted(async () => { try { @@ -78,6 +87,7 @@ const BindData = async (): Promise => { expData.value = result.data.exp; attrData.value = result.data.attr; accData.value = result.data.acc; + buff.value = result.data.buff; console.log(result); } else { diff --git a/Web/src/pages/user/setting/index.vue b/Web/src/pages/user/setting/index.vue index 7add47e..d696e12 100644 --- a/Web/src/pages/user/setting/index.vue +++ b/Web/src/pages/user/setting/index.vue @@ -21,6 +21,9 @@
刷新图标(*更新图标数据)
+
+ ➣我的书签 +
diff --git a/Web/src/pages/user/ship/index.vue b/Web/src/pages/user/ship/index.vue index 0061996..29875c8 100644 --- a/Web/src/pages/user/ship/index.vue +++ b/Web/src/pages/user/ship/index.vue @@ -1,10 +1,10 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/Web/src/pages/map/index.vue b/Web/src/pages/map/index.vue index edd122b..97ade96 100644 --- a/Web/src/pages/map/index.vue +++ b/Web/src/pages/map/index.vue @@ -18,7 +18,7 @@
- {{ item.name }} + {{ item.name }}
@@ -41,15 +41,18 @@
请选择出口:
东:{{ mapDong.name }} - 🚩 + 🚩  西:{{ mapXi.name }} - 🚩 + 🚩  +
南:{{ mapNan.name }} - 🚩 + 🚩  + 北:{{ mapBei.name }} - 🚩 + 🚩 +
@@ -67,7 +70,7 @@
- {{ item.mapName }} + {{ item.mapName }}  
@@ -140,6 +143,9 @@ onMounted(async () => { const BindData = async (map: string): Promise => { let result = await MapService.GetMapData(map); if (result.code == 0) { + if (result.data.fightId != '') { + return PageExtend.Redirect("/fight?f=" + result.data.fightId); + } mapInfo.value = result.data.mapInfo; cityInfo.value = result.data.cityInfo; npcData.value = result.data.npcData; @@ -296,5 +302,20 @@ const CollectRes = async () => { } } +/**攻击 */ +const AddFight = async (type: number, monsterId: string, sign: string) => { + MessageExtend.LoadingToast("战斗初始化..."); + let result = await FightService.FightMonster(type, monsterId, sign); + MessageExtend.LoadingClose(); + if (result.code == 0) { + return PageExtend.Redirect("/fight?f=" + result.data); + } + else if (result.code == -1) { + await BindData(""); + } + else { + MessageExtend.ShowDialog("提示", result.msg); + } +} diff --git a/Web/src/pages/map/run.vue b/Web/src/pages/map/run.vue index 4561547..38f54ea 100644 --- a/Web/src/pages/map/run.vue +++ b/Web/src/pages/map/run.vue @@ -12,7 +12,7 @@ 【 - {{ item.cityName }} + {{ item.cityName }} 
diff --git a/Web/src/pages/map/to.vue b/Web/src/pages/map/to.vue index 3b923b4..373aca5 100644 --- a/Web/src/pages/map/to.vue +++ b/Web/src/pages/map/to.vue @@ -12,7 +12,7 @@ 【 - {{ item.cityName }} + {{ item.cityName }}