606 lines
17 KiB
C#
606 lines
17 KiB
C#
using Microsoft.AspNetCore.Mvc;
|
|
|
|
namespace Application.Web.Controllers.Map;
|
|
|
|
/// <summary>
|
|
/// 地图接口
|
|
/// </summary>
|
|
[ApiExplorerSettings(GroupName = "Map")]
|
|
[Route("Map/[controller]/[action]")]
|
|
[ApiController]
|
|
[Authorize]
|
|
public class MapController : ControllerBase
|
|
{
|
|
private readonly IUnitUserService _userService;
|
|
private readonly IGameMapService _mapService;
|
|
private readonly IGameChatService _chatService;
|
|
private readonly IUnitUserAttrService _attrService;
|
|
private readonly IMessageService _messageService;
|
|
private readonly IUnitUserWeight _weightService;
|
|
private readonly IUnitUserAccService _accService;
|
|
|
|
public MapController(IUnitUserService userService, IGameMapService mapService, IGameChatService chatService,
|
|
IUnitUserAttrService attrService, IMessageService messageService, IUnitUserWeight weightService,
|
|
IUnitUserAccService accService)
|
|
{
|
|
_userService = userService;
|
|
_mapService = mapService;
|
|
_chatService = chatService;
|
|
_attrService = attrService;
|
|
_messageService = messageService;
|
|
_weightService = weightService;
|
|
_accService = accService;
|
|
}
|
|
|
|
#region 地图相关
|
|
|
|
/// <summary>
|
|
/// 获取地图主页信息
|
|
/// </summary>
|
|
/// <param name="map"></param>
|
|
/// <returns></returns>
|
|
[HttpGet]
|
|
public async Task<IPoAction> GetMapData(string? map)
|
|
{
|
|
string userId = StateHelper.userId;
|
|
int area = StateHelper.areaId;
|
|
game_city_map mapInfo = new game_city_map();
|
|
|
|
#region 前置条件处理
|
|
var userRunInfo = await _mapService.GetUserRun(userId);
|
|
if (userRunInfo.status != 0)
|
|
{
|
|
return PoAction.Message("正在航行状态", 103);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region 地图导向处理
|
|
|
|
bool isSelfMap = false;
|
|
if (!isSelfMap)
|
|
{
|
|
//血量为0得时候地图点为本身
|
|
var myBlood = await _attrService.GetUserBlood(userId);
|
|
if (myBlood.blood < 1)
|
|
{
|
|
//设置默认地图点
|
|
await _mapService.SetUserMapDefult(userId);
|
|
isSelfMap = true;
|
|
}
|
|
}
|
|
|
|
if (isSelfMap)
|
|
{
|
|
var onMap = await _mapService.GetUserOnMap(userId);
|
|
mapInfo = await _mapService.GetMapInfo(onMap.mapId);
|
|
}
|
|
else
|
|
{
|
|
mapInfo = await _mapService.GetToMapInfo(userId, map, false);
|
|
}
|
|
|
|
#endregion
|
|
|
|
//公聊信息
|
|
string teamId = "";
|
|
string groupId = "";
|
|
var chatData = await _chatService.GetChatTop(userId, area, 2, teamId, groupId);
|
|
|
|
|
|
var npcData = await _mapService.GetMapNpc(mapInfo.mapId); //NPC信息
|
|
npcData = npcData.FindAll(it => GameTool.AreaVerify(StateHelper.areaId, it.areaId));
|
|
var nearUser =
|
|
await _mapService.GetMapUser(mapInfo.mapId, area, (int)mapInfo.lookArea, new List<string> { userId },
|
|
3); //获取附近的人
|
|
|
|
var cityInfo = await _mapService.GetCityInfo((int)mapInfo.cityId); //城市信息
|
|
var cityShow = await _mapService.GetCityShowMap(cityInfo.cityId); //城内地图
|
|
|
|
var noReadMsg = await _messageService.GetNoReadCount(userId);
|
|
|
|
#region 更新在线
|
|
|
|
string ip = ComHelper.GetClientUserIp(HttpContext);
|
|
await _mapService.UpdateUserOnMap(userId, ip, mapInfo.mapId);
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
object ret = new
|
|
{
|
|
mapInfo,
|
|
cityInfo,
|
|
npcData,
|
|
chatData,
|
|
cityShow,
|
|
nearUser,
|
|
noReadMsg = noReadMsg[3]
|
|
};
|
|
|
|
return PoAction.Ok(ret);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取地图在线玩家
|
|
/// </summary>
|
|
/// <param name="map"></param>
|
|
/// <param name="page"></param>
|
|
/// <returns></returns>
|
|
[HttpGet]
|
|
public async Task<IPoAction> GetMapUser(int page)
|
|
{
|
|
RefAsync<int> Total = 0;
|
|
string userId = StateHelper.userId;
|
|
int areaId = StateHelper.areaId;
|
|
var onMap = await _mapService.GetUserOnMap(userId);
|
|
|
|
var mapInfo = await _mapService.GetMapInfo(onMap.mapId);
|
|
if (mapInfo == null)
|
|
{
|
|
return PoAction.Message("地图不存在!");
|
|
}
|
|
|
|
var data = await _mapService.GetMapUser(onMap.mapId, areaId, (int)mapInfo.lookArea, new List<string> { userId },
|
|
page,
|
|
10, Total);
|
|
|
|
return PoAction.Ok(new { data, total = Total.Value, map = mapInfo });
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取当前城市所有地图
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpGet]
|
|
public async Task<IPoAction> GetUserOnCityMap(string? search)
|
|
{
|
|
string userId = StateHelper.userId;
|
|
var onMap = await _mapService.GetUserOnMap(userId);
|
|
var mapInfo = await _mapService.GetMapInfo(onMap.mapId);
|
|
var data = await _mapService.GetCityMap((int)mapInfo.cityId);
|
|
if (!string.IsNullOrEmpty(search))
|
|
{
|
|
data = data.FindAll(it => it.mapName.Contains(search));
|
|
}
|
|
|
|
return PoAction.Ok(data);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 获取自动寻路路径
|
|
/// </summary>
|
|
/// <param name="toMap"></param>
|
|
/// <returns></returns>
|
|
[HttpGet]
|
|
public async Task<IPoAction> GetAutoMapPath(string? toMap)
|
|
{
|
|
if (string.IsNullOrEmpty(toMap))
|
|
{
|
|
return PoAction.Message("目标地点不能为空!");
|
|
}
|
|
|
|
string userId = StateHelper.userId;
|
|
var onMap = await _mapService.GetUserOnMap(userId);
|
|
var result = await _mapService.CreateAutoMap(onMap.mapId, toMap);
|
|
if (result.Count > 0)
|
|
{
|
|
return PoAction.Ok(result);
|
|
}
|
|
else
|
|
{
|
|
return PoAction.Message("无法自动寻路!");
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 获取传送/航海城市列表
|
|
/// </summary>
|
|
/// <param name="npcId"></param>
|
|
/// <param name="cityId"></param>
|
|
/// <returns></returns>
|
|
[HttpGet]
|
|
public async Task<IPoAction> GetCityData(int npcId, int cityId)
|
|
{
|
|
string userId = StateHelper.userId;
|
|
|
|
#region NPC验证
|
|
|
|
var npcInfo = await _mapService.GetNpcInfo(npcId);
|
|
if (npcInfo == null)
|
|
{
|
|
return PoAction.Message("Npc不存在!");
|
|
}
|
|
|
|
if (npcInfo.status != 1)
|
|
{
|
|
return PoAction.Message("Npc不存在!");
|
|
}
|
|
|
|
if (!npcInfo.bus.Any(it => it.code == nameof(GameEnum.NpcBusCode.MapTo)))
|
|
{
|
|
return PoAction.Message("业务不可用!");
|
|
}
|
|
|
|
var onMap = await _mapService.GetUserOnMapId(userId);
|
|
if (npcInfo.mapId != onMap)
|
|
{
|
|
return PoAction.Message("Npc不存在!");
|
|
}
|
|
|
|
#endregion
|
|
|
|
var cityData = await _mapService.GetCityData();
|
|
cityData = cityData.FindAll(it => it.type == "DEF_MAP");
|
|
|
|
List<game_city> area = cityData.FindAll(it => it.parent == 0);
|
|
if (cityId == 0)
|
|
{
|
|
cityId = area[0].cityId;
|
|
}
|
|
|
|
var onCityData = cityData.FindAll(it => it.parent == cityId);
|
|
var userCity = await _mapService.GetUserCityMapData(userId);
|
|
var AtCity = await _mapService.GetMapCityByMapId(onMap);
|
|
|
|
List<MapTemp> city = new List<MapTemp>();
|
|
onCityData.ForEach(item =>
|
|
{
|
|
if (userCity.Any(it => it.cityId == item.cityId) && item.cityId != AtCity)
|
|
{
|
|
MapTemp temp = new MapTemp();
|
|
temp.cityId = item.cityId;
|
|
temp.cityName = item.cityName;
|
|
temp.distance = GameTool.ComputeMile(onMap, item.toMap);
|
|
temp.copper = temp.distance * GameConfig.GameToMapNeedCopper;
|
|
city.Add(temp);
|
|
}
|
|
});
|
|
string tips = $"*传送消耗:{GameConfig.GameToMapNeedCopper}铜贝/海里<br>*等级低于80级不需要传送费!";
|
|
return PoAction.Ok(new { area, city, cityId, tips });
|
|
}
|
|
|
|
/// <summary>
|
|
/// 用户传送到地图
|
|
/// </summary>
|
|
/// <param name="npcId"></param>
|
|
/// <param name="cityId"></param>
|
|
/// <returns></returns>
|
|
[HttpGet]
|
|
public async Task<IPoAction> UserToMap(int npcId, int cityId)
|
|
{
|
|
string userId = StateHelper.userId;
|
|
|
|
#region NPC验证
|
|
|
|
var npcInfo = await _mapService.GetNpcInfo(npcId);
|
|
if (npcInfo == null)
|
|
{
|
|
return PoAction.Message("Npc不存在!");
|
|
}
|
|
|
|
if (npcInfo.status != 1)
|
|
{
|
|
return PoAction.Message("Npc不存在!");
|
|
}
|
|
|
|
if (!npcInfo.bus.Any(it => it.code == nameof(GameEnum.NpcBusCode.MapTo)))
|
|
{
|
|
return PoAction.Message("业务不可用!");
|
|
}
|
|
|
|
var onMap = await _mapService.GetUserOnMap(userId);
|
|
if (npcInfo.mapId != onMap.mapId)
|
|
{
|
|
return PoAction.Message("Npc不存在!");
|
|
}
|
|
|
|
#endregion
|
|
|
|
var cityInfo = await _mapService.GetCityInfo(cityId);
|
|
if (cityInfo == null)
|
|
{
|
|
return PoAction.Message("城市不存在!");
|
|
}
|
|
|
|
var userWeight = await _weightService.GetUserWeightInfo(userId);
|
|
if (userWeight.shipOnWeight > 0)
|
|
{
|
|
return PoAction.Message("背包中存在货物,不可传送,你可以进行航行!");
|
|
}
|
|
|
|
var onMapInfo = await _mapService.GetMapInfo(onMap.mapId);
|
|
if (onMapInfo.cityId == cityId)
|
|
{
|
|
return PoAction.Message("您已在当前城市,无需传送!");
|
|
}
|
|
|
|
var MySeaMap = await _mapService.GetUserCityMapData(userId);
|
|
if (MySeaMap.Any(it => it.cityId == cityId) == false)
|
|
{
|
|
return PoAction.Message("您暂未获取该城市海图!");
|
|
}
|
|
|
|
bool isCanTo = false;
|
|
var MyLev = await _attrService.GetUserLev(userId);
|
|
if (MyLev < 80)
|
|
{
|
|
isCanTo = true;
|
|
}
|
|
|
|
int need = 0;
|
|
if (isCanTo == false) //判断费用
|
|
{
|
|
var myAcc = await _accService.GetUserAccInfo(userId, nameof(AccEnum.AccType.copper));
|
|
need = GameTool.ComputeMile(onMap.mapId, cityInfo.toMap) * GameConfig.GameToMapNeedCopper;
|
|
if (myAcc < need)
|
|
{
|
|
return PoAction.Message("铜贝不足!");
|
|
}
|
|
|
|
isCanTo = true;
|
|
}
|
|
|
|
if (isCanTo)
|
|
{
|
|
if (await _mapService.UpdateUserOnMap(onMap, cityInfo.toMap))
|
|
{
|
|
if (need > 0)
|
|
{
|
|
await _accService.UpdateUserCopper(userId, 0, need, $"传送到【{cityInfo.cityName}】费用");
|
|
}
|
|
|
|
return PoAction.Ok(true);
|
|
}
|
|
else
|
|
{
|
|
return PoAction.Message("传送失败,请稍后尝试!");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return PoAction.Message("传送失败,请稍后尝试!");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 用户航海接口
|
|
/// </summary>
|
|
/// <param name="npcId"></param>
|
|
/// <param name="cityId"></param>
|
|
/// <returns></returns>
|
|
[HttpGet]
|
|
public async Task<IPoAction> UserRunMap(int npcId, int cityId)
|
|
{
|
|
string userId = StateHelper.userId;
|
|
|
|
#region NPC验证
|
|
|
|
var npcInfo = await _mapService.GetNpcInfo(npcId);
|
|
if (npcInfo == null)
|
|
{
|
|
return PoAction.Message("Npc不存在!");
|
|
}
|
|
|
|
if (npcInfo.status != 1)
|
|
{
|
|
return PoAction.Message("Npc不存在!");
|
|
}
|
|
|
|
if (!npcInfo.bus.Any(it => it.code == nameof(GameEnum.NpcBusCode.MapTo)))
|
|
{
|
|
return PoAction.Message("业务不可用!");
|
|
}
|
|
|
|
var onMap = await _mapService.GetUserOnMap(userId);
|
|
if (npcInfo.mapId != onMap.mapId)
|
|
{
|
|
return PoAction.Message("Npc不存在!");
|
|
}
|
|
|
|
#endregion
|
|
|
|
var cityInfo = await _mapService.GetCityInfo(cityId);
|
|
if (cityInfo == null)
|
|
{
|
|
return PoAction.Message("城市不存在!");
|
|
}
|
|
|
|
|
|
var onMapInfo = await _mapService.GetMapInfo(onMap.mapId);
|
|
if (onMapInfo.cityId == cityId)
|
|
{
|
|
return PoAction.Message("您已在当前城市,无需航行!");
|
|
}
|
|
|
|
var MySeaMap = await _mapService.GetUserCityMapData(userId);
|
|
if (MySeaMap.Any(it => it.cityId == cityId) == false)
|
|
{
|
|
return PoAction.Message("您暂未获取该城市海图!");
|
|
}
|
|
|
|
var userShip = await _weightService.GetUserShip(userId);
|
|
if (userShip.Count == 0)
|
|
{
|
|
return PoAction.Message("购买船只后才可以航行哦!");
|
|
}
|
|
|
|
var runInfo = await _mapService.GetUserRun(userId);
|
|
if (runInfo.status != 0)
|
|
{
|
|
return PoAction.Message("您已经在航线上啦!");
|
|
}
|
|
|
|
bool isCanTo = false;
|
|
var MyLev = await _attrService.GetUserLev(userId);
|
|
if (MyLev < 80)
|
|
{
|
|
isCanTo = true;
|
|
}
|
|
|
|
int need = 0;
|
|
if (isCanTo == false) //判断费用
|
|
{
|
|
var myAcc = await _accService.GetUserAccInfo(userId, nameof(AccEnum.AccType.copper));
|
|
int jl = GameTool.ComputeMile(onMap.mapId, cityInfo.toMap);
|
|
need = userShip.Max(it => (int)it.copper) * jl;
|
|
if (myAcc < need)
|
|
{
|
|
return PoAction.Message("铜贝不足!");
|
|
}
|
|
|
|
isCanTo = true;
|
|
}
|
|
|
|
if (isCanTo)
|
|
{
|
|
if (await _mapService.SaveUserRunInfo(userId, StateHelper.areaId, onMap.mapId, cityInfo.toMap))
|
|
{
|
|
if (need > 0)
|
|
{
|
|
await _accService.UpdateUserCopper(userId, 0, need, $"传送到【{cityInfo.cityName}】费用");
|
|
}
|
|
|
|
return PoAction.Ok(true);
|
|
}
|
|
else
|
|
{
|
|
return PoAction.Message("传送失败,请稍后尝试!");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return PoAction.Message("传送失败,请稍后尝试!");
|
|
}
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 获取用户航行状态
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpGet]
|
|
public async Task<IPoAction> GetUserRun()
|
|
{
|
|
var userId = StateHelper.userId;
|
|
var runInfo = await _mapService.GetUserRun(userId);
|
|
if (runInfo.status != 1)
|
|
{
|
|
return PoAction.Message("不在航行状态", 100);
|
|
}
|
|
|
|
var onCity = await _mapService.GetCityInfoByMapId(runInfo.onMap);
|
|
var toCity = await _mapService.GetCityInfoByMapId(runInfo.toMap);
|
|
int isShip = 0;
|
|
int safety = 0;
|
|
|
|
return PoAction.Ok(new
|
|
{
|
|
onCity = onCity.cityName,
|
|
toCity = toCity.cityName,
|
|
distance = runInfo.distance,
|
|
position = runInfo.position,
|
|
isShip = isShip,
|
|
safety = safety
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 取消航行
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
[HttpGet]
|
|
public async Task<IPoAction> StopUserRun()
|
|
{
|
|
var userId = StateHelper.userId;
|
|
var runInfo = await _mapService.GetUserRun(userId);
|
|
if (runInfo.status != 1)
|
|
{
|
|
return PoAction.Message("不在航行状态", 100);
|
|
}
|
|
|
|
if (await _mapService.StopUserRun(userId))
|
|
{
|
|
return PoAction.Ok(true);
|
|
}
|
|
else
|
|
{
|
|
return PoAction.Message("取消失败,请稍后尝试!");
|
|
}
|
|
}
|
|
|
|
[HttpGet]
|
|
public async Task<IPoAction> UserMapRuning()
|
|
{
|
|
var userId = StateHelper.userId;
|
|
var runInfo = await _mapService.GetUserRun(userId);
|
|
if (runInfo.status != 1)
|
|
{
|
|
return PoAction.Message("不在航行状态", 100);
|
|
}
|
|
var userShip = await _weightService.GetUserShip(userId);
|
|
if (userShip.Count == 0)
|
|
{
|
|
return PoAction.Message("购买船只后才可以航行哦!");
|
|
}
|
|
|
|
int spend = userShip.Sum(it => (int)it.speed) / userShip.Count;
|
|
if ((runInfo.position + spend) >= runInfo.distance)
|
|
{
|
|
await _mapService.StopUserRun(userId);
|
|
var onMap = await _mapService.GetUserOnMap(userId);
|
|
await _mapService.UpdateUserOnMap(onMap, runInfo.toMap);
|
|
return PoAction.Message("航行完成!", 100);
|
|
}
|
|
else
|
|
{
|
|
runInfo.position += spend;
|
|
runInfo.upTime = TimeExtend.GetTimeStampSeconds;
|
|
if (await _mapService.UpdateUserRunInfo(runInfo))
|
|
{
|
|
return PoAction.Ok(true);
|
|
}
|
|
else
|
|
{
|
|
return PoAction.Message("航行错误,请重试!");
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region npc相关
|
|
|
|
/// <summary>
|
|
/// 获取NPC相关信息
|
|
/// </summary>
|
|
/// <param name="npcId"></param>
|
|
/// <returns></returns>
|
|
[HttpGet]
|
|
public async Task<IPoAction> GetNpcInfo(int npcId)
|
|
{
|
|
string userId = StateHelper.userId;
|
|
var data = await _mapService.GetNpcInfo(npcId);
|
|
if (data == null)
|
|
{
|
|
return PoAction.Message("Npc不存在!");
|
|
}
|
|
|
|
if (data.status != 1)
|
|
{
|
|
return PoAction.Message("Npc不存在!");
|
|
}
|
|
|
|
var onMap = await _mapService.GetUserOnMapId(userId);
|
|
if (data.mapId != onMap)
|
|
{
|
|
return PoAction.Message("Npc不存在!");
|
|
}
|
|
|
|
return PoAction.Ok(data);
|
|
}
|
|
|
|
#endregion
|
|
} |