internal RemoteCharacterController CreateRemoteCharacterController(UInt64 characterID) { RemoteCharacterController rcc = new RemoteCharacterController(characterID); rcc.Init("RC_" + characterID.ToString()); return(rcc); }
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; } }
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)); } } }
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)); } } }
/// <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)); } } }
internal bool RemoveCharacterController(RemoteCharacterController controller) { if (controller == null) { return(false); } controller.Destory(); return(remoteCCs.Remove(controller.CharacterID)); }
internal RemoteCharacterController FindCharacterController(UInt64 characterID) { RemoteCharacterController rcc = null; if (remoteCCs.TryGetValue(characterID, out rcc)) { return(rcc); } return(null); }
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)); } }
/// <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)); } } }
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)); } } }
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)); } } }