//设置初速度 void SetOriginV(float value, float angle) { //浮空追击,但是退出了重力系统 if (!m_isUseGravity) { return; } angle = angle % 360; m_originVelocity.value = value; m_originVelocity.angle = angle; m_originVelocity.vSubY = m_originVelocity.value * Mathf.Sin(m_originVelocity.angle * Mathf.Deg2Rad); m_originVelocity.vSubZ = m_originVelocity.value * Mathf.Cos(m_originVelocity.angle * Mathf.Deg2Rad); m_startMotionTime = Time.time; m_startPos = m_transform.position; //根据角度确定是什么类型运动 if (angle > 0 && angle < 180) { m_gravityMotionType = GravityMotionType.GMT_UP; } else if (angle == 0 || angle == 180) { m_gravityMotionType = GravityMotionType.GMT_PUSH; } else if (angle > 180 && angle < 360) { m_gravityMotionType = GravityMotionType.GMT_DOWN; } //navmesh disenable NavMeshAgent agent = this.GetComponent <NavMeshAgent>(); if (agent != null) { agent.enabled = false; } //设置被击硬直 m_BehitState.isNonControl = true; m_behitParame = m_actor.damageBebitParam; if (m_behitParame == null) { return; //播放声音 // m_BehitState.PlayBehitSound(null, m_behitParame.damgageInfo.attackActor); } m_attackObjForward = m_behitParame.damgageInfo.attackActor.transform.forward; }
//技能命中,获取被击的信息,发给被击对象做表现 public void OnBuffDamage(DamageParam damageParam, float phyAttackPercent, float magicAttackPercent, float addedValue, sbyte skillAttrib) { //攻击者的信息 ActorObj attackActorObj = damageParam.attackActor; ActorObj behitActorObj = damageParam.behitActor; if (behitActorObj.IsDeath()) { return; } //LuaTable attackSkillDesc = attackActorObj.GetCurSkillDesc(damageParam.skillID); BehitParam behitParam = new BehitParam(); behitParam.displayType = DamageDisplayType.DDT_NORMAL; float critRate = 0; if (critRate < 0) { critRate = 0; } critRate = Math.Min(critRate, 1.0f); if (UnityEngine.Random.value < critRate) //暴击 { behitParam.displayType = DamageDisplayType.DDT_DOUBLE; } int finalDmg = 0; //string strPhydmg = ""; behitParam.hp = finalDmg; #if !PUBLISH_RELEASE if (m_bMiaoGuai) { if (attackActorObj.mActorType == ActorType.AT_LOCAL_PLAYER) { behitParam.hp += 1000000; } } #endif //被击效果修正 behitParam.damgageInfo = damageParam; behitParam.displayType = DamageDisplayType.DDT_BUFF; //给技能释放者发送回复信息 // 发送被击消息给被击者 behitActorObj.OnSkillBeHit(behitParam); }
public override void DoDamage(int hp, bool bIsMainPlayer, BehitParam behitParam)//lmjedit 真正的暴击 { base.DoDamage(hp, bIsMainPlayer, behitParam); if (mActorType == ActorType.AT_BOSS) { //EventToUI.SetArg(UIEventArg.Arg1, curHp * 1.0f / maxHp); //EventToUI.SetArg(UIEventArg.Arg2, behitParam); //EventToUI.SendEvent("EU_BOSSBLOOD_SETVALUE"); } }
private void OnObjectDead(GameEvent ge, EventParameter parameter) { MsgData_sObjDeadInfo msg = parameter.msgParameter as MsgData_sObjDeadInfo; if (null == msg) return; // for (int i = 0; i < mSceneCache.Count; i++) // { // if (mSceneCache[i].ObjGuid == msg.ID) // { // mSceneCache.RemoveAt(i); // Debug.LogError("---------------------------------killid ___ 2:" + msg.KillerID + " bkill:" + msg.ID); // return; // } // } if (mObjRecord.ContainsKey(msg.ID)) { mObjRecord.Remove(msg.ID); } ActorObj behitActor = CoreEntry.gActorMgr.GetActorByServerID(msg.ID); if (null == behitActor) { if (!mDeathCache.Contains(msg)) { mDeathCache.Add(msg); } //Debug.LogError("---------------------------------怪物死亡 1:" + msg.ID + " monst count:" + mObjRecord.Count); return; } //Debug.LogError("---------------------------------怪物死亡 2 :" + msg.ID + " monst count:" + mObjRecord.Count); ActorObj attackActor = CoreEntry.gActorMgr.GetActorByServerID(msg.KillerID); BehitParam behitParam = new BehitParam(); DamageParam damageParam = new DamageParam(); damageParam.attackActor = attackActor; damageParam.behitActor = behitActor; damageParam.skillID = msg.KillerSkillID; behitParam.damgageInfo = damageParam; behitActor.OnDead(msg.KillerSkillID, attackActor, behitParam, EventParameter.Get()); }
IEnumerator DoDead(MsgData_sObjDeadInfo msg) { yield return new WaitForSeconds(0.3f); ActorObj behitActor = CoreEntry.gActorMgr.GetActorByServerID(msg.ID); if (null == behitActor) yield break; ActorObj attackActor = CoreEntry.gActorMgr.GetActorByServerID(msg.KillerID); BehitParam behitParam = new BehitParam(); DamageParam damageParam = new DamageParam(); damageParam.attackActor = attackActor; damageParam.behitActor = behitActor; damageParam.skillID = msg.KillerSkillID; behitParam.damgageInfo = damageParam; behitActor.OnDead(msg.KillerSkillID, attackActor, behitParam, EventParameter.Get()); }
void Update() { if (!bSceneLoaded) { return; } float time = 0.0f; float lastTime = Time.realtimeSinceStartup; while (mSceneCache.Count > 0) { if (time > mMaxPrcessingTime) { return; } SceneObj sceneObj = mSceneCache[0]; switch (sceneObj.ObjType) { case EnEntType.EnEntType_Player: MsgData_sSceneObjectEnterHuman humanStruct = sceneObj.ObjData as MsgData_sSceneObjectEnterHuman; CoreEntry.gSceneLoader.LoadOtherPlayer(humanStruct); if (sceneObj.PlayerData != null) { sceneObj.PlayerData = null; } break; case EnEntType.EnEntType_Monster: MsgData_sSceneObjectEnterMonster monsterStruct = sceneObj.ObjData as MsgData_sSceneObjectEnterMonster; //Debug.LogError("创建怪物:" + monsterStruct.Guid); if (!mObjRecord.ContainsKey(monsterStruct.Guid)) { CoreEntry.gSceneLoader.LoadMonster(monsterStruct); mObjRecord.Add(monsterStruct.Guid, CoreEntry.gActorMgr.GetActorByServerID(monsterStruct.Guid)); } else { //Debug.LogError("重复怪物:" + monsterStruct.Guid); } break; case EnEntType.EnEntType_NPC: MsgData_sSceneObjectEnterNPC npcStruct = sceneObj.ObjData as MsgData_sSceneObjectEnterNPC; CoreEntry.gSceneLoader.LoadNPC(npcStruct); break; case EnEntType.EnEntType_StaticObj: MsgData_sSceneObjectEnterStaticObj sstaticStruct = sceneObj.ObjData as MsgData_sSceneObjectEnterStaticObj; CoreEntry.gSceneLoader.LoadStaticObj(sstaticStruct); break; case EnEntType.EnEntType_Item: MsgData_sSceneObjectEnterItem itemStruct = sceneObj.ObjData as MsgData_sSceneObjectEnterItem; EventParameter param = EventParameter.Get(); param.objParameter = itemStruct; CoreEntry.gEventMgr.TriggerEvent(GameEvent.GE_OBJ_ITEM_ENTER, param); break; case EnEntType.EnEntType_GatherObj: MsgData_sSceneObjectEnterCollection collectionStruct = sceneObj.ObjData as MsgData_sSceneObjectEnterCollection; CoreEntry.gSceneLoader.LoadCollection(collectionStruct); break; case EnEntType.EnEntType_Pet: MsgData_sSceneObjectEnterPet petStruct = sceneObj.ObjData as MsgData_sSceneObjectEnterPet; CoreEntry.gSceneLoader.LoadPet(petStruct); break; case EnEntType.EnEntType_BiaoChe: MsgData_sSceneObjectEnterBiaoChe cheStruct = sceneObj.ObjData as MsgData_sSceneObjectEnterBiaoChe; CoreEntry.gSceneLoader.LoadBiaoChe(cheStruct); break; case EnEntType.EnEntType_Trap: MsgData_sSceneObjectEnterTrap trapStruct = sceneObj.ObjData as MsgData_sSceneObjectEnterTrap; CoreEntry.gSceneLoader.LoadTrap(trapStruct); break; case EnEntType.EntType_VirtualPlayer: MsgData_sSceneObjectEnterVirtualPlayer vpStruct = sceneObj.ObjData as MsgData_sSceneObjectEnterVirtualPlayer; CoreEntry.gSceneLoader.LoadVirtualPlayer(vpStruct); break; default: break; } mSceneCache.RemoveAt(0); time += Time.realtimeSinceStartup - lastTime; } for (int i = 0; i < mDeathCache.Count; i++) { MsgData_sObjDeadInfo msg = mDeathCache[i]; ActorObj behitActor = CoreEntry.gActorMgr.GetActorByServerID(msg.ID); if (null == behitActor) { continue; } ActorObj attackActor = CoreEntry.gActorMgr.GetActorByServerID(msg.KillerID); BehitParam behitParam = new BehitParam(); DamageParam damageParam = new DamageParam(); damageParam.attackActor = attackActor; damageParam.behitActor = behitActor; damageParam.skillID = msg.KillerSkillID; behitParam.damgageInfo = damageParam; behitActor.OnDead(msg.KillerSkillID, attackActor, behitParam, EventParameter.Get()); mDeathCache.RemoveAt(i); i--; } for (int i = 0; i < mLeaveCache.Count; i++) { ActorObj actor = mLeaveCache[i]; if (null != actor) { if (actor.mActorState.IsDeathEnd()) { CoreEntry.gActorMgr.RemoveActorByServerID(actor.ServerID); actor.RecycleObj(); EventParameter param = EventParameter.Get(); param.longParameter = actor.ServerID; CoreEntry.gEventMgr.TriggerEvent(GameEvent.GE_ACTOR_REMOVE, param); if (actor is OtherPlayer) { param = EventParameter.Get(); param.longParameter = actor.ServerID; CoreEntry.gEventMgr.TriggerEvent(GameEvent.GE_OTHERPLAYER_LEAVE, param); } } else { continue; } } mLeaveCache.RemoveAt(i); i--; } }
public override void OnEnter(ActorObj actor) { if (actor == null) { return; } //塔不没有受击 bool bChangeColor = true; m_state = ACTOR_STATE.AS_BEHIT; m_actor = actor; m_transform = actor.transform; //if (m_actor != null) //{ // m_actor.m_bIsInAttack = true; //} m_behitParame = m_actor.damageBebitParam; monsterObj = m_actor as MonsterObj; if (monsterObj != null) { if (monsterObj.IsVip) { monsterObj.VipIsUnderAttack(); } } if (CurParam != null && CurParam != null) { m_curSkillID = CurParam.skillID; } //m_GameDataBase = CoreEntry.gGameDBMgr; if (CurParam != null && CurParam.AttackActor != null) { m_attack = CurParam.AttackActor; } m_groundLayerMask = 1 << LayerMask.NameToLayer("ground"); //m_baseTool = CoreEntry.gBaseTool; m_gravityMotionBase = this.gameObject.GetComponent <GravityMotionBase>(); //m_gravityMotionBase.enabled = true; //m_ActionEfxList = new List<EfxAttachAction>(); //修改shader //if (m_actor.ChangeShader("Mobile/BeingHitted")) if (monsterObj && monsterObj.m_bIsTower) { bChangeColor = false; } if (bChangeColor && m_actor.m_bUseBehitColor && m_actor.mActorType == ActorType.AT_MONSTER && m_attack != null && m_attack is PlayerObj) { m_actor.SetBrightenShader(); Invoke("RecoverShader", 0.2f); } // if (m_actor.mActorType == ActorType.AT_BOSS && m_actor.AddShader("DZSMobile/Balloon")) //// if (m_actor.mActorType == ActorType.AT_BOSS && m_actor.ChangeShader("DZSMobile/Balloon")) // { // Invoke("RemoveShader", 0.2f); // } if (m_actor.mActorType == ActorType.AT_BOSS && m_actor.IsInQiJue()) { CoreEntry.gEventMgr.TriggerEvent(GameEvent.GE_Boss_QiJue, null); } m_curRadius = m_actor.GetColliderRadius(); //如果浮空,就给浮空处理受击 if (m_gravityMotionBase != null && m_gravityMotionBase.isUseGravityState) { m_gravityMotionBase.DoBehit(); } else { m_bHitBack = false; m_isNonControlProtect = false; isNonControl = false; m_isHitDownState = false; //小怪倒地被击 if (m_gravityMotionBase != null) { m_gravityMotionBase.BreakExitBehitState(); } //面向被击玩家 // if (m_actor.actorCreatureDisplayDesc.chIsBehitNotLookAtTarget == 0) if (m_actor.mActorType != ActorType.AT_LOCAL_PLAYER && m_actor.mActorType != ActorType.AT_MECHANICS && //机械类不转向 m_attack != null && !(m_actor is MonsterObj && !m_actor.bHitTurn)) { //自动释放法宝技能 CoreEntry.gEventMgr.TriggerEvent(GameEvent.GE_AutoUseMagicKeySkill, null); //只旋转Y轴 Vector3 lookPos = new Vector3(m_attack.transform.position.x, m_transform.position.y, m_attack.transform.position.z); m_transform.LookAt(lookPos); } DoBehitEx(); } }
//技能命中,获取被击的信息,发给被击对象做表现 public void OnSkillDamage(DamageParam damageParam) { if (ArenaMgr.Instance.IsArenaFight) { ArenaMgr.Instance.OnSkillDamage(damageParam); return; } //攻击者的信息 ActorObj attackActorObj = damageParam.attackActor; ActorObj behitActorObj = damageParam.behitActor; if (null == attackActorObj || null == behitActorObj) { return; } if (behitActorObj.IsDeath()) { return; } BehitParam behitParam = new BehitParam(); behitParam.displayType = DamageDisplayType.DDT_NORMAL; behitParam.hp = damageParam.Damage; #if !PUBLISH_RELEASE if (m_bMiaoGuai) { if (attackActorObj.mActorType == ActorType.AT_LOCAL_PLAYER) { behitParam.hp += 1000000; } } else { if (m_bWuShang && attackActorObj.mActorType == ActorType.AT_LOCAL_PLAYER) { behitParam.hp = 1; } } #endif //被击效果修正 behitParam.damgageInfo = damageParam; #if !PUBLISH_RELEASE if (m_bWuShang && behitActorObj.mActorType == ActorType.AT_LOCAL_PLAYER) { behitParam.hp = 1; } #endif //给技能释放者发送回复信息 // 发送被击消息给被击者 // if (behitParam.hp != 0) { behitActorObj.OnSkillBeHit(behitParam); } if (attackActorObj.mActorType == ActorType.AT_LOCAL_PLAYER) { behitActorObj.Health.ShowHPBar(5); } //受到其它玩家攻击时,提示开启善恶模式 if (behitParam.hp > 0 && behitActorObj.mActorType == ActorType.AT_LOCAL_PLAYER) { if (attackActorObj.mActorType == ActorType.AT_REMOTE_PLAYER) { if (PlayerData.Instance.CurPKMode == PKMode.PK_MODE_PEACE && (PlayerData.LastNoteSwitchPKTime <= 0 || (Time.realtimeSinceStartup - PlayerData.LastNoteSwitchPKTime) >= 60)) { bool autosetpk = false; if (autosetpk) { UITips.ShowTips("受到攻击,切换善恶模式"); PlayerData.Instance.SendSetPKRuleRequest(PKMode.PK_MODE_EVIL); } else { MainPanelMgr.Instance.ShowDialog("TipSwitchPKNote"); PlayerData.LastNoteSwitchPKTime = Time.realtimeSinceStartup; } } //没有目标则选中攻击者 ActorObj mainplayer = CoreEntry.gActorMgr.MainPlayer; if (mainplayer.m_SelectTargetObject == null) { mainplayer.SelectTarget(attackActorObj); } EventParameter ep = EventParameter.Get(); ep.objParameter = attackActorObj; CoreEntry.gEventMgr.TriggerEvent(GameEvent.GE_PLAYER_PK_HURT, ep); } //玩家收到了攻击 AutoAIMgr automgr = CoreEntry.gAutoAIMgr; if (automgr.Config.AutoStrikeBack && TaskMgr.RunTaskType == 0 && !automgr.AutoFight && !behitActorObj.AutoPathFind) { float gap = Time.realtimeSinceStartup - automgr.LastOPTime; //LogMgr.Log("Last op gap {0}", gap); if (gap > automgr.Config.StrikeBackGapWithIdle) { automgr.AutoFight = true; } } } }
public void EventFunction(GameEvent ge, EventParameter parameter) { switch (ge) { case GameEvent.GE_NOTIFY_CAST_SKILL: { //释放技能 int skillID = (int)parameter.intParameter; GameObject actor = parameter.goParameter; //调用actorbase释放技能 ActorObj actorObj = actor.GetComponent <ActorObj>(); //是否学习了该技能 if (actorObj.IsHadLearnSkill(skillID)) { //玩家释放技能前选择目标 if (actorObj.mActorType == ActorType.AT_LOCAL_PLAYER) { //若没有目标则马上选择目标 CoreEntry.gActorMgr.MainPlayer.CheckSkillTarget(); } actorObj.OnRunToAttack(skillID); //actorObj.OnCastSkill(skillID); } } break; case GameEvent.GE_NOTIFY_SHOW_SKILL_SCOPE: { //释放技能 int skillID = (int)parameter.intParameter; GameObject actor = parameter.goParameter; //调用actorbase释放技能 ActorObj actorObj = actor.GetComponent <ActorObj>(); //是否学习了该技能 if (actorObj.IsHadLearnSkill(skillID)) { actorObj.OnShowSkillScope(skillID); //actorObj.OnCastSkill(skillID); } } break; case GameEvent.GE_NOTIFY_HIDE_SKILL_SCOPE: { //释放技能 int skillID = (int)parameter.intParameter; GameObject actor = parameter.goParameter; //调用actorbase释放技能 ActorObj actorObj = actor.GetComponent <ActorObj>(); //是否学习了该技能 if (actorObj.IsHadLearnSkill(skillID)) { actorObj.OnHideSkillScope(skillID); //actorObj.OnCastSkill(skillID); } } break; // case GameEvent.GE_SC_SKILLEFFECT: { MsgData_sCastEffect data = parameter.msgParameter as MsgData_sCastEffect; if (data == null) { return; } //服务器这里只冒伤害数字 bool bIsMainPlayer = false; BehitParam behitParam = new BehitParam(); DamageParam damageParam = new DamageParam(); damageParam.attackActor = CoreEntry.gActorMgr.GetActorByServerID(data.CasterID); damageParam.behitActor = CoreEntry.gActorMgr.GetActorByServerID(data.TargetID); damageParam.skillID = data.SkillID; damageParam.Flags = data.Flags; damageParam.DamagaType = data.DamagaType; damageParam.Damage = (int)data.Damage; damageParam.IsClient = false; behitParam.damgageInfo = damageParam; behitParam.displayType = (DamageDisplayType)data.DamagaType; behitParam.hp = (int)data.Damage; if (behitParam.damgageInfo.attackActor != null && behitParam.damgageInfo.attackActor.mActorType == ActorType.AT_LOCAL_PLAYER) { bIsMainPlayer = true; } if (behitParam.damgageInfo.attackActor != null) { if (bIsMainPlayer) { behitParam.damgageInfo.attackActor.OnDamage((int)data.Damage, data.SkillID, bIsMainPlayer, behitParam); } else { //其他人要播受击动作 OnSkillDamage(damageParam); } } } break; case GameEvent.GE_SC_OTHER_CASTSKILL_BEGIN: { MsgData_sCastBegan data = parameter.msgParameter as MsgData_sCastBegan; if (data == null) { return; } ActorObj attackObj = CoreEntry.gActorMgr.GetActorByServerID(data.CasterID); if (attackObj == null) { return; } if (attackObj != null && attackObj.mActorType == ActorType.AT_LOCAL_PLAYER) { return; } //todo ,先强行同步位置 attackObj.SetServerPosition(new Vector2(data.CasterPosX, data.CasterPosY)); attackObj.OnCastSkill(data.SkillID, data.CasterID, data.TargetID, data.PosX, data.PosY); } break; case GameEvent.GE_SC_OTHER_CASTSKILL_END: { MsgData_sCastEnd data = parameter.msgParameter as MsgData_sCastEnd; if (data == null) { return; } ActorObj attackObj = CoreEntry.gActorMgr.GetActorByServerID(data.CasterID); if (attackObj == null) { return; } attackObj.SkillEnd(data.SkillID); } break; //hitback case GameEvent.GE_SC_KNOCKBACK: { MsgData_sKnockBack data = parameter.msgParameter as MsgData_sKnockBack; if (data == null) { return; } ActorObj beHitActor = CoreEntry.gActorMgr.GetActorByServerID(data.TargetID); ActorObj attackActor = CoreEntry.gActorMgr.GetActorByServerID(data.CasterID); if (beHitActor == null || attackActor == null) { return; } beHitActor.OnHitBack(attackActor, data.MotionSpeed, data.PosX, data.PosY, data.MotionTime); } break; case GameEvent.GE_SC_ADDBUFFList: { MsgData_sAddBufferList data = parameter.msgParameter as MsgData_sAddBufferList; if (data == null) { return; } ActorObj targetObj = CoreEntry.gActorMgr.GetActorByServerID(data.TargetID); if (targetObj == null) { return; } for (int i = 0; i < data.BufferList.Count; i++) { MsgData_sBuffer _buff = data.BufferList[i]; BuffData buffdata = new BuffData(); buffdata.BufferInstanceID = _buff.BufferInstanceID; buffdata.buffType = _buff.BufferTemplateID; buffdata.Life = _buff.Life; buffdata.Count = 1; //buffdata.Param[0] = data.Param; CoreEntry.gBuffMgr.AddBuff(buffdata, targetObj); } } break; case GameEvent.GE_SC_ADDBUFF: { MsgData_sAddBuffer data = parameter.msgParameter as MsgData_sAddBuffer; if (data == null) { return; } /* * if (data.BufferTemplateID == 24100001 || data.BufferTemplateID == 24100002) * { * Debug.LogError("target目标 "+ data.TargetID +" 添加 iBuffId = " + data.BufferTemplateID); * } */ // Debug.LogError("target目标 " + data.TargetID + " 添加 iBuffId = " + data.BufferTemplateID); ActorObj targetObj = CoreEntry.gActorMgr.GetActorByServerID(data.TargetID); if (targetObj == null) { return; } BuffData buffdata = new BuffData(); buffdata.BufferInstanceID = data.BufferInstanceID; buffdata.buffType = data.BufferTemplateID; buffdata.Life = data.Life; buffdata.Count = 1; buffdata.Param[0] = data.Param; //LogMgr.LogError("SkillMgr AddBuff " + buffdata.buffType); CoreEntry.gBuffMgr.AddBuff(buffdata, targetObj); } break; case GameEvent.GE_SC_UPDATEBUFF: { MsgData_sUpdateBuffer data = parameter.msgParameter as MsgData_sUpdateBuffer; if (data == null) { return; } BuffData buffdata = new BuffData(); buffdata.BufferInstanceID = data.BufferInstanceID; buffdata.Life = data.Life; buffdata.Count = data.Count; buffdata.Param = data.Param; //LogMgr.LogError("SkillMgr UpdateBuff " + buffdata.buffType); CoreEntry.gBuffMgr.UpdateBuff(buffdata); } break; case GameEvent.GE_SC_DELBUFF: { MsgData_sDelBuffer data = parameter.msgParameter as MsgData_sDelBuffer; if (data == null) { return; } if (data.BufferTemplateID == 24100001 || data.BufferTemplateID == 24100002) { //LogMgr.DebugLog("target目标 "+ data.TargetID + " 删除 iBuffId = " + data.BufferTemplateID); } //LogMgr.LogError("SkillMgr DelBuff " + data.BufferTemplateID); // if(data.BufferInstanceID) ActorObj targetObj = CoreEntry.gActorMgr.GetActorByServerID(data.TargetID); if (targetObj != null) { //LogMgr.LogError("SKillMgr CoreEntry.gBuffMgr.RemoveBuff " + data.BufferTemplateID); CoreEntry.gBuffMgr.RemoveBuff(data.BufferInstanceID, targetObj); if (targetObj.ServerID == CoreEntry.gActorMgr.MainPlayer.ServerID) { EventParameter msg = new EventParameter(); msg.longParameter = data.BufferTemplateID; //Debug.LogError("删除BUFF " + data.BufferTemplateID); CoreEntry.gEventMgr.TriggerEvent(GameEvent.GE_CC_DELEBUFF, msg); } } } break; case GameEvent.GE_SC_CAST_MOVE_EFFECRT: { MsgData_sCastMoveEffect data = parameter.msgParameter as MsgData_sCastMoveEffect; if (null == data) { return; } if (data.caseterID == CoreEntry.gActorMgr.MainPlayer.ServerID) { return; } ActorObj casterObj = CoreEntry.gActorMgr.GetActorByServerID(data.caseterID); if (null == casterObj) { return; } LuaTable skill_action = CoreEntry.gSkillMgr.GetSkillActon(data.skillID); if (null == skill_action) { return; } float posX = (float)data.posX; float posZ = (float)data.posY; Vector3 destPos = new Vector3(posX, CommonTools.GetTerrainHeight(new Vector2(posX, posZ)), posZ); AnimationCurveData curveData = casterObj.GetComponent <AnimationCurveData>(); if (null == curveData) { LogMgr.LogError(casterObj.gameObject.name + " has no AnimationCurveBase, skill id:" + data.skillID); return; } casterObj.UseCurveData3(skill_action.Get <string>("animation"), destPos, null); } break; default: break; } }
//hp变化,主角,怪物,自己处理吧 public virtual void DoDamage(int hp, bool bIsMainPlayer, BehitParam behitParam) { }
//浮空受击 public void DoBehit() { //浮空状态不能释放技能 m_BehitState.isNonControl = true; //离地面高度 float height = GetHeightToGround(); if (height <= 0.1f) { return; } if (nCount > 2) { m_actor.StopAll(); string clipName = "hit006"; m_actor.PlayAction(clipName); m_actor.SetActionSpeed(clipName, 2f); m_actor.UseCurveData1(clipName, 2.5f); m_isUseGravity = false; // ExitBehitState(); if (!m_actor.IsHadAction(clipName)) { Vector3 vCurPos = m_actor.transform.position; RaycastHit curHit; //强拉到地面 if (Physics.Raycast(vCurPos, -Vector3.up, out curHit, 10, m_groundLayerMask)) { vCurPos.y = curHit.point.y; } BaseTool.SetPosition(m_transform, vCurPos); } float actionLen = m_actor.GetActionLength(clipName); Invoke("ExitBehitState", actionLen); nCount = 0; return; } nCount++; m_behitParame = m_actor.damageBebitParam; int skillID = m_behitParame.damgageInfo.skillID; //ActorObj m_hitActorBase = m_behitParame.damgageInfo.attackActor; //只处理带位移的普通技能 //LuaTable skillDesc = m_hitActorBase.GetCurSkillDesc(skillID); char bodyType = (char)m_actor.BodyType; int weight = 1; //技能力度纠正 if (m_behitParame.damgageInfo.weight > 0) { weight = m_behitParame.damgageInfo.weight; LogMgr.UnityLog("Gravity dobehit skillid=" + skillID + ", reset weight=" + weight); } //获取技能受击反馈 SkillBehitDisplayDesc behitDisplay = m_gameDataBase.GetSkillBehitDisplayDesc(weight, bodyType); if (behitDisplay == null) { return; } //没有硬直,定格,没有位移 if (!behitDisplay.isNonControl) { return; } //带位移 float moveDistance = 0; //动作 if (behitDisplay.behitType == BehitType.BT_NORMAL) { //普通受击 // moveDistance = skillDesc.hitMoveDistance; moveDistance = 0.2f; } else if (behitDisplay.behitType == BehitType.BT_HITBACK) { //美术位移 if (!m_behitParame.damgageInfo.isNotUseCurveMove) { string clipName = behitDisplay.actionList[0]; moveDistance = m_actor.GetAnimationCurveLength(clipName); //LogMgr.UnityLog("moveDistance=" + moveDistance + ", clipName=" + clipName); } } else if (behitDisplay.behitType == BehitType.BT_HITDOWN) { m_actor.StopAll(); string clipName = behitDisplay.actionList[0]; m_actor.PlayAction(clipName); m_actor.UseCurveData1(clipName, 2.5f); m_isUseGravity = false; // ExitBehitState(); if (!m_actor.IsHadAction(clipName)) { Vector3 vCurPos = m_actor.transform.position; RaycastHit curHit; //强拉到地面 if (Physics.Raycast(vCurPos, -Vector3.up, out curHit, 10, m_groundLayerMask)) { vCurPos.y = curHit.point.y; } BaseTool.SetPosition(m_transform, vCurPos); } float actionLen = m_actor.GetActionLength(clipName); Invoke("ExitBehitState", actionLen); return; } else if (behitDisplay.behitType == BehitType.BT_HITSKY) { //浮空追击 CancelInvoke("MoveDistanceEnd"); CancelInvoke("AutoCancelStatic"); F_ACCE = 0; // SetOriginV(skillDesc.hitSkyOriginV, skillDesc.hitSkyAngle); m_actor.StopAll(); m_actor.PlayAction("hit013", false); return; } //LogMgr.UnityLog("moveDistance=" + moveDistance); if (height < 0.5f) { return; } //没有位移 if (moveDistance <= 0.001) { //F_ACCE = G_ACCE; SetOriginV(1, 90); m_actor.StopAll(); m_actor.PlayAction("hit013", false); } else { //当前的高度 SetOriginV(3, 75); m_actor.StopAll(); m_actor.PlayAction("hit013", false); } }
public void OnSkillDamage(DamageParam damageParam) { long attkerID = damageParam.attackActor.ServerID; int behitIndex = 0; MsgData_sResArenaMemVo attker = null; MsgData_sResArenaMemVo beAtker = null; if (attkerID == mArenaFighters[0].RoleID) { attker = mArenaFighters[0]; beAtker = mArenaFighters[1]; behitIndex = 1; } else { attker = mArenaFighters[1]; beAtker = mArenaFighters[0]; behitIndex = 0; } double dmg_value = .0f; double extra_attr_dmg = .0f; double attack_dmg = attker.Atk; //1.�����Ƿ�����,Э��û�������ֶΣ���ȥ�� int src_level = (int)attker.Level; int dst_level = (int)beAtker.Level; //2.��������,���������� // ����������; string dmgParam = ConfigManager.Instance.Consts.GetValue <string>(3, "param"); string[] param1 = dmgParam.Split(','); float nVal1 = .0f; float nVal2 = .0f; if (param1.Length == 2) { if (!float.TryParse(param1[0], out nVal1)) { nVal1 = .0f; } if (!float.TryParse(param1[1], out nVal2)) { nVal2 = .0f; } } LuaTable lvupCfg = ConfigManager.Instance.Actor.GetLevelUpConfig(dst_level); double aviod_param1 = lvupCfg.Get <float>("lv_pvesubdamage"); dmgParam = ConfigManager.Instance.Consts.GetValue <string>(61, "param"); param1 = dmgParam.Split('#'); double aviod_param2 = 0.8f; double aviod_param3 = 0.0f; string[] param2 = null; if (param1.Length > 1) { param2 = param1[1].Split(','); } if (null != param2 && param2.Length == 2) { if (!double.TryParse(param2[0], out aviod_param2)) { aviod_param2 = 0.8f; } if (!double.TryParse(param2[1], out aviod_param3)) { aviod_param3 = 0.0f; } } double damage_f1 = 0.0f; double damage_f2 = 0.0f; double damage_f3 = 0.0f; double dst_def = Math.Max(1, beAtker.Def - attker.SubDef); double dst_avoid_rate = (dst_def / (dst_def + dst_level * aviod_param1)) * aviod_param2 + aviod_param3; damage_f1 = (attack_dmg * UnityEngine.Random.Range(nVal1, nVal2) * (1.0f) + extra_attr_dmg) * (1 - dst_avoid_rate); // �����Ƿ�; param2 = null; if (param1.Length > 2) { param2 = param1[2].Split(','); } double critical_param1 = 0.6f; double critical_param2 = 0.0f; double critical_param3 = 3.0f; if (null != param2 && param2.Length == 3) { if (!double.TryParse(param2[0], out critical_param1)) { critical_param1 = 0.6f; } if (!double.TryParse(param2[1], out critical_param2)) { critical_param2 = 0.0f; } if (!double.TryParse(param2[2], out critical_param3)) { critical_param3 = 3.0f; } } double cridam_param1 = 0.5f; double cridam_param2 = 0.2f; param2 = null; if (param1.Length > 3) { param2 = param1[3].Split(','); } if (null != param2 && param2.Length == 2) { if (!double.TryParse(param2[0], out cridam_param1)) { cridam_param1 = 0.5f; } if (!double.TryParse(param2[1], out cridam_param2)) { cridam_param2 = 0.2f; } } double src_critical = attker.Cri; double src_critical_dmg = attker.CriValue; double puncture = attker.AbsAtk; double dst_tenacity = beAtker.DefCri; double dst_critical_def = beAtker.SubCri; double critical_rate = 0.0f; critical_rate = (src_critical / (src_critical + dst_tenacity * critical_param3)) * critical_param1 + critical_param2; double critical_dmg = Math.Max((src_critical_dmg - dst_critical_def + cridam_param1), cridam_param2); // ����; bool isCritical = false; if (UnityEngine.Random.Range(0.0f, 1.0f) < critical_rate) { isCritical = true; damage_f2 = (damage_f1 + puncture) * (1 + critical_dmg); } else { isCritical = false; damage_f2 = (damage_f1 + puncture); } // �����Ƿ�����,Э��û�������ֶΣ���ȥ�� // �����˺�; double mindmg_param = 0.5f; //��С�˺�ϵ��; damage_f3 = Math.Max(src_level * mindmg_param, damage_f2); dmg_value = damage_f3; //3.�˺������ͼ���; dmg_value = dmg_value * (1 + (attker.DmgAdd * 0.01f)); dmg_value = dmg_value * (1 - (beAtker.DmgSub * 0.01f)); //4.�˺�ֵ�����ָ���; if (dmg_value <= 1) { dmg_value = 100.0; } ActorObj behitActorObj = damageParam.behitActor; BehitParam behitParam = new BehitParam(); behitParam.displayType = DamageDisplayType.DDT_NORMAL; behitParam.hp = (int)dmg_value; behitParam.damgageInfo = damageParam; behitActorObj.OnSkillBeHit(behitParam); DoCalHP(behitIndex, dmg_value, isCritical); }