/// <summary> /// For debugging of flight-path and rotation. /// </summary> private void BroadcastMoveAndMotion() { if (new Random().Next(5) == 0) { McpeSetEntityMotion motions = McpeSetEntityMotion.CreateObject(); motions.runtimeEntityId = EntityId; motions.velocity = Velocity; //new Task(() => Level.RelayBroadcast(motions)).Start(); Level.RelayBroadcast(motions); } McpeMoveEntity moveEntity = McpeMoveEntity.CreateObject(); moveEntity.runtimeEntityId = EntityId; moveEntity.position = KnownPosition; Level.RelayBroadcast(moveEntity); if (Shooter != null && IsCritical) { var p = Shooter as Player; if (p != null) { var particle = new CriticalParticle(Level); particle.Position = KnownPosition.ToVector3(); particle.Spawn(new[] { p }); } } }
/// <summary> /// For debugging of flight-path and rotation. /// </summary> private void BroadcastMoveAndMotion() { if (new Random().Next(5) == 0) { McpeSetEntityMotion motions = McpeSetEntityMotion.CreateObject(); motions.runtimeEntityId = EntityId; motions.velocity = Velocity; Level.RelayBroadcast(motions); } if (LastSentPosition != null) { McpeMoveEntityDelta move = McpeMoveEntityDelta.CreateObject(); move.runtimeEntityId = EntityId; move.prevSentPosition = LastSentPosition; move.currentPosition = (PlayerLocation)KnownPosition.Clone(); move.isOnGround = IsWalker && IsOnGround; if (move.SetFlags()) { Level.RelayBroadcast(move); } } LastSentPosition = (PlayerLocation)KnownPosition.Clone(); // Used for delta if (Shooter != null && IsCritical) { var particle = new CriticalParticle(Level); particle.Position = KnownPosition.ToVector3(); particle.Spawn(new[] { Shooter }); } }
public override void Knockback(Vector3 velocity) { McpeSetEntityMotion motions = McpeSetEntityMotion.CreateObject(); motions.entities = new EntityMotions { { EntityId, velocity } }; Level.RelayBroadcast(motions); }
public void BroadcastMotion(bool forceMove = false) { if (NoAi || forceMove) { McpeSetEntityMotion motions = McpeSetEntityMotion.CreateObject(); motions.runtimeEntityId = EntityId; motions.velocity = Velocity; motions.Encode(); Level.RelayBroadcast(motions); } }
/// <summary> /// For debugging of flight-path and rotation. /// </summary> private void BroadcastMoveAndMotion() { McpeSetEntityMotion motions = McpeSetEntityMotion.CreateObject(); motions.entityId = EntityId; motions.velocity = Velocity; new Task(() => Level.RelayBroadcast(motions)).Start(); McpeMoveEntity moveEntity = McpeMoveEntity.CreateObject(); moveEntity.entityId = EntityId; moveEntity.position = KnownPosition; new Task(() => Level.RelayBroadcast(moveEntity)).Start(); }
/// <summary> /// For debugging of flight-path and rotation. /// </summary> private void BroadcastMoveAndMotion() { McpeSetEntityMotion motions = McpeSetEntityMotion.CreateObject(); motions.entities = new EntityMotions { { EntityId, Velocity } }; new Task(() => Level.RelayBroadcast(motions)).Start(); McpeMoveEntity moveEntity = McpeMoveEntity.CreateObject(); moveEntity.entities = new EntityLocations { { EntityId, KnownPosition } }; new Task(() => Level.RelayBroadcast(moveEntity)).Start(); }
public override void UseItem(Level world, Player player, BlockCoordinates blockCoordinates) { Log.Warn("Use item stick"); if (player.IsGliding) { var currentSpeed = player.CurrentSpeed / 20f; if (currentSpeed > 25f / 20f) { //player.SendMessage($"Speed already over max {player.CurrentSpeed:F2}m/s", MessageType.Raw); return; } Vector3 velocity = Vector3.Normalize(player.KnownPosition.GetHeadDirection()) * (float)currentSpeed; float factor = (float)(1 + 1 / (1 + currentSpeed * 2)); velocity *= factor; if (currentSpeed < 7f / 20f) { velocity = Vector3.Normalize(velocity) * 1.2f; } McpeSetEntityMotion motions = McpeSetEntityMotion.CreateObject(); motions.runtimeEntityId = EntityManager.EntityIdSelf; motions.velocity = velocity; player.SendPacket(motions); } else if (player.Inventory.Chest is ItemElytra) { var motions = McpeSetEntityMotion.CreateObject(); motions.runtimeEntityId = EntityManager.EntityIdSelf; var velocity = new Vector3(0, 2, 0); motions.velocity = velocity; player.SendPacket(motions); SendWithDelay(200, () => { player.IsGliding = true; player.Height = 0.6; player.BroadcastSetEntityData(); }); } }
public override void OnTick() { base.OnTick(); if (Velocity.Distance > 0) { PlayerLocation oldPosition = (PlayerLocation)KnownPosition.Clone(); var onGroundBefore = IsOnGround(KnownPosition); KnownPosition.X += (float)Velocity.X; KnownPosition.Y += (float)Velocity.Y; KnownPosition.Z += (float)Velocity.Z; var onGround = IsOnGround(KnownPosition); if (!onGroundBefore && onGround) { KnownPosition.Y = (float)Math.Floor(oldPosition.Y); Velocity = Vector3.Zero; } else { Velocity *= (1.0 - Drag); Velocity -= new Vector3(0, Gravity, 0); } } McpeMoveEntity moveEntity = McpeMoveEntity.CreateObject(); moveEntity.entities = new EntityLocations { { EntityId, KnownPosition } }; Level.RelayBroadcast(moveEntity); McpeSetEntityMotion motions = McpeSetEntityMotion.CreateObject(); motions.entities = new EntityMotions { { EntityId, Velocity } }; Level.RelayBroadcast(motions); }
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; } }
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(); } }