初始化提交
This commit is contained in:
		
							
								
								
									
										203
									
								
								Content/Lua/GamePlay/LuaBusyRole.lua
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								Content/Lua/GamePlay/LuaBusyRole.lua
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,203 @@ | ||||
| local UIUtils = require("UI.Utils") | ||||
| local Reactive = require("Core.Reactive") | ||||
| local ERoleState = import("EBusyRoleState") | ||||
| local EBusyItemEffectType = import("EBusyItemEffectType") | ||||
| local GameplayStatics = import ("GameplayStatics") | ||||
| local GetGameplayTag = require("GamePlay.Utils").GetGameplayTag | ||||
| local BusyActorManagerSubSystem = import("BusyActorManagerSubSystem") | ||||
| local GamePlayUtils = require("GamePlay.Utils") | ||||
| local KismetMathLibrary = import("KismetMathLibrary") | ||||
|  | ||||
| local LevelItemRewardClass = import("LevelItemReward") | ||||
|  | ||||
| --- @class BusyRole | ||||
| local Role={ | ||||
|     movement_watcher = nil, | ||||
|     interacte_item = nil | ||||
| } | ||||
|  | ||||
| local PickAbilityTag    = "Ability.Role.Pick" | ||||
| local RecoverAbilityTag = "Ability.Role.Recover" | ||||
| local ConsumeAbilityTag = "Ability.Role.AttributeConsume" | ||||
| local RollAbilityTag = "Ability.Role.Roll" | ||||
|  | ||||
| -- 私有函数 | ||||
|  | ||||
| -- 采集相关 | ||||
|  | ||||
| --- @param role BusyRole | ||||
| --- @param pick_targer BusyLevelItem | ||||
| local function ResetPickWatcher(role, pick_targer) | ||||
|     if role.pick_watcher ~= nil then | ||||
|         role.pick_watcher:Destroy() | ||||
|     end | ||||
|     role.pick_watcher = Reactive.Watcher(function() | ||||
|         if not pick_targer:IsAlive() then | ||||
|             role.pick_watcher:Destroy() | ||||
|             role.pick_watcher = nil | ||||
|             role.carried_item_id = pick_targer:GetItemID() | ||||
|         end | ||||
|     end) | ||||
| end | ||||
|  | ||||
| --- 存储正在搬运的物品 | ||||
| local function StoreCarriedItem(role) | ||||
|     -- if not role.carried_item_id then return end | ||||
|     -- local sub_system = BusyActorManagerSubSystem.Get(role) | ||||
|     -- local bonfire = sub_system:GetNearestBonfire() | ||||
|     -- if bonfire:StoreItem(role.carried_item_id) then | ||||
|     --     role.carried_item_id = nil | ||||
|     -- end | ||||
| end | ||||
|  | ||||
| function Role:ctor() | ||||
|     self.pick_timer = nil | ||||
|     self.carried_item_id = nil | ||||
|     self.time_limited_tags = {} | ||||
|     self.pick_watcher = nil  -- 监听正在采集物品的状态 | ||||
|     self.proxy = Reactive.ReactiveProperty({ | ||||
|         state = ERoleState.BonfireIdle, | ||||
|         is_alive = true, | ||||
|     }) | ||||
| end | ||||
|  | ||||
| function Role:ReceiveBeginPlay() | ||||
|     self.bCanEverTick = false | ||||
|     self.Inventory:DepositItems(200001, 2) | ||||
|     self.movement_watcher = Reactive.Watcher(function() | ||||
|         self:UpdateRoleState() | ||||
|     end) | ||||
| end | ||||
|  | ||||
| function Role:ReceiveEndPlay() | ||||
|     print(self, "Role:ReceiveEndPlay") | ||||
|  | ||||
| end | ||||
|  | ||||
| function Role:ReceiveSetRole(_) | ||||
|     self:TryActiveAbility(ConsumeAbilityTag, nil) | ||||
|     UIUtils.ShowWidget(self, "RoleState", {role=self}) | ||||
| end | ||||
|  | ||||
| function Role:UpdateRoleState() | ||||
|     -- 在auto run中访问Reactive Property的值,会导致多次调用,有性能隐患 | ||||
|     local role_state = Reactive.RawGet(self.proxy, "state") | ||||
|     local move_proxy = self.Movement.proxy | ||||
|     if move_proxy.isIdle then | ||||
|         if role_state == ERoleState.Searching or role_state == ERoleState.PickFinished then | ||||
|             self.proxy.state = ERoleState.BackBonfire | ||||
|             self.Movement:BackBonfire() | ||||
|         elseif role_state == ERoleState.BackBonfire then | ||||
|             -- StoreCarriedItem(self) | ||||
|             self.proxy.state = ERoleState.BonfireIdle | ||||
|         end | ||||
|     else | ||||
|         if role_state == ERoleState.BonfireIdle then | ||||
|             self.proxy.state = ERoleState.Searching | ||||
|         end | ||||
|     end | ||||
|     print("old", role_state, "new", Reactive.RawGet(self.proxy, "state"), move_proxy.isIdle) | ||||
| end | ||||
|  | ||||
| function Role:StartPick(level_item) | ||||
|     local GameplayEventData = import("GameplayEventData") | ||||
|     local EventData = GameplayEventData() | ||||
|     EventData.Instigator = self | ||||
|     EventData.Target = level_item | ||||
|     self.proxy.state = ERoleState.Picking | ||||
|     self:TryActiveAbility(PickAbilityTag, EventData) | ||||
|     -- ResetPickWatcher(self, level_item) | ||||
| end | ||||
|  | ||||
| function Role:OnTouch(_) | ||||
|     local role_proxy = self.proxy | ||||
|     if role_proxy.state == ERoleState.BonfireIdle then | ||||
|         local pc = GameplayStatics.GetPlayerController(self:GetWorld(), 0) | ||||
|         local world_x, world_y = pc:convertCursorToWorldPosition() | ||||
|         role_proxy.state = ERoleState.Searching | ||||
|         self.Movement:SetDestination(world_x, world_y) | ||||
|     else | ||||
|         print("nothing") | ||||
|     end | ||||
| end | ||||
|  | ||||
| function Role:OnOverlapBegin(OverlappedComp, OtherActor, OtherComp, OtherBodyIndex, bFromSweep, SweepResult) | ||||
|     if KismetMathLibrary.ClassIsChildOf(OtherActor:GetClass(), LevelItemRewardClass) then | ||||
|         self.Inventory:DepositItems(OtherActor.RewardID, 1) | ||||
|         OtherActor:ConditionalBeginDestroy() | ||||
|     else | ||||
|         if self.proxy.state ~= ERoleState.Searching then return end | ||||
|         self.proxy.state = ERoleState.Picking | ||||
|         self.Movement:Stop() | ||||
|         self:StartPick(OtherActor) | ||||
|     end | ||||
|  | ||||
| end | ||||
|  | ||||
|  | ||||
| --- 使用翻滚技能 | ||||
| function Role:UseRollSkill() | ||||
|     self:TryActiveAbility(RollAbilityTag, nil) | ||||
| end | ||||
|  | ||||
|  | ||||
|  | ||||
| --  接口 | ||||
| function Role:GetPickEffect() | ||||
|     return self.RoleConfig.PickEffect | ||||
| end | ||||
|  | ||||
| function Role:GetHealthPercent() | ||||
|     local current_health = self.LuaRoleAttribute.Health or 0 | ||||
|     return current_health / self.RoleConfig.Health | ||||
| end | ||||
|  | ||||
| function Role:GetHungerPercent() | ||||
|     return self.LuaRoleAttribute.Hunger / self.RoleConfig.Hunger | ||||
| end | ||||
|  | ||||
| function Role:GetHungerConsumeSpeed() | ||||
|     if self.time_limited_tags["SkillRole"] ~= nil then | ||||
|         return self.RoleConfig.HungerConsumeSpeed * 8 | ||||
|     else | ||||
|         return self.RoleConfig.HungerConsumeSpeed | ||||
|     end | ||||
| end | ||||
|  | ||||
| function Role:GetSpeed() | ||||
|     return self.LuaRoleAttribute.MoveSpeed | ||||
| end | ||||
|  | ||||
| function Role:GetMoveDirection() | ||||
|     return self.Movement.proxy.direction | ||||
| end | ||||
|  | ||||
|  | ||||
| --- 返回即将消耗的饥饿值和生命值 | ||||
| function Role:CalcRealChangeByHunger(value) | ||||
|     local config = self.RoleConfig | ||||
|     local fixed_change, extra_health_need = 0, 0 | ||||
|     local cost_rate = config.HealthConsumeSpeed / config.HungerConsumeSpeed | ||||
|     local remain_hunger = self.LuaRoleAttribute.Hunger + value | ||||
|     if remain_hunger < 0 then | ||||
|         fixed_change = remain_hunger | ||||
|         extra_health_need = remain_hunger * cost_rate | ||||
|     elseif remain_hunger > self.RoleConfig.Hunger then | ||||
|         fixed_change = remain_hunger - self.RoleConfig.Hunger | ||||
|     end | ||||
|     return value - fixed_change, self:CalcRealChangeByHealth(extra_health_need) | ||||
| end | ||||
|  | ||||
| function Role:CalcRealChangeByHealth(value) | ||||
|     if value == 0 then return 0 end | ||||
|     local fixed_change = 0 | ||||
|     local remain_health = self.LuaRoleAttribute.Health + value | ||||
|     if remain_health < 0 then | ||||
|         fixed_change = remain_health | ||||
|     elseif remain_health > self.RoleConfig.Health then | ||||
|         fixed_change = remain_health - self.RoleConfig.Health | ||||
|     end | ||||
|     return value - fixed_change | ||||
| end | ||||
|  | ||||
| return Class(nil, nil, Role) | ||||
		Reference in New Issue
	
	Block a user