//------------ Process packet related to spawning prop ------------ private void ProcessIncomingSpawn(CSteamID remoteId, PacketHolder packetHolder) { var packet = packetHolder.Packet <Spawn>(); if (packet == null) { return; } switch (packet.Value.Action) { // When player accepted new spawn and sent back this callback case ActionType.PropSpawn: { Vector3?pos = null; if (packet.Value.Pos != null) { pos = new Vector3(packet.Value.Pos.Value.X, packet.Value.Pos.Value.Y, packet.Value.Pos.Value.Z); } SpawnProp(packet.Value.Name, pos); // When host receives prop spawn from player if (_globals.PlayingAsHost) { SpawnPropCallback(packet.Value.Name, pos, remoteId); } break; } } }
//------------ Process packet related to only changing object rotation ------------ private void ProcessIncomingObjectRotationChange(PacketHolder packetHolder, CSteamID remoteId) { var packet = packetHolder.Packet <Rotation>(); if (packet == null) { return; } if (packet.Value.ObjType != ObjectType.Prop) { return; } if (!_props.TryGetValue(packet.Value.Obj, out KinematicBody updatingObj)) { return; } Vector3 newObjRotation = updatingObj.Rotation; if (packet.Value.Rot != null) { newObjRotation.x = packet.Value.Rot.Value.X; newObjRotation.y = packet.Value.Rot.Value.Y; newObjRotation.z = packet.Value.Rot.Value.Z; } updatingObj.Rotation = newObjRotation; if (packet.Value.SentByHost) { return; } ObjectRotationChangeCallback(packet.Value.Obj, newObjRotation, remoteId); }
//------------ Process packet related to only changing object position ------------ private void ProcessIncomingObjectMovementChange(PacketHolder packetHolder, CSteamID remoteId) { var packet = packetHolder.Packet <Movement>(); if (packet == null) { return; } if (packet.Value.ObjType != ObjectType.Prop) { return; } if (!_props.TryGetValue(packet.Value.Obj, out KinematicBody updatingObj)) { return; } Transform newObjTransform = updatingObj.Transform; if (packet.Value.Pos != null) { newObjTransform.origin.x = packet.Value.Pos.Value.X; newObjTransform.origin.y = packet.Value.Pos.Value.Y; newObjTransform.origin.z = packet.Value.Pos.Value.Z; } updatingObj.Transform = newObjTransform; if (packet.Value.SentByHost) { return; } ObjectPositionChangeCallback(packet.Value.Obj, newObjTransform.origin, remoteId); }
private void ProcessPlayerMovementAndRotationChange(PacketHolder packetHolder, CSteamID remoteId) { var packet = packetHolder.Packet <MovementAndRotation>(); if (packet == null) { return; } if (packet.Value.ObjType != ObjectType.Player) { return; } if (!_globals.PlayerBodies.TryGetValue(packet.Value.Obj, out KinematicBody updatingPlayer)) { if (_globals.OwnPlayerBody != null && _globals.OwnPlayerBody.Name.Equals(packet.Value.Obj)) { updatingPlayer = _globals.OwnPlayerBody; } else { return; } } Transform newPlayerTransform = updatingPlayer.Transform; if (packet.Value.Pos != null) { newPlayerTransform.origin.x = packet.Value.Pos.Value.X; newPlayerTransform.origin.y = packet.Value.Pos.Value.Y; newPlayerTransform.origin.z = packet.Value.Pos.Value.Z; } updatingPlayer.Transform = newPlayerTransform; Vector3 newPlayerRotation = updatingPlayer.Rotation; if (packet.Value.Rot != null) { newPlayerRotation.x = packet.Value.Rot.Value.X; newPlayerRotation.y = packet.Value.Rot.Value.Y; newPlayerRotation.z = packet.Value.Rot.Value.Z; } updatingPlayer.Rotation = newPlayerRotation; if (_globals.PlayingAsHost) { PlayerMovementAndRotationChangeCallback(packet.Value.Obj, newPlayerTransform.origin, newPlayerRotation, remoteId); } }
private void ProcessIncomingPlayerIds(PacketHolder packetHolder) { var incomingPlayerIds = packetHolder.Packet <PlayerIds>(); if (incomingPlayerIds != null) { if (!incomingPlayerIds.Value.SentByHost) { return; } var newIncomingPlayerIds = Array.ConvertAll(incomingPlayerIds.Value.GetIdsArray(), item => (CSteamID)item); _globals.UserIds.UnionWith(newIncomingPlayerIds); GD.Print($"OK: Added lobby player id's from host, new count: {_globals.UserIds.Count}"); } GD.Print("NOTIFY: Changing scene after getting PlayerIds packet."); OnLobbyEnteredFinished(); }
private void ProcessIncomingUserAction(CSteamID remoteId, PacketHolder packetHolder) { var userAction = packetHolder.Packet <UserAction>(); if (userAction == null) { return; } GD.Print($"NOTIFY: Receiving UserAction: {userAction.Value.Action}."); switch (userAction.Value.Action) { case ActionType.PlayerIds: var sendingUsers = new HashSet <CSteamID>(_globals.UserIds); sendingUsers.RemoveWhere(id => id.Equals(remoteId)); var packet = Utils.GetPlayerIdsBytes(true, sendingUsers); SteamNetworking.SendP2PPacket(remoteId, packet, (uint)packet.Length, EP2PSend.k_EP2PSendReliable); GD.Print($"OK: Sent user list from host to: {SteamFriends.GetFriendPersonaName(remoteId)}"); break; } }
private void ProcessSpawn(PacketHolder packetHolder, CSteamID remoteId) { var packet = packetHolder.Packet <Spawn>(); if (packet == null) { return; } switch (packet.Value.Action) { case ActionType.PlayerSpawn: PackedScene playerScene; KinematicBody player; if (packet.Value.Name.Equals(_globals.OwnId.ToString())) { playerScene = ResourceLoader.Load <PackedScene>(_playerPath); player = playerScene?.Instance() as KinematicBody; if (player == null) { return; } GetParent().AddChild(player); player.Name = packet.Value.Name; _globals.OwnPlayerBody = player; } else { playerScene = ResourceLoader.Load <PackedScene>(_networkedPlayerPath); player = playerScene?.Instance() as KinematicBody; if (player == null) { return; } AddChild(player); player.Name = packet.Value.Name; _globals.PlayerBodies.Add(player.Name, player); } Transform propTransform; if (packet.Value.Pos != null) { propTransform = player.Transform; propTransform.origin.x = packet.Value.Pos.Value.X; propTransform.origin.y = packet.Value.Pos.Value.Y; propTransform.origin.z = packet.Value.Pos.Value.Z; player.Transform = propTransform; } else { propTransform = player.Transform; propTransform.origin.x = DefaultSpawnPos.x; propTransform.origin.y = DefaultSpawnPos.y; propTransform.origin.z = DefaultSpawnPos.z; player.Transform = propTransform; } if (_globals.PlayingAsHost) { SpawnPlayerCallback(packet.Value.Name, propTransform.origin, remoteId); SendAllExitingPlayersCallback(remoteId); } break; } }