2025-06-04 05:02:57 +08:00

249 lines
6.7 KiB
Plaintext

autoImport("ActivityData");
FunctionActivity = class("FunctionActivity")
local tempArray = {};
FunctionActivity.TraceType = {
NeedRefresh = 0,
Refreshed = 1,
Update = 2,
}
local MapManager;
local f_GetType = ActivityData.GetTraceQuestDataType;
local f_GetId = ActivityData.CreateIdByType;
function FunctionActivity.Me()
if nil == FunctionActivity.me then
FunctionActivity.me = FunctionActivity.new()
end
return FunctionActivity.me
end
function FunctionActivity:ctor()
self.activityDataMap = {};
self.tracedActivityMap = {};
MapManager = Game.MapManager;
end
function FunctionActivity:GetMapEvents(mapid)
TableUtility.ArrayClear(tempArray);
for activityType, activityData in pairs(self.activityDataMap)do
if(activityData.mapid == mapid)then
table.insert(tempArray, activityData);
end
end
return tempArray;
end
function FunctionActivity:Launch(activityType, mapid, startTime, endTime)
local logStr = "";
logStr = "活動開啟 --> ";
local dateFormat = "%m:%d %H:%M:%S秒";
logStr = logStr .. string.format(" | activityType:%s | 地圖Id:%s | 開始時間:%s | 結束時間:%s | 目前時間:%s | ",
tostring(activityType),
tostring(mapid),
os.date(dateFormat, startTime),
os.date(dateFormat, endTime),
os.date(dateFormat, ServerTime.CurServerTime()/1000));
helplog(logStr);
local activityData = self.activityDataMap[activityType];
if(activityData == nil)then
activityData = self:AddActivityData(activityType, mapid, startTime, endTime);
else
activityData:UpdateInfo(mapid, startTime, endTime);
end
if( activityData:IsShowInMenu() )then
GameFacade.Instance:sendNotification(MainViewEvent.MenuActivityOpen, activityType)
end
if activityType == GameConfig.MvpBattle.ActivityID then
GameFacade.Instance:sendNotification(MainViewEvent.UpdateMatchBtn)
end
self:UpdateNowMapTraceInfo();
end
function FunctionActivity:UpdateState(activityType, state, starttime, endtime)
local activityData = self.activityDataMap[activityType];
if(activityData)then
activityData:SetState( state, starttime, endtime );
self:UpdateNowMapTraceInfo();
else
errorLog(string.format("Activity:%s not Launch when Recv StateUpdate", tostring(activityType)));
end
end
-- activityData begin
function FunctionActivity:IsActivityRunning(activityType)
local d = self.activityDataMap[ activityType ];
if(d == nil)then
return false;
end
return d:InRunningTime();
end
function FunctionActivity:GetActivityData( activityType )
return self.activityDataMap[ activityType ];
end
function FunctionActivity:AddActivityData(activityType, mapid, startTime, endTime)
local activityData = ActivityData.new(activityType, mapid, startTime, endTime);
self.activityDataMap[activityType] = activityData;
return activityData;
end
function FunctionActivity:RemoveActivityData( activityType )
local oldData = self.activityDataMap[activityType];
self.activityDataMap[activityType] = nil;
if(not oldData)then
return;
end
if(oldData:IsShowInMenu())then
GameFacade.Instance:sendNotification(MainViewEvent.MenuActivityClose, activityType)
end
oldData:Destroy();
end
-- activityData end
-- traceInfo begin
local removeTraceCells = {};
function FunctionActivity:UpdateNowMapTraceInfo()
for activityType,_ in pairs(self.tracedActivityMap)do
if(not self.activityDataMap[activityType])then
local data = {};
data.id = f_GetId(activityType);
data.type = f_GetType(activityType);
table.insert(removeTraceCells, data);
self.tracedActivityMap[activityType] = nil;
end
end
local tracedCount = 0;
local nowMapId = MapManager:GetMapID();
for activityType, activityData in pairs(self.activityDataMap)do
local needTrace = activityData:IsNeedTrace(nowMapId);
if(needTrace)then
if(activityData:IsTraceInfo_NeedUpdate())then
self.tracedActivityMap[activityType] = FunctionActivity.TraceType.Update;
else
self.tracedActivityMap[activityType] = FunctionActivity.TraceType.NeedRefresh;
end
tracedCount = tracedCount + 1;
else
if(self.tracedActivityMap[activityType])then
local data = {};
data.id = f_GetId(activityType);
data.type = f_GetType(activityType);
table.insert(removeTraceCells, data);
self.tracedActivityMap[activityType] = nil;
end
end
end
if(#removeTraceCells > 0)then
QuestProxy.Instance:RemoveTraceCells( removeTraceCells );
TableUtility.ArrayClear(removeTraceCells);
end
if(tracedCount == 0)then
self:RemoveTraceTimeTick();
else
self:AddTraceTimeTick();
end
end
local cache_RunningMap = {};
function FunctionActivity:AddTraceTimeTick()
if(not self.traceTimeTick)then
TableUtility.TableClear(cache_RunningMap);
self.traceTimeTick = TimeTickManager.Me():CreateTick(0, 1000, self.UpdateActivityTraceInfos, self, 1);
end
end
function FunctionActivity:RemoveTraceTimeTick()
if(self.traceTimeTick)then
TimeTickManager.Me():ClearTick(self, 1);
self.traceTimeTick = nil;
TableUtility.TableClear(cache_RunningMap);
end
end
local updateTraceCells = {};
function FunctionActivity:UpdateActivityTraceInfos()
local needUpdate, activityData;
local nowMapId = MapManager:GetMapID();
for traceAType,traceType in pairs(self.tracedActivityMap) do
needUpdate = false;
if(traceType == FunctionActivity.TraceType.NeedRefresh)then
self.tracedActivityMap[traceAType] = FunctionActivity.TraceType.Refreshed;
needUpdate = true;
elseif(traceType == FunctionActivity.TraceType.Update)then
needUpdate = true;
end
activityData = self.activityDataMap[traceAType];
if(activityData == nil)then
self.tracedActivityMap[traceAType] = nil;
redlog(string.format("activity(type:%s) accident break.", traceAType));
end
local running = activityData:InRunningTime();
if(running ~= cache_RunningMap[traceAType])then
if(running)then
needUpdate = true;
else
local data = {};
data.id = f_GetId(traceAType);
data.type = f_GetType(traceAType);
table.insert(removeTraceCells, data);
end
cache_RunningMap[traceAType] = running;
end
if(needUpdate)then
local traceInfo = activityData:GetTraceInfo( nowMapId );
if(traceInfo)then
table.insert(updateTraceCells, traceInfo);
end
end
end
-- update quest trace
if(#updateTraceCells > 0)then
QuestProxy.Instance:AddTraceCells(updateTraceCells);
TableUtility.ArrayClear(updateTraceCells);
end
-- rm quest trace
if(#removeTraceCells > 0)then
QuestProxy.Instance:RemoveTraceCells( removeTraceCells );
TableUtility.ArrayClear(removeTraceCells);
end
end
-- traceInfo end
function FunctionActivity:ShutDownActivity( activityType )
self:RemoveActivityData(activityType);
self:UpdateNowMapTraceInfo();
end
function FunctionActivity:Reset()
for activityType, activityData in pairs(self.activityDataMap)do
self:RemoveActivityData(activityType);
end
self:UpdateNowMapTraceInfo();
end