Пример #1
0
        // EntityPositionAndOrientation
        void NotifyPlayerPositions(Server server, int clientid, float dt)
        {
            ClientOnServer c = server.clients[clientid];

            c.notifyPlayerPositionsAccum += dt;
            if (c.notifyPlayerPositionsAccum < (one / PlayerPositionUpdatesPerSecond))
            {
                return;
            }
            c.notifyPlayerPositionsAccum = 0;
            foreach (var k in server.clients)
            {
                if (k.Value.state != ClientStateOnServer.Playing)
                {
                    continue;
                }
                if (!c.IsSpectator && k.Value.IsSpectator)
                {
                    // Do not send position updates for spectating players if player is not spectator himself
                    continue;
                }
                if (k.Key == clientid)
                {
                    if (k.Value.positionOverride == null)
                    {
                        continue;
                    }
                    else
                    {
                        k.Value.entity.position  = k.Value.positionOverride;
                        k.Value.positionOverride = null;
                    }
                }
                else
                {
                    if (server.DistanceSquared(server.PlayerBlockPosition(server.clients[k.Key]), server.PlayerBlockPosition(server.clients[clientid])) > server.config.PlayerDrawDistance * server.config.PlayerDrawDistance)
                    {
                        continue;
                    }
                }
                Packet_PositionAndOrientation position = ToNetworkEntityPosition(server.serverPlatform, server.clients[k.Key].entity.position);
                server.SendPacket(clientid, ServerPackets.EntityPositionAndOrientation(k.Key, position));
            }
        }