Skip to content

Commit 934baf7

Browse files
2024.10.1b
1 parent b49cb71 commit 934baf7

File tree

21 files changed

+1812
-561
lines changed

21 files changed

+1812
-561
lines changed
512 Bytes
Binary file not shown.
2.5 KB
Binary file not shown.

Assets/Scenes/SampleScene.unity

Lines changed: 1598 additions & 492 deletions
Large diffs are not rendered by default.

Assets/Scripts/Configuration/Config.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,22 @@ public class Config
2424
[TomlProperty("UseTrustedURLs")]
2525
public bool UseTrustedURLs { get; set; } = true;
2626

27-
[TomlProperty("TrustedURLs")]
28-
public List<string> TrustedURLs { get; set; } = new()
27+
public static List<string> DefaultURLs = new()
2928
{
3029
"https://discordapp.com",
3130
"https://discord.com",
3231
"https://cdn.discordapp.com",
3332
"https://vrcdn.live",
34-
"https://stream.vrcdn.live"
33+
"https://stream.vrcdn.live",
34+
"https://youtube.com",
35+
"https://www.youtube.com",
36+
"https://m.youtube.com",
37+
"https://youtu.be/"
3538
};
3639

40+
[TomlProperty("TrustedURLs")]
41+
public List<string> TrustedURLs { get; set; } = DefaultURLs;
42+
3743
public ConfigUser GetConfigUserFromUserId(string userid)
3844
{
3945
foreach (ConfigUser savedAccount in SavedAccounts)

Assets/Scripts/Game/GameInstance.cs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ public class GameInstance
3636
public static Action<GameInstance, WorldMeta, Scene> OnGameInstanceLoaded { get; set; } =
3737
(instance, meta, scene) => { };
3838
public static Action<GameInstance> OnGameInstanceDisconnect { get; set; } = instance => { };
39+
public static Dictionary<WorldMeta, float> WorldDownloadProgress = new();
3940

4041
internal static void Init()
4142
{
@@ -57,6 +58,47 @@ internal static void Init()
5758
gameInstance.Load();
5859
};
5960
}
61+
62+
internal static void HandleDownloadProgress(WorldMeta worldMeta, float progress)
63+
{
64+
if (WorldDownloadProgress.Count(x => x.Key.Id == worldMeta.Id) <= 0)
65+
{
66+
WorldDownloadProgress.Add(worldMeta, progress);
67+
return;
68+
}
69+
for (int i = 0; i < WorldDownloadProgress.Count; i++)
70+
{
71+
WorldMeta w = WorldDownloadProgress.ElementAt(i).Key;
72+
if(w.Id != worldMeta.Id) continue;
73+
WorldDownloadProgress[w] = progress;
74+
}
75+
}
76+
77+
public static bool IsDownloading(string worldId) => WorldDownloadProgress.Count(x => x.Key.Id == worldId) > 0;
78+
public static bool IsDownloading(WorldMeta worldMeta) => IsDownloading(worldMeta.Id);
79+
80+
public static float? GetDownloadProgress(string worldId)
81+
{
82+
for (int i = 0; i < WorldDownloadProgress.Count; i++)
83+
{
84+
KeyValuePair<WorldMeta, float> pair = WorldDownloadProgress.ElementAt(i);
85+
WorldMeta w = pair.Key;
86+
if(w.Id != worldId) continue;
87+
return pair.Value;
88+
}
89+
return null;
90+
}
91+
public static float? GetDownloadProgress(WorldMeta worldMeta) => GetDownloadProgress(worldMeta.Id);
92+
93+
public static (WorldMeta, float)[] GetAllDownloads()
94+
{
95+
int count = WorldDownloadProgress.Count;
96+
if (count <= 0) return Array.Empty< (WorldMeta, float)>();
97+
return WorldDownloadProgress.Select(x => (x.Key, x.Value)).ToArray();
98+
}
99+
100+
internal static void FinishDownload(WorldMeta worldMeta) => WorldDownloadProgress =
101+
WorldDownloadProgress.Where(x => x.Key.Id != worldMeta.Id).ToDictionary(x => x.Key, y => y.Value);
60102

61103
public static User[] GetConnectedUsers(GameInstance gameInstance, bool includeLocal = true)
62104
{
@@ -184,6 +226,7 @@ private GameInstance(InstanceOpened instanceOpened, WorldMeta worldMeta)
184226
string ip = s[0];
185227
int port = Convert.ToInt32(s[1]);
186228
InstanceProtocol instanceProtocol = instanceOpened.InstanceProtocol;
229+
host = APIPlayer.APIUser;
187230
SetupClient(ip, port, instanceProtocol);
188231
}
189232

@@ -472,14 +515,15 @@ private void Load(bool open = true)
472515
knownHash = fileMetaResult.result.FileMeta.Hash;
473516
DownloadTools.DownloadFile(fileURL, $"{worldMeta.Id}.hnw", o =>
474517
{
518+
FinishDownload(worldMeta);
475519
CoroutineRunner.Instance.Run(AssetBundleTools.LoadSceneFromFile(o, s =>
476520
{
477521
if (!string.IsNullOrEmpty(s))
478522
LoadScene(open, s);
479523
else
480524
Dispose();
481525
}, this));
482-
}, knownHash);
526+
}, knownHash, args => HandleDownloadProgress(worldMeta, args.ProgressPercentage / 100f));
483527
}, worldMeta.OwnerId, fileId);
484528
}
485529
}

Assets/Scripts/Game/IPlayer.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,7 @@ public interface IPlayer
99
public string Id { get; }
1010
public AvatarCreator AvatarCreator { get; }
1111
public Transform transform { get; }
12+
public bool IsLoadingAvatar { get; }
13+
public float AvatarDownloadPercentage { get; }
1214
}
1315
}

Assets/Scripts/Game/LocalPlayer.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
using Hypernex.Tools;
1616
using Hypernex.UI;
1717
using Hypernex.UI.Templates;
18+
using Hypernex.UIActions;
1819
using HypernexSharp.API;
1920
using HypernexSharp.API.APIResults;
2021
using HypernexSharp.APIObjects;
@@ -42,6 +43,8 @@ public class LocalPlayer : MonoBehaviour, IPlayer, IDisposable
4243
public bool IsLocal => true;
4344
public string Id => APIPlayer.APIUser.Id;
4445
public AvatarCreator AvatarCreator => avatar;
46+
public bool IsLoadingAvatar { get; private set; }
47+
public float AvatarDownloadPercentage { get; private set; }
4548

4649
public static bool IsVR { get; internal set; }
4750

@@ -296,6 +299,7 @@ private void OnAvatarDownload(string file, AvatarMeta am)
296299
avatarMeta = am;
297300
avatar?.Dispose();
298301
CurrentAvatarDisplay.SizeAvatar(1f);
302+
IsLoadingAvatar = false;
299303
avatar = new LocalAvatarCreator(this, a, IsVR, am);
300304
avatarFile = file;
301305
// Why this doesn't clear old transforms? I don't know.
@@ -334,6 +338,9 @@ private void OnAvatarMeta(CallbackResult<MetaCallback<AvatarMeta>> r)
334338
APIPlayer.APIObject.GetAvatarMeta(OnAvatarMeta, ConfigManager.SelectedConfigUser.CurrentAvatar);
335339
return;
336340
}
341+
OverlayManager.Instance.CurrentLoadingAvatarMeta = r.result.Meta;
342+
IsLoadingAvatar = true;
343+
AvatarDownloadPercentage = 0;
337344
Builds build = r.result.Meta.Builds.FirstOrDefault(x => x.BuildPlatform == AssetBundleTools.Platform);
338345
if (build == null)
339346
return;
@@ -354,7 +361,8 @@ private void OnAvatarMeta(CallbackResult<MetaCallback<AvatarMeta>> r)
354361
if (fileMetaResult.success)
355362
knownHash = fileMetaResult.result.FileMeta.Hash;
356363
DownloadTools.DownloadFile(file, $"{r.result.Meta.Id}.hna",
357-
f => OnAvatarDownload(f, r.result.Meta), knownHash);
364+
f => OnAvatarDownload(f, r.result.Meta), knownHash,
365+
args => AvatarDownloadPercentage = args.ProgressPercentage / 100f);
358366
}, r.result.Meta.OwnerId, build.FileId);
359367
});
360368
return;
@@ -364,8 +372,8 @@ private void OnAvatarMeta(CallbackResult<MetaCallback<AvatarMeta>> r)
364372
string knownHash = String.Empty;
365373
if (fileMetaResult.success)
366374
knownHash = fileMetaResult.result.FileMeta.Hash;
367-
DownloadTools.DownloadFile(file, $"{r.result.Meta.Id}.hna",
368-
f => OnAvatarDownload(f, r.result.Meta), knownHash);
375+
DownloadTools.DownloadFile(file, $"{r.result.Meta.Id}.hna", f => OnAvatarDownload(f, r.result.Meta),
376+
knownHash, args => AvatarDownloadPercentage = args.ProgressPercentage / 100f);
369377
}, r.result.Meta.OwnerId, build.FileId);
370378
}
371379

Assets/Scripts/Game/NetPlayer.cs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ public class NetPlayer : MonoBehaviour, IPlayer
5656
public string Id => UserId;
5757
public bool IsLocal => false;
5858
public AvatarCreator AvatarCreator => Avatar;
59+
public bool IsLoadingAvatar => Avatar == null;
60+
public float AvatarDownloadPercentage { get; private set; }
5961

6062
public float volume
6163
{
@@ -132,10 +134,10 @@ private void OnAvatarDownload(Stream stream)
132134
if (stream == Stream.Null)
133135
{
134136
if (avatarFileToken == null)
135-
APIPlayer.APIObject.GetFile(OnAvatarDownload, avatarMeta.OwnerId, avatarBuild.FileId);
137+
APIPlayer.APIObject.GetFile(OnAvatarDownload, avatarMeta.OwnerId, avatarBuild.FileId, i => AvatarDownloadPercentage = i/100f);
136138
else
137139
APIPlayer.APIObject.GetFile(OnAvatarDownload, avatarMeta.OwnerId, avatarBuild.FileId,
138-
avatarFileToken.avatarToken);
140+
avatarFileToken.avatarToken, i => AvatarDownloadPercentage = i/100f);
139141
return;
140142
}
141143

@@ -241,7 +243,8 @@ private void OnAvatar(CallbackResult<MetaCallback<AvatarMeta>> result)
241243
else
242244
{
243245
DownloadTools.DownloadFile(file, $"{result.result.Meta.Id}.hna",
244-
f => OnAvatarDownload(f), fmr.result.FileMeta.Hash);
246+
f => OnAvatarDownload(f), fmr.result.FileMeta.Hash,
247+
i => AvatarDownloadPercentage = i.ProgressPercentage / 100f);
245248
}
246249
}, result.result.Meta.OwnerId, b.FileId);
247250
}
@@ -256,7 +259,8 @@ private void OnAvatar(CallbackResult<MetaCallback<AvatarMeta>> result)
256259
else
257260
{
258261
DownloadTools.DownloadFile(file, $"{result.result.Meta.Id}.hna",
259-
f => OnAvatarDownload(f), fmr.result.FileMeta.Hash);
262+
f => OnAvatarDownload(f), fmr.result.FileMeta.Hash,
263+
i => AvatarDownloadPercentage = i.ProgressPercentage / 100f);
260264
}
261265
}, result.result.Meta.OwnerId, b.FileId);
262266
}
@@ -275,18 +279,18 @@ private void Start()
275279
{
276280
if (waitingForAvatarToken && token.fromUserId == UserId && token.avatarId == AvatarId)
277281
{
278-
waitingForAvatarToken = false;
279282
avatarFileToken = token;
280-
string file = $"{APIPlayer.APIObject.Settings.APIURL}file/{avatarMeta.OwnerId}/{avatarBuild.FileId}";
283+
waitingForAvatarToken = false;
284+
string file = $"{APIPlayer.APIObject.Settings.APIURL}file/{avatarMeta.OwnerId}/{avatarBuild.FileId}/{token.avatarToken}";
281285
APIPlayer.APIObject.GetFileMeta(fmr =>
282286
{
283287
if (!fmr.success)
284288
APIPlayer.APIObject.GetFile(OnAvatarDownload, avatarMeta.OwnerId, avatarBuild.FileId,
285289
avatarFileToken.avatarToken);
286290
else
287291
{
288-
DownloadTools.DownloadFile(file, $"{avatarMeta.Id}.hna",
289-
f => OnAvatarDownload(f), fmr.result.FileMeta.Hash);
292+
DownloadTools.DownloadFile(file, $"{avatarMeta.Id}.hna", f => OnAvatarDownload(f),
293+
fmr.result.FileMeta.Hash, i => AvatarDownloadPercentage = i.ProgressPercentage / 100f);
290294
}
291295
}, avatarMeta.OwnerId, avatarBuild.FileId);
292296
}
@@ -324,9 +328,14 @@ private void Update()
324328
lastPlayerUpdate.AvatarId != AvatarId))
325329
{
326330
AvatarId = lastPlayerUpdate.AvatarId;
327-
APIPlayer.APIObject.GetAvatarMeta(OnAvatar, AvatarId);
328331
Avatar?.Dispose();
329332
Avatar = null;
333+
avatarFileToken = null;
334+
avatarMeta = null;
335+
avatarBuild = null;
336+
waitingForAvatarToken = false;
337+
AvatarDownloadPercentage = 0;
338+
APIPlayer.APIObject.GetAvatarMeta(OnAvatar, AvatarId);
330339
}
331340
if (Avatar != null && Avatar.Avatar.transform.parent == transform)
332341
{

Assets/Scripts/Player/SocketManager.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,14 @@ private static void ContinueCreateInstance(WorldMeta worldMeta, InstancePublicit
142142
knownHash = fileMetaResult.result.FileMeta.Hash;
143143
DownloadTools.DownloadFile(fileURL, $"{worldMeta.Id}.hnw", o =>
144144
{
145+
GameInstance.FinishDownload(worldMeta);
145146
if (DownloadedWorlds.ContainsKey(worldMeta.Id))
146147
DownloadedWorlds.Remove(worldMeta.Id);
147148
DownloadedWorlds.Add(worldMeta.Id, o);
148149
if (APIPlayer.IsFullReady)
149150
APIPlayer.UserSocket.RequestNewInstance(worldMeta, instancePublicity, instanceProtocol,
150151
gameServer);
151-
}, knownHash);
152+
}, knownHash, args => GameInstance.HandleDownloadProgress(worldMeta, args.ProgressPercentage / 100f));
152153
}, worldMeta.OwnerId, targetBuild.FileId);
153154
}
154155

@@ -210,12 +211,13 @@ private static void ContinueJoinInstance(SafeInstance instance, WorldMeta worldM
210211
knownHash = fileMetaResult.result.FileMeta.Hash;
211212
DownloadTools.DownloadFile(fileURL, $"{worldMeta.Id}.hnw", o =>
212213
{
214+
GameInstance.FinishDownload(worldMeta);
213215
if (DownloadedWorlds.ContainsKey(worldMeta.Id))
214216
DownloadedWorlds.Remove(worldMeta.Id);
215217
DownloadedWorlds.Add(worldMeta.Id, o);
216218
if (APIPlayer.IsFullReady)
217219
APIPlayer.UserSocket.JoinInstance(instance.GameServerId, instance.InstanceId);
218-
}, knownHash);
220+
}, knownHash, args => GameInstance.HandleDownloadProgress(worldMeta, args.ProgressPercentage / 100f));
219221
}, worldMeta.OwnerId, targetBuild.FileId);
220222
}
221223

Assets/Scripts/Sandboxing/SandboxedTypes/Avatar.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,6 @@ private bool ShouldBeReadOnly(Transform t)
7171

7272
public bool IsLocalAvatar => isLocalAvatar;
7373
public string OwnerId => isLocalAvatar ? netPlayer.UserId : APIPlayer.APIUser.Id;
74-
public bool IsHost => gameInstance != null && gameInstance.host.Id == OwnerId;
7574

7675
public Item GetAvatarObject(HumanBodyBones humanBodyBones)
7776
{

0 commit comments

Comments
 (0)