/// <summary> /// 场景切换检查 /// </summary> /// <param name="player"></param> /// <param name="inScene"></param> /// <param name="transmitType">0:道具/超时回城, 1:死亡回城 , 2:转送阵, 3: NPC</param> /// <returns></returns> public override bool TransferCheck(PlayerBusiness player, SceneBusiness inScene, TransmitType transmitType) { //检查必杀的怪是否完成.. if (transmitType == TransmitType.Pin) { IList killed = player.Ectype.Value.GetValue<IList>("Killed"); string needKill = NpcManager.Instance.MustKill(this.ID, killed); if (needKill != null) { string msg = string.Format(TipManager.GetMessage(ClientReturn.SceneEctype4), needKill); player.Call(ClientCommand.IntoSceneR, false, null, msg); return false; } } return base.TransferCheck(player, inScene, transmitType); }
/// <summary> /// 回城 /// </summary> /// <param name="player"></param> /// <param name="tType">回城方式</param> public bool TownGate(PlayerBusiness player, TransmitType tType) { if (player.Scene != this) { return false; } Destination desc = null; if (tType == TransmitType.UseProp) { //不能使用道具回城 desc = PropDestination; if (desc == null) { return false; } } else if (tType == TransmitType.Dead) { desc = DeadDestination; if (desc != null) { player.SetActionState(ActionState.Standing); } } else if (tType == TransmitType.OverTime) { string sceneid = player.Ectype.Value.GetStringOrDefault("SceneID"); if (!string.IsNullOrEmpty(sceneid)) { int x = player.Ectype.Value.GetIntOrDefault("X"); int y = player.Ectype.Value.GetIntOrDefault("Y"); desc = new Destination(sceneid, x, y); } if (desc != null) { player.SetActionState(ActionState.Standing); } } if (desc == null) { return false; } SceneBusiness inScene; ScenesProxy.TryGetScene(desc.SceneID, out inScene); //场景转移检查,除了死亡和超时.其它情况进行场景检查 if (!(tType == TransmitType.Dead || tType == TransmitType.OverTime)) { if ((!TransferCheck(player, inScene, tType))) { return false; } } object[] point = new object[] { desc.X, desc.Y }; if (ExitScene(player)) { //执行进入 inScene.Execute(new UserNote(player, ClientCommand.IntoSceneSuccess, point)); } if (player.TeamJob == TeamJob.Captain) { PlayerTeam team = player.Team; if (team != null) { for (int i = 1; i < team.Members.Length; i++) { PlayerBusiness member = team.Members[i]; if (member != null && member.TeamJob == TeamJob.Member) { if (ExitScene(member)) { //执行进入 inScene.Execute(new UserNote(member, ClientCommand.IntoSceneSuccess, point)); } } } } } return true; }
/// <summary> /// 切换场景 /// </summary> /// <param name="player"></param> /// <param name="inScene"></param> /// <param name="transmitType"></param> /// <returns></returns> public virtual bool TransferCheck(PlayerBusiness player, SceneBusiness inScene, TransmitType transmitType) { if (inScene == null) return false; return inScene.IntoCheck(player); }
/// <summary> /// 发送数据包 /// </summary> /// <param name="type"></param> /// <param name="data"></param> public void sendData(TransmitType type, byte[] data) { if (data == null || data.Length == 0) return; SendTimestamp++; UDPFramePacket packet = new UDPFramePacket(); packet.type = (byte)type; packet.Timestamp = SendTimestamp; packet.Block = data; send(packet.ToBytes()); return; if (data.Length <= mtu) { packet.PacketCount = 1; packet.Block = data; send(packet.ToBytes()); Console.WriteLine(packet.type.ToString() + ":" + packet.ToBytes().Length.ToString()); } else { int count = data.Length / mtu; if (data.Length % mtu != 0) count += 1; int offSet = 0; byte[] block = new byte[mtu]; for (int i = 0; i < count; i++) { packet.PacketCount = count; packet.PacketIndex = i; if (offSet + mtu > data.Length) block = new byte[data.Length - offSet];//要发送的缓冲区 Buffer.BlockCopy(data, offSet, block, 0, block.Length); packet.Block = block; send(packet.ToBytes()); offSet += mtu; Console.WriteLine( packet.type.ToString() +":"+ packet.ToBytes().Length.ToString()); } } }