Example #1
0
 public void SendToAll(PacketFromServer packet)
 {
     foreach (var p in Players)
     {
         p.Send(packet);
     }
 }
Example #2
0
 public void QueueToAll(PacketFromServer p)
 {
     foreach (ConstructSession c in world.Players)
     {
         c.Player.Queue.Queue(p);
     }
 }
 public void Add(PacketFromServer m)
 {
     //Buffer to memory stream
     if (m.PacketBuffer == null)
         m.Prepare();
     Packet.WriteVarInt(w, m.PacketBuffer.Length);
     w.Write(m.PacketBuffer, 0, m.PacketBuffer.Length);
 }
Example #4
0
 protected void QueueToAllButMe(PacketFromServer p)
 {
     foreach (ConstructSession c in world.Players)
     {
         if (c == this)
             continue;
         c.Player.Queue.Queue(p);
     }
 }
 public void Add(PacketFromServer m)
 {
     //Buffer to memory stream
     if (m.PacketBuffer == null)
     {
         m.Prepare();
     }
     Packet.WriteVarInt(w, m.PacketBuffer.Length);
     w.Write(m.PacketBuffer, 0, m.PacketBuffer.Length);
 }
Example #6
0
        public void Queue(PacketFromServer p)
        {
            if (disposed)
                return;
            lock (packetQueue)
            {
                packetQueue.Add(p);

                packets += 1;
                if (maxPackets < packets)
                    maxPackets = packets;

                if (sendQueueActive == false)
                {
                    sendQueueActive = true;
                    ThreadPool.QueueUserWorkItem(SendAll);
                }
            }
        }
Example #7
0
 public static void FromServer(PacketFromServer packet, Client player)
 {
     #if DEBUG
     if (Show(packet))
         Console.WriteLine("S-> : " + packet);
     #endif
 }
Example #8
0
 public static void ToClient(Client c, PacketFromServer packet)
 {
     #if DEBUG
     if (Show(packet))
         Console.WriteLine(" ->C: " + packet.PacketBuffer.Length + ", " + packet);
     //System.Threading.Thread.Sleep(500);
     #endif
 }
Example #9
0
 protected override void SendToClientInternal(PacketFromServer packet)
 {
     var chat = packet as ChatMessageServer;
     if (chat != null)
     {
         if(chat.Json.Text != null)
             writer.WriteLine(ColorCode(chat.Json.Text));
         else
             writer.WriteLine(chat.ToString()); //TODO: to the transaltion
         writer.Flush();
         return;
     }
     var disc = packet as Disconnect;
     if (disc != null)
     {
         writer.WriteLine(ColorCode(disc.Reason.Text));
         writer.Flush();
         return;
     }
 }
Example #10
0
 protected virtual void SendToClientInternal(PacketFromServer packet)
 {
     throw new NotImplementedException();
 }
Example #11
0
        public void SendToClient(PacketFromServer packet)
        {
            if (Phase == Phases.FinalClose)
                return;

#if DEBUG
            /*if (packet is PlayerPositionLook)
                Thread.Sleep(50);
            Thread.Sleep(30);*/
#endif

            //Thread.Sleep(100);
            //Debug.WriteLine(packet);

            //Send possessed packets
            SendToPossessors(packet);

            //Ping update
            KeepAlivePing ka = packet as KeepAlivePing;
            if (ka != null)
            {
                lock (pings)
                {
                    if (pings.ContainsKey(ka.KeepAliveID))
                        pings.Remove(ka.KeepAliveID);
                    if (pings.Count > 5)
                        pings.Clear();
                    
                    pings.Add(ka.KeepAliveID, DateTime.Now);
                }
            }

            SendToClientInternal(packet);
        }
Example #12
0
        private void SendToPossessors(PacketFromServer p)
        {
            var pby = PossessedBy;
            if (pby.Length == 0)
                return;

            VanillaSession real = Session as VanillaSession;

            switch (p.PacketID)
            {
                case PlayerAbilities.ID:
                case ChatMessageServer.ID:
                    return;

                case ChangeGameState.ID:
                    var ns = (ChangeGameState)p;
                    if (ns.Reason == GameState.ChangeGameMode)
                        return;
                    break;

                case CollectItem.ID:
                    {
                        var ci = (CollectItem)p;
                        if (ci.EID == EntityID && real != null)
                            ci.EID = real.EID;
                        break;
                    }

                
                case Animation.ID:
                    {
                        Animation pl = (Animation)p;
                        var et = new Animation(this.EntityID, pl.Animate);
                        p = et;
                        break;
                    }
                case Disconnect.ID:
                    {
                        //Kick all possessers
                        foreach (WorldSession s in pby)
                            s.Player.SetWorld(World.Construct);
                        return;
                    }
                case PlayerListItem.ID:
                    return;
            }

            foreach (WorldSession s in pby)
                s.Player.Queue.Queue((PacketFromServer)p);
        }
Example #13
0
        /// <summary>
        /// What the Server sends to the client
        /// </summary>
        protected virtual void FromServerGaming(PacketFromServer packet)
        {
            try
            {
                byte pid = packet.PacketID;

                if (pid == PassThrough.ID)
                {
                    Player.SendToClient(packet);
                    return;
                }

                //Before we rewrite the eid
                //Record all presented mobs, so far we have no method of cleaning this up so hold your thumbs
                if (pid == SpawnMob.ID)
                    World.Main.UpdateEntity((SpawnMob)packet);              
                if (pid == EntityMetadata.ID)
                    World.Main.UpdateEntity((EntityMetadata)packet);
                //if (pid == SpawnPlayer.ID)
                //World.Main.UpdateEntity((SpawnPlayer)packet);
                if (pid == SpawnObject.ID)
                    World.Main.UpdateEntity((SpawnObject)packet);
                if (pid == SpawnPainting.ID)
                    World.Main.UpdateEntity((SpawnPainting)packet);

                //Rewrite own EID, Fix eid to client eid player
                if (packet is IEntity)
                {
                    IEntity ie = (IEntity)packet;
                    if (ie.EID == EID)
                    {
                        ie.EID = Player.EntityID;
                        packet.SetPacketBuffer(null);
                    }
                }
                if (pid == SpawnObject.ID)
                {
                    var so = (SpawnObject)packet;
                    if (so.SourceEntity == EID)
                    {
                        so.SourceEntity = Player.EntityID;
                        packet.SetPacketBuffer(null);
                    }
                }

                //Region filters
                if (CurrentRegion != null && CurrentRegion.FilterServer(this, packet))
                    return;
                
                //Cloak and Nick
                if (Cloak.Filter(this, packet))
                    return;

                switch (pid)
                {
                    case SpawnPlayer.ID:
                        //Change reported uuid from offline to the known with names
                        var sp = (SpawnPlayer)packet;
                        var p = PlayerList.GetPlayerBySpawn(sp);
                        if (p != null)
                        {
                            Debug.WriteLine("SpawnPlayer changed from " + sp.PlayerUUID);
                            Debug.WriteLine("SpawnPlayer changed to   " + p.UUID);
                            sp.PlayerUUID = p.UUID;
                            sp.SetPacketBuffer(null);

                            //Naive attempt
                            sp = new SpawnPlayer(sp.EID, p);
                            sp.Position = sp.Position;
                            sp.Pitch = sp.Pitch;
                            sp.Yaw = sp.Yaw;
                        }
                        else
                            Debug.WriteLine("SpawnPlayer not changed: " + sp.PlayerUUID);

                        break;

                    case ChangeGameState.ID:
                        ChangeGameState ns = packet as ChangeGameState;
                        if (ns.Reason == GameState.BeginRaining || ns.Reason == GameState.EndRaining)
                            World.Main.Weather = ns;
                        if (ns.Reason == GameState.ChangeGameMode)
                            Mode = (GameMode)ns.Value;
                        break;

                    case SpawnObject.ID:
                        var so = (SpawnObject)packet;
                        if (so.Type != Vehicles.Item)
                            break;
                        OreTracker.Spawn(so, Position);
                        break;
                    case EntityMetadata.ID:
                        OreTracker.Track((EntityMetadata)packet);
                        break;

                    case EntityEffect.ID:
                        EntityEffect ee = (EntityEffect)packet;
                        if (ee.Effect == PlayerEffects.MoveSpeed)
                        {
                            EffectSpeed.Active = true;
                            EffectSpeed.Amplifier = ee.Amplifier;
                        }
                        if (ee.Effect == PlayerEffects.MoveSlowdown)
                        {
                            EffectSlow.Active = true;
                            EffectSlow.Amplifier = ee.Amplifier;
                        }
                        break;

                    case RemoveEntityEffect.ID:
                        RemoveEntityEffect re = (RemoveEntityEffect)packet;
                        if (re.Effect == PlayerEffects.MoveSpeed)
                            EffectSpeed.Active = false;
                        if (re.Effect == PlayerEffects.MoveSlowdown)
                            EffectSlow.Active = false;
                        break;
                
                    case TimeUpdate.ID:
                        World.Main.Time = packet as TimeUpdate;
                        break;

                    case UseBed.ID:
                        UseBed ub = (UseBed)packet;
                        if (ub.EID == Player.EntityID)
                            Sleeping = true;
                        break;

                //Waking up, among other things
                    case Animation.ID:
                        Animation a = (Animation)packet;
                        if (a.EID == Player.EntityID)
                        {
                            if (a.Animate == Animations.LeaveBed)
                                Sleeping = false;
                        }
                        break;
                                
#region Position and speed
                
                //Regions and player position
                    case PlayerPositionLookServer.ID:
                        var pp = (PlayerPositionLookServer)packet;
                        if (pp.Position.Y % 1 > 0.95)
                        {
                            //Console.WriteLine(pp.Position.ToString("0.00") + " " + pp.HeadY);
                            pp.Position.Y = Math.Ceiling(Position.Y);
                            //pp.HeadPosition = Position.Y + 1.62;
                            //Console.WriteLine(pp.Position.ToString("0.00") + " " + pp.Stance);
                            packet.SetPacketBuffer(null);
                        }
                        SetPosition(pp.Position, false);
                        break;

                    case Respawn.ID:
                        Dimension = ((Respawn)packet).Dimension;
                        SetPosition(Position, false);
                        break;                

                //Boats and carts
                    case AttachEntity.ID:
                        AttachEntity ae = (AttachEntity)packet;
                        if (ae.EID == Player.EntityID)
                        {
                            AttachedEntity = ae.VehicleID;
                        }
                        break;
                
                    case UpdateBlockEntity.ID:
                        if (Player.Admin())
                        {
                            var ute = (UpdateBlockEntity)packet;
                            if (ute.Action == UpdateBlockEntity.Actions.MobSpawner)
                            {
                                if (Spawners.Contains(ute.Pos) == false)
                                    Spawners.Add(ute.Pos);
                            }
                        }
                        break;

                    case EntityTeleport.ID:
                        if (AttachedEntity != 0)
                        {
                            EntityTeleport et = (EntityTeleport)packet;
                            if (et.EID == AttachedEntity)
                            {
                                SetPosition(et.Position, false);
                            }
                        }
                        break;

                    case EntityRelativeMove.ID:
                        if (AttachedEntity != 0)
                        {
                            EntityRelativeMove er = (EntityRelativeMove)packet;
                            if (er.EID == AttachedEntity)
                            {
                                SetPosition(Position + er.Delta, false);
                            }
                        }
                        break;                
#endregion

                    case ChatMessageServer.ID:
                        if (ServerParser.ParseServer(this.Player, (ChatMessageServer)packet))
                            return;
                        break;
                
                //Inventory
                    case WindowItems.ID:
                        var wi = (WindowItems)packet;
                        for (int n = 0; n < wi.Items.Length; n++)
                        {
                            if (wi.Items[n] == null)
                                continue;
                            if (wi.Items[n].Count > 64)
                            {
                                wi.Items[n] = null;
                                packet.SetPacketBuffer(null);
                            }
                        }
                        break;

                    case SetSlot.ID:
                        //Debug.WriteLine(packet);
                        SetSlot ss = (SetSlot)packet;

                        if (0 <= ss.Slot && ss.Slot < Inventory.Length)
                            Inventory[ss.Slot] = ss.Item;
                        break;

                //Tab player list items: Block Player, managed in PlayerList thread
                    case PlayerListItem.ID:
                        return;

                    case HeldItemServer.ID:
                //Active item
                        var hc = (HeldItemServer)packet;
                        if (hc.SlotID >= 0 && hc.SlotID <= 8)
                            ActiveInventoryIndex = hc.SlotID;
                        else
                            Log.Write(
                                new InvalidOperationException("Invalid holding slot id: " + hc.SlotID),
                                this.Player
                            );
                        break;

                //Keep a record of what window is open
                    case WindowOpen.ID:
                        WorldRegion r = LastClickRegion ?? CurrentRegion;
                        var wo = (WindowOpen)packet;
                        if (OpenWindows.ContainsKey(wo.WindowID))
                            OpenWindows.Remove(wo.WindowID);
                        OpenWindows.Add(wo.WindowID, new OpenWindowRegion(wo, r));

                        if (r == null || (Player.Admin() == false) && (Mode == GameMode.Creative))
                        {
                            //Leave unmodified
                        }
                        else
                        {
                            if (r.Type == Protected.Type &&
                                r.IsResident(Player) == false &&
                                wo.InventoryType != "CraftingTable" &&
                                wo.InventoryType != "Enchant" &&
                                wo.WindowTitle != "container.enderchest")
                            {
                                var cj = new ChatJson();
                                cj.Text = "Locked: " + r.Name;
                                wo.WindowTitle = cj.Serialize();
                                wo.SetPacketBuffer(null);
                            }
                        }
                        break;
                    
                //Turn off pvp when you die
                    case UpdateHealth.ID:
                        UpdateHealth uh = (UpdateHealth)packet;
                        if (Player.PvP && uh.Health <= 0)
                        {
                            Player.PvP = false;
                            Player.TellSystem(Chat.Purple, "PvP off");
                        }
                        break;
                
                
                    case WindowCloseServer.ID:
                        WindowClose((WindowCloseServer)packet);
                        break;

                //Disconnect while running the game
                //For disconnect at login see the handshake part
                    case Disconnect.ID:
                        Disconnect d = (Disconnect)packet;
                        if (d.Reason.Text == "Flying is not enabled on this server")
                        {
                            #if !DEBUG
                            Player.BanByServer(DateTime.Now.AddMinutes(2), d.Reason.Text);
                            #else
                            Chatting.Parser.Say(Chat.Yellow + Player.Name + Chat.Blue, " was kicked for flying");
                            #endif
                            return;
                        }
                        if (d.Reason.Text == "Internal server error")
                        {
                            Log.WritePlayer(
                                this.Player,
                                "Backend: Internal error - Restarting connection"
                            );
                            Player.SetWorld(World.Main);
                            return;
                        }
                        Player.SetWorld(World.Construct);
                        return;
                }
                //////////////Sending packet
                Player.SendToClient(packet);
                //////////////
                
#if !DEBUG
            } catch (Exception e)
            {
                thread.State = "ServerGamingException: " + e.Message;
                    
                Log.Write(e, this.Player);
                Player.Queue.Queue(packet);
#endif
            }
            finally
            {
            }
        }
Example #14
0
 public static void QueueToAll(PacketFromServer packet)
 {
     foreach (Client p in PlayerList.List)
     {
         p.Queue.Queue(packet);
     }
 }
Example #15
0
 public void Send(PacketFromServer p)
 {
     Player.Queue.Queue(p);
 }
Example #16
0
 public void SendToAllBut(PacketFromServer packet, WorldSession player)
 {
     foreach (var p in Players)
     {
         if (p == player)
             continue;
         p.Send(packet);
     }
 }
Example #17
0
        protected override void SendToClientInternal(PacketFromServer packet)
        {
            try
            {
                if (packet.PacketBuffer == null)
                    packet.Prepare();

                Debug.ToClient(this, packet);

                if (packet is PrecompiledPacket)
                {
                    lock (clientStream)
                        clientStream.Write(packet.PacketBuffer, 0, packet.PacketBuffer.Length);
                    return;
                }

                lock (clientStream)
                {
                    if(maxUncompressed >= 0)
                    {
                        Packet.WriteVarInt(clientStream, packet.PacketBuffer.Length + Packet.VarIntSize(packet.PacketBufferUncompressedSize)); //Uncompressed size length
                        Packet.WriteVarInt(clientStream, packet.PacketBufferUncompressedSize); //Uncompressed size if compressed
                    }
                    else
                        Packet.WriteVarInt(clientStream, packet.PacketBuffer.Length);

                    clientStream.Write(packet.PacketBuffer, 0, packet.PacketBuffer.Length);
                    #if DEBUG
                    clientStream.Flush();
                    #endif
                }
            }
            catch (SocketException se)
            {
                Phase = Phases.FinalClose;
                Close(se.Message);
            }
            catch (IOException ioe)
            {
                Phase = Phases.FinalClose;
                Close(ioe.Message);
            }
            catch (ObjectDisposedException)
            {
                Phase = Phases.FinalClose;
            }
        }