protected override void OnStart() { ActionNumPerTick = 1024; TickSleepTime = 10; LogSys.Log(LOG_TYPE.DEBUG, "thread {0} start.", cur_thread_id_); AttrCalculator.LoadConfig(); }
static public int constructor(IntPtr l) { try { GameFramework.AttrCalculator o; o = new GameFramework.AttrCalculator(); pushValue(l, true); pushValue(l, o); return(2); } catch (Exception e) { return(error(l, e)); } }
public static void Calc(EntityInfo npc, TableConfig.Skill cfg) { int oldHp = npc.Hp; AttrCalculator.CopyBaseProperty(npc); AttrCalculator.RefixAttrByImpact(npc); if (null != cfg) { RefixAttrBySkill(npc, cfg); } Calculator.Calc(npc.SceneContext, npc.ActualProperty, null, "attr"); if (oldHp > 0 && npc.Hp <= 0) { LogSystem.Error("hp calc to {0}", npc.Hp); Helper.LogCallStack(); } }
public void EnterScene(User newUser) { Msg_LR_RoomUserInfo lobbyUserData = newUser.LobbyUserData; if (null == lobbyUserData) { return; } TableConfig.Actor cfg = TableConfig.ActorProvider.Instance.GetActor(lobbyUserData.Hero); EntityInfo info = m_EntityMgr.AddEntity(0, lobbyUserData.Camp, cfg, string.Empty); info.SetUnitId(EntityInfo.c_StartUserUnitId + info.GetId()); info.GetMovementStateInfo().FormationIndex = 0; if (null != m_SceneConfig) { info.GetMovementStateInfo().SetPosition2D(m_SceneConfig.EnterX + (Helper.Random.NextFloat() - 0.5f) * m_SceneConfig.EnterRadius, m_SceneConfig.EnterY + (Helper.Random.NextFloat() - 0.5f) * m_SceneConfig.EnterRadius); } newUser.Info = info; AttrCalculator.Calc(info); if (newUser.HaveHpArmor) { info.Hp = newUser.Hp; info.Energy = newUser.Energy; } else { info.Hp = newUser.Info.HpMax; info.Energy = newUser.Info.EnergyMax; } info.SceneContext = m_SceneContext; AddCareList(info); if (newUser.IsEntered) { var args = m_StorySystem.NewBoxedValueList(); args.Add(info.GetId()); args.Add(info.GetUnitId()); args.Add(info.GetCampId()); args.Add(info.GetMovementStateInfo().PositionX); args.Add(info.GetMovementStateInfo().PositionZ); m_StorySystem.SendMessage("user_enter_scene", args); } }
internal void EnterScene(User newUser) { Msg_LR_RoomUserInfo lobbyUserData = newUser.LobbyUserData; if (null == lobbyUserData) { return; } TableConfig.Actor cfg = TableConfig.ActorProvider.Instance.GetActor(lobbyUserData.Hero); EntityInfo info = m_EntityMgr.AddEntity(0, lobbyUserData.Camp, cfg, (int)AiStateLogicId.Entity_Leader); info.SetUnitId(EntityInfo.c_StartUserUnitId + info.GetId()); info.GetMovementStateInfo().FormationIndex = 0; if (null != m_SceneConfig) { info.GetMovementStateInfo().SetPosition2D(m_SceneConfig.EnterX + (Helper.Random.NextFloat() - 0.5f) * m_SceneConfig.EnterRadius, m_SceneConfig.EnterY + (Helper.Random.NextFloat() - 0.5f) * m_SceneConfig.EnterRadius); } newUser.Info = info; AttrCalculator.Calc(info); if (newUser.HaveHpArmor) { info.SetHp(Operate_Type.OT_Absolute, newUser.Hp); info.SetEnergy(Operate_Type.OT_Absolute, newUser.Energy); } else { info.SetHp(Operate_Type.OT_Absolute, newUser.Info.GetActualProperty().HpMax); info.SetEnergy(Operate_Type.OT_Absolute, newUser.Info.GetActualProperty().EnergyMax); } info.SceneContext = m_SceneContext; AddCareList(info); if (newUser.IsEntered) { m_StorySystem.SendMessage("user_enter_scene", info.GetId(), info.GetUnitId(), info.GetCampId(), info.GetMovementStateInfo().PositionX, info.GetMovementStateInfo().PositionZ); } }
private void TickEntities() { m_DeletedEntities.Clear(); for (LinkedListNode <EntityInfo> linkNode = m_EntityMgr.Entities.FirstNode; null != linkNode; linkNode = linkNode.Next) { EntityInfo info = linkNode.Value; info.RetireAttackerInfos(60000); if (info.LevelChanged || info.GetSkillStateInfo().BuffChanged) { AttrCalculator.Calc(info); info.LevelChanged = false; info.GetSkillStateInfo().BuffChanged = false; } if (info.IsBorning) { if (info.BornTime <= 0) { SkillInfo skillInfo = info.GetSkillStateInfo().GetSkillInfoById(info.BornSkillId); if (info.BornSkillId > 0 && null != skillInfo) { info.BornTime = TimeUtility.GetLocalMilliseconds(); } else { info.IsBorning = false; info.BornTime = 0; info.SetAIEnable(true); info.RemoveState(CharacterPropertyEnum.x3009_无敌); } } else if (info.BornTime + info.BornTimeout < TimeUtility.GetLocalMilliseconds()) { info.IsBorning = false; info.BornTime = 0; info.SetAIEnable(true); info.RemoveState(CharacterPropertyEnum.x3009_无敌); } } if (info.IsDead() && !info.NeedDelete) { if (info.DeadTime <= 0) { CalcKillIncome(info); //发送npc死亡消息 Msg_RC_NpcDead npcDeadBuilder = new Msg_RC_NpcDead(); npcDeadBuilder.npc_id = info.GetId(); NotifyAllUser(RoomMessageDefine.Msg_RC_NpcDead, npcDeadBuilder); SkillInfo skillInfo = info.GetSkillStateInfo().GetSkillInfoById(info.DeadSkillId); if (info.DeadSkillId > 0 && null != skillInfo) { info.DeadTime = TimeUtility.GetLocalMilliseconds(); OnEntityKilled(info); } else { if (null == info.CustomData as User) { info.DeadTime = 0; info.NeedDelete = true; OnEntityKilled(info); } else { info.DeadTime = TimeUtility.GetLocalMilliseconds(); } } } else { if (null == info.CustomData as User && info.DeadTime + info.DeadTimeout < TimeUtility.GetLocalMilliseconds()) { info.DeadTime = 0; info.NeedDelete = true; //重新发送npc死亡消息 Msg_RC_NpcDead npcDeadBuilder = new Msg_RC_NpcDead(); npcDeadBuilder.npc_id = info.GetId(); NotifyAllUser(RoomMessageDefine.Msg_RC_NpcDead, npcDeadBuilder); } else if (null != info.CustomData as User && info.DeadTime + info.ReliveTimeout < TimeUtility.GetLocalMilliseconds()) { info.DeadTime = 0; info.Hp = info.HpMax; info.Energy = info.EnergyMax; Msg_RC_SyncProperty npcProp = DataSyncUtility.BuildSyncPropertyMessage(info); NotifyAllUser(RoomMessageDefine.Msg_RC_SyncProperty, npcProp); } } } if (info.NeedDelete) { m_DeletedEntities.Add(info); } } if (m_DeletedEntities.Count > 0) { int enemyCt = 0; int friendCt = 0; Msg_RC_DestroyNpc destroyNpcBuilder = new Msg_RC_DestroyNpc(); for (int i = 0; i < m_DeletedEntities.Count; ++i) { EntityInfo ni = m_DeletedEntities[i]; if (CharacterRelation.RELATION_ENEMY == EntityInfo.GetRelation((int)CampIdEnum.Blue, ni.GetCampId())) { ++enemyCt; } else if (CharacterRelation.RELATION_FRIEND == EntityInfo.GetRelation((int)CampIdEnum.Blue, ni.GetCampId())) { ++friendCt; } //发送npc消失消息 destroyNpcBuilder.npc_id = ni.GetId(); NotifyAllUser(RoomMessageDefine.Msg_RC_DestroyNpc, destroyNpcBuilder); DestroyEntity(ni); } TryAllKilledOrAllDied(enemyCt > 0, friendCt > 0); } m_EntityMgr.ExecuteDelayAdd(); }
public void ImpactDamage(int srcObjId, int targetId, int impactId, int seq, bool isFinal) { if (!PluginFramework.Instance.IsBattleScene) { return; } EntityViewModel view = GetEntityViewById(targetId); EntityViewModel srcView = GetEntityViewById(srcObjId); if (null != view && null != view.Entity && null != view.Actor) { EntityInfo targetObj = view.Entity; EntityInfo srcObj = null; if (null != srcView && null != srcView.Entity) { srcObj = srcView.Entity; } if (null != targetObj && !view.Entity.IsDeadSkillCasting()) { ImpactInfo impactInfo = targetObj.GetSkillStateInfo().GetImpactInfoBySeq(seq); if (null != impactInfo && impactId == impactInfo.ImpactId) { EntityInfo ownerObj = GetRootSummoner(srcObj); int ownerId = 0; if (null != ownerObj) { ownerId = ownerObj.GetId(); } int addsc = impactInfo.DamageData.AddSc; int adduc = impactInfo.DamageData.AddUc; int index = impactInfo.CurDamageCount; ++impactInfo.CurDamageCount; int multiple = impactInfo.DamageData.GetMultiple(index); int damage = impactInfo.DamageData.GetDamage(index); long hitrate = 0; long critrate = 0; long blockrate = 0; long phyDamage = 0; long magDamage = 0; hitrate = AttrCalculator.Calc(targetObj.SceneContext, impactInfo.SenderProperty, targetObj.ActualProperty, "hitrate"); critrate = AttrCalculator.Calc(targetObj.SceneContext, impactInfo.SenderProperty, targetObj.ActualProperty, "critrate"); blockrate = AttrCalculator.Calc(targetObj.SceneContext, impactInfo.SenderProperty, targetObj.ActualProperty, "blockrate"); long rnd = Helper.Random.Next(); long critonoff = 0; long blockonoff = 0; if (rnd <= critrate) { critonoff = 1; } else if (rnd > critrate && rnd <= critrate + blockrate) { blockonoff = 1; } impactInfo.DamageData.IsCritical = critonoff > 0; impactInfo.DamageData.IsBlock = blockonoff > 0; phyDamage = AttrCalculator.Calc(targetObj.SceneContext, impactInfo.SenderProperty, targetObj.ActualProperty, "phydamage", multiple, damage, critonoff, blockonoff); magDamage = AttrCalculator.Calc(targetObj.SceneContext, impactInfo.SenderProperty, targetObj.ActualProperty, "magdamage", multiple, damage, critonoff, blockonoff); damage = (int)(phyDamage + magDamage); if (damage < 0) { damage = 0; } int vampire = impactInfo.DamageData.GetVampire(index); bool isKiller = false; if (targetObj.Shield >= damage) { targetObj.Shield -= (int)damage; } else if (targetObj.Shield > 0) { int leftDamage = (int)damage - targetObj.Shield; targetObj.Shield = 0; if (targetObj.GetId() == PluginFramework.Instance.LeaderID && targetObj.Hp <= leftDamage) { //队长不死,demo专用代码 } else { targetObj.Hp -= (int)leftDamage; if (targetObj.Hp <= 0) { isKiller = true; } } } else { if (targetObj.GetId() == PluginFramework.Instance.LeaderID && targetObj.Hp <= damage) { //队长不死,demo专用代码 } else { targetObj.Hp -= (int)damage; if (targetObj.Hp <= 0) { isKiller = true; } } } if (isKiller) { targetObj.GetCombatStatisticInfo().AddDeadCount(1); if (null != srcObj) { EntityInfo killer = srcObj; if (killer.SummonerId > 0) { EntityViewModel npcViewModel = GetEntityViewById(killer.SummonerId); if (null != npcViewModel) { killer = npcViewModel.Entity; } } if (targetObj.EntityType == (int)EntityTypeEnum.Tower) { killer.GetCombatStatisticInfo().AddKillTowerCount(1); } else if (targetObj.EntityType == (int)EntityTypeEnum.Hero) { killer.GetCombatStatisticInfo().AddKillHeroCount(1); killer.GetCombatStatisticInfo().AddMultiKillCount(1); } else { killer.GetCombatStatisticInfo().AddKillNpcCount(1); } } } targetObj.SetAttackerInfo(srcObjId, isKiller, true, false, (int)damage, 0); } } } }
private void TickEntities() { m_DeletedEntities.Clear(); for (LinkedListNode <EntityInfo> linkNode = m_EntityManager.Entities.FirstValue; null != linkNode; linkNode = linkNode.Next) { EntityInfo info = linkNode.Value; info.RetireAttackerInfos(10000); if (info.LevelChanged || info.GetSkillStateInfo().BuffChanged) { AttrCalculator.Calc(info); info.LevelChanged = false; info.GetSkillStateInfo().BuffChanged = false; } if (info.IsBorning) { if (info.BornTime <= 0) { SkillInfo skillInfo = info.GetSkillStateInfo().GetSkillInfoById(info.BornSkillId); if (info.BornSkillId > 0 && null != skillInfo) { info.BornTime = TimeUtility.GetLocalMilliseconds(); GfxSkillSystem.Instance.StartSkill(info.GetId(), skillInfo.ConfigData, 0); } else { info.IsBorning = false; info.BornTime = 0; info.SetAIEnable(true); info.SetStateFlag(Operate_Type.OT_RemoveBit, CharacterState_Type.CST_Invincible); } } else if (info.BornTime + info.BornTimeout < TimeUtility.GetLocalMilliseconds()) { info.IsBorning = false; info.BornTime = 0; info.SetAIEnable(true); info.SetStateFlag(Operate_Type.OT_RemoveBit, CharacterState_Type.CST_Invincible); } } if (info.IsDead() && !info.NeedDelete) { if (info.CanDead) { if (info.DeadTime <= 0) { SkillInfo skillInfo = info.GetSkillStateInfo().GetSkillInfoById(info.DeadSkillId); if (info.DeadSkillId > 0 && null != skillInfo) { info.DeadTime = TimeUtility.GetLocalMilliseconds(); GfxSkillSystem.Instance.StopAllSkill(info.GetId(), true, false, true); GfxSkillSystem.Instance.StartSkill(info.GetId(), skillInfo.ConfigData, 0); OnEntityKilled(info); EntityDrop(info); // 掉落 } else { info.DeadTime = 0; info.NeedDelete = true; OnEntityKilled(info); EntityDrop(info); // 掉落 } } else if (info.DeadTime + info.DeadTimeout < TimeUtility.GetLocalMilliseconds()) { info.DeadTime = 0; info.NeedDelete = true; } } else { info.CanDead = true; } } else { //每个tick复位CanDead,技能里需要鞭尸时应使用触发器每帧标记目标不可死亡(keeplive) info.CanDead = true; } if (info.NeedDelete) { m_DeletedEntities.Add(info); } } if (m_DeletedEntities.Count > 0) { int enemyCt = 0; int friendCt = 0; for (int i = 0; i < m_DeletedEntities.Count; ++i) { EntityInfo ni = m_DeletedEntities[i]; if (CharacterRelation.RELATION_ENEMY == EntityInfo.GetRelation(CampId, ni.GetCampId())) { ++enemyCt; } else if (CharacterRelation.RELATION_FRIEND == EntityInfo.GetRelation(CampId, ni.GetCampId())) { ++friendCt; } DestroyEntity(ni); } TryAllKilledOrAllDied(enemyCt > 0, friendCt > 0); } }
public void LoadData(TableConfig.Actor cfg) { m_ConfigData = cfg; BaseProperty.ConfigData = cfg; BaseProperty.Owner = this; ActualProperty.ConfigData = cfg; ActualProperty.Owner = this; TableConfig.SkillEventProvider.Instance.skillEventTable.TryGetValue(cfg.id, out m_SkillEventConfigData); SetLinkId(cfg.id); SetModel(cfg.avatar); EntityType = cfg.type; m_Radius = cfg.size; m_ViewRange = cfg.viewrange; m_GohomeRange = cfg.gohomerange; float maxAttackRange = 0; if (cfg.skill0 > 0) { SkillInfo info = new SkillInfo(cfg.skill0); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.skillData.distance) { maxAttackRange = info.ConfigData.skillData.distance; } m_AutoSkillIds.Add(cfg.skill0); } if (cfg.skill1 > 0) { SkillInfo info = new SkillInfo(cfg.skill1); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.skillData.distance) { maxAttackRange = info.ConfigData.skillData.distance; } m_AutoSkillIds.Add(cfg.skill1); } if (cfg.skill2 > 0) { SkillInfo info = new SkillInfo(cfg.skill2); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.skillData.distance) { maxAttackRange = info.ConfigData.skillData.distance; } m_AutoSkillIds.Add(cfg.skill2); } if (cfg.skill3 > 0) { SkillInfo info = new SkillInfo(cfg.skill3); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.skillData.distance) { maxAttackRange = info.ConfigData.skillData.distance; } m_AutoSkillIds.Add(cfg.skill3); } if (cfg.skill4 > 0) { SkillInfo info = new SkillInfo(cfg.skill4); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.skillData.distance) { maxAttackRange = info.ConfigData.skillData.distance; } m_ManualSkillId = cfg.skill4; } if (cfg.skill5 > 0) { SkillInfo info = new SkillInfo(cfg.skill5); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill5); } if (cfg.skill6 > 0) { SkillInfo info = new SkillInfo(cfg.skill6); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill6); } if (cfg.skill7 > 0) { SkillInfo info = new SkillInfo(cfg.skill7); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill7); } if (cfg.skill8 > 0) { SkillInfo info = new SkillInfo(cfg.skill8); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill8); } if (cfg.bornskill > 0) { SkillInfo info = new SkillInfo(cfg.bornskill); GetSkillStateInfo().AddSkill(info); m_BornSkillId = cfg.bornskill; } if (cfg.deadskill > 0) { SkillInfo info = new SkillInfo(cfg.deadskill); GetSkillStateInfo().AddSkill(info); m_DeadSkillId = cfg.deadskill; } foreach (var pair in TableConfig.AttrDefineProvider.Instance.AttrDefineMgr.GetData()) { TableConfig.AttrDefine def = pair.Value as TableConfig.AttrDefine; BaseProperty.SetInt((CharacterPropertyEnum)def.id, def.value); } InitProperty(CharacterPropertyEnum.x1001_基础物理攻击, cfg.x1001); InitProperty(CharacterPropertyEnum.x1002_物理攻击成长, cfg.x1002); InitProperty(CharacterPropertyEnum.x1006_基础法术攻击, cfg.x1006); InitProperty(CharacterPropertyEnum.x1007_法术攻击成长, cfg.x1007); InitProperty(CharacterPropertyEnum.x1011_基础物理防御, cfg.x1011); InitProperty(CharacterPropertyEnum.x1012_物理防御成长, cfg.x1012); InitProperty(CharacterPropertyEnum.x1016_基础法术防御, cfg.x1016); InitProperty(CharacterPropertyEnum.x1017_法术防御成长, cfg.x1017); InitProperty(CharacterPropertyEnum.x1021_暴击等级, cfg.x1021); InitProperty(CharacterPropertyEnum.x1022_抗暴击等级, cfg.x1022); InitProperty(CharacterPropertyEnum.x1024_命中等级, cfg.x1024); InitProperty(CharacterPropertyEnum.x1026_闪避等级, cfg.x1026); InitProperty(CharacterPropertyEnum.x1028_破击等级, cfg.x1028); InitProperty(CharacterPropertyEnum.x1030_格挡等级, cfg.x1030); InitProperty(CharacterPropertyEnum.x1032_格挡强度, cfg.x1032); InitProperty(CharacterPropertyEnum.x1033_暴击伤害, cfg.x1033); InitProperty(CharacterPropertyEnum.x1034_暴击伤害减免, cfg.x1034); InitProperty(CharacterPropertyEnum.x2001_基础生命, cfg.x2001); InitProperty(CharacterPropertyEnum.x2002_生命成长, cfg.x2002); InitProperty(CharacterPropertyEnum.x2007_基础速度, cfg.x2007); InitProperty(CharacterPropertyEnum.x2008_速度成长, cfg.x2008); InitProperty(CharacterPropertyEnum.x4001_职业, cfg.x4001); InitProperty(CharacterPropertyEnum.x4002_阵营, cfg.x4002); InitProperty(CharacterPropertyEnum.x4003_品质, cfg.x4003); InitProperty(CharacterPropertyEnum.x4004_性别, cfg.x4004); AttrCalculator.Calc(this); Hp = ActualProperty.GetInt(CharacterPropertyEnum.x2005_最大生命值); }
public void LoadData(TableConfig.Actor cfg) { m_ConfigData = cfg; SetLinkId(cfg.id); SetModel(cfg.avatar); EntityType = cfg.type; m_Radius = cfg.size; float maxAttackRange = 0; if (cfg.skill0 > 0) { SkillInfo info = new SkillInfo(cfg.skill0); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.distance) { maxAttackRange = info.ConfigData.distance; } m_NormalSkillId = cfg.skill0; m_AutoSkillIds.Add(cfg.skill0); } if (cfg.skill1 > 0) { SkillInfo info = new SkillInfo(cfg.skill1); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.distance) { maxAttackRange = info.ConfigData.distance; } m_AutoSkillIds.Add(cfg.skill1); } if (cfg.skill2 > 0) { SkillInfo info = new SkillInfo(cfg.skill2); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.distance) { maxAttackRange = info.ConfigData.distance; } m_AutoSkillIds.Add(cfg.skill2); } if (cfg.skill3 > 0) { SkillInfo info = new SkillInfo(cfg.skill3); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.distance) { maxAttackRange = info.ConfigData.distance; } m_AutoSkillIds.Add(cfg.skill3); } if (cfg.skill4 > 0) { SkillInfo info = new SkillInfo(cfg.skill4); GetSkillStateInfo().AddSkill(info); if (maxAttackRange < info.ConfigData.distance) { maxAttackRange = info.ConfigData.distance; } m_ManualSkillId = cfg.skill4; //m_AutoSkillIds.Add(cfg.skill4); } if (cfg.skill5 > 0) { SkillInfo info = new SkillInfo(cfg.skill5); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill5); } if (cfg.skill6 > 0) { SkillInfo info = new SkillInfo(cfg.skill6); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill6); } if (cfg.skill7 > 0) { SkillInfo info = new SkillInfo(cfg.skill7); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill7); } if (cfg.skill8 > 0) { SkillInfo info = new SkillInfo(cfg.skill8); GetSkillStateInfo().AddSkill(info); m_PassiveSkillIds.Add(cfg.skill8); } if (cfg.bornskill > 0) { SkillInfo info = new SkillInfo(cfg.bornskill); GetSkillStateInfo().AddSkill(info); m_BornSkillId = cfg.bornskill; } if (cfg.deadskill > 0) { SkillInfo info = new SkillInfo(cfg.deadskill); GetSkillStateInfo().AddSkill(info); m_DeadSkillId = cfg.deadskill; } ViewRange = cfg.viewrange; GohomeRange = cfg.gohomerange; GetBaseProperty().SetRps(Operate_Type.OT_Absolute, 1); GetBaseProperty().SetAttackBase(Operate_Type.OT_Absolute, cfg.attack); GetBaseProperty().SetDefenceBase(Operate_Type.OT_Absolute, cfg.defence); GetBaseProperty().SetAttackRange(Operate_Type.OT_Absolute, maxAttackRange); GetBaseProperty().SetHpMax(Operate_Type.OT_Absolute, cfg.hp); GetBaseProperty().SetEnergyMax(Operate_Type.OT_Absolute, cfg.mp); GetBaseProperty().SetMoveSpeed(Operate_Type.OT_Absolute, cfg.speed); AttrCalculator.Calc(this); SetHp(Operate_Type.OT_Absolute, GetActualProperty().HpMax); SetEnergy(Operate_Type.OT_Absolute, GetActualProperty().EnergyMax); }