2025-07-09 01:08:35 +08:00
|
|
|
--- @class BusyLevelItem
|
|
|
|
|
local LevelItem = {}
|
|
|
|
|
local Reactive = require("Core.Reactive")
|
|
|
|
|
local RoleUtils = require("GamePlay.Utils.RoleUtils")
|
|
|
|
|
local GameplayUtils = require("GamePlay.Utils")
|
|
|
|
|
local KismetSystemLibrary = import("KismetSystemLibrary")
|
|
|
|
|
|
|
|
|
|
function LevelItem:ReceiveBeginPlay()
|
|
|
|
|
self:SetLevelItemID(self.CurrentItemID)
|
|
|
|
|
self.world = self:GetWorld()
|
2025-07-12 13:07:01 +08:00
|
|
|
print("LevelItem:ReceiveBeginPlay")
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function LevelItem:TempSetting()
|
|
|
|
|
self:ReceiveBeginPlay()
|
2025-07-09 01:08:35 +08:00
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function LevelItem:ReceiveLevelItemSetted(Config)
|
|
|
|
|
self.config = Config
|
|
|
|
|
self.PickBar.Widget:BindLevelItem(self)
|
|
|
|
|
|
|
|
|
|
print("LevelItem:ReceiveLevelItemSetted", KismetSystemLibrary.IsValid(self))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.attribute_watcher = Reactive.Watcher(function()
|
|
|
|
|
if self.LuaLevelItemAttribute.Health <= 0 then
|
|
|
|
|
self:GenerateDropItems()
|
|
|
|
|
local location = self:K2_GetActorLocation()
|
|
|
|
|
location.Z = -1000
|
|
|
|
|
self:K2_SetActorLocation(location, false, nil, false)
|
|
|
|
|
self:SetLifeSpan(0.3)
|
|
|
|
|
self.attribute_watcher:Destroy()
|
|
|
|
|
end
|
|
|
|
|
end)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function LevelItem:GenerateDropItems()
|
|
|
|
|
local BusyActorManagerSubSystem = import("BusyActorManagerSubSystem").Get(self.world)
|
|
|
|
|
local role = RoleUtils.GetRole(self)
|
|
|
|
|
local role_location = role:K2_GetActorLocation()
|
|
|
|
|
local curr_location = self:K2_GetActorLocation()
|
|
|
|
|
|
|
|
|
|
local collection_config = GameplayUtils.GetItemConfigByID(self.CurrentItemID)
|
|
|
|
|
|
|
|
|
|
local generated_dict = {}
|
|
|
|
|
for _, config in pairs(collection_config.DropConfigs) do
|
|
|
|
|
local base = 0
|
|
|
|
|
local seed = math.random()
|
|
|
|
|
for _, rate in pairs(config.configs) do
|
|
|
|
|
local min = base
|
|
|
|
|
local max = base + rate.Rate
|
|
|
|
|
if seed >= min and seed < max then
|
|
|
|
|
generated_dict[config.ItemID] = rate.Count
|
|
|
|
|
break
|
|
|
|
|
end
|
|
|
|
|
base = max
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
for item_id, count in pairs(generated_dict) do
|
|
|
|
|
for _ = 1, count do
|
|
|
|
|
local reward = BusyActorManagerSubSystem:SpawnLevelItemReward(self)
|
|
|
|
|
|
|
|
|
|
reward.Movement.speed = 300.0
|
|
|
|
|
reward.Movement.accelerate = 600.0
|
|
|
|
|
reward.Movement.direction = {
|
|
|
|
|
X = curr_location.X - role_location.X,
|
|
|
|
|
Y = curr_location.Y - role_location.Y
|
|
|
|
|
}
|
|
|
|
|
reward:SetRewardID(item_id)
|
|
|
|
|
end
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-- 接口
|
|
|
|
|
function LevelItem:GetPickProcess()
|
|
|
|
|
local process = self.LuaLevelItemAttribute.Health / self.config.PickTimeCost
|
|
|
|
|
print("current process", process)
|
|
|
|
|
return process
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function LevelItem:GetPickCost()
|
|
|
|
|
return self.LevelItemConfig.PickHungerCost
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function LevelItem:IsAlive()
|
|
|
|
|
return self.LuaLevelItemAttribute.Health > 0
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
function LevelItem:GetItemID()
|
|
|
|
|
return self.CurrentItemID
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return Class(nil, nil, LevelItem)
|