Skip to content
This repository has been archived by the owner on Jul 27, 2022. It is now read-only.

Commit

Permalink
pickup freeze
Browse files Browse the repository at this point in the history
  • Loading branch information
xKiraiChan committed Nov 21, 2021
1 parent cf5db43 commit 2912fb4
Showing 1 changed file with 47 additions and 15 deletions.
62 changes: 47 additions & 15 deletions AstralPickups.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
using VRC.SDKBase;
using VRC.Udon.Wrapper.Modules;

[assembly: MelonInfo(typeof(Astrum.AstralPickups), "AstralPickups", "0.3.1", downloadLink: "github.com/Astrum-Project/AstralPickups")]
[assembly: MelonInfo(typeof(Astrum.AstralPickups), "AstralPickups", "0.4.0", downloadLink: "github.com/Astrum-Project/AstralPickups")]
[assembly: MelonGame("VRChat", "VRChat")]
[assembly: MelonColor(ConsoleColor.DarkMagenta)]
[assembly: MelonOptionalDependencies("AstralCore")]
Expand All @@ -31,7 +31,7 @@ public override void OnApplicationStart()
HarmonyInstance.Patch(typeof(ExternVRCSDK3ComponentsVRCPickup).GetMethod(nameof(ExternVRCSDK3ComponentsVRCPickup.__set_proximity__SystemSingle)), hkNoOp);

if (AppDomain.CurrentDomain.GetAssemblies().Any(f => f.GetName().Name == "AstralCore"))
External.SetupCommands();
Extern.SetupCommands();
else MelonLogger.Warning("AstralCore is missing, running at reduced functionality");
}

Expand All @@ -44,24 +44,56 @@ private static void HookAwake(ref VRC_Pickup __instance)
__instance.proximity = float.MaxValue;
}

private static class External
public static string Drop()
{
int count = 0;
foreach (VRC_Pickup pickup in UnityEngine.Object.FindObjectsOfType<VRC_Pickup>())
{
if (!pickup.IsHeld) continue;
if (Networking.GetOwner(pickup.gameObject) != Networking.LocalPlayer)
Networking.SetOwner(Networking.LocalPlayer, pickup.gameObject);
pickup.Drop(); // may be unneeded
count++;
// owner can possibly be restored
}
return count.ToString();
}

private static bool frozen = false;
private static VRC_Pickup[] pickups = new VRC_Pickup[0];
private static void FreezePickups()
{
if (Networking.LocalPlayer is null)
{
Extern.Freeze(false);
return;
}

foreach (VRC_Pickup pickup in pickups)
if (pickup != null && Networking.GetOwner(pickup.gameObject) != Networking.LocalPlayer)
Networking.SetOwner(Networking.LocalPlayer, pickup.gameObject);
}

private static class Extern
{
public static void SetupCommands()
{
ModuleManager.Module module = new ModuleManager.Module("Pickups");
module.Register(new CommandManager.Command() { onExecute = new Func<string[], string>(_ =>
{
foreach (VRC_Pickup pickup in UnityEngine.Object.FindObjectsOfType<VRC_Pickup>())
{
if (!pickup.IsHeld) continue;
if (Networking.GetOwner(pickup.gameObject) != Networking.LocalPlayer)
Networking.SetOwner(Networking.LocalPlayer, pickup.gameObject);
pickup.Drop(); // may be unneeded
// owner can possibly be restored
}
module.Register(new CommandManager.Command(new Func<string[], string>(_ => Drop())), "Drop");
module.Register(new CommandManager.ConVar<bool>(new Action<bool>(state => Freeze(state))), "Freeze");
}

public static void Freeze(bool state)
{
if (frozen == state) return;
frozen = state;

return "";
}) }, "Drop");
if (state)
{
pickups = UnityEngine.Object.FindObjectsOfType<VRC_Pickup>();
AstralCore.Events.OnUpdate += FreezePickups;
}
else AstralCore.Events.OnUpdate -= FreezePickups;
}
}
}
Expand Down

0 comments on commit 2912fb4

Please sign in to comment.