// 离开触发状态(继承自sdBehaviourState)aa public override void DoLeaveState() { if (mIsInState != false) { mIsInState = false; if (mExecuteStatus) { MonsterAutoFight kMonsterAutoFight = mBehaviourAdvancedState.MonsterAutoFightComponent; if (kMonsterAutoFight != null) { sdGameMonster kMonster = kMonsterAutoFight.Actor as sdGameMonster; if (kMonster != null) { Renderer[] akRenderer = kMonster.RenderNode.GetComponentsInChildren <Renderer>(); if (akRenderer != null) { for (int i = 0; i < akRenderer.GetLength(0); ++i) { Renderer kRenderer = akRenderer[i]; if (kRenderer.gameObject.name.Equals(mMeshName)) { kRenderer.enabled = mMeshStatus; break; } } } } } } } }
// 查找场景中的怪物,生成唯一ID和模板ID的表格aa static bool CreateMonsterXmlByLevelID(string levelID) { XmlDocument xmldoc = new XmlDocument(); XmlElement root = xmldoc.CreateElement("Monsters"); int id = (int.Parse(levelID) % 10) - 1; List <sdGameMonster> kMonsterList = FindMonster(1 << id); if (kMonsterList != null) { for (int i = 0; i < kMonsterList.Count; i++) { sdGameMonster kMonster = kMonsterList[i]; if (kMonster != null) { XmlElement monElement = xmldoc.CreateElement("Monster"); monElement.SetAttribute("ID", kMonster.uniqueId.ToString()); monElement.SetAttribute("TemplateID", kMonster.templateId.ToString()); root.AppendChild(monElement); } } xmldoc.AppendChild(root); xmldoc.Save(Application.dataPath + "/MonsterConf/" + levelID + ".xml"); return(true); } return(false); }
// 离开触发状态(继承自sdBehaviourState)aa public override void DoLeaveState() { if (mIsInState != false) { mIsInState = false; if (mExecuteStatus) { MonsterAutoFight kMonsterAutoFight = mBehaviourAdvancedState.MonsterAutoFightComponent; if (kMonsterAutoFight != null) { sdGameMonster kMonster = kMonsterAutoFight.Actor as sdGameMonster; if (kMonster != null) { if (kMonster.skillTree != null) { sdSkill kSkill = kMonster.skillTree.getSkill(mSkillID); if (kSkill != null) { kSkill.skillEnabled = mSkillStatus; } } } } } } }
// 设置所属角色(继承自AutoFight)aa public override void SetActor(sdGameActor _gameActor) { base.SetActor(_gameActor); mMonster = (sdGameMonster)_gameActor; mBehaviourAdvancedState.SetMonsterAutoFight(this); //< 初始化触发战斗系统aa }
// 更新触发状态(继承自sdBehaviourState)aa public override void UpdateState() { if (mIsInState == true) { mCurrentDelayTime -= Time.deltaTime; if (mCurrentDelayTime <= 0.0f) { MonsterAutoFight kMonsterAutoFight = mBehaviourAdvancedState.MonsterAutoFightComponent; PetAutoFight kPetAutoFight = kMonsterAutoFight as PetAutoFight; if (kPetAutoFight != null) { sdGameMonster kMonster = kMonsterAutoFight.Actor as sdGameMonster; if (kMonster != null) { int iSkillID = mSkillID; if (iSkillID == -1 || iSkillID == 0) { iSkillID = (int)kMonster.Property["SpSkill"]; //< 尝试获取手动技能aa } int iErroeCode = 0; kPetAutoFight.DoXPSkill(iSkillID, ref iErroeCode); } } mCurrentDelayTime = 0.0f; } } }
// 更新触发状态(继承自sdBehaviourState)aa public override void UpdateState() { if (mIsInState == true) { mCurrentDelayTime -= Time.deltaTime; if (mCurrentDelayTime <= 0.0f) { if (mExecuteStatus) { return; } mExecuteStatus = true; MonsterAutoFight kMonsterAutoFight = mBehaviourAdvancedState.MonsterAutoFightComponent; if (kMonsterAutoFight != null) { sdGameMonster kMonster = kMonsterAutoFight.Actor as sdGameMonster; if (kMonster != null) { if (kMonster.skillTree != null) { sdSkill kSkill = kMonster.skillTree.getSkill(mSkillID); if (kSkill != null) { mSkillStatus = kSkill.skillEnabled; kSkill.skillEnabled = false; } } } } } } }
// 更新触发状态(继承自sdBehaviourState)aa public override void UpdateState() { if (mIsInState == true) { mCurrentDelayTime -= Time.deltaTime; if (mCurrentDelayTime <= 0.0f) { if (mExecuteStatus) { return; } mExecuteStatus = true; MonsterAutoFight kMonsterAutoFight = mBehaviourAdvancedState.MonsterAutoFightComponent; if (kMonsterAutoFight != null) { sdGameMonster kMonster = kMonsterAutoFight.Actor as sdGameMonster; if (kMonster != null) { AnimationState kAnimationState = kMonster.AnimController[mAnimationName]; if (kAnimationState != null) { kMonster.logicTSM.ForceStop(); //< 强制停止当前技能aa kAnimationState.layer = 11; kAnimationState.wrapMode = WrapMode.Once; kMonster.AnimController.Play(mAnimationName); } } } } } }
// 更新触发状态(继承自sdBehaviourState)aa public override void UpdateState() { if (mIsInState == true) { mCurrentDelayTime -= Time.deltaTime; if (mCurrentDelayTime <= 0.0f) { if (mExecuteStatus) { return; } mExecuteStatus = true; MonsterAutoFight kMonsterAutoFight = mBehaviourAdvancedState.MonsterAutoFightComponent; if (kMonsterAutoFight != null) { sdGameMonster kMonster = kMonsterAutoFight.Actor as sdGameMonster; if (kMonster != null) { kMonster.RemoveBuff(mBuffID); } } } } }
// 更新触发状态(继承自sdBehaviourState)aa public override void UpdateState() { if (mIsInState == true) { mCurrentDelayTime -= Time.deltaTime; if (mCurrentDelayTime <= 0.0f) { if (mExecuteStatus) { return; } mExecuteStatus = true; MonsterAutoFight kMonsterAutoFight = mBehaviourAdvancedState.MonsterAutoFightComponent; if (kMonsterAutoFight != null) { sdGameMonster kMonster = kMonsterAutoFight.Actor as sdGameMonster; if (kMonster != null) { mOldLayerIndex = kMonster.gameObject.layer; kMonster.gameObject.layer = LayerMask.NameToLayer(mLayerName); } } } } }
// 反激活好友宠物aa public void DeactiveFriendPet() { if (mFriendPet == null) { return; } // mFriendPet.NotifyKilled -= OnFriendPetKilled; // if (mFriendPet.Master != null) { mFriendPet.Master = null; } // mFriendPet.SetCurrentHP(-1); mFriendPet.AddHP(0); // 更新界面aa GameObject kFightUI = GameObject.Find("FightUi"); if (kFightUI != null) { kFightUI.GetComponent <sdFightUi>().RefreshPet(); } // mFriendPet = null; }
// 初始化胜利动画aa public void InitVictory(sdGameMonster obj) { oldrot = GetComponent <Camera>().transform.localRotation; Time.timeScale = 0.2f; boss = obj; VectoryTime = 0.0f; bVectory = true; }
// 区域中的怪物被攻击事件回调aa protected void NotifyMonsterHurt(sdActorInterface kActor, sdActorInterface kAttacker, int iHurt) { foreach (GameObject kChild in mMonsterList) { sdGameMonster kMonster = kChild.GetComponent <sdGameMonster>(); if (kMonster != null && kMonster != kActor) { kMonster.OnAreaGroupAlert(kAttacker); } } }
public override void OnTriggerHitted(GameObject obj, int[] param) { base.OnTriggerHitted(obj, param); // 杀死所有怪物aa sdMainChar kMainChar = sdGameLevel.instance.mainChar; List <sdActorInterface> lstActor = sdGameLevel.instance.actorMgr.FindActor( kMainChar, HeaderProto.ESkillObjType.SKILL_OBJ_ENEMY, kMainChar.transform.position, Vector3.zero, 1, 0, 10000.0f, true); if (lstActor != null) { foreach (sdActorInterface a in lstActor) { if (a.actorType == ActorType.AT_Monster) { int hp = a["HP"]; a.AddHP(-hp); } } } // 禁用所有的按键和手势响应aa sdGameLevel.instance.DestroyFingerObject(); sdGameLevel.instance.mainChar.AddDebuffState(HeaderProto.ECreatureActionState.CREATURE_ACTION_STATE_STAY); sdGameLevel.instance.mainChar.AddDebuffState(HeaderProto.ECreatureActionState.CREATURE_ACTION_STATE_LIMIT_SKILL); GPUSH_API.Vibrate(500); // 初始化胜利动画aa sdGameMonster kMonster = obj.GetComponent <sdGameMonster>(); sdGameLevel.instance.mainCamera.InitVictory(kMonster); // 请求结算aa if (sdUICharacter.Instance.GetBattleType() == (byte)HeaderProto.LEVEL_BATTLE_TYPE.LEVEL_BATTLE_TYPE_WORLD_BOSS) { sdActGameMsg.Send_CS_WB_RESULT_REQ(0); sdActGameMsg.OnWorldBossBeKilled(); } else { Debug.Log("TuituEnd and Request Jiesuan!"); sdGameLevel.instance.tuiTuLogic.ShowFightResult(obj); } }
// 宠物加载回调aa protected void OnLoadPet(ResLoadParams kParam, UnityEngine.Object kObj) { if (kObj == null) { return; } if (m_pvpRival == null) { return; } Hashtable kPetProperty = mActivePet; if (kPetProperty == null) { return; } Vector3 kPlayerPos = m_pvpRival.transform.position; Vector3 kBornPosition = kPlayerPos; float fFollowDistance = ((int)(kPetProperty["FollowDistance"])) / 1000.0f; sdTuiTuLogic.BornPosition(kPlayerPos, fFollowDistance, ref kBornPosition); GameObject kPetObj = GameObject.Instantiate(kObj, kBornPosition, Quaternion.identity) as GameObject; sdGameMonster kActivePet = kPetObj.GetComponent <sdGameMonster>(); if (kActivePet != null) { kActivePet.templateId = (int)kPetProperty["TemplateID"]; kActivePet.bornLive = true; kActivePet.DBID = (ulong)kPetProperty["DBID"]; kActivePet.Master = m_pvpRival; m_pvpRival.Retainer = kActivePet; kActivePet.NotifyKilled += OnPetKilled; kActivePet.ChangeGroupID(GroupIDType.GIT_MonsterA); // 宠物战队Buffaa List <int> kBuffList = GetPetGroupBuff(kActivePet); if (kBuffList != null) { foreach (int iBuffId in kBuffList) { kActivePet.AddBuff(iBuffId, 0, kActivePet); } } } }
public virtual void PlayHitEffect(sdActorInterface monster) { if (stateData != null) { string strHitEffect = stateData["HitEffect"] as string; if (strHitEffect.Length > 0) { int hitEffectLife = (int)stateData["HitEffectLife"]; float fLife = hitEffectLife * 0.001f; Transform bindnode = monster.transform; if (monster.actorType == ActorType.AT_Monster) { sdGameMonster actor = (sdGameMonster)monster; if (actor.ChestPoint.Length > 0) { GameObject chest = actor.GetNode(actor.ChestPoint.Replace("\r\n", "")); if (chest != null) { bindnode = chest.transform; } } } else if (monster.actorType == ActorType.AT_Player) { if (stateData.ContainsKey("HitDummy")) { int pos = (int)stateData["HitDummy"]; if (pos == 1) { sdGameActor gameactor = (sdGameActor)monster; GameObject chest = gameactor.GetNode("Bip01 Spine"); if (chest != null) { bindnode = chest.transform; } } } } bool bRotate = true; if (stateData.ContainsKey("HitEffectRotate")) { bRotate = ((int)stateData["HitEffectRotate"] == 1); } sdActorInterface.AddHitEffect(strHitEffect, bindnode, fLife, Vector3.zero, bRotate); } } }
// 反激活当前出战宠物aa public void DeactivePet() { if (mActivePet == null) { return; } // mActivePet.NotifyKilled -= OnPetKilled; // Hashtable kPetProp = sdNewPetMgr.Instance.GetPetPropertyFromDBID(mActivePet.DBID); if (kPetProp != null) { int iCurHP = mActivePet.GetCurrentHP(); if (iCurHP < 0) { iCurHP = 0; } kPetProp["HP"] = iCurHP; //< 写回当前血量aa } // if (mActivePet.Master != null) { sdGameActor kActor = mActivePet.Master as sdGameActor; kActor.Retainer = null; mActivePet.Master = null; } // mActivePet.SetCurrentHP(-1); mActivePet.AddHP(0); // 更新界面aa GameObject kFightUI = GameObject.Find("FightUi"); if (kFightUI != null) { kFightUI.GetComponent <sdFightUi>().RefreshPet(); } mActivePet = null; }
// 查找指定节点下的Monster对象aa static void FindMonster(Transform kTransform, List <sdGameMonster> kMonsterList) { if (kTransform.gameObject.tag == "Monster") { sdGameMonster kMonster = kTransform.GetComponent <sdGameMonster>(); if (kMonster != null) { kMonsterList.Add(kMonster); return; } } for (int i = 0; i < kTransform.childCount; i++) { FindMonster(kTransform.GetChild(i), kMonsterList); } }
// 离开触发状态(继承自sdBehaviourState)aa public override void DoLeaveState() { if (mIsInState != false) { mIsInState = false; if (mExecuteStatus) { MonsterAutoFight kMonsterAutoFight = mBehaviourAdvancedState.MonsterAutoFightComponent; if (kMonsterAutoFight != null) { sdGameMonster kMonster = kMonsterAutoFight.Actor as sdGameMonster; if (kMonster != null) { kMonster.AddBuff(mBuffID, 0, kMonster); } } } } }
// 离开触发状态(继承自sdBehaviourState)aa public override void DoLeaveState() { if (mIsInState != false) { mIsInState = false; if (mExecuteStatus) { MonsterAutoFight kMonsterAutoFight = mBehaviourAdvancedState.MonsterAutoFightComponent; if (kMonsterAutoFight != null) { sdGameMonster kMonster = kMonsterAutoFight.Actor as sdGameMonster; if (kMonster != null) { kMonster.gameObject.layer = mOldLayerIndex; } } } } }
protected bool mMonsterFindFirstTarget = false; //< 防止函数被嵌套调用aa protected void NotifyMonsterFindFirstTarget(sdActorInterface kActor, sdActorInterface kPreviousTarget, sdActorInterface kTarget) { if (mMonsterFindFirstTarget) { return; } mMonsterFindFirstTarget = true; if (kPreviousTarget == null && kTarget != null) { foreach (GameObject kChild in mMonsterList) { sdGameMonster kMonster = kChild.GetComponent <sdGameMonster>(); if (kMonster != null && kMonster != kActor) { kMonster.OnAreaGroupAlert(kTarget); } } } mMonsterFindFirstTarget = false; }
// public void SetMonsterStatus(HeaderProto.ECreatureActionState[] state, bool bAdd) { for (int i = 0; i < mMonsterList.Count; i++) { GameObject obj = mMonsterList[i]; sdGameMonster monster = obj.GetComponent <sdGameMonster>(); if (monster != null) { for (int j = 0; j < state.Length; j++) { if (bAdd) { monster.AddDebuffState(state[j]); } else { monster.RemoveDebuffState(state[j]); } } } } }
// 初始化怪物aa public void CreateMonster() { GameObject[] kMonsterList = GameObject.FindGameObjectsWithTag("Monster"); if (kMonsterList != null) { for (int i = 0; i < kMonsterList.Length; i++) { sdGameMonster kMonster = kMonsterList[i].GetComponent <sdGameMonster>(); if (kMonster != null) { if (SDGlobal.msMonsterDropTable != null) { object kDropItem = SDGlobal.msMonsterDropTable[(uint)kMonster.uniqueId]; if (kDropItem != null) { kMonster.DropInfo = kDropItem as SDMonsterDrop; } } } } } }
// 更新触发状态(继承自sdBehaviourState)aa public override void UpdateState() { if (mIsInState == true) { mCurrentDelayTime -= Time.deltaTime; if (mCurrentDelayTime <= 0.0f) { if (mExecuteStatus) { return; } mExecuteStatus = true; MonsterAutoFight kMonsterAutoFight = mBehaviourAdvancedState.MonsterAutoFightComponent; if (kMonsterAutoFight != null) { sdGameMonster kMonster = kMonsterAutoFight.Actor as sdGameMonster; if (kMonster != null) { Renderer[] akRenderer = kMonster.RenderNode.GetComponentsInChildren <Renderer>(); if (akRenderer != null) { for (int i = 0; i < akRenderer.GetLength(0); ++i) { Renderer kRenderer = akRenderer[i]; if (kRenderer.gameObject.name.Equals(mMeshName)) { mMeshStatus = kRenderer.enabled; kRenderer.enabled = false; break; } } } } } } } }
// 设置战斗系统配接器aa public void SetMonsterAutoFight(MonsterAutoFight kMonsterAutoFight) { if (mMonsterAutoFight == kMonsterAutoFight) { return; } if (mMonsterAutoFight != null) { sdGameMonster kMonster = mMonsterAutoFight.Monster; kMonster.NotifySummoned -= NotifySummoned; kMonster.NotifyKilled -= NotifyKilled; kMonster.NotifyAddHP -= NotifyAddHP; kMonster.NotifyChangeTarget -= NotifyChangeTarget; kMonster.NotifyAddDebuffState -= NotifyAddDebuffState; } if (kMonsterAutoFight != null) { sdGameMonster kMonster = kMonsterAutoFight.Monster; kMonster.NotifySummoned += NotifySummoned; kMonster.NotifyKilled += NotifyKilled; kMonster.NotifyAddHP += NotifyAddHP; kMonster.NotifyChangeTarget += NotifyChangeTarget; kMonster.NotifyAddDebuffState += NotifyAddDebuffState; } mMonsterAutoFight = kMonsterAutoFight; int iAIID = (int)kMonsterAutoFight.Monster.Property["AIID"]; mBehaviourEventTree = sdAITable.GetSingleton().GetBehaviourEventTree(iAIID); if (mBehaviourEventTree != null) { mBehaviourEventTree.SetBehaviourAdvancedState(this); } }
float CalulateBodyModify(Hashtable table, sdActorInterface target) { float nResult = 0.0f; if (!table.ContainsKey("naMoreDamagePer[MONSTER_BODY_TYPE_max]")) { return(nResult); } if (table["naMoreDamagePer[MONSTER_BODY_TYPE_max]"].GetType() != typeof(int[])) { return(nResult); } if (target.GetActorType() == ActorType.AT_Monster || target.GetActorType() == ActorType.AT_Pet) { sdGameMonster monster = (sdGameMonster)target; int monsterType = (int)monster.Property["BodyType"]; int[] percentArray = (int[])table["naMoreDamagePer[MONSTER_BODY_TYPE_max]"]; if (monsterType >= 0 && monsterType < percentArray.Length) { nResult = (float)(percentArray[monsterType] * 0.0001f); } } return(nResult); }
static void GenerateUniqueID() { GameObject kGameLevelObject = GameObject.Find("@GameLevel"); if (kGameLevelObject == null) { return; } sdTuiTuLogic kTuituLogic = kGameLevelObject.GetComponent <sdTuiTuLogic>(); if (kTuituLogic == null) { return; } List <sdGameMonster> kMonsterList = FindMonster(7); if (kMonsterList != null) { int iUniqueId = 1; for (int i = 0; i < kMonsterList.Count; i++) { sdGameMonster kMonster = kMonsterList[i]; if (kMonster != null) { kMonster.uniqueId = iUniqueId; EditorUtility.SetDirty(kMonster); iUniqueId++; } } } EditorApplication.SaveCurrentSceneIfUserWantsTo(); Debug.LogWarning("Gen Monster Unique ID OK!"); }
// 宠物被杀死回调aa protected void OnPetKilled(sdActorInterface kActor) { sdGameMonster kMonster = kActor as sdGameMonster; if (kMonster == null) { return; } // kMonster.NotifyKilled -= OnPetKilled; // if (kMonster.Master != null) { sdGameActor kMasterActor = kMonster.Master as sdGameActor; kMasterActor.Retainer = null; kMonster.Master = null; } // ActiveOnePet(); }
// 初始化(继承自MonoBehaviour)aa protected override void Start() { if (this.transform.childCount > 0) { for (int i = 0; i < this.transform.childCount; i++) { GameObject kObject = this.transform.GetChild(i).gameObject; sdGameMonster kMonster = kObject.GetComponent <sdGameMonster>(); if (kMonster != null) { kMonster.NotifyKilled += NotifyMonsterKilled; kMonster.NotifyHurt += NotifyMonsterHurt; kMonster.NotifyChangeTarget += NotifyMonsterFindFirstTarget; mMonsterKilledList.Add(kObject); continue; } sdLevelArea kArea = kObject.GetComponent <sdLevelArea>(); if (kArea != null) { mSubNodeClearedList.Add(kObject); continue; } } } if (this.transform.parent != null) { sdLevelArea kArea = this.transform.parent.gameObject.GetComponent <sdLevelArea>(); if (kArea != null) { mParNode = this.transform.parent.gameObject; } } }
public void SetTarget(GameObject obj, sdLevelArea area) { sdUICharacter.Instance.bBossMovie = true; m_StartTime = System.DateTime.Now.Ticks / 10000000L; mBoss = obj; bossSaveRotate = mBoss.transform.rotation; levelArea = area; mMainCamera = sdGameLevel.instance.mainCamera.GetComponent <Camera>(); cameraSavePos = mMainCamera.gameObject.transform.position; cameraSaveRotate = mMainCamera.gameObject.transform.rotation; mUICamera = sdGameLevel.instance.UICamera; SetTargetEffectVisible(false); sdGameLevel.instance.SetFingerObjectActive(false); HeaderProto.ECreatureActionState[] state = new HeaderProto.ECreatureActionState[2]; state[0] = HeaderProto.ECreatureActionState.CREATURE_ACTION_STATE_IDLE; state[1] = HeaderProto.ECreatureActionState.CREATURE_ACTION_STATE_LIMIT_SKILL; levelArea.SetMonsterStatus(state, true); sdActorInterface activePet = sdGameLevel.instance.mainChar.Retainer; for (int i = 0; i < state.Length; i++) { if (activePet != null) { activePet.AddDebuffState(state[i]); } sdGameLevel.instance.mainChar.AddDebuffState(state[i]); } if (activePet != null && activePet.actorType == ActorType.AT_Pet) { ((sdGameMonster)activePet).DeactiveHPUI(); } ResLoadParams param = new ResLoadParams(); sdResourceMgr.Instance.LoadResource("UI/$Movie/bossdialogue.prefab", LoadBossDialogue, param); //榛戝睆杩涘叆aa Quaternion cameraRotate = mMainCamera.gameObject.transform.rotation; cameraRotate = cameraRotate * Quaternion.AngleAxis(180.0f, new Vector3(0, 1, 0)); Vector3 direction = cameraRotate * Vector3.forward; direction.y = 0.0f; direction.Normalize(); Quaternion bossRotate = Quaternion.identity; if (direction.z < -0.9999f) { bossRotate = Quaternion.AngleAxis(180.0f, new Vector3(0, 1, 0)); } else { bossRotate = Quaternion.FromToRotation(Vector3.forward, direction); } mBoss.transform.rotation = bossRotate; sdGameLevel.instance.mainCamera.MainCharFollow = false; if (mbornAnimNext != null && mbornAnimNext.Length > 0) { bPlayShowAnimation = true; gameMonster = mBoss.GetComponent <sdGameMonster>(); } }
public DamageResult testHurt(sdActorInterface _gameActor, Hashtable _state, sdActorInterface targetActor, int hitPointIndex, HeaderProto.ESkillEffect bySkillEffect) { DamageResult dr; dr.damage = 0; dr.bubbleType = Bubble.BubbleType.eBT_BaseHurt; dr.attracker = _gameActor; Hashtable recProp = targetActor.GetProperty(); if (recProp == null) { return(dr); } SkillProperty skillProp = new SkillProperty(); int dmgMin = (int)_gameActor["AtkDmgMin"]; int dmgMax = (int)_gameActor["AtkDmgMax"]; int iceAtt = (int)_gameActor["IceAtt"]; int fireAtt = (int)_gameActor["FireAtt"]; int poisonAtt = (int)_gameActor["PoisonAtt"]; int thunerAtt = (int)_gameActor["ThunderAtt"]; int intervalPerAttack = (int)_gameActor["AttSpeed"]; // ms per attack float attackPerSecond = 1000.0f / (float)intervalPerAttack; int d10000 = ((int[])_state["dwAtkPowerPer[10]"])[hitPointIndex]; int dx = ((int[])_state["dwDmg[10]"])[hitPointIndex]; int byPeriodicDamageType = 0; //(int)_state.stateData["byPeriodicDamage"]; Hashtable attTable = new Hashtable(); int phyAtt = dmgMin; //如果最小攻击力 大于 最大攻击力 直接取最小攻击力... if (dmgMax > dmgMin) { phyAtt = Random.Range(dmgMin, dmgMax); } float iPercentFix = 0.0f; int iDamageFix = 0; switch ((EPeriodicDamage)byPeriodicDamageType) { ///每波伤害相同... case EPeriodicDamage.PERIODIC_DAMAGE_SAME: {} break; ///固定值递增:Data + DataPeriodic * (Index)... case EPeriodicDamage.PERIODIC_DAMAGE_INCREASE: { iDamageFix = (int)_state["dwPeriodicTraumaHP"] * (hitPointIndex + 1); } break; ///百分比递增:HP*(Data + DataPeriodic * (Index))... case EPeriodicDamage.PERIODIC_DAMAGE_INCREASE_PERCENT: { iPercentFix = ((int)_state["dwPeriodicTraumaHP"] / 10000.0f) * (hitPointIndex + 1); } break; ///固定值递减:Data - DataPeriodic * (Index)... case EPeriodicDamage.PERIODIC_DAMAGE_DECREASE: { iDamageFix = -(int)_state["dwPeriodicTraumaHP"] * (hitPointIndex + 1); } break; ///百分比递减:HP*(Data - DataPeriodic * (Index))... case EPeriodicDamage.PERIODIC_DAMAGE_DECREASE_PERCENT: { iPercentFix = -((int)_state["dwPeriodicTraumaHP"] / 10000.0f) * (hitPointIndex + 1); } break; ///第一波伤害最大,其余伤害相同,第一波伤害计算公式:... ///固定值方式:Data - DataPeriodic... case EPeriodicDamage.PERIODIC_DAMAGE_FIRST: { if (hitPointIndex == 0) { iDamageFix = (int)_state["dwPeriodicTraumaHP"]; } } break; ///百分比方式:HP*(Data + DataPeriodic)... case EPeriodicDamage.PERIODIC_DAMAGE_FIRST_PERCENT: { if (hitPointIndex == 0) { iPercentFix = ((int)_state["dwPeriodicTraumaHP"] / 10000.0f); } } break; ///最后一波伤害最大,其余伤害相同,第一波伤害计算公式: ///固定值方式:Data + DataPeriodic case EPeriodicDamage.PERIODIC_DAMAGE_END: { if (hitPointIndex == -1) { iPercentFix = (int)_state["dwPeriodicTraumaHP"]; } } break; ///百分比方式:HP*(Data + DataPeriodic)... case EPeriodicDamage.PERIODIC_DAMAGE_END_PERCENT: { if (hitPointIndex == -1) { iPercentFix = ((int)_state["dwPeriodicTraumaHP"] / 10000.0f); } } break; } int skillHit = (int)_state["dwHitPer"]; int skillCri = (int)_state["dwCriticalPer"]; int skillCriDmg = (int)_state["dwCriticalDmgPer"]; skillProp.atk = phyAtt; skillProp.iceAtk = iceAtt; skillProp.fireAtk = fireAtt; skillProp.poisonAtk = poisonAtt; skillProp.thunderAtk = thunerAtt; skillProp.Y = (float)d10000 / 10000.0f; skillProp.Z = dx; skillProp.YZFix = iPercentFix; skillProp.ZFix = iDamageFix; skillProp.hitRate = (float)_gameActor["Hit"] * fPropertyScale + (float)_gameActor["HitPer"] * 0.0001f + (skillHit) * 0.0001f; int pierce = _gameActor["Pierce"]; skillProp.passThrough = (float)pierce / (float)(pierce + (int)recProp["Level"] * 270 + 2700); skillProp.superAttack = (float)_gameActor["CriDmg"] * 0.0001f + (skillCriDmg) * 0.0001f; skillProp.superRate = (float)_gameActor["Cri"] * fPropertyScale + (float)_gameActor["CriPer"] * 0.0001f + (skillCri) * 0.0001f; skillProp.attPerSecond = attackPerSecond; if (_state.ContainsKey("dwDamagePer")) { skillProp.damagePer = ((int)_state["dwDamagePer"]) * 0.0001f; } else { skillProp.damagePer = 1.0f; } if (_gameActor.Property.ContainsKey("HurtOtherModify")) { skillProp.hurtOtherModify = ((int)_gameActor["HurtOtherModify"]) * 0.0001f; } else { skillProp.hurtOtherModify = 0.0f; } //属性修正aaa int attAttr = (int)_state["byDamegePro"]; if (attAttr == 0) { skillProp.type = SkillType.Skill_Physic; } else if (attAttr == 1) { skillProp.type = SkillType.Skill_Ice; } else if (attAttr == 2) { skillProp.type = SkillType.Skill_Fire; } else if (attAttr == 3) { skillProp.type = SkillType.Skill_Poison; } else if (attAttr == 4) { skillProp.type = SkillType.Skill_Thunder; } skillProp.PropertyModify = CalulatePropertyModify(_gameActor, attAttr); ///体型修正aaaa skillProp.BodyTypeModify = CalulateBodyModify(_state, targetActor); //控制状态修正aaa skillProp.StateModify = CalulateStateModify(_gameActor, targetActor); SkillDefProperty defProp = new SkillDefProperty(); defProp.level = (int)recProp["Level"]; defProp.def = (int)recProp["Def"]; int dodge = (int)recProp["Dodge"]; defProp.dodgeRate = dodge * fPropertyScale; defProp.dodgeRate += ((int)recProp["DodgePer"]) * 0.0001f; defProp.fireDef = (int)recProp["FireDef"]; defProp.iceDef = (int)recProp["IceDef"]; defProp.poisonDef = (int)recProp["PoisonDef"]; int criDmgDef = (int)recProp["CriDmgDef"]; defProp.superDef = (float)criDmgDef * 0.0001f; defProp.thunderDef = (int)recProp["ThunderDef"]; int flex = (int)recProp["Flex"]; defProp.toughness = (float)flex * fPropertyScale; if (recProp.ContainsKey("BeHurtModify")) { defProp.beHurtModify = ((int)recProp["BeHurtModify"]) * 0.0001f; } else { defProp.beHurtModify = 0.0f; } bool isNormalAtk = false; if (attAttr == 0) { isNormalAtk = true; } bool isSuper; bool bDodge; dr.damage = CalculateAttack(skillProp, defProp, isNormalAtk, bySkillEffect, out isSuper, out bDodge); CalculateBubbleType(_state, _gameActor, targetActor, isSuper, bDodge, ref dr); if (bySkillEffect == HeaderProto.ESkillEffect.SKILL_EFFECT_CURE_HP) { targetActor.AddHP(dr.damage); } else if (bySkillEffect == HeaderProto.ESkillEffect.SKILL_EFFECT_CURE_MP) { targetActor.AddSP(dr.damage); } else if (bySkillEffect == HeaderProto.ESkillEffect.SKILL_EFFECT_DAMAGE_SP) { targetActor.AddSP(-dr.damage); } else { if (targetActor.CheckDebuffState(HeaderProto.ECreatureActionState.CREATURE_ACTION_STATE_UNBEAT)) { dr.bubbleType = Bubble.BubbleType.eBT_Dodge; dr.damage = 0; } targetActor.OnHurt(dr); } if (_state.Contains("WeaponHitType")) { targetActor.DoHittedAudio((string)_state["WeaponHitType"]); } if (targetActor.actorType == ActorType.AT_Monster && dr.damage > 0) { sdGameMonster monster = (sdGameMonster)targetActor; int monsterType = (int)monster.Property["BodyType"]; if (_state.Contains("ParentID") && _state.Contains("dwTemplateID")) //临时代码判断是技能伤害aa { int id = (int)_state["dwTemplateID"]; _gameActor.OnAttackRestore(id, dr.damage, monsterType); } } //是否打断被击目标的某些buffer if (_state.ContainsKey("BreakState")) { int[] buffID = (int[])(_state["BreakState"]); if (buffID.Length == 2) { targetActor.RemoveBuff(buffID[0], buffID[1]); } } return(dr); }