Пример #1
0
        private void GenerateParticles(Random random, Level level, PlayerLocation point, float yoffset, Vector3 multiplier, double d)
        {
            float vx = (float)random.NextDouble();

            vx *= random.Next(2) == 0 ? 1 : -1;
            vx *= (float)multiplier.X;

            float vy = (float)random.NextDouble();

            //vy *= random.Next(2) == 0 ? 1 : -1;
            vy *= (float)multiplier.Y;

            float vz = (float)random.NextDouble();

            vz *= random.Next(2) == 0 ? 1 : -1;
            vz *= (float)multiplier.Z;

            McpeLevelEvent mobParticles = McpeLevelEvent.CreateObject();

            mobParticles.eventId = (short)(0x4000 | GetParticle(random.Next(0, m < 1 ? 2 : 5)));
            mobParticles.x       = point.X + vx;
            mobParticles.y       = (point.Y - 2) + yoffset + vy;
            mobParticles.z       = point.Z + vz;
            level.RelayBroadcast(mobParticles);
        }
Пример #2
0
        public void curse(Player player)
        {
            McpeLevelEvent levelEvent = McpeLevelEvent.CreateObject();

            levelEvent.eventId = 2006;
            levelEvent.data    = 1;
            player.Level.RelayBroadcast(levelEvent);
        }
Пример #3
0
        public virtual void Spawn()
        {
            McpeLevelEvent particleEvent = McpeLevelEvent.CreateObject();

            particleEvent.eventId  = (short)(0x4000 | Id);
            particleEvent.position = Position;
            particleEvent.data     = Data;
            Level.RelayBroadcast(particleEvent);
        }
Пример #4
0
        public override void Spawn()
        {
            McpeLevelEvent particleEvent = McpeLevelEvent.CreateObject();

            particleEvent.eventId  = 2001;
            particleEvent.position = Position;
            particleEvent.data     = Data;
            Level.RelayBroadcast(particleEvent);
        }
Пример #5
0
        private void SendBlockBreakEnd(BlockCoordinates coordinates)
        {
            McpeLevelEvent levelEvent = McpeLevelEvent.CreateObject();

            levelEvent.position = coordinates;
            levelEvent.eventId  = 3601;    //Block stop cracking
            levelEvent.data     = 0;
            Level.RelayBroadcast(levelEvent);
        }
Пример #6
0
        public override void Spawn(Player[] players)
        {
            var particleEvent = McpeLevelEvent.CreateObject();

            particleEvent.eventId  = (short)(0x4000 | Id);
            particleEvent.position = Position;
            particleEvent.data     = Data;
            Level.RelayBroadcast(players, particleEvent);
        }
Пример #7
0
        public void ToggleDownfall(Player player)
        {
            ThreadPool.QueueUserWorkItem(delegate(object state)
            {
                for (int i = 0; i < short.MaxValue; i = i + 2000)
                {
                    var data = i;
                    {
                        McpeLevelEvent levelEvent = McpeLevelEvent.CreateObject();
                        levelEvent.eventId        = 3001;
                        levelEvent.data           = data;
                        player.SendPackage(levelEvent);
                    }
                    //{
                    //	McpeLevelEvent levelEvent = McpeLevelEvent.CreateObject();
                    //	levelEvent.eventId = 3002;
                    //	levelEvent.data = i;
                    //	player.SendPackage(levelEvent);
                    //}
                    player.SendMessage("Downfall " + data, type: MessageType.Raw);
                    Thread.Sleep(5000);
                }
                for (int i = short.MaxValue; i >= 0; i = i - 2000)
                {
                    {
                        McpeLevelEvent levelEvent = McpeLevelEvent.CreateObject();
                        levelEvent.eventId        = 3001;
                        levelEvent.data           = i;
                        player.SendPackage(levelEvent);
                    }
                    //{
                    //	McpeLevelEvent levelEvent = McpeLevelEvent.CreateObject();
                    //	levelEvent.eventId = 3002;
                    //	levelEvent.data = i;
                    //	player.SendPackage(levelEvent);
                    //}

                    player.SendMessage("Downfall " + i, type: MessageType.Raw);
                    Thread.Sleep(5000);
                }
            });

            //{
            //	McpeLevelEvent levelEvent = McpeLevelEvent.CreateObject();
            //	levelEvent.eventId = 3001;
            //	levelEvent.data = 100000;
            //	player.SendPackage(levelEvent);
            //}
            //{
            //	McpeLevelEvent levelEvent = McpeLevelEvent.CreateObject();
            //	levelEvent.eventId = 3002;
            //	levelEvent.data = 36625;
            //	player.SendPackage(levelEvent);
            //}
            player.SendMessage("Toggled downfall", type: MessageType.Raw);
        }
Пример #8
0
 public void ToggleDownfall(Player player, int value)
 {
     {
         McpeLevelEvent levelEvent = McpeLevelEvent.CreateObject();
         levelEvent.eventId = 3001;
         levelEvent.data    = value;
         player.SendPackage(levelEvent);
     }
     player.SendMessage("Downfall " + value, type: MessageType.Raw);
 }
Пример #9
0
        public virtual void Spawn(Level level)
        {
            McpeLevelEvent levelEvent = McpeLevelEvent.CreateObject();

            levelEvent.eventId  = Id;
            levelEvent.data     = Pitch;
            levelEvent.position = Position;

            level.RelayBroadcast(levelEvent);
        }
Пример #10
0
        public void LevelEvent(Player player, short value, int data)
        {
            McpeLevelEvent levelEvent = McpeLevelEvent.CreateObject();

            levelEvent.eventId  = value;
            levelEvent.data     = data;
            levelEvent.position = player.KnownPosition.ToVector3();
            player.Level.RelayBroadcast(levelEvent);

            player.Level.BroadcastMessage($"Sent level event {value}", type: MessageType.Raw);
        }
Пример #11
0
        public virtual void Spawn(Player[] players)
        {
            McpeLevelEvent particleEvent = McpeLevelEvent.CreateObject();

            particleEvent.eventId = (short)(0x4000 | Id);
            particleEvent.x       = (float)Position.X;
            particleEvent.y       = (float)Position.Y;
            particleEvent.z       = (float)Position.Z;
            particleEvent.data    = Data;
            Level.RelayBroadcast(players, particleEvent);
        }
Пример #12
0
        public override void Spawn()
        {
            McpeLevelEvent particleEvent = McpeLevelEvent.CreateObject();

            particleEvent.eventId = 2001;
            particleEvent.x       = (float)Position.X;
            particleEvent.y       = (float)Position.Y;
            particleEvent.z       = (float)Position.Z;
            particleEvent.data    = Data;
            Level.RelayBroadcast(particleEvent);
        }
Пример #13
0
        public virtual void Spawn(Level level)
        {
            McpeLevelEvent levelEvent = McpeLevelEvent.CreateObject();

            levelEvent.eventId = Id;
            levelEvent.data    = Pitch;
            levelEvent.x       = (float)Position.X;
            levelEvent.y       = (float)Position.Y;
            levelEvent.z       = (float)Position.Z;

            level.RelayBroadcast(levelEvent);
        }
Пример #14
0
        public virtual void SpawnToPlayers(Player[] players)
        {
            if (players == null)
            {
                return;
            }
            if (players.Length == 0)
            {
                return;
            }

            McpeLevelEvent levelEvent = McpeLevelEvent.CreateObject();

            levelEvent.eventId  = Id;
            levelEvent.data     = Pitch;
            levelEvent.position = Position;
            levelEvent.AddReferences(players.Length - 1);

            foreach (var player in players)
            {
                player.SendPacket(levelEvent);
            }
        }
Пример #15
0
        public override void TakeHit(Entity source, int damage = 1, DamageCause cause = DamageCause.Unknown)
        {
            if (!(source is Player))
            {
                return;
            }

            // Pets must die in void or they get stuck forever :-(
            if (cause == DamageCause.Void)
            {
                base.TakeHit(source, damage, cause);
                return;                 // Love denied!
            }

            int size = Entity.Level.Random.Next(0, 3);             // The size of the hearts

            Pet pet = Entity as Pet;

            if (pet != null)
            {
                if (pet.AttackTarget != null)
                {
                    return;
                }

                // He is still angry, better not pet him right now.
                if (!pet.IsInRage && IsOnFire && pet.Level.Random.Next(10) == 0)
                {
                    pet.AttackTarget = (Player)source;
                    pet.RageTick     = 20 * 3;
                    return;
                }

                // Only owner do petting with my pet!
                if (pet.Owner == source)
                {
                    // Don't trust animals!
                    if (pet.Level.Random.Next(500) == 0)
                    {
                        pet.AttackTarget = (Player)source;
                        pet.RageTick     = 20 * 2;
                        return;
                    }

                    var msg = McpeLevelEvent.CreateObject();
                    msg.eventId = 0x4000 | 15;
                    msg.x       = Entity.KnownPosition.X;
                    msg.y       = (float)(Entity.KnownPosition.Y + Entity.Height + 0.85d);
                    msg.z       = Entity.KnownPosition.Z;
                    msg.data    = size;
                    pet.Level.RelayBroadcast(msg);
                }
                else
                {
                    // HAHA Steal IT!
                    if (pet.Level.Random.Next(50) == 0)
                    {
                        pet.Owner        = (Player)source;
                        pet.AttackTarget = null;
                        pet.RageTick     = 0;
                        return;
                    }

                    // Don't trust animals!
                    if (pet.Level.Random.Next(30) == 0)
                    {
                        pet.AttackTarget = (Player)source;
                        pet.RageTick     = 20 * 3;
                        return;
                    }
                }
            }
        }
Пример #16
0
        public void DisplaySelection(bool force = false, int particleId = 10)
        {
            if (!force && !ShowSelection)
            {
                return;                                       // don't render at all
            }
            if (force && ShowSelection)
            {
                return;                                     // Will be rendered on regular tick instead
            }
            Level level = Player.Level;

            if (!Monitor.TryEnter(_sync))
            {
                return;
            }

            try
            {
                BoundingBox box = GetSelection();

                var numberOfParticles = box.Height * box.Width * 2 + box.Height * box.Depth * 2;

                bool isBig = numberOfParticles > 500;

                List <McpeLevelEvent> packets = new List <McpeLevelEvent>();

                {
                    //if ((Math.Abs(box.Width) > 0) || (Math.Abs(box.Height) > 0) || (Math.Abs(box.Depth) > 0))
                    {
                        var minX = Math.Min(box.Min.X, box.Max.X);
                        var maxX = Math.Max(box.Min.X, box.Max.X) + 1;

                        var minY = Math.Max(0, Math.Min(box.Min.Y, box.Max.Y));
                        var maxY = Math.Min(255, Math.Max(box.Min.Y, box.Max.Y)) + 1;

                        var minZ = Math.Min(box.Min.Z, box.Max.Z);
                        var maxZ = Math.Max(box.Min.Z, box.Max.Z) + 1;

                        // x/y
                        for (float x = minX; x <= maxX; x++)
                        {
                            for (float y = minY; y <= maxY; y++)
                            {
                                foreach (var z in new float[] { minZ, maxZ })
                                {
                                    if (isBig)
                                    {
                                        if (x != minX && x != maxX && y != minY && y != maxY)
                                        {
                                            continue;
                                        }
                                    }

                                    if (!level.IsAir(new BlockCoordinates((int)x, (int)y, (int)z)))
                                    {
                                        continue;
                                    }

                                    //var particle = new Particle(particleId, Player.Level) {Position = new Vector3(x, y, z) + new Vector3(0.5f, 0.5f, 0.5f)};
                                    //var particle = new Particle(particleId, Player.Level) { Position = new Vector3(x, y, z) };
                                    //particle.Spawn(new[] { Player });

                                    McpeLevelEvent particleEvent = McpeLevelEvent.CreateObject();
                                    particleEvent.eventId  = (short)(0x4000 | 10);
                                    particleEvent.position = new Vector3(x, y, z);
                                    particleEvent.data     = 0;
                                    packets.Add(particleEvent);
                                }
                            }
                        }

                        // x/z
                        //for (float x = minX; x <= maxX; x++)
                        //{
                        //	foreach (var y in new float[] {minY, maxY})
                        //	{
                        //		for (float z = minZ; z <= maxZ; z++)
                        //		{
                        //			if (!level.IsAir(new BlockCoordinates((int) x, (int) y, (int) z))) continue;

                        //			//var particle = new Particle(10, Player.Level) {Position = new Vector3(x, y, z) + new Vector3(0.5f, 0.5f, 0.5f)};
                        //			var particle = new Particle(10, Player.Level) {Position = new Vector3(x, y, z)};
                        //			particle.Spawn(new[] {Player});
                        //		}
                        //	}
                        //}

                        // z/y
                        foreach (var x in new float[] { minX, maxX })
                        {
                            for (float y = minY; y <= maxY; y++)
                            {
                                for (float z = minZ; z <= maxZ; z++)
                                {
                                    if (isBig)
                                    {
                                        if (z != minZ && z != maxZ && y != minY && y != maxY)
                                        {
                                            continue;
                                        }
                                    }

                                    if (!level.IsAir(new BlockCoordinates((int)x, (int)y, (int)z)))
                                    {
                                        continue;
                                    }

                                    //var particle = new Particle(10, Player.Level) {Position = new Vector3(x, y, z) + new Vector3(0.5f, 0.5f, 0.5f)};
                                    //var particle = new Particle(10, Player.Level) { Position = new Vector3(x, y, z) };
                                    //particle.Spawn(new[] { Player });

                                    McpeLevelEvent particleEvent = McpeLevelEvent.CreateObject();
                                    particleEvent.eventId  = (short)(0x4000 | 10);
                                    particleEvent.position = new Vector3(x, y, z);
                                    particleEvent.data     = 0;
                                    packets.Add(particleEvent);
                                }
                            }
                        }
                    }

                    if (packets.Count > 500)
                    {
                        if (force)
                        {
                            Log.Warn($"Selection size is {numberOfParticles}. Number of particles is {packets.Count} ");
                        }

                        return;                         // too many particles
                    }


                    if (packets.Count > 0)
                    {
                        var packet = BatchUtils.CreateBatchPacket(CompressionLevel.Optimal, packets.ToArray());
                        Player.SendPacket(packet);
                        //level.RelayBroadcast(new[] { Player }, packet);
                    }
                }
            }
            catch (Exception e)
            {
                Log.Error("Display selection", e);
            }
            finally
            {
                Monitor.Exit(_sync);
            }
        }
Пример #17
0
        /// <summary>
        ///		Handles player actions like Start & Stop break
        /// </summary>
        /// <param name="message"></param>
        public override void HandleMcpePlayerAction(McpePlayerAction message)
        {
            var action = (PlayerAction)message.actionId;

            lock (_breakSync)
            {
                if (GameMode == GameMode.Creative)
                {
                    return;
                }

                Block block;
                if (action == PlayerAction.StartBreak)
                {
                    block = Level.GetBlock(message.coordinates);
                    var inHand = Inventory.GetItemInHand();
                    var drops  = block.GetDrops(inHand);

                    float tooltypeFactor = drops == null || drops.Length == 0 ? 5f : 1.5f;                     // 1.5 if proper tool

                    var multiplier = 1f;
                    switch (inHand.ItemMaterial)
                    {
                    case ItemMaterial.None:
                        break;

                    case ItemMaterial.Wood:
                        multiplier = 2f;
                        break;

                    case ItemMaterial.Stone:
                        multiplier = 4f;
                        break;

                    case ItemMaterial.Gold:
                        multiplier = 12f;
                        break;

                    case ItemMaterial.Iron:
                        multiplier = 6f;
                        break;

                    case ItemMaterial.Diamond:
                        multiplier = 8f;
                        break;
                    }

                    foreach (var enchantment in inHand.GetEnchantings())
                    {
                        if (enchantment.Id == EnchantingType.Efficiency && enchantment.Level > 0)
                        {
                            multiplier += MathF.Sqrt(enchantment.Level) + 1;
                        }
                    }

                    if (Effects.TryGetValue(EffectType.Haste, out var effect))
                    {
                        if (effect is Haste haste && haste.Level > 0f)
                        {
                            multiplier *= 1f + (haste.Level * 0.2f);
                        }
                    }

                    var hardness = block.Hardness;

                    double breakTime = MathF.Ceiling((hardness * tooltypeFactor * 20f));

                    McpeLevelEvent message1 = McpeLevelEvent.CreateObject();
                    message1.eventId  = 3600;
                    message1.position = message.coordinates;
                    message1.data     = (int)((double)ushort.MaxValue / (breakTime / multiplier));

                    Level.RelayBroadcast(message1);

                    BlockFace face = (BlockFace)message.face;

                    IsBreakingBlock = true;
                    BlockBreakTimer.Restart();
                    BreakingBlockCoordinates = block.Coordinates;
                    BlockBreakTime           = breakTime / multiplier;
                    BreakingFace             = face;

                    //		Log.Info(
                    //			$"Start Breaking block. Hardness: {hardness} | ToolTypeFactor; {tooltypeFactor} | BreakTime: {breakTime} | Multiplier: {multiplier} | BLockBreakTime: {breakTime / multiplier} | IsBreaking: {IsBreakingBlock}");

                    var blockStartBreak = new BlockStartBreakEvent(this, block);
                    EventDispatcher.DispatchEventAsync(blockStartBreak).Then(result =>
                    {
                        if (result.IsCancelled)
                        {
                            SendBlockBreakEnd(block.Coordinates);
                            return;
                        }
                    });

                    return;
                }
                else if (action == PlayerAction.AbortBreak)
                {
                    var elapsed      = BlockBreakTimer.ElapsedMilliseconds;
                    var elapsedTicks = elapsed / 50d;

                    //	Log.Info($"!! Abort Break !!! Ticks elapsed: {elapsedTicks} | Required: {BlockBreakTime} | IsBreaking: {IsBreakingBlock}");

                    block = Level.GetBlock(message.coordinates);
                    if (IsBreakingBlock && BreakingBlockCoordinates == block.Coordinates)
                    {
                        IsBreakingBlock = false;
                        BlockBreakTimer.Reset();

                        EventDispatcher.DispatchEventAsync(new BlockAbortBreakEvent(this, block)).Then(result =>
                        {
                            if (!result.IsCancelled)
                            {
                                SendBlockBreakEnd(block.Coordinates);
                                return;
                            }
                        });
                    }

                    return;
                }
                else if (action == PlayerAction.StopBreak)
                {
                    var elapsed      = BlockBreakTimer.ElapsedMilliseconds;
                    var elapsedTicks = elapsed / 50d;

                    //Log.Info($"## !! Stop Break !!! Ticks elapsed: {elapsedTicks} | Required: {BlockBreakTime} | IsBreaking: {IsBreakingBlock}");

                    if (IsBreakingBlock)
                    {
                        //BlockFace face = (BlockFace) message.face;
                        if (elapsedTicks >= BlockBreakTime || Math.Abs(elapsedTicks - BlockBreakTime) < 2.5
                            )                     //Give a max time difference of 2.5 ticks.
                        {
                            StopBreak(BreakingBlockCoordinates);
                        }
                        else
                        {
                        }
                    }
                    else
                    {
                        IsBreakingBlock = false;
                        BlockBreakTimer.Reset();
                    }

                    return;
                }
            }

            base.HandleMcpePlayerAction(message);
        }