161 lines
5.8 KiB
Lua
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; |