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.
 
 
 
 
 
 

238 lines
7.2 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Sog;
using ProtoCSStruct;
namespace Game
{
public class RoleStatChgOp
{
private PlayerOnGame m_player;
private RepeatedDBIDValue_32 m_chgIDValueDaily;
private RepeatedDBIDValue_32 m_chgIDValueTotal;
public struct RoleStatResult
{
public long dailyValue;
public long totalValue;
}
private RoleStatResult m_empty;
// 返回最近一次变化的统计数据, 提高查询效率
private RoleStatResult m_latestResult;
public RoleStatChgOp(PlayerOnGame player)
{
m_player = player;
m_empty = new RoleStatResult {dailyValue = -1, totalValue = -1};
m_latestResult = new RoleStatResult { dailyValue = -1, totalValue = -1 };
}
/// <summary>
/// 改变daily stat,缺省改变total
/// </summary>
/// <param name="id"></param>
/// <param name="value"></param>
/// <param name="addTotal"></param>
public ref RoleStatResult AddIDDaily(int id, long value, bool addTotal = true)
{
if(value == 0)
{
return ref m_empty;
}
if(!StatisticsOp.IDIsValid(id))
{
m_player.Error("RoleStatChgOp.AddIDDaily invalid id {0} uid {1}", id, m_player.UserID);
return ref m_empty;
}
long newValue = StatisticsOp.AddIDDaily_DontCall(m_player, id, value);
SetChgIDValueDaily(id, newValue);
m_latestResult.dailyValue = newValue;
m_latestResult.totalValue = -1;
if (addTotal)
{
newValue = StatisticsOp.AddIDTotal_DontCall(m_player, id, value);
SetChgIDValueTotal(id, newValue);
m_latestResult.dailyValue = newValue;
}
return ref m_latestResult;
}
/// <summary>
/// 改变total stat
/// </summary>
/// <param name="id"></param>
/// <param name="value"></param>
public ref RoleStatResult AddIDTotal(int id, long value)
{
if (value == 0)
{
return ref m_empty;
}
if (!StatisticsOp.IDIsValid(id))
{
m_player.Error("RoleStatChgOp.AddIDTotal invalid id {0} uid {1}", id, m_player.UserID);
return ref m_empty;
}
long newValue = StatisticsOp.AddIDTotal_DontCall(m_player, id, value);
SetChgIDValueTotal(id, newValue);
m_latestResult.dailyValue = -1;
m_latestResult.totalValue = newValue;
return ref m_latestResult;
}
/// <summary>
/// 改变daily stat
/// </summary>
/// <param name="id"></param>
/// <param name="value"></param>
/// <param name="addTotal"></param>
public void SetIDDaily(int id, long value)
{
if (!StatisticsOp.IDIsValid(id))
{
m_player.Error("RoleStatChgOp.SetIDDaily invalid id {0} uid {1}", id, m_player.UserID);
return;
}
if (StatisticsOp.SetIDDaily_DontCall(m_player, id, value))
{
SetChgIDValueDaily(id,value);
}
}
/// <summary>
/// 改变total stat
/// </summary>
/// <param name="id"></param>
/// <param name="value"></param>
/// <param name="addTotal"></param>
public void SetIDTotal(int id, long value)
{
if (!StatisticsOp.IDIsValid(id))
{
m_player.Error("RoleStatChgOp.SetIDTotal invalid id {0} uid {1}", id, m_player.UserID);
return;
}
if (StatisticsOp.SetIDTotal_DontCall(m_player, id, value))
{
SetChgIDValueTotal(id, value);
}
}
private void SetChgIDValueDaily(int id, long value)
{
for(int i=0; i< m_chgIDValueDaily.Count; i++)
{
if(m_chgIDValueDaily[i].Id == id)
{
m_chgIDValueDaily[i].Value = value;
return;
}
}
DBIDValue newitem = new DBIDValue();
newitem.Id = id;
newitem.Value = value;
m_chgIDValueDaily.Add(ref newitem);
}
private void SetChgIDValueTotal(int id, long value)
{
for (int i = 0; i < m_chgIDValueTotal.Count; i++)
{
if (m_chgIDValueTotal[i].Id == id)
{
m_chgIDValueTotal[i].Value = value;
return;
}
}
DBIDValue newitem = new DBIDValue();
newitem.Id = id;
newitem.Value = value;
m_chgIDValueTotal.Add(ref newitem);
}
public void NotifyClient(bool isNewDay = false)
{
if(m_chgIDValueDaily.Count == 0 && m_chgIDValueTotal.Count == 0 && isNewDay == false)
{
m_player.Error("RoleStatChgOp.NotifyClient no any id changed uid {0}",m_player.UserID);
return;
}
CSStatisticsChg chgNotify = new CSStatisticsChg();
chgNotify.IsNewDay = isNewDay ? 1 : 0;
//新的一天的时候,发给客户端newday之前发个ping,对一下时间
if(isNewDay)
{
long now = GameServerUtils.GetTimeMs();
CSPing ping = new CSPing();
ping.ServerTime = now;
m_player.SendToClient((int)CSGameMsgID.Ping, ref ping);
}
chgNotify.Daily = m_chgIDValueDaily;
chgNotify.Total = m_chgIDValueTotal;
m_player.Debug("RoleStatChgOp.NotifyClient changed to uid {0}, daily {1} total {2}"
, m_player.UserID, m_chgIDValueDaily.Count, m_chgIDValueTotal.Count);
m_player.SendToClient((int)CSGameMsgID.StatisticsChg, ref chgNotify);
}
public void NotifyClient(int id)
{
if (!StatisticsOp.IDIsValid(id))
{
m_player.Error("RoleStatChgOp.AddIDDaily invalid id {0} uid {1}", id, m_player.UserID);
return;
}
var chgNotify = new CSStatisticsChg();
for(int i=0; i< m_player.RoleData.StatData.Daily.Count; i++)
{
ref var idvalue = ref m_player.RoleData.StatData.Daily[i];
if (idvalue.Id == id)
{
chgNotify.Daily.Add(ref idvalue);
break;
}
}
for (int i = 0; i < m_player.RoleData.StatData.Total.Count; i++)
{
ref var idvalue = ref m_player.RoleData.StatData.Total[i];
if (idvalue.Id == id)
{
chgNotify.Total.Add(ref idvalue);
break;
}
}
m_player.SendToClient((int)CSGameMsgID.StatisticsChg, ref chgNotify);
}
}
}