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); }
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); } }
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); }
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); } } }
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! }
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); } } }
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); }
public void ReceivePacket(MeshPacket p) { return; }
public void RoutePacketDirect(MeshPacket p, ulong id) { endpoint.SendDirectToSteamID(p, id); }
public void RoutePacket(MeshPacket p) { endpoint.Send(p); }
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); }