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.

90 lines
2.9 KiB

1 month ago
using Sog;
namespace Game;
public abstract class AbstractLoopActivity : AbstractActivity
{
protected override void OnTick(PlayerOnGame player, ActivityType activityType, out bool changed)
{
changed = false;
var now = GameServerUtils.GetTimeSecond();
changed = false;
var groups = ActivityDescMgr.Instance.GetActivityDescByType(activityType);
if (groups == null)
{
return;
}
ref var activityData = ref player.RoleData.ActivityInfo;
//当前类型的活动存在
var index = -1;
foreach (var desc in groups)
{
for (var i = 0; i < activityData.Count; i++)
{
if (activityData[i].ActID == desc.id)
{
index = i;
break;
}
}
}
var newActId = groups[^1].id;
//活动状态发生改变,
if (index >= 0)
{
var oldActId = activityData[index].ActID;
var state = ActivitySvc.GetActivityState(player, oldActId);
var oldDesc = ActivityDescMgr.Instance.GetConfig(oldActId);
//活动状态发生改变,
if ((int)state != activityData[index].State)
{
OnStateChange(player, oldDesc.id, state);
activityData[index].State = (int)state; //更新活动状态
changed = true;
}
//当活动结束之后,所有后续处理都需要在这个之前,否则任务数据没了
if (state == ActivityState.ActivityEnded)
{
RemoveTask(player, oldDesc.activityTask);
RemoveTask(player, oldDesc.activityDailyTask);
RemoveTask(player, oldDesc.activityWeekTask);
DeleteActPayItemData(player,oldDesc.id);
}
//活动在有效期内
if (state == ActivityState.InProgress)
{
ref var info = ref activityData[index];
if (!AppTime.IsSameDay(info.RefreshTime, now))
{
RefreshDaily(player, ref info);
info.RefreshTime = now;
changed = true;
}
}
//玩法结束
if (state == ActivityState.GameplayEnded || state == ActivityState.ActivityEnded)
{
activityData.RemoveAt(index);
changed = true;
}
}
else
{
var state = ActivitySvc.GetActivityState(player, newActId);
if (state == ActivityState.InProgress)////新活动开始
{
AddActivity(player, newActId, (int)ActivityState.InProgress);
OnStateChange(player, newActId, state);
changed = true;
}
}
}
}