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] 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