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)); } } }
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); } }
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; } }
public void NotifyNetMessageReceived(MessageReceivedEvent e) { if (e.messageId == (UInt16)NetCharacter.SC_CharCreate) { GameFrameManager.Instance.CurrentFrameType = GameFrameType.SelectRole; } }
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)); } } }
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) { //进入地图,初始化小地图? } }
/// <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)); } } }
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()); }
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()); }
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)); } }
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; } }
public void NotifyNetMessageReceived(MessageReceivedEvent e) { GameFrameType oldType = CurrentFrameType; // 处理收到的网络消息 foreach (var frame in currentFrames) { if (!e.Handled) { frame.NotifyNetMessageReceived(e); } // 消息处理的过程中有可能会改变currentFrames,从而导致循环被破坏 if (CurrentFrameType != oldType) { break; } } }
/// <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)); } } }
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); } }
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)); } } }
public void NotifyNetMessageReceived(MessageReceivedEvent e) { }
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; } }
void messageListener_NetMessageReceived(object sender, MessageReceivedEvent e) { GameFrameManager.Instance.NotifyNetMessageReceived(e); }