local TablePool = require("Infrast/TablePool") local RuntimeDataManager = {} local FP = FP local setmetatable = setmetatable local pairs = pairs function RuntimeDataManager.New_SkillUpdate() return { CD = FP.newV1(0), --技能CD, 单位:毫秒 ProgressTime = nil, --进度条剩余时间,单位:毫秒 CurSerialNextSkillID = nil, --技能类型为 1连段 时生效 ,记录下次按键使用的技能id ChargeCount = nil, --充能技能:当前充能的数量(nil 表示该技能不是充能技能 ;和belongSkilldata.Type == LuaConst.SkillType.Charge 一样 ) ReleaseCount = nil, -- 技能释放次数 } end function RuntimeDataManager.Reset_SkillUpdate(data) if not data then return end data.CD:Reset() data.ProgressTime = nil data.CurSerialNextSkillID = nil end function RuntimeDataManager.New_BuffAdd() return { Actived = false, BuffID = -1, SourceEntityID = -1, CtrlParam = nil, } end function RuntimeDataManager.New_AttrCalculate(sourceBuffId, sourceEntityId, value, assignType) return { SourceBuffId = sourceBuffId, SourceEntityId = sourceEntityId, Value = value, AssignType = assignType, } end function RuntimeDataManager.New_CallBulletInfo() return { --发起召唤的人(召唤者) Entity = nil, --召唤执行的时间 CallTime = FP.newV1(0), --时间Elapsed TimeEla = FP.newV1(0), --召唤表数据 Data = nil, --发射的朝向 - 强制朝向 ,一般是给二次子弹用的 ForceFireDir = nil, --发射时的子弹相对参考位置 -- 位置参数 FireBasePos = FP.newV2(0, 0), --发射的相对参考高度 -- 位置参数 FireBasePosY = FP.newV1(0), --在FireBasePosY基础上的偏移量 - 可以为非定点数 ForceOffsetY = nil, -- 子弹位置基准者的朝向(用于多边形子弹位置的方位) -- 位置参数 FireBaseRotateDir = FP.newV2(0,1), --子弹朝向 BornForwardType 用到的参数 -- 朝向参数 FireBaseRotateParamV2 = FP.newV2(0, 0), --技能摇杆指挥子弹的起点还是落点 ctrlTypeByJoystick = nil, --目标位置的备用位置(找不到target,就用这个)。设置的优先级:AI锁定地点 > 目标位置 > 目标在技能释放时刻的位置 > 发射者位置 ;使用的时候还要考虑策划需求再额外加逻辑 MissileAimPos = FP.newV2(0, 0), --技能摇杆位置 摇杆(投石车也算摇杆) skillJoyStickPos = nil, --子弹产生特效后的朝向 EffForward = nil, DynamicSkillDmgFactor = FP.newV1(1), --HYW动态技能伤害系数 SkillID = nil, -- 释放子弹的技能ID 可以为空 TrackerTarget = nil, --子弹目标 (2022年12月27日前仅为跟踪弹目标, 之后拓展为了所有类型子弹的目标,包含跟踪弹目标的所有功能,并且对于非跟踪弹也有了意义。为了减轻测试压力暂不改名) ForceTarget = nil, -- 此次call的目标entity IsNextMissile = false, --这个子弹是否是二次子弹 bounceInfo = nil, -- 弹射信息 } end function RuntimeDataManager.New_BuffUpdate() return { SourceEntity = nil, MissileHurtID = nil, -- 只有是子弹产生伤害的时候才赋值 ,其他都为nil MissileHitCount = 0, -- 子弹添加buff时,同时撞击的人数 MissileOfInstantBuff = nil, --子弹添加瞬时buff时的子弹信息 MissileDamageFactor = nil, --子弹的伤害系数,是FP IsTracker = false, BuffOverRideFomula = nil, -- buff默认公式被覆盖的公式 BuffLayer = 1, --/Buff的层数,为0时代表无此buff BuffTimer = FP.newV1(0), --Buff存活时间的计时 BuffCallTimer = FP.newV1(0),--Buff间隔生效的计时 } end function RuntimeDataManager.Set_BuffUpdate(data,from) data.SourceEntity = from.SourceEntity data.MissileHurtID = from.MissileHurtID data.MissileHitCount = from.MissileHitCount data.MissileOfInstantBuff = from.MissileOfInstantBuff data.MissileDamageFactor = from.MissileDamageFactor data.BuffOverRideFomula = from.BuffOverRideFomula data.BuffLayer = from.BuffLayer --/Buff的层数,为0时代表无此buff data.BuffTimer = from.BuffTimer --Buff存活时间的计时 data.BuffCallTimer = from.BuffCallTimer data.IsTracker = false end function RuntimeDataManager.Reset_BuffUpdate(data) if not data then return end data.SourceEntity = nil data.MissileHurtID = nil data.MissileHitCount = 0 data.MissileOfInstantBuff = nil data.MissileDamageFactor = nil data.BuffOverRideFomula = nil data.BuffLayer = 0 --/Buff的层数,为0时代表无此buff data.BuffTimer:Reset() --Buff存活时间的计时 data.BuffCallTimer:Reset() --Buff间隔生效的计时 data.IsTracker = false end local buffCtrlPool = TablePool( function(buffCtrl) if buffCtrl then setmetatable(buffCtrl, nil) --这块代码要跟下面一样↓ buffCtrl.MissileHurtID = nil -- 子弹产生伤害时的子弹ID,非子弹伤害都设置为 nil,以区分是否子弹伤害 buffCtrl.IsTracker = false buffCtrl.MissileHitMoveID = nil -- 是否产生了子弹撞击移动,如果有则为子弹id,没有为nil buffCtrl.HitMoveTime = FP.newV1(0) -- 子弹撞击移动-时长,是FP buffCtrl.HitDistance = FP.newV1(0) -- 子弹撞击移动-距离,是FP buffCtrl.HitMoveDir = nil --子弹撞击移动方向的角度,是number,不是FP,更不是V2 buffCtrl.HitMoveDirOffsetAngle = nil-- 子弹撞击移动方向的角度偏差,是number-int -不会造成不一致 buffCtrl.BuffOverRideFomula = nil --覆盖buff公式的公式 buffCtrl.ForceLayer = 1 buffCtrl.ForceDuration = FP.newV1(-1) --单位:秒 buffCtrl.HpChangeType = LuaConst.EHpChangeType.NORMAL --血量改变类型,如果是dot buff就得设为DOT、反伤Buff造成的伤害就得设为DAMAGE_RETURN --↑ else --这块代码要跟上面一样↓ buffCtrl = { MissileHurtID = nil, -- 子弹产生伤害时的子弹ID,非子弹伤害都设置为 nil,以区分是否子弹伤害 IsTracker = false, MissileHitMoveID = nil, -- 是否产生了子弹撞击移动,如果有则为子弹id,没有为nil HitMoveTime = FP.newV1(0), -- 子弹撞击移动-时长,是FP HitDistance = FP.newV1(0), -- 子弹撞击移动-距离,是FP HitMoveDir = nil, --子弹撞击移动方向的角度,是number,不是FP,更不是V2 HitMoveDirOffsetAngle = nil,-- 子弹撞击移动方向的角度偏差,是number-int -不会造成不一致 BuffOverRideFomula = nil, --覆盖buff公式的公式 ForceLayer = 1, ForceDuration = FP.newV1(-1), --单位:秒 HpChangeType = LuaConst.EHpChangeType.NORMAL, --血量改变类型,如果是dot buff就得设为DOT、反伤Buff造成的伤害就得设为DAMAGE_RETURN } --↑ end return buffCtrl end, function(buffCtrl) for k,v in pairs(buffCtrl) do buffCtrl[k] = nil end end ) local BuffCtrlInPoolMT = { __index = function(t, k) logging.error(LTAG.ERROR, "HYW : index on buffCtrl pool ", k) end, __newindex = function(t, k, v) logging.error(LTAG.ERROR, "HYW : index on buffCtrl pool ", k) end, } --禁止持有返回值里的引用类型的引用 function RuntimeDataManager.New_BuffCtrl() local buffCtrl = buffCtrlPool.TryGet() return setmetatable(buffCtrl, nil) end function RuntimeDataManager.Free_BuffCtrl(buffCtrl) buffCtrlPool.Recycle(buffCtrl) setmetatable(buffCtrl, BuffCtrlInPoolMT) end --BuffSkill的运行时数据包 --BuffSkill:只会给自身添加buff,没有技能动画的技能,跟 技能(Skill) 不是一个东西 function RuntimeDataManager.New_BuffSkillUpdate() return { BuffSkillID = -1, --ID BuffSkillData = nil, --配置数据 CD = 0, --CD, 单位:毫秒 (因为是整数,所以不用FP) IsHiding = false, --是否被隐藏 (比如神兽技可能会被隐藏 2023年5月10日) } end return RuntimeDataManager