362 lines
11 KiB
Lua
362 lines
11 KiB
Lua
---@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<PlayerKey, UGCPlayerPawn_C>
|
|
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; |