Пример #1
0
    public void InitializeDatabaseClientside(MeshPacket p)
    {
        if (database != null)
        {
            Debug.LogError("Database already exists. InitializeDatabaseClientside prohibited.");
            return;
        }

        DatabaseUpdate u = DatabaseUpdate.ParseContentAsDatabaseUpdate(p.GetContents());
        //Here, we construct the database shadow using the database update.
        bool flagHasFoundDatabase      = false;
        MeshNetworkIdentity databaseID = null;

        foreach (MeshNetworkIdentity i in u.objectDelta.Keys)
        {
            if (i.GetObjectID() == (ushort)ReservedObjectIDs.DatabaseObject)
            {
                flagHasFoundDatabase = true;
                database             = game.SpawnDatabase(i).GetComponent <NetworkDatabase>(); //Spawns the database prefab.
                databaseID           = i;
                break;
            }
        }
        if (flagHasFoundDatabase == false || database == null)
        {
            Debug.LogError("Database intialization failed.");
            return;
        }
        database.ReceivePacket(p);
    }
Пример #2
0
    public void Send(MeshPacket packet)
    {
        //Debug.Log("Send(): Dest. object: " + packet.GetTargetObjectId());
        if (meshnet.database == null)
        {
            Debug.LogError("Trying to send packet when database does not exist.");
        }

        if (packet.GetTargetPlayerId() == meshnet.GetLocalPlayerID())
        {
            ParseData(packet);
            return;
        }

        byte[]   data       = packet.GetSerializedBytes();
        Player[] allPlayers = meshnet.database.GetAllPlayers();
        if (packet.GetTargetPlayerId() == (byte)ReservedPlayerIDs.Broadcast)
        {
            foreach (Player p in allPlayers)
            {
                if (p.GetUniqueID() == meshnet.GetLocalPlayerID() && packet.GetPacketType() == PacketType.TransformUpdate)
                {
                    continue;
                }

                SteamNetworking.SendP2PPacket(new CSteamID(p.GetUniqueID()), data, (uint)data.Length, packet.qos);
            }
        }
        else
        {
            SteamNetworking.SendP2PPacket(new CSteamID(packet.GetTargetPlayerId()), data, (uint)data.Length, packet.qos);
        }
    }
Пример #3
0
    public void SendDirectToSteamID(MeshPacket packet, ulong id)
    {
        CSteamID steamID = new CSteamID(id);

        Debug.Log("Direct sending. You sure you want to do this?");
        //Debug.Log("Dest. object: " + packet.GetTargetObjectId());
        byte[] data = packet.GetSerializedBytes();
        SteamNetworking.SendP2PPacket(steamID, data, (uint)data.Length, EP2PSend.k_EP2PSendReliable);
    }
Пример #4
0
    public void RemovePlayerFromGame(ulong id)
    {
        Debug.LogError("REMOVING PLAYER");
        if (database == null)
        {
            Debug.LogError("Can't clear out player without a database");
            return;
        }
        if (!database.GetAuthorized())
        {
            return;
        }
        Player p = database.LookupPlayer(id);

        if (p == null)
        {
            Debug.LogError("Can't find player");
        }
        Debug.Log("Calling database method");
        database.RemovePlayer(p, true);
        MeshPacket packet = new MeshPacket();

        packet.SetPacketType(PacketType.KickPacket);
        packet.SetSourceObjectId((ushort)ReservedObjectIDs.Architecture);
        packet.SetSourcePlayerId(GetLocalPlayerID());
        packet.SetTargetObjectId((ushort)ReservedObjectIDs.Architecture);
        packet.SetTargetPlayerId(id);
        RoutePacketDirect(packet, id);

        MeshNetworkIdentity[] objectsToUnlock = database.QueryByOwner(id);
        for (int i = 0; i < objectsToUnlock.Length; i++)
        {
            if (objectsToUnlock[i].GetPrefabID() == (ushort)ReservedPrefabIDs.Player)
            {
                scheduler.ScheduleChange(objectsToUnlock[i], StateChange.Removal);
            }
            else
            {
                objectsToUnlock[i].SetLocked(false);
                objectsToUnlock[i].SetOwnerID(GetLocalPlayerID());
                scheduler.ScheduleChange(objectsToUnlock[i], StateChange.Change);
            }
        }
    }
Пример #5
0
    protected void RegisterWithProvider()
    {
        networkUIController.SetUIMode(UIMode.Connecting);

        //Create a PlayerJoin packet, which the provider will use as a trigger to
        //register a new player. It will update its internal database, and will
        //distribute this info as a normal DatabaseUpdate.
        MeshPacket p = new MeshPacket(new byte[0],
                                      PacketType.PlayerJoin,
                                      SteamUser.GetSteamID().m_SteamID,
                                      SteamMatchmaking.GetLobbyOwner(lobby).m_SteamID,
                                      (byte)ReservedObjectIDs.Unspecified,
                                      (byte)ReservedObjectIDs.DatabaseObject,
                                      (byte)ReservedSubcomponentIDs.Unspecified);

        p.qos = EP2PSend.k_EP2PSendReliable;
        RoutePacketDirect(p, p.GetTargetPlayerId());
        //Soon, we will receive a DatabaseUpdate with all of the up to date database information,
        //including our own player object!
    }
Пример #6
0
    public override void SetBeingUsed(bool used)
    {
        if (IsBeingUsed() != used)
        {
            if (GetIdentity() != null)
            {
                if (GetIdentity().IsLocallyOwned() == false)
                {
                    return;
                }
                base.SetBeingUsed(used);
                MeshPacket p = new MeshPacket();
                p.SetContents(new PropUpdate(used).GetSerializedBytes());
                p.SetTargetObjectId(GetIdentity().GetObjectID());
                p.SetTargetPlayerId((ulong)ReservedPlayerIDs.Broadcast);
                p.SetSourceObjectId(GetIdentity().GetObjectID());
                p.SetSourcePlayerId(GetIdentity().GetLocalPlayerID());

                p.SetPacketType(PacketType.GenericStateUpdate);
                GetIdentity().RoutePacket(p);
            }
        }
    }
Пример #7
0
        public void TestMesh()
        {
            var mesh = new Mesh {
                boneIndex     = 1,
                vtxDescriptor = 2
            };

            var meshPacket = new MeshPacket();

            meshPacket.indices = new short[] { 3, 4 };

            var displayList = new DisplayList();

            displayList.flags.intView = 5;
            displayList.cmdCount      = 6;
            displayList.dlistData.Add(7);
            displayList.dlistData.Add(8);
            meshPacket.displaylists = new[] { displayList, displayList };

            mesh.packets = new[] { meshPacket, meshPacket };

            TestGcnSerializableExisting(mesh);
        }
Пример #8
0
 public void ReceivePacket(MeshPacket p)
 {
     return;
 }
Пример #9
0
 public void RoutePacketDirect(MeshPacket p, ulong id)
 {
     endpoint.SendDirectToSteamID(p, id);
 }
Пример #10
0
 public void RoutePacket(MeshPacket p)
 {
     endpoint.Send(p);
 }
Пример #11
0
    void ParseData(MeshPacket incomingPacket)
    {
        //Debug.Log("Packet parsing: type = " + incomingPacket.GetPacketType() + ", source playerID = " + incomingPacket.GetSourcePlayerId() + ", target objectID = " + incomingPacket.GetTargetObjectId());
        if (incomingPacket.GetSourcePlayerId() == meshnet.GetLocalPlayerID())
        {
            //Debug.Log("Discarding packet from self");
            //return;
        }


        if (incomingPacket.GetPacketType() == PacketType.PlayerJoin)
        {
            Debug.Log("PlayerJoin packet identified");
            if (meshnet.database == null)
            {
                Debug.LogError("Database not intialized yet!");
                return;
            }
            if (meshnet.database.GetAuthorized() == false)
            {
                Debug.Log("I'm not the provider. Discarding PlayerJoin packet");
                return;
            }
            CSteamID sID = new CSteamID(incomingPacket.GetSourcePlayerId());
            Player   p   = meshnet.ConstructPlayer(sID);
            meshnet.database.AddPlayer(p, true);
            return;
        }
        else if (incomingPacket.GetPacketType() == PacketType.DatabaseUpdate)
        {
            if (meshnet.database == null)
            {
                Debug.Log("Received first database update, no database to send it to.");
                Debug.Log("Rerouting to MeshNetwork.");
                meshnet.InitializeDatabaseClientside(incomingPacket);
                return;
            }
        }
        else if (incomingPacket.GetPacketType() == PacketType.KickPacket)
        {
            meshnet.initiateDisconnect();
        }

        //If the packet is neither a PlayerJoin or a DatabaseUpdate
        Player source = meshnet.database.LookupPlayer(incomingPacket.GetSourcePlayerId()); //retrieve which player sent this packet

        if (source == null)                                                                //hmmm, the NBD can't find the player
        {
            Debug.LogError("Player from which packet originated does not exist on local NDB.");
            return;
        }

        MeshNetworkIdentity targetObject = meshnet.database.LookupObject(incomingPacket.GetTargetObjectId());

        if (targetObject == null)
        {
            Debug.LogError("Packet's target object doesn't exist on the database!");
            //Debug.LogError("type = " + incomingPacket.GetPacketType() + ", sourceObject = " + incomingPacket.GetSourceObjectId() + ", source player = " + incomingPacket.GetSourcePlayerId() + ", target object = " + incomingPacket.GetTargetObjectId());
            return;
        }

        targetObject.ReceivePacket(incomingPacket);
    }