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

161 lines
5.8 KiB
Lua

---@class BP_Key_C:AActor
---@field Plane UStaticMeshComponent
---@field StaticMesh UStaticMeshComponent
---@field Key USceneComponent
---@field ParticleSystem UParticleSystemComponent
---@field Scene USceneComponent
---@field Sphere USphereComponent
---@field DefaultSceneRoot USceneComponent
---@field RotatorSpeed float
---@field KeyColor FLinearColor
---@field bIsRealKey bool
--Edit Below--
---@type BP_Key_C
local BP_Key = {
bEnableKeyPickup = true;
BeginPos = {X= 0., Y = 0., Z = 0.};
IsVisibility = true;
-- 丢到地上 false则为丢在玩家正前方
bThrowToGround = false;
};
function BP_Key:ReceiveTick(DeltaTime)
self.SuperClass.ReceiveTick(self, DeltaTime);
if not UGCGameSystem.IsServer() then
self.Key:K2_AddLocalRotation({Pitch = 0., Yaw = DeltaTime * self.RotatorSpeed, Row = 0.})
end
end
function BP_Key:ReceiveBeginPlay()
self.SuperClass.ReceiveBeginPlay(self);
if self:HasAuthority() then
self.BeginPos = VectorHelper.ToLuaTable(self:K2_GetActorLocation())
self.Sphere.OnComponentBeginOverlap:Add(self.SphereOverlap, self)
UGCEventSystem.AddListener(EventEnum.ResetKey, self.ResetKey, self)
UGCEventSystem.AddListener(EventEnum.KeyOwnerDead, self.LeaveBehindKey, self)
UGCEventSystem.AddListener(EventEnum.KeyOwnerChange, self.KeyOwnerChange, self)
else
if UGCGameSystem.GameState then
self:SetKeyVisibility(UGCGameSystem.GameState:GetKeyOwner() <= 0)
end
UGCLogSystem.Log("[BP_Key_ReceiveBeginPlay]")
local TraceWidget = UserWidget.NewWidgetObjectBP(UGCSystemLibrary.GetLocalPlayerController(), ObjectPathTable.TraceTargetKey_Class)
TraceWidget:AddToViewport(WidgetConfig.EUILayerGroup.Medium)
self:SetTargetTraceWidget(TraceWidget)
TraceWidget:SetKey(self, self.KeyColor)
UGCLogSystem.Log("[BP_Key_ReceiveBeginPlay] Finish")
end
end
function BP_Key:KeyOwnerChange(NewOwnerPlayerKey)
if self.bIsRealKey then
-- UGCLogSystem.Log("[BP_Key_KeyOwnerChange] NewOwnerPlayerKey:%d", NewOwnerPlayerKey)
if NewOwnerPlayerKey < 0 then
self:EnableKeyPickup(true)
end
end
end
function BP_Key:LeaveBehindKey(TargetPos)
if self.bIsRealKey then
-- UGCLogSystem.Log("[BP_Key_LeaveBehindKey]")
if TargetPos then
--------------------
if self.bThrowToGround then
local EndPos = {X = TargetPos.X, Y = TargetPos.Y, Z = TargetPos.Z - 3000}
local ObjectTypes = {ECollisionChannel.ECC_WorldStatic};
local bHit, HitResult = KismetSystemLibrary.LineTraceSingleForObjects(self, TargetPos, EndPos, ObjectTypes, false, {}, EDrawDebugTrace.None)
if bHit then
TargetPos = HitResult.ImpactPoint
end
end
--------------------
self:K2_SetActorLocation(TargetPos)
UGCSendRPCSystem.ActorRPCNotify(nil, self, "K2_SetActorLocation", VectorHelper.ToLuaTable(TargetPos))
end
-- self:EnableKeyPickup(true)
end
end
function BP_Key:ResetKey()
UGCLogSystem.Log("[BP_Key_ResetKey]")
self:K2_SetActorLocation(self.BeginPos)
UGCSendRPCSystem.ActorRPCNotify(nil, self, "K2_SetActorLocation", self.BeginPos)
self:EnableKeyPickup(true)
UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetKeyVisibility", true)
end
function BP_Key:EnableKeyPickup(IsEnable)
if IsEnable ~= self.bEnableKeyPickup then
self.bEnableKeyPickup = IsEnable
if self.bEnableKeyPickup then
UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetKeyVisibility", true)
UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetTargetWidgetVis", true)
else
UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetKeyVisibility", false)
end
end
end
function BP_Key:GetbEnableKeyPickup()
return self.bEnableKeyPickup
end
function BP_Key:SetKeyVisibility(InIsVisibility)
self.IsVisibility = InIsVisibility
self.DefaultSceneRoot:SetVisibility(self.IsVisibility, true)
end
-- (OverlappedComponent:UPrimitiveComponent,OtherActor:AActor,OtherComp:UPrimitiveComponent,OtherBodyIndex:int32,bFromSweep:bool,SweepResult:FHitResult)
function BP_Key:SphereOverlap(OverlappedComponent, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult)
if self.bEnableKeyPickup == false then return end
if OtherActor.PlayerKey and OtherActor:IsAlive() then
self:EnableKeyPickup(false)
UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetKeyVisibility", false)
if self.bIsRealKey then
-- 玩家捡到真的钥匙
UGCGameSystem.GameState:UpdateKeyOwner(OtherActor.PlayerKey)
UGCSendRPCSystem.RPCEvent(nil, EventEnum.AddTip, TipConfig.TipType.PlayerPickRealKey, OtherActor.PlayerKey)
else
-- 玩家捡到假的钥匙
UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetKeyVisibility", false)
UGCSendRPCSystem.ActorRPCNotify(nil, self, "SetTargetWidgetVis", false)
UGCSendRPCSystem.RPCEvent(nil, EventEnum.AddTip, TipConfig.TipType.PlayerPickFakeKey, OtherActor.PlayerKey)
end
end
end
function BP_Key:SetTargetTraceWidget(Widget)
self.TargetWidget = Widget
self:SetTargetWidgetVis(self.IsVisibility)
end
function BP_Key:GetTargetWidget()
return self.TargetWidget
end
function BP_Key:SetTargetWidgetVis(IsShow)
if self.TargetWidget then
if IsShow then
self.TargetWidget:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
else
self.TargetWidget:SetVisibility(ESlateVisibility.Hidden)
end
end
end
--- 设置是否位置真的钥匙
function BP_Key:SetIsRealKey(IsReal)
self.bIsRealKey = IsReal
end
function BP_Key:GetIsRealKey()
return self.bIsRealKey
end
return BP_Key;