forked from powerfun/udpservice
虚拟人物
This commit is contained in:
1 parent
12d1a01543
commit
81409dca9e
6 files changed
+163
-39
No files matched your search
@@ -8,6 +8,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Timers;
|
||||
|
||||
namespace OnlineUserPool.Hander
|
||||
{
|
||||
@@ -20,22 +21,58 @@ namespace OnlineUserPool.Hander
|
||||
public MapRecordRankingHander()
|
||||
{
|
||||
Init();
|
||||
//var timer = new Timer();
|
||||
//timer
|
||||
}
|
||||
|
||||
private void Init()
|
||||
{
|
||||
if (ConfigHelp.Top > 0)
|
||||
{
|
||||
var records = WebService.GetMapRouteRandomRecord(ConfigHelp.Top, null);
|
||||
var pageSize = 10;
|
||||
var pageCount = (int)Math.Ceiling(records.Count / (double)pageSize);
|
||||
for (int i = 0; i < pageCount; i++)
|
||||
{
|
||||
mapRecordRankings.AddRange(WebService.GetRecordFileFromServer(records.Skip(i * pageSize).Take(pageSize).Select(n => n.Id).ToList()));
|
||||
}
|
||||
var records = WebService.GetMapRouteRandomRecord(START, null);
|
||||
mapRecordRankings.AddRange(WebService.GetRecordFileFromServer(records.Select(n => n.Id).ToList()));
|
||||
UpdateVirtualTime = DateTime.Now;
|
||||
//var pageSize = 10;
|
||||
//var pageCount = (int)Math.Ceiling(records.Count / (double)pageSize);
|
||||
//for (int i = 0; i < pageCount; i++)
|
||||
//{
|
||||
// mapRecordRankings.AddRange(WebService.GetRecordFileFromServer(records.Skip(i * pageSize).Take(pageSize).Select(n => n.Id).ToList()));
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
private const int START = 15;
|
||||
private const int SMALL = 50;
|
||||
private const int MEDIUM = 100;
|
||||
private const int LARGE = 200;
|
||||
private const int OFFSET = 15;
|
||||
|
||||
//根据当前时段计算虚拟总人数
|
||||
private int ComputeTop()
|
||||
{
|
||||
var rand = new Random();
|
||||
|
||||
var hour = DateTime.Now.Hour;//当前点数
|
||||
int offset = 1;//少:1 中:3 多:10
|
||||
if (hour <= 6)
|
||||
{
|
||||
offset = rand.Next(START- OFFSET, START+ OFFSET);
|
||||
}
|
||||
if (hour > 6 && hour <= 18)
|
||||
{
|
||||
offset = rand.Next(MEDIUM - OFFSET, MEDIUM + OFFSET);
|
||||
}
|
||||
if (hour >= 18 && hour <= 22)
|
||||
{
|
||||
offset = rand.Next(LARGE - OFFSET, LARGE + OFFSET);
|
||||
}
|
||||
if (hour > 22 && hour <= 24)
|
||||
{
|
||||
offset = rand.Next(SMALL - OFFSET, SMALL + OFFSET);
|
||||
}
|
||||
return offset;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取虚拟人物数据
|
||||
/// </summary>
|
||||
@@ -67,6 +104,28 @@ namespace OnlineUserPool.Hander
|
||||
{
|
||||
weightKg = Math.Round(targetData._Power / item.Weight, 2);
|
||||
}
|
||||
|
||||
if (item.CurrentIndex == 0)
|
||||
{
|
||||
//机器人上线
|
||||
var loginInfo = new MsgModel()
|
||||
{
|
||||
exit = item.End,
|
||||
IsCompleted = item.End,
|
||||
MemberId = item.UserId,//虚拟的人Id变为负数
|
||||
Point = new double[] { -1d, -1d },
|
||||
//Prop = string.Join(',', prop),
|
||||
RouteId = item.RouteId,
|
||||
EndDistance = Math.Round(targetData._Distance, 6),
|
||||
//ShowVirtual = true,
|
||||
CommandType = 1,
|
||||
//IsVirtual = true,
|
||||
Speed = targetData._Speed,
|
||||
WeightKg = weightKg,
|
||||
PreDistance = item.GetPreDistance()
|
||||
};
|
||||
msgModels.Add(loginInfo);
|
||||
}
|
||||
var info = new MsgModel()
|
||||
{
|
||||
exit = item.End,
|
||||
@@ -93,7 +152,9 @@ namespace OnlineUserPool.Hander
|
||||
}
|
||||
return msgModels;
|
||||
}
|
||||
|
||||
const int offset = 1;
|
||||
const int timeInterval = 15;
|
||||
private DateTime UpdateVirtualTime { get; set; }
|
||||
/// <summary>
|
||||
/// 删除已经骑行完的人,添加新的人物进去
|
||||
/// </summary>
|
||||
@@ -101,27 +162,24 @@ namespace OnlineUserPool.Hander
|
||||
{
|
||||
lock (locker)
|
||||
{
|
||||
mapRecordRankings.RemoveAll(n => n.End);
|
||||
//var virutalEndCount = mapRecordRankings.Count(d => d.UserId < 0 && d.End);
|
||||
//var offlineCount = mapRecordRankings.Where(c => c.End).Count();//下线人数
|
||||
var top = ComputeTop();//理论上当前时间段虚拟用户的总数
|
||||
mapRecordRankings.RemoveAll(n => n.End);//移除骑行结束的人
|
||||
var routeIds = mapRecordRankings.Select(n => n.RouteId).Distinct().ToList();
|
||||
|
||||
var top = ConfigHelp.Top;
|
||||
if(customerCount > 9)
|
||||
var currentVirtualCount = mapRecordRankings.Count(d => d.UserId < 0);//实际虚拟用户数
|
||||
if (top - currentVirtualCount > 0)
|
||||
{
|
||||
top = 0;
|
||||
var interval = DateTime.Now - UpdateVirtualTime;
|
||||
if (interval.TotalSeconds > timeInterval)
|
||||
{
|
||||
UpdateVirtualTime = DateTime.Now;
|
||||
var needUpdateCount = offset;//这一秒需要上线的人数
|
||||
var randomUser = WebService.GetMapRouteRandomRecord(needUpdateCount, routeIds);
|
||||
var addRankings = WebService.GetRecordFileFromServer(randomUser.Select(n => n.Id).ToList());
|
||||
mapRecordRankings.AddRange(addRankings);
|
||||
}
|
||||
}
|
||||
if(top - mapRecordRankings.Count(d=>d.UserId<0) > 0)
|
||||
{
|
||||
var count = top - mapRecordRankings.Count(d => d.UserId < 0);
|
||||
var randomUser = WebService.GetMapRouteRandomRecord(count, routeIds);
|
||||
|
||||
//var str = "参数:" + (ConfigHelp.Top - virutalEndCount) + "," + string.Join(",",routeIds) + "\r\n";
|
||||
//str += "服务端返回:" + Newtonsoft.Json.JsonConvert.SerializeObject(randomUser) +"\r\n";
|
||||
//Log.Information(str);
|
||||
var addRankings = WebService.GetRecordFileFromServer(randomUser.Select(n => n.Id).ToList());
|
||||
mapRecordRankings.AddRange(addRankings);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,8 +15,8 @@ namespace OnlineUserPool.Hander
|
||||
private int _index = 0; //3600*3;
|
||||
private MultiUserModel model;
|
||||
private TurfHelper _turfHelper;
|
||||
private int _routeId = 1255; //5593; //1660;
|
||||
private int _size = 150;
|
||||
private int _routeId = 1215; //5593; //1660;
|
||||
private int _size = 100;
|
||||
private int _competitionid = 0;//35;
|
||||
public MultiUserHandle()
|
||||
{
|
||||
@@ -33,15 +33,15 @@ namespace OnlineUserPool.Hander
|
||||
|
||||
|
||||
#region sis
|
||||
_routeId = 3386;
|
||||
_competitionid = 1048;
|
||||
_routeId = 1215;
|
||||
_competitionid = 0;
|
||||
#endregion
|
||||
|
||||
model = await BaseApi.GetAsync<MultiUserModel>($"/Map/sss?routeId={ _routeId }&size={ _size }");
|
||||
double i = 0;
|
||||
foreach (var item in model.users)
|
||||
{
|
||||
i += 0.0002;
|
||||
i += 0.0012;
|
||||
item.Distance = i;
|
||||
}
|
||||
_turfHelper = new TurfHelper(model.route.List.Select(d => d.Point));
|
||||
|
||||
Reference in new issue
Block a user