You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
264 lines
8.7 KiB
264 lines
8.7 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading.Tasks;
|
|
|
|
using Sog;
|
|
using ProtoCSStruct;
|
|
|
|
namespace Friend
|
|
{
|
|
public class FriendRankSortInfo
|
|
{
|
|
public long uid;
|
|
public long score;
|
|
}
|
|
|
|
/// <summary>
|
|
/// //好友排行相关
|
|
/// </summary>
|
|
public static class FriendRankSvc
|
|
{
|
|
public static void TickFriendRank(long uid)
|
|
{
|
|
FriendCacheInfoStruct info = FriendOp.GetFriendInfoByUid(uid);
|
|
if (info.IsNull())
|
|
{
|
|
return;
|
|
}
|
|
|
|
bool bChg = TickCalcRankInfoWeek(info, RoleRankType.WeekWinRoundCount);
|
|
bChg = bChg | TickCalcRankInfoWeek(info, RoleRankType.WeekWinChip);
|
|
|
|
if(bChg)
|
|
{
|
|
//如果数据有变化,广播给我的所有在线好友
|
|
FriendSvc.OnFriendSelfChgBroadcastToOtherSvr(ref info);
|
|
|
|
//通知客户端
|
|
FriendNotify.NotifyPlayerFriendSelfChg(ref info);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
public static void CheckAddAllRankInfo(FriendCacheInfoStruct friendInfo)
|
|
{
|
|
bool bChg = CheckAddAllRankInfo(friendInfo, RoleRankType.WeekWinRoundCount);
|
|
bChg = bChg | CheckAddAllRankInfo(friendInfo, RoleRankType.WeekWinChip);
|
|
|
|
if (bChg)
|
|
{
|
|
//如果数据有变化,广播给我的所有在线好友
|
|
FriendSvc.OnFriendSelfChgBroadcastToOtherSvr(ref friendInfo);
|
|
}
|
|
}
|
|
|
|
|
|
private static bool CheckAddAllRankInfo(FriendCacheInfoStruct friendInfo, RoleRankType rankType)
|
|
{
|
|
DBRoleOneRankInfo info = GetRoleRankInfo(friendInfo, rankType);
|
|
if(info.RankType==0)
|
|
{
|
|
info = new DBRoleOneRankInfo();
|
|
info.RankType = (int)rankType;
|
|
info.RankScore = 0;
|
|
info.LastRankTime = FriendServerUtils.GetTimeSecond();
|
|
|
|
TraceLog.Trace("CheckAddAllRankInfo add DBRoleOneRankInfo type {0}, uid {1}"
|
|
, rankType, friendInfo.Self.Uid);
|
|
|
|
|
|
|
|
friendInfo.SetNeedSave(true);
|
|
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static DBRoleOneRankInfo GetRoleRankInfo(FriendCacheInfoStruct friendInfo, RoleRankType rankType)
|
|
{
|
|
DBRoleOneRankInfo info = new DBRoleOneRankInfo();
|
|
if (friendInfo.IsNull())
|
|
{
|
|
return info;
|
|
}
|
|
|
|
|
|
return info;
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="player"></param>
|
|
/// <param name="rankType"></param>
|
|
/// <returns>返回true表示数据变化了,重置了</returns>
|
|
private static bool TickCalcRankInfoWeek(FriendCacheInfoStruct friendInfo, RoleRankType rankType)
|
|
{
|
|
DBRoleOneRankInfo info = GetRoleRankInfo(friendInfo, rankType);
|
|
if (info.RankType == 0)
|
|
{
|
|
//tick不打日志
|
|
//TraceLog.Trace("TickCalcRankInfoWeek, not rank type {0} uid {1}"
|
|
// , rankType, friendInfo.Self.Uid);
|
|
return false;
|
|
}
|
|
|
|
long nowSec = FriendServerUtils.GetTimeSecond();
|
|
|
|
if(AppTime.IsSameWeek127(nowSec, info.LastRankTime))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
//need calc
|
|
TraceLog.Trace("TickCalcRankInfoWeek need calc rank list, rank type {0} uid {1}"
|
|
, rankType, friendInfo.Self.Uid);
|
|
|
|
//计算名次
|
|
info.Position = CalcRankListPositionWeek(friendInfo, rankType, nowSec);
|
|
//保存名次计算时候的score,供其他玩家排名的时候使用
|
|
info.PositionScore = info.RankScore;
|
|
//暂时注释
|
|
//info.PositionFriendCount = FriendUtils.GetActivityFriendCount(friendInfo);
|
|
info.GetReward = 0;
|
|
|
|
//reset
|
|
info.LastRankTime = nowSec;
|
|
info.RankScore = 0;
|
|
|
|
friendInfo.SetNeedSave(true);
|
|
|
|
return true;
|
|
}
|
|
|
|
//计算要注意时间同步问题,不同game的时间有可能不同,随便写的话结果有可能有问题
|
|
private static int CalcRankListPositionWeek(FriendCacheInfoStruct friendInfo, RoleRankType rankType, long nowSec)
|
|
{
|
|
DBRoleOneRankInfo info = GetRoleRankInfo(friendInfo, rankType);
|
|
if (info.RankType == 0)
|
|
{
|
|
TraceLog.Error("CalcRankListPosition, not rank type {0} uid {1}", rankType, friendInfo.Self.Uid);
|
|
return 0;
|
|
}
|
|
|
|
info.PositionListLastWeek.Clear();
|
|
|
|
//如果自己没有分数,不排行,排名是0,就是无效
|
|
if(info.RankScore == 0)
|
|
{
|
|
TraceLog.Trace("CalcRankListPosition, RankScore type {0} uid {1}, postion is 0 last week, so skip calc rank"
|
|
, rankType, friendInfo.Self.Uid);
|
|
return 0;
|
|
}
|
|
|
|
//自己隔了1个礼拜上线,意思是上礼拜我没有数据,排名无效
|
|
if(AppTime.GetOffsetWeeks(nowSec, info.LastRankTime) > 1)
|
|
{
|
|
TraceLog.Trace("CalcRankListPosition, RankScore type {0} uid {1}, not login last week, so skip calc rank"
|
|
, rankType, friendInfo.Self.Uid);
|
|
return 0;
|
|
}
|
|
|
|
List<FriendRankSortInfo> sortList = new List<FriendRankSortInfo>();
|
|
//添加自己
|
|
sortList.Add(new FriendRankSortInfo() { uid = friendInfo.Self.Uid, score = info.RankScore });
|
|
//添加好友
|
|
for (int i =0;i < friendInfo.FriendList.iCount;i++)
|
|
{
|
|
DBFriendOneStruct oneFriend = FriendOp.GetFriendOneByIndex(ref friendInfo, i);
|
|
//非fb好友不参加排行
|
|
if(oneFriend.oneFriend.FriendType == 0)
|
|
{
|
|
continue;
|
|
}
|
|
|
|
bool bFindRankInList = false;
|
|
long score = 0;
|
|
|
|
if (bFindRankInList == false)
|
|
{
|
|
TraceLog.Trace("CalcRankListPosition, not rank data type {0} uid {1}, default score is 0"
|
|
, rankType, friendInfo.Self.Uid);
|
|
}
|
|
else
|
|
{
|
|
FriendRankSortInfo sortInfo = new FriendRankSortInfo();
|
|
|
|
sortInfo.uid = oneFriend.oneFriend.Uid;
|
|
sortInfo.score = score;
|
|
|
|
sortList.Add(sortInfo);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//降序排序
|
|
IEnumerable<FriendRankSortInfo> query = from items in sortList orderby items.score descending select items;
|
|
|
|
//我的排名是第几名
|
|
int postion = 1;
|
|
bool alreadyGetMyPos = false;
|
|
foreach (var sortedItem in query)
|
|
{
|
|
if(sortedItem.uid == friendInfo.Self.Uid)
|
|
{
|
|
alreadyGetMyPos = true;
|
|
}
|
|
else
|
|
{
|
|
if (alreadyGetMyPos == false)
|
|
{
|
|
postion++;
|
|
}
|
|
}
|
|
|
|
info.PositionListLastWeek.Add((uint)sortedItem.uid);
|
|
}
|
|
|
|
TraceLog.Trace("CalcRankListPositionWeek rank type {0} uid {1} position {2}"
|
|
, rankType, friendInfo.Self.Uid, postion);
|
|
|
|
return postion;
|
|
}
|
|
|
|
|
|
public static void OnFriendPlayerStatChgNotify(uint remoteAppID, StructPacket packet)
|
|
{
|
|
long uid = packet.ObjectID;
|
|
ref SSFriendPlayerStatChgNotify notify =ref packet.GetMessage<SSFriendPlayerStatChgNotify>();
|
|
|
|
OnDailyStatisticsChanged(uid, notify.Statid, notify.NewValue, notify.Change);
|
|
}
|
|
|
|
public static void OnDailyStatisticsChanged(long uid, int statid, long newValue, long change)
|
|
{
|
|
PlayerInfoFriend player = FriendServerUtils.GetPlayerTableOp().GetPlayerInfo(uid);
|
|
if (player == null)
|
|
{
|
|
TraceLog.Error("FriendRankSvc.OnDailyStatisticsChanged can not find player uid {0}", uid);
|
|
return;
|
|
}
|
|
|
|
FriendCacheInfoStruct friendInfo = FriendOp.GetFriendInfoByUid(player.UserID);
|
|
if (friendInfo.IsNull())
|
|
{
|
|
TraceLog.Debug("FriendRankSvc.OnDailyStatisticsChanged uid {0} no data in cache"
|
|
, player.UserID);
|
|
return;
|
|
}
|
|
|
|
TraceLog.Trace("FriendRankSvc.OnDailyStatisticsChanged uid {0} id {1} newvalue {2}"
|
|
, friendInfo.Self.Uid, statid, newValue);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|