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

237 lines
6.8 KiB
Lua

---@class BP_TriggerMechanismBase_C:Pawn
---@field DefaultSceneRoot USceneComponent
---@field MaxEnergyValue float
---@field EnergyValue float
---@field EnergyMinimumLimit float
---@field EnergyConsumptionSpeed float
---@field bMechanismEnable bool
---@field EnableAudio UAkAudioEvent
---@field TriggeredPlayer int64
---@field ConePos FVector
---@field bGlobalScope bool
---@field bEnableTipMechanismRangeHasPlayer bool
---@field bEnableFriendlyInjury bool
--Edit Below--
---@type BP_TriggerMechanismBase_C
local BP_TriggerMechanismBase = {
TriggeredSoundID = -1;
TriggerDevice = nil;
TriggerHandle = nil;
ConsumptionFrequency = 10.;
MechanismType = -1;
RangeTeams = {};
};
---继承接口
--[[
local MechanismBase = require('Script.Blueprint.MechanismActor.BP_TriggerMechanismBase')
local BP_Flamethrower = setmetatable(
{
DamageFrequency = 10.;
},
{
__index = MechanismBase,
__metatable = MechanismBase
}
);
function BP_Flamethrower:ReceiveBeginPlay()
self.SuperClass.ReceiveBeginPlay(self);
MechanismBase.MechanismBeginPlay(self)
end
function BP_Flamethrower:ReceiveEndPlay()
self:MechanismEndPlay()
self.SuperClass.ReceiveEndPlay(self);
end
function BP_Flamethrower:Trigger(InTriggeredPlayer, InTriggerDevice, InEnergyValue)
MechanismBase.Trigger(self, InTriggeredPlayer, InTriggerDevice, InEnergyValue)
end
function BP_Flamethrower:CloseMechanism()
MechanismBase.CloseMechanism(self)
end
function BP_Flamethrower:EnableClientTriggerEffects()
MechanismBase.EnableClientTriggerEffects(self)
end
function BP_Flamethrower:DisableClientTriggerEffects()
MechanismBase.DisableClientTriggerEffects(self)
end
function BP_Flamethrower:CheckPlayerInRange(PlayerPawn)
return false
end
]]
function BP_TriggerMechanismBase:MechanismBeginPlay()
if UGCGameSystem.IsServer() then
else
if self.bMechanismEnable then
self:EnableClientTriggerEffects()
else
self:DisableClientTriggerEffects()
end
end
self:SetMechanismType(MechanismConfig.TriggerMechanismType.MechanismWeapon)
end
function BP_TriggerMechanismBase:Trigger(InTriggeredPlayer, InTriggerDevice, InEnergyValue)
self.bMechanismEnable = true
self.TriggeredPlayer = InTriggeredPlayer
self.TriggerDevice = InTriggerDevice
UGCLogSystem.Log("[BP_TriggerMechanismBase_Trigger] InEnergyValue:%s", tostring(InEnergyValue))
self:SetEnergyValue(InEnergyValue)
self.TriggerHandle = UGCEventSystem.SetTimerLoop(self, self.EnergyConsumption, 1. / self.ConsumptionFrequency)
--UnrealNetwork.CallUnrealRPC_Multicast(self, "EnableClientTriggerEffects")
UGCSendRPCSystem.ActorRPCNotify(nil, self, "EnableClientTriggerEffects")
end
function BP_TriggerMechanismBase:CloseMechanism()
self.bMechanismEnable = false
self.TriggeredPlayer = -1
if UE.IsValid(self.TriggerDevice) then
self.TriggerDevice:MechanismClosed()
end
if self.TriggerHandle then
UGCEventSystem.StopTimer(self.TriggerHandle)
self.TriggerHandle = nil
end
-- UnrealNetwork.CallUnrealRPC_Multicast(self, "DisableClientTriggerEffects")
UGCSendRPCSystem.ActorRPCNotify(nil, self, "DisableClientTriggerEffects")
end
function BP_TriggerMechanismBase:GetEnergyValue()
return self.EnergyValue
end
function BP_TriggerMechanismBase:SetEnergyValue(NewEnergyValue)
UGCLogSystem.Log("[BP_TriggerMechanismBase_SetEnergyValue] NewEnergyValue:%s", tostring(NewEnergyValue))
self.EnergyValue = math.clamp(NewEnergyValue, 0., self:GetMaxEnergyValue())
end
function BP_TriggerMechanismBase:GetMaxEnergyValue()
return self.MaxEnergyValue
end
function BP_TriggerMechanismBase:GetEnergyMinimumLimit()
return self.EnergyMinimumLimit
end
--- 能量消耗
---@param ConsumptionValue float|nil 消耗值 若为nil则自动按频率消耗
function BP_TriggerMechanismBase:EnergyConsumption(ConsumptionValue)
if ConsumptionValue == nil then
ConsumptionValue = self.EnergyConsumptionSpeed / self.ConsumptionFrequency
end
if self:GetEnergyValue() > ConsumptionValue then
self:SetEnergyValue(self:GetEnergyValue() - ConsumptionValue)
else
self:SetEnergyValue(0)
self:CloseMechanism()
end
self.TriggerDevice:UpdateMechanismEnergyInfo(self:GetEnergyValue())
end
function BP_TriggerMechanismBase:EnableClientTriggerEffects()
if self.EnableAudio then
if self.TriggeredSoundID >= 0 then
UGCSoundManagerSystem.StopSoundByID(self.TriggeredSoundID)
end
self.TriggeredSoundID = UGCSoundManagerSystem.PlaySoundAtLocation(self.EnableAudio, self:K2_GetActorLocation(), self:K2_GetActorRotation())
end
end
function BP_TriggerMechanismBase:DisableClientTriggerEffects()
if self.TriggeredSoundID >= 0 then
UGCSoundManagerSystem.StopSoundByID(self.TriggeredSoundID)
self.TriggeredSoundID = -1
end
end
function BP_TriggerMechanismBase:GetConePos()
local SelfRot = self:K2_GetActorRotation()
local RelativePos = KismetMathLibrary.GreaterGreater_VectorRotator(self.ConePos, SelfRot)
return VectorHelper.Add(self:K2_GetActorLocation(), RelativePos)
end
function BP_TriggerMechanismBase:GetMechanismType()
return self.MechanismType
end
function BP_TriggerMechanismBase:SetMechanismType(InMechanismType)
self.MechanismType = InMechanismType
end
-- 判断玩家是否在效果范围内
function BP_TriggerMechanismBase:CheckPlayerInRange(PlayerPawn)
return false
end
function BP_TriggerMechanismBase:GetEnableTipPlayerInRange()
return self.bEnableTipMechanismRangeHasPlayer
end
function BP_TriggerMechanismBase:GetGlobalScope()
return self.bGlobalScope
end
function BP_TriggerMechanismBase:GetEnableDamagePlayer(PlayerKey)
if MechanismConfig.bEnableFriendlyInjury and self.bEnableFriendlyInjury then
local Res = {}
local AllController = UGCGameSystem.GetAllPlayerController()
for i, v in pairs(AllController) do
Res[#Res + 1] = v.PlayerKey
end
return Res
else
local TeamID = UGCPlayerStateSystem.GetTeamID(PlayerKey)
return UGCTeamSystem.GetOtherTeamPlayerKeys(TeamID)
end
end
--[[
function BP_TriggerMechanismBase:ReceiveBeginPlay()
self.SuperClass.ReceiveBeginPlay(self);
end
--]]
--[[
function BP_TriggerMechanismBase:ReceiveTick(DeltaTime)
self.SuperClass.ReceiveTick(self, DeltaTime);
end
--]]
function BP_TriggerMechanismBase:MechanismEndPlay()
if self.TriggerHandle then
UGCEventSystem.StopTimer(self.TriggerHandle)
self.TriggerHandle = nil
end
self.SuperClass.ReceiveEndPlay(self);
end
--function BP_TriggerMechanismBase:GetReplicatedProperties()
-- return
--end
--[[
function BP_TriggerMechanismBase:GetAvailableServerRPCs()
return
end
--]]
return BP_TriggerMechanismBase;