Exemplo n.º 1
0
 public void SendReplicationMessageToServer(ReplicationMessage msg)
 {
     using (PooledBitStream stream = PooledBitStream.Get())
     {
         using (PooledBitWriter writer = PooledBitWriter.Get(stream))
         {
             writer.WriteInt32(msg.messageID);
             writer.WriteInt32(msg.timeCreated);
             writer.WriteUInt32(msg.entityId);
             writer.WriteInt16((byte)msg.shape);
             writer.WriteVector2(msg.pos);
             writer.WriteVector2(msg.speed);
             writer.WriteDouble(msg.size);
             writer.WriteUInt32(msg.inputA);
             writer.WriteUInt32(msg.inputW);
             writer.WriteUInt32(msg.inputS);
             writer.WriteUInt32(msg.inputD);
             CustomMessagingManager.SendNamedMessage("Replication", this.ServerClientId, stream, "customChannel");
         }
     }
 }
 public void SendInputMessage(InputMessage msg)
 {
     using (PooledBitStream stream = PooledBitStream.Get())
     {
         using (PooledBitWriter writer = PooledBitWriter.Get(stream))
         {
             writer.WriteInt32(msg.messageID);
             writer.WriteInt32(msg.timeCreated);
             writer.WriteUInt32(msg.playerId);
             writer.WriteShortArray(msg.keycode.ToArray());
             CustomMessagingManager.SendNamedMessage("Input", this.ServerClientId, stream, "customChannel");
         }
     }
 }
 public void SendReplicationMessage(ReplicationMessage msg)
 {
     using (PooledBitStream stream = PooledBitStream.Get())
     {
         using (PooledBitWriter writer = PooledBitWriter.Get(stream))
         {
             writer.WriteInt32(msg.messageID);
             writer.WriteInt32(msg.timeCreated);
             writer.WriteInt32(msg.frameNumber);
             writer.WriteUInt32(msg.entityId);
             writer.WriteInt16((byte)msg.shape);
             writer.WriteVector2(msg.pos);
             writer.WriteVector2(msg.speed);
             writer.WriteDouble(msg.size);
             CustomMessagingManager.SendNamedMessage("Replication", null, stream, "customChannel");
         }
     }
 }
    internal void Tick(uint tick)
    {
        if (IsServer)
        {
            using (PooledBitStream stream = PooledBitStream.Get())
            {
                using (PooledBitWriter writer = PooledBitWriter.Get(stream))
                {
                    writer.WriteUInt32(tick);
                    Dictionary <ulong, IEntityState> states = new Dictionary <ulong, IEntityState>(entities.Count);

                    foreach (Entity entity in entities.Values)
                    {
                        IEntityState state = entity.DoStateTick(tick);
                        if (state != null)
                        {
                            states.Add(entity.NetworkId, state);
                        }
                    }

                    writer.WriteInt32(states.Count);

                    foreach (var state in states)
                    {
                        writer.WriteUInt64(state.Key);
                        state.Value.Serialize(writer);
                    }

                    CustomMessagingManager.SendNamedMessage("NetworkState", null, stream);
                }
            }
        }

        else
        {
            foreach (Entity entity in entities.Values)
            {
                entity.DoStateTick(tick);
            }

            uint predictTicks = (uint)Math.Ceiling(RTT / FixedStep) + 2 * Deviation;

            for (uint i = 0; i < predictTicks; i++)
            {
                if (tick + i > LastPredictedTick)
                {
                    using (PooledBitStream stream = PooledBitStream.Get())
                    {
                        using (PooledBitWriter writer = PooledBitWriter.Get(stream))
                        {
                            LastPredictedTick = tick + i;
                            var authEntities = entities.Values.Where(e => e.IsOwner);
                            int count        = authEntities.Count();
                            Dictionary <ulong, IEntityInput> inputs = new Dictionary <ulong, IEntityInput>(count);

                            foreach (Entity entity in authEntities)
                            {
                                IEntityInput input = entity.DoInputTick(tick + i);
                                if (input != null)
                                {
                                    inputs.Add(entity.NetworkId, input);
                                }
                            }

                            writer.WriteUInt32(tick + i);
                            writer.WriteInt32(inputs.Count);

                            foreach (var input in inputs)
                            {
                                writer.WriteUInt64(input.Key);
                                input.Value.Serialize(writer);
                            }

                            CustomMessagingManager.SendNamedMessage("NetworkInput", NetworkingManager.Singleton.ServerClientId, stream);
                        }
                    }
                }

                foreach (Entity entity in entities.Values.Where(e => e.extrapolate || e.IsOwner))
                {
                    entity.DoStateTick(tick + i);
                }
            }

            foreach (Entity entity in entities.Values)
            {
                entity.Present();
            }
        }
    }