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 @@
+
+
+
+
+
+
+
+
+ {{ item.name }}
+ (剩余{{ TimeExtend.GetRemainingMinutes(item.endTime) }}分钟)
+
+
+ {{ item.name }}
+ 【完成修炼】
+
+
+
+ 暂无修炼
+
+
+
+
+
+
+
+
+ {{ item.goodsName }} x {{ item.count }}
+
立即使用
+
+
+ 暂无资源
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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 @@
-
-
更换称号
- ID:{{ userData.userNo }} [
升靓号 ]
- 昵称:
{{ userData.nick }}
- 性别:
{{ userData.sex }}
-
特权 :
- 徽章:
显示
- 社交:
未收到礼物
- 婚姻:单身
- 个性签名:{{ userData.sign }}
修改
- 宠物:暂无
- 坐骑:无
- 成就:
展示成就
- 等级:{{ attrData.lev }}
- 综合战力:{{attrData.score}}
- 经验:{{ expData.exp }}/{{ expData.upExp }}
- 体力:{{attrData.blood}}/{{attrData.upBlood}} {{attrData.bloodTips}}
- 攻击:{{attrData.minAtk}}-{{attrData.maxAtk}} {{attrData.atkTips}}
- 防御:{{attrData.defense}} {{attrData.defTips}}
- 敏捷:{{attrData.agility}} {{attrData.agilityTips}}
- 士气:{{attrData.morale}}/{{attrData.upMorale}} {{attrData.moraleTips}}
- 师德:{{accData.teach}}
- 声望:{{accData.renown}}
- 活力:{{ vitality }}
- 罪恶值:0
- 帮派:无
-
+
+
+
-
\ 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 @@
+
+
+ {{ equData.equName }}({{ equData.lev }}级)
+
+
+ {{ equData.equName }}({{ equData.lev }}级)
+
+
+
\ 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 @@
- 手持:
[+]
+ 手持:
[+]
-
{{ item.equName }}({{ item.lev }}级) [
卸下 ]
+
[
卸下 ]
- 副手:
[+]
+ 副手:
[+]
-
{{ item.equName }}({{ item.lev }}级) [
卸下 ]
+
[
卸下 ]
- 头戴:
[+]
+ 头戴:
[+]
-
{{ item.equName }}({{ item.lev }}级) [
卸下 ]
+
[
卸下 ]
- 身穿:
[+]
+ 身穿:
[+]
-
{{ item.equName }}({{ item.lev }}级) [
卸下 ]
+
[
卸下 ]
- 腰带:
[+]
+ 腰带:
[+]
-
{{ item.equName }}({{ item.lev }}级) [
卸下 ]
+
[
卸下 ]
- 脚穿:
[+]
+ 脚穿:
[+]
-
{{ item.equName }}({{ item.lev }}级) [
卸下 ]
+
[
卸下 ]
- 佩戴:
[+]
+ 佩戴:
[+]
-
{{ item.equName }}({{ item.lev }}级) [
卸下 ]
+
[
卸下 ]
- 时装:
[+]
+ 时装:
[+]
-
{{ item.equName }}({{ item.lev }}级) [
卸下 ]
+
[
卸下 ]
- 羽翼:
[+]
+ 羽翼:
[+]
-
{{ item.equName }}({{ item.lev }}级) [
卸下 ]
+
[
卸下 ]
- 装饰:
[+]
+ 装饰:
[+]
-
{{ item.equName }}({{ item.lev }}级) [
卸下 ]
+
[
卸下 ]
+
+
+
@@ -74,6 +78,37 @@
我的圣痕
装备物品
+
+
+
+
+
+
+ {{ index + 1 }}.
+
+
+
+
+
暂无装备.
+
+
+
+
+
+
+
+
+
+ {{ index + 1 }}.
+
+
+
+
+
暂无装备.
+
+
+
+
\ 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 @@
+
+
+ 【套装介绍】
+
+
+ 套装名称:{{ data.suitName }}
+ 套装介绍:
+
+
+
+ ---◈套装属性◈---
+
+
+ {{ item.type == 0 ? "✧" : "✡" }}
+ {{ attr.tip }}
+
+
+
+
+ ---◈已激活属性◈---
+
+
+ {{ item.type == 0 ? "✧" : "✡" }}
+ {{ attr.tip }}
+
+
+
+
+
\ 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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