local EventSystem = require('Event/EventSystem') local EventID = EventID local LevelRecordManager = { --S mains self --P mains player --M mains monster RecordType = { Damage_S2M = 1, -- 自己对怪物造成的伤害 Damage_P2M = 2, -- 玩家对怪物造成的伤害 } } local RecordType = LevelRecordManager.RecordType local private = { TypeEvent = {}, --[1] is eventID,[2] is recordFunc, [3] is createFunc, [4] is resetFunc TypeRecord = {} } --region ************* Interface ************* function LevelRecordManager.OpenRecord(type, context) if private.TypeRecord[type] then return end local evn = private.TypeEvent[type] EventSystem.Regist(evn[1], evn[2]) private.TypeRecord[type] = evn[3](context) end function LevelRecordManager.CloseRecord(type) if not private.TypeRecord[type] then return end local evn = private.TypeEvent[type] EventSystem.UnRegist(evn[1], evn[2]) private.TypeRecord[type] = nil end function LevelRecordManager.GetRecord(type) return private.TypeRecord[type] end function LevelRecordManager.ResetRecord(type) if not private.TypeRecord[type] then return end local evn = private.TypeEvent[type] evn[4](private.TypeRecord[type]) end --endregion Interface --region ************* Create ************* function private.CreateDamage_S2M() return { TotalDamage = 0, -- number应该就可以,有需求再改成fixpoint } end function private.CreateDamage_P2M(context) local record = { DamageDic = {} } for i,v in ipairs(context) do record.DamageDic[v.playerID] = FP.newV1(0) end return record end --endregion Create --region ************* Reset ************* function private.ResetDamage_S2M(record) record.TotalDamage = 0 end function private.ResetDamage_P2M(record) for i, damage in pairs(record.DamageDic) do damage:Reset() end end --endregion Reset --region ************* Record ************* function private.RecordDamage_S2M(target, caster, delta, op) local sourceEntity = private.GetDamageSource(caster, delta, op) if sourceEntity and sourceEntity:IsPlayerSelf() and target:IsMonster() then local record = private.TypeRecord[RecordType.Damage_S2M] record.TotalDamage = record.TotalDamage - FP.tonumberV1(delta) end end function private.RecordDamage_P2M(target, caster, delta, op) local sourceEntity = private.GetDamageSource(caster, delta, op) if sourceEntity and target:IsMonster() then local playerRoomID = sourceEntity._logicInitData.PlayerIDInRoom if playerRoomID > 0 then local record = private.TypeRecord[RecordType.Damage_P2M] record.DamageDic[playerRoomID]:Sub(delta) end end end --endregion Record function private.GetDamageSource(caster, delta, op) if delta < FP.Const.Zero and op == "sub" and caster then return caster:GetMasterEntity() or caster end return nil end private.TypeEvent[RecordType.Damage_S2M] = { EventID.Level_HPChange, private.RecordDamage_S2M, private.CreateDamage_S2M, private.ResetDamage_S2M } private.TypeEvent[RecordType.Damage_P2M] = { EventID.Level_HPChange, private.RecordDamage_P2M, private.CreateDamage_P2M, private.ResetDamage_P2M } return LevelRecordManager