Пример #1
0
        public override void OnLateUpdate()
        {
            if (Input.GetKey(KeyCode.KeypadMinus))
            {
                ExternOBCameraMoveSpeed -= MoveSpeedUpdateDealt;
            }
            if (Input.GetKey(KeyCode.KeypadPlus))
            {
                ExternOBCameraMoveSpeed += MoveSpeedUpdateDealt;
            }

            if (Input.GetKey(KeyCode.PageDown))
            {
                ExternOBCamerFOV -= FOVUpdateDealt;
            }
            if (Input.GetKey(KeyCode.PageUp))
            {
                ExternOBCamerFOV += FOVUpdateDealt;
            }

            if (Input.GetKey(KeyCode.KeypadDivide))
            {
                ExternOBCameraRoateSpeed -= RoateSpeedUpdateDealt;
            }
            if (Input.GetKey(KeyCode.KeypadMultiply))
            {
                ExternOBCameraRoateSpeed += RoateSpeedUpdateDealt;
            }


            float FinalMoveSpeed = moveSpeed + ExternOBCameraMoveSpeed;
            float RoateSpeed     = 30 + ExternOBCameraRoateSpeed;

            if (soldierController != null && CameraEffectUtil.MainInstance.canPlayControl)
            {
                setFPS(false);
                if (InputManager.GetKey(KeyCode.Keypad4))
                {
                    setFPS(true);
                    this.mouseCtrl.fMouseAxisX = -Time.deltaTime * RoateSpeed;
                }
                else if (InputManager.GetKey(KeyCode.Keypad6))
                {
                    setFPS(true);
                    this.mouseCtrl.fMouseAxisX = Time.deltaTime * RoateSpeed;
                }
                GetInputOBMode(curCameraModeParam.pitchAngleRange);
            }
            Vector3 cOffset = new Vector3(0, curCameraModeParam.targetOffset, 0);

            UpdateTransformOBMode(cOffset); //计算摄像机具体参数
            inputMoveDelta = InputManager.GetAxis(InputAxisSet.Axis_Horizontal) * camTransform.right + InputManager.GetAxis(InputAxisSet.Axis_Vertical) * camTransform.forward;
            inputMoveDelta.Normalize();
            inputMoveDelta        *= FinalMoveSpeed * Time.deltaTime;
            camTransform.position += inputMoveDelta;
            if (InputManager.GetKey(KeyCode.Keypad8))
            {
                camTransform.position += Vector3.up * FinalMoveSpeed * Time.deltaTime / 3;
            }
            else if (InputManager.GetKey(KeyCode.Keypad2))
            {
                camTransform.position -= Vector3.up * FinalMoveSpeed * Time.deltaTime / 3;
            }
            if (InputManager.GetKeyDown(KeyCode.F1))
            {
                soldierCam.SwitchLookAtOBSolider(false);
                UpdateCamera(cOffset);
            }
            else if (InputManager.GetKeyDown(KeyCode.F2))
            {
                soldierCam.SwitchLookAtOBSolider(true);
                UpdateCamera(cOffset);
            }

            GodEyeFocusPosCheckTime += deltaTime;
            if (GodEyeFocusPosCheckTime > 1.0f)
            {
                cmd_entity_master_eye_focus data;
                data.isGodMode = 1;
                data.x         = camTransform.position.x;
                data.y         = camTransform.position.y;
                data.z         = camTransform.position.z;

                IntPtrHelper  helper = new IntPtrHelper();
                System.IntPtr ptr    = helper.toPtr <cmd_entity_master_eye_focus>(ref data);
                int           len    = System.Runtime.InteropServices.Marshal.SizeOf(data);

                GameLogicAPI.onEntityEvent(EntityFactory.MainHeroID, (int)EntityLogicDef.ENTITY_CMD_MASTER_EYE_FOCUS, len, "", ptr, len);

                GodEyeFocusPosCheckTime = 0;
            }
        }
        // 设置排位信息
        public void setRankInfo(cmd_entity_end_player_data selfData)
        {
            Debug.Log(String.Format("{0}({1}),{2},当前分:{3},上次分:{4}本局分:{5}", selfData.nMatchType, selfData.szMatchTypeName, selfData.nUpgradeRank, selfData.nPlayerMatchScore,
                                    selfData.nPreMatchTypeScore, selfData.nMatchScore));

            // 胜利且是排位赛才显示
            if ((EMMatchType)selfData.nMatchType == EMMatchType.MatchType_Rank)
            {
                // todo 战场的要单独处理下 王者段位以上的 只加分了 段位是单独换算的
                int    nBaseKingRankScore = GameLogicAPI.getMatchtTypeBaseKingRankScore(selfData.nMatchType);
                int    nMatchType         = selfData.nMatchType;
                int    nCurRankScore      = selfData.nPlayerMatchScore;
                int    nRankIconID        = GameLogicAPI.getActorRankIconID(nMatchType, nCurRankScore);
                int    nRankStar          = 0;
                string strRankName        = "";
                if (nCurRankScore >= nBaseKingRankScore)
                {
                    if (selfData.nPreMatchTypeScore >= nBaseKingRankScore)
                    {
                        // 本来就是王者段位的就取以前的等级
                        nRankIconID = GameLogicAPI.getRankIconIDByGrade(nMatchType, selfData.nPreMatchTypeGrade);
                        nRankStar   = GameLogicAPI.getActorRankStar(nMatchType, nBaseKingRankScore);
                        // 段位名称
                        IntPtr ptr = GameLogicAPI.getActorRankNameByGrade(nMatchType, selfData.nPreMatchTypeGrade);
                        if (ptr != IntPtr.Zero)
                        {
                            strRankName = IntPtrHelper.Ptr2Str(ptr);
                        }

                        // 升星级个数
                        int nDiff = 0;
                        if (selfData.nCurStarSection > 0)
                        {
                            nDiff = selfData.nMatchScore / selfData.nCurStarSection;
                        }

                        //当前星级 +
                        if (nDiff < 0)
                        {
                            StarUpDesc.gameObject.SetActive(true);
                            StarUpDesc.text = String.Format("星级:{0} 本局星级{1}", nRankStar, nDiff);
                        }
                        else if (nDiff > 0)
                        {
                            StarUpDesc.gameObject.SetActive(true);
                            StarUpDesc.text = String.Format("星级:{0} 本局星级+{0}", nRankStar, nDiff);
                        }
                        else
                        {
                            StarUpDesc.gameObject.SetActive(false);
                        }
                    }
                    else
                    {
                        // 新升级到王者段位的
                        nRankIconID = GameLogicAPI.getActorRankIconID(nMatchType, nCurRankScore);
                        nRankStar   = GameLogicAPI.getActorRankStar(nMatchType, nCurRankScore);
                        // 段位名称
                        IntPtr ptr = GameLogicAPI.getActorRankName(nMatchType, nCurRankScore);
                        if (ptr != IntPtr.Zero)
                        {
                            strRankName = IntPtrHelper.Ptr2Str(ptr);
                        }

                        if (selfData.nUpgradeRank > 0)
                        {
                            StarUpDesc.gameObject.SetActive(true);
                            StarUpDesc.text = String.Format("星级+{0}", 1);
                        }
                    }
                    GradeDesc.text = strRankName;
                }
                else
                {
                    nRankStar = GameLogicAPI.getActorRankStar(nMatchType, nCurRankScore);
                    int nMaxRankStar = GameLogicAPI.getActorCurRankMaxStar(nMatchType, nCurRankScore);

                    int nOldRankScore = selfData.nPreMatchTypeScore;
                    int nOldRankStar  = GameLogicAPI.getActorRankStar(nMatchType, nOldRankScore);

                    // 段位名称
                    IntPtr ptr = GameLogicAPI.getActorRankName(nMatchType, nCurRankScore);
                    if (ptr != IntPtr.Zero)
                    {
                        strRankName = IntPtrHelper.Ptr2Str(ptr);
                    }
                    GradeDesc.text = strRankName;

                    // 当前段位所有星级
                    m_RankIconList = new Image[nMaxRankStar];
                    for (int i = 0; i < nMaxRankStar; ++i)
                    {
                        GameObject RankIconItem = ResNode.InstantiateRes(RankIconDefaultItem);
                        RankIconItem.transform.SetParent(RankIconDefaultItem.transform.parent, false);
                        RankIconItem.SetActive(true);

                        m_RankIconList[i] = RankIconItem.GetComponent <Image>();
                    }

                    // 当前拥有星级
                    for (int j = 0; j < nRankStar; ++j)
                    {
                        m_RankIconList[j].sprite = USpriteManager.Instance.GetSprite(USpriteManager.ESpriteType.EST_RankStarImage, WndID.WND_ID_WAR_RECORDTABLE_END, 2);
                    }

                    if (selfData.nUpgradeRank == 0) // 段位未发生改变
                    {
                        // 升星级个数
                        int nDiff = nRankStar - nOldRankStar;
                        if (nDiff < 0)
                        {
                            StarUpDesc.gameObject.SetActive(true);
                            StarUpDesc.text = String.Format("星级{0}", nDiff);
                        }
                        else if (nDiff > 0)
                        {
                            StarUpDesc.gameObject.SetActive(true);
                            StarUpDesc.text = String.Format("星级+{0}", nDiff);
                        }
                        else
                        {
                            StarUpDesc.gameObject.SetActive(false);
                        }
                    }
                    else if (selfData.nUpgradeRank < 0)
                    {
                        StarUpDesc.gameObject.SetActive(true);
                        StarUpDesc.text = String.Format("星级-{0}", 1);
                    }
                    else if (selfData.nUpgradeRank > 0)
                    {
                        StarUpDesc.gameObject.SetActive(true);
                        StarUpDesc.text = String.Format("星级+{0}", 1);
                    }
                }
            }
            else
            {
                RankScoreTip.gameObject.SetActive(false);
            }

            SSchemeWarStatisticMapConfig warStatConfig = ASpeedGame.Data.WarStatisticMap.WarStatisticMapConfig.Instance.getWarStatMapConfig(selfData.nMatchType);

            if (warStatConfig != null)
            {
                MatchTypeText.text = warStatConfig.strName;
            }
            else
            {
                MatchTypeText.text = "";
            }
        }
Пример #3
0
        public void SetBuffInfo(UIMsgCmdData uiBuffData)
        {
            cmd_creature_setBuff data = IntPtrHelper.toData <cmd_creature_setBuff>(uiBuffData.ptrParam);

            SetHeroBuff(data);
        }
        //
        // The overlapped function called (either by the thread pool or the socket)
        // when IO completes. (only called on Win9x)
        //
        private void OverlappedCallback(object stateObject, bool Signaled)
        {
#if DEBUG
            // GlobalLog.SetThreadSource(ThreadKinds.Worker);  Because of change 1077887, need logic to determine thread type here.
            using (GlobalLog.SetThreadKind(ThreadKinds.System)) {
#endif
            BaseOverlappedAsyncResult asyncResult = (BaseOverlappedAsyncResult)stateObject;

            GlobalLog.Assert(!asyncResult.InternalPeekCompleted, "AcceptOverlappedAsyncResult#{0}::OverlappedCallback()|asyncResult.IsCompleted", ValidationHelper.HashString(asyncResult));
            //
            // the IO completed asynchronously, see if there was a failure the Internal
            // field in the Overlapped structure will be non zero. to optimize the non
            // error case, we look at it without calling WSAGetOverlappedResult().
            //
            uint errorCode = (uint)Marshal.ReadInt32(IntPtrHelper.Add(asyncResult.m_UnmanagedBlob.DangerousGetHandle(),
                                                                      Win32.OverlappedInternalOffset));
            uint numBytes = errorCode != 0 ? unchecked ((uint)-1) : (uint)Marshal.ReadInt32(IntPtrHelper.Add(asyncResult.m_UnmanagedBlob.DangerousGetHandle(),
                                                                                                             Win32.OverlappedInternalHighOffset));
            //
            // this will release the unmanaged pin handles and unmanaged overlapped ptr
            //
            asyncResult.ErrorCode = (int)errorCode;
            object returnObject = asyncResult.PostCompletion((int)numBytes);
            asyncResult.ReleaseUnmanagedStructures();
            asyncResult.InvokeCallback(returnObject);
#if DEBUG
        }
#endif
        }
Пример #5
0
        // 接受消息
        public override void OnMessage(WndMsgID msgID, UIMsgData msgData)
        {
            switch (msgID)
            {
            case WndMsgID.WND_MSG_COMMON_BATTLESTATE_ENTER:
            {
                this.SetVisible(true);
            }
            break;

            case WndMsgID.WND_MSG_COMMOM_WARHEROMAXSKILLSTATE:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData           uiMaxSkillData = (UIMsgCmdData)msgData;
                cmd_player_skill_state data           = IntPtrHelper.toData <cmd_player_skill_state>(uiMaxSkillData.ptrParam);
                SetMyTeamSkillIcon(data);
            }
            break;

            case WndMsgID.WND_MSG_TEAMRIGHT_INITMYTEAMUID:
            {
                UIMsgCmdData uiUIDData = (UIMsgCmdData)msgData;
                SaveUIDAndPBUID(uiUIDData.ptrParam, uiUIDData.nPtrLen);
            }
            break;

            case WndMsgID.WND_MSG_COMMON_WAREND:
            case WndMsgID.WND_MSG_COMMON_BATTLESTATE_LEAVE:
            {
                this.UnloadView();

                LogicDataCenter.recordTableDataManager.m_bUpdateTeamInfo = true;
            }
            break;

            case WndMsgID.WND_MSG_WAR_XPSKILL_SET_XP_SKILL_SELF:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData uiData            = (UIMsgCmdData)msgData;
                cmd_creature_ShowPromptUI data = IntPtrHelper.toData <cmd_creature_ShowPromptUI>(uiData.ptrParam);
                SetXpSkillFireEffect(data);
            }
            break;

            case WndMsgID.WND_MSG_WAR_XPSKILL_SET_XP_SKILL_OTHER:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData uiData            = (UIMsgCmdData)msgData;
                cmd_creature_ShowPromptUI data = IntPtrHelper.toData <cmd_creature_ShowPromptUI>(uiData.ptrParam);
                SetXpSkillFireEffect(data);
            }
            break;

            case WndMsgID.WND_MSG_TEAMMATEINFO_UPDATETEAMINFO:
            {
                if (m_wndView == null)
                {
                    return;
                }

                m_wndView.SetData();
            }
            break;

            case WndMsgID.WND_MSG_BATTLEWAR_LIFESTATE:
            {
                if (m_wndView != null)
                {
                    m_wndView.OnUpdateLifeState(msgData as UBattleWarLifeState);
                }
            }
            break;

            case WndMsgID.WND_MSG_WAR_UPDATE_HEROICON:
            {
                if (m_wndView != null)
                {
                    m_wndView.updateHeroIcon(msgData as UIWarUpdateHeroIcon);
                }
            }
            break;

            default:
                break;
            }
        }
Пример #6
0
 /// <summary>
 /// 异步PostMessage
 /// </summary>
 /// <param name="hwnd"></param>
 /// <param name="msg"></param>
 /// <param name="wparam"></param>
 /// <param name="lparam"></param>
 /// <returns></returns>
 public async static Task <int> PostMessageAsync(IntPtrHelper hwnd, IntHelper msg, IntHelper wparam, IntPtrHelper lparam)
 {
     return(await Task.Factory.StartNew <int>(() =>
     {
         return PostMessage(hwnd, msg, wparam, lparam);
     }));
 }
Пример #7
0
        public void ActorInfoChangeUpdate(IntPtr ptrParam, int nPtrLen, int nActorID = nDefaultSelfActorID)
        {
            CheckGetSelfPDBID(ref nActorID);
            if (!actorPlayer.ContainsKey(nActorID))
            {
                return;
            }

            cmd_actor_info_change data = IntPtrHelper.toData <cmd_actor_info_change>(ptrParam);

            switch (data.nType)
            {
            case (int)ENPLAYERINFOTYPE.ENPLAYERINFOTYPE_LEVEL:
            {
                actorPlayer[nActorID].playerInfo.nLv = data.nValue1;
            }
            break;

            case (int)ENPLAYERINFOTYPE.ENPLAYERINFOTYPE_PKWINNUM:
            {
                actorPlayer[nActorID].playerInfo.nPKWinNum = data.nValue1;
            }
            break;

            case (int)ENPLAYERINFOTYPE.ENPLAYERINFOTYPE_PKTOTALNUM:
            {
                actorPlayer[nActorID].playerInfo.nPKTotalNum = data.nValue1;
            }
            break;

            case (int)ENPLAYERINFOTYPE.ENPLAYERINFOTYPE_EXP:
            {
                actorPlayer[nActorID].playerInfo.ulCurrentExp = (uint)data.nValue1;
                actorPlayer[nActorID].playerInfo.ulNeedExp    = (uint)data.nValue2;
            }
            break;

            case (int)ENPLAYERINFOTYPE.ENPLAYERINFOTYPE_NAME:
            {
                actorPlayer[nActorID].playerInfo.chPlayerName = data.str1;

                if (EntityFactory.MainHeroView != null)
                {
                    CreatureProperty property = EntityFactory.MainHeroView.Property;
                    if (property != null)
                    {
                        property.CreatureName = data.str1;
                    }
                }
            }
            break;

            case (int)ENPLAYERINFOTYPE.ENPLAYERINFOTYPE_GLORY:
            {
                for (int i = 0; i < (int)ENACHIEVE.ENACHIEVE_MAX; i++)
                {
                    actorPlayer[nActorID].playerInfo.nGlory[i]  = data.nGlory[i];
                    actorPlayer[nActorID].playerInfo.llWarID[i] = data.llWarID[i];
                }
            }
            break;

            case (int)ENPLAYERINFOTYPE.ENPLAYERINFOTYPE_RANKNUM:
            {
                actorPlayer[nActorID].playerInfo.nRankMatchNum = data.nValue1;
                actorPlayer[nActorID].playerInfo.nRankWinNum   = data.nValue2;
            }
            break;

            default:
                break;
            }
        }
Пример #8
0
    public void addMonsterEffect(U3D_Render.EntityView dieEv, ulong uMurderID)
    {
        if (dieEv == null || dieEv.CampFlag != SPELL.CampFlag.CampFlag_Enemy || !CheckMonsterType(dieEv))
        {
            return;
        }

        U3D_Render.EntityView mainEv = EntityFactory.getMainPlayer();

        if (mainEv == null || mainEv.StateMachine.GetState() == GameLogic.EntityState.Dead)
        {
            return;
        }

        Vector3 monsterLoc = dieEv.gameObject.transform.position;
        Vector3 heroLoc    = mainEv.gameObject.transform.position;

        int  effectCount         = 0;
        bool needPlayMoneyEffect = false;
        //根据死亡对象类型控制光效数量
        int    vocationID   = dieEv.createinfo.nHeroID;
        string dieEffectMsg = "";
        IntPtr strPtr       = GameLogicAPI.toCoinLighting(vocationID, (int)ENTITY_TYPE.TYPE_MONSTER);

        if (strPtr != null)
        {
            dieEffectMsg = IntPtrHelper.Ptr2Str(strPtr);
        }
        if (dieEffectMsg.Contains(GameLogicConfigApi.MoneyEffect.ToString()))
        {
            needPlayMoneyEffect = true;
        }

        if ((ulong)mainEv.ID == uMurderID && GameLogicAPI.isInWarScene() != 0)
        {
            //如果是怪物类型
            if (dieEv.Type == ENTITY_TYPE.TYPE_MONSTER)
            {
                //中立野怪
                //if ((int)MONSTER_SUB_TYPE.MONSTER_SUB_TYPE_WILD_MONSTER == dieEv.Flag)
                effectCount = 3;    //小兵和野怪都是3个
            }
            else if (dieEv.Type == ENTITY_TYPE.TYPE_PLAYER_ROLE)
            {
                effectCount = 6;    //英雄6个
            }

            if (effectCount > 0 && needPlayMoneyEffect)
            {
                LightingEffectBehavior moneyEff = EffectHelper.PlayAndReturnEffect(ref mainEv, GameLogicConfigApi.MoneyEffect, mainEv.ID, mainEv.ID, monsterLoc, 0, 2);
                if (moneyEff != null)
                {
                    LightingEffectBehavior_Area effect = (LightingEffectBehavior_Area)moneyEff;
                    effect.SetEffectCount(effectCount);
                }
            }
            LightingEffectBehavior deadEff = EffectHelper.PlayAndReturnEffect(ref dieEv, GameLogicConfigApi.MonsterDeadEffect, dieEv.ID, dieEv.ID, monsterLoc, 0, 2);
            return;
        }

        int nMonsterDistance = GameLogicConfigApi.MonsterDistance;
        int nTowerDistance   = GameLogicConfigApi.TowerDistance;

        if ((monsterLoc - heroLoc).sqrMagnitude > (nMonsterDistance * nMonsterDistance))
        {
            return;
        }

        IList <U3D_Render.EntityView> monster_Entities = MapFinderManager.Nearest(monsterLoc, /*nTowerDistance*/ nMonsterDistance, SPELL.CampFlag.CampFlag_Self);

        if (monster_Entities == null)
        {
            return;
        }

        int   nMainID = 0;
        float fMinDis = 0.0f;

        foreach (U3D_Render.EntityView monsterEv in monster_Entities)
        {
            if (HeroDistanceMgr.CheckDistance(dieEv, monsterEv, nMonsterDistance) == false || monsterEv == null)
            {
                continue;
            }

            if ((int)MONSTER_SUB_TYPE.MONSTER_SUB_TYPE_DEFENSIVE_TOWER == monsterEv.Flag)
            {
                //return;
            }
            else if (ENTITY_TYPE.TYPE_PLAYER_ROLE == monsterEv.Type)
            {
                float fEntityDistance = (monsterLoc - monsterEv.gameObject.transform.position).sqrMagnitude;
                if (fMinDis == 0 || fEntityDistance < fMinDis)
                {
                    fMinDis = fEntityDistance;
                    nMainID = monsterEv.ID;
                }
            }
        }

        U3D_Render.EntityView view = EntityFactory.getEntityViewByID((int)uMurderID);

        if (nMainID == mainEv.ID && (ulong)nMainID != uMurderID && (int)MONSTER_SUB_TYPE.MONSTER_SUB_TYPE_DEFENSIVE_TOWER != view.Flag)
        {
            if ((view.InitMaskFlag & (int)ENTITY_MASKFLAG.MASKFLAG_DIE_NO_COMMONLIGHT) != (int)ENTITY_MASKFLAG.MASKFLAG_DIE_NO_COMMONLIGHT)
            {
                EffectHelper.Play(ref dieEv, GameLogicConfigApi.MonsterDeadEffect, dieEv.ID, mainEv.ID, monsterLoc);
            }
        }
    }
Пример #9
0
    // 进入状态
    public bool OnEnter(IntPtr lParam)
    {
        //if (m_pFSM.animator)
        //{
        //    m_pFSM.animator.SetTrigger("BreakAttack");
        //    m_pFSM.animator.SetBool("isDead", true);
        //   m_pFSM.animator.Play("Dead");

        //}

        cmd_creature_die cmdDie    = IntPtrHelper.toData <cmd_creature_die>(lParam);
        ulong            uMurderID = cmdDie.uMurderID;

        m_pFSM.SetAnimatorTrigger("BreakAttack");
        m_pFSM.SetAnimatorBool("isDead", true);
        m_pFSM.AnimatorPlay("Dead");
        m_pFSM.outLineCount = m_pFSM.outLineCount - 1;
        m_pFSM.setHightLight(false);

        //关闭死亡时要求关闭的光效
        LightingEffectManager light = m_pFSM.GetComponent <LightingEffectManager>();

        if (light)
        {
            light.CloseLightingWhenDead();
        }

        ////暂时让角色死亡不让射线检测该层
        //nOldLayer = m_pFSM.gameObject.layer;
        //GameUtil.SetLayer(LayerMask.NameToLayer(Config.LayerNeutrality), m_pFSM.gameObject, true);

        //if (m_pFSM.SkinConfig)
        //{
        //    if (m_pFSM.SkinConfig.ScreenCastObject)
        //    {
        //        m_pFSM.SkinConfig.ScreenCastObject.layer = LayerMask.NameToLayer(Config.LayerPlayerFriend);
        //    }

        //}
        //else
        //{
        //    Debug.Log(m_pFSM.entityID.ToString());
        //}

        if (m_pFSM.SkinConfig != null && m_pFSM.SkinConfig.ColliderShape != null)
        {
            m_pFSM.SkinConfig.ColliderShape.enabled = false;
        }
        m_pFSM.pickableCount--;

        //GfxBloodManager.OnEntityDead(m_pFSM.entityID,ENTITY_TYPE.TYPE_MONSTER);
        USpeedUI.Blood.UBloodManager.Instance.OnEntityDead(m_pFSM.entityID, ENTITY_TYPE.TYPE_MONSTER);
        //TopNameManager.OnEntityDead(m_pFSM.entityID, ENTITY_TYPE.TYPE_MONSTER);
        isOnThisState      = true;
        MaxDeadTimeCounter = 0.0f;

        int nEntityID = m_pFSM.entityID;

        U3D_Render.EntityView ev = EntityFactory.getMonsterViewByID(nEntityID);
        addMonsterEffect(ev, uMurderID);

        //死亡通知引导,死亡时间不确定,目前只想到在这硬编码了
        if (ev.CampFlag == SPELL.CampFlag.CampFlag_Enemy && ev.Type == ENTITY_TYPE.TYPE_MONSTER && ev.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_SEX) == (int)MONSTER_TYPE.MONSTER_TYPE_TOWER)
        {
            GUIDE.GuideManager.Instance.SetBBValue(GUIDE.EGuideBBKey.DeadEntityID, ev.ID);
        }

        if (ev != null)
        {
            MapFinderManager.RemoveObject(ref ev);
        }

        return(true);
    }
Пример #10
0
        public void SetData(UListWarMainModeItem item)
        {
            HeadIcon.sprite = USpriteManager.Instance.GetSprite(USpriteManager.ESpriteType.EST_WarMainMode, WndID.WND_ID_WAR_MAIN_FRAME, item.nModeID);
            if (HeadIcon.sprite == null)
            {
                HeadIcon.gameObject.SetActive(false);
            }
            else
            {
                HeadIcon.gameObject.SetActive(true);
            }
            RankInvalidFrame.gameObject.SetActive(false);
            RankFrame.gameObject.SetActive(false);
            RankTipBtn.gameObject.SetActive(false);
            RankStarFrame.gameObject.SetActive(false);
            if (item.nModeID == (int)EWarModeDef.MODE_RankVS)
            {
                RankTipBtn.gameObject.SetActive(true);
                // 自己是否有排位信息
                int    nMatchType   = EntityFactory.MainHeroView.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_MATCHTYPE);
                int    nRankScore   = EntityFactory.MainHeroView.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_RANKSCORE);
                int    nRankGrade   = EntityFactory.MainHeroView.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_RANKGRADE);
                int    nRankIconID  = GameLogicAPI.getRankIconIDByGrade(nMatchType, nRankGrade);
                int    nRankStar    = GameLogicAPI.getActorRankStar(nMatchType, nRankScore);
                int    nMaxRankStar = GameLogicAPI.getActorCurRankMaxStar(nMatchType, nRankScore);
                IntPtr ptr          = GameLogicAPI.getActorRankNameByGrade(nMatchType, nRankGrade);
                string strRankName  = "";
                if (ptr != IntPtr.Zero)
                {
                    strRankName = IntPtrHelper.Ptr2Str(ptr);
                }

                RankImg.sprite = USpriteManager.Instance.GetSprite(USpriteManager.ESpriteType.EST_RankImage, WndID.WND_ID_WAR_MAIN_FRAME, 1, nRankIconID);
                if (RankImg.sprite == null || nRankScore <= 0)
                {
                    RankInvalidFrame.gameObject.SetActive(true);
                    RankFrame.gameObject.SetActive(false);
                }
                else
                {
                    RankStarFrame.gameObject.SetActive(true);
                    for (int index = 0; index < RankStarFrame.childCount; ++index)
                    {
                        if (nRankStar > 0)
                        {
                            RankStarFrame.GetChild(index).GetComponent <Image>().sprite = USpriteManager.Instance.GetSprite(USpriteManager.ESpriteType.EST_RankStarImage, WndID.WND_ID_WAR_MAIN_FRAME, 2);
                            nRankStar--;
                            nMaxRankStar--;
                        }
                        else if (nMaxRankStar > 0)
                        {
                            RankStarFrame.GetChild(index).GetComponent <Image>().sprite = USpriteManager.Instance.GetSprite(USpriteManager.ESpriteType.EST_RankStarImage, WndID.WND_ID_WAR_MAIN_FRAME, 1);
                            nMaxRankStar--;
                        }
                        else
                        {
                            RankStarFrame.GetChild(index).GetComponent <Image>().gameObject.SetActive(false);
                        }
                    }

                    RankInvalidFrame.gameObject.SetActive(false);
                    RankFrame.gameObject.SetActive(true);

                    // 设置胜场 胜率  段位描述 星级
                    ActorPlayerInfo info    = LogicDataCenter.playerSystemDataManager.GetActorPlayerInfo();
                    int             WinRate = info.playerInfo.nRankMatchNum > 0? (info.playerInfo.nRankWinNum * 100 / info.playerInfo.nRankMatchNum): 0;
                    RankDetailDes.text = String.Format("{0}:", ULocalizationService.Instance.Get("UIView", "WarStatistic", "MapWinCount")) + info.playerInfo.nRankWinNum + "  " + String.Format("{0}:", ULocalizationService.Instance.Get("UIView", "WarStatistic", "MapWinRate")) + WinRate + "%";
                    RankGradeDes.text  = strRankName;
                    RankScore.text     = "" + nRankScore;

                    if (m_RankEffectParam != null)
                    {
                        UEffectManager.Instance.DestroyEffect(UEffectType.UET_EffectPrefab, ref m_RankEffectParam);
                        m_RankEffectParam = null;
                    }

                    int nOffset = info.playerInfo.nRankIconID - 1;
                    if (nOffset >= 0)
                    {
                        UEffectParamBase param = new UEffectPrefabParam(_eType: UEffectPrefabType.UEPT_WarMain_RankEffect1 + nOffset, _tfAttachParent: this.RankImg.transform);
                        UEffectManager.Instance.CreateEffect(UEffectType.UET_EffectPrefab, ref param);

                        m_RankEffectParam = param;
                        UEffectPrefabParam paramPrefab = (UEffectPrefabParam)param;
                        paramPrefab.EffectGameObject.transform.SetAsFirstSibling();
                    }
                }
            }

            // 隐藏模式详细描述 以及 图片
            ModeDesText.text = item.strModeDesc;
            ModeDesText.gameObject.SetActive(false);

            // 设置tooltip
            //m_tooltip = this.gameObject.AddComponent<UTooltipTrigger>(ETooltipStyle.ETS_Default);
            //if (m_tooltip)
            //{
            //    string stTitleDesc = item.strModeTooltip;
            //    UBB.toHtml(ref stTitleDesc, UBB_FORMAT_TYPE.UGUI);
            //    m_tooltip.SetText(UTooltipParamName.BodyText, "<color=#FFFFFFFF><size=20>" + stTitleDesc + "</size></color>");
            //    m_tooltip.tipPosition = TipPosition.MouseTopRightCorner;
            //    m_tooltip.backgroundTint.a = 0;
            //}

            if (m_OpenEffectParam != null)
            {
                UEffectManager.Instance.DestroyEffect(UEffectType.UET_EffectPrefab, ref m_OpenEffectParam);
                m_OpenEffectParam = null;
            }

            if (item.bOpenEffect)
            {
                UEffectParamBase param = new UEffectPrefabParam(_eType: UEffectPrefabType.UEPT_WarMain_CanJoinEffect, _tfAttachParent: this.HeadIcon.transform);
                UEffectManager.Instance.CreateEffect(UEffectType.UET_EffectPrefab, ref param);

                m_OpenEffectParam = param;
                UEffectPrefabParam paramPrefab = (UEffectPrefabParam)param;
                paramPrefab.EffectGameObject.transform.SetAsFirstSibling();
            }

            ItemData = item;


            #region 新手引导部分
            if (!item.bUseGuideWidget)
            {
                gameObject.RemoveComponent <Guide.UGuideWidget>();
            }
            else
            {
                Guide.UGuideWidget guideWidget = gameObject.GetComponent <Guide.UGuideWidget>();
                if (guideWidget == null)
                {
                    guideWidget = this.gameObject.AddComponent <Guide.UGuideWidget>();
                }
                guideWidget.GuideID       = (GUIDE.EGuideNodeID)item.GuideWidgetData.nGuideID;
                guideWidget.GuideStepID   = item.GuideWidgetData.nGuideStepID;
                guideWidget.GuideEffectID = item.GuideWidgetData.nGuideEffectID;
                guideWidget.IsForceGuide  = item.GuideWidgetData.bForeceGuide;
            }
            #endregion
        }
Пример #11
0
    private void DebugEntityInfo(int _nScreenWidth, int _nScreenHeight)
    {
        if (!CheckVisible(EPreframeArea.EPA_Entity))
        {
            return;
        }

        if (InputManager.GetMouseButtonUp(0))
        {
            RaycastHit hit;
            Ray        ray = Initialize.mainCam.ScreenPointToRay(InputManager.MousePosition);
            if (Physics.Raycast(ray, out hit, 100, bDebugScreenRayCastLayer))
            {
                BaseStateMachine bs = hit.transform.GetComponentInParent <BaseStateMachine>();
                if (bs)
                {
                    Debug_CurrentSelectEntity = EntityFactory.getEntityViewByID(bs.entityID);

                    // 请求指定实体的属性值
                    if (curUid == bs.entityID)
                    {
                        return;
                    }

                    curUid = bs.entityID;
                    cmd_Entity_Property_Prefamce_Req data = new cmd_Entity_Property_Prefamce_Req();
                    data.uidReq = (uint)curUid;
                    IntPtrHelper helper = new IntPtrHelper();
                    IntPtr       ptr    = helper.toPtr <cmd_Entity_Property_Prefamce_Req>(ref data);
                    int          len    = Marshal.SizeOf(data);
                    GameLogicAPI.onEntityEvent(EntityFactory.MainHeroID, (int)EntityLogicDef.ENTITY_CMD_ENTITY_PROPERTY_DRAGONBALL, len, "", ptr, len);
                }
            }
        }
        string str_id          = "-";
        string str_name        = "-";
        string str_clientpos   = "-";
        string str_serverpos   = "-";
        string str_state       = "-";
        string Gravity         = "";
        string SyncVectory     = "";
        string SyncPosition    = "";
        string SkinID          = "";
        string strSkinInstance = "";
        string VisibleState    = "";
        string MaskValue       = "";
        string LayerName       = "";

        if (null != Debug_CurrentSelectEntity)
        {
            if (Debug_CurrentSelectEntity.StateMachine)
            {
                //打开请求服务器位置开关
                Debug_CurrentSelectEntity.StateMachine.requestServerPos = true;
                str_id = Debug_CurrentSelectEntity.ID.ToString();
                if (null != Debug_CurrentSelectEntity.Property)
                {
                    str_id += "[" + Debug_CurrentSelectEntity.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_ID).ToString() + "]";
                }
                str_name      = Debug_CurrentSelectEntity.Property.CreatureName;
                str_clientpos = Debug_CurrentSelectEntity.StateMachine.creature.position.ToString();
                str_state     = Debug_CurrentSelectEntity.StateMachine.GetState().ToString();
                str_serverpos = Debug_CurrentSelectEntity.StateMachine.ServerPos.ToString();
                CreatureStateMachine csm = Debug_CurrentSelectEntity.StateMachine as CreatureStateMachine;
                if (csm)
                {
                    SyncVectory  = csm.syncVelocity.ToString();
                    SyncPosition = csm.syncPosition.ToString();
                }

                Gravity         = Debug_CurrentSelectEntity.StateMachine.currentGravity.ToString();
                VisibleState    = "OnView:\n" + Debug_CurrentSelectEntity.StateMachine.m_OnViewVisible + "\n" + "MaskVisible:" + Debug_CurrentSelectEntity.StateMachine.m_MaskVisible;
                SkinID          = SkinID = Debug_CurrentSelectEntity.StateMachine.SkinControl.currentSkinId.ToString();
                strSkinInstance = "No SkinInstance";
                if (Debug_CurrentSelectEntity.StateMachine.SkinControl.CurrentSkinInstance != null)
                {
                    strSkinInstance = Debug_CurrentSelectEntity.StateMachine.SkinControl.CurrentSkinInstance.nSkinID.ToString();
                }

                MaskValue = Debug_CurrentSelectEntity.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_MASK).ToString();
                LayerName = LayerMask.LayerToName(Debug_CurrentSelectEntity.gameObject.layer);
            }
        }
        string EntityMessageText;

        EntityMessageText = EntityFormatText("实体调试信息:", " ") + EntityFormatText("ID:", str_id) + EntityFormatText("Name:", str_name) +
                            EntityFormatText("ClientPos:", str_clientpos) + EntityFormatText("ServerPos:", str_serverpos) + EntityFormatText("CurrentState:", str_state) +
                            EntityFormatText("攻击力:", str_pa) + EntityFormatText("生命值:", str_hp) + EntityFormatText("护甲值:", str_pd) +
                            EntityFormatText("魔抗值:", str_md) + EntityFormatText("重力速度:", Gravity) + EntityFormatText("SyncVectory:", SyncVectory) + EntityFormatText("SyncPosition:", SyncPosition) +
                            EntityFormatText("SkinID:", SkinID) + EntityFormatText("SkinInstance:", strSkinInstance) + EntityFormatText("VisibleState:", VisibleState) + EntityFormatText("MaskValue:", MaskValue)
                            + EntityFormatText("LayerName:", LayerName);

        DebugMessageTemplate(EPreframeArea.EPA_Entity, EntityMessageText, new Rect(_nScreenWidth - _nScreenWidth * 0.2f - 10, 10, _nScreenWidth * 0.2f, _nScreenHeight));
    }
Пример #12
0
        // 接受消息
        public override void OnMessage(WndMsgID msgID, UIMsgData msgData)
        {
            switch (msgID)
            {
            case WndMsgID.WND_MSG_COMMOM_STATICGAMESTATE_ENTER:
            {
                LoadView();
            }
            break;

            case WndMsgID.WND_MSG_MSTCHTIMEINFO_SHOW:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData       cmdData = (UIMsgCmdData)msgData;
                cmd_add_match_info data    = IntPtrHelper.toData <cmd_add_match_info>(cmdData.ptrParam);
                LogicDataCenter.viewPersonStateDataManager.bIsMatching = true;
                m_wndView.SetVisible(true);
                m_wndView.StartTimer((int)EN_MatchInfo_Timer.ENMT_UsedTimer, data);
                m_wndView.KillTimer((int)EN_MatchInfo_Timer.ENMT_LeftTimer);
            }
            break;

            case WndMsgID.WND_MSG_ACCEPTWAIT_SHOW:
            {
                if (m_wndView == null)
                {
                    return;
                }
                m_wndView.SetVisible(false);
                m_wndView.KillTimer((int)EN_MatchInfo_Timer.ENMT_UsedTimer);
                m_wndView.KillTimer((int)EN_MatchInfo_Timer.ENMT_LeftTimer);
            }
            break;

            case WndMsgID.WND_MSG_MSTCHTIMEINFO_HIDE:
            {
                LogicDataCenter.viewPersonStateDataManager.bIsMatching = false;
                if (m_wndView == null)
                {
                    return;
                }
                m_wndView.SetVisible(false);
                m_wndView.KillTimer((int)EN_MatchInfo_Timer.ENMT_UsedTimer);
                m_wndView.KillTimer((int)EN_MatchInfo_Timer.ENMT_LeftTimer);
            }
            break;

            case WndMsgID.WND_MSG_MSTCHTIMEINFO_CUR_MATCH_PLAYER_COUNT:
            {
                if (!LogicDataCenter.viewPersonStateDataManager.bIsMatching)
                {
                    return;
                }

                if (m_wndView == null)
                {
                    return;
                }
                // 显示玩家人数倒计时间
                UIMsgCmdData cmdData            = (UIMsgCmdData)msgData;
                cmd_match_cur_player_count data = IntPtrHelper.toData <cmd_match_cur_player_count>(cmdData.ptrParam);
                m_wndView.UpdateCurPlayerCount(data.nCurCount, data.nMaxCount, data.nLeftTime);
            }
            break;

            case WndMsgID.WND_MSG_COMMOM_MATCHROOMSTATE_ENTER:
            {
                LogicDataCenter.viewPersonStateDataManager.bIsMatching = false;
                if (m_wndView == null)
                {
                    return;
                }
                m_wndView.SetVisible(false);
                m_wndView.KillTimer((int)EN_MatchInfo_Timer.ENMT_UsedTimer);
                m_wndView.KillTimer((int)EN_MatchInfo_Timer.ENMT_LeftTimer);

                UnloadView();
            }
            break;

            case WndMsgID.WND_MSG_MSTCHTIMEINFO_RETURN_MATCH_SHOW:
            {
                if (m_wndView == null)
                {
                    return;
                }

                m_wndView.SetReturnMatchState();

                m_wndView.SetVisible(true);
            }
            break;

            case WndMsgID.WND_MSG_MSTCHTIMEINFO_RETURN_MATCH_HIDE:
            {
                if (m_wndView == null)
                {
                    return;
                }
                m_wndView.SetVisible(false);
            }
            break;

                #region 新手引导部分
            case WndMsgID.WND_MSG_MSTCHIIMEINFO_GUIDE_ACTIONBEGIN:
            {
                if (m_wndView != null)
                {
                    m_wndView.GuideActionBegin();
                }
            }
            break;

            case WndMsgID.WND_MSG_MSTCHIIMEINFO_GUIDE_ACTIONEND:
            {
                if (m_wndView != null)
                {
                    m_wndView.GuideActionEnd();
                }
            }
            break;

                #endregion
            default:
                break;
            }
        }
Пример #13
0
        // 接受消息
        public override void OnMessage(WndMsgID msgID, UIMsgData msgData)
        {
            switch (msgID)
            {
            case WndMsgID.WND_MSG_TEAMRIGHT_INITMYTEAMDATA:
            {
                // 这个消息无用 以后处理掉一系列消息和结构
                //return;
                //if (m_wndView == null)
                //{
                //    return;
                //}

                //UIMsgCmdData uiTeamRight = (UIMsgCmdData)msgData;

                //InitMyTeamRightToShow(uiTeamRight.ptrParam, uiTeamRight.nPtrLen);
            }
            break;

            case WndMsgID.WND_MSG_COMMON_BATTLESTATE_ENTER:
            {
                this.SetVisible(true);
            }
            break;

            case WndMsgID.WND_MSG_COMMOM_WARHEROMAXSKILLSTATE:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData           uiMaxSkillData = (UIMsgCmdData)msgData;
                cmd_player_skill_state data           = IntPtrHelper.toData <cmd_player_skill_state>(uiMaxSkillData.ptrParam);
                SetMyTeamSkillIcon(data);
            }
            break;

            case WndMsgID.WND_MSG_TEAMRIGHT_INITMYTEAMUID:
            {
                UIMsgCmdData uiUIDData = (UIMsgCmdData)msgData;
                SaveUIDAndPBUID(uiUIDData.ptrParam, uiUIDData.nPtrLen);
            }
            break;

            case WndMsgID.WND_MSG_COMMON_WAREND:
            case WndMsgID.WND_MSG_COMMON_BATTLESTATE_LEAVE:
            {
                this.UnloadView();

                LogicDataCenter.recordTableDataManager.m_bUpdateTeamInfo = true;
            }
            break;

            case WndMsgID.WND_MSG_WAR_XPSKILL_SET_XP_SKILL_SELF:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData uiData            = (UIMsgCmdData)msgData;
                cmd_creature_ShowPromptUI data = IntPtrHelper.toData <cmd_creature_ShowPromptUI>(uiData.ptrParam);
                SetXpSkillFireEffect(data);
            }
            break;

            case WndMsgID.WND_MSG_WAR_XPSKILL_SET_XP_SKILL_OTHER:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData uiData            = (UIMsgCmdData)msgData;
                cmd_creature_ShowPromptUI data = IntPtrHelper.toData <cmd_creature_ShowPromptUI>(uiData.ptrParam);
                SetXpSkillFireEffect(data);
            }
            break;

            case WndMsgID.WND_MSG_TEAMMATEINFO_UPDATETEAMINFO:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UpdateTeamRightViewToShow();
            }
            break;

            case WndMsgID.WND_MSG_WARRELIVETIME_SHOWRELIVETIME:
            {
                UIWarShowReliveTimeData data = msgData as UIWarShowReliveTimeData;
                if (m_wndView == null)
                {
                    return;
                }

                ShowTeamReliveTime(data.uid, data.nReliveTime);
            }
            break;

            default:
                break;
            }
        }
Пример #14
0
        public void SetSkillMPEffect(UIMsgCmdData uiMpEffectData)
        {
            cmd_creature_mp_effect_spell data = IntPtrHelper.toData <cmd_creature_mp_effect_spell>(uiMpEffectData.ptrParam);

            SetMpEffectSpell(data);
        }
Пример #15
0
        // 接受消息
        public override void OnMessage(WndMsgID msgID, UIMsgData msgData)
        {
            switch (msgID)
            {
            case WndMsgID.WND_MSG_COMMOM_STATICGAMESTATE_ENTER:
            {
                this.SetVisible(true);
            }
            break;

            case WndMsgID.WND_MSG_COMMOM_STATICGAMESTATE_LEAVE:
            {
                this.SetVisible(false);
            }
            break;

            case WndMsgID.WND_MSG_COMMON_BATTLESTATE_LEAVE:
            {
                if (m_wndView == null)
                {
                    this.LoadView();
                    AddlistenerMessage();
                }
            }
            break;

            case WndMsgID.WND_MSG_COMMON_LOGINMOBA:
            {
                this.UnloadView();
                RemovelistenerMessage();
            }
            break;

            case WndMsgID.WND_MSG_WARBUTTOMCENTER_SKILLSETSLOT:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData          uiSkillSlot = (UIMsgCmdData)msgData;
                cmd_creature_set_slot data        = IntPtrHelper.toData <cmd_creature_set_slot>(uiSkillSlot.ptrParam);
                SetSpellSlot(data);
            }
            break;

            case WndMsgID.WND_MSG_WARBUTTOMCENTER_SKILLEFFECT:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData          uiSpellEffect = (UIMsgCmdData)msgData;
                cmd_creature_set_slot data          = IntPtrHelper.toData <cmd_creature_set_slot>(uiSpellEffect.ptrParam);

                if (data.nSlotType == SLOT_TYPE.SLOT_TYPE_SKILL)
                {
                    SetSpellSlotEffect(data);
                }
                else if (data.nSlotType == SLOT_TYPE.SLOT_TYPE_GOODS)
                {
                    //  SetPurchasedGoodsUseEffect(data);
                    //  SetPurchasedGoodsCanDragDrop(data);
                }
            }
            break;

            case WndMsgID.WND_MSG_WARBUTTOMCENTER_SKILLOVEREFFECT:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData          uiSpellOverEffect = (UIMsgCmdData)msgData;
                cmd_set_spell_overlay data = IntPtrHelper.toData <cmd_set_spell_overlay>(uiSpellOverEffect.ptrParam);

                SetSpellSlotFlagEffect(data);
            }
            break;

            case WndMsgID.WND_MSG_WARBUTTOMCENTER_SETSHORTCUT:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData uiShortCutData = (UIMsgCmdData)msgData;

                SetSlotShortcutString(uiShortCutData.nParam, uiShortCutData.nPtrLen, uiShortCutData.strParam);
            }
            break;

            case WndMsgID.WND_MSG_WARBUTTOMCENTER_SKILLMPEFFECT:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData uiMpEffectData       = (UIMsgCmdData)msgData;
                cmd_creature_mp_effect_spell data = IntPtrHelper.toData <cmd_creature_mp_effect_spell>(uiMpEffectData.ptrParam);
                SetMpEffectSpell(data);
            }
            break;

            default:
                break;
            }
        }
Пример #16
0
    private void forceFlight()
    {
        uint tick = GameLogicAPI.getTickCount();

        if (m_uResidenceStopTick > 0 && m_uResidenceStopTick > tick)
        {
            return;
        }
        m_fFlightTime += Time.deltaTime;

        float newVel;
        float hight;

        if (m_fFlightVel > 0.0f)
        {
            newVel = m_fFlightV0 - (m_pFSM.currentGravity + upAcc) * m_fFlightTime;
            hight  = m_fFlightV0 * m_fFlightTime - (m_pFSM.currentGravity + upAcc) * m_fFlightTime * m_fFlightTime / 2.0f;
            if (newVel <= 0.0f)
            {
                //上升结束,下降计时清0,开始浮空计时
                m_uResidenceStopTick = tick + m_uResidenceTick;
                m_fFlightDownTime    = 0.0f;

                {
                    //如果没触地,则要一直掉落到地面
                    Vector3    pos = m_pFSM.transform.position + new Vector3(0, 0.1f, 0);
                    int        LayerMaskOnGround = (1 << LayerMask.NameToLayer(Config.LayerDefault)) | (1 << LayerMask.NameToLayer(Config.LayerBuilding));
                    RaycastHit hitInfo;
                    Ray        PointToGroundRay = new Ray(pos, new Vector3(0, -1, 0));
                    Physics.Raycast(PointToGroundRay, out hitInfo, 100, LayerMaskOnGround);
                    if (Mathf.Abs(hitInfo.point.y - pos.y) > m_pFSM.controller.height + 0.6f)
                    {
                        isGounded           = false;
                        m_pFSM.groundNormal = Vector3.zero;
                    }
                }
            }
            CollisionFlags collision = CollisionFlags.None;
            //if (m_fForceMoveSpeed.sqrMagnitude < 0.0001f)
            //{
            //    Vector3 newOffset = new Vector3(m_flightStartPosition.x, m_flightStartPosition.y + hight, m_flightStartPosition.z);
            //    newOffset = newOffset - m_pFSM.transform.position;
            //    collision=m_pFSM.controller.Move(newOffset); 2017-02-15 击退和击飞叠加时,m_flightEndPosition不是击退后的位置,所以不能这么移动
            //}
            //else
            {
                Vector3 newOffset = new Vector3(m_pFSM.transform.position.x, m_flightStartPosition.y + hight, m_pFSM.transform.position.z);
                newOffset = newOffset - m_pFSM.transform.position;
                collision = m_pFSM.controller.Move(newOffset);
            }
            if (0 != (collision & CollisionFlags.Above))
            {
                //touch ceiling
                m_uResidenceStopTick = tick + m_uResidenceTick;
                m_fFlightDownTime    = 0.0f;
                newVel = 0.0f;
            }
        }
        else
        {
            m_fFlightDownTime += Time.deltaTime;
            newVel             = 0 - (m_pFSM.currentGravity + downAcc) * m_fFlightDownTime;
            hight              = m_fFlightHeight - (m_pFSM.currentGravity + downAcc) * m_fFlightDownTime * m_fFlightDownTime / 2.0f;
            CollisionFlags collision = CollisionFlags.None;
            //if (m_fForceMoveSpeed.sqrMagnitude < 0.0001f)
            //{
            //    Vector3 newOffset = new Vector3(m_flightStartPosition.x, m_flightEndPosition.y + hight, m_flightStartPosition.z);
            //    newOffset = newOffset - m_pFSM.transform.position;
            //    collision = m_pFSM.controller.Move(newOffset); 2017-02-15 击退和击飞叠加时,m_flightEndPosition不是击退后的位置,所以不能这么移动
            //}
            //else
            {
                Vector3 newOffset = new Vector3(m_pFSM.transform.position.x, m_flightEndPosition.y + hight, m_pFSM.transform.position.z);
                newOffset = newOffset - m_pFSM.transform.position;
                collision = m_pFSM.controller.Move(newOffset);
            }
            if (0 != (collision & CollisionFlags.Below))
            {
                //touch floor
                m_flightEndPosition.y = m_pFSM.transform.position.y;
            }
        }

        m_fFlightVel = newVel;
        bool isEnd = false;

        if (!isGounded)
        {
            if (m_pFSM.groundNormal.y > 0.01f)
            {
                isGounded = true;
                isEnd     = true;
            }
        }
        else
        {
            if (m_pFSM.transform.position.y <= m_flightEndPosition.y)
            {
                isEnd = true;
            }
        }

        if (m_fFlightVel < 0.0f && isEnd) //已经落到底了
        {
            bForceFlighting = false;
            //if (!bForceMoving) //如果还有强制位移的话,还要继续强制位移
            //{
            //    Vector3 newOffset = m_flightEndPosition;
            //    newOffset = newOffset - m_pFSM.transform.position;
            //    m_pFSM.controller.Move(newOffset); 2017-02-15 击退和击飞叠加时,m_flightEndPosition不是击退后的位置,所以不能这么移动
            //}

            if (m_pFSM.isHero)
            {
                float fallHeight = m_flightStartPosition.y - m_pFSM.transform.position.y;
                if (fallHeight > 5.0f) //着陆时落差大于5米,则上报逻辑层
                {
                    cmd_creature_act_landspeed data = new cmd_creature_act_landspeed();

                    //data.fValue = landingSpeed;
                    data.fValue = fallHeight;

                    IntPtrHelper helper  = new IntPtrHelper();
                    int          len     = Marshal.SizeOf(data);
                    IntPtr       ptr     = helper.toPtr <cmd_creature_act_landspeed>(ref data);
                    int          eventID = (int)EntityLogicDef.ENTITY_CMD_LANDING_SPEED;
                    GameLogicAPI.onEntityEvent(m_pFSM.entityID, eventID, len, "", ptr, len);

                    if (m_pFSM.showLog)
                    {
                        Trace.Log("Big Landing! fallHeight=" + fallHeight.ToString());
                    }
                }
            }

            //冲锋完成后向逻辑层回报一次同步,请根据需求取舍
            //syncVelocity = Vector3.zero;
            //syncDetalTime = 0;
            //syncPosition = transform.position;
            //m_CurStateHandler.Send_Sync_Position();
        }
    }
Пример #17
0
 /// <summary>
 /// SendMessage
 /// </summary>
 /// <param name="hwnd"></param>
 /// <param name="msg"></param>
 /// <param name="wparam"></param>
 /// <param name="lparam"></param>
 /// <returns></returns>
 public static int PostMessage(IntPtrHelper hwnd, IntHelper msg, IntHelper wparam, IntHelper lparam)
 {
     return(PostMessageE(hwnd.Value, msg.Value, wparam.Value, lparam.Value));
 }
Пример #18
0
    private bool m_autoMoveNavModeFollow = false;        //自动寻路启用了转镜头跟随
    public void AutoMoveTo(Vector3 targetPos, bool isFloating, bool rotateCamera = true)
    {
        //已经在控制走路的就不寻路了
        if (m_pFSM.inputMoveDirection.sqrMagnitude > 0.001f)
        {
            return;
        }

        if (m_pFSM.getEntityState() == EntityState.Dead)
        {
            return;
        }

        //强制位移时不自动寻路
        if (m_pFSM.animatorCtrl.bDoingAttackMove || bForceMoving || bForceFlighting)
        {
            return;
        }

        //根据目标点寻路,获得寻路结果
        cmd_map_findpath pathData  = new cmd_map_findpath();
        cmd_map_findpath pathData2 = new cmd_map_findpath();

        pathData2.pathcnt = 0;
        float[] startPoint = new float[3];
        Vector3 startPos   = m_pFSM.transform.position;

        if (isFloating)
        {
            startPos = ProjectToFloor(startPos);
        }
        startPoint[0]  = startPos.x;
        startPoint[1]  = startPos.y;
        startPoint[2]  = startPos.z;
        pathData.start = startPoint;

        float[] endPoint = new float[3];
        endPoint[0]  = targetPos.x;
        endPoint[1]  = targetPos.y;
        endPoint[2]  = targetPos.z;
        pathData.end = endPoint;

        IntPtrHelper helper = new IntPtrHelper();
        IntPtr       ptr    = helper.toPtr <cmd_map_findpath>(ref pathData);

        if (!GameLogicAPI.findPath(ptr))
        {
            return;
        }

        if (m_pFSM.showLog)
        {
            Trace.Log("AutoMove From" + m_pFSM.transform.position.ToString() + " To " + targetPos.ToString());
        }

        pathData = IntPtrHelper.toData <cmd_map_findpath>(ptr);
        if (pathData.pathcnt > 0)
        {
            if (pathData.path.Length < (pathData.pathcnt - 1) * 3 ||
                pathData.path.Length < (pathData.pathcnt - 1) * 3 + 1 ||
                pathData.path.Length < (pathData.pathcnt - 1) * 3 + 2)
            {
                Debug.LogError("寻路长度不合法");
                return;
            }

            Vector3 lastPoint = new Vector3(pathData.path[(pathData.pathcnt - 1) * 3], pathData.path[(pathData.pathcnt - 1) * 3 + 1], pathData.path[(pathData.pathcnt - 1) * 3 + 2]);

            int pointLen = pathData.pathcnt;
            if (isFloating)
            {
                pointLen++;
            }
            //如果到不到终点,强行寻路多一遍。。。
            else if ((targetPos - lastPoint).sqrMagnitude > 0.1f)
            {
                startPos        = ProjectToFloor(lastPoint + (targetPos - lastPoint).normalized * 2.0f);
                startPoint[0]   = startPos.x;
                startPoint[1]   = startPos.y;
                startPoint[2]   = startPos.z;
                pathData2.start = startPoint;
                pathData2.end   = endPoint;

                IntPtrHelper helper2 = new IntPtrHelper();
                IntPtr       ptr2    = helper.toPtr <cmd_map_findpath>(ref pathData2);
                if (GameLogicAPI.findPath(ptr2))
                {
                    pathData2 = IntPtrHelper.toData <cmd_map_findpath>(ptr);

                    if (pathData2.path.Length < (pathData2.pathcnt - 1) * 3 ||
                        pathData2.path.Length < (pathData2.pathcnt - 1) * 3 + 1 ||
                        pathData2.path.Length < (pathData2.pathcnt - 1) * 3 + 2)
                    {
                        Debug.LogError("寻路长度不合法");
                        return;
                    }

                    pointLen += pathData2.pathcnt;
                }
            }
            autoMovePathPoint = new Vector3[pointLen];
            for (int i = 0; i < pathData.pathcnt; i++)
            {
                autoMovePathPoint[i] = new Vector3(pathData.path[i * 3], pathData.path[i * 3 + 1], pathData.path[i * 3 + 2]);
                if (m_pFSM.showLog)
                {
                    Trace.Log("Path Point" + autoMovePathPoint[i].ToString());
                }
            }
            for (int i = 0; i < pathData2.pathcnt; i++)
            {
                autoMovePathPoint[i + pathData.pathcnt] = new Vector3(pathData2.path[i * 3], pathData2.path[i * 3 + 1], pathData2.path[i * 3 + 2]);
                if (m_pFSM.showLog)
                {
                    Trace.Log("Path Point" + autoMovePathPoint[i + pathData.pathcnt].ToString());
                }
            }
            if (isFloating)
            {
                autoMovePathPoint[pointLen - 1] = targetPos;
            }

            autoMovePathPointIndex = 0;
            lastTurnPoint          = m_pFSM.transform.position;
            lastAutoMovePoint      = m_pFSM.transform.position;
            isAutoMoving           = true;
            autoMoveTarget         = targetPos;

            Vector3 deta = autoMovePathPoint[0] - m_pFSM.transform.position;
            if (deta.sqrMagnitude < 0.25f) //太近了就不要转向了。因为在跑动中连续点寻路有时候会后退一个路点
            {
                autoMovePathPoint[0] = m_pFSM.transform.position;
            }

            //if (showLog)
            //{
            //    Trace.Log("Tick=" + GameLogicAPI.getTickCount() + " autoMove from " + transform.position + " to " + autoMovePathPoint[0]);
            //}
        }

        if (rotateCamera && !m_autoMoveNavModeFollow)
        {
            Vector3 targetDir = targetPos - m_pFSM.transform.position;
            targetDir.Normalize();
            Vector3 cameraProjDir = Vector3.Cross(Initialize.mainCam.transform.right.normalized, m_pFSM.transform.up.normalized); //摄像机方向投影到人物平面上
            //需要在确定目标后,进行一个判断,如果位置方向与镜头方向的夹角小于45度,就不会进行转动镜头的操作,而是直接在现有镜头下寻路并到点进行攻击
            if (Vector3.Dot(targetDir, cameraProjDir) < 0.707)
            {
                SoldierCamera.MainInstance <SoldierCamera>().enterNavMode(CameraNavMode.Follow, null, Vector3.zero);
                m_autoMoveNavModeFollow = true;
            }
        }

        Vector3 distance = targetPos - m_pFSM.transform.position;

        if (distance.sqrMagnitude > 225.0f) //小于15的头顶不提示
        {
            enableAutoMoveEffect(true);
        }
    }
Пример #19
0
        // 接受消息
        public override void OnMessage(WndMsgID msgID, UIMsgData msgData)
        {
            switch (msgID)
            {
            case WndMsgID.WND_MSG_COMMON_LOGINSTATE_ENTER:
            {
                SetVisible(false);
                if (m_wndView != null)
                {
                    m_wndView.clearAllMsgData();
                }
            }
            break;

            case WndMsgID.WND_MSG_COMMOM_STATICGAMESTATE_ENTER:
            {
                SetVisible(true);
                if (m_wndView != null)
                {
                    m_wndView.OnEnter(ChatBoxState.StaticState);
                }
            }
            break;

            case WndMsgID.WND_MSG_COMMOM_STATICGAMESTATE_LEAVE:
            {
                if (m_wndView != null)
                {
                    m_wndView.OnLeave(ChatBoxState.StaticState);
                }
            }
            break;

            case WndMsgID.WND_ID_GAMEWAITINGROOMVIEW_ENTERROOM:
            {
                SetVisible(true);
                if (m_wndView != null)
                {
                    UIMsgCmdData            uiRoomConfirm = (UIMsgCmdData)msgData;
                    cmd_match_hall_add_room data          = IntPtrHelper.toData <cmd_match_hall_add_room>(uiRoomConfirm.ptrParam);

                    m_wndView.RoomMatchType = data.nMatchTypeID;
                    m_wndView.OnEnter(ChatBoxState.RoomState);
                }
            }
            break;

            case WndMsgID.WND_MSG_COMMOM_MATCHROOMSTATE_LEAVE:
            {
                if (m_wndView != null)
                {
                    //if(isEnterWarLoading == false)
                    {
                        m_wndView.OnLeave(ChatBoxState.RoomState);
                    }

                    //if(isEnterWarLoading)
                    //{
                    //    m_wndView.OnEnter(ChatBoxState.WarLoadingState);

                    //    isEnterWarLoading = false;
                    //}
                }
            }
            break;

            case WndMsgID.WND_MSG_COMMON_LOGINMOBA:
            {
                // 因为WND_MSG_COMMON_LOGINMOBA比WND_MSG_COMMOM_MATCHROOMSTATE_LEAVE更早,所以用这种方式
                isEnterWarLoading = true;

                if (m_wndView != null)
                {
                    m_wndView.OnEnter(ChatBoxState.WarLoadingState);
                }
            }
            break;

            case WndMsgID.WND_MSG_COMMON_BATTLESTATE_ENTER:
            {
                SetVisible(true);
                if (m_wndView != null)
                {
                    m_wndView.OnEnter(ChatBoxState.WarState);
                }
            }
            break;

            case WndMsgID.WND_MSG_COMMON_BATTLESTATE_LEAVE:
            {
                if (m_wndView != null)
                {
                    m_wndView.OnLeave(ChatBoxState.WarState);
                }
            }
            break;

            case WndMsgID.WND_MSG_CHATBOX_UPDATEMESSAGE:
            {
                if (m_wndView != null)
                {
                    m_wndView.OnChatMessageUpdate();
                }
            }
            break;

            case WndMsgID.WND_MSG_CHATBOX_CHANGECHANNEL:
            {
                ChatBoxChangeChannelData data = msgData as ChatBoxChangeChannelData;
                if (m_wndView != null)
                {
                    m_wndView.ChangeChannel(data.channel);
                }
            }
            break;

            case WndMsgID.WND_MSG_CHATBOX_INPUTFIELDADDITEM:
            {
                if (m_wndView != null)
                {
                    m_wndView.OnInputfieldAddItem(msgData as ChatBoxAddInputFieldItemData);
                }
            }
            break;

            case WndMsgID.WND_MSG_CHATBOX_CONDITIONHIDE:
            {
                if (m_wndView != null)
                {
                    m_wndView.SetForceConditionHide(msgData as ChatForceConditionHide);
                }
            }
            break;

            case WndMsgID.WND_MSG_CHATBOX_CHANGEIME:
            {
                if (m_wndView != null)
                {
                    m_wndView.ChangeIme(msgData as ChatBoxChangeImeData);
                }
            }
            break;

            case WndMsgID.WND_MSG_CHATBOX_PRIVATECHAT:
            {
                if (m_wndView != null)
                {
                    m_wndView.selectPrivateChat(msgData as ChatBoxPrivateChat);
                }
            }
            break;

            case WndMsgID.WND_MSG_CHATBOX_MOVEPOSUP:
            {
                if (m_wndView != null)
                {
                    m_wndView.SetChatWndViewPositionChange(ChatPositionChangeType.CPCY_MOVEUP);
                }
            }
            break;

            case WndMsgID.WND_MSG_CHATBOX_MOVEPOSDOWN:
            {
                if (m_wndView != null)
                {
                    m_wndView.SetChatWndViewPositionChange(ChatPositionChangeType.CPCY_MOVEDOWN);
                }
            }
            break;

            case WndMsgID.WND_MSG_CHATBOX_CLOSEEMOTICONPANEL:
            {
                if (m_wndView != null)
                {
                    m_wndView.CloseEmoticonPanel();
                }
            }
            break;

            case WndMsgID.WND_MSG_CHATBOX_UPDATELOCKSTATE:
            {
                if (m_wndView != null)
                {
                    m_wndView.UpdateEmoticonGroupLockState(msgData as UChatEmoticonGroupState);
                }
            }
            break;

            case WndMsgID.WND_MSG_COMMON_UPDATE_MAIN_HERO_VOCATION:
            {
                if (m_wndView != null)
                {
                    m_wndView.SetFpsSwitchHint(((OperationType)msgData).operationType);
                }
            }
            break;

            case WndMsgID.WND_MSG_COMMON_POPUPWND_VISIBLE:
            {
                if (m_wndView != null)
                {
                    m_wndView.onPopWndVisible(msgData as UCommonPopupWndVisible);
                }
            }
            break;

            case WndMsgID.WND_MSG_COMMON_FULLWND_VISIBLE:
            {
                if (m_wndView != null)
                {
                    m_wndView.onFullWndVisible(msgData as UCommonFullWndVisible);
                }
            }
            break;

            case WndMsgID.WND_MSG_CHATBOX_TOGGLE:
            {
                if (m_wndView != null)
                {
                    m_wndView.ToggleHideWindow();
                }
            }
            break;

            case WndMsgID.WND_MSG_CHATBOX_RESETSORTORDER:
            {
                if (m_wndView != null)
                {
                    m_wndView.transform.SetAsLastSibling();
                    m_wndView.gameObject.SetActive(true);
                    resetAllSortingOrder();
                }
            }
            break;

            case WndMsgID.WND_MSG_CHATBOX_SENDCHATMESSAGE:
            {
                if (m_wndView != null)
                {
                    m_wndView.onSendChatMessage(msgData as USendChatMessage);
                }
            }
            break;

            default:
                break;
            }
        }
Пример #20
0
    /// <summary>
    /// 创建通用逻辑模块,主场景和战斗场景均使用,依赖配置表,通常情况下需要更新资源后再执行
    /// </summary>
    public IEnumerator CreateEnumerator()
    {
        bCreated = false;

        Type[] types = new Type[]
        {
            typeof(AssetSystem),
            typeof(ShaderLib),
            typeof(SceneManager),
            typeof(NatureManager),
            typeof(WarFogManager),
        };

        CreateModulesAsyn(types);

        //wait another coroutine finish
        while (true)
        {
            yield return(new WaitForEndOfFrame());

            bool bOK = (CreatingModules.Count == 0);
            if (bOK)
            {
                break;
            }
        }

        yield return(new WaitForSeconds(0.1f));

        if (!Application.isEditor && System.IO.File.Exists("BreakPoint.txt"))
        {
            GameUtil.MsgBox(m_WindowHwnd, "挂断点", "调试", 0);
        }

        if (!RenderViewAPI.Start())
        {
            Trace.LogError("Game Start Service failure");
            yield break;
        }
        Trace.Log("Game Start Service successed");
        // 初始化
        gameObject.AddComponent <GameViewCommandHandler>();

        OnDeviceStateChage += OnDeviceStateChange;

        // 初始化游戏接口
        IntPtrHelper helper = new IntPtrHelper();

        //GameLogicAPI.Start(ASpeedGame.Data.GameSettingsXml.GameSettingsXmlManager.Instance.GameSettingsModel.enableMultiThread.AValue,
        //    helper.toPtr(ref RenderViewAPI.g_RenderView));
        GameLogicAPI.Start(helper.toPtr(ref RenderViewAPI.g_RenderView));
        yield return(new WaitForSeconds(1.0f));

        PrintTickCheck("初始化逻辑层API,至少等了1秒", CostThreshold_Lv1, _bStart: true);

        // 显示层配置价值
        ViewConfigManager.Init();
        PrintTickCheck("ViewConfigManager.Init");


        //资源是要配置初始化
        AssetBundleManager.Init();
        PrintTickCheck("AssetBundleManager.Init");



        LogicDataCenter.Init();
        PrintTickCheck("LogicDataCenter.Init");



        ImageSetting.Init();
        PrintTickCheck("ImageSetting.Init");

        ImageEffectManager.API_GameStart();
        PrintTickCheck("ImageEffectManager.Init");

        //GameViewCommandHandler.Instance.Start();
        MouseCursorManager.Instance.InitMouseCursorManager();
        PrintTickCheck("MouseCursorManager.Init");

        // 初始化实体接口,依赖上面的物件管理器所以顺序不能换
        EntityFactory.Init();
        PrintTickCheck("EntityFactory.Init");


        PrefabManager.Init();
        PrintTickCheck("PrefabManager.Init");


        SkinManager.Init();
        PrintTickCheck("SkinManager.Init");



        SoundManager.Init();
        PrintTickCheck("SoundManager.Init");

        UISystem.Init();
        PrintTickCheck("UISystem.Init");

        UTopNameManager.Init();
        PrintTickCheck("UTopNameManager.Init");

        USpeedUI.Blood.UBloodManager.Init();
        PrintTickCheck("UBloodManager.Init");



        InputManager.Init();
        PrintTickCheck("InputManager.Init");



        Effect.EffectNode.InitTargetCache();
        PrintTickCheck("Effect.EffectNode.InitTargetCache.Init");

        GUIDE.GuideManager.Init();
        PrintTickCheck(" GUIDE.GuideManager.Init");

        SceneEffectManager.Init();
        PrintTickCheck("SceneEffectManager.Init");
        if (LightingEffectFactory.Instance)
        {
            LightingEffectFactory.Instance.InitWhenGameStart();
        }
        PrintTickCheck("LightingEffectFactory.Init");

        SafeZoneEffectManager.Init();
        PrintTickCheck("SafeZoneEffectManager.Init");

        ImageSetting.TraceSettings();

        bCreated = true;

        List <string> argList = new List <string>();

        argList.AddRange(System.Environment.GetCommandLineArgs());

        CkeckUpdateOk(ref argList);
        PrintTickCheck("CkeckUpdateOk");

        CheckMultclient();
        PrintTickCheck("CheckMultclient");

        StageManager.Init();
        AssetBundleManager.DeleteAssets(ref LoadingWaitngResNode, true);
    }
Пример #21
0
        // 接受消息
        public override void OnMessage(WndMsgID msgID, UIMsgData msgData)
        {
            switch (msgID)
            {
            case WndMsgID.WND_MSG_COMMON_BATTLESTATE_ENTER:
            {
                this.SetVisible(true);
            }
            break;

            case WndMsgID.WND_MSG_COMMON_WAREND:
            case WndMsgID.WND_MSG_COMMON_BATTLESTATE_LEAVE:
            {
                if (m_wndView == null)
                {
                    return;
                }

                m_wndView.SendChatVisibleMessage(false);

                this.UnloadView();
                ResetData();
            }
            break;

            case WndMsgID.WND_MSG_COMMON_LOGINMOBA:
            {
                bMobaState = true;
                StartData();
                this.SetVisible(true);
            }
            break;

            case WndMsgID.WND_MSG_WARBUTTOMCENTER_SKILLSETSLOT:
            {
                if (m_wndView == null || !bMobaState)
                {
                    return;
                }

                UIMsgCmdData          uiSkillSlot = (UIMsgCmdData)msgData;
                cmd_creature_set_slot data        = IntPtrHelper.toData <cmd_creature_set_slot>(uiSkillSlot.ptrParam);
                SetSpellSlot(data);
            }
            break;

            case WndMsgID.WND_MSG_WARBUTTOMCENTER_SKILLUPDATE:
            {
                if (m_wndView == null || !bMobaState)
                {
                    return;
                }

                UIMsgCmdData             uiSkillUpdate = (UIMsgCmdData)msgData;
                cmd_creature_spell_point data          = IntPtrHelper.toData <cmd_creature_spell_point>(uiSkillUpdate.ptrParam);
                m_wndView.SetSpellSlotUpgrade(data);
            }
            break;

            case WndMsgID.WND_MSG_WARBUTTOMCENTER_SKILLEFFECT:
            {
                if (m_wndView == null || !bMobaState)
                {
                    return;
                }

                UIMsgCmdData          uiSpellEffect = (UIMsgCmdData)msgData;
                cmd_creature_set_slot data          = IntPtrHelper.toData <cmd_creature_set_slot>(uiSpellEffect.ptrParam);

                if (data.nSlotType == SLOT_TYPE.SLOT_TYPE_SKILL)
                {
                    SetSpellSlotEffect(data);
                }
                else if (data.nSlotType == SLOT_TYPE.SLOT_TYPE_GOODS)
                {
                    SetPurchasedGoodsUseEffect(data);
                    SetPurchasedGoodsCanDragDrop(data);
                }
            }
            break;

            case WndMsgID.WND_MSG_WARBUTTOMCENTER_SKILLOVEREFFECT:
            {
                if (m_wndView == null || !bMobaState)
                {
                    return;
                }

                UIMsgCmdData          uiSpellOverEffect = (UIMsgCmdData)msgData;
                cmd_set_spell_overlay data = IntPtrHelper.toData <cmd_set_spell_overlay>(uiSpellOverEffect.ptrParam);

                SetSpellSlotFlagEffect(data);
            }
            break;

            case WndMsgID.WND_MSG_WARBUTTOMCENTER_BUFFINFO:
            {
                if (m_wndView == null || !bMobaState)
                {
                    return;
                }

                UIMsgCmdData         uiBuffData = (UIMsgCmdData)msgData;
                cmd_creature_setBuff data       = IntPtrHelper.toData <cmd_creature_setBuff>(uiBuffData.ptrParam);

                SetHeroBuff(data);
            }
            break;

            case WndMsgID.WND_MSG_WARBUTTOMCENTER_SETSHORTCUT:
            {
                if (m_wndView == null || !bMobaState)
                {
                    return;
                }

                UIMsgCmdData uiShortCutData = (UIMsgCmdData)msgData;

                SetSlotShortcutString(uiShortCutData.nParam, uiShortCutData.nPtrLen, uiShortCutData.strParam);
            }
            break;

            case WndMsgID.WND_MSG_WARBUTTOMCENTER_SKILLMPEFFECT:
            {
                if (m_wndView == null || !bMobaState)
                {
                    return;
                }

                UIMsgCmdData uiMpEffectData       = (UIMsgCmdData)msgData;
                cmd_creature_mp_effect_spell data = IntPtrHelper.toData <cmd_creature_mp_effect_spell>(uiMpEffectData.ptrParam);
                SetMpEffectSpell(data);
            }
            break;

            case WndMsgID.WND_MSG_WAR_GOODSSTORE_UPDATEMAINPLAYERGOODS:
            {
                if (m_wndView == null || !bMobaState)
                {
                    return;
                }

                SetPersonBuyGoodsInfo();
            }
            break;

            case WndMsgID.WND_MSG_WAR_XPSKILL_SET_XP_SKILL_SELF:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData uiData            = (UIMsgCmdData)msgData;
                cmd_creature_ShowPromptUI data = IntPtrHelper.toData <cmd_creature_ShowPromptUI>(uiData.ptrParam);
                SetXpSkillFireEffect(data);
            }
            break;

            case WndMsgID.WND_ID_HEROTALENTVIEW_LEARNHEROTALENT:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData uiData = (UIMsgCmdData)msgData;
                m_wndView.SetTalentLearnActive(uiData.nParam);
            }
            break;

            case WndMsgID.WND_ID_HEROTALENTVIEW_MAINHEROTALENTCLOSE:
            {
                if (m_wndView == null)
                {
                    return;
                }

                m_wndView.CloseWarTalentView();
            }
            break;

            case WndMsgID.WND_MSG_WARBUTTOMCENTER_WARTALENTBUTTONCLICK:
            {
                if (m_wndView != null)
                {
                    m_wndView.OnWarTalentButtonClick();
                }
            }
            break;

            default:
                break;
            }
        }
Пример #22
0
        /// <summary>
        /// 汇总并排序伤害总量,返回按伤害总量排血的角色ID表
        /// </summary>
        /// <returns></returns>
        private List <int> SummaryAndSortData()
        {
            m_DeathReplayDataList.Clear();
            List <int> enemyOrderList = new List <int>();

            m_endTime = GameLogicAPI.GetUnityTickCount();

            bool tempFlag = true;

            //先汇总8次承受伤害数据
            foreach (HurtDataItem hurtData in m_ActorHurtDataList)
            {
                if (m_endTime - hurtData.hurtTime > DamageCalculationsTime)
                {
                    continue;
                }
                if (tempFlag)
                {
                    //保存符合条件的第一次受伤时间
                    m_startTime = hurtData.hurtTime;
                    tempFlag    = false;
                }

                DeathReplayData damageData = new DeathReplayData();
                EntityView      ev         = EntityFactory.getEntityViewByID(hurtData.uidOperator);
                if (ev == null || ev.Property == null)
                {
                    continue;
                }
                int skinID = ev.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_SKIN);
                if (m_DeathReplayDataList.ContainsKey(skinID))
                {
                    damageData = m_DeathReplayDataList[skinID];
                    if (damageData.skillDamageList.ContainsKey(hurtData.skillID))
                    {
                        damageData.skillDamageList[hurtData.skillID] += hurtData.hurtNum;
                    }
                    else
                    {
                        damageData.skillDamageList.Add(hurtData.skillID, hurtData.hurtNum);
                    }
                    m_DeathReplayDataList[skinID] = damageData;
                }
                else
                {
                    damageData.uidOperator = hurtData.uidOperator;
                    damageData.pdbID       = LogicDataCenter.recordTableDataManager.getWarPersonPDBIDByUID(damageData.uidOperator);
                    damageData.skinID      = skinID;
                    EntityView view = EntityFactory.getEntityViewByID(Convert.ToInt32(hurtData.uidOperator));
                    if (view != null && view.Property != null)
                    {
                        damageData.entityType = view.Type;
                        if (view.Type == ENTITY_TYPE.TYPE_MONSTER)
                        {
                            /////////////////////////////////////////////
                            damageData.monsterID = view.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_ID);
                        }
                        damageData.roleName = view.Property.CreatureName;
                        damageData.skinName = view.Property.CreatureName;
                        if (view.Type == ENTITY_TYPE.TYPE_PLAYER_ROLE)
                        {
                            int heroId = view.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_VOCATION);
                            SSchemeHeroTypeConfig config = HeroTypeConfig.Instance.GetHeroTypeConfig(heroId);
                            if (config != null)
                            {
                                damageData.heroDesc = config.strAgainstWay;
                            }
                        }
                    }
                    WarRecordTableDataManager.WarPlayerVsInfo vsInfo = LogicDataCenter.recordTableDataManager.GetWarPlayerVsInfo(damageData.pdbID);
                    if (null != vsInfo)
                    {
                        damageData.skinName = vsInfo.szVocationName;
                    }
                    damageData.skillDamageList.Add(hurtData.skillID, hurtData.hurtNum);
                    damageData.goodsInfo  = LogicDataCenter.warMobaGoodsDataManager.GetPlayerGoodsInfo(damageData.pdbID);
                    damageData.personInfo = LogicDataCenter.recordTableDataManager.getWarPersonInfoByPDBID(damageData.pdbID);
                    m_DeathReplayDataList.Add(skinID, damageData);
                }
            }

            //再排汇总后的敌方角色的技能伤害表
            foreach (DeathReplayData data in m_DeathReplayDataList.Values)
            {
                foreach (KeyValuePair <int, int> kvp in data.skillDamageList)
                {
                    SkillDamageItem item = new SkillDamageItem();
                    item.skillID   = kvp.Key;
                    item.damageNum = kvp.Value;
                    IntPtr Ptr = GameLogicAPI.getSpellData(kvp.Key);
                    if (Ptr != IntPtr.Zero)
                    {
                        SPELL.SPELL_DATA spellData = IntPtrHelper.toData <SPELL.SPELL_DATA>(Ptr);
                        item.spellEffectType = spellData.nSpellEffectType;
                        item.skillIcon       = spellData.nIcon;
                        IntPtr strPtr = GameLogicAPI.getSpellStrData(kvp.Key, (int)SPELL_DATA_ID.SPDATA_NAME);
                        if (strPtr != null)
                        {
                            item.szSkillName = IntPtrHelper.Ptr2Str(strPtr);
                        }
                        strPtr = GameLogicAPI.getSpellStrData(kvp.Key, (int)SPELL_DATA_ID.SPDATA_DESC);
                        if (strPtr != null)
                        {
                            item.szSkillDesc = IntPtrHelper.Ptr2Str(strPtr);
                        }
                    }
                    //如果是普通攻击
                    if ((item.spellEffectType & (int)SPELL.SPELL_EFFECT_TYPE.SpellEffectType_NormalAttack) != 0)
                    {
                        //判断表里是否已经有普通攻击了,如果有就直接加值
                        SkillDamageItem temp = data.skillInfoList.Find(x => (x.spellEffectType & (int)SPELL.SPELL_EFFECT_TYPE.SpellEffectType_NormalAttack) != 0);
                        if (null != temp)
                        {
                            temp.damageNum += item.damageNum;
                        }
                        else
                        {
                            data.skillInfoList.Add(item);
                        }
                    }
                    else
                    {
                        data.skillInfoList.Add(item);
                    }
                }
                data.skillInfoList.Sort((x, y) => - x.damageNum.CompareTo(y.damageNum));
            }

            //再排序
            var dicSort = from objDic in m_DeathReplayDataList orderby objDic.Value.totalDamage descending select objDic;

            foreach (KeyValuePair <int, DeathReplayData> kvp in dicSort)
            {
                enemyOrderList.Add(kvp.Key);
            }
            //返回角色ID表
            return(enemyOrderList);
        }
Пример #23
0
    ///// <summary>
    ///// 死亡前的碰撞层
    ///// </summary>
    //private int nOldCollisionLayer = -1;
    // 进入状态
    public bool OnEnter(IntPtr lParam)
    {
        //退出假死状态
        if (m_pFSM != null && m_pFSM.animatorCtrl != null)
        {
            m_pFSM.animatorCtrl.Dying = false;
        }

        Debug.Log("on OnEnter CreaturePosture_Dead " + this.m_pFSM.name);
        if (m_pFSM.showLog)
        {
            Trace.Log(m_pFSM.name + "=======OnEnter CreaturePosture_Dead======");
        }

        cmd_creature_die context = IntPtrHelper.toData <cmd_creature_die>(lParam);

        if (m_pFSM.showLog)
        {
            Trace.Log("DeadInterval:" + context.nDeadInterval);
            Trace.Log("reborn second:" + context.nInterval);
        }



        m_pFSM.rebornTick = context.nInterval - context.nDeadInterval;
        if (m_pFSM.rebornTick <= 0)
        {
            Trace.Log("rebornTick <= 0!");
            //return false;                   吃鸡地图,这个时差是0,所以先不要返回
        }
        m_nDeadInterval = context.nDeadInterval;

        //暂时让角色死亡不让射线检测该层
        //if (!m_pFSM.isHero)
        //{
        //    nOldLayer = m_pFSM.gameObject.layer;
        //    if (m_pFSM.gameObject.layer != LayerMask.NameToLayer(Config.LayerTransparentFX))
        //    {
        //        GameUtil.SetLayer(LayerMask.NameToLayer(Config.LayerNeutrality), m_pFSM.gameObject, true);
        //    }

        //    //m_pFSM.gameObject.layer = LayerMask.NameToLayer(Config.LayerPlayerFriend);
        //    //if (m_pFSM.SkinConfig.ScreenCastObject != null)
        //    //{
        //    //    m_pFSM.SkinConfig.ScreenCastObject.layer = LayerMask.NameToLayer(Config.LayerPlayerFriend);
        //    //}
        //}

        SkillCtrl sk = m_pFSM.GetComponent <SkillCtrl>();

        if (sk)
        {
            sk.enabled = false;
        }

        SoldierController sco = m_pFSM.GetComponent <SoldierController>();

        if (sco)
        {
            sco.dead = true;
        }

        if (m_pFSM.animator)
        {
            m_pFSM.animator.SetTrigger("Dead");

            m_pFSM.animator.ResetTrigger("Reborn");
        }

        //关闭死亡时要求关闭的光效
        LightingEffectManager light = m_pFSM.GetComponent <LightingEffectManager>();

        if (light)
        {
            light.CloseLightingWhenDead();
        }

        startTick = GameLogicAPI.getSyncTickCount(); // GameLogicAPI.getTickCount();
        endTick   = startTick + (uint)m_pFSM.rebornTick;
        tick_cameraSwitchAfterDead = startTick + m_pFSM.cameraSwitchAfterDead;

        if (m_pFSM.isHero)
        {
            //GFxGameHud hud = SFGFxMovieManager.GetWindow<GFxGameHud>();
            //if (SFGFxMovieManager.CheckTheMovieCanUse(hud))
            //{
            //    hud.ShowReliveTime(((float)m_pFSM.rebornTick));
            //}
            ScreenREC.GetInstance().SwitchRECState(ScreenREC.EMRECState.EMREC_STOP);

            //ImageEffects.ImageEffectManager.API_EnableImageEffect<ImageEffects.FullScreenGray>();
            if (ImageSetting.GetData().currImageQuality == ImageQuality.Fastest)
            {
                LightingEffectFactory.EnableDeadEffect();
                ImageEffects.ImageEffectManager.API_DisableImageEffect <ImageEffects.FullScreenSaturation>();
                ImageEffects.ImageEffectManager.API_DisableImageEffect <ImageEffects.DepthOfFieldScatter>();
            }
            else
            {
                LightingEffectFactory.DisableDeadEffect();
                ImageEffects.ImageEffectManager.API_EnableImageEffect <ImageEffects.FullScreenSaturation>();
                ImageEffects.ImageEffectManager.API_DisableImageEffect <ImageEffects.DepthOfFieldScatter>();
            }
        }

        //死亡不碰撞
        if (m_pFSM.controller)
        {
            //nOldCollisionLayer = m_pFSM.gameObject.layer;
            //m_pFSM.gameObject.layer = LayerMask.NameToLayer(Config.LayerIngoreRayCast);
            m_pFSM.pickableCount = 0;
        }

        int nEntityID = m_pFSM.entityID;

        U3D_Render.EntityView ev = EntityFactory.getPlayerViewByID(nEntityID);

        //添加金币掉落光效
        if (GameLogicAPI.isInWarScene() > 0)
        {
            addMoneyEffect(ev, context.uMurderID);
        }

        USpeedUI.Blood.UBloodManager.Instance.OnEntityDead(m_pFSM.entityID, ENTITY_TYPE.TYPE_PLAYER_ROLE);
        // 小地图隐藏
//         U3D_Render.EntityView objev = EntityFactory.getEntityViewByID(m_pFSM.entityID);
//         if (objev != null && GFxMinimapManager.Instance != null)
//         {
//             GFxMinimapManager.Instance.SetObjectVisible(m_pFSM.entityID, objev.createinfo.nMinimapIcon, 0);
//         }
        return(true);
    }
        //
        // The overlapped function called (either by the thread pool or the socket)
        // when IO completes. (only called on Win9x)
        //
        internal void OverlappedCallback(object stateObject, bool Signaled)
        {
            OverlappedAsyncResult asyncResult = (OverlappedAsyncResult)stateObject;

            GlobalLog.Assert(!asyncResult.IsCompleted, "OverlappedAsyncResult#" + ValidationHelper.HashString(asyncResult) + "::OverlappedCallback() asyncResult.IsCompleted", "");
            //
            // the IO completed asynchronously, see if there was a failure the Internal
            // field in the Overlapped structure will be non zero. to optimize the non
            // error case, we look at it without calling WSAGetOverlappedResult().
            //
            uint errorCode = (uint)Marshal.ReadInt32(IntPtrHelper.Add(asyncResult.m_UnmanagedBlob, Win32.OverlappedInternalOffset));
            uint numBytes  = errorCode != 0 ? unchecked ((uint)-1) : (uint)Marshal.ReadInt32(IntPtrHelper.Add(asyncResult.m_UnmanagedBlob, Win32.OverlappedInternalHighOffset));

            //
            // this will release the unmanaged pin handles and unmanaged overlapped ptr
            //
            asyncResult.ReleaseUnmanagedStructures();
            asyncResult.ErrorCode = (int)errorCode;
            asyncResult.InvokeCallback(false, (int)numBytes);
        }
Пример #25
0
        // 接受消息
        public override void OnMessage(WndMsgID msgID, UIMsgData msgData)
        {
            switch (msgID)
            {
            case WndMsgID.WND_MSG_COMMOM_WARHILL_PRESSDOWN:
            {
                this.SetVisible(true);
                // 请求进入大厅
                ViewEventHelper.Instance.SendCommand(GameLogicDef.GVIEWCMD_MATCH_ENTER_HALL);
            }
            break;

            case WndMsgID.WND_MSG_WAR_MAIN_OPEN:
            {
                this.LoadView();
            }
            break;

            case WndMsgID.WND_ID_GAMEWAITINGROOMVIEW_ROOMLEAVETOHALL:
            {
                this.SetVisible(true);
            }
            break;

            case WndMsgID.WND_MSG_COMMON_LOGINMOBA:
            {
                if (m_wndView == null)
                {
                    return;
                }

                m_wndView.ClearRoomListData();
                this.UnloadView();
            }
            break;

            case WndMsgID.WND_ID_HALLROOMINFOVIEW_ADDROOMINFO:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData uiData = (UIMsgCmdData)msgData;
                SetRoomListData(uiData.ptrParam, uiData.nPtrLen);
            }
            break;

            case WndMsgID.WND_ID_HALLROOMINFOVIEW_REMOVEROOMINFO:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData uiRemoveItem = (UIMsgCmdData)msgData;
                RemoveRoomListData(uiRemoveItem.nParam);
            }
            break;

            case WndMsgID.WND_ID_HALLROOMINFOVIEW_REFRESHROOMINFO:
            {
                if (m_wndView == null)
                {
                    return;
                }


                UIMsgCmdData            uiRoomInfo = (UIMsgCmdData)msgData;
                cmd_match_hall_add_room data       = IntPtrHelper.toData <cmd_match_hall_add_room>(uiRoomInfo.ptrParam);
                RefreshRoomListData(data);
            }
            break;

            case WndMsgID.WND_ID_HALLROOMINFOVIEW_REMOVEAllROOMINFO:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData uiRemoveItem = (UIMsgCmdData)msgData;
                m_wndView.ClearRoomListData();
            }
            break;

            case WndMsgID.WND_ID_HALLROOMINFOVIEW_SHOWCREATEROOMVIEW:
            {
                if (m_wndView == null)
                {
                    return;
                }

                m_wndView.SetCreateRoomShow();
            }
            break;

            case WndMsgID.WND_ID_HALLROOMINFOVIEW_GAMEMODEINFO:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData uiGameMode         = (UIMsgCmdData)msgData;
                cmd_match_create_room_mode data = IntPtrHelper.toData <cmd_match_create_room_mode>(uiGameMode.ptrParam);
                SetCreateRoomGameModeInfo(uiGameMode.nParam, data);
            }
            break;

            case WndMsgID.WND_ID_HALLROOMINFOVIEW_MAPMODEINFO:
            {
                if (m_wndView == null)
                {
                    return;
                }

                UIMsgCmdData uiMapMode         = (UIMsgCmdData)msgData;
                cmd_match_create_room_map data = IntPtrHelper.toData <cmd_match_create_room_map>(uiMapMode.ptrParam);
                SetCreateRoomMapModeInfo(uiMapMode.nParam, data);
            }
            break;

            case WndMsgID.WND_ID_GAMEWAITINGROOMVIEW_SHOWAFTERLOADSCENE:
            {
                CloseHallView();
            }
            break;

            case WndMsgID.WND_ID_HALLROOMINFOVIEW_GROUP_MAPBTNCLICK:
            {
                if (m_wndView == null)
                {
                    return;
                }
                UIMsgCmdData uiChangeID = (UIMsgCmdData)msgData;

                m_wndView.GroupMapBtnClick(uiChangeID.nParam);
            }
            break;

            case WndMsgID.WND_ID_GAMEWAITINGROOMVIEW_ROOMLEAVETOSCENE:
            {
                if (m_wndView == null || !IsVisible())
                {
                    return;
                }
                m_wndView.OnReturnBtnClick();
            }
            break;

            default:
                break;
            }
        }
Пример #26
0
    private void UpdateFunction()
    {
        deltaTime = Time.deltaTime;
        if (deltaTime < 0.001f)
        {
            Debug.LogError("deltaTime=" + deltaTime);
            return;
        }

        if (m_pFSM.moveCtrl.isCharge())
        {
            if (m_pFSM.animator != null)
            {
                m_pFSM.animator.SetFloat(hashid_moveforward, 0);
                m_pFSM.animator.SetFloat(hashid_moveright, 0);
                m_pFSM.animator.SetFloat(hashid_velocity, 0);
                m_pFSM.animator.SetBool(hashid_isMoving, false);
            }
            return;
        }

        Vector3 velocity = m_Velocity;

        m_pFSM.syncDetalTime += deltaTime;

        if (!m_pFSM.isHero || m_pFSM.bControlledBySever)
        {
            velocity = m_pFSM.syncVelocity;
            calSyncVel(tr.position, ref velocity);
        }
        if (float.IsNaN(velocity.x) || float.IsNaN(velocity.y) || float.IsNaN(velocity.z))
        {
            Debug.LogError(m_pFSM.name + " jumping (Line226) velocity error " + velocity);
            velocity = Vector3.zero;
        }

        Vector3 inputVelocity = ApplyInputVelocityChange(velocity); //根据键盘输入调整速度,一般在平地才用

        if (float.IsNaN(inputVelocity.x) || float.IsNaN(inputVelocity.y) || float.IsNaN(inputVelocity.z))
        {
            Debug.LogError(m_pFSM.name + "jumping inputVelocity is " + inputVelocity);
            inputVelocity = Vector3.zero;
        }

        if (m_bIsLanding && (m_pFSM.isHero && !m_pFSM.bControlledBySever))
        {
            // Update velocity based on input
            velocity = inputVelocity;
            //Trace.Log("Landing vel="+m_Velocity.ToString()+"-->"+velocity.ToString());
        }
        else if (m_pFSM.dodge)
        {
            if (m_pFSM.isHero && !m_pFSM.bControlledBySever)
            {
                velocity = inputVelocity;
            }
            else
            {
                velocity = m_pFSM.syncVelocity;
            }
        }
        else
        {
            //在空中的时候,只稍微考虑一下,为了撞墙后直接跳跃也能爬墙,而不是垂直跳
            Vector3 inputOffset = inputVelocity;
            inputOffset.y = 0.0f;
            Vector3 jumpOffset = velocity;
            jumpOffset.y = 0.0f;

            if (inputOffset.magnitude / 2 > jumpOffset.magnitude)
            {
                Vector3 combineOffset = jumpOffset * 0.95f + inputOffset * 0.05f;
                velocity.x = combineOffset.x;
                velocity.z = combineOffset.z;
            }
            if (m_pFSM.isGlideState)
            {
                Vector3 pos = m_pFSM.transform.position + new Vector3(0, 0.1f, 0);
                if (Mathf.Abs(pos.y - glideLastHitPoint.y) > 0.5f)
                {
                    RaycastHit hitInfo;
                    Ray        PointToGroundRay = new Ray(pos, new Vector3(0, -1, 0));
                    Physics.Raycast(PointToGroundRay, out hitInfo, 100);
                    if ((pos.y - hitInfo.point.y) > m_pFSM.controller.height + 0.6f)
                    {
                        m_pFSM.ChangeGlideState();
                    }
                    else
                    {
                        glideLastHitPoint = pos;
                    }
                }
            }
        }

        if (m_pFSM.isHero && !m_pFSM.bControlledBySever)
        {
            m_pFSM.syncVelocity = velocity;

            // 判断本地的模拟坐标和真实坐标的差别, 只有达到一定阀值才需要同步
            // 暂时在行走过程中200ms同步一次
            int          curTick  = System.Environment.TickCount;
            MoveSyncFlag sendSync = MoveSyncFlag.NOT_2_SERVER;
            if (curTick >= m_lastSyncTick + 5000) //5秒强制同步一次
            {
                sendSync = MoveSyncFlag.TO_SERVER;
            }
            else if ((m_lastSyncVel.sqrMagnitude > 0.0001f && m_pFSM.syncVelocity.sqrMagnitude < 0.0001f) || (m_lastSyncVel.sqrMagnitude < 0.0001f && m_pFSM.syncVelocity.sqrMagnitude > 0.0001f))//启动和站立强制同步一次
            {
                sendSync = MoveSyncFlag.TO_BROADCAST;
            }
            else //每200毫秒根据速度或者移动距离考虑是否同步一次
            {
                Vector3 velSub = m_lastSyncVel - m_pFSM.syncVelocity;
                Vector3 posSub = tr.position - m_lastSyncPos;
                if ((curTick >= m_lastSyncTick + 200) && (velSub.sqrMagnitude > 0.01f || posSub.sqrMagnitude > 1.0f))
                {
                    sendSync = MoveSyncFlag.TO_SERVER;
                }
            }

            if (sendSync != MoveSyncFlag.NOT_2_SERVER && (m_pFSM.isHero && !m_pFSM.bControlledBySever))
            {
                m_pFSM.syncVelocity.y = 0.0f; // 跳跃的同步包y方向速度都为0,由实际跳跃产生。
                Send_Sync_Position(sendSync);
                m_lastSyncTick = curTick;
                m_lastSyncVel  = m_pFSM.syncVelocity;
                m_lastSyncPos  = tr.position;
            }
        }

        // We copy the actual velocity into a temporary variable that we can manipulate.

        // Apply gravity and jumping force
        velocity = ApplyGravityAndJumping(velocity);

        if (float.IsNaN(velocity.x) || float.IsNaN(velocity.y) || float.IsNaN(velocity.z))
        {
            Debug.LogError(m_pFSM.name + " jumping velocity (line 304) error" + velocity);
            velocity = Vector3.zero;
        }

        if (m_bIsLanding && m_pFSM.animator != null)
        {
            Vector3 planeVel = new Vector3(velocity.x, 0, velocity.z);
            if (planeVel.sqrMagnitude > 0.0f)
            {
                m_pFSM.animator.SetBool(hashid_isMoving, true);
            }
            else
            {
                m_pFSM.animator.SetBool(hashid_isMoving, false);
            }

            //取移动速度相对于主角面向的向前和向左的标量
            float fRight   = Vector3.Dot(velocity, tr.right);
            float fForward = Vector3.Dot(velocity, tr.forward);


            //移动速度考虑了服务器速度和基本速度的比率后,按服务器速度算animator参数值

            if (m_pFSM.maxForwardSpeed > 0)
            {
                fForward = fForward / m_pFSM.maxForwardSpeed;
            }
            else
            {
                fForward = fForward / m_pFSM.creaturePropety.runSpeed_Forward;
            }

            if (m_pFSM.maxRunSidewaySpeed > 0)
            {
                fRight = fRight / m_pFSM.maxRunSidewaySpeed;
            }
            else
            {
                fRight = fRight / m_pFSM.creaturePropety.runSpeed_LeftRight;
            }


            //fRight = fRight / m_pFSM.basicSidewaysSpeed;
            ////速度和动作不能成正比,线性的话速度小的时候容易滑步,这里利用开根做了一次非线性变换
            //if (fForward >= 0.0f)
            //{
            //    fForward = fForward / m_pFSM.basicForwardSpeed;
            //    fForward = Mathf.Sqrt(fForward);
            //}
            //else
            //{
            //    fForward = fForward / m_pFSM.basicBackwardSpeed;
            //    fForward = -Mathf.Sqrt(-fForward);
            //}

            //if (fRight >= 0.0f)
            //{
            //    fRight = Mathf.Sqrt(fRight);
            //}
            //else
            //{
            //    fRight = -Mathf.Sqrt(-fRight);
            //}



            m_pFSM.animator.SetFloat(hashid_moveright, fRight);
            m_pFSM.animator.SetFloat(hashid_moveforward, fForward);
            m_pFSM.animator.SetFloat(hashid_velocity, velocity.magnitude);

            //动画速率用maxSpeed和basicSpeed比率控制,这里暂时不控制
            //float speedScale = Mathf.Max(Mathf.Abs(fRight), Mathf.Abs(fForward));
            //if (speedScale > 1.0f)
            //{
            //    speedScale = (speedScale - 1.0f) * 0.3f + 1.0f; //张嘉华提供的跑路速度和跑路动画速度关系
            //    m_pFSM.animator.speed = speedScale;
            //}
            //else
            //{
            //    m_pFSM.animator.speed = 1.0f;
            //}
        }

        // Moving platform support
        Vector3 moveDistance = Vector3.zero;

        // Save lastPosition for velocity calculation.
        Vector3 lastPosition = tr.position;

        // We always want the movement to be framerate independent.  Multiplying by Time.deltaTime does this.

        Vector3 currentMovementOffset = velocity * deltaTime;

        // Find out how much we need to push towards the ground to avoid loosing grouning
        // when walking down a step or over a sharp change in slope.
        float pushDownOffset = Mathf.Max(m_pFSM.controller.stepOffset, (new Vector3(currentMovementOffset.x, 0, currentMovementOffset.z)).magnitude);

        if (float.IsNaN(m_pFSM.controller.stepOffset))
        {
            Debug.LogError(m_pFSM.name + " jumping controller.stepOffset error" + m_pFSM.controller.stepOffset);
            pushDownOffset = (new Vector3(currentMovementOffset.x, 0, currentMovementOffset.z)).magnitude;
        }


        if (grounded)
        {
            currentMovementOffset -= pushDownOffset * Vector3.up;
        }


        m_pFSM.collisionFlags = m_pFSM.controller.Move(currentMovementOffset);

        //先暂时关闭拉扯位置,保证非主角跳跃平滑
        //if (!m_pFSM.isHero) //前面都是自己算的运动轨迹,非主角考虑同步位置的问题,避免连续跳跃(例如轻功)时位置偏移过大
        //{
        //    Vector3 syncOffset = m_pFSM.syncPosition - tr.position;
        //    syncOffset.y = 0.0f;
        //    if (syncOffset.sqrMagnitude > 0.01f)
        //    {
        //        m_pFSM.controller.Move(syncOffset * 0.8f);
        //    }
        //}


        // Calculate the velocity based on the current and previous position.
        // This means our velocity will only be the amount the character actually moved as a result of collisions.
        Vector3 oldHVelocity = new Vector3(velocity.x, 0, velocity.z);

        m_Velocity = (tr.position - lastPosition) / deltaTime;
        Vector3 newHVelocity = new Vector3(m_Velocity.x, 0, m_Velocity.z);

        // The CharacterController can be moved in unwanted directions when colliding with things.
        // We want to prevent this from influencing the recorded velocity.
        //if (oldHVelocity == Vector3.zero)
        if (oldHVelocity.sqrMagnitude < 0.0001f)
        {
            m_Velocity = new Vector3(0, m_Velocity.y, 0);
        }
        else
        {
            float projectedNewVelocity = Vector3.Dot(newHVelocity, oldHVelocity) / oldHVelocity.sqrMagnitude;
            m_Velocity = oldHVelocity * Mathf.Clamp01(projectedNewVelocity) + m_Velocity.y * Vector3.up;
        }


        if (m_Velocity.y < velocity.y - 0.001)
        {
            if (m_Velocity.y < 0)
            {
                // Something is forcing the CharacterController down faster than it should.
                // Ignore this
                m_Velocity.y = velocity.y;
            }
        }

        // We were grounded but just loosed grounding
        if (grounded && !IsGroundedTest())
        {
            grounded = false;

            //m_pFSM.SendMessage("OnFall", SendMessageOptions.DontRequireReceiver);
            // We pushed the character down to ensure it would stay on the ground if there was any.
            // But there wasn't so now we cancel the downwards offset to make the fall smoother.
            tr.position += pushDownOffset * Vector3.up;
        }
        // We were not grounded but just landed on something
        else if (!grounded && IsGroundedTest())
        {
            grounded = true;
            if (m_pFSM.animator)
            {
                m_pFSM.animator.SetBool("isLanding", true);

                Vector3 moveDir = m_pFSM.inputMoveDirection;

                Vector3 planeVel = new Vector3(moveDir.x, 0, moveDir.z);
                if (planeVel.sqrMagnitude > 0.0f)
                {
                    m_pFSM.animator.SetBool(hashid_isMoving, true);
                }
                else
                {
                    m_pFSM.animator.SetBool(hashid_isMoving, false);
                }
            }



            m_bIsLanding = true;
            m_bIsJumping = false;
            m_bLongJump  = false;

            //float maxFallSpeed = m_pFSM.SkinConfig == null ? 15 : m_pFSM.SkinConfig.maxFallSpeed;
            //int landingSpeed = (int)(-velocity.y);
            float fallHeight = startHeight - m_pFSM.transform.position.y;
            //if (landingSpeed > maxFallSpeed / 2.0f) //着陆大于最大速度的一半,可能需要计算伤害,上报逻辑层
            if (m_pFSM.isHero && fallHeight > 5.0f) //着陆时落差大于5米,则上报逻辑层
            {
                cmd_creature_act_landspeed data = new cmd_creature_act_landspeed();

                //data.fValue = landingSpeed;
                data.fValue = fallHeight;

                IntPtrHelper helper  = new IntPtrHelper();
                int          len     = Marshal.SizeOf(data);
                IntPtr       ptr     = helper.toPtr <cmd_creature_act_landspeed>(ref data);
                int          eventID = (int)EntityLogicDef.ENTITY_CMD_LANDING_SPEED;
                GameLogicAPI.onEntityEvent(m_pFSM.entityID, eventID, len, "", ptr, len);

                if (m_pFSM.showLog)
                {
                    Trace.Log("Big Landing! fallHeight=" + fallHeight.ToString());
                }
            }

            if (m_pFSM.creaturePropety.effectIDForLand > 0)
            {
                m_pFSM.creaturePropety.Master.LightingEffectManager.BindLighting(m_pFSM.creaturePropety.effectIDForLand);
            }


            //m_pFSM.SendMessage("OnLand", SendMessageOptions.DontRequireReceiver);
        }

        if (m_bIsLanding == false)
        {
            m_pFSM.groundNormal = Vector3.zero;
        }
    }
Пример #27
0
        public void recvWarEndLegendCupInfo(IntPtr ptrParam, int nPtrLen)
        {
            cmd_war_end_legendcup_info info = IntPtrHelper.toData <cmd_war_end_legendcup_info>(ptrParam);

            m_WarEndLegendCupInfo = info;
        }
Пример #28
0
        public void OnCommand_UpdateNumProp(EntityNumPropEventArgs e)
        {
            if (e.objev == null || !e.objev.IsHero)
            {
                return;
            }

            switch (e.data.nPropID)
            {
            case (int)ENTITY_PROPERTY.PROPERTY_SEX:
            {
                int nSex = EntityFactory.MainHeroView.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_SEX);
                actorInfo.HeadIcon.sprite = GetActorIcon(nSex + 1);
            }
            break;

            case (int)ENTITY_PROPERTY.PROPERTY_RANKGRADE:
            case (int)ENTITY_PROPERTY.PROPERTY_RANKSCORE:
            {
                int    nMatchType  = EntityFactory.MainHeroView.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_MATCHTYPE);
                int    nRankScore  = EntityFactory.MainHeroView.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_RANKSCORE);
                int    nRankGrade  = EntityFactory.MainHeroView.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_RANKGRADE);
                int    nRankIcon   = GameLogicAPI.getRankIconIDByGrade(nMatchType, nRankGrade);
                IntPtr ptr         = GameLogicAPI.getActorRankNameByGrade(nMatchType, nRankGrade);
                string strRankName = "";
                if (ptr != IntPtr.Zero)
                {
                    strRankName = IntPtrHelper.Ptr2Str(ptr);
                }
                // 更新下本地的PlayerDataManager数据 这里是个坑 以前不是实时更新的
                ActorPlayerInfo info = LogicDataCenter.playerSystemDataManager.GetActorPlayerInfo();
                if (info.playerInfo.pDbid > 0)
                {
                    info.playerInfo.nRankScore  = nRankScore;
                    info.playerInfo.nRankIconID = nRankIcon;
                    info.playerInfo.chRankName  = strRankName;
                }

                if (nRankIcon > 0)
                {
                    actorInfo.RankIcon.gameObject.SetActive(true);
                    actorInfo.RankIcon.sprite = GetActorRankIcon(nRankIcon);
                }
                else
                {
                    actorInfo.RankIcon.gameObject.SetActive(false);
                }
            }
            break;

            case (int)ENTITY_PROPERTY.PROPERTY_LEVEL:
            {
                int nLevel = EntityFactory.MainHeroView.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_LEVEL);
                actorInfo.Lv.text = nLevel.ToString();
            }
            break;

            case (int)ENTITY_PROPERTY.PROPERTY_TICKET:
            {
                int nPoint = EntityFactory.MainHeroView.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_TICKET);
                actorInfo.PointNum.text = nPoint.ToString();
            }
            break;

            case (int)ENTITY_PROPERTY.PROPERTY_GOLD:
            {
                int nGold = EntityFactory.MainHeroView.Property.GetNumProp(ENTITY_PROPERTY.PROPERTY_GOLD);
                actorInfo.BindGoldNum.text = nGold.ToString();
            }
            break;

            default:
                break;
            }
        }