Esempio n. 1
0
        private void OnRecvSpellHit(MessageReceivedEvent e)
        {
            // 发送给承受伤害或治疗的角色处理
            S2C_SpellHit ret = MarshalConversion.PtrToStruct <S2C_SpellHit>(e.MessagePtr);

            if (ret.TargetId == GameEngine.EngineInstance.LocalPlayer.CharacterID)
            {
                GameEngine.EngineInstance.LocalPlayer.OnSpellHit(ret);

                GameHud.Instance.DamageListener.PushHitElement(GameEngine.EngineInstance.LocalPlayer, ret);
            }
            else
            {
                RemoteCharacterController rcc = GameEngine.EngineInstance.FindCharacterController(ret.TargetId);
                if (rcc != null)
                {
                    rcc.OnSpellHit(ret);

                    GameHud.Instance.DamageListener.PushHitElement(rcc, ret);
                }
                else
                {
                    NLogger.Instance.WriteString(LogType.Warning, string.Format("S2C_SpellHit can not find controller UintID=[{0}]", ret.TargetId));
                }
            }
        }
Esempio n. 2
0
 public void NotifyNetMessageReceived(MessageReceivedEvent e)
 {
     if (e.messageId == (UInt16)NetMovement.SC_Move)
     {
         OnRecvCharacterMove(e);
     }
     else if (e.messageId == (UInt16)NetMovement.SC_PlayerEnterAoi)
     {
         OnRecvPlayerEnterAoi(e);
     }
     else if (e.messageId == (UInt16)NetMovement.SC_CreatureEnterAoi)
     {
         OnRecvCreatureEnterAoi(e);
     }
     else if (e.messageId == (UInt16)NetMovement.SC_GameObjectEnterAoi)
     {
         // todo: 其他游戏对象进入AOI
     }
     else if (e.messageId == (UInt16)NetMovement.SC_ObjectLeaveAoi)
     {
         // 游戏对象离开AOI
         S2C_ObjectLeaveAoi ret = MarshalConversion.PtrToStruct <S2C_ObjectLeaveAoi>(e.MessagePtr);
         GameEngine.EngineInstance.RemoveCharacterController(ret.ObjectId);
     }
     else if (e.messageId == (UInt16)NetStat.SC_StatUpdate)
     {
         // 玩家自己属性变化
         GameEngine.EngineInstance.LocalPlayer.StatData.OnRecvStatUpdate(new IntPtr(e.MessagePtr.ToInt32() + 2));
     }
     else if (e.messageId == (UInt16)NetStat.SC_RemoteStatUpdate)
     {
         // 远程unit属性变化
         OnRecvRemoteStatUpdate(e);
     }
 }
Esempio n. 3
0
        private void OnRecvPlayerEnterAoi(MessageReceivedEvent e)
        {
            // 玩家进入Aoi
            Debug.Assert(GameFrameManager.Instance.CurrentFrameType == GameFrameType.Gaming);
            S2C_PlayerEnterAoi ret = MarshalConversion.PtrToStruct <S2C_PlayerEnterAoi>(e.MessagePtr);

            if (ret.PlayerId == GameEngine.EngineInstance.LocalPlayer.CharacterID)
            {
                GameEngine.EngineInstance.LocalPlayer.Transport(GameEngine.EngineInstance.GameLevel, ret.Position, true);
                GameEngine.EngineInstance.LocalPlayer.Acceleration = ret.Acceleration;
            }
            else
            {
                // 先找到是不是存在
                RemoteCharacterController rcc = GameEngine.EngineInstance.FindCharacterController(ret.PlayerId);
                if (rcc == null)
                {
                    rcc = GameEngine.EngineInstance.CreateRemoteCharacterController(ret.PlayerId);
                    GameEngine.EngineInstance.RemoteCC[ret.PlayerId] = rcc;
                }
                Debug.Assert(rcc != null);

                rcc.Transport(GameEngine.EngineInstance.GameLevel, ret.Position, true);
                rcc.Acceleration = ret.Acceleration;
            }
        }
Esempio n. 4
0
 public void NotifyNetMessageReceived(MessageReceivedEvent e)
 {
     if (e.messageId == (UInt16)NetCharacter.SC_CharCreate)
     {
         GameFrameManager.Instance.CurrentFrameType = GameFrameType.SelectRole;
     }
 }
Esempio n. 5
0
        private void OnRecvUpdateAura(MessageReceivedEvent e)
        {
            S2C_UpdateAura ret  = MarshalConversion.PtrToStruct <S2C_UpdateAura>(e.MessagePtr);
            AuraInstance   aura = null;

            if (ret.UnitId == GameEngine.EngineInstance.LocalPlayer.CharacterID)
            {
                if (GameEngine.EngineInstance.LocalPlayer.Auras.TryGetValue(ret.Slot, out aura))
                {
                    aura.UpdateData(ret.StackCount, ret.RemainTime, ret.MaxDuration);
                    GameEngine.EngineInstance.LocalPlayer.OnAuraDataChanged(new AuraChangeEventArgs(aura));
                }
            }
            else
            {
                RemoteCharacterController rcc = GameEngine.EngineInstance.FindCharacterController(ret.UnitId);
                if (rcc != null)
                {
                    if (rcc.Auras.TryGetValue(ret.Slot, out aura))
                    {
                        aura.UpdateData(ret.StackCount, ret.RemainTime, ret.MaxDuration);
                        rcc.OnAuraDataChanged(new AuraChangeEventArgs(aura));
                    }
                }
                else
                {
                    NLogger.Instance.WriteString(LogType.Warning, string.Format("S2C_UpdateAura can not find controller UintID=[{0}]", ret.UnitId));
                }
            }
        }
Esempio n. 6
0
 public void NotifyNetMessageReceived(MessageReceivedEvent e)
 {
     if (e.messageId == (UInt16)NetMovement.SC_Move)
     {
         //角色移动,更新小地图的显示范围,如果角色移动到了地图的边缘,则不改变对应边缘的小地图显示
         //OnRecvCharacterMove(e);
     }
     else if (e.messageId == (UInt16)NetMovement.SC_PlayerEnterAoi)
     {
         //其他角色进入视野
         //OnRecvPlayerEnterAoi(e);
     }
     else if (e.messageId == (UInt16)NetMovement.SC_CreatureEnterAoi)
     {
         //其他生物进入视野
         //OnRecvCreatureEnterAoi(e);
     }
     else if (e.messageId == (UInt16)NetMovement.SC_GameObjectEnterAoi)
     {
         //其他游戏对象进入AOI
     }
     else if (e.messageId == (UInt16)NetMovement.SC_ObjectLeaveAoi)
     {
         // 游戏对象离开AOI
     }
     else if (e.messageId == (UInt16)NetLoading.SC_GetInitStat)
     {
         //进入地图,初始化小地图?
     }
 }
Esempio n. 7
0
        /// <summary>
        /// 技能释放(瞬发, 引导或引导更新)
        /// </summary>
        private void OnRecvSpellCasting(MessageReceivedEvent e)
        {
            S2C_SpellCasting ret = MarshalConversion.PtrToStruct <S2C_SpellCasting>(e.MessagePtr);

            if (ret.CasterId == GameEngine.EngineInstance.LocalPlayer.CharacterID)
            {
                GameEngine.EngineInstance.LocalPlayer.OnSpellCasting(ret);

                if (currentProgressBarTimeStamp <= ret.TimeStamp)
                {
                    prepareProgressBar.Hide();
                }
            }
            else
            {
                RemoteCharacterController rcc = GameEngine.EngineInstance.FindCharacterController(ret.CasterId);
                if (rcc != null)
                {
                    rcc.OnSpellCasting(ret);
                }
                else
                {
                    NLogger.Instance.WriteString(LogType.Warning, string.Format("S2C_SpellCasting can not find controller UintID=[{0}]", ret.CasterId));
                }
            }
        }
Esempio n. 8
0
        private void OnRecvInitAura(MessageReceivedEvent e)
        {
            S2C_GetInitAura ret = MarshalConversion.PtrToStruct <S2C_GetInitAura>(e.MessagePtr);

            for (int index = 0; index < ret.Num; ++index)
            {
                Debug.Assert(index < ret.AuraDatas.Length);
                GameEngine.EngineInstance.LocalPlayer.Auras[ret.AuraDatas[index].Slot] = new AuraInstance(ret.AuraDatas[index]);
            }
            GameEngine.EngineInstance.LocalPlayer.OnAuraCollectionChanged(new GameEventArgs());
        }
Esempio n. 9
0
        private void OnRecvInitSpell(MessageReceivedEvent e)
        {
            S2C_GetInitSpell ret = MarshalConversion.PtrToStruct <S2C_GetInitSpell>(e.MessagePtr);

            for (int index = 0; index < ret.Num; ++index)
            {
                Debug.Assert(index < ret.SpellDatas.Length);
                UInt32 SpellId = ret.SpellDatas[index];
                GameEngine.EngineInstance.LocalPlayer.Spells[SpellId] = new SpellInstance(SpellId);
            }
            GameEngine.EngineInstance.LocalPlayer.OnSpellCollectionChanged(new GameEventArgs());
        }
Esempio n. 10
0
        private void OnRecvRemoteStatUpdate(MessageReceivedEvent e)
        {
            S2C_RemoteStatUpdate      ret = MarshalConversion.PtrToStruct <S2C_RemoteStatUpdate>(e.MessagePtr);
            RemoteCharacterController rcc = GameEngine.EngineInstance.FindCharacterController(ret.UnitId);

            if (rcc != null)
            {
                rcc.StatData.OnRecvRemoteStatUpdate(new IntPtr(e.MessagePtr.ToInt32() + 10));
            }
            else
            {
                NLogger.Instance.WriteString(LogType.Warning, string.Format("SC_RemoteStatUpdate can't find the uint {0}", ret.UnitId));
            }
        }
Esempio n. 11
0
        public void NotifyNetMessageReceived(MessageReceivedEvent e)
        {
            if (e.messageId == (UInt16)NetLogin.SC_LoginProofResult)
            {
                S2C_LoginProofResult ret = MarshalConversion.PtrToStruct <S2C_LoginProofResult>(e.MessagePtr);

                // 判断error code,成功则进入选人界面
                if (ret.ErrorCode == 0)
                {
                    GameFrameManager.Instance.CurrentFrameType = GameFrameType.SelectRole;
                }
                else
                {
                    btnOK.IsEnabled = true;
                }

                e.Handled = true;
            }
        }
Esempio n. 12
0
        public void NotifyNetMessageReceived(MessageReceivedEvent e)
        {
            GameFrameType oldType = CurrentFrameType;

            // 处理收到的网络消息
            foreach (var frame in currentFrames)
            {
                if (!e.Handled)
                {
                    frame.NotifyNetMessageReceived(e);
                }

                // 消息处理的过程中有可能会改变currentFrames,从而导致循环被破坏
                if (CurrentFrameType != oldType)
                {
                    break;
                }
            }
        }
Esempio n. 13
0
        /// <summary>
        /// 技能准备(吟唱, 无吟唱不会受到该消息)开始或更新
        /// </summary>
        private void OnRecvSpellPrepare(MessageReceivedEvent e)
        {
            S2C_SpellPrepare ret = MarshalConversion.PtrToStruct <S2C_SpellPrepare>(e.MessagePtr);

            if (ret.CasterId == GameEngine.EngineInstance.LocalPlayer.CharacterID)
            {
                GameEngine.EngineInstance.LocalPlayer.OnSpellPrepare(ret);

                // 显示吟唱进度条
                if (currentProgressBarTimeStamp <= ret.TimeStamp)
                {
                    if (ret.CurTime == 0)
                    {
                        prepareProgressBar.Hide();
                    }
                    else
                    {
                        NSpellInfo spell = NSpellInfo.FindInfo(ret.SpellId);
                        Debug.Assert(spell != null);

                        prepareTime    = ret.CurTime * 0.001f;
                        prepareMaxTime = ret.MaxTime * 0.001f;
                        prepareProgressBar.Progress  = prepareTime / prepareMaxTime;
                        prepareProgressBar.Text.Text = spell.Name;
                        prepareProgressBar.Show();
                        currentProgressBarTimeStamp = ret.TimeStamp;
                        currentProgressBarSpellID   = ret.SpellId;
                    }
                }
            }
            else
            {
                RemoteCharacterController rcc = GameEngine.EngineInstance.FindCharacterController(ret.CasterId);
                if (rcc != null)
                {
                    rcc.OnSpellPrepare(ret);
                }
                else
                {
                    NLogger.Instance.WriteString(LogType.Warning, string.Format("S2C_SpellPrepare can not find controller UintID=[{0}]", ret.CasterId));
                }
            }
        }
Esempio n. 14
0
 public void NotifyNetMessageReceived(MessageReceivedEvent e)
 {
     if (e.messageId == (UInt16)NetSpell.SC_AddAura)
     {
         OnRecvAddAura(e);
     }
     else if (e.messageId == (UInt16)NetSpell.SC_RemoveAura)
     {
         OnRecvRemoveAura(e);
     }
     else if (e.messageId == (UInt16)NetSpell.SC_UpdateAura)
     {
         OnRecvUpdateAura(e);
     }
     else if (e.messageId == (UInt16)NetSpell.SC_CastSpellResult)
     {
         S2C_CastSpellResult ret = MarshalConversion.PtrToStruct <S2C_CastSpellResult>(e.MessagePtr);
         GameEngine.EngineInstance.LocalPlayer.OnCastSpellResult(ret);
     }
     else if (e.messageId == (UInt16)NetSpell.SC_SpellPrepare)
     {
         // 技能准备(吟唱, 无吟唱不会受到该消息)开始或更新
         OnRecvSpellPrepare(e);
     }
     else if (e.messageId == (UInt16)NetSpell.SC_SpellCasting)
     {
         // 技能释放(瞬发, 引导或引导更新)
         OnRecvSpellCasting(e);
     }
     else if (e.messageId == (UInt16)NetSpell.SC_SpellFailed)
     {
         // 技能准备或释放过程中打断等
         OnRecvSpellFailed(e);
     }
     else if (e.messageId == (UInt16)NetSpell.SC_SpellHit)
     {
         // 技能命中信息(需要广播)
         OnRecvSpellHit(e);
     }
 }
Esempio n. 15
0
        private void OnRecvAddAura(MessageReceivedEvent e)
        {
            S2C_AddAura ret = MarshalConversion.PtrToStruct <S2C_AddAura>(e.MessagePtr);

            if (ret.UnitId == GameEngine.EngineInstance.LocalPlayer.CharacterID)
            {
                GameEngine.EngineInstance.LocalPlayer.Auras[ret.AuraData.Slot] = new AuraInstance(ret.AuraData);
                GameEngine.EngineInstance.LocalPlayer.OnAuraCollectionChanged(new GameEventArgs());
            }
            else
            {
                RemoteCharacterController rcc = GameEngine.EngineInstance.FindCharacterController(ret.UnitId);
                if (rcc != null)
                {
                    rcc.Auras[ret.AuraData.Slot] = new AuraInstance(ret.AuraData);
                    rcc.OnAuraCollectionChanged(new GameEventArgs());
                }
                else
                {
                    NLogger.Instance.WriteString(LogType.Warning, string.Format("SC_AddAura can not find controller UintID=[{0}]", ret.UnitId));
                }
            }
        }
Esempio n. 16
0
        private void OnRecvCharacterMove(MessageReceivedEvent e)
        {
            // 移动消息
            Debug.Assert(GameFrameManager.Instance.CurrentFrameType == GameFrameType.Gaming);
            S2C_Move ret = MarshalConversion.PtrToStruct <S2C_Move>(e.MessagePtr);

            if (ret.UnitId == GameEngine.EngineInstance.LocalPlayer.CharacterID)
            {
                GameEngine.EngineInstance.LocalPlayer.OnNetMovement(ret);
            }
            else
            {
                RemoteCharacterController rcc = GameEngine.EngineInstance.FindCharacterController(ret.UnitId);
                if (rcc != null)
                {
                    rcc.OnNetMovement(ret);
                }
                else
                {
                    NLogger.Instance.WriteString(LogType.Debug,
                                                 string.Format("Can not find character controller when receive S2C_Move ID=[{0}]", ret.UnitId));
                }
            }
        }
Esempio n. 17
0
 public void NotifyNetMessageReceived(MessageReceivedEvent e)
 {
 }
Esempio n. 18
0
        public void NotifyNetMessageReceived(MessageReceivedEvent e)
        {
            if (e.messageId == (UInt16)NetCharacter.SC_CharError)
            {
                // todo: 显示错误消息
                e.Handled = true;
            }
            else if (e.messageId == (UInt16)NetCharacter.SC_CharEnum)
            {
                S2C_CharEnum ret = MarshalConversion.PtrToStruct <S2C_CharEnum>(e.MessagePtr);

                btnEnterGame.Enable();

                e.Handled = true;
            }
            else if (e.messageId == (UInt16)NetCharacter.SC_CharEnterGame)
            {
                // 向服务器请求获取玩家的初始属性数据
                C2S_GetInitStat initStatReq;
                initStatReq.MessageId = C2S_GetInitStat.Id;
                GameFrameManager.SendNetMessage <C2S_GetInitStat>(initStatReq);

                S2C_CharEnterGame ret = MarshalConversion.PtrToStruct <S2C_CharEnterGame>(e.MessagePtr);
                GameEngine.EngineInstance.LocalPlayer.CharacterID = ret.PlayerId;
                GameEngine.EngineInstance.LocalPlayer.Transport(GameEngine.EngineInstance.GameLevel, ret.Position, true);
                GameEngine.EngineInstance.LocalPlayer.Rotation = new Vector3(0.0f, ret.Yaw, 0.0f);

                e.Handled = true;
            }
            else if (e.messageId == (UInt16)NetLoading.SC_GetInitStat)
            {
                GameEngine.EngineInstance.LocalPlayer.StatData.OnRecvInitStat(new IntPtr(e.MessagePtr.ToInt32() + 2));

                // 注意发送和接受顺序
                C2S_GetInitSpell initSpellReq;
                initSpellReq.MessageId = C2S_GetInitSpell.Id;
                GameFrameManager.SendNetMessage <C2S_GetInitSpell>(initSpellReq);
            }
            else if (e.messageId == (UInt16)NetLoading.SC_GetInitSpell)
            {
                // 初始化技能
                OnRecvInitSpell(e);

                C2S_GetInitAura initAuraReq;
                initAuraReq.MessageId = C2S_GetInitAura.Id;
                GameFrameManager.SendNetMessage <C2S_GetInitAura>(initAuraReq);
            }
            else if (e.messageId == (UInt16)NetLoading.SC_GetInitAura)
            {
                // 初始化BUFF
                OnRecvInitAura(e);

                // todo: 发送进入地图消息
                C2S_MapEnter enterMapReq;
                enterMapReq.messageId = C2S_MapEnter.Id;
                GameFrameManager.SendNetMessage <C2S_MapEnter>(enterMapReq);
            }
            else if (e.messageId == (UInt16)NetMap.SC_MapEnter)
            {
                GameFrameManager.Instance.CurrentFrameType = GameFrameType.Gaming;

                e.Handled = true;
            }
        }
Esempio n. 19
0
 void messageListener_NetMessageReceived(object sender, MessageReceivedEvent e)
 {
     GameFrameManager.Instance.NotifyNetMessageReceived(e);
 }