Beispiel #1
0
        private void OnEntityUse(int player, ServerEntityId id)
        {
            ServerEntity e = m.EntityGet(id);

            if (e.sign == null)
            {
                return;
            }

            // TODO: Check permissions

            Dialog d = new Dialog();

            d.Width   = 400;
            d.Height  = 200;
            d.IsModal = true;
            d.Widgets = new Widget[4];
            int widgetCount = 0;
            var font        = new DialogFont("Verdana", 11f, DialogFontStyle.Bold);

            d.Widgets[widgetCount++] = Widget.MakeSolid(0, 0, 300, 200, Color.FromArgb(255, 50, 50, 50).ToArgb());
            d.Widgets[widgetCount++] = Widget.MakeTextBox(e.sign.text, font, 50, 50, 200, 50, Color.FromArgb(255, 0, 0, 0).ToArgb());
            Widget okHandler = Widget.MakeSolid(100, 100, 100, 50, Color.FromArgb(255, 100, 100, 100).ToArgb());

            okHandler.ClickKey       = (char)13;
            okHandler.Id             = "UseSign_OK";
            d.Widgets[widgetCount++] = okHandler;
            d.Widgets[widgetCount++] = Widget.MakeText("OK", font, 100, 100, Color.FromArgb(255, 0, 0, 0).ToArgb());
            editingSign[player]      = id;
            m.SendDialog(player, "UseSign", d);
        }
Beispiel #2
0
 void OnUseEntity(int player, int chunkx, int chunky, int chunkz, int id)
 {
     ServerEntity e = server.GetEntity(chunkx, chunky, chunkz, id);
     if (e.sign == null)
     {
         return;
     }
     if (!server.CheckBuildPrivileges(player, (int)e.position.x, (int)e.position.z, (int)e.position.y))
     {
         return;
     }
     ManicDigger.Dialog d = new ManicDigger.Dialog();
     d.Width = 400;
     d.Height = 200;
     d.IsModal = true;
     d.Widgets = new ManicDigger.Widget[4];
     int widgetCount = 0;
     var font = new DialogFont("Verdana", 11f, DialogFontStyle.Bold);
     d.Widgets[widgetCount++] = Widget.MakeSolid(0, 0, 300, 200, Game.ColorFromArgb(255, 50, 50, 50));
     d.Widgets[widgetCount++] = Widget.MakeTextBox(e.sign.text, font, 50, 50, 200, 50, Game.ColorFromArgb(255, 0, 0, 0));
     Widget okHandler = Widget.MakeSolid(100, 100, 100, 50, Game.ColorFromArgb(255, 100, 100, 100));
     okHandler.ClickKey = (char)13;
     okHandler.Id = "UseSign_OK";
     d.Widgets[widgetCount++] = okHandler;
     d.Widgets[widgetCount++] = Widget.MakeText("OK", font, 100, 100, Game.ColorFromArgb(255, 0, 0, 0));
     ServerEntityId id_ = new ServerEntityId();
     id_.chunkx = chunkx;
     id_.chunky = chunky;
     id_.chunkz = chunkz;
     id_.id = id;
     server.clients[player].editingSign = id_;
     server.SendDialog(player, "UseSign", d);
 }
Beispiel #3
0
        private void OnEntityUpdate(ServerEntityId id)
        {
            ServerEntity e = m.EntityGet(id);

            if (e.sign == null)
            {
                return;
            }
            if (e.drawModel == null)
            {
                e.drawModel = new ServerEntityAnimatedModel();
            }
            e.drawModel.model       = "signmodel.txt";
            e.drawModel.texture     = "signmodel.png";
            e.drawModel.modelHeight = 1.3f;

            if (e.drawText == null)
            {
                e.drawText = new ServerEntityDrawText();
            }
            e.drawText.text = e.sign.text;
            e.drawText.dx   = 0.1f;
            e.drawText.dy   = 1.1f;
            e.drawText.dz   = 0.1f;
            e.usable        = true;
            if (e.drawName == null)
            {
                e.drawName                  = new ServerEntityDrawName();
                e.drawName.name             = "Sign";
                e.drawName.onlyWhenSelected = true;
            }
        }
Beispiel #4
0
 public ServerEntity EntityGet(ServerEntityId id)
 {
     if (id == null)
     {
         throw new ArgumentNullException("id", "The entity ID must not be null!");
     }
     return(server.GetEntity(id));
 }
Beispiel #5
0
 public void EntitySetDirty(ServerEntityId id)
 {
     if (id == null)
     {
         throw new ArgumentNullException("id", "The entity ID must not be null!");
     }
     server.SetEntityDirty(id);
 }
Beispiel #6
0
 public void EntityDelete(ServerEntityId id)
 {
     if (id == null)
     {
         throw new ArgumentNullException("id", "The entity ID must not be null!");
     }
     server.DespawnEntity(id);
 }
Beispiel #7
0
    void OnDialogClick(DialogClickArgs args)
    {
        string             name = null;
        PermissionSignType type = PermissionSignType.Player;

        if (args.GetWidgetId() == "UsePermissionSign_OK")
        {
            name = args.GetTextBoxValue()[1];
            type = PermissionSignType.Player;

            for (int i = 0; i < server.serverClient.Groups.Count; i++)
            {
                Group g = server.serverClient.Groups[i];
                if (name == g.Name)
                {
                    type = PermissionSignType.Group;
                }
            }
        }
        else if (args.GetWidgetId().StartsWith("PermissionSignGroup"))
        {
            for (int i = 0; i < server.serverClient.Groups.Count; i++)
            {
                Group g = server.serverClient.Groups[i];
                if (args.GetWidgetId() == "PermissionSignGroup" + g.Name)
                {
                    name = g.Name;
                    type = PermissionSignType.Group;
                }
            }
        }
        else
        {
            //Return when dialog is not a sign
            return;
        }

        ClientOnServer c  = server.clients[args.GetPlayer()];
        ServerEntityId id = c.editingSign;

        if (name != "")
        {
            c.editingSign = null;
            ServerEntity e = server.GetEntity(id.chunkx, id.chunky, id.chunkz, id.id);
            e.permissionSign.name = name;
            e.permissionSign.type = type;
            server.SetEntityDirty(id);
        }
        else
        {
            server.DespawnEntity(id);
        }
        server.SendDialog(args.GetPlayer(), "UseSign", null);
    }
Beispiel #8
0
 int IndexOfNull(ServerEntityId[] list, int listCount)
 {
     for (int i = 0; i < listCount; i++)
     {
         ServerEntityId s = list[i];
         if (s == null)
         {
             return(i);
         }
     }
     return(-1);
 }
Beispiel #9
0
 public override void Update(Server server_, float dt)
 {
     server = server_;
     if (!started)
     {
         started = true;
         server_.modManager.RegisterOnBlockUseWithTool(OnUseWithTool);
         server_.modEventHandlers.onentityupdate.Add(UpdateEntity);
         server_.modEventHandlers.onentityuse.Add(OnUseEntity);
         server.modEventHandlers.ondialogclick2.Add(OnDialogClick);
         server.modEventHandlers.onpermission.Add(OnPermission);
         editingSign = new ServerEntityId[server.modManager.GetMaxPlayers()];
     }
 }
Beispiel #10
0
    void OnUseEntity(int player, int chunkx, int chunky, int chunkz, int id)
    {
        ServerEntity e = server.GetEntity(chunkx, chunky, chunkz, id);

        if (e.permissionSign == null)
        {
            return;
        }
        if (!server.PlayerHasPrivilege(player, ServerClientMisc.Privilege.area_add))
        {
            server.SendMessage(player, server.colorError + server.language.Get("Server_CommandInsufficientPrivileges"));
            return;
        }
        ManicDigger.Dialog d = new ManicDigger.Dialog();
        d.Width   = 400;
        d.Height  = 400;
        d.IsModal = true;
        d.Widgets = new ManicDigger.Widget[4 + server.serverClient.Groups.Count * 2];
        int widgetCount = 0;
        var font        = new DialogFont("Verdana", 11f, DialogFontStyle.Bold);

        d.Widgets[widgetCount++] = Widget.MakeSolid(0, 0, 400, 400, Game.ColorFromArgb(255, 50, 50, 50));
        d.Widgets[widgetCount++] = Widget.MakeTextBox(e.permissionSign.name, font, 50, 50, 200, 50, Game.ColorFromArgb(255, 0, 0, 0));
        for (int i = 0; i < server.serverClient.Groups.Count; i++)
        {
            Group  g      = server.serverClient.Groups[i];
            Widget button = Widget.MakeSolid(50, 150 + i * 50, 100, 40, Game.ColorFromArgb(255, 100, 100, 100));
            button.ClickKey          = (char)13;
            button.Id                = "PermissionSignGroup" + g.Name;
            d.Widgets[widgetCount++] = button;
            d.Widgets[widgetCount++] = Widget.MakeText(g.Name, font, 50, 150 + i * 50, Game.ColorFromArgb(255, 0, 0, 0));
        }
        Widget okHandler = Widget.MakeSolid(200, 50, 100, 50, Game.ColorFromArgb(255, 100, 100, 100));

        okHandler.ClickKey       = (char)13;
        okHandler.Id             = "UsePermissionSign_OK";
        d.Widgets[widgetCount++] = okHandler;
        d.Widgets[widgetCount++] = Widget.MakeText("Set player", font, 200, 50, Game.ColorFromArgb(255, 0, 0, 0));
        ServerEntityId id_ = new ServerEntityId();

        id_.chunkx = chunkx;
        id_.chunky = chunky;
        id_.chunkz = chunkz;
        id_.id     = id;
        server.clients[player].editingSign = id_;
        server.SendDialog(player, "UseSign", d);
    }
Beispiel #11
0
 bool Contains(ServerEntityId[] list, int listCount, ServerEntityId value)
 {
     for (int i = 0; i < listCount; i++)
     {
         ServerEntityId s = list[i];
         if (s == null)
         {
             continue;
         }
         if (s.chunkx == value.chunkx &&
             s.chunky == value.chunky &&
             s.chunkz == value.chunkz &&
             s.id == value.id)
         {
             return(true);
         }
     }
     return(false);
 }
 bool Contains(ServerEntityId[] list, int listCount, ServerEntityId value)
 {
     for (int i = 0; i < listCount; i++)
     {
         ServerEntityId s = list[i];
         if (s == null)
         {
             continue;
         }
         if (s.chunkx == value.chunkx
             && s.chunky == value.chunky
             && s.chunkz == value.chunkz
             && s.id == value.id)
         {
             return true;
         }
     }
     return false;
 }
Beispiel #13
0
        public void Start(ModManager m)
        {
            this.m      = m;
            editingSign = new ServerEntityId[m.GetMaxPlayers()];

            m.SetBlockType(75, "EntitySign", new BlockType()
            {
                AllTextures  = "VandalFinder",
                DrawType     = DrawType.Solid,
                WalkableType = WalkableType.Solid,
                IsUsable     = true,
                IsTool       = true,
            });
            m.AddToCreativeInventory("EntitySign");

            m.RegisterOnBlockUseWithTool(OnUseWithTool);
            m.RegisterOnEntityUse(OnEntityUse);
            m.RegisterOnEntityUpdate(OnEntityUpdate);
            m.RegisterOnDialogClick2(OnDialogClick);
        }
Beispiel #14
0
        private void OnDialogClick(DialogClickArgs args)
        {
            if (args.GetWidgetId() != "UseSign_OK")
            {
                //Return when dialog is not a sign
                return;
            }
            string         newText = args.GetTextBoxValue()[1];
            ServerEntityId id      = editingSign[args.GetPlayer()];

            if (newText != "")
            {
                editingSign[args.GetPlayer()] = null;
                ServerEntity e = m.EntityGet(id);
                e.sign.text = newText;
                m.EntitySetDirty(id);
            }
            else
            {
                m.EntityDelete(id);
            }
            m.SendDialog(args.GetPlayer(), "UseSign", null);
        }
Beispiel #15
0
    void OnUseEntity(int player, int chunkx, int chunky, int chunkz, int id)
    {
        ServerEntity e = server.GetEntity(chunkx, chunky, chunkz, id);

        if (e.sign == null)
        {
            return;
        }
        if (!server.CheckBuildPrivileges(player, (int)e.position.x, (int)e.position.z, (int)e.position.y))
        {
            return;
        }
        ManicDigger.Dialog d = new ManicDigger.Dialog();
        d.Width   = 400;
        d.Height  = 200;
        d.IsModal = true;
        d.Widgets = new ManicDigger.Widget[4];
        int widgetCount = 0;
        var font        = new DialogFont("Verdana", 11f, DialogFontStyle.Bold);

        d.Widgets[widgetCount++] = Widget.MakeSolid(0, 0, 300, 200, Game.ColorFromArgb(255, 50, 50, 50));
        d.Widgets[widgetCount++] = Widget.MakeTextBox(e.sign.text, font, 50, 50, 200, 50, Game.ColorFromArgb(255, 0, 0, 0));
        Widget okHandler = Widget.MakeSolid(100, 100, 100, 50, Game.ColorFromArgb(255, 100, 100, 100));

        okHandler.ClickKey       = (char)13;
        okHandler.Id             = "UseSign_OK";
        d.Widgets[widgetCount++] = okHandler;
        d.Widgets[widgetCount++] = Widget.MakeText("OK", font, 100, 100, Game.ColorFromArgb(255, 0, 0, 0));
        ServerEntityId id_ = new ServerEntityId();

        id_.chunkx = chunkx;
        id_.chunky = chunky;
        id_.chunkz = chunkz;
        id_.id     = id;
        server.clients[player].editingSign = id_;
        server.SendDialog(player, "UseSign", d);
    }
Beispiel #16
0
        public ClientOnServer()
        {
            float one = 1;

            entity          = new ServerEntity();
            entity.drawName = new ServerEntityDrawName();
            entity.drawName.clientAutoComplete = true;
            entity.position               = new ServerEntityPositionAndOrientation();
            entity.position.pitch         = 2 * 255 / 4;
            entity.drawModel              = new ServerEntityAnimatedModel();
            entity.drawModel.downloadSkin = true;
            Id                  = -1;
            state               = ClientStateOnServer.Connecting;
            queryClient         = true;
            received            = new List <byte>();
            Ping                = new Ping_();
            playername          = Server.invalidplayername;
            Model               = "player.txt";
            chunksseenTime      = new Dictionary <int, int>();
            heightmapchunksseen = new Dictionary <Vector2i, int>();
            IsInventoryDirty    = true;
            IsPlayerStatsDirty  = true;
            FillLimit           = 500;
            privileges          = new List <string>();
            displayColor        = "&f";
            EyeHeight           = one * 15 / 10;
            ModelHeight         = one * 17 / 10;
            WindowSize          = new int[] { 800, 600 };
            playersDirty        = new bool[128];
            for (int i = 0; i < 128; i++)
            {
                playersDirty[i] = true;
            }
            spawnedEntities      = new ServerEntityId[64];
            spawnedEntitiesCount = 64;
            updateEntity         = new bool[spawnedEntitiesCount];
        }
Beispiel #17
0
    void OnDialogClick(DialogClickArgs args)
    {
        if (args.GetWidgetId() != "UseSign_OK")
        {
            //Return when dialog is not a sign
            return;
        }
        var            c       = server.clients[args.GetPlayer()];
        string         newText = args.GetTextBoxValue()[1];
        ServerEntityId id      = c.editingSign;

        if (newText != "")
        {
            c.editingSign = null;
            ServerEntity e = server.GetEntity(id.chunkx, id.chunky, id.chunkz, id.id);
            e.sign.text = newText;
            server.SetEntityDirty(id);
        }
        else
        {
            server.DespawnEntity(id);
        }
        server.SendDialog(args.GetPlayer(), "UseSign", null);
    }
 void OnUseEntity(int player, int chunkx, int chunky, int chunkz, int id)
 {
     ServerEntity e = server.GetEntity(chunkx, chunky, chunkz, id);
     if (e.permissionSign == null)
     {
         return;
     }
     if (!server.PlayerHasPrivilege(player, ServerClientMisc.Privilege.area_add))
     {
         server.SendMessage(player, server.colorError + server.language.Get("Server_CommandInsufficientPrivileges"));
         return;
     }
     ManicDigger.Dialog d = new ManicDigger.Dialog();
     d.Width = 400;
     d.Height = 400;
     d.IsModal = true;
     d.Widgets = new ManicDigger.Widget[4 + server.serverClient.Groups.Count * 2];
     int widgetCount = 0;
     var font = new DialogFont("Verdana", 11f, DialogFontStyle.Bold);
     d.Widgets[widgetCount++] = Widget.MakeSolid(0, 0, 400, 400, Game.ColorFromArgb(255, 50, 50, 50));
     d.Widgets[widgetCount++] = Widget.MakeTextBox(e.permissionSign.name, font, 50, 50, 200, 50, Game.ColorFromArgb(255, 0, 0, 0));
     for (int i = 0; i < server.serverClient.Groups.Count; i++)
     {
         Group g = server.serverClient.Groups[i];
         Widget button = Widget.MakeSolid(50, 150 + i * 50, 100, 40, Game.ColorFromArgb(255, 100, 100, 100));
         button.ClickKey = (char)13;
         button.Id = "PermissionSignGroup" + g.Name;
         d.Widgets[widgetCount++] = button;
         d.Widgets[widgetCount++] = Widget.MakeText(g.Name, font, 50, 150 + i * 50, Game.ColorFromArgb(255, 0, 0, 0));
     }
     Widget okHandler = Widget.MakeSolid(200, 50, 100, 50, Game.ColorFromArgb(255, 100, 100, 100));
     okHandler.ClickKey = (char)13;
     okHandler.Id = "UsePermissionSign_OK";
     d.Widgets[widgetCount++] = okHandler;
     d.Widgets[widgetCount++] = Widget.MakeText("Set player", font, 200, 50, Game.ColorFromArgb(255, 0, 0, 0));
     ServerEntityId id_ = new ServerEntityId();
     id_.chunkx = chunkx;
     id_.chunky = chunky;
     id_.chunkz = chunkz;
     id_.id = id;
     server.clients[player].editingSign = id_;
     server.SendDialog(player, "UseSign", d);
 }
    void NotifyEntities(Server server, int clientid, float dt)
    {
        ClientOnServer c = server.clients[clientid];
        c.notifyEntitiesAccum += dt;
        if (c.notifyEntitiesAccum < (one / EntityPositionUpdatesPerSecond))
        {
            return;
        }
        c.notifyEntitiesAccum = 0;

        // find nearest entities
        int max = SpawnMaxEntities;
        ServerEntityId[] nearestEntities = new ServerEntityId[max];
        FindNearEntities(server, c, max, nearestEntities);

        // update entities
        for (int i = 0; i < max; i++)
        {
            ServerEntityId e = nearestEntities[i];
            if (e == null) { continue; }
            for (int k = 0; k < server.modEventHandlers.onupdateentity.Count; k++)
            {
                server.modEventHandlers.onupdateentity[k](e.chunkx, e.chunky, e.chunkz, e.id);
            }
        }

        // despawn old entities
        for (int i = 0; i < c.spawnedEntitiesCount; i++)
        {
            ServerEntityId e = c.spawnedEntities[i];
            if (e == null) { continue; }
            if (!Contains(nearestEntities, max, e))
            {
                int onClientId = i;
                c.spawnedEntities[onClientId] = null;
                server.SendPacket(clientid, ServerPackets.EntityDespawn(64 + onClientId));
            }
        }

        // spawn new entities
        for (int i = 0; i < max; i++)
        {
            ServerEntityId e = nearestEntities[i];
            if (e == null) { continue; }
            if (!Contains(c.spawnedEntities, max, e))
            {
                int onClientId = IndexOfNull(c.spawnedEntities, c.spawnedEntitiesCount);
                c.spawnedEntities[onClientId] = e.Clone();
                ServerChunk chunk = server.d_Map.GetChunk(e.chunkx * Server.chunksize, e.chunky * Server.chunksize, e.chunkz * Server.chunksize);
                ServerEntity ee = chunk.Entities[e.id];
                Packet_ServerEntity ne = ToNetworkEntity(server.serverPlatform, ee);
                server.SendPacket(clientid, ServerPackets.EntitySpawn(64 + onClientId, ne));
            }
        }

        for (int i = 0; i < max; i++)
        {
            if (c.updateEntity[i])
            {
                c.updateEntity[i] = false;
                ServerEntityId e = c.spawnedEntities[i];
                ServerChunk chunk = server.d_Map.GetChunk(e.chunkx * Server.chunksize, e.chunky * Server.chunksize, e.chunkz * Server.chunksize);
                ServerEntity ee = chunk.Entities[e.id];
                Packet_ServerEntity ne = ToNetworkEntity(server.serverPlatform, ee);
                server.SendPacket(clientid, ServerPackets.EntitySpawn(64 + i, ne));
            }
        }
    }
Beispiel #20
0
        void UpdateEntity(ServerEntityId id)
        {
            ServerEntity e = server.GetEntity(id);

            if (e.permissionSign == null)
            {
                return;
            }
            if (e.drawModel == null)
            {
                e.drawModel = new ServerEntityAnimatedModel();
            }
            e.drawModel.model       = "signmodel.txt";
            e.drawModel.texture     = "permissionsignmodel.png";
            e.drawModel.modelHeight = one * 13 / 10;

            if (e.drawText == null)
            {
                e.drawText = new ServerEntityDrawText();
            }
            e.drawText.text = e.permissionSign.name;
            if (e.permissionSign.type == PermissionSignType.Group)
            {
                e.drawText.text = "&4" + e.drawText.text;
            }
            e.drawText.dx = one * 3 / 32;
            e.drawText.dy = one * 36 / 32;
            e.drawText.dz = one * 3 / 32;
            e.usable      = true;
            if (e.drawName == null)
            {
                e.drawName = new ServerEntityDrawName();
            }
            e.drawName.name             = "Permission Sign";
            e.drawName.onlyWhenSelected = true;
            if (e.drawArea == null)
            {
                e.drawArea = new ServerEntityDrawArea();
            }
            int sizex = 32;
            int sizey = 32;
            int sizez = 32;

            e.drawArea.x = (int)e.position.x - sizex / 2;
            e.drawArea.y = (int)e.position.y - sizey / 2;
            e.drawArea.z = (int)e.position.z - sizez / 2;
            byte heading = (byte)(e.position.heading + 255 / 8);
            int  rotDir  = heading / 64;

            if (rotDir == 0)
            {
                e.drawArea.x = (int)e.position.x - sizex / 2;
                e.drawArea.y = (int)e.position.y - sizey / 2;
                e.drawArea.z = (int)e.position.z - sizez;
            }
            else
            if (rotDir == 1)
            {
                e.drawArea.x = (int)e.position.x;
                e.drawArea.y = (int)e.position.y - sizey / 2;
                e.drawArea.z = (int)e.position.z - sizez / 2;
            }
            else
            if (rotDir == 2)
            {
                e.drawArea.x = (int)e.position.x - sizex / 2;
                e.drawArea.y = (int)e.position.y - sizey / 2;
                e.drawArea.z = (int)e.position.z;
            }
            else
            {
                e.drawArea.x = (int)e.position.x - sizex;
                e.drawArea.y = (int)e.position.y - sizey / 2;
                e.drawArea.z = (int)e.position.z - sizez / 2;
            }
            e.drawArea.sizex = sizex;
            e.drawArea.sizey = sizey;
            e.drawArea.sizez = sizez;
        }
Beispiel #21
0
        void FindNearEntities(Server server, ClientOnServer c, int maxCount, ServerEntityId[] ret)
        {
            List <ServerEntityId> list = new List <ServerEntityId>();
            int playerx = c.PositionMul32GlX / 32;
            int playery = c.PositionMul32GlZ / 32;
            int playerz = c.PositionMul32GlY / 32;

            // Find all entities in 3x3x3 chunks around player.
            for (int xx = -1; xx < 2; xx++)
            {
                for (int yy = -1; yy < 2; yy++)
                {
                    for (int zz = -1; zz < 2; zz++)
                    {
                        int chunkx = playerx / Server.chunksize + xx;
                        int chunky = playery / Server.chunksize + yy;
                        int chunkz = playerz / Server.chunksize + zz;
                        if (!MapUtil.IsValidChunkPos(server.d_Map, chunkx, chunky, chunkz, Server.chunksize))
                        {
                            continue;
                        }
                        ServerChunk chunk = server.d_Map.GetChunk(chunkx * Server.chunksize, chunky * Server.chunksize, chunkz * Server.chunksize);
                        if (chunk == null)
                        {
                            continue;
                        }
                        if (chunk.Entities == null)
                        {
                            continue;
                        }
                        for (int i = 0; i < chunk.EntitiesCount; i++)
                        {
                            if (chunk.Entities[i] == null)
                            {
                                continue;
                            }
                            if (chunk.Entities[i].position == null)
                            {
                                continue;
                            }
                            ServerEntityId id = new ServerEntityId(chunkx, chunky, chunkz, i);
                            list.Add(id);
                        }
                    }
                }
            }
            // Return maxCount of entities nearest to player.

            list.Sort((a, b) =>
            {
                var entityA = server.d_Map.GetChunk(a.chunkx * Server.chunksize, a.chunky * Server.chunksize, a.chunkz * Server.chunksize).Entities[a.id];
                var entityB = server.d_Map.GetChunk(b.chunkx * Server.chunksize, b.chunky * Server.chunksize, b.chunkz * Server.chunksize).Entities[b.id];

                Vector3i posA      = new Vector3i((int)entityA.position.x, (int)entityA.position.y, (int)entityA.position.z);
                Vector3i posB      = new Vector3i((int)entityB.position.x, (int)entityB.position.y, (int)entityB.position.z);
                Vector3i posPlayer = new Vector3i(c.PositionMul32GlX / 32, c.PositionMul32GlY / 32, c.PositionMul32GlZ / 32);
                return(server.DistanceSquared(posA, posPlayer).CompareTo(server.DistanceSquared(posB, posPlayer)));
            }
                      );

            int retCount = maxCount;

            if (list.Count < maxCount)
            {
                retCount = list.Count;
            }
            for (int i = 0; i < retCount; i++)
            {
                ret[i] = list[i];
            }
        }
 int IndexOfNull(ServerEntityId[] list, int listCount)
 {
     for (int i = 0; i < listCount; i++)
     {
         ServerEntityId s = list[i];
         if (s == null)
         {
             return i;
         }
     }
     return -1;
 }
    void FindNearEntities(Server server, ClientOnServer c, int maxCount, ServerEntityId[] ret)
    {
        List<ServerEntityId> list = new List<ServerEntityId>();
        int playerx = c.PositionMul32GlX / 32;
        int playery = c.PositionMul32GlZ / 32;
        int playerz = c.PositionMul32GlY / 32;
        // Find all entities in 3x3x3 chunks around player.
        for (int xx = -1; xx < 2; xx++)
        {
            for (int yy = -1; yy < 2; yy++)
            {
                for (int zz = -1; zz < 2; zz++)
                {
                    int chunkx = playerx / Server.chunksize + xx;
                    int chunky = playery / Server.chunksize + yy;
                    int chunkz = playerz / Server.chunksize + zz;
                    if (!MapUtil.IsValidChunkPos(server.d_Map, chunkx, chunky, chunkz, Server.chunksize))
                    {
                        continue;
                    }
                    ServerChunk chunk = server.d_Map.GetChunk(chunkx * Server.chunksize, chunky * Server.chunksize, chunkz * Server.chunksize);
                    if (chunk == null)
                    {
                        continue;
                    }
                    if (chunk.Entities == null)
                    {
                        continue;
                    }
                    for (int i = 0; i < chunk.EntitiesCount; i++)
                    {
                        if (chunk.Entities[i] == null)
                        {
                            continue;
                        }
                        if (chunk.Entities[i].position == null)
                        {
                            continue;
                        }
                        ServerEntityId id = new ServerEntityId();
                        id.chunkx = chunkx;
                        id.chunky = chunky;
                        id.chunkz = chunkz;
                        id.id = i;
                        list.Add(id);
                    }
                }
            }
        }
        // Return maxCount of entities nearest to player.

        list.Sort((a, b) =>
        {
            var entityA = server.d_Map.GetChunk(a.chunkx * Server.chunksize, a.chunky * Server.chunksize, a.chunkz * Server.chunksize).Entities[a.id];
            var entityB = server.d_Map.GetChunk(b.chunkx * Server.chunksize, b.chunky * Server.chunksize, b.chunkz * Server.chunksize).Entities[b.id];

            Vector3i posA = new Vector3i((int)entityA.position.x, (int)entityA.position.y, (int)entityA.position.z);
            Vector3i posB = new Vector3i((int)entityB.position.x, (int)entityB.position.y, (int)entityB.position.z);
            Vector3i posPlayer = new Vector3i(c.PositionMul32GlX / 32, c.PositionMul32GlY / 32, c.PositionMul32GlZ / 32);
            return server.DistanceSquared(posA, posPlayer).CompareTo(server.DistanceSquared(posB, posPlayer));
        }
        );

        int retCount = maxCount;
        if (list.Count < maxCount)
        {
            retCount = list.Count;
        }
        for (int i = 0; i < retCount; i++)
        {
            ret[i] = list[i];
        }
    }
Beispiel #24
0
        void NotifyEntities(Server server, int clientid, float dt)
        {
            ClientOnServer c = server.clients[clientid];

            c.notifyEntitiesAccum += dt;
            if (c.notifyEntitiesAccum < (one / EntityPositionUpdatesPerSecond))
            {
                return;
            }
            c.notifyEntitiesAccum = 0;

            // find nearest entities
            int max = SpawnMaxEntities;

            ServerEntityId[] nearestEntities = new ServerEntityId[max];
            FindNearEntities(server, c, max, nearestEntities);

            // update entities
            for (int i = 0; i < max; i++)
            {
                ServerEntityId e = nearestEntities[i];
                if (e == null)
                {
                    continue;
                }
                for (int k = 0; k < server.modEventHandlers.onentityupdate.Count; k++)
                {
                    server.modEventHandlers.onentityupdate[k](e);
                }
            }

            // despawn old entities
            for (int i = 0; i < c.spawnedEntitiesCount; i++)
            {
                ServerEntityId e = c.spawnedEntities[i];
                if (e == null)
                {
                    continue;
                }
                if (!Contains(nearestEntities, max, e))
                {
                    int onClientId = i;
                    c.spawnedEntities[onClientId] = null;
                    server.SendPacket(clientid, ServerPackets.EntityDespawn(64 + onClientId));
                }
            }

            // spawn new entities
            for (int i = 0; i < max; i++)
            {
                ServerEntityId e = nearestEntities[i];
                if (e == null)
                {
                    continue;
                }
                if (!Contains(c.spawnedEntities, max, e))
                {
                    int onClientId = IndexOfNull(c.spawnedEntities, c.spawnedEntitiesCount);
                    c.spawnedEntities[onClientId] = e.Clone();
                    ServerChunk         chunk = server.d_Map.GetChunk(e.chunkx * Server.chunksize, e.chunky * Server.chunksize, e.chunkz * Server.chunksize);
                    ServerEntity        ee    = chunk.Entities[e.id];
                    Packet_ServerEntity ne    = ToNetworkEntity(server.serverPlatform, ee);
                    server.SendPacket(clientid, ServerPackets.EntitySpawn(64 + onClientId, ne));
                }
            }

            for (int i = 0; i < max; i++)
            {
                if (c.updateEntity[i])
                {
                    c.updateEntity[i] = false;
                    ServerEntityId      e     = c.spawnedEntities[i];
                    ServerChunk         chunk = server.d_Map.GetChunk(e.chunkx * Server.chunksize, e.chunky * Server.chunksize, e.chunkz * Server.chunksize);
                    ServerEntity        ee    = chunk.Entities[e.id];
                    Packet_ServerEntity ne    = ToNetworkEntity(server.serverPlatform, ee);
                    server.SendPacket(clientid, ServerPackets.EntitySpawn(64 + i, ne));
                }
            }
        }