2025-01-04 23:00:19 +08:00

148 lines
5.1 KiB
Lua

---@class BP_PunctureBalloonManager_C:AActor
---@field DefaultSceneRoot USceneComponent
---@field CarClass UClass
---@field ResetCarTime float
--Edit Below--
local BP_PunctureBalloonManager = {
AllCars = {};
CarIndex = 0;
PlayerDriveCar = {}; -- PlayerKey = Car
ResetHandle = {};
bIsPlay = false;
};
function BP_PunctureBalloonManager:ReceiveBeginPlay()
self.SuperClass.ReceiveBeginPlay(self);
if UGCGameSystem.IsServer() then
-- self:InitCar()
UGCEventSystem.AddListener(EventEnum.PierceBalloon, self.PierceBalloon, self)
end
end
function BP_PunctureBalloonManager:InitCar()
local Cars = GameplayStatics.GetAllActorsOfClass(UGCGameSystem.GameState, self.CarClass);
for i, v in pairs(Cars) do
self.AllCars[#self.AllCars + 1] = v
end
if #self.AllCars < 4 then
UGCLogSystem.LogError("[BP_PunctureBalloonManager_InitCar] 载具数量不对:%s", tostring(#self.AllCars))
end
end
function BP_PunctureBalloonManager:AllPlayerDriverCar()
local AllPC = UGCGameSystem.GetAllPlayerController()
for i, v in pairs(AllPC) do
local PlayerKey = v.PlayerKey
local Pawn = UGCGameSystem.GetPlayerPawnByPlayerKey(PlayerKey)
local Car = self:GetCar()
if Car then
UGCVehicleSystem.EnterVehicle(Pawn, Car, ESTExtraVehicleSeatType.ESeatType_DriversSeat, true)
Car:SetOwnerPlayer(PlayerKey)
self.PlayerDriveCar[PlayerKey] = Car
UGCSendRPCSystem.ActorRPCNotify(PlayerKey, self, "ClientPlayerDriveCar", Car)
UGCLogSystem.Log("[BP_PunctureBalloonManager_AllPlayerDriverCar] EnterVehicle Succeed")
end
end
self:RemoveOtherCar()
self.bIsPlay = true
end
-- Client
function BP_PunctureBalloonManager:ClientPlayerDriveCar(Car)
local LocalPlayer = UGCSystemLibrary.GetLocalPlayerPawn()
if UE.IsValid(LocalPlayer) then
UGCVehicleSystem.EnterVehicle(LocalPlayer, Car, ESTExtraVehicleSeatType.ESeatType_DriversSeat, true)
end
end
function BP_PunctureBalloonManager:GetCar()
self.CarIndex = self.CarIndex + 1
if self.CarIndex > #self.AllCars then
return nil
end
return self.AllCars[self.CarIndex]
end
function BP_PunctureBalloonManager:RemoveOtherCar()
if self.CarIndex < 4 then
for i = 4, self.CarIndex + 1, -1 do
local Car = self.AllCars[i]
UGCVehicleSystem.DestroySelf(Car)
UGCLogSystem.Log("[BP_PunctureBalloonManager_RemoveOtherCar]")
self.AllCars[i] = nil
end
end
end
function BP_PunctureBalloonManager:RemoveAllCar()
for i, Car in pairs(self.AllCars) do
UGCVehicleSystem.DestroySelf(Car)
UGCLogSystem.Log("[BP_PunctureBalloonManager_RemoveAllCar]")
end
self.AllCars = {}
end
function BP_PunctureBalloonManager:PierceBalloon(StabPlayer, PuncturedPlayer)
self.PlayerDriveCar[PuncturedPlayer]:Pierce()
self.ResetHandle[PuncturedPlayer] = UGCEventSystem.SetTimer(self, function()
self.PlayerDriveCar[PuncturedPlayer]:ResetCar()
self.ResetHandle[PuncturedPlayer] = nil
end, self.ResetCarTime)
end
function BP_PunctureBalloonManager:ReceiveTick(DeltaTime)
self.SuperClass.ReceiveTick(self, DeltaTime);
if UGCGameSystem.IsServer() then
self:CheckStabBalloon()
end
end
function BP_PunctureBalloonManager:CheckStabBalloon()
if not self.bIsPlay then return end
for _, StabCar in pairs(self.AllCars) do
if StabCar:GetCanStab() then
-- UGCLogSystem.Log("[BP_PunctureBalloonManager_CheckStabBalloon] StabCar Pos:%s", VectorHelper.ToString(StabCar:GetActorPos()))
local StabPos = StabCar:GetStabPos()
local Radius = StabCar:GetRadius()
local StabPlayer = StabCar:GetOwnerPlayerKey()
for __, PuncturedCar in pairs(self.AllCars) do
if StabCar ~= PuncturedCar and PuncturedCar:GetCanStab() then
local BalloonCenter, Radius = PuncturedCar:GetBalloonInfo()
local Dis = VectorHelper.Length(VectorHelper.Sub(BalloonCenter, StabPos)) - Radius
-- UGCLogSystem.Log("[BP_PunctureBalloonManager_CheckStabBalloon]StabPos:%s, BalloonCenter:%s, Radius:%s, Dis:%s", VectorHelper.ToString(StabPos), VectorHelper.ToString(BalloonCenter), tostring(Radius), tostring(Dis))
if Dis <= Radius then
--UGCLogSystem.Log("[BP_PunctureBalloonManager_CheckStabBalloon] Succeed Radius:%s", tostring(Radius))
UGCEventSystem.SendEvent(EventEnum.PierceBalloon, StabPlayer, PuncturedCar:GetOwnerPlayerKey())
end
end
end
end
end
end
function BP_PunctureBalloonManager:ReceiveEndPlay()
self.SuperClass.ReceiveEndPlay(self);
if UGCGameSystem.IsServer() then
UGCEventSystem.RemoveListener(EventEnum.PierceBalloon, self.PierceBalloon, self)
end
end
--[[
function BP_PunctureBalloonManager:GetReplicatedProperties()
return
end
--]]
--[[
function BP_PunctureBalloonManager:GetAvailableServerRPCs()
return
end
--]]
return BP_PunctureBalloonManager;