示例#1
0
        internal RemoteCharacterController CreateRemoteCharacterController(UInt64 characterID)
        {
            RemoteCharacterController rcc = new RemoteCharacterController(characterID);

            rcc.Init("RC_" + characterID.ToString());
            return(rcc);
        }
示例#2
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;
            }
        }
示例#3
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));
                }
            }
        }
示例#4
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));
                }
            }
        }
示例#5
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));
                }
            }
        }
示例#6
0
        internal bool RemoveCharacterController(RemoteCharacterController controller)
        {
            if (controller == null)
            {
                return(false);
            }

            controller.Destory();
            return(remoteCCs.Remove(controller.CharacterID));
        }
示例#7
0
        internal RemoteCharacterController FindCharacterController(UInt64 characterID)
        {
            RemoteCharacterController rcc = null;

            if (remoteCCs.TryGetValue(characterID, out rcc))
            {
                return(rcc);
            }
            return(null);
        }
示例#8
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));
            }
        }
示例#9
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));
                }
            }
        }
示例#10
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));
                }
            }
        }
示例#11
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));
                }
            }
        }