178 lines
5.4 KiB
Lua
178 lines
5.4 KiB
Lua
---@class BP_ItemActorBase_C:AActor
|
||
---@field WidgetComponent UWidgetComponent
|
||
---@field ParticleSystem UParticleSystemComponent
|
||
---@field StaticMesh UStaticMeshComponent
|
||
---@field Sphere USphereComponent
|
||
---@field QualityFX TArray<FSoftObjectPath>
|
||
--Edit Below--
|
||
local BP_ItemActorBase = {
|
||
ItemData = {},
|
||
-- 尝试放在一起
|
||
IdAndCount = "",
|
||
ThisID = -1,
|
||
bHasInit = false,
|
||
bIsPicking = false;
|
||
|
||
bCanBeAutoPickup = true,
|
||
DiscardPlayerKey = -1,
|
||
};
|
||
|
||
function BP_ItemActorBase:ReceiveBeginPlay()
|
||
self.SuperClass.ReceiveBeginPlay(self);
|
||
self.bHasInit = true
|
||
|
||
if self:HasAuthority() then
|
||
local TheData = self.IdAndCount
|
||
self.IdAndCount = TheData .. ";"
|
||
end
|
||
end
|
||
|
||
function BP_ItemActorBase:SetIsPicking(InPick)
|
||
self.bIsPicking = InPick
|
||
end
|
||
|
||
function BP_ItemActorBase:GetReplicatedProperties()
|
||
return
|
||
"ItemData", "ThisID", "IdAndCount", "bCanBeAutoPickup", "DiscardPlayerKey"
|
||
end
|
||
|
||
function BP_ItemActorBase:IsAutoPickupDisabled(PlayerKey)
|
||
return PlayerKey == self.DiscardPlayerKey and self.bCanBeAutoPickup == false
|
||
end
|
||
|
||
function BP_ItemActorBase:SetAutoPickupDisabled(PlayerKey)
|
||
self.DiscardPlayerKey = PlayerKey
|
||
self.bCanBeAutoPickup = false
|
||
|
||
if self.AutoPickupHandle == nil then
|
||
self.AutoPickupHandle = EventSystem.SetTimer(self, function()
|
||
self.bCanBeAutoPickup = true
|
||
end, 10.0)
|
||
end
|
||
end
|
||
|
||
function BP_ItemActorBase:SetItemValue()
|
||
local TheId = self:GetItemID()
|
||
if type(TheId) == "nil" then
|
||
print(string.format('[BP_ItemActorBase:SetItemValue] 没找到 Id: type ' .. type(TheId)))
|
||
return
|
||
elseif type(TheId) == "number" then
|
||
-- print(string.format('[BP_ItemActorBase:SetItemValue] 找到了 ' .. tostring(TheId)))
|
||
if UE.IsValid(self.WidgetComponent) and UE.IsValid(self.WidgetComponent.Widget) then
|
||
local bSuccess = self.WidgetComponent.Widget:SetItemData(TheId)
|
||
if not bSuccess then
|
||
self.WidgetComponent.Widget:SetVisibility(ESlateVisibility.Collapsed)
|
||
end
|
||
end
|
||
self:SpawnEffect(TheId, GetItemTypeByItemId(TheId), GetItemWeaponTypeByItemId(TheId))
|
||
end
|
||
end
|
||
|
||
function BP_ItemActorBase:OnRep_IdAndCount()
|
||
-- 解析该字符串
|
||
-- print("[BP_ItemActorBase:OnRep_IdAndCount] 开始执行")
|
||
-- 添加到所有的 Player Controller 中
|
||
local Controller = GameDataManager.GetLocalPlayerController()
|
||
table.insert(Controller.AllItemActors[ETeleportType.InArena], self)
|
||
|
||
self:SetItemValue()
|
||
end
|
||
|
||
function BP_ItemActorBase:OnRep_ItemData()
|
||
if not self.bHasInit then
|
||
return
|
||
end
|
||
--local val = IsWeaponPartItem(self:GetItemID() )
|
||
print("[BP_ItemActorBase:OnRep_ItemData] 开始执行")
|
||
if type(self.ItemData) == "table" then
|
||
for i = 1, #self.ItemData do
|
||
print(self.ItemData[i])
|
||
end
|
||
end
|
||
print("[BP_ItemActorBase:OnRep_ItemData] 结束执行")
|
||
-- 获取 ItemType
|
||
local ItemId = self.ItemData[1]
|
||
if ItemId == nil then
|
||
return
|
||
end
|
||
-- 显示出来
|
||
self.WidgetComponent.Widget:SetItemData(ItemId)
|
||
self.WidgetComponent.Widget:SetVisibility(ESlateVisibility.SelfHitTestInvisible)
|
||
self:SpawnEffect(ItemId, GetItemTypeByItemId(ItemId), GetItemWeaponTypeByItemId(ItemId))
|
||
end
|
||
|
||
function BP_ItemActorBase:SpawnEffect(InId, InItemType, InWeaponClassType)
|
||
local MeshPath = nil
|
||
local val = (InId // 10000) == EDropItemSet.WeaponParts + 1
|
||
if not val then
|
||
MeshPath = GameDataManager.GetItemMeshPathByItemType(InItemType)
|
||
else
|
||
MeshPath = GameDataManager.GetItemMeshPathByItemType(InItemType, InWeaponClassType)
|
||
end
|
||
|
||
AsyncLoadTools:LoadObjectBySoftPath(MeshPath,
|
||
function(Asset)
|
||
if UE.IsValid(self) and UE.IsValid(self.StaticMesh) then
|
||
self.StaticMesh:SetStaticMesh(Asset)
|
||
end
|
||
end)
|
||
|
||
local FXPath = self.QualityFX[self:GetItemQuality()]
|
||
if FXPath then
|
||
AsyncLoadTools:LoadObjectBySoftPath(FXPath,
|
||
function(Asset)
|
||
if UE.IsValid(self) and UE.IsValid(self.ParticleSystem) then
|
||
self.ParticleSystem:SetHiddenInGame(false, false)
|
||
self.ParticleSystem:SetTemplate(Asset)
|
||
end
|
||
end)
|
||
else
|
||
if self.ParticleSystem then
|
||
self.ParticleSystem:SetHiddenInGame(true, false)
|
||
end
|
||
end
|
||
end
|
||
|
||
function BP_ItemActorBase:SetThisID(InThisID)
|
||
self.ThisID = InThisID
|
||
end
|
||
|
||
-- C
|
||
function BP_ItemActorBase:SetItemData(InData)
|
||
self.IdAndCount = string.format("%d;%d", InData.ItemID, InData.Count)
|
||
self.ItemData = InData
|
||
self:SetItemValue()
|
||
end
|
||
|
||
function BP_ItemActorBase:SetPickItemData(InStr)
|
||
-- print(string.format("[BP_ItemActorBase:SetItemData] 测试一下数据类型:%s,具体数值:%s", type(InStr), InStr))
|
||
self.IdAndCount = InStr
|
||
self:OnRep_IdAndCount()
|
||
end
|
||
|
||
function BP_ItemActorBase:GetItemID()
|
||
local Arr = string.splitToNumber(self.IdAndCount, ";")
|
||
return Arr[1]
|
||
end
|
||
|
||
function BP_ItemActorBase:GetItemCount()
|
||
local Arr = string.splitToNumber(self.IdAndCount, ";")
|
||
-- print(string.format("[BP_ItemActorBase:GetItemID] 此时 Count = %d", Arr[2]))
|
||
return Arr[2]
|
||
end
|
||
|
||
function BP_ItemActorBase:GetThisID()
|
||
return self.ThisID
|
||
end
|
||
|
||
function BP_ItemActorBase:GetItemQuality()
|
||
return self:GetItemID() % 100 // 10
|
||
end
|
||
|
||
--[[
|
||
function BP_ItemActorBase:GetAvailableServerRPCs()
|
||
return
|
||
end
|
||
--]]
|
||
|
||
return BP_ItemActorBase; |