---@class BP_HoldPoint_C:AActor ---@field TeamWidget UWidgetComponent ---@field HoldTimeWidget UWidgetComponent ---@field CustomSphereCollision UCustomSphereCollisionComponent ---@field SelectHoldWidget UWidgetComponent ---@field ParticleSystem UParticleSystemComponent ---@field DefaultSceneRoot USceneComponent ---@field CenterIndex int32 --Edit Below-- ---@type BP_HoldPoint_C local BP_HoldPoint = {}; BP_HoldPoint.SphereRadius = 250; -- 圈内半径 BP_HoldPoint.HoldIndex = 0; -- 点位索引 BP_HoldPoint.HoldTime = 0.; -- 被占据的时间,对于红方:负数;蓝方:正数 BP_HoldPoint.HoldTeamId = 0; -- 现在正在被哪个队伍占据 BP_HoldPoint.NeedHoldTime = nil; -- 需要的时间 ---@type table BP_HoldPoint.InnerPlayers = {}; BP_HoldPoint.EachIntervalAdd = 0; BP_HoldPoint.Interval = 0.3; function BP_HoldPoint:ReceiveBeginPlay() BP_HoldPoint.SuperClass.ReceiveBeginPlay(self) UGCEventSystem.AddListener(EventTypes.PlayerDead, self.OnPlayerDead, self); UGCEventSystem.AddListener(EventTypes.PlayerRespawn, self.OnPlayerRespawn, self); UGCLogSystem.Log("[BP_HoldPoint:ReceiveBeginPlay] 执行") if GlobalMiniMode then self.NeedHoldTime = GlobalMiniMode.Hold.PointTime; else self.NeedHoldTime = MiniGameManager.CurrMiniMode.Hold.PointTime end -- 加入进去 if Resources["TotalHoldPoint"] == nil then Resources["TotalHoldPoint"] = {}; end table.insert(Resources["TotalHoldPoint"], self); self.HoldIndex = #Resources["TotalHoldPoint"]; UGCLogSystem.Log("[BP_HoldPoint:ReceiveBeginPlay] NeedHoldTime = %f", self.NeedHoldTime); UGCLogSystem.LogTree(string.format("[BP_HoldPoint:ReceiveBeginPlay] HoldPoints"), Resources["TotalHoldPoint"]); GlobalTickTool:AddTick(self, self.OnTick, self.Interval); if IsServer then else self:ShowWidgetComponent(self.SelectHoldWidget, false) self:ShowWidgetComponent(self.HoldTimeWidget, true); -- 检查一下是否存在 TeamId self:ShowWidgetComponent(self.TeamWidget, false); end self:LuaInit(); if IsClient then GlobalTickTool:AddTick(self, self.OnTick0_1, 0.2); end end function BP_HoldPoint:OnTick0_1(dt, st) if self.TeamWidget and self.TeamWidget.Widget then self.TeamWidget.Widget:OnTick0_1(dt, st); end end function BP_HoldPoint:OnTick(dt, st) if IsServer then self:UpdateHoldTimes(dt); else self:RefreshWidgets(); end end function BP_HoldPoint:RefreshWidgets() self.TeamWidget:RequestRedraw(); end ---@param InComp UWidgetComponent function BP_HoldPoint:ShowWidgetComponent(InComp, IsShow) if InComp then InComp:SetHiddenInGame(not IsShow); if InComp.Widget then if IsShow then InComp.Widget:SetVisibility(ESlateVisibility.SelfHitTestInvisible); else InComp.Widget:SetVisibility(ESlateVisibility.Collapsed); end InComp:RequestRedraw(); end end end BP_HoldPoint.IsShowHoldProcess = false; --- 这仅在客户端有用 BP_HoldPoint.CachedInnerPlayers = {}; function BP_HoldPoint:OnBeginOverlap(InPawn) if UE.IsPlayerPawn(InPawn) and UE.IsValidPawn(InPawn) then if IsServer then UGCLogSystem.Log("[BP_HoldPoint:OnBeginOverlap] InPawn = %s", UE.GetName(InPawn)); if self.InnerPlayers[InPawn.PlayerKey] == nil then self.InnerPlayers[InPawn.PlayerKey] = InPawn; self.bChangePlayers = true; self:MakeTeamCounts(); end else -- 隐藏一下 self:ShowWidgetComponent(self.HoldTimeWidget, false); UIManager:Show("WB_HoldProcess", self); self.IsShowHoldProcess = true; end end end function BP_HoldPoint:OnEndOverlap(InPawn) if UE.IsPlayerPawn(InPawn) and UE.IsValidPawn(InPawn) then if IsServer then UGCLogSystem.Log("[BP_HoldPoint:OnEndOverlap] InPawn = %s", UE.GetName(InPawn)); self.InnerPlayers[InPawn.PlayerKey] = nil; self.bChangePlayers = true; self:MakeTeamCounts(); else self:ShowWidgetComponent(self.HoldTimeWidget, true); UIManager:Hide("WB_HoldProcess"); self.IsShowHoldProcess = false; end end end function BP_HoldPoint:CheckByPawnDis() local AllPawns = UGCGameSystem.GetAllPlayerPawn() self.InnerPlayers = {}; for i, Pawn in pairs(AllPawns) do if UE.IsValidPawn(Pawn) then local Dis = VectorHelper.GetActorDis2D(self, Pawn) if Dis <= self.SphereRadius then self.InnerPlayers[Pawn.PlayerKey] = Pawn; end end end -- 组装 self:MakeTeamCounts(); end function BP_HoldPoint:MakeTeamCounts() local Teams = {}; for PlayerKey, Pawn in pairs(self.InnerPlayers) do if UE.IsValidPawn(Pawn) then -- 玩家进入 local TeamId = UGCPawnAttrSystem.GetTeamID(Pawn); Teams[TeamId] = (Teams[TeamId] or 0) + 1; end end local AddTime = 0; if table.getCount(Teams) > 0 then for TeamId, Count in pairs(Teams) do AddTime = TeamScoreSymbol[TeamId] * Count * self.Interval + AddTime; end end if self.EachIntervalAdd ~= AddTime then self.EachIntervalAdd = AddTime; -- 查看是否需要同步 end UGCLogSystem.Log("[BP_HoldPoint:MakeTeamCounts] EachIntervalAdd = %f", self.EachIntervalAdd) end function BP_HoldPoint:ReceiveTick(DeltaTime) BP_HoldPoint.SuperClass.ReceiveTick(self, DeltaTime) self:HoldTimeTowardsLocal(); end function BP_HoldPoint:HoldTimeTowardsLocal() if IsClient then if LocalPlayerKey == nil then return ; end local Pawn = UGCGameSystem.GetPlayerPawnByPlayerKey(LocalPlayerKey) if UE.IsValidPawn(Pawn) then UE.ComponentTowardActor(self.HoldTimeWidget, Pawn, "Y"); end end end function BP_HoldPoint:UpdateHoldTimes(dt) local LastHoldTime = self.HoldTime; if table.isEmpty(self.InnerPlayers) then return ; end if self.NeedHoldTime == nil then self.NeedHoldTime = GlobalMiniMode.Hold.PointTime; if self.NeedHoldTime == nil then return ; end end if self.EachIntervalAdd == 0 then return ; end local HoldTime = LastHoldTime + self.EachIntervalAdd; if math.abs(HoldTime) >= self.NeedHoldTime then -- 通知当前已经被同化了 if HoldTime < 0 then HoldTime = -self.NeedHoldTime else HoldTime = self.NeedHoldTime; end for TeamId, Symbol in pairs(TeamScoreSymbol) do if HoldTime / Symbol > 0 then self.HoldTeamId = TeamId; break ; end end DOREPONCE(self, "HoldTeamId"); GameState:MiniFunc("TeamAddHoldPoint", self.HoldTeamId, self, true); else if self.HoldTeamId ~= 0 then -- 先取消 GameState:MiniFunc("TeamAddHoldPoint", self.HoldTeamId, self, false); self.HoldTeamId = 0; DOREPONCE(self, "HoldTeamId"); end end if self.HoldTime ~= HoldTime then self.HoldTime = HoldTime; DOREPONCE(self, "HoldTime"); end UGCLogSystem.Log("[BP_HoldPoint:UpdateHoldTimes] HoldTime = %f", self.HoldTime); end BP_HoldPoint.SetOwner_TeamWidget = false; BP_HoldPoint.SetOwner_HoldTimeWidget = false; BP_HoldPoint.SetOwner_SelectHoldWidget = false; function BP_HoldPoint:OnRep_HoldTime() UGCLogSystem.Log("[BP_HoldPoint:OnRep_HoldTime] Hold Time = %0.1f", self.HoldTime); if GlobalMiniMode == nil then return ; end if self.NeedHoldTime == nil then self.NeedHoldTime = GlobalMiniMode == nil and 60 or GlobalMiniMode.Hold.PointTime; if self.NeedHoldTime == nil then return ; end end if self.HoldTimeWidget and self.HoldTimeWidget.Widget then self.HoldTimeWidget.Widget:SetHoldTime(self.HoldTime, self.NeedHoldTime); self.HoldTimeWidget:RequestRedraw(); if not self.SetOwner_HoldTimeWidget then self.HoldTimeWidget.Widget:SetHoldOwner(self, self.HoldTimeWidget); self.SetOwner_HoldTimeWidget = true; end if self.IsShowHoldProcess then UIManager:Exec("WB_HoldProcess", "SetHoldTime", self.HoldTime, self.NeedHoldTime); end end if self.TeamWidget and self.TeamWidget.Widget then if not self.SetOwner_TeamWidget then self.TeamWidget.Widget:SetOwnerHold(self, self.TeamWidget); end self.TeamWidget.Widget:SetHoldTime(self.HoldTime, self.NeedHoldTime); self.TeamWidget:RequestRedraw(); end end function BP_HoldPoint:OnRep_HoldTeamId() if self.HoldTeamId ~= 0 then if self.HoldTeamId == LocalTeamId then UITool.ShowTips1(3, ELogColor.Cyan, "我方队伍占据据点,守护住据点!"); else UITool.ShowTips1(3, ELogColor.Red,"敌方队伍占据据点,请尽快回防!"); end end if self.SelectHoldWidget and self.SelectHoldWidget.Widget then self.SelectHoldWidget.Widget:SetTeamId(self.HoldTeamId); if not self.SetOwner_SelectHoldWidget then self.SelectHoldWidget.Widget:SetOwnerHold(self, self.SelectHoldWidget); self.SetOwner_SelectHoldWidget = true; end end if self.TeamWidget and self.TeamWidget.Widget then self:ShowWidgetComponent(self.TeamWidget, true); self.TeamWidget.Widget:SetOwnerHold(self, self.TeamWidget); if self.HoldTeamId == 0 then self.TeamWidget.Widget:SetTeamId(self.HoldTeamId); self.TeamWidget:RequestRedraw(); end end end --[[ function BP_HoldPoint:ReceiveEndPlay() BP_HoldPoint.SuperClass.ReceiveEndPlay(self) end --]] function BP_HoldPoint:GetReplicatedProperties() return { "HoldTime", "Lazy" } , { "HoldTeamId", "Lazy" } --, { "InnerPlayers", "Lazy" } end function BP_HoldPoint:GetHoldIndex() return self.HoldIndex; end function BP_HoldPoint:OnPlayerDead(DeadPlayerKey, KillPlayerKey) if self.InnerPlayers[DeadPlayerKey] ~= nil then self.InnerPlayers[DeadPlayerKey] = nil; end if IsServer then else if DeadPlayerKey == LocalPlayerKey then -- 说明当前是自己,显示 UI self:ShowWidgetComponent(self.HoldTimeWidget, false); self:ShowWidgetComponent(self.SelectHoldWidget, true); self:ShowWidgetComponent(self.TeamWidget, false) end end end function BP_HoldPoint:OnPlayerRespawn(PlayerKey) if IsServer then else if PlayerKey == LocalPlayerKey then self:ShowWidgetComponent(self.HoldTimeWidget, true); self:ShowWidgetComponent(self.SelectHoldWidget, false); self:ShowWidgetComponent(self.TeamWidget, true) end end end --[[ function BP_HoldPoint:GetAvailableServerRPCs() return end --]] -- [Editor Generated Lua] function define Begin: function BP_HoldPoint:LuaInit() if self.bInitDoOnce then return ; end self.bInitDoOnce = true; UGCLogSystem.Log("[BP_HoldPoint:LuaInit] 执行") -- [Editor Generated Lua] BindingProperty Begin: -- [Editor Generated Lua] BindingProperty End; -- [Editor Generated Lua] BindingEvent Begin: if self.CustomSphereCollision then self.CustomSphereCollision.OnComponentBeginOverlap:Add(self.SphereRange_OnComponentBeginOverlap, self); self.CustomSphereCollision.OnComponentEndOverlap:Add(self.SphereRange_OnComponentEndOverlap, self); end -- [Editor Generated Lua] BindingEvent End; end function BP_HoldPoint:SphereRange_OnComponentBeginOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult) UGCLogSystem.Log("[BP_HoldPoint:SphereRange_OnComponentBeginOverlap] 执行") self:OnBeginOverlap(OtherActor) return nil; end function BP_HoldPoint:SphereRange_OnComponentEndOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex) UGCLogSystem.Log("[BP_HoldPoint:SphereRange_OnComponentEndOverlap] 执行") self:OnEndOverlap(OtherActor); return nil; end -- [Editor Generated Lua] function define End; return BP_HoldPoint;