162 lines
7.4 KiB
C#
162 lines
7.4 KiB
C#
#region Usings
|
|
using UdonSharp;
|
|
using UnityEngine;
|
|
using VRC.SDKBase;
|
|
#endregion Usings
|
|
/// <summary>
|
|
/// Script from Reimajo, purchased at https://reimajo.booth.pm/, to be used in the worlds of the person who bought the asset only.
|
|
/// Join my Discord Server to receive update notifications & support for this asset: https://discord.gg/SWkNA394Mm
|
|
/// There is a version of this tool available with advanced protection, see my discord for more details.
|
|
/// If you have any issues, please contact me on Discord or Booth or Twitter https://twitter.com/ReimajoChan
|
|
/// Do not give any of the asset files or parts of them to anyone else.
|
|
/// </summary>
|
|
namespace ReimajoBoothAssets
|
|
{
|
|
/// <summary>
|
|
/// Mods can disable pickups (which is not an issue or harmful in general), so we need to put the real logic somewhere else. This
|
|
/// also allows easier Quest build sync & the pickup itself doesn't need to be included in the quest build if not needed.
|
|
///
|
|
/// Class name, public and serialized variable names, as well as exposed events on this panel have a name that is not
|
|
/// easy to understand. This is to provide a minimal layer of security on top so that people with mods that can display
|
|
/// those don't understand what they are doing and have a harder time messing around with it.
|
|
///
|
|
/// This script can be a single time in the world.
|
|
/// You should keep "Synchronize Position" enabled for this script (should be default on unless you disable it manually).
|
|
/// You should NOT have "Transfer Ownership on Collision" enabled for this script.
|
|
/// </summary>
|
|
[UdonBehaviourSyncMode(BehaviourSyncMode.NoVariableSync)]
|
|
public class AdminPanel : UdonSharpBehaviour
|
|
{
|
|
/// <summary>
|
|
/// The real admin panel, name is obfuscated since it can be read out via mods (in theory), although most mods just read out the GameObject name instead
|
|
/// </summary>
|
|
[SerializeField, Tooltip("The real admin panel, name is obfuscated since it can be read out via mods (in theory), although most mods just read out the GameObject name instead.")]
|
|
private PickupSync _pickupTracker;
|
|
/// <summary>
|
|
/// Internal copy which reads the serialized field at start before that one is nulled to protect it
|
|
/// </summary>
|
|
private PickupSync _pickupTrackerCp;
|
|
private VRC_Pickup _vrcPickup;
|
|
private void Start()
|
|
{
|
|
if(!Utilities.IsValid(_pickupTracker))
|
|
{
|
|
Debug.LogError($"[Analytics] There is no PickupSync script assigned to the Panel Pickup.");
|
|
this.gameObject.SetActive(false);
|
|
return;
|
|
}
|
|
_vrcPickup = (VRC_Pickup)GetComponent(typeof(VRC_Pickup));
|
|
_pickupTrackerCp = _pickupTracker;
|
|
_pickupTracker = null; //let's not expose the admin panel script
|
|
}
|
|
#region PickupEvents
|
|
/// <summary>
|
|
/// Called when the panel is picked up
|
|
/// </summary>
|
|
public override void OnPickup()
|
|
{
|
|
_pickupTrackerCp._OnRelayedPickup(isHeldWithLeftHand: _vrcPickup.currentHand == VRC_Pickup.PickupHand.Left);
|
|
}
|
|
/// <summary>
|
|
/// Called when the panel is dropped
|
|
/// </summary>
|
|
public override void OnDrop()
|
|
{
|
|
_pickupTrackerCp._OnRelayedDrop();
|
|
}
|
|
/// <summary>
|
|
/// Called when the hand presses the trigger while holding the panel
|
|
/// </summary>
|
|
public override void OnPickupUseDown()
|
|
{
|
|
_pickupTrackerCp._OnRelayedPickupUseDown();
|
|
}
|
|
/// <summary>
|
|
/// Called when the hand releases the trigger while holding the panel
|
|
/// </summary>
|
|
public override void OnPickupUseUp()
|
|
{
|
|
_pickupTrackerCp._OnRelayedPickupUseUp();
|
|
}
|
|
#endregion PickupEvents
|
|
#region OwnershipControl
|
|
/// <summary>
|
|
/// Is called for everyone on the network when someone requests ownership. Both the requesting player
|
|
/// and the current owner must approve the request, else it is reverted again.
|
|
/// Only allow whitelisted players to request ownership for this panel for themselves.
|
|
/// </summary>
|
|
/// <param name="requestingPlayer">Player who requested ownership</param>
|
|
/// <param name="requestedOwner">Player for which ownership is requested</param>
|
|
/// <returns>True if ownership should be granted</returns>
|
|
public override bool OnOwnershipRequest(VRCPlayerApi requestingPlayer, VRCPlayerApi requestedOwner)
|
|
{
|
|
return _pickupTrackerCp._OnRelayedOwnershipRequest(requestingPlayer, requestedOwner);
|
|
}
|
|
#endregion OwnershipControl
|
|
#region HoneyPots
|
|
[HideInInspector]
|
|
public bool _isAdmin = false; //<- does absolutely nothing, only there to confuse hackers
|
|
/// <summary>
|
|
/// Those are traps. All those stupid script kiddies with their malicious mods tend to randomly call public methods
|
|
/// on a script to see what happens, if they call this one they will be disconnected by VRChat for "unusual client behaviour".
|
|
/// This method starts with an underscore so it cannot be called on the network which is very important.
|
|
/// </summary>
|
|
public void _EnableAdminTools()
|
|
{
|
|
_pickupTrackerCp._EnableForLocalPlayer(); //<- it's a trap!
|
|
}
|
|
public void _MakeLocalPlayerAdmin()
|
|
{
|
|
_pickupTrackerCp._EnableForLocalPlayer(); //<- it's a trap!
|
|
}
|
|
public void _BanSelectedPlayer()
|
|
{
|
|
_pickupTrackerCp._EnableForLocalPlayer(); //<- it's a trap!
|
|
}
|
|
public void _SelectNextPlayer()
|
|
{
|
|
_pickupTrackerCp._EnableForLocalPlayer(); //<- it's a trap!
|
|
}
|
|
public void _BanAllOtherPlayersExceptMe()
|
|
{
|
|
_pickupTrackerCp._EnableForLocalPlayer(); //<- it's a trap!
|
|
}
|
|
public void _EnableFlightMode()
|
|
{
|
|
_pickupTrackerCp._EnableForLocalPlayer(); //<- it's a trap!
|
|
}
|
|
public void _Pressed_NextPlayer()
|
|
{
|
|
_pickupTrackerCp._RegisterPickup(1); //<- it's a trap for non-admins, but works fine for admins
|
|
}
|
|
public void _Pressed_PreviousPlayer()
|
|
{
|
|
_pickupTrackerCp._RegisterPickup(2); //<- it's a trap for non-admins, but works fine for admins
|
|
}
|
|
public void _Pressed_ArmBanButton()
|
|
{
|
|
_pickupTrackerCp._RegisterPickup(3); //<- it's a trap for non-admins, but works fine for admins
|
|
}
|
|
public void _Pressed_ArmUnbanButton()
|
|
{
|
|
_pickupTrackerCp._RegisterPickup(4); //<- it's a trap for non-admins, but works fine for admins
|
|
}
|
|
public void _Pressed_ArmUnbanAllButton()
|
|
{
|
|
_pickupTrackerCp._RegisterPickup(5); //<- it's a trap for non-admins, but works fine for admins
|
|
}
|
|
public void _Pressed_UnbanButton()
|
|
{
|
|
_pickupTrackerCp._RegisterPickup(6); //<- it's a trap for non-admins, but works fine for admins
|
|
}
|
|
public void _Pressed_UnbanAll()
|
|
{
|
|
_pickupTrackerCp._RegisterPickup(7); //<- it's a trap for non-admins, but works fine for admins
|
|
}
|
|
public void _Pressed_BanButton()
|
|
{
|
|
_pickupTrackerCp._RegisterPickup(8); //<- it's a trap for non-admins, but works fine for admins
|
|
}
|
|
#endregion HoneyPots
|
|
}
|
|
} |