---@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: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") end function BP_TriggerMechanismBase:CloseMechanism() self.bMechanismEnable = false self.TriggeredPlayer = -1 if self.TriggerDevice then self.TriggerDevice:MechanismClosed() end if self.TriggerHandle then UGCEventSystem.StopTimer(self.TriggerHandle) self.TriggerHandle = nil end UnrealNetwork.CallUnrealRPC_Multicast(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 消耗值 若为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:ReceiveEndPlay() self.SuperClass.ReceiveEndPlay(self); end --]] --function BP_TriggerMechanismBase:GetReplicatedProperties() -- return --end --[[ function BP_TriggerMechanismBase:GetAvailableServerRPCs() return end --]] return BP_TriggerMechanismBase;