Exemplo n.º 1
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));
                }
            }
        }