Skip to content

Commit d16478e

Browse files
committed
Add missing files
1 parent cb9867f commit d16478e

File tree

3 files changed

+358
-0
lines changed

3 files changed

+358
-0
lines changed
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
using Steamworks;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Text;
5+
using UnityEngine;
6+
using ConnectionState = BeatSaberOnline.Data.Steam.SteamAPI.ConnectionState;
7+
8+
namespace BeatSaberOnline.Data.Steam
9+
{
10+
public class LobbyPacket
11+
{
12+
public enum SCREEN_TYPE : byte
13+
{
14+
NONE,
15+
WAITING,
16+
MENU,
17+
LOBBY,
18+
DOWNLOADING,
19+
PLAY_SONG,
20+
IN_GAME,
21+
}
22+
23+
public string HostName { get; set; } = "";
24+
public CSteamID LobbyID { get; set; } = new CSteamID(0);
25+
26+
public string Status { get; set; } = "";
27+
public bool Joinable { get; set; } = true;
28+
29+
public int UsedSlots { get; set; } = 1;
30+
public int TotalSlots { get; set; } = 5;
31+
public int MaxSlots { get; private set; } = 10;
32+
33+
public string CurrentSongId { get; set; } = "";
34+
public string CurrentSongName { get; set; } = "";
35+
public byte CurrentSongDifficulty { get; set; } = 0;
36+
public float CurrentSongOffset { get; set; } = 0f;
37+
38+
public SCREEN_TYPE Screen { get; set; } = SCREEN_TYPE.NONE;
39+
private string _gameplayModifiers = "";
40+
41+
public GameplayModifiers GameplayModifiers
42+
{
43+
get => new GameplayModifiers(JsonUtility.FromJson<GameplayModifiers>(_gameplayModifiers));
44+
set => _gameplayModifiers = JsonUtility.ToJson(value);
45+
}
46+
public LobbyPacket() {
47+
GameplayModifiers = new GameplayModifiers();
48+
}
49+
public LobbyPacket(string data)
50+
{
51+
FromBytes(DeSerialize(data));
52+
}
53+
private void FromBytes(byte[] data)
54+
{
55+
int currentStringPadding = BitConverter.ToInt32(data, 0);
56+
HostName = Encoding.UTF8.GetString(data, 4, currentStringPadding);
57+
LobbyID = new CSteamID(BitConverter.ToUInt64(data, 4 + currentStringPadding));
58+
59+
int statusLength = BitConverter.ToInt32(data, 12 + currentStringPadding);
60+
Status = Encoding.UTF8.GetString(data, 16 + currentStringPadding, statusLength);
61+
currentStringPadding += statusLength;
62+
63+
Joinable = BitConverter.ToBoolean(data, 16 + currentStringPadding);
64+
UsedSlots = BitConverter.ToInt32(data, 17 + currentStringPadding);
65+
TotalSlots = BitConverter.ToInt32(data, 21 + currentStringPadding);
66+
MaxSlots = BitConverter.ToInt32(data, 25 + currentStringPadding);
67+
68+
statusLength = BitConverter.ToInt32(data, 29 + currentStringPadding);
69+
CurrentSongId = Encoding.UTF8.GetString(data, 33 + currentStringPadding, statusLength);
70+
currentStringPadding += statusLength;
71+
72+
statusLength = BitConverter.ToInt32(data, 33 + currentStringPadding);
73+
CurrentSongName = Encoding.UTF8.GetString(data, 37 + currentStringPadding, statusLength);
74+
currentStringPadding += statusLength;
75+
76+
CurrentSongDifficulty = data[37 + currentStringPadding];
77+
CurrentSongOffset = BitConverter.ToSingle(data, 38 + currentStringPadding);
78+
79+
Screen = (SCREEN_TYPE) data[42 + currentStringPadding];
80+
81+
statusLength = BitConverter.ToInt32(data, 43 + currentStringPadding);
82+
_gameplayModifiers = Encoding.UTF8.GetString(data, 47 + currentStringPadding, statusLength);
83+
currentStringPadding += statusLength;
84+
}
85+
86+
private byte[] ToBytes(bool includeSize = true)
87+
{
88+
List<byte> buffer = new List<byte>();
89+
byte[] nameBuffer = Encoding.UTF8.GetBytes(HostName);
90+
buffer.AddRange(BitConverter.GetBytes(nameBuffer.Length));
91+
buffer.AddRange(nameBuffer);
92+
93+
buffer.AddRange(BitConverter.GetBytes(LobbyID.m_SteamID));
94+
95+
nameBuffer = Encoding.UTF8.GetBytes(Status);
96+
buffer.AddRange(BitConverter.GetBytes(nameBuffer.Length));
97+
buffer.AddRange(nameBuffer);
98+
99+
buffer.AddRange(BitConverter.GetBytes(Joinable));
100+
buffer.AddRange(BitConverter.GetBytes(UsedSlots));
101+
buffer.AddRange(BitConverter.GetBytes(TotalSlots));
102+
buffer.AddRange(BitConverter.GetBytes(MaxSlots));
103+
104+
nameBuffer = Encoding.UTF8.GetBytes(CurrentSongId);
105+
buffer.AddRange(BitConverter.GetBytes(nameBuffer.Length));
106+
buffer.AddRange(nameBuffer);
107+
108+
nameBuffer = Encoding.UTF8.GetBytes(CurrentSongName);
109+
buffer.AddRange(BitConverter.GetBytes(nameBuffer.Length));
110+
buffer.AddRange(nameBuffer);
111+
buffer.Add(CurrentSongDifficulty);
112+
buffer.AddRange(BitConverter.GetBytes(CurrentSongOffset));
113+
114+
buffer.Add((byte) Screen);
115+
116+
nameBuffer = Encoding.UTF8.GetBytes(_gameplayModifiers);
117+
buffer.AddRange(BitConverter.GetBytes(nameBuffer.Length));
118+
buffer.AddRange(nameBuffer);
119+
120+
if (includeSize)
121+
buffer.InsertRange(0, BitConverter.GetBytes(buffer.Count));
122+
123+
return buffer.ToArray();
124+
}
125+
126+
public override bool Equals(object obj)
127+
{
128+
if (obj is PlayerPacket)
129+
{
130+
return (LobbyID == (obj as LobbyPacket).LobbyID);
131+
}
132+
else
133+
{
134+
return false;
135+
}
136+
}
137+
public override int GetHashCode()
138+
{
139+
return unchecked(this.LobbyID.m_SteamID.GetHashCode() * 17 + this.HostName.GetHashCode());
140+
}
141+
public override string ToString()
142+
{
143+
return $"lobbyId={LobbyID},hostname={HostName},status={Status},joinable={Joinable},UsedSlots={UsedSlots},TotalSlots={TotalSlots},MaxSlots={MaxSlots},CurrentSongId={CurrentSongId},CurrentSongDifficulty={CurrentSongDifficulty},CurretnSongName={CurrentSongName},CurrentSongOffset={CurrentSongOffset},Screen={Screen},gameplayModifiers={_gameplayModifiers}";
144+
}
145+
146+
public string Serialize()
147+
{
148+
return Convert.ToBase64String(ToBytes(false));
149+
}
150+
151+
public byte[] DeSerialize(string body)
152+
{
153+
return Convert.FromBase64String(body);
154+
}
155+
}
156+
}
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
using BeatSaberOnline.Utils;
2+
using System;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Text;
6+
using UnityEngine;
7+
8+
namespace BeatSaberOnline.Data
9+
{
10+
11+
public class PlayerPacket
12+
{
13+
// Based on https://github.com/andruzzzhka/BeatSaberMultiplayer/blob/master/BeatSaberMultiplayer/Data/PlayerPacket.cs
14+
public string playerName = "";
15+
public ulong playerId = 0;
16+
17+
public uint playerScore = 0;
18+
public uint playerCutBlocks = 0;
19+
public uint playerComboBlocks = 0;
20+
public uint playerMaxComboBlocks = 0;
21+
public uint playerTotalBlocks = 0;
22+
public float playerEnergy = 0;
23+
24+
public float playerProgress = 0f;
25+
26+
public Vector3 headPos = new Vector3(0, 0, 0);
27+
public Vector3 rightHandPos = new Vector3(0, 0, 0);
28+
public Vector3 leftHandPos = new Vector3(0, 0, 0);
29+
30+
public Quaternion headRot = new Quaternion();
31+
public Quaternion rightHandRot = new Quaternion();
32+
public Quaternion leftHandRot = new Quaternion();
33+
34+
public string avatarHash = "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF";
35+
public bool Ready = false;
36+
public bool SongFailed = false;
37+
public bool InSong = false;
38+
39+
public PlayerPacket(string _name, ulong _id)
40+
{
41+
playerName = _name;
42+
playerId = _id;
43+
}
44+
public PlayerPacket(string data)
45+
{
46+
FromBytes(DeSerialize(data));
47+
}
48+
private void FromBytes(byte[] data)
49+
{
50+
int nameLength = BitConverter.ToInt32(data, 0);
51+
playerName = Encoding.UTF8.GetString(data, 4, nameLength);
52+
playerId = BitConverter.ToUInt64(data, 4 + nameLength);
53+
54+
playerScore = BitConverter.ToUInt32(data, 12 + nameLength);
55+
playerCutBlocks = BitConverter.ToUInt32(data, 16 + nameLength);
56+
playerMaxComboBlocks = BitConverter.ToUInt32(data, 20 + nameLength);
57+
playerComboBlocks = BitConverter.ToUInt32(data, 24 + nameLength);
58+
playerTotalBlocks = BitConverter.ToUInt32(data, 28+ nameLength);
59+
playerEnergy = BitConverter.ToSingle(data, 32 + nameLength);
60+
61+
playerProgress = BitConverter.ToSingle(data, 36 + nameLength);
62+
63+
byte[] avatar = data.Skip(40 + nameLength).Take(58).ToArray();
64+
65+
rightHandPos = Serialization.ToVector3(avatar.Take(6).ToArray());
66+
leftHandPos = Serialization.ToVector3(avatar.Skip(6).Take(6).ToArray());
67+
headPos = Serialization.ToVector3(avatar.Skip(12).Take(6).ToArray());
68+
69+
rightHandRot = Serialization.ToQuaternion(avatar.Skip(18).Take(8).ToArray());
70+
leftHandRot = Serialization.ToQuaternion(avatar.Skip(26).Take(8).ToArray());
71+
headRot = Serialization.ToQuaternion(avatar.Skip(34).Take(8).ToArray());
72+
73+
avatarHash = BitConverter.ToString(avatar.Skip(42).Take(16).ToArray()).Replace("-", "");
74+
75+
Ready = BitConverter.ToBoolean(data, 98 + nameLength);
76+
77+
SongFailed = BitConverter.ToBoolean(data, 99 + nameLength);
78+
InSong = BitConverter.ToBoolean(data, 100 + nameLength);
79+
}
80+
81+
private byte[] GetBytes()
82+
{
83+
List<byte> buffer = new List<byte>();
84+
85+
byte[] nameBuffer = Encoding.UTF8.GetBytes(playerName);
86+
buffer.AddRange(BitConverter.GetBytes(nameBuffer.Length));
87+
buffer.AddRange(nameBuffer);
88+
buffer.AddRange(BitConverter.GetBytes(playerId));
89+
90+
buffer.AddRange(BitConverter.GetBytes(playerScore));
91+
buffer.AddRange(BitConverter.GetBytes(playerCutBlocks));
92+
buffer.AddRange(BitConverter.GetBytes(playerMaxComboBlocks));
93+
buffer.AddRange(BitConverter.GetBytes(playerComboBlocks));
94+
buffer.AddRange(BitConverter.GetBytes(playerTotalBlocks));
95+
buffer.AddRange(BitConverter.GetBytes(playerEnergy));
96+
97+
buffer.AddRange(BitConverter.GetBytes(playerProgress));
98+
99+
buffer.AddRange(Serialization.Combine(
100+
Serialization.ToBytes(rightHandPos),
101+
Serialization.ToBytes(leftHandPos),
102+
Serialization.ToBytes(headPos),
103+
Serialization.ToBytes(rightHandRot),
104+
Serialization.ToBytes(leftHandRot),
105+
Serialization.ToBytes(headRot)));
106+
107+
buffer.AddRange(HexConverter.ConvertHexToBytesX(avatarHash));
108+
109+
buffer.AddRange(BitConverter.GetBytes(Ready));
110+
buffer.AddRange(BitConverter.GetBytes(SongFailed));
111+
buffer.AddRange(BitConverter.GetBytes(InSong));
112+
113+
return buffer.ToArray();
114+
}
115+
116+
public override bool Equals(object obj)
117+
{
118+
return obj is PlayerPacket && (playerId == (obj as PlayerPacket).playerId);
119+
}
120+
121+
public override int GetHashCode()
122+
{
123+
return unchecked(this.playerId.GetHashCode() * 17 + this.playerName.GetHashCode());
124+
}
125+
126+
public string Serialize()
127+
{
128+
return Convert.ToBase64String(GetBytes());
129+
}
130+
131+
public byte[] DeSerialize(string body)
132+
{
133+
return Convert.FromBase64String(body);
134+
}
135+
}
136+
}
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
using BeatSaberOnline.Utils;
2+
using Steamworks;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using UnityEngine;
7+
8+
namespace BeatSaberOnline.Data
9+
{
10+
11+
public class VoipPacket
12+
{
13+
14+
15+
public byte[] voip = new byte[0];
16+
17+
public VoipPacket(byte[] data)
18+
{
19+
voip = data;
20+
}
21+
public VoipPacket(string data)
22+
{
23+
FromBytes(DeSerialize(data));
24+
}
25+
private void FromBytes(byte[] data)
26+
{
27+
voip = data;
28+
}
29+
30+
public bool Play(AudioSource source)
31+
{
32+
byte[] voipBuffer = new byte[11025 * 2];
33+
uint byteLength;
34+
35+
if (SteamUser.DecompressVoice(voip, (uint)voip.Length, voipBuffer, (uint)voipBuffer.Length, out byteLength, 11025) == EVoiceResult.k_EVoiceResultOK && byteLength > 0)
36+
{
37+
float[] v = new float[11025];
38+
for (int i = 0; i < v.Length; ++i)
39+
{
40+
v[i] = (short)(voipBuffer[i * 2] | voipBuffer[i * 2 + 1] << 8) / 32768.0f;
41+
}
42+
source.clip.SetData(v, 0);
43+
source.outputAudioMixerGroup = Assets.AudioGroup;
44+
source.Play();
45+
return true;
46+
}
47+
return false;
48+
}
49+
50+
51+
public override int GetHashCode()
52+
{
53+
return unchecked(this.voip.GetHashCode() * 17);
54+
}
55+
56+
public string Serialize()
57+
{
58+
return Convert.ToBase64String(voip);
59+
}
60+
61+
public byte[] DeSerialize(string body)
62+
{
63+
return Convert.FromBase64String(body);
64+
}
65+
}
66+
}

0 commit comments

Comments
 (0)