12121
This commit is contained in:
@@ -6,6 +6,7 @@
|
|||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AJwtSecurityTokenHandler_002Ecs_002Fl_003AC_0021_003FUsers_003F29055_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FSourcesCache_003Ff9d3fc33fd2fba97d4e718534a67f1d3c61e492634cd51c4798ce5621f780f3_003FJwtSecurityTokenHandler_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AJwtSecurityTokenHandler_002Ecs_002Fl_003AC_0021_003FUsers_003F29055_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FSourcesCache_003Ff9d3fc33fd2fba97d4e718534a67f1d3c61e492634cd51c4798ce5621f780f3_003FJwtSecurityTokenHandler_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AList_00601_002Ecs_002Fl_003AC_0021_003FUsers_003F29055_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F51505665371d472f8bdbc333fa4d888cf49938_003F0e_003F7279c963_003FList_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AList_00601_002Ecs_002Fl_003AC_0021_003FUsers_003F29055_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F51505665371d472f8bdbc333fa4d888cf49938_003F0e_003F7279c963_003FList_00601_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APoAction_002Ecs_002Fl_003AC_0021_003FUsers_003F29055_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F8fb1d14dca1046e78e0684daa8bc3a1b7800_003Fb7_003F35e46383_003FPoAction_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003APoAction_002Ecs_002Fl_003AC_0021_003FUsers_003F29055_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F8fb1d14dca1046e78e0684daa8bc3a1b7800_003Fb7_003F35e46383_003FPoAction_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ARandomAssist_002Ecs_002Fl_003AC_0021_003FUsers_003F29055_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa380d649d5b2495d9bfa0fa24f13662b6400_003F90_003F676312fd_003FRandomAssist_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASqlSetup_002Ecs_002Fl_003AC_0021_003FUsers_003F29055_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F72993acb059c49dcbba437a858c0b0942000_003F46_003F2e14505d_003FSqlSetup_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASqlSetup_002Ecs_002Fl_003AC_0021_003FUsers_003F29055_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F72993acb059c49dcbba437a858c0b0942000_003F46_003F2e14505d_003FSqlSetup_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASqlSugarScopeProvider_002Ecs_002Fl_003AC_0021_003FUsers_003F29055_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F6c0f22f0a47643a3b2a40899acd2044c2e3a00_003Fc5_003F4738d33f_003FSqlSugarScopeProvider_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003ASqlSugarScopeProvider_002Ecs_002Fl_003AC_0021_003FUsers_003F29055_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003F6c0f22f0a47643a3b2a40899acd2044c2e3a00_003Fc5_003F4738d33f_003FSqlSugarScopeProvider_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AStringAssist_002Ecs_002Fl_003AC_0021_003FUsers_003F29055_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa380d649d5b2495d9bfa0fa24f13662b6400_003Fee_003F90da4dea_003FStringAssist_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
<s:String x:Key="/Default/CodeInspection/ExcludedFiles/FilesAndFoldersToSkip2/=7020124F_002D9FFC_002D4AC3_002D8F3D_002DAAB8E0240759_002Ff_003AStringAssist_002Ecs_002Fl_003AC_0021_003FUsers_003F29055_003FAppData_003FRoaming_003FJetBrains_003FRider2025_002E3_003Fresharper_002Dhost_003FDecompilerCache_003Fdecompiler_003Fa380d649d5b2495d9bfa0fa24f13662b6400_003Fee_003F90da4dea_003FStringAssist_002Ecs/@EntryIndexedValue">ForceIncluded</s:String>
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
using SqlSugar;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Application.Domain.Entity
|
||||||
|
{
|
||||||
|
[Tenant("Kg.SeaTime.Game")]
|
||||||
|
public class unit_user_skill
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// usId
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsPrimaryKey = true, Length = 50)]
|
||||||
|
public string usId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// userId
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(Length = 50, IsNullable = true)]
|
||||||
|
public string? userId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// skill
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true)]
|
||||||
|
public int? skill { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// code
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(Length = 50, IsNullable = true)]
|
||||||
|
public string? code { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// name
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(Length = 50, IsNullable = true)]
|
||||||
|
public string? name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// lev
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true)]
|
||||||
|
public int? lev { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// sign
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true)]
|
||||||
|
public string? sign { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// remark
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true)]
|
||||||
|
public string? remark { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
11
Service/Application.Domain.Entity/model/MapResModel.cs
Normal file
11
Service/Application.Domain.Entity/model/MapResModel.cs
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
namespace Application.Domain.Entity;
|
||||||
|
|
||||||
|
public class MapResModel
|
||||||
|
{
|
||||||
|
public string resId { get; set; }
|
||||||
|
public string resName { get; set; }
|
||||||
|
public int lev { get; set; }
|
||||||
|
public long lockTime { get; set; }
|
||||||
|
public int needVigour { get; set; }
|
||||||
|
public int gather { get; set; }
|
||||||
|
}
|
||||||
@@ -18,6 +18,12 @@ namespace Application.Domain.Entity
|
|||||||
[SugarColumn(Length = 50, IsNullable = true)]
|
[SugarColumn(Length = 50, IsNullable = true)]
|
||||||
public string? mapId { get; set; }
|
public string? mapId { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 等级
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true)]
|
||||||
|
public int? lev { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 资源名称
|
/// 资源名称
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -45,8 +51,8 @@ namespace Application.Domain.Entity
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 成功率
|
/// 成功率
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[SugarColumn(Length = 18, IsNullable = true)]
|
[SugarColumn(IsNullable = true)]
|
||||||
public decimal? okRadio { get; set; }
|
public int? okRadio { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 采集锁定时间
|
/// 采集锁定时间
|
||||||
@@ -54,4 +60,4 @@ namespace Application.Domain.Entity
|
|||||||
[SugarColumn(IsNullable = true)]
|
[SugarColumn(IsNullable = true)]
|
||||||
public int? gatherTime { get; set; }
|
public int? gatherTime { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
using SqlSugar;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace Application.Domain.Entity
|
||||||
|
{
|
||||||
|
[Tenant("Kg.SeaTime.Resource")]
|
||||||
|
public class game_skill
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// skill
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsPrimaryKey = true)]
|
||||||
|
public int skill { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// code
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(Length = 50, IsNullable = true)]
|
||||||
|
public string? code { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// name
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(Length = 50, IsNullable = true)]
|
||||||
|
public string? name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// lev
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true)]
|
||||||
|
public int? lev { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// sign
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true)]
|
||||||
|
public string? sign { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// remark
|
||||||
|
/// </summary>
|
||||||
|
[SugarColumn(IsNullable = true)]
|
||||||
|
public string? remark { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
19
Service/Application.Domain/Enum/SkillEnum.cs
Normal file
19
Service/Application.Domain/Enum/SkillEnum.cs
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
namespace Application.Domain;
|
||||||
|
|
||||||
|
public static class SkillEnum
|
||||||
|
{
|
||||||
|
public enum code
|
||||||
|
{
|
||||||
|
GATHER,//采集术
|
||||||
|
FISH,//钓鱼术
|
||||||
|
DIVE,//潜水术
|
||||||
|
NEGOTI,//谈判术
|
||||||
|
FINANC,//理财术
|
||||||
|
ATK,//攻击术
|
||||||
|
DEFENCE,//防御术
|
||||||
|
AGILE,//敏捷术
|
||||||
|
RIDI,//乘骑术
|
||||||
|
WING,//翼形术
|
||||||
|
Collect,//采集术
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -65,7 +65,11 @@ public interface IGameMapService
|
|||||||
|
|
||||||
#region 地图资源
|
#region 地图资源
|
||||||
|
|
||||||
|
Task<game_city_map_res> GetMapResInfo(string resId);
|
||||||
Task<List<game_city_map_res>> GetMapRes(string mapId);
|
Task<List<game_city_map_res>> GetMapRes(string mapId);
|
||||||
|
Task<List<MapResModel>> GetMapResData(string mapId, int area);
|
||||||
|
Task<long> GetMapResLockTime(string resId, int area);
|
||||||
|
Task SetMapResLockTime(string resId, int area, int lockTime);
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
namespace Application.Domain;
|
||||||
|
|
||||||
|
public interface IGameSkillService
|
||||||
|
{
|
||||||
|
Task<game_skill> GetGameSkillInfo(int skillId);
|
||||||
|
Task<unit_user_skill> GetUserSkillInfo(string userId, string code);
|
||||||
|
Task<List<AttrItem>> GetUserSkillAttr(string userId);
|
||||||
|
Task<List<unit_user_skill>> GetUserSkill(string userId);
|
||||||
|
Task<bool> UpdateUserSkill(string userId, int skillId);
|
||||||
|
|
||||||
|
}
|
||||||
@@ -877,14 +877,15 @@ public class GameMapService(ISqlSugarClient DbClient, IRedisCache redis) : IGame
|
|||||||
|
|
||||||
public async Task<game_city_map_bus> GetMapBusInfo(int busId)
|
public async Task<game_city_map_bus> GetMapBusInfo(int busId)
|
||||||
{
|
{
|
||||||
string key = string.Format(BaseCache.BaseCacheKeys, "CITY_MAP_BUS","BUS_INFO");
|
string key = string.Format(BaseCache.BaseCacheKeys, "CITY_MAP_BUS", "BUS_INFO");
|
||||||
if (await redis.HExistsHashAsync(key, busId.ToString()))
|
if (await redis.HExistsHashAsync(key, busId.ToString()))
|
||||||
{
|
{
|
||||||
return await redis.GetHashAsync<game_city_map_bus>(key, busId.ToString());
|
return await redis.GetHashAsync<game_city_map_bus>(key, busId.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
var db = DbClient.AsTenant().GetConnectionWithAttr<game_city_map_bus>();
|
var db = DbClient.AsTenant().GetConnectionWithAttr<game_city_map_bus>();
|
||||||
var data = await db.Queryable<game_city_map_bus>().Where(it => it.busId == busId).SingleAsync();
|
var data = await db.Queryable<game_city_map_bus>().Where(it => it.busId == busId).SingleAsync();
|
||||||
await redis.AddHashAsync(key,busId.ToString(), data);
|
await redis.AddHashAsync(key, busId.ToString(), data);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -924,7 +925,19 @@ public class GameMapService(ISqlSugarClient DbClient, IRedisCache redis) : IGame
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region 地图资源
|
#region 地图资源
|
||||||
|
public async Task<game_city_map_res> GetMapResInfo(string resId)
|
||||||
|
{
|
||||||
|
string key = string.Format(BaseCache.BaseCacheKeys, "CityData", "MapResInfo");
|
||||||
|
var data = await redis.GetHashAsync<game_city_map_res>(key, resId);
|
||||||
|
if (data == null)
|
||||||
|
{
|
||||||
|
var db = DbClient.AsTenant().GetConnectionWithAttr<game_city_map_res>();
|
||||||
|
data = await db.Queryable<game_city_map_res>().Where(it => it.resId == resId).SingleAsync();
|
||||||
|
await redis.AddHashAsync(key, resId, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
public async Task<List<game_city_map_res>> GetMapRes(string mapId)
|
public async Task<List<game_city_map_res>> GetMapRes(string mapId)
|
||||||
{
|
{
|
||||||
string key = string.Format(BaseCache.BaseCacheKeys, "CityData", "MapRes");
|
string key = string.Format(BaseCache.BaseCacheKeys, "CityData", "MapRes");
|
||||||
@@ -933,12 +946,56 @@ public class GameMapService(ISqlSugarClient DbClient, IRedisCache redis) : IGame
|
|||||||
{
|
{
|
||||||
var db = DbClient.AsTenant().GetConnectionWithAttr<game_city_map_res>();
|
var db = DbClient.AsTenant().GetConnectionWithAttr<game_city_map_res>();
|
||||||
data = await db.Queryable<game_city_map_res>().Where(it => it.mapId == mapId).ToListAsync();
|
data = await db.Queryable<game_city_map_res>().Where(it => it.mapId == mapId).ToListAsync();
|
||||||
await redis.AddHashAsync(key, mapId,data);
|
await redis.AddHashAsync(key, mapId, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<List<MapResModel>> GetMapResData(string mapId, int area)
|
||||||
|
{
|
||||||
|
var data = await GetMapRes(mapId);
|
||||||
|
List<MapResModel> result = new List<MapResModel>();
|
||||||
|
foreach (var item in data)
|
||||||
|
{
|
||||||
|
long lockTime = await GetMapResLockTime(item.resId, area);
|
||||||
|
MapResModel temp = new MapResModel()
|
||||||
|
{
|
||||||
|
resId = item.resId,
|
||||||
|
resName = item.resName,
|
||||||
|
lev = (int)item.lev,
|
||||||
|
lockTime = lockTime,
|
||||||
|
needVigour = (int)item.needVigour,
|
||||||
|
gather = (int)item.gatherTime
|
||||||
|
};
|
||||||
|
result.Add(temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<long> GetMapResLockTime(string resId, int area)
|
||||||
|
{
|
||||||
|
long result = 0;
|
||||||
|
string key = string.Format(BaseCache.BaseCacheKeys, "CityData", "MapResLockTime");
|
||||||
|
string field = $"{area}_{resId}";
|
||||||
|
if (await redis.HExistsHashAsync(key, field))
|
||||||
|
{
|
||||||
|
long lockTime = await redis.GetHashAsync<long>(key, field);
|
||||||
|
result = lockTime - TimeExtend.GetTimeStampSeconds;
|
||||||
|
result = result <= 0 ? 0 : result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task SetMapResLockTime(string resId, int area, int lockTime)
|
||||||
|
{
|
||||||
|
string key = string.Format(BaseCache.BaseCacheKeys, "CityData", "MapResLockTime");
|
||||||
|
string field = $"{area}_{resId}";
|
||||||
|
long atTime = TimeExtend.GetTimeStampSeconds + lockTime;
|
||||||
|
await redis.AddHashAsync(key, field, atTime);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
using Newtonsoft.Json;
|
||||||
|
|
||||||
|
namespace Application.Domain;
|
||||||
|
|
||||||
|
public class GameSkillService(ISqlSugarClient DbClient, IRedisCache redis) : IGameSkillService, ITransient
|
||||||
|
{
|
||||||
|
public async Task<game_skill> GetGameSkillInfo(int skillId)
|
||||||
|
{
|
||||||
|
string key = string.Format(BaseCache.BaseCacheKeys, "SkillData", "SkillInfo");
|
||||||
|
var data = await redis.GetHashAsync<game_skill>(key, skillId.ToString());
|
||||||
|
if (data == null)
|
||||||
|
{
|
||||||
|
var db = DbClient.AsTenant().GetConnectionWithAttr<game_skill>();
|
||||||
|
data = await db.Queryable<game_skill>().Where(it => it.skill == skillId).SingleAsync();
|
||||||
|
await redis.AddHashAsync(key, skillId.ToString(), data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetUserSkillKey(string userId, string code)
|
||||||
|
{
|
||||||
|
return $"{userId}_{code}";
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<unit_user_skill> GetUserSkillInfo(string userId, string code)
|
||||||
|
{
|
||||||
|
string usId = GetUserSkillKey(userId, code);
|
||||||
|
string key = string.Format(BaseCache.BaseCacheKeys, "SkillData", "UserSkill");
|
||||||
|
if (await redis.HExistsHashAsync(key,usId))
|
||||||
|
{
|
||||||
|
return await redis.GetHashAsync<unit_user_skill>(key,usId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var db = DbClient.AsTenant().GetConnectionWithAttr<unit_user_skill>();
|
||||||
|
var data = await db.Queryable<unit_user_skill>().Where(it => it.usId == usId).SingleAsync();
|
||||||
|
await redis.AddHashAsync(key,usId, data);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<AttrItem>> GetUserSkillAttr(string userId)
|
||||||
|
{
|
||||||
|
List<AttrItem> result = new List<AttrItem>();
|
||||||
|
string key = string.Format(BaseCache.BaseCacheKeys, "SkillData", "UserSkillAttr");
|
||||||
|
if (await redis.HExistsHashAsync(key,userId))
|
||||||
|
{
|
||||||
|
result = await redis.GetHashAsync<List<AttrItem>>(key,userId);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var data = await GetUserSkill(userId);
|
||||||
|
foreach (var item in data)
|
||||||
|
{
|
||||||
|
if (item.code == nameof(SkillEnum.code.ATK) || item.code ==nameof(SkillEnum.code.DEFENCE) ||
|
||||||
|
item.code == nameof(SkillEnum.code.AGILE))
|
||||||
|
{
|
||||||
|
List<AttrItem> attr = JsonConvert.DeserializeObject<List<AttrItem>>(item.sign);
|
||||||
|
result.AddRange(attr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await redis.AddHashAsync(key,userId, result);
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<unit_user_skill>> GetUserSkill(string userId)
|
||||||
|
{
|
||||||
|
var db = DbClient.AsTenant().GetConnectionWithAttr<unit_user_skill>();
|
||||||
|
return await db.Queryable<unit_user_skill>().Where(it => it.userId == userId)
|
||||||
|
.OrderBy(it => it.name, OrderByType.Asc).ToListAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ClearUserSkillInfo(string userId, string code)
|
||||||
|
{
|
||||||
|
string usId = GetUserSkillKey(userId, code);
|
||||||
|
string key = string.Format(BaseCache.BaseCacheKeys, "SkillData", "UserSkill");
|
||||||
|
await redis.DelHashAsync(key,usId);
|
||||||
|
key = string.Format(BaseCache.BaseCacheKeys, "SkillData", "UserSkillAttr");
|
||||||
|
await redis.DelHashAsync(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<bool> UpdateUserSkill(string userId, int skillId)
|
||||||
|
{
|
||||||
|
bool result = false;
|
||||||
|
var skillInfo = await GetGameSkillInfo(skillId);
|
||||||
|
if (skillInfo != null)
|
||||||
|
{
|
||||||
|
unit_user_skill usInfo = new unit_user_skill();
|
||||||
|
usInfo.usId = GetUserSkillKey(userId, skillInfo.code);
|
||||||
|
usInfo.userId = userId;
|
||||||
|
usInfo.code = skillInfo.code;
|
||||||
|
usInfo.skill = skillInfo.skill;
|
||||||
|
usInfo.name = skillInfo.name;
|
||||||
|
usInfo.lev = skillInfo.lev;
|
||||||
|
usInfo.sign = skillInfo.sign;
|
||||||
|
usInfo.remark = skillInfo.remark;
|
||||||
|
var userSkill = await GetUserSkillInfo(userId, skillInfo.code);
|
||||||
|
if (userSkill == null)
|
||||||
|
{
|
||||||
|
var db = DbClient.AsTenant().GetConnectionWithAttr<unit_user_skill>();
|
||||||
|
result = await db.Insertable(usInfo).ExecuteCommandAsync() > 0;
|
||||||
|
}
|
||||||
|
else if (userSkill.lev < skillInfo.lev)
|
||||||
|
{
|
||||||
|
var db = DbClient.AsTenant().GetConnectionWithAttr<unit_user_skill>();
|
||||||
|
result = await db.Updateable(usInfo).ExecuteCommandAsync() > 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
await ClearUserSkillInfo(userId, skillInfo.code);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -18,10 +18,11 @@ public class MapController : ControllerBase
|
|||||||
private readonly IMessageService _messageService;
|
private readonly IMessageService _messageService;
|
||||||
private readonly IUnitUserWeight _weightService;
|
private readonly IUnitUserWeight _weightService;
|
||||||
private readonly IUnitUserAccService _accService;
|
private readonly IUnitUserAccService _accService;
|
||||||
|
private readonly IGameSkillService _skillService;
|
||||||
|
private readonly IGameGoodsService _goodsService;
|
||||||
public MapController(IUnitUserService userService, IGameMapService mapService, IGameChatService chatService,
|
public MapController(IUnitUserService userService, IGameMapService mapService, IGameChatService chatService,
|
||||||
IUnitUserAttrService attrService, IMessageService messageService, IUnitUserWeight weightService,
|
IUnitUserAttrService attrService, IMessageService messageService, IUnitUserWeight weightService,
|
||||||
IUnitUserAccService accService)
|
IUnitUserAccService accService, IGameSkillService skillService,IGameGoodsService goodsService)
|
||||||
{
|
{
|
||||||
_userService = userService;
|
_userService = userService;
|
||||||
_mapService = mapService;
|
_mapService = mapService;
|
||||||
@@ -30,6 +31,8 @@ public class MapController : ControllerBase
|
|||||||
_messageService = messageService;
|
_messageService = messageService;
|
||||||
_weightService = weightService;
|
_weightService = weightService;
|
||||||
_accService = accService;
|
_accService = accService;
|
||||||
|
_skillService = skillService;
|
||||||
|
_goodsService = goodsService;
|
||||||
}
|
}
|
||||||
|
|
||||||
#region 地图相关
|
#region 地图相关
|
||||||
@@ -118,10 +121,10 @@ public class MapController : ControllerBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
//地图资源
|
//地图资源
|
||||||
List<game_city_map_res> mapRes = new List<game_city_map_res>();
|
List<MapResModel> mapRes = new List<MapResModel>();
|
||||||
if (mapInfo.isRes == 1)
|
if (mapInfo.isRes == 1)
|
||||||
{
|
{
|
||||||
mapRes = await _mapService.GetMapRes(mapInfo.mapId);
|
mapRes = await _mapService.GetMapResData(mapInfo.mapId, area);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -635,4 +638,78 @@ public class MapController : ControllerBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region 采集相关
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 采集接口
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="resId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<IPoAction> CollectMapRes(string resId)
|
||||||
|
{
|
||||||
|
var resInfo = await _mapService.GetMapResInfo(resId);
|
||||||
|
if (resInfo == null)
|
||||||
|
{
|
||||||
|
return PoAction.Message("特产不存在!");
|
||||||
|
}
|
||||||
|
|
||||||
|
var userId = StateHelper.userId;
|
||||||
|
int area = StateHelper.areaId;
|
||||||
|
var onMap = await _mapService.GetUserOnMap(userId);
|
||||||
|
if (onMap.mapId != resInfo.mapId)
|
||||||
|
{
|
||||||
|
return PoAction.Message("特产不存在!");
|
||||||
|
}
|
||||||
|
|
||||||
|
long lockTime = await _mapService.GetMapResLockTime(resId, area);
|
||||||
|
if (lockTime > 0)
|
||||||
|
{
|
||||||
|
return PoAction.Message($"{lockTime}秒后可采集!");
|
||||||
|
}
|
||||||
|
|
||||||
|
var skillInfo = await _skillService.GetUserSkillInfo(userId, nameof(SkillEnum.code.Collect));
|
||||||
|
if (skillInfo == null)
|
||||||
|
{
|
||||||
|
return PoAction.Message("未学习采集术!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (skillInfo.lev < resInfo.lev)
|
||||||
|
{
|
||||||
|
return PoAction.Message($"需要{resInfo.lev}级采集术才可以采集哦!");
|
||||||
|
}
|
||||||
|
|
||||||
|
var myVigour = await _attrService.GetUserVigourInfo(userId);
|
||||||
|
Console.WriteLine($"{myVigour.vitality }-{resInfo.needVigour}");
|
||||||
|
if (myVigour.vitality < resInfo.needVigour)
|
||||||
|
{
|
||||||
|
return PoAction.Message("活力不足!");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (await _attrService.UpdateUserVigour(userId, 0, (int)resInfo.needVigour))
|
||||||
|
{
|
||||||
|
await _mapService.SetMapResLockTime(resId, area, (int)resInfo.gatherTime);
|
||||||
|
if (RandomAssist.CheakRandom((int)resInfo.okRadio))
|
||||||
|
{
|
||||||
|
//采集成功
|
||||||
|
string[] counts = resInfo.count.Split('-');
|
||||||
|
int onCount =
|
||||||
|
RandomAssist.GetFormatedNumeric(Convert.ToInt32(counts[0]), Convert.ToInt32(counts[1]) + 1);
|
||||||
|
await _goodsService.UpdateUserGoods(userId, 1, (int)resInfo.goodsId, onCount, "采集获得");
|
||||||
|
return PoAction.Ok(resInfo.gatherTime, $"成功采集{resInfo.resName}×{onCount}!");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await _mapService.SetMapResLockTime(resId, area, (int)resInfo.gatherTime);
|
||||||
|
return PoAction.Ok(resInfo.gatherTime, "抱歉,采集失败!提升技能会提高成功率哦!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return PoAction.Message("采集失败,请稍后尝试!");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
@@ -15,10 +15,10 @@ public class UserController : ControllerBase
|
|||||||
private readonly IUnitUserRelationService _relationService;
|
private readonly IUnitUserRelationService _relationService;
|
||||||
private readonly IGameGoodsService _goodsService;
|
private readonly IGameGoodsService _goodsService;
|
||||||
private readonly IGameChatService _chatService;
|
private readonly IGameChatService _chatService;
|
||||||
|
private readonly IGameSkillService _skillService;
|
||||||
public UserController(IUnitUserService userService, IUnitUserAttrService attrService,
|
public UserController(IUnitUserService userService, IUnitUserAttrService attrService,
|
||||||
IUnitUserAccService accService, IGameMapService mapService, IUnitUserRelationService relationService,
|
IUnitUserAccService accService, IGameMapService mapService, IUnitUserRelationService relationService,
|
||||||
IGameGoodsService goodsService, IGameChatService chatService)
|
IGameGoodsService goodsService, IGameChatService chatService,IGameSkillService skillService)
|
||||||
{
|
{
|
||||||
_userService = userService;
|
_userService = userService;
|
||||||
_attrService = attrService;
|
_attrService = attrService;
|
||||||
@@ -27,6 +27,7 @@ public class UserController : ControllerBase
|
|||||||
_relationService = relationService;
|
_relationService = relationService;
|
||||||
_goodsService = goodsService;
|
_goodsService = goodsService;
|
||||||
_chatService = chatService;
|
_chatService = chatService;
|
||||||
|
_skillService = skillService;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -280,4 +281,16 @@ public class UserController : ControllerBase
|
|||||||
return PoAction.Message("操作失败,请稍后尝试!");
|
return PoAction.Message("操作失败,请稍后尝试!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取用户技能
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<IPoAction>GetUserSkill()
|
||||||
|
{
|
||||||
|
var userId = StateHelper.userId;
|
||||||
|
var data = await _skillService.GetUserSkill(userId);
|
||||||
|
return PoAction.Ok(data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -21,9 +21,6 @@ body {
|
|||||||
|
|
||||||
.main {}
|
.main {}
|
||||||
|
|
||||||
div {
|
|
||||||
margin: 5px 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div img {
|
div img {
|
||||||
margin-right: 2px;
|
margin-right: 2px;
|
||||||
@@ -38,13 +35,21 @@ div img {
|
|||||||
max-height: 120px;
|
max-height: 120px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.head {}
|
.head {
|
||||||
|
margin: 5px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
.title {}
|
.title {
|
||||||
|
margin: 5px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
.content {}
|
.content {
|
||||||
|
margin: 5px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
.item {}
|
.item {
|
||||||
|
margin: 5px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
.border {
|
.border {
|
||||||
border-bottom: 1px dashed #9f8d8d;
|
border-bottom: 1px dashed #9f8d8d;
|
||||||
@@ -54,7 +59,9 @@ div img {
|
|||||||
height: 5px;
|
height: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.foot {}
|
.foot {
|
||||||
|
margin: 5px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
color: #1e5494;
|
color: #1e5494;
|
||||||
@@ -91,7 +98,9 @@ a:focus {
|
|||||||
color: red;
|
color: red;
|
||||||
}
|
}
|
||||||
|
|
||||||
.common {}
|
.common {
|
||||||
|
margin: 5px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
.common img {
|
.common img {
|
||||||
margin-right: 2px;
|
margin-right: 2px;
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
<div class="content" v-if="mapRes.length > 0">
|
<div class="content" v-if="mapRes.length > 0">
|
||||||
特产:<br>
|
特产:<br>
|
||||||
<div class="item" v-for="item in mapRes">
|
<div class="item" v-for="item in mapRes">
|
||||||
<Abutton>{{item.resName}}</Abutton>
|
<Abutton @click="showResProp(item)">{{ item.resName }}({{ item.lev }}级)</Abutton>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -89,6 +89,20 @@
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
</GamePopup>
|
</GamePopup>
|
||||||
|
<GamePopup v-model:show="showRes" title="【采集】" style="width: 60%;">
|
||||||
|
<!-- 自定义内容 -->
|
||||||
|
<div class="content">
|
||||||
|
物品名称:{{ showResData.resName }}<br>
|
||||||
|
采集要求:{{ showResData.lev }}级采集术<br>
|
||||||
|
消耗活力:{{ showResData.needVigour }}<br>
|
||||||
|
冷却时间:{{ showResData.gather }}秒<br>
|
||||||
|
</div>
|
||||||
|
<div class="content" style="max-height: 300px;text-align: center; margin-top: 15px;;">
|
||||||
|
<van-button type="success" :disabled="resLockDiff > 0 ? true : false" @click="CollectRes">
|
||||||
|
{{ resLockDiff > 0 ? `${resLockDiff}秒后可采集` : "立即采集" }}
|
||||||
|
</van-button>
|
||||||
|
</div>
|
||||||
|
</GamePopup>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
definePageMeta({
|
definePageMeta({
|
||||||
@@ -132,8 +146,6 @@ const BindData = async (map: string): Promise<void> => {
|
|||||||
mapRes.value = result.data.mapRes;
|
mapRes.value = result.data.mapRes;
|
||||||
MapVent(result.data.mapInfo.near);
|
MapVent(result.data.mapInfo.near);
|
||||||
onMap.value = mapInfo.value.mapId;
|
onMap.value = mapInfo.value.mapId;
|
||||||
console.log(result.data);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (result.code == 103) {
|
else if (result.code == 103) {
|
||||||
PageExtend.Redirect("/map/runing");
|
PageExtend.Redirect("/map/runing");
|
||||||
@@ -235,4 +247,46 @@ const StartToMap = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**采集相关 */
|
||||||
|
const showRes = ref(false);
|
||||||
|
const showResData = ref<any>({});
|
||||||
|
const resLockDiff = ref(0);
|
||||||
|
const reslockTimer = ref(0) // 定时器实例
|
||||||
|
const showResProp = async (data: any) => {
|
||||||
|
showRes.value = true;
|
||||||
|
showResData.value = data;
|
||||||
|
resLockDiff.value = data.lockTime;
|
||||||
|
if (resLockDiff.value > 0) {
|
||||||
|
reslockTimer.value = setInterval(async () => {
|
||||||
|
resLockRun();
|
||||||
|
}, 1000)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const resLockRun = () => {
|
||||||
|
if (resLockDiff.value > 0) {
|
||||||
|
resLockDiff.value = resLockDiff.value - 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
clearInterval(reslockTimer.value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const CollectRes = async () => {
|
||||||
|
MessageExtend.LoadingToast("采集中...");
|
||||||
|
let result = await MapService.CollectMapRes(showResData.value.resId);
|
||||||
|
MessageExtend.LoadingClose();
|
||||||
|
if (result.code == 0) {
|
||||||
|
resLockDiff.value = result.data;
|
||||||
|
MessageExtend.ShowToast(result.msg);
|
||||||
|
clearInterval(reslockTimer.value);
|
||||||
|
reslockTimer.value = setInterval(async () => {
|
||||||
|
resLockRun();
|
||||||
|
}, 1000)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MessageExtend.ShowDialog("提示", result.msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
@@ -1 +1,49 @@
|
|||||||
<template></template>
|
<template>
|
||||||
|
<div class="content">【我的技能】</div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="item" v-for="(item,index) in data" :key="index">
|
||||||
|
{{index+1}}.<Abutton @click="showView(item)">{{item.name}}({{item.lev}}级)</Abutton>
|
||||||
|
</div>
|
||||||
|
<span v-if="data.length==0">暂无技能.</span>
|
||||||
|
</div>
|
||||||
|
<GamePopup v-model:show="showInfo" title="【技能说明】" style="width: 50%;">
|
||||||
|
<!-- 自定义内容 -->
|
||||||
|
<div class="content" v-html="onShow.remark">
|
||||||
|
</div>
|
||||||
|
</GamePopup>
|
||||||
|
</template>
|
||||||
|
<script setup lang="ts">
|
||||||
|
definePageMeta({
|
||||||
|
layout: layout.default,
|
||||||
|
middleware: middleware.loading
|
||||||
|
})
|
||||||
|
|
||||||
|
const data = ref<Array<any>>([]);
|
||||||
|
const showInfo = ref(false);
|
||||||
|
const onShow = ref<any>({});
|
||||||
|
|
||||||
|
onMounted(async () => {
|
||||||
|
try {
|
||||||
|
await BindData();
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
PageLoading.Close();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
const BindData = async () => {
|
||||||
|
let result = await UserService.GetUserSkill();
|
||||||
|
if (result.code == 0) {
|
||||||
|
data.value = result.data;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MessageExtend.ShowDialog("技能", result.msg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const showView = (data: any) => {
|
||||||
|
showInfo.value = true;
|
||||||
|
onShow.value = data;
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
@@ -86,4 +86,12 @@ export class MapService {
|
|||||||
static async GetNpcInfo(npcId: number) {
|
static async GetNpcInfo(npcId: number) {
|
||||||
return await ApiService.Request("get", "/Map/Map/GetNpcInfo", { npcId });
|
return await ApiService.Request("get", "/Map/Map/GetNpcInfo", { npcId });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 采集接口
|
||||||
|
* GET /Map/Map/CollectMapRes
|
||||||
|
*/
|
||||||
|
static async CollectMapRes(resId: string) {
|
||||||
|
return await ApiService.Request("get", "/Map/Map/CollectMapRes", { resId });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -57,4 +57,12 @@ export class UserService {
|
|||||||
static async UpdateUserSign(sign: string) {
|
static async UpdateUserSign(sign: string) {
|
||||||
return await ApiService.Request("post", "/User/User/UpdateUserSign", { sign });
|
return await ApiService.Request("post", "/User/User/UpdateUserSign", { sign });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取用户技能
|
||||||
|
* GET /User/User/GetUserSkill
|
||||||
|
*/
|
||||||
|
static async GetUserSkill() {
|
||||||
|
return await ApiService.Request("get", "/User/User/GetUserSkill");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user