using System.Collections.Generic; using System.Text; using CoreGame; using GAS.Runtime; using ProtoCSClass; using Sog; using xFrame; namespace CoreGame.Render { public static class PropertySrv { public static GameplayEffectCalc[] s_GEC = new GameplayEffectCalc[(int)GECType.Size]; public static Dictionary s_CustomModifer = new(20); private static bool s_Inited = false; public static void Init() { if (s_Inited) return; s_Inited = true; s_GEC[(int)GECType.UniformPropertyChange] = new UniformPropertyChange(); s_GEC[(int)GECType.Bullet] = new BulletDmgCalc(); s_GEC[(int)GECType.Dot] = new DotDmgCalc(); s_GEC[(int)GECType.DotBoom] = new DotBoomDmgCalc(); s_GEC[(int)GECType.Spell] = new SpellDmgCalc(); s_GEC[(int)GECType.HangMagnitude] = new HangMagnitudeCalc(); s_CustomModifer.Add("BossShield", new CustomModifer_BossShield()); } public static Fixed64 GetModifierSrcValue(GameplayEffectModifier modifer, GameplayEffectSpec spec) { if (modifer.Cfg.srcAttributeFrom == AttributeFrom.CustomCalculationClass) { if (s_CustomModifer.TryGetValue(modifer.Cfg.magnitude, out var customModifer) == false) { XLog.LogWarning($"GetModifierSrcValue CustomModifer not found: {modifer.Cfg.magnitude}"); return 0; } return customModifer.GetCalculationClassMagnitude(modifer.Cfg, spec); } var owner = spec.Source.owner; var data = modifer.Cfg; var caster = TargetSelectSrv.GetCaster(owner) ?? owner; // 从目标持有的枪中获取 if (modifer.Cfg.srcAttributeFrom == AttributeFrom.Gun) { if (caster.IsValid() == false) { XLog.LogWarning($"GetModifierSrcValue Source not found: {modifer.modiferId}"); return 0; } var gun = caster.equips.GetMainGunEntity(); if (gun == null) { XLog.LogWarning($"GetModifierSrcValue MainGun not found: {modifer.modiferId}"); return 0; } var calcVal = ExpressionEvaluator.CalcVal_WithPropAndGaCfg(data.magnitude, gun.property.container, spec.Level, spec.effectParams.gaInitCfg, 0); calcVal *= spec.stackCount; return calcVal; } // 从后台枪中获取 if (modifer.Cfg.srcAttributeFrom == AttributeFrom.Support) { if (caster.IsValid() == false) { XLog.LogWarning($"GetModifierSrcValue Source not found: {modifer.modiferId}"); return 0; } var gun = caster?.equips.GetSupportGunEntity(); if (gun == null) { XLog.LogWarning($"GetModifierSrcValue SupportGun not found: {modifer.modiferId}"); return 0; } var calcVal = ExpressionEvaluator.CalcVal_WithPropAndGaCfg(data.magnitude, gun.property.container, spec.Level, spec.effectParams.gaInitCfg, 0); calcVal *= spec.stackCount; return calcVal; } return modifer.CalculateMagnitude(spec); } public static void RevertModifier(GameplayEffectModifier modifer, GameplayEffectSpec spec) { var geModiferDesc = GEModiferDescMgr.Instance.GetConfig(modifer.modiferId); var calc = s_GEC[(int)geModiferDesc.gecType]; calc.Revert(modifer, spec); } public static void DoModifier(GameplayEffectModifier modifer, GameplayEffectSpec spec) { var geModiferDesc = GEModiferDescMgr.Instance.GetConfig(modifer.modiferId); if (geModiferDesc == null) { XLog.LogWarning($"DoModifier GEModiferDesc not found: {modifer.modiferId} !!!!"); return; } var calc = s_GEC[(int)geModiferDesc.gecType]; calc.Execute(modifer, spec); } public static void GetHeroBasePropValue(CombatEntity ce) { var heroPropViewOne = CoreUIBridge.BattleInfoParams.heroPropView; var cacheProps = CoreUIBridge.BattleInfoParams.cacheHeroProps; var level = CoreUIBridge.BattleInfoParams.heroCommunityInfo.lvl; GetBasePropValue(ce, heroPropViewOne, cacheProps, level); } public static void GetBasePropValue(CombatEntity ce, HeroPropViewOne propViewOne, List cacheProps, int level) { ce.AddProperty(); if (propViewOne != null) { Reset_HeroBaseProps(ce, propViewOne, cacheProps); if (ce.property.GetProperty_Long(PropertyDef.CurHp) == 0) { ce.property.PushModifer(PropertyDef.CurHp, ce.property.TotalHp, -(int)PropertyDef.CurHp); } } ce.property.SetProperty(PropertyDef.Level, level, true); } public static void Reset_GunProps(CombatEntity ce, List atts) { if (ce == null) { XLog.LogWarning($"ResetProps DoHandle entity is null"); return; } var prop = ce.property; if (prop == null) { XLog.LogWarning($"ResetProps DoHandle entity {ce.Name} property is null"); return; } if (atts != null) { var propertyComponent = ce.property; for (int i = 0; i < (int)PropertyDef.Size; i++) propertyComponent.PopModifer((PropertyDef)i, -i, true); #if UNITY_EDITOR StringBuilder sb = new StringBuilder(); sb.Append("战斗Gun属性数据: "); sb.Append(ce.creationIndex); sb.Append(" "); sb.Append(ce.Name); sb.Append(" "); #endif for (int i = 0; i < atts.Count; i++) { var propVal = atts[i]; #if UNITY_EDITOR sb.Append($"{(PropertyDef)propVal.Id} : {propVal.Value} , "); #endif propertyComponent.PushModifer_TenThousand((PropertyDef)propVal.Id, propVal.Value, -(propVal.Id)); } #if UNITY_EDITOR XLog.LogDebug(sb.ToString()); #endif } } public static void Reset_HeroBaseProps(CombatEntity ce, HeroPropViewOne heroPropViewOne, List cacheProps) { if (ce == null) { XLog.LogWarning($"ResetProps DoHandle entity is null"); return; } var prop = ce.property; if (prop == null) { XLog.LogWarning($"ResetProps DoHandle entity {ce.Name} property is null"); return; } if (heroPropViewOne != null) { var propertyComponent = ce.property; #if UNITY_EDITOR StringBuilder sb = new StringBuilder(); sb.Append("战斗Hero属性数据: "); sb.Append(ce.creationIndex); sb.Append(" "); sb.Append(ce.Name); sb.Append(" "); #endif if (propertyComponent.HasModifer()) { for (int i = 0; i < cacheProps.Count; i++) { propertyComponent.PopModifer((PropertyDef)cacheProps[i].Id, -cacheProps[i].Id); } } cacheProps.Clear(); for (int i = 0; i < heroPropViewOne.PropVal.Count; i++) { var propVal = heroPropViewOne.PropVal[i]; #if UNITY_EDITOR sb.Append($"{(PropertyDef)propVal.Id} : {propVal.Value} , "); #endif cacheProps.Add(propVal); propertyComponent.PushModifer_TenThousand((PropertyDef)propVal.Id, propVal.Value, -propVal.Id); } #if UNITY_EDITOR XLog.LogDebug(sb.ToString()); #endif } } public static void GetMonsterPropValue(CombatEntity ce, int monsterId) { ce.AddProperty(); var tbMonster = MonsterPropDescMgr.Instance.GetConfig(monsterId); if (tbMonster == null) { BattleLogger.LogInfo("MonsterProp cfg not found: " + monsterId); return; } var pc = ce.property; pc.PushModifer_TenThousand(PropertyDef.AtkFixedIncrease, tbMonster.Atk, -(int)PropertyDef.AtkFixedIncrease); pc.PushModifer_TenThousand(PropertyDef.DefFixedIncrease, tbMonster.Def, -(int)PropertyDef.DefFixedIncrease); pc.PushModifer_TenThousand(PropertyDef.HpFixedIncrease, tbMonster.HP, -(int)PropertyDef.HpFixedIncrease); pc.PushModifer_TenThousand(PropertyDef.SpeedFixedIncrease, tbMonster.MoveSpeed, -(int)PropertyDef.SpeedFixedIncrease); pc.PushModifer_TenThousand(PropertyDef.DamageRate, tbMonster.HurtRate, -(int)PropertyDef.DamageRate); pc.PushModifer_TenThousand(PropertyDef.DamageResistance, tbMonster.UnHurtRate, -(int)PropertyDef.DamageResistance); pc.PushModifer_TenThousand(PropertyDef.CriticalRate, tbMonster.CritRate, -(int)PropertyDef.CriticalRate); pc.PushModifer_TenThousand(PropertyDef.CriticalResistance, tbMonster.UnCritRate, -(int)PropertyDef.CriticalResistance); pc.PushModifer_TenThousand(PropertyDef.CriticalDamageIncrease, tbMonster.CritDamage, -(int)PropertyDef.CriticalDamageIncrease); pc.PushModifer_TenThousand(PropertyDef.Dodge1, tbMonster.EvadeRate, -(int)PropertyDef.Dodge1); pc.PushModifer_TenThousand(PropertyDef.HealingIncrease, tbMonster.HealRate, -(int)PropertyDef.HealingIncrease); pc.PushModifer_TenThousand(PropertyDef.StunRate, tbMonster.StunRate, -(int)PropertyDef.StunRate); pc.PushModifer_TenThousand(PropertyDef.StunResistance, tbMonster.UnStunRate, -(int)PropertyDef.StunResistance); pc.PushModifer_TenThousand(PropertyDef.HS_Rate, tbMonster.HS_Rate, -(int)PropertyDef.HS_Rate); pc.PushModifer_TenThousand(PropertyDef.HS_Resistance, tbMonster.HS_Resistance, -(int)PropertyDef.HS_Resistance); pc.PushModifer_TenThousand(PropertyDef.HS_DamageIncrease, tbMonster.HS_DamageIncrease, -(int)PropertyDef.HS_DamageIncrease); pc.PushModifer_TenThousand(PropertyDef.MagicPatch01, tbMonster.MonsterParam1, -(int)PropertyDef.MagicPatch01); pc.SetProperty_TenThousand(PropertyDef.CurHp, tbMonster.HP); pc.SetProperty_TenThousand(PropertyDef.LastLostHp, 0); } public static void AddProperty(this CombatEntity e) { e.AddProperty(e, null); SptPool.Malloc(ref e.property.container); e.property.container.Awake(); } } }