protected override bool AcceptPlayerMove(McpeMovePlayer message, bool isOnGround, bool isFlyingHorizontally) { if (CooldownTick-- > 0) { return(true); } if (!isOnGround) { if (isFlyingHorizontally) { //if (!message.onGround) //{ if (!IsSpectator) { if (message.y <= 256) { Disconnect("Error #375! Flight is not allow."); //Level.BroadcastMessage(Username + " возможно читер!!!"); return(true); } } //} } } return(true); }
public void McpePlayStatus_parallel_encode_perf_test() { byte[] result = new byte[0]; void Body(int i) { var input = new McpeMovePlayer(); result = input.Encode(); } long totalAllocatedBytes = GC.GetTotalMemory(true); var watch = Stopwatch.StartNew(); Parallel.For(0, _loops, i => { var input = new McpeMovePlayer(); result = input.Encode(); }); if (result.Length < 0) { return; } long watchElapsedMilliseconds = watch.ElapsedMilliseconds; Console.WriteLine($"Time: {watchElapsedMilliseconds:N}ms, mem: {(GC.GetTotalMemory(true) - totalAllocatedBytes) / 1024f:N}KB"); }
public Package HandleIncomingMove(McpeMovePlayer packet, Player player) { var spawn = player.Level.SpawnPoint; if (packet.x <= spawn.X + Boder && packet.x >= spawn.X - Boder) { if (packet.z <= spawn.Z + Boder && packet.z >= spawn.Z - Boder) { return(packet); } } player.SetPosition(new PlayerLocation( player.KnownPosition.X - (packet.x - player.KnownPosition.X), player.KnownPosition.Y, player.KnownPosition.Z - (packet.z - player.KnownPosition.Z)) { HeadYaw = packet.headYaw, Pitch = packet.pitch, Yaw = packet.yaw }); player.SendMessage("Out of bounce"); return(packet); }
public ChunkColumn GenerateChunkColumn(ChunkCoordinates chunkCoordinates) { var sw = Stopwatch.StartNew(); var playerCoords = (BlockCoordinates)chunkCoordinates; var movePlayerPacket = McpeMovePlayer.CreateObject(); movePlayerPacket.runtimeEntityId = _client.EntityId; movePlayerPacket.x = playerCoords.X; movePlayerPacket.y = 255; movePlayerPacket.z = playerCoords.Z; _client.SendPacket(movePlayerPacket); int count = 0; ChunkColumn chunk = null; while (count++ < 100 && !_client.Chunks.TryGetValue(chunkCoordinates, out chunk)) { Thread.Sleep(50); } if (chunk == null) { Log.Warn($"Failed to locate chunk {chunkCoordinates}. Tried {count} times"); } else { Log.Debug($"Successful return of chunk {chunkCoordinates} in {sw.ElapsedMilliseconds}ms. Tried {count} times"); } return(chunk); }
public Package OnPlayerMove(McpeMovePlayer packet, Player player) { var userManager = Context.Server.UserManager; var user = userManager.FindByNameAsync(player.Username).Result; if (user != null) { if (!user.IsAuthenticated) { player.SetPosition(player.SpawnPosition); player.ClearPopups(); player.AddPopup(new Popup() { Message = $"{ChatColors.Green}Type your password to login!", Duration = 10, Priority = 1000 }); } } else { player.SetPosition(player.SpawnPosition); player.ClearPopups(); player.AddPopup(new Popup() { Message = $"{ChatColors.Green}Type /reg password to register!", Duration = 10, Priority = 1000 }); } return packet; }
private void OnMcpeMovePlayer(Package message) { McpeMovePlayer msg = (McpeMovePlayer)message; Log.DebugFormat("Entity ID: {0}", msg.entityId); CurrentLocation = new PlayerLocation(msg.x, msg.y + 10, msg.z); SendMcpeMovePlayer(); }
public Package onMovePlayer(McpeMovePlayer packet, Player player) { if (!Class1.lged.ContainsKey(player.Username.ToLower())) { notlogin(player); return(null); } return(packet); }
/* private int _lastPlayerMoveSequenceNUmber; * private int _lastOrderingIndex; * private object _moveSyncLock = new object(); * public override void HandleMcpeMovePlayer(McpeMovePlayer message) * { * if (!IsSpawned || HealthManager.IsDead) return; * * if (_plugin.OpenServer.ServerRole != ServerRole.Node) * { * lock (_moveSyncLock) * { * if (_lastPlayerMoveSequenceNUmber > message.DatagramSequenceNumber) * { * return; * } * * _lastPlayerMoveSequenceNUmber = message.DatagramSequenceNumber; * * if (_lastOrderingIndex > message.OrderingIndex) * { * return; * } * * _lastOrderingIndex = message.OrderingIndex; * } * } * * var newPosition = new PlayerLocation(message.x, message.y, message.z, message.headYaw, message.yaw, * message.pitch); * * EventDispatcher.DispatchEventAsync(new PlayerMoveEvent(this, KnownPosition, newPosition, false)) * .Then( * result => * { * if (result.IsCancelled) * return; * * base.HandleMcpeMovePlayer(message); * //base.Teleport(result.To); * }); * }*/ protected override bool AcceptPlayerMove(McpeMovePlayer message, bool isOnGround, bool isFlyingHorizontally) { // return true; if (!PlayerMoveEvent(KnownPosition, new PlayerLocation(message.x, message.y, message.z, message.headYaw, message.yaw, message.pitch))) { return(false); } return(base.AcceptPlayerMove(message, isOnGround, isFlyingHorizontally)); }
public Package overRedstoneBlock(McpeMovePlayer message, MiniPEPlayer player) // <- isn't working too { if (jumpManager.playsJump(player)) { if (player.Level.GetBlock(new BlockCoordinates((int)player.KnownPosition.X, (int)player.KnownPosition.Y - 1, (int)player.KnownPosition.Z)).Id == 152) { jumpManager.getMatchByPlayer(player).removePlayer(player); } } return(message); }
public override void HandleMcpeMovePlayer(McpeMovePlayer message) { base.HandleMcpeMovePlayer(message); if (Level is xCoreLevel) { if (((xCoreLevel)Level).Game.isMove) { ((xCoreLevel)Level).Game.MovePlayer(message, this); } return; } }
public Packet HandleIncoming(McpeMovePlayer packet, Player player) { if (_playerEntities.ContainsKey(player)) { var entity = _playerEntities[player]; entity.KnownPosition = player.KnownPosition; var message = McpeMoveEntity.CreateObject(); message.runtimeEntityId = entity.EntityId; message.position = entity.KnownPosition; player.Level.RelayBroadcast(message); } return(packet); // Process }
public Package HandleIncoming(McpeMovePlayer packet, Player player) { if (_playerEntities.ContainsKey(player)) { var entity = _playerEntities[player]; entity.KnownPosition = player.KnownPosition; var message = new McpeMoveEntity(); message.entities = new EntityLocations(); message.entities.Add(entity.EntityId, entity.KnownPosition); player.Level.RelayBroadcast(message); } return packet; // Process }
public Package HandleIncoming(McpeMovePlayer packet, Player player) { if (_playerEntities.ContainsKey(player)) { var entity = _playerEntities[player]; entity.KnownPosition = player.KnownPosition; var message = McpeMoveEntity.CreateObject(); message.entities = new EntityLocations(); message.entities.Add(entity.EntityId, entity.KnownPosition); player.Level.RelayBroadcast(message); } return(packet); // Process }
public virtual void HandleMcpeMovePlayer(McpeMovePlayer message) { if (message.runtimeEntityId != Client.EntityId) { return; } Client.CurrentLocation = new PlayerLocation(message.x, message.y, message.z); //Client.LevelInfo.SpawnX = (int) message.x; //Client.LevelInfo.SpawnY = (int) message.y; //Client.LevelInfo.SpawnZ = (int) message.z; //Client.SendMcpeMovePlayer(); }
public void SendMovePlayer() { var package = McpeMovePlayer.CreateObject(); package.entityId = EntityId; package.x = KnownPosition.X; package.y = KnownPosition.Y + 1.62f; package.z = KnownPosition.Z; package.yaw = KnownPosition.Yaw; package.headYaw = KnownPosition.HeadYaw; package.pitch = KnownPosition.Pitch; package.teleport = 0x0; SendPackage(package); }
/// <summary> /// Handles the move player. /// </summary> /// <param name="message">The message.</param> private void HandleMovePlayer(McpeMovePlayer message) { if (HealthManager.IsDead) { return; } if (DateTime.UtcNow.Ticks - LastUpdatedTime.Ticks < 20000) { return; } KnownPosition = new PlayerLocation { X = message.x, Y = message.y - 1.62f, Z = message.z, Pitch = message.pitch, Yaw = message.yaw, HeadYaw = message.headYaw }; LastUpdatedTime = DateTime.UtcNow; if (IsBot) { return; } //if (Level.Random.Next(0, 5) == 0) //{ // int data = 0; // //data = (int) uint.Parse("FFFF0000", NumberStyles.HexNumber); // data = Level.Random.Next((int) uint.Parse("FFFF0000", NumberStyles.HexNumber), (int) uint.Parse("FFFFFFFF", NumberStyles.HexNumber)); // Level.RelayBroadcast(new McpeLevelEvent // { // eventId = 0x4000 | 22, // x = KnownPosition.X, // //y = KnownPosition.Y - 1.62f, // y = KnownPosition.Y - 1f, // z = KnownPosition.Z, // data = data // }); //} SendChunksForKnownPosition(); }
public override void HandleMcpeMovePlayer(McpeMovePlayer message) { if (message.runtimeEntityId != Client.EntityId) { BaseClient.WorldReceiver.UpdateEntityPosition(message.runtimeEntityId, new PlayerLocation(message.x, message.y - Player.EyeLevel, message.z, message.headYaw, message.yaw, message.pitch)); return; } BaseClient.WorldReceiver.UpdatePlayerPosition(new PlayerLocation(message.x, message.y, message.z)); //BaseClient.SendMcpeMovePlayer(); Client.CurrentLocation = new MiNET.Utils.PlayerLocation(message.x, message.y, message.z); BaseClient.SendMcpeMovePlayer(); }
public void SendMcpeMovePlayer() { //var movePlayerPacket = McpeMovePlayer.AddReference(); McpeMovePlayer movePlayerPacket = McpeMovePlayer.CreateObject(); movePlayerPacket.entityId = 0; movePlayerPacket.x = CurrentLocation.X; movePlayerPacket.y = CurrentLocation.Y; movePlayerPacket.z = CurrentLocation.Z; movePlayerPacket.yaw = 91; movePlayerPacket.pitch = 28; movePlayerPacket.headYaw = 91; SendPackage(movePlayerPacket); //SendChat("Movin " + CurrentLocation); }
public void SendMcpeMovePlayer() { //Log.Debug($"Sending move {EntityId}: {CurrentLocation}"); McpeMovePlayer movePlayerPacket = McpeMovePlayer.CreateObject(); movePlayerPacket.runtimeEntityId = EntityId; movePlayerPacket.x = CurrentLocation.X; movePlayerPacket.y = CurrentLocation.Y; movePlayerPacket.z = CurrentLocation.Z; movePlayerPacket.yaw = 91; movePlayerPacket.pitch = 28; movePlayerPacket.headYaw = 91; _toNodeHandler.WriteBytes(movePlayerPacket.Encode()); movePlayerPacket.PutPool(); }
public void SendMcpeMovePlayer() { //var movePlayerPacket = McpeMovePlayer.AddReference(); McpeMovePlayer movePlayerPacket = new McpeMovePlayer(); movePlayerPacket.entityId = _entityId; movePlayerPacket.x = _currentLocation.X; movePlayerPacket.y = _currentLocation.Y; movePlayerPacket.z = _currentLocation.Z; movePlayerPacket.yaw = 91; movePlayerPacket.pitch = 28; movePlayerPacket.headYaw = 91; SendPackage(movePlayerPacket); //SendChat("Testing"); }
public Package inWater(McpeMovePlayer message, MiniPEPlayer player) // <- this is not called I think (maybe because of the Server creates no MiniPEPlayer Objects) { if (jumpManager.playsJump(player)) { if (player.Level.GetBlock(new BlockCoordinates(player.KnownPosition)).Id == 8) { player.KnownPosition = new PlayerLocation(new Vector3(340, 10, 454)); player.SendMovePlayer(true); } if (player.Level.GetBlock(new BlockCoordinates(player.KnownPosition)).Id == 9) { player.KnownPosition = new PlayerLocation(new Vector3(340, 10, 454)); player.SendMovePlayer(true); } } return(message); }
public void SetPosition(PlayerLocation position, bool teleport = true) { KnownPosition = position; LastUpdatedTime = DateTime.UtcNow; var package = McpeMovePlayer.CreateObject(); package.runtimeEntityId = EntityId; package.x = position.X; package.y = position.Y + 1.62f; package.z = position.Z; package.yaw = position.HeadYaw; package.headYaw = position.Yaw; package.pitch = position.Pitch; package.mode = (byte)(teleport ? 1 : 0); Level.RelayBroadcast(package); }
public ChunkColumn GenerateChunkColumn(ChunkCoordinates chunkCoordinates) { var sw = Stopwatch.StartNew(); var playerCoords = (BlockCoordinates)chunkCoordinates; if (_client.Chunks.TryGetValue(chunkCoordinates, out ChunkColumn chunk)) { Log.Debug($"Successful return of chunk {chunkCoordinates} from cache."); _client.Chunks.TryRemove(chunkCoordinates, out _); return(chunk); } _client.Chunks.TryAdd(chunkCoordinates, null); // register to receive chunks. var movePlayerPacket = McpeMovePlayer.CreateObject(); movePlayerPacket.runtimeEntityId = _client.EntityId; movePlayerPacket.x = playerCoords.X; movePlayerPacket.y = 255; movePlayerPacket.z = playerCoords.Z; _client.SendPacket(movePlayerPacket); while (sw.ElapsedMilliseconds < 2000) { _client.Chunks.TryGetValue(chunkCoordinates, out chunk); if (chunk != null) { break; } Thread.Sleep(50); } if (chunk == null) { Log.Warn($"Failed to locate chunk {chunkCoordinates}. Tried {sw.ElapsedMilliseconds}ms"); } else { Log.Debug($"Successful return of chunk {chunkCoordinates} in {sw.ElapsedMilliseconds}ms. Have {_client.Chunks.Count} chunks in memory now."); } return(chunk); }
public void McpePlayStatus_pooled_encode_perf_test() { long totalAllocatedBytes = GC.GetTotalMemory(true); var watch = Stopwatch.StartNew(); byte[] result = new byte[0]; for (int i = 0; i < _loops; i++) { var input = McpeMovePlayer.CreateObject(); result = input.Encode(); input.PutPool(); } if (result.Length < 0) { return; } long watchElapsedMilliseconds = watch.ElapsedMilliseconds; Console.WriteLine($"Time: {watchElapsedMilliseconds:N}ms, mem: {(GC.GetTotalMemory(true) - totalAllocatedBytes) / 1024f:N}KB"); }
public void HandleMcpeMovePlayer(McpeMovePlayer message) { }
public Package PlayerMove(McpeMovePlayer package, Player player) { if (!_registerlist.Contains(player.User) || !player.User.IsAuthenticated) { player.KnownPosition = player.Level.SpawnPoint; } return package; }
public MiNetClient(IPEndPoint endpoint = null) { _endpoint = new IPEndPoint(IPAddress.Any, 0); _serverEndpoint = endpoint ?? new IPEndPoint(IPAddress.Loopback, 19132); _movePlayerPacket = new McpeMovePlayer(); }
protected virtual bool AcceptPlayerMove(McpeMovePlayer message) { if (GameMode != GameMode.Creative && _isKnownCheater <= _cheatLimit) { long td = DateTime.UtcNow.Ticks - LastUpdatedTime.Ticks; if (HealthManager.CooldownTick == 0 && td > 49*TimeSpan.TicksPerMillisecond && td < 500*TimeSpan.TicksPerMillisecond && Level.SpawnPoint.DistanceTo(KnownPosition) > 2.0) { double horizSpeed; { // Speed in the xz plane Vector3 origin = new Vector3(KnownPosition.X, 0, KnownPosition.Z); double distanceTo = origin.DistanceTo(new Vector3(message.x, 0, message.z)); horizSpeed = distanceTo/td*TimeSpan.TicksPerSecond; //if (horizSpeed > 11.0d) //{ // _isKnownCheater = true; // Level.BroadcastMessage(string.Format("{0} is spead cheating {3:##.##}m/s {1:##.##}m {2}ms", Username, distanceTo, (int) ((double) td/TimeSpan.TicksPerMillisecond), horizSpeed), type: MessageType.Raw); // AddPopup(new Popup // { // MessageType = MessageType.Tip, // Message = string.Format("{0} sprinting {3:##.##}m/s {1:##.##}m {2}ms", Username, distanceTo, (int)((double)td / TimeSpan.TicksPerMillisecond), horizSpeed), // Duration = 1 // }); // LastUpdatedTime = DateTime.UtcNow; // //HealthManager.TakeHit(this, 1, DamageCause.Suicide); // //SendMovePlayer(); // return; //} } double verticalSpeed; { // Speed in 3d double speedLimit = (message.y - 1.62) - KnownPosition.Y < 0 ? -70d : 12d; //6d; double distanceTo = (message.y - 1.62) - KnownPosition.Y; verticalSpeed = distanceTo/td*TimeSpan.TicksPerSecond; if (!(horizSpeed > 0) && Math.Abs(verticalSpeed) > Math.Abs(speedLimit)) { if (_isKnownCheater == _cheatLimit) { Level.BroadcastMessage(string.Format("{0} is detected as flying {3:##.##}m/s {1:##.##}m {2}ms", Username, distanceTo, (int) ((double) td/TimeSpan.TicksPerMillisecond), verticalSpeed), type: MessageType.Raw); Log.WarnFormat("{0} is fly cheating {3:##.##}m/s {1:##.##}m {2}ms", Username, distanceTo, (int) ((double) td/TimeSpan.TicksPerMillisecond), verticalSpeed); } //AddPopup(new Popup //{ // MessageType = MessageType.Tip, // Message = string.Format("{3:##.##}m/s {1:##.##}m {2}ms", Username, distanceTo, (int)((double)td / TimeSpan.TicksPerMillisecond), verticalSpeed), // Duration = 1 //}); LastUpdatedTime = DateTime.UtcNow; //HealthManager.TakeHit(this, 1, DamageCause.Suicide); //SendMovePlayer(); _isKnownCheater++; return false; } } AddPopup(new Popup { MessageType = MessageType.Tip, Message = string.Format("Horiz: {0:##.##}m/s Vert: {1:##.##}m/s", horizSpeed, verticalSpeed), Duration = 1 }); } } return true; }
protected virtual void HandleMovePlayer(McpeMovePlayer message) { if (!IsSpawned || HealthManager.IsDead) return; lock (_moveSyncLock) { if (_lastPlayerMoveSequenceNUmber > message.DatagramSequenceNumber) { return; } _lastPlayerMoveSequenceNUmber = message.DatagramSequenceNumber; if (_lastOrderingIndex > message.OrderingIndex) { return; } _lastOrderingIndex = message.OrderingIndex; } if (!AcceptPlayerMove(message)) return; KnownPosition = new PlayerLocation { X = message.x, Y = message.y - 1.62f, Z = message.z, Pitch = message.pitch, Yaw = message.yaw, HeadYaw = message.headYaw }; LastUpdatedTime = DateTime.UtcNow; ThreadPool.QueueUserWorkItem(delegate(object state) { SendChunksForKnownPosition(); }); }
/// <summary> /// Handles the move player. /// </summary> /// <param name="message">The message.</param> private void HandleMovePlayer(McpeMovePlayer message) { if (HealthManager.IsDead) return; if (DateTime.UtcNow.Ticks - LastUpdatedTime.Ticks < 20000) return; KnownPosition = new PlayerLocation { X = message.x, Y = message.y - 1.62f, Z = message.z, Pitch = message.pitch, Yaw = message.yaw, HeadYaw = message.headYaw }; LastUpdatedTime = DateTime.UtcNow; if (IsBot) return; //if (Level.Random.Next(0, 5) == 0) //{ // int data = 0; // //data = (int) uint.Parse("FFFF0000", NumberStyles.HexNumber); // data = Level.Random.Next((int) uint.Parse("FFFF0000", NumberStyles.HexNumber), (int) uint.Parse("FFFFFFFF", NumberStyles.HexNumber)); // Level.RelayBroadcast(new McpeLevelEvent // { // eventId = 0x4000 | 22, // x = KnownPosition.X, // //y = KnownPosition.Y - 1.62f, // y = KnownPosition.Y - 1f, // z = KnownPosition.Z, // data = data // }); //} SendChunksForKnownPosition(); }
public Package MinimalHandler(McpeMovePlayer packet, Player source) { return packet; // Handled }
public Package HandleSendMove(McpeMovePlayer packet, Player source) { return packet; }
protected virtual void BroadCastMovement(Player[] players, Entity[] entities) { if (players.Length == 0) { return; } DateTime tickTime = _lastSendTime; _lastSendTime = DateTime.UtcNow; DateTime now = DateTime.UtcNow; MemoryStream stream = MiNetServer.MemoryStreamManager.GetStream(); int count = 0; McpeMovePlayer move = McpeMovePlayer.CreateObject(); foreach (var player in players) { if (((now - player.LastUpdatedTime) <= now - tickTime)) { PlayerLocation knownPosition = player.KnownPosition; move.entityId = player.EntityId; move.x = knownPosition.X; move.y = knownPosition.Y + 1.62f; move.z = knownPosition.Z; move.yaw = knownPosition.Yaw; move.pitch = knownPosition.Pitch; move.headYaw = knownPosition.HeadYaw; move.mode = 0; byte[] bytes = move.Encode(); stream.Write(BitConverter.GetBytes(Endian.SwapInt32(bytes.Length)), 0, 4); stream.Write(bytes, 0, bytes.Length); move.Reset(); count++; } } move.PutPool(); McpeMoveEntity moveEntity = McpeMoveEntity.CreateObject(); moveEntity.entities = new EntityLocations(); McpeSetEntityMotion entityMotion = McpeSetEntityMotion.CreateObject(); entityMotion.entities = new EntityMotions(); foreach (var entity in entities) { if (((now - entity.LastUpdatedTime) <= now - tickTime)) { moveEntity.entities.Add(entity.EntityId, entity.KnownPosition); entityMotion.entities.Add(entity.EntityId, entity.Velocity); count++; } } if (moveEntity.entities.Count > 0) { byte[] bytes = moveEntity.Encode(); stream.Write(BitConverter.GetBytes(Endian.SwapInt32(bytes.Length)), 0, 4); stream.Write(bytes, 0, bytes.Length); } moveEntity.PutPool(); if (moveEntity.entities.Count > 0) { byte[] bytes = entityMotion.Encode(); stream.Write(BitConverter.GetBytes(Endian.SwapInt32(bytes.Length)), 0, 4); stream.Write(bytes, 0, bytes.Length); } entityMotion.PutPool(); if (count == 0) { return; } McpeBatch batch = McpeBatch.CreateObject(players.Length); byte[] buffer = Player.CompressBytes(stream.ToArray(), CompressionLevel.Optimal); batch.payloadSize = buffer.Length; batch.payload = buffer; batch.Encode(true); foreach (var player in players) { Task sendTask = new Task(obj => ((Player)obj).SendMoveList(batch, now), player); sendTask.Start(); } }
public Package HandlePacketTest(McpeMovePlayer packet, Player source) { Log.DebugFormat("Player (x,y,z): {0},{1},{2}", packet.x, packet.y, packet.z); return packet; // Handled }
/// <summary> /// Handles the specified package. /// </summary> /// <param name="message">The package.</param> /// <param name="senderEndpoint">The sender's endpoint.</param> private void HandlePackage(Package message, IPEndPoint senderEndpoint) { if (typeof(McpeBatch) == message.GetType()) { McpeBatch batch = (McpeBatch)message; var messages = new List <Package>(); // Get bytes byte[] payload = batch.payload; // Decompress bytes MemoryStream stream = new MemoryStream(payload); if (stream.ReadByte() != 0x78) { throw new InvalidDataException("Incorrect ZLib header. Expected 0x78 0x9C"); } stream.ReadByte(); using (var defStream2 = new DeflateStream(stream, CompressionMode.Decompress, false)) { // Get actual package out of bytes MemoryStream destination = new MemoryStream(); defStream2.CopyTo(destination); byte[] internalBuffer = destination.ToArray(); messages.Add(PackageFactory.CreatePackage(internalBuffer[0], internalBuffer) ?? new UnknownPackage(internalBuffer[0], internalBuffer)); } foreach (var msg in messages) { HandlePackage(msg, senderEndpoint); } return; } TraceReceive(message); if (typeof(UnknownPackage) == message.GetType()) { return; } if (typeof(McpeDisconnect) == message.GetType()) { McpeDisconnect msg = (McpeDisconnect)message; Log.Debug(msg.message); StopServer(); return; } if (typeof(ConnectedPing) == message.GetType()) { ConnectedPing msg = (ConnectedPing)message; SendConnectedPong(msg.sendpingtime); return; } if (typeof(McpeFullChunkData) == message.GetType()) { McpeFullChunkData msg = (McpeFullChunkData)message; ChunkColumn chunk = ClientUtils.DecocedChunkColumn(msg.chunkData); if (chunk != null) { Log.DebugFormat("Chunk X={0}", chunk.x); Log.DebugFormat("Chunk Z={0}", chunk.z); ClientUtils.SaveChunkToAnvil(chunk); } return; } if (typeof(ConnectionRequestAccepted) == message.GetType()) { Thread.Sleep(50); SendNewIncomingConnection(); var t1 = new Timer(state => SendConnectedPing(), null, 2000, 5000); Thread.Sleep(50); SendLogin("Client12"); return; } if (typeof(McpeSetSpawnPosition) == message.GetType()) { McpeSetSpawnPosition msg = (McpeSetSpawnPosition)message; _spawn = new Vector3(msg.x, msg.y, msg.z); _level.SpawnX = (int)_spawn.X; _level.SpawnY = (int)_spawn.Y; _level.SpawnZ = (int)_spawn.Z; return; } if (typeof(McpeStartGame) == message.GetType()) { McpeStartGame msg = (McpeStartGame)message; _entityId = msg.entityId; _spawn = new Vector3(msg.x, msg.y, msg.z); _level.LevelName = "Default"; _level.Version = 19133; _level.GameType = msg.gamemode; ClientUtils.SaveLevel(_level); return; } if (typeof(McpeTileEvent) == message.GetType()) { McpeTileEvent msg = (McpeTileEvent)message; Log.DebugFormat("X: {0}", msg.x); Log.DebugFormat("Y: {0}", msg.y); Log.DebugFormat("Z: {0}", msg.z); Log.DebugFormat("Case 1: {0}", msg.case1); Log.DebugFormat("Case 2: {0}", msg.case2); return; } if (typeof(McpeAddEntity) == message.GetType()) { McpeAddEntity msg = (McpeAddEntity)message; Log.DebugFormat("Entity ID: {0}", msg.entityId); Log.DebugFormat("Entity Type: {0}", msg.entityType); Log.DebugFormat("X: {0}", msg.x); Log.DebugFormat("Y: {0}", msg.y); Log.DebugFormat("Z: {0}", msg.z); Log.DebugFormat("Yaw: {0}", msg.yaw); Log.DebugFormat("Pitch: {0}", msg.pitch); Log.DebugFormat("Velocity X: {0}", msg.speedX); Log.DebugFormat("Velocity Y: {0}", msg.speedY); Log.DebugFormat("Velocity Z: {0}", msg.speedZ); Log.DebugFormat("Metadata: {0}", msg.metadata.ToString()); Log.DebugFormat("Links count: {0}", msg.links); return; } if (typeof(McpeSetEntityData) == message.GetType()) { McpeSetEntityData msg = (McpeSetEntityData)message; Log.DebugFormat("Entity ID: {0}", msg.entityId); MetadataDictionary metadata = msg.metadata; Log.DebugFormat("Metadata: {0}", metadata.ToString()); return; } if (typeof(McpeMovePlayer) == message.GetType()) { McpeMovePlayer msg = (McpeMovePlayer)message; Log.DebugFormat("Entity ID: {0}", msg.entityId); _currentLocation = new PlayerLocation(msg.x, msg.y + 10, msg.z); SendMcpeMovePlayer(); return; } if (typeof(McpeUpdateBlock) == message.GetType()) { McpeUpdateBlock msg = (McpeUpdateBlock)message; Log.DebugFormat("No of Blocks: {0}", msg.blocks.Count); return; } if (typeof(McpeLevelEvent) == message.GetType()) { McpeLevelEvent msg = (McpeLevelEvent)message; Log.DebugFormat("Event ID: {0}", msg.eventId); Log.DebugFormat("X: {0}", msg.x); Log.DebugFormat("Y: {0}", msg.y); Log.DebugFormat("Z: {0}", msg.z); Log.DebugFormat("Data: {0}", msg.data); return; } }
public override void HandleMcpeMovePlayer(McpeMovePlayer message) { base.HandleMcpeMovePlayer(message); }
public Package HandleOutgoing(McpeMovePlayer packet) { return packet; // Send }
public Package HandleIncoming(McpeMovePlayer packet) { return packet; // Process }
public static Action <Task, PlayerLocation> DoMoveTo(MiNetClient client) { Action <Task, PlayerLocation> doMoveTo = (t, loc) => { Vector3 originalPosition = client.CurrentLocation.ToVector3(); Vector3 targetPosition = loc.ToVector3(); PlayerLocation lookAtPos = LookAt(originalPosition + new Vector3(0, 1.62f, 0), targetPosition); { // First just rotate towards target pos McpeMovePlayer movePlayerPacket = McpeMovePlayer.CreateObject(); movePlayerPacket.runtimeEntityId = client.EntityId; movePlayerPacket.x = client.CurrentLocation.X; movePlayerPacket.y = client.CurrentLocation.Y; movePlayerPacket.z = client.CurrentLocation.Z; movePlayerPacket.yaw = lookAtPos.Yaw; movePlayerPacket.pitch = lookAtPos.Pitch; movePlayerPacket.headYaw = lookAtPos.HeadYaw; } float lenght = Math.Abs((originalPosition - targetPosition).Length()); float stepLen = 0.5f; float weight; while (true) { if (Math.Abs((targetPosition - client.CurrentLocation.ToVector3()).Length()) > stepLen) { float lenLeft = Math.Abs((client.CurrentLocation.ToVector3() - targetPosition).Length()); weight = Math.Abs((float)((lenLeft - stepLen) / lenght)); client.CurrentLocation = new PlayerLocation(Vector3.Lerp(originalPosition, targetPosition, 1 - weight)); McpeMovePlayer movePlayerPacket = McpeMovePlayer.CreateObject(); movePlayerPacket.runtimeEntityId = client.EntityId; movePlayerPacket.x = client.CurrentLocation.X; movePlayerPacket.y = client.CurrentLocation.Y; movePlayerPacket.z = client.CurrentLocation.Z; movePlayerPacket.yaw = lookAtPos.Yaw; movePlayerPacket.pitch = lookAtPos.Pitch; movePlayerPacket.headYaw = lookAtPos.HeadYaw; client.SendPackage(movePlayerPacket); Thread.Sleep(50); continue; } { client.CurrentLocation = new PlayerLocation(targetPosition); McpeMovePlayer movePlayerPacket = McpeMovePlayer.CreateObject(); movePlayerPacket.runtimeEntityId = client.EntityId; movePlayerPacket.x = client.CurrentLocation.X; movePlayerPacket.y = client.CurrentLocation.Y; movePlayerPacket.z = client.CurrentLocation.Z; movePlayerPacket.yaw = lookAtPos.Yaw; movePlayerPacket.pitch = lookAtPos.Pitch; movePlayerPacket.headYaw = lookAtPos.HeadYaw; client.SendPackage(movePlayerPacket); } break; } }; return(doMoveTo); }
/// <summary> /// Handles the move player. /// </summary> /// <param name="message">The message.</param> private void HandleMovePlayer(McpeMovePlayer message) { if (HealthManager.IsDead) return; long td = DateTime.UtcNow.Ticks - LastUpdatedTime.Ticks; if (GameMode == GameMode.Survival && HealthManager.CooldownTick == 0 && td > 49*TimeSpan.TicksPerMillisecond && td < 500*TimeSpan.TicksPerMillisecond && Level.SpawnPoint.DistanceTo(new BlockCoordinates(KnownPosition)) > 2.0 ) { double horizSpeed; { // Speed in the xz plane Vector3 origin = new Vector3(KnownPosition.X, 0, KnownPosition.Z); double distanceTo = origin.DistanceTo(new Vector3(message.x, 0, message.z)); horizSpeed = distanceTo/td*TimeSpan.TicksPerSecond; if (horizSpeed > 11.0d) { Level.BroadcastTextMessage(string.Format("{0} spead cheating {3:##.##}m/s {1:##.##}m {2}ms", Username, distanceTo, (int) ((double) td/TimeSpan.TicksPerMillisecond), horizSpeed), type: MessageType.Chat); AddPopup(new Popup { MessageType = MessageType.Chat, Message = string.Format("{0} sprinting {3:##.##}m/s {1:##.##}m {2}ms", Username, distanceTo, (int) ((double) td/TimeSpan.TicksPerMillisecond), horizSpeed), Duration = 1 }); LastUpdatedTime = DateTime.UtcNow; HealthManager.TakeHit(this, 1, DamageCause.Suicide); SendMovePlayer(); return; } } double verticalSpeed; { // Speed in 3d double speedLimit = (message.y - 1.62) - KnownPosition.Y < 0 ? -70d : 6d; double distanceTo = (message.y - 1.62) - KnownPosition.Y; verticalSpeed = distanceTo/td*TimeSpan.TicksPerSecond; if (!(horizSpeed > 0) && Math.Abs(verticalSpeed) > Math.Abs(speedLimit)) { //Level.BroadcastTextMessage(string.Format("{0} fly cheating {3:##.##}m/s {1:##.##}m {2}ms", Username, distanceTo, (int) ((double) td/TimeSpan.TicksPerMillisecond), verticalSpeed), type: MessageType.Raw); AddPopup(new Popup { MessageType = MessageType.Tip, Message = string.Format("{3:##.##}m/s {1:##.##}m {2}ms", Username, distanceTo, (int) ((double) td/TimeSpan.TicksPerMillisecond), verticalSpeed), Duration = 1 }); LastUpdatedTime = DateTime.UtcNow; HealthManager.TakeHit(this, 1, DamageCause.Suicide); //SendMovePlayer(); return; } } AddPopup(new Popup { MessageType = MessageType.Tip, Message = string.Format("Horiz: {0:##.##}m/s Vert: {1:##.##}m/s", horizSpeed, verticalSpeed), Duration = 1 }); } KnownPosition = new PlayerLocation { X = message.x, Y = message.y - 1.62f, Z = message.z, Pitch = message.pitch, Yaw = message.yaw, HeadYaw = message.headYaw }; LastUpdatedTime = DateTime.UtcNow; if (IsBot) return; //if (Level.Random.Next(0, 5) == 0) //{ // int data = 0; // //data = (int) uint.Parse("FFFF0000", NumberStyles.HexNumber); // data = Level.Random.Next((int) uint.Parse("FFFF0000", NumberStyles.HexNumber), (int) uint.Parse("FFFFFFFF", NumberStyles.HexNumber)); // Level.RelayBroadcast(new McpeLevelEvent // { // eventId = 0x4000 | 22, // x = KnownPosition.X, // //y = KnownPosition.Y - 1.62f, // y = KnownPosition.Y - 1f, // z = KnownPosition.Z, // data = data // }); //} SendChunksForKnownPosition(); }
protected virtual void BroadCastMovement(Player[] players, Entity[] entities) { DateTime now = DateTime.UtcNow; if (players.Length == 0) { return; } if (players.Length <= 1 && entities.Length == 0) { return; } if (now - _lastBroadcast < TimeSpan.FromMilliseconds(50)) { return; } DateTime tickTime = _lastSendTime; _lastSendTime = DateTime.UtcNow; using (MemoryStream stream = MiNetServer.MemoryStreamManager.GetStream()) { int playerMoveCount = 0; int entiyMoveCount = 0; foreach (var player in players) { if (now - player.LastUpdatedTime <= now - tickTime) { PlayerLocation knownPosition = player.KnownPosition; McpeMovePlayer move = McpeMovePlayer.CreateObject(); move.entityId = player.EntityId; move.x = knownPosition.X; move.y = knownPosition.Y + 1.62f; move.z = knownPosition.Z; move.yaw = knownPosition.Yaw; move.pitch = knownPosition.Pitch; move.headYaw = knownPosition.HeadYaw; move.mode = 0; byte[] bytes = move.Encode(); BatchUtils.WriteLength(stream, bytes.Length); stream.Write(bytes, 0, bytes.Length); move.PutPool(); playerMoveCount++; } } foreach (var entity in entities) { if (now - entity.LastUpdatedTime <= now - tickTime) { { McpeMoveEntity moveEntity = McpeMoveEntity.CreateObject(); moveEntity.entityId = entity.EntityId; moveEntity.position = (PlayerLocation)entity.KnownPosition.Clone(); moveEntity.position.Y += entity.PositionOffset; byte[] bytes = moveEntity.Encode(); BatchUtils.WriteLength(stream, bytes.Length); stream.Write(bytes, 0, bytes.Length); moveEntity.PutPool(); } { McpeSetEntityMotion entityMotion = McpeSetEntityMotion.CreateObject(); entityMotion.entityId = entity.EntityId; entityMotion.velocity = entity.Velocity; byte[] bytes = entityMotion.Encode(); BatchUtils.WriteLength(stream, bytes.Length); stream.Write(bytes, 0, bytes.Length); entityMotion.PutPool(); } entiyMoveCount++; } } if (playerMoveCount == 0 && entiyMoveCount == 0) { return; } if (players.Length == 1 && entiyMoveCount == 0) { return; } McpeBatch batch = BatchUtils.CreateBatchPacket(stream.GetBuffer(), 0, (int)stream.Length, CompressionLevel.Optimal, false); batch.AddReferences(players.Length - 1); batch.Encode(); //batch.ValidUntil = now + TimeSpan.FromMilliseconds(50); foreach (var player in players) { MiNetServer.FastThreadPool.QueueUserWorkItem(() => player.SendPackage(batch)); } _lastBroadcast = DateTime.UtcNow; } }
public Package Hookshot(McpeUseItem packet, Player player) { if (!(packet.face == -1 & player.Inventory.GetItemInHand().Id == 346)) { return(packet); } player.Level.BroadcastMessage("test: arrow", type: MessageType.Raw); // Message typeはtip popup messageが選べる! const int force = 1; //Arrow arrow = new Arrow(player, player.Level, !(force < 1.0)); Arrow arrow = new Arrow(player, player.Level); arrow.KnownPosition = (PlayerLocation)player.KnownPosition.Clone(); arrow.KnownPosition.Y += 1.62f; arrow.Velocity = arrow.KnownPosition.GetHeadDirection() * (force * 2.0f * 1.5f); arrow.KnownPosition.Yaw = (float)arrow.Velocity.GetYaw(); arrow.KnownPosition.Pitch = (float)arrow.Velocity.GetPitch(); arrow.BroadcastMovement = true; arrow.DespawnOnImpact = false; //arrow.HitEvent += testary; arrow.SpawnEntity(); var setEntityLinkPk = McpeSetEntityLink.CreateObject(); setEntityLinkPk.riderId = 0; setEntityLinkPk.riddenId = arrow.EntityId; setEntityLinkPk.linkType = 2; /* public static final byte TYPE_REMOVE = 0; * public static final byte TYPE_RIDE = 1; * public static final byte TYPE_PASSENGER = 2; */ new Task(() => player.Level.RelayBroadcast(setEntityLinkPk)).Start(); Level level = player.Level; Mob entity = new Mob(EntityType.Zombie, level) { KnownPosition = player.KnownPosition, }; entity.SpawnEntity(); entity.IsAngry = true; entity. Task.Run(() => { PlayerLocation pos = null; while (arrow.Velocity.Length() > 0) { pos = arrow.KnownPosition; Thread.Sleep(100); } McpeMovePlayer mp = McpeMovePlayer.CreateObject(); mp.entityId = 0; mp.x = pos.X; mp.y = pos.Y; mp.z = pos.Z; mp.pitch = player.KnownPosition.Pitch; mp.headYaw = player.KnownPosition.HeadYaw; mp.yaw = player.KnownPosition.Yaw; new Task(() => player.Level.RelayBroadcast(mp)).Start(); /*Console.Write("done!!" + pos); * Block block = BlockFactory.GetBlockById((byte)1); * block.Coordinates = new BlockCoordinates((int)arrow.KnownPosition.X, (int)arrow.KnownPosition.Y - 2, (int)arrow.KnownPosition.Z); * //arrow.Level.SetBlock(block); * * Block item = new Block(35); * player.KnownPosition.Y -= 2;*/ }); return(packet); }
protected virtual void HandleMovePlayer(McpeMovePlayer message) { if (!IsSpawned || HealthManager.IsDead) return; lock (_moveSyncLock) { if (_lastPlayerMoveSequenceNUmber > message.DatagramSequenceNumber) { Log.DebugFormat("Skipping move datagram {1}/{2} for player {0}", Username, _lastPlayerMoveSequenceNUmber, message.DatagramSequenceNumber); return; } else { _lastPlayerMoveSequenceNUmber = message.DatagramSequenceNumber; } if (_lastOrderingIndex > message.OrderingIndex) { Log.DebugFormat("Skipping move ordering {1}/{2} for player {0}", Username, _lastOrderingIndex, message.OrderingIndex); return; } else { _lastOrderingIndex = message.OrderingIndex; } long td = DateTime.UtcNow.Ticks - LastUpdatedTime.Ticks; Vector3 origin = new Vector3(KnownPosition.X, 0, KnownPosition.Z); double distanceTo = origin.DistanceTo(new Vector3(message.x, 0, message.z)); if (distanceTo/td*TimeSpan.TicksPerSecond > 25.0d) { //SendMovePlayer(); return; } } //bool useAntiCheat = false; //if (useAntiCheat) //{ // long td = DateTime.UtcNow.Ticks - LastUpdatedTime.Ticks; // if (GameMode == GameMode.Survival // && HealthManager.CooldownTick == 0 // && td > 49*TimeSpan.TicksPerMillisecond // && td < 500*TimeSpan.TicksPerMillisecond // && Level.SpawnPoint.DistanceTo(new BlockCoordinates(KnownPosition)) > 2.0 // ) // { // double horizSpeed; // { // // Speed in the xz plane // Vector3 origin = new Vector3(KnownPosition.X, 0, KnownPosition.Z); // double distanceTo = origin.DistanceTo(new Vector3(message.x, 0, message.z)); // horizSpeed = distanceTo/td*TimeSpan.TicksPerSecond; // if (horizSpeed > 11.0d) // { // //Level.BroadcastTextMessage(string.Format("{0} spead cheating {3:##.##}m/s {1:##.##}m {2}ms", Username, distanceTo, (int) ((double) td/TimeSpan.TicksPerMillisecond), horizSpeed), type: MessageType.Raw); // AddPopup(new Popup // { // MessageType = MessageType.Tip, // Message = string.Format("{0} sprinting {3:##.##}m/s {1:##.##}m {2}ms", Username, distanceTo, (int) ((double) td/TimeSpan.TicksPerMillisecond), horizSpeed), // Duration = 1 // }); // LastUpdatedTime = DateTime.UtcNow; // HealthManager.TakeHit(this, 1, DamageCause.Suicide); // SendMovePlayer(); // return; // } // } // double verticalSpeed; // { // // Speed in 3d // double speedLimit = (message.y - 1.62) - KnownPosition.Y < 0 ? -70d : 6d; // double distanceTo = (message.y - 1.62) - KnownPosition.Y; // verticalSpeed = distanceTo/td*TimeSpan.TicksPerSecond; // if (!(horizSpeed > 0) && Math.Abs(verticalSpeed) > Math.Abs(speedLimit)) // { // //Level.BroadcastTextMessage(string.Format("{0} fly cheating {3:##.##}m/s {1:##.##}m {2}ms", Username, distanceTo, (int) ((double) td/TimeSpan.TicksPerMillisecond), verticalSpeed), type: MessageType.Raw); // AddPopup(new Popup // { // MessageType = MessageType.Tip, // Message = string.Format("{3:##.##}m/s {1:##.##}m {2}ms", Username, distanceTo, (int) ((double) td/TimeSpan.TicksPerMillisecond), verticalSpeed), // Duration = 1 // }); // LastUpdatedTime = DateTime.UtcNow; // HealthManager.TakeHit(this, 1, DamageCause.Suicide); // //SendMovePlayer(); // return; // } // } // AddPopup(new Popup // { // MessageType = MessageType.Tip, // Message = string.Format("Horiz: {0:##.##}m/s Vert: {1:##.##}m/s", horizSpeed, verticalSpeed), // Duration = 1 // }); // } //} KnownPosition = new PlayerLocation { X = message.x, Y = message.y - 1.62f, Z = message.z, Pitch = message.pitch, Yaw = message.yaw, HeadYaw = message.headYaw }; LastUpdatedTime = DateTime.UtcNow; //if (Level.Random.Next(0, 5) == 0) //{ // int data = 0; // //data = (int) uint.Parse("FFFF0000", NumberStyles.HexNumber); // data = Level.Random.Next((int) uint.Parse("FFFF0000", NumberStyles.HexNumber), (int) uint.Parse("FFFFFFFF", NumberStyles.HexNumber)); // Level.RelayBroadcast(new McpeLevelEvent // { // eventId = 0x4000 | 22, // x = KnownPosition.X, // //y = KnownPosition.Y - 1.62f, // y = KnownPosition.Y - 1f, // z = KnownPosition.Z, // data = data // }); //} ThreadPool.QueueUserWorkItem(delegate(object state) { SendChunksForKnownPosition(); }); }
public bool MovePlayer(McpeMovePlayer package, Player player) //готово { return(true); }
public Package HandleIncoming(McpeMovePlayer packet, Player player) { if (_playerEntities.ContainsKey(player)) { var entity = _playerEntities[player]; entity.KnownPosition = player.KnownPosition; var message = McpeMoveEntity.CreateObject(); message.entityId = entity.EntityId; message.position = entity.KnownPosition; player.Level.RelayBroadcast(message); } return packet; // Process }