PoisonManager = {}; PoisonManager.PoisonConfigIndex = 7; -- 该数值是在 GameMode->DataManager->DataSources 中配置的 ---@type PoisonConfigItem[] PoisonManager.ConstConfig = { { delaytime = 8, SafeZoneAppeartime = 30, lasttime = 2*60, blueradius = 7500, whiteradius = 6500, pain = 3, }, { delaytime = 20, SafeZoneAppeartime = 30, lasttime = 40, blueradius = 6500, whiteradius = 5000, pain = 5, }, --{ -- delaytime = 5, -- SafeZoneAppeartime = 10, -- lasttime = 12, -- blueradius = 1500, -- whiteradius = 500, -- pain = 4.5, --}, --{ -- delaytime = 5, -- SafeZoneAppeartime = 10, -- lasttime = 15, -- blueradius = 500, -- whiteradius = 0, -- pain = 6, --}, }; ---@type table PoisonManager.MapCenterActors = {}; PoisonManager.SelectCenterIndex = 0; --- 选择地图之后,执行 function PoisonManager:Init() -- 计算当前的位置 self.MapCenterActors = {}; local AllActors = {}; if ObjectPath.BP_ActorStart then UGCLogSystem.Log("[PoisonManager:Init] ObjectPath.BP_ActorStart = %s", UE.GetName(ObjectPath.BP_ActorStart)); end UE.FindActorsByClass(ObjectPath.BP_ActorStart, AllActors, function(InIndex, InActor) return InActor:ActorHasTag("Poison"); end); for i, v in pairs(AllActors) do self.MapCenterActors[v.Index] = v; end UGCLogSystem.LogTree(string.format("[PoisonManager:Init] self.MapCenterActors ="), self.MapCenterActors) --- 加载 BP_radiation local Path = '/Game/BluePrints/Environment/BP_radiation.BP_radiation_C'; UE.AsyncLoadClass_Cached(Path, function(TargetClass) self.RadiationActor = UE.FindActorByClass(TargetClass); end); end --- 选择一个地图中心点进行刷圈 function PoisonManager:SelectMapCenter() self:Clear(); -- 从中选取一个 self.Config = TableHelper.DeepCopyTable(self.ConstConfig); -- 选取一个 if table.isEmpty(self.MapCenterActors) then self:Init(); if table.isEmpty(self.MapCenterActors) then UGCLogSystem.Log("[PoisonManager:SelectMapCenter] 加载不到地图中心点") return ; end end local Keys = {}; for i, v in pairs(self.MapCenterActors) do table.insert(Keys, i); end self.SelectCenterIndex = table.func(GlobalMiniMode, "SelectMapCenter", self.MapCenterActors); if self.SelectCenterIndex == nil then self.SelectCenterIndex = Keys[math.random(#Keys)]; end local Center = self.MapCenterActors[self.SelectCenterIndex]; local CenterLoc = Center:K2_GetActorLocation(); for i = 1, #self.Config do local ConfigItem = self.Config[i]; local CirCleCfg = self:CreateNewCirCleCfg() ConfigItem.bluepoint = VectorHelper.ToLuaTable2D(CenterLoc); local MinCenter = math.randomCircleInCircle(CenterLoc, ConfigItem.blueradius, ConfigItem.whiteradius); for Index, config in pairs(ConfigItem) do CirCleCfg[Index] = config; end CirCleCfg.bUseCustomBluePoint = true; CirCleCfg.bUseCustomWhitePoint = true; CirCleCfg.whitepoint = MinCenter; UGCGameSystem.GameMode.DataManager.DataSources[self.PoisonConfigIndex].CircleConfigs:Add(CirCleCfg); CenterLoc = MinCenter; end UGCLogSystem.Log("[PoisonManager:SelectMapCenter] self.SelectCenterIndex = %d", self.SelectCenterIndex) end --- 游戏正式开始的时候调用 function PoisonManager:Toggle(Enable) UGCLogSystem.Log("[PoisonManager:Toggle] 启动") if Enable then self:SelectMapCenter(); end if table.isEmpty(self.MapCenterActors) then return; end UGCBlueprintFunctionLibrary.TogglePoisonCircle(GameState, Enable); end function PoisonManager:GetSelectMapIndex() return self.SelectCenterIndex; end function PoisonManager:Clear() UGCGameSystem.GameMode.DataManager.DataSources[self.PoisonConfigIndex].CircleConfigs:Empty(); UGCLogSystem.Log("[PoisonManager:Clear] 清空") end PoisonManager.RadiationActor = nil; function PoisonManager:GetRadiationActor() if self.RadiationActor == nil then self.RadiationActor = UE.FindActorByClass(ObjectPath.BP_radiation); end return self.RadiationActor; end --- 判断一个 Actor 是否在圈内 ---@param InActor AActor function PoisonManager:IsActorInCircle(InActor) if self:GetRadiationActor() == nil then return end local Dis = VectorHelper.GetActorDis2D(self:GetRadiationActor(), InActor) local Scale = self:GetRadiationActor():GetActorScale3D().X return Dis / 100 <= Scale; end function PoisonManager:CreateNewCirCleCfg() return UE.CreateStruct("CirCleCfg"); end return PoisonManager;