// -------------------------------------------------------- //
        // Callbacks
        // -------------------------------------------------------- //
        public void Callback(EventReceiveData.Arguments args)
        {
            if (args.Reader.Type != MessageType.Pattern || args.Caller.SelfHost)
            {
                return;
            }

            var caller       = args.Caller;
            var peerInstance = args.PeerInstance;
            var reader       = args.Reader;

            var conPatternMgr = peerInstance.GetPatternManager();
            var conEntityMgr  = peerInstance.Get <ConnectionEntityManager>();

            var msgId = conPatternMgr.GetPattern(reader);

            if (msgId == MsgUpdateVelocity)
            {
                var packet = new VelocityPacket(reader.Data);
                SetFromPacket(packet, conEntityMgr);
            }
            else if (msgId == MsgMassUpdateVelocity)
            {
                var length = reader.Data.GetInt();
                for (int i = 0; i != length; i++)
                {
                    var packet = new VelocityPacket(reader.Data);
                    SetFromPacket(packet, conEntityMgr);
                }
            }
        }
    protected override void OnReceiveDataEvent(uint packetID, ushort packetTypeID, Stream stream)
    {
        //Debug.Log("Applying velocity received to " + gameObject.name);

        switch (packetTypeID)
        {
        case (ushort)UserPacketType.Velocity:

            VelocityPacket velocityPacket = new VelocityPacket();
            velocityPacket.Deserialize(stream);

            //Debug.Log("Applying velocity received to " + gameObject.name);
            Vector3 velocityReceived = new Vector3(
                velocityPacket.payload.velocity.x,
                velocityPacket.payload.velocity.y,
                velocityPacket.payload.velocity.z
                );
            //rb.position += velocityReceived;

            transform.Translate(velocityReceived, Space.Self);

            if (NetworkManager.Instance.isServer)
            {
                NetworkMessageManager.Instance.SendPosition(transform.position, (uint)objectID);
            }

            break;

        case (ushort)UserPacketType.Position:
            PositionPacket positionPacket = new PositionPacket();
            positionPacket.Deserialize(stream);

            Vector3 position = new Vector3(
                positionPacket.payload.position.x,
                positionPacket.payload.position.y,
                positionPacket.payload.position.z
                );
            //rb.position = position;
            transform.position = position;

            break;

        case (ushort)UserPacketType.Shoot:
            Shoot();
            break;

        case (ushort)UserPacketType.Damage:
            DamagePacket damagePacket = new DamagePacket();
            damagePacket.Deserialize(stream);

            TakeDamage((int)damagePacket.payload.damage);
            break;

        case (ushort)UserPacketType.ShipDestroyed:
            Instantiate(explosionEffect, transform.position, Quaternion.identity);
            Destroy(gameObject);
            break;
        }
    }
Esempio n. 3
0
    public void SendVelocity(Vector3 velocity, uint objectID, uint sequence = 0, bool sendAsReliable = false)
    {
        VelocityPacket velocityPacket = new VelocityPacket();

        velocityPacket.payload.sequence   = sequence;
        velocityPacket.payload.velocity.x = velocity.x;
        velocityPacket.payload.velocity.y = velocity.y;
        velocityPacket.payload.velocity.z = velocity.z;

        SendPacket(velocityPacket, objectID);
    }
        private void SetFromPacket(VelocityPacket packet, ConnectionEntityManager conEntityMgr)
        {
            var entity = packet.Entity;

            if (!conEntityMgr.HasEntity(entity))
            {
                Debug.LogError($"No entity {entity.Index}, {entity.Version} found");
                return;
            }

            entity = conEntityMgr.GetEntity(entity);

            entity.SetOrAddComponentData(new StVelocity(packet.Velocity));
        }
        protected override void OnUpdate()
        {
            if (!GameServerManagement.IsCurrentlyHosting)
            {
                return;
            }

            for (int i = 0; i != m_VelocityGroup.Length; i++)
            {
                ResetMessage();

                var packet = new VelocityPacket(m_VelocityGroup.Entities[i], m_VelocityGroup.VelocityArray[i].Value);
                GameServerManagement.Main.ServerInstance.GetMessageManager().Create(MsgUpdateVelocity, m_NetDataWriter);
                packet.WriteTo(m_NetDataWriter);
                ServerSendToAll(m_NetDataWriter);
            }
        }
    protected override void OnReceiveDataEvent(uint packetID, ushort packetTypeID, Stream stream)
    {
        switch (packetTypeID)
        {
        case (ushort)UserPacketType.Velocity:

            VelocityPacket velocityPacket = new VelocityPacket();
            velocityPacket.Deserialize(stream);

            //Debug.Log("Applying velocity received to " + gameObject.name);
            Vector3 velocityReceived = new Vector3(
                velocityPacket.payload.velocity.x,
                velocityPacket.payload.velocity.y,
                velocityPacket.payload.velocity.z
                );
            //rb.position += velocityReceived;

            transform.Translate(velocityReceived, Space.Self);

            if (NetworkManager.Instance.isServer)
            {
                NetworkMessageManager.Instance.SendPosition(transform.position, (uint)objectID, velocityPacket.payload.sequence);
            }

            break;

        case (ushort)UserPacketType.Position:
            PositionPacket positionPacket = new PositionPacket();
            positionPacket.Deserialize(stream);

            Vector3 position = new Vector3(
                positionPacket.payload.position.x,
                positionPacket.payload.position.y,
                positionPacket.payload.position.z
                );
            //rb.position = position;
            //Debug.Log("Position before reconciliation: " + position);


            if (positionPacket.payload.sequence > lastSequenceServerReceived)
            {
                lastSequenceServerReceived = positionPacket.payload.sequence;

                Vector3 reconciliationPosition = Vector3.zero;
                for (uint currentInputKey = positionPacket.payload.sequence; currentInputKey < sequence; currentInputKey++)
                {
                    if (inputs.ContainsKey(currentInputKey))
                    {
                        //Debug.Log("Removing input with ID " + currentInputKey);
                        reconciliationPosition += inputs[currentInputKey];
                        inputs.Remove(positionPacket.payload.sequence);
                    }
                }
                transform.position = position;
            }
            break;

        case (ushort)UserPacketType.Shoot:
            Shoot();
            break;

        case (ushort)UserPacketType.Damage:
            DamagePacket damagePacket = new DamagePacket();
            damagePacket.Deserialize(stream);

            TakeDamage((int)damagePacket.payload.damage);

            break;

        case (ushort)UserPacketType.ShipDestroyed:

            if (NetworkManager.Instance.isServer)
            {
                NetworkMessageManager.Instance.SendShipdestroyedPacket((uint)objectID);
            }

            Instantiate(explosionEffect, transform.position, Quaternion.identity);
            Destroy(gameObject);
            break;
        }
    }