| 
									
										
										
										
											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) |