public override NET_RESULT_DEFINE.PACKET_EXE Execute(PacketBase pPacket, ref Peer pPlayer)
        {
            GCCharDirectImpact Packet = (GCCharDirectImpact)pPacket;

            if (GameProcedure.GetActiveProcedure() == GameProcedure.s_ProcMain)
            {
                CObject pObj = CObjectManager.Instance.FindServerObject(Packet.RecieverID);
                if (pObj != null)
                {
                    _DAMAGE_INFO infoDamage = new _DAMAGE_INFO();
                    infoDamage.m_nSkillID          = Packet.SkillID;
                    infoDamage.m_nTargetID         = (uint)Packet.RecieverID;
                    infoDamage.m_nSenderID         = (uint)Packet.SenderID;
                    infoDamage.m_nSenderLogicCount = Packet.SenderLogicCount;
                    infoDamage.m_nImpactID         = Packet.ImpactID;
                    infoDamage.m_nType             = _DAMAGE_INFO.DAMAGETYPE.TYPE_EFFECT;

                    _LOGIC_EVENT logicEvent = new _LOGIC_EVENT();
                    logicEvent.Init(infoDamage.m_nSenderID, infoDamage.m_nSenderLogicCount, infoDamage);

                    SCommand_Object cmdTemp = new SCommand_Object();
                    cmdTemp.m_wID = (int)OBJECTCOMMANDDEF.OC_LOGIC_EVENT;
                    cmdTemp.SetValue <object>(0, logicEvent);
                    pObj.PushCommand(cmdTemp);
                    pObj.SetMsgTime(GameProcedure.s_pTimeSystem.GetTimeNow());
                }
                LogManager.Log("RECV GCCharDirectImpact");
            }
            return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);
        }
Example #2
0
        public override NET_RESULT_DEFINE.PACKET_EXE Execute(PacketBase pPacket, ref Peer pPlayer)
        {
            if (GameProcedure.GetActiveProcedure() == (GameProcedure)GameProcedure.s_ProcMain)
            {
                LogManager.Log("Receive GCDetailHealsAndDamages Packet");
                GCDetailHealsAndDamages Packet = (GCDetailHealsAndDamages)pPacket;
                CObject pObj = CObjectManager.Instance.FindServerObject((int)Packet.RecieverID);
                if (pObj != null)
                {
                    _DAMAGE_INFO infoDamage = new _DAMAGE_INFO();
                    infoDamage.m_nSkillID = Packet.SkillID;

                    if (infoDamage.m_nSkillID != MacroDefine.INVALID_ID)
                    {
                        _DBC_SKILL_DATA skillData = CSkillDataMgr.Instance.GetSkillData((uint)infoDamage.m_nSkillID);
                        if (skillData != null)
                        {
                            infoDamage.m_nBulletID = skillData.m_nBulletID;
                        }
                    }

                    infoDamage.m_nTargetID         = (uint)Packet.RecieverID;
                    infoDamage.m_nSenderID         = (uint)Packet.SenderID;
                    infoDamage.m_nSenderLogicCount = Packet.SenderLogicCount;
                    infoDamage.m_nImpactID         = MacroDefine.INVALID_ID;
                    infoDamage.m_nType             = _DAMAGE_INFO.DAMAGETYPE.TYPE_HEAL_AND_DAMAGE;
                    if (Packet.IsHpModificationDirty())
                    {
                        infoDamage.m_bHealthDirty     = true;
                        infoDamage.m_nHealthIncrement = Packet.HPModification;
                    }
                    if (Packet.IsMpModificationDirty())
                    {
                        infoDamage.m_bManaDirty     = true;
                        infoDamage.m_nManaIncrement = Packet.MPModification;
                    }
                    if (Packet.IsRageModificationDirty())
                    {
                        infoDamage.m_bRageDirty     = true;
                        infoDamage.m_nRageIncrement = Packet.RageModification;
                    }
                    if (Packet.IsStrikePointModificationDirty())
                    {
                        infoDamage.m_bStrikePointDirty     = true;
                        infoDamage.m_nStrikePointIncrement = Packet.StrikePointModification;
                    }
                    infoDamage.m_bIsCriticalHit = Packet.CriticalHit;

                    _LOGIC_EVENT logicEvent = new _LOGIC_EVENT();
                    logicEvent.Init((uint)Packet.SenderID, Packet.SenderLogicCount, infoDamage);

                    SCommand_Object cmdTemp = new SCommand_Object();
                    cmdTemp.m_wID = (int)OBJECTCOMMANDDEF.OC_LOGIC_EVENT;
                    cmdTemp.SetValue <object>(0, logicEvent);
                    pObj.PushCommand(cmdTemp);
                }
            }
            return(NET_RESULT_DEFINE.PACKET_EXE.PACKET_EXE_CONTINUE);
        }
Example #3
0
    public void Init(uint nSenderID, int nSenderLogicCount, _DAMAGE_INFO DamageInfo)
    {
        m_nSenderID         = nSenderID;
        m_nSenderLogicCount = nSenderLogicCount;

        m_nEventType = ENUM_LOGIC_EVENT_TYPE.LOGIC_EVENT_TYPE_DAMAGE;
        m_damage     = DamageInfo;
    }
    private void DisplayMissImmuAndSoOn(_DAMAGE_INFO pDamageInfo)
    {
        if (pDamageInfo == null)
        {
            return;
        }

        if (m_Character.GetRenderInterface() == null /*|| GameProcedure.s_pUISystem == null*/)
        {
            return;
        }

        //if (this.GetCharacterType() == CT_MONSTER && ( ((CObject_PlayerNPC*)this).IsDisplayBoard() == FALSE))
        //{
        //    return;
        //}

        Vector3 fvPos = m_Character.m_pInfoBoard != null?m_Character.m_pInfoBoard.GetPosition() : Vector3.zero;

        //if (m_pMountRenderInterface != null)
        //{
        //    fvCurPos.y += m_fMountAddHeight;
        //}

        //m_cObject.GetRenderInterface().Actor_GetInfoBoardPos(fvPos, fvCurPos);

        CObject pMyself = CObjectManager.Instance.getPlayerMySelf();

        if (pMyself == null)
        {
            return;
        }

        //bool bFlag = false;
        string strMsg = string.Empty;

        switch ((MissFlag_T)pDamageInfo.m_nImpactID)
        {
        case MissFlag_T.FLAG_MISS:
            //strMsg = ChangeDamgeByRule(ENUM_DAMAGE_TYPE.DAMAGE_MISS,0,ENUM_DAMAGE_OPERATION.OPERATION_INVALID);
            //bFlag = true;
            UISystem.Instance.AddNewBeHitBoard(false, "",
                                               fvPos.x, fvPos.y, ENUM_DAMAGE_TYPE.DAMAGE_MISS, ENUM_DMG_MOVE_TYPE.MOVE_STATUS);
            break;

        //case MissFlag_T.FLAG_IMMU:
        //    strMsg = ChangeDamgeByRule(ENUM_DAMAGE_TYPE.DAMAGE_MISS, 0, ENUM_DAMAGE_OPERATION.OPERATION_INVALID);
        //    bFlag = true;
        //    break;
        //case MissFlag_T.FLAG_ABSORB:
        //    strMsg = ChangeDamgeByRule(ENUM_DAMAGE_TYPE.DAMAGE_MISS, 0, ENUM_DAMAGE_OPERATION.OPERATION_INVALID);
        //    bFlag = true;
        //    break;
        //case MissFlag_T.FLAG_COUNTERACT:
        //    strMsg = ChangeDamgeByRule(ENUM_DAMAGE_TYPE.DAMAGE_MISS, 0, ENUM_DAMAGE_OPERATION.OPERATION_INVALID);
        //    bFlag = true;
        //    break;
        //case MissFlag_T.FLAG_TRANSFERED:
        //    strMsg = ChangeDamgeByRule(ENUM_DAMAGE_TYPE.DAMAGE_MISS, 0, ENUM_DAMAGE_OPERATION.OPERATION_INVALID);
        //    bFlag = true;
        //    break;
        default:
            break;
        }
        //m_Character.ShowTalk(strMsg);
        //if (bFlag)
        //{
        //    //GameProcedure.s_pUISystem.AddNewBeHitBoard(false, m_szDamage, fvPos.x, fvPos.y, 0, MOVE_STATUS );
        //}
    }
    private void DisplayDamageBoard(_DAMAGE_INFO pDamageInfo)
    {
        if (pDamageInfo == null || m_Character.GetRenderInterface() == null)
        {
            return;
        }
        CObject pMySelf = CObjectManager.Instance.getPlayerMySelf();

        if (pMySelf == null)
        {
            return;
        }
        if (m_Character.GetCharacterType() == CHARACTER_TYPE.CT_MONSTER && (((CObject_PlayerNPC)m_Character).IsDisplayBoard() == false))
        {
            return;
        }

        Vector3 fvPos = m_Character.m_pInfoBoard != null?m_Character.m_pInfoBoard.GetPosition() : Vector3.zero;

        uint nCasterID   = pDamageInfo.m_nSenderID;
        uint nReceiverID = pDamageInfo.m_nTargetID;

        //bool bNeedDisplay = true;
        bool bDouble = pDamageInfo.m_bIsCriticalHit;

        // 是否暴击 [12/28/2010 ivan edit]
        ENUM_DAMAGE_TYPE isCritical = pDamageInfo.m_bIsCriticalHit ? ENUM_DAMAGE_TYPE.DAMAGE_CRITICAL : ENUM_DAMAGE_TYPE.DAMAGE_NORMAL;

        if (IsMySelf(nReceiverID))
        {
            if (0 < pDamageInfo.m_nHealthIncrement)       //治疗
            {
                UISystem.Instance.AddNewBeHitBoard(bDouble, pDamageInfo.m_nHealthIncrement.ToString(),
                                                   fvPos.x, fvPos.y, ENUM_DAMAGE_TYPE.DAMAGE_NORMAL, ENUM_DMG_MOVE_TYPE.MOVE_HEAL_HP);
            }
            if (0 > pDamageInfo.m_nHealthIncrement)       //伤害
            {
                UISystem.Instance.AddNewBeHitBoard(bDouble, pDamageInfo.m_nHealthIncrement.ToString(),
                                                   fvPos.x, fvPos.y, ENUM_DAMAGE_TYPE.DAMAGE_NORMAL, ENUM_DMG_MOVE_TYPE.MOVE_DAMAGE_ME);
            }
            if (0 < pDamageInfo.m_nManaIncrement)       //mana增加
            {
                UISystem.Instance.AddNewBeHitBoard(bDouble, pDamageInfo.m_nManaIncrement.ToString(),
                                                   fvPos.x, fvPos.y, ENUM_DAMAGE_TYPE.DAMAGE_NORMAL, ENUM_DMG_MOVE_TYPE.MOVE_HEAL_MP);
            }
        }
        else if (IsMySelf(nCasterID))
        {
            if (0 > pDamageInfo.m_nHealthIncrement)       //伤害
            {
                UISystem.Instance.AddNewBeHitBoard(bDouble, pDamageInfo.m_nHealthIncrement.ToString(),
                                                   fvPos.x, fvPos.y, isCritical, ENUM_DMG_MOVE_TYPE.MOVE_DAMAGE_OTHER);
            }
        }
        else if (IsMyPet(nCasterID))
        {
            if (0 > pDamageInfo.m_nHealthIncrement)//伤害
            {
                UISystem.Instance.AddNewBeHitBoard(bDouble, pDamageInfo.m_nHealthIncrement.ToString(),
                                                   fvPos.x, fvPos.y, isCritical, ENUM_DMG_MOVE_TYPE.MOVE_DAMAGE_OTHER);
            }
        }
        else if (IsMyPet(nReceiverID))
        {
            if (0 > pDamageInfo.m_nHealthIncrement)//伤害
            {
                UISystem.Instance.AddNewBeHitBoard(bDouble, pDamageInfo.m_nHealthIncrement.ToString(),
                                                   fvPos.x, fvPos.y, ENUM_DAMAGE_TYPE.DAMAGE_NORMAL, ENUM_DMG_MOVE_TYPE.MOVE_DAMAGE_ME);
            }
        }
    }
    private void DoLogicEvent_Damage(_LOGIC_EVENT pLogicEvent)
    {
        _DAMAGE_INFO pDamageInfo = pLogicEvent.m_damage;

        switch (pDamageInfo.m_nType)
        {
        case _DAMAGE_INFO.DAMAGETYPE.TYPE_INVALID:
            break;

        case _DAMAGE_INFO.DAMAGETYPE.TYPE_EFFECT:
        {
            LogManager.Log("_DAMAGE_INFO.DAMAGETYPE.TYPE_EFFECT " + m_Character.ServerID);
            if (pDamageInfo.m_nImpactID != MacroDefine.INVALID_ID)
            {
                _DBC_DIRECT_IMPACT pDirectImpact = CDirectlyImpactMgr.Instance.GetDirectlyImpact((uint)pDamageInfo.m_nImpactID);
                if (pDirectImpact != null)
                {
                    Vector3 fvPos = new Vector3();

                    if (m_Character.GetRenderInterface() != null && pDirectImpact.m_pszEffectLocator.Length != 0)
                    {
                        m_Character.GetRenderInterface().GetLocator(pDirectImpact.m_pszEffectLocator, ref fvPos);
                    }
                    else
                    {
                        fvPos = m_Character.GetPosition();
                    }

                    if (pDirectImpact.m_pszEffect.Length > 0)
                    {
                        CObject_Effect pObjEffect = CObjectManager.Instance.NewEffect(-1);
                        if (pObjEffect != null)
                        {
                            SObject_EffectInit initEffect = new SObject_EffectInit();
                            initEffect.m_fvPos         = fvPos;
                            initEffect.m_fvRot         = new Vector3(0.0f, 0.0f, 0.0f);
                            initEffect.m_pszEffectName = pDirectImpact.m_pszEffect;
                            initEffect.m_bLoopEffect   = false;
                            pObjEffect.Initial(initEffect);
                        }
                    }

                    if (pDirectImpact.m_pszSound.Length > 0)
                    {
                        fvPos = m_Character.GetPosition();
                        // Vector3 fvGame = new Vector3();

                        //if(!CGameProcedure::s_pGfxSystem.Axis_Trans(CRenderSystem::AX_GAME, fvPos,
                        //    CRenderSystem::AX_GFX, fvGame))
                        //{
                        //    return;
                        //}
                        //CSoundSystemFMod::_PlaySoundFunc( pDirectlyImpact.m_pszSound, &fvGame.x, false );
                    }
                }
            }
        }
        break;

        case _DAMAGE_INFO.DAMAGETYPE.TYPE_HEAL_AND_DAMAGE:
        {
            LogManager.Log("_DAMAGE_INFO.DAMAGETYPE.TYPE_HEAL_AND_DAMAGE " + this.m_Character.ServerID + " pDamageInfo.m_nHealthIncrement " + pDamageInfo.m_nHealthIncrement);
            if (pDamageInfo.m_nHealthIncrement < 0)
            {
                this.m_Character.SetFightState(true);
                LogManager.Log("pDamageInfo.m_nHealthIncrement " + this.m_Character.ServerID + " CharacterLogic_Get " + m_Character.CharacterLogic_Get());
                if (m_Character.CharacterLogic_Get() == ENUM_CHARACTER_LOGIC.CHARACTER_LOGIC_IDLE)
                {
                    LogManager.Log("pDamageInfo.BASE_ACTION_F_BE_HIT " + this.m_Character.ServerID);
                    m_Character.ChangeAction((int)ENUM_BASE_ACTION.BASE_ACTION_F_BE_HIT, 1.0f, false, CObject_Character.sDefaultActionFuseTime);
                }
            }
            // 显示伤血信息
            DisplayDamageBoard(pDamageInfo);
        }
        break;

        case _DAMAGE_INFO.DAMAGETYPE.TYPE_DROP_BOX:
        {
            uint  ObjID   = (uint)pDamageInfo.m_aAttachedParams[0];
            int   idOwner = pDamageInfo.m_aAttachedParams[1];
            float fX      = pDamageInfo.m_aAttachedParams[2] / 1000.0f;
            float fZ      = pDamageInfo.m_aAttachedParams[3] / 1000.0f;
            //创建ItemBox
            CTripperObject_ItemBox pBox = CObjectManager.Instance.NewTripperItemBox((int)ObjID);
            pBox.Initial(null);
            //设置位置
            pBox.SetMapPosition(fX, fZ);
            //设置掉落箱的归属
            pBox.SetOwnerGUID((uint)idOwner);
        }
        break;

        case _DAMAGE_INFO.DAMAGETYPE.TYPE_SKILL_TEXT:
        {
            // 显示未击中和免疫信息
            DisplayMissImmuAndSoOn(pDamageInfo);
        }
        break;

        case _DAMAGE_INFO.DAMAGETYPE.TYPE_DIE:
        {
            m_Character.OnDead(true);
        }
        break;

        default:
            break;
        }
    }